From 2044c8af84fefff1dfdebc1d948dd660e565423f Mon Sep 17 00:00:00 2001 From: "@zuopngfei" Date: Thu, 3 Jul 2025 18:16:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=84=BF=E7=A7=91=E6=82=A3=E8=80=85=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/request.js | 31 +- api/user.js | 9 - app.js | 43 +- app.json | 11 +- app.less | 25 +- assets/images/diagnosticResults/bg.png | Bin 0 -> 122607 bytes assets/images/diagnosticResults/icon_1.png | Bin 0 -> 2230 bytes assets/images/diagnosticResults/icon_2.png | Bin 0 -> 2980 bytes assets/images/diagnosticResults/icon_3.png | Bin 0 -> 2430 bytes assets/images/diagnosticResults/icon_4.png | Bin 0 -> 1548 bytes assets/images/diagnosticResults/img1.png | Bin 0 -> 89533 bytes assets/images/home/icon_1.svg | 24 - assets/images/home/icon_2.png | Bin 701 -> 0 bytes assets/images/home/img_1.png | Bin 7119 -> 0 bytes assets/images/home/img_2.png | Bin 15400 -> 0 bytes assets/images/home/img_title_1.png | Bin 5929 -> 0 bytes assets/images/home/img_title_2.png | Bin 18024 -> 0 bytes assets/images/home/top-bg.png | Bin 189609 -> 0 bytes assets/images/logo.jpg | Bin 31495 -> 0 bytes assets/images/mmp_7/img1.png | Bin 31929 -> 0 bytes assets/images/mmp_7/img2.png | Bin 45031 -> 0 bytes assets/images/mmp_7/img3.png | Bin 37973 -> 0 bytes assets/images/my/baby.png | Bin 4406 -> 0 bytes assets/images/my/jkjy.svg | 24 - assets/images/my/my-top-bg.png | Bin 39966 -> 0 bytes assets/images/my/yyfa.svg | 22 - assets/images/qr_code.jpg | Bin 0 -> 23199 bytes assets/images/top-bg.png | Bin 11537 -> 0 bytes assets/js/heightWeight.js | 186 + components/card/index.js | 9 - components/card/index.json | 7 - components/card/index.less | 27 - components/card/index.wxml | 9 - components/nav/index.js | 109 - components/nav/index.json | 9 - components/nav/index.less | 30 - components/nav/index.wxml | 23 - config.js | 4 - custom-tab-bar/index.js | 57 - custom-tab-bar/index.json | 7 - custom-tab-bar/index.less | 10 - custom-tab-bar/index.wxml | 5 - iconfont.less | 33 +- miniprogram_npm/@antv/g2/index.js | 30284 ++++++++++++++++ miniprogram_npm/@antv/g2/index.js.map | 1 + miniprogram_npm/crypto-js/index.js | 7365 ++++ miniprogram_npm/crypto-js/index.js.map | 1 + mock/WxMock.js | 19 - mock/chat.js | 140 - mock/dataCenter/getArea.js | 98 - mock/dataCenter/getCompleteRate.js | 62 - mock/dataCenter/getInteraction.js | 32 - mock/dataCenter/getMember.js | 50 - mock/dataCenter/index.js | 6 - mock/home/getHomeCards.js | 79 - mock/home/getHomeSwipers.js | 8 - mock/home/index.js | 4 - mock/index.js | 15 - mock/login/getSendMessage.js | 6 - mock/login/index.js | 5 - mock/login/postCodeVerify.js | 7 - mock/login/postPasswordLogin.js | 7 - mock/mock.js | 9189 ----- mock/my/getPersonalInfo.js | 21 - mock/my/getServiceList.js | 19 - mock/my/index.js | 4 - mock/request.js | 21 - mock/search/getSearchHistory.js | 8 - mock/search/getSearchPopular.js | 15 - mock/search/index.js | 4 - package.json | 1 + pages/AddTherapeuticRegimen/index.js | 67 +- pages/AddTherapeuticRegimen/index.json | 1 - pages/AddTherapeuticRegimen/index.less | 19 +- pages/AddTherapeuticRegimen/index.wxml | 141 +- pages/articleList/index.js | 91 +- pages/articleList/index.json | 6 +- pages/articleList/index.less | 57 +- pages/articleList/index.wxml | 33 +- pages/clockIn/index copy.less | 44 - pages/clockIn/index copy.wxml | 20 - pages/clockIn/index.less | 31 +- pages/clockIn/index.wxml | 9 +- .../index.js | 15 +- pages/diagnosticResults/index.json | 6 + pages/diagnosticResults/index.less | 129 + pages/diagnosticResults/index.wxml | 34 + pages/emergency/index.js | 92 +- pages/emergency/index.json | 5 +- pages/emergency/index.less | 81 +- pages/emergency/index.wxml | 38 +- pages/followUp/index.js | 107 +- pages/followUp/index.json | 1 - pages/followUp/index.less | 7 +- pages/followUp/index.wxml | 146 +- pages/forGetPassword/index.json | 12 - pages/forGetPassword/index.less | 95 - pages/forGetPassword/index.wxml | 51 - pages/home/index.js | 411 +- pages/home/index.json | 12 +- pages/home/index.less | 54 +- pages/home/index.wxml | 38 +- pages/login/login.json | 8 +- pages/login/login.less | 2 +- pages/login/login.wxml | 4 +- pages/loginCode/loginCode.json | 4 - pages/medicationRecord/index.js | 106 +- pages/medicationRecord/index.json | 1 - pages/medicationRecord/index.less | 539 +- pages/medicationRecord/index.wxml | 87 +- pages/message/index.js | 26 +- pages/message/index.json | 2 +- pages/message/index.less | 23 +- pages/message/index.wxml | 48 +- pages/mmp-7/index.js | 91 +- pages/mmp-7/index.json | 7 +- pages/mmp-7/index.less | 37 +- pages/mmp-7/index.wxml | 75 +- pages/my/index copy.js | 107 - pages/my/index copy.less | 128 - pages/my/index copy.wxml | 44 - pages/my/index.js | 5 + pages/my/index.json | 12 +- pages/my/index.less | 26 +- pages/my/index.wxml | 22 +- pages/my/info-edit/index.js | 296 +- pages/my/info-edit/index.json | 5 +- pages/my/info-edit/index.less | 26 +- pages/my/info-edit/index.wxml | 165 +- pages/register/index.js | 5 +- pages/register/index.json | 4 +- pages/register/index.less | 41 +- pages/register/index.wxml | 20 +- project.private.config.json | 14 + 134 files changed, 40253 insertions(+), 11765 deletions(-) delete mode 100644 api/user.js create mode 100644 assets/images/diagnosticResults/bg.png create mode 100644 assets/images/diagnosticResults/icon_1.png create mode 100644 assets/images/diagnosticResults/icon_2.png create mode 100644 assets/images/diagnosticResults/icon_3.png create mode 100644 assets/images/diagnosticResults/icon_4.png create mode 100644 assets/images/diagnosticResults/img1.png delete mode 100644 assets/images/home/icon_1.svg delete mode 100644 assets/images/home/icon_2.png delete mode 100644 assets/images/home/img_1.png delete mode 100644 assets/images/home/img_2.png delete mode 100644 assets/images/home/img_title_1.png delete mode 100644 assets/images/home/img_title_2.png delete mode 100644 assets/images/home/top-bg.png delete mode 100644 assets/images/logo.jpg delete mode 100644 assets/images/mmp_7/img1.png delete mode 100644 assets/images/mmp_7/img2.png delete mode 100644 assets/images/mmp_7/img3.png delete mode 100644 assets/images/my/baby.png delete mode 100644 assets/images/my/jkjy.svg delete mode 100644 assets/images/my/my-top-bg.png delete mode 100644 assets/images/my/yyfa.svg create mode 100644 assets/images/qr_code.jpg delete mode 100644 assets/images/top-bg.png create mode 100644 assets/js/heightWeight.js delete mode 100644 components/card/index.js delete mode 100644 components/card/index.json delete mode 100644 components/card/index.less delete mode 100644 components/card/index.wxml delete mode 100644 components/nav/index.js delete mode 100644 components/nav/index.json delete mode 100644 components/nav/index.less delete mode 100644 components/nav/index.wxml delete mode 100644 config.js delete mode 100644 custom-tab-bar/index.js delete mode 100644 custom-tab-bar/index.json delete mode 100644 custom-tab-bar/index.less delete mode 100644 custom-tab-bar/index.wxml create mode 100644 miniprogram_npm/@antv/g2/index.js create mode 100644 miniprogram_npm/@antv/g2/index.js.map create mode 100644 miniprogram_npm/crypto-js/index.js create mode 100644 miniprogram_npm/crypto-js/index.js.map delete mode 100644 mock/WxMock.js delete mode 100644 mock/chat.js delete mode 100644 mock/dataCenter/getArea.js delete mode 100644 mock/dataCenter/getCompleteRate.js delete mode 100644 mock/dataCenter/getInteraction.js delete mode 100644 mock/dataCenter/getMember.js delete mode 100644 mock/dataCenter/index.js delete mode 100644 mock/home/getHomeCards.js delete mode 100644 mock/home/getHomeSwipers.js delete mode 100644 mock/home/index.js delete mode 100644 mock/index.js delete mode 100644 mock/login/getSendMessage.js delete mode 100644 mock/login/index.js delete mode 100644 mock/login/postCodeVerify.js delete mode 100644 mock/login/postPasswordLogin.js delete mode 100644 mock/mock.js delete mode 100644 mock/my/getPersonalInfo.js delete mode 100644 mock/my/getServiceList.js delete mode 100644 mock/my/index.js delete mode 100644 mock/request.js delete mode 100644 mock/search/getSearchHistory.js delete mode 100644 mock/search/getSearchPopular.js delete mode 100644 mock/search/index.js delete mode 100644 pages/clockIn/index copy.less delete mode 100644 pages/clockIn/index copy.wxml rename pages/{forGetPassword => diagnosticResults}/index.js (78%) create mode 100644 pages/diagnosticResults/index.json create mode 100644 pages/diagnosticResults/index.less create mode 100644 pages/diagnosticResults/index.wxml delete mode 100644 pages/forGetPassword/index.json delete mode 100644 pages/forGetPassword/index.less delete mode 100644 pages/forGetPassword/index.wxml delete mode 100644 pages/my/index copy.js delete mode 100644 pages/my/index copy.less delete mode 100644 pages/my/index copy.wxml diff --git a/api/request.js b/api/request.js index 2dc05ea..90968ab 100644 --- a/api/request.js +++ b/api/request.js @@ -1,7 +1,5 @@ -import config from '~/config'; +const baseUrl = 'http://1.15.53.35:9998/'; -const baseUrl = 'https://ddbs.1024tool.vip/'; -const delay = config.isMock ? 500 : 0; function request(url, method = 'GET', data = {}) { const header = { 'content-type': 'application/json', @@ -20,33 +18,28 @@ function request(url, method = 'GET', data = {}) { dataType: 'json', // 微信官方文档中介绍会对数据进行一次JSON.parse header, success(res) { - console.log(res) - setTimeout(() => { - - if(res.data.code && res.data.code == 10103){ + if (res.data.code) { + if (res.data.code == 10103) { wx.removeStorageSync('access_token'); wx.switchTab({ url: '/pages/my/index', }) reject(res.data); - } else { - console.log(res.data) - resolve(res.data); } - - }, delay); + reject(res.data); + } else { + resolve(res.data); + } + }, fail(err) { - setTimeout(() => { - console.log(err) - // 断网、服务器挂了都会fail回调,直接reject即可 - - reject(err); - }, delay); + console.log(err) + // 断网、服务器挂了都会fail回调,直接reject即可 + reject(err); }, }); }); } // 导出请求和服务地址 -export default request; +export default request; \ No newline at end of file diff --git a/api/user.js b/api/user.js deleted file mode 100644 index ff89040..0000000 --- a/api/user.js +++ /dev/null @@ -1,9 +0,0 @@ -import request from './request' - -export const userLogin = () => { - return request({ - url: 'patient/password_login', - method: 'post', - data - }) -} \ No newline at end of file diff --git a/app.js b/app.js index d40e174..3ee18b9 100644 --- a/app.js +++ b/app.js @@ -1,12 +1,11 @@ // app.js -import config from './config'; -import Mock from './mock/index'; +// import Mock from './mock/index'; import createBus from './utils/eventBus'; -import { connectSocket, fetchUnreadNum } from './mock/chat'; +// import { connectSocket, fetchUnreadNum } from './mock/chat'; -if (config.isMock) { - Mock(); -} +// if (config.isMock) { +// Mock(); +// } App({ onLaunch() { @@ -28,39 +27,15 @@ App({ }); }); - this.getUnreadNum(); - this.connect(); }, globalData: { - userInfo: null, - unreadNum: 0, // 未读消息数量 - socket: null, // SocketTask 对象 + // userInfo: null, + // unreadNum: 0, // 未读消息数量 + // socket: null, // SocketTask 对象 }, /** 全局事件总线 */ eventBus: createBus(), - /** 初始化WebSocket */ - connect() { - const socket = connectSocket(); - socket.onMessage((data) => { - data = JSON.parse(data); - if (data.type === 'message' && !data.data.message.read) this.setUnreadNum(this.globalData.unreadNum + 1); - }); - this.globalData.socket = socket; - }, - - /** 获取未读消息数量 */ - getUnreadNum() { - fetchUnreadNum().then(({ data }) => { - this.globalData.unreadNum = data; - this.eventBus.emit('unread-num-change', data); - }); - }, - - /** 设置未读消息数量 */ - setUnreadNum(unreadNum) { - this.globalData.unreadNum = unreadNum; - this.eventBus.emit('unread-num-change', unreadNum); - }, + }); diff --git a/app.json b/app.json index 3de3ac8..8f6d1e0 100644 --- a/app.json +++ b/app.json @@ -22,13 +22,6 @@ "pages": ["loginCode"] }, - - - { - "root": "pages/forGetPassword", - "name": "forGetPassword", - "pages": ["index"] - }, { "root": "pages/clockIn", "name": "clockIn", @@ -72,6 +65,10 @@ "root": "pages/mmp-7", "name": "mmp-7", "pages": ["index"] + },{ + "root": "pages/diagnosticResults", + "name": "diagnosticResults", + "pages": ["index"] } ], "window": { diff --git a/app.less b/app.less index 915fc66..c38bd33 100644 --- a/app.less +++ b/app.less @@ -14,7 +14,23 @@ page { font-size: 28rpx; } .t-input{ - + padding: 20rpx 38rpx; + } + .t-cell{ + .t-input{ + padding: 0; + } + } + .info-edit{ + .t-cell{ + padding: 28rpx 0rpx; + } + } + + .user-info{ + .t-input{ + padding: 28rpx 38rpx; + } } .t-input__label:not(:empty) { max-width: 10rem; @@ -31,6 +47,13 @@ page { .t-image-viewer { top: 0; } + .t-navbar__content{ + background-color: transparent; + } + .t-overlay { + top: 0!important; + } + } diff --git a/assets/images/diagnosticResults/bg.png b/assets/images/diagnosticResults/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..36f0e93d4029db7bae5626aed61d4812f95aab1c GIT binary patch literal 122607 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%0AiM#eyui*^jplaG4R|k)klxe`gL- zH%ODAOOBKiRNIISq@|^WqV0k~bWqi%Gb|DK5@N#e;X%W%BCvshn8^3)pZ`JGP^fu0 z-DE|?+aj8Iq-b{NT^BPcJ*;QQ$@;A>@6PPmV_}gjlv!9bbGxR8-@FwrdgNG5Jv}KN zSkSKnDJdyIIB@@hamx*M(OcL9tNqR+Sw$4?4o(X@`d!B2eH~9E(bK?xQ{)ilVIeHc zJe!5Vzt8t5OqS85`-R2Bn7#hm6Hvgn^lPIszlKCbMZKjne#m3B?CwZgRNJy_VKXzC zlyFC9SWJ^6A+)<5$#>xAY#|Y zb^vud7RGPYG)S2A%;{Hua*4SG?G3rSzdZAg8Eu`f$DeO3T3lYaj>|r5nEF}O%cwr;69l@yvDs{&`CG%E z1G6>3d$=^zH#yN+yNW|2ueWch{Fet!os1`p_c!VYKCzz}$`W7E6)o|hsjb_nEt>o(S^Eo|UXmR$N)Am;UYF0zb+qlfs z2OBb=7SHGnV?6-5f%-MOG(yPC%#0=+pNH`PYVJcZUFR$|Hg+eRQ2(94qSF)3eftjO zE{z4;2HheRhGidqQ4-qi+=6-Bo*Go0Je1A8v2^*AQA}t?UrH140Wue$6OpjtK}Re~ ztsa7OsNmp6j8%e6At$06ukTKG+^XnEom+Gx^GVX<+ayVNth#Q&jMkg0Lc06%P-zl% zLbS+E=-dwD@sJq1`8YtO6Go~t@sOjEdK%B;0Yrpr^UlG?Mkj7=x;HA&(@DVE=USIk zdvRUDxyug8Y;KV)rvDIMkQA#)lHx`8P!j$Oiy)q%)nSd_;y%_cm0B+nY9R%4~0Me+}|GFrXel(IeTZvwL3Ak&v%3@F(b@I`6G| zBMBS%J`NyNDiI0VJ{r436Yz1~<#M^m6f(}|!KKycH}S7QDIDDbnHSJ$_q^K%oVOmx z)WO*bz(c49SNXt1ppP-6guZ3rh#gV+6eQ&(9ppkRN`FZ0!29SM;*HkuAry=hoDcaK w=oDEGU<-1)W3+iwV^a~BiojF^{=XvdU%$0Qq-qVmRsaA107*qoM6N<$f{k~P3IG5A literal 0 HcmV?d00001 diff --git a/assets/images/diagnosticResults/icon_4.png b/assets/images/diagnosticResults/icon_4.png new file mode 100644 index 0000000000000000000000000000000000000000..71870957fa93355a389c57a39c69a221c703c2db GIT binary patch literal 1548 zcmV+n2J`ueP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NHc1c7*RA>e5m`#inMHI(-XBQXw zTm(f{f&mdlBPbCJDgnhPN{AusK@;Q27)?BI@$6X-8l#?!a3E3RQ4bnLNlcWGh!I^u zmJdHLe2T1~D7Z5Iem&hY%}jSs&#WXHGymj2Rb5^6>b+O5UR6&JbkOlY#{(S?bUe`U zK*t0BUk}X0v?t*Q@HBiKj(N;L!>8e=@E=&NV;|3B4ka{N3*Uu*!+NEY&r5kfrmz8R zhG0_3au3hf23_TqL8*KzOuT>fztp~a6vEIkcn!V)rz@um_VbIv!Ci13^*(q7{0{pr z*eM8>!C|-)MorY(#Apmq`KO#$#c$wuWzZcgq?`tgsTfYuL)+nSk;2wB{5}rgB<|XiO+^=YvToE^i*Zw-QUNn-1~}#+IL}HeXvF~c;!AJ~KCf;%L!n*#m>7#9E0D7T-rb74 zq6WBE--8a3hwm|DKRinPIOT7Yz4RGRnFf_t&Skvx0Q7Wo3~;Zj+lM~np@_3yLBKN#F>9>G zTS=Ti(J!D1r@`I>=u+MFX`Q0BbCmCpT%!$kgvb7z?%^w!s~MKZ9p+*{J+7qfL8u|F zfT1)@8SioxA6Gvpq0zIg&I)3YGs0dM%v-8_lLM z1Bt$|n2es4=8NMYy=(P||26%6L#sj!;;As9P(#1^28}*d@xHGPK<`SqC}O}Lv4n5& zZMz3oEF-VsBMm%gTg;2Hm0%eecuonEliuAqkNpj+>}$1f3jkXQMCXbf~m+` zfj1a2mmFQbKj`kd3ZWkTddt&gAGL|JnKjx$oPKwpd>o@@p?h$Q*)F=GXpek9YmThh zO<&=jy#--QqJVMI&zMlJ36)>hB$$k8L+=b@J*f1ot66`&C=DXmY~j~e8qU+W6$Q-ap$ci8qBc+BMX>&Z$ay0JJP*vq{w>ph zECX~_2$e~~m|Gkwp02!oJ;+?GG&stYb6?G&?l*H9&ez7PLj8hOhh!NrL=R8)-XjQV z^`k}aac2q*@f04%v!T%!(mPah7&j62P$sf#+*~QM3^3hqflqi8{&T?wF5^LU+Xwx8H4mgBZ#B(s z-@pOZug8npcw|lw<)+FSRihW5U2OdALD@sh8^TGr7AB&Jr#j@VK-~3VDsMusH-YhO zYE68Q+uSx(T<4(t$eBvcSC*IBHSjAR@=(M8$IpkG;0hlE-+$+>3rfASskgc+=BHyQ z?RlW`bt&d;Ui5L literal 0 HcmV?d00001 diff --git a/assets/images/diagnosticResults/img1.png b/assets/images/diagnosticResults/img1.png new file mode 100644 index 0000000000000000000000000000000000000000..954a984a4a2d806b5b722a90c335f405e4a00bd2 GIT binary patch literal 89533 zcmXtebzBr*)c!8rEU;-;zgaxDG2ulX9G9w-U>!hs1u-27NOd1p3Rw= z7H%~a-#hu*;w}pqFV_?<2fHYwGe3_XOx=K zlqJgYQ#5=5Y-q2rtTAS)3-nLV-!u5R^96tMRbk5E{hhX)gB0!@&#(G2`vNLoY!+tx z(3)S{TaiwNfW~F#Kr!IM-DftmY4>+V0NsDG42Lv&WFD2?HJ5|>c;%IF^yNFDixypA z^Zc~!(23LQg0@Kf&EPY?*id_i#`b!9$jR!8SVGI?jWM#S?1Lb z^&tu~H9(nw2&ef7^A2B$%ONConepQQ0GdW5kww#pE-@gOekCh$N1btHN6%Czxp%L` zh(gBL)(GE09XHj-CMF=FmMEW3#kE;Ex8G%r*5T#4G%oz*h_8TquFGCJt{(mJJZV

(!Mbg4%bnw~Y*-x-l*nyRW{B(!*R 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
WE~;smW!K%p-(WdzuSM0Y@Est&ZtA z;tGg_-Hdz?an9K$sH62j@cZ%~db?xu9Pc^jX@dZ4Es z|4{$AXC8&A8WJ-?Fi6c6q{4Bzoe^YLgvdTyYEBrgmZDT1hNE`uB6%Q>sTpiWgmMa~ zhy#xHf2$+^=AKv)@`o3WeQ0u&lf2eWnaX+4n6wdOh>;Wm~hUnaT zpNI}arM#v6TOh>zt+$H#d+$jBh!!K_;3Dfu=(bX4oCQEm=No|u?zJmlBUj77%yUP1 z@S#eFeov|nhzy3{dYirEl1eau4F@$9J$)EgW@54_}U+cM7A_@36(BF35I0JL`hz!-fSwIy{OnQmO|&2I�eDO6@K`I0X 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 Hu0mjfpOw~# literal 0 HcmV?d00001 diff --git a/assets/images/home/icon_1.svg b/assets/images/home/icon_1.svg deleted file mode 100644 index 37b0d50..0000000 --- a/assets/images/home/icon_1.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - 生长曲线备份 - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/assets/images/home/icon_2.png b/assets/images/home/icon_2.png deleted file mode 100644 index 7b31916df9e053d001e9b12fdf1422080b848d54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 701 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~STEL88gA~qMxha%^fl1xd#WBP} zur*}AcZ{RJJX`rimKP__IN`XeLn)$5VD}$Rvn=6t9)-Oxw{F_ttIE;V&^vb-=P&*U zE+sJ~kEV!_x3Grr$S`{ zBLxK)M|^0^T|GJYcI&^{SM#}p`4u^QO0pBqPKrDB;H1-0!Q)#T@>APVZ%ZA?INJVa z_k!M)5!sylzaFUL;`8n? zjk7znGsw<|-}}+2I$b@ER3`bzq#Z2@eZnG>8M$Rx^iMgyu?&8H-QW1v%1_+Ce!MgN zDk9R`TacL}UjOc7gnM*5uhr`NsWtlEO9LFw3We@;51eQi_KVT=;Dh9ht*U|jnqo7y zP5tyoI_yvA**d#(VVdV2r2Yxpve7~>W`0?nmyQ6tjMNk53u>%gi}GYI)W{^Safq-+Zi@ zwP}&Yh3RTSt*`#C-xeV_chQp=)=tN@ClY?|GjSGPd~{uoeckqqyvG{B552or?oeuM z-zO7u>2|p5Pl2FMTzc!HYvw%)oS5b==e5SP^xcFzbN5b;zv-rM{C&TB&*$Th8!x=c zsByhxw)|AS%6@IbrMsWciBXz2<^0u2j}E-e+T8hi!H4V@JFX@kZ`cr%|Fm2=d6CrQ au>XvkA6OSkH7#NSB^^&!KbLh*2~7YD@F=kW diff --git a/assets/images/home/img_1.png b/assets/images/home/img_1.png deleted file mode 100644 index 8ddfa433f6af74dbbfb523583dc456d05c9e004d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7119 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 diff --git a/assets/images/home/img_2.png b/assets/images/home/img_2.png deleted file mode 100644 index 0492a2558fcbd952e151b93f0f25c8d3023b96be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15400 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 LNkvXXu0mjfIhB`v diff --git a/assets/images/home/img_title_2.png b/assets/images/home/img_title_2.png deleted file mode 100644 index 1c7c9f62eb9067896696fef3bdde7d099379edd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18024 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�hN@VzYWCgbM~Ln7E%x$ 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 IXKp9_9}>^=I{*Lx diff --git a/assets/images/logo.jpg b/assets/images/logo.jpg deleted file mode 100644 index 88ec9dea8315ce92d6309741467860eda80a2693..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31495 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 diff --git a/assets/images/mmp_7/img1.png b/assets/images/mmp_7/img1.png deleted file mode 100644 index e600605f22986399a770c6eef2e1baeca2647cff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31929 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%0DmZPgYX@g-xNzw!sfQKF^#p@RQY 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 ZD(b};`$!)~nFIKrnzGiDipN$F{~y3_4deg- diff --git a/assets/images/mmp_7/img2.png b/assets/images/mmp_7/img2.png deleted file mode 100644 index b2698814348c11c654cecd4d427a1d315ff230f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45031 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 - - 健康教育 - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/assets/images/my/my-top-bg.png b/assets/images/my/my-top-bg.png deleted file mode 100644 index 411d85cdf93a87bc64fbdf220028d53bb454c745..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39966 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 - - 用药方案 - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/assets/images/qr_code.jpg b/assets/images/qr_code.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e2b57a9ddbfee59a99be7fd86c6dd87fcaf707c1 GIT binary patch literal 23199 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 Ti=3p6m5pbZv{-cL{?qq=Qd1x| literal 0 HcmV?d00001 diff --git a/assets/images/top-bg.png b/assets/images/top-bg.png deleted file mode 100644 index 35e6579e0041bf189eb2cc1aeb6e6e316d5012c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11537 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 - - - {{desc}} - - {{item.text}} - - - diff --git a/components/nav/index.js b/components/nav/index.js deleted file mode 100644 index 9c5012c..0000000 --- a/components/nav/index.js +++ /dev/null @@ -1,109 +0,0 @@ -Component({ - options: { - styleIsolation: 'shared', - }, - properties: { - navType: { - type: String, - value: 'title', - }, - titleText: String, - }, - data: { - visible: false, - sidebar: [ - { - title: '首页', - url: 'pages/home/index', - isSidebar: true, - }, - { - title: '搜索页', - url: 'pages/search/index', - isSidebar: false, - }, - { - title: '发布页', - url: 'pages/release/index', - isSidebar: false, - }, - { - title: '消息列表页', - url: 'pages/message/index', - isSidebar: true, - }, - { - title: '对话页', - url: 'pages/chat/index', - isSidebar: false, - }, - { - title: '个人中心页', - url: 'pages/my/index', - isSidebar: true, - }, - { - title: '个人信息表单页', - url: 'pages/my/info-edit/index', - isSidebar: false, - }, - { - title: '设置页', - url: 'pages/setting/index', - isSidebar: false, - }, - { - title: '数据图表页', - url: 'pages/dataCenter/index', - isSidebar: false, - }, - { - title: '登录注册页', - url: 'pages/login/login', - isSidebar: false, - }, - ], - statusHeight: 0, - }, - lifetimes: { - ready() { - const statusHeight = wx.getWindowInfo().statusBarHeight; - this.setData({ statusHeight }); - }, - }, - methods: { - openDrawer() { - this.setData({ - visible: true, - }); - }, - itemClick(e) { - const that = this; - const { isSidebar, url } = e.detail.item; - if (isSidebar) { - wx.switchTab({ - url: `/${url}`, - }).then(() => { - // 防止点回tab时,sidebar依旧是展开模式 - that.setData({ - visible: false, - }); - }); - } else { - wx.navigateTo({ - url: `/${url}`, - }).then(() => { - that.setData({ - visible: false, - }); - }); - } - }, - - searchTurn() { - wx.navigateTo({ - url: `/pages/search/index`, - }); - }, - }, -}); diff --git a/components/nav/index.json b/components/nav/index.json deleted file mode 100644 index b551b47..0000000 --- a/components/nav/index.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "component": true, - "usingComponents": { - "t-navbar": "tdesign-miniprogram/navbar/navbar", - "t-icon": "tdesign-miniprogram/icon/icon", - "t-drawer": "tdesign-miniprogram/drawer/drawer", - "t-search": "tdesign-miniprogram/search/search" - } -} diff --git a/components/nav/index.less b/components/nav/index.less deleted file mode 100644 index 9a820e3..0000000 --- a/components/nav/index.less +++ /dev/null @@ -1,30 +0,0 @@ -@import '/variable.less'; - -.home-navbar { - .t-navbar { - &__left { - margin-left: 12rpx; - } - } - - &__icon { - padding: 12rpx; - } - - &__left { - display: flex; - align-items: center; - padding: 0 16rpx; - - .t-search { - --td-search-height: 64rpx; - --td-search-font-size: @font-size-mini; - width: 375rpx; - - .t-icon { - font-size: @font-size-default !important; - } - } - } - --td-drawer-title-font-size: 48rpx; -} diff --git a/components/nav/index.wxml b/components/nav/index.wxml deleted file mode 100644 index 38a25f5..0000000 --- a/components/nav/index.wxml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - diff --git a/config.js b/config.js deleted file mode 100644 index 8cb1cb6..0000000 --- a/config.js +++ /dev/null @@ -1,4 +0,0 @@ -export default { - isMock: true, - baseUrl: '', -}; diff --git a/custom-tab-bar/index.js b/custom-tab-bar/index.js deleted file mode 100644 index 7cf58ff..0000000 --- a/custom-tab-bar/index.js +++ /dev/null @@ -1,57 +0,0 @@ -const app = getApp(); - -Component({ - data: { - value: '', // 初始值设置为空,避免第一次加载时闪烁 - unreadNum: 0, // 未读消息数量 - list: [ - { - icon: 'home', - value: 'index', - label: '首页', - }, - { - icon: 'chat', - value: 'notice', - label: '随访', - }, - { - icon: 'user', - value: 'my', - label: '我1的', - }, - ], - }, - lifetimes: { - ready() { - const pages = getCurrentPages(); - const curPage = pages[pages.length - 1]; - if (curPage) { - const nameRe = /pages\/(\w+)\/index/.exec(curPage.route); - if (nameRe === null) return; - if (nameRe[1] && nameRe) { - this.setData({ - value: nameRe[1], - }); - } - } - - // 同步全局未读消息数量 - this.setUnreadNum(app.globalData.unreadNum); - app.eventBus.on('unread-num-change', (unreadNum) => { - this.setUnreadNum(unreadNum); - }); - }, - }, - methods: { - handleChange(e) { - const { value } = e.detail; - wx.switchTab({ url: `/pages/${value}/index` }); - }, - - /** 设置未读消息数量 */ - setUnreadNum(unreadNum) { - this.setData({ unreadNum }); - }, - }, -}); diff --git a/custom-tab-bar/index.json b/custom-tab-bar/index.json deleted file mode 100644 index e16a2dd..0000000 --- a/custom-tab-bar/index.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "component": true, - "usingComponents": { - "t-tab-bar": "tdesign-miniprogram/tab-bar/tab-bar", - "t-tab-bar-item": "tdesign-miniprogram/tab-bar-item/tab-bar-item" - } -} diff --git a/custom-tab-bar/index.less b/custom-tab-bar/index.less deleted file mode 100644 index 0381d54..0000000 --- a/custom-tab-bar/index.less +++ /dev/null @@ -1,10 +0,0 @@ -@import '/variable.less'; - -.custom-tab-bar { - --td-tab-bar-height: @tab-bar-height; - - &-item { - margin: 0; - padding: 16rpx 24rpx; - } -} diff --git a/custom-tab-bar/index.wxml b/custom-tab-bar/index.wxml deleted file mode 100644 index 46ab488..0000000 --- a/custom-tab-bar/index.wxml +++ /dev/null @@ -1,5 +0,0 @@ - - 首页 - 随访 - 我的 - diff --git a/iconfont.less b/iconfont.less index 81fd748..d85e63d 100644 --- a/iconfont.less +++ b/iconfont.less @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 4945922 */ - src: url('//at.alicdn.com/t/c/font_4945922_6mzvl34xg5m.woff2?t=1750861347404') format('woff2'), - url('//at.alicdn.com/t/c/font_4945922_6mzvl34xg5m.woff?t=1750861347404') format('woff'), - url('//at.alicdn.com/t/c/font_4945922_6mzvl34xg5m.ttf?t=1750861347404') format('truetype'); + src: url('//at.alicdn.com/t/c/font_4945922_tich5e9231m.woff2?t=1751263412822') format('woff2'), + url('//at.alicdn.com/t/c/font_4945922_tich5e9231m.woff?t=1751263412822') format('woff'), + url('//at.alicdn.com/t/c/font_4945922_tich5e9231m.ttf?t=1751263412822') format('truetype'); } .iconfont { @@ -13,6 +13,30 @@ -moz-osx-font-smoothing: grayscale; } +.icon-xiaoxi1:before { + content: "\e61c"; +} + +.icon-gouxuan1:before { + content: "\e61b"; +} + +.icon-fare:before { + content: "\e63a"; +} + +.icon-xiaohuaneike:before { + content: "\e613"; +} + +.icon-dabianhui:before { + content: "\e604"; +} + +.icon-dabianhong:before { + content: "\e605"; +} + .icon-x:before { content: "\e602"; } @@ -112,3 +136,6 @@ .icon-xiangji:before { content: "\e609"; } + + + diff --git a/miniprogram_npm/@antv/g2/index.js b/miniprogram_npm/@antv/g2/index.js new file mode 100644 index 0000000..0793740 --- /dev/null +++ b/miniprogram_npm/@antv/g2/index.js @@ -0,0 +1,30284 @@ +module.exports = (function() { +var __MODS__ = {}; +var __DEFINE__ = function(modId, func, req) { var m = { exports: {}, _tempexports: {} }; __MODS__[modId] = { status: 0, func: func, req: req, m: m }; }; +var __REQUIRE__ = function(modId, source) { if(!__MODS__[modId]) return require(source); if(!__MODS__[modId].status) { var m = __MODS__[modId].m; m._exports = m._tempexports; var desp = Object.getOwnPropertyDescriptor(m, "exports"); if (desp && desp.configurable) Object.defineProperty(m, "exports", { set: function (val) { if(typeof val === "object" && val !== m._exports) { m._exports.__proto__ = val.__proto__; Object.keys(val).forEach(function (k) { m._exports[k] = val[k]; }); } m._tempexports = val }, get: function () { return m._tempexports; } }); __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports); } return __MODS__[modId].m.exports; }; +var __REQUIRE_WILDCARD__ = function(obj) { if(obj && obj.__esModule) { return obj; } else { var newObj = {}; if(obj != null) { for(var k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.default = obj; return newObj; } }; +var __REQUIRE_DEFAULT__ = function(obj) { return obj && obj.__esModule ? obj.default : obj; }; +__DEFINE__(1751263815802, function(require, module, exports) { + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Chart = exports.stdlib = exports.geolib = exports.graphlib = exports.plotlib = exports.corelib = exports.litelib = void 0; +const lib_1 = require("./lib"); +Object.defineProperty(exports, "litelib", { enumerable: true, get: function () { return lib_1.litelib; } }); +Object.defineProperty(exports, "corelib", { enumerable: true, get: function () { return lib_1.corelib; } }); +Object.defineProperty(exports, "plotlib", { enumerable: true, get: function () { return lib_1.plotlib; } }); +Object.defineProperty(exports, "graphlib", { enumerable: true, get: function () { return lib_1.graphlib; } }); +Object.defineProperty(exports, "geolib", { enumerable: true, get: function () { return lib_1.geolib; } }); +Object.defineProperty(exports, "stdlib", { enumerable: true, get: function () { return lib_1.stdlib; } }); +const api_1 = require("./api"); +__exportStar(require("./exports"), exports); +/** + * G2 standard library initial all the libs except 3D and auto. + */ +const library = Object.assign({}, (0, lib_1.stdlib)()); +exports.Chart = (0, api_1.extend)(api_1.Runtime, library); +//# sourceMappingURL=index.js.map +}, function(modId) {var map = {"./lib":1751263815803,"./api":1751263816191,"./exports":1751263816203}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815803, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.litelib = exports.stdlib = exports.plotlib = exports.graphlib = exports.geolib = exports.corelib = void 0; +var core_1 = require("./core"); +Object.defineProperty(exports, "corelib", { enumerable: true, get: function () { return core_1.corelib; } }); +var geo_1 = require("./geo"); +Object.defineProperty(exports, "geolib", { enumerable: true, get: function () { return geo_1.geolib; } }); +var graph_1 = require("./graph"); +Object.defineProperty(exports, "graphlib", { enumerable: true, get: function () { return graph_1.graphlib; } }); +var plot_1 = require("./plot"); +Object.defineProperty(exports, "plotlib", { enumerable: true, get: function () { return plot_1.plotlib; } }); +var std_1 = require("./std"); +Object.defineProperty(exports, "stdlib", { enumerable: true, get: function () { return std_1.stdlib; } }); +var lite_1 = require("./lite"); +Object.defineProperty(exports, "litelib", { enumerable: true, get: function () { return lite_1.litelib; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./core":1751263815804,"./geo":1751263816186,"./graph":1751263816187,"./plot":1751263816188,"./std":1751263816189,"./lite":1751263816190}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815804, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.corelib = void 0; +const coordinate_1 = require("../coordinate"); +const encode_1 = require("../encode"); +const mark_1 = require("../mark"); +const palette_1 = require("../palette"); +const scale_1 = require("../scale"); +const theme_1 = require("../theme"); +const component_1 = require("../component"); +const animation_1 = require("../animation"); +const interaction_1 = require("../interaction"); +const composition_1 = require("../composition"); +const transform_1 = require("../transform"); +const data_1 = require("../data"); +const label_transform_1 = require("../label-transform"); +function corelib() { + return { + 'data.fetch': data_1.Fetch, + 'data.inline': data_1.Inline, + 'data.sortBy': data_1.SortBy, + 'data.sort': data_1.Sort, + 'data.filter': data_1.Filter, + 'data.pick': data_1.Pick, + 'data.rename': data_1.Rename, + 'data.fold': data_1.Fold, + 'data.slice': data_1.Slice, + 'data.custom': data_1.Custom, + 'data.map': data_1.Map, + 'data.join': data_1.Join, + 'data.kde': data_1.KDE, + 'data.log': data_1.Log, + 'data.wordCloud': data_1.WordCloud, + 'data.ema': data_1.EMA, + 'transform.stackY': transform_1.StackY, + 'transform.binX': transform_1.BinX, + 'transform.bin': transform_1.Bin, + 'transform.dodgeX': transform_1.DodgeX, + 'transform.jitter': transform_1.Jitter, + 'transform.jitterX': transform_1.JitterX, + 'transform.jitterY': transform_1.JitterY, + 'transform.symmetryY': transform_1.SymmetryY, + 'transform.diffY': transform_1.DiffY, + 'transform.stackEnter': transform_1.StackEnter, + 'transform.normalizeY': transform_1.NormalizeY, + 'transform.select': transform_1.Select, + 'transform.selectX': transform_1.SelectX, + 'transform.selectY': transform_1.SelectY, + 'transform.groupX': transform_1.GroupX, + 'transform.groupY': transform_1.GroupY, + 'transform.groupColor': transform_1.GroupColor, + 'transform.group': transform_1.Group, + 'transform.sortX': transform_1.SortX, + 'transform.sortY': transform_1.SortY, + 'transform.sortColor': transform_1.SortColor, + 'transform.flexX': transform_1.FlexX, + 'transform.pack': transform_1.Pack, + 'transform.sample': transform_1.Sample, + 'transform.filter': transform_1.Filter, + 'coordinate.cartesian': coordinate_1.Cartesian, + 'coordinate.polar': coordinate_1.Polar, + 'coordinate.transpose': coordinate_1.Transpose, + 'coordinate.theta': coordinate_1.Theta, + 'coordinate.parallel': coordinate_1.Parallel, + 'coordinate.fisheye': coordinate_1.Fisheye, + 'coordinate.radial': coordinate_1.Radial, + 'coordinate.radar': coordinate_1.Radar, + 'coordinate.helix': coordinate_1.Helix, + 'encode.constant': encode_1.Constant, + 'encode.field': encode_1.Field, + 'encode.transform': encode_1.Transform, + 'encode.column': encode_1.Column, + 'mark.interval': mark_1.Interval, + 'mark.rect': mark_1.Rect, + 'mark.line': mark_1.Line, + 'mark.point': mark_1.Point, + 'mark.text': mark_1.Text, + 'mark.cell': mark_1.Cell, + 'mark.area': mark_1.Area, + 'mark.link': mark_1.Link, + 'mark.image': mark_1.Image, + 'mark.polygon': mark_1.Polygon, + 'mark.box': mark_1.Box, + 'mark.vector': mark_1.Vector, + 'mark.lineX': mark_1.LineX, + 'mark.lineY': mark_1.LineY, + 'mark.connector': mark_1.Connector, + 'mark.range': mark_1.Range, + 'mark.rangeX': mark_1.RangeX, + 'mark.rangeY': mark_1.RangeY, + 'mark.path': mark_1.Path, + 'mark.shape': mark_1.Shape, + 'mark.density': mark_1.Density, + 'mark.heatmap': mark_1.Heatmap, + 'mark.wordCloud': mark_1.WordCloud, + 'palette.category10': palette_1.Category10, + 'palette.category20': palette_1.Category20, + 'scale.linear': scale_1.Linear, + 'scale.ordinal': scale_1.Ordinal, + 'scale.band': scale_1.Band, + 'scale.identity': scale_1.Identity, + 'scale.point': scale_1.Point, + 'scale.time': scale_1.Time, + 'scale.log': scale_1.Log, + 'scale.pow': scale_1.Pow, + 'scale.sqrt': scale_1.Sqrt, + 'scale.threshold': scale_1.Threshold, + 'scale.quantile': scale_1.Quantile, + 'scale.quantize': scale_1.Quantize, + 'scale.sequential': scale_1.Sequential, + 'scale.constant': scale_1.Constant, + 'theme.classic': theme_1.Classic, + 'theme.classicDark': theme_1.ClassicDark, + 'theme.academy': theme_1.Academy, + 'theme.light': theme_1.Light, + 'theme.dark': theme_1.Dark, + 'component.axisX': component_1.AxisX, + 'component.axisY': component_1.AxisY, + 'component.legendCategory': component_1.LegendCategory, + 'component.legendContinuous': component_1.LegendContinuous, + 'component.legends': component_1.Legends, + 'component.title': component_1.TitleComponent, + 'component.sliderX': component_1.SliderX, + 'component.sliderY': component_1.SliderY, + 'component.scrollbarX': component_1.ScrollbarX, + 'component.scrollbarY': component_1.ScrollbarY, + 'animation.scaleInX': animation_1.ScaleInX, + 'animation.scaleOutX': animation_1.ScaleOutX, + 'animation.scaleInY': animation_1.ScaleInY, + 'animation.scaleOutY': animation_1.ScaleOutY, + 'animation.waveIn': animation_1.WaveIn, + 'animation.fadeIn': animation_1.FadeIn, + 'animation.fadeOut': animation_1.FadeOut, + 'animation.zoomIn': animation_1.ZoomIn, + 'animation.zoomOut': animation_1.ZoomOut, + 'animation.pathIn': animation_1.PathIn, + 'animation.morphing': animation_1.Morphing, + 'animation.growInX': animation_1.GrowInX, + 'animation.growInY': animation_1.GrowInY, + 'interaction.elementHighlight': interaction_1.ElementHighlight, + 'interaction.elementHighlightByX': interaction_1.ElementHighlightByX, + 'interaction.elementHighlightByColor': interaction_1.ElementHighlightByColor, + 'interaction.elementSelect': interaction_1.ElementSelect, + 'interaction.elementSelectByX': interaction_1.ElementSelectByX, + 'interaction.elementSelectByColor': interaction_1.ElementSelectByColor, + 'interaction.fisheye': interaction_1.Fisheye, + 'interaction.chartIndex': interaction_1.ChartIndex, + 'interaction.tooltip': interaction_1.Tooltip, + 'interaction.legendFilter': interaction_1.LegendFilter, + 'interaction.legendHighlight': interaction_1.LegendHighlight, + 'interaction.brushHighlight': interaction_1.BrushHighlight, + 'interaction.brushXHighlight': interaction_1.BrushXHighlight, + 'interaction.brushYHighlight': interaction_1.BrushYHighlight, + 'interaction.brushAxisHighlight': interaction_1.BrushAxisHighlight, + 'interaction.brushFilter': interaction_1.BrushFilter, + 'interaction.brushXFilter': interaction_1.BrushXFilter, + 'interaction.brushYFilter': interaction_1.BrushYFilter, + 'interaction.sliderFilter': interaction_1.SliderFilter, + 'interaction.scrollbarFilter': interaction_1.ScrollbarFilter, + 'interaction.poptip': interaction_1.Poptip, + 'interaction.treemapDrillDown': interaction_1.TreemapDrillDown, + 'interaction.elementPointMove': interaction_1.ElementPointMove, + 'composition.spaceLayer': composition_1.SpaceLayer, + 'composition.spaceFlex': composition_1.SpaceFlex, + 'composition.facetRect': composition_1.FacetRect, + 'composition.repeatMatrix': composition_1.RepeatMatrix, + 'composition.facetCircle': composition_1.FacetCircle, + 'composition.timingKeyframe': composition_1.TimingKeyframe, + 'labelTransform.overlapHide': label_transform_1.OverlapHide, + 'labelTransform.overlapDodgeY': label_transform_1.OverlapDodgeY, + 'labelTransform.overflowHide': label_transform_1.OverflowHide, + 'labelTransform.contrastReverse': label_transform_1.ContrastReverse, + 'labelTransform.exceedAdjust': label_transform_1.ExceedAdjust, + }; +} +exports.corelib = corelib; +//# sourceMappingURL=core.js.map +}, function(modId) { var map = {"../coordinate":1751263815805,"../encode":1751263815816,"../mark":1751263815821,"../palette":1751263816018,"../scale":1751263816021,"../theme":1751263816036,"../component":1751263816043,"../animation":1751263816063,"../interaction":1751263816078,"../composition":1751263816099,"../transform":1751263815823,"../data":1751263816146,"../label-transform":1751263816178}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815805, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Radar = exports.Fisheye = exports.Parallel = exports.getRadialOptions = exports.Radial = exports.getThetaOptions = exports.Theta = exports.Transpose = exports.Helix = exports.getPolarOptions = exports.Polar = exports.Cartesian = void 0; +var cartesian_1 = require("./cartesian"); +Object.defineProperty(exports, "Cartesian", { enumerable: true, get: function () { return cartesian_1.Cartesian; } }); +var polar_1 = require("./polar"); +Object.defineProperty(exports, "Polar", { enumerable: true, get: function () { return polar_1.Polar; } }); +Object.defineProperty(exports, "getPolarOptions", { enumerable: true, get: function () { return polar_1.getPolarOptions; } }); +var helix_1 = require("./helix"); +Object.defineProperty(exports, "Helix", { enumerable: true, get: function () { return helix_1.Helix; } }); +var transpose_1 = require("./transpose"); +Object.defineProperty(exports, "Transpose", { enumerable: true, get: function () { return transpose_1.Transpose; } }); +var theta_1 = require("./theta"); +Object.defineProperty(exports, "Theta", { enumerable: true, get: function () { return theta_1.Theta; } }); +Object.defineProperty(exports, "getThetaOptions", { enumerable: true, get: function () { return theta_1.getThetaOptions; } }); +var radial_1 = require("./radial"); +Object.defineProperty(exports, "Radial", { enumerable: true, get: function () { return radial_1.Radial; } }); +Object.defineProperty(exports, "getRadialOptions", { enumerable: true, get: function () { return radial_1.getRadialOptions; } }); +var parallel_1 = require("./parallel"); +Object.defineProperty(exports, "Parallel", { enumerable: true, get: function () { return parallel_1.Parallel; } }); +var fisheye_1 = require("./fisheye"); +Object.defineProperty(exports, "Fisheye", { enumerable: true, get: function () { return fisheye_1.Fisheye; } }); +var radar_1 = require("./radar"); +Object.defineProperty(exports, "Radar", { enumerable: true, get: function () { return radar_1.Radar; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./cartesian":1751263815806,"./polar":1751263815807,"./helix":1751263815809,"./transpose":1751263815810,"./theta":1751263815811,"./radial":1751263815812,"./parallel":1751263815813,"./fisheye":1751263815814,"./radar":1751263815815}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815806, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Cartesian = void 0; +/** + * Default coordinate transformation for all charts. + */ +const Cartesian = () => [['cartesian']]; +exports.Cartesian = Cartesian; +exports.Cartesian.props = {}; +//# sourceMappingURL=cartesian.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815807, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Polar = exports.getPolarOptions = void 0; +const angle_1 = require("../utils/angle"); +const getPolarOptions = (options = {}) => { + const defaultOptions = { + startAngle: -Math.PI / 2, + endAngle: (Math.PI * 3) / 2, + innerRadius: 0, + outerRadius: 1, + }; + const polarOption = Object.assign(Object.assign({}, defaultOptions), options); + return Object.assign(Object.assign({}, polarOption), (0, angle_1.convertAngles)(polarOption.startAngle, polarOption.endAngle)); +}; +exports.getPolarOptions = getPolarOptions; +/** + * Polar transformation for circular charts using center of canvas as origin. + * @todo Adjust size of canvas by startAngle and endAngle to make chart as big as possible. + */ +const Polar = (options) => { + const { startAngle, endAngle, innerRadius, outerRadius } = (0, exports.getPolarOptions)(options); + return [ + ['translate', 0, 0.5], + ['reflect.y'], + ['translate', 0, -0.5], + ['polar', startAngle, endAngle, innerRadius, outerRadius], + ]; +}; +exports.Polar = Polar; +exports.Polar.props = {}; +//# sourceMappingURL=polar.js.map +}, function(modId) { var map = {"../utils/angle":1751263815808}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815808, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.convertAngles = exports.toDegree = exports.toRadian = void 0; +function toRadian(degree) { + return (degree * Math.PI) / 180; +} +exports.toRadian = toRadian; +function toDegree(radian) { + return (radian * 180) / Math.PI; +} +exports.toDegree = toDegree; +// convert the angle to the range of 0 to 4*Math.PI +function convertAngles(startAngle, endAngle) { + startAngle = startAngle % (2 * Math.PI); + endAngle = endAngle % (2 * Math.PI); + if (startAngle < 0) { + startAngle = 2 * Math.PI + startAngle; + } + if (endAngle < 0) { + endAngle = 2 * Math.PI + endAngle; + } + if (startAngle >= endAngle) { + endAngle = endAngle + 2 * Math.PI; + } + return { + startAngle, + endAngle, + }; +} +exports.convertAngles = convertAngles; +//# sourceMappingURL=angle.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815809, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Helix = void 0; +/** + * Helix + */ +const Helix = ({ startAngle = 0, endAngle = Math.PI * 6, innerRadius = 0, outerRadius = 1, }) => [ + ['translate', 0.5, 0.5], + ['reflect.y'], + ['translate', -0.5, -0.5], + ['helix', startAngle, endAngle, innerRadius, outerRadius], +]; +exports.Helix = Helix; +exports.Helix.props = {}; +//# sourceMappingURL=helix.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815810, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Transpose = void 0; +/** + * Transpose transformation for transposing chart according to center of canvas. + */ +const Transpose = () => [ + ['transpose'], + ['translate', 0.5, 0.5], + ['reflect.x'], + ['translate', -0.5, -0.5], +]; +exports.Transpose = Transpose; +exports.Transpose.props = { transform: true }; +//# sourceMappingURL=transpose.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815811, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Theta = exports.getThetaOptions = void 0; +const polar_1 = require("./polar"); +const transpose_1 = require("./transpose"); +const getThetaOptions = (options = {}) => { + const defaultOptions = { + startAngle: -Math.PI / 2, + endAngle: (Math.PI * 3) / 2, + innerRadius: 0, + outerRadius: 1, + }; + return Object.assign(Object.assign({}, defaultOptions), options); +}; +exports.getThetaOptions = getThetaOptions; +/** + * Theta = Transpose + Polar. + */ +const Theta = (options) => { + const { startAngle, endAngle, innerRadius, outerRadius } = (0, exports.getThetaOptions)(options); + return [ + ...(0, transpose_1.Transpose)(), + ...(0, polar_1.Polar)({ startAngle, endAngle, innerRadius, outerRadius }), + ]; +}; +exports.Theta = Theta; +exports.Theta.props = {}; +//# sourceMappingURL=theta.js.map +}, function(modId) { var map = {"./polar":1751263815807,"./transpose":1751263815810}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815812, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Radial = exports.getRadialOptions = void 0; +const polar_1 = require("./polar"); +const getRadialOptions = (options = {}) => { + const defaultOptions = { + startAngle: -Math.PI / 2, + endAngle: (Math.PI * 3) / 2, + innerRadius: 0, + outerRadius: 1, + }; + return Object.assign(Object.assign({}, defaultOptions), options); +}; +exports.getRadialOptions = getRadialOptions; +/** + * Radial + */ +const Radial = (options) => { + const { startAngle, endAngle, innerRadius, outerRadius } = (0, exports.getRadialOptions)(options); + return [ + ['transpose'], + ['translate', 0.5, 0.5], + ['reflect'], + ['translate', -0.5, -0.5], + ...(0, polar_1.Polar)({ startAngle, endAngle, innerRadius, outerRadius }), + ]; +}; +exports.Radial = Radial; +exports.Radial.props = {}; +//# sourceMappingURL=radial.js.map +}, function(modId) { var map = {"./polar":1751263815807}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815813, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Parallel = void 0; +/** + * Parallel coordinate transformations for parallel coordinate. + */ +const Parallel = () => [['parallel', 0, 1, 0, 1]]; +exports.Parallel = Parallel; +exports.Parallel.props = {}; +//# sourceMappingURL=parallel.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815814, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Fisheye = void 0; +/** + * Fisheye + */ +const Fisheye = ({ focusX = 0, focusY = 0, distortionX = 2, distortionY = 2, visual = false, }) => [['fisheye', focusX, focusY, distortionX, distortionY, visual]]; +exports.Fisheye = Fisheye; +exports.Fisheye.props = { transform: true }; +//# sourceMappingURL=fisheye.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815815, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Radar = void 0; +const polar_1 = require("./polar"); +const parallel_1 = require("./parallel"); +/** + * Radar = Parallel + Polar. + */ +const Radar = (options) => { + const { startAngle = -Math.PI / 2, endAngle = (Math.PI * 3) / 2, innerRadius = 0, outerRadius = 1, } = options; + return [ + ...(0, parallel_1.Parallel)(), + ...(0, polar_1.Polar)({ startAngle, endAngle, innerRadius, outerRadius }), + ]; +}; +exports.Radar = Radar; +exports.Radar.props = {}; +//# sourceMappingURL=radar.js.map +}, function(modId) { var map = {"./polar":1751263815807,"./parallel":1751263815813}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815816, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Column = exports.Field = exports.Transform = exports.Constant = void 0; +var constant_1 = require("./constant"); +Object.defineProperty(exports, "Constant", { enumerable: true, get: function () { return constant_1.Constant; } }); +var transform_1 = require("./transform"); +Object.defineProperty(exports, "Transform", { enumerable: true, get: function () { return transform_1.Transform; } }); +var field_1 = require("./field"); +Object.defineProperty(exports, "Field", { enumerable: true, get: function () { return field_1.Field; } }); +var column_1 = require("./column"); +Object.defineProperty(exports, "Column", { enumerable: true, get: function () { return column_1.Column; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./constant":1751263815817,"./transform":1751263815818,"./field":1751263815819,"./column":1751263815820}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815817, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Constant = void 0; +/** + * Extract a column of data filled with the specified constant. + */ +const Constant = ({ value }) => { + return (data) => data.map(() => value); +}; +exports.Constant = Constant; +exports.Constant.props = {}; +//# sourceMappingURL=constant.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815818, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Transform = void 0; +/** + * Extract a column of data with specified map function from data. + * Each datum in the array is not visual data by default. + * Specifying identity scale for related channel explicitly will treat them as visual data. + */ +const Transform = ({ value }) => { + return (data) => data.map(value); +}; +exports.Transform = Transform; +exports.Transform.props = {}; +//# sourceMappingURL=transform.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815819, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Field = void 0; +/** + * Extract a column of data with specified field. + */ +const Field = ({ value }) => { + return (data) => data.map((d) => d[value]); +}; +exports.Field = Field; +exports.Field.props = {}; +//# sourceMappingURL=field.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815820, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Column = void 0; +/** + * Extract a column of data specified in encoding. + */ +const Column = ({ value }) => { + return () => value; +}; +exports.Column = Column; +exports.Column.props = {}; +//# sourceMappingURL=column.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815821, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Liquid = exports.Heatmap = exports.Density = exports.Gauge = exports.WordCloud = exports.Tree = exports.ForceGraph = exports.Shape = exports.Boxplot = exports.Pack = exports.Treemap = exports.Path = exports.Chord = exports.Sankey = exports.RangeY = exports.RangeX = exports.Range = exports.Connector = exports.LineX = exports.LineY = exports.Vector = exports.Box = exports.Polygon = exports.Image = exports.Link = exports.Area = exports.Cell = exports.Text = exports.Point = exports.Line = exports.Rect = exports.Interval = void 0; +var interval_1 = require("./interval"); +Object.defineProperty(exports, "Interval", { enumerable: true, get: function () { return interval_1.Interval; } }); +var rect_1 = require("./rect"); +Object.defineProperty(exports, "Rect", { enumerable: true, get: function () { return rect_1.Rect; } }); +var line_1 = require("./line"); +Object.defineProperty(exports, "Line", { enumerable: true, get: function () { return line_1.Line; } }); +var point_1 = require("./point"); +Object.defineProperty(exports, "Point", { enumerable: true, get: function () { return point_1.Point; } }); +var text_1 = require("./text"); +Object.defineProperty(exports, "Text", { enumerable: true, get: function () { return text_1.Text; } }); +var cell_1 = require("./cell"); +Object.defineProperty(exports, "Cell", { enumerable: true, get: function () { return cell_1.Cell; } }); +var area_1 = require("./area"); +Object.defineProperty(exports, "Area", { enumerable: true, get: function () { return area_1.Area; } }); +var link_1 = require("./link"); +Object.defineProperty(exports, "Link", { enumerable: true, get: function () { return link_1.Link; } }); +var image_1 = require("./image"); +Object.defineProperty(exports, "Image", { enumerable: true, get: function () { return image_1.Image; } }); +var polygon_1 = require("./polygon"); +Object.defineProperty(exports, "Polygon", { enumerable: true, get: function () { return polygon_1.Polygon; } }); +var box_1 = require("./box"); +Object.defineProperty(exports, "Box", { enumerable: true, get: function () { return box_1.Box; } }); +var vector_1 = require("./vector"); +Object.defineProperty(exports, "Vector", { enumerable: true, get: function () { return vector_1.Vector; } }); +var lineY_1 = require("./lineY"); +Object.defineProperty(exports, "LineY", { enumerable: true, get: function () { return lineY_1.LineY; } }); +var lineX_1 = require("./lineX"); +Object.defineProperty(exports, "LineX", { enumerable: true, get: function () { return lineX_1.LineX; } }); +var connector_1 = require("./connector"); +Object.defineProperty(exports, "Connector", { enumerable: true, get: function () { return connector_1.Connector; } }); +var range_1 = require("./range"); +Object.defineProperty(exports, "Range", { enumerable: true, get: function () { return range_1.Range; } }); +var rangeX_1 = require("./rangeX"); +Object.defineProperty(exports, "RangeX", { enumerable: true, get: function () { return rangeX_1.RangeX; } }); +var rangeY_1 = require("./rangeY"); +Object.defineProperty(exports, "RangeY", { enumerable: true, get: function () { return rangeY_1.RangeY; } }); +var sankey_1 = require("./sankey"); +Object.defineProperty(exports, "Sankey", { enumerable: true, get: function () { return sankey_1.Sankey; } }); +var chord_1 = require("./chord"); +Object.defineProperty(exports, "Chord", { enumerable: true, get: function () { return chord_1.Chord; } }); +var path_1 = require("./path"); +Object.defineProperty(exports, "Path", { enumerable: true, get: function () { return path_1.Path; } }); +var treemap_1 = require("./treemap"); +Object.defineProperty(exports, "Treemap", { enumerable: true, get: function () { return treemap_1.Treemap; } }); +var pack_1 = require("./pack"); +Object.defineProperty(exports, "Pack", { enumerable: true, get: function () { return pack_1.Pack; } }); +var boxplot_1 = require("./boxplot"); +Object.defineProperty(exports, "Boxplot", { enumerable: true, get: function () { return boxplot_1.Boxplot; } }); +var shape_1 = require("./shape"); +Object.defineProperty(exports, "Shape", { enumerable: true, get: function () { return shape_1.Shape; } }); +var forceGraph_1 = require("./forceGraph"); +Object.defineProperty(exports, "ForceGraph", { enumerable: true, get: function () { return forceGraph_1.ForceGraph; } }); +var tree_1 = require("./tree"); +Object.defineProperty(exports, "Tree", { enumerable: true, get: function () { return tree_1.Tree; } }); +var wordCloud_1 = require("./wordCloud"); +Object.defineProperty(exports, "WordCloud", { enumerable: true, get: function () { return wordCloud_1.WordCloud; } }); +var gauge_1 = require("./gauge"); +Object.defineProperty(exports, "Gauge", { enumerable: true, get: function () { return gauge_1.Gauge; } }); +var density_1 = require("./density"); +Object.defineProperty(exports, "Density", { enumerable: true, get: function () { return density_1.Density; } }); +var heatmap_1 = require("./heatmap"); +Object.defineProperty(exports, "Heatmap", { enumerable: true, get: function () { return heatmap_1.Heatmap; } }); +var liquid_1 = require("./liquid"); +Object.defineProperty(exports, "Liquid", { enumerable: true, get: function () { return liquid_1.Liquid; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./interval":1751263815822,"./rect":1751263815974,"./line":1751263815975,"./point":1751263815976,"./text":1751263815977,"./cell":1751263815978,"./area":1751263815979,"./link":1751263815980,"./image":1751263815981,"./polygon":1751263815982,"./box":1751263815983,"./vector":1751263815984,"./lineY":1751263815985,"./lineX":1751263815986,"./connector":1751263815987,"./range":1751263815988,"./rangeX":1751263815989,"./rangeY":1751263815990,"./sankey":1751263815991,"./chord":1751263815998,"./path":1751263816003,"./treemap":1751263816004,"./pack":1751263816006,"./boxplot":1751263816007,"./shape":1751263816008,"./forceGraph":1751263816009,"./tree":1751263816010,"./wordCloud":1751263816013,"./gauge":1751263816014,"./density":1751263816015,"./heatmap":1751263816016,"./liquid":1751263816017}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815822, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Interval = void 0; +const transform_1 = require("../transform"); +const shape_1 = require("../shape"); +const utils_1 = require("./utils"); +function bandWidth(scale, x) { + return scale.getBandWidth(scale.invert(x)); +} +const shape = { + rect: shape_1.IntervalShape, + hollow: shape_1.IntervalHollow, + funnel: shape_1.IntervalFunnel, + pyramid: shape_1.IntervalPyramid, +}; +/** + * Convert value for each channel to rect shapes. + * p0 p1 + * ┌────┐ + * │ │ + * │ │ + * p3 └────┘ p2 + */ +const Interval = () => { + return (index, scale, value, coordinate) => { + const { x: X, y: Y, y1: Y1, series: S, size: SZ } = value; + // Calc width for each interval. + // The scales for x and series channels must be band scale. + const x = scale.x; + const series = scale.series; + const [width] = coordinate.getSize(); + const NSZ = SZ ? SZ.map((d) => +d / width) : null; + const x1x2 = !SZ + ? (x, w, i) => [x, x + w] + : (x, w, i) => { + const mx = x + w / 2; + const s = NSZ[i]; + return [mx - s / 2, mx + s / 2]; + }; + // Calc the points of bounding box for the interval. + // They are start from left-top corner in clock wise order. + const P = Array.from(index, (i) => { + const groupWidth = bandWidth(x, X[i]); + const ratio = series ? bandWidth(series, S === null || S === void 0 ? void 0 : S[i]) : 1; + const width = groupWidth * ratio; + const offset = (+(S === null || S === void 0 ? void 0 : S[i]) || 0) * groupWidth; + const x0 = +X[i] + offset; + const [x1, x2] = x1x2(x0, width, i); + const y1 = +Y[i]; + const y2 = +Y1[i]; + const p1 = [x1, y1]; + const p2 = [x2, y1]; + const p3 = [x2, y2]; + const p4 = [x1, y2]; + return [p1, p2, p3, p4].map((d) => coordinate.map(d)); + }); + return [index, P]; + }; +}; +exports.Interval = Interval; +exports.Interval.props = { + defaultShape: 'rect', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }), + { name: 'x', scale: 'band', required: true }, + { name: 'y', required: true }, + { name: 'series', scale: 'band' }, + { name: 'size' }, + ], + preInference: [ + ...(0, utils_1.basePreInference)(), + { type: transform_1.MaybeZeroY1 }, + { type: transform_1.MaybeZeroX }, + ], + postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip1d)()], + interaction: { shareTooltip: true }, +}; +//# sourceMappingURL=interval.js.map +}, function(modId) { var map = {"../transform":1751263815823,"../shape":1751263815879,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815823, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Filter = exports.Sample = exports.Bin = exports.BinX = exports.Pack = exports.FlexX = exports.SortY = exports.SortColor = exports.SortX = exports.GroupColor = exports.Group = exports.GroupY = exports.GroupX = exports.SelectY = exports.SelectX = exports.Select = exports.DiffY = exports.SymmetryY = exports.JitterY = exports.JitterX = exports.Jitter = exports.NormalizeY = exports.StackEnter = exports.DodgeX = exports.StackY = exports.MaybeGradient = exports.MaybeTuple = exports.MaybeFunctionAttribute = exports.MaybeVisualPosition = exports.MaybeZeroPadding = exports.MaybeTooltip = exports.MaybeDefaultY = exports.MaybeDefaultX = exports.MaybeIdentityX = exports.MaybeIdentityY = exports.MaybeTupleX = exports.MaybeTupleY = exports.MaybeSeries = exports.MaybeKey = exports.MaybeSize = exports.MaybeZeroZ = exports.MaybeZeroY = exports.MaybeZeroX = exports.MaybeTitle = exports.MaybeStackY = exports.MaybeZeroY1 = void 0; +var maybeZeroY1_1 = require("./maybeZeroY1"); +Object.defineProperty(exports, "MaybeZeroY1", { enumerable: true, get: function () { return maybeZeroY1_1.MaybeZeroY1; } }); +var maybeStackY_1 = require("./maybeStackY"); +Object.defineProperty(exports, "MaybeStackY", { enumerable: true, get: function () { return maybeStackY_1.MaybeStackY; } }); +var maybeTitle_1 = require("./maybeTitle"); +Object.defineProperty(exports, "MaybeTitle", { enumerable: true, get: function () { return maybeTitle_1.MaybeTitle; } }); +var maybeZeroX_1 = require("./maybeZeroX"); +Object.defineProperty(exports, "MaybeZeroX", { enumerable: true, get: function () { return maybeZeroX_1.MaybeZeroX; } }); +var maybeZeroY_1 = require("./maybeZeroY"); +Object.defineProperty(exports, "MaybeZeroY", { enumerable: true, get: function () { return maybeZeroY_1.MaybeZeroY; } }); +var maybeZeroZ_1 = require("./maybeZeroZ"); +Object.defineProperty(exports, "MaybeZeroZ", { enumerable: true, get: function () { return maybeZeroZ_1.MaybeZeroZ; } }); +var maybeSize_1 = require("./maybeSize"); +Object.defineProperty(exports, "MaybeSize", { enumerable: true, get: function () { return maybeSize_1.MaybeSize; } }); +var maybeKey_1 = require("./maybeKey"); +Object.defineProperty(exports, "MaybeKey", { enumerable: true, get: function () { return maybeKey_1.MaybeKey; } }); +var maybeSeries_1 = require("./maybeSeries"); +Object.defineProperty(exports, "MaybeSeries", { enumerable: true, get: function () { return maybeSeries_1.MaybeSeries; } }); +var maybeTupleY_1 = require("./maybeTupleY"); +Object.defineProperty(exports, "MaybeTupleY", { enumerable: true, get: function () { return maybeTupleY_1.MaybeTupleY; } }); +var maybeTupleX_1 = require("./maybeTupleX"); +Object.defineProperty(exports, "MaybeTupleX", { enumerable: true, get: function () { return maybeTupleX_1.MaybeTupleX; } }); +var maybeIdentityY_1 = require("./maybeIdentityY"); +Object.defineProperty(exports, "MaybeIdentityY", { enumerable: true, get: function () { return maybeIdentityY_1.MaybeIdentityY; } }); +var maybeIdentityX_1 = require("./maybeIdentityX"); +Object.defineProperty(exports, "MaybeIdentityX", { enumerable: true, get: function () { return maybeIdentityX_1.MaybeIdentityX; } }); +var maybeDefaultX_1 = require("./maybeDefaultX"); +Object.defineProperty(exports, "MaybeDefaultX", { enumerable: true, get: function () { return maybeDefaultX_1.MaybeDefaultX; } }); +var maybeDefaultY_1 = require("./maybeDefaultY"); +Object.defineProperty(exports, "MaybeDefaultY", { enumerable: true, get: function () { return maybeDefaultY_1.MaybeDefaultY; } }); +var maybeTooltip_1 = require("./maybeTooltip"); +Object.defineProperty(exports, "MaybeTooltip", { enumerable: true, get: function () { return maybeTooltip_1.MaybeTooltip; } }); +var maybeZeroPadding_1 = require("./maybeZeroPadding"); +Object.defineProperty(exports, "MaybeZeroPadding", { enumerable: true, get: function () { return maybeZeroPadding_1.MaybeZeroPadding; } }); +var maybeVisualPosition_1 = require("./maybeVisualPosition"); +Object.defineProperty(exports, "MaybeVisualPosition", { enumerable: true, get: function () { return maybeVisualPosition_1.MaybeVisualPosition; } }); +var maybeFunctionAttribute_1 = require("./maybeFunctionAttribute"); +Object.defineProperty(exports, "MaybeFunctionAttribute", { enumerable: true, get: function () { return maybeFunctionAttribute_1.MaybeFunctionAttribute; } }); +var maybeTuple_1 = require("./maybeTuple"); +Object.defineProperty(exports, "MaybeTuple", { enumerable: true, get: function () { return maybeTuple_1.MaybeTuple; } }); +var maybeGradient_1 = require("./maybeGradient"); +Object.defineProperty(exports, "MaybeGradient", { enumerable: true, get: function () { return maybeGradient_1.MaybeGradient; } }); +var stackY_1 = require("./stackY"); +Object.defineProperty(exports, "StackY", { enumerable: true, get: function () { return stackY_1.StackY; } }); +var dodgeX_1 = require("./dodgeX"); +Object.defineProperty(exports, "DodgeX", { enumerable: true, get: function () { return dodgeX_1.DodgeX; } }); +var stackEnter_1 = require("./stackEnter"); +Object.defineProperty(exports, "StackEnter", { enumerable: true, get: function () { return stackEnter_1.StackEnter; } }); +var normalizeY_1 = require("./normalizeY"); +Object.defineProperty(exports, "NormalizeY", { enumerable: true, get: function () { return normalizeY_1.NormalizeY; } }); +var jitter_1 = require("./jitter"); +Object.defineProperty(exports, "Jitter", { enumerable: true, get: function () { return jitter_1.Jitter; } }); +var jitterX_1 = require("./jitterX"); +Object.defineProperty(exports, "JitterX", { enumerable: true, get: function () { return jitterX_1.JitterX; } }); +var jitterY_1 = require("./jitterY"); +Object.defineProperty(exports, "JitterY", { enumerable: true, get: function () { return jitterY_1.JitterY; } }); +var symmetryY_1 = require("./symmetryY"); +Object.defineProperty(exports, "SymmetryY", { enumerable: true, get: function () { return symmetryY_1.SymmetryY; } }); +var diffY_1 = require("./diffY"); +Object.defineProperty(exports, "DiffY", { enumerable: true, get: function () { return diffY_1.DiffY; } }); +var select_1 = require("./select"); +Object.defineProperty(exports, "Select", { enumerable: true, get: function () { return select_1.Select; } }); +var selectX_1 = require("./selectX"); +Object.defineProperty(exports, "SelectX", { enumerable: true, get: function () { return selectX_1.SelectX; } }); +var selectY_1 = require("./selectY"); +Object.defineProperty(exports, "SelectY", { enumerable: true, get: function () { return selectY_1.SelectY; } }); +var groupX_1 = require("./groupX"); +Object.defineProperty(exports, "GroupX", { enumerable: true, get: function () { return groupX_1.GroupX; } }); +var groupY_1 = require("./groupY"); +Object.defineProperty(exports, "GroupY", { enumerable: true, get: function () { return groupY_1.GroupY; } }); +var group_1 = require("./group"); +Object.defineProperty(exports, "Group", { enumerable: true, get: function () { return group_1.Group; } }); +var groupColor_1 = require("./groupColor"); +Object.defineProperty(exports, "GroupColor", { enumerable: true, get: function () { return groupColor_1.GroupColor; } }); +var sortX_1 = require("./sortX"); +Object.defineProperty(exports, "SortX", { enumerable: true, get: function () { return sortX_1.SortX; } }); +var sortColor_1 = require("./sortColor"); +Object.defineProperty(exports, "SortColor", { enumerable: true, get: function () { return sortColor_1.SortColor; } }); +var sortY_1 = require("./sortY"); +Object.defineProperty(exports, "SortY", { enumerable: true, get: function () { return sortY_1.SortY; } }); +var flexX_1 = require("./flexX"); +Object.defineProperty(exports, "FlexX", { enumerable: true, get: function () { return flexX_1.FlexX; } }); +var pack_1 = require("./pack"); +Object.defineProperty(exports, "Pack", { enumerable: true, get: function () { return pack_1.Pack; } }); +var binX_1 = require("./binX"); +Object.defineProperty(exports, "BinX", { enumerable: true, get: function () { return binX_1.BinX; } }); +var bin_1 = require("./bin"); +Object.defineProperty(exports, "Bin", { enumerable: true, get: function () { return bin_1.Bin; } }); +var sample_1 = require("./sample"); +Object.defineProperty(exports, "Sample", { enumerable: true, get: function () { return sample_1.Sample; } }); +var filter_1 = require("./filter"); +Object.defineProperty(exports, "Filter", { enumerable: true, get: function () { return filter_1.Filter; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./maybeZeroY1":1751263815824,"./maybeStackY":1751263815826,"./maybeTitle":1751263815831,"./maybeZeroX":1751263815833,"./maybeZeroY":1751263815834,"./maybeZeroZ":1751263815835,"./maybeSize":1751263815836,"./maybeKey":1751263815837,"./maybeSeries":1751263815838,"./maybeTupleY":1751263815839,"./maybeTupleX":1751263815840,"./maybeIdentityY":1751263815841,"./maybeIdentityX":1751263815842,"./maybeDefaultX":1751263815843,"./maybeDefaultY":1751263815844,"./maybeTooltip":1751263815845,"./maybeZeroPadding":1751263815846,"./maybeVisualPosition":1751263815847,"./maybeFunctionAttribute":1751263815848,"./maybeTuple":1751263815849,"./maybeGradient":1751263815850,"./stackY":1751263815827,"./dodgeX":1751263815851,"./stackEnter":1751263815852,"./normalizeY":1751263815853,"./jitter":1751263815854,"./jitterX":1751263815855,"./jitterY":1751263815856,"./symmetryY":1751263815857,"./diffY":1751263815858,"./select":1751263815859,"./selectX":1751263815860,"./selectY":1751263815861,"./groupX":1751263815862,"./groupY":1751263815865,"./group":1751263815863,"./groupColor":1751263815866,"./sortX":1751263815867,"./sortColor":1751263815869,"./sortY":1751263815870,"./flexX":1751263815871,"./pack":1751263815872,"./binX":1751263815874,"./bin":1751263815875,"./sample":1751263815876,"./filter":1751263815878}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815824, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeZeroY1 = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +/** + * Add zero constant encode for y1 channel. + */ +const MaybeZeroY1 = () => { + return (I, mark) => { + const { encode } = mark; + const { y1 } = encode; + if (y1 !== undefined) + return [I, mark]; + return [ + I, + (0, util_1.deepMix)({}, mark, { + encode: { y1: (0, helper_1.inferredColumn)((0, helper_1.constant)(I, 0)) }, + }), + ]; + }; +}; +exports.MaybeZeroY1 = MaybeZeroY1; +exports.MaybeZeroY1.props = {}; +//# sourceMappingURL=maybeZeroY1.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815825, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isObject = exports.maybeColumnOf = exports.columnOf = exports.constant = exports.nonConstantColumn = exports.visualColumn = exports.inferredColumn = exports.column = void 0; +function column(value, field) { + if (value === null) + return undefined; + return { type: 'column', value, field }; +} +exports.column = column; +function inferredColumn(value, field) { + const c = column(value, field); + return Object.assign(Object.assign({}, c), { inferred: true }); +} +exports.inferredColumn = inferredColumn; +function visualColumn(value, field) { + if (value === null) + return undefined; + return { type: 'column', value, field, visual: true }; +} +exports.visualColumn = visualColumn; +function nonConstantColumn(value, field) { + const c = column(value, field); + return Object.assign(Object.assign({}, c), { constant: false }); +} +exports.nonConstantColumn = nonConstantColumn; +function constant(I, value) { + const array = []; + for (const i of I) + array[i] = value; + return array; +} +exports.constant = constant; +function columnOf(encode, key) { + const channel = encode[key]; + if (!channel) + return [null, null]; + const { value, field = null } = channel; + return [value, field]; +} +exports.columnOf = columnOf; +function maybeColumnOf(encode, ...K) { + for (const key of K) { + if (typeof key === 'string') { + const [KV, fv] = columnOf(encode, key); + if (KV !== null) + return [KV, fv]; + } + else { + return [key, null]; + } + } + return [null, null]; +} +exports.maybeColumnOf = maybeColumnOf; +function isObject(d) { + if (d instanceof Date) + return false; + return typeof d === 'object'; +} +exports.isObject = isObject; +//# sourceMappingURL=helper.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815826, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeStackY = void 0; +const stackY_1 = require("./stackY"); +// Avoid duplicate stackY. +// In most of case only one of stackY and dodgeX is needed. +// So pass statistic with stackY and dodgeX. +function exclude(transform) { + const { type } = transform; + const excludes = ['stackY', 'dodgeX', 'groupX']; + return typeof type === 'string' && excludes.includes(type); +} +/** + * Add zero constant encode for x channel. + * This is useful for interval geometry. + */ +const MaybeStackY = (options) => { + return (I, mark, context) => { + // Skip some transform. + const { encode, transform = [] } = mark; + if (transform.some(exclude)) + return [I, mark]; + // StackY need both x and y channel values. + const { x, y } = encode; + if (x === undefined || y === undefined) + return [I, mark]; + const { series } = options; + const groupBy = series ? ['x', 'series'] : 'x'; + return (0, stackY_1.StackY)({ groupBy })(I, mark, context); + }; +}; +exports.MaybeStackY = MaybeStackY; +exports.MaybeStackY.props = {}; +//# sourceMappingURL=maybeStackY.js.map +}, function(modId) { var map = {"./stackY":1751263815827}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815827, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.StackY = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +const order_1 = require("./utils/order"); +/** + * The stack transform group marks into series by color channel, + * and then produce new y channel for each series by specified order, + * say to form vertical "stacks" by specified channels. + */ +const StackY = (options = {}) => { + const { groupBy = 'x', orderBy = null, reverse = false, y: fromY = 'y', y1: fromY1 = 'y1', series = true, } = options; + return (I, mark) => { + var _a; + const { data, encode, style = {} } = mark; + const [Y, fy] = (0, helper_1.columnOf)(encode, 'y'); + const [Y1, fy1] = (0, helper_1.columnOf)(encode, 'y1'); + const [S] = series + ? (0, helper_1.maybeColumnOf)(encode, 'series', 'color') + : (0, helper_1.columnOf)(encode, 'color'); + // Create groups and apply specified order for each group. + const groups = (0, order_1.createGroups)(groupBy, I, mark); + const createComparator = (_a = (0, order_1.normalizeComparator)(orderBy)) !== null && _a !== void 0 ? _a : (() => null); + const comparator = createComparator(data, Y, S); + if (comparator) + (0, order_1.applyOrder)(groups, comparator); + // Stack y channels to produce new y and y1 channel. + const newY = new Array(I.length); + const newY1 = new Array(I.length); + const TY = new Array(I.length); + const F = []; + const L = []; + for (const G of groups) { + if (reverse) + G.reverse(); + // For range interval with specified y and y1. + const start = Y1 ? +Y1[G[0]] : 0; + // Split positive indices of Y and negative Y. + const PG = []; + const NG = []; + for (const i of G) { + const y = (TY[i] = +Y[i] - start); + if (y < 0) + NG.push(i); + else if (y >= 0) + PG.push(i); + } + // Store the first and last layer. + const FG = PG.length > 0 ? PG : NG; + const LG = NG.length > 0 ? NG : PG; + let i = PG.length - 1; + let j = 0; + // Find the last non-zero index. + while (i > 0 && Y[FG[i]] === 0) + i--; + // Find the first non-zero index. + while (j < LG.length - 1 && Y[LG[j]] === 0) + j++; + F.push(FG[i]); + L.push(LG[j]); + // Stack negative y in reverse order. + let ny = start; + for (const i of NG.reverse()) { + const y = TY[i]; + ny = newY[i] = (newY1[i] = ny) + y; + } + // Stack positive y in input order. + let py = start; + for (const i of PG) { + const y = TY[i]; + if (y > 0) + py = newY[i] = (newY1[i] = py) + y; + else + newY[i] = newY1[i] = py; + } + } + // Only set top radius for the first layer, + // and set bottom radius for the last layer. + const FS = new Set(F); + const LS = new Set(L); + // Choose new y or y1 channel as the new y channel. + const V = fromY === 'y' ? newY : newY1; + const V1 = fromY1 === 'y' ? newY : newY1; + let newEncode; + // mark point will compute the actural Y = (y + y1) / 2 if y1 exists + if (mark.type === 'point') { + newEncode = { + y0: (0, helper_1.inferredColumn)(Y, fy), + y: (0, helper_1.column)(V, fy), + }; + } + else { + newEncode = { + y0: (0, helper_1.inferredColumn)(Y, fy), + y: (0, helper_1.column)(V, fy), + y1: (0, helper_1.column)(V1, fy1), + }; + } + return [ + I, + (0, util_1.deepMix)({}, mark, { + encode: Object.assign({}, newEncode), + style: Object.assign({ first: (_, i) => FS.has(i), last: (_, i) => LS.has(i) }, style), + }), + ]; + }; +}; +exports.StackY = StackY; +exports.StackY.props = {}; +//# sourceMappingURL=stackY.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825,"./utils/order":1751263815828}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815828, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.domainOf = exports.applyOrder = exports.normalizeComparator = exports.createGroups = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +const helper_1 = require("../../utils/helper"); +const array_1 = require("../../utils/array"); +const helper_2 = require("./helper"); +function createGroups(groupBy, I, mark) { + const { encode } = mark; + if (groupBy === null) + return [I]; + const G = normalizeGroupBy(groupBy) + .map((k) => { var _a; return [k, (_a = (0, helper_2.columnOf)(encode, k)) === null || _a === void 0 ? void 0 : _a[0]]; }) + .filter(([, column]) => (0, helper_1.defined)(column)); + const key = (i) => G.map(([, V]) => V[i]).join('-'); + return Array.from((0, d3_array_1.group)(I, key).values()); +} +exports.createGroups = createGroups; +function normalizeComparator(order) { + if (Array.isArray(order)) + return createFieldsOrder(order); + if (typeof order === 'function') + return createFunctionOrder(order); + if (order === 'series') + return createSeriesOrder; + if (order === 'value') + return createValueOrder; + if (order === 'sum') + return createSumOrder; + if (order === 'maxIndex') + return createMaxIndexOrder; + return null; +} +exports.normalizeComparator = normalizeComparator; +function applyOrder(groups, comparator) { + for (const group of groups) { + group.sort(comparator); + } +} +exports.applyOrder = applyOrder; +function domainOf(value, scale) { + return (scale === null || scale === void 0 ? void 0 : scale.domain) || Array.from(new Set(value)); +} +exports.domainOf = domainOf; +function normalizeGroupBy(groupBy) { + if (Array.isArray(groupBy)) + return groupBy; + return [groupBy]; +} +function createSeriesOrder(data, Y, S) { + return ascendingComparator((i) => S[i]); +} +function createFunctionOrder(order) { + return (data, Y, S) => { + return ascendingComparator((i) => order(data[i])); + }; +} +function createFieldsOrder(order) { + return (data, Y, S) => { + return (i, j) => order.reduce((eq, f) => (eq !== 0 ? eq : (0, d3_array_1.ascending)(data[i][f], data[j][f])), 0); + }; +} +function createValueOrder(data, Y, S) { + return ascendingComparator((i) => Y[i]); +} +function createSumOrder(data, Y, S) { + const I = (0, array_1.indexOf)(data); + const groups = Array.from((0, d3_array_1.group)(I, (i) => S[+i]).entries()); + const seriesSum = new Map(groups.map(([k, GI]) => [k, GI.reduce((s, i) => s + +Y[i])])); + return ascendingComparator((i) => seriesSum.get(S[i])); +} +function createMaxIndexOrder(data, Y, S) { + const I = (0, array_1.indexOf)(data); + const groups = Array.from((0, d3_array_1.group)(I, (i) => S[+i]).entries()); + const seriesMaxIndex = new Map(groups.map(([k, GI]) => [k, (0, d3_array_1.maxIndex)(GI, (i) => Y[i])])); + return ascendingComparator((i) => seriesMaxIndex.get(S[i])); +} +function ascendingComparator(order) { + return (i, j) => (0, d3_array_1.ascending)(order(i), order(j)); +} +//# sourceMappingURL=order.js.map +}, function(modId) { var map = {"../../utils/helper":1751263815829,"../../utils/array":1751263815830,"./helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815829, function(require, module, exports) { + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.deepAssign = exports.isUnset = exports.isStrictObject = exports.maybePercentage = exports.omitPrefixObject = exports.filterPrefixObject = exports.prefixObject = exports.maybeSubObject = exports.subObject = exports.appendTransform = exports.useMemo = exports.random = exports.defined = exports.copyAttributes = exports.error = exports.capitalizeFirst = exports.composeAsync = exports.compose = exports.identity = exports.groupNameOf = exports.seriesOf = exports.dataOf = exports.getViewFromElement = void 0; +const util_1 = require("@antv/util"); +const scale_1 = require("@antv/scale"); +/** + * @description Get element's ancestor view node. + * @param elemenet G2 element. + * @returns Element's ancestor view node. + */ +function getViewFromElement(element) { + var _a; + let current = element; + while (current) { + if (((_a = current.attributes) === null || _a === void 0 ? void 0 : _a.class) === 'view') + return current; + current = current.parentNode; + } + return null; +} +exports.getViewFromElement = getViewFromElement; +/** + * @description Get element's original data. + * @param elemenet G2 element. + * @param elemenet View data, if not provided, will get from element's ancestor view. + * @returns The original data of the element. + */ +function dataOf(element, viewData) { + const view = viewData !== null && viewData !== void 0 ? viewData : getViewFromElement(element).__data__; + const datum = element.__data__; + const { markKey, index, seriesIndex } = datum; + const { markState } = view; + const selectedMark = Array.from(markState.keys()).find((mark) => mark.key === markKey); + if (!selectedMark) + return; + if (seriesIndex) { + return seriesIndex.map((i) => selectedMark.data[i]); + } + return selectedMark.data[index]; +} +exports.dataOf = dataOf; +/** + * @description Get element's series name. + * @param elemenet G2 element. + * @returns The series name of the element. + */ +function seriesOf(elemenet) { + const viewData = getViewFromElement(elemenet).__data__; + const { scale } = viewData; + return groupNameOf(scale, elemenet.__data__); +} +exports.seriesOf = seriesOf; +/** + * Get group name with view's scale and element's datum. + */ +function groupNameOf(scale, datum) { + const { color: scaleColor, series: scaleSeries, facet = false } = scale; + const { color, series } = datum; + const invertAble = (scale) => { + return (scale && + scale.invert && + !(scale instanceof scale_1.Band) && + !(scale instanceof scale_1.Constant)); + }; + // For non constant color channel. + if (invertAble(scaleSeries)) { + const cloned = scaleSeries.clone(); + return cloned.invert(series); + } + if (series && + scaleSeries instanceof scale_1.Band && + scaleSeries.invert(series) !== color && + !facet) { + return scaleSeries.invert(series); + } + if (invertAble(scaleColor)) { + const name = scaleColor.invert(color); + // For threshold scale. + if (Array.isArray(name)) + return null; + return name; + } + return null; +} +exports.groupNameOf = groupNameOf; +function identity(x) { + return x; +} +exports.identity = identity; +/** + * Composes functions from left to right. + */ +function compose(fns) { + return fns.reduce((composed, fn) => (x, ...args) => fn(composed(x, ...args), ...args), identity); +} +exports.compose = compose; +/** + * Composes single-argument async functions from left to right. + */ +function composeAsync(fns) { + return fns.reduce((composed, fn) => (x) => __awaiter(this, void 0, void 0, function* () { + const value = yield composed(x); + return fn(value); + }), identity); +} +exports.composeAsync = composeAsync; +function capitalizeFirst(str) { + return str.replace(/( |^)[a-z]/g, (L) => L.toUpperCase()); +} +exports.capitalizeFirst = capitalizeFirst; +function error(message = '') { + throw new Error(message); +} +exports.error = error; +function copyAttributes(target, source) { + const { attributes } = source; + const exclude = new Set(['id', 'className']); + for (const [key, value] of Object.entries(attributes)) { + if (!exclude.has(key)) { + target.attr(key, value); + } + } +} +exports.copyAttributes = copyAttributes; +function defined(x) { + return x !== undefined && x !== null && !Number.isNaN(x); +} +exports.defined = defined; +function random(a, b) { + return a + (b - a) * Math.random(); +} +exports.random = random; +function useMemo(compute) { + const map = new Map(); + return (key) => { + if (map.has(key)) + return map.get(key); + const value = compute(key); + map.set(key, value); + return value; + }; +} +exports.useMemo = useMemo; +function appendTransform(node, transform) { + const { transform: preTransform } = node.style; + const unset = (d) => d === 'none' || d === undefined; + const prefix = unset(preTransform) ? '' : preTransform; + node.style.transform = `${prefix} ${transform}`.trimStart(); +} +exports.appendTransform = appendTransform; +function subObject(obj, prefix) { + return maybeSubObject(obj, prefix) || {}; +} +exports.subObject = subObject; +function maybeSubObject(obj, prefix) { + const entries = Object.entries(obj || {}) + .filter(([key]) => key.startsWith(prefix)) + .map(([key, value]) => [(0, util_1.lowerFirst)(key.replace(prefix, '').trim()), value]) + .filter(([key]) => !!key); + return entries.length === 0 ? null : Object.fromEntries(entries); +} +exports.maybeSubObject = maybeSubObject; +function prefixObject(obj, prefix) { + return Object.fromEntries(Object.entries(obj).map(([key, value]) => { + return [`${prefix}${(0, util_1.upperFirst)(key)}`, value]; + })); +} +exports.prefixObject = prefixObject; +function filterPrefixObject(obj, prefix) { + return Object.fromEntries(Object.entries(obj).filter(([key]) => prefix.find((p) => key.startsWith(p)))); +} +exports.filterPrefixObject = filterPrefixObject; +function omitPrefixObject(obj, ...prefixes) { + return Object.fromEntries(Object.entries(obj).filter(([key]) => prefixes.every((prefix) => !key.startsWith(prefix)))); +} +exports.omitPrefixObject = omitPrefixObject; +function maybePercentage(x, size) { + if (x === undefined) + return null; + if (typeof x === 'number') + return x; + const px = +x.replace('%', ''); + return Number.isNaN(px) ? null : (px / 100) * size; +} +exports.maybePercentage = maybePercentage; +function isStrictObject(d) { + return (typeof d === 'object' && + !(d instanceof Date) && + d !== null && + !Array.isArray(d)); +} +exports.isStrictObject = isStrictObject; +function isUnset(value) { + return value === null || value === false; +} +exports.isUnset = isUnset; +function deepAssign(dist, src, maxLevel = 5, level = 0) { + if (level >= maxLevel) + return; + for (const key of Object.keys(src)) { + const value = src[key]; + if (!(0, util_1.isPlainObject)(value) || !(0, util_1.isPlainObject)(dist[key])) { + dist[key] = value; + } + else { + deepAssign(dist[key], value, maxLevel, level + 1); + } + } + return dist; +} +exports.deepAssign = deepAssign; +//# sourceMappingURL=helper.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815830, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.combine = exports.divide = exports.unique = exports.isFlatArray = exports.lastOf = exports.firstOf = exports.transpose = exports.indexOf = exports.mapObject = void 0; +/** + * Calls a defined callback function on each key:value of a object, + * and returns a object contains the result. + */ +function mapObject(object, callbackfn) { + return Object.entries(object).reduce((obj, [key, value]) => { + obj[key] = callbackfn(value, key, object); + return obj; + }, {}); +} +exports.mapObject = mapObject; +function indexOf(array) { + return array.map((_, i) => i); +} +exports.indexOf = indexOf; +/** + * @example [[1, 2, 3], ['a', 'b', 'c']] => [[1, 'a'], [2, 'b'], [3, 'c']] + */ +function transpose(matrix) { + const row = matrix.length; + const col = matrix[0].length; + // Note: new Array(col).fill(new Array(row)) is not ok!!! + // Because in this case it will fill new Array(col) with the same array: new Array(row). + const transposed = new Array(col).fill(0).map(() => new Array(row)); + for (let i = 0; i < col; i++) { + for (let j = 0; j < row; j++) { + transposed[i][j] = matrix[j][i]; + } + } + return transposed; +} +exports.transpose = transpose; +function firstOf(array) { + return array[0]; +} +exports.firstOf = firstOf; +function lastOf(array) { + return array[array.length - 1]; +} +exports.lastOf = lastOf; +function isFlatArray(array) { + return !array.some(Array.isArray); +} +exports.isFlatArray = isFlatArray; +function unique(array) { + return Array.from(new Set(array)); +} +exports.unique = unique; +function divide(array, callbackfn) { + const result = [[], []]; + array.forEach((item) => { + result[callbackfn(item) ? 0 : 1].push(item); + }); + return result; +} +exports.divide = divide; +function comb(array, len = array.length) { + if (len === 1) + return array.map((item) => [item]); + const result = []; + for (let i = 0; i < array.length; i++) { + const rest = array.slice(i + 1); + const restComb = comb(rest, len - 1); + restComb.forEach((comb) => { + result.push([array[i], ...comb]); + }); + } + return result; +} +/** + * get all combinations of two elements in an array + * @example [1, 2, 3] => [[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]] + * @param array + * @returns + */ +function combine(array) { + if (array.length === 1) + return [array]; + const result = []; + for (let i = 1; i <= array.length; i++) { + result.push(...comb(array, i)); + } + return result; +} +exports.combine = combine; +//# sourceMappingURL=array.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815831, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeTitle = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("../utils/helper"); +const dateFormat_1 = require("../utils/dateFormat"); +const helper_2 = require("./utils/helper"); +/** + * Infer title channel from x-position channel. + */ +const MaybeTitle = (options = {}) => { + const { channel = 'x' } = options; + return (I, mark) => { + const { encode } = mark; + const { tooltip } = mark; + if ((0, helper_1.isUnset)(tooltip)) + return [I, mark]; + const { title } = tooltip; + if (title !== undefined) + return [I, mark]; + const titles = Object.keys(encode) + .filter((key) => key.startsWith(channel)) + .filter((key) => !encode[key].inferred) + .map((key) => (0, helper_2.columnOf)(encode, key)) + .filter(([T]) => T) + .map((d) => d[0]); + if (titles.length === 0) + return [I, mark]; + const T = []; + for (const i of I) { + T[i] = { + value: titles + .map((t) => t[i] instanceof Date ? (0, dateFormat_1.dynamicFormatDateTime)(t[i]) : t[i]) + .join(', '), + }; + } + return [ + I, + (0, util_1.deepMix)({}, mark, { + tooltip: { + title: T, + }, + }), + ]; + }; +}; +exports.MaybeTitle = MaybeTitle; +exports.MaybeTitle.props = {}; +//# sourceMappingURL=maybeTitle.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../utils/dateFormat":1751263815832,"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815832, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.dynamicFormatDateTime = void 0; +function fillZero(digit) { + if (Math.abs(digit) > 10) + return String(digit); + return digit.toString().padStart(2, '0'); +} +function dynamicFormatDateTime(date) { + const year = date.getFullYear(); + const month = fillZero(date.getMonth() + 1); + const day = fillZero(date.getDate()); + const yyyyMMDD = `${year}-${month}-${day}`; + const hour = date.getHours(); + const minutes = date.getMinutes(); + const seconds = date.getSeconds(); + if (hour || minutes || seconds) + return `${yyyyMMDD} ${fillZero(hour)}:${fillZero(minutes)}:${fillZero(seconds)}`; + return yyyyMMDD; +} +exports.dynamicFormatDateTime = dynamicFormatDateTime; +//# sourceMappingURL=dateFormat.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815833, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeZeroX = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +/** + * Add zero constant encode for x channel. + * This is useful for interval geometry. + */ +const MaybeZeroX = () => { + return (I, mark) => { + const { encode } = mark; + const { x } = encode; + if (x !== undefined) + return [I, mark]; + return [ + I, + (0, util_1.deepMix)({}, mark, { + encode: { x: (0, helper_1.inferredColumn)((0, helper_1.constant)(I, 0)) }, + scale: { x: { guide: null } }, + }), + ]; + }; +}; +exports.MaybeZeroX = MaybeZeroX; +exports.MaybeZeroX.props = {}; +//# sourceMappingURL=maybeZeroX.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815834, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeZeroY = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +/** + * Add zero constant encode for y channel. + */ +const MaybeZeroY = () => { + return (I, mark) => { + const { encode } = mark; + const { y } = encode; + if (y !== undefined) + return [I, mark]; + return [ + I, + (0, util_1.deepMix)({}, mark, { + encode: { y: (0, helper_1.inferredColumn)((0, helper_1.constant)(I, 0)) }, + scale: { y: { guide: null } }, + }), + ]; + }; +}; +exports.MaybeZeroY = MaybeZeroY; +exports.MaybeZeroY.props = {}; +//# sourceMappingURL=maybeZeroY.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815835, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeZeroZ = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +/** + * Add zero constant encode for z channel. + */ +const MaybeZeroZ = () => { + return (I, mark) => { + const { encode } = mark; + const { z } = encode; + if (z !== undefined) + return [I, mark]; + return [ + I, + (0, util_1.deepMix)({}, mark, { + encode: { z: (0, helper_1.inferredColumn)((0, helper_1.constant)(I, 0)) }, + scale: { z: { guide: null } }, + }), + ]; + }; +}; +exports.MaybeZeroZ = MaybeZeroZ; +exports.MaybeZeroZ.props = {}; +//# sourceMappingURL=maybeZeroZ.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815836, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeSize = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +/** + * Add 3 constant encode for size channel. + * This is useful for point geometry. + */ +const MaybeSize = () => { + return (I, mark) => { + const { encode } = mark; + const { size } = encode; + if (size !== undefined) + return [I, mark]; + return [ + I, + (0, util_1.deepMix)({}, mark, { encode: { size: (0, helper_1.visualColumn)((0, helper_1.constant)(I, 3)) } }), + ]; + }; +}; +exports.MaybeSize = MaybeSize; +exports.MaybeSize.props = {}; +//# sourceMappingURL=maybeSize.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815837, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeKey = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +/** + * Infer key for every element. + */ +const MaybeKey = () => { + return (I, mark) => { + const { encode } = mark; + const { key } = encode, rest = __rest(encode, ["key"]); + if (key !== undefined) + return [I, mark]; + const values = Object.values(rest).map(({ value }) => value); + const K = I.map((i) => values + .filter(Array.isArray) + .map((V) => V[i]) + .join('-')); + return [I, (0, util_1.deepMix)({}, mark, { encode: { key: (0, helper_1.column)(K) } })]; + }; +}; +exports.MaybeKey = MaybeKey; +exports.MaybeKey.props = {}; +//# sourceMappingURL=maybeKey.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815838, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeSeries = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +/** + * Assume color channel is series channel. + */ +const MaybeSeries = () => { + return (I, mark) => { + const { encode } = mark; + const { series, color } = encode; + if (series !== undefined || color === undefined) + return [I, mark]; + const [C, fc] = (0, helper_1.columnOf)(encode, 'color'); + return [I, (0, util_1.deepMix)({}, mark, { encode: { series: (0, helper_1.column)(C, fc) } })]; + }; +}; +exports.MaybeSeries = MaybeSeries; +exports.MaybeSeries.props = {}; +//# sourceMappingURL=maybeSeries.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815839, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeTupleY = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +/** + * Add 3 constant encode for size channel. + * This is useful for point geometry. + */ +const MaybeTupleY = () => { + return (I, mark) => { + const { data } = mark; + if (!Array.isArray(data) || data.some(helper_1.isObject)) + return [I, mark]; + return [I, (0, util_1.deepMix)({}, mark, { encode: { y: (0, helper_1.column)(data) } })]; + }; +}; +exports.MaybeTupleY = MaybeTupleY; +exports.MaybeTupleY.props = {}; +//# sourceMappingURL=maybeTupleY.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815840, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeTupleX = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +/** + * Add 3 constant encode for size channel. + * This is useful for point geometry. + */ +const MaybeTupleX = () => { + return (I, mark) => { + const { data } = mark; + if (!Array.isArray(data) || data.some(helper_1.isObject)) + return [I, mark]; + return [I, (0, util_1.deepMix)({}, mark, { encode: { x: (0, helper_1.column)(data) } })]; + }; +}; +exports.MaybeTupleX = MaybeTupleX; +exports.MaybeTupleX.props = {}; +//# sourceMappingURL=maybeTupleX.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815841, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeIdentityY = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +/** + * Add 3 constant encode for size channel. + * This is useful for point geometry. + */ +const MaybeIdentityY = () => { + return (I, mark) => { + const { encode } = mark; + const { y1 } = encode; + if (y1) + return [I, mark]; + const [Y] = (0, helper_1.columnOf)(encode, 'y'); + return [I, (0, util_1.deepMix)({}, mark, { encode: { y1: (0, helper_1.column)([...Y]) } })]; + }; +}; +exports.MaybeIdentityY = MaybeIdentityY; +exports.MaybeIdentityY.props = {}; +//# sourceMappingURL=maybeIdentityY.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815842, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeIdentityX = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +/** + * Add 3 constant encode for size channel. + * This is useful for point geometry. + */ +const MaybeIdentityX = () => { + return (I, mark) => { + const { encode } = mark; + const { x1 } = encode; + if (x1) + return [I, mark]; + const [X] = (0, helper_1.columnOf)(encode, 'x'); + return [I, (0, util_1.deepMix)({}, mark, { encode: { x1: (0, helper_1.column)([...X]) } })]; + }; +}; +exports.MaybeIdentityX = MaybeIdentityX; +exports.MaybeIdentityX.props = {}; +//# sourceMappingURL=maybeIdentityX.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815843, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeDefaultX = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +/** + * Add a default encode for rangeX + * when data is just an array + */ +const MaybeDefaultX = () => { + return (I, mark) => { + const { data } = mark; + if (Array.isArray(data) && + (data.every(Array.isArray) || !data.some(helper_1.isObject))) { + const extractX = (data, index) => Array.isArray(data[0]) + ? data.map((item) => item[index]) + : [data[index]]; + return [ + I, + (0, util_1.deepMix)({}, mark, { + encode: { + x: (0, helper_1.column)(extractX(data, 0)), + x1: (0, helper_1.column)(extractX(data, 1)), + }, + }), + ]; + } + return [I, mark]; + }; +}; +exports.MaybeDefaultX = MaybeDefaultX; +exports.MaybeDefaultX.props = {}; +//# sourceMappingURL=maybeDefaultX.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815844, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeDefaultY = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +/** + * Add a default encode for rangeY + * when data is just an array + */ +const MaybeDefaultY = () => { + return (I, mark) => { + const { data } = mark; + if (Array.isArray(data) && + (data.every(Array.isArray) || !data.some(helper_1.isObject))) { + const extractY = (data, index) => Array.isArray(data[0]) + ? data.map((item) => item[index]) + : [data[index]]; + return [ + I, + (0, util_1.deepMix)({}, mark, { + encode: { + y: (0, helper_1.column)(extractY(data, 0)), + y1: (0, helper_1.column)(extractY(data, 1)), + }, + }), + ]; + } + return [I, mark]; + }; +}; +exports.MaybeDefaultY = MaybeDefaultY; +exports.MaybeDefaultY.props = {}; +//# sourceMappingURL=maybeDefaultY.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815845, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeTooltip = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("../utils/helper"); +/** + * Infer tooltip channel from specified channel. + */ +const MaybeTooltip = (options) => { + const { channel } = options; + return (I, mark) => { + const { encode, tooltip } = mark; + if ((0, helper_1.isUnset)(tooltip)) + return [I, mark]; + const { items = [] } = tooltip; + if (!items || items.length > 0) + return [I, mark]; + const channels = Array.isArray(channel) ? channel : [channel]; + const newItems = channels.flatMap((channel) => Object.keys(encode) + .filter((key) => key.startsWith(channel)) + .map((key) => { + const { field, value, inferred = false, aggregate } = encode[key]; + if (inferred) + return null; + // Do not show inferred column. + if (aggregate && value) + return { channel: key }; + if (field) + return { field }; + if (value) + return { channel: key }; + return null; + }) + .filter((d) => d !== null)); + return [I, (0, util_1.deepMix)({}, mark, { tooltip: { items: newItems } })]; + }; +}; +exports.MaybeTooltip = MaybeTooltip; +exports.MaybeTooltip.props = {}; +//# sourceMappingURL=maybeTooltip.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815846, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeZeroPadding = void 0; +const util_1 = require("@antv/util"); +/** + * Set padding of x and y scale to zero. + */ +const MaybeZeroPadding = () => { + return (I, mark) => { + return [ + I, + (0, util_1.deepMix)({ scale: { x: { padding: 0 }, y: { padding: 0 } } }, mark), + ]; + }; +}; +exports.MaybeZeroPadding = MaybeZeroPadding; +exports.MaybeZeroPadding.props = {}; +//# sourceMappingURL=maybeZeroPadding.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815847, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeVisualPosition = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +/** + * Set visual position with style.x and style.y. + * The priority of style.x, style.y is higher than data. + */ +const MaybeVisualPosition = () => { + return (I, mark) => { + const { data, style = {} } = mark, restMark = __rest(mark, ["data", "style"]); + const { x: x0, y: y0 } = style, rest = __rest(style, ["x", "y"]); + if (x0 == undefined || y0 == undefined) + return [I, mark]; + const x = x0 || 0; + const y = y0 || 0; + return [ + [0], + (0, util_1.deepMix)({}, restMark, { + data: [0], + cartesian: true, + encode: { + x: (0, helper_1.column)([x]), + y: (0, helper_1.column)([y]), + }, + scale: { + x: { type: 'identity', independent: true, guide: null }, + y: { type: 'identity', independent: true, guide: null }, // hide axis + }, + style: rest, + }), + ]; + }; +}; +exports.MaybeVisualPosition = MaybeVisualPosition; +exports.MaybeVisualPosition.props = {}; +//# sourceMappingURL=maybeVisualPosition.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815848, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeFunctionAttribute = void 0; +const util_1 = require("@antv/util"); +/** + * Mark functional attribute constant. + */ +const MaybeFunctionAttribute = () => { + return (I, mark) => { + const { style = {} } = mark; + return [ + I, + (0, util_1.deepMix)({}, mark, { + style: Object.assign(Object.assign({}, style), Object.fromEntries(Object.entries(style) + .filter(([, v]) => typeof v === 'function') + .map(([k, v]) => [k, () => v]))), + }), + ]; + }; +}; +exports.MaybeFunctionAttribute = MaybeFunctionAttribute; +exports.MaybeFunctionAttribute.props = {}; +//# sourceMappingURL=maybeFunctionAttribute.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815849, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeTuple = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +/** + * Add 3 constant encode for size channel. + * This is useful for point geometry. + */ +const MaybeTuple = () => { + return (I, mark) => { + const { data } = mark; + if (!Array.isArray(data) || data.some(helper_1.isObject)) + return [I, mark]; + const position = Array.isArray(data[0]) ? data : [data]; + const X = position.map((d) => d[0]); + const Y = position.map((d) => d[1]); + return [I, (0, util_1.deepMix)({}, mark, { encode: { x: (0, helper_1.column)(X), y: (0, helper_1.column)(Y) } })]; + }; +}; +exports.MaybeTuple = MaybeTuple; +exports.MaybeTuple.props = {}; +//# sourceMappingURL=maybeTuple.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815850, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MaybeGradient = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +/** + * Add 3 constant encode for size channel. + * This is useful for point geometry. + */ +const MaybeGradient = () => { + return (I, mark) => { + const { style = {}, encode } = mark; + const { series } = encode; + const { gradient } = style; + if (!gradient || series) + return [I, mark]; + return [ + I, + (0, util_1.deepMix)({}, mark, { + encode: { + series: (0, helper_1.visualColumn)((0, helper_1.constant)(I, undefined)), + }, + }), + ]; + }; +}; +exports.MaybeGradient = MaybeGradient; +exports.MaybeGradient.props = {}; +//# sourceMappingURL=maybeGradient.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815851, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DodgeX = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +const order_1 = require("./utils/order"); +/** + * The dodge group marks into series by color or series channel, + * and then produce new series channel for each series by specified order, + * say to form horizontal "columns" by specified channels. + */ +const DodgeX = (options = {}) => { + const { groupBy = 'x', reverse = false, orderBy, padding } = options, rest = __rest(options, ["groupBy", "reverse", "orderBy", "padding"]); + return (I, mark) => { + const { data, encode, scale } = mark; + const { series: scaleSeries } = scale; + const [Y] = (0, helper_1.columnOf)(encode, 'y'); + const [S] = (0, helper_1.maybeColumnOf)(encode, 'series', 'color'); + const domainSeries = (0, order_1.domainOf)(S, scaleSeries); + const newMark = (0, util_1.deepMix)({}, mark, { + scale: { + series: { + domain: domainSeries, + paddingInner: padding, + }, + }, + }); + // Create groups and apply specified order for each group. + const groups = (0, order_1.createGroups)(groupBy, I, mark); + const createComparator = (0, order_1.normalizeComparator)(orderBy); + if (!createComparator) { + return [I, (0, util_1.deepMix)(newMark, { encode: { series: (0, helper_1.column)(S) } })]; + } + // Sort and Update series for each mark related to series domain. + const comparator = createComparator(data, Y, S); + if (comparator) + (0, order_1.applyOrder)(groups, comparator); + const newS = new Array(I.length); + for (const G of groups) { + if (reverse) + G.reverse(); + for (let i = 0; i < G.length; i++) { + newS[G[i]] = domainSeries[i]; + } + } + return [ + I, + (0, util_1.deepMix)(newMark, { + encode: { + series: (0, helper_1.column)(orderBy ? newS : S), + }, + }), + ]; + }; +}; +exports.DodgeX = DodgeX; +exports.DodgeX.props = {}; +//# sourceMappingURL=dodgeX.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825,"./utils/order":1751263815828}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815852, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.StackEnter = void 0; +const util_1 = require("@antv/util"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const helper_1 = require("./utils/helper"); +/** + * Group marks by channels into groups and stacking their enterDelay + * to make marks show up groups by groups. + * It will update enterDelay channel for each mark by its enterDuration and group. + * @todo Support orderBy. + * @todo Sort among groups(e.g. reverse). + * @todo Stack enter in groups rather than between groups? + * @todo Auto inter this statistic for scaleInY animation in stacked interval? + * @todo All the groups shared the enterDuration? + */ +const StackEnter = (options) => { + const { groupBy = ['x'], reducer = (I, V) => V[I[0]], orderBy = null, reverse = false, duration, } = options; + return (I, mark) => { + const { encode } = mark; + // Extract group information by each specified channel, + // and skip if all values of channels are empty. + const by = Array.isArray(groupBy) ? groupBy : [groupBy]; + const groupEntries = by.map((k) => [k, (0, helper_1.columnOf)(encode, k)[0]]); + if (groupEntries.length === 0) + return [I, mark]; + // Nest group index and flatten them in right order among timeline. + // [[1, 2, 3, 4, 5, 6]] -> + // [[1, 2, 3], [4, 5, 6]] -> + // [[1], [2], [3], [4], [5], [6]] + let groups = [I]; + for (const [, V] of groupEntries) { + const newGroups = []; + for (const I of groups) { + const G = Array.from((0, d3_array_1.group)(I, (i) => V[i]).values()); + // @todo sort by x. + newGroups.push(...G); + } + groups = newGroups; + } + // const {color} = encode; + if (orderBy) { + const [V] = (0, helper_1.columnOf)(encode, orderBy); + if (V) + groups.sort((I, J) => reducer(I, V) - reducer(J, V)); + if (reverse) + groups.reverse(); + } + // Stack delay for each group. + const t = (duration || 3000) / groups.length; + const [ED] = duration + ? [(0, helper_1.constant)(I, t)] // If specified duration, generate enter duration for each. + : (0, helper_1.maybeColumnOf)(encode, 'enterDuration', (0, helper_1.constant)(I, t)); + const [EDL] = (0, helper_1.maybeColumnOf)(encode, 'enterDelay', (0, helper_1.constant)(I, 0)); + const newEnterDelay = new Array(I.length); + for (let i = 0, pd = 0; i < groups.length; i++) { + const I = groups[i]; + const maxDuration = (0, d3_array_1.max)(I, (i) => +ED[i]); + for (const j of I) + newEnterDelay[j] = +EDL[j] + pd; + pd += maxDuration; + } + return [ + I, + (0, util_1.deepMix)({}, mark, { + encode: { + enterDuration: (0, helper_1.visualColumn)(ED), + enterDelay: (0, helper_1.visualColumn)(newEnterDelay), + }, + }), + ]; + }; +}; +exports.StackEnter = StackEnter; +exports.StackEnter.props = {}; +//# sourceMappingURL=stackEnter.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815853, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.NormalizeY = void 0; +const util_1 = require("@antv/util"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const helper_1 = require("../utils/helper"); +const helper_2 = require("./utils/helper"); +const order_1 = require("./utils/order"); +function normalizeBasis(basis) { + if (typeof basis === 'function') + return basis; + const registry = { + min: (I, Y) => (0, d3_array_1.min)(I, (i) => Y[+i]), + max: (I, Y) => (0, d3_array_1.max)(I, (i) => Y[+i]), + first: (I, Y) => Y[I[0]], + last: (I, Y) => Y[I[I.length - 1]], + mean: (I, Y) => (0, d3_array_1.mean)(I, (i) => Y[+i]), + median: (I, Y) => (0, d3_array_1.median)(I, (i) => Y[+i]), + sum: (I, Y) => (0, d3_array_1.sum)(I, (i) => Y[+i]), + deviation: (I, Y) => (0, d3_array_1.deviation)(I, (i) => Y[+i]), + }; + return registry[basis] || d3_array_1.max; +} +/** + * Group marks into series by specified channels, and then transform + * each series's value, say to transform them relative to some basis + * to apply a moving average. + */ +const NormalizeY = (options = {}) => { + const { groupBy = 'x', basis = 'max' } = options; + return (I, mark) => { + const { encode, tooltip } = mark; + const { x } = encode, rest = __rest(encode, ["x"]); + // Extract and create new channels starts with y, such as y, y1. + const Yn = Object.entries(rest) + .filter(([k]) => k.startsWith('y')) + .map(([k]) => [k, (0, helper_2.columnOf)(encode, k)[0]]); + const [, Y] = Yn.find(([k]) => k === 'y'); + const newYn = Yn.map(([k]) => [k, new Array(I.length)]); + // Group marks into series by specified keys. + const groups = (0, order_1.createGroups)(groupBy, I, mark); + // Transform y channels for each group based on basis. + const basisFunction = normalizeBasis(basis); + for (const I of groups) { + // Compute basis only base on y. + const basisValue = basisFunction(I, Y); + for (const i of I) { + for (let j = 0; j < Yn.length; j++) { + const [, V] = Yn[j]; + const [, newV] = newYn[j]; + newV[i] = +V[i] / basisValue; + } + } + } + const specifiedTooltip = (0, helper_1.isUnset)(tooltip) || ((tooltip === null || tooltip === void 0 ? void 0 : tooltip.items) && (tooltip === null || tooltip === void 0 ? void 0 : tooltip.items.length) !== 0); + return [ + I, + (0, util_1.deepMix)({}, mark, Object.assign({ encode: Object.fromEntries(newYn.map(([k, v]) => [k, (0, helper_2.column)(v, (0, helper_2.columnOf)(encode, k)[1])])) }, (!specifiedTooltip && + encode.y0 && { + tooltip: { items: [{ channel: 'y0' }] }, + }))), + ]; + }; +}; +exports.NormalizeY = NormalizeY; +exports.NormalizeY.props = {}; +//# sourceMappingURL=normalizeY.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"./utils/helper":1751263815825,"./utils/order":1751263815828}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815854, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Jitter = exports.interpolate = exports.rangeOf = void 0; +const scale_1 = require("@antv/scale"); +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +const order_1 = require("./utils/order"); +function rangeOf(value, scaleOptions, padding) { + if (value === null) + return [-0.5, 0.5]; + const domain = (0, order_1.domainOf)(value, scaleOptions); + const scale = new scale_1.Band({ domain, range: [0, 1], padding }); + const step = scale.getBandWidth(); + return [-step / 2, step / 2]; +} +exports.rangeOf = rangeOf; +function interpolate(t, a, b) { + return a * (1 - t) + b * t; +} +exports.interpolate = interpolate; +/** + * The jitter transform produce dx and dy channels for marks (especially for point) + * with ordinal x and y dimension, say to make them jitter in their own space. + */ +const Jitter = (options = {}) => { + const { padding = 0, paddingX = padding, paddingY = padding, random = Math.random, } = options; + return (I, mark) => { + const { encode, scale } = mark; + const { x: scaleX, y: scaleY } = scale; + const [X] = (0, helper_1.columnOf)(encode, 'x'); + const [Y] = (0, helper_1.columnOf)(encode, 'y'); + const rangeX = rangeOf(X, scaleX, paddingX); + const rangeY = rangeOf(Y, scaleY, paddingY); + const DY = I.map(() => interpolate(random(), ...rangeY)); + const DX = I.map(() => interpolate(random(), ...rangeX)); + return [ + I, + (0, util_1.deepMix)({ + scale: { + x: { padding: 0.5 }, + y: { padding: 0.5 }, + }, + }, mark, { + encode: { dy: (0, helper_1.column)(DY), dx: (0, helper_1.column)(DX) }, + }), + ]; + }; +}; +exports.Jitter = Jitter; +exports.Jitter.props = {}; +//# sourceMappingURL=jitter.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825,"./utils/order":1751263815828}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815855, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JitterX = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +const jitter_1 = require("./jitter"); +/** + * The JitterX transform produce dy channels for marks (especially for point) + * with ordinal x and y dimension, say to make them jitter in their own space. + */ +const JitterX = (options = {}) => { + const { padding = 0, random = Math.random } = options; + return (I, mark) => { + const { encode, scale } = mark; + const { x: scaleX } = scale; + const [X] = (0, helper_1.columnOf)(encode, 'x'); + const rangeX = (0, jitter_1.rangeOf)(X, scaleX, padding); + const DX = I.map(() => (0, jitter_1.interpolate)(random(), ...rangeX)); + return [ + I, + (0, util_1.deepMix)({ scale: { x: { padding: 0.5 } } }, mark, { + encode: { dx: (0, helper_1.column)(DX) }, + }), + ]; + }; +}; +exports.JitterX = JitterX; +exports.JitterX.props = {}; +//# sourceMappingURL=jitterX.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825,"./jitter":1751263815854}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815856, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JitterY = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +const jitter_1 = require("./jitter"); +/** + * The JitterY transform produce dy channels for marks (especially for point) + * with ordinal x and y dimension, say to make them jitter in their own space. + */ +const JitterY = (options = {}) => { + const { padding = 0, random = Math.random } = options; + return (I, mark) => { + const { encode, scale } = mark; + const { y: scaleY } = scale; + const [Y] = (0, helper_1.columnOf)(encode, 'y'); + const rangeY = (0, jitter_1.rangeOf)(Y, scaleY, padding); + const DY = I.map(() => (0, jitter_1.interpolate)(random(), ...rangeY)); + return [ + I, + (0, util_1.deepMix)({ scale: { y: { padding: 0.5 } } }, mark, { + encode: { dy: (0, helper_1.column)(DY) }, + }), + ]; + }; +}; +exports.JitterY = JitterY; +exports.JitterY.props = {}; +//# sourceMappingURL=jitterY.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825,"./jitter":1751263815854}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815857, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SymmetryY = void 0; +const util_1 = require("@antv/util"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const helper_1 = require("./utils/helper"); +const order_1 = require("./utils/order"); +/** + * The SymmetryY transform apply offset for y channels, say to transform + * them to be symmetry. + */ +const SymmetryY = (options = {}) => { + const { groupBy = 'x' } = options; + return (I, mark) => { + const { encode } = mark; + const { x } = encode, rest = __rest(encode, ["x"]); + // Extract and create new channels starts with y, such as y, y1. + const Yn = Object.entries(rest) + .filter(([k]) => k.startsWith('y')) + .map(([k]) => [k, (0, helper_1.columnOf)(encode, k)[0]]); + const newYn = Yn.map(([k]) => [k, new Array(I.length)]); + // Group marks into series by specified keys. + const groups = (0, order_1.createGroups)(groupBy, I, mark); + const MY = new Array(groups.length); + for (let i = 0; i < groups.length; i++) { + const I = groups[i]; + const Y = I.flatMap((i) => Yn.map(([, V]) => +V[i])); + const [minY, maxY] = (0, d3_array_1.extent)(Y); + MY[i] = (minY + maxY) / 2; + } + const maxMiddleY = Math.max(...MY); + for (let m = 0; m < groups.length; m++) { + const offset = maxMiddleY - MY[m]; + const I = groups[m]; + for (const i of I) { + for (let j = 0; j < Yn.length; j++) { + const [, V] = Yn[j]; + const [, newV] = newYn[j]; + newV[i] = +V[i] + offset; + } + } + } + return [ + I, + (0, util_1.deepMix)({}, mark, { + encode: Object.fromEntries(newYn.map(([k, v]) => [k, (0, helper_1.column)(v, (0, helper_1.columnOf)(encode, k)[1])])), + }), + ]; + }; +}; +exports.SymmetryY = SymmetryY; +exports.SymmetryY.props = {}; +//# sourceMappingURL=symmetryY.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825,"./utils/order":1751263815828}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815858, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DiffY = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./utils/helper"); +const order_1 = require("./utils/order"); +/** + * The DiffY transform apply offset for y0 channels. + * Keep y unchanged, set y1 = max(otherY), if y1 > y, remove the data. + */ +const DiffY = (options = {}) => { + const { groupBy = 'x' } = options; + return (I, mark) => { + const { encode } = mark; + const [Y] = (0, helper_1.columnOf)(encode, 'y'); + const [_, fy1] = (0, helper_1.columnOf)(encode, 'y1'); + // Create groups and apply specified order for each group. + const groups = (0, order_1.createGroups)(groupBy, I, mark); + // Only adjust Y1 channel. + const newY1 = new Array(I.length); + for (const G of groups) { + const YG = G.map((i) => +Y[i]); + // Process each series. + for (let idx = 0; idx < G.length; idx++) { + const i = G[idx]; + // Get the max Y of current group with current Y exclude. + const max = Math.max(...YG.filter((_, _i) => _i !== idx)); + // Diff Y value. + newY1[i] = +Y[i] > max ? max : Y[i]; + } + } + return [ + I, + (0, util_1.deepMix)({}, mark, { + encode: { + y1: (0, helper_1.column)(newY1, fy1), + }, + }), + ]; + }; +}; +exports.DiffY = DiffY; +exports.DiffY.props = {}; +//# sourceMappingURL=diffY.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825,"./utils/order":1751263815828}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815859, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Select = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +const helper_1 = require("./utils/helper"); +const order_1 = require("./utils/order"); +function first(I, V) { + return [I[0]]; +} +function last(I, V) { + const i = I.length - 1; + return [I[i]]; +} +function max(I, V) { + const i = (0, d3_array_1.maxIndex)(I, (i) => V[i]); + return [I[i]]; +} +function min(I, V) { + const i = (0, d3_array_1.minIndex)(I, (i) => V[i]); + return [I[i]]; +} +function normalizeSelector(selector) { + if (typeof selector === 'function') + return selector; + const registry = { first, last, max, min }; + return registry[selector] || first; +} +/** + * The select transform groups marks with specified channels, and + * filter index by specified selector for each series, say to + * pull a single or multiple values out of each series. + */ +const Select = (options = {}) => { + const { groupBy = 'series', channel, selector } = options; + return (I, mark) => { + const { encode } = mark; + const groups = (0, order_1.createGroups)(groupBy, I, mark); + const [V] = (0, helper_1.columnOf)(encode, channel); + const selectFunction = normalizeSelector(selector); + return [groups.flatMap((GI) => selectFunction(GI, V)), mark]; + }; +}; +exports.Select = Select; +exports.Select.props = {}; +//# sourceMappingURL=select.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825,"./utils/order":1751263815828}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815860, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SelectX = void 0; +const select_1 = require("./select"); +/** + * The selectX transform filter index by y channel. + */ +const SelectX = (options = {}) => { + const { selector } = options, rest = __rest(options, ["selector"]); + return (0, select_1.Select)(Object.assign({ channel: 'x', selector }, rest)); +}; +exports.SelectX = SelectX; +exports.SelectX.props = {}; +//# sourceMappingURL=selectX.js.map +}, function(modId) { var map = {"./select":1751263815859}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815861, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SelectY = void 0; +const select_1 = require("./select"); +/** + * The selectY transform filter index by y channel. + */ +const SelectY = (options = {}) => { + const { selector } = options, rest = __rest(options, ["selector"]); + return (0, select_1.Select)(Object.assign({ channel: 'y', selector }, rest)); +}; +exports.SelectY = SelectY; +exports.SelectY.props = {}; +//# sourceMappingURL=selectY.js.map +}, function(modId) { var map = {"./select":1751263815859}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815862, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GroupX = void 0; +const group_1 = require("./group"); +/** + * The GroupX transform group data by x channel, and aggregate. + */ +const GroupX = (options = {}) => { + return (0, group_1.Group)(Object.assign(Object.assign({}, options), { channels: ['x', 'color', 'series'] })); +}; +exports.GroupX = GroupX; +exports.GroupX.props = {}; +//# sourceMappingURL=groupX.js.map +}, function(modId) { var map = {"./group":1751263815863}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815863, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Group = void 0; +const order_1 = require("./utils/order"); +const groupN_1 = require("./groupN"); +/** + * The Group transform group data by x and y channels, and aggregate. + */ +const Group = (options = {}) => { + const { channels = ['x', 'y'] } = options, rest = __rest(options, ["channels"]); + const groupBy = (I, mark) => (0, order_1.createGroups)(channels, I, mark); + return (0, groupN_1.GroupN)(Object.assign(Object.assign({}, rest), { groupBy })); +}; +exports.Group = Group; +exports.Group.props = {}; +//# sourceMappingURL=group.js.map +}, function(modId) { var map = {"./utils/order":1751263815828,"./groupN":1751263815864}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815864, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GroupN = void 0; +const util_1 = require("@antv/util"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const array_1 = require("../utils/array"); +const helper_1 = require("./utils/helper"); +function builtinFormatter(summary) { + return (d) => (d === null ? summary : `${summary} of ${d}`); +} +function normalizeReducer(reducer) { + if (typeof reducer === 'function') + return [reducer, null]; + const registry = { mean, max, count, first, last, sum, min, median }; + const reducerFunction = registry[reducer]; + if (!reducerFunction) + throw new Error(`Unknown reducer: ${reducer}.`); + return reducerFunction(); +} +function mean() { + const reducer = (I, V) => (0, d3_array_1.mean)(I, (i) => +V[i]); + const formatter = builtinFormatter('mean'); + return [reducer, formatter]; +} +function median() { + const reducer = (I, V) => (0, d3_array_1.median)(I, (i) => +V[i]); + const formatter = builtinFormatter('median'); + return [reducer, formatter]; +} +function max() { + const reducer = (I, V) => (0, d3_array_1.max)(I, (i) => +V[i]); + const formatter = builtinFormatter('max'); + return [reducer, formatter]; +} +function min() { + const reducer = (I, V) => (0, d3_array_1.min)(I, (i) => +V[i]); + const formatter = builtinFormatter('min'); + return [reducer, formatter]; +} +function count() { + const reducer = (I, V) => I.length; + const formatter = builtinFormatter('count'); + return [reducer, formatter]; +} +function sum() { + const reducer = (I, V) => (0, d3_array_1.sum)(I, (i) => +V[i]); + const formatter = builtinFormatter('sum'); + return [reducer, formatter]; +} +function first() { + const reducer = (I, V) => V[I[0]]; + const formatter = builtinFormatter('first'); + return [reducer, formatter]; +} +function last() { + const reducer = (I, V) => V[I[I.length - 1]]; + const formatter = builtinFormatter('last'); + return [reducer, formatter]; +} +/** + * The Group transform group data by x and y channels, and aggregate. + */ +const GroupN = (options = {}) => { + const { groupBy } = options, rest = __rest(options, ["groupBy"]); + return (I, mark) => { + const { data, encode } = mark; + const groups = groupBy(I, mark); + if (!groups) + return [I, mark]; + // Extract field from from channel + // x1 from x, y1 from y, etc,. + const maybeFrom = (field, reducer) => { + if (field) + return field; + const { from } = reducer; + if (!from) + return field; + const [, field1] = (0, helper_1.columnOf)(encode, from); + return field1; + }; + const outputs = Object.entries(rest).map(([channel, reducer]) => { + const [reducerFunction, formatter] = normalizeReducer(reducer); + const [V, field] = (0, helper_1.columnOf)(encode, channel); + const field1 = maybeFrom(field, reducer); + const RV = groups.map((I) => reducerFunction(I, V !== null && V !== void 0 ? V : data)); + return [ + channel, + Object.assign(Object.assign({}, (0, helper_1.nonConstantColumn)(RV, (formatter === null || formatter === void 0 ? void 0 : formatter(field1)) || field1)), { aggregate: true }), + ]; + }); + const reducedColumns = Object.keys(encode).map((key) => { + const [V, fv] = (0, helper_1.columnOf)(encode, key); + const GV = groups.map((I) => V[I[0]]); + return [key, (0, helper_1.column)(GV, fv)]; + }); + const GD = groups.map((I) => data[I[0]]); + const GI = (0, array_1.indexOf)(groups); + return [ + GI, + (0, util_1.deepMix)({}, mark, { + data: GD, + encode: Object.fromEntries([...reducedColumns, ...outputs]), + }), + ]; + }; +}; +exports.GroupN = GroupN; +exports.GroupN.props = {}; +//# sourceMappingURL=groupN.js.map +}, function(modId) { var map = {"../utils/array":1751263815830,"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815865, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GroupY = void 0; +const group_1 = require("./group"); +/** + * The GroupY transform group data by x channel, and aggregate. + */ +const GroupY = (options = {}) => { + return (0, group_1.Group)(Object.assign(Object.assign({}, options), { channels: ['y', 'color', 'series'] })); +}; +exports.GroupY = GroupY; +exports.GroupY.props = {}; +//# sourceMappingURL=groupY.js.map +}, function(modId) { var map = {"./group":1751263815863}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815866, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GroupColor = void 0; +const group_1 = require("./group"); +/** + * The GroupColor transform group data by x channel, and aggregate. + */ +const GroupColor = (options = {}) => { + return (0, group_1.Group)(Object.assign(Object.assign({}, options), { channels: ['color'] })); +}; +exports.GroupColor = GroupColor; +exports.GroupColor.props = {}; +//# sourceMappingURL=groupColor.js.map +}, function(modId) { var map = {"./group":1751263815863}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815867, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SortX = void 0; +const sort_1 = require("./sort"); +/** + * Sort domain of x scale of mark groups by groups. + */ +const SortX = (options = {}) => { + return (0, sort_1.Sort)(Object.assign(Object.assign({}, options), { channel: 'x' })); +}; +exports.SortX = SortX; +exports.SortX.props = {}; +//# sourceMappingURL=sortX.js.map +}, function(modId) { var map = {"./sort":1751263815868}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815868, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Sort = void 0; +const util_1 = require("@antv/util"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const helper_1 = require("./utils/helper"); +function createReducer(channel, options, encode) { + const { by = channel, reducer = 'max' } = options; + const [V] = (0, helper_1.columnOf)(encode, by); + if (typeof reducer === 'function') + return (GI) => reducer(GI, V); + if (reducer === 'max') + return (GI) => (0, d3_array_1.max)(GI, (i) => +V[i]); + if (reducer === 'min') + return (GI) => (0, d3_array_1.min)(GI, (i) => +V[i]); + if (reducer === 'sum') + return (GI) => (0, d3_array_1.sum)(GI, (i) => +V[i]); + if (reducer === 'median') + return (GI) => (0, d3_array_1.median)(GI, (i) => +V[i]); + if (reducer === 'mean') + return (GI) => (0, d3_array_1.mean)(GI, (i) => +V[i]); + if (reducer === 'first') + return (GI) => V[GI[0]]; + if (reducer === 'last') + return (GI) => V[GI[GI.length - 1]]; + throw new Error(`Unknown reducer: ${reducer}`); +} +// If domain is specified, only sort data in the domain. +function filterIndex(I, values, specifiedDomain) { + if (!Array.isArray(specifiedDomain)) + return I; + const domain = new Set(specifiedDomain); + return I.filter((i) => domain.has(values[i])); +} +/** + * Sort marks groups by groups. + */ +const Sort = (options = {}) => { + return (I, mark) => { + const { reverse, slice, channel, by, ordinal = true, reducer } = options; + const { encode, scale = {} } = mark; + const domain = scale[channel].domain; + const [V] = (0, helper_1.columnOf)(encode, by !== null && by !== void 0 ? by : channel); + const [T] = (0, helper_1.columnOf)(encode, channel); + const normalizeReducer = createReducer(channel, { by, reducer }, encode); + const SI = filterIndex(I, T, domain); + const sortedDomain = (0, d3_array_1.groupSort)(SI, normalizeReducer, (i) => T[i]); + // when ordinal is true, do not change the index of the data. + const sortedI = !ordinal ? (0, d3_array_1.sort)(I, (i) => V[i]) : I; + if (reverse) { + !ordinal && sortedI.reverse(); + sortedDomain.reverse(); + } + const s = typeof slice === 'number' ? [0, slice] : slice; + const slicedDomain = slice ? sortedDomain.slice(...s) : sortedDomain; + return [ + sortedI, + (0, util_1.deepMix)(mark, { scale: { [channel]: { domain: slicedDomain } } }), + ]; + }; +}; +exports.Sort = Sort; +exports.Sort.props = {}; +//# sourceMappingURL=sort.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815869, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SortColor = void 0; +const sort_1 = require("./sort"); +/** + * Sort domain of x scale of mark groups by groups. + */ +const SortColor = (options = {}) => { + return (0, sort_1.Sort)(Object.assign(Object.assign({}, options), { channel: 'color' })); +}; +exports.SortColor = SortColor; +exports.SortColor.props = {}; +//# sourceMappingURL=sortColor.js.map +}, function(modId) { var map = {"./sort":1751263815868}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815870, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SortY = void 0; +const sort_1 = require("./sort"); +/** + * Sort domain of x scale of mark groups by groups. + */ +const SortY = (options = {}) => { + return (0, sort_1.Sort)(Object.assign(Object.assign({}, options), { channel: 'y' })); +}; +exports.SortY = SortY; +exports.SortY.props = {}; +//# sourceMappingURL=sortY.js.map +}, function(modId) { var map = {"./sort":1751263815868}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815871, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FlexX = void 0; +const util_1 = require("@antv/util"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const helper_1 = require("./utils/helper"); +function valueOf(data, field) { + if (typeof field === 'string') + return data.map((d) => d[field]); + return data.map(field); +} +function createReducer(reducer, V) { + if (typeof reducer === 'function') + return (GI) => reducer(GI, V); + if (reducer === 'sum') + return (GI) => (0, d3_array_1.sum)(GI, (i) => +V[i]); + throw new Error(`Unknown reducer: ${reducer}`); +} +/** + * Produce flex options from data for x scale. + */ +const FlexX = (options = {}) => { + const { field, channel = 'y', reducer = 'sum' } = options; + return (I, mark) => { + const { data, encode } = mark; + const [x] = (0, helper_1.columnOf)(encode, 'x'); + const V = field ? valueOf(data, field) : (0, helper_1.columnOf)(encode, channel)[0]; + const reducerFunction = createReducer(reducer, V); + const flex = (0, d3_array_1.rollups)(I, reducerFunction, (i) => x[i]).map((d) => d[1]); + return [I, (0, util_1.deepMix)({}, mark, { scale: { x: { flex } } })]; + }; +}; +exports.FlexX = FlexX; +exports.FlexX.props = {}; +//# sourceMappingURL=flexX.js.map +}, function(modId) { var map = {"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815872, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Pack = void 0; +const util_1 = require("@antv/util"); +const vector_1 = require("../utils/vector"); +function pack(options) { + const { padding = 0, direction = 'col' } = options; + return (P, count, layout) => { + const pcount = P.length; + if (pcount === 0) + return []; + // col * row >= count + // row is close to col * aspect, so + // col * (col * aspect) >= count + const { innerWidth, innerHeight } = layout; + const aspect = innerHeight / innerWidth; + let col = Math.ceil(Math.sqrt(count / aspect)); + // Increase col to avoid total height of packed shape + // being large than height of bbox. + let size = innerWidth / col; + let row = Math.ceil(count / col); + let h0 = row * size; + while (h0 > innerHeight) { + col = col + 1; + size = innerWidth / col; + row = Math.ceil(count / col); + h0 = row * size; + } + // Some offset to increase the space usage. + const space = innerHeight - row * size; + const intervalY = row <= 1 ? 0 : space / (row - 1); + const [offsetX, offsetY] = row <= 1 + ? [ + (innerWidth - pcount * size) / (pcount - 1), + (innerHeight - size) / 2, + ] + : [0, 0]; + return P.map((points, m) => { + const [x, y, width, height] = (0, vector_1.calcBBox)(points); + const i = direction === 'col' ? m % col : Math.floor(m / row); + const j = direction === 'col' ? Math.floor(m / col) : m % row; + const newX = i * size; + const newY = (row - j - 1) * size + space; + const sx = (size - padding) / width; + const sy = (size - padding) / height; + // Translate the shape and mark to make sure the center of + // shape is overlap before and after scale transformation. + const tx = newX - x + offsetX * i + (1 / 2) * padding; + const ty = newY - y - intervalY * j - offsetY + (1 / 2) * padding; + return `translate(${tx}, ${ty}) scale(${sx}, ${sy})`; + }); + }; +} +/** + * Uniform pack to avid overlap. + * @todo Improve or change algorithm to increase space usage. + * @todo Take some special case into account. + */ +const Pack = (options) => { + return (I, mark) => { + return [I, (0, util_1.deepMix)({}, mark, { modifier: pack(options), axis: false })]; + }; +}; +exports.Pack = Pack; +exports.Pack.props = {}; +//# sourceMappingURL=pack.js.map +}, function(modId) { var map = {"../utils/vector":1751263815873}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815873, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.mid = exports.calcBBox = exports.angleBetween = exports.angleWithQuadrant = exports.angle = exports.dist = exports.add = exports.sub = void 0; +function sub([x1, y1], [x2, y2]) { + return [x1 - x2, y1 - y2]; +} +exports.sub = sub; +function add([x1, y1], [x2, y2]) { + return [x1 + x2, y1 + y2]; +} +exports.add = add; +function dist([x0, y0], [x1, y1]) { + return Math.sqrt(Math.pow((x0 - x1), 2) + Math.pow((y0 - y1), 2)); +} +exports.dist = dist; +/** + * Calculate angle of vector [x, y]. + */ +function angle([x, y]) { + return Math.atan2(y, x); +} +exports.angle = angle; +/** + * Calculate angle of [x, y], then + Math.PI / 2. + * Because of the difference between `Geometric coordinate system` and `Visualization coordinate system`. + * @returns + */ +function angleWithQuadrant([x, y]) { + return angle([x, y]) + Math.PI / 2; +} +exports.angleWithQuadrant = angleWithQuadrant; +function angleBetween(v0, v1) { + const a0 = angle(v0); + const a1 = angle(v1); + if (a0 < a1) + return a1 - a0; + return Math.PI * 2 - (a0 - a1); +} +exports.angleBetween = angleBetween; +function calcBBox(points) { + let minX = Infinity; + let maxX = -Infinity; + let minY = Infinity; + let maxY = -Infinity; + for (const [x, y] of points) { + minX = Math.min(x, minX); + maxX = Math.max(x, maxX); + minY = Math.min(y, minY); + maxY = Math.max(y, maxY); + } + const width = maxX - minX; + const height = maxY - minY; + return [minX, minY, width, height]; +} +exports.calcBBox = calcBBox; +/** + * Get the center of two points. + */ +function mid([x1, y1], [x2, y2]) { + return [(x1 + x2) / 2, (y1 + y2) / 2]; +} +exports.mid = mid; +//# sourceMappingURL=vector.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815874, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BinX = void 0; +const bin_1 = require("./bin"); +const BinX = (options = {}) => { + const { thresholds } = options; + return (0, bin_1.Bin)(Object.assign(Object.assign({}, options), { thresholdsX: thresholds, groupChannels: ['color'], binChannels: ['x'] })); +}; +exports.BinX = BinX; +exports.BinX.props = {}; +//# sourceMappingURL=binX.js.map +}, function(modId) { var map = {"./bin":1751263815875}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815875, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Bin = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +const helper_1 = require("../utils/helper"); +const groupN_1 = require("./groupN"); +const helper_2 = require("./utils/helper"); +const THRESHOLD = 'thresholds'; +/** + * @see https://github.com/observablehq/plot/blob/main/src/transforms/bin.js + */ +function thresholdAuto(values) { + const [min, max] = (0, d3_array_1.extent)(values); + return Math.min(200, (0, d3_array_1.thresholdScott)(values, min, max)); +} +/** + * The Bin aggregate data. + * @todo More threshold method. + * @todo Performance. + */ +const Bin = (options = {}) => { + const { groupChannels = ['color'], binChannels = ['x', 'y'] } = options, rest = __rest(options, ["groupChannels", "binChannels"]); + const channelIndexKey = {}; + // Group indexes and update channelIndexKey. + const groupBy = (I, mark) => { + const { encode } = mark; + const binValues = binChannels.map((channel) => { + const [V] = (0, helper_2.columnOf)(encode, channel); + return V; + }); + const thresholds = (0, helper_1.subObject)(rest, THRESHOLD); + const DI = I.filter((i) => binValues.every((V) => (0, helper_1.defined)(V[i]))); + // Group indexes by both discrete and quantitative channels. + const groupKeys = [ + // For discrete channels, use value as group key. + ...groupChannels + .map((d) => { + const [V] = (0, helper_2.columnOf)(encode, d); + return V; + }) + .filter(helper_1.defined) + .map((V) => (i) => V[i]), + // For quantitative channels, use extent of bin as group key. + ...binChannels.map((d, i) => { + const V = binValues[i]; + const t = thresholds[d] || thresholdAuto(V); + const bins = (0, d3_array_1.bin)() + .thresholds(t) + .value((i) => +V[i])(DI); + const indexKey = new Map(bins.flatMap((bin) => { + const { x0, x1 } = bin; + const key = `${x0},${x1}`; + return bin.map((i) => [i, key]); + })); + channelIndexKey[d] = indexKey; + return (i) => indexKey.get(i); + }), + ]; + // Group by indexes by channel keys. + const key = (i) => groupKeys.map((key) => key(i)).join('-'); + return Array.from((0, d3_array_1.group)(DI, key).values()); + }; + return (0, groupN_1.GroupN)(Object.assign(Object.assign(Object.assign({}, Object.fromEntries(Object.entries(rest).filter(([k]) => !k.startsWith(THRESHOLD)))), Object.fromEntries(binChannels.flatMap((channel) => { + const start = ([i]) => +channelIndexKey[channel].get(i).split(',')[0]; + const end = ([i]) => +channelIndexKey[channel].get(i).split(',')[1]; + end.from = channel; + return [ + [channel, start], + [`${channel}1`, end], + ]; + }))), { groupBy })); +}; +exports.Bin = Bin; +exports.Bin.props = {}; +//# sourceMappingURL=bin.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"./groupN":1751263815864,"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815876, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Sample = void 0; +// @ts-ignore medianIndex exist in d3-array@3.2.0, but @types/d3-array Expired. +const d3_array_1 = require("@antv/vendor/d3-array"); +const order_1 = require("./utils/order"); +const helper_1 = require("./utils/helper"); +const lttb_1 = require("./utils/lttb"); +function normalizeSample(strategy) { + if (typeof strategy === 'function') + return strategy; + if (strategy === 'lttb') + return lttb_1.lttb; + const strategies = { + first: (f) => [f[0]], + last: (f) => [f[f.length - 1]], + min: (f, X, Y) => [ + f[(0, d3_array_1.minIndex)(f, (i) => Y[i])], + ], + max: (f, X, Y) => [ + f[(0, d3_array_1.maxIndex)(f, (i) => Y[i])], + ], + median: (f, X, Y) => [ + f[(0, d3_array_1.medianIndex)(f, (i) => Y[i])], + ], + }; + const sampleFunction = strategies[strategy] || strategies.median; + return (I, X, Y, thresholds) => { + // Sepreate group to frames, then sample each frame. + // Keep more data as possible. + const frameSize = Math.max(1, Math.floor(I.length / thresholds)); + const frames = getFrames(I, frameSize); + return frames.flatMap((frame) => sampleFunction(frame, X, Y)); + }; +} +/** + * Split the array into frame with each frameSize. + */ +function getFrames(I, frameSize) { + const size = I.length; + const frames = []; + let i = 0; + while (i < size) { + frames.push(I.slice(i, (i += frameSize))); + } + return frames; +} +/** + * The sample transform groups marks with specified groupBy fields, and + * sample data for each group when data.length >= threshold(default = 2000). + */ +const Sample = (options = {}) => { + const { strategy = 'median', thresholds = 2000, groupBy = ['series', 'color'], } = options; + const sampleFunction = normalizeSample(strategy); + return (I, mark) => { + const { encode } = mark; + const groups = (0, order_1.createGroups)(groupBy, I, mark); + const [X] = (0, helper_1.columnOf)(encode, 'x'); + const [Y] = (0, helper_1.columnOf)(encode, 'y'); + return [ + groups.flatMap((g) => sampleFunction(g, X, Y, thresholds)), + mark, + ]; + }; +}; +exports.Sample = Sample; +exports.Sample.props = {}; +//# sourceMappingURL=sample.js.map +}, function(modId) { var map = {"./utils/order":1751263815828,"./utils/helper":1751263815825,"./utils/lttb":1751263815877}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815877, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.lttb = void 0; +/** + * Sample data with lttb(Largest-Triangle-Three-Buckets) algo (https://github.com/pingec/downsample-lttb). + * Return the sampled index array. + */ +function lttb(I, X, Y, thresholds) { + const length = I.length; + if (thresholds >= length || thresholds === 0) { + return I; + } + const x = (i) => X[I[i]] * 1; + const y = (i) => Y[I[i]] * 1; + const sampled = []; + // Bucket size. Leave room for start and end data points. + const every = (length - 2) / (thresholds - 2); + let a = 0; // Initially a is the first point in the triangle. + let maxArea; + let area; + let nextA; + sampled.push(a); // Always add the first point. + for (let i = 0; i < thresholds - 2; i++) { + // Calculate point average for next bucket (containing c). + let avgX = 0; + let avgY = 0; + let start = Math.floor((i + 1) * every) + 1; + let end = Math.floor((i + 2) * every) + 1; + end = Math.min(end, length); + const size = end - start; + for (; start < end; start++) { + avgX += x(start); + avgY += y(start); + } + avgX /= size; + avgY /= size; + // Get the range for this bucket. + let frameStart = Math.floor((i + 0) * every) + 1; + const frameEnd = Math.floor((i + 1) * every) + 1; + // Point a. + const pointA = [x(a), y(a)]; + maxArea = area = -1; + for (; frameStart < frameEnd; frameStart++) { + // Calculate triangle area over three buckets. + area = + Math.abs((pointA[0] - avgX) * (x(frameStart) - pointA[1]) - + (pointA[0] - y(frameStart)) * (avgY - pointA[0])) * 0.5; + if (area > maxArea) { + maxArea = area; + nextA = frameStart; // Next a is this b. + } + } + sampled.push(nextA); // Pick this point from the bucket. + a = nextA; // This a is the next a (chosen b). + } + sampled.push(length - 1); // Always add last. + return sampled.map((a) => I[a]); +} +exports.lttb = lttb; +//# sourceMappingURL=lttb.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815878, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Filter = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("../utils/helper"); +const helper_2 = require("./utils/helper"); +function normalizeValue(value) { + if (typeof value === 'object') + return [value.value, value.ordinal]; + else + return [value, true]; +} +function filterWhenNoElements(mark) { + var _a; + const { encode } = mark; + // keep y-axis + const noElementMark = Object.assign(Object.assign({}, mark), { encode: Object.assign(Object.assign({}, mark.encode), { y: Object.assign(Object.assign({}, mark.encode.y), { value: [] }) }) }); + const targetField = (_a = encode === null || encode === void 0 ? void 0 : encode.color) === null || _a === void 0 ? void 0 : _a.field; + if (!encode || !targetField) { + return noElementMark; + } + // 获取color的筛选源 + let filterObject; + for (const [key, v] of Object.entries(encode)) { + if ((key === 'x' || key === 'y') && v.field === targetField) { + filterObject = Object.assign(Object.assign({}, filterObject), { [key]: Object.assign(Object.assign({}, v), { value: [] }) }); + } + } + if (!filterObject) { + return noElementMark; + } + return Object.assign(Object.assign({}, mark), { encode: Object.assign(Object.assign({}, mark.encode), filterObject) }); +} +/** + * The Filter transform filter channels. + */ +const Filter = (options = {}) => { + return (I, mark) => { + const { encode, data } = mark; + const filters = Object.entries(options) + .map(([key, v]) => { + const [V] = (0, helper_2.columnOf)(encode, key); + // Skip empty channel. + if (!V) + return null; + const [value, ordinal = true] = normalizeValue(v); + if (typeof value === 'function') + return (i) => value(V[i]); + if (ordinal) { + const expectedValues = Array.isArray(value) ? value : [value]; + // Skip empty expected values. + if (expectedValues.length === 0) + return null; + return (i) => expectedValues.includes(V[i]); + } + else { + const [start, end] = value; + return (i) => V[i] >= start && V[i] <= end; + } + }) + .filter(helper_1.defined); + // Filter index and channels. + const totalFilter = (i) => filters.every((f) => f(i)); + const FI = I.filter(totalFilter); + const newIndex = FI.map((_, i) => i); + if (filters.length === 0) { + const targetMark = filterWhenNoElements(mark); + return [I, targetMark]; + } + const newEncodes = Object.entries(encode).map(([key, encode]) => { + return [ + key, + Object.assign(Object.assign({}, encode), { value: newIndex + .map((i) => encode.value[FI[i]]) + .filter((v) => v !== undefined) }), + ]; + }); + return [ + newIndex, + (0, util_1.deepMix)({}, mark, { + encode: Object.fromEntries(newEncodes), + // Filter data for tooltip item. + data: FI.map((i) => data[i]), + }), + ]; + }; +}; +exports.Filter = Filter; +exports.Filter.props = {}; +//# sourceMappingURL=filter.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"./utils/helper":1751263815825}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815879, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BoxShape = exports.PolygonRibbon = exports.PolygonShape = exports.ImageShape = exports.LinkArc = exports.LinkVHV = exports.LinkSmooth = exports.LinkShape = exports.AreaHV = exports.AreaVH = exports.AreaHVH = exports.AreaSmooth = exports.AreaShape = exports.TextTag = exports.TextBadge = exports.TextShape = exports.VectorShape = exports.PointCircle = exports.PointTriangleDown = exports.PointTriangle = exports.PointTick = exports.PointSquare = exports.PointShape = exports.PointPlus = exports.PointLine = exports.PointHyphen = exports.PointHexagon = exports.PointDiamond = exports.PointCross = exports.PointBowtie = exports.PointHollowCircle = exports.PointHollowTriangleDown = exports.PointHollowTriangle = exports.PointHollowSquare = exports.PointHollow = exports.PointHollowHexagon = exports.PointHollowDiamond = exports.PointHollowBowtie = exports.LineTrail = exports.LineHVH = exports.LineVH = exports.LineHV = exports.LineSmooth = exports.LineShape = exports.CellHollow = exports.CellShape = exports.IntervalPyramid = exports.IntervalFunnel = exports.IntervalHollow = exports.IntervalShape = void 0; +exports.GaugeRound = exports.LiquidShape = exports.ShapeShape = exports.RectHollow = exports.RectShape = exports.RangeShape = exports.HeatmapShape = exports.DensityShape = exports.PathHollow = exports.PathShape = exports.LabelShape = exports.ConnectorShape = exports.LineXY = exports.BoxViolin = void 0; +var rect_1 = require("./interval/rect"); +Object.defineProperty(exports, "IntervalShape", { enumerable: true, get: function () { return rect_1.Rect; } }); +var hollow_1 = require("./interval/hollow"); +Object.defineProperty(exports, "IntervalHollow", { enumerable: true, get: function () { return hollow_1.Hollow; } }); +var funnel_1 = require("./interval/funnel"); +Object.defineProperty(exports, "IntervalFunnel", { enumerable: true, get: function () { return funnel_1.Funnel; } }); +var pyramid_1 = require("./interval/pyramid"); +Object.defineProperty(exports, "IntervalPyramid", { enumerable: true, get: function () { return pyramid_1.Pyramid; } }); +var rect_2 = require("./interval/rect"); +Object.defineProperty(exports, "CellShape", { enumerable: true, get: function () { return rect_2.Rect; } }); +var hollow_2 = require("./interval/hollow"); +Object.defineProperty(exports, "CellHollow", { enumerable: true, get: function () { return hollow_2.Hollow; } }); +var line_1 = require("./line/line"); +Object.defineProperty(exports, "LineShape", { enumerable: true, get: function () { return line_1.Line; } }); +var smooth_1 = require("./line/smooth"); +Object.defineProperty(exports, "LineSmooth", { enumerable: true, get: function () { return smooth_1.Smooth; } }); +var hv_1 = require("./line/hv"); +Object.defineProperty(exports, "LineHV", { enumerable: true, get: function () { return hv_1.HV; } }); +var vh_1 = require("./line/vh"); +Object.defineProperty(exports, "LineVH", { enumerable: true, get: function () { return vh_1.VH; } }); +var hvh_1 = require("./line/hvh"); +Object.defineProperty(exports, "LineHVH", { enumerable: true, get: function () { return hvh_1.HVH; } }); +var trail_1 = require("./line/trail"); +Object.defineProperty(exports, "LineTrail", { enumerable: true, get: function () { return trail_1.Trail; } }); +var hollowBowtie_1 = require("./point/hollowBowtie"); +Object.defineProperty(exports, "PointHollowBowtie", { enumerable: true, get: function () { return hollowBowtie_1.HollowBowtie; } }); +var hollowDiamond_1 = require("./point/hollowDiamond"); +Object.defineProperty(exports, "PointHollowDiamond", { enumerable: true, get: function () { return hollowDiamond_1.HollowDiamond; } }); +var hollowHexagon_1 = require("./point/hollowHexagon"); +Object.defineProperty(exports, "PointHollowHexagon", { enumerable: true, get: function () { return hollowHexagon_1.HollowHexagon; } }); +var hollow_3 = require("./point/hollow"); +Object.defineProperty(exports, "PointHollow", { enumerable: true, get: function () { return hollow_3.HollowPoint; } }); +var hollowSquare_1 = require("./point/hollowSquare"); +Object.defineProperty(exports, "PointHollowSquare", { enumerable: true, get: function () { return hollowSquare_1.HollowSquare; } }); +var hollowTriangle_1 = require("./point/hollowTriangle"); +Object.defineProperty(exports, "PointHollowTriangle", { enumerable: true, get: function () { return hollowTriangle_1.HollowTriangle; } }); +var hollowTriangleDown_1 = require("./point/hollowTriangleDown"); +Object.defineProperty(exports, "PointHollowTriangleDown", { enumerable: true, get: function () { return hollowTriangleDown_1.HollowTriangleDown; } }); +var hollowCircle_1 = require("./point/hollowCircle"); +Object.defineProperty(exports, "PointHollowCircle", { enumerable: true, get: function () { return hollowCircle_1.HollowCircle; } }); +var bowtie_1 = require("./point/bowtie"); +Object.defineProperty(exports, "PointBowtie", { enumerable: true, get: function () { return bowtie_1.Bowtie; } }); +var cross_1 = require("./point/cross"); +Object.defineProperty(exports, "PointCross", { enumerable: true, get: function () { return cross_1.Cross; } }); +var diamond_1 = require("./point/diamond"); +Object.defineProperty(exports, "PointDiamond", { enumerable: true, get: function () { return diamond_1.Diamond; } }); +var hexagon_1 = require("./point/hexagon"); +Object.defineProperty(exports, "PointHexagon", { enumerable: true, get: function () { return hexagon_1.Hexagon; } }); +var hyphen_1 = require("./point/hyphen"); +Object.defineProperty(exports, "PointHyphen", { enumerable: true, get: function () { return hyphen_1.Hyphen; } }); +var line_2 = require("./point/line"); +Object.defineProperty(exports, "PointLine", { enumerable: true, get: function () { return line_2.Line; } }); +var plus_1 = require("./point/plus"); +Object.defineProperty(exports, "PointPlus", { enumerable: true, get: function () { return plus_1.Plus; } }); +var point_1 = require("./point/point"); +Object.defineProperty(exports, "PointShape", { enumerable: true, get: function () { return point_1.Point; } }); +var square_1 = require("./point/square"); +Object.defineProperty(exports, "PointSquare", { enumerable: true, get: function () { return square_1.Square; } }); +var tick_1 = require("./point/tick"); +Object.defineProperty(exports, "PointTick", { enumerable: true, get: function () { return tick_1.Tick; } }); +var triangle_1 = require("./point/triangle"); +Object.defineProperty(exports, "PointTriangle", { enumerable: true, get: function () { return triangle_1.Triangle; } }); +var triangleDown_1 = require("./point/triangleDown"); +Object.defineProperty(exports, "PointTriangleDown", { enumerable: true, get: function () { return triangleDown_1.TriangleDown; } }); +var circle_1 = require("./point/circle"); +Object.defineProperty(exports, "PointCircle", { enumerable: true, get: function () { return circle_1.Circle; } }); +var vector_1 = require("./vector/vector"); +Object.defineProperty(exports, "VectorShape", { enumerable: true, get: function () { return vector_1.Vector; } }); +var text_1 = require("./text/text"); +Object.defineProperty(exports, "TextShape", { enumerable: true, get: function () { return text_1.Text; } }); +var badge_1 = require("./text/badge"); +Object.defineProperty(exports, "TextBadge", { enumerable: true, get: function () { return badge_1.Badge; } }); +var tag_1 = require("./text/tag"); +Object.defineProperty(exports, "TextTag", { enumerable: true, get: function () { return tag_1.Tag; } }); +var area_1 = require("./area/area"); +Object.defineProperty(exports, "AreaShape", { enumerable: true, get: function () { return area_1.Area; } }); +var smooth_2 = require("./area/smooth"); +Object.defineProperty(exports, "AreaSmooth", { enumerable: true, get: function () { return smooth_2.Smooth; } }); +var hvh_2 = require("./area/hvh"); +Object.defineProperty(exports, "AreaHVH", { enumerable: true, get: function () { return hvh_2.HVH; } }); +var vh_2 = require("./area/vh"); +Object.defineProperty(exports, "AreaVH", { enumerable: true, get: function () { return vh_2.VH; } }); +var hv_2 = require("./area/hv"); +Object.defineProperty(exports, "AreaHV", { enumerable: true, get: function () { return hv_2.HV; } }); +var link_1 = require("./link/link"); +Object.defineProperty(exports, "LinkShape", { enumerable: true, get: function () { return link_1.Link; } }); +var smooth_3 = require("./link/smooth"); +Object.defineProperty(exports, "LinkSmooth", { enumerable: true, get: function () { return smooth_3.Smooth; } }); +var vhv_1 = require("./link/vhv"); +Object.defineProperty(exports, "LinkVHV", { enumerable: true, get: function () { return vhv_1.VHV; } }); +var arc_1 = require("./link/arc"); +Object.defineProperty(exports, "LinkArc", { enumerable: true, get: function () { return arc_1.Arc; } }); +var image_1 = require("./image/image"); +Object.defineProperty(exports, "ImageShape", { enumerable: true, get: function () { return image_1.Image; } }); +var polygon_1 = require("./polygon/polygon"); +Object.defineProperty(exports, "PolygonShape", { enumerable: true, get: function () { return polygon_1.Polygon; } }); +var ribbon_1 = require("./polygon/ribbon"); +Object.defineProperty(exports, "PolygonRibbon", { enumerable: true, get: function () { return ribbon_1.Ribbon; } }); +var box_1 = require("./box/box"); +Object.defineProperty(exports, "BoxShape", { enumerable: true, get: function () { return box_1.Box; } }); +var violin_1 = require("./box/violin"); +Object.defineProperty(exports, "BoxViolin", { enumerable: true, get: function () { return violin_1.Violin; } }); +var line_3 = require("./lineXY/line"); +Object.defineProperty(exports, "LineXY", { enumerable: true, get: function () { return line_3.Line; } }); +var connector_1 = require("./connector/connector"); +Object.defineProperty(exports, "ConnectorShape", { enumerable: true, get: function () { return connector_1.Connector; } }); +var label_1 = require("./label/label"); +Object.defineProperty(exports, "LabelShape", { enumerable: true, get: function () { return label_1.Label; } }); +var path_1 = require("./path/path"); +Object.defineProperty(exports, "PathShape", { enumerable: true, get: function () { return path_1.Path; } }); +var hollow_4 = require("./path/hollow"); +Object.defineProperty(exports, "PathHollow", { enumerable: true, get: function () { return hollow_4.Hollow; } }); +var density_1 = require("./density/density"); +Object.defineProperty(exports, "DensityShape", { enumerable: true, get: function () { return density_1.Density; } }); +var heatmap_1 = require("./heatmap/heatmap"); +Object.defineProperty(exports, "HeatmapShape", { enumerable: true, get: function () { return heatmap_1.Heatmap; } }); +var rect_3 = require("./interval/rect"); +Object.defineProperty(exports, "RangeShape", { enumerable: true, get: function () { return rect_3.Rect; } }); +var rect_4 = require("./interval/rect"); +Object.defineProperty(exports, "RectShape", { enumerable: true, get: function () { return rect_4.Rect; } }); +var hollow_5 = require("./interval/hollow"); +Object.defineProperty(exports, "RectHollow", { enumerable: true, get: function () { return hollow_5.Hollow; } }); +var shape_1 = require("./shape/shape"); +Object.defineProperty(exports, "ShapeShape", { enumerable: true, get: function () { return shape_1.Shape; } }); +var liquid_1 = require("./liquid/liquid"); +Object.defineProperty(exports, "LiquidShape", { enumerable: true, get: function () { return liquid_1.Liquid; } }); +var round_1 = require("./gauge/round"); +Object.defineProperty(exports, "GaugeRound", { enumerable: true, get: function () { return round_1.Round; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./interval/rect":1751263815880,"./interval/hollow":1751263815886,"./interval/funnel":1751263815887,"./interval/pyramid":1751263815888,"./line/line":1751263815889,"./line/smooth":1751263815892,"./line/hv":1751263815893,"./line/vh":1751263815894,"./line/hvh":1751263815895,"./line/trail":1751263815896,"./point/hollowBowtie":1751263815897,"./point/hollowDiamond":1751263815901,"./point/hollowHexagon":1751263815902,"./point/hollow":1751263815903,"./point/hollowSquare":1751263815904,"./point/hollowTriangle":1751263815905,"./point/hollowTriangleDown":1751263815906,"./point/hollowCircle":1751263815907,"./point/bowtie":1751263815909,"./point/cross":1751263815910,"./point/diamond":1751263815911,"./point/hexagon":1751263815912,"./point/hyphen":1751263815913,"./point/line":1751263815914,"./point/plus":1751263815915,"./point/point":1751263815916,"./point/square":1751263815917,"./point/tick":1751263815918,"./point/triangle":1751263815919,"./point/triangleDown":1751263815920,"./point/circle":1751263815908,"./vector/vector":1751263815921,"./text/text":1751263815922,"./text/badge":1751263815924,"./text/tag":1751263815925,"./area/area":1751263815926,"./area/smooth":1751263815928,"./area/hvh":1751263815929,"./area/vh":1751263815930,"./area/hv":1751263815931,"./link/link":1751263815932,"./link/smooth":1751263815933,"./link/vhv":1751263815934,"./link/arc":1751263815935,"./image/image":1751263815936,"./polygon/polygon":1751263815938,"./polygon/ribbon":1751263815939,"./box/box":1751263815940,"./box/violin":1751263815941,"./lineXY/line":1751263815942,"./connector/connector":1751263815943,"./label/label":1751263815944,"./path/path":1751263815961,"./path/hollow":1751263815963,"./density/density":1751263815964,"./heatmap/heatmap":1751263815965,"./shape/shape":1751263815969,"./liquid/liquid":1751263815970,"./gauge/round":1751263815973}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815880, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Rect = void 0; +const color_1 = require("./color"); +/** + * Render rect in different coordinate and using color channel for stroke and fill attribute. + * The stroke attribute is valid with specified lineWidth attribute which defaults to zero. + */ +const Rect = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill' }, options), context); +}; +exports.Rect = Rect; +exports.Rect.props = Object.assign(Object.assign({}, color_1.Color.props), { defaultMarker: 'square' }); +//# sourceMappingURL=rect.js.map +}, function(modId) { var map = {"./color":1751263815881}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815881, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Color = exports.rect = void 0; +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const coordinate_1 = require("../../utils/coordinate"); +const selection_1 = require("../../utils/selection"); +const vector_1 = require("../../utils/vector"); +const number_1 = require("../../utils/number"); +const utils_1 = require("../utils"); +// Render rect in different coordinate. +function rect(document, points, value, coordinate, style = {}) { + const { inset = 0, radius = 0, insetLeft = inset, insetTop = inset, insetRight = inset, insetBottom = inset, radiusBottomLeft = radius, radiusBottomRight = radius, radiusTopLeft = radius, radiusTopRight = radius, minWidth = -Infinity, maxWidth = Infinity, minHeight = -Infinity } = style, rest = __rest(style, ["inset", "radius", "insetLeft", "insetTop", "insetRight", "insetBottom", "radiusBottomLeft", "radiusBottomRight", "radiusTopLeft", "radiusTopRight", "minWidth", "maxWidth", "minHeight"]); + if (!(0, coordinate_1.isPolar)(coordinate) && !(0, coordinate_1.isHelix)(coordinate)) { + const tpShape = !!(0, coordinate_1.isTranspose)(coordinate); + const [p0, , p2] = tpShape ? (0, utils_1.reorder)(points) : points; + const [x, y] = p0; + const [width, height] = (0, vector_1.sub)(p2, p0); + // Deal with width or height is negative. + const absX = width > 0 ? x : x + width; + const absY = height > 0 ? y : y + height; + const absWidth = Math.abs(width); + const absHeight = Math.abs(height); + const finalX = absX + insetLeft; + const finalY = absY + insetTop; + const finalWidth = absWidth - (insetLeft + insetRight); + const finalHeight = absHeight - (insetTop + insetBottom); + const clampWidth = tpShape + ? (0, number_1.clamp)(finalWidth, minHeight, Infinity) + : (0, number_1.clamp)(finalWidth, minWidth, maxWidth); + const clampHeight = tpShape + ? (0, number_1.clamp)(finalHeight, minWidth, maxWidth) + : (0, number_1.clamp)(finalHeight, minHeight, Infinity); + const clampX = tpShape ? finalX : finalX - (clampWidth - finalWidth) / 2; + const clampY = tpShape + ? finalY - (clampHeight - finalHeight) / 2 + : finalY - (clampHeight - finalHeight); + return (0, selection_1.select)(document.createElement('rect', {})) + .style('x', clampX) + .style('y', clampY) + .style('width', clampWidth) + .style('height', clampHeight) + .style('radius', [ + radiusTopLeft, + radiusTopRight, + radiusBottomRight, + radiusBottomLeft, + ]) + .call(utils_1.applyStyle, rest) + .node(); + } + // Render path in polar coordinate. + const { y, y1 } = value; + const center = coordinate.getCenter(); + const arcObject = (0, utils_1.getArcObject)(coordinate, points, [y, y1]); + const path = (0, d3_shape_1.arc)() + .cornerRadius(radius) + .padAngle((inset * Math.PI) / 180); + return (0, selection_1.select)(document.createElement('path', {})) + .style('d', path(arcObject)) + .style('transform', `translate(${center[0]}, ${center[1]})`) + .style('radius', radius) + .style('inset', inset) + .call(utils_1.applyStyle, rest) + .node(); +} +exports.rect = rect; +/** + * Render rect in different coordinate. + * Calc arc path based on control points directly rather startAngle, endAngle, innerRadius, + * outerRadius. This is not accurate and will cause bug when the range of y scale is [1, 0] + * for cell geometry. + */ +const Color = (options, context) => { + // Render border only when colorAttribute is stroke. + const { colorAttribute, opacityAttribute = 'fill', first = true, last = true } = options, style = __rest(options, ["colorAttribute", "opacityAttribute", "first", "last"]); + const { coordinate, document } = context; + return (points, value, defaults) => { + const { color: defaultColor, radius: defaultRadius = 0 } = defaults, restDefaults = __rest(defaults, ["color", "radius"]); + const defaultLineWidth = restDefaults.lineWidth || 1; + const { stroke, radius = defaultRadius, radiusTopLeft = radius, radiusTopRight = radius, radiusBottomRight = radius, radiusBottomLeft = radius, innerRadius = 0, innerRadiusTopLeft = innerRadius, innerRadiusTopRight = innerRadius, innerRadiusBottomRight = innerRadius, innerRadiusBottomLeft = innerRadius, lineWidth = colorAttribute === 'stroke' || stroke ? defaultLineWidth : 0, inset = 0, insetLeft = inset, insetRight = inset, insetBottom = inset, insetTop = inset, minWidth, maxWidth, minHeight } = style, rest = __rest(style, ["stroke", "radius", "radiusTopLeft", "radiusTopRight", "radiusBottomRight", "radiusBottomLeft", "innerRadius", "innerRadiusTopLeft", "innerRadiusTopRight", "innerRadiusBottomRight", "innerRadiusBottomLeft", "lineWidth", "inset", "insetLeft", "insetRight", "insetBottom", "insetTop", "minWidth", "maxWidth", "minHeight"]); + const { color = defaultColor, opacity } = value; + // Extended style, which is not supported by native g shape, + // should apply at first. + const standardDirRadius = [ + first ? radiusTopLeft : innerRadiusTopLeft, + first ? radiusTopRight : innerRadiusTopRight, + last ? radiusBottomRight : innerRadiusBottomRight, + last ? radiusBottomLeft : innerRadiusBottomLeft, + ]; + const standardDir = [ + 'radiusTopLeft', + 'radiusTopRight', + 'radiusBottomRight', + 'radiusBottomLeft', + ]; + // Transpose: rotate it clockwise by 90. + if ((0, coordinate_1.isTranspose)(coordinate)) { + standardDir.push(standardDir.shift()); + } + const extendedStyle = Object.assign(Object.assign({ radius }, Object.fromEntries(standardDir.map((d, i) => [d, standardDirRadius[i]]))), { inset, + insetLeft, + insetRight, + insetBottom, + insetTop, + minWidth, + maxWidth, + minHeight }); + return ((0, selection_1.select)(rect(document, points, value, coordinate, extendedStyle)) + .call(utils_1.applyStyle, restDefaults) + .style('fill', 'transparent') + .style(colorAttribute, color) + .style((0, utils_1.toOpacityKey)(options), opacity) + .style('lineWidth', lineWidth) + .style('stroke', stroke === undefined ? color : stroke) + // shape.style has higher priority. + .call(utils_1.applyStyle, rest) + .node()); + }; +}; +exports.Color = Color; +// @todo Should Shape have default animations using for ordinal scale? +exports.Color.props = { + defaultEnterAnimation: 'scaleInY', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=color.js.map +}, function(modId) { var map = {"../../utils/coordinate":1751263815882,"../../utils/selection":1751263815883,"../../utils/vector":1751263815873,"../../utils/number":1751263815884,"../utils":1751263815885}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815882, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getTransformOptions = exports.angleOf = exports.radiusOf = exports.getRadius = exports.isNonCartesian = exports.isTheta = exports.isCircular = exports.isRadar = exports.isFisheye = exports.isParallel = exports.isHelix = exports.isRadial = exports.isPolar = exports.isTranspose = void 0; +function isTranspose(coordinate) { + const { transformations } = coordinate.getOptions(); + const transposes = transformations + .map(([type]) => type) + .filter((type) => type === 'transpose'); + return transposes.length % 2 !== 0; +} +exports.isTranspose = isTranspose; +function isPolar(coordinate) { + const { transformations } = coordinate.getOptions(); + return transformations.some(([type]) => type === 'polar'); +} +exports.isPolar = isPolar; +function isRadial(coordinate) { + const { transformations } = coordinate.getOptions(); + return ( + // distinguish radial from theta. + transformations.some(([type]) => type === 'reflect') && + transformations.some(([type]) => type.startsWith('transpose'))); +} +exports.isRadial = isRadial; +function isHelix(coordinate) { + const { transformations } = coordinate.getOptions(); + return transformations.some(([type]) => type === 'helix'); +} +exports.isHelix = isHelix; +function isParallel(coordinate) { + const { transformations } = coordinate.getOptions(); + return transformations.some(([type]) => type === 'parallel'); +} +exports.isParallel = isParallel; +function isFisheye(coordinate) { + const { transformations } = coordinate.getOptions(); + return transformations.some(([type]) => type === 'fisheye'); +} +exports.isFisheye = isFisheye; +function isRadar(coordinate) { + return isParallel(coordinate) && isPolar(coordinate); +} +exports.isRadar = isRadar; +function isCircular(coordinate) { + return isHelix(coordinate) || isPolar(coordinate); +} +exports.isCircular = isCircular; +function isTheta(coordinate) { + return isPolar(coordinate) && isTranspose(coordinate); +} +exports.isTheta = isTheta; +function isNonCartesian(coordinate) { + return (isPolar(coordinate) || + isParallel(coordinate) || + isRadial(coordinate) || + isTheta(coordinate)); +} +exports.isNonCartesian = isNonCartesian; +function getRadius(coordinate) { + if (isCircular(coordinate)) { + const [width, height] = coordinate.getSize(); + const polar = coordinate + .getOptions() + .transformations.find((t) => t[0] === 'polar'); + // coordinate.size * outerRadius. + if (polar) + return (Math.max(width, height) / 2) * polar[4]; + } + return 0; +} +exports.getRadius = getRadius; +function radiusOf(coordinate) { + const { transformations } = coordinate.getOptions(); + const [, , , innerRadius, outerRadius] = transformations.find((d) => d[0] === 'polar'); + return [+innerRadius, +outerRadius]; +} +exports.radiusOf = radiusOf; +function angleOf(coordinate, isRadius = true) { + const { transformations } = coordinate.getOptions(); + const [, startAngle, endAngle] = transformations.find((d) => d[0] === 'polar'); + return isRadius + ? [(+startAngle * 180) / Math.PI, (+endAngle * 180) / Math.PI] + : [startAngle, endAngle]; +} +exports.angleOf = angleOf; +function getTransformOptions(coordinate, type) { + const { transformations } = coordinate.getOptions(); + const [, ...args] = transformations.find((d) => d[0] === type); + return args; +} +exports.getTransformOptions = getTransformOptions; +//# sourceMappingURL=coordinate.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815883, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Selection = exports.select = void 0; +const g_1 = require("@antv/g"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const helper_1 = require("./helper"); +function select(node) { + return new Selection([node], null, node, node.ownerDocument); +} +exports.select = select; +/** + * A simple implementation of d3-selection for @antv/g. + * It has the core features of d3-selection and extended ability. + * Every methods of selection returns new selection if elements + * are mutated(e.g. append, remove), otherwise return the selection itself(e.g. attr, style). + * @see https://github.com/d3/d3-selection + * @see https://github.com/antvis/g + * @todo Nested selections. + * @todo More useful functor. + */ +class Selection { + constructor(elements = null, data = null, parent = null, document = null, selections = [ + null, + null, + null, + null, + null, + ], transitions = [], updateElements = []) { + this._elements = Array.from(elements); + this._data = data; + this._parent = parent; + this._document = document; + this._enter = selections[0]; + this._update = selections[1]; + this._exit = selections[2]; + this._merge = selections[3]; + this._split = selections[4]; + this._transitions = transitions; + this._facetElements = updateElements; + } + selectAll(selector) { + const elements = typeof selector === 'string' + ? this._parent.querySelectorAll(selector) + : selector; + return new Selection(elements, null, this._elements[0], this._document); + } + selectFacetAll(selector) { + const elements = typeof selector === 'string' + ? this._parent.querySelectorAll(selector) + : selector; + return new Selection(this._elements, null, this._parent, this._document, undefined, undefined, elements); + } + /** + * @todo Replace with querySelector which has bug now. + */ + select(selector) { + const element = typeof selector === 'string' + ? this._parent.querySelectorAll(selector)[0] || null + : selector; + return new Selection([element], null, element, this._document); + } + append(node) { + const callback = typeof node === 'function' ? node : () => this.createElement(node); + const elements = []; + if (this._data !== null) { + // For empty selection, append new element to parent. + // Each element is bind with datum. + for (let i = 0; i < this._data.length; i++) { + const d = this._data[i]; + const [datum, from] = Array.isArray(d) ? d : [d, null]; + const newElement = callback(datum, i); + newElement.__data__ = datum; + if (from !== null) + newElement.__fromElements__ = from; + this._parent.appendChild(newElement); + elements.push(newElement); + } + return new Selection(elements, null, this._parent, this._document); + } + else { + // For non-empty selection, append new element to + // selected element and return new selection. + for (let i = 0; i < this._elements.length; i++) { + const element = this._elements[i]; + const datum = element.__data__; + const newElement = callback(datum, i); + element.appendChild(newElement); + elements.push(newElement); + } + return new Selection(elements, null, elements[0], this._document); + } + } + maybeAppend(id, node, className) { + const element = this._elements[0]; + const child = element.getElementById(id); + if (child) { + return new Selection([child], null, this._parent, this._document); + } + const newChild = typeof node === 'string' ? this.createElement(node) : node(); + newChild.id = id; + if (className) + newChild.className = className; + element.appendChild(newChild); + return new Selection([newChild], null, this._parent, this._document); + } + /** + * Bind data to elements, and produce three selection: + * Enter: Selection with empty elements and data to be bind to elements. + * Update: Selection with elements to be updated. + * Exit: Selection with elements to be removed. + */ + data(data, id = (d) => d, groupId = () => null) { + // An Array of new data. + const enter = []; + // An Array of elements to be updated. + const update = []; + // A Set of elements to be removed. + const exit = new Set(this._elements); + // An Array of data to be merged into one element. + const merge = []; + // A Set of elements to be split into multiple datum. + const split = new Set(); + // A Map from key to each element. + const keyElement = new Map(this._elements.map((d, i) => [id(d.__data__, i), d])); + // A Map from key to exist element. The Update Selection + // can get element from this map, this is for diff among + // facets. + const keyUpdateElement = new Map(this._facetElements.map((d, i) => [id(d.__data__, i), d])); + // A Map from groupKey to a group of elements. + const groupKeyElements = (0, d3_array_1.group)(this._elements, (d) => groupId(d.__data__)); + // Diff data with selection(elements with data). + // !!! Note + // The switch is strictly ordered, not not change the order of them. + for (let i = 0; i < data.length; i++) { + const datum = data[i]; + const key = id(datum, i); + const groupKey = groupId(datum, i); + // Append element to update selection if incoming data has + // exactly the same key with elements. + if (keyElement.has(key)) { + const element = keyElement.get(key); + element.__data__ = datum; + element.__facet__ = false; + update.push(element); + exit.delete(element); + keyElement.delete(key); + // Append element to update selection if incoming data has + // exactly the same key with updateElements. + } + else if (keyUpdateElement.has(key)) { + const element = keyUpdateElement.get(key); + element.__data__ = datum; + // Flag this element should update its parentNode. + element.__facet__ = true; + update.push(element); + keyUpdateElement.delete(key); + // Append datum to merge selection if existed elements has + // its key as groupKey. + } + else if (groupKeyElements.has(key)) { + const group = groupKeyElements.get(key); + merge.push([datum, group]); + for (const element of group) + exit.delete(element); + groupKeyElements.delete(key); + // Append element to split selection if incoming data has + // groupKey as its key, and bind to datum for it. + } + else if (keyElement.has(groupKey)) { + const element = keyElement.get(groupKey); + if (element.__toData__) + element.__toData__.push(datum); + else + element.__toData__ = [datum]; + split.add(element); + exit.delete(element); + } + else { + // @todo Data with non-unique key. + enter.push(datum); + } + } + // Create new selection with enter, update and exit. + const S = [ + new Selection([], enter, this._parent, this._document), + new Selection(update, null, this._parent, this._document), + new Selection(exit, null, this._parent, this._document), + new Selection([], merge, this._parent, this._document), + new Selection(split, null, this._parent, this._document), + ]; + return new Selection(this._elements, null, this._parent, this._document, S); + } + merge(other) { + const elements = [...this._elements, ...other._elements]; + const transitions = [...this._transitions, ...other._transitions]; + return new Selection(elements, null, this._parent, this._document, undefined, transitions); + } + createElement(type) { + if (this._document) { + return this._document.createElement(type, {}); + } + const Ctor = Selection.registry[type]; + if (Ctor) + return new Ctor(); + return (0, helper_1.error)(`Unknown node type: ${type}`); + } + /** + * Apply callback for each selection(enter, update, exit) + * and merge them into one selection. + */ + join(enter = (d) => d, update = (d) => d, exit = (d) => d.remove(), merge = (d) => d, split = (d) => d.remove()) { + const newEnter = enter(this._enter); + const newUpdate = update(this._update); + const newExit = exit(this._exit); + const newMerge = merge(this._merge); + const newSplit = split(this._split); + return newUpdate + .merge(newEnter) + .merge(newExit) + .merge(newMerge) + .merge(newSplit); + } + remove() { + // Remove node immediately if there is no transition, + // otherwise wait until transition finished. + for (let i = 0; i < this._elements.length; i++) { + const transition = this._transitions[i]; + if (transition) { + const T = Array.isArray(transition) ? transition : [transition]; + Promise.all(T.map((d) => d.finished)).then(() => { + const element = this._elements[i]; + element.remove(); + }); + } + else { + const element = this._elements[i]; + element.remove(); + } + } + return new Selection([], null, this._parent, this._document, undefined, this._transitions); + } + each(callback) { + for (let i = 0; i < this._elements.length; i++) { + const element = this._elements[i]; + const datum = element.__data__; + callback(datum, i, element); + } + return this; + } + attr(key, value) { + const callback = typeof value !== 'function' ? () => value : value; + return this.each(function (d, i, element) { + if (value !== undefined) + element[key] = callback(d, i, element); + }); + } + style(key, value) { + const callback = typeof value !== 'function' ? () => value : value; + return this.each(function (d, i, element) { + if (value !== undefined) + element.style[key] = callback(d, i, element); + }); + } + transition(value) { + const callback = typeof value !== 'function' ? () => value : value; + const { _transitions: T } = this; + return this.each(function (d, i, element) { + T[i] = callback(d, i, element); + }); + } + on(event, handler) { + this.each(function (d, i, element) { + element.addEventListener(event, handler); + }); + return this; + } + call(callback, ...args) { + callback(this, ...args); + return this; + } + node() { + return this._elements[0]; + } + nodes() { + return this._elements; + } + transitions() { + return this._transitions; + } + parent() { + return this._parent; + } +} +exports.Selection = Selection; +Selection.registry = { + g: g_1.Group, + rect: g_1.Rect, + circle: g_1.Circle, + path: g_1.Path, + text: g_1.Text, + ellipse: g_1.Ellipse, + image: g_1.Image, + line: g_1.Line, + polygon: g_1.Polygon, + polyline: g_1.Polyline, + html: g_1.HTML, +}; +//# sourceMappingURL=selection.js.map +}, function(modId) { var map = {"./helper":1751263815829}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815884, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.prettyNumber = exports.clamp = void 0; +/** + * Clamp number within the inclusive range within the lower and upper bounds. + */ +function clamp(v, lower, upper) { + return Math.max(lower, Math.min(v, upper)); +} +exports.clamp = clamp; +/** + * Precision conversion + */ +function prettyNumber(n, precision = 10) { + if (typeof n !== 'number') + return n; + return Math.abs(n) < 1e-15 ? n : parseFloat(n.toFixed(precision)); +} +exports.prettyNumber = prettyNumber; +//# sourceMappingURL=number.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815885, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getOrigin = exports.getTransform = exports.toOpacityKey = exports.getConnectStyle = exports.getArcObject = exports.reorder = exports.computeGradient = exports.appendArc = exports.arrowPoints = exports.appendPolygon = exports.applyStyle = void 0; +const scale_1 = require("@antv/scale"); +const util_1 = require("@antv/util"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const array_1 = require("../utils/array"); +const coordinate_1 = require("../utils/coordinate"); +const vector_1 = require("../utils/vector"); +function applyStyle(selection, style) { + for (const [key, value] of Object.entries(style)) { + selection.style(key, value); + } +} +exports.applyStyle = applyStyle; +/** + * Draw polygon path with points. + * @param path + * @param points + */ +function appendPolygon(path, points) { + points.forEach((p, idx) => idx === 0 ? path.moveTo(p[0], p[1]) : path.lineTo(p[0], p[1])); + path.closePath(); + return path; +} +exports.appendPolygon = appendPolygon; +/** + * Draw arrow between `from` and `to`. + * @param from + * @param to + * @returns + */ +function arrowPoints(from, to, options) { + const { arrowSize } = options; + const size = typeof arrowSize === 'string' + ? (+parseFloat(arrowSize) / 100) * (0, vector_1.dist)(from, to) + : arrowSize; + // TODO Use config from style. + // Default arrow rotate is 30°. + const arrowAngle = Math.PI / 6; + const angle = Math.atan2(to[1] - from[1], to[0] - from[0]); + const arrowAngle1 = Math.PI / 2 - angle - arrowAngle; + const arrow1 = [ + to[0] - size * Math.sin(arrowAngle1), + to[1] - size * Math.cos(arrowAngle1), + ]; + const arrowAngle2 = angle - arrowAngle; + const arrow2 = [ + to[0] - size * Math.cos(arrowAngle2), + to[1] - size * Math.sin(arrowAngle2), + ]; + return [arrow1, arrow2]; +} +exports.arrowPoints = arrowPoints; +/** + * Draw arc by from -> to, with center and radius. + * @param path + * @param from + * @param to + * @param center + * @param radius + */ +function appendArc(path, from, to, center, radius) { + const startAngle = (0, vector_1.angle)((0, vector_1.sub)(center, from)) + Math.PI; + const endAngle = (0, vector_1.angle)((0, vector_1.sub)(center, to)) + Math.PI; + path.arc(center[0], center[1], radius, startAngle, endAngle, endAngle - startAngle < 0); + return path; +} +exports.appendArc = appendArc; +/** + * @todo Fix wrong key point. + */ +function computeGradient(C, X, Y, from = 'y', mode = 'between', tpShape = false) { + // The angles of gradients rendering are varies when 'from' and 'tpShape' are different. + const getTheta = (from, tpShape) => { + if (from === 'y' || from === true) { + if (tpShape) { + return 180; + } + else { + return 90; + } + } + else { + if (tpShape) { + return 90; + } + else { + return 0; + } + } + }; + const P = from === 'y' || from === true ? Y : X; + const theta = getTheta(from, tpShape); + const I = (0, array_1.indexOf)(P); + const [min, max] = (0, d3_array_1.extent)(I, (i) => P[i]); + // This need to improve for non-uniform distributed colors. + const p = new scale_1.Linear({ + domain: [min, max], + range: [0, 100], + }); + const percentage = (i) => (0, util_1.isNumber)(P[i]) && !Number.isNaN(P[i]) ? p.map(P[i]) : 0; + const gradientMode = { + // Interpolate the colors for this segment. + between: (i) => `${C[i]} ${percentage(i)}%`, + // Use the color of the start point as the color for this segment. + start: (i) => i === 0 + ? `${C[i]} ${percentage(i)}%` + : `${C[i - 1]} ${percentage(i)}%, ${C[i]} ${percentage(i)}%`, + // Use the color of the end point as the color for this segment. + end: (i) => i === C.length - 1 + ? `${C[i]} ${percentage(i)}%` + : `${C[i]} ${percentage(i)}%, ${C[i + 1]} ${percentage(i)}%`, + }; + const gradient = I.sort((a, b) => percentage(a) - percentage(b)) + .map(gradientMode[mode] || gradientMode['between']) + .join(','); + return `linear-gradient(${theta}deg, ${gradient})`; +} +exports.computeGradient = computeGradient; +function reorder(points) { + const [p0, p1, p2, p3] = points; + return [p3, p0, p1, p2]; +} +exports.reorder = reorder; +function getArcObject(coordinate, points, Y) { + const [p0, p1, , p3] = (0, coordinate_1.isTranspose)(coordinate) ? reorder(points) : points; + const [y, y1] = Y; + const center = coordinate.getCenter(); + const a1 = (0, vector_1.angleWithQuadrant)((0, vector_1.sub)(p0, center)); + const a2 = (0, vector_1.angleWithQuadrant)((0, vector_1.sub)(p1, center)); + // There are two situations that a2 === a1: + // 1. a1 - a2 = 0 + // 2. |a1 - a2| = Math.PI * 2 + // Distinguish them by y and y1: + const a3 = a2 === a1 && y !== y1 ? a2 + Math.PI * 2 : a2; + return { + startAngle: a1, + endAngle: a3 - a1 >= 0 ? a3 : Math.PI * 2 + a3, + innerRadius: (0, vector_1.dist)(p3, center), + outerRadius: (0, vector_1.dist)(p0, center), + }; +} +exports.getArcObject = getArcObject; +/** + * Pick connectStyle from style. + * @param style + */ +function getConnectStyle(style) { + const PREFIX = 'connect'; + return Object.fromEntries(Object.entries(style) + .filter(([key]) => key.startsWith(PREFIX)) + .map(([key, value]) => [ + (0, util_1.lowerFirst)(key.replace(PREFIX, '').trim()), + value, + ]) + .filter(([key]) => key !== undefined)); +} +exports.getConnectStyle = getConnectStyle; +function toOpacityKey(options) { + const { colorAttribute, opacityAttribute = colorAttribute } = options; + return `${opacityAttribute}Opacity`; +} +exports.toOpacityKey = toOpacityKey; +function getTransform(coordinate, value) { + if (!(0, coordinate_1.isPolar)(coordinate)) + return ''; + const center = coordinate.getCenter(); + const { transform: suffix } = value; + return `translate(${center[0]}, ${center[1]}) ${suffix || ''}`; +} +exports.getTransform = getTransform; +function getOrigin(points) { + if (points.length === 1) + return points[0]; + const [[x0, y0, z0 = 0], [x2, y2, z2 = 0]] = points; + return [(x0 + x2) / 2, (y0 + y2) / 2, (z0 + z2) / 2]; +} +exports.getOrigin = getOrigin; +//# sourceMappingURL=utils.js.map +}, function(modId) { var map = {"../utils/array":1751263815830,"../utils/coordinate":1751263815882,"../utils/vector":1751263815873}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815886, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Hollow = void 0; +const color_1 = require("./color"); +/** + * Render rect in different coordinate and using color channel for stroke attribute. + */ +const Hollow = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke' }, options), context); +}; +exports.Hollow = Hollow; +exports.Hollow.props = Object.assign(Object.assign({}, color_1.Color.props), { defaultMarker: 'hollowSquare' }); +//# sourceMappingURL=hollow.js.map +}, function(modId) { var map = {"./color":1751263815881}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815887, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Funnel = void 0; +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const coordinate_1 = require("../../utils/coordinate"); +const selection_1 = require("../../utils/selection"); +const utils_1 = require("../utils"); +/** + * Adjust and return the new `points`. + */ +function getFunnelPoints(points, nextPoints, coordinate) { + const [p0, p1, p2, p3] = points; + if ((0, coordinate_1.isTranspose)(coordinate)) { + const newP1 = [nextPoints ? nextPoints[0][0] : p1[0], p1[1]]; + const newP2 = [nextPoints ? nextPoints[3][0] : p2[0], p2[1]]; + return [p0, newP1, newP2, p3]; + } + const newP1 = [p1[0], nextPoints ? nextPoints[0][1] : p1[1]]; + const newP2 = [p2[0], nextPoints ? nextPoints[3][1] : p2[1]]; + return [p0, newP1, newP2, p3]; +} +/** + * Render funnel in different coordinate and using color channel for stroke and fill attribute. + */ +const Funnel = (options, context) => { + const { adjustPoints = getFunnelPoints } = options, style = __rest(options, ["adjustPoints"]); + const { coordinate, document } = context; + return (points, value, defaults, point2d) => { + const { index } = value; + const { color: defaultColor } = defaults, rest = __rest(defaults, ["color"]); + const nextPoints = point2d[index + 1]; + const funnelPoints = adjustPoints(points, nextPoints, coordinate); + const tpShape = !!(0, coordinate_1.isTranspose)(coordinate); + const [p0, p1, p2, p3] = tpShape ? (0, utils_1.reorder)(funnelPoints) : funnelPoints; + const { color = defaultColor, opacity } = value; + const b = (0, d3_shape_1.line)().curve(d3_shape_1.curveLinearClosed)([p0, p1, p2, p3]); + return (0, selection_1.select)(document.createElement('path', {})) + .call(utils_1.applyStyle, rest) + .style('d', b) + .style('fill', color) + .style('fillOpacity', opacity) + .call(utils_1.applyStyle, style) + .node(); + }; +}; +exports.Funnel = Funnel; +exports.Funnel.props = { + defaultMarker: 'square', +}; +//# sourceMappingURL=funnel.js.map +}, function(modId) { var map = {"../../utils/coordinate":1751263815882,"../../utils/selection":1751263815883,"../utils":1751263815885}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815888, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Pyramid = void 0; +const coordinate_1 = require("../../utils/coordinate"); +const funnel_1 = require("./funnel"); +/** + * Adjust and return the new `points`. + */ +function getPyramidPoints(points, nextPoints, coordinate) { + const [p0, p1, p2, p3] = points; + if ((0, coordinate_1.isTranspose)(coordinate)) { + const newP1 = [ + nextPoints ? nextPoints[0][0] : (p1[0] + p2[0]) / 2, + p1[1], + ]; + const newP2 = [ + nextPoints ? nextPoints[3][0] : (p1[0] + p2[0]) / 2, + p2[1], + ]; + return [p0, newP1, newP2, p3]; + } + const newP1 = [ + p1[0], + nextPoints ? nextPoints[0][1] : (p1[1] + p2[1]) / 2, + ]; + const newP2 = [ + p2[0], + nextPoints ? nextPoints[3][1] : (p1[1] + p2[1]) / 2, + ]; + return [p0, newP1, newP2, p3]; +} +/** + * Render pyramid in different coordinate and using color channel for stroke and fill attribute. + */ +const Pyramid = (options, context) => { + return (0, funnel_1.Funnel)(Object.assign({ adjustPoints: getPyramidPoints }, options), context); +}; +exports.Pyramid = Pyramid; +exports.Pyramid.props = { + defaultMarker: 'square', +}; +//# sourceMappingURL=pyramid.js.map +}, function(modId) { var map = {"../../utils/coordinate":1751263815882,"./funnel":1751263815887}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815889, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Line = void 0; +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const coordinate_1 = require("../../utils/coordinate"); +const curve_1 = require("./curve"); +const Line = (options, context) => { + const { coordinate } = context; + return (...params) => { + const curve = (0, coordinate_1.isPolar)(coordinate) ? d3_shape_1.curveLinearClosed : d3_shape_1.curveLinear; + return (0, curve_1.Curve)(Object.assign({ curve }, options), context)(...params); + }; +}; +exports.Line = Line; +exports.Line.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'line' }); +//# sourceMappingURL=line.js.map +}, function(modId) { var map = {"../../utils/coordinate":1751263815882,"./curve":1751263815890}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815890, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Curve = void 0; +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const coordinate_1 = require("../../utils/coordinate"); +const selection_1 = require("../../utils/selection"); +const utils_1 = require("../utils"); +const createElement_1 = require("../../utils/createElement"); +const helper_1 = require("../../utils/helper"); +const vector_1 = require("../../utils/vector"); +const DoublePath = (0, createElement_1.createElement)((g) => { + const { d1, d2, style1, style2 } = g.attributes; + const document = g.ownerDocument; + (0, selection_1.select)(g) + .maybeAppend('line', () => document.createElement('path', {})) + .style('d', d1) + .call(utils_1.applyStyle, style1); + (0, selection_1.select)(g) + .maybeAppend('line1', () => document.createElement('path', {})) + .style('d', d2) + .call(utils_1.applyStyle, style2); +}); +/** + * Given a points sequence, split it into an array of defined points + * and an array of undefined segments. + * + * Input - [[1, 2], [3, 4], [null, null], [null, null], [5, 6], [null, null], [7, 8]] + * Output + * - [[1, 2], [3, 4], [5, 6], [7, 8]] + * - [ + * [[3, 4], [5, 6]], + * [[5, 6], [7, 8]] + * ] + */ +function segmentation(points, defined) { + const definedPoints = []; + const segments = []; + let m = false; // Is in a undefined sequence. + let dp = null; // The previous defined point. + for (const p of points) { + // If current point is a undefined point, + // enter a undefined sequence. + if (!defined(p[0]) || !defined(p[1])) + m = true; + else { + definedPoints.push(p); + // If current point is a defined point, + // and is in a undefined sequence, save + // the two closest defined points as this + // undefined sequence and exit it. + if (m) { + m = false; + segments.push([dp, p]); + } + // Update the previous defined point. + dp = p; + } + } + return [definedPoints, segments]; +} +const Curve = (options, context) => { + const { curve, gradient = false, + // The color for each segment. + gradientColor = 'between', defined = (d) => !Number.isNaN(d) && d !== undefined && d !== null, connect: connectNulls = false } = options, style = __rest(options, ["curve", "gradient", "gradientColor", "defined", "connect"]); + const { coordinate, document } = context; + return (P, value, defaults) => { + // Compute styles. + const { color: defaultColor, lineWidth: defaultSize } = defaults, rest = __rest(defaults, ["color", "lineWidth"]); + const { color = defaultColor, size = defaultSize, seriesColor: sc, seriesX: sx, seriesY: sy, } = value; + const transform = (0, utils_1.getTransform)(coordinate, value); + const tpShape = (0, coordinate_1.isTranspose)(coordinate); + const stroke = gradient && sc + ? (0, utils_1.computeGradient)(sc, sx, sy, gradient, gradientColor, tpShape) + : color; + const finalStyle = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, rest), (stroke && { stroke })), (size && { lineWidth: size })), (transform && { transform })), style); + // Compute points and segments. + let linePath; + if ((0, coordinate_1.isPolar)(coordinate)) { + const center = coordinate.getCenter(); + linePath = (points) => (0, d3_shape_1.lineRadial)() + .angle((_, idx) => (0, vector_1.angleWithQuadrant)((0, vector_1.sub)(points[idx], center))) + .radius((_, idx) => (0, vector_1.dist)(points[idx], center)) + .defined(([x, y]) => defined(x) && defined(y)) + .curve(curve)(points); + } + else { + linePath = (0, d3_shape_1.line)() + .x((d) => d[0]) + .y((d) => d[1]) + .defined(([x, y]) => defined(x) && defined(y)) + .curve(curve); + } + const [DP, MS] = segmentation(P, defined); + const connectStyle = (0, helper_1.subObject)(finalStyle, 'connect'); + const missing = !!MS.length; + // Draw one path of connected defined points. + if (!missing || (connectNulls && !Object.keys(connectStyle).length)) { + return (0, selection_1.select)(document.createElement('path', {})) + .style('d', linePath(DP) || []) + .call(utils_1.applyStyle, finalStyle) + .node(); + } + // Draw one path of unconnected defined points. + if (missing && !connectNulls) { + return (0, selection_1.select)(document.createElement('path', {})) + .style('d', linePath(P)) + .call(utils_1.applyStyle, finalStyle) + .node(); + } + // Draw two path. + // One for unconnected defined points. + // One for connected segments. + const connectPath = (segments) => segments.map(linePath).join(','); + return (0, selection_1.select)(new DoublePath()) + .style('style1', Object.assign(Object.assign({}, finalStyle), connectStyle)) + .style('style2', finalStyle) + .style('d1', connectPath(MS)) + .style('d2', linePath(P)) + .node(); + }; +}; +exports.Curve = Curve; +exports.Curve.props = { + defaultMarker: 'smooth', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=curve.js.map +}, function(modId) { var map = {"../../utils/coordinate":1751263815882,"../../utils/selection":1751263815883,"../utils":1751263815885,"../../utils/createElement":1751263815891,"../../utils/helper":1751263815829,"../../utils/vector":1751263815873}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815891, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createElement = void 0; +const g_1 = require("@antv/g"); +function createElement(descriptor) { + const render = typeof descriptor === 'function' ? descriptor : descriptor.render; + return class extends g_1.CustomElement { + connectedCallback() { + this.draw(); + } + attributeChangedCallback() { + this.draw(); + } + draw() { + render(this); + } + }; +} +exports.createElement = createElement; +//# sourceMappingURL=createElement.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815892, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Smooth = void 0; +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const coordinate_1 = require("../../utils/coordinate"); +const curve_1 = require("./curve"); +const Smooth = (options, context) => { + const rest = __rest(options, []); + const { coordinate } = context; + return (...params) => { + const curve = (0, coordinate_1.isPolar)(coordinate) + ? d3_shape_1.curveCatmullRomClosed + : (0, coordinate_1.isTranspose)(coordinate) + ? d3_shape_1.curveMonotoneY + : d3_shape_1.curveMonotoneX; + return (0, curve_1.Curve)(Object.assign({ curve }, rest), context)(...params); + }; +}; +exports.Smooth = Smooth; +exports.Smooth.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'smooth' }); +//# sourceMappingURL=smooth.js.map +}, function(modId) { var map = {"../../utils/coordinate":1751263815882,"./curve":1751263815890}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815893, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HV = void 0; +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const curve_1 = require("./curve"); +const HV = (options, context) => { + return (0, curve_1.Curve)(Object.assign({ curve: d3_shape_1.curveStepAfter }, options), context); +}; +exports.HV = HV; +exports.HV.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'hv' }); +//# sourceMappingURL=hv.js.map +}, function(modId) { var map = {"./curve":1751263815890}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815894, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.VH = void 0; +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const curve_1 = require("./curve"); +const VH = (options, context) => { + return (0, curve_1.Curve)(Object.assign({ curve: d3_shape_1.curveStepBefore }, options), context); +}; +exports.VH = VH; +exports.VH.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'vh' }); +//# sourceMappingURL=vh.js.map +}, function(modId) { var map = {"./curve":1751263815890}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815895, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HVH = void 0; +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const curve_1 = require("./curve"); +const HVH = (options, context) => { + return (0, curve_1.Curve)(Object.assign({ curve: d3_shape_1.curveStep }, options), context); +}; +exports.HVH = HVH; +exports.HVH.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'hvh' }); +//# sourceMappingURL=hvh.js.map +}, function(modId) { var map = {"./curve":1751263815890}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815896, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Trail = void 0; +const d3_path_1 = require("@antv/vendor/d3-path"); +const selection_1 = require("../../utils/selection"); +const utils_1 = require("../utils"); +const vector_1 = require("../../utils/vector"); +const helper_1 = require("../../utils/helper"); +const curve_1 = require("./curve"); +/** + * + * x9-x0---------x1-x2 + * / |r1 |r2 \ + *x8---p0---------p1---x3 + * \ r4| | r3 / + * x7-x6--------x5-x4 + */ +function stroke(path, p0, p1, s0, s1) { + const v = (0, vector_1.sub)(p1, p0); + const a = (0, vector_1.angle)(v); + const a1 = a + Math.PI / 2; + const r1 = [(s0 / 2) * Math.cos(a1), (s0 / 2) * Math.sin(a1)]; + const r2 = [(s1 / 2) * Math.cos(a1), (s1 / 2) * Math.sin(a1)]; + const r3 = [(s1 / 2) * Math.cos(a), (s1 / 2) * Math.sin(a)]; + const r4 = [(s0 / 2) * Math.cos(a), (s0 / 2) * Math.sin(a)]; + const x0 = (0, vector_1.add)(p0, r1); + const x1 = (0, vector_1.add)(p1, r2); + const x2 = (0, vector_1.add)(x1, r3); + const x3 = (0, vector_1.add)(p1, r3); + const x4 = (0, vector_1.sub)(x3, r2); + const x5 = (0, vector_1.sub)(p1, r2); + const x6 = (0, vector_1.sub)(p0, r1); + const x7 = (0, vector_1.sub)(x6, r4); + const x8 = (0, vector_1.sub)(p0, r4); + const x9 = (0, vector_1.sub)(x0, r4); + path.moveTo(...x0); + path.lineTo(...x1); + path.arcTo(...x2, ...x3, s1 / 2); + path.arcTo(...x4, ...x5, s1 / 2); + path.lineTo(...x6); + path.arcTo(...x7, ...x8, s0 / 2); + path.arcTo(...x9, ...x0, s0 / 2); + path.closePath(); +} +// @todo Support connect and connectStyle. +const Trail = (options, context) => { + const { document } = context; + return (P, value, defaults) => { + const { seriesSize, color } = value; + const { color: defaultColor } = defaults, rest = __rest(defaults, ["color"]); + const path = (0, d3_path_1.path)(); + for (let i = 0; i < P.length - 1; i++) { + const p0 = P[i]; + const p1 = P[i + 1]; + const s0 = seriesSize[i]; + const s1 = seriesSize[i + 1]; + if ([...p0, ...p1].every(helper_1.defined)) + stroke(path, p0, p1, s0, s1); + } + return (0, selection_1.select)(document.createElement('path', {})) + .call(utils_1.applyStyle, rest) + .style('fill', color || defaultColor) + .style('d', path.toString()) + .call(utils_1.applyStyle, options) + .node(); + }; +}; +exports.Trail = Trail; +exports.Trail.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'line' }); +//# sourceMappingURL=trail.js.map +}, function(modId) { var map = {"../../utils/selection":1751263815883,"../utils":1751263815885,"../../utils/vector":1751263815873,"../../utils/helper":1751263815829,"./curve":1751263815890}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815897, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HollowBowtie = void 0; +const color_1 = require("./color"); +/** + * ▷◁ + */ +const HollowBowtie = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'bowtie' }, options), context); +}; +exports.HollowBowtie = HollowBowtie; +exports.HollowBowtie.props = Object.assign({ defaultMarker: 'hollowBowtie' }, color_1.Color.props); +//# sourceMappingURL=hollowBowtie.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815898, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Color = exports.getRadius = void 0; +const coordinate_1 = require("../../utils/coordinate"); +const marker_1 = require("../../utils/marker"); +const selection_1 = require("../../utils/selection"); +const string_1 = require("../../utils/string"); +const utils_1 = require("../utils"); +function getRadius(mode, points, value, coordinate) { + if (points.length === 1) + return undefined; + const { size } = value; + if (mode === 'fixed') + return size; + if (mode === 'normal' || (0, coordinate_1.isFisheye)(coordinate)) { + const [[x0, y0], [x2, y2]] = points; + const a = Math.abs((x2 - x0) / 2); + const b = Math.abs((y2 - y0) / 2); + return Math.max(0, (a + b) / 2); + } + return size; +} +exports.getRadius = getRadius; +/** + * Render point in different coordinate. + */ +const Color = (options, context) => { + // Render border only when colorAttribute is stroke. + const { colorAttribute, symbol, mode = 'auto' } = options, style = __rest(options, ["colorAttribute", "symbol", "mode"]); + const path = marker_1.Symbols.get((0, string_1.camelCase)(symbol)) || marker_1.Symbols.get('point'); + const { coordinate, document } = context; + return (points, value, defaults) => { + const { lineWidth, color: defaultColor } = defaults; + const finalLineWidth = style.stroke ? lineWidth || 1 : lineWidth; + const { color = defaultColor, transform, opacity } = value; + const [cx, cy] = (0, utils_1.getOrigin)(points); + const r = getRadius(mode, points, value, coordinate); + const finalRadius = r || style.r || defaults.r; + return (0, selection_1.select)(document.createElement('path', {})) + .call(utils_1.applyStyle, defaults) + .style('fill', 'transparent') + .style('d', path(cx, cy, finalRadius)) + .style('lineWidth', finalLineWidth) + .style('transform', transform) + .style('transformOrigin', `${cx - finalRadius} ${cy - finalRadius}`) + .style('stroke', color) + .style((0, utils_1.toOpacityKey)(options), opacity) + .style(colorAttribute, color) + .call(utils_1.applyStyle, style) + .node(); + }; +}; +exports.Color = Color; +exports.Color.props = { + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=color.js.map +}, function(modId) { var map = {"../../utils/coordinate":1751263815882,"../../utils/marker":1751263815899,"../../utils/selection":1751263815883,"../../utils/string":1751263815900,"../utils":1751263815885}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815899, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.unregisterSymbol = exports.registerSymbol = exports.useMarker = exports.Symbols = void 0; +const g_1 = require("@antv/g"); +const point = (x, y, r) => { + return [ + ['M', x - r, y], + ['A', r, r, 0, 1, 0, x + r, y], + ['A', r, r, 0, 1, 0, x - r, y], + ['Z'], + ]; +}; +point.style = ['fill']; +const hollowPoint = point.bind(undefined); +hollowPoint.style = ['stroke', 'lineWidth']; +const square = (x, y, r) => { + return [ + ['M', x - r, y - r], + ['L', x + r, y - r], + ['L', x + r, y + r], + ['L', x - r, y + r], + ['Z'], + ]; +}; +square.style = ['fill']; +const rect = square.bind(undefined); +rect.style = ['fill']; +const hollowSquare = square.bind(undefined); +hollowSquare.style = ['stroke', 'lineWidth']; +const diamond = (x, y, r) => { + const hr = r * 0.618; + return [ + ['M', x - hr, y], + ['L', x, y - r], + ['L', x + hr, y], + ['L', x, y + r], + ['Z'], + ]; +}; +diamond.style = ['fill']; +const hollowDiamond = diamond.bind(undefined); +hollowDiamond.style = ['stroke', 'lineWidth']; +const triangle = (x, y, r) => { + const diffY = r * Math.sin((1 / 3) * Math.PI); + return [ + ['M', x - r, y + diffY], + ['L', x, y - diffY], + ['L', x + r, y + diffY], + ['Z'], + ]; +}; +triangle.style = ['fill']; +const hollowTriangle = triangle.bind(undefined); +hollowTriangle.style = ['stroke', 'lineWidth']; +const triangleDown = (x, y, r) => { + const diffY = r * Math.sin((1 / 3) * Math.PI); + return [ + ['M', x - r, y - diffY], + ['L', x + r, y - diffY], + ['L', x, y + diffY], + ['Z'], + ]; +}; +triangleDown.style = ['fill']; +const hollowTriangleDown = triangleDown.bind(undefined); +hollowTriangleDown.style = ['stroke', 'lineWidth']; +const hexagon = (x, y, r) => { + const diffX = (r / 2) * Math.sqrt(3); + return [ + ['M', x, y - r], + ['L', x + diffX, y - r / 2], + ['L', x + diffX, y + r / 2], + ['L', x, y + r], + ['L', x - diffX, y + r / 2], + ['L', x - diffX, y - r / 2], + ['Z'], + ]; +}; +hexagon.style = ['fill']; +const hollowHexagon = hexagon.bind(undefined); +hollowHexagon.style = ['stroke', 'lineWidth']; +const bowtie = (x, y, r) => { + const diffY = r - 1.5; + return [ + ['M', x - r, y - diffY], + ['L', x + r, y + diffY], + ['L', x + r, y - diffY], + ['L', x - r, y + diffY], + ['Z'], + ]; +}; +bowtie.style = ['fill']; +const hollowBowtie = bowtie.bind(undefined); +hollowBowtie.style = ['stroke', 'lineWidth']; +const line = (x, y, r) => { + return [ + ['M', x, y + r], + ['L', x, y - r], + ]; +}; +line.style = ['stroke', 'lineWidth']; +const cross = (x, y, r) => { + return [ + ['M', x - r, y - r], + ['L', x + r, y + r], + ['M', x + r, y - r], + ['L', x - r, y + r], + ]; +}; +cross.style = ['stroke', 'lineWidth']; +const tick = (x, y, r) => { + return [ + ['M', x - r / 2, y - r], + ['L', x + r / 2, y - r], + ['M', x, y - r], + ['L', x, y + r], + ['M', x - r / 2, y + r], + ['L', x + r / 2, y + r], + ]; +}; +tick.style = ['stroke', 'lineWidth']; +const plus = (x, y, r) => { + return [ + ['M', x - r, y], + ['L', x + r, y], + ['M', x, y - r], + ['L', x, y + r], + ]; +}; +plus.style = ['stroke', 'lineWidth']; +const hyphen = (x, y, r) => { + return [ + ['M', x - r, y], + ['L', x + r, y], + ]; +}; +hyphen.style = ['stroke', 'lineWidth']; +const dot = (x, y, r) => { + return [ + ['M', x - r, y], + ['L', x + r, y], + ]; +}; +dot.style = ['stroke', 'lineWidth']; +const dash = dot.bind(undefined); +dash.style = ['stroke', 'lineWidth']; +const smooth = (x, y, r) => { + return [ + ['M', x - r, y], + ['A', r / 2, r / 2, 0, 1, 1, x, y], + ['A', r / 2, r / 2, 0, 1, 0, x + r, y], + ]; +}; +smooth.style = ['stroke', 'lineWidth']; +const hv = (x, y, r) => { + return [ + ['M', x - r - 1, y - 2.5], + ['L', x, y - 2.5], + ['L', x, y + 2.5], + ['L', x + r + 1, y + 2.5], + ]; +}; +hv.style = ['stroke', 'lineWidth']; +const vh = (x, y, r) => { + return [ + ['M', x - r - 1, y + 2.5], + ['L', x, y + 2.5], + ['L', x, y - 2.5], + ['L', x + r + 1, y - 2.5], + ]; +}; +vh.style = ['stroke', 'lineWidth']; +const hvh = (x, y, r) => { + return [ + ['M', x - (r + 1), y + 2.5], + ['L', x - r / 2, y + 2.5], + ['L', x - r / 2, y - 2.5], + ['L', x + r / 2, y - 2.5], + ['L', x + r / 2, y + 2.5], + ['L', x + r + 1, y + 2.5], + ]; +}; +hvh.style = ['stroke', 'lineWidth']; +const vhv = (x, y, r) => { + return [ + ['M', x - 5, y + 2.5], + ['L', x - 5, y], + ['L', x, y], + ['L', x, y - 3], + ['L', x, y + 3], + ['L', x + 6.5, y + 3], + ]; +}; +vhv.style = ['stroke', 'lineWidth']; +exports.Symbols = new Map([ + ['bowtie', bowtie], + ['cross', cross], + ['dash', dash], + ['diamond', diamond], + ['dot', dot], + ['hexagon', hexagon], + ['hollowBowtie', hollowBowtie], + ['hollowDiamond', hollowDiamond], + ['hollowHexagon', hollowHexagon], + ['hollowPoint', hollowPoint], + ['hollowSquare', hollowSquare], + ['hollowTriangle', hollowTriangle], + ['hollowTriangleDown', hollowTriangleDown], + ['hv', hv], + ['hvh', hvh], + ['hyphen', hyphen], + ['line', line], + ['plus', plus], + ['point', point], + ['rect', rect], + ['smooth', smooth], + ['square', square], + ['tick', tick], + ['triangleDown', triangleDown], + ['triangle', triangle], + ['vh', vh], + ['vhv', vhv], +]); +function useMarker(type, _a) { + var { d, fill, lineWidth, path, stroke, color } = _a, style = __rest(_a, ["d", "fill", "lineWidth", "path", "stroke", "color"]); + const symbol = exports.Symbols.get(type) || exports.Symbols.get('point'); + return (...args) => { + const path = new g_1.Path({ + style: Object.assign(Object.assign({}, style), { d: symbol(...args), stroke: symbol.style.includes('stroke') ? color || stroke : '', fill: symbol.style.includes('fill') ? color || fill : '', lineWidth: symbol.style.includes('lineWidth') + ? lineWidth || lineWidth || 2 + : 0 }), + }); + return path; + }; +} +exports.useMarker = useMarker; +function registerSymbol(type, marker) { + exports.Symbols.set(type, marker); +} +exports.registerSymbol = registerSymbol; +function unregisterSymbol(type) { + exports.Symbols.delete(type); +} +exports.unregisterSymbol = unregisterSymbol; +//# sourceMappingURL=marker.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815900, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.kebabCase = exports.camelCase = void 0; +/** + * camelCase('foo-bar'); + * // => 'fooBar' + * @param s + */ +function camelCase(s) { + return s.replace(/-(\w)/g, function (_, letter) { + return letter.toUpperCase(); + }); +} +exports.camelCase = camelCase; +/** + * kebabCase('fooBar'); + * // => 'foo-bar' + * @param s + */ +function kebabCase(s) { + return s.replace(/([A-Z])/g, '-$1').toLowerCase(); +} +exports.kebabCase = kebabCase; +//# sourceMappingURL=string.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815901, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HollowDiamond = void 0; +const color_1 = require("./color"); +/** + * ◇ + */ +const HollowDiamond = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'diamond' }, options), context); +}; +exports.HollowDiamond = HollowDiamond; +exports.HollowDiamond.props = Object.assign({ defaultMarker: 'hollowDiamond' }, color_1.Color.props); +//# sourceMappingURL=hollowDiamond.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815902, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HollowHexagon = void 0; +const color_1 = require("./color"); +/** + * ⬡ + */ +const HollowHexagon = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'hexagon' }, options), context); +}; +exports.HollowHexagon = HollowHexagon; +exports.HollowHexagon.props = Object.assign({ defaultMarker: 'hollowHexagon' }, color_1.Color.props); +//# sourceMappingURL=hollowHexagon.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815903, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HollowPoint = void 0; +const color_1 = require("./color"); +/** + * ○ + */ +const HollowPoint = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'point' }, options), context); +}; +exports.HollowPoint = HollowPoint; +exports.HollowPoint.props = Object.assign({ defaultMarker: 'hollowPoint' }, color_1.Color.props); +//# sourceMappingURL=hollow.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815904, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HollowSquare = void 0; +const color_1 = require("./color"); +/** + * □ + */ +const HollowSquare = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'square' }, options), context); +}; +exports.HollowSquare = HollowSquare; +exports.HollowSquare.props = Object.assign({ defaultMarker: 'hollowSquare' }, color_1.Color.props); +//# sourceMappingURL=hollowSquare.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815905, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HollowTriangle = void 0; +const color_1 = require("./color"); +/** + * △ + */ +const HollowTriangle = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'triangle' }, options), context); +}; +exports.HollowTriangle = HollowTriangle; +exports.HollowTriangle.props = Object.assign({ defaultMarker: 'hollowTriangle' }, color_1.Color.props); +//# sourceMappingURL=hollowTriangle.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815906, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HollowTriangleDown = void 0; +const color_1 = require("./color"); +/** + * ▽ + */ +const HollowTriangleDown = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'triangle-down' }, options), context); +}; +exports.HollowTriangleDown = HollowTriangleDown; +exports.HollowTriangleDown.props = Object.assign({ defaultMarker: 'hollowTriangleDown' }, color_1.Color.props); +//# sourceMappingURL=hollowTriangleDown.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815907, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HollowCircle = void 0; +const circle_1 = require("./circle"); +/** + * ○ + */ +const HollowCircle = (options, context) => { + return (0, circle_1.BaseCircle)(Object.assign({ colorAttribute: 'stroke' }, options), context); +}; +exports.HollowCircle = HollowCircle; +exports.HollowCircle.props = Object.assign({ defaultMarker: 'hollowPoint' }, circle_1.Circle.props); +//# sourceMappingURL=hollowCircle.js.map +}, function(modId) { var map = {"./circle":1751263815908}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815908, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Circle = exports.BaseCircle = void 0; +const selection_1 = require("../../utils/selection"); +const utils_1 = require("../utils"); +const color_1 = require("./color"); +/** + * Render point in different coordinate. + */ +const BaseCircle = (options, context) => { + // Render border only when colorAttribute is stroke. + const { colorAttribute, mode = 'auto' } = options, style = __rest(options, ["colorAttribute", "mode"]); + const { coordinate, document } = context; + return (points, value, defaults) => { + const { lineWidth, color: defaultColor } = defaults; + const finalLineWidth = style.stroke ? lineWidth || 1 : lineWidth; + const { color = defaultColor, transform, opacity } = value; + const [cx, cy] = (0, utils_1.getOrigin)(points); + const r = (0, color_1.getRadius)(mode, points, value, coordinate); + const finalRadius = r || style.r || defaults.r; + return (0, selection_1.select)(document.createElement('circle', {})) + .call(utils_1.applyStyle, defaults) + .style('fill', 'transparent') + .style('cx', cx) + .style('cy', cy) + .style('r', finalRadius) + .style('lineWidth', finalLineWidth) + .style('transform', transform) + .style('transformOrigin', `${cx} ${cy}`) + .style('stroke', color) + .style((0, utils_1.toOpacityKey)(options), opacity) + .style(colorAttribute, color) + .call(utils_1.applyStyle, style) + .node(); + }; +}; +exports.BaseCircle = BaseCircle; +/** + * ● + */ +const Circle = (options, context) => { + return (0, exports.BaseCircle)(Object.assign({ colorAttribute: 'fill' }, options), context); +}; +exports.Circle = Circle; +exports.Circle.props = { + defaultMarker: 'circle', + defaultEnterAnimation: 'fadeIn', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=circle.js.map +}, function(modId) { var map = {"../../utils/selection":1751263815883,"../utils":1751263815885,"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815909, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Bowtie = void 0; +const color_1 = require("./color"); +/** + * ▶◀ + */ +const Bowtie = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill', symbol: 'bowtie' }, options), context); +}; +exports.Bowtie = Bowtie; +exports.Bowtie.props = Object.assign({ defaultMarker: 'bowtie' }, color_1.Color.props); +//# sourceMappingURL=bowtie.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815910, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Cross = void 0; +const color_1 = require("./color"); +/** + * ✕ + */ +const Cross = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'cross' }, options), context); +}; +exports.Cross = Cross; +exports.Cross.props = Object.assign({ defaultMarker: 'cross' }, color_1.Color.props); +//# sourceMappingURL=cross.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815911, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Diamond = void 0; +const color_1 = require("./color"); +/** + * ◆ + */ +const Diamond = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill', symbol: 'diamond' }, options), context); +}; +exports.Diamond = Diamond; +exports.Diamond.props = Object.assign({ defaultMarker: 'diamond' }, color_1.Color.props); +//# sourceMappingURL=diamond.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815912, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Hexagon = void 0; +const color_1 = require("./color"); +/** + * ⭓ + */ +const Hexagon = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill', symbol: 'hexagon' }, options), context); +}; +exports.Hexagon = Hexagon; +exports.Hexagon.props = Object.assign({ defaultMarker: 'hexagon' }, color_1.Color.props); +//# sourceMappingURL=hexagon.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815913, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Hyphen = void 0; +const color_1 = require("./color"); +/** + * - + */ +const Hyphen = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'hyphen' }, options), context); +}; +exports.Hyphen = Hyphen; +exports.Hyphen.props = Object.assign({ defaultMarker: 'hyphen' }, color_1.Color.props); +//# sourceMappingURL=hyphen.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815914, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Line = void 0; +const color_1 = require("./color"); +/** + * | + */ +const Line = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'line' }, options), context); +}; +exports.Line = Line; +exports.Line.props = Object.assign({ defaultMarker: 'line' }, color_1.Color.props); +//# sourceMappingURL=line.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815915, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Plus = void 0; +const color_1 = require("./color"); +/** + * + + */ +const Plus = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'plus' }, options), context); +}; +exports.Plus = Plus; +exports.Plus.props = Object.assign({ defaultMarker: 'plus' }, color_1.Color.props); +//# sourceMappingURL=plus.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815916, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Point = void 0; +const color_1 = require("./color"); +/** + * ● + */ +const Point = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill', symbol: 'point' }, options), context); +}; +exports.Point = Point; +exports.Point.props = Object.assign({ defaultMarker: 'point' }, color_1.Color.props); +//# sourceMappingURL=point.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815917, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Square = void 0; +const color_1 = require("./color"); +/** + * ■ + */ +const Square = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill', symbol: 'square' }, options), context); +}; +exports.Square = Square; +exports.Square.props = Object.assign({ defaultMarker: 'square' }, color_1.Color.props); +//# sourceMappingURL=square.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815918, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Tick = void 0; +const color_1 = require("./color"); +/** + * 工 + */ +const Tick = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'tick' }, options), context); +}; +exports.Tick = Tick; +exports.Tick.props = Object.assign({ defaultMarker: 'tick' }, color_1.Color.props); +//# sourceMappingURL=tick.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815919, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Triangle = void 0; +const color_1 = require("./color"); +/** + * ▲ + */ +const Triangle = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill', symbol: 'triangle' }, options), context); +}; +exports.Triangle = Triangle; +exports.Triangle.props = Object.assign({ defaultMarker: 'triangle' }, color_1.Color.props); +//# sourceMappingURL=triangle.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815920, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TriangleDown = void 0; +const color_1 = require("./color"); +/** + * ▼ + */ +const TriangleDown = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill', symbol: 'triangle-down' }, options), context); +}; +exports.TriangleDown = TriangleDown; +exports.TriangleDown.props = Object.assign({ defaultMarker: 'triangleDown' }, color_1.Color.props); +//# sourceMappingURL=triangleDown.js.map +}, function(modId) { var map = {"./color":1751263815898}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815921, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Vector = void 0; +const d3_path_1 = require("@antv/vendor/d3-path"); +const utils_1 = require("../utils"); +const selection_1 = require("../../utils/selection"); +/** + * Connect 2 points with a single line with arrow. + * -----> + */ +const Vector = (options, context) => { + const { arrow = true, arrowSize = '40%' } = options, style = __rest(options, ["arrow", "arrowSize"]); + const { document } = context; + return (points, value, defaults) => { + const { defaultColor } = defaults, rest = __rest(defaults, ["defaultColor"]); + const { color = defaultColor, transform } = value; + const [from, to] = points; + // Draw line + const path = (0, d3_path_1.path)(); + path.moveTo(...from); + path.lineTo(...to); + // Draw 2 arrows. + if (arrow) { + // Calculate arrow end point. + const [arrow1, arrow2] = (0, utils_1.arrowPoints)(from, to, { arrowSize }); + path.moveTo(...arrow1); + path.lineTo(...to); + path.lineTo(...arrow2); + } + return (0, selection_1.select)(document.createElement('path', {})) + .call(utils_1.applyStyle, rest) + .style('d', path.toString()) + .style('stroke', color) + .style('transform', transform) + .call(utils_1.applyStyle, style) + .node(); + }; +}; +exports.Vector = Vector; +exports.Vector.props = { + defaultMarker: 'line', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=vector.js.map +}, function(modId) { var map = {"../utils":1751263815885,"../../utils/selection":1751263815883}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815922, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Text = void 0; +const utils_1 = require("../../shape/utils"); +const selection_1 = require("../../utils/selection"); +const advance_1 = require("./advance"); +/** + * @todo autoRotate when in polar coordinate + */ +const Text = (options, context) => { + const { coordinate } = context; + return (points, value, defaults) => { + const { color, text = '', fontSize, rotate = 0, transform = '' } = value; + const textStyle = { + text: String(text), + stroke: color, + fill: color, + fontSize, + }; + const [[x0, y0]] = points; + return (0, selection_1.select)(new advance_1.Advance()) + .style('x', x0) + .style('y', y0) + .call(utils_1.applyStyle, defaults) + .style('transform', `${transform}rotate(${+rotate})`) + .style('coordCenter', coordinate.getCenter()) + .call(utils_1.applyStyle, textStyle) + .call(utils_1.applyStyle, options) + .node(); + }; +}; +exports.Text = Text; +exports.Text.props = { + defaultMarker: 'point', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=text.js.map +}, function(modId) { var map = {"../../shape/utils":1751263815885,"../../utils/selection":1751263815883,"./advance":1751263815923}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815923, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Advance = void 0; +const util_1 = require("@antv/util"); +const component_1 = require("@antv/component"); +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const createElement_1 = require("../../utils/createElement"); +const utils_1 = require("../utils"); +const helper_1 = require("../../utils/helper"); +const selection_1 = require("../../utils/selection"); +const vector_1 = require("../../utils/vector"); +function getConnectorPoint(shape) { + const { min: [x0, y0], max: [x1, y1], } = shape.getLocalBounds(); + let x = 0; + let y = 0; + if (x0 > 0) + x = x0; + if (x1 < 0) + x = x1; + if (y0 > 0) + y = y0; + if (y1 < 0) + y = y1; + return [x, y]; +} +function inferBackgroundBounds(textShape, padding = []) { + const [top = 0, right = 0, bottom = top, left = right] = padding; + const container = textShape.parentNode; + const angle = container.getEulerAngles(); + container.setEulerAngles(0); + const { min, halfExtents } = textShape.getLocalBounds(); + const [x, y] = min; + const [hw, hh] = halfExtents; + container.setEulerAngles(angle); + return { + x: x - left, + y: y - top, + width: hw * 2 + left + right, + height: hh * 2 + top + bottom, + }; +} +const cos = (p0, p1, p2) => { + const a = (0, vector_1.dist)(p0, p1); + const b = (0, vector_1.dist)(p1, p2); + const c = (0, vector_1.dist)(p2, p0); + return (Math.pow(a, 2) + Math.pow(b, 2) - Math.pow(c, 2)) / (2 * a * b); +}; +// A path from element to label. +// Adapted drawLabelLine from https://github.com/antvis/G2/blob/master/src/geometry/label/layout/pie/spider.ts +function inferConnectorPath(shape, end, control, coordCenter, left = true, top = true) { + const path = (points) => (0, d3_shape_1.line)()(points); + if (!end[0] && !end[1]) + return path([getConnectorPoint(shape), end]); + if (!control.length) + return path([[0, 0], end]); + const [inflection, start] = control; + const p1 = [...start]; + const p2 = [...inflection]; + // Label has been adjusted, so add offset to the label. + if (start[0] !== inflection[0]) { + const offset = left ? -4 : 4; + p1[1] = start[1]; + // For the label in the first quadrant. + if (top && !left) { + p1[0] = Math.max(inflection[0], start[0] - offset); + if (start[1] < inflection[1]) { + p2[1] = p1[1]; + } + else { + p2[1] = inflection[1]; + p2[0] = Math.max(p2[0], p1[0] - offset); + } + } + // For the label in the second quadrant. + if (!top && !left) { + p1[0] = Math.max(inflection[0], start[0] - offset); + if (start[1] > inflection[1]) { + p2[1] = p1[1]; + } + else { + p2[1] = inflection[1]; + p2[0] = Math.max(p2[0], p1[0] - offset); + } + } + // For the label in the third quadrant. + if (!top && left) { + p1[0] = Math.min(inflection[0], start[0] - offset); + if (start[1] > inflection[1]) { + p2[1] = p1[1]; + } + else { + p2[1] = inflection[1]; + p2[0] = Math.min(p2[0], p1[0] - offset); + } + } + // For the label in the fourth quadrant. + if (top && left) { + p1[0] = Math.min(inflection[0], start[0] - offset); + if (start[1] < inflection[1]) { + p2[1] = p1[1]; + } + else { + p2[1] = inflection[1]; + p2[0] = Math.min(p2[0], p1[0] - offset); + } + } + } + return path([start, p1, p2, inflection, end]); +} +exports.Advance = (0, createElement_1.createElement)((g) => { + const _a = g.attributes, { className, + // Do not pass className + class: _c, transform, rotate, labelTransform, labelTransformOrigin, x, y, x0 = x, y0 = y, text, background, connector, startMarker, endMarker, coordCenter, innerHTML } = _a, rest = __rest(_a, ["className", "class", "transform", "rotate", "labelTransform", "labelTransformOrigin", "x", "y", "x0", "y0", "text", "background", "connector", "startMarker", "endMarker", "coordCenter", "innerHTML"]); + g.style.transform = `translate(${x}, ${y})`; + // Position is invalid, do not render the UI, + // or clear previous elements. + if ([x, y, x0, y0].some((v) => !(0, util_1.isNumber)(v))) { + g.children.forEach((d) => d.remove()); + return; + } + const _b = (0, helper_1.subObject)(rest, 'background'), { padding } = _b, backgroundStyle = __rest(_b, ["padding"]); + const _d = (0, helper_1.subObject)(rest, 'connector'), { points: controlPoints = [] } = _d, connectorStyle = __rest(_d, ["points"]); + let textShape; + if (innerHTML) { + textShape = (0, selection_1.select)(g) + .maybeAppend('html', 'html', className) + .style('zIndex', 0) + .style('innerHTML', innerHTML) + .call(utils_1.applyStyle, Object.assign({ transform: labelTransform, transformOrigin: labelTransformOrigin }, rest)) + .node(); + } + else { + textShape = (0, selection_1.select)(g) + .maybeAppend('text', 'text') + .style('zIndex', 0) + .style('text', text) + .call(utils_1.applyStyle, Object.assign({ textBaseline: 'middle', transform: labelTransform, transformOrigin: labelTransformOrigin }, rest)) + .node(); + } + const rect = (0, selection_1.select)(g) + .maybeAppend('background', 'rect') + .style('zIndex', -1) + .call(utils_1.applyStyle, inferBackgroundBounds(textShape, padding)) + .call(utils_1.applyStyle, background ? backgroundStyle : {}) + .node(); + const left = +x0 < coordCenter[0]; + const top = +y0 < coordCenter[1]; + const end = [+x0 - +x, +y0 - +y]; + const connectorPath = inferConnectorPath(rect, end, controlPoints, coordCenter, left, top); + const markerStart = startMarker && + new component_1.Marker({ + id: 'startMarker', + style: Object.assign({ x: 0, y: 0 }, (0, helper_1.subObject)(rest, 'startMarker')), + }); + const markerEnd = endMarker && + new component_1.Marker({ + id: 'endMarker', + style: Object.assign({ x: 0, y: 0 }, (0, helper_1.subObject)(rest, 'endMarker')), + }); + (0, selection_1.select)(g) + .maybeAppend('connector', 'path') + .style('zIndex', 0) + .style('d', connectorPath) + .style('markerStart', markerStart) + .style('markerEnd', markerEnd) + .call(utils_1.applyStyle, connector ? connectorStyle : {}); +}); +//# sourceMappingURL=advance.js.map +}, function(modId) { var map = {"../../utils/createElement":1751263815891,"../utils":1751263815885,"../../utils/helper":1751263815829,"../../utils/selection":1751263815883,"../../utils/vector":1751263815873}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815924, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Badge = void 0; +const component_1 = require("@antv/component"); +const createElement_1 = require("../../utils/createElement"); +const helper_1 = require("../../utils/helper"); +const selection_1 = require("../../utils/selection"); +const utils_1 = require("../../shape/utils"); +/** + * Get the path to draw a built-in badge, which is like a balloon. + */ +function getPath(r) { + const offset = r / Math.sqrt(2); + const dy = r * Math.sqrt(2); + const [p0x, p0y] = [-offset, offset - dy]; + const [p1x, p1y] = [0, 0]; + const [p2x, p2y] = [offset, offset - dy]; + return [ + ['M', p0x, p0y], + ['A', r, r, 0, 1, 1, p2x, p2y], + ['L', p1x, p1y], + ['Z'], + ]; +} +function inferTextPosition(shape) { + const { min, max } = shape.getLocalBounds(); + return [(min[0] + max[0]) * 0.5, (min[1] + max[1]) * 0.5]; +} +const BadgeShape = (0, createElement_1.createElement)((g) => { + const _a = g.attributes, { class: className, x: x0, y: y0, transform } = _a, rest = __rest(_a, ["class", "x", "y", "transform"]); + const markerStyle = (0, helper_1.subObject)(rest, 'marker'); + const { size = 24 } = markerStyle; + const symbol = () => getPath(size / 2); + const bgShape = (0, selection_1.select)(g) + .maybeAppend('marker', () => new component_1.Marker({})) + .call((selection) => selection.node().update(Object.assign({ symbol }, markerStyle))) + .node(); + const [x, y] = inferTextPosition(bgShape); + (0, selection_1.select)(g) + .maybeAppend('text', 'text') + .style('x', x) + .style('y', y) + .call(utils_1.applyStyle, rest); +}); +const Badge = (options, context) => { + const style = __rest(options, []); + return (points, value, defaults) => { + const { color: defaultColor } = defaults, rest = __rest(defaults, ["color"]); + const { color = defaultColor, text = '' } = value; + const textStyle = { + text: String(text), + stroke: color, + fill: color, + }; + const [[x0, y0]] = points; + return (0, selection_1.select)(new BadgeShape()) + .call(utils_1.applyStyle, rest) + .style('transform', `translate(${x0},${y0})`) + .call(utils_1.applyStyle, textStyle) + .call(utils_1.applyStyle, style) + .node(); + }; +}; +exports.Badge = Badge; +exports.Badge.props = { + defaultMarker: 'point', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=badge.js.map +}, function(modId) { var map = {"../../utils/createElement":1751263815891,"../../utils/helper":1751263815829,"../../utils/selection":1751263815883,"../../shape/utils":1751263815885}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815925, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Tag = void 0; +const g_1 = require("@antv/g"); +const utils_1 = require("../../shape/utils"); +const selection_1 = require("../../utils/selection"); +/** + * @todo autoRotate when in polar coordinate + * Tag shape for Text mark, used in wordCloud plot. + */ +const Tag = (options, context) => { + const { coordinate } = context; + return (points, value, defaults) => { + const { color, text = '', fontSize, rotate = 0, transform = '' } = value; + const textStyle = { + text: String(text), + stroke: color, + fill: color, + fontSize, + textAlign: 'center', + textBaseline: 'middle', + }; + const [[x0, y0]] = points; + const n = (0, selection_1.select)(new g_1.Text()) + .style('x', x0) + .style('y', y0) + .call(utils_1.applyStyle, defaults) + .style('transformOrigin', 'center center') + .style('transform', `${transform}rotate(${rotate}deg)`) + .style('coordCenter', coordinate.getCenter()) + .call(utils_1.applyStyle, textStyle) + .call(utils_1.applyStyle, options) + .node(); + return n; + }; +}; +exports.Tag = Tag; +exports.Tag.props = { + defaultMarker: 'point', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=tag.js.map +}, function(modId) { var map = {"../../shape/utils":1751263815885,"../../utils/selection":1751263815883}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815926, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Area = void 0; +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const coordinate_1 = require("../../utils/coordinate"); +const curve_1 = require("./curve"); +const Area = (options, context) => { + const { coordinate } = context; + return (...params) => { + const curve = (0, coordinate_1.isPolar)(coordinate) ? d3_shape_1.curveLinearClosed : d3_shape_1.curveLinear; + return (0, curve_1.Curve)(Object.assign({ curve: curve }, options), context)(...params); + }; +}; +exports.Area = Area; +exports.Area.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'square' }); +//# sourceMappingURL=area.js.map +}, function(modId) { var map = {"../../utils/coordinate":1751263815882,"./curve":1751263815927}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815927, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Curve = void 0; +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const selection_1 = require("../../utils/selection"); +const coordinate_1 = require("../../utils/coordinate"); +const vector_1 = require("../../utils/vector"); +const utils_1 = require("../utils"); +const helper_1 = require("../../utils/helper"); +const createElement_1 = require("../../utils/createElement"); +/** + * Given a points sequence, split it into an array of defined points + * and an array of undefined segments. + * + * Input - [p0, p1, p2, p3, p4, p5], p1 ~ p2 is `Y1`, p3 ~ p5 is `Y0`. + * Output - When all of Y1 & Y0 is defined, move into defined points, or else undefined segments. + */ +function segmentation(points, defined) { + const definedPointsY1 = []; + const definedPointsY0 = []; + const segments = []; + let m = false; // Is in a undefined sequence. + let dp = null; // The previous defined point. + const mid = points.length / 2; + for (let i = 0; i < mid; i++) { + const y1 = points[i]; + const y0 = points[i + mid]; + // If current point is a undefined point, + // enter a undefined sequence. + if ([...y1, ...y0].some((v) => !defined(v))) + m = true; + else { + definedPointsY1.push(y1); + definedPointsY0.push(y0); + // If current point is a defined point, + // and is in a undefined sequence, save + // the two closest defined points as this + // undefined sequence and exit it. + if (m && dp) { + m = false; + const [dpy1, dpy0] = dp; + segments.push([dpy1, y1, dpy0, y0]); + } + // Update the previous defined point. + dp = [y1, y0]; + } + } + return [definedPointsY1.concat(definedPointsY0), segments]; +} +const DoubleArea = (0, createElement_1.createElement)((g) => { + const { areaPath, connectPath, areaStyle, connectStyle } = g.attributes; + const document = g.ownerDocument; + (0, selection_1.select)(g) + .maybeAppend('connect-path', () => document.createElement('path', {})) + .style('d', connectPath) + .call(utils_1.applyStyle, connectStyle); + (0, selection_1.select)(g) + .maybeAppend('area-path', () => document.createElement('path', {})) + .style('d', areaPath) + .call(utils_1.applyStyle, areaStyle); +}); +const Curve = (options, context) => { + const { curve, gradient = false, defined = (d) => !Number.isNaN(d) && d !== undefined && d !== null, connect: connectNulls = false } = options, style = __rest(options, ["curve", "gradient", "defined", "connect"]); + const { coordinate, document } = context; + return (P, value, defaults) => { + const { color: defaultColor } = defaults; + const { color = defaultColor, seriesColor: sc, seriesX: sx, seriesY: sy, } = value; + const tpShape = (0, coordinate_1.isTranspose)(coordinate); + const transform = (0, utils_1.getTransform)(coordinate, value); + const fill = gradient && sc + ? (0, utils_1.computeGradient)(sc, sx, sy, gradient, undefined, tpShape) + : color; + const finalStyle = Object.assign(Object.assign(Object.assign(Object.assign({}, defaults), { stroke: fill, fill: fill }), (transform && { transform })), style); + const [DP, MS] = segmentation(P, defined); + const connectStyle = (0, helper_1.subObject)(finalStyle, 'connect'); + const missing = !!MS.length; + const getPathNode = (path) => { + return (0, selection_1.select)(document.createElement('path', {})) + .style('d', path || '') + .call(utils_1.applyStyle, finalStyle) + .node(); + }; + if (!(0, coordinate_1.isPolar)(coordinate)) { + /** + * Draw area shape by points. + */ + const areaPath = (points) => { + const Y1 = points.slice(0, points.length / 2); + const Y0 = points.slice(points.length / 2); + return tpShape + ? (0, d3_shape_1.area)() + .y((_, idx) => Y1[idx][1]) + .x1((_, idx) => Y1[idx][0]) + .x0((_, idx) => Y0[idx][0]) + .defined((_, idx) => [...Y1[idx], ...Y0[idx]].every(defined)) + .curve(curve)(Y1) + : (0, d3_shape_1.area)() + .x((_, idx) => Y1[idx][0]) + .y1((_, idx) => Y1[idx][1]) + .y0((_, idx) => Y0[idx][1]) + .defined((_, idx) => [...Y1[idx], ...Y0[idx]].every(defined)) + .curve(curve)(Y1); + }; + // Draw one area of connected defined points. + if (!missing || (connectNulls && !Object.keys(connectStyle).length)) { + return getPathNode(areaPath(DP)); + } + // Draw one area of unconnected defined points. + if (missing && !connectNulls) { + return getPathNode(areaPath(P)); + } + // Draw two area. + // One for unconnected defined points. + // One for connected segments. + return (0, selection_1.select)(new DoubleArea()) + .style('areaStyle', finalStyle) + .style('connectStyle', Object.assign(Object.assign({}, connectStyle), style)) + .style('areaPath', areaPath(P)) + .style('connectPath', MS.map(areaPath).join('')) + .node(); + } + else { + /** + * Draw areaRadial shape by points. + */ + const areaRadialPath = (points) => { + const center = coordinate.getCenter(); + const Y1 = points.slice(0, points.length / 2); + const Y0 = points.slice(points.length / 2); + return (0, d3_shape_1.areaRadial)() + .angle((_, idx) => (0, vector_1.angleWithQuadrant)((0, vector_1.sub)(Y1[idx], center))) + .outerRadius((_, idx) => (0, vector_1.dist)(Y1[idx], center)) + .innerRadius((_, idx) => (0, vector_1.dist)(Y0[idx], center)) + .defined((_, idx) => [...Y1[idx], ...Y0[idx]].every(defined)) + .curve(curve)(Y0); + }; + // Draw one area of connected defined points. + if (!missing || (connectNulls && !Object.keys(connectStyle).length)) { + return getPathNode(areaRadialPath(DP)); + } + // Draw one area of unconnected defined points. + if (missing && !connectNulls) { + return getPathNode(areaRadialPath(P)); + } + // Draw two area. + // One for unconnected defined points. + // One for connected segments. + return (0, selection_1.select)(new DoubleArea()) + .style('areaStyle', finalStyle) + .style('connectStyle', Object.assign(Object.assign({}, connectStyle), style)) + .style('areaPath', areaRadialPath(P)) + .style('connectPath', MS.map(areaRadialPath).join('')) + .node(); + } + }; +}; +exports.Curve = Curve; +exports.Curve.props = { + defaultMarker: 'smooth', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=curve.js.map +}, function(modId) { var map = {"../../utils/selection":1751263815883,"../../utils/coordinate":1751263815882,"../../utils/vector":1751263815873,"../utils":1751263815885,"../../utils/helper":1751263815829,"../../utils/createElement":1751263815891}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815928, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Smooth = void 0; +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const coordinate_1 = require("../../utils/coordinate"); +const curve_1 = require("./curve"); +const Smooth = (options, context) => { + const rest = __rest(options, []); + const { coordinate } = context; + return (...params) => { + const curve = (0, coordinate_1.isPolar)(coordinate) + ? d3_shape_1.curveCatmullRomClosed + : (0, coordinate_1.isTranspose)(coordinate) + ? d3_shape_1.curveMonotoneY + : d3_shape_1.curveMonotoneX; + return (0, curve_1.Curve)(Object.assign({ curve }, rest), context)(...params); + }; +}; +exports.Smooth = Smooth; +exports.Smooth.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'smooth' }); +//# sourceMappingURL=smooth.js.map +}, function(modId) { var map = {"../../utils/coordinate":1751263815882,"./curve":1751263815927}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815929, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HVH = void 0; +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const curve_1 = require("./curve"); +const HVH = (options, context) => { + return (...params) => { + return (0, curve_1.Curve)(Object.assign({ curve: d3_shape_1.curveStep }, options), context)(...params); + }; +}; +exports.HVH = HVH; +exports.HVH.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'hvh' }); +//# sourceMappingURL=hvh.js.map +}, function(modId) { var map = {"./curve":1751263815927}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815930, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.VH = void 0; +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const curve_1 = require("./curve"); +const VH = (options, context) => { + return (...params) => { + return (0, curve_1.Curve)(Object.assign({ curve: d3_shape_1.curveStepBefore }, options), context)(...params); + }; +}; +exports.VH = VH; +exports.VH.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'vh' }); +//# sourceMappingURL=vh.js.map +}, function(modId) { var map = {"./curve":1751263815927}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815931, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HV = void 0; +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const curve_1 = require("./curve"); +const HV = (options, context) => { + return (...params) => { + return (0, curve_1.Curve)(Object.assign({ curve: d3_shape_1.curveStepAfter }, options), context)(...params); + }; +}; +exports.HV = HV; +exports.HV.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'hv' }); +//# sourceMappingURL=hv.js.map +}, function(modId) { var map = {"./curve":1751263815927}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815932, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Link = void 0; +const vector_1 = require("../../shape/vector/vector"); +/** + * Connect 2 points with a single line with arrow. + * -----> + */ +const Link = (options, context) => { + const { arrow = false } = options; + return (...params) => { + return (0, vector_1.Vector)(Object.assign(Object.assign({}, options), { arrow }), context)(...params); + }; +}; +exports.Link = Link; +exports.Link.props = { + defaultMarker: 'line', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=link.js.map +}, function(modId) { var map = {"../../shape/vector/vector":1751263815921}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815933, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Smooth = void 0; +const d3_path_1 = require("@antv/vendor/d3-path"); +const utils_1 = require("../utils"); +const selection_1 = require("../../utils/selection"); +/** + * Connect 2 points with a smooth line, used in tree. + */ +const Smooth = (options, context) => { + const style = __rest(options, []); + const { document } = context; + return (points, value, defaults) => { + const { color: defaultColor } = defaults, rest = __rest(defaults, ["color"]); + const { color = defaultColor, transform } = value; + const [from, to] = points; + const path = (0, d3_path_1.path)(); + path.moveTo(from[0], from[1]); + path.bezierCurveTo(from[0] / 2 + to[0] / 2, from[1], from[0] / 2 + to[0] / 2, to[1], to[0], to[1]); + return (0, selection_1.select)(document.createElement('path', {})) + .call(utils_1.applyStyle, rest) + .style('d', path.toString()) + .style('stroke', color) + .style('transform', transform) + .call(utils_1.applyStyle, style) + .node(); + }; +}; +exports.Smooth = Smooth; +exports.Smooth.props = { + defaultMarker: 'smooth', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=smooth.js.map +}, function(modId) { var map = {"../utils":1751263815885,"../../utils/selection":1751263815883}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815934, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.VHV = void 0; +const d3_path_1 = require("@antv/vendor/d3-path"); +const utils_1 = require("../utils"); +const selection_1 = require("../../utils/selection"); +const coordinate_1 = require("../../utils/coordinate"); +const vector_1 = require("../../utils/vector"); +/** + * Get vhv path in different coordinate. + */ +function getVHVPath(from, to, coordinate, ratio) { + const path = (0, d3_path_1.path)(); + if ((0, coordinate_1.isPolar)(coordinate)) { + const center = coordinate.getCenter(); + const a = (0, vector_1.dist)(from, center); + const b = (0, vector_1.dist)(to, center); + const radius = (b - a) * ratio + a; + path.moveTo(from[0], from[1]); + (0, utils_1.appendArc)(path, from, to, center, radius); + path.lineTo(to[0], to[1]); + return path; + } + if ((0, coordinate_1.isTranspose)(coordinate)) { + path.moveTo(from[0], from[1]); + // VHV in x. + path.lineTo(from[0] + (to[0] - from[0]) * ratio, from[1]); + path.lineTo(from[0] + (to[0] - from[0]) * ratio, to[1]); + path.lineTo(to[0], to[1]); + return path; + } + path.moveTo(from[0], from[1]); + // VHV in y. + path.lineTo(from[0], from[1] + (to[1] - from[1]) * ratio); + path.lineTo(to[0], from[1] + (to[1] - from[1]) * ratio); + path.lineTo(to[0], to[1]); + return path; +} +/** + * Connect 2 points with a VHV line, used in tree. + */ +const VHV = (options, context) => { + const { cornerRatio = 1 / 3 } = options, style = __rest(options, ["cornerRatio"]); + const { coordinate, document } = context; + return (points, value, defaults) => { + const { defaultColor } = defaults, rest = __rest(defaults, ["defaultColor"]); + const { color = defaultColor, transform } = value; + const [from, to] = points; + const path = getVHVPath(from, to, coordinate, cornerRatio); + return (0, selection_1.select)(document.createElement('path', {})) + .call(utils_1.applyStyle, rest) + .style('d', path.toString()) + .style('stroke', color) + .style('transform', transform) + .call(utils_1.applyStyle, style) + .node(); + }; +}; +exports.VHV = VHV; +exports.VHV.props = { + defaultMarker: 'vhv', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=vhv.js.map +}, function(modId) { var map = {"../utils":1751263815885,"../../utils/selection":1751263815883,"../../utils/coordinate":1751263815882,"../../utils/vector":1751263815873}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815935, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Arc = void 0; +const d3_path_1 = require("@antv/vendor/d3-path"); +const utils_1 = require("../utils"); +const selection_1 = require("../../utils/selection"); +const coordinate_1 = require("../../utils/coordinate"); +const vector_1 = require("../../utils/vector"); +/** + * Connect points for 2 points: + * - In rect, draw half circle. + * - In polar, draw quadratic curve. + */ +const Arc = (options, context) => { + const style = __rest(options, []); + const { coordinate, document } = context; + return (points, value, defaults) => { + const { color: defaultColor } = defaults, rest = __rest(defaults, ["color"]); + const { color = defaultColor, transform } = value; + const [from, to] = points; + const path = (0, d3_path_1.path)(); + path.moveTo(from[0], from[1]); + if ((0, coordinate_1.isPolar)(coordinate)) { + const center = coordinate.getCenter(); + path.quadraticCurveTo(center[0], center[1], to[0], to[1]); + } + else { + const center = (0, vector_1.mid)(from, to); + const raduis = (0, vector_1.dist)(from, to) / 2; + (0, utils_1.appendArc)(path, from, to, center, raduis); + } + return (0, selection_1.select)(document.createElement('path', {})) + .call(utils_1.applyStyle, rest) + .style('d', path.toString()) + .style('stroke', color) + .style('transform', transform) + .call(utils_1.applyStyle, style) + .node(); + }; +}; +exports.Arc = Arc; +exports.Arc.props = { + defaultMarker: 'smooth', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=arc.js.map +}, function(modId) { var map = {"../utils":1751263815885,"../../utils/selection":1751263815883,"../../utils/coordinate":1751263815882,"../../utils/vector":1751263815873}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815936, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Image = void 0; +const utils_1 = require("../utils"); +const selection_1 = require("../../utils/selection"); +const utils_2 = require("../../mark/utils"); +const Image = (options, context) => { + const { coordinate, document } = context; + return (points, value, defaults) => { + const { color: defaultColor } = defaults, rest = __rest(defaults, ["color"]); + const { color = defaultColor, src = '', size = 32, transform = '' } = value; + let { width = size, height = size } = options; + const [[x0, y0]] = points; + // Support percentage width, height. + const [w, h] = coordinate.getSize(); + width = typeof width === 'string' ? (0, utils_2.p)(width) * w : width; + height = typeof height === 'string' ? (0, utils_2.p)(height) * h : height; + const x = x0 - Number(width) / 2; + const y = y0 - Number(height) / 2; + return (0, selection_1.select)(document.createElement('image', {})) + .call(utils_1.applyStyle, rest) + .style('x', x) + .style('y', y) + .style('src', src) + .style('stroke', color) + .style('transform', transform) + .call(utils_1.applyStyle, options) + .style('width', width) + .style('height', height) + .node(); + }; +}; +exports.Image = Image; +exports.Image.props = { + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=image.js.map +}, function(modId) { var map = {"../utils":1751263815885,"../../utils/selection":1751263815883,"../../mark/utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815937, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.initializeData = exports.valueof = exports.field = exports.visualMark = exports.p = exports.createBandOffset = exports.bandWidth = exports.basePostInference = exports.basePreInference = exports.baseAnnotationChannels = exports.tooltipXd = exports.tooltip1d = exports.tooltip2d = exports.tooltip3d = exports.baseGeometryChannels = exports.baseChannels = void 0; +const transform_1 = require("../transform"); +function baseChannels(options = {}) { + const { shapes } = options; + return [ + { name: 'color' }, + { name: 'opacity' }, + { name: 'shape', range: shapes }, + { name: 'enterType' }, + { name: 'enterDelay', scaleKey: 'enter' }, + { name: 'enterDuration', scaleKey: 'enter' }, + { name: 'enterEasing' }, + { name: 'key', scale: 'identity' }, + { name: 'groupKey', scale: 'identity' }, + { name: 'label', scale: 'identity' }, + ]; +} +exports.baseChannels = baseChannels; +function baseGeometryChannels(options = {}) { + return [...baseChannels(options), { name: 'title', scale: 'identity' }]; +} +exports.baseGeometryChannels = baseGeometryChannels; +function tooltip3d() { + return [ + { type: transform_1.MaybeTitle, channel: 'color' }, + { type: transform_1.MaybeTooltip, channel: ['x', 'y', 'z'] }, + ]; +} +exports.tooltip3d = tooltip3d; +function tooltip2d() { + return [ + { type: transform_1.MaybeTitle, channel: 'color' }, + { type: transform_1.MaybeTooltip, channel: ['x', 'y'] }, + ]; +} +exports.tooltip2d = tooltip2d; +function tooltip1d() { + return [ + { type: transform_1.MaybeTitle, channel: 'x' }, + { type: transform_1.MaybeTooltip, channel: ['y'] }, + ]; +} +exports.tooltip1d = tooltip1d; +function tooltipXd() { + return [ + { type: transform_1.MaybeTitle, channel: 'color' }, + { type: transform_1.MaybeTooltip, channel: ['position'] }, + ]; +} +exports.tooltipXd = tooltipXd; +function baseAnnotationChannels(options = {}) { + return baseChannels(options); +} +exports.baseAnnotationChannels = baseAnnotationChannels; +function basePreInference() { + return [{ type: transform_1.MaybeKey }]; +} +exports.basePreInference = basePreInference; +function basePostInference() { + return []; +} +exports.basePostInference = basePostInference; +function bandWidth(scale, x) { + return scale.getBandWidth(scale.invert(x)); +} +exports.bandWidth = bandWidth; +function createBandOffset(scale, value, options = {}) { + const { x: X, y: Y, series: S } = value; + const { x, y, series } = scale; + const { style: { bandOffset = series ? 0 : 0.5, bandOffsetX = bandOffset, bandOffsetY = bandOffset, } = {}, } = options; + const isBandX = !!(x === null || x === void 0 ? void 0 : x.getBandWidth); + const isBandY = !!(y === null || y === void 0 ? void 0 : y.getBandWidth); + const isSeries = !!(series === null || series === void 0 ? void 0 : series.getBandWidth); + if (!isBandX && !isBandY) + return (d) => d; + return (d, i) => { + const widthX = isBandX ? bandWidth(x, X[i]) : 0; + const widthY = isBandY ? bandWidth(y, Y[i]) : 0; + const f = () => (bandWidth(series, S[i]) / 2 + +S[i]) * widthX; + const offset = isSeries && S ? f() : 0; + const [x0, y0] = d; + return [x0 + bandOffsetX * widthX + offset, y0 + bandOffsetY * widthY]; + }; +} +exports.createBandOffset = createBandOffset; +function p(d) { + return parseFloat(d) / 100; +} +exports.p = p; +function visualMark(index, scale, value, coordinate) { + const { x: X, y: Y } = value; + const { innerWidth, innerHeight } = coordinate.getOptions(); + const P = Array.from(index, (i) => { + const x0 = X[i]; + const y0 = Y[i]; + const x = typeof x0 === 'string' ? p(x0) * innerWidth : +x0; + const y = typeof y0 === 'string' ? p(y0) * innerHeight : +y0; + return [[x, y]]; + }); + return [index, P]; +} +exports.visualMark = visualMark; +function field(encode) { + return typeof encode === 'function' ? encode : (d) => d[encode]; +} +exports.field = field; +function valueof(data, encode) { + return Array.from(data, field(encode)); +} +exports.valueof = valueof; +function initializeData(data, encode) { + const { source = (d) => d.source, target = (d) => d.target, value = (d) => d.value, } = encode; + const { links, nodes } = data; + const LS = valueof(links, source); + const LT = valueof(links, target); + const LV = valueof(links, value); + return { + links: links.map((_, i) => ({ + target: LT[i], + source: LS[i], + value: LV[i], + })), + nodes: nodes || Array.from(new Set([...LS, ...LT]), (key) => ({ key })), + }; +} +exports.initializeData = initializeData; +//# sourceMappingURL=utils.js.map +}, function(modId) { var map = {"../transform":1751263815823}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815938, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Polygon = void 0; +const d3_path_1 = require("@antv/vendor/d3-path"); +const coordinate_1 = require("../../utils/coordinate"); +const utils_1 = require("../utils"); +const selection_1 = require("../../utils/selection"); +const vector_1 = require("../../utils/vector"); +function getPolygonPath(points, coordinate) { + const path = (0, d3_path_1.path)(); + // In polar, draw arc. + if ((0, coordinate_1.isPolar)(coordinate)) { + const center = coordinate.getCenter(); + const closedPoints = [...points, points[0]]; + // Calculate dist array for cache. + const dists = closedPoints.map((p) => (0, vector_1.dist)(p, center)); + closedPoints.forEach((curr, idx) => { + if (idx === 0) { + path.moveTo(curr[0], curr[1]); + return; + } + const currDist = dists[idx]; + const prev = points[idx - 1]; + const prevDist = dists[idx - 1]; + // When radius is equal, draw 2 point with arc. + // todo: choose a minimum value. + if (prevDist !== undefined && Math.abs(currDist - prevDist) < 1e-10) { + (0, utils_1.appendArc)(path, prev, curr, center, currDist); + } + else { + path.lineTo(curr[0], curr[1]); + } + }); + path.closePath(); + return path; + } + // In rect, draw polygon. + return (0, utils_1.appendPolygon)(path, points); +} +const Polygon = (options, context) => { + const { coordinate, document } = context; + return (points, value, defaults) => { + const { color: defaultColor } = defaults, rest = __rest(defaults, ["color"]); + const { color = defaultColor, transform } = value; + const path = getPolygonPath(points, coordinate); + return (0, selection_1.select)(document.createElement('path', {})) + .call(utils_1.applyStyle, rest) + .style('d', path.toString()) + .style('stroke', color) + .style('fill', color) + .style('transform', transform) + .call(utils_1.applyStyle, options) + .node(); + }; +}; +exports.Polygon = Polygon; +exports.Polygon.props = { + defaultMarker: 'square', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=polygon.js.map +}, function(modId) { var map = {"../../utils/coordinate":1751263815882,"../utils":1751263815885,"../../utils/selection":1751263815883,"../../utils/vector":1751263815873}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815939, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Ribbon = void 0; +const d3_path_1 = require("@antv/vendor/d3-path"); +const utils_1 = require("../utils"); +const selection_1 = require("../../utils/selection"); +const coordinate_1 = require("../../utils/coordinate"); +const vector_1 = require("../../utils/vector"); +function getRibbonPath(points, coordinate) { + const [p0, p1, p2, p3] = points; + const path = (0, d3_path_1.path)(); + // In polar, draw shape only for Chord. + if ((0, coordinate_1.isPolar)(coordinate)) { + const center = coordinate.getCenter(); + const radius = (0, vector_1.dist)(center, p0); + path.moveTo(p0[0], p0[1]); + // p0 -> p2 + path.quadraticCurveTo(center[0], center[1], p2[0], p2[1]); + // p2 -> p3 + (0, utils_1.appendArc)(path, p2, p3, center, radius); + // p3 -> p1 + path.quadraticCurveTo(center[0], center[1], p1[0], p1[1]); + // p1 -> p0 + (0, utils_1.appendArc)(path, p1, p0, center, radius); + path.closePath(); + return path; + } + // In Rect, draw shape for Sankey. + path.moveTo(p0[0], p0[1]); + path.bezierCurveTo(p0[0] / 2 + p2[0] / 2, p0[1], p0[0] / 2 + p2[0] / 2, p2[1], p2[0], p2[1]); + path.lineTo(p3[0], p3[1]); + path.bezierCurveTo(p3[0] / 2 + p1[0] / 2, p3[1], p3[0] / 2 + p1[0] / 2, p1[1], p1[0], p1[1]); + path.lineTo(p0[0], p0[1]); + path.closePath(); + return path; +} +/** + * Connect points for 4 points: + * - In rect, draw ribbon used in Sankey. + * - In polar, draw arc used in Chord. + */ +const Ribbon = (options, context) => { + const style = __rest(options, []); + const { coordinate, document } = context; + return (points, value, defaults) => { + const { color: defaultColor } = defaults, rest = __rest(defaults, ["color"]); + const { color = defaultColor, transform } = value; + const path = getRibbonPath(points, coordinate); + return (0, selection_1.select)(document.createElement('path', {})) + .call(utils_1.applyStyle, rest) + .style('d', path.toString()) + .style('fill', color || defaultColor) + .style('stroke', color || defaultColor) + .style('transform', transform) + .call(utils_1.applyStyle, style) + .node(); + }; +}; +exports.Ribbon = Ribbon; +exports.Ribbon.props = { + defaultMarker: 'square', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=ribbon.js.map +}, function(modId) { var map = {"../utils":1751263815885,"../../utils/selection":1751263815883,"../../utils/coordinate":1751263815882,"../../utils/vector":1751263815873}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815940, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Box = void 0; +const d3_path_1 = require("@antv/vendor/d3-path"); +const utils_1 = require("../utils"); +const selection_1 = require("../../utils/selection"); +const coordinate_1 = require("../../utils/coordinate"); +const vector_1 = require("../../utils/vector"); +function getPath(points, coordinate) { + const path = (0, d3_path_1.path)(); + if (!(0, coordinate_1.isPolar)(coordinate)) { + path.moveTo(...points[0]); + path.lineTo(...points[1]); + path.moveTo(...points[2]); + path.lineTo(...points[3]); + path.moveTo(...points[4]); + path.lineTo(...points[5]); + path.lineTo(...points[6]); + path.lineTo(...points[7]); + path.closePath(); + path.moveTo(...points[8]); + path.lineTo(...points[9]); + path.moveTo(...points[10]); + path.lineTo(...points[11]); + path.moveTo(...points[12]); + path.lineTo(...points[13]); + } + else { + // In polar coordinate. + const center = coordinate.getCenter(); + const [x, y] = center; + const startAngle = (0, vector_1.angle)((0, vector_1.sub)(points[0], center)); + const endAngle = (0, vector_1.angle)((0, vector_1.sub)(points[1], center)); + const radiusHigh = (0, vector_1.dist)(center, points[2]); + const radiusQ3 = (0, vector_1.dist)(center, points[3]); + const radiusMedian = (0, vector_1.dist)(center, points[8]); + const radiusQ1 = (0, vector_1.dist)(center, points[10]); + const radiusLow = (0, vector_1.dist)(center, points[11]); + path.moveTo(...points[0]); + path.arc(x, y, radiusHigh, startAngle, endAngle); + path.arc(x, y, radiusHigh, endAngle, startAngle, true); + path.moveTo(...points[2]); + path.lineTo(...points[3]); + path.moveTo(...points[4]); + path.arc(x, y, radiusQ3, startAngle, endAngle); // 4 -> 5 + path.lineTo(...points[6]); // 5 -> 6 + path.arc(x, y, radiusQ1, endAngle, startAngle, true); // 6 -> 7 + path.closePath(); + path.moveTo(...points[8]); + path.arc(x, y, radiusMedian, startAngle, endAngle); // 8 -> 9 + path.arc(x, y, radiusMedian, endAngle, startAngle, true); // 9 -> 8 + path.moveTo(...points[10]); + path.lineTo(...points[11]); + path.moveTo(...points[12]); + path.arc(x, y, radiusLow, startAngle, endAngle); // 12 -> 13 + path.arc(x, y, radiusLow, endAngle, startAngle, true); // 13 -> 12 + } + return path; +} +const Box = (options, context) => { + const { coordinate, document } = context; + return (points, value, defaults) => { + const { color, transform } = value; + const { color: defaultColor, fill = defaultColor, stroke = defaultColor } = defaults, rest = __rest(defaults, ["color", "fill", "stroke"]); + const path = getPath(points, coordinate); + return (0, selection_1.select)(document.createElement('path', {})) + .call(utils_1.applyStyle, rest) + .style('d', path.toString()) + .style('stroke', stroke) + .style('fill', color || fill) + .style('transform', transform) + .call(utils_1.applyStyle, options) + .node(); + }; +}; +exports.Box = Box; +exports.Box.props = { + defaultMarker: 'point', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=box.js.map +}, function(modId) { var map = {"../utils":1751263815885,"../../utils/selection":1751263815883,"../../utils/coordinate":1751263815882,"../../utils/vector":1751263815873}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815941, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Violin = void 0; +const d3_path_1 = require("@antv/vendor/d3-path"); +const utils_1 = require("../utils"); +const selection_1 = require("../../utils/selection"); +const coordinate_1 = require("../../utils/coordinate"); +const vector_1 = require("../../utils/vector"); +function getPath(p, coordinate, size = 4) { + const path = (0, d3_path_1.path)(); + if (!(0, coordinate_1.isPolar)(coordinate)) { + path.moveTo(...p[2]); + path.lineTo(...p[3]); + path.lineTo(p[3][0] - size, p[3][1]); + path.lineTo(p[10][0] - size, p[10][1]); + path.lineTo(p[10][0] + size, p[10][1]); + path.lineTo(p[3][0] + size, p[3][1]); + path.lineTo(...p[3]); + path.closePath(); + path.moveTo(...p[10]); + path.lineTo(...p[11]); + path.moveTo(p[3][0] + size / 2, p[8][1]); + path.arc(p[3][0], p[8][1], size / 2, 0, Math.PI * 2); + path.closePath(); + return path; + } + const center = coordinate.getCenter(); + const [x, y] = center; + const radiusQ3 = (0, vector_1.dist)(center, p[3]); + const radiusMedian = (0, vector_1.dist)(center, p[8]); + const radiusQ1 = (0, vector_1.dist)(center, p[10]); + const middleAngle = (0, vector_1.angle)((0, vector_1.sub)(p[2], center)); + const rectAngle = Math.asin(size / radiusMedian); + const startAngle = middleAngle - rectAngle; + const endAngle = middleAngle + rectAngle; + path.moveTo(...p[2]); + path.lineTo(...p[3]); + path.moveTo(Math.cos(startAngle) * radiusQ3 + x, Math.sin(startAngle) * radiusQ3 + y); + path.arc(x, y, radiusQ3, startAngle, endAngle); + path.lineTo(Math.cos(endAngle) * radiusQ1 + x, Math.sin(endAngle) * radiusQ1 + y); + path.arc(x, y, radiusQ1, endAngle, startAngle, true); + path.lineTo(Math.cos(startAngle) * radiusQ3 + x, Math.sin(startAngle) * radiusQ3 + y); + path.closePath(); + path.moveTo(...p[10]); + path.lineTo(...p[11]); + const a = (startAngle + endAngle) / 2; + path.moveTo(Math.cos(a) * (radiusMedian + size / 2) + x, Math.sin(a) * (radiusMedian + size / 2) + y); + path.arc(Math.cos(a) * radiusMedian + x, Math.sin(a) * radiusMedian + y, size / 2, a, Math.PI * 2 + a); + path.closePath(); + return path; +} +const Violin = (options, context) => { + const { coordinate, document } = context; + return (points, value, defaults) => { + const { color, transform } = value; + // TODO: how to setting it by size channel. + const size = 4; + const { color: defaultColor, fill = defaultColor, stroke = defaultColor } = defaults, rest = __rest(defaults, ["color", "fill", "stroke"]); + const path = getPath(points, coordinate, size); + return (0, selection_1.select)(document.createElement('path', {})) + .call(utils_1.applyStyle, rest) + .style('d', path.toString()) + .style('stroke', stroke) + .style('fill', color || fill) + .style('transform', transform) + .call(utils_1.applyStyle, options) + .node(); + }; +}; +exports.Violin = Violin; +exports.Violin.props = { + defaultMarker: 'point', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=violin.js.map +}, function(modId) { var map = {"../utils":1751263815885,"../../utils/selection":1751263815883,"../../utils/coordinate":1751263815882,"../../utils/vector":1751263815873}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815942, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Line = void 0; +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const coordinate_1 = require("../../utils/coordinate"); +const selection_1 = require("../../utils/selection"); +const vector_1 = require("../../utils/vector"); +const helper_1 = require("../../utils/helper"); +const utils_1 = require("../utils"); +function getArrowMarker(document, arrowSize, arrowStyle) { + const arrowMarker = document.createElement('path', { + style: Object.assign({ d: `M ${arrowSize},${arrowSize} L -${arrowSize},0 L ${arrowSize},-${arrowSize} L 0,0 Z`, transformOrigin: 'center' }, arrowStyle), + }); + return arrowMarker; +} +function getPath(points, coordinate) { + if (!(0, coordinate_1.isPolar)(coordinate)) + return (0, d3_shape_1.line)() + .x((d) => d[0]) + .y((d) => d[1])(points); + const center = coordinate.getCenter(); + return (0, d3_shape_1.arc)()({ + startAngle: 0, + endAngle: Math.PI * 2, + outerRadius: (0, vector_1.dist)(points[0], center), + innerRadius: (0, vector_1.dist)(points[1], center), + }); +} +function getTransform(coordinate, transform) { + if (!(0, coordinate_1.isPolar)(coordinate)) + return transform; + const [cx, cy] = coordinate.getCenter(); + return `translate(${cx}, ${cy}) ${transform || ''}`; +} +const Line = (options, context) => { + const { arrow, arrowSize = 4 } = options, style = __rest(options, ["arrow", "arrowSize"]); + const { coordinate, document } = context; + return (points, value, defaults) => { + const { color: defaultColor, lineWidth } = defaults, shapeTheme = __rest(defaults, ["color", "lineWidth"]); + const { color = defaultColor, size = lineWidth } = value; + const arrowMarker = arrow + ? getArrowMarker(document, arrowSize, Object.assign({ fill: style.stroke || color, stroke: style.stroke || color }, (0, helper_1.subObject)(style, 'arrow'))) + : null; + const path = getPath(points, coordinate); + const transform = getTransform(coordinate, value.transform); + return (0, selection_1.select)(document.createElement('path', {})) + .call(utils_1.applyStyle, shapeTheme) + .style('d', path) + .style('stroke', color) + .style('lineWidth', size) + .style('transform', transform) + .style('markerEnd', arrowMarker) + .call(utils_1.applyStyle, style) + .node(); + }; +}; +exports.Line = Line; +exports.Line.props = { + defaultMarker: 'line', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=line.js.map +}, function(modId) { var map = {"../../utils/coordinate":1751263815882,"../../utils/selection":1751263815883,"../../utils/vector":1751263815873,"../../utils/helper":1751263815829,"../utils":1751263815885}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815943, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Connector = void 0; +const g_1 = require("@antv/g"); +const component_1 = require("@antv/component"); +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const coordinate_1 = require("../../utils/coordinate"); +const helper_1 = require("../../utils/helper"); +const selection_1 = require("../../utils/selection"); +const utils_1 = require("../utils"); +function inferSymbol(x, y, r) { + return [['M', x, y], ['L', x + 2 * r, y - r], ['L', x + 2 * r, y + r], ['Z']]; +} +/** + * @todo support polar later. + */ +function inferConnectorPath(points) { + return (0, d3_shape_1.line)() + .x((d) => d[0]) + .y((d) => d[1])(points); +} +function getPoints(coordinate, points, sourceOffsetY, targetOffsetY, sourceOffsetX, targetOffsetX, length1 = 0) { + const [[x0, y0], [x1, y1]] = points; + if ((0, coordinate_1.isTranspose)(coordinate)) { + const X0 = x0 + sourceOffsetY; + const X1 = x1 + targetOffsetY; + const X = X0 + length1; + const Y0 = y0 + sourceOffsetX; + const Y1 = y1 + targetOffsetX; + return [ + [X0, Y0], + [X, Y0], + [X, Y1], + [X1, Y1], + ]; + } + const Y0 = y0 - sourceOffsetY; + const Y1 = y1 - targetOffsetY; + const Y = Y0 - length1; + const X0 = x0 - sourceOffsetX; + const X1 = x1 - targetOffsetX; + return [ + [X0, Y0], + [X0, Y], + [X1, Y], + [X1, Y1], + ]; +} +const Connector = (options, context) => { + const { offsetX = 0, sourceOffsetX = offsetX, targetOffsetX = offsetX, offsetY = 0, sourceOffsetY = offsetY, targetOffsetY = offsetY, connectLength1: length1, endMarker = true } = options, style = __rest(options, ["offsetX", "sourceOffsetX", "targetOffsetX", "offsetY", "sourceOffsetY", "targetOffsetY", "connectLength1", "endMarker"]); + const { coordinate } = context; + return (points, value, defaults) => { + const { color: defaultColor, connectLength1 } = defaults, rest = __rest(defaults, ["color", "connectLength1"]); + const { color, transform } = value; + const P = getPoints(coordinate, points, sourceOffsetY, targetOffsetY, sourceOffsetX, targetOffsetX, length1 !== null && length1 !== void 0 ? length1 : connectLength1); + const makerStyle = (0, helper_1.subObject)(Object.assign(Object.assign({}, style), defaults), 'endMarker'); + return (0, selection_1.select)(new g_1.Path()) + .call(utils_1.applyStyle, rest) + .style('d', inferConnectorPath(P)) + .style('stroke', color || defaultColor) + .style('transform', transform) + .style('markerEnd', endMarker + ? new component_1.Marker({ + className: 'marker', + style: Object.assign(Object.assign({}, makerStyle), { symbol: inferSymbol }), + }) + : null) + .call(utils_1.applyStyle, style) + .node(); + }; +}; +exports.Connector = Connector; +exports.Connector.props = { + defaultMarker: 'line', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=connector.js.map +}, function(modId) { var map = {"../../utils/coordinate":1751263815882,"../../utils/helper":1751263815829,"../../utils/selection":1751263815883,"../utils":1751263815885}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815944, function(require, module, exports) { + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Label = void 0; +const selection_1 = require("../../utils/selection"); +const utils_1 = require("../../shape/utils"); +const coordinate_1 = require("../../utils/coordinate"); +const string_1 = require("../../utils/string"); +const advance_1 = require("../text/advance"); +const PositionProcessor = __importStar(require("./position")); +function inferPosition(position, coordinate) { + if (position !== undefined) + return position; + if ((0, coordinate_1.isCircular)(coordinate)) + return 'inside'; + if ((0, coordinate_1.isTranspose)(coordinate)) + return 'right'; + return 'top'; +} +function getDefaultStyle(points, value, coordinate, theme, options, labels) { + // For non-series mark, calc position for label based on + // position and the bounds of shape. + const { position } = value; + const { render } = options; + const p = inferPosition(position, coordinate); + const labelType = render + ? 'htmlLabel' + : p === 'inside' + ? 'innerLabel' + : 'label'; + const t = theme[labelType]; + const v = Object.assign({}, t, value); + const processor = PositionProcessor[(0, string_1.camelCase)(p)]; + if (!processor) { + throw new Error(`Unknown position: ${p}`); + } + return Object.assign(Object.assign({}, t), processor(p, points, v, coordinate, options, labels)); +} +/** + * Render normal label for each mark. + * @todo Support position option: middle... + */ +const Label = (options, context) => { + const { coordinate, theme } = context; + const { render } = options; + return (points, value, style, labels) => { + const { text, x, y, transform: specifiedTS = '', transformOrigin, className = '' } = value, overrideStyle = __rest(value, ["text", "x", "y", "transform", "transformOrigin", "className"]); + const _a = getDefaultStyle(points, value, coordinate, theme, options, labels), { rotate = 0, transform = '' } = _a, defaultStyle = __rest(_a, ["rotate", "transform"]); + return (0, selection_1.select)(new advance_1.Advance()) + .call(utils_1.applyStyle, defaultStyle) + .style('text', `${text}`) + .style('className', `${className} g2-label`) + .style('innerHTML', render ? render(text, value.datum, value.index) : undefined) + .style('labelTransform', `${transform} rotate(${+rotate}) ${specifiedTS}`.trim()) + .style('labelTransformOrigin', transformOrigin) + .style('coordCenter', coordinate.getCenter()) + .call(utils_1.applyStyle, overrideStyle) + .node(); + }; +}; +exports.Label = Label; +exports.Label.props = { + defaultMarker: 'point', +}; +//# sourceMappingURL=label.js.map +}, function(modId) { var map = {"../../utils/selection":1751263815883,"../../shape/utils":1751263815885,"../../utils/coordinate":1751263815882,"../../utils/string":1751263815900,"../text/advance":1751263815923,"./position":1751263815945}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815945, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.topRight = exports.topLeft = exports.top = exports.surround = exports.spider = exports.right = exports.outside = exports.left = exports.inside = exports.bottomRight = exports.bottomLeft = exports.bottom = exports.area = void 0; +var area_1 = require("./area"); +Object.defineProperty(exports, "area", { enumerable: true, get: function () { return area_1.area; } }); +var bottom_1 = require("./bottom"); +Object.defineProperty(exports, "bottom", { enumerable: true, get: function () { return bottom_1.bottom; } }); +var bottomLeft_1 = require("./bottomLeft"); +Object.defineProperty(exports, "bottomLeft", { enumerable: true, get: function () { return bottomLeft_1.bottomLeft; } }); +var bottomRight_1 = require("./bottomRight"); +Object.defineProperty(exports, "bottomRight", { enumerable: true, get: function () { return bottomRight_1.bottomRight; } }); +var inside_1 = require("./inside"); +Object.defineProperty(exports, "inside", { enumerable: true, get: function () { return inside_1.inside; } }); +var left_1 = require("./left"); +Object.defineProperty(exports, "left", { enumerable: true, get: function () { return left_1.left; } }); +var outside_1 = require("./outside"); +Object.defineProperty(exports, "outside", { enumerable: true, get: function () { return outside_1.outside; } }); +var right_1 = require("./right"); +Object.defineProperty(exports, "right", { enumerable: true, get: function () { return right_1.right; } }); +var spider_1 = require("./spider"); +Object.defineProperty(exports, "spider", { enumerable: true, get: function () { return spider_1.spider; } }); +var surround_1 = require("./surround"); +Object.defineProperty(exports, "surround", { enumerable: true, get: function () { return surround_1.surround; } }); +var top_1 = require("./top"); +Object.defineProperty(exports, "top", { enumerable: true, get: function () { return top_1.top; } }); +var topLeft_1 = require("./topLeft"); +Object.defineProperty(exports, "topLeft", { enumerable: true, get: function () { return topLeft_1.topLeft; } }); +var topRight_1 = require("./topRight"); +Object.defineProperty(exports, "topRight", { enumerable: true, get: function () { return topRight_1.topRight; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./area":1751263815946,"./bottom":1751263815947,"./bottomLeft":1751263815949,"./bottomRight":1751263815950,"./inside":1751263815951,"./left":1751263815952,"./outside":1751263815953,"./right":1751263815954,"./spider":1751263815955,"./surround":1751263815957,"./top":1751263815958,"./topLeft":1751263815959,"./topRight":1751263815960}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815946, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.area = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +const vector_1 = require("../../../utils/vector"); +/** + * Only for Area label. + */ +function area(position, points, value, coordinate) { + const l = points.length / 2; + const Y1 = points.slice(0, l); + const Y0 = points.slice(l); + // Get the maximal space for label. + let idx = (0, d3_array_1.maxIndex)(Y1, (p, i) => Math.abs(p[1] - Y0[i][1])); + // Do not show label at first and last. + idx = Math.max(Math.min(idx, l - 2), 1); + const mid = (i) => [Y1[i][0], (Y1[i][1] + Y0[i][1]) / 2]; + const point = mid(idx); + const prev = mid(idx - 1); + const next = mid(idx + 1); + // todo: G rotate only support deg. + const rotate = ((0, vector_1.angle)((0, vector_1.sub)(next, prev)) / Math.PI) * 180; + return { + x: point[0], + y: point[1], + transform: `rotate(${rotate})`, + textAlign: 'center', + textBaseline: 'middle', + }; +} +exports.area = area; +//# sourceMappingURL=area.js.map +}, function(modId) { var map = {"../../../utils/vector":1751263815873}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815947, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.bottom = void 0; +var default_1 = require("./default"); +Object.defineProperty(exports, "bottom", { enumerable: true, get: function () { return default_1.getDefaultStyle; } }); +//# sourceMappingURL=bottom.js.map +}, function(modId) { var map = {"./default":1751263815948}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815948, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getDefaultStyle = exports.inferIdentityStyle = exports.inferRotation = exports.pointOfArc = exports.inferRadialStyle = exports.inferNonCircularStyle = void 0; +const utils_1 = require("../../../shape/utils"); +const coordinate_1 = require("../../../utils/coordinate"); +const helper_1 = require("../../../utils/helper"); +const vector_1 = require("../../../utils/vector"); +function inferNonCircularStyle(position, points, value, coordinate) { + const { bounds } = value; + const [[x0, y0], [x1, y1]] = bounds; + const w = x1 - x0; + const h = y1 - y0; + const xy = (options) => { + const { x: ox, y: oy } = options; + const px = (0, helper_1.maybePercentage)(value.x, w); + const py = (0, helper_1.maybePercentage)(value.y, h); + return Object.assign(Object.assign({}, options), { x: (px || ox) + x0, y: (py || oy) + y0 }); + }; + // 4 direction. + if (position === 'left') + return xy({ x: 0, y: h / 2, textAlign: 'start', textBaseline: 'middle' }); + if (position === 'right') + return xy({ x: w, y: h / 2, textAlign: 'end', textBaseline: 'middle' }); + if (position === 'top') + return xy({ x: w / 2, y: 0, textAlign: 'center', textBaseline: 'top' }); + if (position === 'bottom') + return xy({ x: w / 2, y: h, textAlign: 'center', textBaseline: 'bottom' }); + // 4 corner position. + if (position === 'top-left') + return xy({ x: 0, y: 0, textAlign: 'start', textBaseline: 'top' }); + if (position === 'top-right') + return xy({ x: w, y: 0, textAlign: 'end', textBaseline: 'top' }); + if (position === 'bottom-left') + return xy({ x: 0, y: h, textAlign: 'start', textBaseline: 'bottom' }); + if (position === 'bottom-right') + return xy({ x: w, y: h, textAlign: 'end', textBaseline: 'bottom' }); + // default return 'inside' + return xy({ + x: w / 2, + y: h / 2, + textAlign: 'center', + textBaseline: 'middle', + }); +} +exports.inferNonCircularStyle = inferNonCircularStyle; +function inferRadialStyle(position, points, value, coordinate) { + const { y, y1, autoRotate, rotateToAlignArc } = value; + const center = coordinate.getCenter(); + const arcObject = (0, utils_1.getArcObject)(coordinate, points, [y, y1]); + const { innerRadius, outerRadius, startAngle, endAngle } = arcObject; + const angle = position === 'inside' ? (startAngle + endAngle) / 2 : endAngle; + const rotate = inferRotation(angle, autoRotate, rotateToAlignArc); + const point = (() => { + const [p0, p1] = points; + const radius = innerRadius + (outerRadius - innerRadius) * 0.5; + const [x, y] = position === 'inside' ? pointOfArc(center, angle, radius) : (0, vector_1.mid)(p0, p1); + return { x, y }; + })(); + return Object.assign(Object.assign({}, point), { textAlign: position === 'inside' ? 'center' : 'start', textBaseline: 'middle', rotate }); +} +exports.inferRadialStyle = inferRadialStyle; +function pointOfArc(center, angle, radius) { + return [ + center[0] + Math.sin(angle) * radius, + center[1] - Math.cos(angle) * radius, + ]; +} +exports.pointOfArc = pointOfArc; +function inferRotation(angle, autoRotate, rotateToAlignArc) { + if (!autoRotate) + return 0; + const append = rotateToAlignArc ? 0 : Math.sin(angle) < 0 ? 90 : -90; + return (angle / Math.PI) * 180 + append; +} +exports.inferRotation = inferRotation; +function inferInnerCircularStyle(position, points, value, coordinate) { + const { y, y1, autoRotate, rotateToAlignArc, radius: radiusRatio = 0.5, offset = 0, } = value; + const arcObject = (0, utils_1.getArcObject)(coordinate, points, [y, y1]); + const { startAngle, endAngle } = arcObject; + const center = coordinate.getCenter(); + const angle = (startAngle + endAngle) / 2; + const rotate = inferRotation(angle, autoRotate, rotateToAlignArc); + const textStyle = { textAlign: 'center', textBaseline: 'middle', rotate }; + const { innerRadius, outerRadius } = arcObject; + const r0 = innerRadius + (outerRadius - innerRadius) * radiusRatio; + const r1 = r0 + offset; + const [x0, y0] = pointOfArc(center, angle, r1); + return Object.assign({ x: x0, y: y0 }, textStyle); +} +// Set to null will not be set with default value as below. +// const { x = 0 } = options; +function maybeUndefined(d) { + return d === undefined ? null : d; +} +function inferIdentityStyle(position, points, value, coordinate) { + const { bounds } = value; + const [p] = bounds; + return { + x: maybeUndefined(p[0]), + y: maybeUndefined(p[1]), + }; +} +exports.inferIdentityStyle = inferIdentityStyle; +function getDefaultStyle(position, points, value, coordinate) { + const { bounds } = value; + // When bounds.length = 1 + // For series mark, such as line and area. + // The bounds for text is defined with only one point. + // Use this point as the label position. + if (bounds.length === 1) { + return inferIdentityStyle(position, points, value, coordinate); + } + const inferDefaultStyle = (0, coordinate_1.isRadial)(coordinate) + ? inferRadialStyle + : (0, coordinate_1.isCircular)(coordinate) + ? inferInnerCircularStyle + : inferNonCircularStyle; + return inferDefaultStyle(position, points, value, coordinate); +} +exports.getDefaultStyle = getDefaultStyle; +//# sourceMappingURL=default.js.map +}, function(modId) { var map = {"../../../shape/utils":1751263815885,"../../../utils/coordinate":1751263815882,"../../../utils/helper":1751263815829,"../../../utils/vector":1751263815873}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815949, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.bottomLeft = void 0; +var default_1 = require("./default"); +Object.defineProperty(exports, "bottomLeft", { enumerable: true, get: function () { return default_1.getDefaultStyle; } }); +//# sourceMappingURL=bottomLeft.js.map +}, function(modId) { var map = {"./default":1751263815948}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815950, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.bottomRight = void 0; +var default_1 = require("./default"); +Object.defineProperty(exports, "bottomRight", { enumerable: true, get: function () { return default_1.getDefaultStyle; } }); +//# sourceMappingURL=bottomRight.js.map +}, function(modId) { var map = {"./default":1751263815948}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815951, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.inside = void 0; +var default_1 = require("./default"); +Object.defineProperty(exports, "inside", { enumerable: true, get: function () { return default_1.getDefaultStyle; } }); +//# sourceMappingURL=inside.js.map +}, function(modId) { var map = {"./default":1751263815948}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815952, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.left = void 0; +var default_1 = require("./default"); +Object.defineProperty(exports, "left", { enumerable: true, get: function () { return default_1.getDefaultStyle; } }); +//# sourceMappingURL=left.js.map +}, function(modId) { var map = {"./default":1751263815948}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815953, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.outside = exports.inferOutsideCircularStyle = exports.angleOf = exports.radiusOf = exports.linePoints = void 0; +const utils_1 = require("../../../shape/utils"); +const coordinate_1 = require("../../../utils/coordinate"); +const default_1 = require("./default"); +function linePoints(center, angle, radius, radius1, offsetX) { + const [x0, y0] = (0, default_1.pointOfArc)(center, angle, radius); + const [x1, y1] = (0, default_1.pointOfArc)(center, angle, radius1); + const sign = Math.sin(angle) > 0 ? 1 : -1; + return [ + [x0, y0], + [x1, y1], + [x1 + sign * offsetX, y1], + ]; +} +exports.linePoints = linePoints; +function radiusOf(points, value, coordinate) { + const arcObject = (0, utils_1.getArcObject)(coordinate, points, [value.y, value.y1]); + const { innerRadius, outerRadius } = arcObject; + return innerRadius + (outerRadius - innerRadius); +} +exports.radiusOf = radiusOf; +function angleOf(points, value, coordinate) { + const arcObject = (0, utils_1.getArcObject)(coordinate, points, [value.y, value.y1]); + const { startAngle, endAngle } = arcObject; + return (startAngle + endAngle) / 2; +} +exports.angleOf = angleOf; +function inferOutsideCircularStyle(position, points, value, coordinate) { + const { autoRotate, rotateToAlignArc, offset = 0, connector = true, connectorLength = offset, connectorLength2 = 0, connectorDistance = 0, } = value; + const center = coordinate.getCenter(); + const angle = angleOf(points, value, coordinate); + const sign = Math.sin(angle) > 0 ? 1 : -1; + const rotate = (0, default_1.inferRotation)(angle, autoRotate, rotateToAlignArc); + const textStyle = { + textAlign: sign > 0 || (0, coordinate_1.isRadial)(coordinate) ? 'start' : 'end', + textBaseline: 'middle', + rotate, + }; + const radius = radiusOf(points, value, coordinate); + const radius1 = radius + (connector ? connectorLength : offset); + const [[x0, y0], [x1, y1], [x2, y2]] = linePoints(center, angle, radius, radius1, connector ? connectorLength2 : 0); + const dx = connector ? +connectorDistance * sign : 0; + const x = x2 + dx; + const y = y2; + const connectorStyle = { + connector, + connectorPoints: [ + [x1 - x, y1 - y], + [x2 - x, y2 - y], + ], + }; + return Object.assign(Object.assign({ x0, + y0, x: x2 + dx, y: y2 }, textStyle), connectorStyle); +} +exports.inferOutsideCircularStyle = inferOutsideCircularStyle; +function outside(position, points, value, coordinate) { + const { bounds } = value; + // When bounds.length = 1 + // For series mark, such as line and area. + // The bounds for text is defined with only one point. + // Use this point as the label position. + if (bounds.length === 1) { + return (0, default_1.inferIdentityStyle)(position, points, value, coordinate); + } + const inferDefaultStyle = (0, coordinate_1.isRadial)(coordinate) + ? default_1.inferRadialStyle + : (0, coordinate_1.isCircular)(coordinate) + ? inferOutsideCircularStyle + : default_1.inferNonCircularStyle; + return inferDefaultStyle(position, points, value, coordinate); +} +exports.outside = outside; +//# sourceMappingURL=outside.js.map +}, function(modId) { var map = {"../../../shape/utils":1751263815885,"../../../utils/coordinate":1751263815882,"./default":1751263815948}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815954, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.right = void 0; +var default_1 = require("./default"); +Object.defineProperty(exports, "right", { enumerable: true, get: function () { return default_1.getDefaultStyle; } }); +//# sourceMappingURL=right.js.map +}, function(modId) { var map = {"./default":1751263815948}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815955, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.spider = void 0; +const coordinate_1 = require("../../../utils/coordinate"); +const outside_1 = require("./outside"); +const utils_1 = require("./utils"); +const styleByPoints = new WeakMap(); +function compute(points, value, coordinate) { + const { connectorLength, connectorLength2, connectorDistance } = value; + const style = __rest((0, outside_1.inferOutsideCircularStyle)('outside', points, value, coordinate), []); + const center = coordinate.getCenter(); + const radius = (0, outside_1.radiusOf)(points, value, coordinate); + const angle = (0, outside_1.angleOf)(points, value, coordinate); + const radius1 = radius + connectorLength + connectorLength2; + const sign = Math.sin(angle) > 0 ? 1 : -1; + const newX = center[0] + (radius1 + +connectorDistance) * sign; + const { x: originX } = style; + const dx = newX - originX; + style.x += dx; + style.connectorPoints[0][0] -= dx; + return style; +} +/** + * Spider label transform only suitable for the labels in polar coordinate, + * labels should distinguish coordinate type. + */ +function spider(position, points, value, coordinate, options, labels) { + if (!(0, coordinate_1.isCircular)(coordinate)) + return {}; + if (styleByPoints.has(points)) + return styleByPoints.get(points); + const computed = labels.map((points) => compute(points, value, coordinate)); + const { width, height } = coordinate.getOptions(); + const left = computed.filter((d) => d.x < width / 2); + const right = computed.filter((d) => d.x >= width / 2); + const extendedOptions = Object.assign(Object.assign({}, options), { height }); + (0, utils_1.hideAndDodgeY)(left, extendedOptions); + (0, utils_1.hideAndDodgeY)(right, extendedOptions); + computed.forEach((style, i) => styleByPoints.set(labels[i], style)); + return styleByPoints.get(points); +} +exports.spider = spider; +//# sourceMappingURL=spider.js.map +}, function(modId) { var map = {"../../../utils/coordinate":1751263815882,"./outside":1751263815953,"./utils":1751263815956}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815956, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.hideAndDodgeY = exports.dodgeY = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +// Optimize antiCollision from: https://github.com/antvis/G2/blob/master/src/geometry/label/layout/pie/util.ts +function dodgeY(labels, options = {}) { + const { labelHeight = 14, height } = options; + // Sort labels by y and init boxes (one box for each label) + const sortedLabels = (0, d3_array_1.sort)(labels, (d) => d.y); + const n = sortedLabels.length; + const boxes = new Array(n); + for (let i = 0; i < n; i++) { + const label = sortedLabels[i]; + const { y } = label; + boxes[i] = { y, y1: y + labelHeight, labels: [y] }; + } + // Merge boxes until no overlapping boxes or only one box left. + // All the boxes should start higher than 0, but maybe higher than height. + let overlap = true; + while (overlap) { + overlap = false; + // Scan backward because boxes maybe deleted. + for (let i = boxes.length - 1; i > 0; i--) { + const box = boxes[i]; + const preBox = boxes[i - 1]; + if (preBox.y1 > box.y) { + overlap = true; + preBox.labels.push(...box.labels); + boxes.splice(i, 1); + // Compute new y1 to contain the current box. + preBox.y1 += box.y1 - box.y; + // Make sure the new box is in the range of [0, height]. + const newHeight = preBox.y1 - preBox.y; + preBox.y1 = Math.max(Math.min(preBox.y1, height), newHeight); + preBox.y = preBox.y1 - newHeight; + } + } + } + let i = 0; + for (const box of boxes) { + const { y, labels } = box; + let prevY = y - labelHeight; + for (const curY of labels) { + const label = sortedLabels[i++]; + const expectedY = prevY + labelHeight; + const dy = expectedY - curY; + label.connectorPoints[0][1] -= dy; + label.y = prevY + labelHeight; + prevY += labelHeight; + } + } +} +exports.dodgeY = dodgeY; +function hideAndDodgeY(unsorted, options) { + const labels = (0, d3_array_1.sort)(unsorted, (d) => d.y); + const { height, labelHeight = 14 } = options; + const maxCount = Math.ceil(height / labelHeight); + if (labels.length <= maxCount) + return dodgeY(labels, options); + const filtered = []; + for (let i = 0; i < labels.length; i++) { + // Hide labels out of range. + if (i < labels.length - maxCount) { + labels[i].opacity = 0; + labels[i].connector = false; + } + else + filtered.push(labels[i]); + } + dodgeY(filtered, options); +} +exports.hideAndDodgeY = hideAndDodgeY; +//# sourceMappingURL=utils.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815957, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.surround = void 0; +const coordinate_1 = require("../../../utils/coordinate"); +const vector_1 = require("../../../utils/vector"); +const default_1 = require("./default"); +const outside_1 = require("./outside"); +/** + * Surround label transform is used to make labels surround circular. + */ +function surround(position, points, value, coordinate) { + if (!(0, coordinate_1.isCircular)(coordinate)) + return {}; + const { connectorLength, connectorLength2, connectorDistance } = value; + const style = __rest((0, outside_1.inferOutsideCircularStyle)('outside', points, value, coordinate), []); + const { x0, y0 } = style; + const center = coordinate.getCenter(); + const radius = (0, coordinate_1.getRadius)(coordinate); + const radius1 = radius + connectorLength; + const angle = (0, vector_1.angleWithQuadrant)([x0 - center[0], y0 - center[1]]); + const sign = Math.sin(angle) > 0 ? 1 : -1; + const [newX, newY] = (0, default_1.pointOfArc)(center, angle, radius1); + style.x = newX + (connectorLength2 + connectorDistance) * sign; + style.y = newY; + return style; +} +exports.surround = surround; +//# sourceMappingURL=surround.js.map +}, function(modId) { var map = {"../../../utils/coordinate":1751263815882,"../../../utils/vector":1751263815873,"./default":1751263815948,"./outside":1751263815953}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815958, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.top = void 0; +var default_1 = require("./default"); +Object.defineProperty(exports, "top", { enumerable: true, get: function () { return default_1.getDefaultStyle; } }); +//# sourceMappingURL=top.js.map +}, function(modId) { var map = {"./default":1751263815948}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815959, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.topLeft = void 0; +var default_1 = require("./default"); +Object.defineProperty(exports, "topLeft", { enumerable: true, get: function () { return default_1.getDefaultStyle; } }); +//# sourceMappingURL=topLeft.js.map +}, function(modId) { var map = {"./default":1751263815948}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815960, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.topRight = void 0; +var default_1 = require("./default"); +Object.defineProperty(exports, "topRight", { enumerable: true, get: function () { return default_1.getDefaultStyle; } }); +//# sourceMappingURL=topRight.js.map +}, function(modId) { var map = {"./default":1751263815948}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815961, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Path = void 0; +const color_1 = require("./color"); +/** + * A filled path. + */ +const Path = (options, context) => { + return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill' }, options), context); +}; +exports.Path = Path; +exports.Path.props = { + defaultMarker: 'hvh', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=path.js.map +}, function(modId) { var map = {"./color":1751263815962}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815962, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Color = void 0; +const utils_1 = require("../utils"); +const selection_1 = require("../../utils/selection"); +/** + * Draw a filled or hollow path. + */ +const Color = (options, context) => { + const { arrow, colorAttribute } = options, style = __rest(options, ["arrow", "colorAttribute"]); + const { coordinate, document } = context; + return (points, value, defaults) => { + const { color: defaultColor, stroke } = defaults, rest = __rest(defaults, ["color", "stroke"]); + const { d, color = defaultColor } = value; + const [width, height] = coordinate.getSize(); + return ((0, selection_1.select)(document.createElement('path', {})) + .call(utils_1.applyStyle, rest) + // Path support string, function with parameter { width, height }. + .style('d', typeof d === 'function' ? d({ width, height }) : d) + .style(colorAttribute, color) + .call(utils_1.applyStyle, style) + .node()); + }; +}; +exports.Color = Color; +exports.Color.props = { + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=color.js.map +}, function(modId) { var map = {"../utils":1751263815885,"../../utils/selection":1751263815883}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815963, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Hollow = void 0; +const color_1 = require("./color"); +/** + * A hollow path. + */ +const Hollow = (options, context) => { + return (0, color_1.Color)(Object.assign({ fill: 'none', colorAttribute: 'stroke' }, options), context); +}; +exports.Hollow = Hollow; +exports.Hollow.props = { + defaultMarker: 'hvh', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=hollow.js.map +}, function(modId) { var map = {"./color":1751263815962}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815964, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Density = void 0; +const d3_path_1 = require("@antv/vendor/d3-path"); +const utils_1 = require("../utils"); +const selection_1 = require("../../utils/selection"); +/** + * Draw density shape. + */ +const Density = (options, context) => { + const { document } = context; + return (points, value, defaults) => { + const { transform } = value; + const { color: defaultColor } = defaults, rest = __rest(defaults, ["color"]); + const { color = defaultColor } = value; + const [first, ...p] = points; + // todo smooth, hollow + const path = (0, d3_path_1.path)(); + path.moveTo(...first); + p.forEach(([x, y]) => { + path.lineTo(x, y); + }); + path.closePath(); + return (0, selection_1.select)(document.createElement('path', {})) + .call(utils_1.applyStyle, rest) + .style('d', path.toString()) + .style('stroke', color || defaultColor) // Always has stroke color. + .style('fill', color || defaultColor) + .style('fillOpacity', 0.4) + .style('transform', transform) + .call(utils_1.applyStyle, options) + .node(); + }; +}; +exports.Density = Density; +exports.Density.props = { + defaultMarker: 'square', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=density.js.map +}, function(modId) { var map = {"../utils":1751263815885,"../../utils/selection":1751263815883}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815965, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Heatmap = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +const utils_1 = require("../utils"); +const selection_1 = require("../../utils/selection"); +const renderer_1 = require("./renderer"); +function deleteKey(obj, fn) { + return Object.keys(obj).reduce((r, k) => { + const v = obj[k]; + if (!fn(v, k)) + r[k] = v; + return r; + }, {}); +} +const Heatmap = (options, context) => { + const { gradient, opacity, maxOpacity, minOpacity, blur, useGradientOpacity } = options, style = __rest(options, ["gradient", "opacity", "maxOpacity", "minOpacity", "blur", "useGradientOpacity"]); + const { coordinate, createCanvas, document } = context; + return (points, value, defaults) => { + const { transform } = value; + const [width, height] = coordinate.getSize(); + const data = points.map((p) => ({ + x: p[0], + y: p[1], + value: p[2], + radius: p[3], + })); + const min = (0, d3_array_1.min)(points, (p) => p[2]); + const max = (0, d3_array_1.max)(points, (p) => p[2]); + const options = { + gradient, + opacity, + minOpacity, + maxOpacity, + blur, + useGradientOpacity, + }; + const ctx = width && height + ? (0, renderer_1.HeatmapRenderer)(width, height, min, max, data, deleteKey(options, (v) => v === undefined), createCanvas) + : { canvas: null }; + return (0, selection_1.select)(document.createElement('image', {})) + .call(utils_1.applyStyle, defaults) + .style('x', 0) + .style('y', 0) + .style('width', width) + .style('height', height) + .style('src', ctx.canvas.toDataURL()) + .style('transform', transform) + .call(utils_1.applyStyle, style) + .node(); + }; +}; +exports.Heatmap = Heatmap; +exports.Heatmap.props = { + defaultMarker: 'point', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=heatmap.js.map +}, function(modId) { var map = {"../utils":1751263815885,"../../utils/selection":1751263815883,"./renderer":1751263815966}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815966, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HeatmapRenderer = void 0; +const lru_1 = require("../../../utils/lru"); +const gradient_1 = require("./gradient"); +function newCanvas(createCanvas, width, height) { + const c = createCanvas ? createCanvas() : document.createElement('canvas'); + c.width = width; + c.height = height; + return c; +} +/** + * Get a point with template. + * @param radius + * @param blurFactor + * @returns + */ +const getPointTemplate = (0, lru_1.lru)((radius, blurFactor, createCanvas) => { + const tplCanvas = newCanvas(createCanvas, radius * 2, radius * 2); + const tplCtx = tplCanvas.getContext('2d'); + const x = radius; + const y = radius; + if (blurFactor === 1) { + tplCtx.beginPath(); + tplCtx.arc(x, y, radius, 0, 2 * Math.PI, false); + tplCtx.fillStyle = 'rgba(0,0,0,1)'; + tplCtx.fill(); + } + else { + const gradient = tplCtx.createRadialGradient(x, y, radius * blurFactor, x, y, radius); + gradient.addColorStop(0, 'rgba(0,0,0,1)'); + gradient.addColorStop(1, 'rgba(0,0,0,0)'); + tplCtx.fillStyle = gradient; + tplCtx.fillRect(0, 0, 2 * radius, 2 * radius); + } + return tplCanvas; +}, (radius) => `${radius}`); +/** + * Get a color palette with len = 256 base on gradient. + * @param gradientConfig + * @returns + */ +function getColorPalette(gradientConfig, createCanvas) { + const paletteCanvas = newCanvas(createCanvas, 256, 1); + const paletteCtx = paletteCanvas.getContext('2d'); + const gradient = paletteCtx.createLinearGradient(0, 0, 256, 1); + (0, gradient_1.parseGradient)(gradientConfig).forEach(([r, c]) => { + gradient.addColorStop(r, c); + }); + paletteCtx.fillStyle = gradient; + paletteCtx.fillRect(0, 0, 256, 1); + return paletteCtx.getImageData(0, 0, 256, 1).data; +} +/** + * Draw all circle with alpha. + */ +function drawAlpha(shadowCtx, min, max, data, options, createCanvas) { + const { blur } = options; + let len = data.length; + while (len--) { + const { x, y, value: v, radius } = data[len]; + // Ff value is bigger than max, use max as value. + const value = Math.min(v, max); + const rectX = x - radius; + const rectY = y - radius; + const tpl = getPointTemplate(radius, 1 - blur, createCanvas); + // Value from minimum / value range, => [0, 1]. + const templateAlpha = (value - min) / (max - min); + // Small values are not visible because globalAlpha < .001 cannot be read from imageData. + shadowCtx.globalAlpha = Math.max(templateAlpha, 0.001); + shadowCtx.drawImage(tpl, rectX, rectY); + } + return shadowCtx; +} +function colorize(shadowCtx, maxWidth, maxHeight, palette, options) { + const { minOpacity, opacity, maxOpacity, useGradientOpacity } = options; + const x = 0; + const y = 0; + const width = maxWidth; + const height = maxHeight; + const img = shadowCtx.getImageData(x, y, width, height); + const imgData = img.data; + const len = imgData.length; + for (let i = 3; i < len; i += 4) { + const alpha = imgData[i]; + const offset = alpha * 4; + if (!offset) { + continue; + } + // Should be in [min, max], min >= 0. + const finalAlpha = opacity || Math.max(0, Math.min(maxOpacity, Math.max(minOpacity, alpha))); + // Update rgba. + imgData[i - 3] = palette[offset]; + imgData[i - 2] = palette[offset + 1]; + imgData[i - 1] = palette[offset + 2]; + imgData[i] = useGradientOpacity ? palette[offset + 3] : finalAlpha; + } + return img; +} +/** + * Render a heatmap with canvas. + * See [heatmap.js](https://github.com/pa7/heatmap.js/blob/master/src/renderer/canvas2d.js). + */ +function HeatmapRenderer(width, height, min, max, data, options, createCanvas) { + const opts = Object.assign({ blur: 0.85, minOpacity: 0, opacity: 0.6, maxOpacity: 1, gradient: [ + [0.25, 'rgb(0,0,255)'], + [0.55, 'rgb(0,255,0)'], + [0.85, 'yellow'], + [1.0, 'rgb(255,0,0)'], + ] }, options); + opts.minOpacity *= 255; + opts.opacity *= 255; + opts.maxOpacity *= 255; + const shadowCanvas = newCanvas(createCanvas, width, height); + const shadowCtx = shadowCanvas.getContext('2d'); + const palette = getColorPalette(opts.gradient, createCanvas); + shadowCtx.clearRect(0, 0, width, height); + drawAlpha(shadowCtx, min, max, data, opts, createCanvas); + const img = colorize(shadowCtx, width, height, palette, opts); + const canvas = newCanvas(createCanvas, width, height); + const ctx = canvas.getContext('2d'); + ctx.putImageData(img, 0, 0); + return ctx; +} +exports.HeatmapRenderer = HeatmapRenderer; +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"../../../utils/lru":1751263815967,"./gradient":1751263815968}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815967, function(require, module, exports) { + +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.lru = void 0; +const flru_1 = __importDefault(require("flru")); +const cache = (0, flru_1.default)(3); +/** + * A decorator to return new function with LRU cache. + */ +function lru(fn, keyFn = (...args) => `${args[0]}`, maxSize = 16) { + const cache = (0, flru_1.default)(maxSize); + return (...args) => { + const key = keyFn(...args); + let v = cache.get(key); + if (cache.has(key)) + return cache.get(key); + v = fn(...args); + cache.set(key, v); + return v; + }; +} +exports.lru = lru; +//# sourceMappingURL=lru.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815968, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseGradient = void 0; +/** + * Parse heatmap gradient. + */ +function parseGradient(gradient) { + if (typeof gradient === 'string') { + return gradient.split(' ').map((stop) => { + const [r, c] = stop.split(':'); + return [+r, c]; + }); + } + return gradient; +} +exports.parseGradient = parseGradient; +//# sourceMappingURL=gradient.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815969, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Shape = void 0; +/** + * Draw a custom shape. + */ +const Shape = (options, context) => { + const { render } = options, rest = __rest(options, ["render"]); + return (points) => { + const [[x0, y0]] = points; + return render(Object.assign(Object.assign({}, rest), { x: x0, y: y0 }), context); + }; +}; +exports.Shape = Shape; +exports.Shape.props = { + defaultMarker: 'point', + defaultEnterAnimation: 'fadeIn', + defaultUpdateAnimation: 'morphing', + defaultExitAnimation: 'fadeOut', +}; +//# sourceMappingURL=shape.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815970, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Liquid = void 0; +const util_1 = require("@antv/util"); +const wave_1 = require("./wave"); +const shapes_1 = require("./shapes"); +const getLiquidShape = (shape = 'circle') => shapes_1.LiquidShapesPath[shape] || shapes_1.LiquidShapesPath.circle; +const Liquid = (options, context) => { + if (!context) + return; + const { coordinate } = context; + const { liquidOptions, styleOptions } = options; + const { liquidShape, percent } = liquidOptions; + const { background: backgroundStyle, outline = {}, wave = {} } = styleOptions, attr = __rest(styleOptions, ["background", "outline", "wave"]); + const { border = 2, distance = 0 } = outline, outlineStyle = __rest(outline, ["border", "distance"]); + const { length = 192, count = 3 } = wave; + return (points, cfg, defaultAttr) => { + const { document } = context.canvas; + const { color, fillOpacity } = defaultAttr; + const attrs = Object.assign(Object.assign({ fill: color }, defaultAttr), attr); + const g = document.createElement('g', {}); + // Center x/y. + const [centerX, centerY] = coordinate.getCenter(); + // [width,height]. + const size = coordinate.getSize(); + const radius = Math.min(...size) / 2; + // 1、Gets the path of the overall shape. + const buildPath = (0, util_1.isFunction)(liquidShape) + ? liquidShape + : getLiquidShape(liquidShape); + const shapePath = buildPath(centerX, centerY, radius, ...size); + // 2、Background create. + if (Object.keys(backgroundStyle).length) { + const backgroundShape = document.createElement('path', { + style: Object.assign({ d: shapePath, fill: '#fff' }, backgroundStyle), + }); + g.appendChild(backgroundShape); + } + // Percent > 0 Mapping water waves. + if (percent > 0) { + // 3. Clip create. + const clipShape = document.createElement('path', { + style: { + d: shapePath, + }, + }); + g.appendChild(clipShape); + g.style.clipPath = clipShape; + // 4. Wave create. + (0, wave_1.addWave)(centerX, centerY, 1 - percent, count, attrs, g, clipShape.getBBox().y, radius * 2, length, true, document); + } + // 5. Draw distance. + const distanceShape = document.createElement('path', { + style: { + d: shapePath, + fill: 'transparent', + lineWidth: border + 2 * distance, + stroke: '#fff', + }, + }); + // 6. Draw border. + const borderShape = document.createElement('path', { + style: Object.assign(Object.assign(Object.assign({ d: shapePath, stroke: color, strokeOpacity: fillOpacity, lineWidth: border }, attrs), outlineStyle), { fill: 'transparent' }), + }); + g.appendChild(distanceShape); + g.appendChild(borderShape); + return g; + }; +}; +exports.Liquid = Liquid; +exports.Liquid.props = {}; +//# sourceMappingURL=liquid.js.map +}, function(modId) { var map = {"./wave":1751263815971,"./shapes":1751263815972}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815971, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.addWave = void 0; +const DURATION = 5000; +/** + * A function of linear mapping. + * @param min + * @param max + * @param factor + */ +function lerp(min, max, factor) { + return min + (max - min) * factor; +} +/** + * Using Bessel curve to simulate sine wave. + * Using Bezier curves to fit sine wave. + * There is 4 control points for each curve of wave, + * which is at 1/4 wave length of the sine wave. + * + * The control points for a wave from (a) to (d) are a-b-c-d: + * c *----* d + * b * + * | + * ... a * .................. + * + * Whose positions are a: (0, 0), b: (0.5, 0.5), c: (1, 1), d: (PI / 2, 1). + * + * @param x x position of the left-most point (a). + * @param stage 0-3, stating which part of the wave it is. + * @param waveLength wave length of the sine wave. + * @param amplitude wave amplitude. + * @return Sinusoidal segment curve. + */ +function getWaterWavePositions(x, stage, waveLength, amplitude) { + if (stage === 0) { + return [ + [x + ((1 / 2) * waveLength) / Math.PI / 2, amplitude / 2], + [x + ((1 / 2) * waveLength) / Math.PI, amplitude], + [x + waveLength / 4, amplitude], + ]; + } + if (stage === 1) { + return [ + [x + (((1 / 2) * waveLength) / Math.PI / 2) * (Math.PI - 2), amplitude], + [ + x + (((1 / 2) * waveLength) / Math.PI / 2) * (Math.PI - 1), + amplitude / 2, + ], + [x + waveLength / 4, 0], + ]; + } + if (stage === 2) { + return [ + [x + ((1 / 2) * waveLength) / Math.PI / 2, -amplitude / 2], + [x + ((1 / 2) * waveLength) / Math.PI, -amplitude], + [x + waveLength / 4, -amplitude], + ]; + } + return [ + [x + (((1 / 2) * waveLength) / Math.PI / 2) * (Math.PI - 2), -amplitude], + [ + x + (((1 / 2) * waveLength) / Math.PI / 2) * (Math.PI - 1), + -amplitude / 2, + ], + [x + waveLength / 4, 0], + ]; +} +/** + * Get wave path. + * @param radius + * @param waterLevel water level + * @param waveLength wave length + * @param phase + * @param amplitude + * @param cx center x + * @param cy center y + * @return path path + */ +function getWaterWavePath(radius, waterLevel, waveLength, phase, amplitude, cx, cy) { + const curves = Math.ceil(((2 * radius) / waveLength) * 4) * 4; + const path = []; + let _phase = phase; + // Map phase to [-Math.PI * 2, 0]. + while (_phase < -Math.PI * 2) { + _phase += Math.PI * 2; + } + while (_phase > 0) { + _phase -= Math.PI * 2; + } + _phase = (_phase / Math.PI / 2) * waveLength; + const left = cx - radius + _phase - radius * 2; + /** + * Top-left corner as start point. + * + * Draws this point. + * | + * \|/ + * ~~~~~~~~ + * | | + * +------+ + */ + path.push(['M', left, waterLevel]); + /** + * Top wave. + * + * ~~~~~~~~ <- Draws this sine wave. + * | | + * +------+ + */ + let waveRight = 0; + for (let c = 0; c < curves; ++c) { + const stage = c % 4; + const pos = getWaterWavePositions((c * waveLength) / 4, stage, waveLength, amplitude); + path.push([ + 'C', + pos[0][0] + left, + -pos[0][1] + waterLevel, + pos[1][0] + left, + -pos[1][1] + waterLevel, + pos[2][0] + left, + -pos[2][1] + waterLevel, + ]); + if (c === curves - 1) { + waveRight = pos[2][0]; + } + } + /** + * Top-right corner. + * + * ~~~~~~~~ + * 3. Draws this line. -> | | <- 1. Draws this line. + * +------+ + * ^ + * | + * 2. Draws this line. + */ + path.push(['L', waveRight + left, cy + radius]); + path.push(['L', left, cy + radius]); + path.push(['Z']); + return path; +} +/** + * Add wave. + * @param x center x + * @param y center y + * @param level wave level 0~1 + * @param waveCount wave count + * @param waveAttrs style + * @param group g + * @param minY Minimum height + * @param radius radius + * @param waveLength wave length + * @param animation animation config + * @param document + */ +function addWave(x, y, level, waveCount, waveAttrs, group, minY, radius, waveLength, animation, document) { + // Box property Color width height. + const { fill, fillOpacity, opacity } = waveAttrs; + // Number of cyclic waveCount. + for (let idx = 0; idx < waveCount; idx++) { + const factor = waveCount <= 1 ? 1 : idx / (waveCount - 1); + const path = getWaterWavePath(radius, minY + radius * level, waveLength, 0, + // Amplitude height. + radius / 40, x, y); + // Create wave path. + const wave = document.createElement('path', { + style: { + d: path, + fill, + opacity: lerp(0.2, 0.9, factor) * Number(opacity || fillOpacity), + }, + }); + group.appendChild(wave); + try { + if (animation === false) + return; + const keyframes = [ + { + transform: 'translate(0, 0)', + }, + { + transform: `translate(${waveLength * 2}, 0)`, + }, + ]; + wave.animate(keyframes, { + duration: lerp(0.5 * DURATION, DURATION, factor) * 2, + iterations: Infinity, + }); + } + catch (e) { + console.warn('off-screen group animate error!'); + } + } +} +exports.addWave = addWave; +//# sourceMappingURL=wave.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815972, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LiquidShapesPath = void 0; +/** + * @param x center x + * @param y center y + * @param radius + */ +function circle(x, y, r) { + return ` + M ${x} ${y - r} + a ${r} ${r} 0 1 0 0 ${r * 2} + a ${r} ${r} 0 1 0 0 ${-r * 2} + Z + `; +} +/** + * @param x center x + * @param y center y + * @param radius + */ +function rect(x, y, r) { + const GOLDEN_SECTION_RATIO = 0.618; + const w = r * GOLDEN_SECTION_RATIO; + return ` + M ${x - w} ${y - r} + L ${x + w} ${y - r} + L ${x + w} ${y + r} + L ${x - w} ${y + r} + Z + `; +} +/** + * @param x center x + * @param y center y + * @param radius + */ +function diamond(x, y, r) { + return ` + M ${x} ${y - r} + L ${x + r} ${y} + L ${x} ${y + r} + L ${x - r} ${y} + Z + `; +} +/** + * @param x center x + * @param y center y + * @param radius + */ +function triangle(x, y, r) { + return ` + M ${x} ${y - r} + L ${x + r} ${y + r} + L ${x - r} ${y + r} + Z + `; +} +/** + * @param x center x + * @param y center y + * @param radius + */ +function pin(x, y, radius) { + const w = (radius * 4) / 3; + const h = Math.max(w, radius * 2); + const r = w / 2; + // Attrs of the upper circle. + const cx = x; + const cy = r + y - h / 2; + const theta = Math.asin(r / ((h - r) * 0.85)); + const dy = Math.sin(theta) * r; + const dx = Math.cos(theta) * r; + // The start point of the path. + const x0 = cx - dx; + const y0 = cy + dy; + // Control point. + const cpX = x; + const cpY = cy + r / Math.sin(theta); + return ` + M ${x0} ${y0} + A ${r} ${r} 0 1 1 ${x0 + dx * 2} ${y0} + Q ${cpX} ${cpY} ${x} ${y + h / 2} + Q ${cpX} ${cpY} ${x0} ${y0} + Z + `; +} +exports.LiquidShapesPath = { + pin, + rect, + circle, + diamond, + triangle, +}; +//# sourceMappingURL=shapes.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815973, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Round = void 0; +const util_1 = require("@antv/util"); +// Get point1 point2 radius. +const getR = (point1, point2) => { + return (Math.sqrt(Math.pow(point1[0] - point2[0], 2) + Math.pow(point1[1] - point2[1], 2)) / 2); +}; +// Gauge round. +const Round = (options, context) => { + if (!context) + return; + const { coordinate } = context; + if (!(coordinate === null || coordinate === void 0 ? void 0 : coordinate.getCenter)) + return; + // Get coordinate center point. + const center = coordinate.getCenter(); + return (points, cfg, defaultCfg) => { + const { document } = context.canvas; + const { color, index } = cfg; + const g = document.createElement('g', {}); + const minR = getR(points[0], points[1]); + const maxR = getR(points[0], center) * 2; + /** + * MinR small circle radius, maxR big circle radius. + * Draw four arcs. + * Style lineWidth and stroke for the time being inset. + */ + const roundPath = document.createElement('path', { + style: Object.assign(Object.assign(Object.assign({ d: [ + ['M', ...points[0]], + ['A', minR, minR, 0, 1, 0, ...points[1]], + ['A', maxR + minR * 2, maxR + minR * 2, 0, 0, 0, ...points[2]], + ['A', minR, minR, 0, 1, index === 0 ? 0 : 1, ...points[3]], + ['A', maxR, maxR, 0, 0, 1, ...points[0]], + ['Z'], + ] }, defaultCfg), (0, util_1.omit)(options, ['shape', 'last', 'first'])), { fill: color || defaultCfg.color }), + }); + g.appendChild(roundPath); + return g; + }; +}; +exports.Round = Round; +//# sourceMappingURL=round.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815974, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Rect = void 0; +const shape_1 = require("../shape"); +const transform_1 = require("../transform"); +const utils_1 = require("./utils"); +const shape = { + rect: shape_1.RectShape, + hollow: shape_1.RectHollow, +}; +const Rect = () => { + return (index, scale, value, coordinate) => { + const { x: X, x1: X1, y: Y, y1: Y1 } = value; + const P = Array.from(index, (i) => { + const p1 = [+X[i], +Y[i]]; + const p2 = [+X1[i], +Y[i]]; + const p3 = [+X1[i], +Y1[i]]; + const p4 = [+X[i], +Y1[i]]; + return [p1, p2, p3, p4].map((d) => coordinate.map(d)); + }); + return [index, P]; + }; +}; +exports.Rect = Rect; +exports.Rect.props = { + defaultShape: 'rect', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }), + { name: 'x', required: true }, + { name: 'y', required: true }, + ], + preInference: [...(0, utils_1.basePreInference)(), { type: transform_1.MaybeZeroY1 }], + postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip1d)()], + interaction: { + shareTooltip: true, + }, +}; +//# sourceMappingURL=rect.js.map +}, function(modId) { var map = {"../shape":1751263815879,"../transform":1751263815823,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815975, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Line = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +const coordinate_1 = require("../utils/coordinate"); +const shape_1 = require("../shape"); +const transform_1 = require("../transform"); +const utils_1 = require("./utils"); +const shape = { + line: shape_1.LineShape, + smooth: shape_1.LineSmooth, + hv: shape_1.LineHV, + vh: shape_1.LineVH, + hvh: shape_1.LineHVH, + trail: shape_1.LineTrail, +}; +const line = (index, scale, value, coordinate) => { + var _a, _b; + const { series: S, x: X, y: Y } = value; + const { x, y } = scale; + // Because x and y channel is not strictly required in Line.props, + // it should throw error with empty x or y channels. + if (X === undefined || Y === undefined) { + throw new Error('Missing encode for x or y channel.'); + } + // Group data into series. + // There is only one series without specified series encode. + const series = S ? Array.from((0, d3_array_1.group)(index, (i) => S[i]).values()) : [index]; + const I = series.map((group) => group[0]).filter((i) => i !== undefined); + // A group of data corresponds to one line. + const xoffset = (((_a = x === null || x === void 0 ? void 0 : x.getBandWidth) === null || _a === void 0 ? void 0 : _a.call(x)) || 0) / 2; + const yoffset = (((_b = y === null || y === void 0 ? void 0 : y.getBandWidth) === null || _b === void 0 ? void 0 : _b.call(y)) || 0) / 2; + const P = Array.from(series, (I) => { + return I.map((i) => coordinate.map([+X[i] + xoffset, +Y[i] + yoffset])); + }); + return [I, P, series]; +}; +const parallel = (index, scale, value, coordinate) => { + // Extract all value for position[number] channels. + const PV = Object.entries(value) + .filter(([key]) => key.startsWith('position')) + .map(([, value]) => value); + // Because position channel is not strictly required in Line.props, + // it should throw error with empty position values. + if (PV.length === 0) { + throw new Error('Missing encode for position channel.'); + } + // Close the loop for radar(= parallel + polar) coordinate. + if ((0, coordinate_1.isPolar)(coordinate)) + PV.push(PV[0]); + // One data corresponds to one line. + const P = Array.from(index, (i) => { + // Transform high dimension vector to a list of two-dimension vectors. + // [a, b, c] -> [d, e, f, g, h, i] + const vector = PV.map((pv) => +pv[i]); + const vectors = coordinate.map(vector); + // Two-dimension vectors are stored in a flat array, so extract them. + // [d, e, f, g, h, i] -> [d, e], [f, g], [h, i] + const points = []; + for (let i = 0; i < vectors.length; i += 2) { + points.push([vectors[i], vectors[i + 1]]); + } + return points; + }); + return [index, P]; +}; +/** + * Convert value for each channel to line shapes. + */ +const Line = () => { + return (index, scale, value, coordinate) => { + const mark = (0, coordinate_1.isParallel)(coordinate) ? parallel : line; + return mark(index, scale, value, coordinate); + }; +}; +exports.Line = Line; +exports.Line.props = { + defaultShape: 'line', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }), + { name: 'x' }, + { name: 'y' }, + { name: 'position', independent: true }, + { name: 'size' }, + { name: 'series', scale: 'band' }, + ], + preInference: [ + ...(0, utils_1.basePreInference)(), + // !!!Note This order is very important. + { type: transform_1.MaybeGradient }, + { type: transform_1.MaybeSeries }, + ], + postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip1d)(), ...(0, utils_1.tooltipXd)()], + interaction: { + shareTooltip: true, + seriesTooltip: true, + crosshairs: true, + }, +}; +//# sourceMappingURL=line.js.map +}, function(modId) { var map = {"../utils/coordinate":1751263815882,"../shape":1751263815879,"../transform":1751263815823,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815976, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Point = void 0; +const shape_1 = require("../shape"); +const transform_1 = require("../transform"); +const utils_1 = require("./utils"); +const shape = { + hollow: shape_1.PointHollow, + hollowDiamond: shape_1.PointHollowDiamond, + hollowHexagon: shape_1.PointHollowHexagon, + hollowSquare: shape_1.PointHollowSquare, + hollowTriangleDown: shape_1.PointHollowTriangleDown, + hollowTriangle: shape_1.PointHollowTriangle, + hollowBowtie: shape_1.PointHollowBowtie, + hollowCircle: shape_1.PointHollowCircle, + point: shape_1.PointShape, + plus: shape_1.PointPlus, + diamond: shape_1.PointDiamond, + square: shape_1.PointSquare, + triangle: shape_1.PointTriangle, + hexagon: shape_1.PointHexagon, + cross: shape_1.PointCross, + bowtie: shape_1.PointBowtie, + hyphen: shape_1.PointHyphen, + line: shape_1.PointLine, + tick: shape_1.PointTick, + triangleDown: shape_1.PointTriangleDown, + circle: shape_1.PointCircle, +}; +/** + * Convert value for each channel to point shapes. + * Calc the bbox of each point based on x, y and r. + * This is for allowing their radius can be affected by coordinate(e.g. fisheye). + */ +const Point = (options) => { + return (index, scale, value, coordinate) => { + const { x: X, y: Y, x1: X1, y1: Y1, size: S, dx: DX, dy: DY } = value; + const [width, height] = coordinate.getSize(); + const offset = (0, utils_1.createBandOffset)(scale, value, options); + const xy = (i) => { + const dx = +((DX === null || DX === void 0 ? void 0 : DX[i]) || 0); + const dy = +((DY === null || DY === void 0 ? void 0 : DY[i]) || 0); + const x = X1 ? (+X[i] + +X1[i]) / 2 : +X[i]; + const y = Y1 ? (+Y[i] + +Y1[i]) / 2 : +Y[i]; + const cx = x + dx; + const cy = y + dy; + return [cx, cy]; + }; + const P = S + ? Array.from(index, (i) => { + const [cx, cy] = xy(i); + const r = +S[i]; + const a = r / width; + const b = r / height; + const p1 = [cx - a, cy - b]; + const p2 = [cx + a, cy + b]; + return [ + coordinate.map(offset(p1, i)), + coordinate.map(offset(p2, i)), + ]; + }) + : Array.from(index, (i) => [coordinate.map(offset(xy(i), i))]); + return [index, P]; + }; +}; +exports.Point = Point; +exports.Point.props = { + defaultShape: 'hollow', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }), + { name: 'x', required: true }, + { name: 'y', required: true }, + { name: 'series', scale: 'band' }, + { name: 'size', quantitative: 'sqrt' }, + { name: 'dx', scale: 'identity' }, + { name: 'dy', scale: 'identity' }, + ], + preInference: [ + ...(0, utils_1.basePreInference)(), + { type: transform_1.MaybeZeroX }, + { type: transform_1.MaybeZeroY }, + ], + postInference: [...(0, utils_1.basePostInference)(), { type: transform_1.MaybeSize }, ...(0, utils_1.tooltip2d)()], +}; +//# sourceMappingURL=point.js.map +}, function(modId) { var map = {"../shape":1751263815879,"../transform":1751263815823,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815977, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Text = void 0; +const shape_1 = require("../shape"); +const transform_1 = require("../transform"); +const utils_1 = require("./utils"); +const shape = { + text: shape_1.TextShape, + badge: shape_1.TextBadge, + tag: shape_1.TextTag, +}; +const Text = (options) => { + const { cartesian = false } = options; + if (cartesian) + return utils_1.visualMark; + return ((index, scale, value, coordinate) => { + const { x: X, y: Y } = value; + const offset = (0, utils_1.createBandOffset)(scale, value, options); + const P = Array.from(index, (i) => { + const p = [+X[i], +Y[i]]; + return [coordinate.map(offset(p, i))]; + }); + return [index, P]; + }); +}; +exports.Text = Text; +exports.Text.props = { + defaultShape: 'text', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }), + { name: 'x', required: true }, + { name: 'y', required: true }, + { name: 'text', scale: 'identity' }, + { name: 'fontSize', scale: 'identity' }, + { name: 'rotate', scale: 'identity' }, + ], + preInference: [ + ...(0, utils_1.basePreInference)(), + { type: transform_1.MaybeTuple }, + { type: transform_1.MaybeVisualPosition }, + ], + postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip2d)()], +}; +//# sourceMappingURL=text.js.map +}, function(modId) { var map = {"../shape":1751263815879,"../transform":1751263815823,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815978, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Cell = void 0; +const shape_1 = require("../shape"); +const transform_1 = require("../transform"); +const utils_1 = require("./utils"); +const shape = { + cell: shape_1.CellShape, + hollow: shape_1.CellHollow, +}; +/** + * Convert value for each channel to Cell shapes. + * Calc the bbox of each Cell based on x, y and r. + * This is for allowing their radius can be affected by coordinate(e.g. fisheye). + */ +const Cell = () => { + return (index, scale, value, coordinate) => { + const { x: X, y: Y } = value; + const x = scale.x; + const y = scale.y; + const P = Array.from(index, (i) => { + const width = x.getBandWidth(x.invert(+X[i])); + const height = y.getBandWidth(y.invert(+Y[i])); + const x1 = +X[i]; + const y1 = +Y[i]; + const p1 = [x1, y1]; + const p2 = [x1 + width, y1]; + const p3 = [x1 + width, y1 + height]; + const p4 = [x1, y1 + height]; + return [p1, p2, p3, p4].map((d) => coordinate.map(d)); + }); + return [index, P]; + }; +}; +exports.Cell = Cell; +exports.Cell.props = { + defaultShape: 'cell', + defaultLabelShape: 'label', + shape, + composite: false, + channels: [ + ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }), + { name: 'x', required: true, scale: 'band' }, + { name: 'y', required: true, scale: 'band' }, + ], + preInference: [ + ...(0, utils_1.basePreInference)(), + { type: transform_1.MaybeZeroX }, + { type: transform_1.MaybeZeroY }, + { type: transform_1.MaybeZeroPadding }, + ], + postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip2d)()], +}; +//# sourceMappingURL=cell.js.map +}, function(modId) { var map = {"../shape":1751263815879,"../transform":1751263815823,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815979, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Area = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +const shape_1 = require("../shape"); +const transform_1 = require("../transform"); +const utils_1 = require("./utils"); +const shape = { + area: shape_1.AreaShape, + smooth: shape_1.AreaSmooth, + hvh: shape_1.AreaHVH, + vh: shape_1.AreaVH, + hv: shape_1.AreaHV, +}; +/* + * Convert value for each channel to area shapes. + * + * ▲ + * │ + * │ y2 + * │ + * │ y1 xxxxxxxxxxxxx + * │ xxxx x + * │ xxx x + * │ xxx x + * │ y0 xxx x + * │ xxxxxxx x + * │ x x + * │ xx x + * │ x x + * │ x x + * │ x x + * │ x x + * │ x x + * │ x x + * │ x x + * ────┼─────────x───────────────────────────────x──────────────► + * │ y3 y4 y5 + */ +const Area = () => { + return (index, scale, value, coordinate) => { + var _a, _b; + const { x: X, y: Y, y1: Y1, series: S } = value; + const { x, y } = scale; + // Group data by series field. + const series = S ? Array.from((0, d3_array_1.group)(index, (i) => S[i]).values()) : [index]; + const I = series.map((group) => group[0]).filter((i) => i !== undefined); + // A group of data corresponds to one area. + const xoffset = (((_a = x === null || x === void 0 ? void 0 : x.getBandWidth) === null || _a === void 0 ? void 0 : _a.call(x)) || 0) / 2; + const yoffset = (((_b = y === null || y === void 0 ? void 0 : y.getBandWidth) === null || _b === void 0 ? void 0 : _b.call(y)) || 0) / 2; + const P = Array.from(series, (SI) => { + const l = SI.length; + const points = new Array(l * 2); + for (let idx = 0; idx < SI.length; idx++) { + const i = SI[idx]; + points[idx] = coordinate.map([+X[i] + xoffset, +Y[i] + yoffset]); // y1 + points[l + idx] = coordinate.map([+X[i] + xoffset, +Y1[i] + yoffset]); // y0 + } + return points; + }); + return [I, P, series]; + }; +}; +exports.Area = Area; +exports.Area.props = { + defaultShape: 'area', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }), + { name: 'x', required: true }, + { name: 'y', required: true }, + { name: 'size' }, + { name: 'series', scale: 'band' }, + ], + preInference: [ + ...(0, utils_1.basePreInference)(), + { type: transform_1.MaybeSeries }, + { type: transform_1.MaybeZeroY1 }, + { type: transform_1.MaybeZeroPadding }, + ], + postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip1d)()], + interaction: { + shareTooltip: true, + seriesTooltip: true, + crosshairs: true, + }, +}; +//# sourceMappingURL=area.js.map +}, function(modId) { var map = {"../shape":1751263815879,"../transform":1751263815823,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815980, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Link = void 0; +const transform_1 = require("../transform"); +const shape_1 = require("../shape"); +const utils_1 = require("./utils"); +const shape = { + link: shape_1.LinkShape, + arc: shape_1.LinkArc, + smooth: shape_1.LinkSmooth, + vhv: shape_1.LinkVHV, +}; +/** + * Connect `start` to `end` with single line. + */ +const Link = (options) => { + return (index, scale, value, coordinate) => { + const { x: X, y: Y, x1: X1 = X, y1: Y1 = Y } = value; + const offset = (0, utils_1.createBandOffset)(scale, value, options); + const P = index.map((i) => [ + coordinate.map(offset([+X[i], +Y[i]], i)), + coordinate.map(offset([+X1[i], +Y1[i]], i)), + ]); + return [index, P]; + }; +}; +exports.Link = Link; +exports.Link.props = { + defaultShape: 'link', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }), + { name: 'x', required: true }, + { name: 'y', required: true }, + ], + preInference: [ + ...(0, utils_1.basePreInference)(), + { type: transform_1.MaybeIdentityY }, + { type: transform_1.MaybeIdentityX }, + ], + postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip2d)()], +}; +//# sourceMappingURL=link.js.map +}, function(modId) { var map = {"../transform":1751263815823,"../shape":1751263815879,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815981, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Image = void 0; +const transform_1 = require("../transform"); +const shape_1 = require("../shape"); +const utils_1 = require("./utils"); +const shape = { + image: shape_1.ImageShape, +}; +const Image = (options) => { + const { cartesian } = options; + if (cartesian) + return utils_1.visualMark; + return (index, scale, value, coordinate) => { + const { x: X, y: Y } = value; + const offset = (0, utils_1.createBandOffset)(scale, value, options); + const P = Array.from(index, (i) => { + const p = [+X[i], +Y[i]]; + return [coordinate.map(offset(p, i))]; + }); + return [index, P]; + }; +}; +exports.Image = Image; +exports.Image.props = { + defaultShape: 'image', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }), + { name: 'x', required: true }, + { name: 'y', required: true }, + { name: 'src', scale: 'identity' }, + { name: 'size' }, + ], + preInference: [ + ...(0, utils_1.basePreInference)(), + { type: transform_1.MaybeTuple }, + { type: transform_1.MaybeVisualPosition }, + ], + postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip2d)()], +}; +//# sourceMappingURL=image.js.map +}, function(modId) { var map = {"../transform":1751263815823,"../shape":1751263815879,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815982, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Polygon = void 0; +const shape_1 = require("../shape"); +const utils_1 = require("./utils"); +const shape = { + polygon: shape_1.PolygonShape, + ribbon: shape_1.PolygonRibbon, +}; +/** + * Convert value for each channel to polygon shapes. + */ +const Polygon = () => { + return (index, scale, value, coordinate) => { + const Xn = Object.entries(value) + .filter(([key]) => key.startsWith('x')) + .map(([, value]) => value); + const Yn = Object.entries(value) + .filter(([key]) => key.startsWith('y')) + .map(([, value]) => value); + const P = index.map((i) => { + const Pn = []; + for (let j = 0; j < Xn.length; j++) { + const x = Xn[j][i]; + if (x === undefined) + break; + const y = Yn[j][i]; + Pn.push(coordinate.map([+x, +y])); + } + return Pn; + }); + return [index, P]; + }; +}; +exports.Polygon = Polygon; +exports.Polygon.props = { + defaultShape: 'polygon', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }), + { name: 'x', required: true }, + { name: 'y', required: true }, + ], + preInference: [...(0, utils_1.basePreInference)()], + postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip2d)()], +}; +//# sourceMappingURL=polygon.js.map +}, function(modId) { var map = {"../shape":1751263815879,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815983, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Box = void 0; +const shape_1 = require("../shape"); +const transform_1 = require("../transform"); +const utils_1 = require("./utils"); +const shape = { + box: shape_1.BoxShape, + violin: shape_1.BoxViolin, +}; +/** + * Convert value for each channel to box shapes. + * + * p0 p2 p1 + * ──────────┬────────── + * │ + * │ + * │ + * │ + * │ + * │ + * │ p3 + * p4 ┌─────────┴──────────┐ p5 + * │ │ + * │ │ + * p8 ├────────────────────┤ p9 + * │ │ + * │ p10 │ + * p7 └─────────┬──────────┘ p6 + * │ + * │ + * │ + * │ + * │ + * │ + * │ + * │ + * ───────────┴─────────── + * p12 p11 p13 + */ +const Box = () => { + return (index, scale, value, coordinate) => { + const { x: X, y: Y, y1: Y1, y2: Y2, y3: Y3, y4: Y4, series: S } = value; + // Calc width for each box. + // The scales for x and series channels must be band scale. + const xScale = scale.x; + const series = scale.series; + const P = Array.from(index, (i) => { + const groupWidth = xScale.getBandWidth(xScale.invert(+X[i])); + const ratio = series ? series.getBandWidth(series.invert(+(S === null || S === void 0 ? void 0 : S[i]))) : 1; + const width = groupWidth * ratio; + const offset = (+(S === null || S === void 0 ? void 0 : S[i]) || 0) * groupWidth; + const x = +X[i] + offset + width / 2; + const [low, q1, median, q3, high] = [ + +Y[i], + +Y1[i], + +Y2[i], + +Y3[i], + +Y4[i], + ]; + const P13 = [ + [x - width / 2, high], + [x + width / 2, high], + [x, high], + [x, q3], + [x - width / 2, q3], + [x + width / 2, q3], + [x + width / 2, q1], + [x - width / 2, q1], + [x - width / 2, median], + [x + width / 2, median], + [x, q1], + [x, low], + [x - width / 2, low], + [x + width / 2, low], + ]; + return P13.map((d) => coordinate.map(d)); + }); + return [index, P]; + }; +}; +exports.Box = Box; +exports.Box.props = { + defaultShape: 'box', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }), + { name: 'x', scale: 'band', required: true }, + { name: 'y', required: true }, + { name: 'series', scale: 'band' }, + ], + preInference: [...(0, utils_1.basePreInference)(), { type: transform_1.MaybeZeroX }], + postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip1d)()], + interaction: { + shareTooltip: true, + }, +}; +//# sourceMappingURL=box.js.map +}, function(modId) { var map = {"../shape":1751263815879,"../transform":1751263815823,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815984, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Vector = void 0; +const shape_1 = require("../shape"); +const utils_1 = require("./utils"); +const shape = { + vector: shape_1.VectorShape, +}; +/** + * Convert value for each channel to start, end. + * The angle starts from the X axis(right direction). + */ +const Vector = () => { + return (index, scale, value, coordinate) => { + const { x: X, y: Y, size: S, rotate: R } = value; + const [width, height] = coordinate.getSize(); + const P = index.map((i) => { + const angle = (+R[i] / 180) * Math.PI; + const s = +S[i]; + const a = s / width; + const b = s / height; + const vx = a * Math.cos(angle); + const vy = -b * Math.sin(angle); + return [ + coordinate.map([+X[i] - vx / 2, +Y[i] - vy / 2]), + coordinate.map([+X[i] + vx / 2, +Y[i] + vy / 2]), + ]; + }); + return [index, P]; + }; +}; +exports.Vector = Vector; +exports.Vector.props = { + defaultShape: 'vector', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }), + { name: 'x', required: true }, + { name: 'y', required: true }, + { name: 'rotate', required: true, scale: 'identity' }, + { name: 'size', required: true }, + ], + preInference: [...(0, utils_1.basePreInference)()], + postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip2d)()], +}; +//# sourceMappingURL=vector.js.map +}, function(modId) { var map = {"../shape":1751263815879,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815985, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LineY = void 0; +const util_1 = require("@antv/util"); +const shape_1 = require("../shape"); +const transform_1 = require("../transform"); +const utils_1 = require("./utils"); +const shape = { + line: shape_1.LineXY, +}; +const LineY = (options) => { + return (index, scale, value, coordinate) => { + const { y: Y } = value; + const offset = (0, utils_1.createBandOffset)(scale, value, (0, util_1.deepMix)({ style: { bandOffset: 0 } }, options)); + const P = Array.from(index, (i) => { + const p1 = [0, Y[i]]; + const p2 = [1, Y[i]]; + return [p1, p2].map((d) => coordinate.map(offset(d, i))); + }); + return [index, P]; + }; +}; +exports.LineY = LineY; +exports.LineY.props = { + defaultShape: 'line', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseAnnotationChannels)({ shapes: Object.keys(shape) }), + { name: 'y', required: true }, + ], + preInference: [...(0, utils_1.basePreInference)(), { type: transform_1.MaybeTupleY }], + postInference: [...(0, utils_1.basePostInference)()], +}; +//# sourceMappingURL=lineY.js.map +}, function(modId) { var map = {"../shape":1751263815879,"../transform":1751263815823,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815986, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LineX = void 0; +const util_1 = require("@antv/util"); +const shape_1 = require("../shape"); +const transform_1 = require("../transform"); +const utils_1 = require("./utils"); +const shape = { + line: shape_1.LineXY, +}; +const LineX = (options) => { + return (index, scale, value, coordinate) => { + const { x: X } = value; + const offset = (0, utils_1.createBandOffset)(scale, value, (0, util_1.deepMix)({ style: { bandOffset: 0 } }, options)); + const P = Array.from(index, (i) => { + const p1 = [X[i], 1]; + const p2 = [X[i], 0]; + return [p1, p2].map((d) => coordinate.map(offset(d, i))); + }); + return [index, P]; + }; +}; +exports.LineX = LineX; +exports.LineX.props = { + defaultShape: 'line', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseAnnotationChannels)({ shapes: Object.keys(shape) }), + { name: 'x', required: true }, + ], + preInference: [...(0, utils_1.basePreInference)(), { type: transform_1.MaybeTupleX }], + postInference: [...(0, utils_1.basePostInference)()], +}; +//# sourceMappingURL=lineX.js.map +}, function(modId) { var map = {"../shape":1751263815879,"../transform":1751263815823,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815987, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Connector = void 0; +const shape_1 = require("../shape"); +const utils_1 = require("./utils"); +const link_1 = require("./link"); +const shape = { + connector: shape_1.ConnectorShape, +}; +const Connector = (...args) => { + return (0, link_1.Link)(...args); +}; +exports.Connector = Connector; +exports.Connector.props = { + defaultShape: 'connector', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseAnnotationChannels)({ shapes: Object.keys(shape) }), + { name: 'x', required: true }, + { name: 'y', required: true }, + ], + preInference: [...(0, utils_1.basePreInference)()], + postInference: [...(0, utils_1.basePostInference)()], +}; +//# sourceMappingURL=connector.js.map +}, function(modId) { var map = {"../shape":1751263815879,"./utils":1751263815937,"./link":1751263815980}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815988, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Range = exports.AbstractRange = void 0; +const shape_1 = require("../shape"); +const utils_1 = require("./utils"); +function extend(channel, extended, value, scale) { + if (extended) + return () => [0, 1]; + const { [channel]: C, [`${channel}1`]: C1 } = value; + return (i) => { + var _a; + const offset = ((_a = scale.getBandWidth) === null || _a === void 0 ? void 0 : _a.call(scale, scale.invert(+C1[i]))) || 0; + return [C[i], C1[i] + offset]; + }; +} +function AbstractRange(options = {}) { + const { extendX = false, extendY = false } = options; + return (index, scale, value, coordinate) => { + const x = extend('x', extendX, value, scale.x); + const y = extend('y', extendY, value, scale.y); + const P = Array.from(index, (i) => { + const [x1, x2] = x(i); + const [y1, y2] = y(i); + const p1 = [x1, y1]; + const p2 = [x2, y1]; + const p3 = [x2, y2]; + const p4 = [x1, y2]; + return [p1, p2, p3, p4].map((d) => coordinate.map(d)); + }); + return [index, P]; + }; +} +exports.AbstractRange = AbstractRange; +const shape = { range: shape_1.RangeShape }; +const Range = () => { + return AbstractRange(); +}; +exports.Range = Range; +exports.Range.props = { + defaultShape: 'range', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseAnnotationChannels)({ shapes: Object.keys(shape) }), + { name: 'x', required: true }, + { name: 'y', required: true }, + ], + preInference: [...(0, utils_1.basePreInference)()], + postInference: [...(0, utils_1.basePostInference)()], +}; +//# sourceMappingURL=range.js.map +}, function(modId) { var map = {"../shape":1751263815879,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815989, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RangeX = void 0; +const shape_1 = require("../shape"); +const transform_1 = require("../transform"); +const utils_1 = require("./utils"); +const range_1 = require("./range"); +const shape = { + range: shape_1.RangeShape, +}; +const RangeX = () => { + return (0, range_1.AbstractRange)({ extendY: true }); +}; +exports.RangeX = RangeX; +exports.RangeX.props = { + defaultShape: 'range', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseAnnotationChannels)({ shapes: Object.keys(shape) }), + { name: 'x', required: true }, + ], + preInference: [...(0, utils_1.basePreInference)(), { type: transform_1.MaybeDefaultX }], + postInference: [...(0, utils_1.basePostInference)()], +}; +//# sourceMappingURL=rangeX.js.map +}, function(modId) { var map = {"../shape":1751263815879,"../transform":1751263815823,"./utils":1751263815937,"./range":1751263815988}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815990, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RangeY = void 0; +const shape_1 = require("../shape"); +const transform_1 = require("../transform"); +const utils_1 = require("./utils"); +const range_1 = require("./range"); +const shape = { + range: shape_1.RangeShape, +}; +const RangeY = () => { + return (0, range_1.AbstractRange)({ extendX: true }); +}; +exports.RangeY = RangeY; +exports.RangeY.props = { + defaultShape: 'range', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseAnnotationChannels)({ shapes: Object.keys(shape) }), + { name: 'y', required: true }, + ], + preInference: [...(0, utils_1.basePreInference)(), { type: transform_1.MaybeDefaultY }], + postInference: [...(0, utils_1.basePostInference)()], +}; +//# sourceMappingURL=rangeY.js.map +}, function(modId) { var map = {"../shape":1751263815879,"../transform":1751263815823,"./utils":1751263815937,"./range":1751263815988}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815991, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Sankey = void 0; +const util_1 = require("@antv/util"); +const sankey_1 = require("../data/sankey"); +const helper_1 = require("../utils/helper"); +const mark_1 = require("../utils/mark"); +const utils_1 = require("./utils"); +const DEFAULT_LAYOUT_OPTIONS = { + nodeId: (d) => d.key, + nodeWidth: 0.02, + nodePadding: 0.02, +}; +const DEFAULT_NODE_OPTIONS = { + type: 'polygon', + axis: false, + legend: false, + encode: { + shape: 'polygon', + x: 'x', + y: 'y', + }, + scale: { + x: { type: 'identity' }, + y: { type: 'identity' }, + }, + style: { + stroke: '#000', + }, +}; +const DEFAULT_LINK_OPTIONS = { + type: 'polygon', + axis: false, + legend: false, + encode: { + shape: 'ribbon', + x: 'x', + y: 'y', + }, + style: { + fillOpacity: 0.5, + stroke: undefined, + }, +}; +const DEFAULT_LABEL_OPTIONS = { + textAlign: (d) => (d.x[0] < 0.5 ? 'start' : 'end'), + position: (d) => (d.x[0] < 0.5 ? 'right' : 'left'), + fontSize: 10, +}; +/** + * @todo Add interaction + * @todo Add source-link color mode + */ +const Sankey = (options) => { + const { data, encode = {}, scale, style = {}, layout = {}, nodeLabels = [], linkLabels = [], animate = {}, tooltip = {}, interaction, } = options; + // Initialize data, generating nodes by link if is not specified. + const { links, nodes } = (0, utils_1.initializeData)(data, encode); + // Extract encode for node and link. + const nodeEncode = (0, helper_1.subObject)(encode, 'node'); + const linkEncode = (0, helper_1.subObject)(encode, 'link'); + const { key: nodeKey = (d) => d.key, color = nodeKey } = nodeEncode; + // Transform data, using nodeKey as nodeId. + const { links: linkData, nodes: nodeData } = (0, sankey_1.Sankey)(Object.assign(Object.assign(Object.assign({}, DEFAULT_LAYOUT_OPTIONS), { nodeId: (0, utils_1.field)(nodeKey) }), layout))({ links, nodes }); + // Extract label style and apply defaults. + const _a = (0, helper_1.subObject)(style, 'label'), { text = nodeKey, spacing = 5 } = _a, labelStyle = __rest(_a, ["text", "spacing"]); + const key1 = (0, utils_1.field)(nodeKey); + const nodeTooltip = (0, mark_1.subTooltip)(tooltip, 'node', { + title: key1, + items: [{ field: 'value' }], + }, true); + const linkTooltip = (0, mark_1.subTooltip)(tooltip, 'link', { + title: '', + items: [ + (d) => ({ name: 'source', value: key1(d.source) }), + (d) => ({ name: 'target', value: key1(d.target) }), + ], + }); + return [ + (0, util_1.deepMix)({}, DEFAULT_NODE_OPTIONS, { + data: nodeData, + encode: Object.assign(Object.assign({}, nodeEncode), { color }), + scale, + style: (0, helper_1.subObject)(style, 'node'), + labels: [ + Object.assign(Object.assign(Object.assign({}, DEFAULT_LABEL_OPTIONS), { text, dx: (d) => (d.x[0] < 0.5 ? spacing : -spacing) }), labelStyle), + ...nodeLabels, + ], + tooltip: nodeTooltip, + animate: (0, mark_1.maybeAnimation)(animate, 'node'), + axis: false, + interaction, + }), + (0, util_1.deepMix)({}, DEFAULT_LINK_OPTIONS, { + data: linkData, + encode: linkEncode, + labels: linkLabels, + style: Object.assign({ fill: linkEncode.color ? undefined : '#aaa', lineWidth: 0 }, (0, helper_1.subObject)(style, 'link')), + tooltip: linkTooltip, + animate: (0, mark_1.maybeAnimation)(animate, 'link'), + interaction, + }), + ]; +}; +exports.Sankey = Sankey; +exports.Sankey.props = {}; +//# sourceMappingURL=sankey.js.map +}, function(modId) { var map = {"../data/sankey":1751263815992,"../utils/helper":1751263815829,"../utils/mark":1751263815997,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815992, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Sankey = void 0; +const d3_sankey_1 = require("./utils/d3-sankey"); +const DEFAULT_OPTIONS = { + nodeAlign: 'justify', + nodeWidth: 0.008, + nodePadding: 0.03, + nodes: (graph) => graph.nodes, + links: (graph) => graph.links, + nodeSort: undefined, + linkSort: undefined, + iterations: 6, +}; +const ALIGN_METHOD = { + left: d3_sankey_1.left, + right: d3_sankey_1.right, + center: d3_sankey_1.center, + justify: d3_sankey_1.justify, +}; +function getNodeAlignFunction(nodeAlign) { + const type = typeof nodeAlign; + if (type === 'string') + return ALIGN_METHOD[nodeAlign] || d3_sankey_1.justify; + if (type === 'function') + return nodeAlign; + return d3_sankey_1.justify; +} +/** + * Compute the node and edge position, return a graph representing the Sankey layout. All will be normalized to [[0, 0], [1, 1]] + * Required graph data (nodes, edges) + */ +const Sankey = (options) => { + return (data) => { + const { nodeId, nodeSort, nodeAlign, nodeWidth, nodePadding, nodeDepth, nodes: nodeNodes, links: nodeLinks, linkSort, iterations, } = Object.assign({}, DEFAULT_OPTIONS, options); + const sankeyProcessor = (0, d3_sankey_1.sankey)() + .nodeSort(nodeSort) + .linkSort(linkSort) + .links(nodeLinks) + .nodes(nodeNodes) + .nodeWidth(nodeWidth) + .nodePadding(nodePadding) + .nodeDepth(nodeDepth) + .nodeAlign(getNodeAlignFunction(nodeAlign)) + .iterations(iterations) + .extent([ + [0, 0], + [1, 1], + ]); + if (typeof nodeId === 'function') { + sankeyProcessor.nodeId(nodeId); + } + const layoutData = sankeyProcessor(data); + const { nodes: N, links: L } = layoutData; + const nodes = N.map((node) => { + const { x0, x1, y0, y1 } = node; + /* points + * 3---2 + * | | + * 0---1 + */ + return Object.assign(Object.assign({}, node), { x: [x0, x1, x1, x0], y: [y0, y0, y1, y1] }); + }); + const links = L.map((edge) => { + const { source, target } = edge; + const sx = source.x1; + const tx = target.x0; + const offset = edge.width / 2; + return Object.assign(Object.assign({}, edge), { x: [sx, sx, tx, tx], y: [ + edge.y0 + offset, + edge.y0 - offset, + edge.y1 + offset, + edge.y1 - offset, + ] }); + }); + return { nodes, links }; + }; +}; +exports.Sankey = Sankey; +exports.Sankey.props = {}; +//# sourceMappingURL=sankey.js.map +}, function(modId) { var map = {"./utils/d3-sankey":1751263815993}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815993, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.sankey = exports.justify = exports.right = exports.left = exports.center = void 0; +/** + * Sankey layout, fork from https://github.com/d3/d3-sankey/tree/master/src (todo, optimize algorithm) + * + * Major changes: + * + * 1. modify some set and map traverse + * 2. fix some error caused by [empty] array + * 3. support `nodeDepth` through align method + */ +const sankey_1 = require("./sankey"); +Object.defineProperty(exports, "sankey", { enumerable: true, get: function () { return sankey_1.Sankey; } }); +var align_1 = require("./align"); +Object.defineProperty(exports, "center", { enumerable: true, get: function () { return align_1.center; } }); +Object.defineProperty(exports, "left", { enumerable: true, get: function () { return align_1.left; } }); +Object.defineProperty(exports, "right", { enumerable: true, get: function () { return align_1.right; } }); +Object.defineProperty(exports, "justify", { enumerable: true, get: function () { return align_1.justify; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./sankey":1751263815994,"./align":1751263815995}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815994, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Sankey = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +const align_1 = require("./align"); +const constant_1 = require("./constant"); +function ascendingSourceBreadth(a, b) { + return ascendingBreadth(a.source, b.source) || a.index - b.index; +} +function ascendingTargetBreadth(a, b) { + return ascendingBreadth(a.target, b.target) || a.index - b.index; +} +function ascendingBreadth(a, b) { + return a.y0 - b.y0; +} +function value(d) { + return d.value; +} +function defaultId(d) { + return d.index; +} +function defaultNodes(graph) { + return graph.nodes; +} +function defaultLinks(graph) { + return graph.links; +} +function find(nodeById, id) { + const node = nodeById.get(id); + if (!node) + throw new Error('missing: ' + id); + return node; +} +function computeLinkBreadths({ nodes }) { + for (const node of nodes) { + let y0 = node.y0; + let y1 = y0; + for (const link of node.sourceLinks) { + link.y0 = y0 + link.width / 2; + y0 += link.width; + } + for (const link of node.targetLinks) { + link.y1 = y1 + link.width / 2; + y1 += link.width; + } + } +} +function Sankey() { + let x0 = 0, y0 = 0, x1 = 1, y1 = 1; // extent + let dx = 24; // nodeWidth + let dy = 8, py; // nodePadding + let id = defaultId; + let align = align_1.justify; + let depth; + let sort; + let linkSort; + let nodes = defaultNodes; + let links = defaultLinks; + let iterations = 6; + function sankey(arg) { + const graph = { + nodes: nodes(arg), + links: links(arg), + }; + computeNodeLinks(graph); + computeNodeValues(graph); + computeNodeDepths(graph); + computeNodeHeights(graph); + computeNodeBreadths(graph); + computeLinkBreadths(graph); + return graph; + } + sankey.update = function (graph) { + computeLinkBreadths(graph); + return graph; + }; + sankey.nodeId = function (_) { + return arguments.length + ? ((id = typeof _ === 'function' ? _ : (0, constant_1.constant)(_)), sankey) + : id; + }; + sankey.nodeAlign = function (_) { + return arguments.length + ? ((align = typeof _ === 'function' ? _ : (0, constant_1.constant)(_)), sankey) + : align; + }; + sankey.nodeDepth = function (_) { + return arguments.length + ? ((depth = typeof _ === 'function' ? _ : _), sankey) + : depth; + }; + sankey.nodeSort = function (_) { + return arguments.length ? ((sort = _), sankey) : sort; + }; + sankey.nodeWidth = function (_) { + return arguments.length ? ((dx = +_), sankey) : dx; + }; + sankey.nodePadding = function (_) { + return arguments.length ? ((dy = py = +_), sankey) : dy; + }; + sankey.nodes = function (_) { + return arguments.length + ? ((nodes = typeof _ === 'function' ? _ : (0, constant_1.constant)(_)), sankey) + : nodes; + }; + sankey.links = function (_) { + return arguments.length + ? ((links = typeof _ === 'function' ? _ : (0, constant_1.constant)(_)), sankey) + : links; + }; + sankey.linkSort = function (_) { + return arguments.length ? ((linkSort = _), sankey) : linkSort; + }; + sankey.size = function (_) { + return arguments.length + ? ((x0 = y0 = 0), (x1 = +_[0]), (y1 = +_[1]), sankey) + : [x1 - x0, y1 - y0]; + }; + sankey.extent = function (_) { + return arguments.length + ? ((x0 = +_[0][0]), + (x1 = +_[1][0]), + (y0 = +_[0][1]), + (y1 = +_[1][1]), + sankey) + : [ + [x0, y0], + [x1, y1], + ]; + }; + sankey.iterations = function (_) { + return arguments.length ? ((iterations = +_), sankey) : iterations; + }; + function computeNodeLinks({ nodes, links }) { + nodes.forEach((node, idx) => { + node.index = idx; + node.sourceLinks = []; + node.targetLinks = []; + }); + const nodeById = new Map(nodes.map((d) => [id(d), d])); + links.forEach((link, idx) => { + link.index = idx; + let { source, target } = link; + if (typeof source !== 'object') + source = link.source = find(nodeById, source); + if (typeof target !== 'object') + target = link.target = find(nodeById, target); + source.sourceLinks.push(link); + target.targetLinks.push(link); + }); + if (linkSort != null) { + for (const { sourceLinks, targetLinks } of nodes) { + sourceLinks.sort(linkSort); + targetLinks.sort(linkSort); + } + } + } + function computeNodeValues({ nodes }) { + for (const node of nodes) { + node.value = + node.fixedValue === undefined + ? Math.max((0, d3_array_1.sum)(node.sourceLinks, value), (0, d3_array_1.sum)(node.targetLinks, value)) + : node.fixedValue; + } + } + function computeNodeDepths({ nodes }) { + const n = nodes.length; + let current = new Set(nodes); + let next = new Set(); + let x = 0; + while (current.size) { + current.forEach((node) => { + node.depth = x; + for (const { target } of node.sourceLinks) { + next.add(target); + } + }); + if (++x > n) + throw new Error('circular link'); + current = next; + next = new Set(); + } + // 如果配置了 depth,则设置自定义 depth + if (depth) { + const maxDepth = Math.max((0, d3_array_1.max)(nodes, (d) => d.depth) + 1, 0); + let node; + for (let i = 0; i < nodes.length; i++) { + node = nodes[i]; + node.depth = depth.call(null, node, maxDepth); + } + } + } + function computeNodeHeights({ nodes }) { + const n = nodes.length; + let current = new Set(nodes); + let next = new Set(); + let x = 0; + while (current.size) { + current.forEach((node) => { + node.height = x; + for (const { source } of node.targetLinks) { + next.add(source); + } + }); + if (++x > n) + throw new Error('circular link'); + current = next; + next = new Set(); + } + } + function computeNodeLayers({ nodes }) { + const x = Math.max((0, d3_array_1.max)(nodes, (d) => d.depth) + 1, 0); + const kx = (x1 - x0 - dx) / (x - 1); + const columns = new Array(x).fill(0).map(() => []); + for (const node of nodes) { + const i = Math.max(0, Math.min(x - 1, Math.floor(align.call(null, node, x)))); + node.layer = i; + node.x0 = x0 + i * kx; + node.x1 = node.x0 + dx; + if (columns[i]) + columns[i].push(node); + else + columns[i] = [node]; + } + if (sort) + for (const column of columns) { + column.sort(sort); + } + return columns; + } + function initializeNodeBreadths(columns) { + const ky = (0, d3_array_1.min)(columns, (c) => (y1 - y0 - (c.length - 1) * py) / (0, d3_array_1.sum)(c, value)); + for (const nodes of columns) { + let y = y0; + for (const node of nodes) { + node.y0 = y; + node.y1 = y + node.value * ky; + y = node.y1 + py; + for (const link of node.sourceLinks) { + link.width = link.value * ky; + } + } + y = (y1 - y + py) / (nodes.length + 1); + for (let i = 0; i < nodes.length; ++i) { + const node = nodes[i]; + node.y0 += y * (i + 1); + node.y1 += y * (i + 1); + } + reorderLinks(nodes); + } + } + function computeNodeBreadths(graph) { + const columns = computeNodeLayers(graph); + py = Math.min(dy, (y1 - y0) / ((0, d3_array_1.max)(columns, (c) => c.length) - 1)); + initializeNodeBreadths(columns); + for (let i = 0; i < iterations; ++i) { + const alpha = Math.pow(0.99, i); + const beta = Math.max(1 - alpha, (i + 1) / iterations); + relaxRightToLeft(columns, alpha, beta); + relaxLeftToRight(columns, alpha, beta); + } + } + // Reposition each node based on its incoming (target) links. + function relaxLeftToRight(columns, alpha, beta) { + for (let i = 1, n = columns.length; i < n; ++i) { + const column = columns[i]; + for (const target of column) { + let y = 0; + let w = 0; + for (const { source, value } of target.targetLinks) { + const v = value * (target.layer - source.layer); + y += targetTop(source, target) * v; + w += v; + } + if (!(w > 0)) + continue; + const dy = (y / w - target.y0) * alpha; + target.y0 += dy; + target.y1 += dy; + reorderNodeLinks(target); + } + if (sort === undefined) + column.sort(ascendingBreadth); + if (column.length) + resolveCollisions(column, beta); + } + } + // Reposition each node based on its outgoing (source) links. + function relaxRightToLeft(columns, alpha, beta) { + for (let n = columns.length, i = n - 2; i >= 0; --i) { + const column = columns[i]; + for (const source of column) { + let y = 0; + let w = 0; + for (const { target, value } of source.sourceLinks) { + const v = value * (target.layer - source.layer); + y += sourceTop(source, target) * v; + w += v; + } + if (!(w > 0)) + continue; + const dy = (y / w - source.y0) * alpha; + source.y0 += dy; + source.y1 += dy; + reorderNodeLinks(source); + } + if (sort === undefined) + column.sort(ascendingBreadth); + if (column.length) + resolveCollisions(column, beta); + } + } + function resolveCollisions(nodes, alpha) { + const i = nodes.length >> 1; + const subject = nodes[i]; + resolveCollisionsBottomToTop(nodes, subject.y0 - py, i - 1, alpha); + resolveCollisionsTopToBottom(nodes, subject.y1 + py, i + 1, alpha); + resolveCollisionsBottomToTop(nodes, y1, nodes.length - 1, alpha); + resolveCollisionsTopToBottom(nodes, y0, 0, alpha); + } + // Push any overlapping nodes down. + function resolveCollisionsTopToBottom(nodes, y, i, alpha) { + for (; i < nodes.length; ++i) { + const node = nodes[i]; + const dy = (y - node.y0) * alpha; + if (dy > 1e-6) + (node.y0 += dy), (node.y1 += dy); + y = node.y1 + py; + } + } + // Push any overlapping nodes up. + function resolveCollisionsBottomToTop(nodes, y, i, alpha) { + for (; i >= 0; --i) { + const node = nodes[i]; + const dy = (node.y1 - y) * alpha; + if (dy > 1e-6) + (node.y0 -= dy), (node.y1 -= dy); + y = node.y0 - py; + } + } + function reorderNodeLinks({ sourceLinks, targetLinks }) { + if (linkSort === undefined) { + for (const { source: { sourceLinks }, } of targetLinks) { + sourceLinks.sort(ascendingTargetBreadth); + } + for (const { target: { targetLinks }, } of sourceLinks) { + targetLinks.sort(ascendingSourceBreadth); + } + } + } + function reorderLinks(nodes) { + if (linkSort === undefined) { + for (const { sourceLinks, targetLinks } of nodes) { + sourceLinks.sort(ascendingTargetBreadth); + targetLinks.sort(ascendingSourceBreadth); + } + } + } + // Returns the target.y0 that would produce an ideal link from source to target. + function targetTop(source, target) { + let y = source.y0 - ((source.sourceLinks.length - 1) * py) / 2; + for (const { target: node, width } of source.sourceLinks) { + if (node === target) + break; + y += width + py; + } + for (const { source: node, width } of target.targetLinks) { + if (node === source) + break; + y -= width; + } + return y; + } + // Returns the source.y0 that would produce an ideal link from source to target. + function sourceTop(source, target) { + let y = target.y0 - ((target.targetLinks.length - 1) * py) / 2; + for (const { source: node, width } of target.targetLinks) { + if (node === source) + break; + y += width + py; + } + for (const { target: node, width } of source.sourceLinks) { + if (node === target) + break; + y -= width; + } + return y; + } + return sankey; +} +exports.Sankey = Sankey; +//# sourceMappingURL=sankey.js.map +}, function(modId) { var map = {"./align":1751263815995,"./constant":1751263815996}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815995, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.center = exports.justify = exports.right = exports.left = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +function targetDepth(d) { + return d.target.depth; +} +function left(node) { + return node.depth; +} +exports.left = left; +function right(node, n) { + return n - 1 - node.height; +} +exports.right = right; +function justify(node, n) { + return node.sourceLinks.length ? node.depth : n - 1; +} +exports.justify = justify; +function center(node) { + return node.targetLinks.length + ? node.depth + : node.sourceLinks.length + ? (0, d3_array_1.min)(node.sourceLinks, targetDepth) - 1 + : 0; +} +exports.center = center; +//# sourceMappingURL=align.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815996, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.constant = void 0; +function constant(x) { + return function () { + return x; + }; +} +exports.constant = constant; +//# sourceMappingURL=constant.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815997, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.maybeAnimation = exports.isFullTooltip = exports.maybeTooltip = exports.subTooltip = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("./helper"); +function subTooltip(tooltip, name, defaults = {}, main = false) { + if ((0, helper_1.isUnset)(tooltip)) + return tooltip; + if (Array.isArray(tooltip) && main) + return tooltip; + const sub = (0, helper_1.subObject)(tooltip, name); + return (0, util_1.deepMix)(defaults, sub); +} +exports.subTooltip = subTooltip; +function maybeTooltip(tooltip, defaults = {}) { + if ((0, helper_1.isUnset)(tooltip)) + return tooltip; + if (Array.isArray(tooltip)) + return tooltip; + if (!isFullTooltip(tooltip)) + return tooltip; + return (0, util_1.deepMix)(defaults, tooltip); +} +exports.maybeTooltip = maybeTooltip; +function isFullTooltip(tooltip) { + if (Object.keys(tooltip).length === 0) + return true; + const { title, items } = tooltip; + return title !== undefined || items !== undefined; +} +exports.isFullTooltip = isFullTooltip; +function maybeAnimation(animate, sub) { + return typeof animate === 'object' ? (0, helper_1.subObject)(animate, sub) : animate; +} +exports.maybeAnimation = maybeAnimation; +//# sourceMappingURL=mark.js.map +}, function(modId) { var map = {"./helper":1751263815829}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815998, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Chord = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("../utils/helper"); +const mark_1 = require("../utils/mark"); +const arc_1 = require("../data/arc"); +const utils_1 = require("./utils"); +const DEFAULT_LAYOUT_OPTIONS = { + y: 0, + thickness: 0.05, + marginRatio: 0.1, + id: (node) => node.key, + source: (edge) => edge.source, + target: (edge) => edge.target, + sourceWeight: (edge) => edge.value || 1, + targetWeight: (edge) => edge.value || 1, + sortBy: null, // optional, id | weight | frequency | {function} +}; +const DEFAULT_NODE_OPTIONS = { + type: 'polygon', + axis: false, + legend: false, + encode: { + shape: 'polygon', + x: 'x', + y: 'y', + }, + scale: { + x: { type: 'identity' }, + y: { type: 'identity' }, + }, + style: { + opacity: 1, + fillOpacity: 1, + lineWidth: 1, + }, +}; +const DEFAULT_LINK_OPTIONS = { + type: 'polygon', + axis: false, + legend: false, + encode: { + shape: 'ribbon', + x: 'x', + y: 'y', + }, + style: { + opacity: 0.5, + lineWidth: 1, + }, +}; +const DEFAULT_LABEL_OPTIONS = { + position: 'outside', + fontSize: 10, +}; +const Chord = (options, context) => { + const { data, encode = {}, scale, style = {}, layout = {}, nodeLabels = [], linkLabels = [], animate = {}, tooltip = {}, } = options; + // Initialize data, generating nodes by link if is not specified. + const { nodes, links } = (0, utils_1.initializeData)(data, encode); + // Extract encode for node and link. + const nodeEncode = (0, helper_1.subObject)(encode, 'node'); + const linkEncode = (0, helper_1.subObject)(encode, 'link'); + const { key: nodeKey = (d) => d.key, color = nodeKey } = nodeEncode; + const { linkEncodeColor = (d) => d.source } = linkEncode; + const { nodeWidthRatio = DEFAULT_LAYOUT_OPTIONS.thickness, nodePaddingRatio = DEFAULT_LAYOUT_OPTIONS.marginRatio } = layout, restLayout = __rest(layout, ["nodeWidthRatio", "nodePaddingRatio"]); + const { nodes: nodeData, edges: linkData } = (0, arc_1.Arc)(Object.assign(Object.assign(Object.assign(Object.assign({}, DEFAULT_LAYOUT_OPTIONS), { id: (0, utils_1.field)(nodeKey), thickness: nodeWidthRatio, marginRatio: nodePaddingRatio }), restLayout), { weight: true }))({ nodes, edges: links }); + // Extract label style and apply defaults. + const _a = (0, helper_1.subObject)(style, 'label'), { text = nodeKey } = _a, labelStyle = __rest(_a, ["text"]); + const nodeTooltip = (0, mark_1.subTooltip)(tooltip, 'node', { + title: '', + items: [(d) => ({ name: d.key, value: d.value })], + }, true); + const linkTooltip = (0, mark_1.subTooltip)(tooltip, 'link', { + title: '', + items: [(d) => ({ name: `${d.source} -> ${d.target}`, value: d.value })], + }); + const { height, width } = context; + const minimumLen = Math.min(height, width); + return [ + (0, util_1.deepMix)({}, DEFAULT_LINK_OPTIONS, { + data: linkData, + encode: Object.assign(Object.assign({}, linkEncode), { color: linkEncodeColor }), + labels: linkLabels, + style: Object.assign({ fill: linkEncodeColor ? undefined : '#aaa' }, (0, helper_1.subObject)(style, 'link')), + tooltip: linkTooltip, + animate: (0, mark_1.maybeAnimation)(animate, 'link'), + }), + (0, util_1.deepMix)({}, DEFAULT_NODE_OPTIONS, { + data: nodeData, + encode: Object.assign(Object.assign({}, nodeEncode), { color }), + scale, + style: (0, helper_1.subObject)(style, 'node'), + coordinate: { + type: 'polar', + // Leave enough rendering space for the label. + outerRadius: (minimumLen - 20) / minimumLen, + startAngle: -Math.PI * 2, + endAngle: 0, + }, + labels: [ + Object.assign(Object.assign(Object.assign({}, DEFAULT_LABEL_OPTIONS), { text }), labelStyle), + ...nodeLabels, + ], + tooltip: nodeTooltip, + animate: (0, mark_1.maybeAnimation)(animate, 'node'), + axis: false, + }), + ]; +}; +exports.Chord = Chord; +exports.Chord.props = {}; +//# sourceMappingURL=chord.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../utils/mark":1751263815997,"../data/arc":1751263815999,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263815999, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Arc = void 0; +const arc_1 = require("../data/utils/arc"); +/** + * For arc diagram(edge with weight) or chord diagram(with weight) + */ +const Arc = (options) => { + return (data) => { + return (0, arc_1.Arc)(options)(data); + }; +}; +exports.Arc = Arc; +exports.Arc.props = {}; +//# sourceMappingURL=arc.js.map +}, function(modId) { var map = {"../data/utils/arc":1751263816000}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816000, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Arc = void 0; +var arc_1 = require("./arc"); +Object.defineProperty(exports, "Arc", { enumerable: true, get: function () { return arc_1.Arc; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./arc":1751263816001}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816001, function(require, module, exports) { + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Arc = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +const helper_1 = require("../../../utils/helper"); +const SortMethods = __importStar(require("./sort")); +const DEFAULT_OPTIONS = { + y: 0, + thickness: 0.05, + weight: false, + marginRatio: 0.1, + id: (node) => node.id, + source: (edge) => edge.source, + target: (edge) => edge.target, + sourceWeight: (edge) => edge.value || 1, + targetWeight: (edge) => edge.value || 1, + sortBy: null, +}; +/** + * Layout for Arc / Chord diagram with d3 style. + */ +function Arc(options) { + const { y, thickness, weight, marginRatio, id, source, target, sourceWeight, targetWeight, sortBy, } = Object.assign(Object.assign({}, DEFAULT_OPTIONS), options); + function arc(data) { + // Clone first. + const nodes = data.nodes.map((n) => (Object.assign({}, n))); + const edges = data.edges.map((n) => (Object.assign({}, n))); + // Keep reference in below functions. + preprocess(nodes, edges); + sortNodes(nodes, edges); + layoutNodes(nodes, edges); + layoutEdges(nodes, edges); + return { nodes, edges }; + } + /** + * Calculate id, value, frequency for node, and source,target for edge. + */ + function preprocess(nodes, edges) { + edges.forEach((edge) => { + edge.source = source(edge); + edge.target = target(edge); + edge.sourceWeight = sourceWeight(edge); + edge.targetWeight = targetWeight(edge); + }); + // Group edges by source, target. + const edgesBySource = (0, d3_array_1.group)(edges, (e) => e.source); + const edgesByTarget = (0, d3_array_1.group)(edges, (e) => e.target); + nodes.forEach((node) => { + node.id = id(node); + const sources = edgesBySource.has(node.id) + ? edgesBySource.get(node.id) + : []; + const targets = edgesByTarget.has(node.id) + ? edgesByTarget.get(node.id) + : []; + node.frequency = sources.length + targets.length; + node.value = + (0, d3_array_1.sum)(sources, (d) => d.sourceWeight) + + (0, d3_array_1.sum)(targets, (d) => d.targetWeight); + }); + return { nodes, edges }; + } + function sortNodes(nodes, edges) { + const method = typeof sortBy === 'function' ? sortBy : SortMethods[sortBy]; + if (method) { + nodes.sort(method); + } + } + function layoutNodes(nodes, edges) { + const size = nodes.length; + if (!size) { + throw (0, helper_1.error)("Invalid nodes: it's empty!"); + } + // No weight. + if (!weight) { + const deltaX = 1 / size; + nodes.forEach((node, i) => { + node.x = (i + 0.5) * deltaX; + node.y = y; + }); + return { nodes, edges }; + } + // todo: marginRatio should be in [0, 1) + // todo: thickness shoule be in (0, 1) + const margin = marginRatio / (2 * size); + const total = nodes.reduce((prev, node) => (prev += node.value), 0); + nodes.reduce((deltaX, node) => { + node.weight = node.value / total; + node.width = node.weight * (1 - marginRatio); + node.height = thickness; + /* points + * 3---2 + * | | + * 0---1 + */ + const minX = margin + deltaX; + const maxX = minX + node.width; + const minY = y - thickness / 2; + const maxY = minY + thickness; + node.x = [minX, maxX, maxX, minX]; + node.y = [minY, minY, maxY, maxY]; + // Return next deltaX. + return deltaX + node.width + 2 * margin; + }, 0); + return { + nodes, + edges, + }; + } + /** + * Get edge layout information from nodes, and save into edge object. + */ + function layoutEdges(nodes, edges) { + const nodesMap = new Map(nodes.map((d) => [d.id, d])); + if (!weight) { + edges.forEach((edge) => { + const sourceId = source(edge); + const targetId = target(edge); + const sourceNode = nodesMap.get(sourceId); + const targetNode = nodesMap.get(targetId); + // Edge's layout information is Equal with node. + if (sourceNode && targetNode) { + edge.x = [sourceNode.x, targetNode.x]; + edge.y = [sourceNode.y, targetNode.y]; + } + }); + return { nodes, edges }; + } + // Initial edge.x, edge.y. + edges.forEach((edge) => { + edge.x = [0, 0, 0, 0]; + edge.y = [y, y, y, y]; + }); + // Group edges by source, target. + const edgesBySource = (0, d3_array_1.group)(edges, (e) => e.source); + const edgesByTarget = (0, d3_array_1.group)(edges, (e) => e.target); + // When weight = true, we need to calculation the bbox of edge start/end. + nodes.forEach((node) => { + const { edges, width, x, y, value, id } = node; + const sourceEdges = edgesBySource.get(id) || []; + const targetEdges = edgesByTarget.get(id) || []; + let offset = 0; + /* points + * 0----------2 + * | | + * 1----------3 + */ + sourceEdges.map((edge) => { + const w = (edge.sourceWeight / value) * width; + edge.x[0] = x[0] + offset; + edge.x[1] = x[0] + offset + w; + offset += w; + }); + targetEdges.forEach((edge) => { + const w = (edge.targetWeight / value) * width; + edge.x[3] = x[0] + offset; + edge.x[2] = x[0] + offset + w; + offset += w; + }); + }); + } + return arc; +} +exports.Arc = Arc; +//# sourceMappingURL=arc.js.map +}, function(modId) { var map = {"../../../utils/helper":1751263815829,"./sort":1751263816002}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816002, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.name = exports.id = exports.frequency = exports.weight = void 0; +function weight(a, b) { + return b.value - a.value; +} +exports.weight = weight; +function frequency(a, b) { + return b.frequency - a.frequency; +} +exports.frequency = frequency; +function id(a, b) { + return `${a.id}`.localeCompare(`${b.id}`); +} +exports.id = id; +function name(a, b) { + return `${a.name}`.localeCompare(`${b.name}`); +} +exports.name = name; +//# sourceMappingURL=sort.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816003, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Path = void 0; +const shape_1 = require("../shape"); +const utils_1 = require("./utils"); +const shape = { + path: shape_1.PathShape, + hollow: shape_1.PathHollow, +}; +/** + * Draw a path. + */ +const Path = (options) => { + return (index, scale, value, coordinate) => { + // The points is meaning less for path mark, + // because the position of path shapes specified + // by the d option. So set [0, 0] for render pipeline. + return [index, index.map(() => [[0, 0]])]; + }; +}; +exports.Path = Path; +exports.Path.props = { + defaultShape: 'path', + defaultLabelShape: 'label', + shape, + composite: false, + channels: [ + ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }), + { name: 'd', scale: 'identity' }, + ], + preInference: [...(0, utils_1.basePreInference)()], + postInference: [...(0, utils_1.basePostInference)()], +}; +//# sourceMappingURL=path.js.map +}, function(modId) { var map = {"../shape":1751263815879,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816004, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Treemap = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("../utils/helper"); +const mark_1 = require("../utils/mark"); +const treeDataTransform_1 = require("../utils/treeDataTransform"); +// Defaults +const GET_DEFAULT_LAYOUT_OPTIONS = (width, height) => ({ + tile: 'treemapSquarify', + ratio: 0.5 * (1 + Math.sqrt(5)), + size: [width, height], + round: false, + ignoreParentValue: true, + padding: 0, + paddingInner: 0, + paddingOuter: 0, + paddingTop: 0, + paddingRight: 0, + paddingBottom: 0, + paddingLeft: 0, + sort: (a, b) => b.value - a.value, + layer: 0, +}); +const GET_DEFAULT_OPTIONS = (width, height) => ({ + type: 'rect', + axis: false, + encode: { + x: 'x', + y: 'y', + key: 'id', + color: (d) => d.path[1], + }, + scale: { + x: { domain: [0, width], range: [0, 1] }, + y: { domain: [0, height], range: [0, 1] }, + }, + style: { + stroke: '#fff', + }, + state: { + active: { opacity: 0.6 }, + inactive: { opacity: 1 }, + }, +}); +const DEFAULT_LABEL_OPTIONS = { + fontSize: 10, + text: (d) => (0, util_1.last)(d.path), + position: 'inside', + fill: '#000', + textOverflow: 'clip', + wordWrap: true, + maxLines: 1, + wordWrapWidth: (d) => d.x1 - d.x0, + isTreemapLabel: true, +}; +const DEFAULT_TOOLTIP_OPTIONS = { + title: (d) => { var _a, _b; return (_b = (_a = d.path) === null || _a === void 0 ? void 0 : _a.join) === null || _b === void 0 ? void 0 : _b.call(_a, '.'); }, + items: [{ field: 'value' }], +}; +const DEFAULT_TOOLTIP_OPTIONS_DRILL = { + title: (d) => (0, util_1.last)(d.path), + items: [{ field: 'value' }], +}; +const Treemap = (options, context) => { + const { width, height, options: markOptions } = context; + const { data, encode = {}, scale, style = {}, layout = {}, labels = [], tooltip = {} } = options, resOptions = __rest(options, ["data", "encode", "scale", "style", "layout", "labels", "tooltip"]); + const treemapDrillDown = (0, util_1.get)(markOptions, [ + 'interaction', + 'treemapDrillDown', + ]); + // Layout + const layoutOptions = (0, util_1.deepMix)({}, GET_DEFAULT_LAYOUT_OPTIONS(width, height), layout, { + layer: treemapDrillDown + ? (d) => { + return d.depth === 1; + } + : layout.layer, + }); + // Data + const [transformedData, transformedDataAll] = (0, treeDataTransform_1.treeDataTransform)(data, layoutOptions, encode); + // Label + const labelStyle = (0, helper_1.subObject)(style, 'label'); + return (0, util_1.deepMix)({}, GET_DEFAULT_OPTIONS(width, height), Object.assign(Object.assign({ data: transformedData, scale, + style, labels: [ + Object.assign(Object.assign(Object.assign({}, DEFAULT_LABEL_OPTIONS), labelStyle), (treemapDrillDown && { cursor: 'pointer' })), + ...labels, + ] }, resOptions), { encode, tooltip: (0, mark_1.maybeTooltip)(tooltip, DEFAULT_TOOLTIP_OPTIONS), axis: false }), treemapDrillDown + ? { + interaction: Object.assign(Object.assign({}, resOptions.interaction), { treemapDrillDown: treemapDrillDown + ? Object.assign(Object.assign({}, treemapDrillDown), { originData: transformedDataAll, layout: layoutOptions }) : undefined }), + encode: Object.assign({ color: (d) => (0, util_1.last)(d.path) }, encode), + tooltip: (0, mark_1.maybeTooltip)(tooltip, DEFAULT_TOOLTIP_OPTIONS_DRILL), + } + : {}); +}; +exports.Treemap = Treemap; +exports.Treemap.props = {}; +//# sourceMappingURL=treemap.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../utils/mark":1751263815997,"../utils/treeDataTransform":1751263816005}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816005, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.treeDataTransform = void 0; +const util_1 = require("@antv/util"); +const d3_hierarchy_1 = require("@antv/vendor/d3-hierarchy"); +const utils_1 = require("../mark/utils"); +/** + * @description Path need when the data is a flat json structure, + * and the tree object structure do not need. + */ +function generateHierarchyRoot(data, path) { + if (Array.isArray(data)) { + return typeof path === 'function' + ? (0, d3_hierarchy_1.stratify)().path(path)(data) + : (0, d3_hierarchy_1.stratify)()(data); + } + return (0, d3_hierarchy_1.hierarchy)(data); +} +function addObjectDataPath(root, path = [root.data.name]) { + // @ts-ignore + root.id = root.id || root.data.name; + root.path = path; + if (root.children) { + root.children.forEach((item) => { + // @ts-ignore + item.id = `${root.id}/${item.data.name}`; + item.path = [...path, item.data.name]; + addObjectDataPath(item, item.path); + }); + } +} +function addArrayDataPath(root) { + const name = (0, util_1.get)(root, ['data', 'name']); + if (name.replaceAll) { + root.path = name.replaceAll('.', '/').split('/'); + } + if (root.children) { + root.children.forEach((item) => { + addArrayDataPath(item); + }); + } +} +function getTileMethod(tile, ratio) { + const tiles = { + treemapBinary: d3_hierarchy_1.treemapBinary, + treemapDice: d3_hierarchy_1.treemapDice, + treemapSlice: d3_hierarchy_1.treemapSlice, + treemapSliceDice: d3_hierarchy_1.treemapSliceDice, + treemapSquarify: d3_hierarchy_1.treemapSquarify, + treemapResquarify: d3_hierarchy_1.treemapResquarify, + }; + const tileMethod = tile === 'treemapSquarify' ? tiles[tile].ratio(ratio) : tiles[tile]; + if (!tileMethod) { + throw new TypeError('Invalid tile method!'); + } + return tileMethod; +} +function treeDataTransform(data, layout, encode) { + const { value } = encode; + const tileMethod = getTileMethod(layout.tile, layout.ratio); + const root = generateHierarchyRoot(data, layout.path); + if ((0, util_1.isArray)(data)) { + addArrayDataPath(root); + } + else { + addObjectDataPath(root); + } + // Calculate the value and sort. + value + ? root + .sum((d) => layout.ignoreParentValue && d.children + ? 0 + : (0, utils_1.field)(value)(d)) + .sort(layout.sort) + : root.count(); + (0, d3_hierarchy_1.treemap)() + .tile(tileMethod) + // @ts-ignore + .size(layout.size) + .round(layout.round) + .paddingInner(layout.paddingInner) + .paddingOuter(layout.paddingOuter) + .paddingTop(layout.paddingTop) + .paddingRight(layout.paddingRight) + .paddingBottom(layout.paddingBottom) + .paddingLeft(layout.paddingLeft)(root); + const nodes = root.descendants().map((d) => Object.assign(d, { + id: d.id.replace(/^\//, ''), + x: [d.x0, d.x1], + y: [d.y0, d.y1], + })); + const filterData = nodes.filter(typeof layout.layer === 'function' + ? layout.layer + : (d) => d.height === layout.layer); + return [filterData, nodes]; +} +exports.treeDataTransform = treeDataTransform; +//# sourceMappingURL=treeDataTransform.js.map +}, function(modId) { var map = {"../mark/utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816006, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Pack = void 0; +const util_1 = require("@antv/util"); +const d3_hierarchy_1 = require("@antv/vendor/d3-hierarchy"); +const helper_1 = require("../utils/helper"); +const mark_1 = require("../utils/mark"); +const utils_1 = require("./utils"); +const GET_DEFAULT_LAYOUT_OPTIONS = (width, height) => ({ + size: [width, height], + padding: 0, + sort: (a, b) => b.value - a.value, +}); +const GET_DEFAULT_OPTIONS = (width, height, encode) => ({ + type: 'point', + axis: false, + legend: false, + scale: { + x: { domain: [0, width] }, + y: { domain: [0, height] }, + size: { type: 'identity' }, + }, + encode: { + x: 'x', + y: 'y', + size: 'r', + shape: 'point', + }, + style: { + fill: !encode.color ? (d) => (d.height === 0 ? '#ddd' : '#fff') : undefined, + stroke: !encode.color ? (d) => (d.height === 0 ? '' : '#000') : undefined, + }, +}); +const DEFAULT_LABEL_OPTIONS = { + text: '', + position: 'inside', + textOverflow: 'clip', + wordWrap: true, + maxLines: 1, + wordWrapWidth: (d) => d.r * 2, +}; +const DEFAULT_TOOLTIP_OPTIONS = { + title: (d) => d.data.name, + items: [{ field: 'value' }], +}; +const dataTransform = (data, layout, encode) => { + const { value } = encode; + const root = (0, util_1.isArray)(data) + ? (0, d3_hierarchy_1.stratify)().path(layout.path)(data) + : (0, d3_hierarchy_1.hierarchy)(data); + value ? root.sum((d) => (0, utils_1.field)(value)(d)).sort(layout.sort) : root.count(); + // @ts-ignore + (0, d3_hierarchy_1.pack)().size(layout.size).padding(layout.padding)(root); + return root.descendants(); +}; +const Pack = (markOptions, context) => { + const { width, height } = context; + const { data, encode = {}, scale = {}, style = {}, layout = {}, labels = [], tooltip = {} } = markOptions, resOptions = __rest(markOptions, ["data", "encode", "scale", "style", "layout", "labels", "tooltip"]); + const DEFAULT_OPTIONS = GET_DEFAULT_OPTIONS(width, height, encode); + const transformedData = dataTransform(data, (0, util_1.deepMix)({}, GET_DEFAULT_LAYOUT_OPTIONS(width, height), layout), (0, util_1.deepMix)({}, DEFAULT_OPTIONS['encode'], encode)); + const labelStyle = (0, helper_1.subObject)(style, 'label'); + return (0, util_1.deepMix)({}, DEFAULT_OPTIONS, Object.assign(Object.assign({ data: transformedData, encode, + scale, + style, labels: [ + Object.assign(Object.assign({}, DEFAULT_LABEL_OPTIONS), labelStyle), + ...labels, + ] }, resOptions), { tooltip: (0, mark_1.maybeTooltip)(tooltip, DEFAULT_TOOLTIP_OPTIONS), axis: false })); +}; +exports.Pack = Pack; +exports.Pack.props = {}; +//# sourceMappingURL=pack.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../utils/mark":1751263815997,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816007, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Boxplot = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +const helper_1 = require("../utils/helper"); +const mark_1 = require("../utils/mark"); +function min(I, V) { + return (0, d3_array_1.min)(I, (i) => V[i]); +} +function max(I, V) { + return (0, d3_array_1.max)(I, (i) => V[i]); +} +function lower(I, V) { + const lo = q1(I, V) * 2.5 - q3(I, V) * 1.5; + return (0, d3_array_1.min)(I, (i) => (V[i] >= lo ? V[i] : NaN)); +} +function q1(I, V) { + return (0, d3_array_1.quantile)(I, 0.25, (i) => V[i]); +} +function q2(I, V) { + return (0, d3_array_1.quantile)(I, 0.5, (i) => V[i]); +} +function q3(I, V) { + return (0, d3_array_1.quantile)(I, 0.75, (i) => V[i]); +} +function upper(I, V) { + const hi = q3(I, V) * 2.5 - q1(I, V) * 1.5; + return (0, d3_array_1.max)(I, (i) => (V[i] <= hi ? V[i] : NaN)); +} +/** + * Group marks by x and reserve outlier indexes. + */ +function OutlierY() { + return (I, mark) => { + const { encode } = mark; + const { y, x } = encode; + const { value: V } = y; + const { value: X } = x; + const GI = Array.from((0, d3_array_1.group)(I, (i) => X[+i]).values()); + const FI = GI.flatMap((I) => { + const lo = lower(I, V); + const hi = upper(I, V); + return I.filter((i) => V[i] < lo || V[i] > hi); + }); + return [FI, mark]; + }; +} +const Boxplot = (options) => { + const { data, encode, style = {}, tooltip = {}, transform, animate } = options, rest = __rest(options, ["data", "encode", "style", "tooltip", "transform", "animate"]); + const { point = true } = style, restStyle = __rest(style, ["point"]); + const { y } = encode; + const encodeY = { y, y1: y, y2: y, y3: y, y4: y }; + const qy = { y1: q1, y2: q2, y3: q3 }; + // Tooltips. + const boxTooltip = (0, mark_1.subTooltip)(tooltip, 'box', { + items: [ + { channel: 'y', name: 'min' }, + { channel: 'y1', name: 'q1' }, + { channel: 'y2', name: 'q2' }, + { channel: 'y3', name: 'q3' }, + { channel: 'y4', name: 'max' }, + ], + }, true); + const pointTooltip = (0, mark_1.subTooltip)(tooltip, 'point', { + title: { channel: 'x' }, + items: [{ name: 'outlier', channel: 'y' }], + }); + // Only show min and max instead of lower and upper. + // Only draw a box. + if (!point) { + return Object.assign({ type: 'box', data: data, transform: [ + Object.assign(Object.assign({ type: 'groupX', y: min }, qy), { y4: max }), + ], encode: Object.assign(Object.assign({}, encode), encodeY), style: restStyle, tooltip: boxTooltip }, rest); + } + const boxStyle = (0, helper_1.subObject)(restStyle, 'box'); + const pointStyle = (0, helper_1.subObject)(restStyle, 'point'); + return [ + Object.assign({ type: 'box', data: data, transform: [ + Object.assign(Object.assign({ type: 'groupX', y: lower }, qy), { y4: upper }), + ], encode: Object.assign(Object.assign({}, encode), encodeY), style: boxStyle, tooltip: boxTooltip, animate: (0, mark_1.maybeAnimation)(animate, 'box') }, rest), + // Draw outliers. + { + type: 'point', + data: data, + transform: [{ type: OutlierY }], + encode, + style: Object.assign({}, pointStyle), + tooltip: pointTooltip, + animate: (0, mark_1.maybeAnimation)(animate, 'point'), + }, + ]; +}; +exports.Boxplot = Boxplot; +exports.Boxplot.props = {}; +//# sourceMappingURL=boxplot.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../utils/mark":1751263815997}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816008, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Shape = void 0; +const shape_1 = require("../shape"); +const transform_1 = require("../transform"); +const utils_1 = require("./utils"); +const shape = { + shape: shape_1.ShapeShape, +}; +/** + * @todo Unify with text, image and point. + */ +const Shape = (options) => { + const { cartesian } = options; + if (cartesian) + return utils_1.visualMark; + return (index, scale, value, coordinate) => { + const { x: X, y: Y } = value; + const offset = (0, utils_1.createBandOffset)(scale, value, options); + const P = Array.from(index, (i) => { + const p = [+X[i], +Y[i]]; + return [coordinate.map(offset(p, i))]; + }); + return [index, P]; + }; +}; +exports.Shape = Shape; +exports.Shape.props = { + defaultShape: 'shape', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + { name: 'x', required: true }, + { name: 'y', required: true }, + ], + preInference: [ + ...(0, utils_1.basePreInference)(), + { type: transform_1.MaybeTuple }, + { type: transform_1.MaybeVisualPosition }, + { type: transform_1.MaybeFunctionAttribute }, + ], +}; +//# sourceMappingURL=shape.js.map +}, function(modId) { var map = {"../shape":1751263815879,"../transform":1751263815823,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816009, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ForceGraph = void 0; +const d3_force_1 = require("@antv/vendor/d3-force"); +const util_1 = require("@antv/util"); +const helper_1 = require("../utils/helper"); +const mark_1 = require("../utils/mark"); +const utils_1 = require("./utils"); +const DEFAULT_LAYOUT_OPTIONS = { + joint: true, +}; +const DEFAULT_LINK_OPTIONS = { + type: 'link', + axis: false, + legend: false, + encode: { + x: [(d) => d.source.x, (d) => d.target.x], + y: [(d) => d.source.y, (d) => d.target.y], + }, + style: { + stroke: '#999', + strokeOpacity: 0.6, + }, +}; +const DEFAULT_NODE_OPTIONS = { + type: 'point', + axis: false, + legend: false, + encode: { + x: 'x', + y: 'y', + size: 5, + color: 'group', + shape: 'point', + }, + style: { + stroke: '#fff', + }, +}; +const DEFAULT_LABEL_OPTIONS = { + text: '', +}; +function dataTransform(data, layout, encode) { + const { nodes, links } = data; + const { joint, nodeStrength, linkStrength } = layout; + const { nodeKey = (d) => d.id, linkKey = (d) => d.id } = encode; + const nodeForce = (0, d3_force_1.forceManyBody)(); + const linkForce = (0, d3_force_1.forceLink)(links).id((0, utils_1.field)(linkKey)); + typeof nodeStrength === 'function' && nodeForce.strength(nodeStrength); + typeof linkStrength === 'function' && linkForce.strength(linkStrength); + const simulation = (0, d3_force_1.forceSimulation)(nodes) + .force('link', linkForce) + .force('charge', nodeForce); + joint + ? simulation.force('center', (0, d3_force_1.forceCenter)()) + : simulation.force('x', (0, d3_force_1.forceX)()).force('y', (0, d3_force_1.forceY)()); + simulation.stop(); + const n = Math.ceil(Math.log(simulation.alphaMin()) / Math.log(1 - simulation.alphaDecay())); + for (let i = 0; i < n; i++) + simulation.tick(); + return { + nodesData: nodes, + linksData: links, + }; +} +const ForceGraph = (options) => { + const { data, encode: e = {}, scale, style = {}, layout = {}, nodeLabels = [], linkLabels = [], animate = {}, tooltip = {}, } = options; + const { nodeKey = (d) => d.id, linkKey = (d) => d.id } = e, restEncode = __rest(e, ["nodeKey", "linkKey"]); + const encode = Object.assign({ nodeKey, linkKey }, restEncode); + const nodeEncode = (0, helper_1.subObject)(encode, 'node'); + const linkEncode = (0, helper_1.subObject)(encode, 'link'); + const { links, nodes } = (0, utils_1.initializeData)(data, encode); + const { nodesData, linksData } = dataTransform({ links, nodes }, (0, util_1.deepMix)({}, DEFAULT_LAYOUT_OPTIONS, layout), encode); + const linkTooltip = (0, mark_1.subTooltip)(tooltip, 'link', { + items: [ + (d) => ({ name: 'source', value: (0, utils_1.field)(linkKey)(d.source) }), + (d) => ({ name: 'target', value: (0, utils_1.field)(linkKey)(d.target) }), + ], + }); + const nodeTooltip = (0, mark_1.subTooltip)(tooltip, 'node', { + items: [(d) => ({ name: 'key', value: (0, utils_1.field)(nodeKey)(d) })], + }, true); + return [ + (0, util_1.deepMix)({}, DEFAULT_LINK_OPTIONS, { + data: linksData, + encode: linkEncode, + labels: linkLabels, + style: (0, helper_1.subObject)(style, 'link'), + tooltip: linkTooltip, + animate: (0, mark_1.maybeAnimation)(animate, 'link'), + }), + (0, util_1.deepMix)({}, DEFAULT_NODE_OPTIONS, { + data: nodesData, + encode: Object.assign({}, nodeEncode), + scale, + style: (0, helper_1.subObject)(style, 'node'), + tooltip: nodeTooltip, + labels: [ + Object.assign(Object.assign({}, DEFAULT_LABEL_OPTIONS), (0, helper_1.subObject)(style, 'label')), + ...nodeLabels, + ], + animate: (0, mark_1.maybeAnimation)(animate, 'link'), + }), + ]; +}; +exports.ForceGraph = ForceGraph; +exports.ForceGraph.props = {}; +//# sourceMappingURL=forceGraph.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../utils/mark":1751263815997,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816010, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Tree = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("../utils/helper"); +const tree_1 = require("../data/tree"); +const mark_1 = require("../utils/mark"); +const DEFAULT_LAYOUT_OPTIONS = { + sortBy: (a, b) => b.value - a.value, +}; +const DEFAULT_NODE_OPTIONS = { + axis: false, + legend: false, + type: 'point', + encode: { + x: 'x', + y: 'y', + size: 2, + shape: 'point', + }, +}; +const DEFAULT_LINK_OPTIONS = { + type: 'link', + encode: { + x: 'x', + y: 'y', + shape: 'smooth', + }, +}; +const DEFAULT_LABEL_OPTIONS = { + text: '', + fontSize: 10, +}; +const Tree = (options) => { + const { data, encode = {}, scale = {}, style = {}, layout = {}, nodeLabels = [], linkLabels = [], animate = {}, tooltip = {}, } = options; + const valueEncode = encode === null || encode === void 0 ? void 0 : encode.value; + const { nodes, edges } = (0, tree_1.Tree)(Object.assign(Object.assign(Object.assign({}, DEFAULT_LAYOUT_OPTIONS), layout), { field: valueEncode }))(data); + const nodeTooltip = (0, mark_1.subTooltip)(tooltip, 'node', { + title: 'name', + items: ['value'], + }, true); + const linkTooltip = (0, mark_1.subTooltip)(tooltip, 'link', { + title: '', + items: [ + (d) => ({ name: 'source', value: d.source.name }), + (d) => ({ name: 'target', value: d.target.name }), + ], + }); + return [ + (0, util_1.deepMix)({}, DEFAULT_LINK_OPTIONS, { + data: edges, + encode: (0, helper_1.subObject)(encode, 'link'), + scale: (0, helper_1.subObject)(scale, 'link'), + labels: linkLabels, + style: Object.assign({ stroke: '#999' }, (0, helper_1.subObject)(style, 'link')), + tooltip: linkTooltip, + animate: (0, mark_1.maybeAnimation)(animate, 'link'), + }), + (0, util_1.deepMix)({}, DEFAULT_NODE_OPTIONS, { + data: nodes, + scale: (0, helper_1.subObject)(scale, 'node'), + encode: (0, helper_1.subObject)(encode, 'node'), + labels: [ + Object.assign(Object.assign({}, DEFAULT_LABEL_OPTIONS), (0, helper_1.subObject)(style, 'label')), + ...nodeLabels, + ], + style: Object.assign({}, (0, helper_1.subObject)(style, 'node')), + tooltip: nodeTooltip, + animate: (0, mark_1.maybeAnimation)(animate, 'node'), + }), + ]; +}; +exports.Tree = Tree; +exports.Tree.props = {}; +//# sourceMappingURL=tree.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../data/tree":1751263816011,"../utils/mark":1751263815997}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816011, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Tree = void 0; +const d3_hierarchy_1 = require("@antv/vendor/d3-hierarchy"); +const cluster_1 = require("./cluster"); +const Tree = (options) => { + return (0, cluster_1.hierarchyFunction)(d3_hierarchy_1.tree)(options); +}; +exports.Tree = Tree; +exports.Tree.props = {}; +//# sourceMappingURL=tree.js.map +}, function(modId) { var map = {"./cluster":1751263816012}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816012, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Cluster = exports.hierarchyFunction = void 0; +const d3_hierarchy_1 = require("@antv/vendor/d3-hierarchy"); +const hierarchyFunction = (layoutFunction) => (options) => { + return (data) => { + const { field = 'value', nodeSize, separation, sortBy, as = ['x', 'y'], } = options; + const [x, y] = as; + // Process root data. + const root = (0, d3_hierarchy_1.hierarchy)(data, (d) => d.children) + .sum((d) => d[field]) + .sort(sortBy); + // Layout + const c = layoutFunction(); + c.size([1, 1]); + if (nodeSize) + c.nodeSize(nodeSize); + if (separation) + c.separation(separation); + c(root); + const nodes = []; + root.each((node) => { + node[x] = node.x; + node[y] = node.y; + node.name = node.data.name; + nodes.push(node); + }); + const edges = root.links(); + edges.forEach((edge) => { + edge[x] = [edge.source[x], edge.target[x]]; + edge[y] = [edge.source[y], edge.target[y]]; + }); + return { nodes, edges }; + }; +}; +exports.hierarchyFunction = hierarchyFunction; +const Cluster = (options) => { + return (0, exports.hierarchyFunction)(d3_hierarchy_1.cluster)(options); +}; +exports.Cluster = Cluster; +exports.Cluster.props = {}; +//# sourceMappingURL=cluster.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816013, function(require, module, exports) { + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WordCloud = void 0; +const util_1 = require("@antv/util"); +function initializeData(data, encode) { + const { text = 'text', value = 'value' } = encode; + return data.map((d) => (Object.assign(Object.assign({}, d), { text: d[text], value: d[value] }))); +} +const GET_DEFAULT_OPTIONS = () => ({ + axis: false, + type: 'text', + encode: { + x: 'x', + y: 'y', + text: 'text', + rotate: 'rotate', + fontSize: 'size', + shape: 'tag', + }, + scale: { + x: { range: [0, 1] }, + y: { range: [0, 1] }, + }, + style: { + fontFamily: (d) => d.fontFamily, + }, + tooltip: { + items: [ + (datum) => ({ + name: datum.text, + value: datum.value, + }), + ], + }, +}); +const WordCloud = (options, context) => __awaiter(void 0, void 0, void 0, function* () { + const { width, height } = context; + const { data, encode = {}, scale, style = {}, layout = {} } = options, resOptions = __rest(options, ["data", "encode", "scale", "style", "layout"]); + const initializedData = initializeData(data, encode); + return (0, util_1.deepMix)({}, GET_DEFAULT_OPTIONS(), Object.assign(Object.assign({ data: { + value: initializedData, + transform: [ + Object.assign({ type: 'wordCloud', size: [width, height] }, layout), + ], + }, encode, + scale, + style }, resOptions), { axis: false })); +}); +exports.WordCloud = WordCloud; +exports.WordCloud.props = {}; +//# sourceMappingURL=wordCloud.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816014, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Gauge = void 0; +const util_1 = require("@antv/util"); +const g_1 = require("@antv/g"); +const helper_1 = require("../utils/helper"); +const coordinate_1 = require("../utils/coordinate"); +const coordinate_2 = require("../coordinate"); +const utils_1 = require("../shape/utils"); +const selection_1 = require("../utils/selection"); +const shape_1 = require("../shape"); +const indicatorShape = (options, context) => { + const { shape, radius } = options, style = __rest(options, ["shape", "radius"]); + const pointerStyle = (0, helper_1.subObject)(style, 'pointer'); + const pinStyle = (0, helper_1.subObject)(style, 'pin'); + const { shape: pointerShape } = pointerStyle, resPointerStyle = __rest(pointerStyle, ["shape"]); + const { shape: pinShape } = pinStyle, resPinStyle = __rest(pinStyle, ["shape"]); + const { coordinate, theme } = context; + return (points, value) => { + // Invert points. + const invertedPoints = points.map((p) => coordinate.invert(p)); + // Get new coordinate. + const [startAngle, endAngle, innerRadius] = (0, coordinate_1.getTransformOptions)(coordinate, 'polar'); + const newCoordinate = coordinate.clone(); + const { color: stroke } = value; + const newTransformations = (0, coordinate_2.Radial)({ + startAngle, + endAngle, + innerRadius, + outerRadius: radius, + }); + newTransformations.push(['cartesian']); + newCoordinate.update({ + transformations: newTransformations, + }); + const newPoints = invertedPoints.map((p) => newCoordinate.map(p)); + const [x, y] = (0, utils_1.getOrigin)(newPoints); + const [cx, cy] = coordinate.getCenter(); + const pointerAttrs = Object.assign(Object.assign({ x1: x, y1: y, x2: cx, y2: cy, stroke }, resPointerStyle), style); + const pinAttrs = Object.assign(Object.assign({ cx, + cy, + stroke }, resPinStyle), style); + const indicatorGroup = (0, selection_1.select)(new g_1.Group()); + if (!(0, helper_1.isUnset)(pointerShape)) { + typeof pointerShape === 'function' + ? indicatorGroup.append(() => pointerShape(newPoints, value, newCoordinate, theme)) + : indicatorGroup.append('line').call(utils_1.applyStyle, pointerAttrs).node(); + } + if (!(0, helper_1.isUnset)(pinShape)) { + typeof pinShape === 'function' + ? indicatorGroup.append(() => pinShape(newPoints, value, newCoordinate, theme)) + : indicatorGroup.append('circle').call(utils_1.applyStyle, pinAttrs).node(); + } + return indicatorGroup.node(); + }; +}; +const DEFAULT_OPTIONS = { + coordinate: { + type: 'radial', + innerRadius: 0.9, + outerRadius: 1, + startAngle: (-11 / 10) * Math.PI, + endAngle: (1 / 10) * Math.PI, + }, + axis: { + x: false, + }, + legend: false, + tooltip: false, + encode: { + x: 'x', + y: 'y', + color: 'color', + }, + scale: { + color: { + range: ['#30BF78', '#D0D0D0'], + }, + }, +}; +const DEFAULT_INDICATOR_OPTIONS = { + style: { + shape: indicatorShape, + lineWidth: 4, + pointerLineCap: 'round', + pinR: 10, + pinFill: '#fff', + radius: 0.6, + }, +}; +const DEFAULT_TEXT_OPTIONS = { + type: 'text', + style: { + x: '50%', + y: '60%', + textAlign: 'center', + textBaseline: 'middle', + fontSize: 20, + fontWeight: 800, + fill: '#888', + }, + tooltip: false, +}; +function getGaugeData(data) { + if ((0, util_1.isNumber)(data)) { + // Percent range [0, 1]. + const percent = Math.max(0, Math.min(data, 1)); + return { + percent, + target: percent, + total: 1, + }; + } + return data; +} +function dataTransform(data, scale) { + const { name = 'score', target, total, percent, thresholds = [], } = getGaugeData(data); + const _target = percent || target; + const _total = percent ? 1 : total; + const newScale = Object.assign({ y: { + domain: [0, _total], + } }, scale); + if (!thresholds.length) { + return { + targetData: [{ x: name, y: _target, color: 'target' }], + totalData: [ + { x: name, y: _target, color: 'target' }, + { x: name, y: _total - _target, color: 'total' }, + ], + target: _target, + total: _total, + scale: newScale, + }; + } + return { + targetData: [{ x: name, y: _target, color: 'target' }], + totalData: thresholds.map((d, i) => ({ + x: name, + y: i >= 1 ? d - thresholds[i - 1] : d, + color: i, + })), + target: _target, + total: _total, + scale: newScale, + }; +} +function getTextContent(textStyle, { target, total }) { + const { content } = textStyle; + return content ? content(target, total) : target.toString(); +} +const Gauge = (options) => { + const { data = {}, scale = {}, style = {}, animate = {}, transform = [] } = options, resOptions = __rest(options, ["data", "scale", "style", "animate", "transform"]); + const { targetData, totalData, target, total, scale: newScale, } = dataTransform(data, scale); + const _a = (0, helper_1.subObject)(style, 'text'), { tooltip } = _a, textStyle = __rest(_a, ["tooltip"]); + // pointer + pin + const indicatorStyle = (0, helper_1.filterPrefixObject)(style, ['pointer', 'pin']); + const arcStyle = (0, helper_1.subObject)(style, 'arc'); + const shape = arcStyle.shape; + return [ + (0, util_1.deepMix)({}, DEFAULT_OPTIONS, Object.assign({ type: 'interval', transform: [{ type: 'stackY' }], data: totalData, scale: newScale, style: shape === 'round' ? Object.assign(Object.assign({}, arcStyle), { shape: shape_1.GaugeRound }) : arcStyle, animate: typeof animate === 'object' ? (0, helper_1.subObject)(animate, 'arc') : animate }, resOptions)), + (0, util_1.deepMix)({}, DEFAULT_OPTIONS, DEFAULT_INDICATOR_OPTIONS, Object.assign({ type: 'point', data: targetData, scale: newScale, style: indicatorStyle, animate: typeof animate === 'object' ? (0, helper_1.subObject)(animate, 'indicator') : animate }, resOptions)), + (0, util_1.deepMix)({}, DEFAULT_TEXT_OPTIONS, { + style: Object.assign({ text: getTextContent(textStyle, { target, total }) }, textStyle), + tooltip, + animate: typeof animate === 'object' ? (0, helper_1.subObject)(animate, 'text') : animate, + }), + ]; +}; +exports.Gauge = Gauge; +exports.Gauge.props = {}; +//# sourceMappingURL=gauge.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../utils/coordinate":1751263815882,"../coordinate":1751263815805,"../shape/utils":1751263815885,"../utils/selection":1751263815883,"../shape":1751263815879}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816015, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Density = void 0; +const shape_1 = require("../shape"); +const transform_1 = require("../transform"); +const utils_1 = require("./utils"); +const shape = { + density: shape_1.DensityShape, +}; +const Density = () => { + return (index, scale, value, coordinate) => { + const { x: X, series: S } = value; + const Yn = Object.entries(value) + .filter(([key]) => key.startsWith('y')) + .map(([, value]) => value); + const SZn = Object.entries(value) + .filter(([key]) => key.startsWith('size')) + .map(([, value]) => value); + // Because x and y channel is not strictly required in Line.props, + // it should throw error with empty x or y channels. + if (X === undefined || Yn === undefined || SZn === undefined) { + throw new Error('Missing encode for x or y or size channel.'); + } + // Calc width for each box. + // The scales for x and series channels must be band scale. + const xScale = scale.x; + const series = scale.series; + const P = Array.from(index, (i) => { + const groupWidth = xScale.getBandWidth(xScale.invert(+X[i])); + const ratio = series ? series.getBandWidth(series.invert(+(S === null || S === void 0 ? void 0 : S[i]))) : 1; + const width = groupWidth * ratio; + const offset = (+(S === null || S === void 0 ? void 0 : S[i]) || 0) * groupWidth; + const x = +X[i] + offset + width / 2; + const PN = [ + ...Yn.map((_, idx) => [x + +SZn[idx][i] / index.length, +Yn[idx][i]]), + ...Yn.map((_, idx) => [ + x - +SZn[idx][i] / index.length, + +Yn[idx][i], + ]).reverse(), // left + ]; + return PN.map((p) => coordinate.map(p)); + }); + return [index, P]; + }; +}; +exports.Density = Density; +exports.Density.props = { + defaultShape: 'density', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }), + { name: 'x', scale: 'band', required: true }, + { name: 'y', required: true }, + { name: 'size', required: true }, + { name: 'series', scale: 'band' }, + { name: 'size', required: true, scale: 'identity' }, + ], + preInference: [ + ...(0, utils_1.basePreInference)(), + { type: transform_1.MaybeZeroY1 }, + { type: transform_1.MaybeZeroX }, + ], + postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip1d)()], + interaction: { shareTooltip: true }, +}; +//# sourceMappingURL=density.js.map +}, function(modId) { var map = {"../shape":1751263815879,"../transform":1751263815823,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816016, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Heatmap = void 0; +const shape_1 = require("../shape"); +const transform_1 = require("../transform"); +const utils_1 = require("./utils"); +const shape = { + heatmap: shape_1.HeatmapShape, +}; +/** + * Draw heatmap with gradient. + */ +const Heatmap = (options) => { + return (index, scale, value, coordinate) => { + const { x: X, y: Y, size: S, color: C } = value; + const P = Array.from(index, (i) => { + // Default size = 40. + const r = S ? +S[i] : 40; + // Warning: x, y, value, radius. + return [...coordinate.map([+X[i], +Y[i]]), C[i], r]; + }); + return [[0], [P]]; + }; +}; +exports.Heatmap = Heatmap; +exports.Heatmap.props = { + defaultShape: 'heatmap', + defaultLabelShape: 'label', + composite: false, + shape, + channels: [ + ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }), + { name: 'x', required: true }, + { name: 'y', required: true }, + { name: 'color', scale: 'identity', required: true }, + { name: 'size' }, + ], + preInference: [ + ...(0, utils_1.basePreInference)(), + { type: transform_1.MaybeZeroX }, + { type: transform_1.MaybeZeroY }, + ], + postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip2d)()], +}; +//# sourceMappingURL=heatmap.js.map +}, function(modId) { var map = {"../shape":1751263815879,"../transform":1751263815823,"./utils":1751263815937}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816017, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Liquid = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("../utils/helper"); +const number_1 = require("../utils/number"); +const shape_1 = require("../shape"); +const DEFAULT_OPTIONS = { + axis: { + x: false, + y: false, + }, + legend: false, + tooltip: false, + encode: { + x: 'type', + y: 'percent', + }, + scale: { + y: { + domain: [0, 1], + }, + }, + style: { + shape: shape_1.LiquidShape, + }, + animate: { + enter: { + type: 'fadeIn', + }, + }, +}; +const DEFAULT_TEXT_OPTIONS = { + type: 'text', + style: { + x: '50%', + y: '50%', + textAlign: 'center', + textBaseline: 'middle', + fontSize: 20, + fontWeight: 800, + fill: '#888', + }, + animate: { + enter: { + type: 'fadeIn', + }, + }, +}; +const Liquid = (options) => { + const { data = {}, style = {}, animate } = options, resOptions = __rest(options, ["data", "style", "animate"]); + // Compatible with old data structures: { percent: number } and percent >= 0. + const percent = Math.max(0, (0, util_1.isNumber)(data) ? data : data === null || data === void 0 ? void 0 : data.percent); + const newData = [{ percent, type: 'liquid' }]; + const contentStyle = Object.assign(Object.assign({}, (0, helper_1.subObject)(style, 'text')), (0, helper_1.subObject)(style, 'content')); + const outline = (0, helper_1.subObject)(style, 'outline'); + const wave = (0, helper_1.subObject)(style, 'wave'); + const background = (0, helper_1.subObject)(style, 'background'); + return [ + (0, util_1.deepMix)({}, DEFAULT_OPTIONS, Object.assign({ type: 'interval', data: newData, style: { + liquidOptions: { + percent, + liquidShape: style === null || style === void 0 ? void 0 : style.shape, + }, + styleOptions: Object.assign(Object.assign({}, style), { outline, + wave, + background }), + }, animate }, resOptions)), + (0, util_1.deepMix)({}, DEFAULT_TEXT_OPTIONS, { + style: Object.assign({ text: `${(0, number_1.prettyNumber)(percent * 100)} %` }, contentStyle), + animate, + }), + ]; +}; +exports.Liquid = Liquid; +exports.Liquid.props = {}; +//# sourceMappingURL=liquid.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../utils/number":1751263815884,"../shape":1751263815879}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816018, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Category20 = exports.Category10 = void 0; +var category10_1 = require("./category10"); +Object.defineProperty(exports, "Category10", { enumerable: true, get: function () { return category10_1.Category10; } }); +var category20_1 = require("./category20"); +Object.defineProperty(exports, "Category20", { enumerable: true, get: function () { return category20_1.Category20; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./category10":1751263816019,"./category20":1751263816020}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816019, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Category10 = void 0; +/** + * Classic palette of AntV for ordinal data with 10 colors. + */ +const Category10 = () => { + return [ + '#5B8FF9', + '#5AD8A6', + '#5D7092', + '#F6BD16', + '#6F5EF9', + '#6DC8EC', + '#945FB9', + '#FF9845', + '#1E9493', + '#FF99C3', + ]; +}; +exports.Category10 = Category10; +exports.Category10.props = {}; +//# sourceMappingURL=category10.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816020, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Category20 = void 0; +/** + * Classic palette of AntV for ordinal data with 20 colors. + */ +const Category20 = () => { + return [ + '#5B8FF9', + '#CDDDFD', + '#5AD8A6', + '#CDF3E4', + '#5D7092', + '#CED4DE', + '#F6BD16', + '#FCEBB9', + '#6F5EF9', + '#D3CEFD', + '#6DC8EC', + '#D3EEF9', + '#945FB9', + '#DECFEA', + '#FF9845', + '#FFE0C7', + '#1E9493', + '#BBDEDE', + '#FF99C3', + '#FFE0ED', + ]; +}; +exports.Category20 = Category20; +exports.Category20.props = {}; +//# sourceMappingURL=category20.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816021, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Constant = exports.Sequential = exports.Sqrt = exports.Quantize = exports.Quantile = exports.Threshold = exports.Pow = exports.Log = exports.Time = exports.Point = exports.Identity = exports.Ordinal = exports.Linear = exports.Band = void 0; +var band_1 = require("./band"); +Object.defineProperty(exports, "Band", { enumerable: true, get: function () { return band_1.Band; } }); +var linear_1 = require("./linear"); +Object.defineProperty(exports, "Linear", { enumerable: true, get: function () { return linear_1.Linear; } }); +var ordinal_1 = require("./ordinal"); +Object.defineProperty(exports, "Ordinal", { enumerable: true, get: function () { return ordinal_1.Ordinal; } }); +var identity_1 = require("./identity"); +Object.defineProperty(exports, "Identity", { enumerable: true, get: function () { return identity_1.Identity; } }); +var point_1 = require("./point"); +Object.defineProperty(exports, "Point", { enumerable: true, get: function () { return point_1.Point; } }); +var time_1 = require("./time"); +Object.defineProperty(exports, "Time", { enumerable: true, get: function () { return time_1.Time; } }); +var log_1 = require("./log"); +Object.defineProperty(exports, "Log", { enumerable: true, get: function () { return log_1.Log; } }); +var pow_1 = require("./pow"); +Object.defineProperty(exports, "Pow", { enumerable: true, get: function () { return pow_1.Pow; } }); +var threshold_1 = require("./threshold"); +Object.defineProperty(exports, "Threshold", { enumerable: true, get: function () { return threshold_1.Threshold; } }); +var quantile_1 = require("./quantile"); +Object.defineProperty(exports, "Quantile", { enumerable: true, get: function () { return quantile_1.Quantile; } }); +var quantize_1 = require("./quantize"); +Object.defineProperty(exports, "Quantize", { enumerable: true, get: function () { return quantize_1.Quantize; } }); +var sqrt_1 = require("./sqrt"); +Object.defineProperty(exports, "Sqrt", { enumerable: true, get: function () { return sqrt_1.Sqrt; } }); +var sequential_1 = require("./sequential"); +Object.defineProperty(exports, "Sequential", { enumerable: true, get: function () { return sequential_1.Sequential; } }); +var constant_1 = require("./constant"); +Object.defineProperty(exports, "Constant", { enumerable: true, get: function () { return constant_1.Constant; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./band":1751263816022,"./linear":1751263816023,"./ordinal":1751263816024,"./identity":1751263816025,"./point":1751263816026,"./time":1751263816027,"./log":1751263816028,"./pow":1751263816029,"./threshold":1751263816030,"./quantile":1751263816031,"./quantize":1751263816032,"./sqrt":1751263816033,"./sequential":1751263816034,"./constant":1751263816035}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816022, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Band = void 0; +const scale_1 = require("@antv/scale"); +const Band = (options) => { + return new scale_1.Band(options); +}; +exports.Band = Band; +exports.Band.props = {}; +//# sourceMappingURL=band.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816023, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Linear = void 0; +const scale_1 = require("@antv/scale"); +const Linear = (options) => { + return new scale_1.Linear(options); +}; +exports.Linear = Linear; +exports.Linear.props = {}; +//# sourceMappingURL=linear.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816024, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Ordinal = void 0; +const scale_1 = require("@antv/scale"); +const Ordinal = (options) => { + return new scale_1.Ordinal(options); +}; +exports.Ordinal = Ordinal; +exports.Ordinal.props = {}; +//# sourceMappingURL=ordinal.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816025, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Identity = void 0; +const scale_1 = require("@antv/scale"); +const Identity = (options) => { + return new scale_1.Identity(options); +}; +exports.Identity = Identity; +exports.Identity.props = {}; +//# sourceMappingURL=identity.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816026, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Point = void 0; +const scale_1 = require("@antv/scale"); +const Point = (options) => { + return new scale_1.Point(options); +}; +exports.Point = Point; +exports.Point.props = {}; +//# sourceMappingURL=point.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816027, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Time = void 0; +const scale_1 = require("@antv/scale"); +const Time = (options) => { + return new scale_1.Time(options); +}; +exports.Time = Time; +exports.Time.props = {}; +//# sourceMappingURL=time.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816028, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Log = void 0; +const scale_1 = require("@antv/scale"); +const Log = (options) => { + return new scale_1.Log(options); +}; +exports.Log = Log; +exports.Log.props = {}; +//# sourceMappingURL=log.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816029, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Pow = void 0; +const scale_1 = require("@antv/scale"); +const Pow = (options) => { + return new scale_1.Pow(options); +}; +exports.Pow = Pow; +exports.Pow.props = {}; +//# sourceMappingURL=pow.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816030, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Threshold = void 0; +const scale_1 = require("@antv/scale"); +const Threshold = (options) => { + return new scale_1.Threshold(options); +}; +exports.Threshold = Threshold; +exports.Threshold.props = {}; +//# sourceMappingURL=threshold.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816031, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Quantile = void 0; +const scale_1 = require("@antv/scale"); +const Quantile = (options) => { + return new scale_1.Quantile(options); +}; +exports.Quantile = Quantile; +exports.Quantile.props = {}; +//# sourceMappingURL=quantile.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816032, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Quantize = void 0; +const scale_1 = require("@antv/scale"); +const Quantize = (options) => { + return new scale_1.Quantize(options); +}; +exports.Quantize = Quantize; +exports.Quantize.props = {}; +//# sourceMappingURL=quantize.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816033, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Sqrt = void 0; +const scale_1 = require("@antv/scale"); +const Sqrt = (options) => { + return new scale_1.Sqrt(options); +}; +exports.Sqrt = Sqrt; +exports.Sqrt.props = {}; +//# sourceMappingURL=sqrt.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816034, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Sequential = void 0; +const scale_1 = require("@antv/scale"); +const Sequential = (options) => { + return new scale_1.Sequential(options); +}; +exports.Sequential = Sequential; +exports.Sequential.props = {}; +//# sourceMappingURL=sequential.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816035, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Constant = void 0; +const scale_1 = require("@antv/scale"); +const Constant = (options) => { + return new scale_1.Constant(options); +}; +exports.Constant = Constant; +exports.Constant.props = {}; +//# sourceMappingURL=constant.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816036, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Dark = exports.Light = exports.Academy = exports.ClassicDark = exports.Classic = void 0; +var classic_1 = require("./classic"); +Object.defineProperty(exports, "Classic", { enumerable: true, get: function () { return classic_1.Classic; } }); +var classicDark_1 = require("./classicDark"); +Object.defineProperty(exports, "ClassicDark", { enumerable: true, get: function () { return classicDark_1.ClassicDark; } }); +var academy_1 = require("./academy"); +Object.defineProperty(exports, "Academy", { enumerable: true, get: function () { return academy_1.Academy; } }); +var light_1 = require("./light"); +Object.defineProperty(exports, "Light", { enumerable: true, get: function () { return light_1.Light; } }); +var dark_1 = require("./dark"); +Object.defineProperty(exports, "Dark", { enumerable: true, get: function () { return dark_1.Dark; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./classic":1751263816037,"./classicDark":1751263816040,"./academy":1751263816042,"./light":1751263816038,"./dark":1751263816041}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816037, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Classic = void 0; +const util_1 = require("@antv/util"); +const light_1 = require("./light"); +/** + * Default theme. + */ +const Classic = (options) => { + return (0, util_1.deepMix)({}, (0, light_1.Light)(), { + category10: 'category10', + category20: 'category20', + }, options); +}; +exports.Classic = Classic; +exports.Classic.props = {}; +//# sourceMappingURL=classic.js.map +}, function(modId) { var map = {"./light":1751263816038}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816038, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Light = exports.tokens = void 0; +const util_1 = require("@antv/util"); +const create_1 = require("./create"); +exports.tokens = { + colorBlack: '#1D2129', + colorWhite: '#ffffff', + colorStroke: '#416180', + colorDefault: '#1783FF', + colorBackground: 'transparent', + category10: [ + '#1783FF', + '#00C9C9', + '#F0884D', + '#D580FF', + '#7863FF', + '#60C42D', + '#BD8F24', + '#FF80CA', + '#2491B3', + '#17C76F', + ], + category20: [ + '#1783FF', + '#00C9C9', + '#F0884D', + '#D580FF', + '#7863FF', + '#60C42D', + '#BD8F24', + '#FF80CA', + '#2491B3', + '#17C76F', + '#AABA01', + '#BC7CFC', + '#237CBC', + '#2DE379', + '#CE8032', + '#FF7AF4', + '#545FD3', + '#AFE410', + '#D8C608', + '#FFA1E0', + ], + padding1: 8, + padding2: 12, + padding3: 20, + alpha90: 0.9, + alpha65: 0.65, + alpha45: 0.45, + alpha25: 0.25, + alpha10: 0.1, +}; +const defaults = (0, create_1.create)(exports.tokens); +/** + * Default theme. + */ +const Light = (options) => { + return (0, util_1.deepMix)({}, defaults, options); +}; +exports.Light = Light; +exports.Light.props = {}; +//# sourceMappingURL=light.js.map +}, function(modId) { var map = {"./create":1751263816039}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816039, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.create = void 0; +function create({ colorDefault, colorBlack, colorWhite, colorStroke, colorBackground, padding1, padding2, padding3, alpha90, alpha65, alpha45, alpha25, alpha10, category10, category20, sizeDefault = 1, padding = 'auto', margin = 16, }) { + return { + padding, + margin, + size: sizeDefault, + color: colorDefault, + category10, + category20, + enter: { + duration: 300, + fill: 'both', + delay: 0, + }, + update: { + duration: 300, + fill: 'both', + delay: 0, + }, + exit: { + duration: 300, + fill: 'both', + delay: 0, + }, + view: { + viewFill: colorBackground, + plotFill: 'transparent', + mainFill: 'transparent', + contentFill: 'transparent', + }, + line: { + line: { + fill: '', + strokeOpacity: 1, + lineWidth: 1, + lineCap: 'round', + }, + }, + point: { + point: { + r: 3, + fillOpacity: 0.95, + lineWidth: 0, + }, + hollow: { + r: 3, + strokeOpacity: 0.95, + lineWidth: 1, + }, + plus: { + r: 3, + strokeOpacity: 0.95, + lineWidth: 3, + }, + diamond: { + r: 3, + strokeOpacity: 0.95, + lineWidth: 1, + }, + }, + interval: { + rect: { + fillOpacity: 0.95, + }, + hollow: { + fill: '', + strokeOpacity: 1, + lineWidth: 2, + }, + }, + area: { + area: { + fillOpacity: 0.85, + lineWidth: 0, + }, + }, + polygon: { + polygon: { + fillOpacity: 0.95, + }, + }, + cell: { + cell: { + fillOpacity: 0.95, + }, + hollow: { + fill: '', + strokeOpacity: 1, + lineWidth: 2, + }, + }, + rect: { + rect: { + fillOpacity: 0.95, + }, + hollow: { + fill: '', + strokeOpacity: 1, + lineWidth: 2, + }, + }, + link: { + link: { + fill: '', + strokeOpacity: 1, + }, + }, + vector: { + vector: { + fillOpacity: 1, + }, + }, + box: { + box: { + fillOpacity: 0.95, + stroke: colorBlack, + lineWidth: 1, + }, + }, + text: { + text: { + fill: '#1D2129', + fontSize: 12, + lineWidth: 0, + connectorStroke: colorStroke, + connectorStrokeOpacity: 0.45, + connectorLineWidth: 1, + backgroundFill: colorStroke, + backgroundFillOpacity: 0.15, + backgroundPadding: [2, 4], + startMarkerSymbol: 'circle', + startMarkerSize: 4, + endMarkerSymbol: 'circle', + endMarkerSize: 4, + }, + badge: { + fill: '#1D2129', + fillOpacity: 0.65, + lineWidth: 0, + fontSize: 10, + textAlign: 'center', + textBaseline: 'middle', + markerFill: colorStroke, + markerFillOpacity: 0.25, + markerStrokeOpacity: 0, + }, + }, + lineX: { + line: { + stroke: colorStroke, + strokeOpacity: 0.45, + lineWidth: 1, + }, + }, + lineY: { + line: { + stroke: colorStroke, + strokeOpacity: 0.45, + lineWidth: 1, + }, + }, + rangeX: { + range: { + fill: colorStroke, + fillOpacity: 0.15, + lineWidth: 0, + }, + }, + rangeY: { + range: { + fill: colorStroke, + fillOpacity: 0.15, + lineWidth: 0, + }, + }, + connector: { + connector: { + stroke: colorStroke, + strokeOpacity: 0.45, + lineWidth: 1, + connectLength1: 12, + endMarker: true, + endMarkerSize: 6, + endMarkerFill: colorStroke, + endMarkerFillOpacity: 0.95, + }, + }, + axis: { + arrow: false, + gridLineDash: [3, 4], + gridLineWidth: 0.5, + gridStroke: colorBlack, + gridStrokeOpacity: alpha10, + labelAlign: 'horizontal', + labelFill: colorBlack, + labelOpacity: alpha45, + labelFontSize: 12, + labelFontWeight: 'normal', + labelSpacing: padding1, + line: false, + lineLineWidth: 0.5, + lineStroke: colorBlack, + lineStrokeOpacity: alpha45, + tickLength: 4, + tickLineWidth: 1, + tickStroke: colorBlack, + tickOpacity: alpha45, + titleFill: colorBlack, + titleOpacity: alpha90, + titleFontSize: 12, + titleFontWeight: 'normal', + titleSpacing: 12, + titleTransformOrigin: 'center', + lineArrowOffset: 6, + lineArrowSize: 6, + }, + axisTop: { + gridDirection: 'positive', + labelDirection: 'negative', + tickDirection: 'negative', + titlePosition: 'top', + titleSpacing: 12, + labelSpacing: 4, + titleTextBaseline: 'middle', + }, + axisBottom: { + gridDirection: 'negative', + labelDirection: 'positive', + tickDirection: 'positive', + titlePosition: 'bottom', + titleSpacing: 12, + labelSpacing: 4, + titleTextBaseline: 'bottom', + titleTransform: 'translate(0, 8)', + }, + axisLeft: { + gridDirection: 'positive', + labelDirection: 'negative', + labelSpacing: 4, + tickDirection: 'negative', + titlePosition: 'left', + titleSpacing: 12, + titleTextBaseline: 'middle', + titleDirection: 'vertical', + titleTransform: 'rotate(-90) translate(0, -8)', + titleTransformOrigin: 'center', + }, + axisRight: { + gridDirection: 'negative', + labelDirection: 'positive', + labelSpacing: 4, + tickDirection: 'positive', + titlePosition: 'right', + titleSpacing: 12, + titleTextBaseline: 'top', + titleDirection: 'vertical', + titleTransformOrigin: 'center', + }, + axisLinear: { + girdClosed: true, + gridConnect: 'arc', + gridDirection: 'negative', + gridType: 'surround', + titlePosition: 'top', + titleSpacing: 0, + }, + axisArc: { + title: false, + titlePosition: 'inner', + line: false, + tick: true, + labelSpacing: 4, + }, + axisRadar: { + girdClosed: true, + gridStrokeOpacity: 0.3, + gridType: 'surround', + tick: false, + titlePosition: 'start', + }, + legendCategory: { + backgroundFill: 'transparent', + itemBackgroundFill: 'transparent', + itemLabelFill: colorBlack, + itemLabelFillOpacity: alpha90, + itemLabelFontSize: 12, + itemLabelFontWeight: 'normal', + itemMarkerFillOpacity: 1, + itemMarkerSize: 8, + itemSpacing: [padding1, padding1], + itemValueFill: colorBlack, + itemValueFillOpacity: 0.65, + itemValueFontSize: 12, + itemValueFontWeight: 'normal', + navButtonFill: colorBlack, + navButtonFillOpacity: 0.65, + navPageNumFill: colorBlack, + navPageNumFillOpacity: 0.45, + navPageNumFontSize: 12, + padding: 8, + title: false, + titleFill: colorBlack, + titleFillOpacity: 0.65, + titleFontSize: 12, + titleFontWeight: 'normal', + titleSpacing: 4, + tickStroke: colorBlack, + tickStrokeOpacity: 0.25, + rowPadding: padding1, + colPadding: padding2, + maxRows: 3, + maxCols: 3, + }, + legendContinuous: { + handleHeight: 12, + handleLabelFill: colorBlack, + handleLabelFillOpacity: alpha45, + handleLabelFontSize: 12, + handleLabelFontWeight: 'normal', + handleMarkerFill: colorBlack, + handleMarkerFillOpacity: 0.6, + handleMarkerLineWidth: 1, + handleMarkerStroke: colorBlack, + handleMarkerStrokeOpacity: 0.25, + handleWidth: 10, + labelFill: colorBlack, + labelFillOpacity: alpha45, + labelFontSize: 12, + labelFontWeight: 'normal', + labelSpacing: 3, + tick: true, + tickLength: 12, + ribbonSize: 12, + ribbonFill: '#aaa', + handle: true, + handleLabel: false, + handleShape: 'slider', + handleIconSize: 12 / 1.8, + indicator: false, + titleFontSize: 12, + titleSpacing: 4, + titleFontWeight: 'normal', + titleFillOpacity: alpha90, + tickStroke: colorBlack, + tickStrokeOpacity: alpha45, + }, + label: { + fill: colorBlack, + fillOpacity: 0.65, + fontSize: 12, + fontWeight: 'normal', + stroke: undefined, + offset: 12, + connectorStroke: colorBlack, + connectorStrokeOpacity: 0.45, + connectorLineWidth: 1, + connectorLength: 12, + connectorLength2: 8, + connectorDistance: 4, + }, + innerLabel: { + fill: colorWhite, + fontSize: 12, + fillOpacity: 0.85, + fontWeight: 'normal', + stroke: undefined, + offset: 0, + }, + htmlLabel: { + fontSize: 12, + opacity: 0.65, + color: colorBlack, + fontWeight: 'normal', + }, + slider: { + trackSize: 16, + trackFill: colorStroke, + trackFillOpacity: 1, + selectionFill: colorDefault, + selectionFillOpacity: 0.15, + handleIconSize: 10, + handleIconFill: '#f7f7f7', + handleIconFillOpacity: 1, + handleIconStroke: colorBlack, + handleIconStrokeOpacity: 0.25, + handleIconLineWidth: 1, + handleIconRadius: 2, + handleLabelFill: colorBlack, + handleLabelFillOpacity: 0.45, + handleLabelFontSize: 12, + handleLabelFontWeight: 'normal', + }, + scrollbar: { + padding: [0, 0, 0, 0], + trackSize: 6, + isRound: true, + slidable: true, + scrollable: true, + trackFill: '#e5e5e5', + trackFillOpacity: 0, + thumbFill: '#000', + thumbFillOpacity: 0.15, + thumbHighlightedFillOpacity: 0.2, + }, + title: { + spacing: 8, + titleFill: colorBlack, + titleFillOpacity: alpha90, + titleFontSize: 16, + titleFontWeight: 'bold', + titleTextBaseline: 'top', + subtitleFill: colorBlack, + subtitleFillOpacity: alpha65, + subtitleFontSize: 12, + subtitleFontWeight: 'normal', + subtitleTextBaseline: 'top', + }, + tooltip: { + css: { + '.g2-tooltip': { + 'font-family': 'sans-serif', + }, + }, + }, + }; +} +exports.create = create; +//# sourceMappingURL=create.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816040, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ClassicDark = void 0; +const dark_1 = require("./dark"); +/** + * Dark theme. + */ +const ClassicDark = (options) => { + return Object.assign({}, (0, dark_1.Dark)(), { + category10: 'category10', + category20: 'category20', + }, options); +}; +exports.ClassicDark = ClassicDark; +exports.ClassicDark.props = {}; +//# sourceMappingURL=classicDark.js.map +}, function(modId) { var map = {"./dark":1751263816041}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816041, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Dark = exports.tokens = void 0; +const util_1 = require("@antv/util"); +const create_1 = require("./create"); +exports.tokens = { + colorBlack: '#fff', + colorWhite: '#000', + colorStroke: '#416180', + colorDefault: '#1783FF', + colorBackground: 'transparent', + category10: [ + '#1783FF', + '#00C9C9', + '#F0884D', + '#D580FF', + '#7863FF', + '#60C42D', + '#BD8F24', + '#FF80CA', + '#2491B3', + '#17C76F', + ], + category20: [ + '#1783FF', + '#00C9C9', + '#F0884D', + '#D580FF', + '#7863FF', + '#60C42D', + '#BD8F24', + '#FF80CA', + '#2491B3', + '#17C76F', + '#AABA01', + '#BC7CFC', + '#237CBC', + '#2DE379', + '#CE8032', + '#FF7AF4', + '#545FD3', + '#AFE410', + '#D8C608', + '#FFA1E0', + ], + padding1: 8, + padding2: 12, + padding3: 20, + alpha90: 0.9, + alpha65: 0.65, + alpha45: 0.45, + alpha25: 0.25, + alpha10: 0.25, +}; +const defaults = (0, create_1.create)(exports.tokens); +const Dark = (options) => { + return (0, util_1.deepMix)({}, defaults, { + tooltip: { + crosshairsStroke: '#fff', + crosshairsLineWidth: 1, + crosshairsStrokeOpacity: 0.25, + css: { + '.g2-tooltip': { + background: '#1f1f1f', + opacity: 0.95, + }, + '.g2-tooltip-title': { + color: '#A6A6A6', + }, + '.g2-tooltip-list-item-name-label': { + color: '#A6A6A6', + }, + '.g2-tooltip-list-item-value': { + color: '#A6A6A6', + }, + }, + }, + }, options); +}; +exports.Dark = Dark; +//# sourceMappingURL=dark.js.map +}, function(modId) { var map = {"./create":1751263816039}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816042, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Academy = exports.tokens = void 0; +const util_1 = require("@antv/util"); +const create_1 = require("./create"); +exports.tokens = { + colorBlack: '#000', + colorWhite: '#fff', + colorStroke: '#888', + colorDefault: '#4e79a7', + colorBackground: 'transparent', + category10: [ + '#4e79a7', + '#f28e2c', + '#e15759', + '#76b7b2', + '#59a14f', + '#edc949', + '#af7aa1', + '#ff9da7', + '#9c755f', + '#bab0ab', + ], + category20: [ + '#4e79a7', + '#f28e2c', + '#e15759', + '#76b7b2', + '#59a14f', + '#edc949', + '#af7aa1', + '#ff9da7', + '#9c755f', + '#bab0ab', + ], + padding1: 8, + padding2: 12, + padding3: 20, + alpha90: 0.9, + alpha65: 0.65, + alpha45: 0.45, + alpha25: 0.25, + alpha10: 0.1, +}; +const defaults = (0, create_1.create)(exports.tokens); +const Academy = (options) => { + return (0, util_1.deepMix)({}, defaults, { + text: { text: { fontSize: 10 } }, + axis: { + gridLineDash: [0, 0], + gridLineWidth: 1, + gridStroke: '#ddd', + gridStrokeOpacity: 1, + labelOpacity: 1, + labelStrokeOpacity: 1, + labelFontSize: 10, + line: true, + lineLineWidth: 1, + lineStroke: '#888', + lineStrokeOpacity: 1, + tickLength: 5, + tickStrokeOpacity: 1, + titleOpacity: 1, + titleStrokeOpacity: 1, + titleFillOpacity: 1, + titleFontSize: 11, + titleFontWeight: 'bold', + }, + axisLeft: { + gridFilter: (_, i) => i !== 0, + }, + axisRight: { + gridFilter: (_, i) => i !== 0, + }, + legendCategory: { + itemLabelFillOpacity: 1, + itemLabelFontSize: 10, + itemValueFillOpacity: 1, + itemValueFontSize: 10, + titleFillOpacity: 1, + titleFontSize: 11, + titleFontWeight: 'bold', + }, + legendContinuous: { + handleLabelFontSize: 10, + labelFillOpacity: 0.45, + labelFontSize: 10, + }, + label: { + fontSize: 10, + }, + innerLabel: { + fontSize: 10, + }, + htmlLabel: { + fontSize: 10, + }, + slider: { + handleLabelFontSize: 10, + trackFillOpacity: 0.05, + }, + }, options); +}; +exports.Academy = Academy; +exports.Academy.props = {}; +//# sourceMappingURL=academy.js.map +}, function(modId) { var map = {"./create":1751263816039}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816043, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Legends = exports.ScrollbarY = exports.ScrollbarX = exports.SliderY = exports.SliderX = exports.TitleComponent = exports.LegendContinuousSize = exports.LegendContinuousBlockSize = exports.LegendContinuousBlock = exports.LegendContinuous = exports.LegendCategory = exports.AxisRadar = exports.AxisY = exports.AxisX = exports.AxisArc = exports.AxisLinear = void 0; +var axis_1 = require("./axis"); +Object.defineProperty(exports, "AxisLinear", { enumerable: true, get: function () { return axis_1.LinearAxis; } }); +Object.defineProperty(exports, "AxisArc", { enumerable: true, get: function () { return axis_1.ArcAxis; } }); +var axisX_1 = require("./axisX"); +Object.defineProperty(exports, "AxisX", { enumerable: true, get: function () { return axisX_1.AxisX; } }); +var axisY_1 = require("./axisY"); +Object.defineProperty(exports, "AxisY", { enumerable: true, get: function () { return axisY_1.AxisY; } }); +var axisRadar_1 = require("./axisRadar"); +Object.defineProperty(exports, "AxisRadar", { enumerable: true, get: function () { return axisRadar_1.AxisRadar; } }); +var legendCategory_1 = require("./legendCategory"); +Object.defineProperty(exports, "LegendCategory", { enumerable: true, get: function () { return legendCategory_1.LegendCategory; } }); +var legendContinuous_1 = require("./legendContinuous"); +Object.defineProperty(exports, "LegendContinuous", { enumerable: true, get: function () { return legendContinuous_1.LegendContinuous; } }); +var legendContinuousBlock_1 = require("./legendContinuousBlock"); +Object.defineProperty(exports, "LegendContinuousBlock", { enumerable: true, get: function () { return legendContinuousBlock_1.LegendContinuousBlock; } }); +var legendContinuousBlockSize_1 = require("./legendContinuousBlockSize"); +Object.defineProperty(exports, "LegendContinuousBlockSize", { enumerable: true, get: function () { return legendContinuousBlockSize_1.LegendContinuousBlockSize; } }); +var legendContinuousSize_1 = require("./legendContinuousSize"); +Object.defineProperty(exports, "LegendContinuousSize", { enumerable: true, get: function () { return legendContinuousSize_1.LegendContinuousSize; } }); +var title_1 = require("./title"); +Object.defineProperty(exports, "TitleComponent", { enumerable: true, get: function () { return title_1.TitleComponent; } }); +var sliderX_1 = require("./sliderX"); +Object.defineProperty(exports, "SliderX", { enumerable: true, get: function () { return sliderX_1.SliderX; } }); +var sliderY_1 = require("./sliderY"); +Object.defineProperty(exports, "SliderY", { enumerable: true, get: function () { return sliderY_1.SliderY; } }); +var scrollbarX_1 = require("./scrollbarX"); +Object.defineProperty(exports, "ScrollbarX", { enumerable: true, get: function () { return scrollbarX_1.ScrollbarX; } }); +var scrollbarY_1 = require("./scrollbarY"); +Object.defineProperty(exports, "ScrollbarY", { enumerable: true, get: function () { return scrollbarY_1.ScrollbarY; } }); +var legends_1 = require("./legends"); +Object.defineProperty(exports, "Legends", { enumerable: true, get: function () { return legends_1.Legends; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./axis":1751263816044,"./axisX":1751263816046,"./axisY":1751263816047,"./axisRadar":1751263816048,"./legendCategory":1751263816049,"./legendContinuous":1751263816050,"./legendContinuousBlock":1751263816051,"./legendContinuousBlockSize":1751263816052,"./legendContinuousSize":1751263816053,"./title":1751263816054,"./sliderX":1751263816055,"./sliderY":1751263816058,"./scrollbarX":1751263816059,"./scrollbarY":1751263816061,"./legends":1751263816062}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816044, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ArcAxis = exports.LinearAxis = exports.rotateAxis = void 0; +const component_1 = require("@antv/component"); +const scale_1 = require("@antv/scale"); +const util_1 = require("@antv/util"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const d3_format_1 = require("@antv/vendor/d3-format"); +const coordinate_1 = require("../utils/coordinate"); +const number_1 = require("../utils/number"); +const helper_1 = require("../utils/helper"); +const utils_1 = require("./utils"); +function rotateAxis(axis, options) { + const { eulerAngles, origin } = options; + if (origin) { + axis.setOrigin(origin); + } + if (eulerAngles) { + axis.rotate(eulerAngles[0], eulerAngles[1], eulerAngles[2]); + } +} +exports.rotateAxis = rotateAxis; +function sizeOf(coordinate) { + // @ts-ignore + const { innerWidth, innerHeight, depth } = coordinate.getOptions(); + return [innerWidth, innerHeight, depth]; +} +function createFisheye(position, coordinate) { + const { width, height } = coordinate.getOptions(); + return (tick) => { + if (!(0, coordinate_1.isFisheye)(coordinate)) + return tick; + const tickPoint = position === 'bottom' ? [tick, 1] : [0, tick]; + const vector = coordinate.map(tickPoint); + if (position === 'bottom') { + const v = vector[0]; + const x = new scale_1.Linear({ + domain: [0, width], + range: [0, 1], + }); + return x.map(v); + } + else if (position === 'left') { + const v = vector[1]; + const x = new scale_1.Linear({ + domain: [0, height], + range: [0, 1], + }); + return x.map(v); + } + return tick; + }; +} +function ticksOf(scale, domain, tickMethod) { + if (scale.getTicks) + return scale.getTicks(); + if (!tickMethod) + return domain; + const [min, max] = (0, d3_array_1.extent)(domain, (d) => +d); + const { tickCount } = scale.getOptions(); + return tickMethod(min, max, tickCount); +} +// Set inset for axis. +function createInset(position, coordinate) { + if ((0, coordinate_1.isPolar)(coordinate)) + return (d) => d; + const options = coordinate.getOptions(); + const { innerWidth, innerHeight, insetTop, insetBottom, insetLeft, insetRight, } = options; + const [start, end, size] = position === 'left' || position === 'right' + ? [insetTop, insetBottom, innerHeight] + : [insetLeft, insetRight, innerWidth]; + const x = new scale_1.Linear({ + domain: [0, 1], + range: [start / size, 1 - end / size], + }); + return (i) => x.map(i); +} +/** + * Calc ticks based on scale and coordinate. + */ +function getData(scale, domain, tickCount, defaultTickFormatter, tickFilter, tickMethod, position, coordinate) { + var _a; + if (tickCount !== undefined || tickMethod !== undefined) { + scale.update(Object.assign(Object.assign({}, (tickCount && { tickCount })), (tickMethod && { tickMethod }))); + } + const ticks = ticksOf(scale, domain, tickMethod); + const filteredTicks = tickFilter ? ticks.filter(tickFilter) : ticks; + const toString = (d) => d instanceof Date + ? String(d) + : typeof d === 'object' && !!d + ? d + : String(d); + const labelFormatter = defaultTickFormatter || ((_a = scale.getFormatter) === null || _a === void 0 ? void 0 : _a.call(scale)) || toString; + const applyInset = createInset(position, coordinate); + const applyFisheye = createFisheye(position, coordinate); + const isHorizontal = (position) => ['top', 'bottom', 'center', 'outer'].includes(position); + const isVertical = (position) => ['left', 'right'].includes(position); + // @todo GUI should consider the overlap problem for the first + // and label of arc axis. + if ((0, coordinate_1.isPolar)(coordinate) || (0, coordinate_1.isTranspose)(coordinate)) { + return filteredTicks.map((d, i, array) => { + var _a, _b; + const offset = ((_a = scale.getBandWidth) === null || _a === void 0 ? void 0 : _a.call(scale, d)) / 2 || 0; + const tick = applyInset(scale.map(d) + offset); + const shouldReverse = ((0, coordinate_1.isRadial)(coordinate) && position === 'center') || + ((0, coordinate_1.isTranspose)(coordinate) && + ((_b = scale.getTicks) === null || _b === void 0 ? void 0 : _b.call(scale)) && + isHorizontal(position)) || + ((0, coordinate_1.isTranspose)(coordinate) && isVertical(position)); + return { + value: shouldReverse ? 1 - tick : tick, + label: toString(labelFormatter((0, number_1.prettyNumber)(d), i, array)), + id: String(i), + }; + }); + } + return filteredTicks.map((d, i, array) => { + var _a; + const offset = ((_a = scale.getBandWidth) === null || _a === void 0 ? void 0 : _a.call(scale, d)) / 2 || 0; + const tick = applyFisheye(applyInset(scale.map(d) + offset)); + const shouldReverse = isVertical(position); + return { + value: shouldReverse ? 1 - tick : tick, + label: toString(labelFormatter((0, number_1.prettyNumber)(d), i, array)), + id: String(i), + }; + }); +} +function inferGridLength(position, coordinate, plane = 'xy') { + const [width, height, depth] = sizeOf(coordinate); + if (plane === 'xy') { + if (position.includes('bottom') || position.includes('top')) + return height; + return width; + } + else if (plane === 'xz') { + if (position.includes('bottom') || position.includes('top')) + return depth; + return width; + } + else { + if (position.includes('bottom') || position.includes('top')) + return height; + return depth; + } +} +function inferLabelOverlap(transform = [], style) { + if (transform.length > 0) + return transform; + const { labelAutoRotate, labelAutoHide, labelAutoEllipsis, labelAutoWrap } = style; + const finalTransforms = []; + const addToTransforms = (overlap, state) => { + if (state) { + finalTransforms.push(Object.assign(Object.assign({}, overlap), state)); + } + }; + addToTransforms({ + type: 'rotate', + optionalAngles: [0, 15, 30, 45, 60, 90], + }, labelAutoRotate); + addToTransforms({ type: 'ellipsis', minLength: 20 }, labelAutoEllipsis); + addToTransforms({ type: 'hide' }, labelAutoHide); + addToTransforms({ type: 'wrap', wordWrapWidth: 100, maxLines: 3, recoveryWhenFail: true }, labelAutoWrap); + return finalTransforms; +} +function inferArcStyle(position, bbox, innerRadius, outerRadius, coordinate) { + const { x, y, width, height } = bbox; + const center = [x + width / 2, y + height / 2]; + const radius = Math.min(width, height) / 2; + const [startAngle, endAngle] = (0, coordinate_1.angleOf)(coordinate); + const [w, h] = sizeOf(coordinate); + const r = Math.min(w, h) / 2; + const common = { + center, + radius, + startAngle, + endAngle, + gridLength: (outerRadius - innerRadius) * r, + }; + if (position === 'inner') { + // @ts-ignore + const { insetLeft, insetTop } = coordinate.getOptions(); + return Object.assign(Object.assign({}, common), { center: [center[0] - insetLeft, center[1] - insetTop], labelAlign: 'perpendicular', labelDirection: 'positive', tickDirection: 'positive', gridDirection: 'negative' }); + } + // arc outer + return Object.assign(Object.assign({}, common), { labelAlign: 'parallel', labelDirection: 'negative', tickDirection: 'negative', gridDirection: 'positive' }); +} +function inferGrid(value, coordinate, scale) { + if ((0, coordinate_1.isTheta)(coordinate) || (0, coordinate_1.isParallel)(coordinate)) + return false; + // Display axis grid for non-discrete values. + return value === undefined ? !!scale.getTicks : value; +} +function infer3DAxisLinearOverrideStyle(coordinate) { + // @ts-ignore + const { depth } = coordinate.getOptions(); + return depth + ? { + tickIsBillboard: true, + lineIsBillboard: true, + labelIsBillboard: true, + titleIsBillboard: true, + gridIsBillboard: true, + } + : {}; +} +function inferAxisLinearOverrideStyle(position, orientation, bbox, coordinate, xScale) { + const { x, y, width, height } = bbox; + if (position === 'bottom') { + return { startPos: [x, y], endPos: [x + width, y] }; + } + if (position === 'left') { + return { startPos: [x + width, y + height], endPos: [x + width, y] }; + } + if (position === 'right') { + return { startPos: [x, y + height], endPos: [x, y] }; + } + if (position === 'top') { + return { startPos: [x, y + height], endPos: [x + width, y + height] }; + } + // linear axis, maybe in parallel, polar, radial or radar systems. + if (position === 'center') { + // axisY + if (orientation === 'vertical') { + return { + startPos: [x, y], + endPos: [x, y + height], + }; + } + // axisX + else if (orientation === 'horizontal') { + return { + startPos: [x, y], + endPos: [x + width, y], + }; + } + // axis with rotate + else if (typeof orientation === 'number') { + const [cx, cy] = coordinate.getCenter(); + const [innerRadius, outerRadius] = (0, coordinate_1.radiusOf)(coordinate); + const [startAngle, endAngle] = (0, coordinate_1.angleOf)(coordinate); + const r = Math.min(width, height) / 2; + // @ts-ignore + const { insetLeft, insetTop } = coordinate.getOptions(); + const innerR = innerRadius * r; + const outerR = outerRadius * r; + const [actualCx, actualCy] = [cx + x - insetLeft, cy + y - insetTop]; + const [cos, sin] = [Math.cos(orientation), Math.sin(orientation)]; + const startPos = [ + actualCx + outerR * cos, + actualCy + outerR * sin, + ]; + const endPos = [ + actualCx + innerR * cos, + actualCy + innerR * sin, + ]; + const getAxisXDomainLength = () => { + const { domain } = xScale.getOptions(); + return domain.length; + }; + const controllAngleCount = (0, coordinate_1.isPolar)(coordinate) && xScale ? getAxisXDomainLength() : 3; + return { + startPos, + endPos, + gridClosed: Math.abs(endAngle - startAngle - 360) < 1e-6, + gridCenter: [actualCx, actualCy], + gridControlAngles: new Array(controllAngleCount) + .fill(0) + .map((d, i, arr) => ((endAngle - startAngle) / controllAngleCount) * i), + }; + } + } + // position is inner or outer for arc axis won't be here + return {}; +} +const ArcAxisComponent = (options) => { + const { order, size, position, orientation, labelFormatter, tickFilter, tickCount, tickMethod, important = {}, style = {}, indexBBox, title, grid = false } = options, rest = __rest(options, ["order", "size", "position", "orientation", "labelFormatter", "tickFilter", "tickCount", "tickMethod", "important", "style", "indexBBox", "title", "grid"]); + return ({ scales: [scale], value, coordinate, theme }) => { + const { bbox } = value; + const { domain } = scale.getOptions(); + const data = getData(scale, domain, tickCount, labelFormatter, tickFilter, tickMethod, position, coordinate); + // Bind computed bbox if exists. + const labels = indexBBox + ? data.map((d, i) => { + const bbox = indexBBox.get(i); + if (!bbox) + return d; + // bbox: [label, bbox] + // Make than indexBBox can match current label. + if (bbox[0] !== d.label) + return d; + return Object.assign(Object.assign({}, d), { bbox: bbox[1] }); + }) + : data; + const [innerRadius, outerRadius] = (0, coordinate_1.radiusOf)(coordinate); + const defaultStyle = inferArcStyle(position, bbox, innerRadius, outerRadius, coordinate); + const { axis: axisTheme, axisArc = {} } = theme; + const finalStyle = (0, utils_1.adaptor)((0, util_1.deepMix)({}, axisTheme, axisArc, defaultStyle, Object.assign(Object.assign({ type: 'arc', data: labels, titleText: (0, utils_1.titleContent)(title), grid }, rest), important))); + return new component_1.Axis({ + // @fixme transform is not valid for arcAxis. + // @ts-ignore + style: (0, util_1.omit)(finalStyle, ['transform']), + }); + }; +}; +function inferThemeStyle(scale, coordinate, theme, direction, position, orientation) { + const baseStyle = theme.axis; + const positionStyle = ['top', 'right', 'bottom', 'left'].includes(position) + ? theme[`axis${(0, helper_1.capitalizeFirst)(position)}`] + : theme.axisLinear; + const channel = scale.getOptions().name; + const channelStyle = theme[`axis${(0, util_1.upperFirst)(channel)}`] || {}; + return Object.assign({}, baseStyle, positionStyle, channelStyle); +} +function inferDefaultStyle(scale, coordinate, theme, direction, position, orientation) { + const themeStyle = inferThemeStyle(scale, coordinate, theme, direction, position, orientation); + if (position === 'center') { + return Object.assign(Object.assign(Object.assign(Object.assign({}, themeStyle), { labelDirection: direction === 'right' ? 'negative' : 'positive' }), (direction === 'center' + ? { labelTransform: 'translate(50%,0)' } + : null)), { tickDirection: direction === 'right' ? 'negative' : 'positive', labelSpacing: direction === 'center' ? 0 : 4, titleSpacing: (0, utils_1.isVertical)(orientation) ? 10 : 0, tick: direction === 'center' ? false : undefined }); + } + return themeStyle; +} +const LinearAxisComponent = (options) => { + const { direction = 'left', important = {}, labelFormatter, order, orientation, actualPosition, position, size, style = {}, title, tickCount, tickFilter, tickMethod, transform, indexBBox } = options, userDefinitions = __rest(options, ["direction", "important", "labelFormatter", "order", "orientation", "actualPosition", "position", "size", "style", "title", "tickCount", "tickFilter", "tickMethod", "transform", "indexBBox"]); + return ({ scales, value, coordinate, theme }) => { + const { bbox } = value; + const [scale] = scales; + const { domain, xScale } = scale.getOptions(); + const defaultStyle = inferDefaultStyle(scale, coordinate, theme, direction, position, orientation); + const internalAxisStyle = Object.assign(Object.assign(Object.assign({}, defaultStyle), style), userDefinitions); + const gridLength = inferGridLength(actualPosition || position, coordinate, options.plane); + const overrideStyle = inferAxisLinearOverrideStyle(position, orientation, bbox, coordinate, xScale); + const threeDOverrideStyle = infer3DAxisLinearOverrideStyle(coordinate); + const data = getData(scale, domain, tickCount, labelFormatter, tickFilter, tickMethod, position, coordinate); + // Bind computed bbox if exists. + const labels = indexBBox + ? data.map((d, i) => { + const bbox = indexBBox.get(i); + if (!bbox) + return d; + // bbox: [label, bbox] + // Make than indexBBox can match current label. + if (bbox[0] !== d.label) + return d; + return Object.assign(Object.assign({}, d), { bbox: bbox[1] }); + }) + : data; + const finalAxisStyle = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, internalAxisStyle), { type: 'linear', data: labels, crossSize: size, titleText: (0, utils_1.titleContent)(title), labelOverlap: inferLabelOverlap(transform, internalAxisStyle), grid: inferGrid(internalAxisStyle.grid, coordinate, scale), gridLength, + // Always showLine, make title could align the end of axis. + line: true, indexBBox }), (!internalAxisStyle.line ? { lineOpacity: 0 } : null)), overrideStyle), threeDOverrideStyle), important); + // For hide overlap, do not set crossSize. + const hasHide = finalAxisStyle.labelOverlap.find((d) => d.type === 'hide'); + if (hasHide) + finalAxisStyle.crossSize = false; + return new component_1.Axis({ + className: 'axis', + style: (0, utils_1.adaptor)(finalAxisStyle), + }); + }; +}; +const axisFactor = (axis) => { + return (options) => { + const { labelFormatter: useDefinedLabelFormatter, labelFilter: userDefinedLabelFilter = () => true, } = options; + return (context) => { + var _a; + const { scales: [scale], } = context; + const ticks = ((_a = scale.getTicks) === null || _a === void 0 ? void 0 : _a.call(scale)) || scale.getOptions().domain; + const labelFormatter = typeof useDefinedLabelFormatter === 'string' + ? (0, d3_format_1.format)(useDefinedLabelFormatter) + : useDefinedLabelFormatter; + const labelFilter = (datum, index, array) => userDefinedLabelFilter(ticks[index], index, ticks); + const normalizedOptions = Object.assign(Object.assign({}, options), { labelFormatter, + labelFilter, + scale }); + return axis(normalizedOptions)(context); + }; + }; +}; +exports.LinearAxis = axisFactor(LinearAxisComponent); +exports.ArcAxis = axisFactor(ArcAxisComponent); +exports.LinearAxis.props = { + defaultPosition: 'center', + defaultSize: 45, + defaultOrder: 0, + defaultCrossPadding: [12, 12], + defaultPadding: [12, 12], +}; +exports.ArcAxis.props = { + defaultPosition: 'outer', + defaultOrientation: 'vertical', + defaultSize: 45, + defaultOrder: 0, + defaultCrossPadding: [12, 12], + defaultPadding: [12, 12], +}; +//# sourceMappingURL=axis.js.map +}, function(modId) { var map = {"../utils/coordinate":1751263815882,"../utils/number":1751263815884,"../utils/helper":1751263815829,"./utils":1751263816045}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816045, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.adaptor = exports.domainOf = exports.inferComponentShape = exports.isVertical = exports.isHorizontal = exports.scaleOf = exports.LegendCategoryLayout = exports.G2Layout = exports.inferComponentLayout = exports.titleContent = exports.maybeAppend = exports.createComponent = void 0; +const g_1 = require("@antv/g"); +const component_1 = require("@antv/component"); +const util_1 = require("@antv/util"); +const selection_1 = require("../utils/selection"); +function createComponent(descriptor) { + return class extends g_1.CustomElement { + constructor(config) { + super(config); + this.descriptor = descriptor; + } + connectedCallback() { + var _a, _b; + (_b = (_a = this.descriptor).render) === null || _b === void 0 ? void 0 : _b.call(_a, this.attributes, this); + } + update(cfg = {}) { + var _a, _b; + this.attr((0, util_1.deepMix)({}, this.attributes, cfg)); + (_b = (_a = this.descriptor).render) === null || _b === void 0 ? void 0 : _b.call(_a, this.attributes, this); + } + }; +} +exports.createComponent = createComponent; +function maybeAppend(parent, selector, node) { + if (!parent.querySelector(selector)) { + return (0, selection_1.select)(parent).append(node); + } + return (0, selection_1.select)(parent).select(selector); +} +exports.maybeAppend = maybeAppend; +function titleContent(field) { + return Array.isArray(field) ? field.join(', ') : `${field || ''}`; +} +exports.titleContent = titleContent; +function inferComponentLayout(position, userDefinitions) { + const preset = { + display: 'flex', + flexDirection: 'row', + justifyContent: 'flex-start', + alignItems: 'center', + }; + let { flexDirection, justifyContent, alignItems } = preset; + const layout = { + top: ['row', 'flex-start', 'center'], + bottom: ['row', 'flex-start', 'center'], + left: ['column', 'flex-start', 'center'], + right: ['column', 'flex-start', 'center'], + center: ['column', 'center', 'center'], + }; + if (position in layout) { + [flexDirection, justifyContent, alignItems] = layout[position]; + } + return Object.assign({ display: 'flex', flexDirection, + justifyContent, + alignItems }, userDefinitions); +} +exports.inferComponentLayout = inferComponentLayout; +class G2Layout extends component_1.Layout { + get child() { + var _a; + return (_a = this.children) === null || _a === void 0 ? void 0 : _a[0]; + } + update(options) { + var _a; + this.attr(options); + const { subOptions } = options; + (_a = this.child) === null || _a === void 0 ? void 0 : _a.update(subOptions); + } +} +exports.G2Layout = G2Layout; +class LegendCategoryLayout extends G2Layout { + update(options) { + var _a; + const { subOptions } = options; + this.attr(options); + (_a = this.child) === null || _a === void 0 ? void 0 : _a.update(subOptions); + } +} +exports.LegendCategoryLayout = LegendCategoryLayout; +function scaleOf(scales, type) { + var _a; + return (_a = scales.filter((s) => s.getOptions().name === type)) === null || _a === void 0 ? void 0 : _a[0]; +} +exports.scaleOf = scaleOf; +function isHorizontal(orientation) { + return orientation === 'horizontal' || orientation === 0; +} +exports.isHorizontal = isHorizontal; +function isVertical(orientation) { + return orientation === 'vertical' || orientation === -Math.PI / 2; +} +exports.isVertical = isVertical; +function inferComponentShape(value, options, component) { + const { bbox } = value; + const { position = 'top', size: userDefinedSize, length: userDefinedLength, } = options; + const isHorizontal = ['top', 'bottom', 'center'].includes(position); + const [bboxSize, bboxLength] = isHorizontal + ? [bbox.height, bbox.width] + : [bbox.width, bbox.height]; + const { defaultSize, defaultLength } = component.props; + const size = userDefinedSize || defaultSize || bboxSize; + const length = userDefinedLength || defaultLength || bboxLength; + const orientation = isHorizontal ? 'horizontal' : 'vertical'; + const [width, height] = isHorizontal ? [length, size] : [size, length]; + return { + orientation, + width, + height, + size, + length, + }; +} +exports.inferComponentShape = inferComponentShape; +function domainOf(scales) { + // to get a available scale's domain + return scales + .find((scale) => scale.getOptions().domain.length > 0) + .getOptions().domain; +} +exports.domainOf = domainOf; +function adaptor(style) { + const reservedKeys = [ + 'arrow', + 'crosshairs', + 'grid', + 'handle', + 'handleLabel', + 'indicator', + 'label', + 'line', + 'tick', + 'tip', + 'title', + 'trunc', + ]; + // @ts-ignore + const { style: styles } = style, rest = __rest(style, ["style"]); + const finalStyle = {}; + Object.entries(rest).forEach(([key, value]) => { + if (reservedKeys.includes(key)) { + finalStyle[`show${(0, util_1.upperFirst)(key)}`] = value; + } + else + finalStyle[key] = value; + }); + return Object.assign(Object.assign({}, finalStyle), styles); +} +exports.adaptor = adaptor; +//# sourceMappingURL=utils.js.map +}, function(modId) { var map = {"../utils/selection":1751263815883}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816046, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.axisXConfig = exports.AxisX = void 0; +const axis_1 = require("./axis"); +/** + * LinearAxis component bind to x scale. + */ +const AxisX = (options) => { + return (...args) => { + // empirical value for crossPadding + const axisX = (0, axis_1.LinearAxis)(Object.assign({}, { crossPadding: 50 }, options))(...args); + (0, axis_1.rotateAxis)(axisX, options); + return axisX; + }; +}; +exports.AxisX = AxisX; +exports.AxisX.props = Object.assign(Object.assign({}, axis_1.LinearAxis.props), { defaultPosition: 'bottom' }); +function axisXConfig() { } +exports.axisXConfig = axisXConfig; +//# sourceMappingURL=axisX.js.map +}, function(modId) { var map = {"./axis":1751263816044}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816047, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AxisY = void 0; +const axis_1 = require("./axis"); +/** + * LinearAxis component bind to y scale. + */ +const AxisY = (options) => { + return (...args) => { + const axisY = (0, axis_1.LinearAxis)(Object.assign({}, { crossPadding: 10 }, options))(...args); + (0, axis_1.rotateAxis)(axisY, options); + return axisY; + }; +}; +exports.AxisY = AxisY; +exports.AxisY.props = Object.assign(Object.assign({}, axis_1.LinearAxis.props), { defaultPosition: 'left' }); +//# sourceMappingURL=axisY.js.map +}, function(modId) { var map = {"./axis":1751263816044}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816048, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AxisRadar = void 0; +const coordinate_1 = require("../utils/coordinate"); +const axis_1 = require("./axis"); +function inferTitleTransform(orientation) { + const internalOrientation = orientation % (Math.PI * 2); + if (internalOrientation === Math.PI / 2) { + return { titleTransform: 'translate(0, 50%)' }; + } + if (internalOrientation > -Math.PI / 2 && internalOrientation < Math.PI / 2) { + return { titleTransform: 'translate(50%, 0)' }; + } + if (internalOrientation > Math.PI / 2 && + internalOrientation < (Math.PI * 3) / 2) { + return { titleTransform: 'translate(-50%, 0)' }; + } + return {}; +} +function inferAxisStyle(options, theme, coordinate, scales) { + const { radar } = options; + const [scale] = scales; + const name = scale.getOptions().name; + const [startAngle, endAngle] = (0, coordinate_1.angleOf)(coordinate); + const { axisRadar: radarTheme = {} } = theme; + return Object.assign(Object.assign({}, radarTheme), { grid: name === 'position', gridConnect: 'line', gridControlAngles: new Array(radar.count).fill(0).map((_, i) => { + const angle = (endAngle - startAngle) / radar.count; + return angle * i; + }) }); +} +const AxisRadar = (options) => { + const { important = {} } = options, restOptions = __rest(options, ["important"]); + return (context) => { + const { theme, coordinate, scales } = context; + return (0, axis_1.LinearAxis)(Object.assign(Object.assign(Object.assign({}, restOptions), inferTitleTransform(options.orientation)), { important: Object.assign(Object.assign({}, inferAxisStyle(options, theme, coordinate, scales)), important) }))(context); + }; +}; +exports.AxisRadar = AxisRadar; +exports.AxisRadar.props = Object.assign(Object.assign({}, axis_1.LinearAxis.props), { defaultPosition: 'center' }); +//# sourceMappingURL=axisRadar.js.map +}, function(modId) { var map = {"../utils/coordinate":1751263815882,"./axis":1751263816044}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816049, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LegendCategory = void 0; +const component_1 = require("@antv/component"); +const util_1 = require("@antv/util"); +const d3_format_1 = require("@antv/vendor/d3-format"); +const scale_1 = require("@antv/scale"); +const marker_1 = require("../utils/marker"); +const utils_1 = require("./utils"); +function inferShape(scales, markState) { + const shapeScale = (0, utils_1.scaleOf)(scales, 'shape'); + const colorScale = (0, utils_1.scaleOf)(scales, 'color'); + // NOTE!!! + // scaleOrdinal.map will mute domain. + const shapeScale1 = shapeScale ? shapeScale.clone() : null; + // Infer the main shape if multiple marks are used. + const shapes = []; + for (const [mark, state] of markState) { + const namespace = mark.type; + const domain = (colorScale === null || colorScale === void 0 ? void 0 : colorScale.getOptions().domain.length) > 0 + ? colorScale === null || colorScale === void 0 ? void 0 : colorScale.getOptions().domain + : state.data; + const shape = domain.map((d, i) => { + var _a; + if (shapeScale1) + return shapeScale1.map(d || 'point'); + return ((_a = mark === null || mark === void 0 ? void 0 : mark.style) === null || _a === void 0 ? void 0 : _a.shape) || state.defaultShape || 'point'; + }); + if (typeof namespace === 'string') + shapes.push([namespace, shape]); + } + if (shapes.length === 0) + return ['point', ['point']]; + if (shapes.length === 1) + return shapes[0]; + if (!shapeScale) + return shapes[0]; + // Evaluate the maximum likelihood of shape + const { range } = shapeScale.getOptions(); + return shapes + .map(([namespace, shape]) => { + let sum = 0; + for (let i = 0; i < shapes.length; i++) { + const targetShape = range[i % range.length]; + if (shape[i] === targetShape) + sum++; + } + return [sum / shape.length, [namespace, shape]]; + }) + .sort((a, b) => b[0] - a[0])[0][1]; +} +function inferItemMarker(options, context) { + const { scales, library, markState } = context; + const [mark, shapes] = inferShape(scales, markState); + const { itemMarker, itemMarkerSize: size } = options; + const create = (name, d) => { + var _a, _b, _c; + const marker = ((_c = (_b = (_a = library[`mark.${mark}`]) === null || _a === void 0 ? void 0 : _a.props) === null || _b === void 0 ? void 0 : _b.shape[name]) === null || _c === void 0 ? void 0 : _c.props.defaultMarker) || (0, util_1.last)(name.split('.')); + const radius = typeof size === 'function' ? size(d) : size; + return () => (0, marker_1.useMarker)(marker, { color: d.color })(0, 0, radius); + }; + const shapeOf = (i) => `${shapes[i]}`; + const shapeScale = (0, utils_1.scaleOf)(scales, 'shape'); + if (shapeScale && !itemMarker) + return (d, i) => create(shapeOf(i), d); + if (typeof itemMarker === 'function') { + return (d, i) => { + // @todo Fix this in GUI. + // It should pass primitive value rather object. + const node = itemMarker(d.id, i); + if (typeof node === 'string') + return create(node, d); + return node; + }; + } + return (d, i) => create(itemMarker || shapeOf(i), d); +} +function inferItemMarkerOpacity(scales) { + const scale = (0, utils_1.scaleOf)(scales, 'opacity'); + if (scale) { + const { range } = scale.getOptions(); + return (d, i) => range[i]; + } + return undefined; +} +function inferItemMarkerSize(scales, defaults) { + const scale = (0, utils_1.scaleOf)(scales, 'size'); + if (scale instanceof scale_1.Identity) + return scale.map(NaN) * 2; + return defaults; +} +function inferCategoryStyle(options, context) { + const { labelFormatter = (d) => `${d}` } = options; + const { scales, theme } = context; + const defaultSize = theme.legendCategory.itemMarkerSize; + const itemMarkerSize = inferItemMarkerSize(scales, defaultSize); + const baseStyle = { + itemMarker: inferItemMarker(Object.assign(Object.assign({}, options), { itemMarkerSize }), context), + itemMarkerSize: itemMarkerSize, + itemMarkerOpacity: inferItemMarkerOpacity(scales), + }; + const finalLabelFormatter = typeof labelFormatter === 'string' + ? (0, d3_format_1.format)(labelFormatter) + : labelFormatter; + const colorScale = (0, utils_1.scaleOf)(scales, 'color'); + const domain = (0, utils_1.domainOf)(scales); + const colorOf = colorScale + ? (d) => colorScale.map(d) + : () => context.theme.color; + return Object.assign(Object.assign({}, baseStyle), { data: domain.map((d) => ({ + id: d, + label: finalLabelFormatter(d), + color: colorOf(d), + })) }); +} +function inferLegendShape(value, options, component) { + const { position } = options; + if (position === 'center') { + const { bbox } = value; + // to be confirm: if position is center, we should use the width and height of user definition. + const { width, height } = bbox; + return { width, height }; + } + const { width, height } = (0, utils_1.inferComponentShape)(value, options, component); + return { width, height }; +} +function filterEmptyIds(legendStyle) { + return Object.assign(Object.assign({}, legendStyle), { data: (legendStyle === null || legendStyle === void 0 ? void 0 : legendStyle.data.filter((item) => item.id !== '')) || [] }); +} +/** + * Guide Component for ordinal color scale. + */ +const LegendCategory = (options) => { + const { labelFormatter, layout, order, orientation, position, size, title, cols, itemMarker } = options, style = __rest(options, ["labelFormatter", "layout", "order", "orientation", "position", "size", "title", "cols", "itemMarker"]); + const { gridRow } = style; + return (context) => { + const { value, theme } = context; + const { bbox } = value; + const { width, height } = inferLegendShape(value, options, exports.LegendCategory); + const finalLayout = (0, utils_1.inferComponentLayout)(position, layout); + const legendStyle = Object.assign(Object.assign(Object.assign(Object.assign({ orientation: ['right', 'left', 'center'].includes(position) + ? 'vertical' + : 'horizontal', width, + height, layout: cols !== undefined ? 'grid' : 'flex' }, (cols !== undefined && { gridCol: cols })), (gridRow !== undefined && { gridRow })), { titleText: (0, utils_1.titleContent)(title) }), inferCategoryStyle(options, context)); + const { legendCategory: legendTheme = {} } = theme; + // Filter out the data items with empty string IDs in the wordCloud's data before generating the legend. + const categoryStyle = (0, utils_1.adaptor)(Object.assign({}, legendTheme, filterEmptyIds(legendStyle), style)); + const layoutWrapper = new utils_1.LegendCategoryLayout({ + style: Object.assign(Object.assign({ x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height }, finalLayout), { + // @ts-ignore + subOptions: categoryStyle }), + }); + layoutWrapper.appendChild(new component_1.Category({ + className: 'legend-category', + style: categoryStyle, + })); + return layoutWrapper; + }; +}; +exports.LegendCategory = LegendCategory; +exports.LegendCategory.props = { + defaultPosition: 'top', + defaultOrder: 1, + defaultSize: 40, + defaultCrossPadding: [12, 12], + defaultPadding: [12, 12], +}; +//# sourceMappingURL=legendCategory.js.map +}, function(modId) { var map = {"../utils/marker":1751263815899,"./utils":1751263816045}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816050, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LegendContinuous = void 0; +const g_1 = require("@antv/g"); +const component_1 = require("@antv/component"); +const scale_1 = require("@antv/scale"); +const d3_format_1 = require("@antv/vendor/d3-format"); +const array_1 = require("../utils/array"); +const utils_1 = require("./utils"); +function updateShapeDimensions(shape, finalSize, orientation) { + shape.size = finalSize; + if ((0, utils_1.isHorizontal)(orientation)) { + shape.height = finalSize; + } + else { + shape.width = finalSize; + } + return shape; +} +function inferContinuousShape(value, options, component) { + const { size } = options; + const shape = (0, utils_1.inferComponentShape)(value, options, component); + return updateShapeDimensions(shape, size, shape.orientation); +} +function getFormatter(max) { + return (value) => ({ + value: value / max, + label: String(value), + }); +} +function getQuantizeOrQuantileConfig(shape, colorScale, min, max, range) { + const thresholds = colorScale.thresholds; + const formatter = getFormatter(max); + return Object.assign(Object.assign({}, shape), { color: range, data: [min, ...thresholds, max].map(formatter) }); +} +function getThresholdConfig(shape, colorScale, range) { + const thresholds = colorScale.thresholds; + const data = [-Infinity, ...thresholds, Infinity].map((value, index) => ({ + value: index, + label: value, + })); + return Object.assign(Object.assign({}, shape), { data, color: range, labelFilter: (datum, index) => { + return index > 0 && index < data.length - 1; + } }); +} +function rangeOf(scale) { + const { domain } = scale.getOptions(); + const [min, max] = [domain[0], (0, array_1.lastOf)(domain)]; + return [min, max]; +} +/** + * if color scale is not defined, create a constant color scale based on default color + * @param scale + * @param theme + */ +function createColorScale(scale, defaultColor) { + const options = scale.getOptions(); + const newScale = scale.clone(); + newScale.update(Object.assign(Object.assign({}, options), { range: [(0, g_1.parseColor)(defaultColor).toString()] })); + return newScale; +} +function getLinearConfig(shape, colorScale, sizeScale, opacityScale, scales, theme) { + const { length } = shape; + const definedScale = sizeScale || opacityScale; + // Only use defaultColor when there is no color scale + // in this view. + const defaultColor = scales.color + ? theme.legendContinuous.ribbonFill || 'black' + : theme.color; + const scale = colorScale || createColorScale(definedScale, defaultColor); + const [min, max] = rangeOf(scale); + const [domainMin, domainMax] = rangeOf([colorScale, sizeScale, opacityScale] + .filter((d) => d !== undefined) + .find((d) => !(d instanceof scale_1.Constant))); + return Object.assign(Object.assign({}, shape), { domain: [domainMin, domainMax], data: scale.getTicks().map((value) => ({ value })), color: new Array(Math.floor(length)).fill(0).map((d, i) => { + const value = ((max - min) / (length - 1)) * i + min; + const color = scale.map(value) || defaultColor; + const opacity = opacityScale ? opacityScale.map(value) : 1; + return color.replace(/rgb[a]*\(([\d]{1,3}) *, *([\d]{1,3}) *, *([\d]{1,3})[\S\s]*\)/, (match, p1, p2, p3) => `rgba(${p1}, ${p2}, ${p3}, ${opacity})`); + }) }); +} +function inferContinuousConfig(scales, scale, value, options, component, theme) { + const colorScale = (0, utils_1.scaleOf)(scales, 'color'); + const shape = inferContinuousShape(value, options, component); + if (colorScale instanceof scale_1.Threshold) { + const { range } = colorScale.getOptions(); + const [min, max] = rangeOf(colorScale); + // for quantize, quantile scale + if (colorScale instanceof scale_1.Quantize || colorScale instanceof scale_1.Quantile) { + return getQuantizeOrQuantileConfig(shape, colorScale, min, max, range); + } + // for threshold + return getThresholdConfig(shape, colorScale, range); + } + // for linear, pow, sqrt, log, time, utc scale + const sizeScale = (0, utils_1.scaleOf)(scales, 'size'); + const opacityScale = (0, utils_1.scaleOf)(scales, 'opacity'); + return getLinearConfig(shape, colorScale, sizeScale, opacityScale, scale, theme); +} +/** + * Guide Component for continuous color scale. + * @todo Custom style. + */ +const LegendContinuous = (options) => { + const { labelFormatter, layout, order, orientation, position, size, title, style, crossPadding, padding } = options, rest = __rest(options, ["labelFormatter", "layout", "order", "orientation", "position", "size", "title", "style", "crossPadding", "padding"]); + return ({ scales, value, theme, scale }) => { + const { bbox } = value; + const { x, y, width, height } = bbox; + const finalLayout = (0, utils_1.inferComponentLayout)(position, layout); + const { legendContinuous: legendTheme = {} } = theme; + const finalStyle = (0, utils_1.adaptor)(Object.assign({}, legendTheme, Object.assign(Object.assign({ titleText: (0, utils_1.titleContent)(title), labelAlign: 'value', labelFormatter: typeof labelFormatter === 'string' + ? (d) => (0, d3_format_1.format)(labelFormatter)(d.label) + : labelFormatter }, inferContinuousConfig(scales, scale, value, options, exports.LegendContinuous, theme)), style), rest)); + const layoutWrapper = new utils_1.G2Layout({ + style: Object.assign(Object.assign({ x, + y, + width, + height }, finalLayout), { + // @ts-ignore + subOptions: finalStyle }), + }); + layoutWrapper.appendChild(new component_1.Continuous({ + className: 'legend-continuous', + style: finalStyle, + })); + return layoutWrapper; + }; +}; +exports.LegendContinuous = LegendContinuous; +exports.LegendContinuous.props = { + defaultPosition: 'top', + defaultOrientation: 'vertical', + defaultOrder: 1, + defaultSize: 60, + defaultLength: 200, + defaultLegendSize: 60, + defaultPadding: [20, 10], + defaultCrossPadding: [12, 12], // [horizontal, vertical] +}; +//# sourceMappingURL=legendContinuous.js.map +}, function(modId) { var map = {"../utils/array":1751263815830,"./utils":1751263816045}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816051, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LegendContinuousBlock = void 0; +const legendContinuous_1 = require("./legendContinuous"); +const LegendContinuousBlock = (options) => { + return (...args) => (0, legendContinuous_1.LegendContinuous)(Object.assign({}, { block: true }, options))(...args); +}; +exports.LegendContinuousBlock = LegendContinuousBlock; +exports.LegendContinuousBlock.props = Object.assign(Object.assign({}, legendContinuous_1.LegendContinuous.props), { defaultPosition: 'top', defaultOrientation: 'horizontal' }); +//# sourceMappingURL=legendContinuousBlock.js.map +}, function(modId) { var map = {"./legendContinuous":1751263816050}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816052, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LegendContinuousBlockSize = void 0; +const legendContinuous_1 = require("./legendContinuous"); +const legendContinuousSize_1 = require("./legendContinuousSize"); +const LegendContinuousBlockSize = (options) => { + return (0, legendContinuousSize_1.LegendContinuousSize)(Object.assign({}, { block: true }, options)); +}; +exports.LegendContinuousBlockSize = LegendContinuousBlockSize; +exports.LegendContinuousBlockSize.props = Object.assign(Object.assign({}, legendContinuous_1.LegendContinuous.props), { defaultPosition: 'top', defaultOrientation: 'horizontal' }); +//# sourceMappingURL=legendContinuousBlockSize.js.map +}, function(modId) { var map = {"./legendContinuous":1751263816050,"./legendContinuousSize":1751263816053}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816053, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LegendContinuousSize = void 0; +const utils_1 = require("./utils"); +const legendContinuous_1 = require("./legendContinuous"); +const LegendContinuousSize = (options) => { + return (context) => { + const { scales } = context; + const sizeScale = (0, utils_1.scaleOf)(scales, 'size'); + return (0, legendContinuous_1.LegendContinuous)(Object.assign({}, { + type: 'size', + data: sizeScale.getTicks().map((value, index) => ({ + value, + label: String(value), + })), + }, options))(context); + }; +}; +exports.LegendContinuousSize = LegendContinuousSize; +exports.LegendContinuousSize.props = Object.assign(Object.assign({}, legendContinuous_1.LegendContinuous.props), { defaultPosition: 'top', defaultOrientation: 'horizontal' }); +//# sourceMappingURL=legendContinuousSize.js.map +}, function(modId) { var map = {"./utils":1751263816045,"./legendContinuous":1751263816050}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816054, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TitleComponent = void 0; +const util_1 = require("@antv/util"); +const utils_1 = require("../shape/utils"); +const helper_1 = require("../utils/helper"); +const utils_2 = require("./utils"); +function inferStyleByAlign(x, y, width, align) { + switch (align) { + case 'center': + return { + x: x + width / 2, + y, + textAlign: 'middle', + }; + case 'right': + return { + x: x + width, + y, + textAlign: 'right', + }; + default: + return { + x, + y, + textAlign: 'left', + }; + } +} +const Title = (0, utils_2.createComponent)({ + render(attributes, container) { + const { width, title, subtitle, spacing = 2, align = 'left', x, y } = attributes, style = __rest(attributes, ["width", "title", "subtitle", "spacing", "align", "x", "y"]); + container.style.transform = `translate(${x}, ${y})`; + const titleStyle = (0, helper_1.subObject)(style, 'title'); + const subtitleStyle = (0, helper_1.subObject)(style, 'subtitle'); + const mainTitle = (0, utils_2.maybeAppend)(container, '.title', 'text') + .attr('className', 'title') + .call(utils_1.applyStyle, Object.assign(Object.assign(Object.assign({}, inferStyleByAlign(0, 0, width, align)), { fontSize: 14, textBaseline: 'top', text: title }), titleStyle)) + .node(); + const bounds = mainTitle.getLocalBounds(); + (0, utils_2.maybeAppend)(container, '.sub-title', 'text') + .attr('className', 'sub-title') + .call((selection) => { + if (!subtitle) + return selection.node().remove(); + selection.node().attr(Object.assign(Object.assign(Object.assign({}, inferStyleByAlign(0, bounds.max[1] + spacing, width, align)), { fontSize: 12, textBaseline: 'top', text: subtitle }), subtitleStyle)); + }); + }, +}); +/** + * Title Component. + */ +const TitleComponent = (options) => { + return ({ value, theme }) => { + const { x, y, width, height } = value.bbox; + return new Title({ + style: (0, util_1.deepMix)({}, theme.title, Object.assign({ x, + y, + width, + height }, options)), + }); + }; +}; +exports.TitleComponent = TitleComponent; +exports.TitleComponent.props = { + defaultPosition: 'top', + defaultOrder: 2, + defaultSize: 36, + defaultCrossPadding: [20, 20], + defaultPadding: [12, 12], +}; +//# sourceMappingURL=title.js.map +}, function(modId) { var map = {"../shape/utils":1751263815885,"../utils/helper":1751263815829,"./utils":1751263816045}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816055, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SliderX = void 0; +const slider_1 = require("./slider"); +/** + * SliderX component. + */ +const SliderX = (options) => { + return (0, slider_1.Slider)(Object.assign(Object.assign({}, options), { orientation: 'horizontal' })); +}; +exports.SliderX = SliderX; +exports.SliderX.props = Object.assign(Object.assign({}, slider_1.Slider.props), { defaultPosition: 'bottom' }); +//# sourceMappingURL=sliderX.js.map +}, function(modId) { var map = {"./slider":1751263816056}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816056, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Slider = void 0; +const component_1 = require("@antv/component"); +const d3_format_1 = require("@antv/vendor/d3-format"); +const util_1 = require("@antv/util"); +const coordinate_1 = require("../utils/coordinate"); +const scale_1 = require("../utils/scale"); +function inferPosition(bbox, position, trackSize) { + const { x, y, width, height } = bbox; + if (position === 'left') + return [x + width - trackSize, y]; + if (position === 'right') + return [x, y]; + if (position === 'bottom') + return [x, y]; + if (position === 'top') + return [x, y + height - trackSize]; +} +/** + * Slider component. + */ +const Slider = (options) => { + // do not pass size. + const { orientation, labelFormatter, size, style = {}, position } = options, rest = __rest(options, ["orientation", "labelFormatter", "size", "style", "position"]); + return (context) => { + var _a; + const { scales: [scale], value, theme, coordinate, } = context; + const { bbox } = value; + const { width, height } = bbox; + const { slider: sliderTheme = {} } = theme; + const defaultFormatter = ((_a = scale.getFormatter) === null || _a === void 0 ? void 0 : _a.call(scale)) || ((v) => v + ''); + const formatter = typeof labelFormatter === 'string' + ? (0, d3_format_1.format)(labelFormatter) + : labelFormatter; + const isHorizontal = orientation === 'horizontal'; + const reverse = (0, coordinate_1.isTranspose)(coordinate) && isHorizontal; + const { trackSize = sliderTheme.trackSize } = style; + const [x0, y0] = inferPosition(bbox, position, trackSize); + return new component_1.Slider({ + className: 'slider', + style: Object.assign({}, sliderTheme, Object.assign(Object.assign({ x: x0, y: y0, trackLength: isHorizontal ? width : height, orientation, formatter: (v) => { + const f = formatter || defaultFormatter; + const v1 = reverse ? 1 - v : v; + const tick = (0, scale_1.invert)(scale, v1, true); + return f(tick); + }, sparklineData: inferSparklineData(options, context) }, style), rest)), + }); + }; +}; +exports.Slider = Slider; +function markValue(markState, channels) { + const [value] = Array.from(markState.entries()) + .filter(([mark]) => mark.type === 'line' || mark.type === 'area') + .filter(([mark]) => mark.slider) + .map(([mark]) => { + const { encode, slider } = mark; + if (slider === null || slider === void 0 ? void 0 : slider.x) { + const channel = (name) => { + const channel = encode[name]; + return [name, channel ? channel.value : undefined]; + }; + return Object.fromEntries(channels.map(channel)); + } + }); + if (!(value === null || value === void 0 ? void 0 : value.series)) + return value === null || value === void 0 ? void 0 : value.y; + const result = value.series.reduce((acc, curr, index) => { + acc[curr] = acc[curr] || []; + acc[curr].push(value.y[index]); + return acc; + }, {}); + return Object.values(result); +} +function inferSparklineData(options, context) { + const { markState } = context; + if ((0, util_1.isArray)(options.sparklineData)) + return options.sparklineData; + return markValue(markState, ['y', 'series']); +} +exports.Slider.props = { + defaultPosition: 'bottom', + defaultSize: 24, + defaultOrder: 1, + defaultCrossPadding: [12, 12], + defaultPadding: [12, 12], +}; +//# sourceMappingURL=slider.js.map +}, function(modId) { var map = {"../utils/coordinate":1751263815882,"../utils/scale":1751263816057}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816057, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.pixelsOf = exports.abstractOf = exports.selectionOf = exports.domainOf = exports.invert = exports.isOrdinalScale = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +function constrain(x, lo, hi) { + return Math.min(hi, Math.max(lo, x)); +} +function isOrdinalScale(scale) { + return !!scale.getBandWidth; +} +exports.isOrdinalScale = isOrdinalScale; +function invert(scale, x, start) { + if (!isOrdinalScale(scale)) + return scale.invert(x); + const { adjustedRange } = scale; + const { domain } = scale.getOptions(); + const offset = start ? -1 : 0; + const step = scale.getStep(); + const range = start ? adjustedRange : adjustedRange.map((d) => d + step); + // R[i0 - 1] < x <= R[i0] + const i0 = (0, d3_array_1.bisectLeft)(range, x); + const i1 = constrain(i0 + offset, 0, domain.length - 1); + return domain[i1]; +} +exports.invert = invert; +function domainOf(scale, values, ratioX) { + if (!values) + return scale.getOptions().domain; + if (!isOrdinalScale(scale)) { + const sortedDomain = (0, d3_array_1.sort)(values); + if (!ratioX) + return sortedDomain; + const [d] = sortedDomain; + const { range } = scale.getOptions(); + const [r0, r1] = range; + const v = r0 > r1 ? -1 : 1; + const d1 = scale.invert(scale.map(d) + v * ratioX); + return [d, d1]; + } + const { domain } = scale.getOptions(); + const v1 = values[0]; + const start = domain.indexOf(v1); + if (ratioX) { + const end = start + Math.round(domain.length * ratioX); + return domain.slice(start, end); + } + const v2 = values[values.length - 1]; + const end = domain.indexOf(v2); + return domain.slice(start, end + 1); +} +exports.domainOf = domainOf; +function selectionOf(x, y, x1, y1, scale, coordinate) { + const { x: scaleX, y: scaleY } = scale; + const abstractDomain = (point, start) => { + const [x, y] = coordinate.invert(point); + return [invert(scaleX, x, start), invert(scaleY, y, start)]; + }; + const p0 = abstractDomain([x, y], true); + const p1 = abstractDomain([x1, y1], false); + const domainX = domainOf(scaleX, [p0[0], p1[0]]); + const domainY = domainOf(scaleY, [p0[1], p1[1]]); + return [domainX, domainY]; +} +exports.selectionOf = selectionOf; +function abstractOf(domain, scale) { + const [d0, d1] = domain; + const maybeStep = (scale) => (scale.getStep ? scale.getStep() : 0); + return [scale.map(d0), scale.map(d1) + maybeStep(scale)]; +} +exports.abstractOf = abstractOf; +function pixelsOf(selection, scale, coordinate) { + const { x: scaleX, y: scaleY } = scale; + const [X, Y] = selection; + const AX = abstractOf(X, scaleX); + const AY = abstractOf(Y, scaleY); + const p0 = [AX[0], AY[0]]; + const p1 = [AX[1], AY[1]]; + const [x, y] = coordinate.map(p0); + const [x1, y1] = coordinate.map(p1); + return [x, y, x1, y1]; +} +exports.pixelsOf = pixelsOf; +//# sourceMappingURL=scale.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816058, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SliderY = void 0; +const slider_1 = require("./slider"); +/** + * SliderY component. + */ +const SliderY = (options) => { + return (0, slider_1.Slider)(Object.assign(Object.assign({}, options), { orientation: 'vertical' })); +}; +exports.SliderY = SliderY; +exports.SliderY.props = Object.assign(Object.assign({}, slider_1.Slider.props), { defaultPosition: 'left' }); +//# sourceMappingURL=sliderY.js.map +}, function(modId) { var map = {"./slider":1751263816056}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816059, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ScrollbarX = void 0; +const scrollbar_1 = require("./scrollbar"); +/** + * ScrollbarX component. + */ +const ScrollbarX = (options) => { + return (0, scrollbar_1.Scrollbar)(Object.assign(Object.assign({}, options), { orientation: 'horizontal' })); +}; +exports.ScrollbarX = ScrollbarX; +exports.ScrollbarX.props = Object.assign(Object.assign({}, scrollbar_1.Scrollbar.props), { defaultPosition: 'bottom' }); +//# sourceMappingURL=scrollbarX.js.map +}, function(modId) { var map = {"./scrollbar":1751263816060}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816060, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Scrollbar = void 0; +const component_1 = require("@antv/component"); +/** + * Scrollbar component. + */ +const Scrollbar = (options) => { + const { orientation, labelFormatter, style } = options, rest = __rest(options, ["orientation", "labelFormatter", "style"]); + return ({ scales: [scale], value, theme }) => { + const { bbox } = value; + const { x, y, width, height } = bbox; + const { scrollbar: scrollbarTheme = {} } = theme; + const { ratio, range } = scale.getOptions(); + const mainSize = orientation === 'horizontal' ? width : height; + const actualSize = mainSize / ratio; + const [r0, r1] = range; + const value1 = r1 > r0 ? 0 : 1; + return new component_1.Scrollbar({ + className: 'g2-scrollbar', + style: Object.assign({}, scrollbarTheme, Object.assign(Object.assign(Object.assign(Object.assign({}, style), { x, + y, trackLength: mainSize, value: value1 }), rest), { orientation, contentLength: actualSize, viewportLength: mainSize })), + }); + }; +}; +exports.Scrollbar = Scrollbar; +exports.Scrollbar.props = { + defaultPosition: 'bottom', + defaultSize: 24, + defaultOrder: 1, + defaultCrossPadding: [12, 12], + defaultPadding: [12, 12], +}; +//# sourceMappingURL=scrollbar.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816061, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ScrollbarY = void 0; +const scrollbar_1 = require("./scrollbar"); +/** + * ScrollbarY component. + */ +const ScrollbarY = (options) => { + return (0, scrollbar_1.Scrollbar)(Object.assign(Object.assign({}, options), { orientation: 'vertical' })); +}; +exports.ScrollbarY = ScrollbarY; +exports.ScrollbarY.props = Object.assign(Object.assign({}, scrollbar_1.Scrollbar.props), { defaultPosition: 'left' }); +//# sourceMappingURL=scrollbarY.js.map +}, function(modId) { var map = {"./scrollbar":1751263816060}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816062, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Legends = void 0; +const g_1 = require("@antv/g"); +// A empty component to pass parse view tree stage. +const Legends = (options) => { + return () => { + return new g_1.Group(); + }; +}; +exports.Legends = Legends; +exports.Legends.props = {}; +//# sourceMappingURL=legends.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816063, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GrowInY = exports.GrowInX = exports.PathIn = exports.ZoomOut = exports.ZoomIn = exports.WaveIn = exports.Morphing = exports.FadeOut = exports.FadeIn = exports.ScaleOutY = exports.ScaleInY = exports.ScaleOutX = exports.ScaleInX = void 0; +var scaleInX_1 = require("./scaleInX"); +Object.defineProperty(exports, "ScaleInX", { enumerable: true, get: function () { return scaleInX_1.ScaleInX; } }); +var scaleOutX_1 = require("./scaleOutX"); +Object.defineProperty(exports, "ScaleOutX", { enumerable: true, get: function () { return scaleOutX_1.ScaleOutX; } }); +var scaleInY_1 = require("./scaleInY"); +Object.defineProperty(exports, "ScaleInY", { enumerable: true, get: function () { return scaleInY_1.ScaleInY; } }); +var scaleOutY_1 = require("./scaleOutY"); +Object.defineProperty(exports, "ScaleOutY", { enumerable: true, get: function () { return scaleOutY_1.ScaleOutY; } }); +var fadeIn_1 = require("./fadeIn"); +Object.defineProperty(exports, "FadeIn", { enumerable: true, get: function () { return fadeIn_1.FadeIn; } }); +var fadeOut_1 = require("./fadeOut"); +Object.defineProperty(exports, "FadeOut", { enumerable: true, get: function () { return fadeOut_1.FadeOut; } }); +var morphing_1 = require("./morphing"); +Object.defineProperty(exports, "Morphing", { enumerable: true, get: function () { return morphing_1.Morphing; } }); +var waveIn_1 = require("./waveIn"); +Object.defineProperty(exports, "WaveIn", { enumerable: true, get: function () { return waveIn_1.WaveIn; } }); +var zoomIn_1 = require("./zoomIn"); +Object.defineProperty(exports, "ZoomIn", { enumerable: true, get: function () { return zoomIn_1.ZoomIn; } }); +var zoomOut_1 = require("./zoomOut"); +Object.defineProperty(exports, "ZoomOut", { enumerable: true, get: function () { return zoomOut_1.ZoomOut; } }); +var pathIn_1 = require("./pathIn"); +Object.defineProperty(exports, "PathIn", { enumerable: true, get: function () { return pathIn_1.PathIn; } }); +var growInX_1 = require("./growInX"); +Object.defineProperty(exports, "GrowInX", { enumerable: true, get: function () { return growInX_1.GrowInX; } }); +var growInY_1 = require("./growInY"); +Object.defineProperty(exports, "GrowInY", { enumerable: true, get: function () { return growInY_1.GrowInY; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./scaleInX":1751263816064,"./scaleOutX":1751263816065,"./scaleInY":1751263816066,"./scaleOutY":1751263816067,"./fadeIn":1751263816068,"./fadeOut":1751263816069,"./morphing":1751263816070,"./waveIn":1751263816072,"./zoomIn":1751263816073,"./zoomOut":1751263816074,"./pathIn":1751263816075,"./growInX":1751263816076,"./growInY":1751263816077}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816064, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ScaleInX = void 0; +const coordinate_1 = require("../utils/coordinate"); +/** + * Scale mark from nothing to desired shape in x direction. + */ +const ScaleInX = (options, context) => { + // Small enough to hide or show very small part of mark, + // but bigger enough to not cause bug. + const ZERO = 0.0001; + const { coordinate } = context; + return (from, _, defaults) => { + const [shape] = from; + const { transform: prefix = '', fillOpacity = 1, strokeOpacity = 1, opacity = 1, } = shape.style; + const [transformOrigin, transform] = (0, coordinate_1.isTranspose)(coordinate) + ? [`left bottom`, `scale(1, ${ZERO})`] // left-bottom corner + : [`left top`, `scale(${ZERO}, 1)`]; // left-top corner + // Using a short fadeIn transition to hide element with scale(0.001) + // which is still visible. + const keyframes = [ + { + transform: `${prefix} ${transform}`.trimStart(), + transformOrigin, + fillOpacity: 0, + strokeOpacity: 0, + opacity: 0, + }, + { + transform: `${prefix} ${transform}`.trimStart(), + transformOrigin, + fillOpacity, + strokeOpacity, + opacity, + offset: 0.01, + }, + { + transform: `${prefix} scale(1, 1)`.trimStart(), + transformOrigin, + fillOpacity, + strokeOpacity, + opacity, + }, + ]; + const animation = shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options)); + return animation; + }; +}; +exports.ScaleInX = ScaleInX; +//# sourceMappingURL=scaleInX.js.map +}, function(modId) { var map = {"../utils/coordinate":1751263815882}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816065, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ScaleOutX = void 0; +const coordinate_1 = require("../utils/coordinate"); +/** + * Scale mark from desired shape to nothing in x direction. + */ +const ScaleOutX = (options, context) => { + // Small enough to hide or show very small part of mark, + // but bigger enough to not cause bug. + const ZERO = 0.0001; + const { coordinate } = context; + return (from, _, defaults) => { + const [shape] = from; + const { transform: prefix = '', fillOpacity = 1, strokeOpacity = 1, opacity = 1, } = shape.style; + const [transformOrigin, transform] = (0, coordinate_1.isTranspose)(coordinate) + ? [`left bottom`, `scale(1, ${ZERO})`] // left-bottom corner + : [`left top`, `scale(${ZERO}, 1)`]; // left-top corner + // Using a short fadeIn transition to hide element with scale(0.001) + // which is still visible. + const keyframes = [ + { + transform: `${prefix} scale(1, 1)`.trimStart(), + transformOrigin, + }, + { + transform: `${prefix} ${transform}`.trimStart(), + transformOrigin, + fillOpacity, + strokeOpacity, + opacity, + offset: 0.99, + }, + { + transform: `${prefix} ${transform}`.trimStart(), + transformOrigin, + fillOpacity: 0, + strokeOpacity: 0, + opacity: 0, + }, + ]; + const animation = shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options)); + return animation; + }; +}; +exports.ScaleOutX = ScaleOutX; +//# sourceMappingURL=scaleOutX.js.map +}, function(modId) { var map = {"../utils/coordinate":1751263815882}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816066, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ScaleInY = void 0; +const g_1 = require("@antv/g"); +const coordinate_1 = require("../utils/coordinate"); +const utils_1 = require("../shape/utils"); +/** + * Scale mark from nothing to desired shape in y direction. + */ +const ScaleInY = (options, context) => { + // Small enough to hide or show very small part of mark, + // but bigger enough to not cause bug. + const ZERO = 0.0001; + const { coordinate } = context; + // the polar coordinate need + g_1.CSS.registerProperty({ + name: 'scaleInYRadius', + inherits: false, + initialValue: '', + interpolable: true, + syntax: g_1.PropertySyntax.NUMBER, + }); + return (from, _, defaults) => { + const [shape] = from; + const PolarScaleInY = (shape) => { + const { __data__, style } = shape; + const { fillOpacity = 1, strokeOpacity = 1, opacity = 1 } = style; + const { points, y, y1 } = __data__; + const arcObject = (0, utils_1.getArcObject)(coordinate, points, [y, y1]); + const { innerRadius, outerRadius } = arcObject; + const keyframes = [ + { + scaleInYRadius: innerRadius + ZERO, + fillOpacity: 0, + strokeOpacity: 0, + opacity: 0, + }, + { + scaleInYRadius: innerRadius + ZERO, + fillOpacity, + strokeOpacity, + opacity, + offset: 0.01, + }, + { + scaleInYRadius: outerRadius, + fillOpacity, + strokeOpacity, + opacity, + }, + ]; + const animation = shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options)); + return animation; + }; + const RectangularScaleInY = (shape) => { + const { style } = shape; + const { transform: prefix = '', fillOpacity = 1, strokeOpacity = 1, opacity = 1, } = style; + const [transformOrigin, transform] = (0, coordinate_1.isTranspose)(coordinate) + ? [`left top`, `scale(${ZERO}, 1)`] // left-top corner + : [`left bottom`, `scale(1, ${ZERO})`]; // left-bottom corner + // Using a short fadeIn transition to hide element with scale(0.001) + // which is still visible. + const keyframes = [ + { + transform: `${prefix} ${transform}`.trimStart(), + transformOrigin, + fillOpacity: 0, + strokeOpacity: 0, + opacity: 0, + }, + { + transform: `${prefix} ${transform}`.trimStart(), + transformOrigin, + fillOpacity, + strokeOpacity, + opacity, + offset: 0.01, + }, + { + transform: `${prefix} scale(1, 1)`.trimStart(), + transformOrigin, + fillOpacity, + strokeOpacity, + opacity, + }, + ]; + const animation = shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options)); + return animation; + }; + if ((0, coordinate_1.isPolar)(coordinate)) { + return PolarScaleInY(shape); + } + else { + return RectangularScaleInY(shape); + } + }; +}; +exports.ScaleInY = ScaleInY; +//# sourceMappingURL=scaleInY.js.map +}, function(modId) { var map = {"../utils/coordinate":1751263815882,"../shape/utils":1751263815885}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816067, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ScaleOutY = void 0; +const coordinate_1 = require("../utils/coordinate"); +/** + * Scale mark from desired shape to nothing in y direction. + */ +const ScaleOutY = (options, context) => { + // Small enough to hide or show very small part of mark, + // but bigger enough to not cause bug. + const ZERO = 0.0001; + const { coordinate } = context; + return (from, _, defaults) => { + const [shape] = from; + const { transform: prefix = '', fillOpacity = 1, strokeOpacity = 1, opacity = 1, } = shape.style; + const [transformOrigin, transform] = (0, coordinate_1.isTranspose)(coordinate) + ? [`left top`, `scale(${ZERO}, 1)`] // left-top corner + : [`left bottom`, `scale(1, ${ZERO})`]; // left-bottom corner + // Using a short fadeIn transition to hide element with scale(0.001) + // which is still visible. + const keyframes = [ + { + transform: `${prefix} scale(1, 1)`.trimStart(), + transformOrigin, + }, + { + transform: `${prefix} ${transform}`.trimStart(), + transformOrigin, + fillOpacity, + strokeOpacity, + opacity, + offset: 0.99, + }, + { + transform: `${prefix} ${transform}`.trimStart(), + transformOrigin, + fillOpacity: 0, + strokeOpacity: 0, + opacity: 0, + }, + ]; + const animation = shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options)); + return animation; + }; +}; +exports.ScaleOutY = ScaleOutY; +//# sourceMappingURL=scaleOutY.js.map +}, function(modId) { var map = {"../utils/coordinate":1751263815882}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816068, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FadeIn = void 0; +/** + * Transform mark from transparent to solid. + */ +const FadeIn = (options) => { + return (from, _, defaults) => { + const [shape] = from; + const { fillOpacity = 1, strokeOpacity = 1, opacity = 1 } = shape.style; + const keyframes = [ + { fillOpacity: 0, strokeOpacity: 0, opacity: 0 }, + { + fillOpacity, + strokeOpacity, + opacity, + }, + ]; + return shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options)); + }; +}; +exports.FadeIn = FadeIn; +exports.FadeIn.props = {}; +//# sourceMappingURL=fadeIn.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816069, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FadeOut = void 0; +/** + * Transform mark from solid to transparent. + */ +const FadeOut = (options) => { + return (from, _, defaults) => { + const [shape] = from; + const { fillOpacity = 1, strokeOpacity = 1, opacity = 1 } = shape.style; + const keyframes = [ + { + fillOpacity, + strokeOpacity, + opacity, + }, + { fillOpacity: 0, strokeOpacity: 0, opacity: 0 }, + ]; + return shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options)); + }; +}; +exports.FadeOut = FadeOut; +exports.FadeOut.props = {}; +//# sourceMappingURL=fadeOut.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816070, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Morphing = void 0; +const g_1 = require("@antv/g"); +const util_1 = require("@antv/util"); +const helper_1 = require("../utils/helper"); +const utils_1 = require("./utils"); +function localBBoxOf(shape) { + const { min, max } = shape.getLocalBounds(); + const [x0, y0] = min; + const [x1, y1] = max; + const height = y1 - y0; + const width = x1 - x0; + return [x0, y0, width, height]; +} +function d(bbox) { + const [x, y, width, height] = bbox; + return ` + M ${x} ${y} + L ${x + width} ${y} + L ${x + width} ${y + height} + L ${x} ${y + height} + Z + `; +} +function pack(shape, count) { + const [x0, y0, width, height] = localBBoxOf(shape); + const aspect = height / width; + const col = Math.ceil(Math.sqrt(count / aspect)); + const row = Math.ceil(count / col); + const B = []; + const h = height / row; + let j = 0; + let n = count; + while (n > 0) { + const c = Math.min(n, col); + const w = width / c; + for (let i = 0; i < c; i++) { + const x = x0 + i * w; + const y = y0 + j * h; + B.push(d([x, y, w, h])); + } + n -= c; + j += 1; + } + return B; +} +function normalizeSplit(split = 'pack') { + if (typeof split == 'function') + return split; + return pack; +} +/** + * Use attributes relative to geometry to do shape to shape animation. + * + * For example, the x, y, width, height of `Rect`, the cx, cy, r of `Circle`. + * And for `Group`, it will use the bbox of the group. + */ +function shapeToShape(from, to, timeEffect) { + let { transform: fromTransform } = from.style; + const { transform: toTransform } = to.style; + // Replace first to get right bbox after mounting. + replaceChild(to, from); + let keys = utils_1.attributeKeys; + if (from.nodeName === g_1.Shape.GROUP) { + // Apply translate and scale transform. + const [x0, y0, w0, h0] = localBBoxOf(from); + const [x1, y1, w1, h1] = localBBoxOf(to); + const dx = x0 - x1; + const dy = y0 - y1; + const sx = w0 / w1; + const sy = h0 / h1; + fromTransform = `translate(${dx}, ${dy}) scale(${sx}, ${sy})`; + } + else { + keys = keys.concat(utils_1.GEOMETRY_ATTRIBUTES[from.nodeName] || []); + } + const keyframes = [ + Object.assign({ transform: fromTransform !== null && fromTransform !== void 0 ? fromTransform : 'none' }, (0, utils_1.attributeOf)(from, keys, true)), + Object.assign({ transform: toTransform !== null && toTransform !== void 0 ? toTransform : 'none' }, (0, utils_1.attributeOf)(to, keys, true)), + ]; + const animation = to.animate(keyframes, timeEffect); + return animation; +} +/** + * Replace object and copy className and __data__ + */ +function replaceChild(newChild, oldChild) { + newChild['__data__'] = oldChild['__data__']; + newChild.className = oldChild.className; + // @ts-ignore + newChild.markType = oldChild.markType; + oldChild.parentNode.replaceChild(newChild, oldChild); +} +/** + * Replace element with a path shape. + */ +function maybePath(node, d) { + const { nodeName } = node; + if (nodeName === 'path') + return node; + const path = new g_1.Path({ + style: Object.assign(Object.assign({}, (0, utils_1.attributeOf)(node, utils_1.attributeKeys)), { d }), + }); + replaceChild(path, node); + return path; +} +function hasUniqueString(search, pattern) { + const first = search.indexOf(pattern); + const last = search.lastIndexOf(pattern); + return first === last; +} +// Path definition with multiple m and M command has sub path. +// eg. 'M10,10...M20,20', 'm10,10...m20,20' +function hasSubPath(path) { + return !hasUniqueString(path, 'm') || !hasUniqueString(path, 'M'); +} +function shape2path(shape) { + const path = (0, g_1.convertToPath)(shape); + if (!path) + return; + // Path definition with sub path can't do path morphing animation, + // so skip this kind of path. + if (hasSubPath(path)) + return; + return path; +} +// Check if the path has a markerEnd | markerStart +function hasMarker(shape) { + const { nodeName } = shape; + if (nodeName === 'path') { + const attributes = (0, util_1.get)(shape, 'attributes'); + return attributes.markerEnd || attributes.markerStart; + } + return false; +} +function oneToOne(shape, from, to, timeEffect) { + // If the nodeTypes of from and to are equal, + // or non of them can convert to path, + // the apply shape to shape animation. + const { nodeName: fromName } = from; + const { nodeName: toName } = to; + const fromPath = shape2path(from); + const toPath = shape2path(to); + const isSameNodes = fromName === toName && fromName !== 'path'; + const hasNonPathNode = fromPath === undefined || toPath === undefined; + // Path with mark can not use animate like ordinary path. + const isPathWithMarker = hasMarker(from) || hasMarker(to); + if (isSameNodes || hasNonPathNode || isPathWithMarker) + return shapeToShape(from, to, timeEffect); + const pathShape = maybePath(shape, fromPath); + // Convert Path will take transform, anchor, etc into account, + // so there is no need to specify these attributes in keyframes. + const keyframes = [ + Object.assign({}, (0, utils_1.attributeOf)(from, utils_1.attributeKeys)), + Object.assign({}, (0, utils_1.attributeOf)(to, utils_1.attributeKeys)), + ]; + if (fromPath !== toPath) { + keyframes[0].d = fromPath; + keyframes[1].d = toPath; + const animation = pathShape.animate(keyframes, timeEffect); + animation.onfinish = () => { + // Should keep the original path definition. + (0, helper_1.copyAttributes)(pathShape, to); + pathShape.style.d = toPath; + pathShape.style.transform = 'none'; + }; + // Remove transform because it already applied in path + // converted by convertToPath. + pathShape.style.transform = 'none'; + return animation; + } + // No need to apply animation since fromPath equals toPath. + return null; +} +function oneToMultiple(from, to, timeEffect, split) { + // Hide the shape to be split before being removing. + from.style.visibility = 'hidden'; + const D = split(from, to.length); + return to.map((shape, i) => { + const path = new g_1.Path({ + style: Object.assign({ d: D[i] }, (0, utils_1.attributeOf)(from, utils_1.attributeKeys)), + }); + return oneToOne(shape, path, shape, timeEffect); + }); +} +function multipleToOne(from, to, timeEffect, split) { + const D = split(to, from.length); + const { fillOpacity = 1, strokeOpacity = 1, opacity = 1 } = to.style; + const keyframes = [ + { fillOpacity: 0, strokeOpacity: 0, opacity: 0 }, + { fillOpacity: 0, strokeOpacity: 0, opacity: 0, offset: 0.99 }, + { + fillOpacity, + strokeOpacity, + opacity, + }, + ]; + const animation = to.animate(keyframes, timeEffect); + const animations = from.map((shape, i) => { + const path = new g_1.Path({ + style: { + d: D[i], + fill: to.style.fill, + }, + }); + return oneToOne(shape, shape, path, timeEffect); + }); + return [...animations, animation]; +} +/** + * Morphing animations. + * @todo Support more split function. + */ +const Morphing = (options) => { + return (from, to, defaults) => { + const split = normalizeSplit(options.split); + const timeEffect = Object.assign(Object.assign({}, defaults), options); + const { length: fl } = from; + const { length: tl } = to; + if ((fl === 1 && tl === 1) || (fl > 1 && tl > 1)) { + const [f] = from; + const [t] = to; + return oneToOne(f, f, t, timeEffect); + } + if (fl === 1 && tl > 1) { + const [f] = from; + return oneToMultiple(f, to, timeEffect, split); + } + if (fl > 1 && tl === 1) { + const [t] = to; + return multipleToOne(from, t, timeEffect, split); + } + return null; + }; +}; +exports.Morphing = Morphing; +exports.Morphing.props = {}; +//# sourceMappingURL=morphing.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"./utils":1751263816071}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816071, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.attributeKeys = exports.attributeOf = exports.GEOMETRY_ATTRIBUTES = void 0; +const g_1 = require("@antv/g"); +const DEFAULT_ATTRIBUTE_VALUE = { + opacity: 1, + strokeOpacity: 1, + fillOpacity: 1, + lineWidth: 0, + x: 0, + y: 0, + cx: 0, + cy: 0, + r: 0, + rx: 0, + ry: 0, + width: 0, + height: 0, +}; +exports.GEOMETRY_ATTRIBUTES = { + [g_1.Shape.CIRCLE]: ['cx', 'cy', 'r'], + [g_1.Shape.ELLIPSE]: ['cx', 'cy', 'rx', 'ry'], + [g_1.Shape.RECT]: ['x', 'y', 'width', 'height'], + [g_1.Shape.IMAGE]: ['x', 'y', 'width', 'height'], + [g_1.Shape.LINE]: ['x1', 'y1', 'x2', 'y2'], + [g_1.Shape.POLYLINE]: ['points'], + [g_1.Shape.POLYGON]: ['points'], +}; +function attributeOf(shape, keys, useDefaultValue = false) { + const attribute = {}; + for (const key of keys) { + const value = shape.style[key]; + if (value) { + attribute[key] = value; + } + else if (useDefaultValue) { + attribute[key] = DEFAULT_ATTRIBUTE_VALUE[key]; + } + } + return attribute; +} +exports.attributeOf = attributeOf; +exports.attributeKeys = [ + 'fill', + 'stroke', + 'fillOpacity', + 'strokeOpacity', + 'opacity', + 'lineWidth', +]; +//# sourceMappingURL=utils.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816072, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WaveIn = void 0; +const d3_shape_1 = require("@antv/vendor/d3-shape"); +const g_1 = require("@antv/g"); +const utils_1 = require("../shape/utils"); +const coordinate_1 = require("../utils/coordinate"); +const scaleInX_1 = require("./scaleInX"); +/** + * Transform mark from transparent to solid. + */ +const WaveIn = (options, context) => { + const ZERO = 0.0001; + // @see https://g-next.antv.vision/zh/docs/api/css/css-properties-values-api#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B1%9E%E6%80%A7 + g_1.CSS.registerProperty({ + name: 'waveInArcAngle', + inherits: false, + initialValue: '', + interpolable: true, + syntax: g_1.PropertySyntax.NUMBER, + }); + const { coordinate } = context; + return (from, to, defaults) => { + const [shape] = from; + if (!(0, coordinate_1.isPolar)(coordinate)) { + return (0, scaleInX_1.ScaleInX)(options, context)(from, to, defaults); + } + const { __data__, style } = shape; + const { radius = 0, inset = 0, fillOpacity = 1, strokeOpacity = 1, opacity = 1, } = style; + const { points, y, y1 } = __data__; + const path = (0, d3_shape_1.arc)() + .cornerRadius(radius) + .padAngle((inset * Math.PI) / 180); + const arcObject = (0, utils_1.getArcObject)(coordinate, points, [y, y1]); + const { startAngle, endAngle } = arcObject; + const keyframes = [ + // Use custom interpolable CSS property. + { + waveInArcAngle: startAngle + ZERO, + fillOpacity: 0, + strokeOpacity: 0, + opacity: 0, + }, + { + waveInArcAngle: startAngle + ZERO, + fillOpacity, + strokeOpacity, + opacity, + offset: 0.01, + }, + { + waveInArcAngle: endAngle, + fillOpacity, + strokeOpacity, + opacity, + }, + ]; + const animation = shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options)); + animation.onframe = function () { + shape.style.d = path(Object.assign(Object.assign({}, arcObject), { endAngle: Number(shape.style.waveInArcAngle) })); + }; + animation.onfinish = function () { + shape.style.d = path(Object.assign(Object.assign({}, arcObject), { endAngle: endAngle })); + }; + return animation; + }; +}; +exports.WaveIn = WaveIn; +exports.WaveIn.props = {}; +//# sourceMappingURL=waveIn.js.map +}, function(modId) { var map = {"../shape/utils":1751263815885,"../utils/coordinate":1751263815882,"./scaleInX":1751263816064}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816073, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ZoomIn = void 0; +const ZoomIn = (options) => { + // Small enough to hide or show very small part of mark, + // but bigger enough to not cause bug. + const ZERO = 0.0001; + return (from, _, defaults) => { + const [shape] = from; + const { transform: prefix = '', fillOpacity = 1, strokeOpacity = 1, opacity = 1, } = shape.style; + const transformOrigin = 'center center'; + const keyframes = [ + { + transform: `${prefix} scale(${ZERO})`.trimStart(), + transformOrigin, + fillOpacity: 0, + strokeOpacity: 0, + opacity: 0, + }, + { + transform: `${prefix} scale(${ZERO})`.trimStart(), + transformOrigin, + fillOpacity, + strokeOpacity, + opacity, + offset: 0.01, + }, + { + transform: `${prefix} scale(1)`.trimStart(), + transformOrigin, + fillOpacity, + strokeOpacity, + opacity, + }, + ]; + const animation = shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options)); + return animation; + }; +}; +exports.ZoomIn = ZoomIn; +//# sourceMappingURL=zoomIn.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816074, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ZoomOut = void 0; +const ZoomOut = (options) => { + // Small enough to hide or show very small part of mark, + // but bigger enough to not cause bug. + const ZERO = 0.0001; + return (from, _, defaults) => { + const [shape] = from; + const { transform: prefix = '', fillOpacity = 1, strokeOpacity = 1, opacity = 1, } = shape.style; + const transformOrigin = 'center center'; + const keyframes = [ + { transform: `${prefix} scale(1)`.trimStart(), transformOrigin }, + { + transform: `${prefix} scale(${ZERO})`.trimStart(), + transformOrigin, + fillOpacity, + strokeOpacity, + opacity, + offset: 0.99, + }, + { + transform: `${prefix} scale(${ZERO})`.trimStart(), + transformOrigin, + fillOpacity: 0, + strokeOpacity: 0, + opacity: 0, + }, + ]; + const animation = shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options)); + return animation; + }; +}; +exports.ZoomOut = ZoomOut; +//# sourceMappingURL=zoomOut.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816075, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PathIn = void 0; +/** + * Transform mark from transparent to solid. + */ +const PathIn = (options) => { + return (from, _, defaults) => { + var _a, _b; + const [shape] = from; + const length = ((_b = (_a = shape).getTotalLength) === null || _b === void 0 ? void 0 : _b.call(_a)) || 0; + const keyframes = [ + { lineDash: [0, length] }, + { lineDash: [length, 0] }, + ]; + return shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options)); + }; +}; +exports.PathIn = PathIn; +exports.PathIn.props = {}; +//# sourceMappingURL=pathIn.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816076, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GrowInX = void 0; +const g_1 = require("@antv/g"); +const scaleInX_1 = require("./scaleInX"); +/** + * Scale mark from nothing to desired shape in x direction. + */ +const GrowInX = (options, context) => { + return (from, to, defaults) => { + const [shape] = from; + const { min: [x, y], halfExtents, } = shape.getLocalBounds(); + const width = halfExtents[0] * 2; + const height = halfExtents[1] * 2; + const clipPath = new g_1.Path({ + style: { + d: `M${x},${y}L${x + width},${y}L${x + width},${y + height}L${x},${y + height}Z`, + }, + }); + shape.appendChild(clipPath); + shape.style.clipPath = clipPath; + const animation = (0, scaleInX_1.ScaleInX)(options, context)([clipPath], to, defaults); + return animation; + }; +}; +exports.GrowInX = GrowInX; +exports.GrowInX.props = {}; +//# sourceMappingURL=growInX.js.map +}, function(modId) { var map = {"./scaleInX":1751263816064}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816077, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GrowInY = void 0; +const g_1 = require("@antv/g"); +const scaleInY_1 = require("./scaleInY"); +/** + * Scale mark from nothing to desired shape in x direction. + */ +const GrowInY = (options, context) => { + return (from, to, defaults) => { + const [shape] = from; + const { min: [x, y], halfExtents, } = shape.getLocalBounds(); + const width = halfExtents[0] * 2; + const height = halfExtents[1] * 2; + const clipPath = new g_1.Path({ + style: { + d: `M${x},${y}L${x + width},${y}L${x + width},${y + height}L${x},${y + height}Z`, + }, + }); + shape.appendChild(clipPath); + shape.style.clipPath = clipPath; + const animation = (0, scaleInY_1.ScaleInY)(options, context)([clipPath], to, defaults); + return animation; + }; +}; +exports.GrowInY = GrowInY; +exports.GrowInY.props = {}; +//# sourceMappingURL=growInY.js.map +}, function(modId) { var map = {"./scaleInY":1751263816066}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816078, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ElementPointMove = exports.TreemapDrillDown = exports.Event = exports.Poptip = exports.ScrollbarFilter = exports.SliderFilter = exports.BrushYFilter = exports.BrushXFilter = exports.BrushFilter = exports.BrushAxisHighlight = exports.BrushYHighlight = exports.BrushXHighlight = exports.BrushHighlight = exports.LegendHighlight = exports.LegendFilter = exports.Tooltip = exports.Fisheye = exports.ChartIndex = exports.ElementSelectByColor = exports.ElementSelectByX = exports.ElementSelect = exports.ElementHighlightByColor = exports.ElementHighlightByX = exports.ElementHighlight = void 0; +var elementHighlight_1 = require("./elementHighlight"); +Object.defineProperty(exports, "ElementHighlight", { enumerable: true, get: function () { return elementHighlight_1.ElementHighlight; } }); +var elementHighlightByX_1 = require("./elementHighlightByX"); +Object.defineProperty(exports, "ElementHighlightByX", { enumerable: true, get: function () { return elementHighlightByX_1.ElementHighlightByX; } }); +var elementHighlightByColor_1 = require("./elementHighlightByColor"); +Object.defineProperty(exports, "ElementHighlightByColor", { enumerable: true, get: function () { return elementHighlightByColor_1.ElementHighlightByColor; } }); +var elementSelect_1 = require("./elementSelect"); +Object.defineProperty(exports, "ElementSelect", { enumerable: true, get: function () { return elementSelect_1.ElementSelect; } }); +var elementSelectByX_1 = require("./elementSelectByX"); +Object.defineProperty(exports, "ElementSelectByX", { enumerable: true, get: function () { return elementSelectByX_1.ElementSelectByX; } }); +var elementSelectByColor_1 = require("./elementSelectByColor"); +Object.defineProperty(exports, "ElementSelectByColor", { enumerable: true, get: function () { return elementSelectByColor_1.ElementSelectByColor; } }); +var chartIndex_1 = require("./chartIndex"); +Object.defineProperty(exports, "ChartIndex", { enumerable: true, get: function () { return chartIndex_1.ChartIndex; } }); +var fisheye_1 = require("./fisheye"); +Object.defineProperty(exports, "Fisheye", { enumerable: true, get: function () { return fisheye_1.Fisheye; } }); +var tooltip_1 = require("./tooltip"); +Object.defineProperty(exports, "Tooltip", { enumerable: true, get: function () { return tooltip_1.Tooltip; } }); +var legendFilter_1 = require("./legendFilter"); +Object.defineProperty(exports, "LegendFilter", { enumerable: true, get: function () { return legendFilter_1.LegendFilter; } }); +var legendHighlight_1 = require("./legendHighlight"); +Object.defineProperty(exports, "LegendHighlight", { enumerable: true, get: function () { return legendHighlight_1.LegendHighlight; } }); +var brushHighlight_1 = require("./brushHighlight"); +Object.defineProperty(exports, "BrushHighlight", { enumerable: true, get: function () { return brushHighlight_1.BrushHighlight; } }); +var brushXHighlight_1 = require("./brushXHighlight"); +Object.defineProperty(exports, "BrushXHighlight", { enumerable: true, get: function () { return brushXHighlight_1.BrushXHighlight; } }); +var brushYHighlight_1 = require("./brushYHighlight"); +Object.defineProperty(exports, "BrushYHighlight", { enumerable: true, get: function () { return brushYHighlight_1.BrushYHighlight; } }); +var brushAxisHighlight_1 = require("./brushAxisHighlight"); +Object.defineProperty(exports, "BrushAxisHighlight", { enumerable: true, get: function () { return brushAxisHighlight_1.BrushAxisHighlight; } }); +var brushFilter_1 = require("./brushFilter"); +Object.defineProperty(exports, "BrushFilter", { enumerable: true, get: function () { return brushFilter_1.BrushFilter; } }); +var brushXFilter_1 = require("./brushXFilter"); +Object.defineProperty(exports, "BrushXFilter", { enumerable: true, get: function () { return brushXFilter_1.BrushXFilter; } }); +var brushYFilter_1 = require("./brushYFilter"); +Object.defineProperty(exports, "BrushYFilter", { enumerable: true, get: function () { return brushYFilter_1.BrushYFilter; } }); +var sliderFilter_1 = require("./sliderFilter"); +Object.defineProperty(exports, "SliderFilter", { enumerable: true, get: function () { return sliderFilter_1.SliderFilter; } }); +var scrollbarFilter_1 = require("./scrollbarFilter"); +Object.defineProperty(exports, "ScrollbarFilter", { enumerable: true, get: function () { return scrollbarFilter_1.ScrollbarFilter; } }); +var poptip_1 = require("./poptip"); +Object.defineProperty(exports, "Poptip", { enumerable: true, get: function () { return poptip_1.Poptip; } }); +var event_1 = require("./event"); +Object.defineProperty(exports, "Event", { enumerable: true, get: function () { return event_1.Event; } }); +var treemapDrillDown_1 = require("./treemapDrillDown"); +Object.defineProperty(exports, "TreemapDrillDown", { enumerable: true, get: function () { return treemapDrillDown_1.TreemapDrillDown; } }); +var elementPointMove_1 = require("./elementPointMove"); +Object.defineProperty(exports, "ElementPointMove", { enumerable: true, get: function () { return elementPointMove_1.ElementPointMove; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./elementHighlight":1751263816079,"./elementHighlightByX":1751263816124,"./elementHighlightByColor":1751263816125,"./elementSelect":1751263816126,"./elementSelectByX":1751263816127,"./elementSelectByColor":1751263816128,"./chartIndex":1751263816129,"./fisheye":1751263816130,"./tooltip":1751263816131,"./legendFilter":1751263816132,"./legendHighlight":1751263816133,"./brushHighlight":1751263816134,"./brushXHighlight":1751263816135,"./brushYHighlight":1751263816136,"./brushAxisHighlight":1751263816137,"./brushFilter":1751263816138,"./brushXFilter":1751263816139,"./brushYFilter":1751263816140,"./sliderFilter":1751263816141,"./scrollbarFilter":1751263816142,"./poptip":1751263816143,"./event":1751263816113,"./treemapDrillDown":1751263816144,"./elementPointMove":1751263816145}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816079, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ElementHighlight = exports.elementHighlight = void 0; +const util_1 = require("@antv/util"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const helper_1 = require("../utils/helper"); +const utils_1 = require("./utils"); +/** + * highlight a group of elements. + */ +function elementHighlight(root, { elements: elementsof, // given the root of chart returns elements to be manipulated +datum, // given each element returns the datum of it +groupKey: eleGroupKey = (d) => d, // group elements by specified key +regionGroupKey = (d) => d, // how to group elements when hover region +link = false, // draw link or not +background = false, // draw background or not +delay = 60, // delay to unhighlighted element +scale, coordinate, emitter, state = {}, region = false, regionEleFilter = (el) => utils_1.VALID_FIND_BY_X_MARKS.includes(el.markType), // some elements can not be highlighted by region, like shapes in pie. + }) { + var _a, _b; + const allElements = (_a = elementsof(root)) !== null && _a !== void 0 ? _a : []; + const elements = region ? allElements.filter(regionEleFilter) : allElements; + const elementSet = new Set(elements); + const groupKey = region ? regionGroupKey : eleGroupKey; + const keyGroup = (0, d3_array_1.group)(elements, groupKey); + const findElement = (0, utils_1.createFindElementByEvent)({ + elementsof, + root, + coordinate, + scale, + }); + const valueof = (0, utils_1.createValueof)(elements, datum); + const [appendLink, removeLink] = (0, utils_1.renderLink)(Object.assign({ elements, + valueof, + link, + coordinate }, (0, helper_1.subObject)(state.active, 'link'))); + const [appendBackground, removeBackground, isBackground] = (0, utils_1.renderBackground)(Object.assign({ document: root.ownerDocument, scale, + coordinate, + background, + valueof }, (0, helper_1.subObject)(state.active, 'background'))); + const elementStyle = (0, util_1.deepMix)(state, { + active: Object.assign({}, (((_b = state.active) === null || _b === void 0 ? void 0 : _b.offset) && { + //Apply translate to mock slice out. + transform: (...params) => { + const value = state.active.offset(...params); + const [, i] = params; + return (0, utils_1.offsetTransform)(elements[i], value, coordinate); + }, + })), + }); + const useState = (0, utils_1.createUseState)(elementStyle, elements); + const { updateState, removeState, hasState } = useState(valueof); + let out; // Timer for delaying unhighlighted. + const pointerover = (event) => { + const { nativeEvent = true } = event; + let element = event.target; + if (region) { + element = findElement(event); + } + if (!elementSet.has(element)) + return; + if (out) + clearTimeout(out); + const k = groupKey(element); + const group = keyGroup.get(k); + const groupSet = new Set(group); + for (const e of elements) { + if (groupSet.has(e)) { + if (!hasState(e, 'active')) + updateState(e, 'active'); + } + else { + updateState(e, 'inactive'); + removeLink(e); + } + if (e !== element) + removeBackground(e); + } + appendBackground(element); + appendLink(group); + // Emit events. + if (!nativeEvent) + return; + emitter.emit('element:highlight', { + nativeEvent, + data: { + data: datum(element), + group: group.map(datum), + }, + }); + }; + const delayUnhighlighted = () => { + if (out) + clearTimeout(out); + out = setTimeout(() => { + unhighlighted(); + out = null; + }, delay); + }; + const unhighlighted = (nativeEvent = true) => { + for (const e of elements) { + removeState(e, 'active', 'inactive'); + removeBackground(e); + removeLink(e); + } + if (nativeEvent) { + emitter.emit('element:unhighlight', { nativeEvent }); + } + }; + const pointerout = (event) => { + let element = event.target; + if (region) { + element = findElement(event); + } + if (!element) { + if (delay > 0) + delayUnhighlighted(); + else + unhighlighted(); + return; + } + if (background && !isBackground(element)) + return; + if (!background && !elementSet.has(element)) + return; + if (delay > 0) + delayUnhighlighted(); + else + unhighlighted(); + }; + const pointerleave = () => { + unhighlighted(); + }; + root.addEventListener('pointerover', pointerover); + root.addEventListener('pointermove', pointerover); + root.addEventListener('pointerout', pointerout); + root.addEventListener('pointerleave', pointerleave); + const onRest = (e) => { + const { nativeEvent } = e; + if (nativeEvent) + return; + unhighlighted(false); + }; + const onHighlight = (e) => { + const { nativeEvent } = e; + if (nativeEvent) + return; + const { data } = e.data; + const element = (0, utils_1.selectElementByData)(elements, data, datum); + if (!element) + return; + pointerover({ target: element, nativeEvent: false }); + }; + emitter.on('element:highlight', onHighlight); + emitter.on('element:unhighlight', onRest); + return () => { + root.removeEventListener('pointerover', pointerover); + root.removeEventListener('pointermove', pointerover); + root.removeEventListener('pointerout', pointerout); + root.removeEventListener('pointerleave', pointerleave); + emitter.off('element:highlight', onHighlight); + emitter.off('element:unhighlight', onRest); + for (const e of elements) { + removeBackground(e); + removeLink(e); + } + }; +} +exports.elementHighlight = elementHighlight; +function ElementHighlight(_a) { + var { delay, createGroup, createRegionGroup, background = false, link = false } = _a, rest = __rest(_a, ["delay", "createGroup", "createRegionGroup", "background", "link"]); + return (context, _, emitter) => { + const { container, view, options } = context; + const { scale, coordinate } = view; + const plotArea = (0, utils_1.selectPlotArea)(container); + return elementHighlight(plotArea, Object.assign({ elements: utils_1.selectG2Elements, datum: (0, utils_1.createDatumof)(view), groupKey: createGroup ? createGroup(view) : undefined, regionGroupKey: createRegionGroup + ? createRegionGroup(view) + : (0, utils_1.createXKey)(view), coordinate, + scale, state: (0, utils_1.mergeState)(options, [ + ['active', background ? {} : { lineWidth: '1', stroke: '#000' }], + 'inactive', + ]), background, + link, + delay, + emitter }, rest)); + }; +} +exports.ElementHighlight = ElementHighlight; +ElementHighlight.props = { + reapplyWhenUpdate: true, +}; +//# sourceMappingURL=elementHighlight.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"./utils":1751263816080}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816080, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createFindElementByEvent = exports.VALID_FIND_BY_X_MARKS = exports.maybeRoot = exports.getThetaPath = exports.getElements = exports.getPointsPath = exports.getPointsR = exports.selectElementByData = exports.restoreCursor = exports.setCursor = exports.renderBackground = exports.offsetTransform = exports.renderLink = exports.createValueof = exports.mergeState = exports.useState = exports.createUseState = exports.createDatumof = exports.createXKey = exports.createColorKey = exports.boundsOfBrushArea = exports.brushMousePosition = exports.mousePosition = exports.bboxOf = exports.selectPlotArea = exports.selectFacetViews = exports.selectFacetG2Elements = exports.selectG2Elements = void 0; +const g_1 = require("@antv/g"); +const d3_path_1 = require("@antv/vendor/d3-path"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const util_1 = require("@antv/util"); +const selection_1 = require("../utils/selection"); +const array_1 = require("../utils/array"); +const runtime_1 = require("../runtime"); +const scale_1 = require("../utils/scale"); +const color_1 = require("../shape/interval/color"); +const coordinate_1 = require("../utils/coordinate"); +const style_1 = require("../utils/style"); +const utils_1 = require("../shape/utils"); +const vector_1 = require("../utils/vector"); +const traverse_elements_1 = require("../utils/traverse-elements"); +/** + * Given root of chart returns elements to be manipulated + */ +function selectG2Elements(root) { + return (0, selection_1.select)(root) + .selectAll(`.${runtime_1.ELEMENT_CLASS_NAME}`) + .nodes() + .filter((d) => !d.__removed__); +} +exports.selectG2Elements = selectG2Elements; +function selectFacetG2Elements(target, viewInstances) { + return selectFacetViews(target, viewInstances).flatMap(({ container }) => selectG2Elements(container)); +} +exports.selectFacetG2Elements = selectFacetG2Elements; +function selectFacetViews(target, viewInstances) { + return viewInstances.filter((d) => d !== target && d.options.parentKey === target.options.key); +} +exports.selectFacetViews = selectFacetViews; +function selectPlotArea(root) { + return (0, selection_1.select)(root).select(`.${runtime_1.PLOT_CLASS_NAME}`).node(); +} +exports.selectPlotArea = selectPlotArea; +function bboxOf(element) { + // The geometry bounds of a group is empty, so return the render bounds. + if (element.tagName === 'g') + return element.getRenderBounds(); + // Compute the geometry bounds related to the parent. + const bounds = element.getGeometryBounds(); + const aabb = new g_1.AABB(); + aabb.setFromTransformedAABB(bounds, element.getWorldTransform()); + return aabb; +} +exports.bboxOf = bboxOf; +function mousePosition(target, event) { + const { offsetX, offsetY } = event; + const bbox = bboxOf(target); + const { min: [x, y], max: [x1, y1], } = bbox; + const isOutX = offsetX < x || offsetX > x1; + const isOutY = offsetY < y || offsetY > y1; + if (isOutX || isOutY) + return null; + return [offsetX - x, offsetY - y]; +} +exports.mousePosition = mousePosition; +/** + * @todo Pass bbox rather than calc it here. + */ +function brushMousePosition(target, event) { + const { offsetX, offsetY } = event; + const [x, y, x1, y1] = boundsOfBrushArea(target); + return [ + Math.min(x1, Math.max(x, offsetX)) - x, + Math.min(y1, Math.max(y, offsetY)) - y, + ]; +} +exports.brushMousePosition = brushMousePosition; +function boundsOfBrushArea(target) { + // Calc bbox after clipping. + const bbox = target.getRenderBounds(); + const { min: [x0, y0], max: [x1, y1], } = bbox; + return [x0, y0, x1, y1]; +} +exports.boundsOfBrushArea = boundsOfBrushArea; +function createColorKey(view) { + return (element) => element.__data__.color; +} +exports.createColorKey = createColorKey; +function createXKey(view) { + return (element) => element.__data__.x; +} +exports.createXKey = createXKey; +function createDatumof(view) { + const views = Array.isArray(view) ? view : [view]; + const keyData = new Map(views.flatMap((view) => { + const marks = Array.from(view.markState.keys()); + return marks.map((mark) => [keyed(view.key, mark.key), mark.data]); + })); + return (element) => { + const { index, markKey, viewKey } = element.__data__; + const data = keyData.get(keyed(viewKey, markKey)); + return data[index]; + }; +} +exports.createDatumof = createDatumof; +/** + * A state manager for G2Element. + * The keys for each state's style start with the state name. + * { selectedFill, selectedStroke } is for selected state. + * { unselectedFill, unselectedStroke } is for unselected state. + */ +/** + * Define state priorities, higher number means higher priority. + */ +const STATE_PRIORITIES = { + selected: 3, + unselected: 3, + active: 2, + inactive: 2, + default: 1, +}; +/** + * Define state groups, states in the same group are mutually exclusive. + */ +const STATE_GROUPS = { + selection: ['selected', 'unselected'], + highlight: ['active', 'inactive'], +}; +const setElementAttribute = (element, k, v) => { + (0, traverse_elements_1.traverseElements)(element, (el) => { + if ('setAttribute' in el && typeof el.setAttribute === 'function') { + el.setAttribute(k, v); + } + }); +}; +function createUseState(style, elements) { + // Apply interaction style to all elements. + elements.forEach((element) => { + // @ts-ignore + const currentStyle = element.__interactionStyle__; + if (currentStyle) { + // @ts-ignore + element.__interactionStyle__ = Object.assign(Object.assign({}, currentStyle), style); + } + else { + // @ts-ignore + element.__interactionStyle__ = style; + } + }); + return (valueof = (d, element) => d, setAttribute = setElementAttribute) => useState(undefined, valueof, setAttribute); +} +exports.createUseState = createUseState; +function useState(style, valueof = (d, element) => d, setAttribute = setElementAttribute) { + const STATES = '__states__'; + const ORIGINAL = '__ordinal__'; + // Get state priority. + const getStatePriority = (stateName) => STATE_PRIORITIES[stateName] || STATE_PRIORITIES.default; + // Get the group that a state belongs to. + const getStateGroup = (stateName) => { + var _a; + return (_a = Object.entries(STATE_GROUPS).find(([_, states]) => states.includes(stateName))) === null || _a === void 0 ? void 0 : _a[0]; + }; + // Mix style for each state and apply it to element. + const applyState = (element) => { + var _a; + const { [STATES]: states = [], [ORIGINAL]: original = {} } = element; + // Sort states by priority. + const sortedStates = [...states].sort((a, b) => getStatePriority(b) - getStatePriority(a)); + // Create a Map to track the highest priority state for each style attribute. + const styleAttributeMap = new Map(); + // Iterate through all states to find the highest priority state for each style attribute. + for (const state of sortedStates) { + // If style exists, use it directly, else use interaction style on element. + const stateStyles = ((_a = (style !== null && style !== void 0 ? style : element.__interactionStyle__)) === null || _a === void 0 ? void 0 : _a[state]) || {}; + for (const [key, value] of Object.entries(stateStyles)) { + if (!styleAttributeMap.has(key)) { + styleAttributeMap.set(key, value); + } + } + } + // Apply styles including original styles. + const finalStyle = Object.assign({}, original); + for (const [key, value] of styleAttributeMap.entries()) { + finalStyle[key] = value; + } + if (Object.keys(finalStyle).length === 0) + return; + // Apply final styles to the element. + for (const [key, value] of Object.entries(finalStyle)) { + const currentValue = (0, style_1.getStyle)(element, key); + const v = valueof(value, element); + setAttribute(element, key, v); + // Store the attribute if it does not exist in original. + if (!(key in original)) + original[key] = currentValue; + } + element[ORIGINAL] = original; + }; + const initState = (element) => { + if (element[STATES]) + return; + element[STATES] = []; + return; + }; + /** + * Update states and update element, handle conflict states automatically. + */ + const updateState = (element, ...states) => { + initState(element); + const currentStates = element[STATES]; + // Collect all new state groups. + const newStateGroups = new Set(states + .map((state) => getStateGroup(state)) + .filter((group) => group !== undefined)); + // Exclude old states that are in the new state group. + const remainingStates = currentStates.filter((existingState) => !newStateGroups.has(getStateGroup(existingState))); + element[STATES] = [...remainingStates, ...states]; + applyState(element); + }; + /** + * Set the states and update element. + */ + const setState = (element, ...states) => { + initState(element); + element[STATES] = [...states]; + applyState(element); + }; + /** + * Remove the states and update element. + */ + const removeState = (element, ...states) => { + initState(element); + for (const state of states) { + const index = element[STATES].indexOf(state); + if (index !== -1) { + element[STATES].splice(index, 1); + } + } + applyState(element); + }; + const hasState = (element, state) => { + initState(element); + return element[STATES].indexOf(state) !== -1; + }; + return { + setState, + updateState, + removeState, + hasState, + }; +} +exports.useState = useState; +function isEmptyObject(obj) { + if (obj === undefined) + return true; + if (typeof obj !== 'object') + return false; + return Object.keys(obj).length === 0; +} +// A function to generate key for mark each view. +function keyed(viewKey, markKey) { + return `${viewKey},${markKey}`; +} +function mergeState(options, states) { + // Index state by mark key and view key. + const views = Array.isArray(options) ? options : [options]; + const markState = views.flatMap((view) => view.marks.map((mark) => [keyed(view.key, mark.key), mark.state])); + const state = {}; + // Update each specified state. + for (const descriptor of states) { + const [key, defaults] = Array.isArray(descriptor) + ? descriptor + : [descriptor, {}]; + // Update each specified mark state. + state[key] = markState.reduce((merged, mark) => { + // Normalize state. + const [markKey, markState = {}] = mark; + const selectedState = isEmptyObject(markState[key]) + ? defaults + : markState[key]; + // Update each state attribute. + for (const [attr, value] of Object.entries(selectedState)) { + const oldValue = merged[attr]; + const newValue = (data, index, array, element) => { + const k = keyed(element.__data__.viewKey, element.__data__.markKey); + if (markKey !== k) + return oldValue === null || oldValue === void 0 ? void 0 : oldValue(data, index, array, element); + if (typeof value !== 'function') + return value; + return value(data, index, array, element); + }; + merged[attr] = newValue; + } + return merged; + }, {}); + } + return state; +} +exports.mergeState = mergeState; +// @todo Support elements from different view. +function createValueof(elements, datum) { + const elementIndex = new Map(elements.map((d, i) => [d, i])); + const fa = datum ? elements.map(datum) : elements; + return (d, e) => { + if (typeof d !== 'function') + return d; + const i = elementIndex.get(e); + const fe = datum ? datum(e) : e; + return d(fe, i, fa, e); + }; +} +exports.createValueof = createValueof; +function renderLink(_a) { + var { link = false, valueof = (d, element) => d, coordinate } = _a, style = __rest(_a, ["link", "valueof", "coordinate"]); + const LINK_CLASS_NAME = 'element-link'; + if (!link) + return [() => { }, () => { }]; + const pointsOf = (element) => element.__data__.points; + const pathPointsOf = (P0, P1) => { + const [, p1, p2] = P0; + const [p0, , , p3] = P1; + const P = [p1, p0, p3, p2]; + return P; + }; + const append = (elements) => { + var _a; + if (elements.length <= 1) + return; + // Sort elements by normalized x to avoid cross. + const sortedElements = (0, d3_array_1.sort)(elements, (e0, e1) => { + const { x: x0 } = e0.__data__; + const { x: x1 } = e1.__data__; + const dx = x0 - x1; + return dx; + }); + for (let i = 1; i < sortedElements.length; i++) { + const p = (0, d3_path_1.path)(); + const e0 = sortedElements[i - 1]; + const e1 = sortedElements[i]; + const [p0, p1, p2, p3] = pathPointsOf(pointsOf(e0), pointsOf(e1)); + p.moveTo(...p0); + p.lineTo(...p1); + p.lineTo(...p2); + p.lineTo(...p3); + p.closePath(); + const _b = (0, array_1.mapObject)(style, (d) => valueof(d, e0)), { fill = e0.getAttribute('fill') } = _b, rest = __rest(_b, ["fill"]); + const link = new g_1.Path({ + className: LINK_CLASS_NAME, + style: Object.assign({ d: p.toString(), fill, zIndex: -2 }, rest), + }); + // @ts-ignore + (_a = e0.link) === null || _a === void 0 ? void 0 : _a.remove(); + e0.parentNode.appendChild(link); + // @ts-ignore + e0.link = link; + } + }; + const remove = (element) => { + var _a; + (_a = element.link) === null || _a === void 0 ? void 0 : _a.remove(); + element.link = null; + }; + return [append, remove]; +} +exports.renderLink = renderLink; +// Apply translate to mock slice out. +function offsetTransform(element, offset, coordinate) { + const append = (t) => { + const { transform } = element.style; + return transform ? `${transform} ${t}` : t; + }; + if ((0, coordinate_1.isPolar)(coordinate)) { + const { points } = element.__data__; + const [p0, p1] = (0, coordinate_1.isTranspose)(coordinate) ? (0, utils_1.reorder)(points) : points; + const center = coordinate.getCenter(); + const v0 = (0, vector_1.sub)(p0, center); + const v1 = (0, vector_1.sub)(p1, center); + const a0 = (0, vector_1.angle)(v0); + const da = (0, vector_1.angleBetween)(v0, v1); + const amid = a0 + da / 2; + const dx = offset * Math.cos(amid); + const dy = offset * Math.sin(amid); + return append(`translate(${dx}, ${dy})`); + } + if ((0, coordinate_1.isTranspose)(coordinate)) + return append(`translate(${offset}, 0)`); + return append(`translate(0, ${-offset})`); +} +exports.offsetTransform = offsetTransform; +function renderBackground(_a) { + var { document, background, scale, coordinate, valueof } = _a, rest = __rest(_a, ["document", "background", "scale", "coordinate", "valueof"]); + const BACKGROUND_CLASS_NAME = 'element-background'; + // Don't have background. + if (!background) + return [() => { }, () => { }]; + const extentOf = (scale, x, padding) => { + const ax = scale.invert(x); + const mid = x + scale.getBandWidth(ax) / 2; + const half = scale.getStep(ax) / 2; + const offset = half * padding; + return [mid - half + offset, mid + half - offset]; + }; + const sizeXOf = (element, padding) => { + const { x: scaleX } = scale; + if (!(0, scale_1.isOrdinalScale)(scaleX)) + return [0, 1]; + const { __data__: data } = element; + const { x } = data; + const [e1, e2] = extentOf(scaleX, x, padding); + return [e1, e2]; + }; + const sizeYOf = (element, padding) => { + const { y: scaleY } = scale; + if (!(0, scale_1.isOrdinalScale)(scaleY)) + return [0, 1]; + const { __data__: data } = element; + const { y } = data; + const [e1, e2] = extentOf(scaleY, y, padding); + return [e1, e2]; + }; + const bandShapeOf = (element, style) => { + const { padding } = style; + const [x1, x2] = sizeXOf(element, padding); + const [y1, y2] = sizeYOf(element, padding); + const points = [ + [x1, y1], + [x2, y1], + [x2, y2], + [x1, y2], + ].map((d) => coordinate.map(d)); + const { __data__: data } = element; + const { y: dy, y1: dy1 } = data; + return (0, color_1.rect)(document, points, { y: dy, y1: dy1 }, coordinate, style); + }; + // Shape without ordinal style. + // Clone and scale it. + const cloneShapeOf = (element, style) => { + const { transform = 'scale(1.2, 1.2)', transformOrigin = 'center center', stroke = '' } = style, rest = __rest(style, ["transform", "transformOrigin", "stroke"]); + const finalStyle = Object.assign({ transform, transformOrigin, stroke }, rest); + const shape = element.cloneNode(true); + for (const [key, value] of Object.entries(finalStyle)) { + shape.style[key] = value; + } + return shape; + }; + const isOrdinalShape = () => { + const { x, y } = scale; + return [x, y].some(scale_1.isOrdinalScale); + }; + const append = (element) => { + if (element.background) + element.background.remove(); + const _a = (0, array_1.mapObject)(rest, (d) => valueof(d, element)), { fill = '#CCD6EC', fillOpacity = 0.3, zIndex = -2, padding = 0.001, lineWidth = 0 } = _a, style = __rest(_a, ["fill", "fillOpacity", "zIndex", "padding", "lineWidth"]); + const finalStyle = Object.assign(Object.assign({}, style), { fill, + fillOpacity, + zIndex, + padding, + lineWidth }); + const shapeOf = isOrdinalShape() ? bandShapeOf : cloneShapeOf; + const shape = shapeOf(element, finalStyle); + shape.className = BACKGROUND_CLASS_NAME; + element.parentNode.parentNode.appendChild(shape); + element.background = shape; + }; + const remove = (element) => { + var _a; + (_a = element.background) === null || _a === void 0 ? void 0 : _a.remove(); + element.background = null; + }; + const is = (element) => { + return element.className === BACKGROUND_CLASS_NAME; + }; + return [append, remove, is]; +} +exports.renderBackground = renderBackground; +function setCursor(root, cursor) { + // @ts-ignore + const canvas = root.getRootNode().defaultView; + const dom = canvas.getContextService().getDomElement(); + if (dom === null || dom === void 0 ? void 0 : dom.style) { + root.cursor = dom.style.cursor; + dom.style.cursor = cursor; + } +} +exports.setCursor = setCursor; +function restoreCursor(root) { + setCursor(root, root.cursor); +} +exports.restoreCursor = restoreCursor; +function selectElementByData(elements, data, datum) { + return elements.find((d) => Object.entries(data).every(([key, value]) => datum(d)[key] === value)); +} +exports.selectElementByData = selectElementByData; +function getPointsR(point, nextPoint) { + return Math.sqrt(Math.pow(point[0] - nextPoint[0], 2) + Math.pow(point[1] - nextPoint[1], 2)); +} +exports.getPointsR = getPointsR; +// Points create path. +function getPointsPath(points, isClose = false) { + const path = (0, util_1.filter)(points, (d) => !!d).map((d, i) => { + return [i === 0 ? 'M' : 'L', ...d]; + }); + if (isClose) { + path.push(['Z']); + } + return path; +} +exports.getPointsPath = getPointsPath; +// Get element. +function getElements(plot) { + return plot.querySelectorAll('.element'); +} +exports.getElements = getElements; +// Get Theta coordinate round path. +function getThetaPath(center, points, isBig = 0) { + const path = [['M', ...points[1]]]; + const innerRadius = getPointsR(center, points[1]); + const outerRadius = getPointsR(center, points[0]); + if (innerRadius === 0) { + path.push(['L', ...points[3]], ['A', outerRadius, outerRadius, 0, isBig, 1, ...points[0]], ['Z']); + } + else { + path.push(['A', innerRadius, innerRadius, 0, isBig, 0, ...points[2]], ['L', ...points[3]], ['A', outerRadius, outerRadius, 0, isBig, 1, ...points[0]], ['Z']); + } + return path; +} +exports.getThetaPath = getThetaPath; +function maybeRoot(node, rootOf) { + if (rootOf(node)) + return node; + let root = node.parent; + while (root && !rootOf(root)) + root = root.parent; + return root; +} +exports.maybeRoot = maybeRoot; +exports.VALID_FIND_BY_X_MARKS = ['interval', 'point', 'density']; +/** + * @description Create function that can find element by event. + * @returns Element find function. + */ +function createFindElementByEvent({ elementsof, root, coordinate, scale, validFindByXMarks = exports.VALID_FIND_BY_X_MARKS, }) { + var _a, _b; + let elements = elementsof(root); + const getValidFindByXMarks = (d) => validFindByXMarks.includes(d.markType); + const hasValidFindByXMarks = elements.find(getValidFindByXMarks); + // Try to find element by x position. + if (hasValidFindByXMarks) { + elements = elements.filter(getValidFindByXMarks); + const scaleX = scale.x; + const scaleSeries = scale.series; + const bandWidth = (_b = (_a = scaleX === null || scaleX === void 0 ? void 0 : scaleX.getBandWidth) === null || _a === void 0 ? void 0 : _a.call(scaleX)) !== null && _b !== void 0 ? _b : 0; + const xof = scaleSeries + ? (d) => { + const seriesCount = Math.round(1 / scaleSeries.valueBandWidth); + return (d.__data__.x + + d.__data__.series * bandWidth + + bandWidth / (seriesCount * 2)); + } + : (d) => d.__data__.x + bandWidth / 2; + // Sort for bisector search. + elements.sort((a, b) => xof(a) - xof(b)); + return (event) => { + const mouse = mousePosition(root, event); + if (!mouse) + return; + const [abstractX] = coordinate.invert(mouse); + const search = (0, d3_array_1.bisector)(xof).center; + const i = search(elements, abstractX); + const target = elements[i]; + return target; + }; + } + // If there is no valid element find by x, just return the target element. + return (event) => { + const { target } = event; + return maybeRoot(target, (node) => { + if (!node.classList) + return false; + return node.classList.includes('element'); + }); + }; +} +exports.createFindElementByEvent = createFindElementByEvent; +//# sourceMappingURL=utils.js.map +}, function(modId) { var map = {"../utils/selection":1751263815883,"../utils/array":1751263815830,"../runtime":1751263816081,"../utils/scale":1751263816057,"../shape/interval/color":1751263815881,"../utils/coordinate":1751263815882,"../utils/style":1751263816122,"../shape/utils":1751263815885,"../utils/vector":1751263815873,"../utils/traverse-elements":1751263816123}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816081, function(require, module, exports) { + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.destroy = exports.renderToMountedElement = exports.render = void 0; +__exportStar(require("./constant"), exports); +__exportStar(require("./types/common"), exports); +__exportStar(require("./types/component"), exports); +__exportStar(require("./types/options"), exports); +__exportStar(require("./types/transform"), exports); +__exportStar(require("./types/encode"), exports); +__exportStar(require("./types/mark"), exports); +__exportStar(require("./types/data"), exports); +var render_1 = require("./render"); +Object.defineProperty(exports, "render", { enumerable: true, get: function () { return render_1.render; } }); +Object.defineProperty(exports, "renderToMountedElement", { enumerable: true, get: function () { return render_1.renderToMountedElement; } }); +Object.defineProperty(exports, "destroy", { enumerable: true, get: function () { return render_1.destroy; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./constant":1751263816082,"./types/common":1751263816083,"./types/component":1751263816084,"./types/options":1751263816085,"./types/transform":1751263816086,"./types/encode":1751263816087,"./types/mark":1751263816088,"./types/data":1751263816089,"./render":1751263816090}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816082, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MASK_CLASS_NAME = exports.AREA_CLASS_NAME = exports.LABEL_CLASS_NAME = exports.COMPONENT_CLASS_NAME = exports.PLOT_CLASS_NAME = exports.VIEW_CLASS_NAME = exports.ELEMENT_CLASS_NAME = exports.LABEL_LAYER_CLASS_NAME = exports.MAIN_LAYER_CLASS_NAME = void 0; +exports.MAIN_LAYER_CLASS_NAME = 'main-layer'; +exports.LABEL_LAYER_CLASS_NAME = 'label-layer'; +exports.ELEMENT_CLASS_NAME = 'element'; +exports.VIEW_CLASS_NAME = 'view'; +exports.PLOT_CLASS_NAME = 'plot'; +exports.COMPONENT_CLASS_NAME = 'component'; +exports.LABEL_CLASS_NAME = 'label'; +exports.AREA_CLASS_NAME = 'area'; +exports.MASK_CLASS_NAME = 'mask'; +//# sourceMappingURL=constant.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816083, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=common.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816084, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=component.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816085, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=options.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816086, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=transform.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816087, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=encode.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816088, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=mark.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816089, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816090, function(require, module, exports) { + +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.destroy = exports.renderToMountedElement = exports.render = void 0; +const g_1 = require("@antv/g"); +const g_canvas_1 = require("@antv/g-canvas"); +const g_plugin_dragndrop_1 = require("@antv/g-plugin-dragndrop"); +const util_1 = require("@antv/util"); +const event_emitter_1 = __importDefault(require("@antv/event-emitter")); +const selection_1 = require("../utils/selection"); +const event_1 = require("../utils/event"); +const helper_1 = require("../utils/helper"); +const expr_1 = require("../utils/expr"); +const plot_1 = require("./plot"); +const constant_1 = require("./constant"); +const option_preprocess_1 = require("./option-preprocess"); +/** + * Infer key for each node of view tree. + * Each key should be unique in the entire view tree. + * The key is for incremental render when view tree is changed. + * @todo Fix custom key equals to inferred key. + */ +function inferKeys(options) { + const root = (0, util_1.deepMix)({}, options); + const nodeParent = new Map([[root, null]]); + const nodeIndex = new Map([[null, -1]]); + const discovered = [root]; + while (discovered.length) { + const node = discovered.shift(); + // If key of node is not specified, using parentKey and the index for it + // in parent.children as its key. + // e.g. The key of node named 'a' will be 'a', and the key of node named + // 'b' will be 'parent-1' in the following view tree specification. + // { key: 'parent', children: [{ name: 'a', key: 'a' }, { name: 'b' }] } + if (node.key === undefined) { + const parent = nodeParent.get(node); + const index = nodeIndex.get(node); + const key = parent === null ? `${0}` : `${parent.key}-${index}`; + node.key = key; + } + const { children = [] } = node; + if (Array.isArray(children)) { + for (let i = 0; i < children.length; i++) { + // Clone node as well. + const child = (0, util_1.deepMix)({}, children[i]); + children[i] = child; + nodeParent.set(child, node); + nodeIndex.set(child, i); + discovered.push(child); + } + } + } + return root; +} +function Canvas(width, height) { + const renderer = new g_canvas_1.Renderer(); + // DragAndDropPlugin is for interaction. + renderer.registerPlugin(new g_plugin_dragndrop_1.Plugin()); + return new g_1.Canvas({ + width, + height, + container: document.createElement('div'), + renderer: renderer, + }); +} +function render(options, context = {}, resolve = () => { }, reject = (e) => { + throw e; +}) { + const afterParsedOptions = (0, expr_1.parseOptionsExpr)(options); + // Initialize the context if it is not provided. + const { width = 640, height = 480, depth = 0 } = afterParsedOptions; + // Preprocessing here, such as syntactic sugar. + const preprocessedOption = (0, option_preprocess_1.preprocessOption)(afterParsedOptions); + const keyed = inferKeys(preprocessedOption); + const { canvas = Canvas(width, height), emitter = new event_emitter_1.default(), library, } = context; + context.canvas = canvas; + context.emitter = emitter; + const { width: prevWidth, height: prevHeight } = canvas.getConfig(); + if (prevWidth !== width || prevHeight !== height) { + canvas.resize(width, height); + } + emitter.emit(event_1.ChartEvent.BEFORE_RENDER); + // Plot the chart and mutate context. + // Make sure that plot chart after container is ready for every time. + const selection = (0, selection_1.select)(canvas.document.documentElement); + canvas.ready + .then(() => (0, plot_1.plot)(Object.assign(Object.assign({}, keyed), { width, height, depth }), selection, context)) + .then(() => { + // Place the center of whole scene at z axis' origin. + if (depth) { + const [x, y] = canvas.document.documentElement.getPosition(); + // Since `render` method can be called for multiple times, use setPosition instead of translate here. + canvas.document.documentElement.setPosition(x, y, -depth / 2); + } + // Wait for the next tick. + // FIXME: Use `rendered?` event instead of `requestAnimationFrame`. + canvas.requestAnimationFrame(() => { + canvas.requestAnimationFrame(() => { + emitter.emit(event_1.ChartEvent.AFTER_RENDER); + resolve === null || resolve === void 0 ? void 0 : resolve(); + }); + }); + }) + .catch((e) => { + reject === null || reject === void 0 ? void 0 : reject(e); + }); + // Return the container HTML element wraps the canvas or svg element. + return normalizeContainer(canvas.getConfig().container); +} +exports.render = render; +function renderToMountedElement(options, context = {}, resolve = () => { }, reject = (e) => { + throw e; +}) { + var _a; + // Initialize the context if it is not provided. + const { width = 640, height = 480 } = options; + const keyed = inferKeys(options); + const { group = new g_1.Group(), emitter = new event_emitter_1.default(), library, } = context; + if (!(group === null || group === void 0 ? void 0 : group.parentElement)) { + (0, helper_1.error)(`renderToMountedElement can't render chart to unmounted group.`); + } + const selection = (0, selection_1.select)(group); + context.group = group; + context.emitter = emitter; + context.canvas = + context.canvas || ((_a = group === null || group === void 0 ? void 0 : group.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView); + emitter.emit(event_1.ChartEvent.BEFORE_RENDER); + // Plot the chart and mutate context. + // Make sure that plot chart after container is ready for every time. + (0, plot_1.plot)(Object.assign(Object.assign({}, keyed), { width, height }), selection, context) + .then(() => { + var _a; + (_a = context.canvas) === null || _a === void 0 ? void 0 : _a.requestAnimationFrame(() => { + emitter.emit(event_1.ChartEvent.AFTER_RENDER); + resolve === null || resolve === void 0 ? void 0 : resolve(); + }); + }) + .catch((e) => { + reject === null || reject === void 0 ? void 0 : reject(e); + }); + // Return the Group wraps the canvas or svg element. + return group; +} +exports.renderToMountedElement = renderToMountedElement; +function destroy(options, context = {}, isDestroyCanvas = false) { + const { canvas, emitter } = context; + if (canvas) { + destroyAllInteractions(canvas); + isDestroyCanvas ? canvas.destroy() : canvas.destroyChildren(); + } + emitter.off(); +} +exports.destroy = destroy; +/** + * Destroy all interactions mounted on the canvas. + */ +function destroyAllInteractions(canvas) { + const viewGroups = canvas.getRoot().querySelectorAll(`.${constant_1.VIEW_CLASS_NAME}`); + viewGroups === null || viewGroups === void 0 ? void 0 : viewGroups.forEach((group) => { + const { nameInteraction = new Map() } = group; + if ((nameInteraction === null || nameInteraction === void 0 ? void 0 : nameInteraction.size) > 0) { + Array.from(nameInteraction === null || nameInteraction === void 0 ? void 0 : nameInteraction.values()).forEach((value) => { + value === null || value === void 0 ? void 0 : value.destroy(); + }); + } + }); +} +function normalizeContainer(container) { + return typeof container === 'string' + ? document.getElementById(container) + : container; +} +//# sourceMappingURL=render.js.map +}, function(modId) { var map = {"../utils/selection":1751263815883,"../utils/event":1751263816091,"../utils/helper":1751263815829,"../utils/expr":1751263816092,"./plot":1751263816093,"./constant":1751263816082,"./option-preprocess":1751263816119}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816091, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ChartEvent = void 0; +// to prevent users from tampering with internal values. +exports.ChartEvent = { + BEFORE_RENDER: 'beforerender', + AFTER_RENDER: 'afterrender', + BEFORE_PAINT: 'beforepaint', + AFTER_PAINT: 'afterpaint', + BEFORE_CHANGE_DATA: 'beforechangedata', + AFTER_CHANGE_DATA: 'afterchangedata', + BEFORE_CLEAR: 'beforeclear', + AFTER_CLEAR: 'afterclear', + BEFORE_DESTROY: 'beforedestroy', + AFTER_DESTROY: 'afterdestroy', + BEFORE_CHANGE_SIZE: 'beforechangesize', + AFTER_CHANGE_SIZE: 'afterchangesize', + POINTER_TAP: 'pointertap', + POINTER_DOWN: 'pointerdown', + POINTER_UP: 'pointerup', + POINTER_OVER: 'pointerover', + POINTER_OUT: 'pointerout', + POINTER_MOVE: 'pointermove', + POINTER_ENTER: 'pointerenter', + POINTER_LEAVE: 'pointerleave', + POINTER_UPOUTSIDE: 'pointerupoutside', + DRAG_START: 'dragstart', + DRAG: 'drag', + DRAG_END: 'dragend', + DRAG_ENTER: 'dragenter', + DRAG_LEAVE: 'dragleave', + DRAG_OVER: 'dragover', + DROP: 'DROP', + CLICK: 'click', + DBLCLICK: 'dblclick', +}; +//# sourceMappingURL=event.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816092, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseOptionsExpr = exports.EXPR_WHITE_LIST = void 0; +const expr_1 = require("@antv/expr"); +const util_1 = require("@antv/util"); +const lru_1 = require("./lru"); +// Whitelist of properties that can contain expressions. +exports.EXPR_WHITE_LIST = ['style', 'encode', 'labels', 'children']; +/** + * Compiles an expression string into a function. + * @param expr Expression string to compile. + * @returns Compiled function or original string if empty. + */ +const compileExpression = (0, lru_1.lru)((expr) => { + const evaluator = (0, expr_1.compile)(expr); + return (...args) => { + const paramNames = Array.from({ length: args.length }, (_, i) => String.fromCharCode(97 + i)); + const namedParams = Object.fromEntries(args.map((value, index) => [paramNames[index], value])); + // global is used to overview what can i get in props. + return evaluator(Object.assign(Object.assign({}, namedParams), { global: Object.assign({}, namedParams) })); + }; +}, (expr) => expr, 128); +/** + * Processes options object to convert expressions to functions. + * @param options Options object to process. + * @param isSpecRoot Whether the options is the root of the spec. + * @returns Processed options object with expressions converted to functions. + */ +function parseOptionsExpr(options, isSpecRoot = true) { + if (Array.isArray(options)) { + return options.map((_, i) => parseOptionsExpr(options[i], isSpecRoot)); + } + if (typeof options === 'object' && options) { + return (0, util_1.mapValues)(options, (value, key) => { + // if options is root and the key is in the white list, parse the expression. + if (isSpecRoot && exports.EXPR_WHITE_LIST.includes(key)) { + return parseOptionsExpr(value, key === 'children'); + } + if (!isSpecRoot) { + return parseOptionsExpr(value, false); + } + return value; + }); + } + // if options is a string and is a valid expression. + if (typeof options === 'string') { + const trimmed = options.trim(); + if (trimmed.startsWith('{') && trimmed.endsWith('}')) { + return compileExpression(trimmed.slice(1, -1)); + } + } + return options; +} +exports.parseOptionsExpr = parseOptionsExpr; +//# sourceMappingURL=expr.js.map +}, function(modId) { var map = {"./lru":1751263815967}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816093, function(require, module, exports) { + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.applyStyle = exports.plot = void 0; +const g_1 = require("@antv/g"); +const util_1 = require("@antv/util"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const d3_format_1 = require("@antv/vendor/d3-format"); +const array_1 = require("../utils/array"); +const event_1 = require("../utils/event"); +const helper_1 = require("../utils/helper"); +const selection_1 = require("../utils/selection"); +const component_1 = require("./component"); +const constant_1 = require("./constant"); +const coordinate_1 = require("./coordinate"); +const layout_1 = require("./layout"); +const library_1 = require("./library"); +const mark_1 = require("./mark"); +const scale_1 = require("./scale"); +const transform_1 = require("./transform"); +function plot(options, selection, context) { + var _a; + return __awaiter(this, void 0, void 0, function* () { + const { library } = context; + const [useComposition] = (0, library_1.useLibrary)('composition', library); + const [useInteraction] = (0, library_1.useLibrary)('interaction', library); + // Some helper functions. + const marks = new Set(Object.keys(library) + .map((d) => { var _a; return (_a = /mark\.(.*)/.exec(d)) === null || _a === void 0 ? void 0 : _a[1]; }) + .filter(helper_1.defined)); + const staticMarks = new Set(Object.keys(library) + .map((d) => { var _a; return (_a = /component\.(.*)/.exec(d)) === null || _a === void 0 ? void 0 : _a[1]; }) + .filter(helper_1.defined)); + const typeOf = (node) => { + const { type } = node; + if (typeof type === 'function') { + // @ts-ignore + const { props = {} } = type; + const { composite = true } = props; + if (composite) + return 'mark'; + } + if (typeof type !== 'string') + return type; + if (marks.has(type) || staticMarks.has(type)) + return 'mark'; + return type; + }; + const isMark = (node) => typeOf(node) === 'mark'; + const isStandardView = (node) => typeOf(node) === 'standardView'; + const isStaticMark = (node) => { + const { type } = node; + if (typeof type !== 'string') + return false; + if (staticMarks.has(type)) + return true; + return false; + }; + const transform = (node) => { + if (isStandardView(node)) + return [node]; + const type = typeOf(node); + const composition = useComposition({ type, static: isStaticMark(node) }); + return composition(node); + }; + // Some temporary variables help parse the view tree. + const views = []; + const viewNode = new Map(); + const nodeState = new Map(); + const discovered = [options]; + const nodeGenerators = []; + while (discovered.length) { + const node = discovered.shift(); + if (isStandardView(node)) { + // Initialize view to get data to be visualized. If the marks + // of the view have already been initialized (facet view), + // initialize the view based on the initialized mark states, + // otherwise initialize it from beginning. + const state = nodeState.get(node); + const [view, children] = state + ? initializeState(state, node, library) + : yield initializeView(node, context); + viewNode.set(view, node); + views.push(view); + // Transform children, they will be transformed into + // standardView if they are mark or view node. + const transformedNodes = children + .flatMap(transform) + .map((d) => (0, coordinate_1.coordinate2Transform)(d, library)); + discovered.push(...transformedNodes); + // Only StandardView can be treated as facet and it + // should sync position scales among facets normally. + if (transformedNodes.every(isStandardView)) { + const states = yield Promise.all(transformedNodes.map((d) => initializeMarks(d, context))); + // Note!!! + // This will mutate scales for marks. + (0, scale_1.syncFacetsScales)(states); + for (let i = 0; i < transformedNodes.length; i++) { + const nodeT = transformedNodes[i]; + const state = states[i]; + nodeState.set(nodeT, state); + } + } + } + else { + // Apply transform to get data in advance for non-mark composition + // node, which makes sure that composition node can preprocess the + // data to produce more nodes based on it. + const n = isMark(node) ? node : yield applyTransform(node, context); + const N = transform(n); + if (Array.isArray(N)) + discovered.push(...N); + else if (typeof N === 'function') + nodeGenerators.push(N()); + } + } + context.emitter.emit(event_1.ChartEvent.BEFORE_PAINT); + // Plot chart. + const enterContainer = new Map(); + const updateContainer = new Map(); + const transitions = []; + selection + .selectAll(className(constant_1.VIEW_CLASS_NAME)) + .data(views, (d) => d.key) + .join((enter) => enter + .append('g') + .attr('className', constant_1.VIEW_CLASS_NAME) + .attr('id', (view) => view.key) + .call(applyTranslate) + .each(function (view, i, element) { + plotView(view, (0, selection_1.select)(element), transitions, context); + enterContainer.set(view, element); + }), (update) => update.call(applyTranslate).each(function (view, i, element) { + plotView(view, (0, selection_1.select)(element), transitions, context); + updateContainer.set(view, element); + }), (exit) => exit + .each(function (d, i, element) { + // Remove existed interactions. + const interactions = element['nameInteraction'].values(); + for (const interaction of interactions) { + interaction.destroy(); + } + }) + .remove()); + // Apply interactions. + const viewInstanceof = (viewContainer, updateInteractions, oldStore) => { + return Array.from(viewContainer.entries()).map(([view, container]) => { + // Index state by component or interaction name, + // such as legend, scrollbar, brushFilter. + // Each state transform options to another options. + const store = oldStore || new Map(); + const setState = (key, reducer = (x) => x) => store.set(key, reducer); + const options = viewNode.get(view); + const update = createUpdateView((0, selection_1.select)(container), options, context); + return { + view, + container, + options, + setState, + update: (from, updateTypes) => __awaiter(this, void 0, void 0, function* () { + // Apply all state functions to get new options. + const reducer = (0, helper_1.compose)(Array.from(store.values())); + const newOptions = reducer(options); + return yield update(newOptions, from, () => { + if ((0, util_1.isArray)(updateTypes)) { + updateInteractions(viewContainer, updateTypes, store); + } + }); + }), + }; + }); + }; + const updateInteractions = (container = updateContainer, updateType, oldStore) => { + var _a; + // Interactions for update views. + const updateViewInstances = viewInstanceof(container, updateInteractions, oldStore); + for (const target of updateViewInstances) { + const { options, container } = target; + const nameInteraction = container['nameInteraction']; + let typeOptions = inferInteraction(options); + if (updateType) { + typeOptions = typeOptions.filter((v) => updateType.includes(v[0])); + } + for (const typeOption of typeOptions) { + const [type, option] = typeOption; + // Remove interaction for existed views. + const prevInteraction = nameInteraction.get(type); + if (prevInteraction) + (_a = prevInteraction.destroy) === null || _a === void 0 ? void 0 : _a.call(prevInteraction); + // Apply new interaction. + if (option) { + const interaction = useThemeInteraction(target.view, type, option, useInteraction); + const destroy = interaction(target, updateViewInstances, context.emitter); + nameInteraction.set(type, { destroy }); + } + } + } + }; + // Interactions for enter views. + const enterViewInstances = viewInstanceof(enterContainer, updateInteractions); + for (const target of enterViewInstances) { + const { options } = target; + // A Map index interaction by interaction name. + const nameInteraction = new Map(); + target.container['nameInteraction'] = nameInteraction; + // Apply interactions. + for (const typeOption of inferInteraction(options)) { + const [type, option] = typeOption; + if (option) { + const interaction = useThemeInteraction(target.view, type, option, useInteraction); + const destroy = interaction(target, enterViewInstances, context.emitter); + nameInteraction.set(type, { destroy }); + } + } + } + updateInteractions(); + // Author animations. + const { width, height } = options; + const keyframes = []; + for (const nodeGenerator of nodeGenerators) { + // Delay the rendering of animation keyframe. Different animation + // created by different nodeGenerator will play in the same time. + // eslint-disable-next-line no-async-promise-executor + const keyframe = new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { + for (const node of nodeGenerator) { + const sizedNode = Object.assign({ width, height }, node); + yield plot(sizedNode, selection, context); + } + resolve(); + })); + keyframes.push(keyframe); + } + context.views = views; + // Clear and update animation. + (_a = context.animations) === null || _a === void 0 ? void 0 : _a.forEach((animation) => animation === null || animation === void 0 ? void 0 : animation.cancel()); + context.animations = transitions; + context.emitter.emit(event_1.ChartEvent.AFTER_PAINT); + // Note!!! + // The returned promise will never resolved if one of nodeGenerator + // never stop to yield node, which may created by a keyframe composition + // with iteration count set to infinite. + const finished = transitions + .filter(helper_1.defined) + .map(cancel) + .map((d) => d.finished); + return Promise.all([...finished, ...keyframes]); + }); +} +exports.plot = plot; +function applyTranslate(selection) { + selection.style('transform', (d) => `translate(${d.layout.x}, ${d.layout.y})`); +} +function definedInteraction(library) { + const [, createInteraction] = (0, library_1.useLibrary)('interaction', library); + return (d) => { + const [name, options] = d; + try { + return [name, createInteraction(name)]; + } + catch (_a) { + return [name, options.type]; + } + }; +} +function createUpdateView(selection, options, context) { + const { library } = context; + const createDefinedInteraction = definedInteraction(library); + const filter = (d) => d[1] && d[1].props && d[1].props.reapplyWhenUpdate; + const interactions = inferInteraction(options); + const updates = interactions + .map(createDefinedInteraction) + .filter(filter) + .map((d) => d[0]); + return (newOptions, source, callback) => __awaiter(this, void 0, void 0, function* () { + const transitions = []; + const [newView, newChildren] = yield initializeView(newOptions, context); + plotView(newView, selection, transitions, context); + // Update interaction need to reapply when update. + for (const name of updates.filter((d) => d !== source)) { + updateInteraction(name, selection, newOptions, newView, context); + } + for (const child of newChildren) { + plot(child, selection, context); + } + callback(); + return { options: newOptions, view: newView }; + }); +} +function updateInteraction(name, selection, options, view, context) { + var _a; + const { library } = context; + const [useInteraction] = (0, library_1.useLibrary)('interaction', library); + // Instances for interaction. + const container = selection.node(); + const nameInteraction = container['nameInteraction']; + const interactionOptions = inferInteraction(options).find(([d]) => d === name); + // Destroy older interaction. + const interaction = nameInteraction.get(name); + if (!interaction) + return; + (_a = interaction.destroy) === null || _a === void 0 ? void 0 : _a.call(interaction); + if (!interactionOptions[1]) + return; + // Apply new interaction. + const applyInteraction = useThemeInteraction(view, name, interactionOptions[1], useInteraction); + const target = { + options, + view, + container: selection.node(), + update: (options) => Promise.resolve(options), + }; + const destroy = applyInteraction(target, [], context.emitter); + nameInteraction.set(name, { destroy }); +} +function initializeView(options, context) { + return __awaiter(this, void 0, void 0, function* () { + const { library } = context; + const flattenOptions = yield transformMarks(options, context); + const mergedOptions = bubbleOptions(flattenOptions); + // @todo Remove this. + // !!! NOTE: Mute original view options. + // Update interaction and coordinate for this view. + options.interaction = mergedOptions.interaction; + options.coordinate = mergedOptions.coordinate; + // @ts-ignore + options.marks = [...mergedOptions.marks, ...mergedOptions.components]; + const transformedOptions = (0, coordinate_1.coordinate2Transform)(mergedOptions, library); + const state = yield initializeMarks(transformedOptions, context); + return initializeState(state, transformedOptions, library); + }); +} +function bubbleOptions(options) { + const { coordinate: viewCoordinate = {}, interaction: viewInteraction = {}, style: viewStyle = {}, marks } = options, rest = __rest(options, ["coordinate", "interaction", "style", "marks"]); + const markCoordinates = marks.map((d) => d.coordinate || {}); + const markInteractions = marks.map((d) => d.interaction || {}); + const markViewStyles = marks.map((d) => d.viewStyle || {}); + const newCoordinate = [...markCoordinates, viewCoordinate].reduceRight((prev, cur) => (0, util_1.deepMix)(prev, cur), {}); + const newInteraction = [viewInteraction, ...markInteractions].reduce((prev, cur) => (0, util_1.deepMix)(prev, cur), {}); + const newStyle = [...markViewStyles, viewStyle].reduce((prev, cur) => (0, util_1.deepMix)(prev, cur), {}); + return Object.assign(Object.assign({}, rest), { marks, coordinate: newCoordinate, interaction: newInteraction, style: newStyle }); +} +function transformMarks(options, context) { + return __awaiter(this, void 0, void 0, function* () { + const { library } = context; + const [useMark, createMark] = (0, library_1.useLibrary)('mark', library); + const staticMarks = new Set(Object.keys(library) + .map((d) => { var _a; return (_a = /component\.(.*)/.exec(d)) === null || _a === void 0 ? void 0 : _a[1]; }) + .filter(helper_1.defined)); + const { marks } = options; + const flattenMarks = []; + const components = []; + const discovered = [...marks]; + const { width, height } = (0, layout_1.computeRoughPlotSize)(options); + const markOptions = { options, width, height }; + // Pre order traversal. + while (discovered.length) { + const [node] = discovered.splice(0, 1); + // Apply data transform to get data. + const mark = (yield applyTransform(node, context)); + const { type = (0, helper_1.error)('G2Mark type is required.'), key } = mark; + // For components. + if (staticMarks.has(type)) + components.push(mark); + else { + const { props = {} } = createMark(type); + const { composite = true } = props; + if (!composite) + flattenMarks.push(mark); + else { + // Unwrap data from { value: data } to data, + // then the composite mark can process the normalized data. + const { data } = mark; + const newMark = Object.assign(Object.assign({}, mark), { data: data ? (Array.isArray(data) ? data : data.value) : data }); + // Convert composite mark to marks. + const marks = yield useMark(newMark, markOptions); + const M = Array.isArray(marks) ? marks : [marks]; + discovered.unshift(...M.map((d, i) => (Object.assign(Object.assign({}, d), { key: `${key}-${i}` })))); + } + } + } + return Object.assign(Object.assign({}, options), { marks: flattenMarks, components }); + }); +} +function initializeMarks(options, context) { + return __awaiter(this, void 0, void 0, function* () { + const { library } = context; + const [useTheme] = (0, library_1.useLibrary)('theme', library); + const [, createMark] = (0, library_1.useLibrary)('mark', library); + const { theme: partialTheme, marks: partialMarks, coordinates = [], } = options; + const theme = useTheme(inferTheme(partialTheme)); + const markState = new Map(); + // Initialize channels for marks. + for (const markOptions of partialMarks) { + const { type } = markOptions; + const { props = {} } = createMark(type); + const markAndState = yield (0, mark_1.initializeMark)(markOptions, props, context); + if (markAndState) { + const [initializedMark, state] = markAndState; + markState.set(initializedMark, state); + } + } + // Group channels by scale key, each group has scale. + const scaleChannels = (0, d3_array_1.group)(Array.from(markState.values()).flatMap((d) => d.channels), ({ scaleKey }) => scaleKey); + // Infer scale for each channel groups. + for (const channels of scaleChannels.values()) { + // Merge scale options for these channels. + const scaleOptions = channels.reduce((total, { scale }) => (0, util_1.deepMix)(total, scale), {}); + const { scaleKey } = channels[0]; + // Use the fields of the first channel as the title. + const { values: FV } = channels[0]; + const fields = Array.from(new Set(FV.map((d) => d.field).filter(helper_1.defined))); + const options = (0, util_1.deepMix)({ + guide: { title: fields.length === 0 ? undefined : fields }, + field: fields[0], + }, scaleOptions); + // Use the name of the first channel as the scale name. + const { name } = channels[0]; + const values = channels.flatMap(({ values }) => values.map((d) => d.value)); + const scale = Object.assign(Object.assign({}, (0, scale_1.inferScale)(name, values, options, coordinates, theme, library)), { uid: Symbol('scale'), key: scaleKey }); + channels.forEach((channel) => (channel.scale = scale)); + } + return markState; + }); +} +function useThemeInteraction(view, type, option, useInteraction) { + const theme = view.theme; + const defaults = typeof type === 'string' ? theme[type] || {} : {}; + const interaction = useInteraction((0, util_1.deepMix)(defaults, Object.assign({ type }, option))); + return interaction; +} +function initializeState(markState, options, library) { + var _a; + const [useMark] = (0, library_1.useLibrary)('mark', library); + const [useTheme] = (0, library_1.useLibrary)('theme', library); + const [useLabelTransform] = (0, library_1.useLibrary)('labelTransform', library); + const { key, frame = false, theme: partialTheme, clip, style = {}, labelTransform = [], } = options; + const theme = useTheme(inferTheme(partialTheme)); + // Infer components and compute layout. + const states = Array.from(markState.values()); + const scales = (0, scale_1.collectScales)(states, options); + const components = (0, component_1.normalizeComponents)((0, component_1.inferComponent)(inferComponentScales(Array.from(scales), states, markState), options, library)); + const layout = (0, layout_1.computeLayout)(components, options, theme, library); + const coordinate = (0, coordinate_1.createCoordinate)(layout, options, library); + const framedStyle = frame + ? (0, util_1.deepMix)({ mainLineWidth: 1, mainStroke: '#000' }, style) + : style; + // Place components and mutate their bbox. + (0, layout_1.placeComponents)((0, component_1.groupComponents)(components), coordinate, layout); + // AxisZ need a copy of axisX and axisY to show grids in X-Z & Y-Z planes. + (0, layout_1.processAxisZ)(components); + // Index scale instance by uid. + const uidScale = new Map(Array.from(markState.values()).flatMap((state) => { + const { channels } = state; + return channels.map(({ scale }) => [ + scale.uid, + (0, scale_1.useRelationScale)(scale, library), + ]); + })); + (0, scale_1.groupTransform)(markState, uidScale); + // Scale from marks and components. + const scaleInstance = {}; + // Initialize scale from components. + for (const component of components) { + const { scales: scaleDescriptors = [] } = component; + const scales = []; + for (const descriptor of scaleDescriptors) { + const { name, uid } = descriptor; + const scale = (_a = uidScale.get(uid)) !== null && _a !== void 0 ? _a : (0, scale_1.useRelationScale)(descriptor, library); + scales.push(scale); + // Delivery the scale of axisX to the AxisY, + // in order to calculate the angle of axisY component when rendering radar chart. + if (name === 'y') { + scale.update(Object.assign(Object.assign({}, scale.getOptions()), { xScale: scaleInstance.x })); + } + (0, scale_1.assignScale)(scaleInstance, { [name]: scale }); + } + component.scaleInstances = scales; + } + // Calc data to be rendered for each mark. + // @todo More readable APIs for Container which stays + // the same style with JS standard and lodash APIs. + // @todo More proper way to index scale for different marks. + const children = []; + const dataMap = new Map(); + for (const [mark, state] of markState.entries()) { + const { + // scale, + // Callback to create children options based on this mark. + children: createChildren, + // The total count of data (both show and hide)for this facet. + // This is for unit visualization to sync data domain. + dataDomain, modifier, key: markKey, data, } = mark; + dataMap.set(markKey, data); + const { index, channels, tooltip } = state; + const scale = Object.fromEntries(channels.map(({ name, scale }) => [name, scale])); + // Transform abstract value to visual value by scales. + const markScaleInstance = (0, array_1.mapObject)(scale, ({ uid }) => uidScale.get(uid)); + (0, scale_1.assignScale)(scaleInstance, markScaleInstance); + const value = (0, scale_1.applyScale)(channels, markScaleInstance); + // Calc points and transformation for each data, + // and then transform visual value to visual data. + const calcPoints = useMark(mark); + const [I, P, S] = filterValid(calcPoints(index, markScaleInstance, value, coordinate)); + const count = dataDomain || I.length; + const T = modifier ? modifier(P, count, layout) : []; + const titleOf = (i) => { var _a, _b; return (_b = (_a = tooltip.title) === null || _a === void 0 ? void 0 : _a[i]) === null || _b === void 0 ? void 0 : _b.value; }; + const itemsOf = (i) => tooltip.items.map((V) => V[i]); + const visualData = I.map((d, i) => { + const datum = Object.assign({ points: P[i], transform: T[i], index: d, markKey, viewKey: key, data: data[d] }, (tooltip && { + title: titleOf(d), + items: itemsOf(d), + })); + for (const [k, V] of Object.entries(value)) { + datum[k] = V[d]; + if (S) + datum[`series${(0, util_1.upperFirst)(k)}`] = S[i].map((i) => V[i]); + } + if (S) + datum['seriesIndex'] = S[i]; + if (S && tooltip) { + datum['seriesItems'] = S[i].map((si) => itemsOf(si)); + datum['seriesTitle'] = S[i].map((si) => titleOf(si)); + } + return datum; + }); + state.data = visualData; + state.index = I; + // Create children options by children callback, + // and then propagate data to each child. + const markChildren = createChildren === null || createChildren === void 0 ? void 0 : createChildren(visualData, markScaleInstance, layout); + children.push(...(markChildren || [])); + } + const view = { + layout, + theme, + coordinate, + markState, + key, + clip, + scale: scaleInstance, + style: framedStyle, + components, + data: dataMap, + labelTransform: (0, helper_1.compose)(labelTransform.map(useLabelTransform)), + }; + return [view, children]; +} +function plotView(view, selection, transitions, context) { + return __awaiter(this, void 0, void 0, function* () { + const { library } = context; + const { components, theme, layout, markState, coordinate, key, style, clip, scale, } = view; + // Render background for the different areas. + const { x, y, width, height } = layout, rest = __rest(layout, ["x", "y", "width", "height"]); + const areaKeys = ['view', 'plot', 'main', 'content']; + const I = areaKeys.map((_, i) => i); + const sizeKeys = ['a', 'margin', 'padding', 'inset']; + const areaStyles = areaKeys.map((d) => (0, helper_1.maybeSubObject)(Object.assign({}, theme.view, style), d)); + const areaSizes = sizeKeys.map((d) => (0, helper_1.subObject)(rest, d)); + const styleArea = (selection) => selection + .style('x', (i) => areaLayouts[i].x) + .style('y', (i) => areaLayouts[i].y) + .style('width', (i) => areaLayouts[i].width) + .style('height', (i) => areaLayouts[i].height) + .each(function (i, d, element) { + applyStyle((0, selection_1.select)(element), areaStyles[i]); + }); + let px = 0; + let py = 0; + let pw = width; + let ph = height; + const areaLayouts = I.map((i) => { + const size = areaSizes[i]; + const { left = 0, top = 0, bottom = 0, right = 0 } = size; + px += left; + py += top; + pw -= left + right; + ph -= top + bottom; + return { + x: px, + y: py, + width: pw, + height: ph, + }; + }); + selection + .selectAll(className(constant_1.AREA_CLASS_NAME)) + .data( + // Only render area with defined style. + I.filter((i) => (0, helper_1.defined)(areaStyles[i])), (i) => areaKeys[i]) + .join((enter) => enter + .append('rect') + .attr('className', constant_1.AREA_CLASS_NAME) + .style('zIndex', -2) + .call(styleArea), (update) => update.call(styleArea), (exit) => exit.remove()); + const animationExtent = computeAnimationExtent(markState); + const componentAnimateOptions = animationExtent + ? { duration: animationExtent[1] } + : false; + // Render components. + // @todo renderComponent return ctor and options. + // Key for each type of component. + // Index them grouped by position. + for (const [, C] of (0, d3_array_1.groups)(components, (d) => `${d.type}-${d.position}`)) { + C.forEach((d, i) => (d.index = i)); + } + const componentsTransitions = selection + .selectAll(className(constant_1.COMPONENT_CLASS_NAME)) + .data(components, (d) => `${d.type}-${d.position}-${d.index}`) + .join((enter) => enter + .append('g') + .style('zIndex', ({ zIndex }) => zIndex || -1) + .attr('className', constant_1.COMPONENT_CLASS_NAME) + .append((options) => (0, component_1.renderComponent)((0, util_1.deepMix)({ animate: componentAnimateOptions, scale }, options), coordinate, theme, library, markState)), (update) => update.transition(function (options, i, element) { + const { preserve = false } = options; + if (preserve) + return; + const newComponent = (0, component_1.renderComponent)((0, util_1.deepMix)({ animate: componentAnimateOptions, scale }, options), coordinate, theme, library, markState); + const { attributes } = newComponent; + const [node] = element.childNodes; + return node.update(attributes, false); + })) + .transitions(); + transitions.push(...componentsTransitions.flat().filter(helper_1.defined)); + // Main layer is for showing the main visual representation such as marks. There + // may be multiple main layers for a view, each main layer correspond to one of marks. + // @todo Test DOM structure. + const T = selection + .selectAll(className(constant_1.PLOT_CLASS_NAME)) + .data([layout], () => key) + .join((enter) => enter + // Make this layer interactive, such as click and mousemove events. + .append('rect') + .style('zIndex', 0) + .style('fill', 'transparent') + .attr('className', constant_1.PLOT_CLASS_NAME) + .call(updateBBox) + .call(updateLayers, Array.from(markState.keys())) + .call(applyClip, clip), (update) => update + .call(updateLayers, Array.from(markState.keys())) + .call((selection) => { + return animationExtent + ? animateBBox(selection, animationExtent) + : updateBBox(selection); + }) + .call(applyClip, clip)) + .transitions(); + transitions.push(...T.flat()); + // Render marks with corresponding data. + for (const [mark, state] of markState.entries()) { + const { data } = state; + const { key, class: cls, type } = mark; + const viewNode = selection.select(`#${key}`); + const shapeFunction = createMarkShapeFunction(mark, state, view, context); + const enterFunction = createEnterFunction(mark, state, view, library); + const updateFunction = createUpdateFunction(mark, state, view, library); + const exitFunction = createExitFunction(mark, state, view, library); + const facetElements = selectFacetElements(selection, viewNode, cls, 'element'); + const T = viewNode + .selectAll(className(constant_1.ELEMENT_CLASS_NAME)) + .selectFacetAll(facetElements) + .data(data, (d) => d.key, (d) => d.groupKey) + .join((enter) => enter + .append(shapeFunction) + // Note!!! Only one className can be set. + // Using attribute as alternative for other classNames. + .attr('className', constant_1.ELEMENT_CLASS_NAME) + .attr('markType', type) + .transition(function (data, i, element) { + return enterFunction(data, [element]); + }), (update) => update.call((selection) => { + const parent = selection.parent(); + const origin = (0, helper_1.useMemo)((node) => { + const [x, y] = node.getBounds().min; + return [x, y]; + }); + selection + .transition(function (data, index, element) { + maybeFacetElement(element, parent, origin); + const node = shapeFunction(data, index); + const animation = updateFunction(data, [element], [node]); + if (animation === null || animation === void 0 ? void 0 : animation.length) + return animation; + if (element.nodeName === node.nodeName && + node.nodeName !== 'g') { + (0, helper_1.copyAttributes)(element, node); + } + else { + element.parentNode.replaceChild(node, element); + node.className = constant_1.ELEMENT_CLASS_NAME; + // @ts-ignore + node.markType = type; + // @ts-ignore + node.__data__ = element.__data__; + } + return animation; + }) + .attr('markType', type) + .attr('className', constant_1.ELEMENT_CLASS_NAME); + }), (exit) => { + return exit + .each(function (d, i, element) { + element.__removed__ = true; + }) + .transition(function (data, i, element) { + return exitFunction(data, [element]); + }) + .remove(); + }, (merge) => merge + // Append elements to be merged. + .append(shapeFunction) + .attr('className', constant_1.ELEMENT_CLASS_NAME) + .attr('markType', type) + .transition(function (data, i, element) { + // Remove merged elements after animation finishing. + const { __fromElements__: fromElements } = element; + const transition = updateFunction(data, fromElements, [element]); + const exit = new selection_1.Selection(fromElements, null, element.parentNode); + exit.transition(transition).remove(); + return transition; + }), (split) => split + .transition(function (data, i, element) { + // Append splitted shapes. + const enter = new selection_1.Selection([], element.__toData__, element.parentNode); + const toElements = enter + .append(shapeFunction) + .attr('className', constant_1.ELEMENT_CLASS_NAME) + .attr('markType', type) + .nodes(); + return updateFunction(data, [element], toElements); + }) + // Remove elements to be splitted after animation finishing. + .remove()) + .transitions(); + transitions.push(...T.flat()); + } + // Plot label for this view. + plotLabel(view, selection, transitions, library, context); + }); +} +/** + * Auto hide labels be specify label layout. + */ +function plotLabel(view, selection, transitions, library, context) { + const [useLabelTransform] = (0, library_1.useLibrary)('labelTransform', library); + const { markState, labelTransform } = view; + const labelLayer = selection.select(className(constant_1.LABEL_LAYER_CLASS_NAME)).node(); + // A Map index shapeFunction by label. + const labelShapeFunction = new Map(); + // A Map index options by label. + const labelDescriptor = new Map(); + // Get all labels for this view. + const labels = Array.from(markState.entries()).flatMap(([mark, state]) => { + const { labels: labelOptions = [], key } = mark; + const shapeFunction = createLabelShapeFunction(mark, state, view, library, context); + const elements = selection + .select(`#${key}`) + .selectAll(className(constant_1.ELEMENT_CLASS_NAME)) + .nodes() + // Only select the valid element. + .filter((n) => !n.__removed__); + return labelOptions.flatMap((labelOption, i) => { + const { transform = [] } = labelOption, options = __rest(labelOption, ["transform"]); + return elements.flatMap((e) => { + const L = getLabels(options, i, e); + L.forEach((l) => { + labelShapeFunction.set(l, (data) => shapeFunction(Object.assign(Object.assign({}, data), { element: e }))); + labelDescriptor.set(l, labelOption); + }); + return L; + }); + }); + }); + // Render all labels. + const labelShapes = (0, selection_1.select)(labelLayer) + .selectAll(className(constant_1.LABEL_CLASS_NAME)) + .data(labels, (d) => d.key) + .join((enter) => enter + .append((d) => labelShapeFunction.get(d)(d)) + .attr('className', constant_1.LABEL_CLASS_NAME), (update) => update.each(function (d, i, element) { + // @todo Handle Label with different type. + const shapeFunction = labelShapeFunction.get(d); + const node = shapeFunction(d); + (0, helper_1.copyAttributes)(element, node); + }), (exit) => exit.remove()) + .nodes(); + // Apply group-level transforms. + const labelGroups = (0, d3_array_1.group)(labelShapes, (d) => labelDescriptor.get(d.__data__)); + const { coordinate, layout } = view; + const labelTransformContext = { + canvas: context.canvas, + coordinate, + layout, + }; + for (const [label, shapes] of labelGroups) { + const { transform = [] } = label; + const transformFunction = (0, helper_1.compose)(transform.map(useLabelTransform)); + transformFunction(shapes, labelTransformContext); + } + // Apply view-level transform. + if (labelTransform) { + labelTransform(labelShapes, labelTransformContext); + } +} +function getLabels(label, labelIndex, element) { + const { seriesIndex: SI, seriesKey, points, key, index } = element.__data__; + const bounds = getLocalBounds(element); + if (!SI) { + return [ + Object.assign(Object.assign({}, label), { key: `${key}-${labelIndex}`, bounds, + index, + points, dependentElement: element }), + ]; + } + const selector = normalizeLabelSelector(label); + const F = SI.map((index, i) => (Object.assign(Object.assign({}, label), { key: `${seriesKey[i]}-${labelIndex}`, bounds: [points[i]], index, + points, dependentElement: element }))); + return selector ? selector(F) : F; +} +function filterValid([I, P, S]) { + if (S) + return [I, P, S]; + const definedIndex = []; + const definedPoints = []; + for (let i = 0; i < I.length; i++) { + const d = I[i]; + const p = P[i]; + if (p.every(([x, y]) => (0, helper_1.defined)(x) && (0, helper_1.defined)(y))) { + definedIndex.push(d); + definedPoints.push(p); + } + } + return [definedIndex, definedPoints]; +} +function normalizeLabelSelector(label) { + const { selector } = label; + if (!selector) + return null; + if (typeof selector === 'function') + return selector; + if (selector === 'first') + return (I) => [I[0]]; + if (selector === 'last') + return (I) => [I[I.length - 1]]; + throw new Error(`Unknown selector: ${selector}`); +} +/** + * Avoid getting error bounds caused by element animations. + * @todo Remove this temporary handle method, if runtime supports + * correct process: drawElement, do label layout and then do + * transitions together. + */ +function getLocalBounds(element) { + const cloneElement = element.cloneNode(true); + const animations = element.getAnimations(); + cloneElement.style.visibility = 'hidden'; + animations.forEach((animation) => { + const keyframes = animation.effect.getKeyframes(); + cloneElement.attr(keyframes[keyframes.length - 1]); + }); + element.parentNode.appendChild(cloneElement); + const bounds = cloneElement.getLocalBounds(); + cloneElement.destroy(); + const { min, max } = bounds; + return [min, max]; +} +function createLabelShapeFunction(mark, state, view, library, context) { + const [useShape] = (0, library_1.useLibrary)('shape', library); + const { data: abstractData, encode } = mark; + const { data: visualData, defaultLabelShape } = state; + const point2d = visualData.map((d) => d.points); + const channel = (0, array_1.mapObject)(encode, (d) => d.value); + // Assemble Context. + const { theme, coordinate } = view; + const shapeContext = Object.assign(Object.assign({}, context), { document: (0, library_1.documentOf)(context), theme, + coordinate }); + return (options) => { + // Computed values from data and styles. + const { index, points } = options; + const datum = abstractData[index]; + const { formatter = (d) => `${d}`, transform, style: abstractStyle, render, selector, element } = options, abstractOptions = __rest(options, ["formatter", "transform", "style", "render", "selector", "element"]); + const visualOptions = (0, array_1.mapObject)(Object.assign(Object.assign({}, abstractOptions), abstractStyle), (d) => valueOf(d, datum, index, abstractData, { + channel, + element, + })); + const { shape = defaultLabelShape, text } = visualOptions, style = __rest(visualOptions, ["shape", "text"]); + const f = typeof formatter === 'string' ? (0, d3_format_1.format)(formatter) : formatter; + const value = Object.assign(Object.assign({}, style), { text: f(text, datum, index, abstractData), datum }); + // Params for create shape. + const shapeOptions = Object.assign({ type: `label.${shape}`, render }, style); + const shapeFunction = useShape(shapeOptions, shapeContext); + const defaults = getDefaultsStyle(theme, 'label', shape, 'label'); + return shapeFunction(points, value, defaults, point2d); + }; +} +function valueOf(value, datum, i, data, options) { + if (typeof value === 'function') + return value(datum, i, data, options); + if (typeof value !== 'string') + return value; + if ((0, helper_1.isStrictObject)(datum) && datum[value] !== undefined) + return datum[value]; + return value; +} +/** + * Compute max duration for this frame. + */ +function computeAnimationExtent(markState) { + let maxDuration = -Infinity; + let minDelay = Infinity; + for (const [mark, state] of markState) { + const { animate = {} } = mark; + const { data } = state; + const { enter = {}, update = {}, exit = {} } = animate; + const { type: defaultUpdateType, duration: defaultUpdateDuration = 300, delay: defaultUpdateDelay = 0, } = update; + const { type: defaultEnterType, duration: defaultEnterDuration = 300, delay: defaultEnterDelay = 0, } = enter; + const { type: defaultExitType, duration: defaultExitDuration = 300, delay: defaultExitDelay = 0, } = exit; + for (const d of data) { + const { updateType = defaultUpdateType, updateDuration = defaultUpdateDuration, updateDelay = defaultUpdateDelay, enterType = defaultEnterType, enterDuration = defaultEnterDuration, enterDelay = defaultEnterDelay, exitDuration = defaultExitDuration, exitDelay = defaultExitDelay, exitType = defaultExitType, } = d; + if (updateType === undefined || updateType) { + maxDuration = Math.max(maxDuration, updateDuration + updateDelay); + minDelay = Math.min(minDelay, updateDelay); + } + if (exitType === undefined || exitType) { + maxDuration = Math.max(maxDuration, exitDuration + exitDelay); + minDelay = Math.min(minDelay, exitDelay); + } + if (enterType === undefined || enterType) { + maxDuration = Math.max(maxDuration, enterDuration + enterDelay); + minDelay = Math.min(minDelay, enterDelay); + } + } + } + if (maxDuration === -Infinity) + return null; + return [minDelay, maxDuration - minDelay]; +} +function selectFacetElements(selection, current, facetClassName, elementClassName) { + const group = selection.node().parentElement; + return group + .findAll((node) => node.style.facet !== undefined && + node.style.facet === facetClassName && + node !== current.node()) + .flatMap((node) => node.getElementsByClassName(elementClassName)); +} +/** + * Update the parent of element and apply transform to make it + * stay in original position. + */ +function maybeFacetElement(element, parent, originOf) { + if (!element.__facet__) + return; + // element -> g#main -> rect#plot + const prePlot = element.parentNode.parentNode; + // g#main -> rect#plot + const newPlot = parent.parentNode; + const [px, py] = originOf(prePlot); + const [x, y] = originOf(newPlot); + const translate = `translate(${px - x}, ${py - y})`; + (0, helper_1.appendTransform)(element, translate); + parent.append(element); +} +function createMarkShapeFunction(mark, state, view, context) { + const { library } = context; + const [useShape] = (0, library_1.useLibrary)('shape', library); + const { data: abstractData, encode } = mark; + const { defaultShape, data, shape: shapeLibrary } = state; + const channel = (0, array_1.mapObject)(encode, (d) => d.value); + const point2d = data.map((d) => d.points); + const { theme, coordinate } = view; + const { type: markType, style = {} } = mark; + const shapeContext = Object.assign(Object.assign({}, context), { document: (0, library_1.documentOf)(context), coordinate, + theme }); + return (data) => { + const { shape: styleShape = defaultShape } = style; + const { shape = styleShape, points, seriesIndex, index: i } = data, v = __rest(data, ["shape", "points", "seriesIndex", "index"]); + const value = Object.assign(Object.assign({}, v), { index: i }); + // Get data-driven style. + // If it is a series shape, such as area and line, + // provides the series of abstract data and indices + // for this shape, otherwise the single datum and + // index. + const abstractDatum = seriesIndex + ? seriesIndex.map((i) => abstractData[i]) + : abstractData[i]; + const I = seriesIndex ? seriesIndex : i; + const visualStyle = (0, array_1.mapObject)(style, (d) => valueOf(d, abstractDatum, I, abstractData, { channel })); + // Try get shape from mark first, then from library. + const shapeFunction = shapeLibrary[shape] + ? shapeLibrary[shape](visualStyle, shapeContext) + : useShape(Object.assign(Object.assign({}, visualStyle), { type: shapeName(mark, shape) }), shapeContext); + const defaults = getDefaultsStyle(theme, markType, shape, defaultShape); + return shapeFunction(points, value, defaults, point2d); + }; +} +function getDefaultsStyle(theme, mark, shape, defaultShape) { + if (typeof mark !== 'string') + return; + const { color } = theme; + const markTheme = theme[mark] || {}; + const shapeTheme = markTheme[shape] || markTheme[defaultShape]; + return Object.assign({ color }, shapeTheme); +} +function createAnimationFunction(type, mark, state, view, library) { + var _a, _b; + const [, createShape] = (0, library_1.useLibrary)('shape', library); + const [useAnimation] = (0, library_1.useLibrary)('animation', library); + const { defaultShape, shape: shapeLibrary } = state; + const { theme, coordinate } = view; + const upperType = (0, util_1.upperFirst)(type); + const key = `default${upperType}Animation`; + // Get shape from mark first, then from library. + const { [key]: defaultAnimation } = ((_a = shapeLibrary[defaultShape]) === null || _a === void 0 ? void 0 : _a.props) || + createShape(shapeName(mark, defaultShape)).props; + const { [type]: defaultEffectTiming = {} } = theme; + const animate = ((_b = mark.animate) === null || _b === void 0 ? void 0 : _b[type]) || {}; + const context = { coordinate }; + return (data, from, to) => { + const { [`${type}Type`]: animation, [`${type}Delay`]: delay, [`${type}Duration`]: duration, [`${type}Easing`]: easing, } = data; + const options = Object.assign({ type: animation || defaultAnimation }, animate); + if (!options.type) + return null; + const animateFunction = useAnimation(options, context); + const value = { delay, duration, easing }; + const A = animateFunction(from, to, (0, util_1.deepMix)(defaultEffectTiming, value)); + let an = []; + if (!Array.isArray(A)) { + an = [A]; + } + else { + an = A; + } + return an.filter(Boolean); + }; +} +function createEnterFunction(mark, state, view, library) { + return createAnimationFunction('enter', mark, state, view, library); +} +/** + * Animation will not cancel automatically, it should be canceled + * manually. This is very important for performance. + */ +function cancel(animation) { + animation.finished.then(() => { + animation.cancel(); + }); + return animation; +} +function createUpdateFunction(mark, state, view, library) { + return createAnimationFunction('update', mark, state, view, library); +} +function createExitFunction(mark, state, view, library) { + return createAnimationFunction('exit', mark, state, view, library); +} +function inferTheme(theme = {}) { + if (typeof theme === 'string') + return { type: theme }; + const { type = 'light' } = theme, rest = __rest(theme, ["type"]); + return Object.assign(Object.assign({}, rest), { type }); +} +/** + * @todo Infer builtin tooltips. + */ +function inferInteraction(view) { + const defaults = { + event: true, + tooltip: true, + // @todo Inferred by slider self. + sliderFilter: true, + legendFilter: true, + scrollbarFilter: true, + }; + const { interaction = {} } = view; + return Object.entries((0, util_1.deepMix)(defaults, interaction)).reverse(); +} +function applyTransform(node, context) { + return __awaiter(this, void 0, void 0, function* () { + const { data } = node, rest = __rest(node, ["data"]); + if (data == undefined) + return node; + const [, { data: newData }] = yield (0, transform_1.applyDataTransform)([], { data }, context); + return Object.assign({ data: newData }, rest); + }); +} +function updateBBox(selection) { + selection + .style('transform', (d) => `translate(${d.paddingLeft + d.marginLeft}, ${d.paddingTop + d.marginTop})`) + .style('width', (d) => d.innerWidth) + .style('height', (d) => d.innerHeight); +} +function animateBBox(selection, extent) { + const [delay, duration] = extent; + selection.transition(function (data, i, element) { + const { transform, width, height } = element.style; + const { paddingLeft, paddingTop, innerWidth, innerHeight, marginLeft, marginTop, } = data; + const keyframes = [ + { + transform, + width, + height, + }, + { + transform: `translate(${paddingLeft + marginLeft}, ${paddingTop + marginTop})`, + width: innerWidth, + height: innerHeight, + }, + ]; + return element.animate(keyframes, { delay, duration, fill: 'both' }); + }); +} +function shapeName(mark, name) { + const { type } = mark; + if (typeof name === 'string') + return `${type}.${name}`; + return name; +} +/** + * Create and update layer for each mark. + * All the layers created here are treated as main layers. + */ +function updateLayers(selection, marks) { + const facet = (d) => (d.class !== undefined ? `${d.class}` : ''); + // Skip for empty selection, it can't append nodes. + const nodes = selection.nodes(); + if (nodes.length === 0) + return; + selection + .selectAll(className(constant_1.MAIN_LAYER_CLASS_NAME)) + .data(marks, (d) => d.key) + .join((enter) => enter + .append('g') + .attr('className', constant_1.MAIN_LAYER_CLASS_NAME) + .attr('id', (d) => d.key) + .style('facet', facet) + .style('fill', 'transparent') + .style('zIndex', (d) => { var _a; return (_a = d.zIndex) !== null && _a !== void 0 ? _a : 0; }), (update) => update + .style('facet', facet) + .style('fill', 'transparent') + .style('zIndex', (d) => { var _a; return (_a = d.zIndex) !== null && _a !== void 0 ? _a : 0; }), (exit) => exit.remove()); + const labelLayer = selection.select(className(constant_1.LABEL_LAYER_CLASS_NAME)).node(); + if (labelLayer) + return; + selection + .append('g') + .attr('className', constant_1.LABEL_LAYER_CLASS_NAME) + .style('zIndex', 0); +} +function className(...names) { + return names.map((d) => `.${d}`).join(''); +} +function applyClip(selection, clip) { + if (!selection.node()) + return; + selection.style('clipPath', (data) => { + if (!clip) + return null; + const { paddingTop: y, paddingLeft: x, marginLeft: x1, marginTop: y1, innerWidth: width, innerHeight: height, } = data; + return new g_1.Rect({ style: { x: x + x1, y: y + y1, width, height } }); + }); +} +function inferComponentScales(scales, states, markState) { + // add shape scale to state. + var _a; + // for cell, omit shape scale. + // @todo support shape scale for cell. + for (const [key] of markState.entries()) { + if (key.type === 'cell') { + return scales.filter((scale) => scale.name !== 'shape'); + } + } + // can't infer shape scale if there are multiple states. + if (states.length !== 1 || scales.some((scale) => scale.name === 'shape')) { + return scales; + } + const { defaultShape: shape } = states[0]; + const acceptMarkTypes = ['point', 'line', 'rect', 'hollow']; + if (!acceptMarkTypes.includes(shape)) + return scales; + const shapeMap = { + point: 'point', + line: 'hyphen', + rect: 'square', + hollow: 'hollow', + }; + // create shape scale + const field = ((_a = scales.find((scale) => scale.name === 'color')) === null || _a === void 0 ? void 0 : _a.field) || null; + const shapeScale = { + field, + name: 'shape', + type: 'constant', + domain: [], + range: [shapeMap[shape]], + }; + return [...scales, shapeScale]; +} +function applyStyle(selection, style) { + for (const [key, value] of Object.entries(style)) { + selection.style(key, value); + } +} +exports.applyStyle = applyStyle; +//# sourceMappingURL=plot.js.map +}, function(modId) { var map = {"../utils/array":1751263815830,"../utils/event":1751263816091,"../utils/helper":1751263815829,"../utils/selection":1751263815883,"./component":1751263816094,"./constant":1751263816082,"./coordinate":1751263816096,"./layout":1751263816116,"./library":1751263816097,"./mark":1751263816117,"./scale":1751263816114,"./transform":1751263816118}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816094, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.styleOf = exports.computeTitleBBox = exports.computeLabelsBBox = exports.createScale = exports.computeComponentSize = exports.groupComponents = exports.flatComponents = exports.normalizeComponents = exports.renderComponent = exports.inferComponent = void 0; +const util_1 = require("@antv/util"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const d3_format_1 = require("@antv/vendor/d3-format"); +const g_1 = require("@antv/g"); +const coordinate_1 = require("../coordinate"); +const array_1 = require("../utils/array"); +const number_1 = require("../utils/number"); +const helper_1 = require("../utils/helper"); +const constant_1 = require("../component/constant"); +const coordinate_2 = require("./coordinate"); +const library_1 = require("./library"); +const scale_1 = require("./scale"); +const scale_2 = require("./types/scale"); +function inferComponent(scales, partialOptions, library) { + const { coordinates = [], title } = partialOptions; + const [, createGuideComponent] = (0, library_1.useLibrary)('component', library); + const displayedScales = scales.filter(({ guide }) => { + if (guide === null) + return false; + return true; + }); + const components = []; + // Sliders and scrollbar component. + const sliders = inferScrollableComponents(partialOptions, scales, library); + components.push(...sliders); + // Title components. + if (title) { + const { props } = createGuideComponent('title'); + const { defaultPosition, defaultOrientation, defaultOrder, defaultSize, defaultCrossPadding, } = props; + const titleOptions = typeof title === 'string' ? { title } : title; + components.push(Object.assign({ type: 'title', position: defaultPosition, orientation: defaultOrientation, order: defaultOrder, crossPadding: defaultCrossPadding[0], defaultSize }, titleOptions)); + } + // Axis and legends. + const inferredComponents = inferComponentsType(displayedScales, coordinates); + inferredComponents.forEach(([type, relativeScales]) => { + const { props } = createGuideComponent(type); + const { defaultPosition, defaultPlane = 'xy', defaultOrientation, defaultSize, defaultOrder, defaultLength, defaultPadding: DP = [0, 0], defaultCrossPadding: DCP = [0, 0], } = props; + // @todo to be confirm if the scale can be merged. + // const scale: G2ScaleOptions = Object.assign({}, ...relativeScales); + const scale = (0, util_1.deepMix)({}, ...relativeScales); + const { guide: guideOptions, field } = scale; + // A scale may have multiple guides. + const guides = Array.isArray(guideOptions) ? guideOptions : [guideOptions]; + for (const partialGuide of guides) { + const [position, orientation] = inferComponentPositionAndOrientation(type, defaultPosition, defaultOrientation, partialGuide, relativeScales, displayedScales, coordinates); + // Skip if position and orientation are not specified. + // @example the last axis of radar chart + if (!position && !orientation) + continue; + const isVertical = position === 'left' || position === 'right'; + const defaultPadding = isVertical ? DP[1] : DP[0]; + const defaultCrossPadding = isVertical ? DCP[1] : DCP[0]; + const { size, order = defaultOrder, length = defaultLength, padding = defaultPadding, crossPadding = defaultCrossPadding, } = partialGuide; + components.push(Object.assign(Object.assign({ title: field }, partialGuide), { defaultSize, + length, + position, plane: defaultPlane, orientation, + padding, + order, + crossPadding, + size, + type, scales: relativeScales })); + } + }); + return components; +} +exports.inferComponent = inferComponent; +function renderComponent(component, coordinate, theme, library, markState) { + const [useGuideComponent] = (0, library_1.useLibrary)('component', library); + const { scaleInstances: scales, scale, bbox } = component, options = __rest(component, ["scaleInstances", "scale", "bbox"]); + const value = { bbox, library }; + const render = useGuideComponent(options); + return render({ + coordinate, + library, + markState, + scales, + theme, + value, + scale, + }); +} +exports.renderComponent = renderComponent; +function normalizeComponents(components) { + return components.map((d) => { + const component = (0, util_1.deepMix)(d, d.style); + delete component.style; + return component; + }); +} +exports.normalizeComponents = normalizeComponents; +function flatComponents(components) { + return components.flatMap((d) => (d.type == 'group' ? d.children : d)); +} +exports.flatComponents = flatComponents; +// Wrap legends into a group component. +function groupComponents(components, crossSize) { + // Group components by key. + const P = ['left', 'right', 'bottom', 'top']; + const key = ({ type, position, group }) => { + if (!P.includes(position)) + return Symbol('independent'); + if (group === undefined) { + if (type.startsWith('legend')) + return `legend-${position}`; + return Symbol('independent'); + } + if (group === 'independent') + return Symbol('independent'); + return group; + }; + const grouped = (0, d3_array_1.groups)(components, key); + // Update attributes of group components, + // and maybe flatten group components without enough room. + return grouped.flatMap(([, components]) => { + if (components.length === 1) + return components[0]; + // If crossSize defined, group components only when has + // enough room. + if (crossSize !== undefined) { + // Compute total length. + const DL = components + .filter((d) => d.length !== undefined) + .map((d) => d.length); + const totalLength = (0, d3_array_1.sum)(DL); + // If there is no enough room for components, + // do not group. + if (totalLength > crossSize) { + components.forEach((d) => (d.group = Symbol('independent'))); + return components; + } + // Group legends and update legend length. + const emptyLength = crossSize - totalLength; + const emptyCount = components.length - DL.length; + const length = emptyLength / emptyCount; + components.forEach((d) => { + if (d.length !== undefined) + return; + d.length = length; + }); + } + // Create a group component. + const size = (0, d3_array_1.max)(components, (d) => d.size); + const order = (0, d3_array_1.max)(components, (d) => d.order); + const crossPadding = (0, d3_array_1.max)(components, (d) => d.crossPadding); + const position = components[0].position; + return { + type: 'group', + size, + order, + position, + children: components, + crossPadding, + }; + }); +} +exports.groupComponents = groupComponents; +function inferLegendComponentType(scales, coordinates) { + // Filter accepts scales. + const channels = ['shape', 'size', 'color', 'opacity']; + const isConstantSize = (type, name) => type === 'constant' && name === 'size'; + const accepts = scales.filter(({ type, name }) => typeof type === 'string' && + channels.includes(name) && + !isConstantSize(type, name)); + // Group scales by fields. + const constants = accepts.filter(({ type }) => type === 'constant'); + const nonConstants = accepts.filter(({ type }) => type !== 'constant'); + const groupKey = (d) => (d.field ? d.field : Symbol('independent')); + const fieldScales = (0, d3_array_1.groups)(nonConstants, groupKey) + .map(([key, scales]) => [key, [...scales, ...constants]]) + .filter(([, scales]) => scales.some((scale) => scale.type !== 'constant')); + const scalesByField = new Map(fieldScales); + // Skip empty scales. + if (scalesByField.size === 0) + return []; + // Infer components. + const sort = (arr) => arr.sort(([a], [b]) => a.localeCompare(b)); + const components = Array.from(scalesByField) + .map(([, scs]) => { + const combinations = (0, array_1.combine)(scs).sort((a, b) => b.length - a.length); + const options = combinations.map((combination) => ({ + combination, + option: combination.map((scale) => [scale.name, getScaleType(scale)]), + })); + // For category legend. + for (const { option, combination } of options) { + // If every scale is constant, do not display legend. + if (option.every((d) => d[1] === 'constant')) + continue; + if (option.every((d) => d[1] === 'discrete' || d[1] === 'constant')) { + return ['legendCategory', combination]; + } + } + // For reset legend. + // @todo Remove this. + for (const [componentType, accords] of constant_1.LEGEND_INFER_STRATEGIES) { + for (const { option, combination } of options) { + if (accords.some((accord) => (0, util_1.isEqual)(sort(accord), sort(option)))) { + return [componentType, combination]; + } + } + } + return null; + }) + .filter(helper_1.defined); + return components; +} +function getScaleType(scale) { + const { type } = scale; + if (typeof type !== 'string') + return null; + if (type in scale_2.ContinuousScale) + return 'continuous'; + if (type in scale_2.DiscreteScale) + return 'discrete'; + if (type in scale_2.DistributionScale) + return 'distribution'; + if (type in scale_2.ConstantScale) + return 'constant'; + return null; +} +function inferAxisComponentType(scales, coordinates) { + return scales + .map((scale) => { + const { name } = scale; + // todo wait for gui provide helix axis + if ((0, coordinate_2.isHelix)(coordinates) || (0, coordinate_2.isTheta)(coordinates)) + return null; + if ((0, coordinate_2.isTranspose)(coordinates) && + ((0, coordinate_2.isPolar)(coordinates) || (0, coordinate_2.isRadial)(coordinates))) + return null; + // infer axis + if (name.startsWith('x')) { + if ((0, coordinate_2.isPolar)(coordinates)) + return ['axisArc', [scale]]; + if ((0, coordinate_2.isRadial)(coordinates)) + return ['axisLinear', [scale]]; + return [(0, coordinate_2.isTranspose)(coordinates) ? 'axisY' : 'axisX', [scale]]; + } + if (name.startsWith('y')) { + if ((0, coordinate_2.isPolar)(coordinates)) + return ['axisLinear', [scale]]; + if ((0, coordinate_2.isRadial)(coordinates)) + return ['axisArc', [scale]]; + return [(0, coordinate_2.isTranspose)(coordinates) ? 'axisX' : 'axisY', [scale]]; + } + // Only support linear axis for z. + if (name.startsWith('z')) { + return ['axisZ', [scale]]; + } + if (name.startsWith('position')) { + if ((0, coordinate_2.isRadar)(coordinates)) + return ['axisRadar', [scale]]; + if (!(0, coordinate_2.isPolar)(coordinates)) + return ['axisY', [scale]]; + } + return null; + }) + .filter(helper_1.defined); +} +function inferComponentsType(scales, coordinates) { + const availableScales = scales.filter((scale) => (0, scale_1.isValidScale)(scale)); + return [ + ...inferLegendComponentType(availableScales, coordinates), + ...inferAxisComponentType(availableScales, coordinates), + ]; +} +function angleOf(coordinates) { + const polar = (0, coordinate_2.coordOf)(coordinates, 'polar'); + if (polar.length) { + const lastPolar = polar[polar.length - 1]; + const { startAngle, endAngle } = (0, coordinate_1.getPolarOptions)(lastPolar); + return [startAngle, endAngle]; + } + const radial = (0, coordinate_2.coordOf)(coordinates, 'radial'); + if (radial.length) { + const lastRadial = radial[radial.length - 1]; + const { startAngle, endAngle } = (0, coordinate_1.getRadialOptions)(lastRadial); + return [startAngle, endAngle]; + } + return [-Math.PI / 2, (Math.PI / 2) * 3]; +} +/** + * match index of position + */ +function matchPosition(name) { + const match = /position(\d*)/g.exec(name); + if (!match) + return null; + return +match[1]; +} +function inferAxisPositionAndOrientation(type, ordinalPosition, relativeScales, scales, coordinates) { + // a axis only has one scale + const { name } = relativeScales[0]; + // todo, in current resolution, the radar chart is implement by parallel + polar coordinate. + // implementation plan to be confirmed. + // in current implementation, it must to add the first position encode to it's last. + // so we won't render the last axis repeatably. + if (type === 'axisRadar') { + const positions = scales.filter((scale) => scale.name.startsWith('position')); + const index = matchPosition(name); + if (index === null) + return [null, null]; + // infer radar axis orientation + const [startAngle, endAngle] = angleOf(coordinates); + const positionLength = (0, coordinate_2.isRadar)(coordinates) + ? positions.length + : positions.length - 1; + const angle = ((endAngle - startAngle) / positionLength) * index + startAngle; + return ['center', angle]; + } + if (type === 'axisY' && (0, coordinate_2.isParallel)(coordinates)) { + return (0, coordinate_2.isTranspose)(coordinates) + ? ['center', 'horizontal'] + : ['center', 'vertical']; + } + // in non-cartesian coordinate systems, infer the arc axis angle + if (type === 'axisLinear') { + const [startAngle] = angleOf(coordinates); + return ['center', startAngle]; + } + if (type === 'axisArc') { + if (ordinalPosition[0] === 'inner') + return ['inner', null]; + return ['outer', null]; + } + if ((0, coordinate_2.isPolar)(coordinates)) + return ['center', null]; + if ((0, coordinate_2.isRadial)(coordinates)) + return ['center', null]; + if ((type === 'axisX' && (0, coordinate_2.isReflect)(coordinates)) || + (type === 'axisX' && (0, coordinate_2.isReflectY)(coordinates))) { + return ['top', null]; + } + // if (type === 'axisX') return ['bottom', null]; + return ordinalPosition; +} +// @todo Infer position by coordinates. +function inferComponentPositionAndOrientation(type, defaultPosition, defaultOrientation, guide, relativeScales, scales, coordinates) { + const [startAngle] = angleOf(coordinates); + const ordinalPositionAndOrientation = [ + guide.position || defaultPosition, + startAngle !== null && startAngle !== void 0 ? startAngle : defaultOrientation, + ]; + if (typeof type === 'string' && type.startsWith('axis')) { + return inferAxisPositionAndOrientation(type, ordinalPositionAndOrientation, relativeScales, scales, coordinates); + } + if (typeof type === 'string' && + type.startsWith('legend') && + (0, coordinate_2.isPolar)(coordinates)) { + if (guide.position === 'center') + return ['center', 'vertical']; + } + // for general component, use default position + return ordinalPositionAndOrientation; +} +function inferScrollableType(name, type, coordinates = []) { + if (name === 'x') + return (0, coordinate_2.isTranspose)(coordinates) ? `${type}Y` : `${type}X`; + if (name === 'y') + return (0, coordinate_2.isTranspose)(coordinates) ? `${type}X` : `${type}Y`; + return null; +} +/** + * Infer scrollable components, such as slider and scrollbar. + */ +function inferScrollableComponents(partialOptions, scales, library) { + const [, createGuideComponent] = (0, library_1.useLibrary)('component', library); + const { coordinates } = partialOptions; + function normalized(type, channelName, scale, options) { + const componentType = inferScrollableType(channelName, type, coordinates); + if (!options || !componentType) + return; + const { props } = createGuideComponent(componentType); + const { defaultPosition, defaultSize, defaultOrder, defaultCrossPadding: [crossPadding], } = props; + return Object.assign(Object.assign({ position: defaultPosition, defaultSize, order: defaultOrder, type: componentType, crossPadding }, options), { scales: [scale] }); + } + return scales + .filter((d) => d.slider || d.scrollbar) + .flatMap((scale) => { + const { slider, scrollbar, name: channelName } = scale; + return [ + normalized('slider', channelName, scale, slider), + normalized('scrollbar', channelName, scale, scrollbar), + ]; + }) + .filter((d) => !!d); +} +// !!! Note Mutate component.size and component. +function computeComponentSize(component, crossSize, crossPadding, position, theme, library) { + // Only compute and update size of components in padding area. + const { type } = component; + const paddingAreas = ['left', 'right', 'bottom', 'top']; + if (!paddingAreas.includes(position)) + return; + if (typeof type !== 'string') + return; + const t = type; + const createCompute = () => { + if (t.startsWith('axis')) + return computeAxisSize; + if (t.startsWith('group')) + return computeGroupSize; + if (t.startsWith('legendContinuous')) + return computeContinuousLegendSize; + if (t === 'legendCategory') + return computeCategoryLegendSize; + if (t.startsWith('slider')) + return computeSliderSize; + if (t === 'title') + return computeTitleSize; + if (t.startsWith('scrollbar')) + return computeScrollbarSize; + return () => { }; + }; + return createCompute()(component, crossSize, crossPadding, position, theme, library); +} +exports.computeComponentSize = computeComponentSize; +function computeGroupSize(component, crossSize, crossPadding, position, theme, library) { + const { children } = component; + const maxCrossPadding = (0, d3_array_1.max)(children, (d) => d.crossPadding); + children.forEach((d) => (d.crossPadding = maxCrossPadding)); + children.forEach((child) => computeComponentSize(child, crossSize, crossPadding, position, theme, library)); + const maxSize = (0, d3_array_1.max)(children, (d) => d.size); + component.size = maxSize; + children.forEach((d) => (d.size = maxSize)); +} +function computeScrollbarSize(component, crossSize, crossPadding, position, theme, library) { + const { trackSize = 6 } = (0, util_1.deepMix)({}, theme.scrollbar, component); + component.size = trackSize; +} +function computeTitleSize(component, crossSize, crossPadding, position, theme, library) { + const _a = (0, util_1.deepMix)({}, theme.title, component), { title, subtitle, spacing = 0 } = _a, style = __rest(_a, ["title", "subtitle", "spacing"]); + if (title) { + const titleStyle = (0, helper_1.subObject)(style, 'title'); + const titleBBox = computeLabelSize(title, titleStyle); + component.size = titleBBox.height; + } + if (subtitle) { + const subtitleStyle = (0, helper_1.subObject)(style, 'subtitle'); + const subtitleBBox = computeLabelSize(subtitle, subtitleStyle); + component.size += spacing + subtitleBBox.height; + } +} +function computeSliderSize(component, crossSize, crossPadding, position, theme, library) { + const styleOf = () => { + const { slider } = theme; + return (0, util_1.deepMix)({}, slider, component); + }; + const { trackSize, handleIconSize } = styleOf(); + const size = Math.max(trackSize, handleIconSize * 2.4); + component.size = size; +} +function computeAxisSize(component, crossSize, crossPadding, position, theme, library) { + var _a; + // If padding is auto, use hide as the labelTransform by default + // to avoid overlap between labels. + component.transform = component.transform || [{ type: 'hide' }]; + // Vertical or horizontal. + const isVertical = position === 'left' || position === 'right'; + // Get styles to be applied. + const style = styleOf(component, position, theme); + const { tickLength = 0, labelSpacing = 0, titleSpacing = 0, labelAutoRotate } = style, rest = __rest(style, ["tickLength", "labelSpacing", "titleSpacing", "labelAutoRotate"]); + // Compute Labels. + const scale = createScale(component, library); + const labelBBoxes = computeLabelsBBox(rest, scale); + const paddingTick = tickLength + labelSpacing; + if (labelBBoxes && labelBBoxes.length) { + const maxLabelWidth = (0, d3_array_1.max)(labelBBoxes, (d) => d.width); + const maxLabelHeight = (0, d3_array_1.max)(labelBBoxes, (d) => d.height); + if (isVertical) { + component.size = maxLabelWidth + paddingTick; + } + else { + const { tickFilter, labelTransform } = component; + // If the labels can't be placed horizontally, and labelTransform is unset, + // rotate 90 deg to display them. + if (overflowX(scale, labelBBoxes, crossSize, crossPadding, tickFilter) && + !labelTransform && + labelAutoRotate !== false && + labelAutoRotate !== null) { + component.labelTransform = 'rotate(90)'; + component.size = maxLabelWidth + paddingTick; + } + else { + component.labelTransform = (_a = component.labelTransform) !== null && _a !== void 0 ? _a : 'rotate(0)'; + component.size = maxLabelHeight + paddingTick; + } + } + } + else { + component.size = tickLength; + } + // Compute title. + const titleBBox = computeTitleBBox(rest); + if (titleBBox) { + if (isVertical) { + component.size += titleSpacing + titleBBox.width; + } + else { + component.size += titleSpacing + titleBBox.height; + } + } +} +function computeContinuousLegendSize(component, crossSize, crossPadding, position, theme, library) { + // Get styles. + const styleOf = () => { + const { legendContinuous } = theme; + return (0, util_1.deepMix)({}, legendContinuous, component); + }; + const _a = styleOf(), { labelSpacing = 0, titleSpacing = 0 } = _a, rest = __rest(_a, ["labelSpacing", "titleSpacing"]); + // Vertical or horizontal. + const isVertical = position === 'left' || position === 'right'; + // Ribbon styles. + const ribbonStyles = (0, helper_1.subObject)(rest, 'ribbon'); + const { size: ribbonSize } = ribbonStyles; + const handleIconStyles = (0, helper_1.subObject)(rest, 'handleIcon'); + const { size: handleIconSize } = handleIconStyles; + const mainSize = Math.max(ribbonSize, handleIconSize * 2.4); + component.size = mainSize; + // Compute labels. + const scale = createScale(component, library); + const labelBBoxes = computeLabelsBBox(rest, scale); + if (labelBBoxes) { + const key = isVertical ? 'width' : 'height'; + const size = (0, d3_array_1.max)(labelBBoxes, (d) => d[key]); + component.size += size + labelSpacing; + } + // Compute title. + const titleBBox = computeTitleBBox(rest); + if (titleBBox) { + if (isVertical) { + component.size = Math.max(component.size, titleBBox.width); + } + else { + component.size += titleSpacing + titleBBox.height; + } + } +} +function computeCategoryLegendSize(component, crossSize0, crossPadding, position, theme, library) { + const styleOf = () => { + const { legendCategory } = theme; + const { title } = component; + const [defaultTitle, specifiedTitle] = Array.isArray(title) + ? [title, undefined] + : [undefined, title]; + return (0, util_1.deepMix)({ title: defaultTitle }, legendCategory, Object.assign(Object.assign({}, component), { title: specifiedTitle })); + }; + const _a = styleOf(), { itemSpacing, itemMarkerSize, titleSpacing, rowPadding, colPadding, maxCols = Infinity, maxRows = Infinity } = _a, rest = __rest(_a, ["itemSpacing", "itemMarkerSize", "titleSpacing", "rowPadding", "colPadding", "maxCols", "maxRows"]); + const { cols, length } = component; + const getRows = (rows) => Math.min(rows, maxRows); + const getCols = (cols) => Math.min(cols, maxCols); + // Vertical or horizontal. + const isVertical = position === 'left' || position === 'right'; + const crossSize = length === undefined + ? crossSize0 + (isVertical ? 0 : crossPadding[0] + crossPadding[1]) + : length; + // Compute title. + const titleBBox = computeTitleBBox(rest); + const scale = createScale(component, library); + const labelBBoxes = computeLabelsBBox(rest, scale, 'itemLabel'); + const height = Math.max(labelBBoxes[0].height, itemMarkerSize) + rowPadding; + const widthOf = (w, padding = 0) => itemMarkerSize + w + itemSpacing[0] + padding; + // Only support grid layout for vertical area. + const computeVerticalSize = () => { + let maxSize = -Infinity; + let pos = 0; + let cols = 1; + let rows = 0; + let maxRows = -Infinity; + let maxPos = -Infinity; + const titleHeight = titleBBox ? titleBBox.height : 0; + const maxHeight = crossSize - titleHeight; + for (const { width } of labelBBoxes) { + const w = widthOf(width, colPadding); + maxSize = Math.max(maxSize, w); + if (pos + height > maxHeight) { + cols++; + maxRows = Math.max(maxRows, rows); + maxPos = Math.max(maxPos, pos); + rows = 1; + pos = height; + } + else { + pos += height; + rows++; + } + } + if (cols <= 1) { + maxRows = rows; + maxPos = pos; + } + component.size = maxSize * getCols(cols); + component.length = maxPos + titleHeight; + (0, util_1.deepMix)(component, { cols: getCols(cols), gridRow: maxRows }); + }; + // Horizontal grid layout. + const computeHorizontalGrid = () => { + const rows = Math.ceil(labelBBoxes.length / cols); + const maxWidth = (0, d3_array_1.max)(labelBBoxes, (d) => widthOf(d.width)) * cols; + component.size = height * getRows(rows) - rowPadding; + component.length = Math.min(maxWidth, crossSize); + }; + // Horizontal flex layout. + const computeHorizontalFlex = () => { + let rows = 1; + let pos = 0; + let maxPos = -Infinity; + for (const { width } of labelBBoxes) { + const w = widthOf(width, colPadding); + if (pos + w > crossSize) { + maxPos = Math.max(maxPos, pos); + pos = w; + rows++; + } + else { + pos += w; + } + } + if (rows === 1) + maxPos = pos; + component.size = height * getRows(rows) - rowPadding; + component.length = maxPos; + }; + if (isVertical) + computeVerticalSize(); + else if (typeof cols === 'number') + computeHorizontalGrid(); + else + computeHorizontalFlex(); + // Compute titles. + if (titleBBox) { + if (isVertical) { + component.size = Math.max(component.size, titleBBox.width); + } + else { + component.size += titleSpacing + titleBBox.height; + } + } +} +function createScale(component, library) { + const [useScale] = (0, library_1.useLibrary)('scale', library); + // Init scale, the tickCount of axis has higher priority than scale. + const { scales, tickCount, tickMethod } = component; + const scaleOptions = scales.find((d) => d.type !== 'constant' && d.type !== 'identity'); + if (tickCount !== undefined) + scaleOptions.tickCount = tickCount; + if (tickMethod !== undefined) + scaleOptions.tickMethod = tickMethod; + return useScale(scaleOptions); +} +exports.createScale = createScale; +function computeLabelsBBox(component, scale, key = 'label') { + const { labelFormatter, tickFilter, label = true } = component, style = __rest(component, ["labelFormatter", "tickFilter", "label"]); + if (!label) + return null; + // Get labels to be rendered. + const labels = labelsOf(scale, labelFormatter, tickFilter); + const labelStyle = (0, helper_1.subObject)(style, key); + const labelStyles = labels.map((d, i) => Object.fromEntries(Object.entries(labelStyle).map(([key, value]) => [ + key, + typeof value === 'function' ? value(d, i) : value, + ]))); + const labelBBoxes = labels.map((d, i) => { + const normalizeStyle = labelStyles[i]; + return computeLabelSize(d, normalizeStyle); + }); + // Cache boxes to avoid computed twice. + // @todo GUI use untransformed bbox, so it can't cache if + // label.style has transform attributes. + const hasTransform = labelStyles.some((d) => d.transform); + if (!hasTransform) { + const I = labels.map((_, i) => i); + component.indexBBox = new Map(I.map((i) => [i, [labels[i], labelBBoxes[i]]])); + } + return labelBBoxes; +} +exports.computeLabelsBBox = computeLabelsBBox; +function computeTitleBBox(component) { + const isFalsy = (x) => x === false || x === null; + const { title } = component, style = __rest(component, ["title"]); + if (isFalsy(title) || title === undefined) + return null; + const titleStyle = (0, helper_1.subObject)(style, 'title'); + const { direction, transform } = titleStyle; + const titleText = Array.isArray(title) ? title.join(',') : title; + if (typeof titleText !== 'string') + return null; + const titleBBox = computeLabelSize(titleText, Object.assign(Object.assign({}, titleStyle), { transform: transform || (direction === 'vertical' ? 'rotate(-90)' : '') })); + return titleBBox; +} +exports.computeTitleBBox = computeTitleBBox; +function styleOf(axis, position, theme) { + const { title } = axis; + const [defaultTitle, specifiedTitle] = Array.isArray(title) + ? [title, undefined] + : [undefined, title]; + const { axis: baseStyle, + // @ts-ignore + [`axis${(0, helper_1.capitalizeFirst)(position)}`]: positionStyle, } = theme; + return (0, util_1.deepMix)({ title: defaultTitle }, baseStyle, positionStyle, Object.assign(Object.assign({}, axis), { title: specifiedTitle })); +} +exports.styleOf = styleOf; +function ticksOf(scale, tickFilter) { + const ticks = scale.getTicks ? scale.getTicks() : scale.getOptions().domain; + if (!tickFilter) + return ticks; + return ticks.filter(tickFilter); +} +function labelsOf(scale, labelFormatter, tickFilter) { + const T = ticksOf(scale, tickFilter); + const ticks = T.map((d) => (typeof d === 'number' ? (0, number_1.prettyNumber)(d) : d)); + const formatter = labelFormatter + ? typeof labelFormatter === 'string' + ? (0, d3_format_1.format)(labelFormatter) + : labelFormatter + : scale.getFormatter + ? scale.getFormatter() + : (d) => `${d}`; + return ticks.map(formatter); +} +function offsetOf(scale, d) { + if (!scale.getBandWidth) + return 0; + const offset = scale.getBandWidth(d) / 2; + return offset; +} +function overflowX(scale, labelBBoxes, crossSize, crossPadding, tickFilter) { + // If actual size bigger than container size, overflow. + const totalSize = (0, d3_array_1.sum)(labelBBoxes, (d) => d.width); + if (totalSize > crossSize) + return true; + // Clone scale to get visual position for labels. + const scaleX = scale.clone(); + scaleX.update({ range: [0, crossSize] }); + const ticks = ticksOf(scale, tickFilter); + const X = ticks.map((d) => scaleX.map(d) + offsetOf(scaleX, d)); + const I = ticks.map((_, i) => i); + const startX = -crossPadding[0]; + const endX = crossSize + crossPadding[1]; + const extent = (x, bbox) => { + const { width } = bbox; + return [x - width / 2, x + width / 2]; + }; + // Collision detection. + for (let i = 0; i < I.length; i++) { + const x = X[i]; + const [x0, x1] = extent(x, labelBBoxes[i]); + // If a label is out of plot area, overflow. + if (x0 < startX || x1 > endX) + return true; + const y = X[i + 1]; + if (y) { + // If two labels intersect, overflow. + const [y0] = extent(y, labelBBoxes[i + 1]); + if (x1 > y0) + return true; + } + } + return false; +} +function computeLabelSize(d, style) { + const shape = normalizeLabel(d); + const { filter } = style, rest = __rest(style, ["filter"]); + shape.attr(Object.assign(Object.assign({}, rest), { visibility: 'none' })); + const bbox = shape.getBBox(); + return bbox; +} +function normalizeLabel(d) { + if (d instanceof g_1.DisplayObject) + return d; + return new g_1.Text({ style: { text: `${d}` } }); +} +//# sourceMappingURL=component.js.map +}, function(modId) { var map = {"../coordinate":1751263815805,"../utils/array":1751263815830,"../utils/number":1751263815884,"../utils/helper":1751263815829,"../component/constant":1751263816095,"./coordinate":1751263816096,"./library":1751263816097,"./scale":1751263816114,"./types/scale":1751263816115}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816095, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LEGEND_INFER_STRATEGIES = void 0; +/** + * @examples + * ✅ + * color - `discrete`, shape - `constant` + * legendCategory.rule[27] is matched + * + * ❎ + * shape - `discrete`, size - `constant` + * There are no rules to match + * + */ +exports.LEGEND_INFER_STRATEGIES = [ + [ + 'legendCategory', + [ + [ + ['color', 'discrete'], + ['opacity', 'discrete'], + ['shape', 'discrete'], + ['size', 'constant'], + ], + [ + ['color', 'discrete'], + ['opacity', 'constant'], + ['shape', 'discrete'], + ['size', 'constant'], + ], + [ + ['color', 'discrete'], + ['opacity', 'discrete'], + ['shape', 'constant'], + ['size', 'constant'], + ], + [ + ['color', 'discrete'], + ['opacity', 'constant'], + ['shape', 'constant'], + ['size', 'constant'], + ], + [ + ['color', 'constant'], + ['opacity', 'discrete'], + ['shape', 'discrete'], + ['size', 'constant'], + ], + [ + ['color', 'constant'], + ['opacity', 'constant'], + ['shape', 'discrete'], + ['size', 'constant'], + ], + [ + ['color', 'constant'], + ['opacity', 'discrete'], + ['shape', 'constant'], + ['size', 'constant'], + ], + [ + ['color', 'discrete'], + ['shape', 'discrete'], + ['size', 'constant'], + ], + [ + ['color', 'discrete'], + ['opacity', 'discrete'], + ['shape', 'discrete'], + ], + [ + ['color', 'discrete'], + ['opacity', 'discrete'], + ['size', 'constant'], + ], + [ + ['color', 'discrete'], + ['opacity', 'constant'], + ['shape', 'discrete'], + ], + [ + ['color', 'discrete'], + ['opacity', 'constant'], + ['size', 'constant'], + ], + [ + ['color', 'discrete'], + ['shape', 'constant'], + ['size', 'constant'], + ], + [ + ['color', 'discrete'], + ['opacity', 'discrete'], + ['shape', 'constant'], + ], + [ + ['color', 'discrete'], + ['opacity', 'constant'], + ['shape', 'constant'], + ], + [ + ['color', 'constant'], + ['shape', 'discrete'], + ['size', 'constant'], + ], + [ + ['color', 'constant'], + ['opacity', 'discrete'], + ['shape', 'discrete'], + ], + [ + ['color', 'constant'], + ['opacity', 'discrete'], + ['size', 'constant'], + ], + [ + ['color', 'constant'], + ['opacity', 'constant'], + ['shape', 'discrete'], + ], + // [ + // ['color', 'constant'], + // ['opacity', 'constant'], + // ['size', 'constant'], + // ], + // [ + // ['color', 'constant'], + // ['shape', 'constant'], + // ['size', 'constant'], + // ], + [ + ['color', 'constant'], + ['opacity', 'discrete'], + ['shape', 'constant'], + ], + [ + ['color', 'discrete'], + ['shape', 'discrete'], + ], + [ + ['color', 'discrete'], + ['size', 'constant'], + ], + [ + ['color', 'discrete'], + ['opacity', 'discrete'], + ], + [ + ['color', 'discrete'], + ['opacity', 'constant'], + ], + [ + ['color', 'discrete'], + ['shape', 'constant'], + ], + [ + ['color', 'constant'], + ['shape', 'discrete'], + ], + [ + ['color', 'constant'], + ['size', 'constant'], + ], + [ + ['color', 'constant'], + ['opacity', 'discrete'], + ], + // [ + // ['color', 'constant'], + // ['opacity', 'constant'], + // ], + // [ + // ['color', 'constant'], + // ['shape', 'constant'], + // ], + [['color', 'discrete']], + // [['color', 'constant']], + ], + ], + [ + 'legendContinuousSize', + [ + [ + ['color', 'continuous'], + ['opacity', 'continuous'], + ['size', 'continuous'], + ], + [ + ['color', 'constant'], + ['opacity', 'continuous'], + ['size', 'continuous'], + ], + [ + ['color', 'continuous'], + ['size', 'continuous'], + ], + [ + ['color', 'constant'], + ['size', 'continuous'], + ], + [ + ['size', 'continuous'], + ['opacity', 'continuous'], + ], + [['size', 'continuous']], + ], + ], + [ + 'legendContinuousBlockSize', + [ + [ + ['color', 'distribution'], + ['opacity', 'distribution'], + ['size', 'distribution'], + ], + [ + ['color', 'distribution'], + ['size', 'distribution'], + ], + ], + ], + [ + 'legendContinuousBlock', + [ + [ + ['color', 'distribution'], + ['opacity', 'continuous'], + ], + [['color', 'distribution']], + ], + ], + [ + 'legendContinuous', + [ + [ + ['color', 'continuous'], + ['opacity', 'continuous'], + ], + [['color', 'continuous']], + [['opacity', 'continuous']], + ], + ], +]; +//# sourceMappingURL=constant.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816096, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isReflectY = exports.isRadar = exports.isRadial = exports.isReflect = exports.isTheta = exports.isParallel = exports.isTranspose = exports.isHelix = exports.isPolar = exports.coordOf = exports.coordinate2Transform = exports.createCoordinate = void 0; +const coord_1 = require("@antv/coord"); +const library_1 = require("./library"); +function createCoordinate(layout, partialOptions, library) { + const [useCoordinate] = (0, library_1.useLibrary)('coordinate', library); + const { innerHeight, innerWidth, insetLeft, insetTop, insetRight, insetBottom, } = layout; + const { coordinates: partialTransform = [] } = partialOptions; + const transform = inferCoordinate(partialTransform); + const isCartesian3D = transform[0].type === 'cartesian3D'; + const options = Object.assign(Object.assign({}, layout), { x: insetLeft, y: insetTop, width: innerWidth - insetLeft - insetRight, height: innerHeight - insetBottom - insetTop, transformations: transform.flatMap(useCoordinate) }); + const coordinate = isCartesian3D + ? // @ts-ignore + new coord_1.Coordinate3D(options) + : new coord_1.Coordinate(options); + return coordinate; +} +exports.createCoordinate = createCoordinate; +function coordinate2Transform(node, library) { + // @ts-ignore + const { coordinate = {}, coordinates } = node, rest = __rest(node, ["coordinate", "coordinates"]); + // If coordinates are already set, it means that the coordinate has been processed + // during the initialization. There is not need to process it during update. + if (coordinates) + return node; + const { type, transform = [] } = coordinate, options = __rest(coordinate, ["type", "transform"]); + if (!type) + return Object.assign(Object.assign({}, rest), { coordinates: transform }); + const [, createCoordinate] = (0, library_1.useLibrary)('coordinate', library); + const { transform: isTransform = false } = createCoordinate(type).props || {}; + if (isTransform) { + throw new Error(`Unknown coordinate: ${type}.`); + } + return Object.assign(Object.assign({}, rest), { coordinates: [Object.assign({ type }, options), ...transform] }); +} +exports.coordinate2Transform = coordinate2Transform; +function coordOf(coordinates, type) { + return coordinates.filter((d) => d.type === type); +} +exports.coordOf = coordOf; +/** + * todo Duplication is not considered + */ +function isPolar(coordinates) { + return coordOf(coordinates, 'polar').length > 0; +} +exports.isPolar = isPolar; +function isHelix(coordinates) { + return coordOf(coordinates, 'helix').length > 0; +} +exports.isHelix = isHelix; +/** + * todo The number of transposes matters + */ +function isTranspose(coordinates) { + return coordOf(coordinates, 'transpose').length % 2 === 1; +} +exports.isTranspose = isTranspose; +function isParallel(coordinates) { + return coordOf(coordinates, 'parallel').length > 0; +} +exports.isParallel = isParallel; +function isTheta(coordinates) { + return coordOf(coordinates, 'theta').length > 0; +} +exports.isTheta = isTheta; +function isReflect(coordinates) { + return coordOf(coordinates, 'reflect').length > 0; +} +exports.isReflect = isReflect; +function isRadial(coordinates) { + return coordOf(coordinates, 'radial').length > 0; +} +exports.isRadial = isRadial; +function isRadar(coordinates) { + return coordOf(coordinates, 'radar').length > 0; +} +exports.isRadar = isRadar; +/** + * todo The axis corresponding to the Y reversal is not reversed + */ +function isReflectY(coordinates) { + return coordOf(coordinates, 'reflectY').length > 0; +} +exports.isReflectY = isReflectY; +function inferCoordinate(coordinates) { + if (coordinates.find((d) => d.type === 'cartesian' || d.type === 'cartesian3D')) + return coordinates; + return [...coordinates, { type: 'cartesian' }]; +} +//# sourceMappingURL=coordinate.js.map +}, function(modId) { var map = {"./library":1751263816097}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816097, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.documentOf = exports.useLibrary = void 0; +const helper_1 = require("../utils/helper"); +const builtinlib_1 = require("../lib/builtinlib"); +function useLibrary(namespace, publicLibrary) { + const library = Object.assign(Object.assign({}, (0, builtinlib_1.builtinlib)()), publicLibrary); + const create = (type) => { + if (typeof type !== 'string') + return type; + const key = `${namespace}.${type}`; + return library[key] || (0, helper_1.error)(`Unknown Component: ${key}`); + }; + const use = (options, context) => { + const { type } = options, rest = __rest(options, ["type"]); + if (!type) + (0, helper_1.error)(`Plot type is required!`); + const currentLibrary = create(type); + return currentLibrary === null || currentLibrary === void 0 ? void 0 : currentLibrary(rest, context); + }; + return [use, create]; +} +exports.useLibrary = useLibrary; +function documentOf(library) { + const { canvas, group } = library; + return ((canvas === null || canvas === void 0 ? void 0 : canvas.document) || + (group === null || group === void 0 ? void 0 : group.ownerDocument) || + (0, helper_1.error)(`Cannot find library document`)); +} +exports.documentOf = documentOf; +//# sourceMappingURL=library.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../lib/builtinlib":1751263816098}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816098, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.builtinlib = void 0; +const component_1 = require("../component"); +const composition_1 = require("../composition"); +const shape_1 = require("../shape"); +const event_1 = require("../interaction/event"); +// Some private visual components, they are not public to +// users, only for runtime. +function builtinlib() { + return { + 'component.axisRadar': component_1.AxisRadar, + 'component.axisLinear': component_1.AxisLinear, + 'component.axisArc': component_1.AxisArc, + 'component.legendContinuousBlock': component_1.LegendContinuousBlock, + 'component.legendContinuousBlockSize': component_1.LegendContinuousBlockSize, + 'component.legendContinuousSize': component_1.LegendContinuousSize, + 'interaction.event': event_1.Event, + 'composition.mark': composition_1.Mark, + 'composition.view': composition_1.View, + 'shape.label.label': shape_1.LabelShape, + }; +} +exports.builtinlib = builtinlib; +//# sourceMappingURL=builtinlib.js.map +}, function(modId) { var map = {"../component":1751263816043,"../composition":1751263816099,"../shape":1751263815879,"../interaction/event":1751263816113}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816099, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GeoView = exports.GeoPath = exports.TimingKeyframe = exports.FacetCircle = exports.RepeatMatrix = exports.FacetRect = exports.Mark = exports.View = exports.SpaceFlex = exports.SpaceLayer = void 0; +var spaceLayer_1 = require("./spaceLayer"); +Object.defineProperty(exports, "SpaceLayer", { enumerable: true, get: function () { return spaceLayer_1.SpaceLayer; } }); +var spaceFlex_1 = require("./spaceFlex"); +Object.defineProperty(exports, "SpaceFlex", { enumerable: true, get: function () { return spaceFlex_1.SpaceFlex; } }); +var view_1 = require("./view"); +Object.defineProperty(exports, "View", { enumerable: true, get: function () { return view_1.View; } }); +var mark_1 = require("./mark"); +Object.defineProperty(exports, "Mark", { enumerable: true, get: function () { return mark_1.Mark; } }); +var facetRect_1 = require("./facetRect"); +Object.defineProperty(exports, "FacetRect", { enumerable: true, get: function () { return facetRect_1.FacetRect; } }); +var repeatMatrix_1 = require("./repeatMatrix"); +Object.defineProperty(exports, "RepeatMatrix", { enumerable: true, get: function () { return repeatMatrix_1.RepeatMatrix; } }); +var facetCircle_1 = require("./facetCircle"); +Object.defineProperty(exports, "FacetCircle", { enumerable: true, get: function () { return facetCircle_1.FacetCircle; } }); +var timingKeyframe_1 = require("./timingKeyframe"); +Object.defineProperty(exports, "TimingKeyframe", { enumerable: true, get: function () { return timingKeyframe_1.TimingKeyframe; } }); +var geoPath_1 = require("./geoPath"); +Object.defineProperty(exports, "GeoPath", { enumerable: true, get: function () { return geoPath_1.GeoPath; } }); +var geoView_1 = require("./geoView"); +Object.defineProperty(exports, "GeoView", { enumerable: true, get: function () { return geoView_1.GeoView; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./spaceLayer":1751263816100,"./spaceFlex":1751263816102,"./view":1751263816103,"./mark":1751263816104,"./facetRect":1751263816105,"./repeatMatrix":1751263816107,"./facetCircle":1751263816108,"./timingKeyframe":1751263816109,"./geoPath":1751263816110,"./geoView":1751263816111}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816100, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SpaceLayer = void 0; +const utils_1 = require("./utils"); +/** + * @todo Propagate more options to children. + */ +const SpaceLayer = () => { + return (options) => { + const { children } = options; + if (!Array.isArray(children)) + return []; + const { x: viewX = 0, y: viewY = 0, width: viewWidth, height: viewHeight, data: layerData, } = options; + return children.map((_a) => { + var { data, x, y, width, height } = _a, rest = __rest(_a, ["data", "x", "y", "width", "height"]); + return (Object.assign(Object.assign({}, rest), { data: (0, utils_1.mergeData)(data, layerData), x: x !== null && x !== void 0 ? x : viewX, y: y !== null && y !== void 0 ? y : viewY, width: width !== null && width !== void 0 ? width : viewWidth, height: height !== null && height !== void 0 ? height : viewHeight })); + }); + }; +}; +exports.SpaceLayer = SpaceLayer; +exports.SpaceLayer.props = {}; +//# sourceMappingURL=spaceLayer.js.map +}, function(modId) { var map = {"./utils":1751263816101}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816101, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.mergeData = exports.isObject = exports.useOverrideAdaptor = exports.useDefaultAdaptor = void 0; +const util_1 = require("@antv/util"); +/** + * Adaptor return default options for raw options. + */ +function useDefaultAdaptor(adaptor) { + return (options, ...rest) => (0, util_1.deepMix)({}, adaptor(options, ...rest), options); +} +exports.useDefaultAdaptor = useDefaultAdaptor; +/** + * Adaptor return options override raw options. + */ +function useOverrideAdaptor(adaptor) { + return (options, ...rest) => (0, util_1.deepMix)({}, options, adaptor(options, ...rest)); +} +exports.useOverrideAdaptor = useOverrideAdaptor; +function isObject(d) { + if (d instanceof Date) + return false; + return typeof d === 'object'; +} +exports.isObject = isObject; +function mergeData(dataDescriptor, dataValue) { + if (!dataDescriptor) + return dataValue; + if (Array.isArray(dataDescriptor)) + return dataDescriptor; + if (isObject(dataDescriptor)) { + const { value = dataValue } = dataDescriptor, rest = __rest(dataDescriptor, ["value"]); + return Object.assign(Object.assign({}, rest), { value }); + } + return dataDescriptor; +} +exports.mergeData = mergeData; +//# sourceMappingURL=utils.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816102, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SpaceFlex = void 0; +const utils_1 = require("./utils"); +/** + * @todo Propagate more options to children. + */ +const SpaceFlex = () => { + return (options) => { + const { children } = options; + if (!Array.isArray(children)) + return []; + const { direction = 'row', ratio = children.map(() => 1), padding = 0, data: flexData, } = options; + const [mainStart, mainSize, crossSize, crossStart] = direction === 'col' + ? ['y', 'height', 'width', 'x'] + : ['x', 'width', 'height', 'y']; + const sum = ratio.reduce((total, value) => total + value); + const totalSize = options[mainSize] - padding * (children.length - 1); + const sizes = ratio.map((value) => totalSize * (value / sum)); + const newChildren = []; + let next = options[mainStart] || 0; + for (let i = 0; i < sizes.length; i += 1) { + const _a = children[i], { data } = _a, rest = __rest(_a, ["data"]); + const newData = (0, utils_1.mergeData)(data, flexData); + newChildren.push(Object.assign({ [mainStart]: next, [mainSize]: sizes[i], [crossStart]: options[crossStart] || 0, [crossSize]: options[crossSize], data: newData }, rest)); + next += sizes[i] + padding; + } + return newChildren; + }; +}; +exports.SpaceFlex = SpaceFlex; +exports.SpaceFlex.props = {}; +//# sourceMappingURL=spaceFlex.js.map +}, function(modId) { var map = {"./utils":1751263816101}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816103, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.View = void 0; +const util_1 = require("@antv/util"); +const utils_1 = require("./utils"); +/** + * @todo Propagate more options to children.(e.g. filter) + * @todo Propagate encode options to children. This is useful for Matrix composition. + * @todo Move this to runtime, do not treat it as a composition to cause confusion. + */ +const View = () => { + return (options) => { + const { children } = options, restOptions = __rest(options, ["children"]); + if (!Array.isArray(children)) + return []; + const { data: viewData, scale: viewScale = {}, axis: viewAxis = {}, legend: viewLegend = {}, encode: viewEncode = {}, transform: viewTransform = [] } = restOptions, rest = __rest(restOptions, ["data", "scale", "axis", "legend", "encode", "transform"]); + const marks = children.map((_a) => { + var { data, scale = {}, axis = {}, legend = {}, encode = {}, transform = [] } = _a, rest = __rest(_a, ["data", "scale", "axis", "legend", "encode", "transform"]); + return (Object.assign({ data: (0, utils_1.mergeData)(data, viewData), scale: (0, util_1.deepMix)({}, viewScale, scale), encode: (0, util_1.deepMix)({}, viewEncode, encode), transform: [...viewTransform, ...transform], axis: axis && viewAxis ? (0, util_1.deepMix)({}, viewAxis, axis) : false, legend: legend && viewLegend ? (0, util_1.deepMix)({}, viewLegend, legend) : false }, rest)); + }); + return [Object.assign(Object.assign({}, rest), { marks, type: 'standardView' })]; + }; +}; +exports.View = View; +exports.View.props = {}; +//# sourceMappingURL=view.js.map +}, function(modId) { var map = {"./utils":1751263816101}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816104, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Mark = void 0; +// @todo Move this to runtime. +const Mark = ({ static: isStatic = false, } = {}) => { + return (options) => { + const { width, height, depth, paddingLeft, paddingRight, paddingTop, paddingBottom, padding, inset, insetLeft, insetTop, insetRight, insetBottom, margin, marginLeft, marginBottom, marginTop, marginRight, data, coordinate, theme, component, interaction, x, y, z, key, frame, labelTransform, parentKey, clip, viewStyle, title } = options, mark = __rest(options, ["width", "height", "depth", "paddingLeft", "paddingRight", "paddingTop", "paddingBottom", "padding", "inset", "insetLeft", "insetTop", "insetRight", "insetBottom", "margin", "marginLeft", "marginBottom", "marginTop", "marginRight", "data", "coordinate", "theme", "component", "interaction", "x", "y", "z", "key", "frame", "labelTransform", "parentKey", "clip", "viewStyle", "title"]); + return [ + Object.assign(Object.assign({ type: 'standardView', x, + y, + z, + key, + width, + height, + depth, + padding, + paddingLeft, + paddingRight, + paddingTop, + inset, + insetLeft, + insetTop, + insetRight, + insetBottom, + paddingBottom, + theme, + coordinate, + component, + interaction, + frame, + labelTransform, + margin, + marginLeft, + marginBottom, + marginTop, + marginRight, + parentKey, + clip, style: viewStyle }, (!isStatic && { title })), { marks: [Object.assign(Object.assign(Object.assign({}, mark), { key: `${key}-0`, data }), (isStatic && { title }))] }), + ]; + }; +}; +exports.Mark = Mark; +exports.Mark.props = {}; +//# sourceMappingURL=mark.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816105, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FacetRect = exports.createInnerGuide = exports.setChildren = exports.setData = exports.toCell = exports.setStyle = exports.setAnimation = exports.inferColor = void 0; +const util_1 = require("@antv/util"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const vector_1 = require("../utils/vector"); +const container_1 = require("../utils/container"); +const array_1 = require("../utils/array"); +const utils_1 = require("./utils"); +const setScale = (0, utils_1.useDefaultAdaptor)((options) => { + const { encode, data, scale, shareSize = false } = options; + const { x, y } = encode; + const flexDomain = (encode, channel) => { + var _a; + if (encode === undefined || !shareSize) + return {}; + const groups = (0, d3_array_1.group)(data, (d) => d[encode]); + const domain = ((_a = scale === null || scale === void 0 ? void 0 : scale[channel]) === null || _a === void 0 ? void 0 : _a.domain) || Array.from(groups.keys()); + const flex = domain.map((key) => { + if (!groups.has(key)) + return 1; + return groups.get(key).length; + }); + return { domain, flex }; + }; + return { + scale: { + x: Object.assign(Object.assign({ paddingOuter: 0, paddingInner: 0.1, guide: x === undefined ? null : { position: 'top' } }, (x === undefined && { paddingInner: 0 })), flexDomain(x, 'x')), + y: Object.assign(Object.assign({ range: [0, 1], paddingOuter: 0, paddingInner: 0.1, guide: y === undefined ? null : { position: 'right' } }, (y === undefined && { paddingInner: 0 })), flexDomain(y, 'y')), + }, + }; +}); +/** + * BFS view tree and using the last discovered color encode + * as the top-level encode for this plot. This is useful when + * color encode and color scale is specified in mark node. + * It makes sense because the whole facet should shared the same + * color encoding, but it also can be override with explicity + * encode and scale specification. + */ +exports.inferColor = (0, utils_1.useOverrideAdaptor)((options) => { + const { data, scale, legend } = options; + const discovered = [options]; + let encodeColor; + let scaleColor; + let legendColor; + while (discovered.length) { + const node = discovered.shift(); + const { children, encode = {}, scale = {}, legend = {} } = node; + const { color: c } = encode; + const { color: cs } = scale; + const { color: cl } = legend; + if (c !== undefined) + encodeColor = c; + if (cs !== undefined) + scaleColor = cs; + if (cl !== undefined) + legendColor = cl; + if (Array.isArray(children)) { + discovered.push(...children); + } + } + const domainColor = () => { + var _a; + const domain = (_a = scale === null || scale === void 0 ? void 0 : scale.color) === null || _a === void 0 ? void 0 : _a.domain; + if (domain !== undefined) + return [domain]; + if (encodeColor === undefined) + return [undefined]; + const color = typeof encodeColor === 'function' ? encodeColor : (d) => d[encodeColor]; + const values = data.map(color); + if (values.some((d) => typeof d === 'number')) + return [(0, d3_array_1.extent)(values)]; + return [Array.from(new Set(values)), 'ordinal']; + }; + const title = typeof encodeColor === 'string' ? encodeColor : ''; + const [domain, type] = domainColor(); + return Object.assign({ encode: { color: { type: 'column', value: domain !== null && domain !== void 0 ? domain : [] } }, scale: { color: (0, util_1.deepMix)({}, scaleColor, { domain, type }) } }, (legend === undefined && { + legend: { color: (0, util_1.deepMix)({ title }, legendColor) }, + })); +}); +exports.setAnimation = (0, utils_1.useDefaultAdaptor)(() => ({ + animate: { + enterType: 'fadeIn', + }, +})); +exports.setStyle = (0, utils_1.useOverrideAdaptor)(() => ({ + frame: false, + encode: { + shape: 'hollow', + }, + style: { + lineWidth: 0, + }, +})); +exports.toCell = (0, utils_1.useOverrideAdaptor)(() => ({ + type: 'cell', +})); +/** + * Do not set cell data directly, the children will get wrong do if do + * so. Use transform to set new data. + **/ +exports.setData = (0, utils_1.useOverrideAdaptor)((options) => { + const { data } = options; + const connector = { + type: 'custom', + callback: () => { + const { data, encode } = options; + const { x, y } = encode; + const X = x ? Array.from(new Set(data.map((d) => d[x]))) : []; + const Y = y ? Array.from(new Set(data.map((d) => d[y]))) : []; + const cellData = () => { + if (X.length && Y.length) { + const cellData = []; + for (const vx of X) { + for (const vy of Y) { + cellData.push({ [x]: vx, [y]: vy }); + } + } + return cellData; + } + if (X.length) + return X.map((d) => ({ [x]: d })); + if (Y.length) + return Y.map((d) => ({ [y]: d })); + }; + return cellData(); + }, + }; + return { + data: { type: 'inline', value: data, transform: [connector] }, + }; +}); +/** + * @todo Move some options assignment to runtime. + */ +exports.setChildren = (0, utils_1.useOverrideAdaptor)((options, subLayout = subLayoutRect, createGuideX = createGuideXRect, createGuideY = createGuideYRect, childOptions = {}) => { + const { data: dataValue, encode, children, scale: facetScale, x: originX = 0, y: originY = 0, shareData = false, key: viewKey, } = options; + const { value: data } = dataValue; + // Only support field encode now. + const { x: encodeX, y: encodeY } = encode; + const { color: facetScaleColor } = facetScale; + const { domain: facetDomainColor } = facetScaleColor; + const createChildren = (visualData, scale, layout) => { + const { x: scaleX, y: scaleY } = scale; + const { paddingLeft, paddingTop, marginLeft, marginTop } = layout; + const { domain: domainX } = scaleX.getOptions(); + const { domain: domainY } = scaleY.getOptions(); + const index = (0, array_1.indexOf)(visualData); + const bboxs = visualData.map(subLayout); + const values = visualData.map(({ x, y }) => [ + scaleX.invert(x), + scaleY.invert(y), + ]); + const filters = values.map(([fx, fy]) => (d) => { + const { [encodeX]: x, [encodeY]: y } = d; + const inX = encodeX !== undefined ? x === fx : true; + const inY = encodeY !== undefined ? y === fy : true; + return inX && inY; + }); + const facetData2d = filters.map((f) => data.filter(f)); + const maxDataDomain = shareData + ? (0, d3_array_1.max)(facetData2d, (data) => data.length) + : undefined; + const facets = values.map(([fx, fy]) => ({ + columnField: encodeX, + columnIndex: domainX.indexOf(fx), + columnValue: fx, + columnValuesLength: domainX.length, + rowField: encodeY, + rowIndex: domainY.indexOf(fy), + rowValue: fy, + rowValuesLength: domainY.length, + })); + const normalizedChildren = facets.map((facet) => { + if (Array.isArray(children)) + return children; + return [children(facet)].flat(1); + }); + return index.flatMap((i) => { + const [left, top, width, height] = bboxs[i]; + const facet = facets[i]; + const facetData = facetData2d[i]; + const children = normalizedChildren[i]; + return children.map((_a) => { + var _b, _c; + var { scale, key, facet: isFacet = true, axis = {}, legend = {} } = _a, rest = __rest(_a, ["scale", "key", "facet", "axis", "legend"]); + const guideY = ((_b = scale === null || scale === void 0 ? void 0 : scale.y) === null || _b === void 0 ? void 0 : _b.guide) || axis.y; + const guideX = ((_c = scale === null || scale === void 0 ? void 0 : scale.x) === null || _c === void 0 ? void 0 : _c.guide) || axis.x; + const defaultScale = { + x: { tickCount: encodeX ? 5 : undefined }, + y: { tickCount: encodeY ? 5 : undefined }, + }; + const newData = isFacet + ? facetData + : facetData.length === 0 + ? [] + : data; + const newScale = { + color: { domain: facetDomainColor }, + }; + const newAxis = { + x: createGuide(guideX, createGuideX)(facet, newData), + y: createGuide(guideY, createGuideY)(facet, newData), + }; + return Object.assign(Object.assign({ key: `${key}-${i}`, data: newData, margin: 0, x: left + paddingLeft + originX + marginLeft, y: top + paddingTop + originY + marginTop, parentKey: viewKey, width, + height, paddingLeft: 0, paddingRight: 0, paddingTop: 0, paddingBottom: 0, frame: newData.length ? true : false, dataDomain: maxDataDomain, scale: (0, util_1.deepMix)(defaultScale, scale, newScale), axis: (0, util_1.deepMix)({}, axis, newAxis), + // Hide all legends for child mark by default, + // they are displayed in the top-level. + legend: false }, rest), childOptions); + }); + }); + }; + return { + children: createChildren, + }; +}); +function subLayoutRect(data) { + const { points } = data; + return (0, vector_1.calcBBox)(points); +} +/** + * Inner guide not show title, tickLine, label and subTickLine, + * if data is empty, do not show guide. + */ +function createInnerGuide(guide, data) { + return data.length + ? (0, util_1.deepMix)({ + title: false, + tick: null, + label: null, + }, guide) + : (0, util_1.deepMix)({ + title: false, + tick: null, + label: null, + grid: null, + }, guide); +} +exports.createInnerGuide = createInnerGuide; +function createGuideXRect(guide) { + return (facet, data) => { + const { rowIndex, rowValuesLength, columnIndex, columnValuesLength } = facet; + // Only the bottom-most facet show axisX. + if (rowIndex !== rowValuesLength - 1) + return createInnerGuide(guide, data); + // Only the bottom-left facet show title. + const title = columnIndex !== columnValuesLength - 1 ? false : undefined; + // If data is empty, do not show cell. + const grid = data.length ? undefined : null; + return (0, util_1.deepMix)({ title, grid }, guide); + }; +} +function createGuideYRect(guide) { + return (facet, data) => { + const { rowIndex, columnIndex } = facet; + // Only the left-most facet show axisY. + if (columnIndex !== 0) + return createInnerGuide(guide, data); + // Only the left-top facet show title. + const title = rowIndex !== 0 ? false : undefined; + // If data is empty, do not show cell. + const grid = data.length ? undefined : null; + return (0, util_1.deepMix)({ title, grid }, guide); + }; +} +function createGuide(guide, factory) { + if (typeof guide === 'function') + return guide; + if (guide === null || guide === false) + return () => null; + return factory(guide); +} +const FacetRect = () => { + return (options) => { + const newOptions = container_1.Container.of(options) + .call(exports.toCell) + .call(exports.inferColor) + .call(exports.setAnimation) + .call(setScale) + .call(exports.setStyle) + .call(exports.setData) + .call(exports.setChildren) + .value(); + return [newOptions]; + }; +}; +exports.FacetRect = FacetRect; +exports.FacetRect.props = {}; +//# sourceMappingURL=facetRect.js.map +}, function(modId) { var map = {"../utils/vector":1751263815873,"../utils/container":1751263816106,"../utils/array":1751263815830,"./utils":1751263816101}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816106, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Container = void 0; +class Container { + constructor(x) { + this.$value = x; + } + static of(x) { + return new Container(x); + } + call(f, ...rest) { + return (this.$value = f(this.$value, ...rest)), this; + } + value() { + return this.$value; + } +} +exports.Container = Container; +//# sourceMappingURL=container.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816107, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RepeatMatrix = void 0; +const util_1 = require("@antv/util"); +const container_1 = require("../utils/container"); +const vector_1 = require("../utils/vector"); +const array_1 = require("../utils/array"); +const facetRect_1 = require("./facetRect"); +const utils_1 = require("./utils"); +const setScale = (0, utils_1.useDefaultAdaptor)((options) => { + return { + scale: { + x: { guide: null, paddingOuter: 0, paddingInner: 0.1 }, + y: { guide: null, range: [0, 1], paddingOuter: 0, paddingInner: 0.1 }, + }, + }; +}); +const setChildren = (0, utils_1.useOverrideAdaptor)((options) => { + const { data, children, x: originX = 0, y: originY = 0, key: viewKey, } = options; + const createChildren = (visualData, scale, layout) => { + const { x: scaleX, y: scaleY } = scale; + const { paddingLeft, paddingTop, marginLeft, marginTop } = layout; + const { domain: domainX } = scaleX.getOptions(); + const { domain: domainY } = scaleY.getOptions(); + const index = (0, array_1.indexOf)(visualData); + const bboxs = visualData.map(({ points }) => (0, vector_1.calcBBox)(points)); + const values = visualData.map(({ x, y }) => [ + scaleX.invert(x), + scaleY.invert(y), + ]); + const facets = values.map(([fx, fy]) => ({ + columnField: fx, + columnIndex: domainX.indexOf(fx), + columnValue: fx, + columnValuesLength: domainX.length, + rowField: fy, + rowIndex: domainY.indexOf(fy), + rowValue: fy, + rowValuesLength: domainY.length, + })); + const normalizedChildren = facets.map((facet) => { + if (Array.isArray(children)) + return children; + return [children(facet)].flat(1); + }); + return index.flatMap((i) => { + const [left, top, width, height] = bboxs[i]; + const [fx, fy] = values[i]; + const facet = facets[i]; + const children = normalizedChildren[i]; + return children.map((d) => { + var _a, _b; + const { scale, key, encode, axis, interaction } = d, rest = __rest(d, ["scale", "key", "encode", "axis", "interaction"]); + const guideY = (_a = scale === null || scale === void 0 ? void 0 : scale.y) === null || _a === void 0 ? void 0 : _a.guide; + const guideX = (_b = scale === null || scale === void 0 ? void 0 : scale.x) === null || _b === void 0 ? void 0 : _b.guide; + const defaultScale = { + // Do not sync position scales among facets by default. + x: { facet: false }, + // Do not sync position scales among facets by default. + y: { facet: false }, + }; + const newAxis = { + x: createGuideX(guideX)(facet, data), + y: createGuideY(guideY)(facet, data), + }; + const defaultAxis = { + x: { tickCount: 5 }, + y: { tickCount: 5 }, + }; + return Object.assign({ data, parentKey: viewKey, key: `${key}-${i}`, x: left + paddingLeft + originX + marginLeft, y: top + paddingTop + originY + marginTop, width, + height, margin: 0, paddingLeft: 0, paddingRight: 0, paddingTop: 0, paddingBottom: 0, frame: true, scale: (0, util_1.deepMix)(defaultScale, scale), axis: (0, util_1.deepMix)(defaultAxis, axis, newAxis), + // Hide all legends for child mark by default, + // they are displayed in the top-level. + legend: false, encode: (0, util_1.deepMix)({}, encode, { + x: fx, + y: fy, + }), interaction: (0, util_1.deepMix)({}, interaction, { + // Register this interaction in parent node. + legendFilter: false, + }) }, rest); + }); + }); + }; + return { + children: createChildren, + }; +}); +/** + * @todo Use transform instead of override data directly. + */ +const setData = (0, utils_1.useOverrideAdaptor)((options) => { + const { encode } = options, rest = __rest(options, ["encode"]); + const { position: P = [], x: X = P, y: Y = [...P].reverse() } = encode, restEncode = __rest(encode, ["position", "x", "y"]); + const data = []; + for (const $x of [X].flat(1)) { + for (const $y of [Y].flat(1)) { + data.push({ $x, $y }); + } + } + return Object.assign(Object.assign({}, rest), { data, encode: Object.assign(Object.assign({}, restEncode), { x: '$x', y: '$y' }), scale: Object.assign(Object.assign({}, ([X].flat(1).length === 1 && { x: { paddingInner: 0 } })), ([Y].flat(1).length === 1 && { y: { paddingInner: 0 } })) }); +}); +function createGuideX(guideX) { + if (typeof guideX === 'function') + return guideX; + if (guideX === null) + return () => null; + return (facet, data) => { + const { rowIndex, rowValuesLength } = facet; + // Only the bottom-most facet show axisX. + if (rowIndex !== rowValuesLength - 1) + return (0, facetRect_1.createInnerGuide)(guideX, data); + }; +} +function createGuideY(guideY) { + if (typeof guideY === 'function') + return guideY; + if (guideY === null) + return () => null; + return (facet, data) => { + const { columnIndex } = facet; + // Only the left-most facet show axisY. + if (columnIndex !== 0) + return (0, facetRect_1.createInnerGuide)(guideY, data); + }; +} +/** + * @todo Layout mode: layer, row, col... + * @todo Specify show axis or not. + */ +const RepeatMatrix = () => { + return (options) => { + const newOptions = container_1.Container.of(options) + .call(facetRect_1.toCell) + .call(facetRect_1.inferColor) + .call(setChildren) + .call(setData) + .call(facetRect_1.setAnimation) + .call(facetRect_1.setStyle) + .call(setScale) + .value(); + return [newOptions]; + }; +}; +exports.RepeatMatrix = RepeatMatrix; +//# sourceMappingURL=repeatMatrix.js.map +}, function(modId) { var map = {"../utils/container":1751263816106,"../utils/vector":1751263815873,"../utils/array":1751263815830,"./facetRect":1751263816105,"./utils":1751263816101}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816108, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FacetCircle = void 0; +const container_1 = require("../utils/container"); +const vector_1 = require("../utils/vector"); +const facetRect_1 = require("./facetRect"); +const utils_1 = require("./utils"); +const setScale = (0, utils_1.useDefaultAdaptor)((options) => { + return { + scale: { + x: { guide: { type: 'axisArc' }, paddingOuter: 0, paddingInner: 0.1 }, + y: { guide: null, range: [0, 1], paddingOuter: 0, paddingInner: 0.1 }, + }, + }; +}); +const setCoordinate = (0, utils_1.useDefaultAdaptor)((options) => { + return { + coordinate: { type: 'polar' }, + }; +}); +const setEncode = (options) => { + const { encode } = options, rest = __rest(options, ["encode"]); + const { position } = encode; + return Object.assign(Object.assign({}, rest), { encode: { x: position } }); +}; +/** + * Every facet should do not show both axisX and axisY by default. + */ +function createGuideFacetCircle(guide) { + return (facet) => null; +} +/** + * Use the inscribed circle of the sector as the + * circumscribed circle of the new bbox. + */ +function subLayoutFacetCircle(data) { + const { points } = data; + const [p0, p1, p2, p3] = points; + const sr = (0, vector_1.dist)(p0, p3); // radius of sector + const v0 = (0, vector_1.sub)(p0, p3); + const v1 = (0, vector_1.sub)(p1, p2); + const a01 = (0, vector_1.angleBetween)(v0, v1); + // sr = ir + ir / sin(theta/2) + const t = 1 / Math.sin(a01 / 2); + const ir = sr / (1 + t); // radius of inscribed circle + const s = ir * Math.sqrt(2); // size of the bbox. + // This assume the innerRadius of polar is 0. + // @todo Compute the right origin if it's not 0, + // or maybe pass the coordinates to get the right center. + const [x0, y0] = p2; + const a0 = (0, vector_1.angleWithQuadrant)(v0); + const a3 = a0 + a01 / 2; + const d = ir * t; + const cx = x0 + d * Math.sin(a3); // center x of inscribed circle + const cy = y0 - d * Math.cos(a3); // center y of inscribed circle + return [cx - s / 2, cy - s / 2, s, s]; +} +/** + * @todo Pack. + */ +const FacetCircle = () => { + return (options) => { + const newOptions = container_1.Container.of(options) + .call(facetRect_1.toCell) + .call(setEncode) + .call(facetRect_1.inferColor) + .call(setCoordinate) + .call(facetRect_1.setData) + .call(facetRect_1.setChildren, subLayoutFacetCircle, createGuideFacetCircle, createGuideFacetCircle, { frame: false }) + .call(facetRect_1.setAnimation) + .call(facetRect_1.setStyle) + .call(setScale) + .value(); + return [newOptions]; + }; +}; +exports.FacetCircle = FacetCircle; +//# sourceMappingURL=facetCircle.js.map +}, function(modId) { var map = {"../utils/container":1751263816106,"../utils/vector":1751263815873,"./facetRect":1751263816105,"./utils":1751263816101}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816109, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TimingKeyframe = void 0; +const util_1 = require("@antv/util"); +function range(direction, iterationCount, keyframeCount) { + const start = 0; + const end = keyframeCount; + const normal = [start, end]; + const reverse = [-end + 1, -start + 1]; + if (direction === 'normal') + return normal; + if (direction === 'reverse') + return reverse; + if (direction === 'alternate') { + return iterationCount % 2 === 0 ? normal : reverse; + } + if (direction === 'reverse-alternate') { + return iterationCount % 2 === 0 ? reverse : normal; + } +} +/** + * Set animation options for all descendants. + */ +function setAnimation(node, duration, easing) { + const discovered = [node]; + while (discovered.length) { + const n = discovered.pop(); + n.animate = (0, util_1.deepMix)({ + enter: { + duration, + }, + update: { + duration, + easing, + type: 'morphing', + fill: 'both', + }, + exit: { + type: 'fadeOut', + duration, + }, + }, n.animate || {}); + const { children } = n; + if (Array.isArray(children)) + discovered.push(...children); + } + return node; +} +/** + * @todo More options, such as fill, totalDuration... + */ +const TimingKeyframe = () => { + return (options) => { + const { children = [], duration = 1000, iterationCount = 1, direction = 'normal', easing = 'ease-in-out-sine', } = options; + const n = children.length; + if (!Array.isArray(children) || n === 0) + return []; + const { key } = children[0]; + const newChildren = children + .map((d) => (Object.assign(Object.assign({}, d), { key }))) + .map((d) => setAnimation(d, duration, easing)); + return function* () { + let count = 0; + let prevIndex; + while (iterationCount === 'infinite' || count < iterationCount) { + const [start, end] = range(direction, count, n); + for (let i = start; i < end; i += 1) { + // For reverse direction, the range is from negative to negative + // so the absolute value of i is the real index for newChildren. + const index = Math.abs(i); + // This is for preventing alternate or reverse-alternate keyframe + // to yield two same node one by one when the direction change. + if (prevIndex !== index) + yield newChildren[index]; + prevIndex = index; + } + count++; + } + }; + }; +}; +exports.TimingKeyframe = TimingKeyframe; +exports.TimingKeyframe.props = {}; +//# sourceMappingURL=timingKeyframe.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816110, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GeoPath = void 0; +/** + * Wrap GeoPath by a GeoView. + */ +const GeoPath = () => { + return (options) => { + const { type, data, scale, encode, style, animate, key, state } = options, rest = __rest(options, ["type", "data", "scale", "encode", "style", "animate", "key", "state"]); + return [ + Object.assign(Object.assign({ type: 'geoView' }, rest), { children: [ + { + type: 'geoPath', + key: `${key}-0`, + data: { + value: data, + }, + scale, + encode, + style, + animate, + state, + }, + ] }), + ]; + }; +}; +exports.GeoPath = GeoPath; +exports.GeoPath.props = {}; +//# sourceMappingURL=geoPath.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816111, function(require, module, exports) { + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GeoView = void 0; +const scale_1 = require("@antv/scale"); +const util_1 = require("@antv/util"); +const d3_geo_1 = require("@antv/vendor/d3-geo"); +const mark_1 = require("../utils/mark"); +const d3Projection = __importStar(require("./d3Projection")); +/** + * Get projection factory from d3-projection. + */ +function normalizeProjection(type) { + if (typeof type === 'function') + return type; + const name = `geo${(0, util_1.upperFirst)(type)}`; + const projection = d3Projection[name]; + if (!projection) + throw new Error(`Unknown coordinate: ${type}`); + return projection; +} +/** + * @see https://github.com/mapbox/geojson-merge/blob/master/index.js + */ +function mergeGeoJSON(gjs) { + return { + type: 'FeatureCollection', + features: gjs.flatMap((gj) => normalizeGeoJSON(gj).features), + }; +} +function normalizeGeoJSON(gj) { + const types = { + Point: 'geometry', + MultiPoint: 'geometry', + LineString: 'geometry', + MultiLineString: 'geometry', + Polygon: 'geometry', + MultiPolygon: 'geometry', + GeometryCollection: 'geometry', + Feature: 'feature', + FeatureCollection: 'featureCollection', + }; + if (!gj || !gj.type) + return null; + const type = types[gj.type]; + if (!type) + return null; + if (type === 'geometry') { + return { + type: 'FeatureCollection', + features: [ + { + type: 'Feature', + properties: {}, + geometry: gj, + }, + ], + }; + } + else if (type === 'feature') { + return { + type: 'FeatureCollection', + features: [gj], + }; + } + else if (type === 'featureCollection') { + return gj; + } +} +/** + * Specify the options for d3 projection + * @see https://github.com/d3/d3-geo#projections + * @todo Specify key each by each. + */ +function setProjectionOptions(projection, options) { + var _a; + for (const [key, value] of Object.entries(options)) { + (_a = projection[key]) === null || _a === void 0 ? void 0 : _a.call(projection, value); + } +} +function setProjectionSize(projection, nodes, layout, options) { + const defaultOutline = () => { + const geoNodes = nodes.filter(isGeoPath); + // For geoPath with sphere mark, use it as outline. + const sphere = geoNodes.find((d) => d.sphere); + if (sphere) + return { type: 'Sphere' }; + // Merge all GeoJSON as the outline. + return mergeGeoJSON(geoNodes.filter((d) => !d.sphere).flatMap((d) => d.data.value)); + }; + const { outline = defaultOutline() } = options; + const { size = 'fitExtent' } = options; + if (size === 'fitExtent') { + return setFitExtent(projection, outline, layout); + } + else if (size === 'fitWidth') { + return setFitWidth(projection, outline, layout); + } +} +function setFitExtent(projection, object, layout) { + const { x, y, width, height } = layout; + projection.fitExtent([ + [x, y], + [width, height], + ], object); +} +function setFitWidth(projection, object, layout) { + const { width, height } = layout; + const [[x0, y0], [x1, y1]] = (0, d3_geo_1.geoPath)(projection.fitWidth(width, object)).bounds(object); + const dy = Math.ceil(y1 - y0); + const l = Math.min(Math.ceil(x1 - x0), dy); + const s = (projection.scale() * (l - 1)) / l; + const [tx, ty] = projection.translate(); + const t = ty + (height - dy) / 2; + projection.scale(s).translate([tx, t]).precision(0.2); +} +/** + * @todo Remove this. + */ +function normalizeDataSource(node) { + const { data } = node; + if (Array.isArray(data)) + return Object.assign(Object.assign({}, node), { data: { value: data } }); + const { type } = data; + if (type === 'graticule10') { + return Object.assign(Object.assign({}, node), { data: { value: [(0, d3_geo_1.geoGraticule10)()] } }); + } + else if (type === 'sphere') { + // Sphere is not a standard type of GeoJSON. + // Mark this geoPath as sphere geoPath. + return Object.assign(Object.assign({}, node), { sphere: true, data: { value: [{ type: 'Sphere' }] } }); + } + return node; +} +function isGeoPath(d) { + return d.type === 'geoPath'; +} +/** + * A view with geo coordinate. + */ +const GeoView = () => { + return (options) => { + const { children, coordinate: projection = {} } = options; + if (!Array.isArray(children)) + return []; + // Get projection factory. + const { type = 'equalEarth' } = projection, projectionOptions = __rest(projection, ["type"]); + const createProjection = normalizeProjection(type); + const nodes = children.map(normalizeDataSource); + // Set path generator lazily. + let path; + // A custom geo coordinate. + function Geo() { + return [ + [ + 'custom', + (x, y, width, height) => { + // Create and set projection. + const visual = createProjection(); + const layout = { x, y, width, height }; + setProjectionSize(visual, nodes, layout, projectionOptions); + setProjectionOptions(visual, projectionOptions); + // Create path generator. + path = (0, d3_geo_1.geoPath)(visual); + // Normalize projection and projection.invert, + // which normalize projected points. + const scaleX = new scale_1.Linear({ + domain: [x, x + width], + }); + const scaleY = new scale_1.Linear({ + domain: [y, y + height], + }); + const normalize = (point) => { + const visualPoint = visual(point); + if (!visualPoint) + return [null, null]; + const [vx, vy] = visualPoint; + return [scaleX.map(vx), scaleY.map(vy)]; + }; + const normalizeInvert = (point) => { + if (!point) + return null; + const [px, py] = point; + const visualPoint = [scaleX.invert(px), scaleY.invert(py)]; + return visual.invert(visualPoint); + }; + return { + transform: (point) => normalize(point), + untransform: (point) => normalizeInvert(point), + }; + }, + ], + ]; + } + function GeoPath(options) { + const { style, tooltip = {} } = options; + return Object.assign(Object.assign({}, options), { type: 'path', tooltip: (0, mark_1.maybeTooltip)(tooltip, { + title: 'id', + items: [{ channel: 'color' }], + }), style: Object.assign(Object.assign({}, style), { d: (d) => path(d) || [] }) }); + } + const t = (d) => (isGeoPath(d) ? GeoPath(d) : d); + return [ + Object.assign(Object.assign({}, options), { type: 'view', scale: { + x: { type: 'identity' }, + y: { type: 'identity' }, + }, axis: false, coordinate: { type: Geo }, children: nodes.flatMap(t) }), + ]; + }; +}; +exports.GeoView = GeoView; +exports.GeoView.props = {}; +//# sourceMappingURL=geoView.js.map +}, function(modId) { var map = {"../utils/mark":1751263815997,"./d3Projection":1751263816112}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816112, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.geoTransverseMercatorRaw = exports.geoTransverseMercator = exports.geoStereographicRaw = exports.geoStereographic = exports.geoOrthographicRaw = exports.geoOrthographic = exports.geoNaturalEarth1Raw = exports.geoNaturalEarth1 = exports.geoMercatorRaw = exports.geoMercator = exports.geoProjectionMutator = exports.geoProjection = exports.geoIdentity = exports.geoGnomonicRaw = exports.geoGnomonic = exports.geoEquirectangularRaw = exports.geoEquirectangular = exports.geoEqualEarthRaw = exports.geoEqualEarth = exports.geoConicEquidistantRaw = exports.geoConicEquidistant = exports.geoConicEqualAreaRaw = exports.geoConicEqualArea = exports.geoConicConformalRaw = exports.geoConicConformal = exports.geoAzimuthalEquidistantRaw = exports.geoAzimuthalEquidistant = exports.geoAzimuthalEqualAreaRaw = exports.geoAzimuthalEqualArea = exports.geoAlbers = exports.geoAlbersUsa = void 0; +var d3_geo_1 = require("@antv/vendor/d3-geo"); +Object.defineProperty(exports, "geoAlbersUsa", { enumerable: true, get: function () { return d3_geo_1.geoAlbersUsa; } }); +Object.defineProperty(exports, "geoAlbers", { enumerable: true, get: function () { return d3_geo_1.geoAlbers; } }); +Object.defineProperty(exports, "geoAzimuthalEqualArea", { enumerable: true, get: function () { return d3_geo_1.geoAzimuthalEqualArea; } }); +Object.defineProperty(exports, "geoAzimuthalEqualAreaRaw", { enumerable: true, get: function () { return d3_geo_1.geoAzimuthalEqualAreaRaw; } }); +Object.defineProperty(exports, "geoAzimuthalEquidistant", { enumerable: true, get: function () { return d3_geo_1.geoAzimuthalEquidistant; } }); +Object.defineProperty(exports, "geoAzimuthalEquidistantRaw", { enumerable: true, get: function () { return d3_geo_1.geoAzimuthalEquidistantRaw; } }); +Object.defineProperty(exports, "geoConicConformal", { enumerable: true, get: function () { return d3_geo_1.geoConicConformal; } }); +Object.defineProperty(exports, "geoConicConformalRaw", { enumerable: true, get: function () { return d3_geo_1.geoConicConformalRaw; } }); +Object.defineProperty(exports, "geoConicEqualArea", { enumerable: true, get: function () { return d3_geo_1.geoConicEqualArea; } }); +Object.defineProperty(exports, "geoConicEqualAreaRaw", { enumerable: true, get: function () { return d3_geo_1.geoConicEqualAreaRaw; } }); +Object.defineProperty(exports, "geoConicEquidistant", { enumerable: true, get: function () { return d3_geo_1.geoConicEquidistant; } }); +Object.defineProperty(exports, "geoConicEquidistantRaw", { enumerable: true, get: function () { return d3_geo_1.geoConicEquidistantRaw; } }); +Object.defineProperty(exports, "geoEqualEarth", { enumerable: true, get: function () { return d3_geo_1.geoEqualEarth; } }); +Object.defineProperty(exports, "geoEqualEarthRaw", { enumerable: true, get: function () { return d3_geo_1.geoEqualEarthRaw; } }); +Object.defineProperty(exports, "geoEquirectangular", { enumerable: true, get: function () { return d3_geo_1.geoEquirectangular; } }); +Object.defineProperty(exports, "geoEquirectangularRaw", { enumerable: true, get: function () { return d3_geo_1.geoEquirectangularRaw; } }); +Object.defineProperty(exports, "geoGnomonic", { enumerable: true, get: function () { return d3_geo_1.geoGnomonic; } }); +Object.defineProperty(exports, "geoGnomonicRaw", { enumerable: true, get: function () { return d3_geo_1.geoGnomonicRaw; } }); +Object.defineProperty(exports, "geoIdentity", { enumerable: true, get: function () { return d3_geo_1.geoIdentity; } }); +Object.defineProperty(exports, "geoProjection", { enumerable: true, get: function () { return d3_geo_1.geoProjection; } }); +Object.defineProperty(exports, "geoProjectionMutator", { enumerable: true, get: function () { return d3_geo_1.geoProjectionMutator; } }); +Object.defineProperty(exports, "geoMercator", { enumerable: true, get: function () { return d3_geo_1.geoMercator; } }); +Object.defineProperty(exports, "geoMercatorRaw", { enumerable: true, get: function () { return d3_geo_1.geoMercatorRaw; } }); +Object.defineProperty(exports, "geoNaturalEarth1", { enumerable: true, get: function () { return d3_geo_1.geoNaturalEarth1; } }); +Object.defineProperty(exports, "geoNaturalEarth1Raw", { enumerable: true, get: function () { return d3_geo_1.geoNaturalEarth1Raw; } }); +Object.defineProperty(exports, "geoOrthographic", { enumerable: true, get: function () { return d3_geo_1.geoOrthographic; } }); +Object.defineProperty(exports, "geoOrthographicRaw", { enumerable: true, get: function () { return d3_geo_1.geoOrthographicRaw; } }); +Object.defineProperty(exports, "geoStereographic", { enumerable: true, get: function () { return d3_geo_1.geoStereographic; } }); +Object.defineProperty(exports, "geoStereographicRaw", { enumerable: true, get: function () { return d3_geo_1.geoStereographicRaw; } }); +Object.defineProperty(exports, "geoTransverseMercator", { enumerable: true, get: function () { return d3_geo_1.geoTransverseMercator; } }); +Object.defineProperty(exports, "geoTransverseMercatorRaw", { enumerable: true, get: function () { return d3_geo_1.geoTransverseMercatorRaw; } }); +//# sourceMappingURL=d3Projection.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816113, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Event = void 0; +const event_1 = require("../utils/event"); +const helper_1 = require("../utils/helper"); +const utils_1 = require("./utils"); +// For extended component +function maybeComponentRoot(node) { + return (0, utils_1.maybeRoot)(node, (node) => node.className === 'component'); +} +// For extended shape. +function maybeElementRoot(node) { + return (0, utils_1.maybeRoot)(node, (node) => node.className === 'element'); +} +// For extended label. +function maybeLabelRoot(node) { + return (0, utils_1.maybeRoot)(node, (node) => node.className === 'label'); +} +function bubblesEvent(eventType, view, emitter, predicate = (event) => true) { + return (e) => { + if (!predicate(e)) + return; + // Emit plot events. + emitter.emit(`plot:${eventType}`, e); + const { target } = e; + // There is no target for pointerupoutside event if out of canvas. + if (!target) + return; + const { className } = target; + // If target area is plot area, do not emit extra events. + if (className === 'plot') + return; + // If target is element or child of element. + const elementRoot = maybeElementRoot(target); + // If target is component or child of component. + const componentRoot = maybeComponentRoot(target); + // If target is babel or child of babel. + const babelRoot = maybeLabelRoot(target); + const root = elementRoot || componentRoot || babelRoot; + if (!root) + return; + const { className: elementType, markType } = root; + const e1 = Object.assign(Object.assign({}, e), { nativeEvent: true }); + if (elementType === 'element') { + e1['data'] = { data: (0, helper_1.dataOf)(root, view) }; + emitter.emit(`element:${eventType}`, e1); + emitter.emit(`${markType}:${eventType}`, e1); + } + else if (elementType === 'label') { + //label children [Text2, Rect2, Path2], + e1['data'] = { data: root.attributes.datum }; + emitter.emit(`label:${eventType}`, e1); + emitter.emit(`${className}:${eventType}`, e1); + } + else { + emitter.emit(`component:${eventType}`, e1); + emitter.emit(`${className}:${eventType}`, e1); + } + }; +} +// @todo Provide more info for event.dataset. +function Event() { + return (context, _, emitter) => { + const { container, view } = context; + // Click events. + const click = bubblesEvent(event_1.ChartEvent.CLICK, view, emitter, (e) => e.detail === 1); + const dblclick = bubblesEvent(event_1.ChartEvent.DBLCLICK, view, emitter, (e) => e.detail === 2); + // Pointer events. + const pointertap = bubblesEvent(event_1.ChartEvent.POINTER_TAP, view, emitter); + const pointerdown = bubblesEvent(event_1.ChartEvent.POINTER_DOWN, view, emitter); + const pointerup = bubblesEvent(event_1.ChartEvent.POINTER_UP, view, emitter); + const pointerover = bubblesEvent(event_1.ChartEvent.POINTER_OVER, view, emitter); + const pointerout = bubblesEvent(event_1.ChartEvent.POINTER_OUT, view, emitter); + const pointermove = bubblesEvent(event_1.ChartEvent.POINTER_MOVE, view, emitter); + const pointerenter = bubblesEvent(event_1.ChartEvent.POINTER_ENTER, view, emitter); + const pointerleave = bubblesEvent(event_1.ChartEvent.POINTER_LEAVE, view, emitter); + const pointerupoutside = bubblesEvent(event_1.ChartEvent.POINTER_UPOUTSIDE, view, emitter); + // Drag and drop events. + const dragstart = bubblesEvent(event_1.ChartEvent.DRAG_START, view, emitter); + const drag = bubblesEvent(event_1.ChartEvent.DRAG, view, emitter); + const dragend = bubblesEvent(event_1.ChartEvent.DRAG_END, view, emitter); + const dragenter = bubblesEvent(event_1.ChartEvent.DRAG_ENTER, view, emitter); + const dragleave = bubblesEvent(event_1.ChartEvent.DRAG_LEAVE, view, emitter); + const dragover = bubblesEvent(event_1.ChartEvent.DRAG_OVER, view, emitter); + const drop = bubblesEvent(event_1.ChartEvent.DROP, view, emitter); + // For legacy usage. + container.addEventListener('click', click); + container.addEventListener('click', dblclick); + // Recommend events. + container.addEventListener('pointertap', pointertap); + container.addEventListener('pointerdown', pointerdown); + container.addEventListener('pointerup', pointerup); + container.addEventListener('pointerover', pointerover); + container.addEventListener('pointerout', pointerout); + container.addEventListener('pointermove', pointermove); + container.addEventListener('pointerenter', pointerenter); + container.addEventListener('pointerleave', pointerleave); + container.addEventListener('pointerupoutside', pointerupoutside); + // Plugin events. + container.addEventListener('dragstart', dragstart); + container.addEventListener('drag', drag); + container.addEventListener('dragend', dragend); + container.addEventListener('dragenter', dragenter); + container.addEventListener('dragleave', dragleave); + container.addEventListener('dragover', dragover); + container.addEventListener('drop', drop); + return () => { + container.removeEventListener('click', click); + container.removeEventListener('click', dblclick); + container.removeEventListener('pointertap', pointertap); + container.removeEventListener('pointerdown', pointerdown); + container.removeEventListener('pointerup', pointerup); + container.removeEventListener('pointerover', pointerover); + container.removeEventListener('pointerout', pointerout); + container.removeEventListener('pointermove', pointermove); + container.removeEventListener('pointerenter', pointerenter); + container.removeEventListener('pointerleave', pointerleave); + container.removeEventListener('pointerupoutside', pointerupoutside); + container.removeEventListener('dragstart', dragstart); + container.removeEventListener('drag', drag); + container.removeEventListener('dragend', dragend); + container.removeEventListener('dragenter', dragenter); + container.removeEventListener('dragleave', dragleave); + container.removeEventListener('dragover', dragover); + container.removeEventListener('drop', drop); + }; + }; +} +exports.Event = Event; +Event.props = { + reapplyWhenUpdate: true, +}; +//# sourceMappingURL=event.js.map +}, function(modId) { var map = {"../utils/event":1751263816091,"../utils/helper":1751263815829,"./utils":1751263816080}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816114, function(require, module, exports) { + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isValidScale = exports.isPosition = exports.syncFacetsScales = exports.useRelationScale = exports.assignScale = exports.useRelation = exports.collectScales = exports.groupTransform = exports.applyScale = exports.inferScale = void 0; +const scale_1 = require("@antv/scale"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const d3ScaleChromatic = __importStar(require("@antv/vendor/d3-scale-chromatic")); +const util_1 = require("@antv/util"); +const array_1 = require("../utils/array"); +const helper_1 = require("../utils/helper"); +const coordinate_1 = require("./coordinate"); +const library_1 = require("./library"); +function inferScale(name, values, options, coordinates, theme, library) { + const { guide = {} } = options; + const type = inferScaleType(name, values, options); + if (typeof type !== 'string') + return options; + const expectedDomain = inferScaleDomain(type, name, values, options); + const actualDomain = maybeRatio(type, expectedDomain, options); + return Object.assign(Object.assign(Object.assign({}, options), inferScaleOptions(type, name, values, options, coordinates)), { domain: actualDomain, range: inferScaleRange(type, name, values, options, actualDomain, theme, library), expectedDomain, + guide, + name, + type }); +} +exports.inferScale = inferScale; +function applyScale(channels, scale) { + const scaledValue = {}; + for (const channel of channels) { + const { values, name: scaleName } = channel; + const scaleInstance = scale[scaleName]; + for (const value of values) { + const { name, value: V } = value; + scaledValue[name] = V.map((d) => scaleInstance.map(d)); + } + } + return scaledValue; +} +exports.applyScale = applyScale; +function groupTransform(markState, uidScale) { + const channels = Array.from(markState.values()).flatMap((d) => d.channels); + const scaleGroups = (0, d3_array_1.rollups)(channels, (channels) => channels.map((d) => uidScale.get(d.scale.uid)), (d) => d.name) + .filter(([, scales]) => scales.some((d) => typeof d.getOptions().groupTransform === 'function') && // only sync scales with groupTransform options + scales.every((d) => d.getTicks)) + .map((d) => d[1]); + scaleGroups.forEach((group) => { + const groupTransform = group.map((d) => d.getOptions().groupTransform)[0]; + groupTransform(group); + }); +} +exports.groupTransform = groupTransform; +function collectScales(states, options) { + var _a; + const { components = [] } = options; + const NONE_STATIC_KEYS = [ + 'scale', + 'encode', + 'axis', + 'legend', + 'data', + 'transform', + ]; + // From normal marks. + const scales = Array.from(new Set(states.flatMap((d) => d.channels.map((d) => d.scale)))); + // From static marks. + const nameScale = new Map(scales.map((scale) => [scale.name, scale])); + for (const component of components) { + const channels = inferChannelsForComponent(component); + for (const channel of channels) { + const scale = nameScale.get(channel); + const staticScale = ((_a = component.scale) === null || _a === void 0 ? void 0 : _a[channel]) || {}; + const { independent = false } = staticScale; + if (scale && !independent) { + // Merged with exist scales if is not independent. + const { guide } = scale; + const guide1 = typeof guide === 'boolean' ? {} : guide; + scale.guide = (0, util_1.deepMix)({}, guide1, component); + Object.assign(scale, staticScale); + } + else { + // Append new scales without exit scales or independent. + const options1 = Object.assign(Object.assign({}, staticScale), { expectedDomain: staticScale.domain, name: channel, guide: (0, util_1.omit)(component, NONE_STATIC_KEYS) }); + scales.push(options1); + } + } + } + return scales; +} +exports.collectScales = collectScales; +function useRelation(relations) { + if (!relations || !Array.isArray(relations)) + return [helper_1.identity, helper_1.identity]; + // Store original map and invert. + let map; + let invert; + const conditionalize = (scale) => { + var _a; + map = scale.map.bind(scale); + invert = (_a = scale.invert) === null || _a === void 0 ? void 0 : _a.bind(scale); + // Distinguish functions[function, output] and value[vale, output] relations. + const funcRelations = relations.filter(([v]) => typeof v === 'function'); + const valueRelations = relations.filter(([v]) => typeof v !== 'function'); + // Update scale.map + const valueOutput = new Map(valueRelations); + scale.map = (x) => { + for (const [verify, value] of funcRelations) { + if (verify(x)) + return value; + } + if (valueOutput.has(x)) + return valueOutput.get(x); + return map(x); + }; + if (!invert) + return scale; + // Update scale.invert + const outputValue = new Map(valueRelations.map(([a, b]) => [b, a])); + const outputFunc = new Map(funcRelations.map(([a, b]) => [b, a])); + scale.invert = (x) => { + if (outputFunc.has(x)) + return x; + if (outputValue.has(x)) + return outputValue.get(x); + return invert(x); + }; + return scale; + }; + const deconditionalize = (scale) => { + if (map !== null) + scale.map = map; + if (invert !== null) + scale.invert = invert; + return scale; + }; + return [conditionalize, deconditionalize]; +} +exports.useRelation = useRelation; +function assignScale(target, source) { + const keys = Object.keys(target); + for (const scale of Object.values(source)) { + const { name } = scale.getOptions(); + if (!(name in target)) + target[name] = scale; + else { + const I = keys + .filter((d) => d.startsWith(name)) + // Reg is for extract `1` from `x1`; + .map((d) => +(d.replace(name, '') || 0)); + const index = (0, d3_array_1.max)(I) + 1; + const newKey = `${name}${index}`; + target[newKey] = scale; + scale.getOptions().key = newKey; + } + } + return target; +} +exports.assignScale = assignScale; +function useRelationScale(options, library) { + const [useScale] = (0, library_1.useLibrary)('scale', library); + const { relations } = options; + const [conditionalize] = useRelation(relations); + const scale = useScale(options); + return conditionalize(scale); +} +exports.useRelationScale = useRelationScale; +function syncFacetsScales(states) { + const scales = states + .flatMap((d) => Array.from(d.values())) + .flatMap((d) => d.channels.map((d) => d.scale)); + syncFacetsScaleByChannel(scales, 'x'); + syncFacetsScaleByChannel(scales, 'y'); +} +exports.syncFacetsScales = syncFacetsScales; +function inferChannelsForComponent(component) { + const { channels = [], type, scale = {} } = component; + const L = ['shape', 'color', 'opacity', 'size']; + if (channels.length !== 0) + return channels; + if (type === 'axisX') + return ['x']; + if (type === 'axisY') + return ['y']; + if (type === 'legends') + return Object.keys(scale).filter((d) => L.includes(d)); + return []; +} +function syncFacetsScaleByChannel(scales, channel) { + const S = scales.filter(({ name, facet = true }) => facet && name === channel); + const D = S.flatMap((d) => d.domain); + const syncedD = S.every(isQuantitativeScale) + ? (0, d3_array_1.extent)(D) + : S.every(isDiscreteScale) + ? Array.from(new Set(D)) + : null; + if (syncedD === null) + return; + for (const scale of S) { + scale.domain = syncedD; + } +} +function maybeRatio(type, domain, options) { + const { ratio } = options; + if (ratio === undefined || ratio === null) + return domain; + if (isQuantitativeScale({ type })) { + return clampQuantitativeScale(domain, ratio, type); + } + if (isDiscreteScale({ type })) + return clampDiscreteScale(domain, ratio); + return domain; +} +function clampQuantitativeScale(domain, ratio, type) { + const D = domain.map(Number); + const scale = new scale_1.Linear({ + domain: D, + range: [D[0], D[0] + (D[D.length - 1] - D[0]) * ratio], + }); + if (type === 'time') + return domain.map((d) => new Date(scale.map(d))); + return domain.map((d) => scale.map(d)); +} +function clampDiscreteScale(domain, ratio) { + const index = Math.round(domain.length * ratio); + return domain.slice(0, index); +} +function isQuantitativeScale(scale) { + const { type } = scale; + if (typeof type !== 'string') + return false; + // Do not take quantize, quantile or threshold scale into account, + // because they are not for position scales. If they are, there is + // no need to sync them. + const names = ['linear', 'log', 'pow', 'time']; + return names.includes(type); +} +function isDiscreteScale(scale) { + const { type } = scale; + if (typeof type !== 'string') + return false; + const names = ['band', 'point', 'ordinal']; + return names.includes(type); +} +// @todo More accurate inference for different cases. +function inferScaleType(name, values, options) { + const { type, domain, range, quantitative, ordinal } = options; + if (type !== undefined) + return type; + if (isObject(values)) + return 'identity'; + if (typeof range === 'string') + return 'linear'; + if ((domain || range || []).length > 2) + return asOrdinalType(name, ordinal); + if (domain !== undefined) { + if (isOrdinal([domain])) + return asOrdinalType(name, ordinal); + if (isTemporal(values)) + return 'time'; + return asQuantitativeType(name, range, quantitative); + } + if (isOrdinal(values)) + return asOrdinalType(name, ordinal); + if (isTemporal(values)) + return 'time'; + return asQuantitativeType(name, range, quantitative); +} +function inferScaleDomain(type, name, values, options) { + const { domain } = options; + if (domain !== undefined) + return domain; + switch (type) { + case 'linear': + case 'time': + case 'log': + case 'pow': + case 'sqrt': + case 'quantize': + case 'threshold': + return maybeMinMax(inferDomainQ(values, options), options); + case 'band': + case 'ordinal': + case 'point': + return inferDomainC(values); + case 'quantile': + return inferDomainO(values); + case 'sequential': + return maybeMinMax(inferDomainS(values), options); + default: + return []; + } +} +function inferScaleRange(type, name, values, options, domain, theme, library) { + const { range } = options; + if (typeof range === 'string') + return gradientColors(range); + if (range !== undefined) + return range; + const { rangeMin, rangeMax } = options; + switch (type) { + case 'linear': + case 'time': + case 'log': + case 'pow': + case 'sqrt': { + const colors = categoricalColors(values, options, domain, theme, library); + const [r0, r1] = inferRangeQ(name, colors); + return [rangeMin !== null && rangeMin !== void 0 ? rangeMin : r0, rangeMax !== null && rangeMax !== void 0 ? rangeMax : r1]; + } + case 'band': + case 'point': { + const min = name === 'size' ? 5 : 0; + const max = name === 'size' ? 10 : 1; + return [rangeMin !== null && rangeMin !== void 0 ? rangeMin : min, rangeMax !== null && rangeMax !== void 0 ? rangeMax : max]; + } + case 'ordinal': { + return categoricalColors(values, options, domain, theme, library); + } + case 'sequential': + return undefined; + case 'constant': + return [values[0][0]]; + default: + return []; + } +} +function inferScaleOptions(type, name, values, options, coordinates) { + switch (type) { + case 'linear': + case 'time': + case 'log': + case 'pow': + case 'sqrt': + return inferOptionsQ(coordinates, options); + case 'band': + case 'point': + return inferOptionsC(type, name, coordinates, options); + case 'sequential': + return inferOptionsS(options); + default: + return options; + } +} +function categoricalColors(values, options, domain, theme, library) { + const [usePalette] = (0, library_1.useLibrary)('palette', library); + const { category10: c10, category20: c20 } = theme; + const defaultPalette = (0, array_1.unique)(domain).length <= c10.length ? c10 : c20; + const { palette = defaultPalette, offset } = options; + if (Array.isArray(palette)) + return palette; + // Built-in palettes have higher priority. + try { + return usePalette({ type: palette }); + } + catch (e) { + const colors = interpolatedColors(palette, domain, offset); + if (colors) + return colors; + throw new Error(`Unknown Component: ${palette} `); + } +} +function gradientColors(range) { + return range.split('-'); +} +function interpolatedColors(palette, domain, offset = (d) => d) { + if (!palette) + return null; + const fullName = (0, util_1.upperFirst)(palette); + // If scheme have enough colors, then return pre-defined colors. + const scheme = d3ScaleChromatic[`scheme${fullName}`]; + const interpolator = d3ScaleChromatic[`interpolate${fullName}`]; + if (!scheme && !interpolator) + return null; + if (scheme) { + // If is a one dimension array, return it. + if (!scheme.some(Array.isArray)) + return scheme; + const schemeColors = scheme[domain.length]; + if (schemeColors) + return schemeColors; + } + // Otherwise interpolate to get full colors. + return domain.map((_, i) => interpolator(offset(i / domain.length))); +} +function inferOptionsS(options) { + const { palette = 'ylGnBu', offset } = options; + const name = (0, util_1.upperFirst)(palette); + const interpolator = d3ScaleChromatic[`interpolate${name}`]; + if (!interpolator) + throw new Error(`Unknown palette: ${name}`); + return { + interpolator: offset ? (x) => interpolator(offset(x)) : interpolator, + }; +} +function inferOptionsQ(coordinates, options) { + const { interpolate = scale_1.createInterpolateValue, nice = false, tickCount = 5, } = options; + return Object.assign(Object.assign({}, options), { interpolate, nice, tickCount }); +} +function inferOptionsC(type, name, coordinates, options) { + if (options.padding !== undefined || + options.paddingInner !== undefined || + options.paddingOuter !== undefined) { + return Object.assign(Object.assign({}, options), { unknown: NaN }); + } + const padding = inferPadding(type, name, coordinates); + const { paddingInner = padding, paddingOuter = padding } = options; + return Object.assign(Object.assign({}, options), { paddingInner, + paddingOuter, + padding, unknown: NaN }); +} +function inferPadding(type, name, coordinates) { + // The scale for enterDelay and enterDuration should has zero padding by default. + // Because there is no need to add extra delay for the start and the end. + if (name === 'enterDelay' || name === 'enterDuration') + return 0; + if (name === 'size') + return 0; + if (type === 'band') + return (0, coordinate_1.isTheta)(coordinates) ? 0 : 0.1; + // Point scale need 0.5 padding to make interval between first and last point + // equal to other intervals in polar coordinate. + if (type === 'point') + return 0.5; + return 0; +} +function asOrdinalType(name, defaults) { + if (defaults) + return defaults; + return isQuantitative(name) ? 'point' : 'ordinal'; +} +function asQuantitativeType(name, range, defaults) { + if (defaults) + return defaults; + if (name !== 'color') + return 'linear'; + return range ? 'linear' : 'sequential'; +} +function maybeMinMax(domain, options) { + if (domain.length === 0) + return domain; + const { domainMin, domainMax } = options; + const [d0, d1] = domain; + return [domainMin !== null && domainMin !== void 0 ? domainMin : d0, domainMax !== null && domainMax !== void 0 ? domainMax : d1]; +} +function inferDomainQ(values, options) { + const { zero = false } = options; + let min = Infinity; + let max = -Infinity; + for (const value of values) { + for (const d of value) { + if ((0, helper_1.defined)(d)) { + min = Math.min(min, +d); + max = Math.max(max, +d); + } + } + } + if (min === Infinity) + return []; + return zero ? [Math.min(0, min), max] : [min, max]; +} +function inferDomainC(values) { + return Array.from(new Set(values.flat())); +} +function inferDomainO(values) { + return values.flat().sort(); +} +function inferDomainS(values) { + let min = Infinity; + let max = -Infinity; + for (const value of values) { + for (const d of value) { + if ((0, helper_1.defined)(d)) { + min = Math.min(min, +d); + max = Math.max(max, +d); + } + } + } + if (min === Infinity) + return []; + return [min < 0 ? -max : min, max]; +} +/** + * @todo More nice default range for enterDelay and enterDuration. + * @todo Move these to channel definition. + */ +function inferRangeQ(name, palette) { + if (name === 'enterDelay') + return [0, 1000]; + if (name == 'enterDuration') + return [300, 1000]; + if (name.startsWith('y') || name.startsWith('position')) + return [1, 0]; + if (name === 'color') + return [(0, array_1.firstOf)(palette), (0, array_1.lastOf)(palette)]; + if (name === 'opacity') + return [0, 1]; + if (name === 'size') + return [1, 10]; + return [0, 1]; +} +function isOrdinal(values) { + return some(values, (d) => { + const type = typeof d; + return type === 'string' || type === 'boolean'; + }); +} +function isTemporal(values) { + return some(values, (d) => d instanceof Date); +} +function isObject(values) { + return some(values, helper_1.isStrictObject); +} +function some(values, callback) { + for (const V of values) { + if (V.some(callback)) + return true; + } + return false; +} +function isQuantitative(name) { + return (name.startsWith('x') || + name.startsWith('y') || + name.startsWith('position') || + name.startsWith('size')); +} +// Spatial and temporal position. +function isPosition(name) { + return (name.startsWith('x') || + name.startsWith('y') || + name.startsWith('position') || + name === 'enterDelay' || + name === 'enterDuration' || + name === 'updateDelay' || + name === 'updateDuration' || + name === 'exitDelay' || + name === 'exitDuration'); +} +exports.isPosition = isPosition; +function isValidScale(scale) { + if (!scale || !scale.type) + return false; + if (typeof scale.type === 'function') + return true; + const { type, domain, range, interpolator } = scale; + const isValidDomain = domain && domain.length > 0; + const isValidRange = range && range.length > 0; + if ([ + 'linear', + 'sqrt', + 'log', + 'time', + 'pow', + 'threshold', + 'quantize', + 'quantile', + 'ordinal', + 'band', + 'point', + ].includes(type) && + isValidDomain && + isValidRange) { + return true; + } + if (['sequential'].includes(type) && + isValidDomain && + (isValidRange || interpolator)) { + return true; + } + if (['constant', 'identity'].includes(type) && isValidRange) + return true; + return false; +} +exports.isValidScale = isValidScale; +//# sourceMappingURL=scale.js.map +}, function(modId) { var map = {"../utils/array":1751263815830,"../utils/helper":1751263815829,"./coordinate":1751263816096,"./library":1751263816097}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816115, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ConstantScale = exports.DiscreteScale = exports.DistributionScale = exports.ContinuousScale = void 0; +exports.ContinuousScale = { + linear: 'linear', + identity: 'identity', + log: 'log', + pow: 'pow', + sqrt: 'sqrt', + sequential: 'sequential', +}; +exports.DistributionScale = { + threshold: 'threshold', + quantize: 'quantize', + quantile: 'quantile', +}; +exports.DiscreteScale = { + ordinal: 'ordinal', + band: 'band', + point: 'point', +}; +exports.ConstantScale = { + constant: 'constant', +}; +//# sourceMappingURL=scale.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816116, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.placeComponents = exports.computeRoughPlotSize = exports.computeLayout = exports.processAxisZ = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +const util_1 = require("@antv/util"); +const coordinate_1 = require("../utils/coordinate"); +const helper_1 = require("../utils/helper"); +const array_1 = require("../utils/array"); +const string_1 = require("../utils/string"); +const component_1 = require("./component"); +const coordinate_2 = require("./coordinate"); +function processAxisZ(components) { + const axisX = components.find(({ type }) => type === 'axisX'); + const axisY = components.find(({ type }) => type === 'axisY'); + const axisZ = components.find(({ type }) => type === 'axisZ'); + if (axisX && axisY && axisZ) { + axisX.plane = 'xy'; + axisY.plane = 'xy'; + axisZ.plane = 'yz'; + axisZ.origin = [axisX.bbox.x, axisX.bbox.y, 0]; + axisZ.eulerAngles = [0, -90, 0]; + axisZ.bbox.x = axisX.bbox.x; + axisZ.bbox.y = axisX.bbox.y; + components.push(Object.assign(Object.assign({}, axisX), { plane: 'xz', showLabel: false, showTitle: false, origin: [axisX.bbox.x, axisX.bbox.y, 0], eulerAngles: [-90, 0, 0] })); + components.push(Object.assign(Object.assign({}, axisY), { plane: 'yz', showLabel: false, showTitle: false, origin: [axisY.bbox.x + axisY.bbox.width, axisY.bbox.y, 0], eulerAngles: [0, -90, 0] })); + components.push(Object.assign(Object.assign({}, axisZ), { plane: 'xz', actualPosition: 'left', showLabel: false, showTitle: false, eulerAngles: [90, -90, 0] })); + } +} +exports.processAxisZ = processAxisZ; +function computeLayout(components, options, theme, library) { + var _a, _b; + const { width, height, depth, x = 0, y = 0, z = 0, inset = (_a = theme.inset) !== null && _a !== void 0 ? _a : 0, insetLeft = inset, insetTop = inset, insetBottom = inset, insetRight = inset, margin = (_b = theme.margin) !== null && _b !== void 0 ? _b : 0, marginLeft = margin, marginBottom = margin, marginTop = margin, marginRight = margin, padding = theme.padding, paddingBottom = padding, paddingLeft = padding, paddingRight = padding, paddingTop = padding, } = computeInset(components, options, theme, library); + const MIN_CONTENT_RATIO = 1 / 4; + const maybeClamp = (viewWidth, paddingLeft, paddingRight, pl0, pr0) => { + // Only clamp when has marks. + const { marks } = options; + if (marks.length === 0) + return [pl0, pr0]; + // If size of content is enough, skip. + const contentSize = viewWidth - pl0 - pr0; + const diff = contentSize - viewWidth * MIN_CONTENT_RATIO; + if (diff > 0) + return [pl0, pr0]; + // Shrink start and end size equally. + const shrinkSize = viewWidth * (1 - MIN_CONTENT_RATIO); + return [ + paddingLeft === 'auto' ? (shrinkSize * pl0) / (pl0 + pr0) : pl0, + paddingRight === 'auto' ? (shrinkSize * pr0) / (pl0 + pr0) : pr0, + ]; + }; + const roughPadding = (padding) => (padding === 'auto' ? 20 : padding !== null && padding !== void 0 ? padding : 20); + const rpt = roughPadding(paddingTop); + const rpb = roughPadding(paddingBottom); + // Compute paddingLeft and paddingRight first to get innerWidth. + const horizontalPadding = computePadding(components, height - rpt - rpb, [rpt + marginTop, rpb + marginBottom], ['left', 'right'], options, theme, library); + const { paddingLeft: pl0, paddingRight: pr0 } = horizontalPadding; + const viewWidth = width - marginLeft - marginRight; + const [pl, pr] = maybeClamp(viewWidth, paddingLeft, paddingRight, pl0, pr0); + const iw = viewWidth - pl - pr; + // Compute paddingBottom and paddingTop based on innerWidth. + const verticalPadding = computePadding(components, iw, [pl + marginLeft, pr + marginRight], ['bottom', 'top'], options, theme, library); + const { paddingTop: pt0, paddingBottom: pb0 } = verticalPadding; + const viewHeight = height - marginBottom - marginTop; + const [pb, pt] = maybeClamp(viewHeight, paddingBottom, paddingTop, pb0, pt0); + const ih = viewHeight - pb - pt; + return { + width, + height, + depth, + insetLeft, + insetTop, + insetBottom, + insetRight, + innerWidth: iw, + innerHeight: ih, + paddingLeft: pl, + paddingRight: pr, + paddingTop: pt, + paddingBottom: pb, + marginLeft, + marginBottom, + marginTop, + marginRight, + x, + y, + z, + }; +} +exports.computeLayout = computeLayout; +// For composite mark with a layout algorithm and without axis, +// such as worldcloud, circlepack. +function computeRoughPlotSize(options) { + const { height, width, padding = 0, paddingLeft = padding, paddingRight = padding, paddingTop = padding, paddingBottom = padding, margin = 16, marginLeft = margin, marginRight = margin, marginTop = margin, marginBottom = margin, inset = 0, insetLeft = inset, insetRight = inset, insetTop = inset, insetBottom = inset, } = options; + // @todo Add this padding to theme. + // 30 is default size for padding, which defined in runtime. + const maybeAuto = (padding) => (padding === 'auto' ? 20 : padding); + const finalWidth = width - + maybeAuto(paddingLeft) - + maybeAuto(paddingRight) - + marginLeft - + marginRight - + insetLeft - + insetRight; + const finalHeight = height - + maybeAuto(paddingTop) - + maybeAuto(paddingBottom) - + marginTop - + marginBottom - + insetTop - + insetBottom; + return { width: finalWidth, height: finalHeight }; +} +exports.computeRoughPlotSize = computeRoughPlotSize; +function computeInset(components, options, theme, library) { + const { coordinates } = options; + if (!(0, coordinate_2.isPolar)(coordinates) && !(0, coordinate_2.isRadial)(coordinates)) { + return options; + } + // Filter axis. + const axes = components.filter((d) => typeof d.type === 'string' && d.type.startsWith('axis')); + if (axes.length === 0) + return options; + const styles = axes.map((component) => { + const key = component.type === 'axisArc' ? 'arc' : 'linear'; + return (0, component_1.styleOf)(component, key, theme); + }); + // Compute max labelSpacing. + const maxLabelSpacing = (0, d3_array_1.max)(styles, (d) => { var _a; return (_a = d.labelSpacing) !== null && _a !== void 0 ? _a : 0; }); + // Compute labelBBoxes. + const labelBBoxes = axes + .flatMap((component, i) => { + const style = styles[i]; + const scale = (0, component_1.createScale)(component, library); + const labels = (0, component_1.computeLabelsBBox)(style, scale); + return labels; + }) + .filter(helper_1.defined); + const size = (0, d3_array_1.max)(labelBBoxes, (d) => d.height) + maxLabelSpacing; + // Compute titles. + const titleBBoxes = axes + .flatMap((_, i) => { + const style = styles[i]; + return (0, component_1.computeTitleBBox)(style); + }) + .filter((d) => d !== null); + const titleSize = titleBBoxes.length === 0 ? 0 : (0, d3_array_1.max)(titleBBoxes, (d) => d.height); + // Update inset. + const { inset = size, insetLeft = inset, insetBottom = inset, insetTop = inset + titleSize, insetRight = inset, } = options; + return Object.assign(Object.assign({}, options), { insetLeft, insetBottom, insetTop, insetRight }); +} +/** + * @todo Support percentage size(e.g. 50%) + */ +function computePadding(components, crossSize, crossPadding, positions, options, theme, library) { + const positionComponents = (0, d3_array_1.group)(components, (d) => d.position); + const { padding = theme.padding, paddingLeft = padding, paddingRight = padding, paddingBottom = padding, paddingTop = padding, } = options; + const layout = { + paddingBottom, + paddingLeft, + paddingTop, + paddingRight, + }; + for (const position of positions) { + const key = `padding${(0, helper_1.capitalizeFirst)((0, string_1.camelCase)(position))}`; + const components = positionComponents.get(position) || []; + const value = layout[key]; + const defaultSizeOf = (d) => { + if (d.size === undefined) + d.size = d.defaultSize; + }; + const sizeOf = (d) => { + if (d.type === 'group') { + d.children.forEach(defaultSizeOf); + d.size = (0, d3_array_1.max)(d.children, (d) => d.size); + } + else { + d.size = d.defaultSize; + } + }; + const autoSizeOf = (d) => { + if (d.size) + return; + if (value !== 'auto') + sizeOf(d); + else { + // Compute component size dynamically. + (0, component_1.computeComponentSize)(d, crossSize, crossPadding, position, theme, library); + defaultSizeOf(d); + } + }; + const maybeHide = (d) => { + if (!d.type.startsWith('axis')) + return; + if (d.labelAutoHide === undefined) + d.labelAutoHide = true; + }; + const isHorizontal = position === 'bottom' || position === 'top'; + // !!!Note + // Mute axis component padding. + // The first axis do not has padding. + const minOrder = (0, d3_array_1.min)(components, (d) => d.order); + const axes = components.filter((d) => d.type.startsWith('axis') && d.order == minOrder); + if (axes.length) + axes[0].crossPadding = 0; + // Specified padding. + if (typeof value === 'number') { + components.forEach(defaultSizeOf); + components.forEach(maybeHide); + } + else { + // Compute padding dynamically. + if (components.length === 0) { + layout[key] = 0; + } + else { + const size = isHorizontal + ? crossSize + crossPadding[0] + crossPadding[1] + : crossSize; + const grouped = (0, component_1.groupComponents)(components, size); + grouped.forEach(autoSizeOf); + const totalSize = grouped.reduce((sum, { size, crossPadding = 12 }) => sum + size + crossPadding, 0); + layout[key] = totalSize; + } + } + } + return layout; +} +function placeComponents(components, coordinate, layout) { + // Group components by plane & position. + const positionComponents = (0, d3_array_1.group)(components, (d) => `${d.plane || 'xy'}-${d.position}`); + const { paddingLeft, paddingRight, paddingTop, paddingBottom, marginLeft, marginTop, marginBottom, marginRight, innerHeight, innerWidth, insetBottom, insetLeft, insetRight, insetTop, height, width, depth, } = layout; + const planes = { + xy: createSection({ + width, + height, + paddingLeft, + paddingRight, + paddingTop, + paddingBottom, + marginLeft, + marginTop, + marginBottom, + marginRight, + innerHeight, + innerWidth, + insetBottom, + insetLeft, + insetRight, + insetTop, + }), + yz: createSection({ + width: depth, + height: height, + paddingLeft: 0, + paddingRight: 0, + paddingTop: 0, + paddingBottom: 0, + marginLeft: 0, + marginTop: 0, + marginBottom: 0, + marginRight: 0, + innerWidth: depth, + innerHeight: height, + insetBottom: 0, + insetLeft: 0, + insetRight: 0, + insetTop: 0, + }), + xz: createSection({ + width, + height: depth, + paddingLeft: 0, + paddingRight: 0, + paddingTop: 0, + paddingBottom: 0, + marginLeft: 0, + marginTop: 0, + marginBottom: 0, + marginRight: 0, + innerWidth: width, + innerHeight: depth, + insetBottom: 0, + insetLeft: 0, + insetRight: 0, + insetTop: 0, + }), + }; + for (const [key, components] of positionComponents.entries()) { + const [plane, position] = key.split('-'); + const area = planes[plane][position]; + /** + * @description non-entity components: axis in the center, inner, outer, component in the center + * @description entity components: other components + * @description no volume components take up no extra space + */ + const [nonEntityComponents, entityComponents] = (0, array_1.divide)(components, (component) => { + if (typeof component.type !== 'string') + return false; + if (position === 'center') + return true; + if (component.type.startsWith('axis') && + ['inner', 'outer'].includes(position)) { + return true; + } + return false; + }); + if (nonEntityComponents.length) { + placeNonEntityComponents(nonEntityComponents, coordinate, area, position); + } + if (entityComponents.length) { + placePaddingArea(components, coordinate, area); + } + } +} +exports.placeComponents = placeComponents; +function createSection({ width, height, paddingLeft, paddingRight, paddingTop, paddingBottom, marginLeft, marginTop, marginBottom, marginRight, innerHeight, innerWidth, insetBottom, insetLeft, insetRight, insetTop, }) { + const pl = paddingLeft + marginLeft; + const pt = paddingTop + marginTop; + const pr = paddingRight + marginRight; + const pb = paddingBottom + marginBottom; + const plotWidth = width - marginLeft - marginRight; + const centerSection = [ + pl + insetLeft, + pt + insetTop, + innerWidth - insetLeft - insetRight, + innerHeight - insetTop - insetBottom, + 'center', + null, + null, + ]; + const xySection = { + top: [ + pl, + 0, + innerWidth, + pt, + 'vertical', + true, + d3_array_1.ascending, + marginLeft, + plotWidth, + ], + right: [width - pr, pt, pr, innerHeight, 'horizontal', false, d3_array_1.ascending], + bottom: [ + pl, + height - pb, + innerWidth, + pb, + 'vertical', + false, + d3_array_1.ascending, + marginLeft, + plotWidth, + ], + left: [0, pt, pl, innerHeight, 'horizontal', true, d3_array_1.ascending], + 'top-left': [pl, 0, innerWidth, pt, 'vertical', true, d3_array_1.ascending], + 'top-right': [pl, 0, innerWidth, pt, 'vertical', true, d3_array_1.ascending], + 'bottom-left': [ + pl, + height - pb, + innerWidth, + pb, + 'vertical', + false, + d3_array_1.ascending, + ], + 'bottom-right': [ + pl, + height - pb, + innerWidth, + pb, + 'vertical', + false, + d3_array_1.ascending, + ], + center: centerSection, + inner: centerSection, + outer: centerSection, + }; + return xySection; +} +function placeNonEntityComponents(components, coordinate, area, position) { + const [axisComponents, nonAxisComponents] = (0, array_1.divide)(components, (component) => { + if (typeof component.type === 'string' && + component.type.startsWith('axis')) { + return true; + } + return false; + }); + placeNonEntityAxis(axisComponents, coordinate, area, position); + // in current stage, only legend component which located in the center can be placed + placeCenter(nonAxisComponents, coordinate, area); +} +function placeNonEntityAxis(components, coordinate, area, position) { + if (position === 'center') { + if ((0, coordinate_1.isRadar)(coordinate)) { + placeAxisRadar(components, coordinate, area, position); + } + else if ((0, coordinate_1.isPolar)(coordinate)) { + placeArcLinear(components, coordinate, area); + } + else if ((0, coordinate_1.isParallel)(coordinate)) { + placeAxisParallel(components, coordinate, area, components[0].orientation); + } + } + else if (position === 'inner') { + placeAxisArcInner(components, coordinate, area); + } + else if (position === 'outer') { + placeAxisArcOuter(components, coordinate, area); + } +} +function placeAxisArcInner(components, coordinate, area) { + const [x, y, , height] = area; + const [cx, cy] = coordinate.getCenter(); + const [innerRadius] = (0, coordinate_1.radiusOf)(coordinate); + const r = height / 2; + const size = innerRadius * r; + const x0 = cx - size; + const y0 = cy - size; + for (let i = 0; i < components.length; i++) { + const component = components[i]; + component.bbox = { + x: x + x0, + y: y + y0, + width: size * 2, + height: size * 2, + }; + } +} +function placeAxisArcOuter(components, coordinate, area) { + const [x, y, width, height] = area; + for (const component of components) { + component.bbox = { x, y, width, height }; + } +} +/** + * @example arcX, arcY, axisLinear with angle + */ +function placeArcLinear(components, coordinate, area) { + const [x, y, width, height] = area; + for (const component of components) { + component.bbox = { x: x, y, width, height }; + } +} +function placeAxisParallel(components, coordinate, area, orientation) { + if (orientation === 'horizontal') { + placeAxisParallelHorizontal(components, coordinate, area); + } + else if (orientation === 'vertical') { + placeAxisParallelVertical(components, coordinate, area); + } +} +function placeAxisParallelVertical(components, coordinate, area) { + const [x, y, , height] = area; + // Create a high dimension vector and map to a list of two-dimension points. + // [0, 0, 0] -> [x0, 0, x1, 0, x2, 0] + const vector = new Array(components.length).fill(0); + const points = coordinate.map(vector); + // Extract x of each points. + // [x0, 0, x1, 0, x2, 0] -> [x0, x1, x2] + const X = points.filter((_, i) => i % 2 === 0).map((d) => d + x); + // Place each axis by coordinate in parallel coordinate. + for (let i = 0; i < components.length; i++) { + const component = components[i]; + const x = X[i]; + const width = X[i + 1] - x; + component.bbox = { x, y, width, height }; + } +} +function placeAxisParallelHorizontal(components, coordinate, area) { + const [x, y, width] = area; + // Create a high dimension vector and map to a list of two-dimension points. + // [0, 0, 0] -> [height, y0, height, y1, height, y2] + const vector = new Array(components.length).fill(0); + const points = coordinate.map(vector); + // Extract y of each points. + // [x0, 0, x1, 0, x2, 0] -> [x0, x1, x2] + const Y = points.filter((_, i) => i % 2 === 1).map((d) => d + y); + // Place each axis by coordinate in parallel coordinate. + for (let i = 0; i < components.length; i++) { + const component = components[i]; + const y = Y[i]; + const height = Y[i + 1] - y; + component.bbox = { x, y, width, height }; + } +} +function placeAxisRadar(components, coordinate, area, position) { + const [x, y, width, height] = area; + for (const component of components) { + component.bbox = { x, y, width, height }; + component.radar = { + index: components.indexOf(component), + count: components.length, + }; + } +} +function placePaddingArea(components, coordinate, area) { + const [x, y, width, height, direction, reverse, comparator, minX, totalSize] = area; + const [mainStartKey, mainStartValue, crossStartKey, crossStartValue, mainSizeKey, mainSizeValue, crossSizeKey, crossSizeValue,] = direction === 'vertical' + ? ['y', y, 'x', x, 'height', height, 'width', width] + : ['x', x, 'y', y, 'width', width, 'height', height]; + // Sort components by order. + // The smaller the order, the closer to center. + components.sort((a, b) => comparator === null || comparator === void 0 ? void 0 : comparator(a.order, b.order)); + const isLarge = (type) => type === 'title' || type === 'group' || type.startsWith('legend'); + const crossSizeOf = (type, small, bigger) => { + if (bigger === undefined) + return small; + if (isLarge(type)) + return bigger; + return small; + }; + const crossStartOf = (type, x, minX) => { + if (minX === undefined) + return x; + if (isLarge(type)) + return minX; + return x; + }; + const startValue = reverse ? mainStartValue + mainSizeValue : mainStartValue; + for (let i = 0, start = startValue; i < components.length; i++) { + const component = components[i]; + const { crossPadding = 0, type } = component; + const { size } = component; + component.bbox = { + [mainStartKey]: reverse + ? start - size - crossPadding + : start + crossPadding, + [crossStartKey]: crossStartOf(type, crossStartValue, minX), + [mainSizeKey]: size, + [crossSizeKey]: crossSizeOf(type, crossSizeValue, totalSize), + }; + start += (size + crossPadding) * (reverse ? -1 : 1); + } + // Place group components. + const groupComponents = components.filter((d) => d.type === 'group'); + for (const group of groupComponents) { + const { bbox, children } = group; + const size = bbox[crossSizeKey]; + const step = size / children.length; + const justifyContent = children.reduce((j, child) => { + var _a; + const j0 = (_a = child.layout) === null || _a === void 0 ? void 0 : _a.justifyContent; + return j0 ? j0 : j; + }, 'flex-start'); + const L = children.map((d, i) => { + const { length = step, padding = 0 } = d; + return length + (i === children.length - 1 ? 0 : padding); + }); + const totalLength = (0, d3_array_1.sum)(L); + const diff = size - totalLength; + const offset = justifyContent === 'flex-start' + ? 0 + : justifyContent === 'center' + ? diff / 2 + : diff; + for (let i = 0, start = bbox[crossStartKey] + offset; i < children.length; i++) { + const component = children[i]; + const { padding = 0 } = component; + const interval = i === children.length - 1 ? 0 : padding; + component.bbox = { + [mainSizeKey]: bbox[mainSizeKey], + [mainStartKey]: bbox[mainStartKey], + [crossStartKey]: start, + [crossSizeKey]: L[i] - interval, + }; + (0, util_1.deepMix)(component, { layout: { justifyContent } }); + start += L[i]; + } + } +} +/** + * @example legend in the center of radial or polar system + */ +function placeCenter(components, coordinate, area) { + if (components.length === 0) + return; + const [x, y, width, height] = area; + const [innerRadius] = (0, coordinate_1.radiusOf)(coordinate); + const r = ((height / 2) * innerRadius) / Math.sqrt(2); + const cx = x + width / 2; + const cy = y + height / 2; + for (let i = 0; i < components.length; i++) { + const component = components[i]; + component.bbox = { x: cx - r, y: cy - r, width: r * 2, height: r * 2 }; + } +} +//# sourceMappingURL=layout.js.map +}, function(modId) { var map = {"../utils/coordinate":1751263815882,"../utils/helper":1751263815829,"../utils/array":1751263815830,"../utils/string":1751263815900,"./component":1751263816094,"./coordinate":1751263816096}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816117, function(require, module, exports) { + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createColumnOf = exports.initializeMark = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +const helper_1 = require("../utils/helper"); +const library_1 = require("./library"); +const transform_1 = require("./transform"); +function initializeMark(partialMark, partialProps, context) { + return __awaiter(this, void 0, void 0, function* () { + // Apply transform to mark to derive indices, data, encode, etc,. + const [I, transformedMark] = yield applyMarkTransform(partialMark, partialProps, context); + const { encode, scale, data, tooltip } = transformedMark; + // Skip mark with non-tabular data. Do not skip empty + // data, they are useful for facet to display axes. + if (Array.isArray(data) === false) { + return null; + } + // Group non-independent channels with same prefix, such as x1, x2 => x. + // For independent channels, dot not group them, such as position1, position2. + const { channels: channelDescriptors } = partialProps; + const nameChannels = (0, d3_array_1.rollups)(Object.entries(encode).filter(([, value]) => (0, helper_1.defined)(value)), (values) => values.map(([key, options]) => (Object.assign({ name: key }, options))), ([key]) => { + var _a; + const prefix = (_a = /([^\d]+)\d*$/.exec(key)) === null || _a === void 0 ? void 0 : _a[1]; + const descriptor = channelDescriptors.find((d) => d.name === prefix); + if (descriptor === null || descriptor === void 0 ? void 0 : descriptor.independent) + return key; + return prefix; + }); + // Check required channels and initialize scale options for each channel. + const channels = channelDescriptors + .filter((descriptor) => { + const { name, required } = descriptor; + if (nameChannels.find(([d]) => d === name)) + return true; + if (required) + throw new Error(`Missing encoding for channel: ${name}.`); + return false; + }) + .flatMap((descriptor) => { + const { name, scale: scaleType, scaleKey, range, quantitative, ordinal, } = descriptor; + const valuesArray = nameChannels.filter(([channel]) => channel.startsWith(name)); + return valuesArray.map(([channel, values], i) => { + const visual = values.some((d) => d.visual); + const constant = values.some((d) => d.constant); + const _a = scale[channel] || {}, { independent = false, + // Use channel name as default scale key. + key = scaleKey || channel, + // Visual channel use identity scale. + type = constant ? 'constant' : visual ? 'identity' : scaleType } = _a, scaleOptions = __rest(_a, ["independent", "key", "type"]); + // For constant scale, infer range from data. + const isConstant = type === 'constant'; + const finalRange = isConstant ? undefined : range; + return { + name: channel, + values, + // Generate a unique key for independent channel, + // which will not group with any other channels. + scaleKey: independent || isConstant ? Symbol('independent') : key, + scale: Object.assign(Object.assign({ type, range: finalRange }, scaleOptions), { quantitative, + ordinal }), + }; + }); + }); + return [transformedMark, Object.assign(Object.assign({}, partialProps), { index: I, channels, tooltip })]; + }); +} +exports.initializeMark = initializeMark; +function createColumnOf(library) { + const [useEncode] = (0, library_1.useLibrary)('encode', library); + return (data, encode) => { + if (encode === undefined) + return null; + if (data === undefined) + return null; + return Object.assign(Object.assign({}, encode), { type: 'column', value: useEncode(encode)(data), field: fieldOf(encode) }); + }; +} +exports.createColumnOf = createColumnOf; +function applyMarkTransform(mark, props, context) { + return __awaiter(this, void 0, void 0, function* () { + const { library } = context; + const [useTransform] = (0, library_1.useLibrary)('transform', library); + const { preInference = [], postInference = [] } = props; + const { transform = [] } = mark; + const transforms = [ + transform_1.applyDefaults, + transform_1.applyDataTransform, + transform_1.flatEncode, + transform_1.inferChannelsType, + transform_1.maybeVisualChannel, + transform_1.extractColumns, + transform_1.maybeArrayField, + transform_1.maybeNonAnimate, + transform_1.addGuideToScale, + transform_1.normalizeTooltip, + ...preInference.map(useTransform), + ...transform.map(useTransform), + ...postInference.map(useTransform), + transform_1.extractTooltip, + ]; + let index = []; + let transformedMark = mark; + for (const t of transforms) { + [index, transformedMark] = yield t(index, transformedMark, context); + } + return [index, transformedMark]; + }); +} +function fieldOf(encode) { + const { type, value } = encode; + if (type === 'field' && typeof value === 'string') + return value; + return null; +} +//# sourceMappingURL=mark.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"./library":1751263816097,"./transform":1751263816118}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816118, function(require, module, exports) { + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.maybeNonAnimate = exports.addGuideToScale = exports.maybeArrayField = exports.extractTooltip = exports.normalizeTooltip = exports.extractColumns = exports.maybeVisualChannel = exports.inferChannelsType = exports.flatEncode = exports.applyDataTransform = exports.applyDefaults = exports.CALLBACK_ITEM_SYMBOL = void 0; +const util_1 = require("@antv/util"); +const d3_format_1 = require("@antv/vendor/d3-format"); +const array_1 = require("../utils/array"); +const helper_1 = require("../utils/helper"); +const mark_1 = require("../utils/mark"); +const library_1 = require("./library"); +const mark_2 = require("./mark"); +const scale_1 = require("./scale"); +exports.CALLBACK_ITEM_SYMBOL = Symbol('CALLBACK_ITEM'); +// @todo Add more defaults. +function applyDefaults(I, mark, context) { + const { encode = {}, scale = {}, transform = [] } = mark, rest = __rest(mark, ["encode", "scale", "transform"]); + return [I, Object.assign(Object.assign({}, rest), { encode, scale, transform })]; +} +exports.applyDefaults = applyDefaults; +function applyDataTransform(I, mark, context) { + return __awaiter(this, void 0, void 0, function* () { + const { library } = context; + const { data } = mark; + const [useData] = (0, library_1.useLibrary)('data', library); + const descriptor = normalizedDataSource(data); + const { transform: T = [] } = descriptor, connector = __rest(descriptor, ["transform"]); + const transform = [connector, ...T]; + const transformFunctions = transform.map((t) => useData(t, context)); + const transformedData = yield (0, helper_1.composeAsync)(transformFunctions)(data); + // Maintain the consistency of shape between input and output data. + // If the shape of raw data is like { value: any } + // and the returned transformedData is Object, + // returns the wrapped data: { value: transformedData }, + // otherwise returns the processed tabular data. + const newData = data && !Array.isArray(data) && !Array.isArray(transformedData) + ? { value: transformedData } + : transformedData; + return [ + Array.isArray(transformedData) ? (0, array_1.indexOf)(transformedData) : [], + Object.assign(Object.assign({}, mark), { data: newData }), + ]; + }); +} +exports.applyDataTransform = applyDataTransform; +function flatEncode(I, mark, context) { + const { encode } = mark; + if (!encode) + return [I, mark]; + const flattenEncode = {}; + for (const [key, value] of Object.entries(encode)) { + if (Array.isArray(value)) { + for (let i = 0; i < value.length; i++) { + const name = `${key}${i === 0 ? '' : i}`; + flattenEncode[name] = value[i]; + } + } + else { + flattenEncode[key] = value; + } + } + return [I, Object.assign(Object.assign({}, mark), { encode: flattenEncode })]; +} +exports.flatEncode = flatEncode; +function inferChannelsType(I, mark, context) { + const { encode, data } = mark; + if (!encode) + return [I, mark]; + const typedEncode = (0, array_1.mapObject)(encode, (channel) => { + if (isTypedChannel(channel)) + return channel; + const type = inferChannelType(data, channel); + return { type, value: channel }; + }); + return [I, Object.assign(Object.assign({}, mark), { encode: typedEncode })]; +} +exports.inferChannelsType = inferChannelsType; +function maybeVisualChannel(I, mark, context) { + const { encode } = mark; + if (!encode) + return [I, mark]; + const newEncode = (0, array_1.mapObject)(encode, (channel, name) => { + const { type } = channel; + if (type !== 'constant' || (0, scale_1.isPosition)(name)) + return channel; + return Object.assign(Object.assign({}, channel), { constant: true }); + }); + return [I, Object.assign(Object.assign({}, mark), { encode: newEncode })]; +} +exports.maybeVisualChannel = maybeVisualChannel; +function extractColumns(I, mark, context) { + const { encode, data } = mark; + if (!encode) + return [I, mark]; + const { library } = context; + const columnOf = (0, mark_2.createColumnOf)(library); + const valuedEncode = (0, array_1.mapObject)(encode, (channel) => columnOf(data, channel)); + return [I, Object.assign(Object.assign({}, mark), { encode: valuedEncode })]; +} +exports.extractColumns = extractColumns; +/** + * Normalize mark.tooltip to {title, items}. + */ +function normalizeTooltip(I, mark, context) { + const { tooltip = {} } = mark; + if ((0, helper_1.isUnset)(tooltip)) + return [I, mark]; + if (Array.isArray(tooltip)) { + return [I, Object.assign(Object.assign({}, mark), { tooltip: { items: tooltip } })]; + } + if ((0, helper_1.isStrictObject)(tooltip) && (0, mark_1.isFullTooltip)(tooltip)) { + return [I, Object.assign(Object.assign({}, mark), { tooltip })]; + } + return [I, Object.assign(Object.assign({}, mark), { tooltip: { items: [tooltip] } })]; +} +exports.normalizeTooltip = normalizeTooltip; +function extractTooltip(I, mark, context) { + const { data, encode, tooltip = {} } = mark; + if ((0, helper_1.isUnset)(tooltip)) + return [I, mark]; + const valueOf = (item) => { + if (!item) + return item; + if (typeof item === 'string') { + return I.map((i) => ({ name: item, value: data[i][item] })); + } + if ((0, helper_1.isStrictObject)(item)) { + const { field, channel, color, name = field, valueFormatter = (d) => d, } = item; + // Support d3-format. + const normalizedValueFormatter = typeof valueFormatter === 'string' + ? (0, d3_format_1.format)(valueFormatter) + : valueFormatter; + // Field name. + const definedChannel = channel && encode[channel]; + const channelField = definedChannel && encode[channel].field; + const name1 = name || channelField || channel; + const values = []; + for (const i of I) { + const value1 = field + ? data[i][field] + : definedChannel + ? encode[channel].value[i] + : null; + values[i] = { + name: name1, + color, + value: normalizedValueFormatter(value1), + }; + } + return values; + } + if (typeof item === 'function') { + const values = []; + for (const i of I) { + const v = item(data[i], i, data, encode); + if ((0, helper_1.isStrictObject)(v)) + values[i] = Object.assign(Object.assign({}, v), { [exports.CALLBACK_ITEM_SYMBOL]: true }); + else + values[i] = { value: v }; + } + return values; + } + return item; + }; + const { title, items = [] } = tooltip, rest = __rest(tooltip, ["title", "items"]); + const newTooltip = Object.assign({ title: valueOf(title), items: Array.isArray(items) ? items.map(valueOf) : [] }, rest); + return [I, Object.assign(Object.assign({}, mark), { tooltip: newTooltip })]; +} +exports.extractTooltip = extractTooltip; +function maybeArrayField(I, mark, context) { + const { encode } = mark, rest = __rest(mark, ["encode"]); + if (!encode) + return [I, mark]; + const columns = Object.entries(encode); + const arrayColumns = columns + .filter(([, channel]) => { + const { value: V } = channel; + return Array.isArray(V[0]); + }) + .flatMap(([key, V]) => { + const columns = [[key, new Array(I.length).fill(undefined)]]; + const { value: rows } = V, rest = __rest(V, ["value"]); + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if (Array.isArray(row)) { + for (let j = 0; j < row.length; j++) { + const column = columns[j] || [ + `${key}${j}`, + new Array(I).fill(undefined), + ]; + column[1][i] = row[j]; + columns[j] = column; + } + } + } + return columns.map(([key, value]) => [ + key, + Object.assign({ type: 'column', value }, rest), + ]); + }); + const newEncode = Object.fromEntries([...columns, ...arrayColumns]); + return [I, Object.assign(Object.assign({}, rest), { encode: newEncode })]; +} +exports.maybeArrayField = maybeArrayField; +function addGuideToScale(I, mark, context) { + const { axis = {}, legend = {}, slider = {}, scrollbar = {} } = mark; + const normalize = (guide, channel) => { + if (typeof guide === 'boolean') + return guide ? {} : null; + const eachGuide = guide[channel]; + return eachGuide === undefined || eachGuide ? eachGuide : null; + }; + const axisChannels = typeof axis === 'object' + ? Array.from(new Set(['x', 'y', 'z', ...Object.keys(axis)])) + : ['x', 'y', 'z']; + (0, util_1.deepMix)(mark, { + scale: Object.assign(Object.assign({}, Object.fromEntries(axisChannels.map((channel) => { + const scrollbarOptions = normalize(scrollbar, channel); + return [ + channel, + Object.assign({ guide: normalize(axis, channel), slider: normalize(slider, channel), scrollbar: scrollbarOptions }, (scrollbarOptions && { + ratio: scrollbarOptions.ratio === undefined + ? 0.5 + : scrollbarOptions.ratio, + })), + ]; + }))), { color: { guide: normalize(legend, 'color') }, size: { guide: normalize(legend, 'size') }, shape: { guide: normalize(legend, 'shape') }, + // fixme: opacity is conflict with DisplayObject.opacity + // to be confirm. + opacity: { guide: normalize(legend, 'opacity') } }), + }); + return [I, mark]; +} +exports.addGuideToScale = addGuideToScale; +function maybeNonAnimate(I, mark, context) { + const { animate } = mark; + if (animate || animate === undefined) + return [I, mark]; + (0, util_1.deepMix)(mark, { + animate: { + enter: { type: null }, + exit: { type: null }, + update: { type: null }, + }, + }); + return [I, mark]; +} +exports.maybeNonAnimate = maybeNonAnimate; +function isTypedChannel(channel) { + if (typeof channel !== 'object' || + channel instanceof Date || + channel === null) { + return false; + } + const { type } = channel; + return (0, helper_1.defined)(type); +} +function inferChannelType(data, channel) { + if (typeof channel === 'function') + return 'transform'; + if (typeof channel === 'string' && isField(data, channel)) + return 'field'; + return 'constant'; +} +function isField(data, value) { + if (!Array.isArray(data)) + return false; + return data.some((d) => d[value] !== undefined); +} +function normalizedDataSource(data) { + // Liquid、Gauge need number data. + if ((0, util_1.isNumber)(data)) + return { type: 'inline', value: data }; + // Return null as a placeholder. + if (!data) + return { type: 'inline', value: null }; + if (Array.isArray(data)) + return { type: 'inline', value: data }; + const { type = 'inline' } = data, rest = __rest(data, ["type"]); + return Object.assign(Object.assign({}, rest), { type }); +} +//# sourceMappingURL=transform.js.map +}, function(modId) { var map = {"../utils/array":1751263815830,"../utils/helper":1751263815829,"../utils/mark":1751263815997,"./library":1751263816097,"./mark":1751263816117,"./scale":1751263816114}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816119, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.preprocessOption = void 0; +const flow_1 = require("../../utils/flow"); +const style_1 = require("./style"); +function preprocessOption(options) { + const convertedOptions = adapter(options); + // If there are children, recursively convert each child node. + if (convertedOptions.children && Array.isArray(convertedOptions.children)) { + convertedOptions.children = convertedOptions.children.map((child) => preprocessOption(child)); + } + return convertedOptions; +} +exports.preprocessOption = preprocessOption; +// Entry point for all syntactic sugar functions. +function adapter(options) { + //@todo define a type for params of flow + return (0, flow_1.flow)(style_1.columnWidthRatio)(options); +} +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"../../utils/flow":1751263816120,"./style":1751263816121}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816120, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.flow = void 0; +/** + * 类似 lodash.flow 的方法 + * @param flows + */ +function flow(...flows) { + return (param) => { + return flows.reduce((result, f) => { + return f(result); + }, param); + }; +} +exports.flow = flow; +//# sourceMappingURL=flow.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816121, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.columnWidthRatio = void 0; +const util_1 = require("@antv/util"); +// style: { columnWidthRatio: 0.2 } => scale: { x: { padding: 0.8 } } +function columnWidthRatio(options) { + const { style, scale, type } = options; + const scaleOption = {}; + const columnWidthRatio = (0, util_1.get)(style, 'columnWidthRatio'); + if (columnWidthRatio && type === 'interval') { + scaleOption.x = Object.assign(Object.assign({}, scale === null || scale === void 0 ? void 0 : scale.x), { padding: 1 - columnWidthRatio }); + } + return Object.assign(Object.assign({}, options), { scale: Object.assign(Object.assign({}, scale), scaleOption) }); +} +exports.columnWidthRatio = columnWidthRatio; +//# sourceMappingURL=style.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816122, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.show = exports.hide = exports.setStyle = exports.getStyle = void 0; +const traverse_elements_1 = require("./traverse-elements"); +const defaultStyle = { + visibility: 'visible', + opacity: 1, + fillOpacity: 1, + strokeOpacity: 1, +}; +function getStyle(element, key) { + let value; + (0, traverse_elements_1.traverseElements)(element, (el) => { + var _a; + if (el.tagName !== 'g' && ((_a = el.style) === null || _a === void 0 ? void 0 : _a[key]) !== undefined) { + value = el.style[key]; + return true; + } + return false; + }); + return value !== null && value !== void 0 ? value : defaultStyle[key]; +} +exports.getStyle = getStyle; +function setStyle(element, key, value, recursive) { + element.style[key] = value; + if (recursive) { + element.children.forEach((child) => setStyle(child, key, value, recursive)); + } +} +exports.setStyle = setStyle; +function hide(element) { + setStyle(element, 'visibility', 'hidden', true); +} +exports.hide = hide; +function show(element) { + setStyle(element, 'visibility', 'visible', true); +} +exports.show = show; +//# sourceMappingURL=style.js.map +}, function(modId) { var map = {"./traverse-elements":1751263816123}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816123, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.traverseElements = void 0; +function traverseElements(element, visitor) { + if (visitor(element)) + return true; + if (element.tagName === 'g') { + const { childNodes = [] } = element; + for (const child of childNodes) { + if (traverseElements(child, visitor)) + return true; + } + } + return false; +} +exports.traverseElements = traverseElements; +//# sourceMappingURL=traverse-elements.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816124, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ElementHighlightByX = void 0; +const utils_1 = require("./utils"); +const elementHighlight_1 = require("./elementHighlight"); +function ElementHighlightByX(options) { + return (0, elementHighlight_1.ElementHighlight)(Object.assign(Object.assign({}, options), { createGroup: utils_1.createXKey })); +} +exports.ElementHighlightByX = ElementHighlightByX; +ElementHighlightByX.props = { + reapplyWhenUpdate: true, +}; +//# sourceMappingURL=elementHighlightByX.js.map +}, function(modId) { var map = {"./utils":1751263816080,"./elementHighlight":1751263816079}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816125, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ElementHighlightByColor = void 0; +const utils_1 = require("./utils"); +const elementHighlight_1 = require("./elementHighlight"); +function ElementHighlightByColor(options) { + return (0, elementHighlight_1.ElementHighlight)(Object.assign(Object.assign({}, options), { createGroup: utils_1.createColorKey })); +} +exports.ElementHighlightByColor = ElementHighlightByColor; +ElementHighlightByColor.props = { + reapplyWhenUpdate: true, +}; +//# sourceMappingURL=elementHighlightByColor.js.map +}, function(modId) { var map = {"./utils":1751263816080,"./elementHighlight":1751263816079}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816126, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ElementSelect = exports.elementSelect = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +const util_1 = require("@antv/util"); +const helper_1 = require("../utils/helper"); +const traverse_elements_1 = require("../utils/traverse-elements"); +const utils_1 = require("./utils"); +/** + * Active a group of elements. + */ +function elementSelect(root, { elements: elementsof, // given the root of chart returns elements to be manipulated +datum, // given each element returns the datum of it +groupKey = (d) => d, // group elements by specified key +regionGroupKey = (d) => d, // how to group elements when click region +link = false, // draw link or not +single = false, // single select or not +multipleSelectHotkey, // hotkey for multi-select mode +coordinate, background = false, scale, emitter, state = {}, region = false, regionEleFilter = (el) => utils_1.VALID_FIND_BY_X_MARKS.includes(el.markType), }) { + var _a; + const elements = elementsof(root); + const elementSet = new Set(elements); + const findElement = (0, utils_1.createFindElementByEvent)({ + elementsof, + root, + coordinate, + scale, + }); + const keyGroup = (0, d3_array_1.group)(elements, groupKey); + const regionGroup = (0, d3_array_1.group)(elements, regionGroupKey); + const valueof = (0, utils_1.createValueof)(elements, datum); + const [appendLink, removeLink] = (0, utils_1.renderLink)(Object.assign({ link, + elements, + valueof, + coordinate }, (0, helper_1.subObject)(state.selected, 'link'))); + const [appendBackground, removeBackground] = (0, utils_1.renderBackground)(Object.assign({ document: root.ownerDocument, background, + coordinate, + scale, + valueof }, (0, helper_1.subObject)(state.selected, 'background'))); + const elementStyle = (0, util_1.deepMix)(state, { + selected: Object.assign({}, (((_a = state.selected) === null || _a === void 0 ? void 0 : _a.offset) && { + // Apply translate to mock slice out. + transform: (...params) => { + const value = state.selected.offset(...params); + const [, i] = params; + return (0, utils_1.offsetTransform)(elements[i], value, coordinate); + }, + })), + }); + const useState = (0, utils_1.createUseState)(elementStyle, elements); + const { updateState, removeState, hasState } = useState(valueof); + let isMultiSelectMode = !single; // "single" determines whether to multi-select by default + let activeHotkey = null; // Track the currently active hotkey + const clear = (nativeEvent = true) => { + for (const e of elements) { + removeState(e, 'selected', 'unselected'); + removeLink(e); + removeBackground(e); + } + if (nativeEvent) + emitter.emit('element:unselect', { nativeEvent: true }); + return; + }; + const singleSelect = ({ event, element, nativeEvent = true, filter = (el) => true, groupBy = groupKey, groupMap = keyGroup, }) => { + const filteredElements = elements.filter(filter); + // Clear states if clicked selected element. + if (hasState(element, 'selected')) + clear(); + else { + const k = groupBy(element); + const group = groupMap.get(k); + const groupSet = new Set(group); + for (const e of filteredElements) { + if (groupSet.has(e)) + updateState(e, 'selected'); + else { + updateState(e, 'unselected'); + removeLink(e); + } + if (e !== element) + removeBackground(e); + } + appendLink(group); + appendBackground(element); + if (!nativeEvent) + return; + emitter.emit('element:select', Object.assign(Object.assign({}, event), { nativeEvent, data: { + data: [datum(element), ...group.map(datum)], + } })); + } + }; + const multipleSelect = ({ event, element, nativeEvent = true, filter = (el) => true, groupBy = groupKey, groupMap = keyGroup, }) => { + const k = groupBy(element); + const group = groupMap.get(k); + const groupSet = new Set(group); + const filteredElements = elements.filter(filter); + if (!hasState(element, 'selected')) { + const hasSelectedGroup = group.some((e) => hasState(e, 'selected')); + for (const e of filteredElements) { + if (groupSet.has(e)) + updateState(e, 'selected'); + else if (!hasState(e, 'selected')) + updateState(e, 'unselected'); + } + // Append link for each group only once. + if (!hasSelectedGroup && link) + appendLink(group); + appendBackground(element); + } + else { + // If there is no selected elements after resetting this group, + // clear the states. + const hasSelected = elements.some((e) => !groupSet.has(e) && hasState(e, 'selected')); + if (!hasSelected) + return clear(); + // If there are still some selected elements after resetting this group, + // only remove the link. + for (const e of group) { + updateState(e, 'unselected'); + removeLink(e); + removeBackground(e); + } + } + if (!nativeEvent) + return; + emitter.emit('element:select', Object.assign(Object.assign({}, event), { nativeEvent, data: { + data: elements.filter((e) => hasState(e, 'selected')).map(datum), + } })); + }; + const isClickElementOrGroup = (element) => { + if (elementSet.has(element)) + return true; + for (const group of elementSet) { + const found = (0, traverse_elements_1.traverseElements)(group, (el) => el === element); + if (found) + return true; + } + return false; + }; + const getRealElement = (element) => { + if (elementSet.has(element)) + return element; + for (const group of elementSet) { + let match = null; + (0, traverse_elements_1.traverseElements)(group, (el) => { + if (el === element) + match = group; + }); + if (match) + return match; + } + return element; + }; + const click = (event) => { + const { target: element, nativeEvent = true } = event; + const select = !isMultiSelectMode ? singleSelect : multipleSelect; + let el = element; + const isClickElement = isClickElementOrGroup(element); + if (!region || isClickElement) { + // Click non-element shape, reset. + // Such as the rest of content area(background). + if (!isClickElement) + return clear(); + return select({ + event, + element: getRealElement(el), + nativeEvent, + groupBy: groupKey, + }); + } + else { + // Click background region area, select elements in the region. + // Get element at cursor.x position. + el = findElement(event); + if (!elementSet.has(el)) + return clear(); + return select({ + event, + element: el, + nativeEvent, + filter: regionEleFilter, + groupBy: regionGroupKey, + groupMap: regionGroup, + }); + } + }; + // Handle keyboard events for multi-select mode + const hotkeys = Array.isArray(multipleSelectHotkey) + ? multipleSelectHotkey + : [multipleSelectHotkey]; + const handleKeyDown = (event) => { + if (hotkeys.includes(event.code) && !activeHotkey) { + activeHotkey = event.code; + isMultiSelectMode = true; + } + }; + const handleKeyUp = (event) => { + if (event.code === activeHotkey) { + activeHotkey = null; + isMultiSelectMode = false; + } + }; + root.addEventListener('click', click); + if (multipleSelectHotkey) { + // If a hotkey is set, the initial state should be single mode + isMultiSelectMode = false; + document.addEventListener('keydown', handleKeyDown); + document.addEventListener('keyup', handleKeyUp); + } + const onSelect = (e) => { + const { nativeEvent, data } = e; + if (nativeEvent) + return; + const selectedData = !isMultiSelectMode ? data.data.slice(0, 1) : data.data; + for (const d of selectedData) { + const element = (0, utils_1.selectElementByData)(elements, d, datum); + click({ target: element, nativeEvent: false }); + } + }; + const onUnSelect = () => { + clear(false); + }; + emitter.on('element:select', onSelect); + emitter.on('element:unselect', onUnSelect); + return () => { + for (const e of elements) + removeLink(e); + root.removeEventListener('click', click); + if (multipleSelectHotkey) { + document.removeEventListener('keydown', handleKeyDown); + document.removeEventListener('keyup', handleKeyUp); + } + emitter.off('element:select', onSelect); + emitter.off('element:unselect', onUnSelect); + }; +} +exports.elementSelect = elementSelect; +function ElementSelect(_a) { + var { createGroup, createRegionGroup, background = false, link = false } = _a, rest = __rest(_a, ["createGroup", "createRegionGroup", "background", "link"]); + return (context, _, emitter) => { + const { container, view, options } = context; + const { coordinate, scale } = view; + const plotArea = (0, utils_1.selectPlotArea)(container); + return elementSelect(plotArea, Object.assign({ elements: utils_1.selectG2Elements, datum: (0, utils_1.createDatumof)(view), groupKey: createGroup ? createGroup(view) : undefined, regionGroupKey: createRegionGroup + ? createRegionGroup(view) + : (0, utils_1.createXKey)(view), coordinate, + scale, state: (0, utils_1.mergeState)(options, [ + ['selected', background ? {} : { lineWidth: '1', stroke: '#000' }], + 'unselected', + ]), background, + link, + emitter }, rest)); + }; +} +exports.ElementSelect = ElementSelect; +ElementSelect.props = { + reapplyWhenUpdate: true, +}; +//# sourceMappingURL=elementSelect.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../utils/traverse-elements":1751263816123,"./utils":1751263816080}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816127, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ElementSelectByX = void 0; +const utils_1 = require("./utils"); +const elementSelect_1 = require("./elementSelect"); +function ElementSelectByX(options) { + return (0, elementSelect_1.ElementSelect)(Object.assign(Object.assign({}, options), { createGroup: utils_1.createXKey })); +} +exports.ElementSelectByX = ElementSelectByX; +ElementSelectByX.props = { + reapplyWhenUpdate: true, +}; +//# sourceMappingURL=elementSelectByX.js.map +}, function(modId) { var map = {"./utils":1751263816080,"./elementSelect":1751263816126}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816128, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ElementSelectByColor = void 0; +const utils_1 = require("./utils"); +const elementSelect_1 = require("./elementSelect"); +function ElementSelectByColor(options) { + return (0, elementSelect_1.ElementSelect)(Object.assign(Object.assign({}, options), { createGroup: utils_1.createColorKey })); +} +exports.ElementSelectByColor = ElementSelectByColor; +ElementSelectByColor.props = { + reapplyWhenUpdate: true, +}; +//# sourceMappingURL=elementSelectByColor.js.map +}, function(modId) { var map = {"./utils":1751263816080,"./elementSelect":1751263816126}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816129, function(require, module, exports) { + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ChartIndex = void 0; +const g_1 = require("@antv/g"); +const util_1 = require("@antv/util"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const helper_1 = require("../utils/helper"); +const runtime_1 = require("../runtime"); +const utils_1 = require("./utils"); +function maybeTransform(options) { + const { transform = [] } = options; + const normalizeY = transform.find((d) => d.type === 'normalizeY'); + if (normalizeY) + return normalizeY; + const newNormalizeY = { type: 'normalizeY' }; + transform.push(newNormalizeY); + options.transform = transform; + return newNormalizeY; +} +function markValue(markState, markName, channels) { + const [value] = Array.from(markState.entries()) + .filter(([mark]) => mark.type === markName) + .map(([mark]) => { + const { encode } = mark; + const channel = (name) => { + const channel = encode[name]; + return [name, channel ? channel.value : undefined]; + }; + return Object.fromEntries(channels.map(channel)); + }); + return value; +} +/** + * @todo Perf + */ +function ChartIndex(_a) { + var { wait = 20, leading, trailing = false, labelFormatter = (date) => `${date}` } = _a, style = __rest(_a, ["wait", "leading", "trailing", "labelFormatter"]); + return (context) => { + const { view, container, update, setState } = context; + const { markState, scale, coordinate } = view; + // Get line mark value, exit if it is not existed. + const value = markValue(markState, 'line', ['x', 'y', 'series']); + if (!value) + return; + // Prepare channel value. + const { y: Y, x: X, series: S = [] } = value; + const I = Y.map((_, i) => i); + const sortedX = (0, d3_array_1.sort)(I.map((i) => X[i])); + // Prepare shapes. + const plotArea = (0, utils_1.selectPlotArea)(container); + const lines = container.getElementsByClassName(runtime_1.ELEMENT_CLASS_NAME); + const labels = container.getElementsByClassName(runtime_1.LABEL_CLASS_NAME); + // The format of label key: `${elementKey}-index`, + // group labels by elementKey. + const keyofLabel = (d) => d.__data__.key.split('-')[0]; + const keyLabels = (0, d3_array_1.group)(labels, keyofLabel); + const rule = new g_1.Line({ + style: Object.assign({ x1: 0, y1: 0, x2: 0, y2: plotArea.getAttribute('height'), stroke: 'black', lineWidth: 1 }, (0, helper_1.subObject)(style, 'rule')), + }); + const text = new g_1.Text({ + style: Object.assign({ x: 0, y: plotArea.getAttribute('height'), text: '', fontSize: 10 }, (0, helper_1.subObject)(style, 'label')), + }); + rule.append(text); + plotArea.appendChild(rule); + // Get the closet date to the rule. + const dateByFocus = (coordinate, scaleX, focus) => { + const [normalizedX] = coordinate.invert(focus); + const date = scaleX.invert(normalizedX); + return sortedX[(0, d3_array_1.bisectCenter)(sortedX, date)]; + }; + // Update rule and label content. + const updateRule = (focus, date) => { + rule.setAttribute('x1', focus[0]); + rule.setAttribute('x2', focus[0]); + text.setAttribute('text', labelFormatter(date)); + }; + // Store the new inner state alter rerender the view. + let newView; + // Rerender the view to update basis for each line. + const updateBasisByRerender = (focus) => __awaiter(this, void 0, void 0, function* () { + // Find the closetDate to the rule. + const { x: scaleX } = scale; + const date = dateByFocus(coordinate, scaleX, focus); + updateRule(focus, date); + setState('chartIndex', (options) => { + // Clone options and get line mark. + const clonedOptions = (0, util_1.deepMix)({}, options); + const lineMark = clonedOptions.marks.find((d) => d.type === 'line'); + // Update domain of y scale for the line mark. + const r = (I) => (0, d3_array_1.max)(I, (i) => +Y[i]) / (0, d3_array_1.min)(I, (i) => +Y[i]); + const k = (0, d3_array_1.max)((0, d3_array_1.rollup)(I, r, (i) => S[i]).values()); + const domainY = [1 / k, k]; + (0, util_1.deepMix)(lineMark, { + scale: { y: { domain: domainY } }, + }); + // Update normalize options. + const normalizeY = maybeTransform(lineMark); + normalizeY.groupBy = 'color'; + normalizeY.basis = (I, Y) => { + const i = I[(0, d3_array_1.bisector)((i) => X[+i]).center(I, date)]; + return Y[i]; + }; + // Disable animation. + for (const mark of clonedOptions.marks) + mark.animate = false; + return clonedOptions; + }); + const newState = yield update('chartIndex'); + newView = newState.view; + }); + // Only apply translate to update basis for each line. + // If performance is ok, there is no need to use this + // strategy to update basis. + const updateBasisByTranslate = (focus) => { + // Find the closetDate to the rule. + const { scale, coordinate } = newView; + const { x: scaleX, y: scaleY } = scale; + const date = dateByFocus(coordinate, scaleX, focus); + updateRule(focus, date); + // Translate mark and label for better performance. + for (const line of lines) { + // Compute transform in y direction. + const { seriesIndex: SI, key } = line.__data__; + const i = SI[(0, d3_array_1.bisector)((i) => X[+i]).center(SI, date)]; + const p0 = [0, scaleY.map(1)]; // basis point + const p1 = [0, scaleY.map(Y[i] / Y[SI[0]])]; + const [, y0] = coordinate.map(p0); + const [, y1] = coordinate.map(p1); + const dy = y0 - y1; + line.setAttribute('transform', `translate(0, ${dy})`); + // Update line and related label. + const labels = keyLabels.get(key) || []; + for (const label of labels) { + // @todo Replace with style.transform. + // It now has unexpected behavior. + label.setAttribute('dy', dy); + } + } + }; + const updateBasis = (0, util_1.throttle)((event) => { + const focus = (0, utils_1.mousePosition)(plotArea, event); + if (!focus) + return; + updateBasisByTranslate(focus); + }, wait, { leading, trailing }); + updateBasisByRerender([0, 0]); + plotArea.addEventListener('pointerenter', updateBasis); + plotArea.addEventListener('pointermove', updateBasis); + plotArea.addEventListener('pointerleave', updateBasis); + return () => { + rule.remove(); + plotArea.removeEventListener('pointerenter', updateBasis); + plotArea.removeEventListener('pointermove', updateBasis); + plotArea.removeEventListener('pointerleave', updateBasis); + }; + }; +} +exports.ChartIndex = ChartIndex; +ChartIndex.props = { + reapplyWhenUpdate: true, +}; +//# sourceMappingURL=chartIndex.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../runtime":1751263816081,"./utils":1751263816080}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816130, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Fisheye = void 0; +const util_1 = require("@antv/util"); +const utils_1 = require("./utils"); +function maybeCoordinate(options) { + const { coordinate = {} } = options; + const { transform = [] } = coordinate; + const fisheye = transform.find((d) => d.type === 'fisheye'); + if (fisheye) + return fisheye; + const newFisheye = { type: 'fisheye' }; + transform.push(newFisheye); + coordinate.transform = transform; + options.coordinate = coordinate; + return newFisheye; +} +/** + * @todo Bind abstract data or data index. + */ +function Fisheye({ wait = 30, leading, trailing = false, }) { + return (context) => { + const { options, update, setState, container } = context; + const plotArea = (0, utils_1.selectPlotArea)(container); + const updateFocus = (0, util_1.throttle)((event) => { + const focus = (0, utils_1.mousePosition)(plotArea, event); + if (!focus) { + setState('fisheye'); + update(); + return; + } + setState('fisheye', (options) => { + // Clone options and mutate it. + // Disable animation. + const clonedOptions = (0, util_1.deepMix)({}, options, { + interaction: { tooltip: { preserve: true } }, + }); + for (const mark of clonedOptions.marks) + mark.animate = false; + const [x, y] = focus; + const fisheye = maybeCoordinate(clonedOptions); + fisheye.focusX = x; + fisheye.focusY = y; + fisheye.visual = true; + return clonedOptions; + }); + update(); + }, wait, { leading, trailing }); + // Bind events. + plotArea.addEventListener('pointerenter', updateFocus); + plotArea.addEventListener('pointermove', updateFocus); + plotArea.addEventListener('pointerleave', updateFocus); + return () => { + plotArea.removeEventListener('pointerenter', updateFocus); + plotArea.removeEventListener('pointermove', updateFocus); + plotArea.removeEventListener('pointerleave', updateFocus); + }; + }; +} +exports.Fisheye = Fisheye; +//# sourceMappingURL=fisheye.js.map +}, function(modId) { var map = {"./utils":1751263816080}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816131, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Tooltip = exports.tooltip = exports.seriesTooltip = exports.findSeriesElement = exports.findSingleElement = exports.maybeValue = void 0; +const g_1 = require("@antv/g"); +const d3_array_1 = require("@antv/vendor/d3-array"); +const util_1 = require("@antv/util"); +const component_1 = require("@antv/component"); +const helper_1 = require("../utils/helper"); +const coordinate_1 = require("../utils/coordinate"); +const vector_1 = require("../utils/vector"); +const scale_1 = require("../utils/scale"); +const transform_1 = require("../runtime/transform"); +const utils_1 = require("./utils"); +function getContainer(group, mount) { + if (mount) { + return typeof mount === 'string' ? document.querySelector(mount) : mount; + } + const canvas = group.ownerDocument.defaultView + .getContextService() + .getDomElement(); + return canvas.parentElement; +} +function getBounding(root) { + const bbox = root.getRenderBounds(); + const { min: [x1, y1], max: [x2, y2], } = bbox; + return { + x: x1, + y: y1, + width: x2 - x1, + height: y2 - y1, + }; +} +function getContainerOffset(container1, container2) { + const r1 = container1.getBoundingClientRect(); + const r2 = container2.getBoundingClientRect(); + return { + x: r1.x - r2.x, + y: r1.y - r2.y, + }; +} +function createTooltip(container, x0, y0, position, enterable, bounding, containerOffset, css = {}, offset = [10, 10]) { + const defaults = { + '.g2-tooltip': {}, + '.g2-tooltip-title': { + overflow: 'hidden', + 'white-space': 'nowrap', + 'text-overflow': 'ellipsis', + }, + }; + const tooltipElement = new component_1.Tooltip({ + className: 'tooltip', + style: { + x: x0, + y: y0, + container: containerOffset, + data: [], + bounding, + position, + enterable, + title: '', + offset, + template: { + prefixCls: 'g2-', + }, + style: (0, util_1.deepMix)(defaults, css), + }, + }); + container.appendChild(tooltipElement.HTMLTooltipElement); + return tooltipElement; +} +function showTooltip({ root, data, x, y, render, event, single, position = 'right-bottom', enterable = false, css, mount, bounding, offset, }) { + const container = getContainer(root, mount); + const canvasContainer = getContainer(root); + // All the views share the same tooltip. + const parent = single ? canvasContainer : root; + const b = bounding || getBounding(root); + const containerOffset = getContainerOffset(canvasContainer, container); + const { tooltipElement = createTooltip(container, x, y, position, enterable, b, containerOffset, css, offset), } = parent; + const { items, title = '' } = data; + tooltipElement.update(Object.assign({ x, + y, data: items, title, + position, + enterable, container: containerOffset }, (render !== undefined && { + content: render(event, { items, title }), + }))); + parent.tooltipElement = tooltipElement; +} +function hideTooltip({ root, single, emitter, nativeEvent = true, event = null, }) { + if (nativeEvent) { + emitter.emit('tooltip:hide', { nativeEvent }); + } + const container = getContainer(root); + const parent = single ? container : root; + const { tooltipElement } = parent; + if (tooltipElement) { + // Must be clientX, clientY. + tooltipElement.hide(event === null || event === void 0 ? void 0 : event.clientX, event === null || event === void 0 ? void 0 : event.clientY); + } + hideRuleY(root); + hideRuleX(root); + hideMarker(root); +} +function destroyTooltip({ root, single }) { + const container = getContainer(root); + const parent = single ? container : root; + if (!parent) + return; + const { tooltipElement } = parent; + if (tooltipElement) { + tooltipElement.destroy(); + parent.tooltipElement = undefined; + } + hideRuleY(root); + hideRuleX(root); + hideMarker(root); +} +function showUndefined(item) { + const { value } = item; + return Object.assign(Object.assign({}, item), { value: value === undefined ? 'undefined' : value }); +} +function singleItem(element) { + const { __data__: datum } = element; + const { title, items = [] } = datum; + const newItems = items + .filter(helper_1.defined) + .map((_a) => { + var { color = itemColorOf(element) } = _a, item = __rest(_a, ["color"]); + return (Object.assign(Object.assign({}, item), { color })); + }) + .map(showUndefined); + return Object.assign(Object.assign({}, (title && { title })), { items: newItems }); +} +function itemColorOf(element) { + const fill = element.getAttribute('fill'); + const stroke = element.getAttribute('stroke'); + const { __data__: datum } = element; + const { color = fill && fill !== 'transparent' ? fill : stroke } = datum; + return color; +} +function unique(items, key = (d) => d) { + const valueName = new Map(items.map((d) => [key(d), d])); + return Array.from(valueName.values()); +} +function groupItems(elements, scale, groupName, data = elements.map((d) => d['__data__']), theme = {}) { + const key = (d) => (d instanceof Date ? +d : d); + const T = unique(data.map((d) => d.title), key).filter(helper_1.defined); + const newItems = data + .flatMap((datum, i) => { + const element = elements[i]; + const { items = [], title } = datum; + const definedItems = items.filter(helper_1.defined); + // If there is only one item, use groupName as title by default. + const useGroupName = groupName !== undefined ? groupName : items.length <= 1 ? true : false; + return definedItems.map((_a) => { + var { color = itemColorOf(element) || theme.color, name } = _a, item = __rest(_a, ["color", "name"]); + const groupName = (0, helper_1.groupNameOf)(scale, datum); + // callback's priority is higher than groupName. + const name1 = useGroupName && !(transform_1.CALLBACK_ITEM_SYMBOL in item) + ? groupName || name + : name || groupName; + return Object.assign(Object.assign({}, item), { color, name: name1 || title }); + }); + }) + .map(showUndefined); + return Object.assign(Object.assign({}, (T.length > 0 && { title: T.join(',') })), { items: unique(newItems, (d) => `(${key(d.name)}, ${key(d.value)}, ${key(d.color)})`) }); +} +function updateRuleX(root, points, mouse, _a) { + var { plotWidth, plotHeight, mainWidth, mainHeight, startX, startY, transposed, polar, insetLeft, insetTop } = _a, rest = __rest(_a, ["plotWidth", "plotHeight", "mainWidth", "mainHeight", "startX", "startY", "transposed", "polar", "insetLeft", "insetTop"]); + const defaults = Object.assign({ lineWidth: 1, stroke: '#1b1e23', strokeOpacity: 0.5 }, rest); + const createCircle = (cx, cy, r) => { + const circle = new g_1.Circle({ + style: Object.assign({ cx, + cy, + r }, defaults), + }); + root.appendChild(circle); + return circle; + }; + const createLine = (x1, x2, y1, y2) => { + const line = new g_1.Line({ + style: Object.assign({ x1, + x2, + y1, + y2 }, defaults), + }); + root.appendChild(line); + return line; + }; + const minDistPoint = (mouse, points) => { + // only one point do not need compute + if (points.length === 1) { + return points[0]; + } + const dists = points.map((p) => (0, vector_1.dist)(p, mouse)); + const minDistIndex = (0, d3_array_1.minIndex)(dists, (d) => d); + return points[minDistIndex]; + }; + const target = minDistPoint(mouse, points); + const pointsOf = () => { + if (transposed) + return [ + startX + target[0], + startX + target[0], + startY, + startY + plotHeight, + ]; + return [startX, startX + plotWidth, target[1] + startY, target[1] + startY]; + }; + const pointsOfPolar = () => { + const cx = startX + insetLeft + mainWidth / 2; + const cy = startY + insetTop + mainHeight / 2; + const cdist = (0, vector_1.dist)([cx, cy], target); + return [cx, cy, cdist]; + }; + if (polar) { + const [cx, cy, r] = pointsOfPolar(); + const ruleX = root.ruleX || createCircle(cx, cy, r); + ruleX.style.cx = cx; + ruleX.style.cy = cy; + ruleX.style.r = r; + root.ruleX = ruleX; + } + else { + const [x1, x2, y1, y2] = pointsOf(); + const ruleX = root.ruleX || createLine(x1, x2, y1, y2); + ruleX.style.x1 = x1; + ruleX.style.x2 = x2; + ruleX.style.y1 = y1; + ruleX.style.y2 = y2; + root.ruleX = ruleX; + } +} +function updateRuleY(root, points, _a) { + var { plotWidth, plotHeight, mainWidth, mainHeight, startX, startY, transposed, polar, insetLeft, insetTop } = _a, rest = __rest(_a, ["plotWidth", "plotHeight", "mainWidth", "mainHeight", "startX", "startY", "transposed", "polar", "insetLeft", "insetTop"]); + const defaults = Object.assign({ lineWidth: 1, stroke: '#1b1e23', strokeOpacity: 0.5 }, rest); + const Y = points.map((p) => p[1]); + const X = points.map((p) => p[0]); + const y = (0, d3_array_1.mean)(Y); + const x = (0, d3_array_1.mean)(X); + const pointsOf = () => { + if (polar) { + const r = Math.min(mainWidth, mainHeight) / 2; + const cx = startX + insetLeft + mainWidth / 2; + const cy = startY + insetTop + mainHeight / 2; + const a = (0, vector_1.angle)((0, vector_1.sub)([x, y], [cx, cy])); + const x0 = cx + r * Math.cos(a); + const y0 = cy + r * Math.sin(a); + return [cx, x0, cy, y0]; + } + if (transposed) + return [startX, startX + plotWidth, y + startY, y + startY]; + return [x + startX, x + startX, startY, startY + plotHeight]; + }; + const [x1, x2, y1, y2] = pointsOf(); + const createLine = () => { + const line = new g_1.Line({ + style: Object.assign({ x1, + x2, + y1, + y2 }, defaults), + }); + root.appendChild(line); + return line; + }; + // Only update rule with defined series elements. + if (X.length > 0) { + const ruleY = root.ruleY || createLine(); + ruleY.style.x1 = x1; + ruleY.style.x2 = x2; + ruleY.style.y1 = y1; + ruleY.style.y2 = y2; + root.ruleY = ruleY; + } +} +function hideRuleY(root) { + if (root.ruleY) { + root.ruleY.remove(); + root.ruleY = undefined; + } +} +function hideRuleX(root) { + if (root.ruleX) { + root.ruleX.remove(); + root.ruleX = undefined; + } +} +function updateMarker(root, { data, style, theme }) { + if (root.markers) + root.markers.forEach((d) => d.remove()); + const { type = '' } = style; + const markers = data + .filter((d) => { + const [{ x, y }] = d; + return (0, helper_1.defined)(x) && (0, helper_1.defined)(y); + }) + .map((d) => { + const [{ color, element }, point] = d; + const originColor = color || // encode value + element.style.fill || + element.style.stroke || + theme.color; + const fill = type === 'hollow' ? 'transparent' : originColor; + const stroke = type === 'hollow' ? originColor : '#fff'; + const shape = new g_1.Circle({ + className: 'g2-tooltip-marker', + style: Object.assign({ cx: point[0], cy: point[1], fill, r: 4, stroke, lineWidth: 2, + // Prevents blocking clicks on elements behind. + pointerEvents: 'none' }, style), + }); + return shape; + }); + for (const marker of markers) + root.appendChild(marker); + root.markers = markers; +} +function hideMarker(root) { + if (root.markers) { + root.markers.forEach((d) => d.remove()); + root.markers = []; + } +} +function interactionKeyof(markState, key) { + return Array.from(markState.values()).some( + // @ts-ignore + (d) => { var _a; return (_a = d.interaction) === null || _a === void 0 ? void 0 : _a[key]; }); +} +function maybeValue(specified, defaults) { + return specified === undefined ? defaults : specified; +} +exports.maybeValue = maybeValue; +function isEmptyTooltipData(data) { + const { title, items } = data; + if (items.length === 0 && title === undefined) + return true; + return false; +} +function hasSeries(markState) { + return Array.from(markState.values()).some( + // @ts-ignore + (d) => { var _a; return ((_a = d.interaction) === null || _a === void 0 ? void 0 : _a.seriesTooltip) && d.tooltip; }); +} +/** + * Finds a single element based on the mouse event in a non-series context (e.g., single item tooltip). + * @param root - The root display object of the chart. + * @param event - The mouse event object (e.g., pointermove, pointerdown). + * @param elements - Array of chart elements to search within. + * @param coordinate - The coordinate system of the chart (e.g., Cartesian, polar). + * @param scale - The scale configurations (e.g., x, series scales). + * @param shared - Whether the tooltip is shared among multiple elements (e.g., grouped bars). + * @returns The matched display object or `undefined` if no element is found. + * @description + * - Handles bar charts by sorting elements and using bisector search for efficient lookup. + * - For non-bar charts, directly finds the target element from the event's target. + * - Adjusts for bar spacing in grouped charts when `shared` is false. + */ +function findSingleElement({ root, event, elements, coordinate, scale, shared, }) { + var _a, _b; + const inInterval = (d) => d.markType === 'interval'; + const isBar = elements.every(inInterval) && !(0, coordinate_1.isPolar)(coordinate); + const scaleX = scale.x; + const scaleSeries = scale.series; + const bandWidth = (_b = (_a = scaleX === null || scaleX === void 0 ? void 0 : scaleX.getBandWidth) === null || _a === void 0 ? void 0 : _a.call(scaleX)) !== null && _b !== void 0 ? _b : 0; + const xof = scaleSeries + ? (d) => { + const seriesCount = Math.round(1 / scaleSeries.valueBandWidth); + return (d.__data__.x + + d.__data__.series * bandWidth + + bandWidth / (seriesCount * 2)); + } + : (d) => d.__data__.x + bandWidth / 2; + // Sort for bisector search. + if (isBar) + elements.sort((a, b) => xof(a) - xof(b)); + const findElementByTarget = (event) => { + const { target } = event; + return (0, utils_1.maybeRoot)(target, (node) => { + if (!node.classList) + return false; + return node.classList.includes('element'); + }); + }; + const element = isBar + ? (event) => { + const mouse = (0, utils_1.mousePosition)(root, event); + if (!mouse) + return; + const [abstractX] = coordinate.invert(mouse); + const search = (0, d3_array_1.bisector)(xof).center; + const i = search(elements, abstractX); + const target = elements[i]; + if (!shared) { + // For grouped bar chart without shared options. + const isGrouped = elements.find((d) => d !== target && xof(d) === xof(target)); + if (isGrouped) + return findElementByTarget(event); + } + return target; + } + : findElementByTarget; + return element(event); +} +exports.findSingleElement = findSingleElement; +/** + * Finds series-related elements and data based on the mouse event for series tooltips. + * @param root - The root display object of the chart. + * @param event - The mouse event object (e.g., pointermove, pointerdown). + * @param elements - Array of chart elements to search within. + * @param coordinate - The coordinate system of the chart (e.g., Cartesian, polar). + * @param scale - The scale configurations (e.g., x, series scales). + * @param startX - The starting X position of the plot area. + * @param startY - The starting Y position of the plot area. + * @returns An object containing: + * - `selectedElements`: Matched display objects (series and item elements). + * - `selectedData`: Corresponding data records of the selected elements. + * - `filteredSeriesData`: Filtered series data closest to the mouse focus. + * - `abstractX`: A function to convert mouse coordinates to abstract X values. + * @description + * - Splits elements into series and item elements for targeted searching. + * - Handles bar charts and band scales using bisector search and coordinate inversion. + * - Sorts elements to ensure correct visual ordering (top-to-bottom or right-to-left in transposed mode). + * - Filters and groups data to provide accurate tooltip information for series. + */ +function findSeriesElement({ root, event, elements, coordinate, scale, startX, startY, }) { + const transposed = (0, coordinate_1.isTranspose)(coordinate); + // Split elements into series elements and item elements. + const seriesElements = []; + const itemElements = []; + for (const element of elements) { + const { __data__: data } = element; + const { seriesX, title, items } = data; + if (seriesX) + seriesElements.push(element); + else if (title || items) + itemElements.push(element); + } + const inInterval = (d) => d.markType === 'interval'; + const isBar = itemElements.length && + itemElements.every(inInterval) && + !(0, coordinate_1.isPolar)(coordinate); + const xof = (d) => d.__data__.x; + // For band scale x, find the closest series element to focus, + // useful for interval + line mark. + const isBandScale = !!scale.x.getBandWidth; + const closest = isBandScale && itemElements.length > 0; + // Sorted elements from top to bottom visually, + // or from right to left in transpose coordinate. + seriesElements.sort((a, b) => { + const index = transposed ? 0 : 1; + const minY = (d) => d.getBounds().min[index]; + return transposed ? minY(b) - minY(a) : minY(a) - minY(b); + }); + const extent = (d) => { + const index = transposed ? 1 : 0; + const { min, max } = d.getLocalBounds(); + return (0, d3_array_1.sort)([min[index], max[index]]); + }; + // Sort itemElements for bisector search. + if (isBar) + elements.sort((a, b) => xof(a) - xof(b)); + else { + itemElements.sort((a, b) => { + const [minA, maxA] = extent(a); + const [minB, maxB] = extent(b); + const midA = (minA + maxA) / 2; + const midB = (minB + maxB) / 2; + return transposed ? midB - midA : midA - midB; + }); + } + // Get sortedIndex and X for each series elements + const elementSortedX = new Map(seriesElements.map((element) => { + const { __data__: data } = element; + const { seriesX } = data; + const seriesIndex = seriesX.map((_, i) => i); + const sortedIndex = (0, d3_array_1.sort)(seriesIndex, (i) => seriesX[+i]); + return [element, [sortedIndex, seriesX]]; + })); + const { x: scaleX } = scale; + // Apply offset for band scale x. + const offsetX = (scaleX === null || scaleX === void 0 ? void 0 : scaleX.getBandWidth) ? scaleX.getBandWidth() / 2 : 0; + const abstractX = (focus) => { + const [normalizedX] = coordinate.invert(focus); + return normalizedX - offsetX; + }; + const indexByFocus = (event, focus, I, X) => { + // _x is from emit event, to find the right element. + const { _x } = event; + const finalX = _x !== undefined ? scaleX.map(_x) : abstractX(focus); + const DX = X.filter(helper_1.defined); + const [minX, maxX] = (0, d3_array_1.sort)([DX[0], DX[DX.length - 1]]); + // If only has one element(minX == maxX), show tooltip when hover whole chart + const isOnlyOneElement = minX === maxX; + // If closest is true, always find at least one element. + // Otherwise, skip element out of plot area. + if (!closest && (finalX < minX || finalX > maxX) && !isOnlyOneElement) + return null; + const search = (0, d3_array_1.bisector)((i) => X[+i]).center; + const i = search(I, finalX); + return I[i]; + }; + const elementsByFocus = isBar + ? (focus, elements) => { + const search = (0, d3_array_1.bisector)(xof).center; + const i = search(elements, abstractX(focus)); + const find = elements[i]; + const groups = (0, d3_array_1.group)(elements, xof); + const selected = groups.get(xof(find)); + return selected; + } + : (focus, elements) => { + const index = transposed ? 1 : 0; + const x = focus[index]; + const filtered = elements.filter((element) => { + const [min, max] = extent(element); + return x >= min && x <= max; + }); + // If closet is true, always find at least one element. + if (!closest || filtered.length > 0) + return filtered; + // Search the closet element to the focus. + const search = (0, d3_array_1.bisector)((element) => { + const [min, max] = extent(element); + return (min + max) / 2; + }).center; + const i = search(elements, x); + return [elements[i]].filter(helper_1.defined); + }; + const seriesData = (element, index) => { + const { __data__: data } = element; + return Object.fromEntries(Object.entries(data) + .filter(([key]) => key.startsWith('series') && key !== 'series') + .map(([key, V]) => { + const d = V[index]; + return [(0, util_1.lowerFirst)(key.replace('series', '')), d]; + })); + }; + const mouse = (0, utils_1.mousePosition)(root, event); + if (!mouse) + return; + const focus = [mouse[0] - startX, mouse[1] - startY]; + if (!focus) + return; + // Get selected item element. + const selectedItems = elementsByFocus(focus, itemElements); + // Get selected data item from both series element and item element. + const selectedSeriesElements = []; + const selectedSeriesData = []; + for (const element of seriesElements) { + const [sortedIndex, X] = elementSortedX.get(element); + const index = indexByFocus(event, focus, sortedIndex, X); + if (index !== null) { + selectedSeriesElements.push(element); + const d = seriesData(element, index); + const { x, y } = d; + const p = coordinate.map([(x || 0) + offsetX, y || 0]); + selectedSeriesData.push([Object.assign(Object.assign({}, d), { element }), p]); + } + } + // Filter selectedSeriesData with different x, + // make sure there is only one x closest to focusX. + const SX = Array.from(new Set(selectedSeriesData.map((d) => d[0].x))); + const closestX = SX[(0, d3_array_1.minIndex)(SX, (x) => Math.abs(x - abstractX(focus)))]; + const filteredSeriesData = selectedSeriesData.filter((d) => d[0].x === closestX); + const selectedData = [ + ...filteredSeriesData.map((d) => d[0]), + ...selectedItems.map((d) => d.__data__), + ]; + // Get the displayed tooltip data. + const selectedElements = [...selectedSeriesElements, ...selectedItems]; + return { selectedElements, selectedData, filteredSeriesData, abstractX }; +} +exports.findSeriesElement = findSeriesElement; +/** + * Show tooltip for series item. + */ +function seriesTooltip(root, _a) { + var { elements: elementsof, sort: sortFunction, filter: filterFunction, scale, coordinate, crosshairs, crosshairsX, crosshairsY, render, groupName, emitter, wait = 50, leading = true, trailing = false, startX = 0, startY = 0, body = true, single = true, position, enterable, mount, bounding, theme, offset, disableNative = false, marker = true, preserve = false, style: _style = {}, css = {} } = _a, rest = __rest(_a, ["elements", "sort", "filter", "scale", "coordinate", "crosshairs", "crosshairsX", "crosshairsY", "render", "groupName", "emitter", "wait", "leading", "trailing", "startX", "startY", "body", "single", "position", "enterable", "mount", "bounding", "theme", "offset", "disableNative", "marker", "preserve", "style", "css"]); + const elements = elementsof(root); + const style = (0, util_1.deepMix)(_style, rest); + const polar = (0, coordinate_1.isPolar)(coordinate); + const transposed = (0, coordinate_1.isTranspose)(coordinate); + const { innerWidth: plotWidth, innerHeight: plotHeight, width: mainWidth, height: mainHeight, insetLeft, insetTop, } = coordinate.getOptions(); + const update = (0, util_1.throttle)((event) => { + var _a; + const mouse = (0, utils_1.mousePosition)(root, event); + if (!mouse) + return; + const bbox = (0, utils_1.bboxOf)(root); + const x = bbox.min[0]; + const y = bbox.min[1]; + const { selectedElements, selectedData, filteredSeriesData, abstractX } = findSeriesElement({ + root, + event, + elements, + coordinate, + scale, + startX, + startY, + }); + const tooltipData = groupItems(selectedElements, scale, groupName, selectedData, theme); + // Sort items and filter items. + if (sortFunction) { + tooltipData.items.sort((a, b) => sortFunction(a) - sortFunction(b)); + } + if (filterFunction) { + tooltipData.items = tooltipData.items.filter(filterFunction); + } + // Hide tooltip with no selected tooltip. + if (selectedElements.length === 0 || isEmptyTooltipData(tooltipData)) { + hide(event); + return; + } + if (body) { + showTooltip({ + root, + data: tooltipData, + x: mouse[0] + x, + y: mouse[1] + y, + render, + event, + single, + position, + enterable, + mount, + bounding, + css, + offset, + }); + } + if (crosshairs || crosshairsX || crosshairsY) { + const ruleStyle = (0, helper_1.subObject)(style, 'crosshairs'); + const ruleStyleX = Object.assign(Object.assign({}, ruleStyle), (0, helper_1.subObject)(style, 'crosshairsX')); + const ruleStyleY = Object.assign(Object.assign({}, ruleStyle), (0, helper_1.subObject)(style, 'crosshairsY')); + const points = filteredSeriesData.map((d) => d[1]); + if (crosshairsX) { + updateRuleX(root, points, mouse, Object.assign(Object.assign({}, ruleStyleX), { plotWidth, + plotHeight, + mainWidth, + mainHeight, + insetLeft, + insetTop, + startX, + startY, + transposed, + polar })); + } + if (crosshairsY) { + updateRuleY(root, points, Object.assign(Object.assign({}, ruleStyleY), { plotWidth, + plotHeight, + mainWidth, + mainHeight, + insetLeft, + insetTop, + startX, + startY, + transposed, + polar })); + } + } + if (marker) { + const markerStyles = (0, helper_1.subObject)(style, 'marker'); + updateMarker(root, { + data: filteredSeriesData, + style: markerStyles, + theme, + }); + } + // X in focus may related multiple points when dataset is large, + // so we need to find the first x to show tooltip. + const firstX = (_a = filteredSeriesData[0]) === null || _a === void 0 ? void 0 : _a[0].x; + const transformedX = firstX !== null && firstX !== void 0 ? firstX : abstractX(focus); + emitter.emit('tooltip:show', Object.assign(Object.assign({}, event), { nativeEvent: true, data: Object.assign(Object.assign({}, tooltipData), { data: { x: (0, scale_1.invert)(scale.x, transformedX, true) } }) })); + }, wait, { leading, trailing }); + const hide = (event) => { + hideTooltip({ root, single, emitter, event }); + }; + const destroy = () => { + destroyTooltip({ root, single }); + }; + const onTooltipShow = (_a) => { + var _b; + var { nativeEvent, data, offsetX, offsetY } = _a, rest = __rest(_a, ["nativeEvent", "data", "offsetX", "offsetY"]); + if (nativeEvent) + return; + const x = (_b = data === null || data === void 0 ? void 0 : data.data) === null || _b === void 0 ? void 0 : _b.x; + const scaleX = scale.x; + const x1 = scaleX.map(x); + const [x2, y2] = coordinate.map([x1, 0.5]); + const rootBounds = root.getRenderBounds(); + const minX = rootBounds.min[0]; + const minY = rootBounds.min[1]; + update(Object.assign(Object.assign({}, rest), { offsetX: offsetX !== undefined ? offsetX : minX + x2, offsetY: offsetY !== undefined ? offsetY : minY + y2, _x: x })); + }; + const onTooltipHide = () => { + hideTooltip({ root, single, emitter, nativeEvent: false }); + }; + const onTooltipDisable = () => { + removeEventListeners(); + destroy(); + }; + const onTooltipEnable = () => { + addEventListeners(); + }; + const addEventListeners = () => { + if (!disableNative) { + root.addEventListener('pointerdown', update); + root.addEventListener('pointerenter', update); + root.addEventListener('pointermove', update); + // Only emit pointerleave event when the pointer is not in the root area. + root.addEventListener('pointerleave', (e) => { + if ((0, utils_1.mousePosition)(root, e)) + return; + hide(e); + }); + root.addEventListener('pointerup', hide); + } + }; + const removeEventListeners = () => { + if (!disableNative) { + root.removeEventListener('pointerdown', update); + root.removeEventListener('pointerenter', update); + root.removeEventListener('pointermove', update); + root.removeEventListener('pointerleave', hide); + root.removeEventListener('pointerup', hide); + } + }; + addEventListeners(); + emitter.on('tooltip:show', onTooltipShow); + emitter.on('tooltip:hide', onTooltipHide); + emitter.on('tooltip:disable', onTooltipDisable); + emitter.on('tooltip:enable', onTooltipEnable); + return () => { + removeEventListeners(); + emitter.off('tooltip:show', onTooltipShow); + emitter.off('tooltip:hide', onTooltipHide); + emitter.off('tooltip:disable', onTooltipDisable); + emitter.off('tooltip:enable', onTooltipEnable); + if (preserve) { + hideTooltip({ root, single, emitter, nativeEvent: false }); + } + else { + destroy(); + } + }; +} +exports.seriesTooltip = seriesTooltip; +/** + * Show tooltip for non-series item. + */ +function tooltip(root, { elements: elementsof, coordinate, scale, render, groupName, sort: sortFunction, filter: filterFunction, emitter, wait = 50, leading = true, trailing = false, groupKey = (d) => d, // group elements by specified key +single = true, position, enterable, datum, view, mount, bounding, theme, offset, shared = false, body = true, disableNative = false, preserve = false, css = {}, }) { + const elements = elementsof(root); + const keyGroup = (0, d3_array_1.group)(elements, groupKey); + const pointermove = (0, util_1.throttle)((event) => { + const element = findSingleElement({ + root, + event, + elements, + coordinate, + scale, + shared, + }); + if (!element) { + hideTooltip({ root, single, emitter, event }); + return; + } + const k = groupKey(element); + const group = keyGroup.get(k); + if (!group) { + return; + } + const data = group.length === 1 && !shared + ? singleItem(group[0]) + : groupItems(group, scale, groupName, undefined, theme); + // Sort items and sort. + if (sortFunction) { + data.items.sort((a, b) => sortFunction(a) - sortFunction(b)); + } + if (filterFunction) { + data.items = data.items.filter(filterFunction); + } + if (isEmptyTooltipData(data)) { + hideTooltip({ root, single, emitter, event }); + return; + } + const { offsetX, offsetY } = event; + if (body) { + showTooltip({ + root, + data, + x: offsetX, + y: offsetY, + render, + event, + single, + position, + enterable, + mount, + bounding, + css, + offset, + }); + } + emitter.emit('tooltip:show', Object.assign(Object.assign({}, event), { nativeEvent: true, data: Object.assign(Object.assign({}, data), { data: (0, helper_1.dataOf)(element, view) }) })); + }, wait, { leading, trailing }); + const pointerleave = (event) => { + hideTooltip({ root, single, emitter, event }); + }; + const addEventListeners = () => { + if (!disableNative) { + root.addEventListener('pointerdown', pointermove); + root.addEventListener('pointermove', pointermove); + // Only emit pointerleave event when the pointer is not in the root area. + // !!!DO NOT USE pointerout event, it will emit when the pointer is in the child area. + root.addEventListener('pointerleave', pointerleave); + root.addEventListener('pointerup', pointerleave); + } + }; + const removeEventListeners = () => { + if (!disableNative) { + root.removeEventListener('pointerdown', pointermove); + root.removeEventListener('pointermove', pointermove); + root.removeEventListener('pointerleave', pointerleave); + root.removeEventListener('pointerup', pointerleave); + } + }; + const onTooltipShow = ({ nativeEvent, offsetX, offsetY, data: raw }) => { + if (nativeEvent) + return; + const { data } = raw; + const element = (0, utils_1.selectElementByData)(elements, data, datum); + if (!element) + return; + const bbox = element.getBBox(); + const { x, y, width, height } = bbox; + const rootBBox = root.getBBox(); + pointermove({ + target: element, + offsetX: offsetX !== undefined ? offsetX + rootBBox.x : x + width / 2, + offsetY: offsetY !== undefined ? offsetY + rootBBox.y : y + height / 2, + }); + }; + const onTooltipHide = ({ nativeEvent } = {}) => { + if (nativeEvent) + return; + hideTooltip({ root, single, emitter, nativeEvent: false }); + }; + const onTooltipDisable = () => { + removeEventListeners(); + destroyTooltip({ root, single }); + }; + const onTooltipEnable = () => { + addEventListeners(); + }; + emitter.on('tooltip:show', onTooltipShow); + emitter.on('tooltip:hide', onTooltipHide); + emitter.on('tooltip:enable', onTooltipEnable); + emitter.on('tooltip:disable', onTooltipDisable); + addEventListeners(); + return () => { + removeEventListeners(); + emitter.off('tooltip:show', onTooltipShow); + emitter.off('tooltip:hide', onTooltipHide); + if (preserve) { + hideTooltip({ root, single, emitter, nativeEvent: false }); + } + else { + destroyTooltip({ root, single }); + } + }; +} +exports.tooltip = tooltip; +function Tooltip(options) { + const { shared, crosshairs, crosshairsX, crosshairsY, series, name, item = () => ({}), facet = false } = options, rest = __rest(options, ["shared", "crosshairs", "crosshairsX", "crosshairsY", "series", "name", "item", "facet"]); + return (target, viewInstances, emitter) => { + const { container, view } = target; + const { scale, markState, coordinate, theme } = view; + // Get default value from mark states. + const defaultSeries = interactionKeyof(markState, 'seriesTooltip'); + const defaultShowCrosshairs = interactionKeyof(markState, 'crosshairs'); + const plotArea = (0, utils_1.selectPlotArea)(container); + const isSeries = maybeValue(series, defaultSeries); + const crosshairsSetting = maybeValue(crosshairs, defaultShowCrosshairs); + // For non-facet and series tooltip. + if (isSeries && hasSeries(markState) && !facet) { + return seriesTooltip(plotArea, Object.assign(Object.assign({}, rest), { theme, elements: utils_1.selectG2Elements, scale, + coordinate, crosshairs: crosshairsSetting, + // the crosshairsX settings level: crosshairsX > crosshairs > false + // it means crosshairsX default is false + crosshairsX: maybeValue(maybeValue(crosshairsX, crosshairs), false), + // crosshairsY default depend on the crossharisSettings + crosshairsY: maybeValue(crosshairsY, crosshairsSetting), item, + emitter })); + } + // For facet and series tooltip. + if (isSeries && facet) { + // Get sub view instances for this view. + const facetInstances = viewInstances.filter((d) => d !== target && d.options.parentKey === target.options.key); + const elements = (0, utils_1.selectFacetG2Elements)(target, viewInstances); + // Use the scale of the first view. + const scale = facetInstances[0].view.scale; + const bbox = plotArea.getBounds(); + const startX = bbox.min[0]; + const startY = bbox.min[1]; + Object.assign(scale, { facet: true }); + // @todo Nested structure rather than flat structure for facet? + // Add listener to the root area. + // @ts-ignore + return seriesTooltip(plotArea.parentNode.parentNode, Object.assign(Object.assign({}, rest), { theme, elements: () => elements, scale, + coordinate, crosshairs: maybeValue(crosshairs, defaultShowCrosshairs), + // the crosshairsX settings level: crosshairsX > crosshairs > false + // it means crosshairsX default is false + crosshairsX: maybeValue(maybeValue(crosshairsX, crosshairs), false), crosshairsY: maybeValue(crosshairsY, crosshairsSetting), item, + startX, + startY, + emitter })); + } + return tooltip(plotArea, Object.assign(Object.assign({}, rest), { datum: (0, utils_1.createDatumof)(view), elements: utils_1.selectG2Elements, scale, + coordinate, groupKey: shared ? (0, utils_1.createXKey)(view) : undefined, item, + emitter, + view, + theme, + shared })); + }; +} +exports.Tooltip = Tooltip; +Tooltip.props = { + reapplyWhenUpdate: true, +}; +//# sourceMappingURL=tooltip.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../utils/coordinate":1751263815882,"../utils/vector":1751263815873,"../utils/scale":1751263816057,"../runtime/transform":1751263816118,"./utils":1751263816080}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816132, function(require, module, exports) { + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LegendFilter = exports.attributesOf = exports.dataOf = exports.legendClearSetState = exports.legendsContinuousOf = exports.legendsOf = exports.itemsOf = exports.labelOf = exports.markerOf = exports.LEGEND_LABEL_CLASS_NAME = exports.LEGEND_MAKER_CLASS_NAME = exports.LEGEND_ITEMS_CLASS_NAME = exports.CONTINUOUS_LEGEND_CLASS_NAME = exports.CATEGORY_LEGEND_CLASS_NAME = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("../utils/helper"); +const utils_1 = require("./utils"); +exports.CATEGORY_LEGEND_CLASS_NAME = 'legend-category'; +exports.CONTINUOUS_LEGEND_CLASS_NAME = 'legend-continuous'; +exports.LEGEND_ITEMS_CLASS_NAME = 'items-item'; +exports.LEGEND_MAKER_CLASS_NAME = 'legend-category-item-marker'; +exports.LEGEND_LABEL_CLASS_NAME = 'legend-category-item-label'; +function markerOf(item) { + return item.getElementsByClassName(exports.LEGEND_MAKER_CLASS_NAME)[0]; +} +exports.markerOf = markerOf; +function labelOf(item) { + return item.getElementsByClassName(exports.LEGEND_LABEL_CLASS_NAME)[0]; +} +exports.labelOf = labelOf; +function itemsOf(root) { + return root.getElementsByClassName(exports.LEGEND_ITEMS_CLASS_NAME); +} +exports.itemsOf = itemsOf; +function legendsOf(root) { + return root.getElementsByClassName(exports.CATEGORY_LEGEND_CLASS_NAME); +} +exports.legendsOf = legendsOf; +function legendsContinuousOf(root) { + return root.getElementsByClassName(exports.CONTINUOUS_LEGEND_CLASS_NAME); +} +exports.legendsContinuousOf = legendsContinuousOf; +function legendClearSetState(root, setState) { + const legends = [...legendsOf(root), ...legendsContinuousOf(root)]; + legends.forEach((legend) => { + setState(legend, (v) => v); + }); +} +exports.legendClearSetState = legendClearSetState; +function dataOf(root) { + // legend -> layout -> container + let parent = root.parentNode; + while (parent && !parent.__data__) { + parent = parent.parentNode; + } + return parent.__data__; +} +exports.dataOf = dataOf; +function attributesOf(root) { + let child = root; + while (child && !child.attr('class').startsWith('legend')) { + child = child.children[0]; + } + return child.attributes; +} +exports.attributesOf = attributesOf; +function legendFilterOrdinal(root, { legends, // given the root of chart returns legends to be manipulated +marker: markerOf, // given the legend returns the marker +label: labelOf, // given the legend returns the label +datum, // given the legend returns the value +filter, // invoke when dispatch filter event, +emitter, channel, state = {}, // state options + }) { + // Index handler by item. + const itemClick = new Map(); + const itemPointerenter = new Map(); + const itemPointerout = new Map(); + const { unselected = { + markerStroke: '#aaa', + markerFill: '#aaa', + labelFill: '#aaa', + }, } = state; + const markerStyle = { unselected: (0, helper_1.subObject)(unselected, 'marker') }; + const labelStyle = { unselected: (0, helper_1.subObject)(unselected, 'label') }; + const { setState: setM, removeState: removeM } = (0, utils_1.useState)(markerStyle, undefined); + const { setState: setL, removeState: removeL } = (0, utils_1.useState)(labelStyle, undefined); + const items = Array.from(legends(root)); + let selectedValues = items.map(datum); + const updateLegendState = () => { + for (const item of items) { + const value = datum(item); + const marker = markerOf(item); + const label = labelOf(item); + if (!selectedValues.includes(value)) { + setM(marker, 'unselected'); + setL(label, 'unselected'); + } + else { + removeM(marker, 'unselected'); + removeL(label, 'unselected'); + } + } + }; + for (const item of items) { + // Defined handlers. + const pointerenter = () => { + (0, utils_1.setCursor)(root, 'pointer'); + }; + const pointerout = () => { + (0, utils_1.restoreCursor)(root); + }; + const click = (event) => __awaiter(this, void 0, void 0, function* () { + const value = datum(item); + const index = selectedValues.indexOf(value); + if (index === -1) + selectedValues.push(value); + else + selectedValues.splice(index, 1); + yield filter(selectedValues); + updateLegendState(); + const { nativeEvent = true } = event; + if (!nativeEvent) + return; + if (selectedValues.length === items.length) { + emitter.emit('legend:reset', { nativeEvent }); + } + else { + // Emit events. + emitter.emit('legend:filter', Object.assign(Object.assign({}, event), { nativeEvent, data: { + channel, + values: selectedValues, + } })); + } + }); + // Bind and store handlers. + item.addEventListener('click', click); + item.addEventListener('pointerenter', pointerenter); + item.addEventListener('pointerout', pointerout); + itemClick.set(item, click); + itemPointerenter.set(item, pointerenter); + itemPointerout.set(item, pointerout); + } + const onFilter = (event) => __awaiter(this, void 0, void 0, function* () { + const { nativeEvent } = event; + if (nativeEvent) + return; + const { data } = event; + const { channel: specifiedChannel, values } = data; + if (specifiedChannel !== channel) + return; + selectedValues = values; + yield filter(selectedValues); + updateLegendState(); + }); + const onEnd = (event) => __awaiter(this, void 0, void 0, function* () { + const { nativeEvent } = event; + if (nativeEvent) + return; + selectedValues = items.map(datum); + yield filter(selectedValues); + updateLegendState(); + }); + emitter.on('legend:filter', onFilter); + emitter.on('legend:reset', onEnd); + return () => { + for (const item of items) { + item.removeEventListener('click', itemClick.get(item)); + item.removeEventListener('pointerenter', itemPointerenter.get(item)); + item.removeEventListener('pointerout', itemPointerout.get(item)); + emitter.off('legend:filter', onFilter); + emitter.off('legend:reset', onEnd); + } + }; +} +function legendFilterContinuous(_, { legend, filter, emitter, channel }) { + const onValueChange = ({ detail: { value } }) => { + filter(value); + emitter.emit({ + nativeEvent: true, + data: { + channel, + values: value, + }, + }); + }; + legend.addEventListener('valuechange', onValueChange); + return () => { + legend.removeEventListener('valuechange', onValueChange); + }; +} +function filterView(context, // View instance, +{ legend, // Legend instance. +channel, // Filter Channel. +value, // Filtered Values. +ordinal, // Data type of the legend. +channels, // Channels for this legend. +allChannels, // Channels for all legends. +facet = false, // For facet. + }) { + return __awaiter(this, void 0, void 0, function* () { + const { view, update, setState } = context; + setState(legend, (viewOptions) => { + const { marks } = viewOptions; + // Add filter transform for every marks, + // which will skip for mark without color channel. + const newMarks = marks.map((mark) => { + if (mark.type === 'legends') + return mark; + // Inset after aggregate transform, such as group, and bin. + const { transform = [], data = [] } = mark; + const index = transform.findIndex(({ type }) => type.startsWith('group') || type.startsWith('bin')); + const newTransform = [...transform]; + if (data.length) { + newTransform.splice(index + 1, 0, { + type: 'filter', + [channel]: { value, ordinal }, + }); + } + // Set domain of scale to preserve encoding. + const newScale = Object.fromEntries(channels.map((channel) => [ + channel, + { domain: view.scale[channel].getOptions().domain }, + ])); + return (0, util_1.deepMix)({}, mark, Object.assign(Object.assign({ transform: newTransform, scale: newScale }, (!ordinal && { animate: false })), { legend: facet + ? false + : Object.fromEntries(allChannels.map((d) => [d, { preserve: true }])) })); + }); + return Object.assign(Object.assign({}, viewOptions), { marks: newMarks }); + }); + yield update(); + }); +} +function filterFacets(facets, options) { + for (const facet of facets) { + filterView(facet, Object.assign(Object.assign({}, options), { facet: true })); + } +} +function LegendFilter() { + return (context, contexts, emitter) => { + const { container } = context; + const facets = contexts.filter((d) => d !== context); + const isFacet = facets.length > 0; + const channelsOf = (legend) => { + return dataOf(legend).scales.map((d) => d.name); + }; + const legends = [ + ...legendsOf(container), + ...legendsContinuousOf(container), + ]; + const allChannels = legends.flatMap(channelsOf); + const filter = isFacet + ? (0, util_1.throttle)(filterFacets, 50, { trailing: true }) + : (0, util_1.throttle)(filterView, 50, { trailing: true }); + const removes = legends.map((legend) => { + const { name: channel, domain } = dataOf(legend).scales[0]; + const channels = channelsOf(legend); + const common = { + legend, + channel, + channels, + allChannels, + }; + if (legend.className === exports.CATEGORY_LEGEND_CLASS_NAME) { + return legendFilterOrdinal(container, { + legends: itemsOf, + marker: markerOf, + label: labelOf, + datum: (d) => { + const { __data__: datum } = d; + const { index } = datum; + return domain[index]; + }, + filter: (value) => { + const options = Object.assign(Object.assign({}, common), { value, ordinal: true }); + if (isFacet) + filter(facets, options); + else + filter(context, options); + }, + state: legend.attributes.state, + channel, + emitter, + }); + } + else { + return legendFilterContinuous(container, { + legend, + filter: (value) => { + const options = Object.assign(Object.assign({}, common), { value, ordinal: false }); + if (isFacet) + filter(facets, options); + else + filter(context, options); + }, + emitter, + channel, + }); + } + }); + return () => { + removes.forEach((remove) => remove()); + }; + }; +} +exports.LegendFilter = LegendFilter; +//# sourceMappingURL=legendFilter.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"./utils":1751263816080}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816133, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LegendHighlight = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +const helper_1 = require("../utils/helper"); +const utils_1 = require("./utils"); +const legendFilter_1 = require("./legendFilter"); +function LegendHighlight() { + return (context, _, emitter) => { + const { container, view, options } = context; + const legends = (0, legendFilter_1.legendsOf)(container); + const elements = (0, utils_1.selectG2Elements)(container); + const channelOf = (legend) => { + return (0, legendFilter_1.dataOf)(legend).scales[0].name; + }; + const scaleOf = (channel) => { + const { scale: { [channel]: scale }, } = view; + return scale; + }; + const markState = (0, utils_1.mergeState)(options, ['active', 'inactive']); + const valueof = (0, utils_1.createValueof)(elements, (0, utils_1.createDatumof)(view)); + const destroys = []; + // Bind events for each legend. + for (const legend of legends) { + const datumOf = (item) => { + const { data } = legend.attributes; + const { __data__: datum } = item; + const { index } = datum; + return data[index].label; + }; + const channel = channelOf(legend); + const items = (0, legendFilter_1.itemsOf)(legend); + const scale = scaleOf(channel); + const elementGroup = (0, d3_array_1.group)(elements, (d) => scale.invert(d.__data__[channel])); + const { state: legendState = {} } = legend.attributes; + const { inactive = {} } = legendState; + const { setState, removeState } = (0, utils_1.useState)(markState, valueof); + // Handle styles of inner item. + const markerStyle = { inactive: (0, helper_1.subObject)(inactive, 'marker') }; + const labelStyle = { inactive: (0, helper_1.subObject)(inactive, 'label') }; + const { setState: setM, removeState: removeM } = (0, utils_1.useState)(markerStyle); + const { setState: setL, removeState: removeL } = (0, utils_1.useState)(labelStyle); + const updateLegendState = (highlight) => { + for (const item of items) { + const marker = (0, legendFilter_1.markerOf)(item); + const label = (0, legendFilter_1.labelOf)(item); + if (item === highlight || highlight === null) { + removeM(marker, 'inactive'); + removeL(label, 'inactive'); + } + else { + setM(marker, 'inactive'); + setL(label, 'inactive'); + } + } + }; + const highlightItem = (event, item) => { + // Update UI. + const value = datumOf(item); + const elementSet = new Set(elementGroup.get(value)); + for (const e of elements) { + if (elementSet.has(e)) + setState(e, 'active'); + else + setState(e, 'inactive'); + } + updateLegendState(item); + // Emit events. + const { nativeEvent = true } = event; + if (!nativeEvent) + return; + emitter.emit('legend:highlight', Object.assign(Object.assign({}, event), { nativeEvent, data: { channel, value } })); + }; + const itemPointerover = new Map(); + // Add listener for the legend items. + for (const item of items) { + const pointerover = (event) => { + highlightItem(event, item); + }; + item.addEventListener('pointerover', pointerover); + itemPointerover.set(item, pointerover); + } + // Add listener for the legend group. + const pointerleave = (event) => { + for (const e of elements) + removeState(e, 'inactive', 'active'); + updateLegendState(null); + // Emit events. + const { nativeEvent = true } = event; + if (!nativeEvent) + return; + emitter.emit('legend:unhighlight', { nativeEvent }); + }; + const onHighlight = (event) => { + const { nativeEvent, data } = event; + if (nativeEvent) + return; + const { channel: specifiedChannel, value } = data; + if (specifiedChannel !== channel) + return; + const item = items.find((d) => datumOf(d) === value); + if (!item) + return; + highlightItem({ nativeEvent: false }, item); + }; + const onUnHighlight = (event) => { + const { nativeEvent } = event; + if (nativeEvent) + return; + pointerleave({ nativeEvent: false }); + }; + legend.addEventListener('pointerleave', pointerleave); + emitter.on('legend:highlight', onHighlight); + emitter.on('legend:unhighlight', onUnHighlight); + const destroy = () => { + legend.removeEventListener(pointerleave); + emitter.off('legend:highlight', onHighlight); + emitter.off('legend:unhighlight', onUnHighlight); + for (const [item, pointerover] of itemPointerover) { + item.removeEventListener(pointerover); + } + }; + destroys.push(destroy); + } + return () => destroys.forEach((d) => d()); + }; +} +exports.LegendHighlight = LegendHighlight; +//# sourceMappingURL=legendHighlight.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"./utils":1751263816080,"./legendFilter":1751263816132}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816134, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BrushHighlight = exports.brushHighlight = exports.brush = void 0; +const g_1 = require("@antv/g"); +const helper_1 = require("../utils/helper"); +const scale_1 = require("../utils/scale"); +const createElement_1 = require("../utils/createElement"); +const selection_1 = require("../utils/selection"); +const utils_1 = require("./utils"); +function intersect(bbox1, bbox2) { + const [minX1, minY1, maxX1, maxY1] = bbox1; + const [minX2, minY2, maxX2, maxY2] = bbox2; + return !(minX2 > maxX1 || maxX2 < minX1 || minY2 > maxY1 || maxY2 < minY1); +} +function normalizeBounds(x, y, x1, y1, extent) { + const [minX, minY, maxX, maxY] = extent; + return [ + Math.max(minX, Math.min(x, x1)), + Math.max(minY, Math.min(y, y1)), + Math.min(maxX, Math.max(x, x1)), + Math.min(maxY, Math.max(y, y1)), + ]; +} +function bboxOf(root) { + const { width, height } = root.getBBox(); + return [0, 0, width, height]; +} +function applyStyle(selection, style) { + for (const [key, value] of Object.entries(style)) { + selection.style(key, value); + } +} +const ResizableMask = (0, createElement_1.createElement)((g) => { + const _a = g.attributes, { x, y, width, height, class: className, renders = {}, handleSize: size = 10, document } = _a, style = __rest(_a, ["x", "y", "width", "height", "class", "renders", "handleSize", "document"]); + if (!document || + width === undefined || + height === undefined || + x === undefined || + y === undefined) + return; + const half = size / 2; + const renderRect = (g, options, document) => { + if (!g.handle) { + g.handle = document.createElement('rect'); + g.append(g.handle); + } + const { handle } = g; + handle.attr(options); + return handle; + }; + const _b = (0, helper_1.subObject)((0, helper_1.omitPrefixObject)(style, 'handleNW', 'handleNE'), 'handleN'), { render: handleNRender = renderRect } = _b, handleNStyle = __rest(_b, ["render"]); + const _c = (0, helper_1.subObject)(style, 'handleE'), { render: handleERender = renderRect } = _c, handleEStyle = __rest(_c, ["render"]); + const _d = (0, helper_1.subObject)((0, helper_1.omitPrefixObject)(style, 'handleSE', 'handleSW'), 'handleS'), { render: handleSRender = renderRect } = _d, handleSStyle = __rest(_d, ["render"]); + const _e = (0, helper_1.subObject)(style, 'handleW'), { render: handleWRender = renderRect } = _e, handleWStyle = __rest(_e, ["render"]); + const _f = (0, helper_1.subObject)(style, 'handleNW'), { render: handleNWRender = renderRect } = _f, handleNWStyle = __rest(_f, ["render"]); + const _g = (0, helper_1.subObject)(style, 'handleNE'), { render: handleNERender = renderRect } = _g, handleNEStyle = __rest(_g, ["render"]); + const _h = (0, helper_1.subObject)(style, 'handleSE'), { render: handleSERender = renderRect } = _h, handleSEStyle = __rest(_h, ["render"]); + const _j = (0, helper_1.subObject)(style, 'handleSW'), { render: handleSWRender = renderRect } = _j, handleSWStyle = __rest(_j, ["render"]); + const renderHandle = (g, renderNode) => { + const { id } = g; + const handle = renderNode(g, g.attributes, document); + handle.id = id; + handle.style.draggable = true; + }; + const appendHandle = (handleRender) => { + return () => { + const Node = (0, createElement_1.createElement)((g) => renderHandle(g, handleRender)); + return new Node({}); + }; + }; + const container = (0, selection_1.select)(g) + .attr('className', className) + .style('transform', `translate(${x}, ${y})`) + .style('draggable', true); + container + .maybeAppend('selection', 'rect') + .style('draggable', true) + .style('fill', 'transparent') + .call(applyStyle, Object.assign(Object.assign({ width, + height }, (0, helper_1.omitPrefixObject)(style, 'handle')), { transform: undefined })); + container + .maybeAppend('handle-n', appendHandle(handleNRender)) + .style('x', half) + .style('y', -half) + .style('width', width - size) + .style('height', size) + .style('fill', 'transparent') + .call(applyStyle, handleNStyle); + container + .maybeAppend('handle-e', appendHandle(handleERender)) + .style('x', width - half) + .style('y', half) + .style('width', size) + .style('height', height - size) + .style('fill', 'transparent') + .call(applyStyle, handleEStyle); + container + .maybeAppend('handle-s', appendHandle(handleSRender)) + .style('x', half) + .style('y', height - half) + .style('width', width - size) + .style('height', size) + .style('fill', 'transparent') + .call(applyStyle, handleSStyle); + container + .maybeAppend('handle-w', appendHandle(handleWRender)) + .style('x', -half) + .style('y', half) + .style('width', size) + .style('height', height - size) + .style('fill', 'transparent') + .call(applyStyle, handleWStyle); + container + .maybeAppend('handle-nw', appendHandle(handleNWRender)) + .style('x', -half) + .style('y', -half) + .style('width', size) + .style('height', size) + .style('fill', 'transparent') + .call(applyStyle, handleNWStyle); + container + .maybeAppend('handle-ne', appendHandle(handleNERender)) + .style('x', width - half) + .style('y', -half) + .style('width', size) + .style('height', size) + .style('fill', 'transparent') + .call(applyStyle, handleNEStyle); + container + .maybeAppend('handle-se', appendHandle(handleSERender)) + .style('x', width - half) + .style('y', height - half) + .style('width', size) + .style('height', size) + .style('fill', 'transparent') + .call(applyStyle, handleSEStyle); + container + .maybeAppend('handle-sw', appendHandle(handleSWRender)) + .style('x', -half) + .style('y', height - half) + .style('width', size) + .style('height', size) + .style('fill', 'transparent') + .call(applyStyle, handleSWStyle); +}); +function brush(root, _a) { + var { brushed = () => { }, brushended = () => { }, brushcreated = () => { }, brushstarted = () => { }, brushupdated = () => { }, extent = bboxOf(root), brushRegion = (x, y, x1, y1, extent) => [x, y, x1, y1], reverse = false, fill = '#777', fillOpacity = '0.3', stroke = '#fff', selectedHandles = [ + 'handle-n', + 'handle-e', + 'handle-s', + 'handle-w', + 'handle-nw', + 'handle-ne', + 'handle-se', + 'handle-sw', + ] } = _a, style = __rest(_a, ["brushed", "brushended", "brushcreated", "brushstarted", "brushupdated", "extent", "brushRegion", "reverse", "fill", "fillOpacity", "stroke", "selectedHandles"]); + let start = null; // Start point of mask. + let end = null; // End point of mask. + let moveStart = null; // Start point of moving mask. + let mask = null; // Mask instance. + let background = null; + let creating = false; + const [originX, originY, width, height] = extent; + (0, utils_1.setCursor)(root, 'crosshair'); + root.style.draggable = true; // Make it response to drag event. + // Remove old mask and init new mask. + const initMask = (x, y, event) => { + brushstarted(event); + if (mask) + mask.remove(); + if (background) + background.remove(); + start = [x, y]; + if (reverse) + return initReverseMask(); + initNormalMask(); + }; + const initReverseMask = () => { + background = new g_1.Path({ + style: Object.assign(Object.assign({}, style), { fill, + fillOpacity, + stroke, pointerEvents: 'none' }), + }); + mask = new ResizableMask({ + // @ts-ignore + style: { + x: 0, + y: 0, + width: 0, + height: 0, + draggable: true, + document: root.ownerDocument, + }, + className: 'mask', + }); + root.appendChild(background); + root.appendChild(mask); + }; + const initNormalMask = () => { + mask = new ResizableMask({ + // @ts-ignore + style: Object.assign(Object.assign({ document: root.ownerDocument, x: 0, y: 0 }, style), { fill, + fillOpacity, + stroke, draggable: true }), + className: 'mask', + }); + root.appendChild(mask); + }; + // Remove mask and reset states. + const removeMask = (emit = true) => { + if (mask) + mask.remove(); + if (background) + background.remove(); + start = null; + end = null; + moveStart = null; + creating = false; + mask = null; + background = null; + brushended(emit); + }; + // Update mask and invoke brushended callback. + const updateMask = (start, end, emit = true) => { + const [x, y, x1, y1] = normalizeBounds(start[0], start[1], end[0], end[1], extent); + const [fx, fy, fx1, fy1] = brushRegion(x, y, x1, y1, extent); + if (reverse) + updateReverseMask(fx, fy, fx1, fy1); + else + updateNormalMask(fx, fy, fx1, fy1); + brushed(fx, fy, fx1, fy1, emit); + return [fx, fy, fx1, fy1]; + }; + const updateNormalMask = (x, y, x1, y1) => { + mask.style.x = x; + mask.style.y = y; + mask.style.width = x1 - x; + mask.style.height = y1 - y; + }; + const updateReverseMask = (x, y, x1, y1) => { + background.style.d = ` + M${originX},${originY}L${width},${originY}L${width},${height}L${originX},${height}Z + M${x},${y}L${x},${y1}L${x1},${y1}L${x1},${y}Z + `; + mask.style.x = x; + mask.style.y = y; + mask.style.width = x1 - x; + mask.style.height = y1 - y; + }; + // Move and update mask. + const moveMask = (current) => { + const clip = (dt, start, end, min, max) => { + if (dt + start < min) + return min - start; + if (dt + end > max) + return max - end; + return dt; + }; + const dx = current[0] - moveStart[0]; + const dy = current[1] - moveStart[1]; + const dx1 = clip(dx, start[0], end[0], originX, width); + const dy1 = clip(dy, start[1], end[1], originY, height); + const currentStart = [start[0] + dx1, start[1] + dy1]; + const currentEnd = [end[0] + dx1, end[1] + dy1]; + updateMask(currentStart, currentEnd); + }; + const handles = { + 'handle-n': { vector: [0, 1, 0, 0], cursor: 'ns-resize' }, + 'handle-e': { vector: [0, 0, 1, 0], cursor: 'ew-resize' }, + 'handle-s': { vector: [0, 0, 0, 1], cursor: 'ns-resize' }, + 'handle-w': { vector: [1, 0, 0, 0], cursor: 'ew-resize' }, + 'handle-nw': { vector: [1, 1, 0, 0], cursor: 'nwse-resize' }, + 'handle-ne': { vector: [0, 1, 1, 0], cursor: 'nesw-resize' }, + 'handle-se': { vector: [0, 0, 1, 1], cursor: 'nwse-resize' }, + 'handle-sw': { vector: [1, 0, 0, 1], cursor: 'nesw-resize' }, + }; + const isMask = (target) => { + return isSelection(target) || isHandle(target); + }; + const isHandle = (target) => { + const { id } = target; + if (selectedHandles.indexOf(id) === -1) + return false; + return new Set(Object.keys(handles)).has(id); + }; + const isSelection = (target) => { + return target === mask.getElementById('selection'); + }; + // If target is plot area, create mask. + // If target is mask, about to update position. + const dragstart = (event) => { + const { target } = event; + const [offsetX, offsetY] = (0, utils_1.brushMousePosition)(root, event); + if (!mask || !isMask(target)) { + initMask(offsetX, offsetY, event); + creating = true; + return; + } + if (isMask(target)) { + moveStart = [offsetX, offsetY]; + } + }; + const drag = (event) => { + const { target } = event; + const mouse = (0, utils_1.brushMousePosition)(root, event); + if (!start) + return; + // If target is plot area, resize mask. + if (!moveStart) + return updateMask(start, mouse); + // If target is selection area, move mask. + if (isSelection(target)) + return moveMask(mouse); + // If target is handle area, resize mask. + const [dx, dy] = [mouse[0] - moveStart[0], mouse[1] - moveStart[1]]; + const { id } = target; + if (handles[id]) { + const [sx, sy, ex, ey] = handles[id].vector; + return updateMask([start[0] + dx * sx, start[1] + dy * sy], [end[0] + dx * ex, end[1] + dy * ey]); + } + }; + // If target is plot area, finish creating. + // If target is mask, finish moving mask. + const dragend = (event) => { + if (moveStart) { + moveStart = null; + // Update start and end; + const { x, y, width, height } = mask.style; + start = [x, y]; + end = [x + width, y + height]; + brushupdated(x, y, x + width, y + height, event); + return; + } + end = (0, utils_1.brushMousePosition)(root, event); + const [fx, fy, fx1, fy1] = updateMask(start, end); + creating = false; + brushcreated(fx, fy, fx1, fy1, event); + }; + // Hide mask. + const click = (event) => { + const { target } = event; + if (mask && !isMask(target)) + removeMask(); + }; + // Update cursor depends on hovered element. + const pointermove = (event) => { + const { target } = event; + if (!mask || !isMask(target) || creating) + (0, utils_1.setCursor)(root, 'crosshair'); + else if (isSelection(target)) + (0, utils_1.setCursor)(root, 'move'); + else if (isHandle(target)) + (0, utils_1.setCursor)(root, handles[target.id].cursor); + }; + const pointerleave = () => { + (0, utils_1.setCursor)(root, 'default'); + }; + root.addEventListener('dragstart', dragstart); + root.addEventListener('drag', drag); + root.addEventListener('dragend', dragend); + root.addEventListener('click', click); + root.addEventListener('pointermove', pointermove); + root.addEventListener('pointerleave', pointerleave); + return { + mask, + move(x, y, x1, y1, emit = true) { + if (!mask) + initMask(x, y, {}); + start = [x, y]; + end = [x1, y1]; + updateMask([x, y], [x1, y1], emit); + }, + remove(emit = true) { + if (mask) + removeMask(emit); + }, + destroy() { + // Do not emit brush:end event. + if (mask) + removeMask(false); + (0, utils_1.setCursor)(root, 'default'); + root.removeEventListener('dragstart', dragstart); + root.removeEventListener('drag', drag); + root.removeEventListener('dragend', dragend); + root.removeEventListener('click', click); + root.removeEventListener('pointermove', pointermove); + root.removeEventListener('pointerleave', pointerleave); + }, + }; +} +exports.brush = brush; +function selectSiblingViews(target, viewInstances, brushKey) { + return viewInstances.filter((d) => { + if (d === target) + return false; + const { interaction = {} } = d.options; + return Object.values(interaction).find((d) => d.brushKey === brushKey); + }); +} +function selectSiblingContainers(target, viewInstances, brushKey) { + return selectSiblingViews(target, viewInstances, brushKey).map((d) => (0, utils_1.selectPlotArea)(d.container)); +} +function selectSiblingOptions(target, viewInstances, brushKey) { + return selectSiblingViews(target, viewInstances, brushKey).map((d) => d.options); +} +/** + * @todo Brush over view for series view. + * @todo Test perf. + */ +function brushHighlight(root, _a) { + var { elements: elementof, selectedHandles, siblings: siblingsof = (root) => [], datum, brushRegion, extent: optionalExtent, reverse, scale, coordinate, series = false, key = (d) => d, bboxOf = (root) => { + const { x, y, width, height } = root.style; + return { x, y, width, height }; + }, state = {}, emitter } = _a, rest = __rest(_a, ["elements", "selectedHandles", "siblings", "datum", "brushRegion", "extent", "reverse", "scale", "coordinate", "series", "key", "bboxOf", "state", "emitter"]); + const elements = elementof(root); + const siblings = siblingsof(root); + const siblingElements = siblings.flatMap(elementof); + const valueof = (0, utils_1.createValueof)(elements, datum); + const brushStyle = (0, helper_1.subObject)(rest, 'mask'); + const { setState, removeState } = (0, utils_1.useState)(state, valueof); + const clonedElement = new Map(); + const { width: rootWidth, height: rootHeight, x: ordinalX = 0, y: ordinalY = 0, } = bboxOf(root); + const extent = optionalExtent + ? optionalExtent + : [0, 0, rootWidth, rootHeight]; + const brushended = () => { + for (const element of [...elements, ...siblingElements]) { + removeState(element, 'active', 'inactive'); + } + }; + const brushed = (x, y, x1, y1) => { + var _a; + // Hide brush for the sibling view. + for (const sibling of siblings) + (_a = sibling.brush) === null || _a === void 0 ? void 0 : _a.remove(); + // Store the key of the active element. + const keys = new Set(); + // Highlight and store selected elements. + for (const element of elements) { + const { min, max } = element.getLocalBounds(); + const [ex, ey] = min; + const [ex1, ey1] = max; + if (!intersect([ex, ey, ex1, ey1], [x, y, x1, y1])) { + setState(element, 'inactive'); + } + else { + setState(element, 'active'); + keys.add(key(element)); + } + } + // Highlight elements with same key in sibling view. + for (const element of siblingElements) { + if (keys.has(key(element))) + setState(element, 'active'); + else + setState(element, 'inactive'); + } + }; + const seriesBrushend = () => { + for (const element of elements) + removeState(element, 'inactive'); + for (const cloned of clonedElement.values()) + cloned.remove(); + clonedElement.clear(); + }; + const seriesBrushed = (x, y, x1, y1) => { + const clone = (element) => { + const cloned = element.cloneNode(); + cloned.__data__ = element.__data__; + element.parentNode.appendChild(cloned); + clonedElement.set(element, cloned); + return cloned; + }; + // Create a clipPath shared between all children. + const clipPath = new g_1.Rect({ + style: { + x: x + ordinalX, + y: y + ordinalY, + width: x1 - x, + height: y1 - y, + }, + }); + root.appendChild(clipPath); + for (const element of elements) { + const cloned = clonedElement.get(element) || clone(element); + cloned.style.clipPath = clipPath; + setState(element, 'inactive'); + setState(cloned, 'active'); + } + }; + const brushHandler = brush(root, Object.assign(Object.assign({}, brushStyle), { extent, + brushRegion, + reverse, + selectedHandles, brushended: (emit) => { + const handler = series ? seriesBrushend : brushended; + if (emit) { + emitter.emit('brush:remove', { nativeEvent: true }); + } + handler(); + }, brushed: (x, y, x1, y1, emit) => { + const selection = (0, scale_1.selectionOf)(x, y, x1, y1, scale, coordinate); + if (emit) { + emitter.emit('brush:highlight', { + nativeEvent: true, + data: { selection }, + }); + } + const handler = series ? seriesBrushed : brushed; + handler(x, y, x1, y1); + }, brushcreated: (x, y, x1, y1, event) => { + const selection = (0, scale_1.selectionOf)(x, y, x1, y1, scale, coordinate); + emitter.emit('brush:end', Object.assign(Object.assign({}, event), { nativeEvent: true, data: { selection } })); + }, brushupdated: (x, y, x1, y1, event) => { + const selection = (0, scale_1.selectionOf)(x, y, x1, y1, scale, coordinate); + emitter.emit('brush:end', Object.assign(Object.assign({}, event), { nativeEvent: true, data: { selection } })); + }, brushstarted: (e) => { + emitter.emit('brush:start', e); + } })); + // Move brush and highlight data. + const onHighlight = ({ nativeEvent, data }) => { + if (nativeEvent) + return; + const { selection } = data; + const [x, y, x1, y1] = (0, scale_1.pixelsOf)(selection, scale, coordinate); + brushHandler.move(x, y, x1, y1, false); + }; + emitter.on('brush:highlight', onHighlight); + // Remove brush and reset data. + const onRemove = ({ nativeEvent } = {}) => { + if (nativeEvent) + return; + brushHandler.remove(false); + }; + emitter.on('brush:remove', onRemove); + // Remove event handlers. + const preBrushDestroy = brushHandler.destroy.bind(brushHandler); + brushHandler.destroy = () => { + emitter.off('brush:highlight', onHighlight); + emitter.off('brush:remove', onRemove); + preBrushDestroy(); + }; + return brushHandler; +} +exports.brushHighlight = brushHighlight; +function BrushHighlight(_a) { + var { facet, brushKey } = _a, rest = __rest(_a, ["facet", "brushKey"]); + return (target, viewInstances, emitter) => { + const { container, view, options } = target; + const plotArea = (0, utils_1.selectPlotArea)(container); + const defaultOptions = { + maskFill: '#777', + maskFillOpacity: '0.3', + maskStroke: '#fff', + reverse: false, + }; + const defaultStates = ['active', ['inactive', { opacity: 0.5 }]]; + const { scale, coordinate } = view; + if (facet) { + const bbox = plotArea.getBounds(); + const x = bbox.min[0]; + const y = bbox.min[1]; + const x1 = bbox.max[0]; + const y1 = bbox.max[1]; + return brushHighlight(plotArea.parentNode.parentNode, Object.assign(Object.assign({ elements: () => (0, utils_1.selectFacetG2Elements)(target, viewInstances), datum: (0, utils_1.createDatumof)((0, utils_1.selectFacetViews)(target, viewInstances).map((d) => d.view)), brushRegion: (x, y, x1, y1) => [x, y, x1, y1], extent: [x, y, x1, y1], state: (0, utils_1.mergeState)((0, utils_1.selectFacetViews)(target, viewInstances).map((d) => d.options), defaultStates), emitter, + scale, + coordinate, selectedHandles: undefined }, defaultOptions), rest)); + } + const brush = brushHighlight(plotArea, Object.assign(Object.assign({ elements: utils_1.selectG2Elements, key: (element) => element.__data__.key, siblings: () => selectSiblingContainers(target, viewInstances, brushKey), datum: (0, utils_1.createDatumof)([ + view, + ...selectSiblingViews(target, viewInstances, brushKey).map((d) => d.view), + ]), brushRegion: (x, y, x1, y1) => [x, y, x1, y1], extent: undefined, state: (0, utils_1.mergeState)([options, ...selectSiblingOptions(target, viewInstances, brushKey)], defaultStates), emitter, + scale, + coordinate, selectedHandles: undefined }, defaultOptions), rest)); + // Bind brush to the view it belongs to. + //@ts-ignore + plotArea.brush = brush; + return () => brush.destroy(); + }; +} +exports.BrushHighlight = BrushHighlight; +//# sourceMappingURL=brushHighlight.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../utils/scale":1751263816057,"../utils/createElement":1751263815891,"../utils/selection":1751263815883,"./utils":1751263816080}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816135, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BrushXHighlight = exports.brushXRegion = void 0; +const brushHighlight_1 = require("./brushHighlight"); +function brushXRegion(x, y, x1, y1, extent) { + const [, minY, , maxY] = extent; + return [x, minY, x1, maxY]; +} +exports.brushXRegion = brushXRegion; +function BrushXHighlight(options) { + return (0, brushHighlight_1.BrushHighlight)(Object.assign(Object.assign({}, options), { brushRegion: brushXRegion, selectedHandles: ['handle-e', 'handle-w'] })); +} +exports.BrushXHighlight = BrushXHighlight; +//# sourceMappingURL=brushXHighlight.js.map +}, function(modId) { var map = {"./brushHighlight":1751263816134}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816136, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BrushYHighlight = exports.brushYRegion = void 0; +const brushHighlight_1 = require("./brushHighlight"); +function brushYRegion(x, y, x1, y1, extent) { + const [minX, , maxX] = extent; + return [minX, y, maxX, y1]; +} +exports.brushYRegion = brushYRegion; +function BrushYHighlight(options) { + return (0, brushHighlight_1.BrushHighlight)(Object.assign(Object.assign({}, options), { brushRegion: brushYRegion, selectedHandles: ['handle-n', 'handle-s'] })); +} +exports.BrushYHighlight = BrushYHighlight; +//# sourceMappingURL=brushYHighlight.js.map +}, function(modId) { var map = {"./brushHighlight":1751263816134}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816137, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BrushAxisHighlight = exports.brushAxisHighlight = exports.AXIS_HOT_AREA_CLASS_NAME = exports.AXIS_MAIN_CLASS_NAME = exports.AXIS_LINE_CLASS_NAME = exports.AXIS_CLASS_NAME = void 0; +const g_1 = require("@antv/g"); +const helper_1 = require("../utils/helper"); +const scale_1 = require("../utils/scale"); +const brushHighlight_1 = require("./brushHighlight"); +const brushXHighlight_1 = require("./brushXHighlight"); +const brushYHighlight_1 = require("./brushYHighlight"); +const utils_1 = require("./utils"); +exports.AXIS_CLASS_NAME = 'axis'; +exports.AXIS_LINE_CLASS_NAME = 'axis-line'; +exports.AXIS_MAIN_CLASS_NAME = 'axis-main-group'; +exports.AXIS_HOT_AREA_CLASS_NAME = 'axis-hot-area'; +function axesOf(container) { + return container.getElementsByClassName(exports.AXIS_CLASS_NAME); +} +function lineOf(axis) { + return axis.getElementsByClassName(exports.AXIS_LINE_CLASS_NAME)[0]; +} +function mainGroupOf(axis) { + return axis.getElementsByClassName(exports.AXIS_MAIN_CLASS_NAME)[0]; +} +// Use the bounds of main group of axis as the bounds of axis, +// get rid of grid and title. +function boundsOfAxis(axis) { + return mainGroupOf(axis).getLocalBounds(); +} +// Brush for vertical axis. +function verticalBrush(axis, _a) { + var { cross, offsetX, offsetY } = _a, style = __rest(_a, ["cross", "offsetX", "offsetY"]); + const bounds = boundsOfAxis(axis); + const axisLine = lineOf(axis); + const [lineX] = axisLine.getLocalBounds().min; + const [minX, minY] = bounds.min; + const [maxX, maxY] = bounds.max; + const size = (maxX - minX) * 2; + return { + brushRegion: brushYHighlight_1.brushYRegion, + hotZone: new g_1.Rect({ + className: exports.AXIS_HOT_AREA_CLASS_NAME, + style: Object.assign({ + // If it is not cross, draw brush in both side of axisLine, + // otherwise the draw brush within bounds area. + width: cross ? size / 2 : size, transform: `translate(${(cross ? minX : lineX - size / 2).toFixed(2)}, ${minY})`, height: maxY - minY }, style), + }), + extent: cross + ? // If it is cross, the x range is ignored. + (x, y, x1, y1) => [-Infinity, y, Infinity, y1] + : (x, y, x1, y1) => [ + Math.floor(minX - offsetX), + y, + Math.ceil(maxX - offsetX), + y1, + ], + }; +} +// Brush for horizontal axis. +function horizontalBrush(axis, _a) { + var { offsetY, offsetX, cross = false } = _a, style = __rest(_a, ["offsetY", "offsetX", "cross"]); + const bounds = boundsOfAxis(axis); + const axisLine = lineOf(axis); + const [, lineY] = axisLine.getLocalBounds().min; + const [minX, minY] = bounds.min; + const [maxX, maxY] = bounds.max; + const size = maxY - minY; + return { + brushRegion: brushXHighlight_1.brushXRegion, + hotZone: new g_1.Rect({ + className: exports.AXIS_HOT_AREA_CLASS_NAME, + style: Object.assign({ width: maxX - minX, + // If it is not cross, draw brush in both side of axisLine, + // otherwise the draw brush within bounds area. + height: cross ? size : size * 2, transform: `translate(${minX}, ${cross ? minY : lineY - size})` }, style), + }), + extent: cross + ? // If it is cross, the y range is ignored. + (x, y, x1, y1) => [x, -Infinity, x1, Infinity] + : (x, y, x1, y1) => [ + x, + Math.floor(minY - offsetY), + x1, + Math.ceil(maxY - offsetY), + ], + }; +} +function brushAxisHighlight(root, _a) { + var { axes: axesOf, // given root, return axes + elements: elementsOf, // given root, return elements + points: pointsOf, // given shape, return control points + horizontal: isHorizontal, // given axis, return direction + datum, // given shape, return datum + offsetY, // offsetY for shape area + offsetX, // offsetX for shape area + reverse = false, state = {}, emitter, coordinate } = _a, rest = __rest(_a, ["axes", "elements", "points", "horizontal", "datum", "offsetY", "offsetX", "reverse", "state", "emitter", "coordinate"]) // style + ; + const elements = elementsOf(root); + const axes = axesOf(root); + const valueof = (0, utils_1.createValueof)(elements, datum); + const { setState, removeState } = (0, utils_1.useState)(state, valueof); + const axisExtent = new Map(); + const brushStyle = (0, helper_1.subObject)(rest, 'mask'); + // Only some of shape's points in all mask, it is selected. + const brushed = (points) => Array.from(axisExtent.values()).every(([x, y, x1, y1]) => points.some(([x0, y0]) => { + return x0 >= x && x0 <= x1 && y0 >= y && y0 <= y1; + })); + const scales = axes.map((d) => d.attributes.scale); + const extentOf = (D) => (D.length > 2 ? [D[0], D[D.length - 1]] : D); + const indexDomain = new Map(); + const initIndexDomain = () => { + indexDomain.clear(); + for (let i = 0; i < axes.length; i++) { + const scale = scales[i]; + const { domain } = scale.getOptions(); + indexDomain.set(i, extentOf(domain)); + } + }; + initIndexDomain(); + // Update element when brush changed. + const updateElement = (i, emit) => { + const selectedElements = []; + for (const element of elements) { + const points = pointsOf(element); + if (brushed(points)) { + setState(element, 'active'); + selectedElements.push(element); + } + else + setState(element, 'inactive'); + } + indexDomain.set(i, selectionOf(selectedElements, i)); + if (!emit) + return; + // Emit events. + const selection = () => { + if (!cross) + return Array.from(indexDomain.values()); + const S = []; + for (const [index, domain] of indexDomain) { + const scale = scales[index]; + const { name } = scale.getOptions(); + if (name === 'x') + S[0] = domain; + else + S[1] = domain; + } + return S; + }; + emitter.emit('brushAxis:highlight', { + nativeEvent: true, + data: { + selection: selection(), + }, + }); + }; + const clearElement = (emit) => { + for (const element of elements) + removeState(element, 'active', 'inactive'); + initIndexDomain(); + if (!emit) + return; + emitter.emit('brushAxis:remove', { nativeEvent: true }); + }; + const selectionOf = (selected, i) => { + const scale = scales[i]; + const { name } = scale.getOptions(); + const domain = selected.map((d) => { + const data = d.__data__; + return scale.invert(data[name]); + }); + return extentOf((0, scale_1.domainOf)(scale, domain)); + }; + // Distinguish between parallel coordinates and normal charts. + const cross = axes.some(isHorizontal) && axes.some((d) => !isHorizontal(d)); + const handlers = []; + for (let i = 0; i < axes.length; i++) { + const axis = axes[i]; + const createBrush = isHorizontal(axis) ? horizontalBrush : verticalBrush; + const { hotZone, brushRegion, extent } = createBrush(axis, { + offsetY, + offsetX, + cross, + zIndex: 999, + fill: 'transparent', // Make it interactive. + }); + axis.parentNode.appendChild(hotZone); + const brushHandler = (0, brushHighlight_1.brush)(hotZone, Object.assign(Object.assign({}, brushStyle), { reverse, + brushRegion, + brushended(emit) { + axisExtent.delete(axis); + if (Array.from(axisExtent.entries()).length === 0) + clearElement(emit); + else + updateElement(i, emit); + }, + brushed(x, y, x1, y1, emit) { + axisExtent.set(axis, extent(x, y, x1, y1)); + updateElement(i, emit); + } })); + handlers.push(brushHandler); + } + const onRemove = (event = {}) => { + const { nativeEvent } = event; + if (nativeEvent) + return; + handlers.forEach((d) => d.remove(false)); + }; + const rangeOf = (domain, scale, axis) => { + const [d0, d1] = domain; + const maybeStep = (scale) => (scale.getStep ? scale.getStep() : 0); + const x = abstractOf(d0, scale, axis); + const x1 = abstractOf(d1, scale, axis) + maybeStep(scale); + if (isHorizontal(axis)) + return [x, -Infinity, x1, Infinity]; + return [-Infinity, x, Infinity, x1]; + }; + const abstractOf = (x, scale, axis) => { + const { height, width } = coordinate.getOptions(); + const scale1 = scale.clone(); + if (isHorizontal(axis)) + scale1.update({ range: [0, width] }); + else + scale1.update({ range: [height, 0] }); + return scale1.map(x); + }; + const onHighlight = (event) => { + const { nativeEvent } = event; + if (nativeEvent) + return; + const { selection } = event.data; + for (let i = 0; i < handlers.length; i++) { + const domain = selection[i]; + const handler = handlers[i]; + const axis = axes[i]; + if (domain) { + const scale = scales[i]; + handler.move(...rangeOf(domain, scale, axis), false); + } + else { + handler.remove(false); + } + } + }; + emitter.on('brushAxis:remove', onRemove); + emitter.on('brushAxis:highlight', onHighlight); + return () => { + handlers.forEach((d) => d.destroy()); + emitter.off('brushAxis:remove', onRemove); + emitter.off('brushAxis:highlight', onHighlight); + }; +} +exports.brushAxisHighlight = brushAxisHighlight; +/** + * @todo Support mask size. + */ +function BrushAxisHighlight(options) { + return (target, _, emitter) => { + const { container, view, options: viewOptions } = target; + const plotArea = (0, utils_1.selectPlotArea)(container); + const { x: x0, y: y0 } = plotArea.getBBox(); + const { coordinate } = view; + return brushAxisHighlight(container, Object.assign({ elements: utils_1.selectG2Elements, axes: axesOf, offsetY: y0, offsetX: x0, points: (element) => element.__data__.points, horizontal: (axis) => { + const { startPos: [sx, sy], endPos: [ex, ey], } = axis.attributes; + // attention, non-horizontal does not mean vertical + // it may has a specific degree angle + return sx !== ex && sy === ey; + }, datum: (0, utils_1.createDatumof)(view), state: (0, utils_1.mergeState)(viewOptions, [ + 'active', + ['inactive', { opacity: 0.5 }], + ]), coordinate, + emitter }, options)); + }; +} +exports.BrushAxisHighlight = BrushAxisHighlight; +//# sourceMappingURL=brushAxisHighlight.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../utils/scale":1751263816057,"./brushHighlight":1751263816134,"./brushXHighlight":1751263816135,"./brushYHighlight":1751263816136,"./utils":1751263816080}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816138, function(require, module, exports) { + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BrushFilter = exports.brushFilter = void 0; +const util_1 = require("@antv/util"); +const helper_1 = require("../utils/helper"); +const scale_1 = require("../utils/scale"); +const brushHighlight_1 = require("./brushHighlight"); +const utils_1 = require("./utils"); +// Mock dblclick events. +function dblclick(interval = 300) { + let preTimeStamp = null; + return (e) => { + const { timeStamp } = e; + if (preTimeStamp !== null && timeStamp - preTimeStamp < interval) { + preTimeStamp = timeStamp; + return true; + } + preTimeStamp = timeStamp; + return false; + }; +} +function brushFilter(root, _a) { + var { filter, reset, brushRegion, extent: optionalExtent, reverse, emitter, scale, coordinate, selection, series = false } = _a, rest = __rest(_a, ["filter", "reset", "brushRegion", "extent", "reverse", "emitter", "scale", "coordinate", "selection", "series"]); + const brushStyle = (0, helper_1.subObject)(rest, 'mask'); + const { width: rootWidth, height: rootHeight } = root.getBBox(); + const extent = optionalExtent + ? optionalExtent + : [0, 0, rootWidth, rootHeight]; + const isDblclick = dblclick(); + const brush = (0, brushHighlight_1.brush)(root, Object.assign(Object.assign({}, brushStyle), { extent, + brushRegion, + reverse, + brushcreated })); + root.addEventListener('click', click); + // Filter when brush created. + function brushcreated(x, y, x1, y1, event) { + if (x === x1 && y === y1) + return; + event.nativeEvent = true; + filter(selection(x, y, x1, y1), event); + brush.remove(); + } + // Reset when dblclick. + function click(e) { + if (isDblclick(e)) { + e.nativeEvent = true; + reset(e); + } + } + const onFilter = ({ nativeEvent, data }) => { + if (nativeEvent) + return; + const { selection } = data; + filter(selection, { nativeEvent: false }); + }; + emitter.on('brush:filter', onFilter); + return () => { + brush.destroy(); + emitter.off('brush:filter', onFilter); + root.removeEventListener('click', click); + }; +} +exports.brushFilter = brushFilter; +function BrushFilter(_a) { + var { hideX = true, hideY = true } = _a, rest = __rest(_a, ["hideX", "hideY"]); + return (target, viewInstances, emitter) => { + const { container, view, options: viewOptions, update, setState } = target; + const plotArea = (0, utils_1.selectPlotArea)(container); + const defaultOptions = { + maskFill: '#777', + maskFillOpacity: '0.3', + maskStroke: '#fff', + unhighlightedOpacity: 0.5, + reverse: false, + }; + let filtered = false; + let filtering = false; + let newView = view; + const { scale, coordinate } = view; + return brushFilter(plotArea, Object.assign(Object.assign({ brushRegion: (x, y, x1, y1) => [x, y, x1, y1], selection: (x, y, x1, y1) => { + const { scale, coordinate } = newView; + return (0, scale_1.selectionOf)(x, y, x1, y1, scale, coordinate); + }, filter: (selection, event) => __awaiter(this, void 0, void 0, function* () { + // Avoid redundant filter. + if (filtering) + return; + filtering = true; + // Update the domain of x and y scale to filter data. + const [domainX, domainY] = selection; + setState('brushFilter', (options) => { + const { marks } = options; + const newMarks = marks.map((mark) => (0, util_1.deepMix)({ + // Hide label to keep smooth transition. + axis: Object.assign(Object.assign({}, (hideX && { x: { transform: [{ type: 'hide' }] } })), (hideY && { y: { transform: [{ type: 'hide' }] } })), + }, mark, { + // Set nice to false to avoid modify domain. + scale: { + x: { domain: domainX, nice: false }, + y: { domain: domainY, nice: false }, + }, + })); + return Object.assign(Object.assign({}, viewOptions), { marks: newMarks, clip: true }); + }); + // Emit event. + emitter.emit('brush:filter', Object.assign(Object.assign({}, event), { data: { selection: [domainX, domainY] } })); + const newState = yield update(); + newView = newState.view; + filtering = false; + filtered = true; + }), reset: (event) => { + if (filtering || !filtered) + return; + // Emit event. + const { scale } = view; + const { x: scaleX, y: scaleY } = scale; + const domainX = scaleX.getOptions().domain; + const domainY = scaleY.getOptions().domain; + emitter.emit('brush:filter', Object.assign(Object.assign({}, event), { data: { selection: [domainX, domainY] } })); + filtered = false; + newView = view; + setState('brushFilter'); + update(); + }, extent: undefined, emitter, + scale, + coordinate }, defaultOptions), rest)); + }; +} +exports.BrushFilter = BrushFilter; +//# sourceMappingURL=brushFilter.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../utils/scale":1751263816057,"./brushHighlight":1751263816134,"./utils":1751263816080}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816139, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BrushXFilter = void 0; +const brushFilter_1 = require("./brushFilter"); +const brushXHighlight_1 = require("./brushXHighlight"); +function BrushXFilter(options) { + return (0, brushFilter_1.BrushFilter)(Object.assign(Object.assign({ hideX: true }, options), { brushRegion: brushXHighlight_1.brushXRegion })); +} +exports.BrushXFilter = BrushXFilter; +//# sourceMappingURL=brushXFilter.js.map +}, function(modId) { var map = {"./brushFilter":1751263816138,"./brushXHighlight":1751263816135}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816140, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BrushYFilter = void 0; +const brushFilter_1 = require("./brushFilter"); +const brushYHighlight_1 = require("./brushYHighlight"); +function BrushYFilter(options) { + return (0, brushFilter_1.BrushFilter)(Object.assign(Object.assign({ hideY: true }, options), { brushRegion: brushYHighlight_1.brushYRegion })); +} +exports.BrushYFilter = BrushYFilter; +//# sourceMappingURL=brushYFilter.js.map +}, function(modId) { var map = {"./brushFilter":1751263816138,"./brushYHighlight":1751263816136}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816141, function(require, module, exports) { + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SliderFilter = exports.SLIDER_CLASS_NAME = void 0; +const util_1 = require("@antv/util"); +const g_1 = require("@antv/g"); +const coordinate_1 = require("../utils/coordinate"); +const scale_1 = require("../utils/scale"); +exports.SLIDER_CLASS_NAME = 'slider'; +function filterDataByDomain(options, scaleOptions, prefix, hasState = false, channel0 = 'x', channel1 = 'y') { + const { marks } = options; + const newMarks = marks.map((mark) => { + var _a, _b; + return (0, util_1.deepMix)({ + // Hide label to keep smooth transition. + axis: { + x: { transform: [{ type: 'hide' }] }, + y: { transform: [{ type: 'hide' }] }, + }, + }, mark, { + scale: scaleOptions, + // Don't rerender sliders. + [prefix]: Object.assign(Object.assign({}, (((_a = mark[prefix]) === null || _a === void 0 ? void 0 : _a[channel0]) && { + [channel0]: Object.assign({ preserve: true }, (hasState && { ratio: null })), + })), (((_b = mark[prefix]) === null || _b === void 0 ? void 0 : _b[channel1]) && { + [channel1]: { preserve: true }, + })), + animate: false, + }); + }); + // Rerender and update view. + return Object.assign(Object.assign({}, options), { marks: newMarks, clip: true, animate: false }); +} +function abstractValue(values, scale, reverse) { + const [x, x1] = values; + const v = reverse ? (d) => 1 - d : (d) => d; + const d0 = (0, scale_1.invert)(scale, v(x), true); + const d1 = (0, scale_1.invert)(scale, v(x1), false); + return (0, scale_1.domainOf)(scale, [d0, d1]); +} +function extentOf(domain) { + return [domain[0], domain[domain.length - 1]]; +} +/** + * @todo Support click to reset after fix click and dragend conflict. + */ +function SliderFilter({ initDomain = {}, className = exports.SLIDER_CLASS_NAME, prefix = 'slider', setValue = (component, values) => component.setValues(values), hasState = false, wait = 50, leading = true, trailing = false, getInitValues = (slider) => { + var _a; + const values = (_a = slider === null || slider === void 0 ? void 0 : slider.attributes) === null || _a === void 0 ? void 0 : _a.values; + if (values[0] !== 0 || values[1] !== 1) + return values; +}, }) { + return (context, _, emitter) => { + const { container, view, update, setState } = context; + const sliders = container.getElementsByClassName(className); + if (!sliders.length) + return () => { }; + let filtering = false; + const { scale, coordinate, layout } = view; + const { paddingLeft, paddingTop, paddingBottom, paddingRight } = layout; + const { x: scaleX, y: scaleY } = scale; + const transposed = (0, coordinate_1.isTranspose)(coordinate); + const channelOf = (orientation) => { + const channel0 = orientation === 'vertical' ? 'y' : 'x'; + const channel1 = orientation === 'vertical' ? 'x' : 'y'; + if (transposed) + return [channel1, channel0]; + return [channel0, channel1]; + }; + const sliderHandler = new Map(); + const emitHandlers = new Set(); + // Store current domain of x and y scale. + const channelDomain = { + x: initDomain.x || scaleX.getOptions().domain, + y: initDomain.y || scaleY.getOptions().domain, + }; + for (const slider of sliders) { + const { orientation } = slider.attributes; + const [channel0, channel1] = channelOf(orientation); + const eventName = `${prefix}${(0, util_1.upperFirst)(channel0)}:filter`; + const isX = channel0 === 'x'; + const { ratio: ratioX } = scaleX.getOptions(); + const { ratio: ratioY } = scaleY.getOptions(); + const domainsOf = (event) => { + // From abstract values. + if (event.data) { + const { selection } = event.data; + const [X = extentOf(channelDomain.x), Y = extentOf(channelDomain.y)] = selection; + return isX + ? [(0, scale_1.domainOf)(scaleX, X, ratioX), (0, scale_1.domainOf)(scaleY, Y, ratioY)] + : [(0, scale_1.domainOf)(scaleY, Y, ratioY), (0, scale_1.domainOf)(scaleX, X, ratioX)]; + } + // From visual values. + const { value: values } = event.detail; + const scale0 = scale[channel0]; + const domain0 = abstractValue(values, scale0, transposed && orientation === 'horizontal'); + const domain1 = channelDomain[channel1]; + return [domain0, domain1]; + }; + const onValueChange = (0, util_1.throttle)((event) => __awaiter(this, void 0, void 0, function* () { + const { initValue = false } = event; + if (filtering && !initValue) + return; + filtering = true; + const { nativeEvent = true } = event; + // Get and update domain. + const [domain0, domain1] = domainsOf(event); + channelDomain[channel0] = domain0; + channelDomain[channel1] = domain1; + if (nativeEvent) { + // Emit events. + const X = isX ? domain0 : domain1; + const Y = isX ? domain1 : domain0; + emitter.emit(eventName, Object.assign(Object.assign({}, event), { nativeEvent, data: { selection: [extentOf(X), extentOf(Y)] } })); + } + setState(slider, (options) => (Object.assign(Object.assign({}, filterDataByDomain(options, + // Set nice to false to avoid modify domain. + // Only update domain of current slider / scrollbar. + { [channel0]: { domain: domain0, nice: false } }, prefix, hasState, channel0, channel1)), { paddingLeft, + paddingTop, + paddingBottom, + paddingRight }))); + yield update(); + filtering = false; + }), wait, { leading, trailing }); + const emitHandler = (event) => { + const { nativeEvent } = event; + if (nativeEvent) + return; + const { data } = event; + const { selection } = data; + const [X, Y] = selection; + // Update data. + slider.dispatchEvent(new g_1.CustomEvent('valuechange', { + data, + nativeEvent: false, + })); + // Update slider. + const V = isX ? (0, scale_1.abstractOf)(X, scaleX) : (0, scale_1.abstractOf)(Y, scaleY); + setValue(slider, V); + }; + emitter.on(eventName, emitHandler); + slider.addEventListener('valuechange', onValueChange); + sliderHandler.set(slider, onValueChange); + emitHandlers.add([eventName, emitHandler]); + const values = getInitValues(slider); + if (values) { + // Init values. + slider.dispatchEvent(new g_1.CustomEvent('valuechange', { + detail: { + value: values, + }, + nativeEvent: false, + initValue: true, + })); + } + } + return () => { + for (const [slider, handler] of sliderHandler) { + slider.removeEventListener('valuechange', handler); + } + for (const [name, handler] of emitHandlers) { + emitter.off(name, handler); + } + }; + }; +} +exports.SliderFilter = SliderFilter; +//# sourceMappingURL=sliderFilter.js.map +}, function(modId) { var map = {"../utils/coordinate":1751263815882,"../utils/scale":1751263816057}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816142, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ScrollbarFilter = exports.SCROLLBAR_CLASS_NAME = void 0; +const sliderFilter_1 = require("./sliderFilter"); +exports.SCROLLBAR_CLASS_NAME = 'g2-scrollbar'; +function ScrollbarFilter(options = {}) { + return (context, _, emitter) => { + const { view, container } = context; + const scrollbars = container.getElementsByClassName(exports.SCROLLBAR_CLASS_NAME); + if (!scrollbars.length) + return () => { }; + const { scale } = view; + const { x: scaleX, y: scaleY } = scale; + // The filtered domain, computed by the ratio attribute. + const initDomain = { + x: [...scaleX.getOptions().domain], + y: [...scaleY.getOptions().domain], + }; + // The ordinal domain for each channel. + scaleX.update({ domain: scaleX.getOptions().expectedDomain }); + scaleY.update({ domain: scaleY.getOptions().expectedDomain }); + const interaction = (0, sliderFilter_1.SliderFilter)(Object.assign(Object.assign({}, options), { initDomain, className: exports.SCROLLBAR_CLASS_NAME, prefix: 'scrollbar', hasState: true, setValue: (component, values) => component.setValue(values[0]), getInitValues: (scrollbar) => { + const values = scrollbar.slider.attributes.values; + if (values[0] !== 0) + return values; + } })); + return interaction(context, _, emitter); + }; +} +exports.ScrollbarFilter = ScrollbarFilter; +//# sourceMappingURL=scrollbarFilter.js.map +}, function(modId) { var map = {"./sliderFilter":1751263816141}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816143, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Poptip = void 0; +const g_1 = require("@antv/g"); +const string_1 = require("../utils/string"); +const helper_1 = require("../utils/helper"); +function dom(tag, children, style) { + return `<${tag} style="${Object.entries(style) + .map(([key, value]) => `${(0, string_1.kebabCase)(key)}:${value}`) + .join(';')}">${children}`; +} +const defaultTipStyle = { + backgroundColor: 'rgba(0,0,0,0.75)', + color: '#fff', + width: 'max-content', + padding: '1px 4px', + fontSize: '12px', + borderRadius: '2.5px', + boxShadow: '0 3px 6px -4px rgba(0,0,0,0.12), 0 6px 16px 0 rgba(0,0,0,0.08), 0 9px 28px 8px rgba(0,0,0,0.05)', +}; +function isTipText(element) { + if (element.nodeName !== 'text') + return false; + if (element.isOverflowing()) + return true; + return false; +} +function Poptip(_a) { + var { offsetX = 8, offsetY = 8 } = _a, style = __rest(_a, ["offsetX", "offsetY"]); + return (context) => { + const { container } = context; + const [x0, y0] = container.getBounds().min; + const tipStyle = (0, helper_1.subObject)(style, 'tip'); + const tips = new Set(); + const pointerover = (e) => { + const { target } = e; + if (!isTipText(target)) { + e.stopPropagation(); + return; + } + const { offsetX: mouseX, offsetY: mouseY } = e; + const x = mouseX + offsetX - x0; + const y = mouseY + offsetY - y0; + if (target.tip) { + target.tip.style.x = x; + target.tip.style.y = y; + return; + } + const { text } = target.style; + const tipELement = new g_1.HTML({ + className: 'poptip', + style: { + innerHTML: dom('div', text, Object.assign(Object.assign({}, defaultTipStyle), tipStyle)), + x, + y, + }, + }); + container.appendChild(tipELement); + target.tip = tipELement; + tips.add(tipELement); + }; + const pointerout = (e) => { + const { target } = e; + if (!isTipText(target)) { + e.stopPropagation(); + return; + } + if (!target.tip) + return; + target.tip.remove(); + target.tip = null; + tips.delete(target.tip); + }; + container.addEventListener('pointerover', pointerover); + container.addEventListener('pointerout', pointerout); + return () => { + container.removeEventListener('pointerover', pointerover); + container.removeEventListener('pointerout', pointerout); + tips.forEach((tip) => tip.remove()); + }; + }; +} +exports.Poptip = Poptip; +Poptip.props = { + reapplyWhenUpdate: true, +}; +//# sourceMappingURL=poptip.js.map +}, function(modId) { var map = {"../utils/string":1751263815900,"../utils/helper":1751263815829}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816144, function(require, module, exports) { + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TreemapDrillDown = void 0; +const g_1 = require("@antv/g"); +const util_1 = require("@antv/util"); +const helper_1 = require("../utils/helper"); +const runtime_1 = require("../runtime"); +const selection_1 = require("../utils/selection"); +const treeDataTransform_1 = require("../utils/treeDataTransform"); +const legendFilter_1 = require("./legendFilter"); +const utils_1 = require("./utils"); +function selectPlotArea(root) { + return (0, selection_1.select)(root).select(`.${runtime_1.PLOT_CLASS_NAME}`).node(); +} +// Default breadCrumb config. +const DEFAULT_BREADCRUMB_STYLE = { + breadCrumbFill: 'rgba(0, 0, 0, 0.85)', + breadCrumbFontSize: 12, + breadCrumbY: 12, + activeFill: 'rgba(0, 0, 0, 0.5)', +}; +/** + * TreemapDrillDown interaction. + */ +function TreemapDrillDown(drillDownOptions = {}) { + const { originData = [], layout } = drillDownOptions, style = __rest(drillDownOptions, ["originData", "layout"]); + const breadCrumb = (0, util_1.deepMix)({}, DEFAULT_BREADCRUMB_STYLE, style); + const breadCrumbStyle = (0, helper_1.subObject)(breadCrumb, 'breadCrumb'); + const breadCrumbActiveStyle = (0, helper_1.subObject)(breadCrumb, 'active'); + return (context) => { + const { update, setState, container, options } = context; + const plotArea = selectPlotArea(container); + const mark = options.marks[0]; + const { state } = mark; + // Create breadCrumbTextsGroup,save textSeparator、drillTexts. + const textGroup = new g_1.Group(); + plotArea.appendChild(textGroup); + // Modify the data and scale according to the path and the level of the current click, so as to achieve the effect of drilling down and drilling up and initialization. + const drillDownClick = (path, depth) => __awaiter(this, void 0, void 0, function* () { + // Clear text. + textGroup.removeChildren(); + // More path creation text. + if (depth) { + let name = ''; + let y = breadCrumbStyle.y; + let x = 0; + const textPath = []; + const maxWidth = plotArea.getBBox().width; + // Create path: 'type1 / type2 / type3' -> '/ type1 / type2 / type3'. + const drillTexts = path.map((text, index) => { + name = `${name}${text}/`; + textPath.push(text); + const drillText = new g_1.Text({ + name: name.replace(/\/$/, ''), + style: Object.assign(Object.assign({ text, + x, + // @ts-ignore + path: [...textPath], depth: index }, breadCrumbStyle), { y }), + }); + textGroup.appendChild(drillText); + x += drillText.getBBox().width; + const textSeparator = new g_1.Text({ + style: Object.assign(Object.assign({ x, text: ' / ' }, breadCrumbStyle), { y }), + }); + textGroup.appendChild(textSeparator); + x += textSeparator.getBBox().width; + /** + * Page width exceeds maximum, line feed. + * | ----maxWidth---- | + * | / tyep1 / tyep2 / type3 | + * -> + * | ----maxWidth---- | + * | / tyep1 / tyep2 | + * | / type3 | + */ + if (x > maxWidth) { + y = textGroup.getBBox().height + breadCrumbStyle.y; + x = 0; + drillText.attr({ + x, + y, + }); + x += drillText.getBBox().width; + textSeparator.attr({ + x, + y, + }); + x += textSeparator.getBBox().width; + } + if (index === (0, util_1.size)(path) - 1) { + textSeparator.remove(); + } + return drillText; + }); + // Add Active, Add TreemapDrillDown + drillTexts.forEach((item, index) => { + // Last drillText + if (index === (0, util_1.size)(drillTexts) - 1) + return; + const originalAttrs = Object.assign({}, item.attributes); + item.attr('cursor', 'pointer'); + item.addEventListener('mouseenter', () => { + item.attr(breadCrumbActiveStyle); + }); + item.addEventListener('mouseleave', () => { + item.attr(originalAttrs); + }); + item.addEventListener('click', () => { + drillDownClick((0, util_1.get)(item, ['style', 'path']), (0, util_1.get)(item, ['style', 'depth'])); + }); + }); + } + // LegendFilter interaction and treemapDrillDown clash. + (0, legendFilter_1.legendClearSetState)(container, setState); + // Update marks. + setState('treemapDrillDown', (viewOptions) => { + const { marks } = viewOptions; + // Add filter transform for every marks, + // which will skip for mark without color channel. + const strPath = path.join('/'); + const newMarks = marks.map((mark) => { + if (mark.type !== 'rect') + return mark; + let newData = originData; + if (depth) { + const filterData = originData + .filter((item) => { + const id = (0, util_1.get)(item, ['id']); + return id && (id.match(`${strPath}/`) || strPath.match(id)); + }) + .map((item) => ({ + value: item.height === 0 ? (0, util_1.get)(item, ['value']) : undefined, + name: (0, util_1.get)(item, ['id']), + })); + const { paddingLeft, paddingBottom, paddingRight } = layout; + // New drill layout for calculation x y and filtration data. + const newLayout = Object.assign(Object.assign({}, layout), { paddingTop: (layout.paddingTop || textGroup.getBBox().height + 10) / + (depth + 1), paddingLeft: paddingLeft / (depth + 1), paddingBottom: paddingBottom / (depth + 1), paddingRight: paddingRight / (depth + 1), path: (d) => d.name, layer: (d) => d.depth === depth + 1 }); + // Transform the new matrix tree data. + newData = (0, treeDataTransform_1.treeDataTransform)(filterData, newLayout, { + value: 'value', + })[0]; + } + else { + newData = originData.filter((item) => { + return item.depth === 1; + }); + } + const colorDomain = []; + newData.forEach(({ path }) => { + colorDomain.push((0, util_1.last)(path)); + }); + // TreemapDrillDown by filtering the data and scale. + return (0, util_1.deepMix)({}, mark, { + data: newData, + scale: { + color: { domain: colorDomain }, + }, + }); + }); + return Object.assign(Object.assign({}, viewOptions), { marks: newMarks }); + }); + // The second argument is to allow the legendFilter event to be re-added; the update method itself causes legend to lose the interaction event. + yield update(undefined, ['legendFilter']); + }); + // + const keyofLabel = (d) => d.attributes.key.split('-')[0]; + const keyofRect = (d) => (0, util_1.get)(d, ['__data__', 'key']); + // Elements and BreadCrumb click. + const createDrillClick = (e) => { + const item = e.target; + const { markType, nodeName, attributes } = item || {}; + if (markType !== 'rect' && nodeName !== g_1.Shape.TEXT) + return; + const key = nodeName === g_1.Shape.TEXT && (0, util_1.get)(attributes, 'isTreemapLabel') === true + ? keyofLabel(item) + : keyofRect(item); + const node = (0, util_1.find)(originData, (d) => d.id === key); + // Node height = 0 no children + if ((0, util_1.get)(node, 'height')) { + drillDownClick((0, util_1.get)(node, 'path'), (0, util_1.get)(node, 'depth')); + } + }; + // Add click drill interaction. + plotArea.addEventListener('click', createDrillClick); + // Change attributes keys. + const changeStyleKey = (0, util_1.keys)(Object.assign(Object.assign({}, state.active), state.inactive)); + const createActive = () => { + const elements = (0, utils_1.getElements)(plotArea); + elements.forEach((element) => { + const cursor = (0, util_1.get)(element, ['style', 'cursor']); + const node = (0, util_1.find)(originData, (d) => d.id === (0, util_1.get)(element, ['__data__', 'key'])); + if (cursor !== 'pointer' && (node === null || node === void 0 ? void 0 : node.height)) { + element.style.cursor = 'pointer'; + const originalAttrs = (0, util_1.pick)(element.attributes, changeStyleKey); + element.addEventListener('mouseenter', () => { + element.attr(state.active); + }); + element.addEventListener('mouseleave', () => { + element.attr((0, util_1.deepMix)(originalAttrs, state.inactive)); + }); + } + }); + }; + createActive(); + // Animate elements update, Add active. + plotArea.addEventListener('mousemove', createActive); + return () => { + textGroup.remove(); + plotArea.removeEventListener('click', createDrillClick); + plotArea.removeEventListener('mousemove', createActive); + }; + }; +} +exports.TreemapDrillDown = TreemapDrillDown; +//# sourceMappingURL=treemapDrillDown.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"../runtime":1751263816081,"../utils/selection":1751263815883,"../utils/treeDataTransform":1751263816005,"./legendFilter":1751263816132,"./utils":1751263816080}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816145, function(require, module, exports) { + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ElementPointMove = void 0; +const g_1 = require("@antv/g"); +const util_1 = require("@antv/util"); +const helper_1 = require("../utils/helper"); +const utils_1 = require("./utils"); +const DEFAULT_STYLE = { + pointR: 6, + pointStrokeWidth: 1, + pointStroke: '#888', + pointActiveStroke: '#f5f5f5', + pathStroke: '#888', + pathLineDash: [3, 4], + labelFontSize: 12, + labelFill: '#888', + labelStroke: '#fff', + labelLineWidth: 1, + labelY: -6, + labelX: 2, +}; +// point shape name. +const MOVE_POINT_NAME = 'movePoint'; +// Element mouseenter change style. +const elementMouseenter = (e) => { + const element = e.target; + const { markType } = element; + // Mark line. + if (markType === 'line') { + element.attr('_lineWidth', element.attr('lineWidth') || 1); + element.attr('lineWidth', element.attr('_lineWidth') + 3); + } + // Mark interval. + if (markType === 'interval') { + element.attr('_opacity', element.attr('opacity') || 1); + element.attr('opacity', 0.7 * element.attr('_opacity')); + } +}; +// Element mouseleave change style. +const elementMouseleave = (e) => { + const element = e.target; + const { markType } = element; + // Mark line. + if (markType === 'line') { + element.attr('lineWidth', element.attr('_lineWidth')); + } + // Mark interval. + if (markType === 'interval') { + element.attr('opacity', element.attr('_opacity')); + } +}; +// Get the latest overall data based on the individual data changes. +const getNewData = (newChangeData, data, encode) => { + return data.map((d) => { + const isUpdate = ['x', 'color'].reduce((v, key) => { + const field = encode[key]; + if (!field) + return v; + if (d[field] !== newChangeData[field]) + return false; + return v; + }, true); + return isUpdate ? Object.assign(Object.assign({}, d), newChangeData) : d; + }); +}; +// Find mark interval origin element data. +const getIntervalDataRatioTransformFn = (element) => { + const y = (0, util_1.get)(element, ['__data__', 'y']); + const y1 = (0, util_1.get)(element, ['__data__', 'y1']); + const v = y1 - y; + const { __data__: { data, encode, transform }, childNodes, } = element.parentNode; + const isNormalizeY = (0, util_1.find)(transform, ({ type }) => type === 'normalizeY'); + const yField = (0, util_1.get)(encode, ['y', 'field']); + const value = data[childNodes.indexOf(element)][yField]; + return (newValue, isTheta = false) => { + if (isNormalizeY || isTheta) { + return (newValue / (1 - newValue) / (v / (1 - v))) * value; + } + return newValue; + }; +}; +// Find origin path data. +const getPathDataRatioTransformFn = (element, index) => { + const v = (0, util_1.get)(element, ['__data__', 'seriesItems', index, '0', 'value']); + const i = (0, util_1.get)(element, ['__data__', 'seriesIndex', index]); + const { __data__: { data, encode, transform }, } = element.parentNode; + const isNormalizeY = (0, util_1.find)(transform, ({ type }) => type === 'normalizeY'); + const yField = (0, util_1.get)(encode, ['y', 'field']); + const value = data[i][yField]; + return (newValue) => { + if (isNormalizeY) { + if (v === 1) { + return newValue; + } + return (newValue / (1 - newValue) / (v / (1 - v))) * value; + } + return newValue; + }; +}; +// Point shape select change style. +const selectedPointsStyle = (pointsShape, selection, defaultStyle) => { + pointsShape.forEach((shape, index) => { + shape.attr('stroke', selection[1] === index + ? defaultStyle['activeStroke'] + : defaultStyle['stroke']); + }); +}; +// Create help show message shape. +const createHelpShape = (group, circle, pathStyle, labelStyle) => { + const pathShape = new g_1.Path({ + style: pathStyle, + }); + const labelShape = new g_1.Text({ + style: labelStyle, + }); + circle.appendChild(labelShape); + group.appendChild(pathShape); + return [pathShape, labelShape]; +}; +// Get color scale type. +const getColorType = (scaleColor, color) => { + const indexOf = (0, util_1.get)(scaleColor, ['options', 'range', 'indexOf']); + if (!indexOf) + return; + const i = scaleColor.options.range.indexOf(color); + return scaleColor.sortedDomain[i]; +}; +// Get the same direction new point. +const getSamePointPosition = (center, point, target) => { + const oldR = (0, utils_1.getPointsR)(center, point); + const newR = (0, utils_1.getPointsR)(center, target); + const ratio = newR / oldR; + const newX = center[0] + (point[0] - center[0]) * ratio; + const newY = center[1] + (point[1] - center[1]) * ratio; + return [newX, newY]; +}; +/** + * ElementPointMove interaction. + */ +function ElementPointMove(elementPointMoveOptions = {}) { + const { selection = [], precision = 2 } = elementPointMoveOptions, style = __rest(elementPointMoveOptions, ["selection", "precision"]); + const defaultStyle = Object.assign(Object.assign({}, DEFAULT_STYLE), (style || {})); + // Shape default style. + const pathDefaultStyle = (0, helper_1.subObject)(defaultStyle, 'path'); + const labelDefaultStyle = (0, helper_1.subObject)(defaultStyle, 'label'); + const pointDefaultStyle = (0, helper_1.subObject)(defaultStyle, 'point'); + return (context, _, emitter) => { + const { update, setState, container, view, options: { marks, coordinate: coordinateOptions }, } = context; + const plotArea = (0, utils_1.selectPlotArea)(container); + let elements = (0, utils_1.getElements)(plotArea); + let newState; + let newSelection = selection; + const { transform = [], type: coordinateType } = coordinateOptions; + const isTranspose = !!(0, util_1.find)(transform, ({ type }) => type === 'transpose'); + const isPolar = coordinateType === 'polar'; + const isTheta = coordinateType === 'theta'; + const isArea = !!(0, util_1.find)(elements, ({ markType }) => markType === 'area'); + if (isArea) { + elements = elements.filter(({ markType }) => markType === 'area'); + } + // Create points + const pointsGroup = new g_1.Group({ + style: { + // Tooltip point need down. + zIndex: 2, + }, + }); + plotArea.appendChild(pointsGroup); + const selectedChange = () => { + emitter.emit('element-point:select', { + nativeEvent: true, + data: { + selection: newSelection, + }, + }); + }; + const dataChange = (changeData, data) => { + emitter.emit('element-point:moved', { + nativeEvent: true, + data: { + changeData, + data, + }, + }); + }; + // Element click change style. + const elementClick = (e) => { + const element = e.target; + newSelection = [element.parentNode.childNodes.indexOf(element)]; + selectedChange(); + createPoints(element); + }; + const elementSelect = (d) => { + const { data: { selection }, nativeEvent, } = d; + if (nativeEvent) + return; + newSelection = selection; + const element = (0, util_1.get)(elements, [newSelection === null || newSelection === void 0 ? void 0 : newSelection[0]]); + if (element) { + createPoints(element); + } + }; + // Create select element points. + const createPoints = (element) => { + const { attributes, markType, __data__: data } = element; + const { stroke: fill } = attributes; + const { points, seriesTitle, color, title, seriesX, y1 } = data; + // Transpose Currently only do mark interval; + if (isTranspose && markType !== 'interval') + return; + const { scale, coordinate } = (newState === null || newState === void 0 ? void 0 : newState.view) || view; + const { color: scaleColor, y: scaleY, x: scaleX } = scale; + const center = coordinate.getCenter(); + pointsGroup.removeChildren(); + let downPoint; + const updateView = (x, y, color, markTypes) => __awaiter(this, void 0, void 0, function* () { + setState('elementPointMove', (viewOptions) => { + var _a; + // Update marks. + const newMarks = (((_a = newState === null || newState === void 0 ? void 0 : newState.options) === null || _a === void 0 ? void 0 : _a.marks) || marks).map((mark) => { + if (!markTypes.includes(mark.type)) + return mark; + const { data, encode } = mark; + const encodeKeys = Object.keys(encode); + // Get change new one element data. + const newChangeData = encodeKeys.reduce((value, key) => { + const dataKey = encode[key]; + if (key === 'x') { + value[dataKey] = x; + } + if (key === 'y') { + value[dataKey] = y; + } + if (key === 'color') { + value[dataKey] = color; + } + return value; + }, {}); + // Get change new all data. + const newData = getNewData(newChangeData, data, encode); + dataChange(newChangeData, newData); + return (0, util_1.deepMix)({}, mark, { + data: newData, + // No need animate + animate: false, + }); + }); + return Object.assign(Object.assign({}, viewOptions), { marks: newMarks }); + }); + return yield update('elementPointMove'); + }); + if (['line', 'area'].includes(markType)) { + points.forEach((p, index) => { + const title = scaleX.invert(seriesX[index]); + // Area points have bottom point. + if (!title) + return; + const circle = new g_1.Circle({ + name: MOVE_POINT_NAME, + style: Object.assign({ cx: p[0], cy: p[1], fill }, pointDefaultStyle), + }); + const ratioTransform = getPathDataRatioTransformFn(element, index); + circle.addEventListener('mousedown', (e) => { + const oldPoint = coordinate.output([seriesX[index], 0]); + const pathLength = seriesTitle === null || seriesTitle === void 0 ? void 0 : seriesTitle.length; + container.attr('cursor', 'move'); + if (newSelection[1] !== index) { + newSelection[1] = index; + selectedChange(); + } + selectedPointsStyle(pointsGroup.childNodes, newSelection, pointDefaultStyle); + const [pathShape, labelShape] = createHelpShape(pointsGroup, circle, pathDefaultStyle, labelDefaultStyle); + // Point move change text + const pointMousemove = (e) => { + const newCy = p[1] + e.clientY - downPoint[1]; + // Area/Radar chart. + if (isArea) { + // Radar chart. + if (isPolar) { + const newCx = p[0] + e.clientX - downPoint[0]; + const [newX, newY] = getSamePointPosition(center, oldPoint, [ + newCx, + newCy, + ]); + const [, initY] = coordinate.output([1, scaleY.output(0)]); + const [, y] = coordinate.invert([ + newX, + initY - (points[index + pathLength][1] - newY), + ]); + const nextIndex = (index + 1) % pathLength; + const lastIndex = (index - 1 + pathLength) % pathLength; + const newPath = (0, utils_1.getPointsPath)([ + points[lastIndex], + [newX, newY], + seriesTitle[nextIndex] && points[nextIndex], + ]); + labelShape.attr('text', ratioTransform(scaleY.invert(y)).toFixed(precision)); + pathShape.attr('d', newPath); + circle.attr('cx', newX); + circle.attr('cy', newY); + } + else { + // Area chart. + const [, initY] = coordinate.output([1, scaleY.output(0)]); + const [, y] = coordinate.invert([ + p[0], + initY - (points[index + pathLength][1] - newCy), + ]); + const newPath = (0, utils_1.getPointsPath)([ + points[index - 1], + [p[0], newCy], + seriesTitle[index + 1] && points[index + 1], + ]); + labelShape.attr('text', ratioTransform(scaleY.invert(y)).toFixed(precision)); + pathShape.attr('d', newPath); + circle.attr('cy', newCy); + } + } + else { + // Line chart. + const [, y] = coordinate.invert([p[0], newCy]); + const newPath = (0, utils_1.getPointsPath)([ + points[index - 1], + [p[0], newCy], + points[index + 1], + ]); + labelShape.attr('text', scaleY.invert(y).toFixed(precision)); + pathShape.attr('d', newPath); + circle.attr('cy', newCy); + } + }; + downPoint = [e.clientX, e.clientY]; + window.addEventListener('mousemove', pointMousemove); + const mouseupFn = () => __awaiter(this, void 0, void 0, function* () { + container.attr('cursor', 'default'); + window.removeEventListener('mousemove', pointMousemove); + container.removeEventListener('mouseup', mouseupFn); + if ((0, util_1.isUndefined)(labelShape.attr('text'))) + return; + const y = Number(labelShape.attr('text')); + const colorType = getColorType(scaleColor, color); + newState = yield updateView(title, y, colorType, [ + 'line', + 'area', + ]); + labelShape.remove(); + pathShape.remove(); + createPoints(element); + }); + container.addEventListener('mouseup', mouseupFn); + }); + pointsGroup.appendChild(circle); + }); + selectedPointsStyle(pointsGroup.childNodes, newSelection, pointDefaultStyle); + } + else if (markType === 'interval') { + // Column chart point. + let circlePoint = [(points[0][0] + points[1][0]) / 2, points[0][1]]; + // Bar chart point. + if (isTranspose) { + circlePoint = [points[0][0], (points[0][1] + points[1][1]) / 2]; + } + else if (isTheta) { + // Pie chart point. + circlePoint = points[0]; + } + const ratioTransform = getIntervalDataRatioTransformFn(element); + const circle = new g_1.Circle({ + name: MOVE_POINT_NAME, + style: Object.assign(Object.assign({ cx: circlePoint[0], cy: circlePoint[1], fill }, pointDefaultStyle), { stroke: pointDefaultStyle['activeStroke'] }), + }); + circle.addEventListener('mousedown', (e) => { + container.attr('cursor', 'move'); + const colorType = getColorType(scaleColor, color); + const [pathShape, labelShape] = createHelpShape(pointsGroup, circle, pathDefaultStyle, labelDefaultStyle); + // Point move change text + const pointMousemove = (e) => { + if (isTranspose) { + // Bar chart. + const newCx = circlePoint[0] + e.clientX - downPoint[0]; + const [initX] = coordinate.output([ + scaleY.output(0), + scaleY.output(0), + ]); + const [, x] = coordinate.invert([ + initX + (newCx - points[2][0]), + circlePoint[1], + ]); + const newPath = (0, utils_1.getPointsPath)([ + [newCx, points[0][1]], + [newCx, points[1][1]], + points[2], + points[3], + ], true); + labelShape.attr('text', ratioTransform(scaleY.invert(x)).toFixed(precision)); + pathShape.attr('d', newPath); + circle.attr('cx', newCx); + } + else if (isTheta) { + // Pie chart. + const newCy = circlePoint[1] + e.clientY - downPoint[1]; + const newCx = circlePoint[0] + e.clientX - downPoint[0]; + const [newXOut, newYOut] = getSamePointPosition(center, [newCx, newCy], circlePoint); + const [newXIn, newYIn] = getSamePointPosition(center, [newCx, newCy], points[1]); + const lastPercent = coordinate.invert([newXOut, newYOut])[1]; + const percent = y1 - lastPercent; + if (percent < 0) + return; + const newPath = (0, utils_1.getThetaPath)(center, [[newXOut, newYOut], [newXIn, newYIn], points[2], points[3]], percent > 0.5 ? 1 : 0); + labelShape.attr('text', ratioTransform(percent, true).toFixed(precision)); + pathShape.attr('d', newPath); + circle.attr('cx', newXOut); + circle.attr('cy', newYOut); + } + else { + // Column chart. + const newCy = circlePoint[1] + e.clientY - downPoint[1]; + const [, initY] = coordinate.output([1, scaleY.output(0)]); + const [, y] = coordinate.invert([ + circlePoint[0], + initY - (points[2][1] - newCy), + ]); + const newPath = (0, utils_1.getPointsPath)([ + [points[0][0], newCy], + [points[1][0], newCy], + points[2], + points[3], + ], true); + labelShape.attr('text', ratioTransform(scaleY.invert(y)).toFixed(precision)); + pathShape.attr('d', newPath); + circle.attr('cy', newCy); + } + }; + downPoint = [e.clientX, e.clientY]; + window.addEventListener('mousemove', pointMousemove); + // Change mosueup change data and update 、clear shape. + const mouseupFn = () => __awaiter(this, void 0, void 0, function* () { + container.attr('cursor', 'default'); + container.removeEventListener('mouseup', mouseupFn); + window.removeEventListener('mousemove', pointMousemove); + if ((0, util_1.isUndefined)(labelShape.attr('text'))) + return; + const y = Number(labelShape.attr('text')); + newState = yield updateView(title, y, colorType, [markType]); + labelShape.remove(); + pathShape.remove(); + createPoints(element); + }); + container.addEventListener('mouseup', mouseupFn); + }); + pointsGroup.appendChild(circle); + } + }; + // Add EventListener. + elements.forEach((element, index) => { + if (newSelection[0] === index) { + createPoints(element); + } + element.addEventListener('click', elementClick); + element.addEventListener('mouseenter', elementMouseenter); + element.addEventListener('mouseleave', elementMouseleave); + }); + const rootClick = (e) => { + const element = e === null || e === void 0 ? void 0 : e.target; + if (!element || + (element.name !== MOVE_POINT_NAME && !elements.includes(element))) { + newSelection = []; + selectedChange(); + pointsGroup.removeChildren(); + } + }; + emitter.on('element-point:select', elementSelect); + emitter.on('element-point:unselect', rootClick); + container.addEventListener('mousedown', rootClick); + // Remove EventListener. + return () => { + pointsGroup.remove(); + emitter.off('element-point:select', elementSelect); + emitter.off('element-point:unselect', rootClick); + container.removeEventListener('mousedown', rootClick); + elements.forEach((element) => { + element.removeEventListener('click', elementClick); + element.removeEventListener('mouseenter', elementMouseenter); + element.removeEventListener('mouseleave', elementMouseleave); + }); + }; + }; +} +exports.ElementPointMove = ElementPointMove; +//# sourceMappingURL=elementPointMove.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829,"./utils":1751263816080}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816146, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EMA = exports.Log = exports.Venn = exports.KDE = exports.Slice = exports.Join = exports.WordCloud = exports.Arc = exports.Sankey = exports.Tree = exports.Cluster = exports.Map = exports.Custom = exports.Inline = exports.SortBy = exports.Rename = exports.Pick = exports.Sort = exports.Filter = exports.Fold = exports.Fetch = void 0; +var fetch_1 = require("./fetch"); +Object.defineProperty(exports, "Fetch", { enumerable: true, get: function () { return fetch_1.Fetch; } }); +var fold_1 = require("./fold"); +Object.defineProperty(exports, "Fold", { enumerable: true, get: function () { return fold_1.Fold; } }); +var filter_1 = require("./filter"); +Object.defineProperty(exports, "Filter", { enumerable: true, get: function () { return filter_1.Filter; } }); +var sort_1 = require("./sort"); +Object.defineProperty(exports, "Sort", { enumerable: true, get: function () { return sort_1.Sort; } }); +var pick_1 = require("./pick"); +Object.defineProperty(exports, "Pick", { enumerable: true, get: function () { return pick_1.Pick; } }); +var rename_1 = require("./rename"); +Object.defineProperty(exports, "Rename", { enumerable: true, get: function () { return rename_1.Rename; } }); +var sortBy_1 = require("./sortBy"); +Object.defineProperty(exports, "SortBy", { enumerable: true, get: function () { return sortBy_1.SortBy; } }); +var inline_1 = require("./inline"); +Object.defineProperty(exports, "Inline", { enumerable: true, get: function () { return inline_1.Inline; } }); +var custom_1 = require("./custom"); +Object.defineProperty(exports, "Custom", { enumerable: true, get: function () { return custom_1.Custom; } }); +var map_1 = require("./map"); +Object.defineProperty(exports, "Map", { enumerable: true, get: function () { return map_1.Map; } }); +var cluster_1 = require("./cluster"); +Object.defineProperty(exports, "Cluster", { enumerable: true, get: function () { return cluster_1.Cluster; } }); +var tree_1 = require("./tree"); +Object.defineProperty(exports, "Tree", { enumerable: true, get: function () { return tree_1.Tree; } }); +var sankey_1 = require("./sankey"); +Object.defineProperty(exports, "Sankey", { enumerable: true, get: function () { return sankey_1.Sankey; } }); +var arc_1 = require("./arc"); +Object.defineProperty(exports, "Arc", { enumerable: true, get: function () { return arc_1.Arc; } }); +var wordCloud_1 = require("./wordCloud"); +Object.defineProperty(exports, "WordCloud", { enumerable: true, get: function () { return wordCloud_1.WordCloud; } }); +var join_1 = require("./join"); +Object.defineProperty(exports, "Join", { enumerable: true, get: function () { return join_1.Join; } }); +var slice_1 = require("./slice"); +Object.defineProperty(exports, "Slice", { enumerable: true, get: function () { return slice_1.Slice; } }); +var kde_1 = require("./kde"); +Object.defineProperty(exports, "KDE", { enumerable: true, get: function () { return kde_1.KDE; } }); +var venn_1 = require("./venn"); +Object.defineProperty(exports, "Venn", { enumerable: true, get: function () { return venn_1.Venn; } }); +var log_1 = require("./log"); +Object.defineProperty(exports, "Log", { enumerable: true, get: function () { return log_1.Log; } }); +var ema_1 = require("./ema"); +Object.defineProperty(exports, "EMA", { enumerable: true, get: function () { return ema_1.EMA; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./fetch":1751263816147,"./fold":1751263816148,"./filter":1751263816149,"./sort":1751263816150,"./pick":1751263816151,"./rename":1751263816152,"./sortBy":1751263816153,"./inline":1751263816155,"./custom":1751263816156,"./map":1751263816157,"./cluster":1751263816012,"./tree":1751263816011,"./sankey":1751263815992,"./arc":1751263815999,"./wordCloud":1751263816158,"./join":1751263816161,"./slice":1751263816162,"./kde":1751263816163,"./venn":1751263816164,"./log":1751263816176,"./ema":1751263816177}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816147, function(require, module, exports) { + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Fetch = void 0; +const d3_dsv_1 = require("@antv/vendor/d3-dsv"); +const helper_1 = require("../utils/helper"); +const Fetch = (options) => { + const { value, format = value.split('.').pop(), delimiter = ',', autoType = true, } = options; + return () => __awaiter(void 0, void 0, void 0, function* () { + const response = yield fetch(value); + if (format === 'csv') { + // @see: https://github.com/d3/d3-dsv#dsv_parse + const str = yield response.text(); + return (0, d3_dsv_1.dsvFormat)(delimiter).parse(str, autoType ? d3_dsv_1.autoType : helper_1.identity); + } + else if (format === 'json') { + return yield response.json(); + } + throw new Error(`Unknown format: ${format}.`); + }); +}; +exports.Fetch = Fetch; +exports.Fetch.props = {}; +//# sourceMappingURL=fetch.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816148, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Fold = exports.isEmpty = void 0; +function isEmpty(obj) { + return !obj || Object.keys(obj).length === 0; +} +exports.isEmpty = isEmpty; +/** + * Collapses (or “folds”) one or more data fields into two + * properties: `key` (contains the original data field name) + * and `value` (contains the original data value.) + */ +const Fold = (options) => { + const { fields, key = 'key', value = 'value' } = options; + return (data) => { + if (isEmpty(fields)) + return data; + return data.flatMap((d) => fields.map((f) => (Object.assign(Object.assign({}, d), { [key]: f, [value]: d[f] })))); + }; +}; +exports.Fold = Fold; +exports.Fold.props = {}; +//# sourceMappingURL=fold.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816149, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Filter = exports.defined = void 0; +function defined(d) { + return d !== undefined && d !== null && !Number.isNaN(d); +} +exports.defined = defined; +/** + * Filter data by specified fields and filter callback for each fields. + * It saves datum with every fields defined by default. + */ +const Filter = (options) => { + const { callback = defined } = options; + return (data) => data.filter(callback); +}; +exports.Filter = Filter; +exports.Filter.props = {}; +//# sourceMappingURL=filter.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816150, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Sort = exports.defined = void 0; +function defined(d) { + return d !== undefined && d !== null && !Number.isNaN(d); +} +exports.defined = defined; +/** + * Sort data similar with Array.prototypo.sort. + */ +const Sort = (options) => { + const { callback } = options; + return (data) => (Array.isArray(data) ? [...data].sort(callback) : data); +}; +exports.Sort = Sort; +exports.Sort.props = {}; +//# sourceMappingURL=sort.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816151, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Pick = void 0; +function pick(v, fields = []) { + return fields.reduce((datum, field) => { + // Pick the data deeply. + if (field in v) { + datum[field] = v[field]; + } + return datum; + }, {}); +} +/** + * Immutable data pick by specified fields. + */ +const Pick = (options) => { + const { fields } = options; + return (data) => data.map((d) => pick(d, fields)); +}; +exports.Pick = Pick; +exports.Pick.props = {}; +//# sourceMappingURL=pick.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816152, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Rename = exports.isEmpty = void 0; +function isEmpty(obj) { + return Object.keys(obj).length === 0; +} +exports.isEmpty = isEmpty; +/** + * Immutable data rename by specified fields. + */ +const Rename = (options) => { + return (data) => { + if (!options || isEmpty(options)) + return data; + const rename = (v) => Object.entries(v).reduce((datum, [key, value]) => ((datum[options[key] || key] = value), datum), {}); + return data.map(rename); + }; +}; +exports.Rename = Rename; +exports.Rename.props = {}; +//# sourceMappingURL=rename.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816153, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SortBy = void 0; +const fields_1 = require("./utils/fields"); +/** + * Immutable data sort by specified fields. + */ +const SortBy = (options) => { + const { fields: F = [] } = options; + const normalizedF = (0, fields_1.normalizeFields)(F, true); + return (data) => { + const comparator = (a, b) => normalizedF.reduce((ret, [field, order = true]) => { + if (ret !== 0) { + return ret; + } + if (order) { + return a[field] < b[field] ? -1 : +(a[field] !== b[field]); + } + else { + return a[field] > b[field] ? -1 : +(a[field] !== b[field]); + } + }, 0); + return [...data].sort(comparator); + }; +}; +exports.SortBy = SortBy; +exports.SortBy.props = {}; +//# sourceMappingURL=sortBy.js.map +}, function(modId) { var map = {"./utils/fields":1751263816154}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816154, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.normalizeFields = void 0; +/** + * + * @description Converts a random format array into a regular two-dimensional array + * @example ['a', 'b', ['c', value]] => [['a', defaultValue], ['b', defaultValue], ['c', value]] + */ +function normalizeFields(fields, defaultValue) { + return fields.map((d) => { + if (Array.isArray(d)) { + const [field, value = defaultValue] = d; + return [field, value]; + } + return [d, defaultValue]; + }); +} +exports.normalizeFields = normalizeFields; +//# sourceMappingURL=fields.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816155, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Inline = void 0; +const Inline = (options) => { + const { value } = options; + return () => value; +}; +exports.Inline = Inline; +exports.Inline.props = {}; +//# sourceMappingURL=inline.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816156, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Custom = void 0; +const helper_1 = require("../utils/helper"); +/** + * Connector transfom by function. + */ +const Custom = (options) => { + const { callback = helper_1.identity } = options; + return (data) => callback(data); +}; +exports.Custom = Custom; +exports.Custom.props = {}; +//# sourceMappingURL=custom.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816157, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Map = void 0; +const helper_1 = require("../utils/helper"); +/** + * Map transform by function. + */ +const Map = (options) => { + const { callback = helper_1.identity } = options; + return (data) => (Array.isArray(data) ? data.map(callback) : data); +}; +exports.Map = Map; +exports.Map.props = {}; +//# sourceMappingURL=map.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816158, function(require, module, exports) { + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WordCloud = exports.normalizeFontSize = exports.processImageMask = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +const flow_1 = require("./utils/flow"); +const d3_cloud_1 = require("./utils/d3-cloud"); +const DEFAULT_OPTIONS = { + fontSize: [20, 60], + font: 'Impact', + padding: 2, + rotate: function () { + return (~~(Math.random() * 6) - 3) * 30; + }, +}; +/** + * Process the image mask of wordCloud. + * @param img + * @returns + */ +function processImageMask(img) { + return new Promise((res, rej) => { + if (img instanceof HTMLImageElement) { + res(img); + return; + } + if (typeof img === 'string') { + const image = new Image(); + image.crossOrigin = 'anonymous'; + image.src = img; + image.onload = () => res(image); + image.onerror = () => { + console.error(`'image ${img} load failed !!!'`); + rej(); + }; + return; + } + rej(); + }); +} +exports.processImageMask = processImageMask; +/** + * normalize fontSize range to d3-cloud fontSize function. + * @param fontSize + * @param range + * @returns + */ +function normalizeFontSize(fontSize, range) { + if (typeof fontSize === 'function') + return fontSize; + if (Array.isArray(fontSize)) { + const [fMin, fMax] = fontSize; + if (!range) + return () => (fMax + fMin) / 2; + const [min, max] = range; + if (max === min) + return () => (fMax + fMin) / 2; + return ({ value }) => ((fMax - fMin) / (max - min)) * (value - min) + fMin; + } + return () => fontSize; +} +exports.normalizeFontSize = normalizeFontSize; +const WordCloud = (options, context) => { + return (data) => __awaiter(void 0, void 0, void 0, function* () { + const cloudOptions = Object.assign({}, DEFAULT_OPTIONS, options, { + canvas: context.createCanvas, + }); + const layout = (0, d3_cloud_1.tagCloud)(); + yield (0, flow_1.flow)(layout, cloudOptions) + .set('fontSize', (v) => { + const arr = data.map((d) => d.value); + return normalizeFontSize(v, [(0, d3_array_1.min)(arr), (0, d3_array_1.max)(arr)]); + }) + .set('font') + .set('fontStyle') + .set('fontWeight') + .set('padding') + .set('rotate') + .set('size') + .set('spiral') + .set('timeInterval') + .set('random') + .set('text') + .set('on') + .set('canvas') + .setAsync('imageMask', processImageMask, layout.createMask); + layout.words([...data]); + const result = layout.start(); + const [cw, ch] = cloudOptions.size; + const defaultBounds = [ + { x: 0, y: 0 }, + { x: cw, y: ch }, + ]; + const { _bounds: bounds = defaultBounds, _tags, hasImage } = result; + const tags = _tags.map((_a) => { + var { x, y, font } = _a, rest = __rest(_a, ["x", "y", "font"]); + return (Object.assign(Object.assign({}, rest), { x: x + cw / 2, y: y + ch / 2, fontFamily: font })); + }); + // Append two data to replace the corner of top-left and bottom-right, avoid calculate the actual bounds will occur some error. + const [{ x: tlx, y: tly }, { x: brx, y: bry }] = bounds; + const invisibleText = { text: '', value: 0, opacity: 0, fontSize: 0 }; + tags.push(Object.assign(Object.assign({}, invisibleText), { x: hasImage ? 0 : tlx, y: hasImage ? 0 : tly }), Object.assign(Object.assign({}, invisibleText), { x: hasImage ? cw : brx, y: hasImage ? ch : bry })); + return tags; + }); +}; +exports.WordCloud = WordCloud; +exports.WordCloud.props = {}; +//# sourceMappingURL=wordCloud.js.map +}, function(modId) { var map = {"./utils/flow":1751263816159,"./utils/d3-cloud":1751263816160}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816159, function(require, module, exports) { + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.flow = void 0; +/** + * @todo Combine with the `Container` util + */ +function flow(target, source) { + return { + set(key, normalize, callback) { + if (source[key] === undefined) + return this; + const value = normalize ? normalize.call(null, source[key]) : source[key]; + if (callback) + callback.call(null, value); + else if (typeof target[key] === 'function') + target[key](value); + else + target[key] = value; + return this; + }, + setAsync(key, normalize, callback) { + return __awaiter(this, void 0, void 0, function* () { + if (source[key] === undefined) + return this; + const value = normalize + ? yield normalize.call(null, source[key]) + : source[key]; + if (callback) + callback.call(null, value); + else if (typeof target[key] === 'function') + target[key](value); + else + target[key] = value; + return this; + }); + }, + }; +} +exports.flow = flow; +//# sourceMappingURL=flow.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816160, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.tagCloud = void 0; +const cloudRadians = Math.PI / 180, cw = (1 << 11) >> 5, ch = 1 << 11; +function cloudText(d) { + return d.text; +} +function cloudFont() { + return 'serif'; +} +function cloudFontNormal() { + return 'normal'; +} +function cloudFontSize(d) { + return d.value; +} +function cloudRotate() { + return ~~(Math.random() * 2) * 90; +} +function cloudPadding() { + return 1; +} +function cloudDispatch() { + return; +} +// Fetches a monochrome sprite bitmap for the specified text. +// Load in batches for speed. +function cloudSprite(contextAndRatio, d, data, di) { + if (d.sprite) + return; + const c = contextAndRatio.context, ratio = contextAndRatio.ratio; + c.clearRect(0, 0, (cw << 5) / ratio, ch / ratio); + let x = 0, y = 0, maxh = 0; + const n = data.length; + --di; + while (++di < n) { + d = data[di]; + c.save(); + c.font = + d.style + + ' ' + + d.weight + + ' ' + + ~~((d.size + 1) / ratio) + + 'px ' + + d.font; + let w = c.measureText(d.text + 'm').width * ratio, h = d.size << 1; + if (d.rotate) { + const sr = Math.sin(d.rotate * cloudRadians), cr = Math.cos(d.rotate * cloudRadians), wcr = w * cr, wsr = w * sr, hcr = h * cr, hsr = h * sr; + w = + ((Math.max(Math.abs(wcr + hsr), Math.abs(wcr - hsr)) + 0x1f) >> 5) << 5; + h = ~~Math.max(Math.abs(wsr + hcr), Math.abs(wsr - hcr)); + } + else { + w = ((w + 0x1f) >> 5) << 5; + } + if (h > maxh) + maxh = h; + if (x + w >= cw << 5) { + x = 0; + y += maxh; + maxh = 0; + } + if (y + h >= ch) + break; + c.translate((x + (w >> 1)) / ratio, (y + (h >> 1)) / ratio); + if (d.rotate) + c.rotate(d.rotate * cloudRadians); + c.fillText(d.text, 0, 0); + if (d.padding) { + c.lineWidth = 2 * d.padding; + c.strokeText(d.text, 0, 0); + } + c.restore(); + d.width = w; + d.height = h; + d.xoff = x; + d.yoff = y; + d.x1 = w >> 1; + d.y1 = h >> 1; + d.x0 = -d.x1; + d.y0 = -d.y1; + d.hasText = true; + x += w; + } + const pixels = c.getImageData(0, 0, (cw << 5) / ratio, ch / ratio).data, sprite = []; + while (--di >= 0) { + d = data[di]; + if (!d.hasText) + continue; + const w = d.width, w32 = w >> 5; + let h = d.y1 - d.y0; + // Zero the buffer + for (let i = 0; i < h * w32; i++) + sprite[i] = 0; + x = d.xoff; + if (x == null) + return; + y = d.yoff; + let seen = 0, seenRow = -1; + for (let j = 0; j < h; j++) { + for (let i = 0; i < w; i++) { + const k = w32 * j + (i >> 5), m = pixels[((y + j) * (cw << 5) + (x + i)) << 2] + ? 1 << (31 - (i % 32)) + : 0; + sprite[k] |= m; + seen |= m; + } + if (seen) + seenRow = j; + else { + d.y0++; + h--; + j--; + y++; + } + } + d.y1 = d.y0 + seenRow; + d.sprite = sprite.slice(0, (d.y1 - d.y0) * w32); + } +} +// Use mask-based collision detection. +function cloudCollide(tag, board, sw) { + sw >>= 5; + const sprite = tag.sprite, w = tag.width >> 5, lx = tag.x - (w << 4), sx = lx & 0x7f, msx = 32 - sx, h = tag.y1 - tag.y0; + let x = (tag.y + tag.y0) * sw + (lx >> 5), last; + for (let j = 0; j < h; j++) { + last = 0; + for (let i = 0; i <= w; i++) { + if (((last << msx) | (i < w ? (last = sprite[j * w + i]) >>> sx : 0)) & + board[x + i]) + return true; + } + x += sw; + } + return false; +} +function cloudBounds(bounds, d) { + const b0 = bounds[0], b1 = bounds[1]; + if (d.x + d.x0 < b0.x) + b0.x = d.x + d.x0; + if (d.y + d.y0 < b0.y) + b0.y = d.y + d.y0; + if (d.x + d.x1 > b1.x) + b1.x = d.x + d.x1; + if (d.y + d.y1 > b1.y) + b1.y = d.y + d.y1; +} +function collideRects(a, b) { + return (a.x + a.x1 > b[0].x && + a.x + a.x0 < b[1].x && + a.y + a.y1 > b[0].y && + a.y + a.y0 < b[1].y); +} +function archimedeanSpiral(size) { + const e = size[0] / size[1]; + return function (t) { + return [e * (t *= 0.1) * Math.cos(t), t * Math.sin(t)]; + }; +} +function rectangularSpiral(size) { + const dy = 4, dx = (dy * size[0]) / size[1]; + let x = 0, y = 0; + return function (t) { + const sign = t < 0 ? -1 : 1; + // See triangular numbers: T_n = n * (n + 1) / 2. + switch ((Math.sqrt(1 + 4 * sign * t) - sign) & 3) { + case 0: + x += dx; + break; + case 1: + y += dy; + break; + case 2: + x -= dx; + break; + default: + y -= dy; + break; + } + return [x, y]; + }; +} +// TODO reuse arrays? +function zeroArray(n) { + const a = []; + let i = -1; + while (++i < n) + a[i] = 0; + return a; +} +function cloudCanvas() { + return document.createElement('canvas'); +} +function functor(d) { + return typeof d === 'function' + ? d + : function () { + return d; + }; +} +const spirals = { + archimedean: archimedeanSpiral, + rectangular: rectangularSpiral, +}; +function tagCloud() { + let size = [256, 256], text = cloudText, font = cloudFont, fontSize = cloudFontSize, fontWeight = cloudFontNormal, rotate = cloudRotate, padding = cloudPadding, spiral = archimedeanSpiral, random = Math.random, event = cloudDispatch, words = [], timer = null, timeInterval = Infinity, canvas = cloudCanvas; + const fontStyle = cloudFontNormal; + const cloud = {}; + cloud.start = function () { + const [width, height] = size; + const contextAndRatio = getContext(canvas()), board = cloud.board ? cloud.board : zeroArray((size[0] >> 5) * size[1]), n = words.length, tags = [], data = words + .map(function (d, i, data) { + d.text = text.call(this, d, i, data); + d.font = font.call(this, d, i, data); + d.style = fontStyle.call(this, d, i, data); + d.weight = fontWeight.call(this, d, i, data); + d.rotate = rotate.call(this, d, i, data); + d.size = ~~fontSize.call(this, d, i, data); + d.padding = padding.call(this, d, i, data); + return d; + }) + .sort(function (a, b) { + return b.size - a.size; + }); + let i = -1, bounds = !cloud.board + ? undefined + : [ + { + x: 0, + y: 0, + }, + { + x: width, + y: height, + }, + ]; + if (timer) + clearInterval(timer); + timer = setInterval(step, 0); + step(); + function step() { + const start = Date.now(); + while (Date.now() - start < timeInterval && ++i < n) { + const d = data[i]; + d.x = (width * (random() + 0.5)) >> 1; + d.y = (height * (random() + 0.5)) >> 1; + cloudSprite(contextAndRatio, d, data, i); + if (d.hasText && place(board, d, bounds)) { + event.call(null, 'word', { cloud, word: d }); + tags.push(d); + if (bounds) { + if (!cloud.hasImage) { + // update bounds if image mask not set + cloudBounds(bounds, d); + } + } + else { + bounds = [ + { x: d.x + d.x0, y: d.y + d.y0 }, + { x: d.x + d.x1, y: d.y + d.y1 }, + ]; + } + // Temporary hack + d.x -= size[0] >> 1; + d.y -= size[1] >> 1; + } + } + cloud._tags = tags; + cloud._bounds = bounds; + if (i >= n) { + cloud.stop(); + event.call(null, 'end', { cloud, words: tags, bounds }); + } + } + return cloud; + }; + cloud.stop = function () { + if (timer) { + clearInterval(timer); + timer = null; + } + return cloud; + }; + function getContext(canvas) { + canvas.width = canvas.height = 1; + const ratio = Math.sqrt(canvas.getContext('2d').getImageData(0, 0, 1, 1).data.length >> 2); + canvas.width = (cw << 5) / ratio; + canvas.height = ch / ratio; + const context = canvas.getContext('2d'); + context.fillStyle = context.strokeStyle = 'red'; + context.textAlign = 'center'; + context.textBaseline = 'middle'; + return { context, ratio }; + } + function place(board, tag, bounds) { + // const perimeter = [{ x: 0, y: 0 }, { x: size[0], y: size[1] }], + const startX = tag.x, startY = tag.y, maxDelta = Math.sqrt(size[0] * size[0] + size[1] * size[1]), s = spiral(size), dt = random() < 0.5 ? 1 : -1; + let dxdy, t = -dt, dx, dy; + while ((dxdy = s((t += dt)))) { + dx = ~~dxdy[0]; + dy = ~~dxdy[1]; + if (Math.min(Math.abs(dx), Math.abs(dy)) >= maxDelta) + break; + tag.x = startX + dx; + tag.y = startY + dy; + if (tag.x + tag.x0 < 0 || + tag.y + tag.y0 < 0 || + tag.x + tag.x1 > size[0] || + tag.y + tag.y1 > size[1]) + continue; + // TODO only check for collisions within current bounds. + if (!bounds || !cloudCollide(tag, board, size[0])) { + if (!bounds || collideRects(tag, bounds)) { + const sprite = tag.sprite, w = tag.width >> 5, sw = size[0] >> 5, lx = tag.x - (w << 4), sx = lx & 0x7f, msx = 32 - sx, h = tag.y1 - tag.y0; + let last, x = (tag.y + tag.y0) * sw + (lx >> 5); + for (let j = 0; j < h; j++) { + last = 0; + for (let i = 0; i <= w; i++) { + board[x + i] |= + (last << msx) | (i < w ? (last = sprite[j * w + i]) >>> sx : 0); + } + x += sw; + } + delete tag.sprite; + return true; + } + } + } + return false; + } + cloud.createMask = (img) => { + const can = document.createElement('canvas'); + const [width, height] = size; + // 当 width 或 height 为 0 时,调用 cxt.getImageData 会报错 + if (!width || !height) { + return; + } + const w32 = width >> 5; + const board = zeroArray((width >> 5) * height); + can.width = width; + can.height = height; + const cxt = can.getContext('2d'); + cxt.drawImage(img, 0, 0, img.width, img.height, 0, 0, width, height); + const imageData = cxt.getImageData(0, 0, width, height).data; + for (let j = 0; j < height; j++) { + for (let i = 0; i < width; i++) { + const k = w32 * j + (i >> 5); + const tmp = (j * width + i) << 2; + const flag = imageData[tmp] >= 250 && + imageData[tmp + 1] >= 250 && + imageData[tmp + 2] >= 250; + const m = flag ? 1 << (31 - (i % 32)) : 0; + board[k] |= m; + } + } + cloud.board = board; + cloud.hasImage = true; + }; + cloud.timeInterval = function (_) { + timeInterval = _ == null ? Infinity : _; + }; + cloud.words = function (_) { + words = _; + }; + cloud.size = function (_ = []) { + size = [+_[0], +_[1]]; + }; + cloud.text = function (_) { + text = functor(_); + }; + cloud.font = function (_) { + font = functor(_); + }; + cloud.fontWeight = function (_) { + fontWeight = functor(_); + }; + cloud.rotate = function (_) { + rotate = functor(_); + }; + cloud.canvas = function (_) { + canvas = functor(_); + }; + cloud.spiral = function (_) { + spiral = spirals[_] || _; + }; + cloud.fontSize = function (_) { + fontSize = functor(_); + }; + cloud.padding = function (_) { + padding = functor(_); + }; + cloud.random = function (_) { + random = functor(_); + }; + cloud.on = function (_) { + event = functor(_); + }; + return cloud; +} +exports.tagCloud = tagCloud; +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816161, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Join = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +function field(key) { + return typeof key === 'string' ? (d) => d[key] : key; +} +/** + * Join data with another dataset by SQL style. + */ +const Join = (options) => { + // const { fromKey, from, key, unknown = NaN, ...rest } = options; + const { join, on, select = [], as = select, unknown = NaN } = options; + const [key, fromKey] = on; + const fk = field(fromKey); + const k = field(key); + const keyData = (0, d3_array_1.rollup)(join, ([d]) => d, // Get the first matched. + (d) => fk(d)); + return (data) => data.map((d) => { + const source = keyData.get(k(d)); + return Object.assign(Object.assign({}, d), select.reduce((prev, key, idx) => ((prev[as[idx]] = source ? source[key] : unknown), prev), {})); + }); +}; +exports.Join = Join; +exports.Join.props = {}; +//# sourceMappingURL=join.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816162, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Slice = void 0; +/** + * Slice data between `start` ~ `end`. + * Same with https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice + */ +const Slice = (options) => { + const { start, end } = options; + return (data) => data.slice(start, end); +}; +exports.Slice = Slice; +exports.Slice.props = {}; +//# sourceMappingURL=slice.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816163, function(require, module, exports) { + +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.KDE = exports.defined = void 0; +const pdfast_1 = __importDefault(require("pdfast")); +const d3_array_1 = require("@antv/vendor/d3-array"); +function defined(d) { + return d !== undefined && d !== null && !Number.isNaN(d); +} +exports.defined = defined; +/** + * Kernel Density Estimation base on [pdfast](https://www.npmjs.com/package/pdfast), + * generating probability density function (pdf) using triangular kernel, + * optimized to run in O(N + K). + */ +const KDE = (options) => { + const { field, groupBy, as = ['y', 'size'], min, max, size = 10, width, } = options; + const [yField, sizeField] = as; + return (data) => { + const gs = Array.from((0, d3_array_1.group)(data, (d) => groupBy.map((gb) => d[gb]).join('-')).values()); + return gs.map((g) => { + const pdfResult = pdfast_1.default.create(g.map((i) => i[field]), { + min, + max, + size, + width, + }); + const _y = pdfResult.map((result) => result.x); + const _size = pdfResult.map((result) => result.y); + return Object.assign(Object.assign({}, g[0]), { [yField]: _y, [sizeField]: _size }); + }); + }; +}; +exports.KDE = KDE; +exports.KDE.props = {}; +//# sourceMappingURL=kde.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816164, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Venn = void 0; +const venn_1 = require("./utils/venn"); +/** + * Layout venn data, get the path string for each set. + */ +const Venn = (options) => { + const { sets = 'sets', size = 'size', as = ['key', 'path'], padding = 0, } = options; + const [key, path] = as; + return (data) => { + // Transform the data, venn layout use `sets` and `size` field. + const vennData = data.map((d) => (Object.assign(Object.assign({}, d), { sets: d[sets], size: d[size], [key]: d.sets.join('&') }))); + // Sort data, avoid data occlusion. + vennData.sort((a, b) => a.sets.length - b.sets.length); + // Layout venn data. + const solution = (0, venn_1.venn)(vennData); + let circles; + return vennData.map((datum) => { + const setsValue = datum[sets]; + const pathFunc = ({ width, height }) => { + circles = circles + ? circles + : (0, venn_1.scaleSolution)(solution, width, height, padding); + const setCircles = setsValue.map((set) => circles[set]); + let p = (0, venn_1.intersectionAreaPath)(setCircles); + // Close the path for event picker. + if (!/[zZ]$/.test(p)) + p += ' Z'; + return p; + }; + return Object.assign(Object.assign({}, datum), { [path]: pathFunc }); + }); + }; +}; +exports.Venn = Venn; +exports.Venn.props = {}; +//# sourceMappingURL=venn.js.map +}, function(modId) { var map = {"./utils/venn":1751263816165}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816165, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.intersectionAreaPath = exports.venn = exports.scaleSolution = void 0; +/** + * Code from https://github.com/benfred/venn.js/blob/master/src/. + */ +var layout_1 = require("./layout"); +Object.defineProperty(exports, "scaleSolution", { enumerable: true, get: function () { return layout_1.scaleSolution; } }); +Object.defineProperty(exports, "venn", { enumerable: true, get: function () { return layout_1.venn; } }); +var diagram_1 = require("./diagram"); +Object.defineProperty(exports, "intersectionAreaPath", { enumerable: true, get: function () { return diagram_1.intersectionAreaPath; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./layout":1751263816166,"./diagram":1751263816175}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816166, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.scaleSolution = exports.normalizeSolution = exports.disjointCluster = exports.lossFunction = exports.greedyLayout = exports.constrainedMDSLayout = exports.bestInitialLayout = exports.getDistanceMatrices = exports.distanceFromIntersectArea = exports.venn = void 0; +const fmin_1 = require("./fmin"); +const circleintersection_1 = require("./circleintersection"); +/** given a list of set objects, and their corresponding overlaps. +updates the (x, y, radius) attribute on each set such that their positions +roughly correspond to the desired overlaps */ +function venn(areas, parameters) { + parameters = parameters || {}; + parameters.maxIterations = parameters.maxIterations || 500; + const initialLayout = parameters.initialLayout || bestInitialLayout; + const loss = parameters.lossFunction || lossFunction; + // add in missing pairwise areas as having 0 size + areas = addMissingAreas(areas); + // initial layout is done greedily + const circles = initialLayout(areas, parameters); + // transform x/y coordinates to a vector to optimize + const initial = [], setids = []; + let setid; + for (setid in circles) { + // eslint-disable-next-line + if (circles.hasOwnProperty(setid)) { + initial.push(circles[setid].x); + initial.push(circles[setid].y); + setids.push(setid); + } + } + // optimize initial layout from our loss function + const solution = (0, fmin_1.nelderMead)(function (values) { + const current = {}; + for (let i = 0; i < setids.length; ++i) { + const setid = setids[i]; + current[setid] = { + x: values[2 * i], + y: values[2 * i + 1], + radius: circles[setid].radius, + }; + } + return loss(current, areas); + }, initial, parameters); + // transform solution vector back to x/y points + const positions = solution.x; + for (let i = 0; i < setids.length; ++i) { + setid = setids[i]; + circles[setid].x = positions[2 * i]; + circles[setid].y = positions[2 * i + 1]; + } + return circles; +} +exports.venn = venn; +const SMALL = 1e-10; +/** Returns the distance necessary for two circles of radius r1 + r2 to +have the overlap area 'overlap' */ +function distanceFromIntersectArea(r1, r2, overlap) { + // handle complete overlapped circles + if (Math.min(r1, r2) * Math.min(r1, r2) * Math.PI <= overlap + SMALL) { + return Math.abs(r1 - r2); + } + return (0, fmin_1.bisect)(function (distance) { + return (0, circleintersection_1.circleOverlap)(r1, r2, distance) - overlap; + }, 0, r1 + r2); +} +exports.distanceFromIntersectArea = distanceFromIntersectArea; +/** Missing pair-wise intersection area data can cause problems: + treating as an unknown means that sets will be laid out overlapping, + which isn't what people expect. To reflect that we want disjoint sets + here, set the overlap to 0 for all missing pairwise set intersections */ +function addMissingAreas(areas) { + areas = areas.slice(); + // two circle intersections that aren't defined + const ids = [], pairs = {}; + let i, j, a, b; + for (i = 0; i < areas.length; ++i) { + const area = areas[i]; + if (area.sets.length == 1) { + ids.push(area.sets[0]); + } + else if (area.sets.length == 2) { + a = area.sets[0]; + b = area.sets[1]; + // @ts-ignore + pairs[[a, b]] = true; + // @ts-ignore + pairs[[b, a]] = true; + } + } + ids.sort((a, b) => { + return a > b ? 1 : -1; + }); + for (i = 0; i < ids.length; ++i) { + a = ids[i]; + for (j = i + 1; j < ids.length; ++j) { + b = ids[j]; + // @ts-ignore + if (!([a, b] in pairs)) { + areas.push({ sets: [a, b], size: 0 }); + } + } + } + return areas; +} +/// Returns two matrices, one of the euclidean distances between the sets +/// and the other indicating if there are subset or disjoint set relationships +function getDistanceMatrices(areas, sets, setids) { + // initialize an empty distance matrix between all the points + const distances = (0, fmin_1.zerosM)(sets.length, sets.length), constraints = (0, fmin_1.zerosM)(sets.length, sets.length); + // compute required distances between all the sets such that + // the areas match + areas + .filter(function (x) { + return x.sets.length == 2; + }) + .map(function (current) { + const left = setids[current.sets[0]], right = setids[current.sets[1]], r1 = Math.sqrt(sets[left].size / Math.PI), r2 = Math.sqrt(sets[right].size / Math.PI), distance = distanceFromIntersectArea(r1, r2, current.size); + distances[left][right] = distances[right][left] = distance; + // also update constraints to indicate if its a subset or disjoint + // relationship + let c = 0; + if (current.size + 1e-10 >= Math.min(sets[left].size, sets[right].size)) { + c = 1; + } + else if (current.size <= 1e-10) { + c = -1; + } + constraints[left][right] = constraints[right][left] = c; + }); + return { distances: distances, constraints: constraints }; +} +exports.getDistanceMatrices = getDistanceMatrices; +/// computes the gradient and loss simulatenously for our constrained MDS optimizer +function constrainedMDSGradient(x, fxprime, distances, constraints) { + let loss = 0, i; + for (i = 0; i < fxprime.length; ++i) { + fxprime[i] = 0; + } + for (i = 0; i < distances.length; ++i) { + const xi = x[2 * i], yi = x[2 * i + 1]; + for (let j = i + 1; j < distances.length; ++j) { + const xj = x[2 * j], yj = x[2 * j + 1], dij = distances[i][j], constraint = constraints[i][j]; + const squaredDistance = (xj - xi) * (xj - xi) + (yj - yi) * (yj - yi), distance = Math.sqrt(squaredDistance), delta = squaredDistance - dij * dij; + if ((constraint > 0 && distance <= dij) || + (constraint < 0 && distance >= dij)) { + continue; + } + loss += 2 * delta * delta; + fxprime[2 * i] += 4 * delta * (xi - xj); + fxprime[2 * i + 1] += 4 * delta * (yi - yj); + fxprime[2 * j] += 4 * delta * (xj - xi); + fxprime[2 * j + 1] += 4 * delta * (yj - yi); + } + } + return loss; +} +/// takes the best working variant of either constrained MDS or greedy +function bestInitialLayout(areas, params) { + let initial = greedyLayout(areas, params); + const loss = params.lossFunction || lossFunction; + // greedylayout is sufficient for all 2/3 circle cases. try out + // constrained MDS for higher order problems, take its output + // if it outperforms. (greedy is aesthetically better on 2/3 circles + // since it axis aligns) + if (areas.length >= 8) { + const constrained = constrainedMDSLayout(areas, params), constrainedLoss = loss(constrained, areas), greedyLoss = loss(initial, areas); + if (constrainedLoss + 1e-8 < greedyLoss) { + initial = constrained; + } + } + return initial; +} +exports.bestInitialLayout = bestInitialLayout; +/// use the constrained MDS variant to generate an initial layout +function constrainedMDSLayout(areas, params) { + params = params || {}; + const restarts = params.restarts || 10; + // bidirectionally map sets to a rowid (so we can create a matrix) + const sets = [], setids = {}; + let i; + for (i = 0; i < areas.length; ++i) { + const area = areas[i]; + if (area.sets.length == 1) { + setids[area.sets[0]] = sets.length; + sets.push(area); + } + } + const matrices = getDistanceMatrices(areas, sets, setids); + let distances = matrices.distances; + const constraints = matrices.constraints; + // keep distances bounded, things get messed up otherwise. + // TODO: proper preconditioner? + const norm = (0, fmin_1.norm2)(distances.map(fmin_1.norm2)) / distances.length; + distances = distances.map(function (row) { + return row.map(function (value) { + return value / norm; + }); + }); + const obj = function (x, fxprime) { + return constrainedMDSGradient(x, fxprime, distances, constraints); + }; + let best, current; + for (i = 0; i < restarts; ++i) { + const initial = (0, fmin_1.zeros)(distances.length * 2).map(Math.random); + current = (0, fmin_1.conjugateGradient)(obj, initial, params); + if (!best || current.fx < best.fx) { + best = current; + } + } + const positions = best.x; + // translate rows back to (x,y,radius) coordinates + const circles = {}; + for (i = 0; i < sets.length; ++i) { + const set = sets[i]; + circles[set.sets[0]] = { + x: positions[2 * i] * norm, + y: positions[2 * i + 1] * norm, + radius: Math.sqrt(set.size / Math.PI), + }; + } + if (params.history) { + for (i = 0; i < params.history.length; ++i) { + (0, fmin_1.scale)(params.history[i].x, norm); + } + } + return circles; +} +exports.constrainedMDSLayout = constrainedMDSLayout; +/** Lays out a Venn diagram greedily, going from most overlapped sets to +least overlapped, attempting to position each new set such that the +overlapping areas to already positioned sets are basically right */ +function greedyLayout(areas, params) { + const loss = params && params.lossFunction ? params.lossFunction : lossFunction; + // define a circle for each set + const circles = {}, setOverlaps = {}; + let set; + for (let i = 0; i < areas.length; ++i) { + const area = areas[i]; + if (area.sets.length == 1) { + set = area.sets[0]; + circles[set] = { + x: 1e10, + y: 1e10, + // rowid: circles.length, // fix to -> + rowid: Object.keys(circles).length, + size: area.size, + radius: Math.sqrt(area.size / Math.PI), + }; + setOverlaps[set] = []; + } + } + areas = areas.filter(function (a) { + return a.sets.length == 2; + }); + // map each set to a list of all the other sets that overlap it + for (let i = 0; i < areas.length; ++i) { + const current = areas[i]; + // eslint-disable-next-line + let weight = current.hasOwnProperty('weight') ? current.weight : 1.0; + const left = current.sets[0], right = current.sets[1]; + // completely overlapped circles shouldn't be positioned early here + if (current.size + SMALL >= + Math.min(circles[left].size, circles[right].size)) { + weight = 0; + } + setOverlaps[left].push({ set: right, size: current.size, weight: weight }); + setOverlaps[right].push({ set: left, size: current.size, weight: weight }); + } + // get list of most overlapped sets + const mostOverlapped = []; + for (set in setOverlaps) { + // eslint-disable-next-line + if (setOverlaps.hasOwnProperty(set)) { + let size = 0; + for (let i = 0; i < setOverlaps[set].length; ++i) { + size += setOverlaps[set][i].size * setOverlaps[set][i].weight; + } + mostOverlapped.push({ set: set, size: size }); + } + } + // sort by size desc + function sortOrder(a, b) { + return b.size - a.size; + } + mostOverlapped.sort(sortOrder); + // keep track of what sets have been laid out + const positioned = {}; + function isPositioned(element) { + return element.set in positioned; + } + // adds a point to the output + function positionSet(point, index) { + circles[index].x = point.x; + circles[index].y = point.y; + positioned[index] = true; + } + // add most overlapped set at (0,0) + positionSet({ x: 0, y: 0 }, mostOverlapped[0].set); + // get distances between all points. TODO, necessary? + // answer: probably not + // var distances = venn.getDistanceMatrices(circles, areas).distances; + for (let i = 1; i < mostOverlapped.length; ++i) { + const setIndex = mostOverlapped[i].set, overlap = setOverlaps[setIndex].filter(isPositioned); + set = circles[setIndex]; + overlap.sort(sortOrder); + if (overlap.length === 0) { + // this shouldn't happen anymore with addMissingAreas + throw 'ERROR: missing pairwise overlap information'; + } + const points = []; + for (let j = 0; j < overlap.length; ++j) { + // get appropriate distance from most overlapped already added set + const p1 = circles[overlap[j].set], d1 = distanceFromIntersectArea(set.radius, p1.radius, overlap[j].size); + // sample positions at 90 degrees for maximum aesthetics + points.push({ x: p1.x + d1, y: p1.y }); + points.push({ x: p1.x - d1, y: p1.y }); + points.push({ y: p1.y + d1, x: p1.x }); + points.push({ y: p1.y - d1, x: p1.x }); + // if we have at least 2 overlaps, then figure out where the + // set should be positioned analytically and try those too + for (let k = j + 1; k < overlap.length; ++k) { + const p2 = circles[overlap[k].set], d2 = distanceFromIntersectArea(set.radius, p2.radius, overlap[k].size); + const extraPoints = (0, circleintersection_1.circleCircleIntersection)({ x: p1.x, y: p1.y, radius: d1 }, { x: p2.x, y: p2.y, radius: d2 }); + for (let l = 0; l < extraPoints.length; ++l) { + points.push(extraPoints[l]); + } + } + } + // we have some candidate positions for the set, examine loss + // at each position to figure out where to put it at + let bestLoss = 1e50, bestPoint = points[0]; + for (let j = 0; j < points.length; ++j) { + circles[setIndex].x = points[j].x; + circles[setIndex].y = points[j].y; + const localLoss = loss(circles, areas); + if (localLoss < bestLoss) { + bestLoss = localLoss; + bestPoint = points[j]; + } + } + positionSet(bestPoint, setIndex); + } + return circles; +} +exports.greedyLayout = greedyLayout; +/** Given a bunch of sets, and the desired overlaps between these sets - computes +the distance from the actual overlaps to the desired overlaps. Note that +this method ignores overlaps of more than 2 circles */ +function lossFunction(sets, overlaps) { + let output = 0; + function getCircles(indices) { + return indices.map(function (i) { + return sets[i]; + }); + } + for (let i = 0; i < overlaps.length; ++i) { + const area = overlaps[i]; + let overlap; + if (area.sets.length == 1) { + continue; + } + else if (area.sets.length == 2) { + const left = sets[area.sets[0]], right = sets[area.sets[1]]; + overlap = (0, circleintersection_1.circleOverlap)(left.radius, right.radius, (0, circleintersection_1.distance)(left, right)); + } + else { + overlap = (0, circleintersection_1.intersectionArea)(getCircles(area.sets)); + } + // eslint-disable-next-line + const weight = area.hasOwnProperty('weight') ? area.weight : 1.0; + output += weight * (overlap - area.size) * (overlap - area.size); + } + return output; +} +exports.lossFunction = lossFunction; +// orientates a bunch of circles to point in orientation +function orientateCircles(circles, orientation, orientationOrder) { + if (orientationOrder === null) { + circles.sort(function (a, b) { + return b.radius - a.radius; + }); + } + else { + circles.sort(orientationOrder); + } + let i; + // shift circles so largest circle is at (0, 0) + if (circles.length > 0) { + const largestX = circles[0].x, largestY = circles[0].y; + for (i = 0; i < circles.length; ++i) { + circles[i].x -= largestX; + circles[i].y -= largestY; + } + } + if (circles.length == 2) { + // if the second circle is a subset of the first, arrange so that + // it is off to one side. hack for https://github.com/benfred/venn.js/issues/120 + const dist = (0, circleintersection_1.distance)(circles[0], circles[1]); + if (dist < Math.abs(circles[1].radius - circles[0].radius)) { + circles[1].x = + circles[0].x + circles[0].radius - circles[1].radius - 1e-10; + circles[1].y = circles[0].y; + } + } + // rotate circles so that second largest is at an angle of 'orientation' + // from largest + if (circles.length > 1) { + const rotation = Math.atan2(circles[1].x, circles[1].y) - orientation; + let x, y; + const c = Math.cos(rotation), s = Math.sin(rotation); + for (i = 0; i < circles.length; ++i) { + x = circles[i].x; + y = circles[i].y; + circles[i].x = c * x - s * y; + circles[i].y = s * x + c * y; + } + } + // mirror solution if third solution is above plane specified by + // first two circles + if (circles.length > 2) { + let angle = Math.atan2(circles[2].x, circles[2].y) - orientation; + while (angle < 0) { + angle += 2 * Math.PI; + } + while (angle > 2 * Math.PI) { + angle -= 2 * Math.PI; + } + if (angle > Math.PI) { + const slope = circles[1].y / (1e-10 + circles[1].x); + for (i = 0; i < circles.length; ++i) { + const d = (circles[i].x + slope * circles[i].y) / (1 + slope * slope); + circles[i].x = 2 * d - circles[i].x; + circles[i].y = 2 * d * slope - circles[i].y; + } + } + } +} +function disjointCluster(circles) { + // union-find clustering to get disjoint sets + circles.map(function (circle) { + circle.parent = circle; + }); + // path compression step in union find + function find(circle) { + if (circle.parent !== circle) { + circle.parent = find(circle.parent); + } + return circle.parent; + } + function union(x, y) { + const xRoot = find(x), yRoot = find(y); + xRoot.parent = yRoot; + } + // get the union of all overlapping sets + for (let i = 0; i < circles.length; ++i) { + for (let j = i + 1; j < circles.length; ++j) { + const maxDistance = circles[i].radius + circles[j].radius; + if ((0, circleintersection_1.distance)(circles[i], circles[j]) + 1e-10 < maxDistance) { + union(circles[j], circles[i]); + } + } + } + // find all the disjoint clusters and group them together + const disjointClusters = {}; + let setid; + for (let i = 0; i < circles.length; ++i) { + setid = find(circles[i]).parent.setid; + if (!(setid in disjointClusters)) { + disjointClusters[setid] = []; + } + disjointClusters[setid].push(circles[i]); + } + // cleanup bookkeeping + circles.map(function (circle) { + delete circle.parent; + }); + // return in more usable form + const ret = []; + for (setid in disjointClusters) { + // eslint-disable-next-line + if (disjointClusters.hasOwnProperty(setid)) { + ret.push(disjointClusters[setid]); + } + } + return ret; +} +exports.disjointCluster = disjointCluster; +function getBoundingBox(circles) { + const minMax = function (d) { + const hi = Math.max.apply(null, circles.map(function (c) { + return c[d] + c.radius; + })), lo = Math.min.apply(null, circles.map(function (c) { + return c[d] - c.radius; + })); + return { max: hi, min: lo }; + }; + return { xRange: minMax('x'), yRange: minMax('y') }; +} +function normalizeSolution(solution, orientation, orientationOrder) { + if (orientation === null) { + orientation = Math.PI / 2; + } + // work with a list instead of a dictionary, and take a copy so we + // don't mutate input + let circles = [], i, setid; + for (setid in solution) { + // eslint-disable-next-line + if (solution.hasOwnProperty(setid)) { + const previous = solution[setid]; + circles.push({ + x: previous.x, + y: previous.y, + radius: previous.radius, + setid: setid, + }); + } + } + // get all the disjoint clusters + const clusters = disjointCluster(circles); + // orientate all disjoint sets, get sizes + for (i = 0; i < clusters.length; ++i) { + orientateCircles(clusters[i], orientation, orientationOrder); + const bounds = getBoundingBox(clusters[i]); + clusters[i].size = + (bounds.xRange.max - bounds.xRange.min) * + (bounds.yRange.max - bounds.yRange.min); + clusters[i].bounds = bounds; + } + clusters.sort(function (a, b) { + return b.size - a.size; + }); + // orientate the largest at 0,0, and get the bounds + circles = clusters[0]; + // @ts-ignore fixme 从逻辑上看似乎是不对的,后续看看 + let returnBounds = circles.bounds; + const spacing = (returnBounds.xRange.max - returnBounds.xRange.min) / 50; + function addCluster(cluster, right, bottom) { + if (!cluster) + return; + const bounds = cluster.bounds; + let xOffset, yOffset, centreing; + if (right) { + xOffset = returnBounds.xRange.max - bounds.xRange.min + spacing; + } + else { + xOffset = returnBounds.xRange.max - bounds.xRange.max; + centreing = + (bounds.xRange.max - bounds.xRange.min) / 2 - + (returnBounds.xRange.max - returnBounds.xRange.min) / 2; + if (centreing < 0) + xOffset += centreing; + } + if (bottom) { + yOffset = returnBounds.yRange.max - bounds.yRange.min + spacing; + } + else { + yOffset = returnBounds.yRange.max - bounds.yRange.max; + centreing = + (bounds.yRange.max - bounds.yRange.min) / 2 - + (returnBounds.yRange.max - returnBounds.yRange.min) / 2; + if (centreing < 0) + yOffset += centreing; + } + for (let j = 0; j < cluster.length; ++j) { + cluster[j].x += xOffset; + cluster[j].y += yOffset; + circles.push(cluster[j]); + } + } + let index = 1; + while (index < clusters.length) { + addCluster(clusters[index], true, false); + addCluster(clusters[index + 1], false, true); + addCluster(clusters[index + 2], true, true); + index += 3; + // have one cluster (in top left). lay out next three relative + // to it in a grid + returnBounds = getBoundingBox(circles); + } + // convert back to solution form + const ret = {}; + for (i = 0; i < circles.length; ++i) { + ret[circles[i].setid] = circles[i]; + } + return ret; +} +exports.normalizeSolution = normalizeSolution; +/** Scales a solution from venn.venn or venn.greedyLayout such that it fits in +a rectangle of width/height - with padding around the borders. also +centers the diagram in the available space at the same time */ +function scaleSolution(solution, width, height, padding) { + const circles = [], setids = []; + for (const setid in solution) { + // eslint-disable-next-line + if (solution.hasOwnProperty(setid)) { + setids.push(setid); + circles.push(solution[setid]); + } + } + width -= 2 * padding; + height -= 2 * padding; + const bounds = getBoundingBox(circles), xRange = bounds.xRange, yRange = bounds.yRange; + if (xRange.max == xRange.min || yRange.max == yRange.min) { + console.log('not scaling solution: zero size detected'); + return solution; + } + const xScaling = width / (xRange.max - xRange.min), yScaling = height / (yRange.max - yRange.min), scaling = Math.min(yScaling, xScaling), + // while we're at it, center the diagram too + xOffset = (width - (xRange.max - xRange.min) * scaling) / 2, yOffset = (height - (yRange.max - yRange.min) * scaling) / 2; + const scaled = {}; + for (let i = 0; i < circles.length; ++i) { + const circle = circles[i]; + scaled[setids[i]] = { + radius: scaling * circle.radius, + x: padding + xOffset + (circle.x - xRange.min) * scaling, + y: padding + yOffset + (circle.y - yRange.min) * scaling, + }; + } + return scaled; +} +exports.scaleSolution = scaleSolution; +//# sourceMappingURL=layout.js.map +}, function(modId) { var map = {"./fmin":1751263816167,"./circleintersection":1751263816174}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816167, function(require, module, exports) { + +/** + * Copyright 2016, Ben Frederickson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of the author nor the names of contributors may be used to + * endorse or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.scale = exports.weightedSum = exports.norm2 = exports.zerosM = exports.zeros = exports.gradientDescentLineSearch = exports.gradientDescent = exports.conjugateGradientSolve = exports.conjugateGradient = exports.nelderMead = exports.bisect = void 0; +var bisect_1 = require("./bisect"); +Object.defineProperty(exports, "bisect", { enumerable: true, get: function () { return bisect_1.bisect; } }); +var nelderMead_1 = require("./nelderMead"); +Object.defineProperty(exports, "nelderMead", { enumerable: true, get: function () { return nelderMead_1.nelderMead; } }); +var conjugateGradient_1 = require("./conjugateGradient"); +Object.defineProperty(exports, "conjugateGradient", { enumerable: true, get: function () { return conjugateGradient_1.conjugateGradient; } }); +Object.defineProperty(exports, "conjugateGradientSolve", { enumerable: true, get: function () { return conjugateGradient_1.conjugateGradientSolve; } }); +var gradientDescent_1 = require("./gradientDescent"); +Object.defineProperty(exports, "gradientDescent", { enumerable: true, get: function () { return gradientDescent_1.gradientDescent; } }); +Object.defineProperty(exports, "gradientDescentLineSearch", { enumerable: true, get: function () { return gradientDescent_1.gradientDescentLineSearch; } }); +var blas1_1 = require("./blas1"); +Object.defineProperty(exports, "zeros", { enumerable: true, get: function () { return blas1_1.zeros; } }); +Object.defineProperty(exports, "zerosM", { enumerable: true, get: function () { return blas1_1.zerosM; } }); +Object.defineProperty(exports, "norm2", { enumerable: true, get: function () { return blas1_1.norm2; } }); +Object.defineProperty(exports, "weightedSum", { enumerable: true, get: function () { return blas1_1.weightedSum; } }); +Object.defineProperty(exports, "scale", { enumerable: true, get: function () { return blas1_1.scale; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./bisect":1751263816168,"./nelderMead":1751263816169,"./conjugateGradient":1751263816171,"./gradientDescent":1751263816173,"./blas1":1751263816170}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816168, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.bisect = void 0; +/** finds the zeros of a function, given two starting points (which must + * have opposite signs */ +function bisect(f, a, b, parameters) { + parameters = parameters || {}; + const maxIterations = parameters.maxIterations || 100; + const tolerance = parameters.tolerance || 1e-10; + const fA = f(a); + const fB = f(b); + let delta = b - a; + if (fA * fB > 0) { + throw 'Initial bisect points must have opposite signs'; + } + if (fA === 0) + return a; + if (fB === 0) + return b; + for (let i = 0; i < maxIterations; ++i) { + delta /= 2; + const mid = a + delta; + const fMid = f(mid); + if (fMid * fA >= 0) { + a = mid; + } + if (Math.abs(delta) < tolerance || fMid === 0) { + return mid; + } + } + return a + delta; +} +exports.bisect = bisect; +//# sourceMappingURL=bisect.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816169, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.nelderMead = void 0; +const blas1_1 = require("./blas1"); +/** minimizes a function using the downhill simplex method */ +function nelderMead(f, x0, parameters) { + parameters = parameters || {}; + const maxIterations = parameters.maxIterations || x0.length * 200; + const nonZeroDelta = parameters.nonZeroDelta || 1.05; + const zeroDelta = parameters.zeroDelta || 0.001; + const minErrorDelta = parameters.minErrorDelta || 1e-6; + const minTolerance = parameters.minErrorDelta || 1e-5; + const rho = parameters.rho !== undefined ? parameters.rho : 1; + const chi = parameters.chi !== undefined ? parameters.chi : 2; + const psi = parameters.psi !== undefined ? parameters.psi : -0.5; + const sigma = parameters.sigma !== undefined ? parameters.sigma : 0.5; + let maxDiff; + // initialize simplex. + const N = x0.length; + const simplex = new Array(N + 1); + simplex[0] = x0; + simplex[0].fx = f(x0); + simplex[0].id = 0; + for (let i = 0; i < N; ++i) { + const point = x0.slice(); + point[i] = point[i] ? point[i] * nonZeroDelta : zeroDelta; + simplex[i + 1] = point; + simplex[i + 1].fx = f(point); + simplex[i + 1].id = i + 1; + } + function updateSimplex(value) { + for (let i = 0; i < value.length; i++) { + simplex[N][i] = value[i]; + } + simplex[N].fx = value.fx; + } + const sortOrder = (a, b) => a.fx - b.fx; + const centroid = x0.slice(); + const reflected = x0.slice(); + const contracted = x0.slice(); + const expanded = x0.slice(); + for (let iteration = 0; iteration < maxIterations; ++iteration) { + simplex.sort(sortOrder); + if (parameters.history) { + // copy the simplex (since later iterations will mutate) and + // sort it to have a consistent order between iterations + const sortedSimplex = simplex.map((x) => { + const state = x.slice(); + state.fx = x.fx; + state.id = x.id; + return state; + }); + sortedSimplex.sort((a, b) => a.id - b.id); + parameters.history.push({ + x: simplex[0].slice(), + fx: simplex[0].fx, + simplex: sortedSimplex, + }); + } + maxDiff = 0; + for (let i = 0; i < N; ++i) { + maxDiff = Math.max(maxDiff, Math.abs(simplex[0][i] - simplex[1][i])); + } + if (Math.abs(simplex[0].fx - simplex[N].fx) < minErrorDelta && + maxDiff < minTolerance) { + break; + } + // compute the centroid of all but the worst point in the simplex + for (let i = 0; i < N; ++i) { + centroid[i] = 0; + for (let j = 0; j < N; ++j) { + centroid[i] += simplex[j][i]; + } + centroid[i] /= N; + } + // reflect the worst point past the centroid and compute loss at reflected + // point + const worst = simplex[N]; + (0, blas1_1.weightedSum)(reflected, 1 + rho, centroid, -rho, worst); + reflected.fx = f(reflected); + // if the reflected point is the best seen, then possibly expand + if (reflected.fx < simplex[0].fx) { + (0, blas1_1.weightedSum)(expanded, 1 + chi, centroid, -chi, worst); + expanded.fx = f(expanded); + if (expanded.fx < reflected.fx) { + updateSimplex(expanded); + } + else { + updateSimplex(reflected); + } + } + // if the reflected point is worse than the second worst, we need to + // contract + else if (reflected.fx >= simplex[N - 1].fx) { + let shouldReduce = false; + if (reflected.fx > worst.fx) { + // do an inside contraction + (0, blas1_1.weightedSum)(contracted, 1 + psi, centroid, -psi, worst); + contracted.fx = f(contracted); + if (contracted.fx < worst.fx) { + updateSimplex(contracted); + } + else { + shouldReduce = true; + } + } + else { + // do an outside contraction + (0, blas1_1.weightedSum)(contracted, 1 - psi * rho, centroid, psi * rho, worst); + contracted.fx = f(contracted); + if (contracted.fx < reflected.fx) { + updateSimplex(contracted); + } + else { + shouldReduce = true; + } + } + if (shouldReduce) { + // if we don't contract here, we're done + if (sigma >= 1) + break; + // do a reduction + for (let i = 1; i < simplex.length; ++i) { + (0, blas1_1.weightedSum)(simplex[i], 1 - sigma, simplex[0], sigma, simplex[i]); + simplex[i].fx = f(simplex[i]); + } + } + } + else { + updateSimplex(reflected); + } + } + simplex.sort(sortOrder); + return { fx: simplex[0].fx, x: simplex[0] }; +} +exports.nelderMead = nelderMead; +//# sourceMappingURL=nelderMead.js.map +}, function(modId) { var map = {"./blas1":1751263816170}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816170, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.gemv = exports.weightedSum = exports.scale = exports.norm2 = exports.dot = exports.zerosM = exports.zeros = void 0; +// need some basic operations on vectors, rather than adding a dependency, +// just define here +function zeros(x) { + const r = new Array(x); + for (let i = 0; i < x; ++i) { + r[i] = 0; + } + return r; +} +exports.zeros = zeros; +function zerosM(x, y) { + return zeros(x).map(() => zeros(y)); +} +exports.zerosM = zerosM; +function dot(a, b) { + let ret = 0; + for (let i = 0; i < a.length; ++i) { + ret += a[i] * b[i]; + } + return ret; +} +exports.dot = dot; +function norm2(a) { + return Math.sqrt(dot(a, a)); +} +exports.norm2 = norm2; +function scale(ret, value, c) { + for (let i = 0; i < value.length; ++i) { + ret[i] = value[i] * c; + } +} +exports.scale = scale; +function weightedSum(ret, w1, v1, w2, v2) { + for (let j = 0; j < ret.length; ++j) { + ret[j] = w1 * v1[j] + w2 * v2[j]; + } +} +exports.weightedSum = weightedSum; +function gemv(output, A, x) { + for (let i = 0; i < output.length; ++i) { + output[i] = dot(A[i], x); + } +} +exports.gemv = gemv; +//# sourceMappingURL=blas1.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816171, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.conjugateGradientSolve = exports.conjugateGradient = void 0; +const blas1_1 = require("./blas1"); +const linesearch_1 = require("./linesearch"); +function conjugateGradient(f, initial, params) { + // allocate all memory up front here, keep out of the loop for perfomance + // reasons + let current = { x: initial.slice(), fx: 0, fxprime: initial.slice() }; + let next = { x: initial.slice(), fx: 0, fxprime: initial.slice() }; + const yk = initial.slice(); + let temp; + let a = 1; + params = params || {}; + const maxIterations = params.maxIterations || initial.length * 20; + current.fx = f(current.x, current.fxprime); + const pk = current.fxprime.slice(); + (0, blas1_1.scale)(pk, current.fxprime, -1); + for (let i = 0; i < maxIterations; ++i) { + a = (0, linesearch_1.wolfeLineSearch)(f, pk, current, next, a); + // todo: history in wrong spot? + if (params.history) { + params.history.push({ + x: current.x.slice(), + fx: current.fx, + fxprime: current.fxprime.slice(), + alpha: a, + }); + } + if (!a) { + // faiiled to find point that satifies wolfe conditions. + // reset direction for next iteration + (0, blas1_1.scale)(pk, current.fxprime, -1); + } + else { + // update direction using Polak–Ribiere CG method + (0, blas1_1.weightedSum)(yk, 1, next.fxprime, -1, current.fxprime); + const delta_k = (0, blas1_1.dot)(current.fxprime, current.fxprime); + const beta_k = Math.max(0, (0, blas1_1.dot)(yk, next.fxprime) / delta_k); + (0, blas1_1.weightedSum)(pk, beta_k, pk, -1, next.fxprime); + temp = current; + current = next; + next = temp; + } + if ((0, blas1_1.norm2)(current.fxprime) <= 1e-5) { + break; + } + } + if (params.history) { + params.history.push({ + x: current.x.slice(), + fx: current.fx, + fxprime: current.fxprime.slice(), + alpha: a, + }); + } + return current; +} +exports.conjugateGradient = conjugateGradient; +/// Solves a system of lienar equations Ax =b for x +/// using the conjugate gradient method. +function conjugateGradientSolve(A, b, x, history) { + const r = x.slice(); + const Ap = x.slice(); + let rsold; + let rsnew; + let alpha; + // r = b - A*x + (0, blas1_1.gemv)(Ap, A, x); + (0, blas1_1.weightedSum)(r, 1, b, -1, Ap); + const p = r.slice(); + rsold = (0, blas1_1.dot)(r, r); + for (let i = 0; i < b.length; ++i) { + (0, blas1_1.gemv)(Ap, A, p); + alpha = rsold / (0, blas1_1.dot)(p, Ap); + if (history) { + history.push({ x: x.slice(), p: p.slice(), alpha: alpha }); + } + //x=x+alpha*p; + (0, blas1_1.weightedSum)(x, 1, x, alpha, p); + // r=r-alpha*Ap; + (0, blas1_1.weightedSum)(r, 1, r, -alpha, Ap); + rsnew = (0, blas1_1.dot)(r, r); + if (Math.sqrt(rsnew) <= 1e-10) + break; + // p=r+(rsnew/rsold)*p; + (0, blas1_1.weightedSum)(p, 1, r, rsnew / rsold, p); + rsold = rsnew; + } + if (history) { + history.push({ x: x.slice(), p: p.slice(), alpha: alpha }); + } + return x; +} +exports.conjugateGradientSolve = conjugateGradientSolve; +//# sourceMappingURL=conjugateGradient.js.map +}, function(modId) { var map = {"./blas1":1751263816170,"./linesearch":1751263816172}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816172, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.wolfeLineSearch = void 0; +const blas1_1 = require("./blas1"); +/// searches along line 'pk' for a point that satifies the wolfe conditions +/// See 'Numerical Optimization' by Nocedal and Wright p59-60 +/// f : objective function +/// pk : search direction +/// current: object containing current gradient/loss +/// next: output: contains next gradient/loss +/// returns a: step size taken +function wolfeLineSearch(f, pk, current, next, a, c1, c2) { + const phi0 = current.fx; + const phiPrime0 = (0, blas1_1.dot)(current.fxprime, pk); + let phi = phi0; + let phi_old = phi0; + let phiPrime = phiPrime0; + let a0 = 0; + a = a || 1; + c1 = c1 || 1e-6; + c2 = c2 || 0.1; + function zoom(a_lo, a_high, phi_lo) { + for (let iteration = 0; iteration < 16; ++iteration) { + a = (a_lo + a_high) / 2; + (0, blas1_1.weightedSum)(next.x, 1.0, current.x, a, pk); + phi = next.fx = f(next.x, next.fxprime); + phiPrime = (0, blas1_1.dot)(next.fxprime, pk); + if (phi > phi0 + c1 * a * phiPrime0 || phi >= phi_lo) { + a_high = a; + } + else { + if (Math.abs(phiPrime) <= -c2 * phiPrime0) { + return a; + } + if (phiPrime * (a_high - a_lo) >= 0) { + a_high = a_lo; + } + a_lo = a; + phi_lo = phi; + } + } + return 0; + } + for (let iteration = 0; iteration < 10; ++iteration) { + (0, blas1_1.weightedSum)(next.x, 1.0, current.x, a, pk); + phi = next.fx = f(next.x, next.fxprime); + phiPrime = (0, blas1_1.dot)(next.fxprime, pk); + if (phi > phi0 + c1 * a * phiPrime0 || (iteration && phi >= phi_old)) { + return zoom(a0, a, phi_old); + } + if (Math.abs(phiPrime) <= -c2 * phiPrime0) { + return a; + } + if (phiPrime >= 0) { + return zoom(a, a0, phi); + } + phi_old = phi; + a0 = a; + a *= 2; + } + return a; +} +exports.wolfeLineSearch = wolfeLineSearch; +//# sourceMappingURL=linesearch.js.map +}, function(modId) { var map = {"./blas1":1751263816170}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816173, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.gradientDescentLineSearch = exports.gradientDescent = void 0; +const blas1_1 = require("./blas1"); +const linesearch_1 = require("./linesearch"); +function gradientDescent(f, initial, params) { + params = params || {}; + const maxIterations = params.maxIterations || initial.length * 100; + const learnRate = params.learnRate || 0.001; + const current = { x: initial.slice(), fx: 0, fxprime: initial.slice() }; + for (let i = 0; i < maxIterations; ++i) { + current.fx = f(current.x, current.fxprime); + if (params.history) { + params.history.push({ + x: current.x.slice(), + fx: current.fx, + fxprime: current.fxprime.slice(), + }); + } + (0, blas1_1.weightedSum)(current.x, 1, current.x, -learnRate, current.fxprime); + if ((0, blas1_1.norm2)(current.fxprime) <= 1e-5) { + break; + } + } + return current; +} +exports.gradientDescent = gradientDescent; +function gradientDescentLineSearch(f, initial, params) { + params = params || {}; + let current = { x: initial.slice(), fx: 0, fxprime: initial.slice() }; + let next = { x: initial.slice(), fx: 0, fxprime: initial.slice() }; + const maxIterations = params.maxIterations || initial.length * 100; + let learnRate = params.learnRate || 1; + const pk = initial.slice(); + const c1 = params.c1 || 1e-3; + const c2 = params.c2 || 0.1; + let temp; + let functionCalls = []; + if (params.history) { + // wrap the function call to track linesearch samples + const inner = f; + f = (x, fxprime) => { + functionCalls.push(x.slice()); + return inner(x, fxprime); + }; + } + current.fx = f(current.x, current.fxprime); + for (let i = 0; i < maxIterations; ++i) { + (0, blas1_1.scale)(pk, current.fxprime, -1); + learnRate = (0, linesearch_1.wolfeLineSearch)(f, pk, current, next, learnRate, c1, c2); + if (params.history) { + params.history.push({ + x: current.x.slice(), + fx: current.fx, + fxprime: current.fxprime.slice(), + functionCalls: functionCalls, + learnRate: learnRate, + alpha: learnRate, + }); + functionCalls = []; + } + temp = current; + current = next; + next = temp; + if (learnRate === 0 || (0, blas1_1.norm2)(current.fxprime) < 1e-5) + break; + } + return current; +} +exports.gradientDescentLineSearch = gradientDescentLineSearch; +//# sourceMappingURL=gradientDescent.js.map +}, function(modId) { var map = {"./blas1":1751263816170,"./linesearch":1751263816172}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816174, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getCenter = exports.circleCircleIntersection = exports.circleOverlap = exports.distance = exports.circleArea = exports.containedInCircles = exports.intersectionArea = void 0; +const SMALL = 1e-10; +/** + * Returns the intersection area of a bunch of circles (where each circle + * is an object having an x,y and radius property) + */ +function intersectionArea(circles, stats) { + // Get all the intersection points of the circles + const intersectionPoints = getIntersectionPoints(circles); + // Filter out points that aren't included in all the circles + const innerPoints = intersectionPoints.filter(function (p) { + return containedInCircles(p, circles); + }); + let arcArea = 0, polygonArea = 0, i; + const arcs = []; + // If we have intersection points that are within all the circles, + // then figure out the area contained by them + if (innerPoints.length > 1) { + // Sort the points by angle from the center of the polygon, which lets + // us just iterate over points to get the edges + const center = getCenter(innerPoints); + for (i = 0; i < innerPoints.length; ++i) { + const p = innerPoints[i]; + p.angle = Math.atan2(p.x - center.x, p.y - center.y); + } + innerPoints.sort(function (a, b) { + return b.angle - a.angle; + }); + // Iterate over all points, get arc between the points + // and update the areas + let p2 = innerPoints[innerPoints.length - 1]; + for (i = 0; i < innerPoints.length; ++i) { + const p1 = innerPoints[i]; + // Polygon area updates easily ... + polygonArea += (p2.x + p1.x) * (p1.y - p2.y); + // Updating the arc area is a little more involved + const midPoint = { x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 }; + let arc = null; + for (let j = 0; j < p1.parentIndex.length; ++j) { + if (p2.parentIndex.indexOf(p1.parentIndex[j]) > -1) { + // Figure out the angle halfway between the two points + // on the current circle + const circle = circles[p1.parentIndex[j]], a1 = Math.atan2(p1.x - circle.x, p1.y - circle.y), a2 = Math.atan2(p2.x - circle.x, p2.y - circle.y); + let angleDiff = a2 - a1; + if (angleDiff < 0) { + angleDiff += 2 * Math.PI; + } + // and use that angle to figure out the width of the + // arc + const a = a2 - angleDiff / 2; + let width = distance(midPoint, { + x: circle.x + circle.radius * Math.sin(a), + y: circle.y + circle.radius * Math.cos(a), + }); + // Clamp the width to the largest is can actually be + // (sometimes slightly overflows because of FP errors) + if (width > circle.radius * 2) { + width = circle.radius * 2; + } + // Pick the circle whose arc has the smallest width + if (arc === null || arc.width > width) { + arc = { circle: circle, width: width, p1: p1, p2: p2 }; + } + } + } + if (arc !== null) { + arcs.push(arc); + arcArea += circleArea(arc.circle.radius, arc.width); + p2 = p1; + } + } + } + else { + // No intersection points, is either disjoint - or is completely + // overlapped. figure out which by examining the smallest circle + let smallest = circles[0]; + for (i = 1; i < circles.length; ++i) { + if (circles[i].radius < smallest.radius) { + smallest = circles[i]; + } + } + // Make sure the smallest circle is completely contained in all + // the other circles + let disjoint = false; + for (i = 0; i < circles.length; ++i) { + if (distance(circles[i], smallest) > + Math.abs(smallest.radius - circles[i].radius)) { + disjoint = true; + break; + } + } + if (disjoint) { + arcArea = polygonArea = 0; + } + else { + arcArea = smallest.radius * smallest.radius * Math.PI; + arcs.push({ + circle: smallest, + p1: { x: smallest.x, y: smallest.y + smallest.radius }, + p2: { x: smallest.x - SMALL, y: smallest.y + smallest.radius }, + width: smallest.radius * 2, + }); + } + } + polygonArea /= 2; + if (stats) { + stats.area = arcArea + polygonArea; + stats.arcArea = arcArea; + stats.polygonArea = polygonArea; + stats.arcs = arcs; + stats.innerPoints = innerPoints; + stats.intersectionPoints = intersectionPoints; + } + return arcArea + polygonArea; +} +exports.intersectionArea = intersectionArea; +/** + * Returns whether a point is contained by all of a list of circles + */ +function containedInCircles(point, circles) { + for (let i = 0; i < circles.length; ++i) { + if (distance(point, circles[i]) > circles[i].radius + SMALL) { + return false; + } + } + return true; +} +exports.containedInCircles = containedInCircles; +/** Gets all intersection points between a bunch of circles */ +function getIntersectionPoints(circles) { + const ret = []; + for (let i = 0; i < circles.length; ++i) { + for (let j = i + 1; j < circles.length; ++j) { + const intersect = circleCircleIntersection(circles[i], circles[j]); + for (let k = 0; k < intersect.length; ++k) { + const p = intersect[k]; + p.parentIndex = [i, j]; + ret.push(p); + } + } + } + return ret; +} +/** Circular segment area calculation. See http://mathworld.wolfram.com/CircularSegment.html */ +function circleArea(r, width) { + return (r * r * Math.acos(1 - width / r) - + (r - width) * Math.sqrt(width * (2 * r - width))); +} +exports.circleArea = circleArea; +/** Euclidean distance between two points */ +function distance(p1, p2) { + return Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)); +} +exports.distance = distance; +/** Returns the overlap area of two circles of radius r1 and r2 - that +have their centers separated by distance d. Simpler faster +circle intersection for only two circles */ +function circleOverlap(r1, r2, d) { + // no overlap + if (d >= r1 + r2) { + return 0; + } + // Completely overlapped + if (d <= Math.abs(r1 - r2)) { + return Math.PI * Math.min(r1, r2) * Math.min(r1, r2); + } + const w1 = r1 - (d * d - r2 * r2 + r1 * r1) / (2 * d), w2 = r2 - (d * d - r1 * r1 + r2 * r2) / (2 * d); + return circleArea(r1, w1) + circleArea(r2, w2); +} +exports.circleOverlap = circleOverlap; +/** Given two circles (containing a x/y/radius attributes), +returns the intersecting points if possible. +note: doesn't handle cases where there are infinitely many +intersection points (circles are equivalent):, or only one intersection point*/ +function circleCircleIntersection(p1, p2) { + const d = distance(p1, p2), r1 = p1.radius, r2 = p2.radius; + // If to far away, or self contained - can't be done + if (d >= r1 + r2 || d <= Math.abs(r1 - r2)) { + return []; + } + const a = (r1 * r1 - r2 * r2 + d * d) / (2 * d), h = Math.sqrt(r1 * r1 - a * a), x0 = p1.x + (a * (p2.x - p1.x)) / d, y0 = p1.y + (a * (p2.y - p1.y)) / d, rx = -(p2.y - p1.y) * (h / d), ry = -(p2.x - p1.x) * (h / d); + return [ + { x: x0 + rx, y: y0 - ry }, + { x: x0 - rx, y: y0 + ry }, + ]; +} +exports.circleCircleIntersection = circleCircleIntersection; +/** Returns the center of a bunch of points */ +function getCenter(points) { + const center = { x: 0, y: 0 }; + for (let i = 0; i < points.length; ++i) { + center.x += points[i].x; + center.y += points[i].y; + } + center.x /= points.length; + center.y /= points.length; + return center; +} +exports.getCenter = getCenter; +//# sourceMappingURL=circleintersection.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816175, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.intersectionAreaPath = void 0; +const circleintersection_1 = require("./circleintersection"); +/** + * 根据圆心(x, y) 半径 r 返回圆的绘制 path + * @param x 圆心点 x + * @param y 圆心点 y + * @param r 圆的半径 + * @returns 圆的 path + */ +function circlePath(x, y, r) { + const ret = []; + // ret.push('\nM', x, y); + // ret.push('\nm', -r, 0); + // ret.push('\na', r, r, 0, 1, 0, r * 2, 0); + // ret.push('\na', r, r, 0, 1, 0, -r * 2, 0); + const x0 = x - r; + const y0 = y; + ret.push('M', x0, y0); + ret.push('A', r, r, 0, 1, 0, x0 + 2 * r, y0); + ret.push('A', r, r, 0, 1, 0, x0, y0); + return ret.join(' '); +} +/** returns a svg path of the intersection area of a bunch of circles */ +function intersectionAreaPath(circles) { + const stats = {}; + (0, circleintersection_1.intersectionArea)(circles, stats); + const arcs = stats.arcs; + if (arcs.length === 0) { + return 'M 0 0'; + } + else if (arcs.length == 1) { + const circle = arcs[0].circle; + return circlePath(circle.x, circle.y, circle.radius); + } + else { + // draw path around arcs + const ret = ['\nM', arcs[0].p2.x, arcs[0].p2.y]; + for (let i = 0; i < arcs.length; ++i) { + const arc = arcs[i], r = arc.circle.radius, wide = arc.width > r; + ret.push('\nA', r, r, 0, wide ? 1 : 0, 1, arc.p1.x, arc.p1.y); + } + return ret.join(' '); + } +} +exports.intersectionAreaPath = intersectionAreaPath; +//# sourceMappingURL=diagram.js.map +}, function(modId) { var map = {"./circleintersection":1751263816174}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816176, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Log = void 0; +/** + * Console.log the data section for dev debugger. + */ +const Log = () => { + return (data) => { + console.log('G2 data section:', data); + return data; + }; +}; +exports.Log = Log; +exports.Log.props = {}; +//# sourceMappingURL=log.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816177, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EMA = exports.ema = void 0; +function ema(values, alpha) { + if (alpha < 0 || alpha > 1) { + throw new Error('alpha must be between 0 and 1.'); + } + if (values.length === 0) { + return []; + } + let last = values[0]; + const smoothed = []; + for (const point of values) { + if (point === null || point === undefined) { + // 如果没有数据的话,使用最近的值 + smoothed.push(point); + console.warn('EMA:The value is null or undefined', values); + continue; + } + if (last === null || last === undefined) { + last = point; + } + const smoothedVal = last * alpha + (1 - alpha) * point; + smoothed.push(smoothedVal); + last = smoothedVal; + } + return smoothed; +} +exports.ema = ema; +/** + * https://en.wikipedia.org/wiki/Exponential_smoothing + * @param options + * @returns + */ +const EMA = (options) => { + const { field = 'y', alpha = 0.6, as = field } = options; + return (data) => { + const values = data.map((d) => { + return d[field]; + }); + const out = ema(values, alpha); + return data.map((d, i) => { + return Object.assign(Object.assign({}, d), { [as]: out[i] }); + }); + }; +}; +exports.EMA = EMA; +exports.EMA.props = {}; +//# sourceMappingURL=ema.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816178, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ExceedAdjust = exports.OverflowHide = exports.ContrastReverse = exports.OverlapDodgeY = exports.OverlapHide = void 0; +var overlapHide_1 = require("./overlapHide"); +Object.defineProperty(exports, "OverlapHide", { enumerable: true, get: function () { return overlapHide_1.OverlapHide; } }); +var overlapDodgeY_1 = require("./overlapDodgeY"); +Object.defineProperty(exports, "OverlapDodgeY", { enumerable: true, get: function () { return overlapDodgeY_1.OverlapDodgeY; } }); +var contrastReverse_1 = require("./contrastReverse"); +Object.defineProperty(exports, "ContrastReverse", { enumerable: true, get: function () { return contrastReverse_1.ContrastReverse; } }); +var overflowHide_1 = require("./overflowHide"); +Object.defineProperty(exports, "OverflowHide", { enumerable: true, get: function () { return overflowHide_1.OverflowHide; } }); +var exceedAdjust_1 = require("./exceedAdjust"); +Object.defineProperty(exports, "ExceedAdjust", { enumerable: true, get: function () { return exceedAdjust_1.ExceedAdjust; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./overlapHide":1751263816179,"./overlapDodgeY":1751263816181,"./contrastReverse":1751263816182,"./overflowHide":1751263816184,"./exceedAdjust":1751263816185}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816179, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.OverlapHide = void 0; +const bounds_1 = require("../utils/bounds"); +const style_1 = require("../utils/style"); +/** + * Hide the label when overlap. + */ +const OverlapHide = (options) => { + const { priority } = options; + return (labels) => { + const displayLabels = []; + // When overlap, will hide the next label. + if (priority) + labels.sort(priority); + labels.forEach((l) => { + (0, style_1.show)(l); + const b1 = l.getLocalBounds(); + const overlaping = displayLabels.some((dl) => (0, bounds_1.isOverlap)((0, bounds_1.parseAABB)(b1), (0, bounds_1.parseAABB)(dl.getLocalBounds()))); + if (overlaping) + (0, style_1.hide)(l); + else + displayLabels.push(l); + }); + return labels; + }; +}; +exports.OverlapHide = OverlapHide; +//# sourceMappingURL=overlapHide.js.map +}, function(modId) { var map = {"../utils/bounds":1751263816180,"../utils/style":1751263816122}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816180, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isOverlap = exports.isOverflow = exports.isInBounds = exports.parseAABB = void 0; +// There is a certain error in the calculation of text bounds. +const EPSILON = 1e-2; +function parseAABB(min2) { + const { min, max } = min2; + return [ + [min[0], min[1]], + [max[0], max[1]], + ]; +} +exports.parseAABB = parseAABB; +/** + * Whether the `point` in `bounds`. + * @param point + * @param bounds + * @param threshold + */ +function isInBounds(point, bounds, threshold = EPSILON) { + const [x, y] = point; + const [min, max] = bounds; + return (x >= min[0] - threshold && + x <= max[0] + threshold && + y >= min[1] - threshold && + y <= max[1] + threshold); +} +exports.isInBounds = isInBounds; +/** + * Whether `b1` is overflow from `b2`. + * @param b1 + * @param b2 + * @param threshold The threshold to determine whether the bounds is overflowed, default is 0. + */ +function isOverflow(b1, b2, threshold = EPSILON) { + const [min, max] = b1; + return !(isInBounds(min, b2, threshold) && isInBounds(max, b2, threshold)); +} +exports.isOverflow = isOverflow; +/** + * Whether `b1` is overlap with `b2`. + * @param b1 + * @param b2 + * @returns + */ +function isOverlap(b1, b2) { + const [min1, max1] = b1; + const [min2, max2] = b2; + return (min1[0] < max2[0] && + max1[0] > min2[0] && + min1[1] < max2[1] && + max1[1] > min2[1]); +} +exports.isOverlap = isOverlap; +//# sourceMappingURL=bounds.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816181, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.OverlapDodgeY = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +function isSegmentIntersect([a, b], [c, d]) { + return d > a && b > c; +} +function useMap() { + const map = new Map(); + const get = (key) => map.get(key); + const set = (key, value) => map.set(key, value); + return [get, set]; +} +function getBoundsWithoutConnector(shape) { + const node = shape.cloneNode(true); + const connectorShape = node.getElementById('connector'); + connectorShape && node.removeChild(connectorShape); + const { min, max } = node.getRenderBounds(); + node.destroy(); + return { min, max }; +} +/** + * An iterative dodge method avoids label overlap. (n * log(n)) + */ +const OverlapDodgeY = (options) => { + const { maxIterations = 10, maxError = 0.1, padding = 1 } = options; + return (labels) => { + const n = labels.length; + if (n <= 1) + return labels; + // Index y, x0, x, height, by label. + const [y0, setY0] = useMap(); + const [y, setY] = useMap(); + const [h, setH] = useMap(); + const [xx, setXX] = useMap(); + for (const label of labels) { + const { min, max } = getBoundsWithoutConnector(label); + const [x0, y0] = min; + const [x1, y1] = max; + setY0(label, y0); + setY(label, y0); + setH(label, y1 - y0); + setXX(label, [x0, x1]); + } + // Offsets position Y. + for (let iter = 0; iter < maxIterations; iter++) { + labels.sort((a, b) => (0, d3_array_1.ascending)(y(a), y(b))); + let error = 0; + for (let i = 0; i < n - 1; i++) { + const l0 = labels[i]; + let j = i + 1; + let l1; + // Find the next label overlapping with the current label in x direction. + while ((l1 = labels[j]) && !isSegmentIntersect(xx(l0), xx(l1))) + j += 1; + if (l1) { + const y0 = y(l0); + const h0 = h(l0); + const y1 = y(l1); + const delta = y1 - (y0 + h0); + if (delta < padding) { + const newDelta = (padding - delta) / 2; + error = Math.max(error, newDelta); + setY(l0, y0 - newDelta); + setY(l1, y1 + newDelta); + } + } + } + if (error < maxError) + break; + } + for (const label of labels) { + label.style.y += y(label) - y0(label); + } + return labels; + }; +}; +exports.OverlapDodgeY = OverlapDodgeY; +//# sourceMappingURL=overlapDodgeY.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816182, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ContrastReverse = void 0; +const d3_array_1 = require("@antv/vendor/d3-array"); +const color_1 = require("../utils/color"); +function getsRGB(s) { + let c = s / 255; + c = c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4); + return c; +} +function getL(r, g, b) { + return 0.2126 * getsRGB(r) + 0.7152 * getsRGB(g) + 0.0722 * getsRGB(b); +} +/** + * Calculate the contrast. see https://webaim.org/resources/contrastchecker/ + * @param foreground + * @param background + */ +function contrast(foreground, background) { + if (!foreground || !background || foreground === background) + return 1; + const { r, g, b } = foreground; + const { r: rb, g: gb, b: bb } = background; + const L1 = getL(r, g, b); + const L2 = getL(rb, gb, bb); + return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05); +} +/** + * Reverse color for max contrast. + */ +function mostContrast(color, palette) { + const i = (0, d3_array_1.maxIndex)(palette, (c) => contrast(color, (0, color_1.parseToRGB)(c))); + return palette[i]; +} +/** + * Reverse the label color when the contrast is lower then `threshold`. + * The default value of `threshold` is 4.5. + * More about contract, see https://webaim.org/resources/contrastchecker/ + */ +const ContrastReverse = (options) => { + const { threshold = 4.5, palette = ['#000', '#fff'] } = options; + return (labels) => { + labels.forEach((l) => { + const background = l.attr('dependentElement').parsedStyle.fill; + const foreground = l.parsedStyle.fill; + const c = contrast(foreground, background); + if (c < threshold) + l.attr('fill', mostContrast(background, palette)); + }); + return labels; + }; +}; +exports.ContrastReverse = ContrastReverse; +//# sourceMappingURL=contrastReverse.js.map +}, function(modId) { var map = {"../utils/color":1751263816183}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816183, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseToRGB = void 0; +const g_1 = require("@antv/g"); +function parseToRGB(c) { + if (typeof c === 'object') + return c; + return (0, g_1.parseColor)(c); +} +exports.parseToRGB = parseToRGB; +//# sourceMappingURL=color.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816184, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.OverflowHide = void 0; +const bounds_1 = require("../utils/bounds"); +const style_1 = require("../utils/style"); +/** + * Hide the label when the label is overflowed from the element. + */ +const OverflowHide = () => { + return (labels) => { + labels.forEach((l) => { + (0, style_1.show)(l); + const bounds = l.attr('bounds'); + const b = l.getLocalBounds(); + const overflow = (0, bounds_1.isOverflow)((0, bounds_1.parseAABB)(b), bounds); + if (overflow) + (0, style_1.hide)(l); + }); + return labels; + }; +}; +exports.OverflowHide = OverflowHide; +//# sourceMappingURL=overflowHide.js.map +}, function(modId) { var map = {"../utils/bounds":1751263816180,"../utils/style":1751263816122}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816185, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ExceedAdjust = void 0; +const style_1 = require("../utils/style"); +const adjustPosition = (target, edge) => { + const [[minEdgeX, minEdgeY], [maxEdgeX, maxEdgeY]] = edge; + const [[minX, minY], [maxX, maxY]] = target; + let changeX = 0, changeY = 0; + // x-axis + if (minX < minEdgeX) { + changeX = minEdgeX - minX; + } + else if (maxX > maxEdgeX) { + changeX = maxEdgeX - maxX; + } + // y-axis + if (minY < minEdgeY) { + changeY = minEdgeY - minY; + } + else if (maxY > maxEdgeY) { + changeY = maxEdgeY - maxY; + } + return [changeX, changeY]; +}; +/** + * adjust the label when exceed the plot + */ +const ExceedAdjust = () => { + return (labels, { canvas, layout }) => { + labels.forEach((l) => { + (0, style_1.show)(l); + const { max, min } = l.getRenderBounds(); + const [xMax, yMax] = max, [xMin, yMin] = min; + const changeValue = adjustPosition([ + [xMin, yMin], + [xMax, yMax], + ], + // Prevent label overlap in multiple charts by calculating layouts separately to avoid collisions. + [ + [layout.x, layout.y], + [layout.x + layout.width, layout.y + layout.height], + ]); + // For label with connectorPoints + if (l.style.connector && l.style.connectorPoints) { + l.style.connectorPoints[0][0] -= changeValue[0]; + l.style.connectorPoints[0][1] -= changeValue[1]; + } + l.style.x += changeValue[0]; + l.style.y += changeValue[1]; + }); + return labels; + }; +}; +exports.ExceedAdjust = ExceedAdjust; +//# sourceMappingURL=exceedAdjust.js.map +}, function(modId) { var map = {"../utils/style":1751263816122}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816186, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.geolib = void 0; +const geoView_1 = require("../composition/geoView"); +const geoPath_1 = require("../composition/geoPath"); +function geolib() { + return { + 'composition.geoView': geoView_1.GeoView, + 'composition.geoPath': geoPath_1.GeoPath, + }; +} +exports.geolib = geolib; +//# sourceMappingURL=geo.js.map +}, function(modId) { var map = {"../composition/geoView":1751263816111,"../composition/geoPath":1751263816110}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816187, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.graphlib = void 0; +const mark_1 = require("../mark"); +const data_1 = require("../data"); +function graphlib() { + return { + 'data.arc': data_1.Arc, + 'data.cluster': data_1.Cluster, + 'mark.forceGraph': mark_1.ForceGraph, + 'mark.tree': mark_1.Tree, + 'mark.pack': mark_1.Pack, + 'mark.sankey': mark_1.Sankey, + 'mark.chord': mark_1.Chord, + 'mark.treemap': mark_1.Treemap, + }; +} +exports.graphlib = graphlib; +//# sourceMappingURL=graph.js.map +}, function(modId) { var map = {"../mark":1751263815821,"../data":1751263816146}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816188, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.plotlib = void 0; +const mark_1 = require("../mark"); +const data_1 = require("../data"); +function plotlib() { + return { + 'data.venn': data_1.Venn, + 'mark.boxplot': mark_1.Boxplot, + 'mark.gauge': mark_1.Gauge, + 'mark.wordCloud': mark_1.WordCloud, + 'mark.liquid': mark_1.Liquid, + }; +} +exports.plotlib = plotlib; +//# sourceMappingURL=plot.js.map +}, function(modId) { var map = {"../mark":1751263815821,"../data":1751263816146}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816189, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.stdlib = void 0; +const core_1 = require("./core"); +const geo_1 = require("./geo"); +const graph_1 = require("./graph"); +const plot_1 = require("./plot"); +function stdlib() { + return Object.assign(Object.assign(Object.assign(Object.assign({}, (0, geo_1.geolib)()), (0, graph_1.graphlib)()), (0, plot_1.plotlib)()), (0, core_1.corelib)()); +} +exports.stdlib = stdlib; +//# sourceMappingURL=std.js.map +}, function(modId) { var map = {"./core":1751263815804,"./geo":1751263816186,"./graph":1751263816187,"./plot":1751263816188}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816190, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.litelib = void 0; +const coordinate_1 = require("../coordinate"); +const encode_1 = require("../encode"); +const mark_1 = require("../mark"); +const palette_1 = require("../palette"); +const scale_1 = require("../scale"); +const theme_1 = require("../theme"); +const component_1 = require("../component"); +const animation_1 = require("../animation"); +const interaction_1 = require("../interaction"); +const composition_1 = require("../composition"); +const shape_1 = require("../shape"); +const data_1 = require("../data"); +/** + * In test stage, don't use it. + */ +function litelib() { + return { + 'data.inline': data_1.Inline, + 'coordinate.cartesian': coordinate_1.Cartesian, + 'encode.constant': encode_1.Constant, + 'encode.field': encode_1.Field, + 'encode.transform': encode_1.Transform, + 'encode.column': encode_1.Column, + 'mark.interval': mark_1.Interval, + 'shape.label.label': shape_1.LabelShape, + 'palette.category10': palette_1.Category10, + 'palette.category20': palette_1.Category20, + 'scale.linear': scale_1.Linear, + 'scale.ordinal': scale_1.Ordinal, + 'scale.band': scale_1.Band, + 'scale.identity': scale_1.Identity, + 'scale.point': scale_1.Point, + 'scale.time': scale_1.Time, + 'scale.log': scale_1.Log, + 'scale.pow': scale_1.Pow, + 'scale.sqrt': scale_1.Sqrt, + 'scale.threshold': scale_1.Threshold, + 'scale.quantile': scale_1.Quantile, + 'scale.quantize': scale_1.Quantize, + 'scale.sequential': scale_1.Sequential, + 'scale.constant': scale_1.Constant, + 'theme.classic': theme_1.Classic, + 'component.axisX': component_1.AxisX, + 'component.axisY': component_1.AxisY, + 'component.axisRadar': component_1.AxisRadar, + 'component.axisLinear': component_1.AxisLinear, + 'component.axisArc': component_1.AxisArc, + 'component.legendCategory': component_1.LegendCategory, + 'component.legendContinuous': component_1.LegendContinuous, + 'component.legendContinuousBlock': component_1.LegendContinuousBlock, + 'component.legendContinuousBlockSize': component_1.LegendContinuousBlockSize, + 'component.legendContinuousSize': component_1.LegendContinuousSize, + 'component.legends': component_1.Legends, + 'component.title': component_1.TitleComponent, + 'component.sliderX': component_1.SliderX, + 'component.sliderY': component_1.SliderY, + 'component.scrollbarX': component_1.ScrollbarX, + 'component.scrollbarY': component_1.ScrollbarY, + 'animation.scaleInX': animation_1.ScaleInX, + 'animation.scaleOutX': animation_1.ScaleOutX, + 'animation.scaleInY': animation_1.ScaleInY, + 'animation.scaleOutY': animation_1.ScaleOutY, + 'animation.waveIn': animation_1.WaveIn, + 'animation.fadeIn': animation_1.FadeIn, + 'animation.fadeOut': animation_1.FadeOut, + 'animation.morphing': animation_1.Morphing, + 'interaction.tooltip': interaction_1.Tooltip, + 'interaction.legendFilter': interaction_1.LegendFilter, + 'interaction.legendHighlight': interaction_1.LegendHighlight, + 'interaction.sliderFilter': interaction_1.SliderFilter, + 'interaction.scrollbarFilter': interaction_1.ScrollbarFilter, + 'interaction.poptip': interaction_1.Poptip, + 'interaction.event': interaction_1.Event, + 'composition.mark': composition_1.Mark, + 'composition.view': composition_1.View, + }; +} +exports.litelib = litelib; +//# sourceMappingURL=lite.js.map +}, function(modId) { var map = {"../coordinate":1751263815805,"../encode":1751263815816,"../mark":1751263815821,"../palette":1751263816018,"../scale":1751263816021,"../theme":1751263816036,"../component":1751263816043,"../animation":1751263816063,"../interaction":1751263816078,"../composition":1751263816099,"../shape":1751263815879,"../data":1751263816146}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816191, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.extend = exports.Runtime = exports.register = exports.Chart = void 0; +var chart_1 = require("./chart"); +Object.defineProperty(exports, "Chart", { enumerable: true, get: function () { return chart_1.Chart; } }); +var library_1 = require("./library"); +Object.defineProperty(exports, "register", { enumerable: true, get: function () { return library_1.register; } }); +var runtime_1 = require("./runtime"); +Object.defineProperty(exports, "Runtime", { enumerable: true, get: function () { return runtime_1.Runtime; } }); +var extend_1 = require("./extend"); +Object.defineProperty(exports, "extend", { enumerable: true, get: function () { return extend_1.extend; } }); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./chart":1751263816192,"./library":1751263816194,"./runtime":1751263816195,"./extend":1751263816193}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816192, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Chart = void 0; +const extend_1 = require("./extend"); +const library_1 = require("./library"); +const runtime_1 = require("./runtime"); +exports.Chart = (0, extend_1.extend)(runtime_1.Runtime, library_1.library); +//# sourceMappingURL=chart.js.map +}, function(modId) { var map = {"./extend":1751263816193,"./library":1751263816194,"./runtime":1751263816195}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816193, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.extend = void 0; +function extend(Runtime, library) { + class Chart extends Runtime { + constructor(options) { + super(Object.assign(Object.assign({}, options), { lib: library })); + } + } + return Chart; +} +exports.extend = extend; +//# sourceMappingURL=extend.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816194, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.register = exports.library = void 0; +const marker_1 = require("../utils/marker"); +exports.library = {}; +// @todo Warn if override existing key. +function register(key, component) { + if (key.startsWith('symbol.')) + (0, marker_1.registerSymbol)(key.split('.').pop(), component); + else + Object.assign(exports.library, { [key]: component }); +} +exports.register = register; +//# sourceMappingURL=library.js.map +}, function(modId) { var map = {"../utils/marker":1751263815899}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816195, function(require, module, exports) { + +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Runtime = exports.G2_CHART_KEY = void 0; +const g_1 = require("@antv/g"); +const g_canvas_1 = require("@antv/g-canvas"); +const g_plugin_dragndrop_1 = require("@antv/g-plugin-dragndrop"); +const util_1 = require("@antv/util"); +const event_emitter_1 = __importDefault(require("@antv/event-emitter")); +const d3_array_1 = require("@antv/vendor/d3-array"); +const runtime_1 = require("../runtime"); +const event_1 = require("../utils/event"); +const tooltip_1 = require("../interaction/tooltip"); +const utils_1 = require("../interaction/utils"); +const utils_2 = require("./utils"); +const composition_1 = require("./composition"); +const define_1 = require("./define"); +const mark_1 = require("./mark"); +const library_1 = require("./library"); +exports.G2_CHART_KEY = 'G2_CHART_KEY'; +class Runtime extends composition_1.CompositionNode { + constructor(options) { + const { container, canvas, renderer, plugins, lib, createCanvas } = options, rest = __rest(options, ["container", "canvas", "renderer", "plugins", "lib", "createCanvas"]); + super(rest, 'view'); + // Identifies whether bindAutoFit. + this._hasBindAutoFit = false; + this._rendering = false; + this._trailing = false; + this._trailingResolve = null; + this._trailingReject = null; + this._previousDefinedType = null; + this._onResize = (0, util_1.debounce)(() => { + this.forceFit(); + }, 300); + this._renderer = renderer || new g_canvas_1.Renderer(); + this._plugins = plugins || []; + this._container = (0, utils_2.normalizeContainer)(container); + this._emitter = new event_emitter_1.default(); + this._context = { + library: Object.assign(Object.assign({}, lib), library_1.library), + emitter: this._emitter, + canvas, + createCanvas, + }; + this._create(); + } + render() { + if (this._rendering) + return this._addToTrailing(); + if (!this._context.canvas) + this._createCanvas(); + this._bindAutoFit(); + this._rendering = true; + // @fixme The cancel render is not marked, which will cause additional rendered event. + // @ref src/runtime/render.ts + const finished = new Promise((resolve, reject) => (0, runtime_1.render)(this._computedOptions(), this._context, this._createResolve(resolve), this._createReject(reject))); + const [finished1, resolve, reject] = (0, utils_2.createEmptyPromise)(); + finished + .then(resolve) + .catch(reject) + .then(() => this._renderTrailing()); + return finished1; + } + /** + * @overload + * @param {G2ViewTree} [options] + * @returns {Runtime|Spec} + */ + options(options) { + if (arguments.length === 0) + return (0, utils_2.optionsOf)(this); + const { type } = options; + if (type) + this._previousDefinedType = type; + (0, utils_2.updateRoot)(this, options, this._previousDefinedType, this._marks, this._compositions); + return this; + } + getContainer() { + return this._container; + } + getContext() { + return this._context; + } + on(event, callback, once) { + this._emitter.on(event, callback, once); + return this; + } + once(event, callback) { + this._emitter.once(event, callback); + return this; + } + emit(event, ...args) { + this._emitter.emit(event, ...args); + return this; + } + off(event, callback) { + this._emitter.off(event, callback); + return this; + } + clear() { + const options = this.options(); + this.emit(event_1.ChartEvent.BEFORE_CLEAR); + this._reset(); + (0, runtime_1.destroy)(options, this._context, false); + this.emit(event_1.ChartEvent.AFTER_CLEAR); + } + destroy() { + const options = this.options(); + this.emit(event_1.ChartEvent.BEFORE_DESTROY); + this._unbindAutoFit(); + this._reset(); + (0, runtime_1.destroy)(options, this._context, true); + if (this._container[utils_2.REMOVE_FLAG]) + (0, utils_2.removeContainer)(this._container); + this.emit(event_1.ChartEvent.AFTER_DESTROY); + } + forceFit() { + // Don't fit if size do not change. + this.options['autoFit'] = true; + const { width, height } = (0, utils_2.sizeOf)(this.options(), this._container); + if (width === this._width && height === this._height) { + return Promise.resolve(this); + } + // Don't call changeSize to prevent update width and height of options. + this.emit(event_1.ChartEvent.BEFORE_CHANGE_SIZE); + const finished = this.render(); + finished.then(() => { + this.emit(event_1.ChartEvent.AFTER_CHANGE_SIZE); + }); + return finished; + } + changeSize(width, height) { + if (width === this._width && height === this._height) { + return Promise.resolve(this); + } + this.emit(event_1.ChartEvent.BEFORE_CHANGE_SIZE); + this.attr('width', width); + this.attr('height', height); + const finished = this.render(); + finished.then(() => { + this.emit(event_1.ChartEvent.AFTER_CHANGE_SIZE); + }); + return finished; + } + getDataByXY(point, options = {}) { + const { shared = false, series, facet = false, startX = 0, startY = 0, } = options; + const { canvas, views } = this._context; + const { document } = canvas; + const { x, y } = point; + // Temporarily do not handle the multi - view situation. + const { coordinate, scale, markState, data: dataMap, key } = views[0]; + const elements = document.getElementsByClassName(runtime_1.ELEMENT_CLASS_NAME); + const groupKey = shared ? (element) => element.__data__.x : (d) => d; + const keyGroup = (0, d3_array_1.group)(elements, groupKey); + const container = document.getElementsByClassName(runtime_1.VIEW_CLASS_NAME)[0]; + const root = (0, utils_1.selectPlotArea)(container); + const hasSeriesInteraction = (markState) => { + return Array.from(markState.values()).some((d) => { + var _a, _b; + return ((_a = d.interaction) === null || _a === void 0 ? void 0 : _a['seriesTooltip']) || + ((_b = d.channels) === null || _b === void 0 ? void 0 : _b.some((c) => c.name === 'series' && c.values !== undefined)); + }); + }; + const isSeries = (0, tooltip_1.maybeValue)(series, hasSeriesInteraction(markState)); + const getElementData = (el) => (0, util_1.get)(el, '__data__.data', null); + const getElementsData = (els) => els.map(getElementData); + try { + // For non-facet and series chart. + if (isSeries && + hasSeriesInteraction(markState) && + !facet) { + const { selectedData } = (0, tooltip_1.findSeriesElement)({ + root, + event: { offsetX: x, offsetY: y }, + elements, + coordinate, + scale, + startX, + startY, + }); + const viewData = dataMap.get(`${key}-0`); + return selectedData.map(({ index }) => viewData[index]); + } + // For single chart. + const element = (0, tooltip_1.findSingleElement)({ + root, + event: { offsetX: x, offsetY: y }, + elements, + coordinate, + scale, + shared, + }); + const k = groupKey(element); + const groupElements = keyGroup.get(k); + return groupElements ? getElementsData(groupElements) : []; + } + catch (e) { + const topMostElement = canvas.document.elementFromPointSync(x, y); + return topMostElement ? getElementData(topMostElement) : []; + } + } + _create() { + const { library } = this._context; + // @todo After refactor component as mark, remove this. + const isMark = (key) => key.startsWith('mark.') || + key === 'component.axisX' || + key === 'component.axisY' || + key === 'component.legends'; + const marks = [ + 'mark.mark', + ...Object.keys(library).filter(isMark), + ]; + // Create mark generators. + this._marks = {}; + for (const key of marks) { + const name = key.split('.').pop(); + class Mark extends mark_1.MarkNode { + constructor() { + super({}, name); + } + } + this._marks[name] = Mark; + this[name] = function (composite) { + const node = this.append(Mark); + if (name === 'mark') + node.type = composite; + return node; + }; + } + // Create composition generators. + const compositions = [ + 'composition.view', + ...Object.keys(library).filter((key) => key.startsWith('composition.') && key !== 'composition.mark'), + ]; + this._compositions = Object.fromEntries(compositions.map((key) => { + const name = key.split('.').pop(); + let Composition = class Composition extends composition_1.CompositionNode { + constructor() { + super({}, name); + } + }; + Composition = __decorate([ + (0, define_1.defineProps)((0, define_1.nodeProps)(this._marks)) + ], Composition); + return [name, Composition]; + })); + for (const Ctor of Object.values(this._compositions)) { + (0, define_1.defineProps)((0, define_1.nodeProps)(this._compositions))(Ctor); + } + for (const key of compositions) { + const name = key.split('.').pop(); + this[name] = function () { + const Composition = this._compositions[name]; + this.type = null; + return this.append(Composition); + }; + } + } + _reset() { + const KEYS = ['theme', 'type', 'width', 'height', 'autoFit']; + this.type = 'view'; + this.value = Object.fromEntries(Object.entries(this.value).filter(([key]) => key.startsWith('margin') || + key.startsWith('padding') || + key.startsWith('inset') || + KEYS.includes(key))); + this.children = []; + } + _renderTrailing() { + if (!this._trailing) + return; + this._trailing = false; + this.render() + .then(() => { + const trailingResolve = this._trailingResolve.bind(this); + this._trailingResolve = null; + trailingResolve(this); + }) + .catch((error) => { + const trailingReject = this._trailingReject.bind(this); + this._trailingReject = null; + trailingReject(error); + }); + } + _createResolve(resolve) { + return () => { + this._rendering = false; + resolve(this); + }; + } + _createReject(reject) { + return (error) => { + this._rendering = false; + reject(error); + }; + } + // Update actual size and key. + _computedOptions() { + const options = this.options(); + const { key = exports.G2_CHART_KEY } = options; + const { width, height, depth } = (0, utils_2.sizeOf)(options, this._container); + this._width = width; + this._height = height; + this._key = key; + return Object.assign(Object.assign({ key: this._key }, options), { width, height, depth }); + } + // Create canvas if it does not exist. + // DragAndDropPlugin is for interaction. + // It is OK to register more than one time, G will handle this. + _createCanvas() { + const { width, height } = (0, utils_2.sizeOf)(this.options(), this._container); + this._plugins.push(new g_plugin_dragndrop_1.Plugin()); + this._plugins.forEach((d) => this._renderer.registerPlugin(d)); + this._context.canvas = new g_1.Canvas({ + container: this._container, + width, + height, + renderer: this._renderer, + }); + } + _addToTrailing() { + var _a; + // Resolve previous promise, and give up this task. + (_a = this._trailingResolve) === null || _a === void 0 ? void 0 : _a.call(this, this); + // Create new task. + this._trailing = true; + const promise = new Promise((resolve, reject) => { + this._trailingResolve = resolve; + this._trailingReject = reject; + }); + return promise; + } + _bindAutoFit() { + const options = this.options(); + const { autoFit } = options; + if (this._hasBindAutoFit) { + // If it was bind before, unbind it now. + if (!autoFit) + this._unbindAutoFit(); + return; + } + if (autoFit) { + this._hasBindAutoFit = true; + window.addEventListener('resize', this._onResize); + } + } + _unbindAutoFit() { + if (this._hasBindAutoFit) { + this._hasBindAutoFit = false; + window.removeEventListener('resize', this._onResize); + } + } +} +exports.Runtime = Runtime; +//# sourceMappingURL=runtime.js.map +}, function(modId) { var map = {"../runtime":1751263816081,"../utils/event":1751263816091,"../interaction/tooltip":1751263816131,"../interaction/utils":1751263816080,"./utils":1751263816196,"./composition":1751263816199,"./define":1751263816200,"./mark":1751263816202,"./library":1751263816194}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816196, function(require, module, exports) { + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createEmptyPromise = exports.updateRoot = exports.optionsOf = exports.sizeOf = exports.valueOf = exports.normalizeRoot = exports.removeContainer = exports.normalizeContainer = exports.MIN_CHART_HEIGHT = exports.MIN_CHART_WIDTH = exports.CALLBACK_NODE = exports.REMOVE_FLAG = exports.VIEW_KEYS = void 0; +const util_1 = require("@antv/util"); +const size_1 = require("../utils/size"); +const helper_1 = require("../utils/helper"); +const node_1 = require("./node"); +// Keys can specified by new Chart({...}). +// Keys can bubble form mark-level options to view-level options. +exports.VIEW_KEYS = [ + 'width', + 'height', + 'depth', + 'padding', + 'paddingLeft', + 'paddingRight', + 'paddingBottom', + 'paddingTop', + 'inset', + 'insetLeft', + 'insetRight', + 'insetTop', + 'insetBottom', + 'margin', + 'marginLeft', + 'marginRight', + 'marginTop', + 'marginBottom', + 'autoFit', + 'theme', + 'title', + 'interaction', +]; +exports.REMOVE_FLAG = '__remove__'; +exports.CALLBACK_NODE = '__callback__'; +/** Minimum chart width */ +exports.MIN_CHART_WIDTH = 1; +/** Minimum chart height */ +exports.MIN_CHART_HEIGHT = 1; +function normalizeContainer(container) { + if (container === undefined) { + const container = document.createElement('div'); + container[exports.REMOVE_FLAG] = true; + return container; + } + if (typeof container === 'string') { + const node = document.getElementById(container); + return node; + } + return container; +} +exports.normalizeContainer = normalizeContainer; +function removeContainer(container) { + const parent = container.parentNode; + if (parent) { + parent.removeChild(container); + } +} +exports.removeContainer = removeContainer; +function normalizeRoot(node) { + if (node.type !== null) + return node; + const root = node.children[node.children.length - 1]; + for (const key of exports.VIEW_KEYS) + root.attr(key, node.attr(key)); + return root; +} +exports.normalizeRoot = normalizeRoot; +function valueOf(node) { + return Object.assign(Object.assign({}, node.value), { type: node.type }); +} +exports.valueOf = valueOf; +function sizeOf(options, container) { + const { width, height, autoFit, depth = 0 } = options; + let effectiveWidth = 640; + let effectiveHeight = 480; + if (autoFit) { + const { width: containerWidth, height: containerHeight } = (0, size_1.getContainerSize)(container); + effectiveWidth = containerWidth || effectiveWidth; + effectiveHeight = containerHeight || effectiveHeight; + } + effectiveWidth = width || effectiveWidth; + effectiveHeight = height || effectiveHeight; + return { + width: Math.max((0, util_1.isNumber)(effectiveWidth) ? effectiveWidth : exports.MIN_CHART_WIDTH, exports.MIN_CHART_WIDTH), + height: Math.max((0, util_1.isNumber)(effectiveHeight) ? effectiveHeight : exports.MIN_CHART_HEIGHT, exports.MIN_CHART_HEIGHT), + depth, + }; +} +exports.sizeOf = sizeOf; +function optionsOf(node) { + const root = normalizeRoot(node); + const discovered = [root]; + const nodeValue = new Map(); + nodeValue.set(root, valueOf(root)); + while (discovered.length) { + const node = discovered.pop(); + const value = nodeValue.get(node); + const { children = [] } = node; + for (const child of children) { + if (child.type === exports.CALLBACK_NODE) { + value.children = child.value; + } + else { + const childValue = valueOf(child); + const { children = [] } = value; + children.push(childValue); + discovered.push(child); + nodeValue.set(child, childValue); + value.children = children; + } + } + } + return nodeValue.get(root); +} +exports.optionsOf = optionsOf; +function isMark(type, mark) { + if (typeof type === 'function') + return true; + return new Set(Object.keys(mark)).has(type); +} +function isComposition(type, composition) { + return (typeof type !== 'function' && new Set(Object.keys(composition)).has(type)); +} +function normalizeRootOptions(node, options, previousType, marks, composition) { + const { type: oldType } = node; + const { type = previousType || oldType } = options; + if (isComposition(type, composition)) { + for (const key of exports.VIEW_KEYS) { + if (node.attr(key) !== undefined && options[key] === undefined) { + options[key] = node.attr(key); + } + } + return options; + } + if (isMark(type, marks)) { + const view = { type: 'view' }; + const mark = Object.assign({}, options); + for (const key of exports.VIEW_KEYS) { + if (mark[key] !== undefined) { + view[key] = mark[key]; + delete mark[key]; + } + } + return Object.assign(Object.assign({}, view), { children: [mark] }); + } + return options; +} +function typeCtor(type, mark, composition) { + if (typeof type === 'function') + return mark.mark; + const node = Object.assign(Object.assign({}, mark), composition); + const ctor = node[type]; + if (!ctor) + throw new Error(`Unknown mark: ${type}.`); + return ctor; +} +// Create node from options. +function createNode(options, mark, composition) { + if (typeof options === 'function') { + const node = new node_1.Node(); + node.value = options; + node.type = exports.CALLBACK_NODE; + return node; + } + const { type, children } = options, value = __rest(options, ["type", "children"]); + const Ctor = typeCtor(type, mark, composition); + const node = new Ctor(); + node.value = value; + // @ts-ignore + node.type = type; + return node; +} +// Update node by options. +function updateNode(node, newOptions) { + const { type, children } = newOptions, value = __rest(newOptions, ["type", "children"]); + if (node.type === type || type === undefined) { + // Update node. + (0, helper_1.deepAssign)(node.value, value); + } + else if (typeof type === 'string') { + // Transform node. + node.type = type; + node.value = value; + } +} +// Create a nested node tree from newOptions, and append it to the parent. +function appendNode(parent, newOptions, mark, composition) { + if (!parent) + return; + const discovered = [[parent, newOptions]]; + while (discovered.length) { + const [parent, nodeOptions] = discovered.shift(); + const node = createNode(nodeOptions, mark, composition); + if (Array.isArray(parent.children)) + parent.push(node); + const { children } = nodeOptions; + if (Array.isArray(children)) { + for (const child of children) { + discovered.push([node, child]); + } + } + else if (typeof children === 'function') { + discovered.push([node, children]); + } + } +} +// Update node tree from options. +function updateRoot(node, options, definedType, mark, composition) { + const rootOptions = normalizeRootOptions(node, options, definedType, mark, composition); + const discovered = [[null, node, rootOptions]]; + while (discovered.length) { + const [parent, oldNode, newNode] = discovered.shift(); + // If there is no oldNode, create a node tree directly. + if (!oldNode) { + appendNode(parent, newNode, mark, composition); + } + else if (!newNode) { + oldNode.remove(); + } + else { + updateNode(oldNode, newNode); + const { children: newChildren } = newNode; + const { children: oldChildren } = oldNode; + if (Array.isArray(newChildren) && Array.isArray(oldChildren)) { + // Only update node specified in newChildren, + // the extra oldChildren will remain still. + const n = Math.max(newChildren.length, oldChildren.length); + for (let i = 0; i < n; i++) { + const newChild = newChildren[i]; + const oldChild = oldChildren[i]; + discovered.push([oldNode, oldChild, newChild]); + } + } + else if (typeof newChildren === 'function') { + discovered.push([oldNode, null, newChildren]); + } + } + } +} +exports.updateRoot = updateRoot; +function createEmptyPromise() { + let reject; + let resolve; + const cloned = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return [cloned, resolve, reject]; +} +exports.createEmptyPromise = createEmptyPromise; +//# sourceMappingURL=utils.js.map +}, function(modId) { var map = {"../utils/size":1751263816197,"../utils/helper":1751263815829,"./node":1751263816198}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816197, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getBBoxSize = exports.getContainerSize = void 0; +const parseInt10 = (d) => (d ? parseInt(d) : 0); +/** + * @description Get the element's bounding size. + * @param container dom element. + * @returns the element width and height + */ +function getContainerSize(container) { + // size = width/height - padding. + const style = getComputedStyle(container); + const wrapperWidth = container.clientWidth || parseInt10(style.width); + const wrapperHeight = container.clientHeight || parseInt10(style.height); + const widthPadding = parseInt10(style.paddingLeft) + parseInt10(style.paddingRight); + const heightPadding = parseInt10(style.paddingTop) + parseInt10(style.paddingBottom); + return { + width: wrapperWidth - widthPadding, + height: wrapperHeight - heightPadding, + }; +} +exports.getContainerSize = getContainerSize; +/** + * @description Calculate the real canvas size by view options. + */ +function getBBoxSize(options) { + const { height, width, padding = 0, paddingLeft = padding, paddingRight = padding, paddingTop = padding, paddingBottom = padding, margin = 0, marginLeft = margin, marginRight = margin, marginTop = margin, marginBottom = margin, inset = 0, insetLeft = inset, insetRight = inset, insetTop = inset, insetBottom = inset, } = options; + // @todo Add this padding to theme. + // 30 is default size for padding, which defined in runtime. + const maybeAuto = (padding) => (padding === 'auto' ? 20 : padding); + const finalWidth = width - + maybeAuto(paddingLeft) - + maybeAuto(paddingRight) - + marginLeft - + marginRight - + insetLeft - + insetRight; + const finalHeight = height - + maybeAuto(paddingTop) - + maybeAuto(paddingBottom) - + marginTop - + marginBottom - + insetTop - + insetBottom; + return { width: finalWidth, height: finalHeight }; +} +exports.getBBoxSize = getBBoxSize; +//# sourceMappingURL=size.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816198, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Node = void 0; +/** + * BFS nodes and execute callback. + */ +function bfs(node, callback) { + const discovered = [node]; + while (discovered.length) { + const currentNode = discovered.shift(); + callback && callback(currentNode); + const children = currentNode.children || []; + for (const child of children) { + discovered.push(child); + } + } +} +/** + * Hierarchy container. + */ +class Node { + constructor(value = {}, type) { + // The parent node. + this.parentNode = null; + // The children nodes. + this.children = []; + // The index of parent children. + this.index = 0; + this.type = type; + this.value = value; + } + /** + * Apply specified transform to current value. Mount the node + * to replace the original one in the tree and then return it. + */ + map(transform = (x) => x) { + const newValue = transform(this.value); + this.value = newValue; + return this; + } + /** + * Set or get the specified attribute. It the value is specified, update + * the attribute of current value and return the node. Otherwise + * return the the attribute of current value. + */ + attr(key, value) { + if (arguments.length === 1) + return this.value[key]; + return this.map((v) => ((v[key] = value), v)); + } + /** + * Create a new node and append to children nodes. + */ + append(Ctor) { + const node = new Ctor({}); + node.children = []; + this.push(node); + return node; + } + push(node) { + node.parentNode = this; + node.index = this.children.length; + this.children.push(node); + return this; + } + /** + * Remove current node from parentNode. + */ + remove() { + const parent = this.parentNode; + if (parent) { + const { children } = parent; + const index = children.findIndex((item) => item === this); + children.splice(index, 1); + } + return this; + } + getNodeByKey(key) { + let targetNode = null; + const callback = (node) => { + if (key === node.attr('key')) { + targetNode = node; + } + }; + bfs(this, callback); + return targetNode; + } + getNodesByType(type) { + const nodes = []; + const callback = (node) => { + if (type === node.type) { + nodes.push(node); + } + }; + bfs(this, callback); + return nodes; + } + getNodeByType(type) { + let node = null; + bfs(this, (current) => { + if (node) + return; + if (type === current.type) + node = current; + }); + return node; + } + /** + * Apply specified callback to the node value. + */ + call(callback, ...params) { + callback(this.map(), ...params); + return this; + } + getRoot() { + // Find the root chart and render. + let root = this; + while (root && root.parentNode) { + root = root.parentNode; + } + return root; + } +} +exports.Node = Node; +//# sourceMappingURL=node.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816199, function(require, module, exports) { + +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CompositionNode = void 0; +const style_1 = require("../utils/style"); +const node_1 = require("./node"); +const define_1 = require("./define"); +const props_1 = require("./props"); +let CompositionNode = class CompositionNode extends node_1.Node { + /** + * Change current node data and its children data. + */ + changeData(data) { + var _a; + const chart = this.getRoot(); + if (!chart) + return; + this.attr('data', data); + if ((_a = this.children) === null || _a === void 0 ? void 0 : _a.length) { + this.children.forEach((child) => { + child.attr('data', data); + }); + } + return chart === null || chart === void 0 ? void 0 : chart.render(); + } + /** + * Get view instance by key. + */ + getView() { + const chart = this.getRoot(); + const { views } = chart.getContext(); + if (!(views === null || views === void 0 ? void 0 : views.length)) + return undefined; + return views.find((view) => view.key === this._key); + } + getScale() { + var _a; + return (_a = this.getView()) === null || _a === void 0 ? void 0 : _a.scale; + } + getScaleByChannel(channel) { + const scale = this.getScale(); + if (scale) + return scale[channel]; + return; + } + getCoordinate() { + var _a; + return (_a = this.getView()) === null || _a === void 0 ? void 0 : _a.coordinate; + } + getTheme() { + var _a; + return (_a = this.getView()) === null || _a === void 0 ? void 0 : _a.theme; + } + getGroup() { + const key = this._key; + if (!key) + return undefined; + const chart = this.getRoot(); + const chartGroup = chart.getContext().canvas.getRoot(); + return chartGroup.getElementById(key); + } + /** + * Show the view. + */ + show() { + const group = this.getGroup(); + if (!group) + return; + !group.isVisible() && (0, style_1.show)(group); + } + /** + * Hide the view. + */ + hide() { + const group = this.getGroup(); + if (!group) + return; + group.isVisible() && (0, style_1.hide)(group); + } +}; +CompositionNode = __decorate([ + (0, define_1.defineProps)(props_1.compositionProps) +], CompositionNode); +exports.CompositionNode = CompositionNode; +//# sourceMappingURL=composition.js.map +}, function(modId) { var map = {"../utils/style":1751263816122,"./node":1751263816198,"./define":1751263816200,"./props":1751263816201}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816200, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.nodeProps = exports.defineProps = void 0; +const helper_1 = require("../utils/helper"); +function defineValueProp(Node, name, { key = name }) { + Node.prototype[name] = function (value) { + if (arguments.length === 0) + return this.attr(key); + return this.attr(key, value); + }; +} +function defineArrayProp(Node, name, { key = name }) { + Node.prototype[name] = function (value) { + if (arguments.length === 0) + return this.attr(key); + if (Array.isArray(value)) + return this.attr(key, value); + const array = [...(this.attr(key) || []), value]; + return this.attr(key, array); + }; +} +function defineObjectProp(Node, name, { key: k = name }) { + Node.prototype[name] = function (key, value) { + if (arguments.length === 0) + return this.attr(k); + if (arguments.length === 1 && typeof key !== 'string') { + return this.attr(k, key); + } + const obj = this.attr(k) || {}; + obj[key] = arguments.length === 1 ? true : value; + return this.attr(k, obj); + }; +} +function defineMixProp(Node, name, descriptor) { + Node.prototype[name] = function (key) { + if (arguments.length === 0) + return this.attr(name); + if (Array.isArray(key)) + return this.attr(name, { items: key }); + if ((0, helper_1.isStrictObject)(key) && + (key.title !== undefined || key.items !== undefined)) { + return this.attr(name, key); + } + if (key === null || key === false) + return this.attr(name, key); + const obj = this.attr(name) || {}; + const { items = [] } = obj; + items.push(key); + obj.items = items; + return this.attr(name, obj); + }; +} +function defineNodeProp(Node, name, { ctor }) { + Node.prototype[name] = function (hocMark) { + const node = this.append(ctor); + if (name === 'mark') { + node.type = hocMark; + } + return node; + }; +} +function defineContainerProp(Node, name, { ctor }) { + Node.prototype[name] = function () { + this.type = null; + return this.append(ctor); + }; +} +/** + * A decorator to define different type of attribute setter or + * getter for current node. + */ +function defineProps(descriptors) { + return (Node) => { + for (const [name, descriptor] of Object.entries(descriptors)) { + const { type } = descriptor; + if (type === 'value') + defineValueProp(Node, name, descriptor); + else if (type === 'array') + defineArrayProp(Node, name, descriptor); + else if (type === 'object') + defineObjectProp(Node, name, descriptor); + else if (type === 'node') + defineNodeProp(Node, name, descriptor); + else if (type === 'container') + defineContainerProp(Node, name, descriptor); + else if (type === 'mix') + defineMixProp(Node, name, descriptor); + } + return Node; + }; +} +exports.defineProps = defineProps; +function nodeProps(node) { + return Object.fromEntries(Object.entries(node).map(([name, ctor]) => [name, { type: 'node', ctor }])); +} +exports.nodeProps = nodeProps; +//# sourceMappingURL=define.js.map +}, function(modId) { var map = {"../utils/helper":1751263815829}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816201, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.compositionProps = exports.markProps = exports.commonProps = void 0; +exports.commonProps = { + encode: { type: 'object' }, + scale: { type: 'object' }, + data: { type: 'value' }, + transform: { type: 'array' }, + style: { type: 'object' }, + animate: { type: 'object' }, + coordinate: { type: 'object' }, + interaction: { type: 'object' }, + label: { type: 'array', key: 'labels' }, + axis: { type: 'object' }, + legend: { type: 'object' }, + slider: { type: 'object' }, + scrollbar: { type: 'object' }, + state: { type: 'object' }, + layout: { type: 'object' }, + theme: { type: 'object' }, + title: { type: 'value' }, +}; +exports.markProps = Object.assign(Object.assign({}, exports.commonProps), { tooltip: { type: 'mix' }, viewStyle: { type: 'object' } }); +exports.compositionProps = Object.assign(Object.assign({}, exports.commonProps), { labelTransform: { type: 'array' } }); +//# sourceMappingURL=props.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816202, function(require, module, exports) { + +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MarkNode = void 0; +const node_1 = require("./node"); +const define_1 = require("./define"); +const props_1 = require("./props"); +let MarkNode = class MarkNode extends node_1.Node { + changeData(data) { + const chart = this.getRoot(); + if (!chart) + return; + this.attr('data', data); + return chart === null || chart === void 0 ? void 0 : chart.render(); + } + /** + * Get mark from chart views. + */ + getMark() { + var _a; + const chartView = (_a = this.getRoot()) === null || _a === void 0 ? void 0 : _a.getView(); + if (!chartView) + return undefined; + const { markState } = chartView; + const markKey = Array.from(markState.keys()).find((item) => item.key === this.attr('key')); + return markState.get(markKey); + } + /** + * Get all scales instance. + */ + getScale() { + var _a; + const chartView = (_a = this.getRoot()) === null || _a === void 0 ? void 0 : _a.getView(); + if (!chartView) + return undefined; + return chartView === null || chartView === void 0 ? void 0 : chartView.scale; + } + /** + * Get the scale instance by channel. + */ + getScaleByChannel(channel) { + var _a, _b; + const chartView = (_a = this.getRoot()) === null || _a === void 0 ? void 0 : _a.getView(); + if (!chartView) + return undefined; + return (_b = chartView === null || chartView === void 0 ? void 0 : chartView.scale) === null || _b === void 0 ? void 0 : _b[channel]; + } + /** + * Get canvas group. + */ + getGroup() { + const key = this.attr('key'); + if (!key) + return undefined; + const chart = this.getRoot(); + const chartGroup = chart.getContext().canvas.getRoot(); + return chartGroup.getElementById(key); + } +}; +MarkNode = __decorate([ + (0, define_1.defineProps)(props_1.markProps) +], MarkNode); +exports.MarkNode = MarkNode; +//# sourceMappingURL=mark.js.map +}, function(modId) { var map = {"./node":1751263816198,"./define":1751263816200,"./props":1751263816201}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816203, function(require, module, exports) { + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ClassicDark = exports.Classic = exports.Academy = exports.Dark = exports.Light = exports.LinearAxis = exports.selectPlotArea = exports.selectG2Elements = exports.seriesOf = exports.dataOf = exports.Selection = exports.select = exports.ChartEvent = exports.extend = exports.Runtime = exports.register = exports.MASK_CLASS_NAME = exports.AREA_CLASS_NAME = exports.LABEL_CLASS_NAME = exports.COMPONENT_CLASS_NAME = exports.PLOT_CLASS_NAME = exports.VIEW_CLASS_NAME = exports.ELEMENT_CLASS_NAME = exports.LABEL_LAYER_CLASS_NAME = exports.MAIN_LAYER_CLASS_NAME = exports.renderToMountedElement = exports.render = void 0; +var runtime_1 = require("./runtime"); +Object.defineProperty(exports, "render", { enumerable: true, get: function () { return runtime_1.render; } }); +Object.defineProperty(exports, "renderToMountedElement", { enumerable: true, get: function () { return runtime_1.renderToMountedElement; } }); +Object.defineProperty(exports, "MAIN_LAYER_CLASS_NAME", { enumerable: true, get: function () { return runtime_1.MAIN_LAYER_CLASS_NAME; } }); +Object.defineProperty(exports, "LABEL_LAYER_CLASS_NAME", { enumerable: true, get: function () { return runtime_1.LABEL_LAYER_CLASS_NAME; } }); +Object.defineProperty(exports, "ELEMENT_CLASS_NAME", { enumerable: true, get: function () { return runtime_1.ELEMENT_CLASS_NAME; } }); +Object.defineProperty(exports, "VIEW_CLASS_NAME", { enumerable: true, get: function () { return runtime_1.VIEW_CLASS_NAME; } }); +Object.defineProperty(exports, "PLOT_CLASS_NAME", { enumerable: true, get: function () { return runtime_1.PLOT_CLASS_NAME; } }); +Object.defineProperty(exports, "COMPONENT_CLASS_NAME", { enumerable: true, get: function () { return runtime_1.COMPONENT_CLASS_NAME; } }); +Object.defineProperty(exports, "LABEL_CLASS_NAME", { enumerable: true, get: function () { return runtime_1.LABEL_CLASS_NAME; } }); +Object.defineProperty(exports, "AREA_CLASS_NAME", { enumerable: true, get: function () { return runtime_1.AREA_CLASS_NAME; } }); +Object.defineProperty(exports, "MASK_CLASS_NAME", { enumerable: true, get: function () { return runtime_1.MASK_CLASS_NAME; } }); +var api_1 = require("./api"); +Object.defineProperty(exports, "register", { enumerable: true, get: function () { return api_1.register; } }); +Object.defineProperty(exports, "Runtime", { enumerable: true, get: function () { return api_1.Runtime; } }); +Object.defineProperty(exports, "extend", { enumerable: true, get: function () { return api_1.extend; } }); +var event_1 = require("./utils/event"); +Object.defineProperty(exports, "ChartEvent", { enumerable: true, get: function () { return event_1.ChartEvent; } }); +__exportStar(require("./spec"), exports); +var selection_1 = require("./utils/selection"); +Object.defineProperty(exports, "select", { enumerable: true, get: function () { return selection_1.select; } }); +Object.defineProperty(exports, "Selection", { enumerable: true, get: function () { return selection_1.Selection; } }); +var helper_1 = require("./utils/helper"); +Object.defineProperty(exports, "dataOf", { enumerable: true, get: function () { return helper_1.dataOf; } }); +Object.defineProperty(exports, "seriesOf", { enumerable: true, get: function () { return helper_1.seriesOf; } }); +var utils_1 = require("./interaction/utils"); +Object.defineProperty(exports, "selectG2Elements", { enumerable: true, get: function () { return utils_1.selectG2Elements; } }); +Object.defineProperty(exports, "selectPlotArea", { enumerable: true, get: function () { return utils_1.selectPlotArea; } }); +__exportStar(require("./transform"), exports); +var axis_1 = require("./component/axis"); +Object.defineProperty(exports, "LinearAxis", { enumerable: true, get: function () { return axis_1.LinearAxis; } }); +var theme_1 = require("./theme"); +Object.defineProperty(exports, "Light", { enumerable: true, get: function () { return theme_1.Light; } }); +Object.defineProperty(exports, "Dark", { enumerable: true, get: function () { return theme_1.Dark; } }); +Object.defineProperty(exports, "Academy", { enumerable: true, get: function () { return theme_1.Academy; } }); +Object.defineProperty(exports, "Classic", { enumerable: true, get: function () { return theme_1.Classic; } }); +Object.defineProperty(exports, "ClassicDark", { enumerable: true, get: function () { return theme_1.ClassicDark; } }); +//# sourceMappingURL=exports.js.map +}, function(modId) { var map = {"./runtime":1751263816081,"./api":1751263816191,"./utils/event":1751263816091,"./spec":1751263816204,"./utils/selection":1751263815883,"./utils/helper":1751263815829,"./interaction/utils":1751263816080,"./transform":1751263815823,"./component/axis":1751263816044,"./theme":1751263816036}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816204, function(require, module, exports) { + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./animate"), exports); +__exportStar(require("./component"), exports); +__exportStar(require("./composition"), exports); +__exportStar(require("./coordinate"), exports); +__exportStar(require("./coordinateTransform"), exports); +__exportStar(require("./data"), exports); +__exportStar(require("./dataTransform"), exports); +__exportStar(require("./encode"), exports); +__exportStar(require("./interaction"), exports); +__exportStar(require("./labelTransform"), exports); +__exportStar(require("./mark"), exports); +__exportStar(require("./scale"), exports); +__exportStar(require("./palette"), exports); +__exportStar(require("./theme"), exports); +__exportStar(require("./transform"), exports); +//# sourceMappingURL=index.js.map +}, function(modId) { var map = {"./animate":1751263816205,"./component":1751263816206,"./composition":1751263816207,"./coordinate":1751263816208,"./coordinateTransform":1751263816209,"./data":1751263816210,"./dataTransform":1751263816211,"./encode":1751263816212,"./interaction":1751263816213,"./labelTransform":1751263816214,"./mark":1751263816215,"./scale":1751263816216,"./palette":1751263816217,"./theme":1751263816218,"./transform":1751263816219}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816205, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=animate.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816206, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=component.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816207, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=composition.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816208, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=coordinate.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816209, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=coordinateTransform.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816210, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816211, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=dataTransform.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816212, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=encode.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816213, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=interaction.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816214, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=labelTransform.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816215, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=mark.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816216, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=scale.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816217, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=palette.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816218, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=theme.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816219, function(require, module, exports) { + +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=transform.js.map +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +return __REQUIRE__(1751263815802); +})() +//miniprogram-npm-outsideDeps=["@antv/util","@antv/vendor/d3-array","@antv/scale","@antv/vendor/d3-shape","@antv/g","@antv/vendor/d3-path","@antv/component","flru","@antv/vendor/d3-hierarchy","@antv/vendor/d3-force","@antv/vendor/d3-format","@antv/g-canvas","@antv/g-plugin-dragndrop","@antv/event-emitter","@antv/expr","@antv/coord","@antv/vendor/d3-geo","@antv/vendor/d3-scale-chromatic","@antv/vendor/d3-dsv","pdfast"] +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/miniprogram_npm/@antv/g2/index.js.map b/miniprogram_npm/@antv/g2/index.js.map new file mode 100644 index 0000000..8c9689d --- /dev/null +++ b/miniprogram_npm/@antv/g2/index.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["index.js","lib/index.js","lib/core.js","coordinate/index.js","coordinate/cartesian.js","coordinate/polar.js","utils/angle.js","coordinate/helix.js","coordinate/transpose.js","coordinate/theta.js","coordinate/radial.js","coordinate/parallel.js","coordinate/fisheye.js","coordinate/radar.js","encode/index.js","encode/constant.js","encode/transform.js","encode/field.js","encode/column.js","mark/index.js","mark/interval.js","transform/index.js","transform/maybeZeroY1.js","transform/utils/helper.js","transform/maybeStackY.js","transform/stackY.js","transform/utils/order.js","utils/helper.js","utils/array.js","transform/maybeTitle.js","utils/dateFormat.js","transform/maybeZeroX.js","transform/maybeZeroY.js","transform/maybeZeroZ.js","transform/maybeSize.js","transform/maybeKey.js","transform/maybeSeries.js","transform/maybeTupleY.js","transform/maybeTupleX.js","transform/maybeIdentityY.js","transform/maybeIdentityX.js","transform/maybeDefaultX.js","transform/maybeDefaultY.js","transform/maybeTooltip.js","transform/maybeZeroPadding.js","transform/maybeVisualPosition.js","transform/maybeFunctionAttribute.js","transform/maybeTuple.js","transform/maybeGradient.js","transform/dodgeX.js","transform/stackEnter.js","transform/normalizeY.js","transform/jitter.js","transform/jitterX.js","transform/jitterY.js","transform/symmetryY.js","transform/diffY.js","transform/select.js","transform/selectX.js","transform/selectY.js","transform/groupX.js","transform/group.js","transform/groupN.js","transform/groupY.js","transform/groupColor.js","transform/sortX.js","transform/sort.js","transform/sortColor.js","transform/sortY.js","transform/flexX.js","transform/pack.js","utils/vector.js","transform/binX.js","transform/bin.js","transform/sample.js","transform/utils/lttb.js","transform/filter.js","shape/index.js","shape/interval/rect.js","shape/interval/color.js","utils/coordinate.js","utils/selection.js","utils/number.js","shape/utils.js","shape/interval/hollow.js","shape/interval/funnel.js","shape/interval/pyramid.js","shape/line/line.js","shape/line/curve.js","utils/createElement.js","shape/line/smooth.js","shape/line/hv.js","shape/line/vh.js","shape/line/hvh.js","shape/line/trail.js","shape/point/hollowBowtie.js","shape/point/color.js","utils/marker.js","utils/string.js","shape/point/hollowDiamond.js","shape/point/hollowHexagon.js","shape/point/hollow.js","shape/point/hollowSquare.js","shape/point/hollowTriangle.js","shape/point/hollowTriangleDown.js","shape/point/hollowCircle.js","shape/point/circle.js","shape/point/bowtie.js","shape/point/cross.js","shape/point/diamond.js","shape/point/hexagon.js","shape/point/hyphen.js","shape/point/line.js","shape/point/plus.js","shape/point/point.js","shape/point/square.js","shape/point/tick.js","shape/point/triangle.js","shape/point/triangleDown.js","shape/vector/vector.js","shape/text/text.js","shape/text/advance.js","shape/text/badge.js","shape/text/tag.js","shape/area/area.js","shape/area/curve.js","shape/area/smooth.js","shape/area/hvh.js","shape/area/vh.js","shape/area/hv.js","shape/link/link.js","shape/link/smooth.js","shape/link/vhv.js","shape/link/arc.js","shape/image/image.js","mark/utils.js","shape/polygon/polygon.js","shape/polygon/ribbon.js","shape/box/box.js","shape/box/violin.js","shape/lineXY/line.js","shape/connector/connector.js","shape/label/label.js","shape/label/position/index.js","shape/label/position/area.js","shape/label/position/bottom.js","shape/label/position/default.js","shape/label/position/bottomLeft.js","shape/label/position/bottomRight.js","shape/label/position/inside.js","shape/label/position/left.js","shape/label/position/outside.js","shape/label/position/right.js","shape/label/position/spider.js","shape/label/position/utils.js","shape/label/position/surround.js","shape/label/position/top.js","shape/label/position/topLeft.js","shape/label/position/topRight.js","shape/path/path.js","shape/path/color.js","shape/path/hollow.js","shape/density/density.js","shape/heatmap/heatmap.js","shape/heatmap/renderer/index.js","utils/lru.js","shape/heatmap/renderer/gradient.js","shape/shape/shape.js","shape/liquid/liquid.js","shape/liquid/wave.js","shape/liquid/shapes.js","shape/gauge/round.js","mark/rect.js","mark/line.js","mark/point.js","mark/text.js","mark/cell.js","mark/area.js","mark/link.js","mark/image.js","mark/polygon.js","mark/box.js","mark/vector.js","mark/lineY.js","mark/lineX.js","mark/connector.js","mark/range.js","mark/rangeX.js","mark/rangeY.js","mark/sankey.js","data/sankey.js","data/utils/d3-sankey/index.js","data/utils/d3-sankey/sankey.js","data/utils/d3-sankey/align.js","data/utils/d3-sankey/constant.js","utils/mark.js","mark/chord.js","data/arc.js","data/utils/arc/index.js","data/utils/arc/arc.js","data/utils/arc/sort.js","mark/path.js","mark/treemap.js","utils/treeDataTransform.js","mark/pack.js","mark/boxplot.js","mark/shape.js","mark/forceGraph.js","mark/tree.js","data/tree.js","data/cluster.js","mark/wordCloud.js","mark/gauge.js","mark/density.js","mark/heatmap.js","mark/liquid.js","palette/index.js","palette/category10.js","palette/category20.js","scale/index.js","scale/band.js","scale/linear.js","scale/ordinal.js","scale/identity.js","scale/point.js","scale/time.js","scale/log.js","scale/pow.js","scale/threshold.js","scale/quantile.js","scale/quantize.js","scale/sqrt.js","scale/sequential.js","scale/constant.js","theme/index.js","theme/classic.js","theme/light.js","theme/create.js","theme/classicDark.js","theme/dark.js","theme/academy.js","component/index.js","component/axis.js","component/utils.js","component/axisX.js","component/axisY.js","component/axisRadar.js","component/legendCategory.js","component/legendContinuous.js","component/legendContinuousBlock.js","component/legendContinuousBlockSize.js","component/legendContinuousSize.js","component/title.js","component/sliderX.js","component/slider.js","utils/scale.js","component/sliderY.js","component/scrollbarX.js","component/scrollbar.js","component/scrollbarY.js","component/legends.js","animation/index.js","animation/scaleInX.js","animation/scaleOutX.js","animation/scaleInY.js","animation/scaleOutY.js","animation/fadeIn.js","animation/fadeOut.js","animation/morphing.js","animation/utils.js","animation/waveIn.js","animation/zoomIn.js","animation/zoomOut.js","animation/pathIn.js","animation/growInX.js","animation/growInY.js","interaction/index.js","interaction/elementHighlight.js","interaction/utils.js","runtime/index.js","runtime/constant.js","runtime/types/common.js","runtime/types/component.js","runtime/types/options.js","runtime/types/transform.js","runtime/types/encode.js","runtime/types/mark.js","runtime/types/data.js","runtime/render.js","utils/event.js","utils/expr.js","runtime/plot.js","runtime/component.js","component/constant.js","runtime/coordinate.js","runtime/library.js","lib/builtinlib.js","composition/index.js","composition/spaceLayer.js","composition/utils.js","composition/spaceFlex.js","composition/view.js","composition/mark.js","composition/facetRect.js","utils/container.js","composition/repeatMatrix.js","composition/facetCircle.js","composition/timingKeyframe.js","composition/geoPath.js","composition/geoView.js","composition/d3Projection.js","interaction/event.js","runtime/scale.js","runtime/types/scale.js","runtime/layout.js","runtime/mark.js","runtime/transform.js","runtime/option-preprocess/index.js","utils/flow.js","runtime/option-preprocess/style.js","utils/style.js","utils/traverse-elements.js","interaction/elementHighlightByX.js","interaction/elementHighlightByColor.js","interaction/elementSelect.js","interaction/elementSelectByX.js","interaction/elementSelectByColor.js","interaction/chartIndex.js","interaction/fisheye.js","interaction/tooltip.js","interaction/legendFilter.js","interaction/legendHighlight.js","interaction/brushHighlight.js","interaction/brushXHighlight.js","interaction/brushYHighlight.js","interaction/brushAxisHighlight.js","interaction/brushFilter.js","interaction/brushXFilter.js","interaction/brushYFilter.js","interaction/sliderFilter.js","interaction/scrollbarFilter.js","interaction/poptip.js","interaction/treemapDrillDown.js","interaction/elementPointMove.js","data/index.js","data/fetch.js","data/fold.js","data/filter.js","data/sort.js","data/pick.js","data/rename.js","data/sortBy.js","data/utils/fields.js","data/inline.js","data/custom.js","data/map.js","data/wordCloud.js","data/utils/flow.js","data/utils/d3-cloud/index.js","data/join.js","data/slice.js","data/kde.js","data/venn.js","data/utils/venn/index.js","data/utils/venn/layout.js","data/utils/venn/fmin/index.js","data/utils/venn/fmin/bisect.js","data/utils/venn/fmin/nelderMead.js","data/utils/venn/fmin/blas1.js","data/utils/venn/fmin/conjugateGradient.js","data/utils/venn/fmin/linesearch.js","data/utils/venn/fmin/gradientDescent.js","data/utils/venn/circleintersection.js","data/utils/venn/diagram.js","data/log.js","data/ema.js","label-transform/index.js","label-transform/overlapHide.js","utils/bounds.js","label-transform/overlapDodgeY.js","label-transform/contrastReverse.js","utils/color.js","label-transform/overflowHide.js","label-transform/exceedAdjust.js","lib/geo.js","lib/graph.js","lib/plot.js","lib/std.js","lib/lite.js","api/index.js","api/chart.js","api/extend.js","api/library.js","api/runtime.js","api/utils.js","utils/size.js","api/node.js","api/composition.js","api/define.js","api/props.js","api/mark.js","exports.js","spec/index.js","spec/animate.js","spec/component.js","spec/composition.js","spec/coordinate.js","spec/coordinateTransform.js","spec/data.js","spec/dataTransform.js","spec/encode.js","spec/interaction.js","spec/labelTransform.js","spec/mark.js","spec/scale.js","spec/palette.js","spec/theme.js","spec/transform.js"],"names":[],"mappings":";;;;;;;AAAA;AACA;AACA;AACA,ACHA;ADIA,ACHA;ADIA,ACHA;ADIA,AENA,ADGA;ADIA,AENA,ADGA;ADIA,AENA,ADGA;AELA,AHSA,AENA,ADGA;AELA,AHSA,AENA,ADGA;AELA,AHSA,AENA,ADGA;AGRA,ADGA,AHSA,AENA,ADGA;AGRA,ADGA,AHSA,AENA,ADGA;AGRA,ADGA,AHSA,AENA,ADGA;AGRA,ADGA,AENA,ALeA,AENA,ADGA;AGRA,ADGA,AENA,ALeA,AENA,ADGA;AGRA,ADGA,AENA,ALeA,AENA,ADGA;AGRA,ADGA,AENA,ALeA,AENA,ADGA,AKfA;AFOA,ADGA,AENA,ALeA,AENA,AIZA;AFOA,ADGA,AENA,ALeA,AENA,AIZA;AFOA,AGTA,AJYA,AENA,ALeA,AENA,AIZA;ACFA,AJYA,AENA,ALeA,AENA,AIZA;ACFA,AJYA,AENA,ALeA,AENA,AIZA;ACFA,AJYA,AENA,AGTA,ARwBA,AENA,AIZA;ACFA,AJYA,AENA,AGTA,ARwBA,AENA,AIZA;ACFA,AJYA,AENA,AGTA,ARwBA,AENA,AIZA;ACFA,AJYA,AENA,AIZA,ADGA,ARwBA,AENA,AIZA;ACFA,AJYA,AENA,AIZA,ADGA,ARwBA,AENA,AIZA;ACFA,AJYA,AENA,AIZA,ADGA,ARwBA,AENA,AIZA;ACFA,AJYA,AENA,AKfA,ADGA,ADGA,ARwBA,AENA,AIZA;ACFA,AJYA,AENA,AKfA,ADGA,ADGA,ARwBA,AENA,AIZA;ACFA,AJYA,AENA,AKfA,ADGA,ADGA,ANkBA,AIZA;ACFA,AJYA,AQxBA,ANkBA,AKfA,ADGA,ADGA,ANkBA,AIZA;ACFA,AIZA,ANkBA,AKfA,ADGA,ADGA,ANkBA,AIZA;ACFA,AIZA,ANkBA,AKfA,ADGA,ADGA,ANkBA,AIZA;AMjBA,ADGA,ANkBA,AKfA,ADGA,ADGA,ANkBA,AIZA;AMjBA,ADGA,ANkBA,AKfA,ADGA,ADGA,ANkBA,AIZA;AMjBA,ADGA,ANkBA,AKfA,ADGA,ADGA,ANkBA,AIZA;AMjBA,ADGA,ANkBA,AQxBA,AHSA,ADGA,APqBA,AIZA;AMjBA,ADGA,ANkBA,AQxBA,AHSA,ADGA,APqBA,AIZA;AMjBA,ADGA,ANkBA,AQxBA,AHSA,ADGA,APqBA,AIZA;AMjBA,ADGA,ANkBA,AQxBA,AHSA,ADGA,AKfA,AZoCA,AIZA;AMjBA,APqBA,AQxBA,AHSA,ADGA,AKfA,AZoCA,AIZA;AMjBA,APqBA,AQxBA,AHSA,ADGA,AKfA,AZoCA,AIZA;AMjBA,APqBA,AQxBA,AHSA,ADGA,AMlBA,ADGA,AZoCA,AIZA;AOpBA,AHSA,ADGA,AMlBA,ADGA,AZoCA,AIZA;AOpBA,AHSA,ADGA,AMlBA,ADGA,AZoCA,AIZA;AOpBA,AHSA,ADGA,AMlBA,ADGA,AENA,Ad0CA,AIZA;AOpBA,AHSA,ADGA,AMlBA,ADGA,AENA,Ad0CA;AWhCA,AHSA,ADGA,AMlBA,ADGA,AENA,Ad0CA;AWhCA,AHSA,ADGA,AMlBA,AENA,AHSA,AENA,Ad0CA;AWhCA,AHSA,ADGA,AMlBA,AENA,AHSA,AENA,Ad0CA;AWhCA,AHSA,ADGA,AMlBA,AENA,AHSA,AENA,Ad0CA;AWhCA,AHSA,ADGA,AS3BA,AHSA,AENA,ADGA,Ad0CA;AWhCA,AHSA,AQxBA,AHSA,AENA,ADGA,Ad0CA;AWhCA,AHSA,AQxBA,AHSA,AENA,ADGA,Ad0CA;AQvBA,AQxBA,ADGA,ADGA,Ad0CA,AiBnDA;AT4BA,AQxBA,ADGA,ADGA,Ad0CA,AiBnDA;AT4BA,AQxBA,ADGA,ADGA,Ad0CA,AiBnDA;ADIA,ADGA,ADGA,Ad0CA,AiBnDA,ACHA;AFOA,ADGA,ADGA,Ad0CA,AiBnDA,ACHA;AFOA,ADGA,Af6CA,AiBnDA,ACHA;AFOA,AhBgDA,AiBnDA,ACHA,ACHA;AHUA,AhBgDA,AiBnDA,ACHA,ACHA;AHUA,AhBgDA,AiBnDA,ACHA,ACHA;AnB0DA,AiBnDA,ACHA,ACHA,ACHA;ApB6DA,AiBnDA,ACHA,ACHA,ACHA;ApB6DA,AiBnDA,ACHA,ACHA,ACHA;ApB6DA,AiBnDA,ACHA,ACHA,ACHA,ACHA;ArBgEA,AiBnDA,ACHA,ACHA,ACHA,ACHA;ArBgEA,AiBnDA,ACHA,ACHA,ACHA,ACHA;ArBgEA,AiBnDA,ACHA,ACHA,AGTA,AFMA,ACHA;ArBgEA,AiBnDA,ACHA,ACHA,AGTA,AFMA,ACHA;ArBgEA,AiBnDA,ACHA,ACHA,AGTA,AFMA,ACHA;ArBgEA,AiBnDA,ACHA,ACHA,AGTA,AFMA,AGTA,AFMA;ArBgEA,AiBnDA,ACHA,ACHA,AGTA,AFMA,AGTA,AFMA;ArBgEA,AiBnDA,ACHA,ACHA,AGTA,AFMA,AGTA,AFMA;ArBgEA,AiBnDA,ACHA,ACHA,AGTA,AFMA,AGTA,AFMA,AGTA;AxByEA,AiBnDA,ACHA,ACHA,AGTA,AFMA,AGTA,AFMA,AGTA;AxByEA,AiBnDA,ACHA,ACHA,AGTA,AFMA,AGTA,AFMA,AGTA;AxByEA,AiBnDA,ACHA,ACHA,AGTA,AFMA,AGTA,AFMA,AGTA,ACHA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AFMA,AGTA,AFMA,AGTA,ACHA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AFMA,AGTA,AFMA,AGTA,ACHA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AFMA,AGTA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AFMA,AGTA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AFMA,AGTA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AKfA,APqBA,AGTA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AKfA,APqBA,AGTA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AKfA,APqBA,AGTA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AKfA,APqBA,AGTA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AKfA,AJYA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AKfA,AJYA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AKfA,AENA,ANkBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AKfA,AENA,ANkBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AKfA,AENA,ANkBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AKfA,AENA,ACHA,APqBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AKfA,AENA,ACHA,APqBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AKfA,AENA,ACHA,APqBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AKfA,AENA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AKfA,AENA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,AGTA,AKfA,AENA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,AavCA,AV8BA,AKfA,AENA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,AavCA,AV8BA,AKfA,AENA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,AavCA,AV8BA,AKfA,AENA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,Ac1CA,ADGA,AV8BA,AKfA,AENA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,Ac1CA,ADGA,ALeA,AENA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,Ac1CA,ADGA,ALeA,AENA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,Ac1CA,ACHA,AFMA,ALeA,AENA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,Ac1CA,ACHA,AFMA,ALeA,AENA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,Ac1CA,ACHA,AFMA,ALeA,AENA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,Ac1CA,ACHA,AFMA,ALeA,AQxBA,ANkBA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,AENA,AHSA;AzB4EA,AiBnDA,ACHA,ACHA,Ac1CA,ACHA,AFMA,ALeA,AQxBA,ANkBA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,Ac1CA,ACHA,AFMA,ALeA,AQxBA,ANkBA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,Ac1CA,ACHA,AFMA,ALeA,AS3BA,ADGA,ANkBA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,Ac1CA,ACHA,AFMA,ALeA,AS3BA,ADGA,ANkBA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,Ac1CA,ACHA,AFMA,ALeA,AS3BA,ADGA,ANkBA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,AkBtDA,AJYA,ACHA,AFMA,ALeA,AS3BA,ADGA,ANkBA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,AkBtDA,AJYA,ACHA,AFMA,ALeA,AS3BA,ADGA,ANkBA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,AkBtDA,AJYA,ACHA,AFMA,ALeA,AS3BA,ADGA,ANkBA,ACHA,ACHA,ARwBA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,AmBzDA,ADGA,AJYA,ACHA,AFMA,ALeA,AS3BA,ADGA,ALeA,ACHA,ARwBA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,AmBzDA,ADGA,AJYA,ACHA,AFMA,ALeA,AS3BA,ADGA,ALeA,ACHA,ARwBA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,AmBzDA,ADGA,AJYA,ACHA,AFMA,ALeA,AS3BA,ADGA,AJYA,ARwBA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,AoB5DA,ADGA,ADGA,AJYA,ACHA,AFMA,ALeA,AS3BA,ADGA,AJYA,ARwBA,AFMA,AGTA,AENA,ADGA;AzB4EA,AiBnDA,ACHA,ACHA,AoB5DA,ADGA,ADGA,AJYA,ACHA,AFMA,ALeA,AS3BA,ADGA,AJYA,ARwBA,AFMA,AGTA,AENA,ADGA;AzB4EA,AkBtDA,ACHA,AoB5DA,ADGA,ADGA,AJYA,ACHA,AFMA,ALeA,AS3BA,ADGA,AZoCA,AFMA,AGTA,AENA,ADGA;AzB4EA,AkBtDA,ACHA,AoB5DA,ACHA,AFMA,ADGA,AJYA,ACHA,APqBA,AS3BA,ADGA,AZoCA,AFMA,AGTA,AENA,ADGA;AzB4EA,AkBtDA,ACHA,AoB5DA,ACHA,AFMA,ADGA,AJYA,ACHA,APqBA,AS3BA,ADGA,AZoCA,AFMA,AGTA,AENA,ADGA;AzB4EA,AkBtDA,ACHA,AoB5DA,ACHA,AFMA,ADGA,AJYA,ACHA,APqBA,AS3BA,ADGA,AZoCA,AFMA,AGTA,AENA,ADGA;AzB4EA,AkBtDA,ACHA,AoB5DA,ACHA,AFMA,ADGA,AJYA,ANkBA,Ac1CA,ALeA,ADGA,AZoCA,AFMA,AGTA,AENA,ADGA;AzB4EA,AkBtDA,ACHA,AoB5DA,ACHA,AFMA,ADGA,AJYA,ANkBA,Ac1CA,ALeA,ADGA,AZoCA,ACHA,AENA,ADGA;AzB4EA,AkBtDA,ACHA,AoB5DA,ACHA,AFMA,ADGA,AJYA,ANkBA,Ac1CA,ALeA,AbuCA,ACHA,AENA,ADGA;AzB4EA,AkBtDA,ACHA,AoB5DA,ACHA,AFMA,ADGA,AJYA,ANkBA,Ac1CA,ALeA,AMlBA,AnByDA,ACHA,AENA,ADGA;AzB4EA,AkBtDA,ACHA,AoB5DA,ACHA,AFMA,ADGA,AJYA,ANkBA,Ac1CA,ALeA,AMlBA,AnByDA,ACHA,AENA,ADGA;AzB4EA,AkBtDA,ACHA,AoB5DA,ACHA,AFMA,ADGA,AJYA,ANkBA,Ac1CA,ACHA,AnByDA,ACHA,AENA,ADGA;AzB4EA,AkBtDA,ACHA,AoB5DA,ACHA,AFMA,ADGA,AJYA,ANkBA,Ac1CA,AENA,ADGA,AnByDA,ACHA,AENA,ADGA;AzB4EA,AkBtDA,ACHA,AoB5DA,ACHA,AFMA,ADGA,AJYA,AQxBA,AENA,ADGA,AnByDA,ACHA,AENA,ADGA;AzB4EA,AkBtDA,ACHA,AoB5DA,ACHA,AFMA,ADGA,AJYA,AQxBA,AENA,ADGA,AnByDA,ACHA,AENA,ADGA;AzB4EA,AkBtDA,ACHA,AoB5DA,ACHA,AIZA,ANkBA,ADGA,AJYA,AQxBA,AENA,ADGA,AnByDA,ACHA,AENA,ADGA;AzB4EA,AkBtDA,ACHA,AoB5DA,ACHA,AIZA,ANkBA,ALeA,AQxBA,AENA,ADGA,AnByDA,ACHA,AENA,ADGA;AzB4EA,AkBtDA,ACHA,AoB5DA,ACHA,AIZA,ANkBA,ALeA,AQxBA,AENA,ADGA,AnByDA,ACHA,AENA,ADGA;AzB4EA,AmBzDA,AoB5DA,ACHA,AIZA,ANkBA,AGTA,AIZA,AFMA,ADGA,AnByDA,ACHA,AENA,ADGA;AzB4EA,AmBzDA,AoB5DA,ACHA,AIZA,AHSA,AIZA,AFMA,ADGA,AnByDA,ACHA,AENA,ADGA;AzB4EA,AmBzDA,AoB5DA,ACHA,AIZA,AHSA,AIZA,AFMA,ADGA,AnByDA,ACHA,AENA,ADGA;AzB4EA,AmBzDA,AoB5DA,ACHA,AIZA,AENA,ALeA,AIZA,AFMA,ADGA,AnByDA,ACHA,AENA,ADGA;AzB4EA,AmBzDA,AoB5DA,ACHA,AIZA,AENA,ALeA,AIZA,AFMA,ADGA,AnByDA,ACHA,AENA,ADGA;AzB4EA,AmBzDA,AoB5DA,ACHA,AIZA,AENA,ALeA,AIZA,AFMA,ADGA,AnByDA,ACHA,AENA,ADGA;AzB4EA,A+C7IA,A5BoFA,AoB5DA,ACHA,AIZA,AENA,ALeA,AIZA,AFMA,ADGA,AnByDA,ACHA,AENA,ADGA;AzB4EA,A+C7IA,A5BoFA,AoB5DA,ACHA,AIZA,AENA,ALeA,AIZA,AFMA,ADGA,AnByDA,ACHA,AENA,ADGA;AzB4EA,A+C7IA,A5BoFA,AoB5DA,ACHA,AIZA,AENA,ALeA,AIZA,AFMA,ADGA,AnByDA,ACHA,AENA,ADGA;AzB4EA,A+C7IA,A5BoFA,AoB5DA,ACHA,AIZA,AENA,ALeA,AIZA,AFMA,AKfA,AzB2EA,ACHA,AENA,ADGA;AzB4EA,A+C7IA,A5BoFA,AoB5DA,ACHA,AIZA,AENA,ALeA,AIZA,AFMA,AKfA,AzB2EA,ACHA,AENA,ADGA;AzB4EA,A+C7IA,A5BoFA,AoB5DA,ACHA,AIZA,AENA,ALeA,AIZA,AFMA,AKfA,AzB2EA,ACHA,AENA,ADGA;AzB4EA,A+C7IA,A5BoFA,AoB5DA,ACHA,AIZA,AENA,ALeA,AIZA,AFMA,AMlBA,ADGA,AzB2EA,ACHA,AENA,ADGA;AzB4EA,A+C7IA,A5BoFA,AoB5DA,ACHA,AIZA,AENA,ALeA,AIZA,AFMA,AMlBA,ADGA,AzB2EA,ACHA,AENA,ADGA;AzB4EA,A+C7IA,A5BoFA,AoB5DA,ACHA,AIZA,AENA,ALeA,AIZA,AFMA,AMlBA,ADGA,AzB2EA,ACHA,AENA,ADGA;AzB4EA,A+C7IA,A5BoFA,A+B7FA,AV8BA,AIZA,AENA,ALeA,AIZA,AFMA,AMlBA,ADGA,AzB2EA,ACHA,AENA,ADGA;AzB4EA,A+C7IA,A5BoFA,A+B7FA,AV8BA,AIZA,AENA,ALeA,AIZA,AFMA,AMlBA,ADGA,AzB2EA,ACHA,AENA,ADGA;AzB4EA,A+C7IA,A5BoFA,A+B7FA,AV8BA,AIZA,AENA,ALeA,AIZA,AFMA,AMlBA,ADGA,AzB2EA,ACHA,AENA,ADGA;AzB4EA,A+C7IA,AGTA,ACHA,APqBA,AENA,ALeA,AIZA,AFMA,AMlBA,ADGA,AzB2EA,AGTA,ADGA;AzB4EA,A+C7IA,AGTA,ACHA,APqBA,AENA,ALeA,AIZA,AFMA,AMlBA,ADGA,AzB2EA,AGTA,ADGA;AzB4EA,A+C7IA,AGTA,ACHA,ALeA,ALeA,AIZA,AFMA,AMlBA,ADGA,AzB2EA,AGTA,ADGA;AzB4EA,A+C7IA,AGTA,ACHA,ACHA,ANkBA,ALeA,AIZA,AFMA,AMlBA,ADGA,AzB2EA,AGTA,ADGA;AzB4EA,A+C7IA,AGTA,ACHA,ACHA,ANkBA,ALeA,AIZA,AFMA,AMlBA,ADGA,AzB2EA,AGTA,ADGA;AzB4EA,A+C7IA,AGTA,ACHA,ACHA,ANkBA,ALeA,AENA,AMlBA,ADGA,AzB2EA,AGTA,ADGA;AzB4EA,A+C7IA,AGTA,ACHA,ACHA,ANkBA,ALeA,AENA,AMlBA,ADGA,AzB2EA,A8B1FA,A3BiFA,ADGA;AzB4EA,A+C7IA,AGTA,ACHA,ACHA,ANkBA,ALeA,AENA,AMlBA,ADGA,AzB2EA,A8B1FA,A3BiFA,ADGA;AzB4EA,A+C7IA,AGTA,ACHA,ACHA,ANkBA,ALeA,AENA,AMlBA,ADGA,AzB2EA,A8B1FA,A3BiFA,ADGA;AzB4EA,AsDlKA,APqBA,AGTA,ACHA,ACHA,ANkBA,ALeA,AENA,AMlBA,ADGA,AzB2EA,A8B1FA,A3BiFA,ADGA;AzB4EA,AsDlKA,APqBA,AGTA,ACHA,ACHA,ANkBA,AHSA,AMlBA,ADGA,AzB2EA,A8B1FA,A3BiFA,ADGA;AzB4EA,AsDlKA,APqBA,AGTA,ACHA,ACHA,ANkBA,AHSA,AMlBA,ADGA,AzB2EA,A8B1FA,A3BiFA,ADGA;AzB4EA,AsDlKA,APqBA,AGTA,ACHA,ACHA,ANkBA,AHSA,AMlBA,AMlBA,APqBA,AzB2EA,A8B1FA,A3BiFA,ADGA;AzB4EA,AsDlKA,APqBA,AGTA,ACHA,ACHA,ANkBA,AHSA,AMlBA,AMlBA,APqBA,AzB2EA,A8B1FA,A3BiFA,ADGA;AzB4EA,AsDlKA,APqBA,AGTA,ACHA,ACHA,AT2BA,AMlBA,AMlBA,APqBA,AzB2EA,A8B1FA,A5BoFA;AzB4EA,AsDlKA,APqBA,AGTA,ACHA,ACHA,AT2BA,AMlBA,AMlBA,ACHA,ARwBA,AzB2EA,A8B1FA,A5BoFA;AzB4EA,AsDlKA,APqBA,AGTA,ACHA,ACHA,AT2BA,AMlBA,AMlBA,ACHA,ARwBA,AzB2EA,A8B1FA,A5BoFA;AzB4EA,AsDlKA,APqBA,AGTA,ACHA,ACHA,AT2BA,AMlBA,AMlBA,ACHA,ARwBA,AzB2EA,A8B1FA,A5BoFA;AzB4EA,AsDlKA,APqBA,AGTA,ACHA,ACHA,AT2BA,AMlBA,AMlBA,ACHA,ACHA,AT2BA,AzB2EA,A8B1FA,A5BoFA;AzB4EA,AsDlKA,APqBA,AGTA,ACHA,ACHA,AT2BA,AMlBA,AMlBA,ACHA,ACHA,AT2BA,AzB2EA,A8B1FA,A5BoFA;AzB4EA,AsDlKA,APqBA,AGTA,ACHA,ACHA,AT2BA,AMlBA,AMlBA,ACHA,ACHA,AT2BA,AzB2EA,A8B1FA,A5BoFA;AzB4EA,AsDlKA,APqBA,AWjCA,ARwBA,ACHA,ACHA,AT2BA,AMlBA,AMlBA,ACHA,ACHA,AT2BA,AzB2EA,A8B1FA,A5BoFA;AzB4EA,AsDlKA,APqBA,AWjCA,ARwBA,ACHA,ACHA,AT2BA,AMlBA,AMlBA,ACHA,ACHA,AT2BA,AzB2EA,A8B1FA,A5BoFA;AzB4EA,AsDlKA,APqBA,AWjCA,ARwBA,ACHA,ACHA,AT2BA,AMlBA,AMlBA,ACHA,ACHA,AT2BA,AzB2EA,A8B1FA,A5BoFA;A6BtFA,APqBA,AYpCA,ADGA,ARwBA,ACHA,ACHA,AT2BA,AMlBA,AMlBA,ACHA,ACHA,AT2BA,AzB2EA,A8B1FA,A5BoFA;A6BtFA,APqBA,AYpCA,ADGA,ARwBA,ACHA,ACHA,AHSA,AMlBA,ACHA,ACHA,AT2BA,AzB2EA,A8B1FA,A5BoFA;A6BtFA,APqBA,AYpCA,ADGA,ARwBA,ACHA,ACHA,AHSA,AMlBA,ACHA,ACHA,AT2BA,AzB2EA,A8B1FA,A5BoFA;A6BtFA,APqBA,AYpCA,ACHA,AFMA,ARwBA,ACHA,ACHA,AHSA,AMlBA,ACHA,ACHA,AT2BA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,ACHA,AFMA,ARwBA,ACHA,ACHA,AHSA,AMlBA,ACHA,ACHA,AT2BA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,ACHA,AFMA,ARwBA,AENA,AHSA,AMlBA,ACHA,ACHA,AT2BA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,ACHA,AFMA,AGTA,AXiCA,AENA,AHSA,AMlBA,ACHA,ACHA,AT2BA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,ACHA,AFMA,AGTA,AXiCA,AENA,AHSA,AMlBA,ACHA,ACHA,AT2BA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,ACHA,AFMA,AGTA,AXiCA,ADGA,AMlBA,ACHA,ACHA,AT2BA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,AGTA,AFMA,AFMA,AGTA,AXiCA,ADGA,AMlBA,ACHA,ACHA,AT2BA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,AGTA,AFMA,ACHA,AXiCA,ADGA,AMlBA,ACHA,ACHA,AT2BA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,AGTA,AFMA,ACHA,AXiCA,ADGA,AMlBA,ACHA,ACHA,AT2BA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,AGTA,AFMA,ACHA,AXiCA,ADGA,AMlBA,ACHA,ACHA,AMlBA,Af6CA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,AGTA,AFMA,ACHA,AXiCA,ADGA,AMlBA,ACHA,ACHA,AMlBA,Af6CA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,AGTA,AFMA,ACHA,AXiCA,ADGA,AMlBA,ACHA,ACHA,AMlBA,Af6CA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,AGTA,AFMA,ACHA,AXiCA,ADGA,AMlBA,ACHA,ACHA,AOrBA,ADGA,Af6CA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,AGTA,AFMA,ACHA,AXiCA,ADGA,AMlBA,AENA,AOrBA,ADGA,Af6CA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,AGTA,AFMA,ACHA,AXiCA,ADGA,AMlBA,AENA,AOrBA,ADGA,Af6CA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,AGTA,AFMA,ACHA,AXiCA,ADGA,AMlBA,AENA,AOrBA,ACHA,AFMA,Af6CA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,AGTA,AFMA,AV8BA,ADGA,AMlBA,AS3BA,ACHA,AFMA,Af6CA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,AGTA,AFMA,AV8BA,ADGA,AMlBA,AS3BA,ACHA,AFMA,Af6CA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,AGTA,AFMA,AV8BA,ADGA,AMlBA,AS3BA,ACHA,AFMA,AGTA,AlBsDA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,ACHA,AV8BA,ADGA,AMlBA,AS3BA,ACHA,AFMA,AGTA,AlBsDA,AKfA,A5BoFA;A6BtFA,APqBA,AYpCA,ACHA,AV8BA,ADGA,AMlBA,AS3BA,ACHA,AFMA,AGTA,AlBsDA,AKfA,A5BoFA;A6BtFA,APqBA,AoB5DA,ARwBA,ACHA,AXiCA,AMlBA,AS3BA,ACHA,AFMA,AGTA,AlBsDA,AKfA,A5BoFA;A6BtFA,APqBA,AoB5DA,ARwBA,ACHA,AXiCA,AMlBA,AS3BA,ACHA,ACHA,AlBsDA,AKfA,A5BoFA;A6BtFA,APqBA,AoB5DA,ARwBA,ACHA,AXiCA,AMlBA,AS3BA,ACHA,ACHA,AlBsDA,AKfA,A5BoFA;A6BtFA,APqBA,AoB5DA,APqBA,AXiCA,AmBzDA,AbuCA,AS3BA,ACHA,ACHA,AlBsDA,AKfA,A5BoFA;A6BtFA,APqBA,AoB5DA,APqBA,AXiCA,AmBzDA,AbuCA,AS3BA,ACHA,ACHA,AlBsDA,AKfA,A5BoFA;AsBjEA,AoB5DA,APqBA,AXiCA,AmBzDA,AbuCA,AS3BA,ACHA,ACHA,AlBsDA,AKfA,A5BoFA;AsBjEA,AoB5DA,APqBA,AXiCA,AmBzDA,AbuCA,AS3BA,ACHA,ACHA,AlBsDA,AKfA,A5BoFA,A4CpIA;AtBmEA,AoB5DA,APqBA,AXiCA,AmBzDA,AbuCA,AS3BA,AENA,AlBsDA,AKfA,A5BoFA,A4CpIA;AtBmEA,AoB5DA,APqBA,AXiCA,AmBzDA,AbuCA,AS3BA,AENA,AlBsDA,AKfA,A5BoFA,A4CpIA;ACFA,AHSA,APqBA,AXiCA,AmBzDA,AJYA,AENA,AlBsDA,AKfA,A5BoFA,A4CpIA;ACFA,AHSA,APqBA,AXiCA,AmBzDA,AJYA,AhBgDA,AKfA,A5BoFA,A4CpIA;ACFA,AHSA,APqBA,AXiCA,AmBzDA,AJYA,AhBgDA,AKfA,A5BoFA,A4CpIA;AELA,ADGA,AHSA,APqBA,AXiCA,AmBzDA,AJYA,AhBgDA,AKfA,A5BoFA,A4CpIA;AELA,ADGA,AHSA,APqBA,AXiCA,AmBzDA,AJYA,AhBgDA,AKfA,A5BoFA,A4CpIA;AELA,ADGA,AHSA,APqBA,AXiCA,AmBzDA,AJYA,AhBgDA,AKfA,A5BoFA,A4CpIA;AELA,ADGA,AHSA,APqBA,AXiCA,AmBzDA,AIZA,ARwBA,AhBgDA,AKfA,A5BoFA,A4CpIA;AELA,ADGA,AHSA,APqBA,AXiCA,AmBzDA,AIZA,ARwBA,AhBgDA,AKfA,A5BoFA,A4CpIA;AELA,ADGA,AHSA,APqBA,AXiCA,AmBzDA,AIZA,ARwBA,AhBgDA,AKfA,A5BoFA,A4CpIA;AELA,ADGA,AHSA,APqBA,AXiCA,AmBzDA,AIZA,ARwBA,AhBgDA,AKfA,AoB5DA,AhDgJA,A4CpIA;AELA,ADGA,AHSA,APqBA,AXiCA,AmBzDA,AIZA,ARwBA,AXiCA,AoB5DA,AhDgJA,A4CpIA;AELA,AJYA,APqBA,AXiCA,AmBzDA,AIZA,ARwBA,AXiCA,AoB5DA,AhDgJA,A4CpIA;AELA,AGTA,APqBA,APqBA,AXiCA,AmBzDA,AIZA,ARwBA,AXiCA,AoB5DA,AhDgJA,A4CpIA;AELA,AGTA,APqBA,APqBA,AXiCA,AmBzDA,AIZA,ARwBA,AS3BA,AhDgJA,A4CpIA;AELA,AGTA,APqBA,APqBA,AXiCA,AmBzDA,AIZA,ARwBA,AS3BA,AhDgJA,A4CpIA;AMjBA,AJYA,AGTA,APqBA,APqBA,AQxBA,AIZA,ARwBA,AS3BA,AhDgJA,A4CpIA;AMjBA,AJYA,AGTA,APqBA,APqBA,AQxBA,AIZA,ARwBA,AS3BA,AhDgJA,A4CpIA;AMjBA,AJYA,AGTA,APqBA,APqBA,AQxBA,AIZA,ARwBA,AS3BA,AhDgJA,A4CpIA;AMjBA,ACHA,ALeA,AGTA,APqBA,APqBA,AQxBA,AIZA,ARwBA,AS3BA,AhDgJA,A4CpIA;AMjBA,ACHA,ALeA,AGTA,APqBA,APqBA,AQxBA,AIZA,ARwBA,AS3BA,AhDgJA,A4CpIA;AMjBA,ACHA,ALeA,AGTA,APqBA,APqBA,AQxBA,AIZA,ARwBA,AS3BA,AhDgJA,A4CpIA;AMjBA,AENA,ADGA,ALeA,AGTA,APqBA,APqBA,AQxBA,AIZA,ARwBA,AS3BA,AhDgJA,A4CpIA;AMjBA,AENA,ADGA,ALeA,AGTA,APqBA,APqBA,AQxBA,AIZA,ARwBA,AS3BA,AhDgJA,A4CpIA;AMjBA,AENA,ADGA,ALeA,AGTA,APqBA,APqBA,AQxBA,AIZA,ARwBA,AS3BA,AhDgJA,A4CpIA;AMjBA,AENA,ADGA,ALeA,AGTA,APqBA,APqBA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,A4CpIA;AMjBA,AENA,ADGA,ALeA,AGTA,APqBA,APqBA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,A4CpIA;AMjBA,AENA,ADGA,ALeA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,A4CpIA;AMjBA,AENA,ADGA,ALeA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AsDlKA,AV8BA;AMjBA,AENA,ADGA,ALeA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AsDlKA,AV8BA;AMjBA,AENA,ADGA,ALeA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AsDlKA,AV8BA;AMjBA,AENA,ADGA,ALeA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,ADGA,ALeA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,ANkBA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AIZA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AIZA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AIZA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AKfA,ADGA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AKfA,ADGA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AKfA,ADGA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AMlBA,ADGA,ADGA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AMlBA,ADGA,ADGA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AMlBA,ADGA,ADGA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AMlBA,ADGA,AENA,AHSA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AMlBA,ADGA,AENA,AHSA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AMlBA,ADGA,AENA,AHSA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AMlBA,ADGA,AENA,ACHA,AJYA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ARwBA,AS3BA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AMlBA,ADGA,AENA,ACHA,AJYA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ACHA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AMlBA,ADGA,AENA,ACHA,AJYA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ACHA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AMlBA,ADGA,AENA,AENA,ADGA,AJYA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ACHA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AMlBA,ACHA,AENA,ADGA,AJYA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ACHA,AKfA,ArD+JA,AuDrKA,ADGA,AV8BA;AMjBA,AENA,AMlBA,ACHA,AENA,ADGA,AJYA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ACHA,AKfA,ArD+JA,AsDlKA,AV8BA;AMjBA,AENA,AMlBA,ACHA,AENA,ADGA,AJYA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA,AV8BA;AMjBA,AENA,AMlBA,ACHA,AENA,ADGA,AJYA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA,AV8BA;AMjBA,AENA,AMlBA,ACHA,AENA,ADGA,AJYA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA,AV8BA;AMjBA,AENA,AMlBA,ACHA,AENA,ADGA,AGTA,APqBA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA,AV8BA;AMjBA,AENA,AMlBA,ACHA,AENA,ADGA,AGTA,APqBA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA,AV8BA;AMjBA,AENA,AMlBA,ACHA,AENA,ADGA,AGTA,APqBA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA,AV8BA;AMjBA,AENA,AMlBA,ACHA,AENA,AGTA,AJYA,AGTA,APqBA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA,AV8BA;AMjBA,AENA,AMlBA,ACHA,AENA,AGTA,AJYA,AGTA,APqBA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA,AV8BA;AMjBA,AENA,AMlBA,ACHA,AENA,AGTA,AJYA,AGTA,APqBA,AV8BA,AGTA,Ad0CA,AQxBA,AIZA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA,AV8BA;AMjBA,AENA,AMlBA,ACHA,AENA,AGTA,AJYA,AGTA,AENA,AT2BA,AV8BA,AGTA,Ad0CA,AYpCA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA;AJaA,AENA,AMlBA,ACHA,AENA,AGTA,ADGA,AENA,AT2BA,AV8BA,AGTA,Ad0CA,AYpCA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA;AJaA,AENA,AMlBA,ACHA,AENA,AGTA,ADGA,AENA,AT2BA,AV8BA,AGTA,Ad0CA,AYpCA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA;AJaA,AENA,AMlBA,ACHA,AENA,AGTA,AENA,AHSA,AENA,AT2BA,AV8BA,AGTA,Ad0CA,AYpCA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA;AJaA,AENA,AMlBA,ACHA,AENA,AGTA,AENA,AHSA,AENA,AT2BA,AV8BA,AGTA,Ad0CA,AYpCA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA;AJaA,AENA,AMlBA,ACHA,AENA,AGTA,AENA,AHSA,AENA,AT2BA,AV8BA,AGTA,Ad0CA,AYpCA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA;AJaA,AENA,AMlBA,ACHA,AENA,AGTA,AENA,AHSA,AIZA,AFMA,AT2BA,AV8BA,AGTA,Ad0CA,AYpCA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA;AJaA,AENA,AMlBA,ACHA,AENA,AGTA,AENA,AHSA,AIZA,AFMA,AT2BA,AV8BA,AGTA,Ad0CA,AYpCA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA;AJaA,AENA,AMlBA,ACHA,AENA,AKfA,AHSA,AIZA,AFMA,AT2BA,AV8BA,AGTA,Ad0CA,AYpCA,ACHA,AKfA,AS3BA,A9D0LA,AsDlKA;AJaA,AENA,AMlBA,ACHA,AENA,AKfA,AHSA,AIZA,AFMA,AGTA,AZoCA,AV8BA,AGTA,Ad0CA,AYpCA,AMlBA,AS3BA,A9D0LA,AsDlKA;AJaA,AENA,AMlBA,ACHA,AENA,AKfA,AHSA,AIZA,AFMA,AGTA,AZoCA,AV8BA,AGTA,Ad0CA,AYpCA,AMlBA,AS3BA,A9D0LA,AsDlKA;AJaA,AENA,AMlBA,ACHA,AENA,AKfA,AHSA,AIZA,ACHA,AZoCA,AV8BA,AGTA,Ad0CA,AYpCA,AMlBA,ArD+JA,AsDlKA;AJaA,AENA,AMlBA,ACHA,AENA,AKfA,AHSA,AIZA,AENA,ADGA,AZoCA,AV8BA,AGTA,Ad0CA,AYpCA,AMlBA,ArD+JA,AsDlKA;AJaA,AENA,AMlBA,ACHA,AENA,AKfA,AHSA,AIZA,AENA,ADGA,AZoCA,AV8BA,AGTA,Ad0CA,AYpCA,AMlBA,ArD+JA,AsDlKA;AJaA,AENA,AMlBA,ACHA,AENA,AENA,AIZA,AENA,ADGA,AZoCA,AV8BA,AGTA,Ad0CA,AkBtDA,ArD+JA,AsDlKA;AJaA,AENA,AMlBA,ACHA,AENA,AENA,AIZA,AENA,ADGA,AZoCA,AV8BA,AGTA,Ad0CA,AkBtDA,ArD+JA,AsElNA,AhBgDA;AJaA,AENA,AMlBA,ACHA,AENA,AENA,AIZA,AENA,ADGA,AZoCA,AV8BA,AGTA,Ad0CA,AkBtDA,ArD+JA,AsElNA,AhBgDA;AJaA,AENA,AMlBA,ACHA,AENA,AENA,AIZA,AENA,ADGA,AZoCA,AV8BA,AGTA,Ad0CA,AkBtDA,ArD+JA,AsElNA,AhBgDA;AJaA,AENA,AMlBA,ACHA,AENA,AENA,AIZA,AENA,ADGA,AZoCA,AV8BA,AGTA,Ad0CA,AkBtDA,ArD+JA,AsElNA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,ACHA,AENA,AENA,AIZA,AENA,ADGA,AZoCA,AV8BA,AGTA,Ad0CA,AkBtDA,ArD+JA,AsElNA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,ACHA,AENA,AENA,AIZA,AENA,ADGA,AZoCA,AV8BA,AGTA,Ad0CA,AkBtDA,ArD+JA,AsElNA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,ACHA,AENA,AENA,AIZA,AENA,ADGA,AIZA,AhBgDA,AV8BA,AGTA,Ad0CA,AkBtDA,ArD+JA,AsElNA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,ACHA,AENA,AENA,AIZA,AENA,AGTA,AhBgDA,AV8BA,AGTA,Ad0CA,AkBtDA,ArD+JA,AsElNA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,ACHA,AENA,AENA,AIZA,AENA,AGTA,AhBgDA,AV8BA,AGTA,Ad0CA,AkBtDA,ArD+JA,AsElNA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,AGTA,AENA,AIZA,AENA,AGTA,ACHA,AjBmDA,AV8BA,AGTA,Ad0CA,AkBtDA,ArD+JA,AsElNA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,AGTA,AENA,AIZA,AENA,AGTA,ACHA,AjBmDA,AV8BA,AGTA,Ad0CA,AkBtDA,ArD+JA,AsElNA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,AGTA,AMlBA,AENA,AGTA,ACHA,AjBmDA,AV8BA,AGTA,Ad0CA,AkBtDA,AiBnDA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,AGTA,AMlBA,AENA,AKfA,AFMA,ACHA,AjBmDA,AV8BA,AGTA,Ad0CA,AkBtDA,AiBnDA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,AGTA,AMlBA,AENA,AKfA,AFMA,ACHA,AjBmDA,AV8BA,AGTA,Ad0CA,AkBtDA,AiBnDA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,AGTA,AMlBA,AENA,AKfA,AFMA,ACHA,AjBmDA,APqBA,Ad0CA,AkBtDA,AiBnDA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,AGTA,AMlBA,AENA,AKfA,AFMA,ACHA,AENA,AnByDA,APqBA,AIZA,AiBnDA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,AGTA,AMlBA,AENA,AKfA,AFMA,ACHA,AENA,AnByDA,APqBA,AIZA,AiBnDA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,AGTA,AMlBA,AENA,AKfA,AFMA,ACHA,AENA,AnByDA,APqBA,AIZA,AiBnDA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,AGTA,AMlBA,AENA,AKfA,AFMA,ACHA,AENA,ACHA,ApB4DA,APqBA,AIZA,AiBnDA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,AGTA,AMlBA,AENA,AKfA,ADGA,AENA,ACHA,ApB4DA,APqBA,AIZA,AiBnDA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,AGTA,AMlBA,AENA,AKfA,ADGA,AENA,ACHA,ApB4DA,APqBA,AIZA,AiBnDA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,AGTA,AMlBA,AENA,AKfA,ADGA,AENA,ACHA,ACHA,ArB+DA,APqBA,AIZA,AiBnDA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,AGTA,AMlBA,AENA,AKfA,ACHA,ACHA,ACHA,ArB+DA,APqBA,AIZA,AiBnDA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,AGTA,AMlBA,AENA,AKfA,ACHA,ACHA,ACHA,ArB+DA,APqBA,AIZA,AiBnDA,AhBgDA,AiBnDA;ArBgEA,AENA,AMlBA,AGTA,AMlBA,AENA,AKfA,AIZA,AHSA,ACHA,ACHA,ArB+DA,APqBA,AIZA,AiBnDA,AhBgDA,AiBnDA;ArBgEA,AENA,AS3BA,AMlBA,AENA,AS3BA,AHSA,ACHA,ACHA,ArB+DA,APqBA,AIZA,AiBnDA,AhBgDA,AiBnDA;ArBgEA,AENA,AS3BA,AMlBA,AENA,AS3BA,AHSA,ACHA,ACHA,ArB+DA,APqBA,AIZA,AiBnDA,AhBgDA,AiBnDA;ArBgEA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AS3BA,AHSA,ACHA,ACHA,ArB+DA,AHSA,AiBnDA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AS3BA,AFMA,ACHA,ArB+DA,AHSA,AiBnDA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AS3BA,AFMA,ACHA,ArB+DA,AHSA,AiBnDA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AavCA,ADGA,AV8BA,AS3BA,AFMA,ACHA,ArB+DA,AHSA,AiBnDA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AavCA,ADGA,AV8BA,AS3BA,ADGA,ArB+DA,AHSA,AiBnDA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AavCA,ADGA,AV8BA,AS3BA,ADGA,ArB+DA,AHSA,AiBnDA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AavCA,ADGA,AV8BA,AYpCA,AHSA,ADGA,ArB+DA,AHSA,AiBnDA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AavCA,ADGA,AV8BA,AYpCA,AHSA,AtBkEA,AHSA,AiBnDA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AavCA,ADGA,AV8BA,AYpCA,AHSA,AtBkEA,AHSA,AiBnDA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AavCA,ADGA,AV8BA,AYpCA,ACHA,AJYA,AtBkEA,AHSA,AiBnDA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AavCA,ADGA,AV8BA,AYpCA,ACHA,A1B8EA,AHSA,AiBnDA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AavCA,ADGA,AV8BA,AYpCA,ACHA,A1B8EA,AHSA,AiBnDA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AavCA,ADGA,AV8BA,AYpCA,ACHA,ACHA,A3BiFA,AHSA,AiBnDA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AavCA,ADGA,AV8BA,AYpCA,ACHA,ACHA,A3BiFA,AHSA,AiBnDA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AavCA,ADGA,AV8BA,AYpCA,ACHA,ACHA,A3BiFA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AavCA,ADGA,AV8BA,AYpCA,ACHA,ACHA,ACHA,A5BoFA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AYpCA,ACHA,ACHA,ACHA,A5BoFA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AYpCA,ACHA,ACHA,ACHA,A5BoFA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AYpCA,ACHA,ACHA,ACHA,ACHA,A7BuFA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AavCA,ACHA,ACHA,ACHA,A7BuFA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AavCA,ACHA,ACHA,ACHA,A7BuFA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AavCA,ACHA,ACHA,ACHA,ACHA,A9B0FA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,Ac1CA,ACHA,ACHA,ACHA,A9B0FA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,Ac1CA,ACHA,ACHA,ACHA,A9B0FA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,Ac1CA,ACHA,ACHA,ACHA,ACHA,A/B6FA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,Ae7CA,ACHA,ACHA,ACHA,A/B6FA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,Ae7CA,ACHA,ACHA,ACHA,A/B6FA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,Ae7CA,ACHA,ACHA,ACHA,ACHA,AhCgGA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AgBhDA,ACHA,ACHA,ACHA,AhCgGA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AgBhDA,ACHA,ACHA,ACHA,AhCgGA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AgBhDA,ACHA,ACHA,ACHA,ACHA,AjCmGA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AiBnDA,ACHA,ACHA,ACHA,AjCmGA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AiBnDA,ACHA,ACHA,ACHA,AjCmGA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AiBnDA,ACHA,ACHA,ACHA,ACHA,AlCsGA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AkBtDA,ACHA,ACHA,ACHA,AlCsGA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AkBtDA,ACHA,ACHA,ACHA,AlCsGA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AkBtDA,ACHA,ACHA,ACHA,ACHA,AnCyGA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AmBzDA,ACHA,ACHA,ACHA,AnCyGA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AmBzDA,ACHA,ACHA,ACHA,AnCyGA,Ac1CA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AV8BA,AmBzDA,ACHA,ACHA,ACHA,AnCyGA,AoC5GA,AtBkEA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AU9BA,ACHA,ACHA,AnCyGA,AoC5GA,AtBkEA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AU9BA,ACHA,ACHA,AnCyGA,AoC5GA,AtBkEA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AU9BA,ACHA,ACHA,AENA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AWjCA,ACHA,AENA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;AJaA,AENA,AS3BA,AMlBA,AYpCA,AWjCA,ACHA,AENA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;AJaA,AENA,AS3BA,AkBtDA,AWjCA,ACHA,AGTA,ADGA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;AFOA,AS3BA,AkBtDA,AYpCA,AGTA,ADGA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;AFOA,AS3BA,AkBtDA,AYpCA,AGTA,ADGA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;AFOA,AS3BA,AkBtDA,AYpCA,AGTA,ACHA,AFMA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;AFOA,AS3BA,AkBtDA,Ae7CA,ACHA,AFMA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;AFOA,AS3BA,AkBtDA,Ae7CA,ACHA,AFMA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;AFOA,AS3BA,AkBtDA,Ae7CA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;AFOA,AS3BA,AkBtDA,Ae7CA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;AFOA,AS3BA,AkBtDA,Ae7CA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A2ChIA,A7CuIA,AS3BA,AkBtDA,Ae7CA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A2ChIA,A7CuIA,AS3BA,AkBtDA,Ae7CA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A2ChIA,A7CuIA,AS3BA,AkBtDA,Ae7CA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A2ChIA,ACHA,ArC+GA,AkBtDA,Ae7CA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A2ChIA,ACHA,ArC+GA,AkBtDA,Ae7CA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A2ChIA,ACHA,ArC+GA,AkBtDA,Ae7CA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A2ChIA,ACHA,ACHA,AtCkHA,AkBtDA,Ae7CA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A2ChIA,ACHA,ACHA,AtCkHA,AiCnGA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A2ChIA,ACHA,ACHA,AtCkHA,AiCnGA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A2ChIA,ACHA,AENA,ADGA,AtCkHA,AiCnGA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A2ChIA,ACHA,AENA,ADGA,AtCkHA,AiCnGA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A2ChIA,ACHA,AENA,ADGA,AtCkHA,AiCnGA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A2ChIA,ACHA,AENA,ADGA,AENA,AxCwHA,AiCnGA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A2ChIA,ACHA,AENA,ADGA,AENA,AxCwHA,AiCnGA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A2ChIA,ACHA,AENA,ADGA,AENA,AxCwHA,AiCnGA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A2ChIA,ACHA,AIZA,AFMA,ADGA,AENA,AxCwHA,AiCnGA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,AIZA,AFMA,ADGA,AENA,AxCwHA,AiCnGA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,AIZA,AFMA,ADGA,AENA,AxCwHA,AiCnGA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,AIZA,AFMA,ADGA,AENA,AxCwHA,A0C9HA,AT2BA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,AIZA,AFMA,ADGA,AENA,AxCwHA,A0C9HA,AT2BA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,AIZA,AFMA,ADGA,AENA,AxCwHA,A0C9HA,AT2BA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,AIZA,AFMA,ADGA,AENA,AxCwHA,A0C9HA,ACHA,AV8BA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,AIZA,AHSA,AENA,AxCwHA,A0C9HA,ACHA,AV8BA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,AIZA,AHSA,AENA,AxCwHA,A0C9HA,ACHA,AV8BA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,AIZA,AHSA,AENA,AxCwHA,A0C9HA,ACHA,ACHA,AXiCA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,AIZA,AHSA,AtCkHA,A0C9HA,ACHA,ACHA,AXiCA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,AIZA,AHSA,AtCkHA,A0C9HA,ACHA,ACHA,AXiCA,ACHA,ACHA,AHSA,ArC+GA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,AIZA,AHSA,AtCkHA,A6CvIA,AHSA,ACHA,ACHA,AXiCA,ACHA,ACHA,AxCwHA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,ACHA,AtCkHA,A6CvIA,AHSA,ACHA,ACHA,AXiCA,ACHA,ACHA,AxCwHA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,ACHA,AtCkHA,A6CvIA,AHSA,ACHA,ACHA,AXiCA,ACHA,ACHA,AxCwHA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,ACHA,AQxBA,A9C0IA,A6CvIA,AHSA,ACHA,ACHA,AXiCA,ACHA,ACHA,AxCwHA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,ACHA,AQxBA,A9C0IA,A6CvIA,AHSA,ACHA,ACHA,AXiCA,ACHA,ACHA,AxCwHA,AoC5GA,AtBkEA,AhBgDA;A4CnIA,ACHA,AQxBA,ADGA,AHSA,ACHA,ACHA,AXiCA,ACHA,ACHA,AxCwHA,AoC5GA,AtBkEA,AhBgDA;AsDjKA,AV8BA,ACHA,AQxBA,ADGA,AHSA,ACHA,ACHA,AXiCA,ACHA,ACHA,AxCwHA,AoC5GA,AtBkEA,AhBgDA;AsDjKA,AV8BA,ACHA,AQxBA,ADGA,AHSA,ACHA,ACHA,AXiCA,ACHA,ACHA,AxCwHA,AoC5GA,AtBkEA,AhBgDA;AsDjKA,AV8BA,ACHA,AQxBA,ADGA,AHSA,ACHA,ACHA,AXiCA,ACHA,ACHA,AxCwHA,AoC5GA,AtBkEA,AhBgDA;AsDjKA,AV8BA,ACHA,AQxBA,ADGA,AHSA,ACHA,ACHA,AIZA,Af6CA,ACHA,ACHA,AxCwHA,AoC5GA,AtBkEA,AhBgDA;AsDjKA,AV8BA,ACHA,AQxBA,ADGA,AHSA,ACHA,ACHA,AIZA,Af6CA,ACHA,ACHA,AxCwHA,AoC5GA,AtBkEA,AhBgDA;AsDjKA,AV8BA,AS3BA,ADGA,AHSA,ACHA,ACHA,AIZA,Af6CA,ACHA,ACHA,AxCwHA,AoC5GA,AtBkEA,AhBgDA;AsDjKA,AV8BA,AS3BA,ADGA,AHSA,ACHA,ACHA,AIZA,ACHA,AhBgDA,ACHA,ACHA,AxCwHA,AoC5GA,AtBkEA,AhBgDA;AsDjKA,AV8BA,AS3BA,ADGA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,ACHA,AxCwHA,AoC5GA,AtBkEA,AhBgDA;AsDjKA,AV8BA,AS3BA,ADGA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AvCqHA,AoC5GA,AtBkEA,AhBgDA;AsDjKA,AV8BA,AavCA,AJYA,ADGA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AvCqHA,Ac1CA,AhBgDA;AsDjKA,AV8BA,AavCA,AJYA,ADGA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AvCqHA,Ac1CA,AhBgDA;AsDjKA,AV8BA,AavCA,AJYA,ADGA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AvCqHA,Ac1CA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,ALeA,ADGA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AvCqHA,Ac1CA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,ALeA,ADGA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AvCqHA,Ac1CA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,ALeA,ADGA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AvCqHA,Ac1CA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,ALeA,AMlBA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AvCqHA,Ac1CA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,ALeA,AMlBA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AvCqHA,Ac1CA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,ALeA,AMlBA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AvCqHA,Ac1CA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AMlBA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AvCqHA,Ac1CA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AMlBA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AvCqHA,Ac1CA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AMlBA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AvCqHA,Ac1CA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AFMA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AvCqHA,Ac1CA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AFMA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AvCqHA,Ac1CA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AFMA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AvCqHA,Ac1CA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,ACHA,AHSA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,ACHA,AHSA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,ACHA,AHSA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,ADGA,AHSA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,ADGA,AHSA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,ADGA,AHSA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,ACHA,AFMA,AHSA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,ACHA,AFMA,AHSA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,ACHA,AFMA,AHSA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,ACHA,ACHA,AHSA,AHSA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,ACHA,ACHA,AHSA,AHSA,APqBA,AFMA,ACHA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,ACHA,ACHA,AHSA,AHSA,APqBA,ADGA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,AGTA,ADGA,AHSA,AHSA,APqBA,ADGA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,AGTA,ADGA,AHSA,AHSA,APqBA,ADGA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,AGTA,ADGA,AHSA,AHSA,APqBA,ADGA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,AGTA,ACHA,AFMA,AHSA,AHSA,APqBA,ADGA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,AGTA,ACHA,AFMA,AHSA,AHSA,APqBA,ADGA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,AGTA,ACHA,AFMA,AHSA,AHSA,APqBA,ADGA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,AIZA,AFMA,AHSA,AMlBA,AT2BA,APqBA,ADGA,AIZA,ACHA,AhBgDA,ACHA,AzB2EA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,AIZA,AFMA,AHSA,AMlBA,AT2BA,APqBA,ADGA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,AIZA,AFMA,AHSA,AMlBA,AT2BA,APqBA,ADGA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,AENA,AHSA,AMlBA,ACHA,AV8BA,APqBA,ADGA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,APqBA,AQxBA,AENA,AENA,AHSA,AMlBA,ACHA,AV8BA,APqBA,ADGA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AENA,AENA,AHSA,AMlBA,ACHA,AV8BA,APqBA,ADGA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AENA,AENA,AHSA,AOrBA,ACHA,AXiCA,APqBA,ADGA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AENA,AENA,AHSA,AOrBA,ACHA,AXiCA,APqBA,ADGA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AENA,AENA,AHSA,AOrBA,ACHA,AXiCA,APqBA,ADGA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AENA,AENA,AHSA,AQxBA,ACHA,AZoCA,APqBA,ADGA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AENA,AENA,AHSA,AQxBA,ACHA,AZoCA,APqBA,ADGA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AENA,AENA,AHSA,AQxBA,ACHA,AZoCA,ARwBA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AENA,AENA,AKfA,ACHA,ACHA,AbuCA,ARwBA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AENA,AENA,AKfA,ACHA,ACHA,AbuCA,ARwBA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AENA,AENA,AKfA,ACHA,ACHA,AbuCA,ARwBA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AENA,AENA,AKfA,AENA,ACHA,Ad0CA,ARwBA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AENA,AENA,AKfA,AENA,ACHA,Ad0CA,ARwBA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,ACHA,Ad0CA,ARwBA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,ARwBA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,ARwBA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,ARwBA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,ACHA,AFMA,Ad0CA,ARwBA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,ACHA,AFMA,Ad0CA,ARwBA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,ACHA,AFMA,Ad0CA,ARwBA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,ACHA,ACHA,AHSA,Ad0CA,ARwBA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,ACHA,ACHA,AHSA,Ad0CA,ARwBA,AIZA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,ACHA,ACHA,AHSA,Ad0CA,AJYA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,AENA,ACHA,AJYA,Ad0CA,AJYA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,AENA,ACHA,AJYA,Ad0CA,AJYA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,AENA,ACHA,AJYA,Ad0CA,AJYA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,AGTA,AJYA,Ad0CA,AmBzDA,AvBqEA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,AGTA,AJYA,Ad0CA,AmBzDA,AvBqEA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,AGTA,AJYA,Ad0CA,AmBzDA,AvBqEA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,AoB5DA,ADGA,AvBqEA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,AoB5DA,ADGA,AvBqEA,ACHA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,AoB5DA,ADGA,AtBkEA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,AoB5DA,ACHA,AFMA,AtBkEA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,AoB5DA,ACHA,AFMA,AtBkEA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,ACHA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,AoB5DA,ACHA,AFMA,AtBkEA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ApB4DA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,AoB5DA,ACHA,AFMA,AtBkEA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ApB4DA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,AoB5DA,ACHA,AFMA,AtBkEA,AhBgDA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ApB4DA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,AoB5DA,ACHA,AFMA,AtCkHA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ACHA,ArB+DA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,AoB5DA,ACHA,AFMA,AtCkHA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ACHA,ArB+DA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,AoB5DA,ACHA,AFMA,AtCkHA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ACHA,ArB+DA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,AoB5DA,ACHA,AFMA,AtCkHA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ACHA,ACHA,AtBkEA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,AoB5DA,ACHA,AFMA,AtCkHA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ACHA,ACHA,AtBkEA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,AoB5DA,ACHA,AFMA,AtCkHA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ACHA,ACHA,AtBkEA,AIZA,AKfA,AENA,AENA,ADGA,Ad0CA,AoB5DA,ACHA,AFMA,AtCkHA,AxBwEA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ACHA,ACHA,AtBkEA,AIZA,AKfA,AENA,AENA,ADGA,AMlBA,ACHA,AxCwHA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ACHA,ACHA,AtBkEA,AIZA,AKfA,AENA,AENA,ADGA,AMlBA,ACHA,AxCwHA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ACHA,ACHA,AtBkEA,AIZA,AKfA,AENA,AENA,ADGA,AMlBA,ACHA,AxCwHA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ACHA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AENA,AENA,ADGA,AMlBA,ACHA,AxCwHA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ACHA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AENA,AENA,ADGA,AMlBA,ACHA,AxCwHA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ACHA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AENA,AENA,ADGA,AMlBA,ACHA,AxCwHA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ACHA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AENA,AENA,ADGA,AMlBA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ACHA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AENA,AENA,ADGA,AMlBA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ACHA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AENA,AENA,ADGA,AMlBA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AavCA,ACHA,AENA,AqB/DA,ACHA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AENA,ACHA,Ac1CA,ARwBA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AavCA,AGTA,AqB/DA,ACHA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AENA,ACHA,Ac1CA,ARwBA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AavCA,AGTA,AqB/DA,ACHA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AENA,ACHA,Ac1CA,ARwBA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AavCA,AGTA,AqB/DA,ACHA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AENA,ACHA,Ac1CA,ACHA,AT2BA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AgBhDA,AqB/DA,ACHA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AENA,ACHA,Ac1CA,ACHA,AT2BA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AgBhDA,AqB/DA,ACHA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AENA,ACHA,Ac1CA,ACHA,AT2BA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AgBhDA,AqB/DA,ACHA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AENA,ACHA,Ac1CA,AENA,ADGA,AT2BA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AgBhDA,AqB/DA,ACHA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AENA,ACHA,Ac1CA,AENA,ADGA,AT2BA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AgBhDA,AqB/DA,ACHA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AENA,ACHA,Ac1CA,AENA,ADGA,AT2BA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AqC/GA,AS3BA,ARwBA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AGTA,Ac1CA,AENA,ADGA,AT2BA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AqC/GA,AS3BA,ARwBA,AGTA,AFMA,AtBkEA,AIZA,AKfA,AGTA,Ac1CA,AENA,ADGA,AT2BA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;AsDjKA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AtBkEA,AIZA,AKfA,AGTA,Ac1CA,AENA,ADGA,AT2BA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;A2FhRA,ArC+GA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AtBkEA,AIZA,AKfA,AGTA,Ac1CA,AENA,ADGA,AT2BA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;A2FhRA,ArC+GA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AtBkEA,AIZA,AKfA,AGTA,Ac1CA,AENA,ADGA,AT2BA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;A2FhRA,ArC+GA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AtBkEA,AIZA,AKfA,AGTA,Ac1CA,AENA,ADGA,AT2BA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;A4FnRA,ADGA,ArC+GA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AtBkEA,AIZA,AKfA,AGTA,Ac1CA,AENA,ADGA,AT2BA,AOrBA,A9C0IA,A4CpIA,ApE4MA,AhBgDA;A4FnRA,ADGA,ArC+GA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AtBkEA,AIZA,AKfA,AGTA,Ac1CA,AENA,ADGA,AT2BA,AOrBA,A9C0IA,AxBwEA,AhBgDA;A4FnRA,ADGA,ArC+GA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AtBkEA,AIZA,AKfA,AGTA,Ac1CA,AENA,ADGA,AT2BA,AOrBA,A9C0IA,AxBwEA,AhBgDA;A4FnRA,ACHA,AFMA,ArC+GA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AtBkEA,AIZA,AKfA,AGTA,Ac1CA,AENA,ADGA,AFMA,A9C0IA,AxBwEA,AhBgDA;A4FnRA,ACHA,AFMA,ArC+GA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AtBkEA,AIZA,AKfA,AGTA,Ac1CA,AENA,ADGA,AFMA,A9C0IA,AxBwEA,AhBgDA;A4FnRA,ACHA,AFMA,ArC+GA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AlBsDA,AKfA,AGTA,Ac1CA,AENA,ADGA,AFMA,A9C0IA,AxBwEA,AhBgDA;A4FnRA,ACHA,AFMA,AGTA,AxCwHA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AlBsDA,AKfA,AGTA,Ac1CA,AENA,ADGA,AFMA,A9C0IA,AxBwEA,AhBgDA;A4FnRA,ACHA,AFMA,AGTA,AxCwHA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AlBsDA,AKfA,AGTA,Ac1CA,AENA,ADGA,AFMA,A9C0IA,AxBwEA,AhBgDA;A4FnRA,ACHA,AFMA,AGTA,AxCwHA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AlBsDA,AKfA,AGTA,Ac1CA,AENA,ADGA,AFMA,A9C0IA,AxBwEA,AhBgDA;A+F5RA,AHSA,ACHA,AFMA,AGTA,AxCwHA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AlBsDA,AQxBA,Ac1CA,AENA,ADGA,AFMA,A9C0IA,AxBwEA,AhBgDA;A+F5RA,AHSA,ACHA,AFMA,AGTA,AxCwHA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AlBsDA,AQxBA,Ac1CA,AENA,ADGA,AFMA,A9C0IA,AxBwEA,AhBgDA;A+F5RA,AHSA,ACHA,AFMA,AGTA,AxCwHA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AlBsDA,AQxBA,Ac1CA,AENA,ADGA,AFMA,A9C0IA,AxBwEA,AhBgDA;AgG/RA,ADGA,AHSA,ACHA,AFMA,AGTA,AxCwHA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AlBsDA,AQxBA,Ac1CA,AENA,ADGA,AFMA,A9C0IA,AxBwEA,AhBgDA;AgG/RA,ADGA,AHSA,ACHA,AFMA,AGTA,AxCwHA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AlBsDA,AQxBA,Ac1CA,AENA,ADGA,AFMA,A9C0IA,AxBwEA,AhBgDA;AgG/RA,ADGA,AHSA,ACHA,AFMA,AGTA,AxCwHA,AV8BA,AqC/GA,AS3BA,ARwBA,ACHA,AlBsDA,AQxBA,Ac1CA,AENA,ADGA,AhDgJA,AxBwEA,AhBgDA;AgG/RA,ADGA,AHSA,AKfA,AJYA,AFMA,AGTA,AlDsJA,AqC/GA,AS3BA,ARwBA,ACHA,AlBsDA,AQxBA,Ac1CA,AENA,ADGA,AhDgJA,AxBwEA,AhBgDA;AgG/RA,ADGA,AHSA,AKfA,AJYA,AFMA,AGTA,AlDsJA,AqC/GA,AS3BA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA,AhDgJA,AxBwEA,AhBgDA;AgG/RA,ADGA,AHSA,AKfA,AJYA,AFMA,AGTA,AlDsJA,AqC/GA,AS3BA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA,AhDgJA,AxBwEA,AhBgDA;AgG/RA,ADGA,AGTA,ANkBA,AKfA,AJYA,AFMA,AGTA,AlDsJA,AqC/GA,AS3BA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA,AhDgJA,AxBwEA,AhBgDA;AgG/RA,ADGA,AGTA,ANkBA,AKfA,AJYA,AFMA,AGTA,AlDsJA,AqC/GA,AS3BA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA,AhDgJA,AxBwEA,AhBgDA;AgG/RA,ADGA,AGTA,ANkBA,AKfA,AJYA,AFMA,AGTA,AlDsJA,A8C1IA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA,AhDgJA,AxBwEA,AhBgDA;AgG/RA,ADGA,AGTA,ANkBA,AKfA,AJYA,AMlBA,ARwBA,AGTA,AlDsJA,A8C1IA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA,AhDgJA,AxBwEA,AhBgDA;AgG/RA,ADGA,AGTA,ANkBA,AKfA,AJYA,AMlBA,ARwBA,AGTA,AlDsJA,A8C1IA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA,AhDgJA,AxBwEA,AhBgDA;AgG/RA,ADGA,AGTA,ANkBA,AKfA,AJYA,AMlBA,ARwBA,AGTA,AlDsJA,A8C1IA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA,AxEwNA,AhBgDA;AgG/RA,AIZA,ALeA,AGTA,ANkBA,AKfA,AJYA,AMlBA,ARwBA,AGTA,AlDsJA,A8C1IA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA,AxEwNA,AhBgDA;AgG/RA,AIZA,ALeA,AGTA,ANkBA,AKfA,AJYA,AMlBA,ARwBA,AGTA,AlDsJA,A8C1IA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA,AxEwNA,AhBgDA;AgG/RA,AIZA,ALeA,AGTA,ANkBA,AKfA,AJYA,AMlBA,ARwBA,AGTA,AlDsJA,A8C1IA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA,AxEwNA,AhBgDA;AgG/RA,AIZA,ALeA,AGTA,ANkBA,AKfA,AJYA,AMlBA,ARwBA,AGTA,AOrBA,AzD2KA,A8C1IA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA,AxEwNA,AhBgDA;AgG/RA,AIZA,ALeA,AGTA,ANkBA,AKfA,AJYA,AMlBA,ARwBA,AGTA,AOrBA,AzD2KA,A8C1IA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA,AxFwQA;AgG/RA,AIZA,ALeA,AGTA,ANkBA,AKfA,AJYA,AMlBA,ARwBA,AGTA,AOrBA,AzD2KA,A8C1IA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA,AxFwQA;AgG/RA,AIZA,ALeA,AGTA,ANkBA,AU9BA,ALeA,AJYA,AMlBA,ARwBA,AGTA,AOrBA,AzD2KA,A8C1IA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA,AxFwQA;AgG/RA,AIZA,ALeA,AGTA,ANkBA,AU9BA,ALeA,AJYA,AMlBA,ARwBA,AGTA,AOrBA,AXiCA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA,AxFwQA;AgG/RA,AIZA,ALeA,AGTA,ANkBA,AU9BA,ALeA,AJYA,AMlBA,ARwBA,AGTA,AOrBA,AXiCA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA;AQvBA,AIZA,ALeA,AGTA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,ARwBA,AGTA,AOrBA,AXiCA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA;AQvBA,AIZA,ALeA,AGTA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,ARwBA,AGTA,AOrBA,AXiCA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA;AQvBA,AIZA,ALeA,AGTA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,ARwBA,AGTA,AOrBA,AXiCA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA;AQvBA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,ARwBA,AGTA,AOrBA,AXiCA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA;AQvBA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,ARwBA,AGTA,AOrBA,AXiCA,ARwBA,ACHA,AlBsDA,AsBlEA,AENA,ADGA;AQvBA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,ALeA,AOrBA,AnByDA,ACHA,AlBsDA,AsBlEA,AENA,ADGA;AQvBA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,AXiCA,AOrBA,AnByDA,ACHA,AlBsDA,AsBlEA,AENA,ADGA;AQvBA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,AXiCA,AOrBA,AnByDA,ACHA,AIZA,AENA,ADGA;AQvBA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,AXiCA,AOrBA,AlBsDA,AIZA,AENA,ADGA;AQvBA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,AZoCA,AOrBA,AlBsDA,AIZA,AENA,ADGA;AQvBA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,AZoCA,AOrBA,AlBsDA,AIZA,AENA,ADGA;AQvBA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,AZoCA,AOrBA,AlBsDA,AIZA,AENA,ADGA;AQvBA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,ACHA,AbuCA,AOrBA,AlBsDA,AIZA,AENA,ADGA;AQvBA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,ACHA,AbuCA,AOrBA,AlBsDA,AIZA,AENA,ADGA;AQvBA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,ACHA,AbuCA,AOrBA,AlBsDA,AIZA,AENA,ADGA;AQvBA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,ACHA,ACHA,Ad0CA,AOrBA,AlBsDA,AIZA,AENA,ADGA;AQvBA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,ACHA,ACHA,Ad0CA,AOrBA,AlBsDA,AIZA,AENA,ADGA;AQvBA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,ACHA,ACHA,Ad0CA,AOrBA,AlBsDA,AIZA,AENA,ADGA;AqB9DA,AbuCA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,ACHA,ACHA,Ad0CA,AOrBA,AlBsDA,AIZA,AENA,ADGA;AqB9DA,AbuCA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,ACHA,ACHA,Ad0CA,AOrBA,AlBsDA,AIZA,AENA,ADGA;AqB9DA,AbuCA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,ACHA,ACHA,APqBA,AlBsDA,AIZA,AENA,ADGA;AqB9DA,ACHA,Ad0CA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,ACHA,ACHA,APqBA,AlBsDA,AIZA,AENA,ADGA;AqB9DA,ACHA,Ad0CA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,ACHA,ACHA,APqBA,AlBsDA,AIZA,AENA,ADGA;AqB9DA,ACHA,Ad0CA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,ACHA,ACHA,APqBA,AlBsDA,AIZA,AENA,ADGA;AqB9DA,ACHA,ACHA,Af6CA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,ACHA,ACHA,APqBA,AlBsDA,AIZA,AENA,ADGA;AqB9DA,ACHA,ACHA,Af6CA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,ACHA,ACHA,APqBA,AlBsDA,AIZA,AENA,ADGA;AqB9DA,ACHA,ACHA,Af6CA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,ALeA,AJYA,AMlBA,AMlBA,ACHA,ACHA,ACHA,APqBA,AlBsDA,AIZA,AENA,ADGA;AqB9DA,AGTA,AFMA,ACHA,Af6CA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,AT2BA,AMlBA,AMlBA,ACHA,ACHA,ACHA,APqBA,AlBsDA,AIZA,AENA,ADGA;AqB9DA,AGTA,AFMA,ACHA,Af6CA,AIZA,ALeA,AS3BA,ANkBA,ANkBA,AWjCA,ADGA,AT2BA,AMlBA,AMlBA,ACHA,ACHA,ACHA,APqBA,AlBsDA,AIZA,AENA,ADGA;AqB9DA,AGTA,AFMA,ACHA,Af6CA,AIZA,ALeA,AS3BA,AZoCA,AWjCA,ADGA,AT2BA,AMlBA,AMlBA,ACHA,ACHA,ACHA,APqBA,AlBsDA,AIZA,AENA,ADGA;AqB9DA,AGTA,ACHA,AHSA,ACHA,Af6CA,AIZA,ARwBA,AWjCA,ADGA,AT2BA,AMlBA,AMlBA,ACHA,ACHA,ACHA,APqBA,AlBsDA,AIZA,AENA,ADGA;AqB9DA,AGTA,ACHA,AHSA,ACHA,Af6CA,AIZA,ARwBA,AWjCA,ADGA,AT2BA,AMlBA,AMlBA,ACHA,ACHA,ACHA,APqBA,AlBsDA,AIZA,AENA,ADGA;AqB9DA,AGTA,ACHA,AHSA,ACHA,Af6CA,AIZA,ARwBA,AWjCA,ADGA,AT2BA,AMlBA,AMlBA,ACHA,ACHA,ACHA,APqBA,AlBsDA,AIZA,AENA,ADGA;AqB9DA,AGTA,ACHA,AHSA,ACHA,Af6CA,AIZA,ARwBA,AWjCA,AV8BA,AMlBA,AMlBA,ACHA,ACHA,ACHA,APqBA,AlBsDA,AIZA,AENA,ADGA,A0B9EA;ALgBA,AGTA,ACHA,AHSA,ACHA,Af6CA,AIZA,ARwBA,AWjCA,AV8BA,AMlBA,AMlBA,ACHA,ACHA,ACHA,APqBA,AlBsDA,AIZA,AENA,ADGA,A0B9EA;ALgBA,AGTA,ACHA,AHSA,ACHA,Af6CA,AIZA,ARwBA,AWjCA,AV8BA,AMlBA,AMlBA,ACHA,ACHA,ACHA,APqBA,AlBsDA,AMlBA,ADGA,A0B9EA;ALgBA,AGTA,ACHA,AHSA,ACHA,Af6CA,AIZA,Ae7CA,AvBqEA,ACHA,AMlBA,AMlBA,AENA,ACHA,APqBA,AlBsDA,AMlBA,ADGA,A0B9EA;ALgBA,AGTA,ACHA,AHSA,ACHA,Af6CA,AIZA,Ae7CA,AvBqEA,ACHA,AYpCA,AENA,ACHA,APqBA,AlBsDA,AMlBA,ADGA,A0B9EA;ALgBA,AGTA,ACHA,AHSA,ACHA,Af6CA,AIZA,Ae7CA,AvBqEA,ACHA,AYpCA,AENA,ACHA,APqBA,AlBsDA,AMlBA,ADGA,A0B9EA;AELA,APqBA,AGTA,ACHA,AHSA,ACHA,Af6CA,AIZA,Ae7CA,AvBqEA,ACHA,AYpCA,AGTA,APqBA,AlBsDA,AMlBA,ADGA,A0B9EA;AELA,APqBA,AGTA,AFMA,ACHA,Af6CA,AIZA,Ae7CA,AvBqEA,ACHA,AYpCA,AGTA,APqBA,AlBsDA,AMlBA,ADGA,A0B9EA;AELA,APqBA,AGTA,ADGA,Af6CA,AIZA,Ae7CA,AvBqEA,ACHA,AYpCA,AGTA,APqBA,AlBsDA,AMlBA,ADGA,A0B9EA;AELA,APqBA,AQxBA,ALeA,ADGA,Af6CA,AIZA,Ae7CA,AvBqEA,ACHA,AYpCA,AGTA,AzB2EA,AMlBA,ADGA,A0B9EA;AELA,APqBA,AQxBA,ALeA,ADGA,Af6CA,AIZA,Ae7CA,AvBqEA,ACHA,AYpCA,AGTA,AzB2EA,AMlBA,ADGA,A0B9EA;AELA,APqBA,AQxBA,ALeA,ADGA,Af6CA,AIZA,Ae7CA,AvBqEA,ACHA,AYpCA,AGTA,AzB2EA,AMlBA,ADGA,A0B9EA;AELA,APqBA,AS3BA,ADGA,ALeA,ADGA,Af6CA,AIZA,Ae7CA,AvBqEA,ACHA,AYpCA,AGTA,AzB2EA,AMlBA,ADGA,A0B9EA;AELA,APqBA,AS3BA,ADGA,ALeA,ADGA,Af6CA,AIZA,Ae7CA,AvBqEA,ACHA,AYpCA,AGTA,AzB2EA,AMlBA,ADGA,A0B9EA;AELA,APqBA,AS3BA,ADGA,ALeA,ADGA,Af6CA,AIZA,Ae7CA,AvBqEA,ACHA,AYpCA,AGTA,AzB2EA,AMlBA,ADGA,A0B9EA;AELA,APqBA,AS3BA,ACHA,APqBA,ADGA,Af6CA,AIZA,Ae7CA,AvBqEA,ACHA,AYpCA,AGTA,AzB2EA,AMlBA,ADGA,A0B9EA;AELA,APqBA,AS3BA,ACHA,APqBA,ADGA,Af6CA,AIZA,Ae7CA,AvBqEA,ACHA,AYpCA,AGTA,AzB2EA,AMlBA,ADGA,A0B9EA;AELA,APqBA,AS3BA,ACHA,APqBA,ADGA,Af6CA,AIZA,Ae7CA,AvBqEA,ACHA,AYpCA,AGTA,AzB2EA,AMlBA,ADGA,A0B9EA;AELA,APqBA,AS3BA,ACHA,APqBA,ADGA,Af6CA,AIZA,Ae7CA,AvBqEA,A4BpFA,A3BiFA,AYpCA,AGTA,AzB2EA,AMlBA,ADGA,A0B9EA;AELA,APqBA,AS3BA,ACHA,APqBA,ADGA,Af6CA,AIZA,Ae7CA,AvBqEA,A4BpFA,A3BiFA,AYpCA,AGTA,AzB2EA,AMlBA,ADGA,A0B9EA;AELA,APqBA,AS3BA,ACHA,APqBA,ADGA,Af6CA,AIZA,Ae7CA,AvBqEA,A4BpFA,A3BiFA,AYpCA,AGTA,AzB2EA,AMlBA,ADGA,A0B9EA;ALgBA,AS3BA,ACHA,APqBA,ADGA,Af6CA,AIZA,Ae7CA,AvBqEA,A4BpFA,A3BiFA,AYpCA,AGTA,AavCA,AtCkHA,AKfA,A0B9EA;ALgBA,AS3BA,ACHA,ARwBA,Af6CA,AIZA,Ae7CA,AvBqEA,A4BpFA,A3BiFA,AYpCA,AGTA,AavCA,AtCkHA,AKfA,A0B9EA;ALgBA,AS3BA,ACHA,ARwBA,Af6CA,AIZA,Ae7CA,AvBqEA,A4BpFA,A3BiFA,AYpCA,AGTA,AavCA,AtCkHA,AKfA,A0B9EA;ALgBA,AS3BA,ACHA,ARwBA,Af6CA,AIZA,Ae7CA,AvBqEA,A4BpFA,A3BiFA,AYpCA,AGTA,AavCA,AtCkHA,AKfA,A0B9EA,AQxBA;AbwCA,AS3BA,ACHA,ARwBA,Af6CA,AIZA,Ae7CA,AvBqEA,A4BpFA,AZoCA,AavCA,AtCkHA,AKfA,A0B9EA,AQxBA;AbwCA,AS3BA,ACHA,ARwBA,Af6CA,AIZA,Ae7CA,AvBqEA,A4BpFA,AZoCA,AavCA,AtCkHA,AKfA,A0B9EA,AQxBA;AbwCA,AS3BA,ACHA,ARwBA,Af6CA,AIZA,Ae7CA,AvBqEA,A+B7FA,AHSA,AZoCA,AavCA,AtCkHA,AKfA,A0B9EA,AQxBA;AbwCA,AS3BA,ACHA,ARwBA,Af6CA,AIZA,Ae7CA,AvBqEA,A+B7FA,AHSA,AZoCA,AavCA,AtCkHA,AKfA,A0B9EA,AQxBA;AbwCA,AS3BA,ACHA,ARwBA,Af6CA,AIZA,Ae7CA,AvBqEA,A+B7FA,AHSA,AZoCA,AavCA,AtCkHA,AKfA,A0B9EA,AQxBA;AbwCA,AS3BA,ACHA,ARwBA,Af6CA,AIZA,AwBxEA,AT2BA,AvBqEA,A+B7FA,AHSA,AZoCA,AavCA,AtCkHA,AKfA,A0B9EA,AQxBA;AbwCA,AS3BA,ACHA,ARwBA,Af6CA,AIZA,AwBxEA,AT2BA,AvBqEA,A+B7FA,AHSA,AZoCA,AavCA,AtCkHA,AKfA,A0B9EA,AQxBA;AbwCA,AS3BA,ACHA,ARwBA,Af6CA,AIZA,AwBxEA,AT2BA,AvBqEA,A+B7FA,AHSA,AZoCA,AavCA,AtCkHA,AKfA,A0B9EA,AQxBA;AbwCA,AS3BA,ACHA,ARwBA,Af6CA,AIZA,AwBxEA,AT2BA,AvBqEA,A+B7FA,AHSA,AZoCA,AiBnDA,AJYA,AjCmGA,A0B9EA,AQxBA;AbwCA,AS3BA,ACHA,ARwBA,Af6CA,AIZA,AwBxEA,AT2BA,AvBqEA,A+B7FA,AHSA,AZoCA,AiBnDA,AJYA,AjCmGA,A0B9EA,AQxBA;AbwCA,AS3BA,APqBA,Af6CA,AIZA,AwBxEA,AT2BA,AvBqEA,A+B7FA,AHSA,AZoCA,AiBnDA,AJYA,AjCmGA,A0B9EA,AQxBA;AbwCA,AS3BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AlCsGA,A+B7FA,AHSA,AZoCA,AiBnDA,AJYA,AjCmGA,AkCtGA;AbwCA,AS3BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AHSA,AHSA,AZoCA,AiBnDA,AJYA,AjCmGA,AkCtGA;AbwCA,AS3BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AHSA,AHSA,AZoCA,AiBnDA,AJYA,AjCmGA,AkCtGA;AbwCA,AS3BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AHSA,AHSA,AZoCA,AiBnDA,AENA,ANkBA,AjCmGA,AkCtGA;AbwCA,AS3BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AHSA,AHSA,AZoCA,AiBnDA,AENA,ANkBA,AjCmGA,AkCtGA;AbwCA,AS3BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AHSA,AHSA,AZoCA,AiBnDA,AENA,ANkBA,AjCmGA,AkCtGA;AbwCA,AmBzDA,AV8BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AHSA,AHSA,AZoCA,AiBnDA,AENA,ANkBA,AjCmGA,AkCtGA;AbwCA,AmBzDA,AV8BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AHSA,AHSA,AZoCA,AiBnDA,AENA,ANkBA,AjCmGA,AkCtGA;AbwCA,AmBzDA,AV8BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AHSA,AHSA,AZoCA,AiBnDA,AENA,ANkBA,AjCmGA,AkCtGA;AOpBA,ApB4DA,AmBzDA,AV8BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AHSA,AHSA,AZoCA,AiBnDA,AENA,ANkBA,AjCmGA,AkCtGA;AOpBA,ApB4DA,AmBzDA,AV8BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AHSA,AHSA,AZoCA,AiBnDA,AENA,ANkBA,AjCmGA,AkCtGA;AOpBA,ApB4DA,AmBzDA,AV8BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AHSA,AHSA,AZoCA,AiBnDA,AENA,ANkBA,AjCmGA,AkCtGA;AOpBA,ApB4DA,AmBzDA,AV8BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AHSA,AHSA,AZoCA,AiBnDA,AENA,ANkBA,AS3BA,A1C8HA,AkCtGA;AOpBA,ApB4DA,AmBzDA,AV8BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AHSA,AHSA,AZoCA,AiBnDA,AENA,ANkBA,AS3BA,A1C8HA,AkCtGA;AOpBA,ApB4DA,AmBzDA,AV8BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AHSA,AHSA,AZoCA,AiBnDA,AENA,ANkBA,AS3BA,A1C8HA,AkCtGA;AOpBA,ApB4DA,AmBzDA,AV8BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AKfA,ARwBA,AHSA,AZoCA,AiBnDA,AENA,ANkBA,AS3BA,A1C8HA,AkCtGA;AOpBA,ApB4DA,AmBzDA,AV8BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AKfA,ARwBA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,A1C8HA,AkCtGA;AOpBA,ApB4DA,AS3BA,APqBA,AXiCA,AwBxEA,AT2BA,AWjCA,AKfA,ARwBA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,A1C8HA,AkCtGA;AOpBA,ApB4DA,AS3BA,APqBA,AXiCA,AwBxEA,AT2BA,AiBnDA,ANkBA,AKfA,ARwBA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,A1C8HA,AkCtGA;AOpBA,ApB4DA,AS3BA,APqBA,AXiCA,AwBxEA,AT2BA,AiBnDA,ANkBA,AKfA,ARwBA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,A1C8HA,AkCtGA;AOpBA,ApB4DA,AS3BA,APqBA,AXiCA,AwBxEA,AT2BA,AiBnDA,ANkBA,AKfA,ARwBA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,A1C8HA,AkCtGA;AOpBA,ApB4DA,AS3BA,APqBA,AXiCA,AwBxEA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,AV8BA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,A1C8HA,AkCtGA;AOpBA,ApB4DA,AS3BA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,AV8BA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,A1C8HA,AkCtGA;AOpBA,ApB4DA,AS3BA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,AV8BA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,A1C8HA,AkCtGA;AOpBA,ApB4DA,AS3BA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,A1C8HA,AkCtGA;AOpBA,ApB4DA,AS3BA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,A1C8HA,AkCtGA;AOpBA,ApB4DA,AS3BA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,A1C8HA,AkCtGA;AOpBA,ApB4DA,AS3BA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,AKfA,A/C6IA,AkCtGA;AOpBA,ApB4DA,AS3BA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,AKfA,A/C6IA,AkCtGA;AOpBA,ApB4DA,AS3BA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,AKfA,A/C6IA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,AMlBA,ADGA,A/C6IA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,AMlBA,ADGA,A/C6IA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,AMlBA,ADGA,A/C6IA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,AMlBA,ACHA,AFMA,A/C6IA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,AMlBA,ACHA,AFMA,A/C6IA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,AMlBA,ACHA,AjDmJA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,AMlBA,ACHA,ACHA,AlDsJA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,AMlBA,ACHA,ACHA,AlDsJA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,AMlBA,ACHA,ACHA,AlDsJA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,AMlBA,ACHA,AENA,ADGA,AlDsJA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AiBnDA,AENA,ANkBA,AS3BA,AMlBA,ACHA,AENA,ADGA,AlDsJA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AMlBA,ACHA,AENA,ADGA,AlDsJA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AMlBA,ACHA,AENA,ADGA,AENA,ApD4JA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AMlBA,ACHA,AENA,ADGA,AENA,ApD4JA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AMlBA,ACHA,AENA,ADGA,AENA,ApD4JA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AMlBA,ACHA,AENA,ADGA,AENA,ACHA,ArD+JA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AMlBA,ACHA,AENA,ADGA,AENA,ACHA,ArD+JA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AMlBA,ACHA,AENA,ADGA,AENA,ACHA,ArD+JA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AMlBA,ACHA,AENA,AGTA,AJYA,AENA,ACHA,ArD+JA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AMlBA,ACHA,AKfA,AJYA,AENA,ACHA,ArD+JA,AkCtGA;AOpBA,AXiCA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AMlBA,ACHA,AKfA,AJYA,AENA,ACHA,ArD+JA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AMlBA,ACHA,AKfA,AJYA,AENA,ACHA,AENA,AvDqKA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AMlBA,ACHA,AKfA,AJYA,AGTA,AENA,AvDqKA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AOrBA,AKfA,AJYA,AGTA,AENA,AvDqKA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AOrBA,AKfA,AJYA,AGTA,AENA,ACHA,AxDwKA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AOrBA,AKfA,AJYA,AKfA,ACHA,AxDwKA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AOrBA,AKfA,AJYA,AKfA,ACHA,AxDwKA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AOrBA,AKfA,AJYA,AOrBA,AFMA,ACHA,AxDwKA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AOrBA,ACHA,AOrBA,AFMA,ACHA,AxDwKA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AOrBA,ACHA,AOrBA,AFMA,ACHA,AxDwKA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AOrBA,ACHA,AOrBA,AFMA,AGTA,AFMA,AxDwKA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AOrBA,ACHA,AOrBA,ACHA,AFMA,AxDwKA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,Af6CA,AmBzDA,ANkBA,AS3BA,AOrBA,ACHA,AOrBA,ACHA,AFMA,AxDwKA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,AIZA,ANkBA,AS3BA,AOrBA,ACHA,AOrBA,ACHA,ACHA,AHSA,AxDwKA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,AIZA,ANkBA,AS3BA,AOrBA,ACHA,AOrBA,ACHA,ACHA,A3DiLA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AENA,ACHA,AXiCA,AIZA,ANkBA,AS3BA,AOrBA,ACHA,AOrBA,ACHA,ACHA,A3DiLA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,AXiCA,AIZA,ANkBA,AS3BA,AQxBA,AOrBA,ACHA,AENA,ADGA,A3DiLA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,AXiCA,AIZA,ANkBA,AS3BA,AQxBA,AQxBA,AENA,ADGA,A3DiLA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,AXiCA,AIZA,ANkBA,AS3BA,AgBhDA,AENA,ADGA,A3DiLA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,AXiCA,AIZA,ANkBA,AS3BA,AgBhDA,AENA,ACHA,AFMA,A3DiLA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,AXiCA,AIZA,ANkBA,AS3BA,AkBtDA,ACHA,AFMA,A3DiLA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,AXiCA,AIZA,ANkBA,AS3BA,AkBtDA,ACHA,AFMA,A3DiLA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,AXiCA,AIZA,ANkBA,AS3BA,AkBtDA,ACHA,ACHA,AHSA,A3DiLA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,APqBA,ANkBA,AS3BA,AkBtDA,ACHA,ACHA,A9D0LA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,APqBA,ANkBA,AS3BA,AkBtDA,ACHA,ACHA,A9D0LA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,APqBA,ANkBA,AS3BA,AkBtDA,ACHA,AENA,ADGA,A9D0LA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,APqBA,ANkBA,AS3BA,AmBzDA,AENA,ADGA,A9D0LA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,APqBA,ANkBA,AS3BA,AmBzDA,AENA,ADGA,A9D0LA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,AbuCA,AS3BA,AsBlEA,AHSA,AENA,ADGA,A9D0LA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,AbuCA,AS3BA,AsBlEA,ADGA,ADGA,A9D0LA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,AbuCA,AS3BA,AsBlEA,ADGA,ADGA,A9D0LA,AkCtGA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,AbuCA,AS3BA,AsBlEA,ADGA,ADGA,A9D0LA,AiEnMA,A/B6FA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,AbuCA,AS3BA,AsBlEA,ADGA,AENA,A/B6FA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,AbuCA,A+B7FA,ADGA,AENA,A/B6FA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,AbuCA,A+B7FA,ADGA,AGTA,ADGA,A/B6FA;AJaA,APqBA,AavCA,AT2BA,AiBnDA,ANkBA,AKfA,AGTA,AbuCA,A+B7FA,AENA,ADGA,A/B6FA;AJaA,APqBA,AavCA,AT2BA,AWjCA,AKfA,AGTA,AbuCA,A+B7FA,AENA,ADGA;AnC0GA,APqBA,AavCA,AT2BA,AWjCA,AKfA,AGTA,AbuCA,A+B7FA,AENA,ADGA,AENA;ArCgHA,APqBA,AavCA,AT2BA,AWjCA,AKfA,AGTA,AbuCA,AiCnGA,ADGA,AENA;ArCgHA,APqBA,AavCA,AT2BA,AWjCA,AKfA,AGTA,AbuCA,AiCnGA,ADGA,AENA;ArCgHA,APqBA,AavCA,AT2BA,AWjCA,AKfA,AGTA,AbuCA,AiCnGA,AENA,AHSA,AENA;ArCgHA,APqBA,AavCA,AENA,AKfA,AGTA,AbuCA,AiCnGA,AENA,AHSA,AENA;ArCgHA,APqBA,AavCA,AENA,AKfA,AGTA,AbuCA,AiCnGA,AENA,AHSA,AENA;ArCgHA,APqBA,AavCA,AENA,AKfA,AGTA,AbuCA,AiCnGA,AGTA,ADGA,AHSA,AENA;ArCgHA,APqBA,AavCA,AENA,AKfA,AGTA,AbuCA,AiCnGA,AGTA,ADGA,AHSA,AENA;ArCgHA,APqBA,AavCA,AENA,AKfA,AGTA,AoB5DA,AGTA,ADGA,ADGA;ArCgHA,APqBA,AavCA,AENA,AKfA,AGTA,AoB5DA,AGTA,ADGA,AENA,AHSA;ArCgHA,APqBA,AavCA,AENA,AKfA,AGTA,AoB5DA,AGTA,ADGA,AENA,AHSA;ArCgHA,APqBA,AavCA,AENA,AKfA,AGTA,AoB5DA,AGTA,ADGA,AENA,AHSA;ArCgHA,APqBA,AavCA,AENA,AKfA,AGTA,AyB3EA,ALeA,AGTA,ADGA,AENA,AHSA;ArCgHA,APqBA,Ae7CA,AKfA,AGTA,AyB3EA,ALeA,AGTA,ADGA,AENA,AHSA;ArCgHA,APqBA,Ae7CA,AKfA,AGTA,AyB3EA,AFMA,ADGA,AENA,AHSA;AKdA,A1C8HA,APqBA,Ae7CA,AKfA,AGTA,AyB3EA,AFMA,ADGA,AENA,AHSA;AKdA,A1C8HA,APqBA,Ae7CA,AKfA,AGTA,AyB3EA,AFMA,ADGA,AENA,AHSA;AKdA,A1C8HA,APqBA,Ae7CA,AKfA,AGTA,AyB3EA,AFMA,ADGA,AENA,AHSA;AMjBA,ADGA,A1C8HA,APqBA,Ae7CA,AKfA,AGTA,AyB3EA,AFMA,ADGA,AENA,AHSA;AMjBA,ADGA,A1C8HA,APqBA,Ae7CA,AKfA,AGTA,AyB3EA,AFMA,ADGA,AENA,AHSA;AMjBA,ADGA,A1C8HA,APqBA,Ae7CA,AKfA,AGTA,AyB3EA,AFMA,ADGA,AENA,AHSA;AMjBA,ADGA,AENA,A5CoIA,APqBA,Ae7CA,AKfA,AGTA,AyB3EA,AFMA,ADGA,AENA,AHSA;AMjBA,ADGA,AENA,A5CoIA,APqBA,Ae7CA,AKfA,AGTA,AyB3EA,AHSA,AENA,AHSA;AMjBA,ADGA,AENA,A5CoIA,APqBA,Ae7CA,AKfA,AGTA,AyB3EA,AHSA,AENA,AHSA;AMjBA,AENA,AHSA,AENA,A5CoIA,APqBA,Ae7CA,AKfA,AGTA,AyB3EA,AHSA,AENA,AHSA;AMjBA,AENA,AHSA,AENA,A5CoIA,APqBA,Ae7CA,AKfA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AENA,AHSA,AENA,A5CoIA,APqBA,Ae7CA,AKfA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AENA,ACHA,AJYA,AENA,A5CoIA,APqBA,Ae7CA,AKfA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AENA,ACHA,AJYA,AENA,A5CoIA,APqBA,Ae7CA,AKfA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AENA,ACHA,AJYA,AENA,A5CoIA,APqBA,Ae7CA,AKfA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,AFMA,ACHA,AJYA,AENA,A5CoIA,APqBA,Ae7CA,AKfA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,AFMA,ACHA,AJYA,AENA,A5CoIA,APqBA,Ae7CA,AKfA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,AFMA,ACHA,AJYA,AENA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,AFMA,ACHA,AJYA,AMlBA,AJYA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,AFMA,ACHA,AJYA,AMlBA,AJYA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,AFMA,ACHA,AJYA,AMlBA,AJYA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,AFMA,ACHA,AJYA,AMlBA,ACHA,ALeA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,AFMA,ACHA,AJYA,AMlBA,ACHA,ALeA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,AFMA,ACHA,AJYA,AMlBA,ACHA,ALeA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,AFMA,ACHA,AJYA,AMlBA,ACHA,ACHA,ANkBA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,AFMA,ACHA,AJYA,AMlBA,ACHA,ACHA,ANkBA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,AFMA,ACHA,AJYA,AMlBA,ACHA,ACHA,ANkBA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,AFMA,ACHA,AJYA,AMlBA,ACHA,ACHA,ACHA,APqBA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,AFMA,ACHA,AJYA,AMlBA,ACHA,ACHA,ACHA,APqBA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,ALeA,AMlBA,ACHA,ACHA,ACHA,APqBA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,ALeA,AMlBA,ACHA,ACHA,ACHA,ACHA,ARwBA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,ALeA,AMlBA,ACHA,ACHA,ACHA,ACHA,ARwBA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,ALeA,AMlBA,ACHA,ACHA,ACHA,ACHA,ARwBA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,ALeA,AMlBA,ACHA,ACHA,ACHA,ACHA,ACHA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,ALeA,AMlBA,ACHA,AENA,ACHA,ACHA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,ACHA,ACHA,AENA,ACHA,ACHA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,ACHA,ACHA,AENA,ACHA,AENA,ADGA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,ACHA,ACHA,AENA,ACHA,AENA,ADGA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,ACHA,ACHA,AGTA,AENA,ADGA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,ACHA,ACHA,AGTA,AGTA,ADGA,ADGA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,ACHA,ACHA,AGTA,AGTA,ADGA,ADGA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,ACHA,ACHA,AGTA,AGTA,ADGA,ADGA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA;AMjBA,AIZA,ACHA,ACHA,AGTA,AGTA,ADGA,ADGA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA,AmBzDA;AbwCA,AIZA,ACHA,ACHA,AGTA,AGTA,ADGA,ADGA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA,AmBzDA;AbwCA,AIZA,ACHA,ACHA,AGTA,AGTA,ADGA,ADGA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA,AmBzDA;AbwCA,AIZA,ACHA,ACHA,AGTA,AGTA,ADGA,AGTA,AJYA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA,AmBzDA;AbwCA,AIZA,ACHA,ACHA,AGTA,AGTA,ADGA,AGTA,AJYA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA,AmBzDA;AbwCA,AIZA,ACHA,ACHA,AGTA,AGTA,ADGA,AGTA,AJYA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA,AmBzDA;AbwCA,AIZA,ACHA,ACHA,AGTA,AMlBA,AHSA,ADGA,AGTA,AJYA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AHSA,AmBzDA;AbwCA,AIZA,ACHA,ACHA,AGTA,AMlBA,AHSA,AENA,AJYA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AbwCA,AIZA,ACHA,ACHA,AGTA,AMlBA,AHSA,AENA,AJYA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AbwCA,AIZA,ACHA,ACHA,AU9BA,ADGA,AHSA,AENA,AJYA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AbwCA,AIZA,ACHA,ACHA,AU9BA,ADGA,AHSA,AENA,AJYA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AbwCA,AIZA,ACHA,ACHA,AU9BA,ADGA,AHSA,AENA,AJYA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AbwCA,AIZA,ACHA,ACHA,AU9BA,ADGA,AENA,ALeA,AENA,AJYA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AbwCA,AIZA,ACHA,ACHA,AU9BA,ADGA,AENA,ALeA,AENA,AJYA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AbwCA,AIZA,ACHA,ACHA,AU9BA,ADGA,AENA,ALeA,AENA,AJYA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AbwCA,AIZA,ACHA,ACHA,AYpCA,AFMA,ADGA,AENA,ALeA,AENA,AJYA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AbwCA,AIZA,ACHA,ACHA,AYpCA,AFMA,ADGA,AENA,ALeA,AFMA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AbwCA,AIZA,ACHA,ACHA,AYpCA,AFMA,ADGA,AENA,ALeA,AFMA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AMjBA,AnByDA,AIZA,ACHA,ACHA,AYpCA,AFMA,ADGA,AENA,ALeA,AFMA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AMjBA,AnByDA,AIZA,ACHA,ACHA,AYpCA,AFMA,ACHA,ALeA,AFMA,AT2BA,A5CoIA,APqBA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AMjBA,AnByDA,AIZA,ACHA,ACHA,AYpCA,AFMA,ACHA,ALeA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AMjBA,ACHA,ApB4DA,AIZA,ACHA,ACHA,AYpCA,AFMA,ACHA,ALeA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AMjBA,ACHA,ApB4DA,AIZA,ACHA,ACHA,AYpCA,AFMA,ACHA,ALeA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AMjBA,ACHA,ApB4DA,AIZA,ACHA,ACHA,AYpCA,AFMA,ACHA,ALeA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AMjBA,ACHA,ACHA,ArB+DA,AKfA,ACHA,AYpCA,AFMA,ACHA,ALeA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AMjBA,ACHA,ACHA,ArB+DA,AKfA,ACHA,AYpCA,AFMA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AMjBA,ACHA,ACHA,ArB+DA,AKfA,ACHA,AYpCA,AFMA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AMjBA,ACHA,AENA,ADGA,ArB+DA,AKfA,ACHA,AYpCA,AFMA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AMjBA,ACHA,AENA,ADGA,ArB+DA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AMjBA,ACHA,AENA,ADGA,ArB+DA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AMjBA,ACHA,AENA,ADGA,AENA,AvBqEA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AMjBA,ACHA,AENA,ADGA,AENA,AvBqEA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AMjBA,ACHA,AENA,ADGA,AENA,AvBqEA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AENA,AgBhDA;AWhCA,ALeA,ACHA,AENA,ADGA,AENA,AvBqEA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ALeA,ACHA,AENA,ADGA,AENA,AvBqEA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ALeA,ACHA,AENA,ADGA,AENA,AvBqEA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ANkBA,ACHA,AENA,ADGA,AENA,AvBqEA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ANkBA,ACHA,AENA,ADGA,AENA,AvBqEA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ANkBA,ACHA,AENA,ADGA,AENA,AvBqEA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ANkBA,AOrBA,ANkBA,AENA,ADGA,AENA,AvBqEA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ANkBA,AOrBA,ANkBA,AENA,ADGA,AENA,AvBqEA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ANkBA,AOrBA,ANkBA,AENA,ADGA,AENA,AvBqEA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ANkBA,AOrBA,ANkBA,AENA,ADGA,AENA,AIZA,A3BiFA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ANkBA,AOrBA,ANkBA,AENA,ADGA,AENA,AIZA,A3BiFA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ANkBA,AOrBA,ANkBA,AENA,ADGA,AENA,AIZA,A3BiFA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ANkBA,AOrBA,ANkBA,AENA,ADGA,AENA,AIZA,ACHA,A5BoFA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ANkBA,AOrBA,ANkBA,AENA,ADGA,AENA,AIZA,ACHA,A5BoFA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ANkBA,AOrBA,ANkBA,AENA,ADGA,AENA,AIZA,ACHA,A5BoFA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ACHA,ANkBA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,A7BuFA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ACHA,ANkBA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,A7BuFA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ACHA,ANkBA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,A7BuFA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ACHA,ANkBA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ACHA,ANkBA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AoB5DA,A4BpFA,AHSA,AkBtDA;AWhCA,ACHA,ACHA,ANkBA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AU9BA,AJYA,AFMA,AT2BA,AnDyJA,AgDhJA,AHSA,AkBtDA;AWhCA,ACHA,ACHA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AgDhJA,AHSA,AkBtDA;AWhCA,ACHA,ACHA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AgDhJA,AHSA,AkBtDA;AWhCA,ACHA,ACHA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AgDhJA,AHSA,AkBtDA;AYnCA,AOrBA,ANkBA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AgDhJA,AHSA,AkBtDA;AYnCA,AOrBA,ANkBA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AgDhJA,AHSA,AkBtDA;AYnCA,AOrBA,ANkBA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AgDhJA,AHSA,AkBtDA;AmBxDA,ACHA,APqBA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AgDhJA,AHSA,AkBtDA;AmBxDA,ACHA,APqBA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,A6CvIA,AkBtDA;AmBxDA,ACHA,APqBA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,A6CvIA,AkBtDA;AmBxDA,ACHA,APqBA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AoF5PA,AvCqHA,AkBtDA;AmBxDA,ACHA,APqBA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AoF5PA,AvCqHA,AkBtDA;AmBxDA,ACHA,APqBA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AoF5PA,AvCqHA,AkBtDA;AmBxDA,ACHA,APqBA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AqF/PA,ADGA,AvCqHA,AkBtDA;AmBxDA,ACHA,APqBA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AqF/PA,ADGA,AvCqHA,AkBtDA;AmBxDA,ACHA,APqBA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AqF/PA,ADGA,AvCqHA,AkBtDA;AmBxDA,ACHA,APqBA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AqF/PA,ADGA,AENA,AzC2HA,AkBtDA;AmBxDA,ACHA,APqBA,AKfA,AXiCA,AENA,ADGA,AENA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AqF/PA,ADGA,AENA,AzC2HA,AkBtDA;AmBxDA,ACHA,APqBA,AKfA,AT2BA,ACHA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AqF/PA,ADGA,AENA,AzC2HA,AkBtDA;AmBxDA,ACHA,APqBA,AKfA,AT2BA,ACHA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,A1C8HA,AkBtDA;AmBxDA,ACHA,APqBA,AKfA,AT2BA,ACHA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AFMA,AT2BA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,A1C8HA,AkBtDA;AmBxDA,ACHA,APqBA,AKfA,AT2BA,ACHA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,A1C8HA,AkBtDA;AmBxDA,ACHA,APqBA,AJYA,ACHA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,AENA,ADGA,A1C8HA,AkBtDA;AmBxDA,ACHA,APqBA,AJYA,ACHA,AIZA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,AENA,ADGA,A1C8HA,AkBtDA;AmBxDA,ACHA,APqBA,AJYA,AKfA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,AENA,ADGA,A1C8HA,AkBtDA;AmBxDA,ACHA,APqBA,AJYA,AKfA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,AENA,ADGA,AENA,A5CoIA,AkBtDA;AmBxDA,ACHA,APqBA,AJYA,AKfA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,AENA,ADGA,AENA,A5CoIA,AkBtDA;AmBxDA,ACHA,APqBA,AJYA,AKfA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,AENA,ADGA,AENA,A5CoIA,AkBtDA;AmBxDA,ACHA,APqBA,AJYA,AKfA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,AENA,ADGA,AGTA,A7CuIA,AkBtDA;AmBxDA,ACHA,APqBA,AJYA,AKfA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,AENA,ADGA,AGTA,A7CuIA,AkBtDA;AmBxDA,ACHA,APqBA,AJYA,AKfA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,AENA,ADGA,AGTA,A7CuIA;AqC9GA,ACHA,APqBA,AJYA,AKfA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,AENA,ADGA,AIZA,A9C0IA;AsCjHA,APqBA,AJYA,AKfA,ACHA,ACHA,ACHA,A9B0FA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,AENA,ADGA,AIZA,A9C0IA;AsCjHA,APqBA,AJYA,AKfA,ACHA,ACHA,A7BuFA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,AENA,ADGA,AIZA,A9C0IA;AsCjHA,APqBA,AJYA,AKfA,ACHA,ACHA,A7BuFA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,AENA,ADGA,AKfA,A/C6IA;A+B5FA,AJYA,AKfA,ACHA,ACHA,A7BuFA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,AKfA,A/C6IA;A+B5FA,AJYA,AKfA,ACHA,A5BoFA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,AKfA,A/C6IA;A+B5FA,AJYA,AKfA,ACHA,A5BoFA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,AMlBA,AhDgJA;A+B5FA,AJYA,AKfA,ACHA,A5BoFA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,AMlBA,AhDgJA;A+B5FA,AJYA,AKfA,ACHA,A5BoFA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,AMlBA,AhDgJA;A+B5FA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,AOrBA,AjDmJA;A+B5FA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,AOrBA,AjDmJA;A+B5FA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,AMlBA,AXiCA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,AOrBA,AjDmJA;A+B5FA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,AQxBA,AlDsJA;A+B5FA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,AQxBA,AlDsJA;A+B5FA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,AQxBA,AlDsJA;A+B5FA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,AS3BA,AnDyJA;A+B5FA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,AS3BA,AnDyJA;A+B5FA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,ACHA,AS3BA,AnDyJA;A+B5FA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,AU9BA,AnDyJA,AoD5JA;ArBgEA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,AU9BA,AnDyJA,AoD5JA;ArBgEA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,AU9BA,AnDyJA,AoD5JA;ArBgEA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,AU9BA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,AU9BA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,AU9BA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,AavCA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,AavCA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,AavCA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,Ac1CA,ADGA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,Ac1CA,ADGA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AMlBA,A5BoFA,AKfA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,Ac1CA,ADGA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AMlBA,A5BoFA,AmDzJA,A9C0IA,ACHA,ALeA,AnDyJA,AqF/PA,ADGA,AENA,Ac1CA,ADGA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AtBkEA,AmDzJA,A9C0IA,ACHA,ALeA,AnDyJA,AqF/PA,ACHA,Ac1CA,ADGA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AtBkEA,AmDzJA,A9C0IA,ACHA,ALeA,AnDyJA,AqF/PA,ACHA,Ac1CA,ADGA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AtBkEA,AmDzJA,A9C0IA,ACHA,ALeA,AnDyJA,AqF/PA,ACHA,Ac1CA,AENA,AHSA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AtBkEA,AmDzJA,A9C0IA,ACHA,ALeA,AnDyJA,AqF/PA,ACHA,Ac1CA,AENA,AHSA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AtBkEA,AmDzJA,A9C0IA,ACHA,ALeA,AnDyJA,AqF/PA,ACHA,Ac1CA,AENA,AHSA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AtBkEA,AmDzJA,A9C0IA,ACHA,ALeA,AnDyJA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AtBkEA,AmDzJA,A9C0IA,ACHA,ALeA,AnDyJA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AtBkEA,AmDzJA,A9C0IA,ACHA,ALeA,AnDyJA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AtBkEA,AmDzJA,A9C0IA,ACHA,ALeA,AnDyJA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AtBkEA,AmDzJA,A9C0IA,ACHA,ALeA,AnDyJA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,AJYA,AtBkEA,AmDzJA,A9C0IA,ACHA,ALeA,AnDyJA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,ACHA,AiDnJA,AzG2TA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,ACHA,AiDnJA,AzG2TA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,ACHA,AiDnJA,AzG2TA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,ACHA,AiDnJA,ACHA,A1G8TA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AkDtJA,ACHA,A1G8TA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AkDtJA,ACHA,A1G8TA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AkDtJA,ACHA,ACHA,A3GiUA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AkDtJA,ACHA,ACHA,A3GiUA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AkDtJA,ACHA,ACHA,A3GiUA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AkDtJA,AGTA,AFMA,ACHA,A3GiUA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AkDtJA,AGTA,AFMA,ACHA,A3GiUA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AkDtJA,AGTA,AFMA,ACHA,A3GiUA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AkDtJA,AGTA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AoD5JA,ACHA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AkDtJA,AGTA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AqD/JA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AkDtJA,AGTA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AqD/JA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AkDtJA,AKfA,AFMA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AqD/JA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AkDtJA,AKfA,AFMA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AqD/JA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AkDtJA,AKfA,AFMA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AqD/JA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AwDxKA,ANkBA,AKfA,AFMA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AqD/JA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AwDxKA,ANkBA,AKfA,AFMA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AqD/JA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AwDxKA,ANkBA,AKfA,AFMA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AqD/JA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AwDxKA,ANkBA,AKfA,AFMA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,AkBtDA,AJYA,AENA,ACHA,AJYA,AHSA,AnDyJA,AmEzMA,Ad0CA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AwDxKA,ANkBA,AKfA,AFMA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AmEzMA,Ad0CA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AwDxKA,ANkBA,AKfA,AFMA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AmEzMA,Ad0CA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AwDxKA,ADGA,AGTA,ALeA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AmEzMA,Ad0CA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AwDxKA,ADGA,AGTA,ALeA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AmEzMA,Ad0CA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,AwDxKA,ADGA,AGTA,ALeA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AmEzMA,Ad0CA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,A2DjLA,AHSA,ADGA,AGTA,ALeA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AmEzMA,Ad0CA;AtBmEA,A1B8EA,AmDzJA,A9C0IA,A2DjLA,AHSA,ADGA,AGTA,ALeA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AmEzMA,Ad0CA;AtBmEA,A1B8EA,AmDzJA,AavCA,AHSA,ADGA,AGTA,ALeA,AFMA,ACHA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AmEzMA,Ad0CA;AtBmEA,A1B8EA,AmDzJA,AavCA,AHSA,ADGA,AGTA,ALeA,AFMA,AS3BA,ARwBA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AmEzMA,Ad0CA;AtBmEA,A1B8EA,AmDzJA,AavCA,AHSA,ADGA,AGTA,ALeA,AFMA,AS3BA,ARwBA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AmEzMA,Ad0CA;AtBmEA,A1B8EA,AmDzJA,AavCA,AHSA,ADGA,AGTA,ALeA,AFMA,AS3BA,ARwBA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AmEzMA,Ad0CA;AtBmEA,A1B8EA,AmDzJA,AavCA,AHSA,AKfA,ANkBA,AGTA,ALeA,AFMA,AS3BA,ARwBA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AmEzMA,Ad0CA;AtBmEA,A1B8EA,AmDzJA,AavCA,AHSA,AKfA,ANkBA,AGTA,ALeA,AFMA,AS3BA,ARwBA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AmEzMA;ApC6GA,A1B8EA,AmDzJA,AavCA,AHSA,AKfA,ANkBA,AGTA,ALeA,AFMA,AS3BA,ARwBA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,ACHA,AJYA,AHSA,AnDyJA,AmEzMA;ApC6GA,A1B8EA,AmDzJA,AavCA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,AHSA,AHSA,AnDyJA,AmEzMA;ApC6GA,A1B8EA,AmDzJA,AavCA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,AHSA,AHSA,AnDyJA,AmEzMA;ApC6GA,A1B8EA,AmDzJA,AavCA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,AHSA,AHSA,AnDyJA,AmEzMA;ApC6GA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,AHSA,AHSA,AnDyJA,AmEzMA;ApC6GA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,AHSA,AHSA,AnDyJA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,AENA,A7GuUA,AqF/PA,ACHA,Ac1CA,AENA,AHSA,AHSA,AnDyJA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,AENA,A7GuUA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AHSA,AHSA,AnDyJA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,AENA,A7GuUA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AHSA,AHSA,AnDyJA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,AENA,A7GuUA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AHSA,AHSA,AnDyJA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,AENA,A7GuUA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AHSA,AHSA,AwBxEA,A3EiOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,AENA,A7GuUA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AHSA,AHSA,AwBxEA,A3EiOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,AENA,A7GuUA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AHSA,AHSA,AwBxEA,A3EiOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,AENA,A7GuUA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AHSA,AHSA,AwBxEA,ACHA,A5EoOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,A3GiUA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AHSA,AHSA,AwBxEA,ACHA,A5EoOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,A3GiUA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AHSA,AHSA,AwBxEA,ACHA,A5EoOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,A3GiUA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,AvBqEA,AHSA,AwBxEA,ACHA,A5EoOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,ALeA,AOrBA,ARwBA,A3GiUA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,AvBqEA,AHSA,AwBxEA,ACHA,A5EoOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,ARwBA,A3GiUA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,AvBqEA,AHSA,AwBxEA,ACHA,A5EoOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,ACHA,A5EoOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,ACHA,A5EoOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,ACHA,A5EoOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,AHSA,A5EoOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,AHSA,A5EoOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,AHSA,A5EoOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,A1B8EA,AHSA,AwBxEA,AIZA,AHSA,A5EoOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,A1B8EA,AHSA,AwBxEA,AIZA,AHSA,A5EoOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,A1B8EA,AHSA,AwBxEA,AIZA,AHSA,A5EoOA;A+B5FA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,A1B8EA,AHSA,AwBxEA,AIZA,AHSA,A5EoOA,AiFnPA;AlDuJA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,A1B8EA,AHSA,AwBxEA,AIZA,AHSA,A5EoOA,AiFnPA;AlDuJA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,A1B8EA,AHSA,AwBxEA,AIZA,AHSA,A5EoOA,AiFnPA;AlDuJA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,AENA,A5BoFA,AHSA,AwBxEA,AIZA,AHSA,A5EoOA,AiFnPA;AlDuJA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,AENA,A5BoFA,AHSA,AwBxEA,AIZA,AHSA,A5EoOA,AiFnPA;AlDuJA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,AENA,A5BoFA,AHSA,AwBxEA,AIZA,AHSA,A5EoOA,AiFnPA;AlDuJA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,APqBA,AGTA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,AENA,A5BoFA,AHSA,AwBxEA,AIZA,AHSA,A5EoOA,AiFnPA,AENA;ApD6JA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,AJYA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,AENA,A5BoFA,AHSA,AwBxEA,AIZA,AHSA,A5EoOA,AiFnPA,AENA;ApD6JA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,AJYA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,AENA,A5BoFA,AHSA,AwBxEA,AIZA,AHSA,A5EoOA,AiFnPA,AENA;ApD6JA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,AJYA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,AENA,A5BoFA,AHSA,AwBxEA,AIZA,AHSA,A5EoOA,AiFnPA,AENA,ACHA;ArDgKA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AKfA,ACHA,AJYA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,AENA,A5BoFA,AHSA,AwBxEA,AIZA,A/E6OA,AiFnPA,AENA,ACHA;ArDgKA,A1B8EA,AmDzJA,AiBnDA,AJYA,AHSA,AMlBA,AJYA,AENA,AnHyVA,AqF/PA,AkCtGA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,AENA,A5BoFA,AHSA,AwBxEA,AIZA,A/E6OA,AiFnPA,AENA,ACHA;ArDgKA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AnHyVA,AqF/PA,A6CvIA,AXiCA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,AENA,A5BoFA,AHSA,AwBxEA,AIZA,A/E6OA,AiFnPA,AENA,ACHA;ArDgKA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AnHyVA,AqF/PA,A6CvIA,AXiCA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,AENA,A5BoFA,AHSA,AwBxEA,AIZA,A/E6OA,AiFnPA,AENA,ACHA;ArDgKA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,A9B0FA,A6CvIA,AXiCA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,AENA,A5BoFA,AHSA,AwBxEA,AIZA,A/E6OA,AiFnPA,AENA,ACHA;ArDgKA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,A9B0FA,A8C1IA,ADGA,AXiCA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,AENA,A5BoFA,AHSA,AwBxEA,AIZA,A/E6OA,AiFnPA,AENA,ACHA;ArDgKA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,A9B0FA,A8C1IA,ADGA,AXiCA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AENA,AENA,A5BoFA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA,ACHA;ArDgKA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,A9B0FA,A8C1IA,ADGA,AXiCA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AIZA,A5BoFA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA,ACHA;ArDgKA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,A9B0FA,A8C1IA,ADGA,AENA,AbuCA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AIZA,A5BoFA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA,ACHA;ArDgKA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,A9B0FA,A8C1IA,ADGA,AENA,AbuCA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA,ACHA;ArDgKA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,A9B0FA,A8C1IA,ADGA,AENA,AbuCA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA,ACHA;ArDgKA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,A9B0FA,A8C1IA,ADGA,AENA,ACHA,Ad0CA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA,ACHA;ArDgKA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,A9B0FA,A8C1IA,ADGA,AENA,ACHA,Ad0CA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA,ACHA;ArDgKA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,A9B0FA,A8C1IA,ADGA,AENA,ACHA,Ad0CA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA,ACHA;ArDgKA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,A9B0FA,A8C1IA,ADGA,AENA,AENA,ADGA,Ad0CA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA,ACHA;ArDgKA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,A9B0FA,A8C1IA,ACHA,AENA,ADGA,Ad0CA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA,ACHA;ArDgKA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,A9B0FA,A8C1IA,ACHA,AENA,ADGA,Ad0CA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AoB5DA,AlDsJA,A8C1IA,ACHA,AENA,ADGA,Ad0CA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AoB5DA,AlDsJA,A+C7IA,AENA,ADGA,Ad0CA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AoB5DA,AlDsJA,A+C7IA,AENA,ADGA,Ad0CA,AjCmGA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AoB5DA,AlDsJA,A+C7IA,AENA,ADGA,Ad0CA,AiBnDA,AlDsJA,Ac1CA,AENA,AoB5DA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AoB5DA,AlDsJA,A+C7IA,AENA,ADGA,Ad0CA,AiBnDA,AlDsJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AoB5DA,AlDsJA,A+C7IA,AENA,ADGA,Ad0CA,AiBnDA,AlDsJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AoB5DA,AlDsJA,A+C7IA,AENA,ADGA,Ad0CA,AiBnDA,ACHA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AoB5DA,AlDsJA,A+C7IA,AENA,Af6CA,AiBnDA,ACHA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AoB5DA,AlDsJA,A+C7IA,AENA,Af6CA,AiBnDA,ACHA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AoB5DA,AlDsJA,A+C7IA,AENA,Af6CA,AiBnDA,AENA,ADGA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AoB5DA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ADGA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AoB5DA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ADGA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AoB5DA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AoB5DA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AoB5DA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AyB3EA,ALeA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AyB3EA,ALeA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AyB3EA,ALeA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA,AmFzPA;ApD6JA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AyB3EA,ACHA,ANkBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AyB3EA,ACHA,ANkBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AyB3EA,ACHA,ANkBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AyB3EA,ACHA,ACHA,APqBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AyB3EA,ACHA,ACHA,APqBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,AENA,AyB3EA,ACHA,ACHA,APqBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,A8B1FA,AHSA,ACHA,ACHA,APqBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AavCA,AHSA,AMlBA,AJYA,A8B1FA,AHSA,ACHA,ACHA,APqBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,AHSA,ACHA,ACHA,APqBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,ACHA,ACHA,APqBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,ACHA,ACHA,APqBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,ACHA,ACHA,APqBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,AKfA,AJYA,ACHA,APqBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,AKfA,AJYA,ACHA,APqBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,AKfA,AHSA,APqBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,AKfA,ACHA,AJYA,APqBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,AKfA,ACHA,AJYA,APqBA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,AKfA,ACHA,AXiCA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AFMA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,AKfA,ACHA,AXiCA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AQxBA,AV8BA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,AKfA,ACHA,AXiCA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AQxBA,AV8BA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,AKfA,ACHA,AXiCA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AQxBA,AV8BA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,AKfA,ACHA,AXiCA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AS3BA,ADGA,AV8BA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,AMlBA,AXiCA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AS3BA,ADGA,AV8BA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,AMlBA,AXiCA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AS3BA,ADGA,AV8BA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,AMlBA,AXiCA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,ALeA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,ALeA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AnDyJA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,ALeA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,ALeA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,ALeA,AlDsJA,A+C7IA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,ALeA,AlDsJA,AkEtMA,AnByDA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,ALeA,AlDsJA,AkEtMA,AnByDA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,A8B1FA,ACHA,AJYA,ALeA,AlDsJA,AkEtMA,AnByDA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,AuCrHA,AT2BA,ACHA,AJYA,ALeA,AlDsJA,AkEtMA,AnByDA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,AuCrHA,AT2BA,ACHA,AJYA,ALeA,AlDsJA,AkEtMA,AnByDA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,AuCrHA,AT2BA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,ADGA,AT2BA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,ADGA,AT2BA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,ADGA,AT2BA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,ACHA,AFMA,AT2BA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AHSA,AwBxEA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,ACHA,AFMA,AT2BA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,ACHA,AFMA,AT2BA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AT2BA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;A+B5FA,A1B8EA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AT2BA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AT2BA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AIZA,AbuCA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AiBnDA,AENA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AIZA,AbuCA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AIZA,AbuCA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AKfA,ADGA,AbuCA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AKfA,ADGA,AbuCA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AKfA,ADGA,AbuCA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AKfA,ACHA,AFMA,AbuCA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,ADGA,ADGA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AKfA,ACHA,AFMA,AbuCA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AKfA,ACHA,AFMA,AbuCA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AKfA,ACHA,AFMA,AGTA,AhBgDA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AKfA,ACHA,AFMA,AGTA,AhBgDA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AKfA,ACHA,AFMA,AGTA,AhBgDA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AKfA,ACHA,AFMA,AGTA,ACHA,AjBmDA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AKfA,ACHA,AFMA,AGTA,ACHA,AjBmDA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,AENA,ADGA,AFMA,AKfA,ACHA,AFMA,AGTA,ACHA,AjBmDA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,ACHA,AFMA,AS3BA,AJYA,ACHA,AFMA,AGTA,ACHA,AjBmDA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,ACHA,AFMA,AS3BA,AJYA,ACHA,AFMA,AGTA,ACHA,AjBmDA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AwCxHA,ADGA,AS3BA,AJYA,ACHA,ACHA,ACHA,AjBmDA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AiDnJA,AT2BA,ADGA,AS3BA,AJYA,ACHA,ACHA,ACHA,AjBmDA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AiDnJA,AT2BA,ADGA,AS3BA,AJYA,ACHA,ACHA,ACHA,AjBmDA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AiDnJA,AT2BA,ADGA,AS3BA,AJYA,ACHA,ACHA,ACHA,AjBmDA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AiDnJA,AT2BA,ADGA,AS3BA,AENA,ANkBA,ACHA,ACHA,ACHA,AjBmDA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AbuCA,AmBzDA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AiDnJA,AT2BA,ADGA,AS3BA,AENA,ANkBA,ACHA,ACHA,ACHA,AjBmDA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AiDnJA,AV8BA,AS3BA,AENA,ANkBA,ACHA,ACHA,ACHA,AjBmDA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AiDnJA,AV8BA,AS3BA,AENA,ANkBA,ACHA,ACHA,ACHA,AIZA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AiDnJA,AV8BA,AWjCA,ALeA,ACHA,ACHA,AIZA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AJYA,AiDnJA,AV8BA,AWjCA,ALeA,ACHA,ACHA,AIZA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,A6CvIA,AV8BA,AWjCA,AJYA,ACHA,AKfA,ADGA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,A6CvIA,AV8BA,AWjCA,AJYA,ACHA,AKfA,ADGA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,A6CvIA,AV8BA,AWjCA,AJYA,ACHA,AKfA,ADGA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,A6CvIA,AV8BA,AWjCA,AJYA,AOrBA,ANkBA,AKfA,ADGA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,A6CvIA,AV8BA,AWjCA,AJYA,AOrBA,ADGA,ADGA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AmCzGA,AWjCA,AJYA,AOrBA,ADGA,ADGA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AmCzGA,Ae7CA,AJYA,AJYA,AOrBA,ADGA,ADGA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AJYA,AJYA,AOrBA,ADGA,ADGA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,ARwBA,AOrBA,ADGA,ADGA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,ACHA,AxBwEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,ACHA,AT2BA,AOrBA,ADGA,ADGA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,ACHA,AFMA,ADGA,ADGA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,ACHA,AFMA,ADGA,ADGA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,ADGA,AFMA,ADGA,ADGA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,ADGA,AFMA,ADGA,ADGA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,ADGA,AFMA,ADGA,ADGA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,ADGA,AFMA,ADGA,AKfA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,ADGA,AFMA,ADGA,AKfA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,ADGA,AFMA,ADGA,AKfA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,ADGA,AFMA,ADGA,AMlBA,ADGA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,ADGA,AFMA,ADGA,AMlBA,ADGA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,ADGA,AFMA,ADGA,AMlBA,ADGA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,ADGA,AFMA,ADGA,AMlBA,ACHA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,ADGA,AFMA,ADGA,AMlBA,ACHA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,AHSA,ADGA,AMlBA,ACHA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,AHSA,ADGA,AQxBA,AFMA,ACHA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,AHSA,ADGA,AQxBA,AFMA,ACHA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,AHSA,ADGA,AQxBA,AFMA,ACHA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,AHSA,ADGA,AS3BA,ADGA,AFMA,ACHA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,AHSA,ADGA,AS3BA,ADGA,AFMA,ACHA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,AHSA,ADGA,AS3BA,ADGA,AFMA,ACHA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,AHSA,ADGA,AS3BA,ADGA,AENA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AkDtJA,AENA,AHSA,ADGA,AS3BA,ADGA,AENA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,AS3BA,ADGA,AENA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,AS3BA,AENA,AHSA,AENA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,AS3BA,AENA,AHSA,AENA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,AS3BA,AENA,AHSA,AENA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,AS3BA,AENA,ACHA,AJYA,AENA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,AS3BA,AENA,ACHA,AJYA,AENA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,AS3BA,AENA,ACHA,AJYA,AENA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,AS3BA,AENA,ACHA,AJYA,AKfA,AHSA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,AS3BA,AENA,ACHA,AJYA,AKfA,AHSA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,AS3BA,AENA,ACHA,AJYA,AKfA,AHSA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,AS3BA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,AS3BA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,AS3BA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,Ae7CA,ANkBA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,Ae7CA,ANkBA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,Ae7CA,ANkBA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,ADGA,Ae7CA,ACHA,APqBA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AoD5JA,AHSA,Ac1CA,ACHA,APqBA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AU9BA,AFMA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AiDnJA,Ac1CA,ACHA,APqBA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,ACHA,AQxBA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,AmDzJA,AU9BA,AMlBA,AiEnMA,AhBgDA,Ac1CA,ACHA,APqBA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,A6DvLA,AMlBA,AiEnMA,AhBgDA,Ac1CA,ACHA,APqBA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,AFMA,ANkBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,A6DvLA,AMlBA,AiEnMA,AhBgDA,Ac1CA,ACHA,APqBA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,A6DvLA,AMlBA,AkEtMA,ADGA,AhBgDA,Ac1CA,ACHA,APqBA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,A6DvLA,AMlBA,AkEtMA,ADGA,AhBgDA,Ac1CA,ACHA,APqBA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,A6DvLA,AMlBA,AkEtMA,ADGA,AhBgDA,Ac1CA,ACHA,APqBA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,A6DvLA,AMlBA,AkEtMA,ADGA,AhBgDA,Ac1CA,ACHA,APqBA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AkGtSA,ApF4PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,A6DvLA,AMlBA,AkEtMA,ADGA,AhBgDA,Ac1CA,ACHA,APqBA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AkGtSA,ApF4PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,A6DvLA,AMlBA,AkEtMA,ADGA,AhBgDA,Ac1CA,ACHA,APqBA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AkGtSA,ApF4PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,A6DvLA,AMlBA,AkEtMA,ADGA,AhBgDA,Ac1CA,ACHA,APqBA,AENA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AkGtSA,ACHA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,A6DvLA,AMlBA,AkEtMA,ADGA,AhBgDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AkGtSA,ACHA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AKdA,A6DvLA,AMlBA,AkEtMA,ADGA,AhBgDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AkGtSA,ACHA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA;AkErMA,AMlBA,AkEtMA,ADGA,AhBgDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AkGtSA,ACHA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA,A6IvaA;A3EkOA,AMlBA,AkEtMA,ADGA,AhBgDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AkGtSA,ACHA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA,A6IvaA;A3EkOA,AMlBA,AkEtMA,ADGA,AhBgDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AkGtSA,ACHA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA,A6IvaA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AkGtSA,AGTA,AFMA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA,A6IvaA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AkGtSA,AGTA,AFMA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA,A6IvaA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AkGtSA,AGTA,AFMA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA,A6IvaA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AJYA,AGTA,AFMA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A/E6OA,A6IvaA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AJYA,AGTA,AFMA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,ADGA,AFMA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ANkBA,AKfA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,ADGA,AFMA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA,AGTA;A9E2OA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,ADGA,AFMA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA,AGTA;A9E2OA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,ADGA,AFMA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA,AGTA;A9E2OA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AENA,AHSA,AFMA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA,AGTA;A9E2OA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AENA,AHSA,AFMA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA,AGTA;A9E2OA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AENA,AHSA,AFMA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA,AGTA;A9E2OA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AFMA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA,AGTA;A9E2OA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AFMA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA,AGTA;A9E2OA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,ALeA,ACHA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AFMA,ArF+PA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA,AGTA;A9E2OA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,AJYA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AFMA,AOrBA,A5FoRA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA,AGTA;A9E2OA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,AJYA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AFMA,AOrBA,A5FoRA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA,AGTA;A9E2OA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,AJYA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AFMA,AOrBA,A5FoRA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,AJYA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AFMA,AOrBA,ACHA,A7FuRA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,AJYA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,ACHA,AJYA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AFMA,AOrBA,ACHA,A7FuRA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,AJYA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AFMA,AOrBA,ACHA,A7FuRA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,AJYA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AFMA,AOrBA,ACHA,ACHA,A9F0RA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,AJYA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AFMA,AOrBA,ACHA,ACHA,A9F0RA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,AJYA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AKfA,ACHA,ACHA,A9F0RA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,AJYA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AKfA,ACHA,ACHA,ACHA,A/F6RA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,AJYA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,ALeA,AgBhDA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AKfA,ACHA,ACHA,ACHA,A/F6RA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,AJYA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AKfA,ACHA,ACHA,ACHA,A/F6RA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,AJYA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AKfA,ACHA,AGTA,AFMA,ACHA,A/F6RA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,AJYA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AMlBA,AGTA,AFMA,ACHA,A/F6RA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;A3EkOA,AMlBA,AkEtMA,AjBmDA,Ac1CA,ACHA,AJYA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AMlBA,AGTA,AFMA,ACHA,A/F6RA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AWhCA,AtFkQA,AMlBA,AkEtMA,AjBmDA,Ac1CA,AHSA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AMlBA,AGTA,AFMA,ACHA,A/F6RA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AWhCA,AtFkQA,AMlBA,AkEtMA,AjBmDA,Ac1CA,AHSA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,ADGA,AHSA,AMlBA,AGTA,AFMA,ACHA,A/F6RA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AWhCA,AtFkQA,AMlBA,AkEtMA,AjBmDA,Ac1CA,AHSA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AMlBA,AGTA,AFMA,ACHA,A/F6RA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AYnCA,ADGA,AtFkQA,AMlBA,AkEtMA,AjBmDA,Ac1CA,AHSA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AMlBA,AGTA,AFMA,ACHA,A/F6RA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AYnCA,ADGA,AtFkQA,AMlBA,AkEtMA,AjBmDA,Ac1CA,AHSA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AMlBA,AGTA,AFMA,ACHA,A/F6RA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AYnCA,ADGA,AtFkQA,AMlBA,AkEtMA,AjBmDA,Ac1CA,AHSA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AMlBA,AGTA,AFMA,ACHA,A/F6RA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AYnCA,ACHA,AFMA,AtFkQA,AwExNA,AjBmDA,Ac1CA,AHSA,AENA,ADGA,AHSA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AMlBA,AGTA,AFMA,A9F0RA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AYnCA,ACHA,AFMA,AtFkQA,AuDrKA,Ac1CA,AHSA,AENA,AJYA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AYnCA,ACHA,AFMA,AtFkQA,AuDrKA,Ac1CA,AHSA,AENA,AJYA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AYnCA,ACHA,AFMA,AGTA,AzF2QA,AuDrKA,Ac1CA,AHSA,AENA,AJYA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AYnCA,ACHA,AFMA,AGTA,AzF2QA,AuDrKA,Ac1CA,AHSA,AENA,AJYA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AatCA,AFMA,AGTA,AzF2QA,AuDrKA,Ac1CA,AHSA,AENA,AJYA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AatCA,ACHA,ACHA,A1F8QA,AuDrKA,Ac1CA,AHSA,AENA,AJYA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AatCA,ACHA,ACHA,A1F8QA,AuDrKA,Ac1CA,AHSA,AENA,AJYA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AatCA,ACHA,ACHA,A1F8QA,AuDrKA,Ac1CA,AHSA,AENA,AJYA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AatCA,ACHA,ACHA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AENA,AJYA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AatCA,ACHA,ACHA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AENA,AJYA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AatCA,ACHA,ACHA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA;AatCA,ACHA,ACHA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA,AiBnDA;AHUA,ACHA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA,AiBnDA;AHUA,ACHA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA,AiBnDA;AHUA,AIZA,AHSA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8D1LA,AiBnDA;AHUA,AIZA,AHSA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;ACFA,AHSA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;AELA,ADGA,AHSA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;AELA,ADGA,AHSA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;AELA,ADGA,AHSA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,AS3BA,AV8BA,AavCA,AhEgMA,AsGlTA,AGTA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;AELA,ACHA,AFMA,AHSA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,ARwBA,ArB+DA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AyG3TA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;AELA,ACHA,AFMA,AHSA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,A7BuFA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AyG3TA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;AELA,ACHA,AFMA,AHSA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,A7BuFA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AyG3TA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;AELA,ACHA,AFMA,AGTA,ANkBA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,A7BuFA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AyG3TA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;AELA,ACHA,AFMA,AGTA,ANkBA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,A7BuFA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AyG3TA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;AELA,ACHA,AFMA,AGTA,ANkBA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,A7BuFA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AyG3TA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,A7BuFA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AyG3TA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,A7BuFA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AyG3TA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,A3FiRA,AuDrKA,Ac1CA,AHSA,AFMA,AHSA,A7BuFA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AyG3TA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,A3FiRA,AuDrKA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AyG3TA,AJYA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,A3FiRA,AuDrKA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AqG/SA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,A3FiRA,AuDrKA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AqG/SA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A+E7OA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,A3FiRA,AuDrKA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AqG/SA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AsFlQA,APqBA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,A3FiRA,AuDrKA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AqG/SA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AsFlQA,APqBA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,A3FiRA,AuDrKA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AqG/SA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AsFlQA,APqBA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,A3FiRA,AuDrKA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AqG/SA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AuFrQA,ADGA,APqBA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AqG/SA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AuFrQA,ADGA,APqBA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AqG/SA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AuFrQA,ADGA,APqBA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AqG/SA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AwFxQA,AFMA,APqBA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AqG/SA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AwFxQA,AFMA,APqBA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AqG/SA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AwFxQA,AFMA,APqBA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,AqG/SA,AS3BA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AyF3QA,AHSA,APqBA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AyF3QA,AHSA,APqBA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AyF3QA,AHSA,APqBA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A0F9QA,AJYA,APqBA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A0F9QA,AJYA,APqBA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A0F9QA,AJYA,APqBA;AELA,ACHA,AENA,AJYA,AGTA,ANkBA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A2FjRA,ALeA,APqBA;AELA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A2FjRA,ALeA,APqBA;AELA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A2FjRA,ALeA,APqBA;AELA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A4FpRA,ANkBA,APqBA;AELA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A4FpRA,ANkBA,APqBA;AELA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A4FpRA,ANkBA,APqBA;AELA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A6FvRA,APqBA,APqBA;AELA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A6FvRA,APqBA,APqBA;AELA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A6FvRA,APqBA,APqBA;AELA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8F1RA,ARwBA,APqBA;AELA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8F1RA,ARwBA,APqBA;AELA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,A8F1RA,ARwBA,APqBA;AELA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AsFlQA,AS3BA;Ad2CA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AsFlQA,AS3BA;Ad2CA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AsFlQA,AS3BA;Ad2CA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AsFlQA,AU9BA;Af8CA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ALeA,AHSA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AsFlQA,AU9BA;Af8CA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AgGhSA;Af8CA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AiGnSA;AhBiDA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AiGnSA;AhBiDA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AnByDA,AMlBA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AiGnSA;AhBiDA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AkGtSA;AjBoDA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AkGtSA;AjBoDA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AkGtSA;AjBoDA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,A8G1UA,AhGgSA,AsBlEA,AvBqEA,AqB/DA,AIZA,AmGzSA;AlBuDA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,AmGzSA;AlBuDA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AIZA,AmGzSA;AlBuDA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AwGxTA;AnB0DA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AwGxTA;AnB0DA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AwGxTA;AnB0DA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AyG3TA;ApB6DA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AyG3TA;ApB6DA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA,AyG3TA;ApB6DA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AqC/GA,AlEsMA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AavCA,AhEgMA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AENA,AJYA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AqF9PA,ACHA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AsFjQA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AsFjQA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AsFjQA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AsFjQA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AsFjQA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AsFjQA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AsFjQA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AsFjQA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AsFjQA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AsFjQA,AFMA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,A7BuFA,AHSA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,AbuCA,ADGA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AoF3PA,AHSA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,Ac1CA,ARwBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,AnDyJA,Ac1CA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,ACHA,ApC4GA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,AnCyGA,AMlBA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA,AqB/DA;AiFlPA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,AsBlEA,AvBqEA;AsGjTA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AWjCA,Ad0CA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AHSA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AHSA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AHSA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AHSA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AHSA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AHSA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AHSA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AHSA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AHSA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AHSA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AHSA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AHSA,ArC+GA,ADGA;AsGjTA,A7BuFA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AhCgGA,AHSA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,ArC+GA,ADGA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AyE1NA,AnCyGA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AsCjHA,AtCkHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.js","sourcesContent":["\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Chart = exports.stdlib = exports.geolib = exports.graphlib = exports.plotlib = exports.corelib = exports.litelib = void 0;\nconst lib_1 = require(\"./lib\");\nObject.defineProperty(exports, \"litelib\", { enumerable: true, get: function () { return lib_1.litelib; } });\nObject.defineProperty(exports, \"corelib\", { enumerable: true, get: function () { return lib_1.corelib; } });\nObject.defineProperty(exports, \"plotlib\", { enumerable: true, get: function () { return lib_1.plotlib; } });\nObject.defineProperty(exports, \"graphlib\", { enumerable: true, get: function () { return lib_1.graphlib; } });\nObject.defineProperty(exports, \"geolib\", { enumerable: true, get: function () { return lib_1.geolib; } });\nObject.defineProperty(exports, \"stdlib\", { enumerable: true, get: function () { return lib_1.stdlib; } });\nconst api_1 = require(\"./api\");\n__exportStar(require(\"./exports\"), exports);\n/**\n * G2 standard library initial all the libs except 3D and auto.\n */\nconst library = Object.assign({}, (0, lib_1.stdlib)());\nexports.Chart = (0, api_1.extend)(api_1.Runtime, library);\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.litelib = exports.stdlib = exports.plotlib = exports.graphlib = exports.geolib = exports.corelib = void 0;\nvar core_1 = require(\"./core\");\nObject.defineProperty(exports, \"corelib\", { enumerable: true, get: function () { return core_1.corelib; } });\nvar geo_1 = require(\"./geo\");\nObject.defineProperty(exports, \"geolib\", { enumerable: true, get: function () { return geo_1.geolib; } });\nvar graph_1 = require(\"./graph\");\nObject.defineProperty(exports, \"graphlib\", { enumerable: true, get: function () { return graph_1.graphlib; } });\nvar plot_1 = require(\"./plot\");\nObject.defineProperty(exports, \"plotlib\", { enumerable: true, get: function () { return plot_1.plotlib; } });\nvar std_1 = require(\"./std\");\nObject.defineProperty(exports, \"stdlib\", { enumerable: true, get: function () { return std_1.stdlib; } });\nvar lite_1 = require(\"./lite\");\nObject.defineProperty(exports, \"litelib\", { enumerable: true, get: function () { return lite_1.litelib; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.corelib = void 0;\nconst coordinate_1 = require(\"../coordinate\");\nconst encode_1 = require(\"../encode\");\nconst mark_1 = require(\"../mark\");\nconst palette_1 = require(\"../palette\");\nconst scale_1 = require(\"../scale\");\nconst theme_1 = require(\"../theme\");\nconst component_1 = require(\"../component\");\nconst animation_1 = require(\"../animation\");\nconst interaction_1 = require(\"../interaction\");\nconst composition_1 = require(\"../composition\");\nconst transform_1 = require(\"../transform\");\nconst data_1 = require(\"../data\");\nconst label_transform_1 = require(\"../label-transform\");\nfunction corelib() {\n return {\n 'data.fetch': data_1.Fetch,\n 'data.inline': data_1.Inline,\n 'data.sortBy': data_1.SortBy,\n 'data.sort': data_1.Sort,\n 'data.filter': data_1.Filter,\n 'data.pick': data_1.Pick,\n 'data.rename': data_1.Rename,\n 'data.fold': data_1.Fold,\n 'data.slice': data_1.Slice,\n 'data.custom': data_1.Custom,\n 'data.map': data_1.Map,\n 'data.join': data_1.Join,\n 'data.kde': data_1.KDE,\n 'data.log': data_1.Log,\n 'data.wordCloud': data_1.WordCloud,\n 'data.ema': data_1.EMA,\n 'transform.stackY': transform_1.StackY,\n 'transform.binX': transform_1.BinX,\n 'transform.bin': transform_1.Bin,\n 'transform.dodgeX': transform_1.DodgeX,\n 'transform.jitter': transform_1.Jitter,\n 'transform.jitterX': transform_1.JitterX,\n 'transform.jitterY': transform_1.JitterY,\n 'transform.symmetryY': transform_1.SymmetryY,\n 'transform.diffY': transform_1.DiffY,\n 'transform.stackEnter': transform_1.StackEnter,\n 'transform.normalizeY': transform_1.NormalizeY,\n 'transform.select': transform_1.Select,\n 'transform.selectX': transform_1.SelectX,\n 'transform.selectY': transform_1.SelectY,\n 'transform.groupX': transform_1.GroupX,\n 'transform.groupY': transform_1.GroupY,\n 'transform.groupColor': transform_1.GroupColor,\n 'transform.group': transform_1.Group,\n 'transform.sortX': transform_1.SortX,\n 'transform.sortY': transform_1.SortY,\n 'transform.sortColor': transform_1.SortColor,\n 'transform.flexX': transform_1.FlexX,\n 'transform.pack': transform_1.Pack,\n 'transform.sample': transform_1.Sample,\n 'transform.filter': transform_1.Filter,\n 'coordinate.cartesian': coordinate_1.Cartesian,\n 'coordinate.polar': coordinate_1.Polar,\n 'coordinate.transpose': coordinate_1.Transpose,\n 'coordinate.theta': coordinate_1.Theta,\n 'coordinate.parallel': coordinate_1.Parallel,\n 'coordinate.fisheye': coordinate_1.Fisheye,\n 'coordinate.radial': coordinate_1.Radial,\n 'coordinate.radar': coordinate_1.Radar,\n 'coordinate.helix': coordinate_1.Helix,\n 'encode.constant': encode_1.Constant,\n 'encode.field': encode_1.Field,\n 'encode.transform': encode_1.Transform,\n 'encode.column': encode_1.Column,\n 'mark.interval': mark_1.Interval,\n 'mark.rect': mark_1.Rect,\n 'mark.line': mark_1.Line,\n 'mark.point': mark_1.Point,\n 'mark.text': mark_1.Text,\n 'mark.cell': mark_1.Cell,\n 'mark.area': mark_1.Area,\n 'mark.link': mark_1.Link,\n 'mark.image': mark_1.Image,\n 'mark.polygon': mark_1.Polygon,\n 'mark.box': mark_1.Box,\n 'mark.vector': mark_1.Vector,\n 'mark.lineX': mark_1.LineX,\n 'mark.lineY': mark_1.LineY,\n 'mark.connector': mark_1.Connector,\n 'mark.range': mark_1.Range,\n 'mark.rangeX': mark_1.RangeX,\n 'mark.rangeY': mark_1.RangeY,\n 'mark.path': mark_1.Path,\n 'mark.shape': mark_1.Shape,\n 'mark.density': mark_1.Density,\n 'mark.heatmap': mark_1.Heatmap,\n 'mark.wordCloud': mark_1.WordCloud,\n 'palette.category10': palette_1.Category10,\n 'palette.category20': palette_1.Category20,\n 'scale.linear': scale_1.Linear,\n 'scale.ordinal': scale_1.Ordinal,\n 'scale.band': scale_1.Band,\n 'scale.identity': scale_1.Identity,\n 'scale.point': scale_1.Point,\n 'scale.time': scale_1.Time,\n 'scale.log': scale_1.Log,\n 'scale.pow': scale_1.Pow,\n 'scale.sqrt': scale_1.Sqrt,\n 'scale.threshold': scale_1.Threshold,\n 'scale.quantile': scale_1.Quantile,\n 'scale.quantize': scale_1.Quantize,\n 'scale.sequential': scale_1.Sequential,\n 'scale.constant': scale_1.Constant,\n 'theme.classic': theme_1.Classic,\n 'theme.classicDark': theme_1.ClassicDark,\n 'theme.academy': theme_1.Academy,\n 'theme.light': theme_1.Light,\n 'theme.dark': theme_1.Dark,\n 'component.axisX': component_1.AxisX,\n 'component.axisY': component_1.AxisY,\n 'component.legendCategory': component_1.LegendCategory,\n 'component.legendContinuous': component_1.LegendContinuous,\n 'component.legends': component_1.Legends,\n 'component.title': component_1.TitleComponent,\n 'component.sliderX': component_1.SliderX,\n 'component.sliderY': component_1.SliderY,\n 'component.scrollbarX': component_1.ScrollbarX,\n 'component.scrollbarY': component_1.ScrollbarY,\n 'animation.scaleInX': animation_1.ScaleInX,\n 'animation.scaleOutX': animation_1.ScaleOutX,\n 'animation.scaleInY': animation_1.ScaleInY,\n 'animation.scaleOutY': animation_1.ScaleOutY,\n 'animation.waveIn': animation_1.WaveIn,\n 'animation.fadeIn': animation_1.FadeIn,\n 'animation.fadeOut': animation_1.FadeOut,\n 'animation.zoomIn': animation_1.ZoomIn,\n 'animation.zoomOut': animation_1.ZoomOut,\n 'animation.pathIn': animation_1.PathIn,\n 'animation.morphing': animation_1.Morphing,\n 'animation.growInX': animation_1.GrowInX,\n 'animation.growInY': animation_1.GrowInY,\n 'interaction.elementHighlight': interaction_1.ElementHighlight,\n 'interaction.elementHighlightByX': interaction_1.ElementHighlightByX,\n 'interaction.elementHighlightByColor': interaction_1.ElementHighlightByColor,\n 'interaction.elementSelect': interaction_1.ElementSelect,\n 'interaction.elementSelectByX': interaction_1.ElementSelectByX,\n 'interaction.elementSelectByColor': interaction_1.ElementSelectByColor,\n 'interaction.fisheye': interaction_1.Fisheye,\n 'interaction.chartIndex': interaction_1.ChartIndex,\n 'interaction.tooltip': interaction_1.Tooltip,\n 'interaction.legendFilter': interaction_1.LegendFilter,\n 'interaction.legendHighlight': interaction_1.LegendHighlight,\n 'interaction.brushHighlight': interaction_1.BrushHighlight,\n 'interaction.brushXHighlight': interaction_1.BrushXHighlight,\n 'interaction.brushYHighlight': interaction_1.BrushYHighlight,\n 'interaction.brushAxisHighlight': interaction_1.BrushAxisHighlight,\n 'interaction.brushFilter': interaction_1.BrushFilter,\n 'interaction.brushXFilter': interaction_1.BrushXFilter,\n 'interaction.brushYFilter': interaction_1.BrushYFilter,\n 'interaction.sliderFilter': interaction_1.SliderFilter,\n 'interaction.scrollbarFilter': interaction_1.ScrollbarFilter,\n 'interaction.poptip': interaction_1.Poptip,\n 'interaction.treemapDrillDown': interaction_1.TreemapDrillDown,\n 'interaction.elementPointMove': interaction_1.ElementPointMove,\n 'composition.spaceLayer': composition_1.SpaceLayer,\n 'composition.spaceFlex': composition_1.SpaceFlex,\n 'composition.facetRect': composition_1.FacetRect,\n 'composition.repeatMatrix': composition_1.RepeatMatrix,\n 'composition.facetCircle': composition_1.FacetCircle,\n 'composition.timingKeyframe': composition_1.TimingKeyframe,\n 'labelTransform.overlapHide': label_transform_1.OverlapHide,\n 'labelTransform.overlapDodgeY': label_transform_1.OverlapDodgeY,\n 'labelTransform.overflowHide': label_transform_1.OverflowHide,\n 'labelTransform.contrastReverse': label_transform_1.ContrastReverse,\n 'labelTransform.exceedAdjust': label_transform_1.ExceedAdjust,\n };\n}\nexports.corelib = corelib;\n//# sourceMappingURL=core.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Radar = exports.Fisheye = exports.Parallel = exports.getRadialOptions = exports.Radial = exports.getThetaOptions = exports.Theta = exports.Transpose = exports.Helix = exports.getPolarOptions = exports.Polar = exports.Cartesian = void 0;\nvar cartesian_1 = require(\"./cartesian\");\nObject.defineProperty(exports, \"Cartesian\", { enumerable: true, get: function () { return cartesian_1.Cartesian; } });\nvar polar_1 = require(\"./polar\");\nObject.defineProperty(exports, \"Polar\", { enumerable: true, get: function () { return polar_1.Polar; } });\nObject.defineProperty(exports, \"getPolarOptions\", { enumerable: true, get: function () { return polar_1.getPolarOptions; } });\nvar helix_1 = require(\"./helix\");\nObject.defineProperty(exports, \"Helix\", { enumerable: true, get: function () { return helix_1.Helix; } });\nvar transpose_1 = require(\"./transpose\");\nObject.defineProperty(exports, \"Transpose\", { enumerable: true, get: function () { return transpose_1.Transpose; } });\nvar theta_1 = require(\"./theta\");\nObject.defineProperty(exports, \"Theta\", { enumerable: true, get: function () { return theta_1.Theta; } });\nObject.defineProperty(exports, \"getThetaOptions\", { enumerable: true, get: function () { return theta_1.getThetaOptions; } });\nvar radial_1 = require(\"./radial\");\nObject.defineProperty(exports, \"Radial\", { enumerable: true, get: function () { return radial_1.Radial; } });\nObject.defineProperty(exports, \"getRadialOptions\", { enumerable: true, get: function () { return radial_1.getRadialOptions; } });\nvar parallel_1 = require(\"./parallel\");\nObject.defineProperty(exports, \"Parallel\", { enumerable: true, get: function () { return parallel_1.Parallel; } });\nvar fisheye_1 = require(\"./fisheye\");\nObject.defineProperty(exports, \"Fisheye\", { enumerable: true, get: function () { return fisheye_1.Fisheye; } });\nvar radar_1 = require(\"./radar\");\nObject.defineProperty(exports, \"Radar\", { enumerable: true, get: function () { return radar_1.Radar; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Cartesian = void 0;\n/**\n * Default coordinate transformation for all charts.\n */\nconst Cartesian = () => [['cartesian']];\nexports.Cartesian = Cartesian;\nexports.Cartesian.props = {};\n//# sourceMappingURL=cartesian.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Polar = exports.getPolarOptions = void 0;\nconst angle_1 = require(\"../utils/angle\");\nconst getPolarOptions = (options = {}) => {\n const defaultOptions = {\n startAngle: -Math.PI / 2,\n endAngle: (Math.PI * 3) / 2,\n innerRadius: 0,\n outerRadius: 1,\n };\n const polarOption = Object.assign(Object.assign({}, defaultOptions), options);\n return Object.assign(Object.assign({}, polarOption), (0, angle_1.convertAngles)(polarOption.startAngle, polarOption.endAngle));\n};\nexports.getPolarOptions = getPolarOptions;\n/**\n * Polar transformation for circular charts using center of canvas as origin.\n * @todo Adjust size of canvas by startAngle and endAngle to make chart as big as possible.\n */\nconst Polar = (options) => {\n const { startAngle, endAngle, innerRadius, outerRadius } = (0, exports.getPolarOptions)(options);\n return [\n ['translate', 0, 0.5],\n ['reflect.y'],\n ['translate', 0, -0.5],\n ['polar', startAngle, endAngle, innerRadius, outerRadius],\n ];\n};\nexports.Polar = Polar;\nexports.Polar.props = {};\n//# sourceMappingURL=polar.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.convertAngles = exports.toDegree = exports.toRadian = void 0;\nfunction toRadian(degree) {\n return (degree * Math.PI) / 180;\n}\nexports.toRadian = toRadian;\nfunction toDegree(radian) {\n return (radian * 180) / Math.PI;\n}\nexports.toDegree = toDegree;\n// convert the angle to the range of 0 to 4*Math.PI\nfunction convertAngles(startAngle, endAngle) {\n startAngle = startAngle % (2 * Math.PI);\n endAngle = endAngle % (2 * Math.PI);\n if (startAngle < 0) {\n startAngle = 2 * Math.PI + startAngle;\n }\n if (endAngle < 0) {\n endAngle = 2 * Math.PI + endAngle;\n }\n if (startAngle >= endAngle) {\n endAngle = endAngle + 2 * Math.PI;\n }\n return {\n startAngle,\n endAngle,\n };\n}\nexports.convertAngles = convertAngles;\n//# sourceMappingURL=angle.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Helix = void 0;\n/**\n * Helix\n */\nconst Helix = ({ startAngle = 0, endAngle = Math.PI * 6, innerRadius = 0, outerRadius = 1, }) => [\n ['translate', 0.5, 0.5],\n ['reflect.y'],\n ['translate', -0.5, -0.5],\n ['helix', startAngle, endAngle, innerRadius, outerRadius],\n];\nexports.Helix = Helix;\nexports.Helix.props = {};\n//# sourceMappingURL=helix.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Transpose = void 0;\n/**\n * Transpose transformation for transposing chart according to center of canvas.\n */\nconst Transpose = () => [\n ['transpose'],\n ['translate', 0.5, 0.5],\n ['reflect.x'],\n ['translate', -0.5, -0.5],\n];\nexports.Transpose = Transpose;\nexports.Transpose.props = { transform: true };\n//# sourceMappingURL=transpose.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Theta = exports.getThetaOptions = void 0;\nconst polar_1 = require(\"./polar\");\nconst transpose_1 = require(\"./transpose\");\nconst getThetaOptions = (options = {}) => {\n const defaultOptions = {\n startAngle: -Math.PI / 2,\n endAngle: (Math.PI * 3) / 2,\n innerRadius: 0,\n outerRadius: 1,\n };\n return Object.assign(Object.assign({}, defaultOptions), options);\n};\nexports.getThetaOptions = getThetaOptions;\n/**\n * Theta = Transpose + Polar.\n */\nconst Theta = (options) => {\n const { startAngle, endAngle, innerRadius, outerRadius } = (0, exports.getThetaOptions)(options);\n return [\n ...(0, transpose_1.Transpose)(),\n ...(0, polar_1.Polar)({ startAngle, endAngle, innerRadius, outerRadius }),\n ];\n};\nexports.Theta = Theta;\nexports.Theta.props = {};\n//# sourceMappingURL=theta.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Radial = exports.getRadialOptions = void 0;\nconst polar_1 = require(\"./polar\");\nconst getRadialOptions = (options = {}) => {\n const defaultOptions = {\n startAngle: -Math.PI / 2,\n endAngle: (Math.PI * 3) / 2,\n innerRadius: 0,\n outerRadius: 1,\n };\n return Object.assign(Object.assign({}, defaultOptions), options);\n};\nexports.getRadialOptions = getRadialOptions;\n/**\n * Radial\n */\nconst Radial = (options) => {\n const { startAngle, endAngle, innerRadius, outerRadius } = (0, exports.getRadialOptions)(options);\n return [\n ['transpose'],\n ['translate', 0.5, 0.5],\n ['reflect'],\n ['translate', -0.5, -0.5],\n ...(0, polar_1.Polar)({ startAngle, endAngle, innerRadius, outerRadius }),\n ];\n};\nexports.Radial = Radial;\nexports.Radial.props = {};\n//# sourceMappingURL=radial.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Parallel = void 0;\n/**\n * Parallel coordinate transformations for parallel coordinate.\n */\nconst Parallel = () => [['parallel', 0, 1, 0, 1]];\nexports.Parallel = Parallel;\nexports.Parallel.props = {};\n//# sourceMappingURL=parallel.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Fisheye = void 0;\n/**\n * Fisheye\n */\nconst Fisheye = ({ focusX = 0, focusY = 0, distortionX = 2, distortionY = 2, visual = false, }) => [['fisheye', focusX, focusY, distortionX, distortionY, visual]];\nexports.Fisheye = Fisheye;\nexports.Fisheye.props = { transform: true };\n//# sourceMappingURL=fisheye.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Radar = void 0;\nconst polar_1 = require(\"./polar\");\nconst parallel_1 = require(\"./parallel\");\n/**\n * Radar = Parallel + Polar.\n */\nconst Radar = (options) => {\n const { startAngle = -Math.PI / 2, endAngle = (Math.PI * 3) / 2, innerRadius = 0, outerRadius = 1, } = options;\n return [\n ...(0, parallel_1.Parallel)(),\n ...(0, polar_1.Polar)({ startAngle, endAngle, innerRadius, outerRadius }),\n ];\n};\nexports.Radar = Radar;\nexports.Radar.props = {};\n//# sourceMappingURL=radar.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Column = exports.Field = exports.Transform = exports.Constant = void 0;\nvar constant_1 = require(\"./constant\");\nObject.defineProperty(exports, \"Constant\", { enumerable: true, get: function () { return constant_1.Constant; } });\nvar transform_1 = require(\"./transform\");\nObject.defineProperty(exports, \"Transform\", { enumerable: true, get: function () { return transform_1.Transform; } });\nvar field_1 = require(\"./field\");\nObject.defineProperty(exports, \"Field\", { enumerable: true, get: function () { return field_1.Field; } });\nvar column_1 = require(\"./column\");\nObject.defineProperty(exports, \"Column\", { enumerable: true, get: function () { return column_1.Column; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Constant = void 0;\n/**\n * Extract a column of data filled with the specified constant.\n */\nconst Constant = ({ value }) => {\n return (data) => data.map(() => value);\n};\nexports.Constant = Constant;\nexports.Constant.props = {};\n//# sourceMappingURL=constant.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Transform = void 0;\n/**\n * Extract a column of data with specified map function from data.\n * Each datum in the array is not visual data by default.\n * Specifying identity scale for related channel explicitly will treat them as visual data.\n */\nconst Transform = ({ value }) => {\n return (data) => data.map(value);\n};\nexports.Transform = Transform;\nexports.Transform.props = {};\n//# sourceMappingURL=transform.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Field = void 0;\n/**\n * Extract a column of data with specified field.\n */\nconst Field = ({ value }) => {\n return (data) => data.map((d) => d[value]);\n};\nexports.Field = Field;\nexports.Field.props = {};\n//# sourceMappingURL=field.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Column = void 0;\n/**\n * Extract a column of data specified in encoding.\n */\nconst Column = ({ value }) => {\n return () => value;\n};\nexports.Column = Column;\nexports.Column.props = {};\n//# sourceMappingURL=column.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Liquid = exports.Heatmap = exports.Density = exports.Gauge = exports.WordCloud = exports.Tree = exports.ForceGraph = exports.Shape = exports.Boxplot = exports.Pack = exports.Treemap = exports.Path = exports.Chord = exports.Sankey = exports.RangeY = exports.RangeX = exports.Range = exports.Connector = exports.LineX = exports.LineY = exports.Vector = exports.Box = exports.Polygon = exports.Image = exports.Link = exports.Area = exports.Cell = exports.Text = exports.Point = exports.Line = exports.Rect = exports.Interval = void 0;\nvar interval_1 = require(\"./interval\");\nObject.defineProperty(exports, \"Interval\", { enumerable: true, get: function () { return interval_1.Interval; } });\nvar rect_1 = require(\"./rect\");\nObject.defineProperty(exports, \"Rect\", { enumerable: true, get: function () { return rect_1.Rect; } });\nvar line_1 = require(\"./line\");\nObject.defineProperty(exports, \"Line\", { enumerable: true, get: function () { return line_1.Line; } });\nvar point_1 = require(\"./point\");\nObject.defineProperty(exports, \"Point\", { enumerable: true, get: function () { return point_1.Point; } });\nvar text_1 = require(\"./text\");\nObject.defineProperty(exports, \"Text\", { enumerable: true, get: function () { return text_1.Text; } });\nvar cell_1 = require(\"./cell\");\nObject.defineProperty(exports, \"Cell\", { enumerable: true, get: function () { return cell_1.Cell; } });\nvar area_1 = require(\"./area\");\nObject.defineProperty(exports, \"Area\", { enumerable: true, get: function () { return area_1.Area; } });\nvar link_1 = require(\"./link\");\nObject.defineProperty(exports, \"Link\", { enumerable: true, get: function () { return link_1.Link; } });\nvar image_1 = require(\"./image\");\nObject.defineProperty(exports, \"Image\", { enumerable: true, get: function () { return image_1.Image; } });\nvar polygon_1 = require(\"./polygon\");\nObject.defineProperty(exports, \"Polygon\", { enumerable: true, get: function () { return polygon_1.Polygon; } });\nvar box_1 = require(\"./box\");\nObject.defineProperty(exports, \"Box\", { enumerable: true, get: function () { return box_1.Box; } });\nvar vector_1 = require(\"./vector\");\nObject.defineProperty(exports, \"Vector\", { enumerable: true, get: function () { return vector_1.Vector; } });\nvar lineY_1 = require(\"./lineY\");\nObject.defineProperty(exports, \"LineY\", { enumerable: true, get: function () { return lineY_1.LineY; } });\nvar lineX_1 = require(\"./lineX\");\nObject.defineProperty(exports, \"LineX\", { enumerable: true, get: function () { return lineX_1.LineX; } });\nvar connector_1 = require(\"./connector\");\nObject.defineProperty(exports, \"Connector\", { enumerable: true, get: function () { return connector_1.Connector; } });\nvar range_1 = require(\"./range\");\nObject.defineProperty(exports, \"Range\", { enumerable: true, get: function () { return range_1.Range; } });\nvar rangeX_1 = require(\"./rangeX\");\nObject.defineProperty(exports, \"RangeX\", { enumerable: true, get: function () { return rangeX_1.RangeX; } });\nvar rangeY_1 = require(\"./rangeY\");\nObject.defineProperty(exports, \"RangeY\", { enumerable: true, get: function () { return rangeY_1.RangeY; } });\nvar sankey_1 = require(\"./sankey\");\nObject.defineProperty(exports, \"Sankey\", { enumerable: true, get: function () { return sankey_1.Sankey; } });\nvar chord_1 = require(\"./chord\");\nObject.defineProperty(exports, \"Chord\", { enumerable: true, get: function () { return chord_1.Chord; } });\nvar path_1 = require(\"./path\");\nObject.defineProperty(exports, \"Path\", { enumerable: true, get: function () { return path_1.Path; } });\nvar treemap_1 = require(\"./treemap\");\nObject.defineProperty(exports, \"Treemap\", { enumerable: true, get: function () { return treemap_1.Treemap; } });\nvar pack_1 = require(\"./pack\");\nObject.defineProperty(exports, \"Pack\", { enumerable: true, get: function () { return pack_1.Pack; } });\nvar boxplot_1 = require(\"./boxplot\");\nObject.defineProperty(exports, \"Boxplot\", { enumerable: true, get: function () { return boxplot_1.Boxplot; } });\nvar shape_1 = require(\"./shape\");\nObject.defineProperty(exports, \"Shape\", { enumerable: true, get: function () { return shape_1.Shape; } });\nvar forceGraph_1 = require(\"./forceGraph\");\nObject.defineProperty(exports, \"ForceGraph\", { enumerable: true, get: function () { return forceGraph_1.ForceGraph; } });\nvar tree_1 = require(\"./tree\");\nObject.defineProperty(exports, \"Tree\", { enumerable: true, get: function () { return tree_1.Tree; } });\nvar wordCloud_1 = require(\"./wordCloud\");\nObject.defineProperty(exports, \"WordCloud\", { enumerable: true, get: function () { return wordCloud_1.WordCloud; } });\nvar gauge_1 = require(\"./gauge\");\nObject.defineProperty(exports, \"Gauge\", { enumerable: true, get: function () { return gauge_1.Gauge; } });\nvar density_1 = require(\"./density\");\nObject.defineProperty(exports, \"Density\", { enumerable: true, get: function () { return density_1.Density; } });\nvar heatmap_1 = require(\"./heatmap\");\nObject.defineProperty(exports, \"Heatmap\", { enumerable: true, get: function () { return heatmap_1.Heatmap; } });\nvar liquid_1 = require(\"./liquid\");\nObject.defineProperty(exports, \"Liquid\", { enumerable: true, get: function () { return liquid_1.Liquid; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Interval = void 0;\nconst transform_1 = require(\"../transform\");\nconst shape_1 = require(\"../shape\");\nconst utils_1 = require(\"./utils\");\nfunction bandWidth(scale, x) {\n return scale.getBandWidth(scale.invert(x));\n}\nconst shape = {\n rect: shape_1.IntervalShape,\n hollow: shape_1.IntervalHollow,\n funnel: shape_1.IntervalFunnel,\n pyramid: shape_1.IntervalPyramid,\n};\n/**\n * Convert value for each channel to rect shapes.\n * p0 p1\n * ┌────┐\n * │ │\n * │ │\n * p3 └────┘ p2\n */\nconst Interval = () => {\n return (index, scale, value, coordinate) => {\n const { x: X, y: Y, y1: Y1, series: S, size: SZ } = value;\n // Calc width for each interval.\n // The scales for x and series channels must be band scale.\n const x = scale.x;\n const series = scale.series;\n const [width] = coordinate.getSize();\n const NSZ = SZ ? SZ.map((d) => +d / width) : null;\n const x1x2 = !SZ\n ? (x, w, i) => [x, x + w]\n : (x, w, i) => {\n const mx = x + w / 2;\n const s = NSZ[i];\n return [mx - s / 2, mx + s / 2];\n };\n // Calc the points of bounding box for the interval.\n // They are start from left-top corner in clock wise order.\n const P = Array.from(index, (i) => {\n const groupWidth = bandWidth(x, X[i]);\n const ratio = series ? bandWidth(series, S === null || S === void 0 ? void 0 : S[i]) : 1;\n const width = groupWidth * ratio;\n const offset = (+(S === null || S === void 0 ? void 0 : S[i]) || 0) * groupWidth;\n const x0 = +X[i] + offset;\n const [x1, x2] = x1x2(x0, width, i);\n const y1 = +Y[i];\n const y2 = +Y1[i];\n const p1 = [x1, y1];\n const p2 = [x2, y1];\n const p3 = [x2, y2];\n const p4 = [x1, y2];\n return [p1, p2, p3, p4].map((d) => coordinate.map(d));\n });\n return [index, P];\n };\n};\nexports.Interval = Interval;\nexports.Interval.props = {\n defaultShape: 'rect',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', scale: 'band', required: true },\n { name: 'y', required: true },\n { name: 'series', scale: 'band' },\n { name: 'size' },\n ],\n preInference: [\n ...(0, utils_1.basePreInference)(),\n { type: transform_1.MaybeZeroY1 },\n { type: transform_1.MaybeZeroX },\n ],\n postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip1d)()],\n interaction: { shareTooltip: true },\n};\n//# sourceMappingURL=interval.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Filter = exports.Sample = exports.Bin = exports.BinX = exports.Pack = exports.FlexX = exports.SortY = exports.SortColor = exports.SortX = exports.GroupColor = exports.Group = exports.GroupY = exports.GroupX = exports.SelectY = exports.SelectX = exports.Select = exports.DiffY = exports.SymmetryY = exports.JitterY = exports.JitterX = exports.Jitter = exports.NormalizeY = exports.StackEnter = exports.DodgeX = exports.StackY = exports.MaybeGradient = exports.MaybeTuple = exports.MaybeFunctionAttribute = exports.MaybeVisualPosition = exports.MaybeZeroPadding = exports.MaybeTooltip = exports.MaybeDefaultY = exports.MaybeDefaultX = exports.MaybeIdentityX = exports.MaybeIdentityY = exports.MaybeTupleX = exports.MaybeTupleY = exports.MaybeSeries = exports.MaybeKey = exports.MaybeSize = exports.MaybeZeroZ = exports.MaybeZeroY = exports.MaybeZeroX = exports.MaybeTitle = exports.MaybeStackY = exports.MaybeZeroY1 = void 0;\nvar maybeZeroY1_1 = require(\"./maybeZeroY1\");\nObject.defineProperty(exports, \"MaybeZeroY1\", { enumerable: true, get: function () { return maybeZeroY1_1.MaybeZeroY1; } });\nvar maybeStackY_1 = require(\"./maybeStackY\");\nObject.defineProperty(exports, \"MaybeStackY\", { enumerable: true, get: function () { return maybeStackY_1.MaybeStackY; } });\nvar maybeTitle_1 = require(\"./maybeTitle\");\nObject.defineProperty(exports, \"MaybeTitle\", { enumerable: true, get: function () { return maybeTitle_1.MaybeTitle; } });\nvar maybeZeroX_1 = require(\"./maybeZeroX\");\nObject.defineProperty(exports, \"MaybeZeroX\", { enumerable: true, get: function () { return maybeZeroX_1.MaybeZeroX; } });\nvar maybeZeroY_1 = require(\"./maybeZeroY\");\nObject.defineProperty(exports, \"MaybeZeroY\", { enumerable: true, get: function () { return maybeZeroY_1.MaybeZeroY; } });\nvar maybeZeroZ_1 = require(\"./maybeZeroZ\");\nObject.defineProperty(exports, \"MaybeZeroZ\", { enumerable: true, get: function () { return maybeZeroZ_1.MaybeZeroZ; } });\nvar maybeSize_1 = require(\"./maybeSize\");\nObject.defineProperty(exports, \"MaybeSize\", { enumerable: true, get: function () { return maybeSize_1.MaybeSize; } });\nvar maybeKey_1 = require(\"./maybeKey\");\nObject.defineProperty(exports, \"MaybeKey\", { enumerable: true, get: function () { return maybeKey_1.MaybeKey; } });\nvar maybeSeries_1 = require(\"./maybeSeries\");\nObject.defineProperty(exports, \"MaybeSeries\", { enumerable: true, get: function () { return maybeSeries_1.MaybeSeries; } });\nvar maybeTupleY_1 = require(\"./maybeTupleY\");\nObject.defineProperty(exports, \"MaybeTupleY\", { enumerable: true, get: function () { return maybeTupleY_1.MaybeTupleY; } });\nvar maybeTupleX_1 = require(\"./maybeTupleX\");\nObject.defineProperty(exports, \"MaybeTupleX\", { enumerable: true, get: function () { return maybeTupleX_1.MaybeTupleX; } });\nvar maybeIdentityY_1 = require(\"./maybeIdentityY\");\nObject.defineProperty(exports, \"MaybeIdentityY\", { enumerable: true, get: function () { return maybeIdentityY_1.MaybeIdentityY; } });\nvar maybeIdentityX_1 = require(\"./maybeIdentityX\");\nObject.defineProperty(exports, \"MaybeIdentityX\", { enumerable: true, get: function () { return maybeIdentityX_1.MaybeIdentityX; } });\nvar maybeDefaultX_1 = require(\"./maybeDefaultX\");\nObject.defineProperty(exports, \"MaybeDefaultX\", { enumerable: true, get: function () { return maybeDefaultX_1.MaybeDefaultX; } });\nvar maybeDefaultY_1 = require(\"./maybeDefaultY\");\nObject.defineProperty(exports, \"MaybeDefaultY\", { enumerable: true, get: function () { return maybeDefaultY_1.MaybeDefaultY; } });\nvar maybeTooltip_1 = require(\"./maybeTooltip\");\nObject.defineProperty(exports, \"MaybeTooltip\", { enumerable: true, get: function () { return maybeTooltip_1.MaybeTooltip; } });\nvar maybeZeroPadding_1 = require(\"./maybeZeroPadding\");\nObject.defineProperty(exports, \"MaybeZeroPadding\", { enumerable: true, get: function () { return maybeZeroPadding_1.MaybeZeroPadding; } });\nvar maybeVisualPosition_1 = require(\"./maybeVisualPosition\");\nObject.defineProperty(exports, \"MaybeVisualPosition\", { enumerable: true, get: function () { return maybeVisualPosition_1.MaybeVisualPosition; } });\nvar maybeFunctionAttribute_1 = require(\"./maybeFunctionAttribute\");\nObject.defineProperty(exports, \"MaybeFunctionAttribute\", { enumerable: true, get: function () { return maybeFunctionAttribute_1.MaybeFunctionAttribute; } });\nvar maybeTuple_1 = require(\"./maybeTuple\");\nObject.defineProperty(exports, \"MaybeTuple\", { enumerable: true, get: function () { return maybeTuple_1.MaybeTuple; } });\nvar maybeGradient_1 = require(\"./maybeGradient\");\nObject.defineProperty(exports, \"MaybeGradient\", { enumerable: true, get: function () { return maybeGradient_1.MaybeGradient; } });\nvar stackY_1 = require(\"./stackY\");\nObject.defineProperty(exports, \"StackY\", { enumerable: true, get: function () { return stackY_1.StackY; } });\nvar dodgeX_1 = require(\"./dodgeX\");\nObject.defineProperty(exports, \"DodgeX\", { enumerable: true, get: function () { return dodgeX_1.DodgeX; } });\nvar stackEnter_1 = require(\"./stackEnter\");\nObject.defineProperty(exports, \"StackEnter\", { enumerable: true, get: function () { return stackEnter_1.StackEnter; } });\nvar normalizeY_1 = require(\"./normalizeY\");\nObject.defineProperty(exports, \"NormalizeY\", { enumerable: true, get: function () { return normalizeY_1.NormalizeY; } });\nvar jitter_1 = require(\"./jitter\");\nObject.defineProperty(exports, \"Jitter\", { enumerable: true, get: function () { return jitter_1.Jitter; } });\nvar jitterX_1 = require(\"./jitterX\");\nObject.defineProperty(exports, \"JitterX\", { enumerable: true, get: function () { return jitterX_1.JitterX; } });\nvar jitterY_1 = require(\"./jitterY\");\nObject.defineProperty(exports, \"JitterY\", { enumerable: true, get: function () { return jitterY_1.JitterY; } });\nvar symmetryY_1 = require(\"./symmetryY\");\nObject.defineProperty(exports, \"SymmetryY\", { enumerable: true, get: function () { return symmetryY_1.SymmetryY; } });\nvar diffY_1 = require(\"./diffY\");\nObject.defineProperty(exports, \"DiffY\", { enumerable: true, get: function () { return diffY_1.DiffY; } });\nvar select_1 = require(\"./select\");\nObject.defineProperty(exports, \"Select\", { enumerable: true, get: function () { return select_1.Select; } });\nvar selectX_1 = require(\"./selectX\");\nObject.defineProperty(exports, \"SelectX\", { enumerable: true, get: function () { return selectX_1.SelectX; } });\nvar selectY_1 = require(\"./selectY\");\nObject.defineProperty(exports, \"SelectY\", { enumerable: true, get: function () { return selectY_1.SelectY; } });\nvar groupX_1 = require(\"./groupX\");\nObject.defineProperty(exports, \"GroupX\", { enumerable: true, get: function () { return groupX_1.GroupX; } });\nvar groupY_1 = require(\"./groupY\");\nObject.defineProperty(exports, \"GroupY\", { enumerable: true, get: function () { return groupY_1.GroupY; } });\nvar group_1 = require(\"./group\");\nObject.defineProperty(exports, \"Group\", { enumerable: true, get: function () { return group_1.Group; } });\nvar groupColor_1 = require(\"./groupColor\");\nObject.defineProperty(exports, \"GroupColor\", { enumerable: true, get: function () { return groupColor_1.GroupColor; } });\nvar sortX_1 = require(\"./sortX\");\nObject.defineProperty(exports, \"SortX\", { enumerable: true, get: function () { return sortX_1.SortX; } });\nvar sortColor_1 = require(\"./sortColor\");\nObject.defineProperty(exports, \"SortColor\", { enumerable: true, get: function () { return sortColor_1.SortColor; } });\nvar sortY_1 = require(\"./sortY\");\nObject.defineProperty(exports, \"SortY\", { enumerable: true, get: function () { return sortY_1.SortY; } });\nvar flexX_1 = require(\"./flexX\");\nObject.defineProperty(exports, \"FlexX\", { enumerable: true, get: function () { return flexX_1.FlexX; } });\nvar pack_1 = require(\"./pack\");\nObject.defineProperty(exports, \"Pack\", { enumerable: true, get: function () { return pack_1.Pack; } });\nvar binX_1 = require(\"./binX\");\nObject.defineProperty(exports, \"BinX\", { enumerable: true, get: function () { return binX_1.BinX; } });\nvar bin_1 = require(\"./bin\");\nObject.defineProperty(exports, \"Bin\", { enumerable: true, get: function () { return bin_1.Bin; } });\nvar sample_1 = require(\"./sample\");\nObject.defineProperty(exports, \"Sample\", { enumerable: true, get: function () { return sample_1.Sample; } });\nvar filter_1 = require(\"./filter\");\nObject.defineProperty(exports, \"Filter\", { enumerable: true, get: function () { return filter_1.Filter; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeZeroY1 = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Add zero constant encode for y1 channel.\n */\nconst MaybeZeroY1 = () => {\n return (I, mark) => {\n const { encode } = mark;\n const { y1 } = encode;\n if (y1 !== undefined)\n return [I, mark];\n return [\n I,\n (0, util_1.deepMix)({}, mark, {\n encode: { y1: (0, helper_1.inferredColumn)((0, helper_1.constant)(I, 0)) },\n }),\n ];\n };\n};\nexports.MaybeZeroY1 = MaybeZeroY1;\nexports.MaybeZeroY1.props = {};\n//# sourceMappingURL=maybeZeroY1.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isObject = exports.maybeColumnOf = exports.columnOf = exports.constant = exports.nonConstantColumn = exports.visualColumn = exports.inferredColumn = exports.column = void 0;\nfunction column(value, field) {\n if (value === null)\n return undefined;\n return { type: 'column', value, field };\n}\nexports.column = column;\nfunction inferredColumn(value, field) {\n const c = column(value, field);\n return Object.assign(Object.assign({}, c), { inferred: true });\n}\nexports.inferredColumn = inferredColumn;\nfunction visualColumn(value, field) {\n if (value === null)\n return undefined;\n return { type: 'column', value, field, visual: true };\n}\nexports.visualColumn = visualColumn;\nfunction nonConstantColumn(value, field) {\n const c = column(value, field);\n return Object.assign(Object.assign({}, c), { constant: false });\n}\nexports.nonConstantColumn = nonConstantColumn;\nfunction constant(I, value) {\n const array = [];\n for (const i of I)\n array[i] = value;\n return array;\n}\nexports.constant = constant;\nfunction columnOf(encode, key) {\n const channel = encode[key];\n if (!channel)\n return [null, null];\n const { value, field = null } = channel;\n return [value, field];\n}\nexports.columnOf = columnOf;\nfunction maybeColumnOf(encode, ...K) {\n for (const key of K) {\n if (typeof key === 'string') {\n const [KV, fv] = columnOf(encode, key);\n if (KV !== null)\n return [KV, fv];\n }\n else {\n return [key, null];\n }\n }\n return [null, null];\n}\nexports.maybeColumnOf = maybeColumnOf;\nfunction isObject(d) {\n if (d instanceof Date)\n return false;\n return typeof d === 'object';\n}\nexports.isObject = isObject;\n//# sourceMappingURL=helper.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeStackY = void 0;\nconst stackY_1 = require(\"./stackY\");\n// Avoid duplicate stackY.\n// In most of case only one of stackY and dodgeX is needed.\n// So pass statistic with stackY and dodgeX.\nfunction exclude(transform) {\n const { type } = transform;\n const excludes = ['stackY', 'dodgeX', 'groupX'];\n return typeof type === 'string' && excludes.includes(type);\n}\n/**\n * Add zero constant encode for x channel.\n * This is useful for interval geometry.\n */\nconst MaybeStackY = (options) => {\n return (I, mark, context) => {\n // Skip some transform.\n const { encode, transform = [] } = mark;\n if (transform.some(exclude))\n return [I, mark];\n // StackY need both x and y channel values.\n const { x, y } = encode;\n if (x === undefined || y === undefined)\n return [I, mark];\n const { series } = options;\n const groupBy = series ? ['x', 'series'] : 'x';\n return (0, stackY_1.StackY)({ groupBy })(I, mark, context);\n };\n};\nexports.MaybeStackY = MaybeStackY;\nexports.MaybeStackY.props = {};\n//# sourceMappingURL=maybeStackY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StackY = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\nconst order_1 = require(\"./utils/order\");\n/**\n * The stack transform group marks into series by color channel,\n * and then produce new y channel for each series by specified order,\n * say to form vertical \"stacks\" by specified channels.\n */\nconst StackY = (options = {}) => {\n const { groupBy = 'x', orderBy = null, reverse = false, y: fromY = 'y', y1: fromY1 = 'y1', series = true, } = options;\n return (I, mark) => {\n var _a;\n const { data, encode, style = {} } = mark;\n const [Y, fy] = (0, helper_1.columnOf)(encode, 'y');\n const [Y1, fy1] = (0, helper_1.columnOf)(encode, 'y1');\n const [S] = series\n ? (0, helper_1.maybeColumnOf)(encode, 'series', 'color')\n : (0, helper_1.columnOf)(encode, 'color');\n // Create groups and apply specified order for each group.\n const groups = (0, order_1.createGroups)(groupBy, I, mark);\n const createComparator = (_a = (0, order_1.normalizeComparator)(orderBy)) !== null && _a !== void 0 ? _a : (() => null);\n const comparator = createComparator(data, Y, S);\n if (comparator)\n (0, order_1.applyOrder)(groups, comparator);\n // Stack y channels to produce new y and y1 channel.\n const newY = new Array(I.length);\n const newY1 = new Array(I.length);\n const TY = new Array(I.length);\n const F = [];\n const L = [];\n for (const G of groups) {\n if (reverse)\n G.reverse();\n // For range interval with specified y and y1.\n const start = Y1 ? +Y1[G[0]] : 0;\n // Split positive indices of Y and negative Y.\n const PG = [];\n const NG = [];\n for (const i of G) {\n const y = (TY[i] = +Y[i] - start);\n if (y < 0)\n NG.push(i);\n else if (y >= 0)\n PG.push(i);\n }\n // Store the first and last layer.\n const FG = PG.length > 0 ? PG : NG;\n const LG = NG.length > 0 ? NG : PG;\n let i = PG.length - 1;\n let j = 0;\n // Find the last non-zero index.\n while (i > 0 && Y[FG[i]] === 0)\n i--;\n // Find the first non-zero index.\n while (j < LG.length - 1 && Y[LG[j]] === 0)\n j++;\n F.push(FG[i]);\n L.push(LG[j]);\n // Stack negative y in reverse order.\n let ny = start;\n for (const i of NG.reverse()) {\n const y = TY[i];\n ny = newY[i] = (newY1[i] = ny) + y;\n }\n // Stack positive y in input order.\n let py = start;\n for (const i of PG) {\n const y = TY[i];\n if (y > 0)\n py = newY[i] = (newY1[i] = py) + y;\n else\n newY[i] = newY1[i] = py;\n }\n }\n // Only set top radius for the first layer,\n // and set bottom radius for the last layer.\n const FS = new Set(F);\n const LS = new Set(L);\n // Choose new y or y1 channel as the new y channel.\n const V = fromY === 'y' ? newY : newY1;\n const V1 = fromY1 === 'y' ? newY : newY1;\n let newEncode;\n // mark point will compute the actural Y = (y + y1) / 2 if y1 exists\n if (mark.type === 'point') {\n newEncode = {\n y0: (0, helper_1.inferredColumn)(Y, fy),\n y: (0, helper_1.column)(V, fy),\n };\n }\n else {\n newEncode = {\n y0: (0, helper_1.inferredColumn)(Y, fy),\n y: (0, helper_1.column)(V, fy),\n y1: (0, helper_1.column)(V1, fy1),\n };\n }\n return [\n I,\n (0, util_1.deepMix)({}, mark, {\n encode: Object.assign({}, newEncode),\n style: Object.assign({ first: (_, i) => FS.has(i), last: (_, i) => LS.has(i) }, style),\n }),\n ];\n };\n};\nexports.StackY = StackY;\nexports.StackY.props = {};\n//# sourceMappingURL=stackY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.domainOf = exports.applyOrder = exports.normalizeComparator = exports.createGroups = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst helper_1 = require(\"../../utils/helper\");\nconst array_1 = require(\"../../utils/array\");\nconst helper_2 = require(\"./helper\");\nfunction createGroups(groupBy, I, mark) {\n const { encode } = mark;\n if (groupBy === null)\n return [I];\n const G = normalizeGroupBy(groupBy)\n .map((k) => { var _a; return [k, (_a = (0, helper_2.columnOf)(encode, k)) === null || _a === void 0 ? void 0 : _a[0]]; })\n .filter(([, column]) => (0, helper_1.defined)(column));\n const key = (i) => G.map(([, V]) => V[i]).join('-');\n return Array.from((0, d3_array_1.group)(I, key).values());\n}\nexports.createGroups = createGroups;\nfunction normalizeComparator(order) {\n if (Array.isArray(order))\n return createFieldsOrder(order);\n if (typeof order === 'function')\n return createFunctionOrder(order);\n if (order === 'series')\n return createSeriesOrder;\n if (order === 'value')\n return createValueOrder;\n if (order === 'sum')\n return createSumOrder;\n if (order === 'maxIndex')\n return createMaxIndexOrder;\n return null;\n}\nexports.normalizeComparator = normalizeComparator;\nfunction applyOrder(groups, comparator) {\n for (const group of groups) {\n group.sort(comparator);\n }\n}\nexports.applyOrder = applyOrder;\nfunction domainOf(value, scale) {\n return (scale === null || scale === void 0 ? void 0 : scale.domain) || Array.from(new Set(value));\n}\nexports.domainOf = domainOf;\nfunction normalizeGroupBy(groupBy) {\n if (Array.isArray(groupBy))\n return groupBy;\n return [groupBy];\n}\nfunction createSeriesOrder(data, Y, S) {\n return ascendingComparator((i) => S[i]);\n}\nfunction createFunctionOrder(order) {\n return (data, Y, S) => {\n return ascendingComparator((i) => order(data[i]));\n };\n}\nfunction createFieldsOrder(order) {\n return (data, Y, S) => {\n return (i, j) => order.reduce((eq, f) => (eq !== 0 ? eq : (0, d3_array_1.ascending)(data[i][f], data[j][f])), 0);\n };\n}\nfunction createValueOrder(data, Y, S) {\n return ascendingComparator((i) => Y[i]);\n}\nfunction createSumOrder(data, Y, S) {\n const I = (0, array_1.indexOf)(data);\n const groups = Array.from((0, d3_array_1.group)(I, (i) => S[+i]).entries());\n const seriesSum = new Map(groups.map(([k, GI]) => [k, GI.reduce((s, i) => s + +Y[i])]));\n return ascendingComparator((i) => seriesSum.get(S[i]));\n}\nfunction createMaxIndexOrder(data, Y, S) {\n const I = (0, array_1.indexOf)(data);\n const groups = Array.from((0, d3_array_1.group)(I, (i) => S[+i]).entries());\n const seriesMaxIndex = new Map(groups.map(([k, GI]) => [k, (0, d3_array_1.maxIndex)(GI, (i) => Y[i])]));\n return ascendingComparator((i) => seriesMaxIndex.get(S[i]));\n}\nfunction ascendingComparator(order) {\n return (i, j) => (0, d3_array_1.ascending)(order(i), order(j));\n}\n//# sourceMappingURL=order.js.map","\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.deepAssign = exports.isUnset = exports.isStrictObject = exports.maybePercentage = exports.omitPrefixObject = exports.filterPrefixObject = exports.prefixObject = exports.maybeSubObject = exports.subObject = exports.appendTransform = exports.useMemo = exports.random = exports.defined = exports.copyAttributes = exports.error = exports.capitalizeFirst = exports.composeAsync = exports.compose = exports.identity = exports.groupNameOf = exports.seriesOf = exports.dataOf = exports.getViewFromElement = void 0;\nconst util_1 = require(\"@antv/util\");\nconst scale_1 = require(\"@antv/scale\");\n/**\n * @description Get element's ancestor view node.\n * @param elemenet G2 element.\n * @returns Element's ancestor view node.\n */\nfunction getViewFromElement(element) {\n var _a;\n let current = element;\n while (current) {\n if (((_a = current.attributes) === null || _a === void 0 ? void 0 : _a.class) === 'view')\n return current;\n current = current.parentNode;\n }\n return null;\n}\nexports.getViewFromElement = getViewFromElement;\n/**\n * @description Get element's original data.\n * @param elemenet G2 element.\n * @param elemenet View data, if not provided, will get from element's ancestor view.\n * @returns The original data of the element.\n */\nfunction dataOf(element, viewData) {\n const view = viewData !== null && viewData !== void 0 ? viewData : getViewFromElement(element).__data__;\n const datum = element.__data__;\n const { markKey, index, seriesIndex } = datum;\n const { markState } = view;\n const selectedMark = Array.from(markState.keys()).find((mark) => mark.key === markKey);\n if (!selectedMark)\n return;\n if (seriesIndex) {\n return seriesIndex.map((i) => selectedMark.data[i]);\n }\n return selectedMark.data[index];\n}\nexports.dataOf = dataOf;\n/**\n * @description Get element's series name.\n * @param elemenet G2 element.\n * @returns The series name of the element.\n */\nfunction seriesOf(elemenet) {\n const viewData = getViewFromElement(elemenet).__data__;\n const { scale } = viewData;\n return groupNameOf(scale, elemenet.__data__);\n}\nexports.seriesOf = seriesOf;\n/**\n * Get group name with view's scale and element's datum.\n */\nfunction groupNameOf(scale, datum) {\n const { color: scaleColor, series: scaleSeries, facet = false } = scale;\n const { color, series } = datum;\n const invertAble = (scale) => {\n return (scale &&\n scale.invert &&\n !(scale instanceof scale_1.Band) &&\n !(scale instanceof scale_1.Constant));\n };\n // For non constant color channel.\n if (invertAble(scaleSeries)) {\n const cloned = scaleSeries.clone();\n return cloned.invert(series);\n }\n if (series &&\n scaleSeries instanceof scale_1.Band &&\n scaleSeries.invert(series) !== color &&\n !facet) {\n return scaleSeries.invert(series);\n }\n if (invertAble(scaleColor)) {\n const name = scaleColor.invert(color);\n // For threshold scale.\n if (Array.isArray(name))\n return null;\n return name;\n }\n return null;\n}\nexports.groupNameOf = groupNameOf;\nfunction identity(x) {\n return x;\n}\nexports.identity = identity;\n/**\n * Composes functions from left to right.\n */\nfunction compose(fns) {\n return fns.reduce((composed, fn) => (x, ...args) => fn(composed(x, ...args), ...args), identity);\n}\nexports.compose = compose;\n/**\n * Composes single-argument async functions from left to right.\n */\nfunction composeAsync(fns) {\n return fns.reduce((composed, fn) => (x) => __awaiter(this, void 0, void 0, function* () {\n const value = yield composed(x);\n return fn(value);\n }), identity);\n}\nexports.composeAsync = composeAsync;\nfunction capitalizeFirst(str) {\n return str.replace(/( |^)[a-z]/g, (L) => L.toUpperCase());\n}\nexports.capitalizeFirst = capitalizeFirst;\nfunction error(message = '') {\n throw new Error(message);\n}\nexports.error = error;\nfunction copyAttributes(target, source) {\n const { attributes } = source;\n const exclude = new Set(['id', 'className']);\n for (const [key, value] of Object.entries(attributes)) {\n if (!exclude.has(key)) {\n target.attr(key, value);\n }\n }\n}\nexports.copyAttributes = copyAttributes;\nfunction defined(x) {\n return x !== undefined && x !== null && !Number.isNaN(x);\n}\nexports.defined = defined;\nfunction random(a, b) {\n return a + (b - a) * Math.random();\n}\nexports.random = random;\nfunction useMemo(compute) {\n const map = new Map();\n return (key) => {\n if (map.has(key))\n return map.get(key);\n const value = compute(key);\n map.set(key, value);\n return value;\n };\n}\nexports.useMemo = useMemo;\nfunction appendTransform(node, transform) {\n const { transform: preTransform } = node.style;\n const unset = (d) => d === 'none' || d === undefined;\n const prefix = unset(preTransform) ? '' : preTransform;\n node.style.transform = `${prefix} ${transform}`.trimStart();\n}\nexports.appendTransform = appendTransform;\nfunction subObject(obj, prefix) {\n return maybeSubObject(obj, prefix) || {};\n}\nexports.subObject = subObject;\nfunction maybeSubObject(obj, prefix) {\n const entries = Object.entries(obj || {})\n .filter(([key]) => key.startsWith(prefix))\n .map(([key, value]) => [(0, util_1.lowerFirst)(key.replace(prefix, '').trim()), value])\n .filter(([key]) => !!key);\n return entries.length === 0 ? null : Object.fromEntries(entries);\n}\nexports.maybeSubObject = maybeSubObject;\nfunction prefixObject(obj, prefix) {\n return Object.fromEntries(Object.entries(obj).map(([key, value]) => {\n return [`${prefix}${(0, util_1.upperFirst)(key)}`, value];\n }));\n}\nexports.prefixObject = prefixObject;\nfunction filterPrefixObject(obj, prefix) {\n return Object.fromEntries(Object.entries(obj).filter(([key]) => prefix.find((p) => key.startsWith(p))));\n}\nexports.filterPrefixObject = filterPrefixObject;\nfunction omitPrefixObject(obj, ...prefixes) {\n return Object.fromEntries(Object.entries(obj).filter(([key]) => prefixes.every((prefix) => !key.startsWith(prefix))));\n}\nexports.omitPrefixObject = omitPrefixObject;\nfunction maybePercentage(x, size) {\n if (x === undefined)\n return null;\n if (typeof x === 'number')\n return x;\n const px = +x.replace('%', '');\n return Number.isNaN(px) ? null : (px / 100) * size;\n}\nexports.maybePercentage = maybePercentage;\nfunction isStrictObject(d) {\n return (typeof d === 'object' &&\n !(d instanceof Date) &&\n d !== null &&\n !Array.isArray(d));\n}\nexports.isStrictObject = isStrictObject;\nfunction isUnset(value) {\n return value === null || value === false;\n}\nexports.isUnset = isUnset;\nfunction deepAssign(dist, src, maxLevel = 5, level = 0) {\n if (level >= maxLevel)\n return;\n for (const key of Object.keys(src)) {\n const value = src[key];\n if (!(0, util_1.isPlainObject)(value) || !(0, util_1.isPlainObject)(dist[key])) {\n dist[key] = value;\n }\n else {\n deepAssign(dist[key], value, maxLevel, level + 1);\n }\n }\n return dist;\n}\nexports.deepAssign = deepAssign;\n//# sourceMappingURL=helper.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.combine = exports.divide = exports.unique = exports.isFlatArray = exports.lastOf = exports.firstOf = exports.transpose = exports.indexOf = exports.mapObject = void 0;\n/**\n * Calls a defined callback function on each key:value of a object,\n * and returns a object contains the result.\n */\nfunction mapObject(object, callbackfn) {\n return Object.entries(object).reduce((obj, [key, value]) => {\n obj[key] = callbackfn(value, key, object);\n return obj;\n }, {});\n}\nexports.mapObject = mapObject;\nfunction indexOf(array) {\n return array.map((_, i) => i);\n}\nexports.indexOf = indexOf;\n/**\n * @example [[1, 2, 3], ['a', 'b', 'c']] => [[1, 'a'], [2, 'b'], [3, 'c']]\n */\nfunction transpose(matrix) {\n const row = matrix.length;\n const col = matrix[0].length;\n // Note: new Array(col).fill(new Array(row)) is not ok!!!\n // Because in this case it will fill new Array(col) with the same array: new Array(row).\n const transposed = new Array(col).fill(0).map(() => new Array(row));\n for (let i = 0; i < col; i++) {\n for (let j = 0; j < row; j++) {\n transposed[i][j] = matrix[j][i];\n }\n }\n return transposed;\n}\nexports.transpose = transpose;\nfunction firstOf(array) {\n return array[0];\n}\nexports.firstOf = firstOf;\nfunction lastOf(array) {\n return array[array.length - 1];\n}\nexports.lastOf = lastOf;\nfunction isFlatArray(array) {\n return !array.some(Array.isArray);\n}\nexports.isFlatArray = isFlatArray;\nfunction unique(array) {\n return Array.from(new Set(array));\n}\nexports.unique = unique;\nfunction divide(array, callbackfn) {\n const result = [[], []];\n array.forEach((item) => {\n result[callbackfn(item) ? 0 : 1].push(item);\n });\n return result;\n}\nexports.divide = divide;\nfunction comb(array, len = array.length) {\n if (len === 1)\n return array.map((item) => [item]);\n const result = [];\n for (let i = 0; i < array.length; i++) {\n const rest = array.slice(i + 1);\n const restComb = comb(rest, len - 1);\n restComb.forEach((comb) => {\n result.push([array[i], ...comb]);\n });\n }\n return result;\n}\n/**\n * get all combinations of two elements in an array\n * @example [1, 2, 3] => [[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]\n * @param array\n * @returns\n */\nfunction combine(array) {\n if (array.length === 1)\n return [array];\n const result = [];\n for (let i = 1; i <= array.length; i++) {\n result.push(...comb(array, i));\n }\n return result;\n}\nexports.combine = combine;\n//# sourceMappingURL=array.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeTitle = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"../utils/helper\");\nconst dateFormat_1 = require(\"../utils/dateFormat\");\nconst helper_2 = require(\"./utils/helper\");\n/**\n * Infer title channel from x-position channel.\n */\nconst MaybeTitle = (options = {}) => {\n const { channel = 'x' } = options;\n return (I, mark) => {\n const { encode } = mark;\n const { tooltip } = mark;\n if ((0, helper_1.isUnset)(tooltip))\n return [I, mark];\n const { title } = tooltip;\n if (title !== undefined)\n return [I, mark];\n const titles = Object.keys(encode)\n .filter((key) => key.startsWith(channel))\n .filter((key) => !encode[key].inferred)\n .map((key) => (0, helper_2.columnOf)(encode, key))\n .filter(([T]) => T)\n .map((d) => d[0]);\n if (titles.length === 0)\n return [I, mark];\n const T = [];\n for (const i of I) {\n T[i] = {\n value: titles\n .map((t) => t[i] instanceof Date ? (0, dateFormat_1.dynamicFormatDateTime)(t[i]) : t[i])\n .join(', '),\n };\n }\n return [\n I,\n (0, util_1.deepMix)({}, mark, {\n tooltip: {\n title: T,\n },\n }),\n ];\n };\n};\nexports.MaybeTitle = MaybeTitle;\nexports.MaybeTitle.props = {};\n//# sourceMappingURL=maybeTitle.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.dynamicFormatDateTime = void 0;\nfunction fillZero(digit) {\n if (Math.abs(digit) > 10)\n return String(digit);\n return digit.toString().padStart(2, '0');\n}\nfunction dynamicFormatDateTime(date) {\n const year = date.getFullYear();\n const month = fillZero(date.getMonth() + 1);\n const day = fillZero(date.getDate());\n const yyyyMMDD = `${year}-${month}-${day}`;\n const hour = date.getHours();\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n if (hour || minutes || seconds)\n return `${yyyyMMDD} ${fillZero(hour)}:${fillZero(minutes)}:${fillZero(seconds)}`;\n return yyyyMMDD;\n}\nexports.dynamicFormatDateTime = dynamicFormatDateTime;\n//# sourceMappingURL=dateFormat.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeZeroX = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Add zero constant encode for x channel.\n * This is useful for interval geometry.\n */\nconst MaybeZeroX = () => {\n return (I, mark) => {\n const { encode } = mark;\n const { x } = encode;\n if (x !== undefined)\n return [I, mark];\n return [\n I,\n (0, util_1.deepMix)({}, mark, {\n encode: { x: (0, helper_1.inferredColumn)((0, helper_1.constant)(I, 0)) },\n scale: { x: { guide: null } },\n }),\n ];\n };\n};\nexports.MaybeZeroX = MaybeZeroX;\nexports.MaybeZeroX.props = {};\n//# sourceMappingURL=maybeZeroX.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeZeroY = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Add zero constant encode for y channel.\n */\nconst MaybeZeroY = () => {\n return (I, mark) => {\n const { encode } = mark;\n const { y } = encode;\n if (y !== undefined)\n return [I, mark];\n return [\n I,\n (0, util_1.deepMix)({}, mark, {\n encode: { y: (0, helper_1.inferredColumn)((0, helper_1.constant)(I, 0)) },\n scale: { y: { guide: null } },\n }),\n ];\n };\n};\nexports.MaybeZeroY = MaybeZeroY;\nexports.MaybeZeroY.props = {};\n//# sourceMappingURL=maybeZeroY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeZeroZ = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Add zero constant encode for z channel.\n */\nconst MaybeZeroZ = () => {\n return (I, mark) => {\n const { encode } = mark;\n const { z } = encode;\n if (z !== undefined)\n return [I, mark];\n return [\n I,\n (0, util_1.deepMix)({}, mark, {\n encode: { z: (0, helper_1.inferredColumn)((0, helper_1.constant)(I, 0)) },\n scale: { z: { guide: null } },\n }),\n ];\n };\n};\nexports.MaybeZeroZ = MaybeZeroZ;\nexports.MaybeZeroZ.props = {};\n//# sourceMappingURL=maybeZeroZ.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeSize = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Add 3 constant encode for size channel.\n * This is useful for point geometry.\n */\nconst MaybeSize = () => {\n return (I, mark) => {\n const { encode } = mark;\n const { size } = encode;\n if (size !== undefined)\n return [I, mark];\n return [\n I,\n (0, util_1.deepMix)({}, mark, { encode: { size: (0, helper_1.visualColumn)((0, helper_1.constant)(I, 3)) } }),\n ];\n };\n};\nexports.MaybeSize = MaybeSize;\nexports.MaybeSize.props = {};\n//# sourceMappingURL=maybeSize.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeKey = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Infer key for every element.\n */\nconst MaybeKey = () => {\n return (I, mark) => {\n const { encode } = mark;\n const { key } = encode, rest = __rest(encode, [\"key\"]);\n if (key !== undefined)\n return [I, mark];\n const values = Object.values(rest).map(({ value }) => value);\n const K = I.map((i) => values\n .filter(Array.isArray)\n .map((V) => V[i])\n .join('-'));\n return [I, (0, util_1.deepMix)({}, mark, { encode: { key: (0, helper_1.column)(K) } })];\n };\n};\nexports.MaybeKey = MaybeKey;\nexports.MaybeKey.props = {};\n//# sourceMappingURL=maybeKey.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeSeries = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Assume color channel is series channel.\n */\nconst MaybeSeries = () => {\n return (I, mark) => {\n const { encode } = mark;\n const { series, color } = encode;\n if (series !== undefined || color === undefined)\n return [I, mark];\n const [C, fc] = (0, helper_1.columnOf)(encode, 'color');\n return [I, (0, util_1.deepMix)({}, mark, { encode: { series: (0, helper_1.column)(C, fc) } })];\n };\n};\nexports.MaybeSeries = MaybeSeries;\nexports.MaybeSeries.props = {};\n//# sourceMappingURL=maybeSeries.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeTupleY = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Add 3 constant encode for size channel.\n * This is useful for point geometry.\n */\nconst MaybeTupleY = () => {\n return (I, mark) => {\n const { data } = mark;\n if (!Array.isArray(data) || data.some(helper_1.isObject))\n return [I, mark];\n return [I, (0, util_1.deepMix)({}, mark, { encode: { y: (0, helper_1.column)(data) } })];\n };\n};\nexports.MaybeTupleY = MaybeTupleY;\nexports.MaybeTupleY.props = {};\n//# sourceMappingURL=maybeTupleY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeTupleX = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Add 3 constant encode for size channel.\n * This is useful for point geometry.\n */\nconst MaybeTupleX = () => {\n return (I, mark) => {\n const { data } = mark;\n if (!Array.isArray(data) || data.some(helper_1.isObject))\n return [I, mark];\n return [I, (0, util_1.deepMix)({}, mark, { encode: { x: (0, helper_1.column)(data) } })];\n };\n};\nexports.MaybeTupleX = MaybeTupleX;\nexports.MaybeTupleX.props = {};\n//# sourceMappingURL=maybeTupleX.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeIdentityY = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Add 3 constant encode for size channel.\n * This is useful for point geometry.\n */\nconst MaybeIdentityY = () => {\n return (I, mark) => {\n const { encode } = mark;\n const { y1 } = encode;\n if (y1)\n return [I, mark];\n const [Y] = (0, helper_1.columnOf)(encode, 'y');\n return [I, (0, util_1.deepMix)({}, mark, { encode: { y1: (0, helper_1.column)([...Y]) } })];\n };\n};\nexports.MaybeIdentityY = MaybeIdentityY;\nexports.MaybeIdentityY.props = {};\n//# sourceMappingURL=maybeIdentityY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeIdentityX = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Add 3 constant encode for size channel.\n * This is useful for point geometry.\n */\nconst MaybeIdentityX = () => {\n return (I, mark) => {\n const { encode } = mark;\n const { x1 } = encode;\n if (x1)\n return [I, mark];\n const [X] = (0, helper_1.columnOf)(encode, 'x');\n return [I, (0, util_1.deepMix)({}, mark, { encode: { x1: (0, helper_1.column)([...X]) } })];\n };\n};\nexports.MaybeIdentityX = MaybeIdentityX;\nexports.MaybeIdentityX.props = {};\n//# sourceMappingURL=maybeIdentityX.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeDefaultX = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Add a default encode for rangeX\n * when data is just an array\n */\nconst MaybeDefaultX = () => {\n return (I, mark) => {\n const { data } = mark;\n if (Array.isArray(data) &&\n (data.every(Array.isArray) || !data.some(helper_1.isObject))) {\n const extractX = (data, index) => Array.isArray(data[0])\n ? data.map((item) => item[index])\n : [data[index]];\n return [\n I,\n (0, util_1.deepMix)({}, mark, {\n encode: {\n x: (0, helper_1.column)(extractX(data, 0)),\n x1: (0, helper_1.column)(extractX(data, 1)),\n },\n }),\n ];\n }\n return [I, mark];\n };\n};\nexports.MaybeDefaultX = MaybeDefaultX;\nexports.MaybeDefaultX.props = {};\n//# sourceMappingURL=maybeDefaultX.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeDefaultY = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Add a default encode for rangeY\n * when data is just an array\n */\nconst MaybeDefaultY = () => {\n return (I, mark) => {\n const { data } = mark;\n if (Array.isArray(data) &&\n (data.every(Array.isArray) || !data.some(helper_1.isObject))) {\n const extractY = (data, index) => Array.isArray(data[0])\n ? data.map((item) => item[index])\n : [data[index]];\n return [\n I,\n (0, util_1.deepMix)({}, mark, {\n encode: {\n y: (0, helper_1.column)(extractY(data, 0)),\n y1: (0, helper_1.column)(extractY(data, 1)),\n },\n }),\n ];\n }\n return [I, mark];\n };\n};\nexports.MaybeDefaultY = MaybeDefaultY;\nexports.MaybeDefaultY.props = {};\n//# sourceMappingURL=maybeDefaultY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeTooltip = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"../utils/helper\");\n/**\n * Infer tooltip channel from specified channel.\n */\nconst MaybeTooltip = (options) => {\n const { channel } = options;\n return (I, mark) => {\n const { encode, tooltip } = mark;\n if ((0, helper_1.isUnset)(tooltip))\n return [I, mark];\n const { items = [] } = tooltip;\n if (!items || items.length > 0)\n return [I, mark];\n const channels = Array.isArray(channel) ? channel : [channel];\n const newItems = channels.flatMap((channel) => Object.keys(encode)\n .filter((key) => key.startsWith(channel))\n .map((key) => {\n const { field, value, inferred = false, aggregate } = encode[key];\n if (inferred)\n return null;\n // Do not show inferred column.\n if (aggregate && value)\n return { channel: key };\n if (field)\n return { field };\n if (value)\n return { channel: key };\n return null;\n })\n .filter((d) => d !== null));\n return [I, (0, util_1.deepMix)({}, mark, { tooltip: { items: newItems } })];\n };\n};\nexports.MaybeTooltip = MaybeTooltip;\nexports.MaybeTooltip.props = {};\n//# sourceMappingURL=maybeTooltip.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeZeroPadding = void 0;\nconst util_1 = require(\"@antv/util\");\n/**\n * Set padding of x and y scale to zero.\n */\nconst MaybeZeroPadding = () => {\n return (I, mark) => {\n return [\n I,\n (0, util_1.deepMix)({ scale: { x: { padding: 0 }, y: { padding: 0 } } }, mark),\n ];\n };\n};\nexports.MaybeZeroPadding = MaybeZeroPadding;\nexports.MaybeZeroPadding.props = {};\n//# sourceMappingURL=maybeZeroPadding.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeVisualPosition = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Set visual position with style.x and style.y.\n * The priority of style.x, style.y is higher than data.\n */\nconst MaybeVisualPosition = () => {\n return (I, mark) => {\n const { data, style = {} } = mark, restMark = __rest(mark, [\"data\", \"style\"]);\n const { x: x0, y: y0 } = style, rest = __rest(style, [\"x\", \"y\"]);\n if (x0 == undefined || y0 == undefined)\n return [I, mark];\n const x = x0 || 0;\n const y = y0 || 0;\n return [\n [0],\n (0, util_1.deepMix)({}, restMark, {\n data: [0],\n cartesian: true,\n encode: {\n x: (0, helper_1.column)([x]),\n y: (0, helper_1.column)([y]),\n },\n scale: {\n x: { type: 'identity', independent: true, guide: null },\n y: { type: 'identity', independent: true, guide: null }, // hide axis\n },\n style: rest,\n }),\n ];\n };\n};\nexports.MaybeVisualPosition = MaybeVisualPosition;\nexports.MaybeVisualPosition.props = {};\n//# sourceMappingURL=maybeVisualPosition.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeFunctionAttribute = void 0;\nconst util_1 = require(\"@antv/util\");\n/**\n * Mark functional attribute constant.\n */\nconst MaybeFunctionAttribute = () => {\n return (I, mark) => {\n const { style = {} } = mark;\n return [\n I,\n (0, util_1.deepMix)({}, mark, {\n style: Object.assign(Object.assign({}, style), Object.fromEntries(Object.entries(style)\n .filter(([, v]) => typeof v === 'function')\n .map(([k, v]) => [k, () => v]))),\n }),\n ];\n };\n};\nexports.MaybeFunctionAttribute = MaybeFunctionAttribute;\nexports.MaybeFunctionAttribute.props = {};\n//# sourceMappingURL=maybeFunctionAttribute.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeTuple = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Add 3 constant encode for size channel.\n * This is useful for point geometry.\n */\nconst MaybeTuple = () => {\n return (I, mark) => {\n const { data } = mark;\n if (!Array.isArray(data) || data.some(helper_1.isObject))\n return [I, mark];\n const position = Array.isArray(data[0]) ? data : [data];\n const X = position.map((d) => d[0]);\n const Y = position.map((d) => d[1]);\n return [I, (0, util_1.deepMix)({}, mark, { encode: { x: (0, helper_1.column)(X), y: (0, helper_1.column)(Y) } })];\n };\n};\nexports.MaybeTuple = MaybeTuple;\nexports.MaybeTuple.props = {};\n//# sourceMappingURL=maybeTuple.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaybeGradient = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Add 3 constant encode for size channel.\n * This is useful for point geometry.\n */\nconst MaybeGradient = () => {\n return (I, mark) => {\n const { style = {}, encode } = mark;\n const { series } = encode;\n const { gradient } = style;\n if (!gradient || series)\n return [I, mark];\n return [\n I,\n (0, util_1.deepMix)({}, mark, {\n encode: {\n series: (0, helper_1.visualColumn)((0, helper_1.constant)(I, undefined)),\n },\n }),\n ];\n };\n};\nexports.MaybeGradient = MaybeGradient;\nexports.MaybeGradient.props = {};\n//# sourceMappingURL=maybeGradient.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DodgeX = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\nconst order_1 = require(\"./utils/order\");\n/**\n * The dodge group marks into series by color or series channel,\n * and then produce new series channel for each series by specified order,\n * say to form horizontal \"columns\" by specified channels.\n */\nconst DodgeX = (options = {}) => {\n const { groupBy = 'x', reverse = false, orderBy, padding } = options, rest = __rest(options, [\"groupBy\", \"reverse\", \"orderBy\", \"padding\"]);\n return (I, mark) => {\n const { data, encode, scale } = mark;\n const { series: scaleSeries } = scale;\n const [Y] = (0, helper_1.columnOf)(encode, 'y');\n const [S] = (0, helper_1.maybeColumnOf)(encode, 'series', 'color');\n const domainSeries = (0, order_1.domainOf)(S, scaleSeries);\n const newMark = (0, util_1.deepMix)({}, mark, {\n scale: {\n series: {\n domain: domainSeries,\n paddingInner: padding,\n },\n },\n });\n // Create groups and apply specified order for each group.\n const groups = (0, order_1.createGroups)(groupBy, I, mark);\n const createComparator = (0, order_1.normalizeComparator)(orderBy);\n if (!createComparator) {\n return [I, (0, util_1.deepMix)(newMark, { encode: { series: (0, helper_1.column)(S) } })];\n }\n // Sort and Update series for each mark related to series domain.\n const comparator = createComparator(data, Y, S);\n if (comparator)\n (0, order_1.applyOrder)(groups, comparator);\n const newS = new Array(I.length);\n for (const G of groups) {\n if (reverse)\n G.reverse();\n for (let i = 0; i < G.length; i++) {\n newS[G[i]] = domainSeries[i];\n }\n }\n return [\n I,\n (0, util_1.deepMix)(newMark, {\n encode: {\n series: (0, helper_1.column)(orderBy ? newS : S),\n },\n }),\n ];\n };\n};\nexports.DodgeX = DodgeX;\nexports.DodgeX.props = {};\n//# sourceMappingURL=dodgeX.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StackEnter = void 0;\nconst util_1 = require(\"@antv/util\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst helper_1 = require(\"./utils/helper\");\n/**\n * Group marks by channels into groups and stacking their enterDelay\n * to make marks show up groups by groups.\n * It will update enterDelay channel for each mark by its enterDuration and group.\n * @todo Support orderBy.\n * @todo Sort among groups(e.g. reverse).\n * @todo Stack enter in groups rather than between groups?\n * @todo Auto inter this statistic for scaleInY animation in stacked interval?\n * @todo All the groups shared the enterDuration?\n */\nconst StackEnter = (options) => {\n const { groupBy = ['x'], reducer = (I, V) => V[I[0]], orderBy = null, reverse = false, duration, } = options;\n return (I, mark) => {\n const { encode } = mark;\n // Extract group information by each specified channel,\n // and skip if all values of channels are empty.\n const by = Array.isArray(groupBy) ? groupBy : [groupBy];\n const groupEntries = by.map((k) => [k, (0, helper_1.columnOf)(encode, k)[0]]);\n if (groupEntries.length === 0)\n return [I, mark];\n // Nest group index and flatten them in right order among timeline.\n // [[1, 2, 3, 4, 5, 6]] ->\n // [[1, 2, 3], [4, 5, 6]] ->\n // [[1], [2], [3], [4], [5], [6]]\n let groups = [I];\n for (const [, V] of groupEntries) {\n const newGroups = [];\n for (const I of groups) {\n const G = Array.from((0, d3_array_1.group)(I, (i) => V[i]).values());\n // @todo sort by x.\n newGroups.push(...G);\n }\n groups = newGroups;\n }\n // const {color} = encode;\n if (orderBy) {\n const [V] = (0, helper_1.columnOf)(encode, orderBy);\n if (V)\n groups.sort((I, J) => reducer(I, V) - reducer(J, V));\n if (reverse)\n groups.reverse();\n }\n // Stack delay for each group.\n const t = (duration || 3000) / groups.length;\n const [ED] = duration\n ? [(0, helper_1.constant)(I, t)] // If specified duration, generate enter duration for each.\n : (0, helper_1.maybeColumnOf)(encode, 'enterDuration', (0, helper_1.constant)(I, t));\n const [EDL] = (0, helper_1.maybeColumnOf)(encode, 'enterDelay', (0, helper_1.constant)(I, 0));\n const newEnterDelay = new Array(I.length);\n for (let i = 0, pd = 0; i < groups.length; i++) {\n const I = groups[i];\n const maxDuration = (0, d3_array_1.max)(I, (i) => +ED[i]);\n for (const j of I)\n newEnterDelay[j] = +EDL[j] + pd;\n pd += maxDuration;\n }\n return [\n I,\n (0, util_1.deepMix)({}, mark, {\n encode: {\n enterDuration: (0, helper_1.visualColumn)(ED),\n enterDelay: (0, helper_1.visualColumn)(newEnterDelay),\n },\n }),\n ];\n };\n};\nexports.StackEnter = StackEnter;\nexports.StackEnter.props = {};\n//# sourceMappingURL=stackEnter.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NormalizeY = void 0;\nconst util_1 = require(\"@antv/util\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst helper_1 = require(\"../utils/helper\");\nconst helper_2 = require(\"./utils/helper\");\nconst order_1 = require(\"./utils/order\");\nfunction normalizeBasis(basis) {\n if (typeof basis === 'function')\n return basis;\n const registry = {\n min: (I, Y) => (0, d3_array_1.min)(I, (i) => Y[+i]),\n max: (I, Y) => (0, d3_array_1.max)(I, (i) => Y[+i]),\n first: (I, Y) => Y[I[0]],\n last: (I, Y) => Y[I[I.length - 1]],\n mean: (I, Y) => (0, d3_array_1.mean)(I, (i) => Y[+i]),\n median: (I, Y) => (0, d3_array_1.median)(I, (i) => Y[+i]),\n sum: (I, Y) => (0, d3_array_1.sum)(I, (i) => Y[+i]),\n deviation: (I, Y) => (0, d3_array_1.deviation)(I, (i) => Y[+i]),\n };\n return registry[basis] || d3_array_1.max;\n}\n/**\n * Group marks into series by specified channels, and then transform\n * each series's value, say to transform them relative to some basis\n * to apply a moving average.\n */\nconst NormalizeY = (options = {}) => {\n const { groupBy = 'x', basis = 'max' } = options;\n return (I, mark) => {\n const { encode, tooltip } = mark;\n const { x } = encode, rest = __rest(encode, [\"x\"]);\n // Extract and create new channels starts with y, such as y, y1.\n const Yn = Object.entries(rest)\n .filter(([k]) => k.startsWith('y'))\n .map(([k]) => [k, (0, helper_2.columnOf)(encode, k)[0]]);\n const [, Y] = Yn.find(([k]) => k === 'y');\n const newYn = Yn.map(([k]) => [k, new Array(I.length)]);\n // Group marks into series by specified keys.\n const groups = (0, order_1.createGroups)(groupBy, I, mark);\n // Transform y channels for each group based on basis.\n const basisFunction = normalizeBasis(basis);\n for (const I of groups) {\n // Compute basis only base on y.\n const basisValue = basisFunction(I, Y);\n for (const i of I) {\n for (let j = 0; j < Yn.length; j++) {\n const [, V] = Yn[j];\n const [, newV] = newYn[j];\n newV[i] = +V[i] / basisValue;\n }\n }\n }\n const specifiedTooltip = (0, helper_1.isUnset)(tooltip) || ((tooltip === null || tooltip === void 0 ? void 0 : tooltip.items) && (tooltip === null || tooltip === void 0 ? void 0 : tooltip.items.length) !== 0);\n return [\n I,\n (0, util_1.deepMix)({}, mark, Object.assign({ encode: Object.fromEntries(newYn.map(([k, v]) => [k, (0, helper_2.column)(v, (0, helper_2.columnOf)(encode, k)[1])])) }, (!specifiedTooltip &&\n encode.y0 && {\n tooltip: { items: [{ channel: 'y0' }] },\n }))),\n ];\n };\n};\nexports.NormalizeY = NormalizeY;\nexports.NormalizeY.props = {};\n//# sourceMappingURL=normalizeY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Jitter = exports.interpolate = exports.rangeOf = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\nconst order_1 = require(\"./utils/order\");\nfunction rangeOf(value, scaleOptions, padding) {\n if (value === null)\n return [-0.5, 0.5];\n const domain = (0, order_1.domainOf)(value, scaleOptions);\n const scale = new scale_1.Band({ domain, range: [0, 1], padding });\n const step = scale.getBandWidth();\n return [-step / 2, step / 2];\n}\nexports.rangeOf = rangeOf;\nfunction interpolate(t, a, b) {\n return a * (1 - t) + b * t;\n}\nexports.interpolate = interpolate;\n/**\n * The jitter transform produce dx and dy channels for marks (especially for point)\n * with ordinal x and y dimension, say to make them jitter in their own space.\n */\nconst Jitter = (options = {}) => {\n const { padding = 0, paddingX = padding, paddingY = padding, random = Math.random, } = options;\n return (I, mark) => {\n const { encode, scale } = mark;\n const { x: scaleX, y: scaleY } = scale;\n const [X] = (0, helper_1.columnOf)(encode, 'x');\n const [Y] = (0, helper_1.columnOf)(encode, 'y');\n const rangeX = rangeOf(X, scaleX, paddingX);\n const rangeY = rangeOf(Y, scaleY, paddingY);\n const DY = I.map(() => interpolate(random(), ...rangeY));\n const DX = I.map(() => interpolate(random(), ...rangeX));\n return [\n I,\n (0, util_1.deepMix)({\n scale: {\n x: { padding: 0.5 },\n y: { padding: 0.5 },\n },\n }, mark, {\n encode: { dy: (0, helper_1.column)(DY), dx: (0, helper_1.column)(DX) },\n }),\n ];\n };\n};\nexports.Jitter = Jitter;\nexports.Jitter.props = {};\n//# sourceMappingURL=jitter.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.JitterX = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\nconst jitter_1 = require(\"./jitter\");\n/**\n * The JitterX transform produce dy channels for marks (especially for point)\n * with ordinal x and y dimension, say to make them jitter in their own space.\n */\nconst JitterX = (options = {}) => {\n const { padding = 0, random = Math.random } = options;\n return (I, mark) => {\n const { encode, scale } = mark;\n const { x: scaleX } = scale;\n const [X] = (0, helper_1.columnOf)(encode, 'x');\n const rangeX = (0, jitter_1.rangeOf)(X, scaleX, padding);\n const DX = I.map(() => (0, jitter_1.interpolate)(random(), ...rangeX));\n return [\n I,\n (0, util_1.deepMix)({ scale: { x: { padding: 0.5 } } }, mark, {\n encode: { dx: (0, helper_1.column)(DX) },\n }),\n ];\n };\n};\nexports.JitterX = JitterX;\nexports.JitterX.props = {};\n//# sourceMappingURL=jitterX.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.JitterY = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\nconst jitter_1 = require(\"./jitter\");\n/**\n * The JitterY transform produce dy channels for marks (especially for point)\n * with ordinal x and y dimension, say to make them jitter in their own space.\n */\nconst JitterY = (options = {}) => {\n const { padding = 0, random = Math.random } = options;\n return (I, mark) => {\n const { encode, scale } = mark;\n const { y: scaleY } = scale;\n const [Y] = (0, helper_1.columnOf)(encode, 'y');\n const rangeY = (0, jitter_1.rangeOf)(Y, scaleY, padding);\n const DY = I.map(() => (0, jitter_1.interpolate)(random(), ...rangeY));\n return [\n I,\n (0, util_1.deepMix)({ scale: { y: { padding: 0.5 } } }, mark, {\n encode: { dy: (0, helper_1.column)(DY) },\n }),\n ];\n };\n};\nexports.JitterY = JitterY;\nexports.JitterY.props = {};\n//# sourceMappingURL=jitterY.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SymmetryY = void 0;\nconst util_1 = require(\"@antv/util\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst helper_1 = require(\"./utils/helper\");\nconst order_1 = require(\"./utils/order\");\n/**\n * The SymmetryY transform apply offset for y channels, say to transform\n * them to be symmetry.\n */\nconst SymmetryY = (options = {}) => {\n const { groupBy = 'x' } = options;\n return (I, mark) => {\n const { encode } = mark;\n const { x } = encode, rest = __rest(encode, [\"x\"]);\n // Extract and create new channels starts with y, such as y, y1.\n const Yn = Object.entries(rest)\n .filter(([k]) => k.startsWith('y'))\n .map(([k]) => [k, (0, helper_1.columnOf)(encode, k)[0]]);\n const newYn = Yn.map(([k]) => [k, new Array(I.length)]);\n // Group marks into series by specified keys.\n const groups = (0, order_1.createGroups)(groupBy, I, mark);\n const MY = new Array(groups.length);\n for (let i = 0; i < groups.length; i++) {\n const I = groups[i];\n const Y = I.flatMap((i) => Yn.map(([, V]) => +V[i]));\n const [minY, maxY] = (0, d3_array_1.extent)(Y);\n MY[i] = (minY + maxY) / 2;\n }\n const maxMiddleY = Math.max(...MY);\n for (let m = 0; m < groups.length; m++) {\n const offset = maxMiddleY - MY[m];\n const I = groups[m];\n for (const i of I) {\n for (let j = 0; j < Yn.length; j++) {\n const [, V] = Yn[j];\n const [, newV] = newYn[j];\n newV[i] = +V[i] + offset;\n }\n }\n }\n return [\n I,\n (0, util_1.deepMix)({}, mark, {\n encode: Object.fromEntries(newYn.map(([k, v]) => [k, (0, helper_1.column)(v, (0, helper_1.columnOf)(encode, k)[1])])),\n }),\n ];\n };\n};\nexports.SymmetryY = SymmetryY;\nexports.SymmetryY.props = {};\n//# sourceMappingURL=symmetryY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DiffY = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./utils/helper\");\nconst order_1 = require(\"./utils/order\");\n/**\n * The DiffY transform apply offset for y0 channels.\n * Keep y unchanged, set y1 = max(otherY), if y1 > y, remove the data.\n */\nconst DiffY = (options = {}) => {\n const { groupBy = 'x' } = options;\n return (I, mark) => {\n const { encode } = mark;\n const [Y] = (0, helper_1.columnOf)(encode, 'y');\n const [_, fy1] = (0, helper_1.columnOf)(encode, 'y1');\n // Create groups and apply specified order for each group.\n const groups = (0, order_1.createGroups)(groupBy, I, mark);\n // Only adjust Y1 channel.\n const newY1 = new Array(I.length);\n for (const G of groups) {\n const YG = G.map((i) => +Y[i]);\n // Process each series.\n for (let idx = 0; idx < G.length; idx++) {\n const i = G[idx];\n // Get the max Y of current group with current Y exclude.\n const max = Math.max(...YG.filter((_, _i) => _i !== idx));\n // Diff Y value.\n newY1[i] = +Y[i] > max ? max : Y[i];\n }\n }\n return [\n I,\n (0, util_1.deepMix)({}, mark, {\n encode: {\n y1: (0, helper_1.column)(newY1, fy1),\n },\n }),\n ];\n };\n};\nexports.DiffY = DiffY;\nexports.DiffY.props = {};\n//# sourceMappingURL=diffY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Select = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst helper_1 = require(\"./utils/helper\");\nconst order_1 = require(\"./utils/order\");\nfunction first(I, V) {\n return [I[0]];\n}\nfunction last(I, V) {\n const i = I.length - 1;\n return [I[i]];\n}\nfunction max(I, V) {\n const i = (0, d3_array_1.maxIndex)(I, (i) => V[i]);\n return [I[i]];\n}\nfunction min(I, V) {\n const i = (0, d3_array_1.minIndex)(I, (i) => V[i]);\n return [I[i]];\n}\nfunction normalizeSelector(selector) {\n if (typeof selector === 'function')\n return selector;\n const registry = { first, last, max, min };\n return registry[selector] || first;\n}\n/**\n * The select transform groups marks with specified channels, and\n * filter index by specified selector for each series, say to\n * pull a single or multiple values out of each series.\n */\nconst Select = (options = {}) => {\n const { groupBy = 'series', channel, selector } = options;\n return (I, mark) => {\n const { encode } = mark;\n const groups = (0, order_1.createGroups)(groupBy, I, mark);\n const [V] = (0, helper_1.columnOf)(encode, channel);\n const selectFunction = normalizeSelector(selector);\n return [groups.flatMap((GI) => selectFunction(GI, V)), mark];\n };\n};\nexports.Select = Select;\nexports.Select.props = {};\n//# sourceMappingURL=select.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SelectX = void 0;\nconst select_1 = require(\"./select\");\n/**\n * The selectX transform filter index by y channel.\n */\nconst SelectX = (options = {}) => {\n const { selector } = options, rest = __rest(options, [\"selector\"]);\n return (0, select_1.Select)(Object.assign({ channel: 'x', selector }, rest));\n};\nexports.SelectX = SelectX;\nexports.SelectX.props = {};\n//# sourceMappingURL=selectX.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SelectY = void 0;\nconst select_1 = require(\"./select\");\n/**\n * The selectY transform filter index by y channel.\n */\nconst SelectY = (options = {}) => {\n const { selector } = options, rest = __rest(options, [\"selector\"]);\n return (0, select_1.Select)(Object.assign({ channel: 'y', selector }, rest));\n};\nexports.SelectY = SelectY;\nexports.SelectY.props = {};\n//# sourceMappingURL=selectY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GroupX = void 0;\nconst group_1 = require(\"./group\");\n/**\n * The GroupX transform group data by x channel, and aggregate.\n */\nconst GroupX = (options = {}) => {\n return (0, group_1.Group)(Object.assign(Object.assign({}, options), { channels: ['x', 'color', 'series'] }));\n};\nexports.GroupX = GroupX;\nexports.GroupX.props = {};\n//# sourceMappingURL=groupX.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Group = void 0;\nconst order_1 = require(\"./utils/order\");\nconst groupN_1 = require(\"./groupN\");\n/**\n * The Group transform group data by x and y channels, and aggregate.\n */\nconst Group = (options = {}) => {\n const { channels = ['x', 'y'] } = options, rest = __rest(options, [\"channels\"]);\n const groupBy = (I, mark) => (0, order_1.createGroups)(channels, I, mark);\n return (0, groupN_1.GroupN)(Object.assign(Object.assign({}, rest), { groupBy }));\n};\nexports.Group = Group;\nexports.Group.props = {};\n//# sourceMappingURL=group.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GroupN = void 0;\nconst util_1 = require(\"@antv/util\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst array_1 = require(\"../utils/array\");\nconst helper_1 = require(\"./utils/helper\");\nfunction builtinFormatter(summary) {\n return (d) => (d === null ? summary : `${summary} of ${d}`);\n}\nfunction normalizeReducer(reducer) {\n if (typeof reducer === 'function')\n return [reducer, null];\n const registry = { mean, max, count, first, last, sum, min, median };\n const reducerFunction = registry[reducer];\n if (!reducerFunction)\n throw new Error(`Unknown reducer: ${reducer}.`);\n return reducerFunction();\n}\nfunction mean() {\n const reducer = (I, V) => (0, d3_array_1.mean)(I, (i) => +V[i]);\n const formatter = builtinFormatter('mean');\n return [reducer, formatter];\n}\nfunction median() {\n const reducer = (I, V) => (0, d3_array_1.median)(I, (i) => +V[i]);\n const formatter = builtinFormatter('median');\n return [reducer, formatter];\n}\nfunction max() {\n const reducer = (I, V) => (0, d3_array_1.max)(I, (i) => +V[i]);\n const formatter = builtinFormatter('max');\n return [reducer, formatter];\n}\nfunction min() {\n const reducer = (I, V) => (0, d3_array_1.min)(I, (i) => +V[i]);\n const formatter = builtinFormatter('min');\n return [reducer, formatter];\n}\nfunction count() {\n const reducer = (I, V) => I.length;\n const formatter = builtinFormatter('count');\n return [reducer, formatter];\n}\nfunction sum() {\n const reducer = (I, V) => (0, d3_array_1.sum)(I, (i) => +V[i]);\n const formatter = builtinFormatter('sum');\n return [reducer, formatter];\n}\nfunction first() {\n const reducer = (I, V) => V[I[0]];\n const formatter = builtinFormatter('first');\n return [reducer, formatter];\n}\nfunction last() {\n const reducer = (I, V) => V[I[I.length - 1]];\n const formatter = builtinFormatter('last');\n return [reducer, formatter];\n}\n/**\n * The Group transform group data by x and y channels, and aggregate.\n */\nconst GroupN = (options = {}) => {\n const { groupBy } = options, rest = __rest(options, [\"groupBy\"]);\n return (I, mark) => {\n const { data, encode } = mark;\n const groups = groupBy(I, mark);\n if (!groups)\n return [I, mark];\n // Extract field from from channel\n // x1 from x, y1 from y, etc,.\n const maybeFrom = (field, reducer) => {\n if (field)\n return field;\n const { from } = reducer;\n if (!from)\n return field;\n const [, field1] = (0, helper_1.columnOf)(encode, from);\n return field1;\n };\n const outputs = Object.entries(rest).map(([channel, reducer]) => {\n const [reducerFunction, formatter] = normalizeReducer(reducer);\n const [V, field] = (0, helper_1.columnOf)(encode, channel);\n const field1 = maybeFrom(field, reducer);\n const RV = groups.map((I) => reducerFunction(I, V !== null && V !== void 0 ? V : data));\n return [\n channel,\n Object.assign(Object.assign({}, (0, helper_1.nonConstantColumn)(RV, (formatter === null || formatter === void 0 ? void 0 : formatter(field1)) || field1)), { aggregate: true }),\n ];\n });\n const reducedColumns = Object.keys(encode).map((key) => {\n const [V, fv] = (0, helper_1.columnOf)(encode, key);\n const GV = groups.map((I) => V[I[0]]);\n return [key, (0, helper_1.column)(GV, fv)];\n });\n const GD = groups.map((I) => data[I[0]]);\n const GI = (0, array_1.indexOf)(groups);\n return [\n GI,\n (0, util_1.deepMix)({}, mark, {\n data: GD,\n encode: Object.fromEntries([...reducedColumns, ...outputs]),\n }),\n ];\n };\n};\nexports.GroupN = GroupN;\nexports.GroupN.props = {};\n//# sourceMappingURL=groupN.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GroupY = void 0;\nconst group_1 = require(\"./group\");\n/**\n * The GroupY transform group data by x channel, and aggregate.\n */\nconst GroupY = (options = {}) => {\n return (0, group_1.Group)(Object.assign(Object.assign({}, options), { channels: ['y', 'color', 'series'] }));\n};\nexports.GroupY = GroupY;\nexports.GroupY.props = {};\n//# sourceMappingURL=groupY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GroupColor = void 0;\nconst group_1 = require(\"./group\");\n/**\n * The GroupColor transform group data by x channel, and aggregate.\n */\nconst GroupColor = (options = {}) => {\n return (0, group_1.Group)(Object.assign(Object.assign({}, options), { channels: ['color'] }));\n};\nexports.GroupColor = GroupColor;\nexports.GroupColor.props = {};\n//# sourceMappingURL=groupColor.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SortX = void 0;\nconst sort_1 = require(\"./sort\");\n/**\n * Sort domain of x scale of mark groups by groups.\n */\nconst SortX = (options = {}) => {\n return (0, sort_1.Sort)(Object.assign(Object.assign({}, options), { channel: 'x' }));\n};\nexports.SortX = SortX;\nexports.SortX.props = {};\n//# sourceMappingURL=sortX.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Sort = void 0;\nconst util_1 = require(\"@antv/util\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst helper_1 = require(\"./utils/helper\");\nfunction createReducer(channel, options, encode) {\n const { by = channel, reducer = 'max' } = options;\n const [V] = (0, helper_1.columnOf)(encode, by);\n if (typeof reducer === 'function')\n return (GI) => reducer(GI, V);\n if (reducer === 'max')\n return (GI) => (0, d3_array_1.max)(GI, (i) => +V[i]);\n if (reducer === 'min')\n return (GI) => (0, d3_array_1.min)(GI, (i) => +V[i]);\n if (reducer === 'sum')\n return (GI) => (0, d3_array_1.sum)(GI, (i) => +V[i]);\n if (reducer === 'median')\n return (GI) => (0, d3_array_1.median)(GI, (i) => +V[i]);\n if (reducer === 'mean')\n return (GI) => (0, d3_array_1.mean)(GI, (i) => +V[i]);\n if (reducer === 'first')\n return (GI) => V[GI[0]];\n if (reducer === 'last')\n return (GI) => V[GI[GI.length - 1]];\n throw new Error(`Unknown reducer: ${reducer}`);\n}\n// If domain is specified, only sort data in the domain.\nfunction filterIndex(I, values, specifiedDomain) {\n if (!Array.isArray(specifiedDomain))\n return I;\n const domain = new Set(specifiedDomain);\n return I.filter((i) => domain.has(values[i]));\n}\n/**\n * Sort marks groups by groups.\n */\nconst Sort = (options = {}) => {\n return (I, mark) => {\n const { reverse, slice, channel, by, ordinal = true, reducer } = options;\n const { encode, scale = {} } = mark;\n const domain = scale[channel].domain;\n const [V] = (0, helper_1.columnOf)(encode, by !== null && by !== void 0 ? by : channel);\n const [T] = (0, helper_1.columnOf)(encode, channel);\n const normalizeReducer = createReducer(channel, { by, reducer }, encode);\n const SI = filterIndex(I, T, domain);\n const sortedDomain = (0, d3_array_1.groupSort)(SI, normalizeReducer, (i) => T[i]);\n // when ordinal is true, do not change the index of the data.\n const sortedI = !ordinal ? (0, d3_array_1.sort)(I, (i) => V[i]) : I;\n if (reverse) {\n !ordinal && sortedI.reverse();\n sortedDomain.reverse();\n }\n const s = typeof slice === 'number' ? [0, slice] : slice;\n const slicedDomain = slice ? sortedDomain.slice(...s) : sortedDomain;\n return [\n sortedI,\n (0, util_1.deepMix)(mark, { scale: { [channel]: { domain: slicedDomain } } }),\n ];\n };\n};\nexports.Sort = Sort;\nexports.Sort.props = {};\n//# sourceMappingURL=sort.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SortColor = void 0;\nconst sort_1 = require(\"./sort\");\n/**\n * Sort domain of x scale of mark groups by groups.\n */\nconst SortColor = (options = {}) => {\n return (0, sort_1.Sort)(Object.assign(Object.assign({}, options), { channel: 'color' }));\n};\nexports.SortColor = SortColor;\nexports.SortColor.props = {};\n//# sourceMappingURL=sortColor.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SortY = void 0;\nconst sort_1 = require(\"./sort\");\n/**\n * Sort domain of x scale of mark groups by groups.\n */\nconst SortY = (options = {}) => {\n return (0, sort_1.Sort)(Object.assign(Object.assign({}, options), { channel: 'y' }));\n};\nexports.SortY = SortY;\nexports.SortY.props = {};\n//# sourceMappingURL=sortY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FlexX = void 0;\nconst util_1 = require(\"@antv/util\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst helper_1 = require(\"./utils/helper\");\nfunction valueOf(data, field) {\n if (typeof field === 'string')\n return data.map((d) => d[field]);\n return data.map(field);\n}\nfunction createReducer(reducer, V) {\n if (typeof reducer === 'function')\n return (GI) => reducer(GI, V);\n if (reducer === 'sum')\n return (GI) => (0, d3_array_1.sum)(GI, (i) => +V[i]);\n throw new Error(`Unknown reducer: ${reducer}`);\n}\n/**\n * Produce flex options from data for x scale.\n */\nconst FlexX = (options = {}) => {\n const { field, channel = 'y', reducer = 'sum' } = options;\n return (I, mark) => {\n const { data, encode } = mark;\n const [x] = (0, helper_1.columnOf)(encode, 'x');\n const V = field ? valueOf(data, field) : (0, helper_1.columnOf)(encode, channel)[0];\n const reducerFunction = createReducer(reducer, V);\n const flex = (0, d3_array_1.rollups)(I, reducerFunction, (i) => x[i]).map((d) => d[1]);\n return [I, (0, util_1.deepMix)({}, mark, { scale: { x: { flex } } })];\n };\n};\nexports.FlexX = FlexX;\nexports.FlexX.props = {};\n//# sourceMappingURL=flexX.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Pack = void 0;\nconst util_1 = require(\"@antv/util\");\nconst vector_1 = require(\"../utils/vector\");\nfunction pack(options) {\n const { padding = 0, direction = 'col' } = options;\n return (P, count, layout) => {\n const pcount = P.length;\n if (pcount === 0)\n return [];\n // col * row >= count\n // row is close to col * aspect, so\n // col * (col * aspect) >= count\n const { innerWidth, innerHeight } = layout;\n const aspect = innerHeight / innerWidth;\n let col = Math.ceil(Math.sqrt(count / aspect));\n // Increase col to avoid total height of packed shape\n // being large than height of bbox.\n let size = innerWidth / col;\n let row = Math.ceil(count / col);\n let h0 = row * size;\n while (h0 > innerHeight) {\n col = col + 1;\n size = innerWidth / col;\n row = Math.ceil(count / col);\n h0 = row * size;\n }\n // Some offset to increase the space usage.\n const space = innerHeight - row * size;\n const intervalY = row <= 1 ? 0 : space / (row - 1);\n const [offsetX, offsetY] = row <= 1\n ? [\n (innerWidth - pcount * size) / (pcount - 1),\n (innerHeight - size) / 2,\n ]\n : [0, 0];\n return P.map((points, m) => {\n const [x, y, width, height] = (0, vector_1.calcBBox)(points);\n const i = direction === 'col' ? m % col : Math.floor(m / row);\n const j = direction === 'col' ? Math.floor(m / col) : m % row;\n const newX = i * size;\n const newY = (row - j - 1) * size + space;\n const sx = (size - padding) / width;\n const sy = (size - padding) / height;\n // Translate the shape and mark to make sure the center of\n // shape is overlap before and after scale transformation.\n const tx = newX - x + offsetX * i + (1 / 2) * padding;\n const ty = newY - y - intervalY * j - offsetY + (1 / 2) * padding;\n return `translate(${tx}, ${ty}) scale(${sx}, ${sy})`;\n });\n };\n}\n/**\n * Uniform pack to avid overlap.\n * @todo Improve or change algorithm to increase space usage.\n * @todo Take some special case into account.\n */\nconst Pack = (options) => {\n return (I, mark) => {\n return [I, (0, util_1.deepMix)({}, mark, { modifier: pack(options), axis: false })];\n };\n};\nexports.Pack = Pack;\nexports.Pack.props = {};\n//# sourceMappingURL=pack.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.mid = exports.calcBBox = exports.angleBetween = exports.angleWithQuadrant = exports.angle = exports.dist = exports.add = exports.sub = void 0;\nfunction sub([x1, y1], [x2, y2]) {\n return [x1 - x2, y1 - y2];\n}\nexports.sub = sub;\nfunction add([x1, y1], [x2, y2]) {\n return [x1 + x2, y1 + y2];\n}\nexports.add = add;\nfunction dist([x0, y0], [x1, y1]) {\n return Math.sqrt(Math.pow((x0 - x1), 2) + Math.pow((y0 - y1), 2));\n}\nexports.dist = dist;\n/**\n * Calculate angle of vector [x, y].\n */\nfunction angle([x, y]) {\n return Math.atan2(y, x);\n}\nexports.angle = angle;\n/**\n * Calculate angle of [x, y], then + Math.PI / 2.\n * Because of the difference between `Geometric coordinate system` and `Visualization coordinate system`.\n * @returns\n */\nfunction angleWithQuadrant([x, y]) {\n return angle([x, y]) + Math.PI / 2;\n}\nexports.angleWithQuadrant = angleWithQuadrant;\nfunction angleBetween(v0, v1) {\n const a0 = angle(v0);\n const a1 = angle(v1);\n if (a0 < a1)\n return a1 - a0;\n return Math.PI * 2 - (a0 - a1);\n}\nexports.angleBetween = angleBetween;\nfunction calcBBox(points) {\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n for (const [x, y] of points) {\n minX = Math.min(x, minX);\n maxX = Math.max(x, maxX);\n minY = Math.min(y, minY);\n maxY = Math.max(y, maxY);\n }\n const width = maxX - minX;\n const height = maxY - minY;\n return [minX, minY, width, height];\n}\nexports.calcBBox = calcBBox;\n/**\n * Get the center of two points.\n */\nfunction mid([x1, y1], [x2, y2]) {\n return [(x1 + x2) / 2, (y1 + y2) / 2];\n}\nexports.mid = mid;\n//# sourceMappingURL=vector.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BinX = void 0;\nconst bin_1 = require(\"./bin\");\nconst BinX = (options = {}) => {\n const { thresholds } = options;\n return (0, bin_1.Bin)(Object.assign(Object.assign({}, options), { thresholdsX: thresholds, groupChannels: ['color'], binChannels: ['x'] }));\n};\nexports.BinX = BinX;\nexports.BinX.props = {};\n//# sourceMappingURL=binX.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Bin = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst helper_1 = require(\"../utils/helper\");\nconst groupN_1 = require(\"./groupN\");\nconst helper_2 = require(\"./utils/helper\");\nconst THRESHOLD = 'thresholds';\n/**\n * @see https://github.com/observablehq/plot/blob/main/src/transforms/bin.js\n */\nfunction thresholdAuto(values) {\n const [min, max] = (0, d3_array_1.extent)(values);\n return Math.min(200, (0, d3_array_1.thresholdScott)(values, min, max));\n}\n/**\n * The Bin aggregate data.\n * @todo More threshold method.\n * @todo Performance.\n */\nconst Bin = (options = {}) => {\n const { groupChannels = ['color'], binChannels = ['x', 'y'] } = options, rest = __rest(options, [\"groupChannels\", \"binChannels\"]);\n const channelIndexKey = {};\n // Group indexes and update channelIndexKey.\n const groupBy = (I, mark) => {\n const { encode } = mark;\n const binValues = binChannels.map((channel) => {\n const [V] = (0, helper_2.columnOf)(encode, channel);\n return V;\n });\n const thresholds = (0, helper_1.subObject)(rest, THRESHOLD);\n const DI = I.filter((i) => binValues.every((V) => (0, helper_1.defined)(V[i])));\n // Group indexes by both discrete and quantitative channels.\n const groupKeys = [\n // For discrete channels, use value as group key.\n ...groupChannels\n .map((d) => {\n const [V] = (0, helper_2.columnOf)(encode, d);\n return V;\n })\n .filter(helper_1.defined)\n .map((V) => (i) => V[i]),\n // For quantitative channels, use extent of bin as group key.\n ...binChannels.map((d, i) => {\n const V = binValues[i];\n const t = thresholds[d] || thresholdAuto(V);\n const bins = (0, d3_array_1.bin)()\n .thresholds(t)\n .value((i) => +V[i])(DI);\n const indexKey = new Map(bins.flatMap((bin) => {\n const { x0, x1 } = bin;\n const key = `${x0},${x1}`;\n return bin.map((i) => [i, key]);\n }));\n channelIndexKey[d] = indexKey;\n return (i) => indexKey.get(i);\n }),\n ];\n // Group by indexes by channel keys.\n const key = (i) => groupKeys.map((key) => key(i)).join('-');\n return Array.from((0, d3_array_1.group)(DI, key).values());\n };\n return (0, groupN_1.GroupN)(Object.assign(Object.assign(Object.assign({}, Object.fromEntries(Object.entries(rest).filter(([k]) => !k.startsWith(THRESHOLD)))), Object.fromEntries(binChannels.flatMap((channel) => {\n const start = ([i]) => +channelIndexKey[channel].get(i).split(',')[0];\n const end = ([i]) => +channelIndexKey[channel].get(i).split(',')[1];\n end.from = channel;\n return [\n [channel, start],\n [`${channel}1`, end],\n ];\n }))), { groupBy }));\n};\nexports.Bin = Bin;\nexports.Bin.props = {};\n//# sourceMappingURL=bin.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Sample = void 0;\n// @ts-ignore medianIndex exist in d3-array@3.2.0, but @types/d3-array Expired.\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst order_1 = require(\"./utils/order\");\nconst helper_1 = require(\"./utils/helper\");\nconst lttb_1 = require(\"./utils/lttb\");\nfunction normalizeSample(strategy) {\n if (typeof strategy === 'function')\n return strategy;\n if (strategy === 'lttb')\n return lttb_1.lttb;\n const strategies = {\n first: (f) => [f[0]],\n last: (f) => [f[f.length - 1]],\n min: (f, X, Y) => [\n f[(0, d3_array_1.minIndex)(f, (i) => Y[i])],\n ],\n max: (f, X, Y) => [\n f[(0, d3_array_1.maxIndex)(f, (i) => Y[i])],\n ],\n median: (f, X, Y) => [\n f[(0, d3_array_1.medianIndex)(f, (i) => Y[i])],\n ],\n };\n const sampleFunction = strategies[strategy] || strategies.median;\n return (I, X, Y, thresholds) => {\n // Sepreate group to frames, then sample each frame.\n // Keep more data as possible.\n const frameSize = Math.max(1, Math.floor(I.length / thresholds));\n const frames = getFrames(I, frameSize);\n return frames.flatMap((frame) => sampleFunction(frame, X, Y));\n };\n}\n/**\n * Split the array into frame with each frameSize.\n */\nfunction getFrames(I, frameSize) {\n const size = I.length;\n const frames = [];\n let i = 0;\n while (i < size) {\n frames.push(I.slice(i, (i += frameSize)));\n }\n return frames;\n}\n/**\n * The sample transform groups marks with specified groupBy fields, and\n * sample data for each group when data.length >= threshold(default = 2000).\n */\nconst Sample = (options = {}) => {\n const { strategy = 'median', thresholds = 2000, groupBy = ['series', 'color'], } = options;\n const sampleFunction = normalizeSample(strategy);\n return (I, mark) => {\n const { encode } = mark;\n const groups = (0, order_1.createGroups)(groupBy, I, mark);\n const [X] = (0, helper_1.columnOf)(encode, 'x');\n const [Y] = (0, helper_1.columnOf)(encode, 'y');\n return [\n groups.flatMap((g) => sampleFunction(g, X, Y, thresholds)),\n mark,\n ];\n };\n};\nexports.Sample = Sample;\nexports.Sample.props = {};\n//# sourceMappingURL=sample.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.lttb = void 0;\n/**\n * Sample data with lttb(Largest-Triangle-Three-Buckets) algo (https://github.com/pingec/downsample-lttb).\n * Return the sampled index array.\n */\nfunction lttb(I, X, Y, thresholds) {\n const length = I.length;\n if (thresholds >= length || thresholds === 0) {\n return I;\n }\n const x = (i) => X[I[i]] * 1;\n const y = (i) => Y[I[i]] * 1;\n const sampled = [];\n // Bucket size. Leave room for start and end data points.\n const every = (length - 2) / (thresholds - 2);\n let a = 0; // Initially a is the first point in the triangle.\n let maxArea;\n let area;\n let nextA;\n sampled.push(a); // Always add the first point.\n for (let i = 0; i < thresholds - 2; i++) {\n // Calculate point average for next bucket (containing c).\n let avgX = 0;\n let avgY = 0;\n let start = Math.floor((i + 1) * every) + 1;\n let end = Math.floor((i + 2) * every) + 1;\n end = Math.min(end, length);\n const size = end - start;\n for (; start < end; start++) {\n avgX += x(start);\n avgY += y(start);\n }\n avgX /= size;\n avgY /= size;\n // Get the range for this bucket.\n let frameStart = Math.floor((i + 0) * every) + 1;\n const frameEnd = Math.floor((i + 1) * every) + 1;\n // Point a.\n const pointA = [x(a), y(a)];\n maxArea = area = -1;\n for (; frameStart < frameEnd; frameStart++) {\n // Calculate triangle area over three buckets.\n area =\n Math.abs((pointA[0] - avgX) * (x(frameStart) - pointA[1]) -\n (pointA[0] - y(frameStart)) * (avgY - pointA[0])) * 0.5;\n if (area > maxArea) {\n maxArea = area;\n nextA = frameStart; // Next a is this b.\n }\n }\n sampled.push(nextA); // Pick this point from the bucket.\n a = nextA; // This a is the next a (chosen b).\n }\n sampled.push(length - 1); // Always add last.\n return sampled.map((a) => I[a]);\n}\nexports.lttb = lttb;\n//# sourceMappingURL=lttb.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Filter = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"../utils/helper\");\nconst helper_2 = require(\"./utils/helper\");\nfunction normalizeValue(value) {\n if (typeof value === 'object')\n return [value.value, value.ordinal];\n else\n return [value, true];\n}\nfunction filterWhenNoElements(mark) {\n var _a;\n const { encode } = mark;\n // keep y-axis\n const noElementMark = Object.assign(Object.assign({}, mark), { encode: Object.assign(Object.assign({}, mark.encode), { y: Object.assign(Object.assign({}, mark.encode.y), { value: [] }) }) });\n const targetField = (_a = encode === null || encode === void 0 ? void 0 : encode.color) === null || _a === void 0 ? void 0 : _a.field;\n if (!encode || !targetField) {\n return noElementMark;\n }\n // 获取color的筛选源\n let filterObject;\n for (const [key, v] of Object.entries(encode)) {\n if ((key === 'x' || key === 'y') && v.field === targetField) {\n filterObject = Object.assign(Object.assign({}, filterObject), { [key]: Object.assign(Object.assign({}, v), { value: [] }) });\n }\n }\n if (!filterObject) {\n return noElementMark;\n }\n return Object.assign(Object.assign({}, mark), { encode: Object.assign(Object.assign({}, mark.encode), filterObject) });\n}\n/**\n * The Filter transform filter channels.\n */\nconst Filter = (options = {}) => {\n return (I, mark) => {\n const { encode, data } = mark;\n const filters = Object.entries(options)\n .map(([key, v]) => {\n const [V] = (0, helper_2.columnOf)(encode, key);\n // Skip empty channel.\n if (!V)\n return null;\n const [value, ordinal = true] = normalizeValue(v);\n if (typeof value === 'function')\n return (i) => value(V[i]);\n if (ordinal) {\n const expectedValues = Array.isArray(value) ? value : [value];\n // Skip empty expected values.\n if (expectedValues.length === 0)\n return null;\n return (i) => expectedValues.includes(V[i]);\n }\n else {\n const [start, end] = value;\n return (i) => V[i] >= start && V[i] <= end;\n }\n })\n .filter(helper_1.defined);\n // Filter index and channels.\n const totalFilter = (i) => filters.every((f) => f(i));\n const FI = I.filter(totalFilter);\n const newIndex = FI.map((_, i) => i);\n if (filters.length === 0) {\n const targetMark = filterWhenNoElements(mark);\n return [I, targetMark];\n }\n const newEncodes = Object.entries(encode).map(([key, encode]) => {\n return [\n key,\n Object.assign(Object.assign({}, encode), { value: newIndex\n .map((i) => encode.value[FI[i]])\n .filter((v) => v !== undefined) }),\n ];\n });\n return [\n newIndex,\n (0, util_1.deepMix)({}, mark, {\n encode: Object.fromEntries(newEncodes),\n // Filter data for tooltip item.\n data: FI.map((i) => data[i]),\n }),\n ];\n };\n};\nexports.Filter = Filter;\nexports.Filter.props = {};\n//# sourceMappingURL=filter.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BoxShape = exports.PolygonRibbon = exports.PolygonShape = exports.ImageShape = exports.LinkArc = exports.LinkVHV = exports.LinkSmooth = exports.LinkShape = exports.AreaHV = exports.AreaVH = exports.AreaHVH = exports.AreaSmooth = exports.AreaShape = exports.TextTag = exports.TextBadge = exports.TextShape = exports.VectorShape = exports.PointCircle = exports.PointTriangleDown = exports.PointTriangle = exports.PointTick = exports.PointSquare = exports.PointShape = exports.PointPlus = exports.PointLine = exports.PointHyphen = exports.PointHexagon = exports.PointDiamond = exports.PointCross = exports.PointBowtie = exports.PointHollowCircle = exports.PointHollowTriangleDown = exports.PointHollowTriangle = exports.PointHollowSquare = exports.PointHollow = exports.PointHollowHexagon = exports.PointHollowDiamond = exports.PointHollowBowtie = exports.LineTrail = exports.LineHVH = exports.LineVH = exports.LineHV = exports.LineSmooth = exports.LineShape = exports.CellHollow = exports.CellShape = exports.IntervalPyramid = exports.IntervalFunnel = exports.IntervalHollow = exports.IntervalShape = void 0;\nexports.GaugeRound = exports.LiquidShape = exports.ShapeShape = exports.RectHollow = exports.RectShape = exports.RangeShape = exports.HeatmapShape = exports.DensityShape = exports.PathHollow = exports.PathShape = exports.LabelShape = exports.ConnectorShape = exports.LineXY = exports.BoxViolin = void 0;\nvar rect_1 = require(\"./interval/rect\");\nObject.defineProperty(exports, \"IntervalShape\", { enumerable: true, get: function () { return rect_1.Rect; } });\nvar hollow_1 = require(\"./interval/hollow\");\nObject.defineProperty(exports, \"IntervalHollow\", { enumerable: true, get: function () { return hollow_1.Hollow; } });\nvar funnel_1 = require(\"./interval/funnel\");\nObject.defineProperty(exports, \"IntervalFunnel\", { enumerable: true, get: function () { return funnel_1.Funnel; } });\nvar pyramid_1 = require(\"./interval/pyramid\");\nObject.defineProperty(exports, \"IntervalPyramid\", { enumerable: true, get: function () { return pyramid_1.Pyramid; } });\nvar rect_2 = require(\"./interval/rect\");\nObject.defineProperty(exports, \"CellShape\", { enumerable: true, get: function () { return rect_2.Rect; } });\nvar hollow_2 = require(\"./interval/hollow\");\nObject.defineProperty(exports, \"CellHollow\", { enumerable: true, get: function () { return hollow_2.Hollow; } });\nvar line_1 = require(\"./line/line\");\nObject.defineProperty(exports, \"LineShape\", { enumerable: true, get: function () { return line_1.Line; } });\nvar smooth_1 = require(\"./line/smooth\");\nObject.defineProperty(exports, \"LineSmooth\", { enumerable: true, get: function () { return smooth_1.Smooth; } });\nvar hv_1 = require(\"./line/hv\");\nObject.defineProperty(exports, \"LineHV\", { enumerable: true, get: function () { return hv_1.HV; } });\nvar vh_1 = require(\"./line/vh\");\nObject.defineProperty(exports, \"LineVH\", { enumerable: true, get: function () { return vh_1.VH; } });\nvar hvh_1 = require(\"./line/hvh\");\nObject.defineProperty(exports, \"LineHVH\", { enumerable: true, get: function () { return hvh_1.HVH; } });\nvar trail_1 = require(\"./line/trail\");\nObject.defineProperty(exports, \"LineTrail\", { enumerable: true, get: function () { return trail_1.Trail; } });\nvar hollowBowtie_1 = require(\"./point/hollowBowtie\");\nObject.defineProperty(exports, \"PointHollowBowtie\", { enumerable: true, get: function () { return hollowBowtie_1.HollowBowtie; } });\nvar hollowDiamond_1 = require(\"./point/hollowDiamond\");\nObject.defineProperty(exports, \"PointHollowDiamond\", { enumerable: true, get: function () { return hollowDiamond_1.HollowDiamond; } });\nvar hollowHexagon_1 = require(\"./point/hollowHexagon\");\nObject.defineProperty(exports, \"PointHollowHexagon\", { enumerable: true, get: function () { return hollowHexagon_1.HollowHexagon; } });\nvar hollow_3 = require(\"./point/hollow\");\nObject.defineProperty(exports, \"PointHollow\", { enumerable: true, get: function () { return hollow_3.HollowPoint; } });\nvar hollowSquare_1 = require(\"./point/hollowSquare\");\nObject.defineProperty(exports, \"PointHollowSquare\", { enumerable: true, get: function () { return hollowSquare_1.HollowSquare; } });\nvar hollowTriangle_1 = require(\"./point/hollowTriangle\");\nObject.defineProperty(exports, \"PointHollowTriangle\", { enumerable: true, get: function () { return hollowTriangle_1.HollowTriangle; } });\nvar hollowTriangleDown_1 = require(\"./point/hollowTriangleDown\");\nObject.defineProperty(exports, \"PointHollowTriangleDown\", { enumerable: true, get: function () { return hollowTriangleDown_1.HollowTriangleDown; } });\nvar hollowCircle_1 = require(\"./point/hollowCircle\");\nObject.defineProperty(exports, \"PointHollowCircle\", { enumerable: true, get: function () { return hollowCircle_1.HollowCircle; } });\nvar bowtie_1 = require(\"./point/bowtie\");\nObject.defineProperty(exports, \"PointBowtie\", { enumerable: true, get: function () { return bowtie_1.Bowtie; } });\nvar cross_1 = require(\"./point/cross\");\nObject.defineProperty(exports, \"PointCross\", { enumerable: true, get: function () { return cross_1.Cross; } });\nvar diamond_1 = require(\"./point/diamond\");\nObject.defineProperty(exports, \"PointDiamond\", { enumerable: true, get: function () { return diamond_1.Diamond; } });\nvar hexagon_1 = require(\"./point/hexagon\");\nObject.defineProperty(exports, \"PointHexagon\", { enumerable: true, get: function () { return hexagon_1.Hexagon; } });\nvar hyphen_1 = require(\"./point/hyphen\");\nObject.defineProperty(exports, \"PointHyphen\", { enumerable: true, get: function () { return hyphen_1.Hyphen; } });\nvar line_2 = require(\"./point/line\");\nObject.defineProperty(exports, \"PointLine\", { enumerable: true, get: function () { return line_2.Line; } });\nvar plus_1 = require(\"./point/plus\");\nObject.defineProperty(exports, \"PointPlus\", { enumerable: true, get: function () { return plus_1.Plus; } });\nvar point_1 = require(\"./point/point\");\nObject.defineProperty(exports, \"PointShape\", { enumerable: true, get: function () { return point_1.Point; } });\nvar square_1 = require(\"./point/square\");\nObject.defineProperty(exports, \"PointSquare\", { enumerable: true, get: function () { return square_1.Square; } });\nvar tick_1 = require(\"./point/tick\");\nObject.defineProperty(exports, \"PointTick\", { enumerable: true, get: function () { return tick_1.Tick; } });\nvar triangle_1 = require(\"./point/triangle\");\nObject.defineProperty(exports, \"PointTriangle\", { enumerable: true, get: function () { return triangle_1.Triangle; } });\nvar triangleDown_1 = require(\"./point/triangleDown\");\nObject.defineProperty(exports, \"PointTriangleDown\", { enumerable: true, get: function () { return triangleDown_1.TriangleDown; } });\nvar circle_1 = require(\"./point/circle\");\nObject.defineProperty(exports, \"PointCircle\", { enumerable: true, get: function () { return circle_1.Circle; } });\nvar vector_1 = require(\"./vector/vector\");\nObject.defineProperty(exports, \"VectorShape\", { enumerable: true, get: function () { return vector_1.Vector; } });\nvar text_1 = require(\"./text/text\");\nObject.defineProperty(exports, \"TextShape\", { enumerable: true, get: function () { return text_1.Text; } });\nvar badge_1 = require(\"./text/badge\");\nObject.defineProperty(exports, \"TextBadge\", { enumerable: true, get: function () { return badge_1.Badge; } });\nvar tag_1 = require(\"./text/tag\");\nObject.defineProperty(exports, \"TextTag\", { enumerable: true, get: function () { return tag_1.Tag; } });\nvar area_1 = require(\"./area/area\");\nObject.defineProperty(exports, \"AreaShape\", { enumerable: true, get: function () { return area_1.Area; } });\nvar smooth_2 = require(\"./area/smooth\");\nObject.defineProperty(exports, \"AreaSmooth\", { enumerable: true, get: function () { return smooth_2.Smooth; } });\nvar hvh_2 = require(\"./area/hvh\");\nObject.defineProperty(exports, \"AreaHVH\", { enumerable: true, get: function () { return hvh_2.HVH; } });\nvar vh_2 = require(\"./area/vh\");\nObject.defineProperty(exports, \"AreaVH\", { enumerable: true, get: function () { return vh_2.VH; } });\nvar hv_2 = require(\"./area/hv\");\nObject.defineProperty(exports, \"AreaHV\", { enumerable: true, get: function () { return hv_2.HV; } });\nvar link_1 = require(\"./link/link\");\nObject.defineProperty(exports, \"LinkShape\", { enumerable: true, get: function () { return link_1.Link; } });\nvar smooth_3 = require(\"./link/smooth\");\nObject.defineProperty(exports, \"LinkSmooth\", { enumerable: true, get: function () { return smooth_3.Smooth; } });\nvar vhv_1 = require(\"./link/vhv\");\nObject.defineProperty(exports, \"LinkVHV\", { enumerable: true, get: function () { return vhv_1.VHV; } });\nvar arc_1 = require(\"./link/arc\");\nObject.defineProperty(exports, \"LinkArc\", { enumerable: true, get: function () { return arc_1.Arc; } });\nvar image_1 = require(\"./image/image\");\nObject.defineProperty(exports, \"ImageShape\", { enumerable: true, get: function () { return image_1.Image; } });\nvar polygon_1 = require(\"./polygon/polygon\");\nObject.defineProperty(exports, \"PolygonShape\", { enumerable: true, get: function () { return polygon_1.Polygon; } });\nvar ribbon_1 = require(\"./polygon/ribbon\");\nObject.defineProperty(exports, \"PolygonRibbon\", { enumerable: true, get: function () { return ribbon_1.Ribbon; } });\nvar box_1 = require(\"./box/box\");\nObject.defineProperty(exports, \"BoxShape\", { enumerable: true, get: function () { return box_1.Box; } });\nvar violin_1 = require(\"./box/violin\");\nObject.defineProperty(exports, \"BoxViolin\", { enumerable: true, get: function () { return violin_1.Violin; } });\nvar line_3 = require(\"./lineXY/line\");\nObject.defineProperty(exports, \"LineXY\", { enumerable: true, get: function () { return line_3.Line; } });\nvar connector_1 = require(\"./connector/connector\");\nObject.defineProperty(exports, \"ConnectorShape\", { enumerable: true, get: function () { return connector_1.Connector; } });\nvar label_1 = require(\"./label/label\");\nObject.defineProperty(exports, \"LabelShape\", { enumerable: true, get: function () { return label_1.Label; } });\nvar path_1 = require(\"./path/path\");\nObject.defineProperty(exports, \"PathShape\", { enumerable: true, get: function () { return path_1.Path; } });\nvar hollow_4 = require(\"./path/hollow\");\nObject.defineProperty(exports, \"PathHollow\", { enumerable: true, get: function () { return hollow_4.Hollow; } });\nvar density_1 = require(\"./density/density\");\nObject.defineProperty(exports, \"DensityShape\", { enumerable: true, get: function () { return density_1.Density; } });\nvar heatmap_1 = require(\"./heatmap/heatmap\");\nObject.defineProperty(exports, \"HeatmapShape\", { enumerable: true, get: function () { return heatmap_1.Heatmap; } });\nvar rect_3 = require(\"./interval/rect\");\nObject.defineProperty(exports, \"RangeShape\", { enumerable: true, get: function () { return rect_3.Rect; } });\nvar rect_4 = require(\"./interval/rect\");\nObject.defineProperty(exports, \"RectShape\", { enumerable: true, get: function () { return rect_4.Rect; } });\nvar hollow_5 = require(\"./interval/hollow\");\nObject.defineProperty(exports, \"RectHollow\", { enumerable: true, get: function () { return hollow_5.Hollow; } });\nvar shape_1 = require(\"./shape/shape\");\nObject.defineProperty(exports, \"ShapeShape\", { enumerable: true, get: function () { return shape_1.Shape; } });\nvar liquid_1 = require(\"./liquid/liquid\");\nObject.defineProperty(exports, \"LiquidShape\", { enumerable: true, get: function () { return liquid_1.Liquid; } });\nvar round_1 = require(\"./gauge/round\");\nObject.defineProperty(exports, \"GaugeRound\", { enumerable: true, get: function () { return round_1.Round; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Rect = void 0;\nconst color_1 = require(\"./color\");\n/**\n * Render rect in different coordinate and using color channel for stroke and fill attribute.\n * The stroke attribute is valid with specified lineWidth attribute which defaults to zero.\n */\nconst Rect = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill' }, options), context);\n};\nexports.Rect = Rect;\nexports.Rect.props = Object.assign(Object.assign({}, color_1.Color.props), { defaultMarker: 'square' });\n//# sourceMappingURL=rect.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Color = exports.rect = void 0;\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst selection_1 = require(\"../../utils/selection\");\nconst vector_1 = require(\"../../utils/vector\");\nconst number_1 = require(\"../../utils/number\");\nconst utils_1 = require(\"../utils\");\n// Render rect in different coordinate.\nfunction rect(document, points, value, coordinate, style = {}) {\n const { inset = 0, radius = 0, insetLeft = inset, insetTop = inset, insetRight = inset, insetBottom = inset, radiusBottomLeft = radius, radiusBottomRight = radius, radiusTopLeft = radius, radiusTopRight = radius, minWidth = -Infinity, maxWidth = Infinity, minHeight = -Infinity } = style, rest = __rest(style, [\"inset\", \"radius\", \"insetLeft\", \"insetTop\", \"insetRight\", \"insetBottom\", \"radiusBottomLeft\", \"radiusBottomRight\", \"radiusTopLeft\", \"radiusTopRight\", \"minWidth\", \"maxWidth\", \"minHeight\"]);\n if (!(0, coordinate_1.isPolar)(coordinate) && !(0, coordinate_1.isHelix)(coordinate)) {\n const tpShape = !!(0, coordinate_1.isTranspose)(coordinate);\n const [p0, , p2] = tpShape ? (0, utils_1.reorder)(points) : points;\n const [x, y] = p0;\n const [width, height] = (0, vector_1.sub)(p2, p0);\n // Deal with width or height is negative.\n const absX = width > 0 ? x : x + width;\n const absY = height > 0 ? y : y + height;\n const absWidth = Math.abs(width);\n const absHeight = Math.abs(height);\n const finalX = absX + insetLeft;\n const finalY = absY + insetTop;\n const finalWidth = absWidth - (insetLeft + insetRight);\n const finalHeight = absHeight - (insetTop + insetBottom);\n const clampWidth = tpShape\n ? (0, number_1.clamp)(finalWidth, minHeight, Infinity)\n : (0, number_1.clamp)(finalWidth, minWidth, maxWidth);\n const clampHeight = tpShape\n ? (0, number_1.clamp)(finalHeight, minWidth, maxWidth)\n : (0, number_1.clamp)(finalHeight, minHeight, Infinity);\n const clampX = tpShape ? finalX : finalX - (clampWidth - finalWidth) / 2;\n const clampY = tpShape\n ? finalY - (clampHeight - finalHeight) / 2\n : finalY - (clampHeight - finalHeight);\n return (0, selection_1.select)(document.createElement('rect', {}))\n .style('x', clampX)\n .style('y', clampY)\n .style('width', clampWidth)\n .style('height', clampHeight)\n .style('radius', [\n radiusTopLeft,\n radiusTopRight,\n radiusBottomRight,\n radiusBottomLeft,\n ])\n .call(utils_1.applyStyle, rest)\n .node();\n }\n // Render path in polar coordinate.\n const { y, y1 } = value;\n const center = coordinate.getCenter();\n const arcObject = (0, utils_1.getArcObject)(coordinate, points, [y, y1]);\n const path = (0, d3_shape_1.arc)()\n .cornerRadius(radius)\n .padAngle((inset * Math.PI) / 180);\n return (0, selection_1.select)(document.createElement('path', {}))\n .style('d', path(arcObject))\n .style('transform', `translate(${center[0]}, ${center[1]})`)\n .style('radius', radius)\n .style('inset', inset)\n .call(utils_1.applyStyle, rest)\n .node();\n}\nexports.rect = rect;\n/**\n * Render rect in different coordinate.\n * Calc arc path based on control points directly rather startAngle, endAngle, innerRadius,\n * outerRadius. This is not accurate and will cause bug when the range of y scale is [1, 0]\n * for cell geometry.\n */\nconst Color = (options, context) => {\n // Render border only when colorAttribute is stroke.\n const { colorAttribute, opacityAttribute = 'fill', first = true, last = true } = options, style = __rest(options, [\"colorAttribute\", \"opacityAttribute\", \"first\", \"last\"]);\n const { coordinate, document } = context;\n return (points, value, defaults) => {\n const { color: defaultColor, radius: defaultRadius = 0 } = defaults, restDefaults = __rest(defaults, [\"color\", \"radius\"]);\n const defaultLineWidth = restDefaults.lineWidth || 1;\n const { stroke, radius = defaultRadius, radiusTopLeft = radius, radiusTopRight = radius, radiusBottomRight = radius, radiusBottomLeft = radius, innerRadius = 0, innerRadiusTopLeft = innerRadius, innerRadiusTopRight = innerRadius, innerRadiusBottomRight = innerRadius, innerRadiusBottomLeft = innerRadius, lineWidth = colorAttribute === 'stroke' || stroke ? defaultLineWidth : 0, inset = 0, insetLeft = inset, insetRight = inset, insetBottom = inset, insetTop = inset, minWidth, maxWidth, minHeight } = style, rest = __rest(style, [\"stroke\", \"radius\", \"radiusTopLeft\", \"radiusTopRight\", \"radiusBottomRight\", \"radiusBottomLeft\", \"innerRadius\", \"innerRadiusTopLeft\", \"innerRadiusTopRight\", \"innerRadiusBottomRight\", \"innerRadiusBottomLeft\", \"lineWidth\", \"inset\", \"insetLeft\", \"insetRight\", \"insetBottom\", \"insetTop\", \"minWidth\", \"maxWidth\", \"minHeight\"]);\n const { color = defaultColor, opacity } = value;\n // Extended style, which is not supported by native g shape,\n // should apply at first.\n const standardDirRadius = [\n first ? radiusTopLeft : innerRadiusTopLeft,\n first ? radiusTopRight : innerRadiusTopRight,\n last ? radiusBottomRight : innerRadiusBottomRight,\n last ? radiusBottomLeft : innerRadiusBottomLeft,\n ];\n const standardDir = [\n 'radiusTopLeft',\n 'radiusTopRight',\n 'radiusBottomRight',\n 'radiusBottomLeft',\n ];\n // Transpose: rotate it clockwise by 90.\n if ((0, coordinate_1.isTranspose)(coordinate)) {\n standardDir.push(standardDir.shift());\n }\n const extendedStyle = Object.assign(Object.assign({ radius }, Object.fromEntries(standardDir.map((d, i) => [d, standardDirRadius[i]]))), { inset,\n insetLeft,\n insetRight,\n insetBottom,\n insetTop,\n minWidth,\n maxWidth,\n minHeight });\n return ((0, selection_1.select)(rect(document, points, value, coordinate, extendedStyle))\n .call(utils_1.applyStyle, restDefaults)\n .style('fill', 'transparent')\n .style(colorAttribute, color)\n .style((0, utils_1.toOpacityKey)(options), opacity)\n .style('lineWidth', lineWidth)\n .style('stroke', stroke === undefined ? color : stroke)\n // shape.style has higher priority.\n .call(utils_1.applyStyle, rest)\n .node());\n };\n};\nexports.Color = Color;\n// @todo Should Shape have default animations using for ordinal scale?\nexports.Color.props = {\n defaultEnterAnimation: 'scaleInY',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=color.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getTransformOptions = exports.angleOf = exports.radiusOf = exports.getRadius = exports.isNonCartesian = exports.isTheta = exports.isCircular = exports.isRadar = exports.isFisheye = exports.isParallel = exports.isHelix = exports.isRadial = exports.isPolar = exports.isTranspose = void 0;\nfunction isTranspose(coordinate) {\n const { transformations } = coordinate.getOptions();\n const transposes = transformations\n .map(([type]) => type)\n .filter((type) => type === 'transpose');\n return transposes.length % 2 !== 0;\n}\nexports.isTranspose = isTranspose;\nfunction isPolar(coordinate) {\n const { transformations } = coordinate.getOptions();\n return transformations.some(([type]) => type === 'polar');\n}\nexports.isPolar = isPolar;\nfunction isRadial(coordinate) {\n const { transformations } = coordinate.getOptions();\n return (\n // distinguish radial from theta.\n transformations.some(([type]) => type === 'reflect') &&\n transformations.some(([type]) => type.startsWith('transpose')));\n}\nexports.isRadial = isRadial;\nfunction isHelix(coordinate) {\n const { transformations } = coordinate.getOptions();\n return transformations.some(([type]) => type === 'helix');\n}\nexports.isHelix = isHelix;\nfunction isParallel(coordinate) {\n const { transformations } = coordinate.getOptions();\n return transformations.some(([type]) => type === 'parallel');\n}\nexports.isParallel = isParallel;\nfunction isFisheye(coordinate) {\n const { transformations } = coordinate.getOptions();\n return transformations.some(([type]) => type === 'fisheye');\n}\nexports.isFisheye = isFisheye;\nfunction isRadar(coordinate) {\n return isParallel(coordinate) && isPolar(coordinate);\n}\nexports.isRadar = isRadar;\nfunction isCircular(coordinate) {\n return isHelix(coordinate) || isPolar(coordinate);\n}\nexports.isCircular = isCircular;\nfunction isTheta(coordinate) {\n return isPolar(coordinate) && isTranspose(coordinate);\n}\nexports.isTheta = isTheta;\nfunction isNonCartesian(coordinate) {\n return (isPolar(coordinate) ||\n isParallel(coordinate) ||\n isRadial(coordinate) ||\n isTheta(coordinate));\n}\nexports.isNonCartesian = isNonCartesian;\nfunction getRadius(coordinate) {\n if (isCircular(coordinate)) {\n const [width, height] = coordinate.getSize();\n const polar = coordinate\n .getOptions()\n .transformations.find((t) => t[0] === 'polar');\n // coordinate.size * outerRadius.\n if (polar)\n return (Math.max(width, height) / 2) * polar[4];\n }\n return 0;\n}\nexports.getRadius = getRadius;\nfunction radiusOf(coordinate) {\n const { transformations } = coordinate.getOptions();\n const [, , , innerRadius, outerRadius] = transformations.find((d) => d[0] === 'polar');\n return [+innerRadius, +outerRadius];\n}\nexports.radiusOf = radiusOf;\nfunction angleOf(coordinate, isRadius = true) {\n const { transformations } = coordinate.getOptions();\n const [, startAngle, endAngle] = transformations.find((d) => d[0] === 'polar');\n return isRadius\n ? [(+startAngle * 180) / Math.PI, (+endAngle * 180) / Math.PI]\n : [startAngle, endAngle];\n}\nexports.angleOf = angleOf;\nfunction getTransformOptions(coordinate, type) {\n const { transformations } = coordinate.getOptions();\n const [, ...args] = transformations.find((d) => d[0] === type);\n return args;\n}\nexports.getTransformOptions = getTransformOptions;\n//# sourceMappingURL=coordinate.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Selection = exports.select = void 0;\nconst g_1 = require(\"@antv/g\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst helper_1 = require(\"./helper\");\nfunction select(node) {\n return new Selection([node], null, node, node.ownerDocument);\n}\nexports.select = select;\n/**\n * A simple implementation of d3-selection for @antv/g.\n * It has the core features of d3-selection and extended ability.\n * Every methods of selection returns new selection if elements\n * are mutated(e.g. append, remove), otherwise return the selection itself(e.g. attr, style).\n * @see https://github.com/d3/d3-selection\n * @see https://github.com/antvis/g\n * @todo Nested selections.\n * @todo More useful functor.\n */\nclass Selection {\n constructor(elements = null, data = null, parent = null, document = null, selections = [\n null,\n null,\n null,\n null,\n null,\n ], transitions = [], updateElements = []) {\n this._elements = Array.from(elements);\n this._data = data;\n this._parent = parent;\n this._document = document;\n this._enter = selections[0];\n this._update = selections[1];\n this._exit = selections[2];\n this._merge = selections[3];\n this._split = selections[4];\n this._transitions = transitions;\n this._facetElements = updateElements;\n }\n selectAll(selector) {\n const elements = typeof selector === 'string'\n ? this._parent.querySelectorAll(selector)\n : selector;\n return new Selection(elements, null, this._elements[0], this._document);\n }\n selectFacetAll(selector) {\n const elements = typeof selector === 'string'\n ? this._parent.querySelectorAll(selector)\n : selector;\n return new Selection(this._elements, null, this._parent, this._document, undefined, undefined, elements);\n }\n /**\n * @todo Replace with querySelector which has bug now.\n */\n select(selector) {\n const element = typeof selector === 'string'\n ? this._parent.querySelectorAll(selector)[0] || null\n : selector;\n return new Selection([element], null, element, this._document);\n }\n append(node) {\n const callback = typeof node === 'function' ? node : () => this.createElement(node);\n const elements = [];\n if (this._data !== null) {\n // For empty selection, append new element to parent.\n // Each element is bind with datum.\n for (let i = 0; i < this._data.length; i++) {\n const d = this._data[i];\n const [datum, from] = Array.isArray(d) ? d : [d, null];\n const newElement = callback(datum, i);\n newElement.__data__ = datum;\n if (from !== null)\n newElement.__fromElements__ = from;\n this._parent.appendChild(newElement);\n elements.push(newElement);\n }\n return new Selection(elements, null, this._parent, this._document);\n }\n else {\n // For non-empty selection, append new element to\n // selected element and return new selection.\n for (let i = 0; i < this._elements.length; i++) {\n const element = this._elements[i];\n const datum = element.__data__;\n const newElement = callback(datum, i);\n element.appendChild(newElement);\n elements.push(newElement);\n }\n return new Selection(elements, null, elements[0], this._document);\n }\n }\n maybeAppend(id, node, className) {\n const element = this._elements[0];\n const child = element.getElementById(id);\n if (child) {\n return new Selection([child], null, this._parent, this._document);\n }\n const newChild = typeof node === 'string' ? this.createElement(node) : node();\n newChild.id = id;\n if (className)\n newChild.className = className;\n element.appendChild(newChild);\n return new Selection([newChild], null, this._parent, this._document);\n }\n /**\n * Bind data to elements, and produce three selection:\n * Enter: Selection with empty elements and data to be bind to elements.\n * Update: Selection with elements to be updated.\n * Exit: Selection with elements to be removed.\n */\n data(data, id = (d) => d, groupId = () => null) {\n // An Array of new data.\n const enter = [];\n // An Array of elements to be updated.\n const update = [];\n // A Set of elements to be removed.\n const exit = new Set(this._elements);\n // An Array of data to be merged into one element.\n const merge = [];\n // A Set of elements to be split into multiple datum.\n const split = new Set();\n // A Map from key to each element.\n const keyElement = new Map(this._elements.map((d, i) => [id(d.__data__, i), d]));\n // A Map from key to exist element. The Update Selection\n // can get element from this map, this is for diff among\n // facets.\n const keyUpdateElement = new Map(this._facetElements.map((d, i) => [id(d.__data__, i), d]));\n // A Map from groupKey to a group of elements.\n const groupKeyElements = (0, d3_array_1.group)(this._elements, (d) => groupId(d.__data__));\n // Diff data with selection(elements with data).\n // !!! Note\n // The switch is strictly ordered, not not change the order of them.\n for (let i = 0; i < data.length; i++) {\n const datum = data[i];\n const key = id(datum, i);\n const groupKey = groupId(datum, i);\n // Append element to update selection if incoming data has\n // exactly the same key with elements.\n if (keyElement.has(key)) {\n const element = keyElement.get(key);\n element.__data__ = datum;\n element.__facet__ = false;\n update.push(element);\n exit.delete(element);\n keyElement.delete(key);\n // Append element to update selection if incoming data has\n // exactly the same key with updateElements.\n }\n else if (keyUpdateElement.has(key)) {\n const element = keyUpdateElement.get(key);\n element.__data__ = datum;\n // Flag this element should update its parentNode.\n element.__facet__ = true;\n update.push(element);\n keyUpdateElement.delete(key);\n // Append datum to merge selection if existed elements has\n // its key as groupKey.\n }\n else if (groupKeyElements.has(key)) {\n const group = groupKeyElements.get(key);\n merge.push([datum, group]);\n for (const element of group)\n exit.delete(element);\n groupKeyElements.delete(key);\n // Append element to split selection if incoming data has\n // groupKey as its key, and bind to datum for it.\n }\n else if (keyElement.has(groupKey)) {\n const element = keyElement.get(groupKey);\n if (element.__toData__)\n element.__toData__.push(datum);\n else\n element.__toData__ = [datum];\n split.add(element);\n exit.delete(element);\n }\n else {\n // @todo Data with non-unique key.\n enter.push(datum);\n }\n }\n // Create new selection with enter, update and exit.\n const S = [\n new Selection([], enter, this._parent, this._document),\n new Selection(update, null, this._parent, this._document),\n new Selection(exit, null, this._parent, this._document),\n new Selection([], merge, this._parent, this._document),\n new Selection(split, null, this._parent, this._document),\n ];\n return new Selection(this._elements, null, this._parent, this._document, S);\n }\n merge(other) {\n const elements = [...this._elements, ...other._elements];\n const transitions = [...this._transitions, ...other._transitions];\n return new Selection(elements, null, this._parent, this._document, undefined, transitions);\n }\n createElement(type) {\n if (this._document) {\n return this._document.createElement(type, {});\n }\n const Ctor = Selection.registry[type];\n if (Ctor)\n return new Ctor();\n return (0, helper_1.error)(`Unknown node type: ${type}`);\n }\n /**\n * Apply callback for each selection(enter, update, exit)\n * and merge them into one selection.\n */\n join(enter = (d) => d, update = (d) => d, exit = (d) => d.remove(), merge = (d) => d, split = (d) => d.remove()) {\n const newEnter = enter(this._enter);\n const newUpdate = update(this._update);\n const newExit = exit(this._exit);\n const newMerge = merge(this._merge);\n const newSplit = split(this._split);\n return newUpdate\n .merge(newEnter)\n .merge(newExit)\n .merge(newMerge)\n .merge(newSplit);\n }\n remove() {\n // Remove node immediately if there is no transition,\n // otherwise wait until transition finished.\n for (let i = 0; i < this._elements.length; i++) {\n const transition = this._transitions[i];\n if (transition) {\n const T = Array.isArray(transition) ? transition : [transition];\n Promise.all(T.map((d) => d.finished)).then(() => {\n const element = this._elements[i];\n element.remove();\n });\n }\n else {\n const element = this._elements[i];\n element.remove();\n }\n }\n return new Selection([], null, this._parent, this._document, undefined, this._transitions);\n }\n each(callback) {\n for (let i = 0; i < this._elements.length; i++) {\n const element = this._elements[i];\n const datum = element.__data__;\n callback(datum, i, element);\n }\n return this;\n }\n attr(key, value) {\n const callback = typeof value !== 'function' ? () => value : value;\n return this.each(function (d, i, element) {\n if (value !== undefined)\n element[key] = callback(d, i, element);\n });\n }\n style(key, value) {\n const callback = typeof value !== 'function' ? () => value : value;\n return this.each(function (d, i, element) {\n if (value !== undefined)\n element.style[key] = callback(d, i, element);\n });\n }\n transition(value) {\n const callback = typeof value !== 'function' ? () => value : value;\n const { _transitions: T } = this;\n return this.each(function (d, i, element) {\n T[i] = callback(d, i, element);\n });\n }\n on(event, handler) {\n this.each(function (d, i, element) {\n element.addEventListener(event, handler);\n });\n return this;\n }\n call(callback, ...args) {\n callback(this, ...args);\n return this;\n }\n node() {\n return this._elements[0];\n }\n nodes() {\n return this._elements;\n }\n transitions() {\n return this._transitions;\n }\n parent() {\n return this._parent;\n }\n}\nexports.Selection = Selection;\nSelection.registry = {\n g: g_1.Group,\n rect: g_1.Rect,\n circle: g_1.Circle,\n path: g_1.Path,\n text: g_1.Text,\n ellipse: g_1.Ellipse,\n image: g_1.Image,\n line: g_1.Line,\n polygon: g_1.Polygon,\n polyline: g_1.Polyline,\n html: g_1.HTML,\n};\n//# sourceMappingURL=selection.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.prettyNumber = exports.clamp = void 0;\n/**\n * Clamp number within the inclusive range within the lower and upper bounds.\n */\nfunction clamp(v, lower, upper) {\n return Math.max(lower, Math.min(v, upper));\n}\nexports.clamp = clamp;\n/**\n * Precision conversion\n */\nfunction prettyNumber(n, precision = 10) {\n if (typeof n !== 'number')\n return n;\n return Math.abs(n) < 1e-15 ? n : parseFloat(n.toFixed(precision));\n}\nexports.prettyNumber = prettyNumber;\n//# sourceMappingURL=number.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getOrigin = exports.getTransform = exports.toOpacityKey = exports.getConnectStyle = exports.getArcObject = exports.reorder = exports.computeGradient = exports.appendArc = exports.arrowPoints = exports.appendPolygon = exports.applyStyle = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst util_1 = require(\"@antv/util\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst array_1 = require(\"../utils/array\");\nconst coordinate_1 = require(\"../utils/coordinate\");\nconst vector_1 = require(\"../utils/vector\");\nfunction applyStyle(selection, style) {\n for (const [key, value] of Object.entries(style)) {\n selection.style(key, value);\n }\n}\nexports.applyStyle = applyStyle;\n/**\n * Draw polygon path with points.\n * @param path\n * @param points\n */\nfunction appendPolygon(path, points) {\n points.forEach((p, idx) => idx === 0 ? path.moveTo(p[0], p[1]) : path.lineTo(p[0], p[1]));\n path.closePath();\n return path;\n}\nexports.appendPolygon = appendPolygon;\n/**\n * Draw arrow between `from` and `to`.\n * @param from\n * @param to\n * @returns\n */\nfunction arrowPoints(from, to, options) {\n const { arrowSize } = options;\n const size = typeof arrowSize === 'string'\n ? (+parseFloat(arrowSize) / 100) * (0, vector_1.dist)(from, to)\n : arrowSize;\n // TODO Use config from style.\n // Default arrow rotate is 30°.\n const arrowAngle = Math.PI / 6;\n const angle = Math.atan2(to[1] - from[1], to[0] - from[0]);\n const arrowAngle1 = Math.PI / 2 - angle - arrowAngle;\n const arrow1 = [\n to[0] - size * Math.sin(arrowAngle1),\n to[1] - size * Math.cos(arrowAngle1),\n ];\n const arrowAngle2 = angle - arrowAngle;\n const arrow2 = [\n to[0] - size * Math.cos(arrowAngle2),\n to[1] - size * Math.sin(arrowAngle2),\n ];\n return [arrow1, arrow2];\n}\nexports.arrowPoints = arrowPoints;\n/**\n * Draw arc by from -> to, with center and radius.\n * @param path\n * @param from\n * @param to\n * @param center\n * @param radius\n */\nfunction appendArc(path, from, to, center, radius) {\n const startAngle = (0, vector_1.angle)((0, vector_1.sub)(center, from)) + Math.PI;\n const endAngle = (0, vector_1.angle)((0, vector_1.sub)(center, to)) + Math.PI;\n path.arc(center[0], center[1], radius, startAngle, endAngle, endAngle - startAngle < 0);\n return path;\n}\nexports.appendArc = appendArc;\n/**\n * @todo Fix wrong key point.\n */\nfunction computeGradient(C, X, Y, from = 'y', mode = 'between', tpShape = false) {\n // The angles of gradients rendering are varies when 'from' and 'tpShape' are different.\n const getTheta = (from, tpShape) => {\n if (from === 'y' || from === true) {\n if (tpShape) {\n return 180;\n }\n else {\n return 90;\n }\n }\n else {\n if (tpShape) {\n return 90;\n }\n else {\n return 0;\n }\n }\n };\n const P = from === 'y' || from === true ? Y : X;\n const theta = getTheta(from, tpShape);\n const I = (0, array_1.indexOf)(P);\n const [min, max] = (0, d3_array_1.extent)(I, (i) => P[i]);\n // This need to improve for non-uniform distributed colors.\n const p = new scale_1.Linear({\n domain: [min, max],\n range: [0, 100],\n });\n const percentage = (i) => (0, util_1.isNumber)(P[i]) && !Number.isNaN(P[i]) ? p.map(P[i]) : 0;\n const gradientMode = {\n // Interpolate the colors for this segment.\n between: (i) => `${C[i]} ${percentage(i)}%`,\n // Use the color of the start point as the color for this segment.\n start: (i) => i === 0\n ? `${C[i]} ${percentage(i)}%`\n : `${C[i - 1]} ${percentage(i)}%, ${C[i]} ${percentage(i)}%`,\n // Use the color of the end point as the color for this segment.\n end: (i) => i === C.length - 1\n ? `${C[i]} ${percentage(i)}%`\n : `${C[i]} ${percentage(i)}%, ${C[i + 1]} ${percentage(i)}%`,\n };\n const gradient = I.sort((a, b) => percentage(a) - percentage(b))\n .map(gradientMode[mode] || gradientMode['between'])\n .join(',');\n return `linear-gradient(${theta}deg, ${gradient})`;\n}\nexports.computeGradient = computeGradient;\nfunction reorder(points) {\n const [p0, p1, p2, p3] = points;\n return [p3, p0, p1, p2];\n}\nexports.reorder = reorder;\nfunction getArcObject(coordinate, points, Y) {\n const [p0, p1, , p3] = (0, coordinate_1.isTranspose)(coordinate) ? reorder(points) : points;\n const [y, y1] = Y;\n const center = coordinate.getCenter();\n const a1 = (0, vector_1.angleWithQuadrant)((0, vector_1.sub)(p0, center));\n const a2 = (0, vector_1.angleWithQuadrant)((0, vector_1.sub)(p1, center));\n // There are two situations that a2 === a1:\n // 1. a1 - a2 = 0\n // 2. |a1 - a2| = Math.PI * 2\n // Distinguish them by y and y1:\n const a3 = a2 === a1 && y !== y1 ? a2 + Math.PI * 2 : a2;\n return {\n startAngle: a1,\n endAngle: a3 - a1 >= 0 ? a3 : Math.PI * 2 + a3,\n innerRadius: (0, vector_1.dist)(p3, center),\n outerRadius: (0, vector_1.dist)(p0, center),\n };\n}\nexports.getArcObject = getArcObject;\n/**\n * Pick connectStyle from style.\n * @param style\n */\nfunction getConnectStyle(style) {\n const PREFIX = 'connect';\n return Object.fromEntries(Object.entries(style)\n .filter(([key]) => key.startsWith(PREFIX))\n .map(([key, value]) => [\n (0, util_1.lowerFirst)(key.replace(PREFIX, '').trim()),\n value,\n ])\n .filter(([key]) => key !== undefined));\n}\nexports.getConnectStyle = getConnectStyle;\nfunction toOpacityKey(options) {\n const { colorAttribute, opacityAttribute = colorAttribute } = options;\n return `${opacityAttribute}Opacity`;\n}\nexports.toOpacityKey = toOpacityKey;\nfunction getTransform(coordinate, value) {\n if (!(0, coordinate_1.isPolar)(coordinate))\n return '';\n const center = coordinate.getCenter();\n const { transform: suffix } = value;\n return `translate(${center[0]}, ${center[1]}) ${suffix || ''}`;\n}\nexports.getTransform = getTransform;\nfunction getOrigin(points) {\n if (points.length === 1)\n return points[0];\n const [[x0, y0, z0 = 0], [x2, y2, z2 = 0]] = points;\n return [(x0 + x2) / 2, (y0 + y2) / 2, (z0 + z2) / 2];\n}\nexports.getOrigin = getOrigin;\n//# sourceMappingURL=utils.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Hollow = void 0;\nconst color_1 = require(\"./color\");\n/**\n * Render rect in different coordinate and using color channel for stroke attribute.\n */\nconst Hollow = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke' }, options), context);\n};\nexports.Hollow = Hollow;\nexports.Hollow.props = Object.assign(Object.assign({}, color_1.Color.props), { defaultMarker: 'hollowSquare' });\n//# sourceMappingURL=hollow.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Funnel = void 0;\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst selection_1 = require(\"../../utils/selection\");\nconst utils_1 = require(\"../utils\");\n/**\n * Adjust and return the new `points`.\n */\nfunction getFunnelPoints(points, nextPoints, coordinate) {\n const [p0, p1, p2, p3] = points;\n if ((0, coordinate_1.isTranspose)(coordinate)) {\n const newP1 = [nextPoints ? nextPoints[0][0] : p1[0], p1[1]];\n const newP2 = [nextPoints ? nextPoints[3][0] : p2[0], p2[1]];\n return [p0, newP1, newP2, p3];\n }\n const newP1 = [p1[0], nextPoints ? nextPoints[0][1] : p1[1]];\n const newP2 = [p2[0], nextPoints ? nextPoints[3][1] : p2[1]];\n return [p0, newP1, newP2, p3];\n}\n/**\n * Render funnel in different coordinate and using color channel for stroke and fill attribute.\n */\nconst Funnel = (options, context) => {\n const { adjustPoints = getFunnelPoints } = options, style = __rest(options, [\"adjustPoints\"]);\n const { coordinate, document } = context;\n return (points, value, defaults, point2d) => {\n const { index } = value;\n const { color: defaultColor } = defaults, rest = __rest(defaults, [\"color\"]);\n const nextPoints = point2d[index + 1];\n const funnelPoints = adjustPoints(points, nextPoints, coordinate);\n const tpShape = !!(0, coordinate_1.isTranspose)(coordinate);\n const [p0, p1, p2, p3] = tpShape ? (0, utils_1.reorder)(funnelPoints) : funnelPoints;\n const { color = defaultColor, opacity } = value;\n const b = (0, d3_shape_1.line)().curve(d3_shape_1.curveLinearClosed)([p0, p1, p2, p3]);\n return (0, selection_1.select)(document.createElement('path', {}))\n .call(utils_1.applyStyle, rest)\n .style('d', b)\n .style('fill', color)\n .style('fillOpacity', opacity)\n .call(utils_1.applyStyle, style)\n .node();\n };\n};\nexports.Funnel = Funnel;\nexports.Funnel.props = {\n defaultMarker: 'square',\n};\n//# sourceMappingURL=funnel.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Pyramid = void 0;\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst funnel_1 = require(\"./funnel\");\n/**\n * Adjust and return the new `points`.\n */\nfunction getPyramidPoints(points, nextPoints, coordinate) {\n const [p0, p1, p2, p3] = points;\n if ((0, coordinate_1.isTranspose)(coordinate)) {\n const newP1 = [\n nextPoints ? nextPoints[0][0] : (p1[0] + p2[0]) / 2,\n p1[1],\n ];\n const newP2 = [\n nextPoints ? nextPoints[3][0] : (p1[0] + p2[0]) / 2,\n p2[1],\n ];\n return [p0, newP1, newP2, p3];\n }\n const newP1 = [\n p1[0],\n nextPoints ? nextPoints[0][1] : (p1[1] + p2[1]) / 2,\n ];\n const newP2 = [\n p2[0],\n nextPoints ? nextPoints[3][1] : (p1[1] + p2[1]) / 2,\n ];\n return [p0, newP1, newP2, p3];\n}\n/**\n * Render pyramid in different coordinate and using color channel for stroke and fill attribute.\n */\nconst Pyramid = (options, context) => {\n return (0, funnel_1.Funnel)(Object.assign({ adjustPoints: getPyramidPoints }, options), context);\n};\nexports.Pyramid = Pyramid;\nexports.Pyramid.props = {\n defaultMarker: 'square',\n};\n//# sourceMappingURL=pyramid.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Line = void 0;\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst curve_1 = require(\"./curve\");\nconst Line = (options, context) => {\n const { coordinate } = context;\n return (...params) => {\n const curve = (0, coordinate_1.isPolar)(coordinate) ? d3_shape_1.curveLinearClosed : d3_shape_1.curveLinear;\n return (0, curve_1.Curve)(Object.assign({ curve }, options), context)(...params);\n };\n};\nexports.Line = Line;\nexports.Line.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'line' });\n//# sourceMappingURL=line.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Curve = void 0;\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst selection_1 = require(\"../../utils/selection\");\nconst utils_1 = require(\"../utils\");\nconst createElement_1 = require(\"../../utils/createElement\");\nconst helper_1 = require(\"../../utils/helper\");\nconst vector_1 = require(\"../../utils/vector\");\nconst DoublePath = (0, createElement_1.createElement)((g) => {\n const { d1, d2, style1, style2 } = g.attributes;\n const document = g.ownerDocument;\n (0, selection_1.select)(g)\n .maybeAppend('line', () => document.createElement('path', {}))\n .style('d', d1)\n .call(utils_1.applyStyle, style1);\n (0, selection_1.select)(g)\n .maybeAppend('line1', () => document.createElement('path', {}))\n .style('d', d2)\n .call(utils_1.applyStyle, style2);\n});\n/**\n * Given a points sequence, split it into an array of defined points\n * and an array of undefined segments.\n *\n * Input - [[1, 2], [3, 4], [null, null], [null, null], [5, 6], [null, null], [7, 8]]\n * Output\n * - [[1, 2], [3, 4], [5, 6], [7, 8]]\n * - [\n * [[3, 4], [5, 6]],\n * [[5, 6], [7, 8]]\n * ]\n */\nfunction segmentation(points, defined) {\n const definedPoints = [];\n const segments = [];\n let m = false; // Is in a undefined sequence.\n let dp = null; // The previous defined point.\n for (const p of points) {\n // If current point is a undefined point,\n // enter a undefined sequence.\n if (!defined(p[0]) || !defined(p[1]))\n m = true;\n else {\n definedPoints.push(p);\n // If current point is a defined point,\n // and is in a undefined sequence, save\n // the two closest defined points as this\n // undefined sequence and exit it.\n if (m) {\n m = false;\n segments.push([dp, p]);\n }\n // Update the previous defined point.\n dp = p;\n }\n }\n return [definedPoints, segments];\n}\nconst Curve = (options, context) => {\n const { curve, gradient = false, \n // The color for each segment.\n gradientColor = 'between', defined = (d) => !Number.isNaN(d) && d !== undefined && d !== null, connect: connectNulls = false } = options, style = __rest(options, [\"curve\", \"gradient\", \"gradientColor\", \"defined\", \"connect\"]);\n const { coordinate, document } = context;\n return (P, value, defaults) => {\n // Compute styles.\n const { color: defaultColor, lineWidth: defaultSize } = defaults, rest = __rest(defaults, [\"color\", \"lineWidth\"]);\n const { color = defaultColor, size = defaultSize, seriesColor: sc, seriesX: sx, seriesY: sy, } = value;\n const transform = (0, utils_1.getTransform)(coordinate, value);\n const tpShape = (0, coordinate_1.isTranspose)(coordinate);\n const stroke = gradient && sc\n ? (0, utils_1.computeGradient)(sc, sx, sy, gradient, gradientColor, tpShape)\n : color;\n const finalStyle = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, rest), (stroke && { stroke })), (size && { lineWidth: size })), (transform && { transform })), style);\n // Compute points and segments.\n let linePath;\n if ((0, coordinate_1.isPolar)(coordinate)) {\n const center = coordinate.getCenter();\n linePath = (points) => (0, d3_shape_1.lineRadial)()\n .angle((_, idx) => (0, vector_1.angleWithQuadrant)((0, vector_1.sub)(points[idx], center)))\n .radius((_, idx) => (0, vector_1.dist)(points[idx], center))\n .defined(([x, y]) => defined(x) && defined(y))\n .curve(curve)(points);\n }\n else {\n linePath = (0, d3_shape_1.line)()\n .x((d) => d[0])\n .y((d) => d[1])\n .defined(([x, y]) => defined(x) && defined(y))\n .curve(curve);\n }\n const [DP, MS] = segmentation(P, defined);\n const connectStyle = (0, helper_1.subObject)(finalStyle, 'connect');\n const missing = !!MS.length;\n // Draw one path of connected defined points.\n if (!missing || (connectNulls && !Object.keys(connectStyle).length)) {\n return (0, selection_1.select)(document.createElement('path', {}))\n .style('d', linePath(DP) || [])\n .call(utils_1.applyStyle, finalStyle)\n .node();\n }\n // Draw one path of unconnected defined points.\n if (missing && !connectNulls) {\n return (0, selection_1.select)(document.createElement('path', {}))\n .style('d', linePath(P))\n .call(utils_1.applyStyle, finalStyle)\n .node();\n }\n // Draw two path.\n // One for unconnected defined points.\n // One for connected segments.\n const connectPath = (segments) => segments.map(linePath).join(',');\n return (0, selection_1.select)(new DoublePath())\n .style('style1', Object.assign(Object.assign({}, finalStyle), connectStyle))\n .style('style2', finalStyle)\n .style('d1', connectPath(MS))\n .style('d2', linePath(P))\n .node();\n };\n};\nexports.Curve = Curve;\nexports.Curve.props = {\n defaultMarker: 'smooth',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=curve.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createElement = void 0;\nconst g_1 = require(\"@antv/g\");\nfunction createElement(descriptor) {\n const render = typeof descriptor === 'function' ? descriptor : descriptor.render;\n return class extends g_1.CustomElement {\n connectedCallback() {\n this.draw();\n }\n attributeChangedCallback() {\n this.draw();\n }\n draw() {\n render(this);\n }\n };\n}\nexports.createElement = createElement;\n//# sourceMappingURL=createElement.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Smooth = void 0;\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst curve_1 = require(\"./curve\");\nconst Smooth = (options, context) => {\n const rest = __rest(options, []);\n const { coordinate } = context;\n return (...params) => {\n const curve = (0, coordinate_1.isPolar)(coordinate)\n ? d3_shape_1.curveCatmullRomClosed\n : (0, coordinate_1.isTranspose)(coordinate)\n ? d3_shape_1.curveMonotoneY\n : d3_shape_1.curveMonotoneX;\n return (0, curve_1.Curve)(Object.assign({ curve }, rest), context)(...params);\n };\n};\nexports.Smooth = Smooth;\nexports.Smooth.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'smooth' });\n//# sourceMappingURL=smooth.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HV = void 0;\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst curve_1 = require(\"./curve\");\nconst HV = (options, context) => {\n return (0, curve_1.Curve)(Object.assign({ curve: d3_shape_1.curveStepAfter }, options), context);\n};\nexports.HV = HV;\nexports.HV.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'hv' });\n//# sourceMappingURL=hv.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VH = void 0;\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst curve_1 = require(\"./curve\");\nconst VH = (options, context) => {\n return (0, curve_1.Curve)(Object.assign({ curve: d3_shape_1.curveStepBefore }, options), context);\n};\nexports.VH = VH;\nexports.VH.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'vh' });\n//# sourceMappingURL=vh.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HVH = void 0;\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst curve_1 = require(\"./curve\");\nconst HVH = (options, context) => {\n return (0, curve_1.Curve)(Object.assign({ curve: d3_shape_1.curveStep }, options), context);\n};\nexports.HVH = HVH;\nexports.HVH.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'hvh' });\n//# sourceMappingURL=hvh.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Trail = void 0;\nconst d3_path_1 = require(\"@antv/vendor/d3-path\");\nconst selection_1 = require(\"../../utils/selection\");\nconst utils_1 = require(\"../utils\");\nconst vector_1 = require(\"../../utils/vector\");\nconst helper_1 = require(\"../../utils/helper\");\nconst curve_1 = require(\"./curve\");\n/**\n *\n * x9-x0---------x1-x2\n * / |r1 |r2 \\\n *x8---p0---------p1---x3\n * \\ r4| | r3 /\n * x7-x6--------x5-x4\n */\nfunction stroke(path, p0, p1, s0, s1) {\n const v = (0, vector_1.sub)(p1, p0);\n const a = (0, vector_1.angle)(v);\n const a1 = a + Math.PI / 2;\n const r1 = [(s0 / 2) * Math.cos(a1), (s0 / 2) * Math.sin(a1)];\n const r2 = [(s1 / 2) * Math.cos(a1), (s1 / 2) * Math.sin(a1)];\n const r3 = [(s1 / 2) * Math.cos(a), (s1 / 2) * Math.sin(a)];\n const r4 = [(s0 / 2) * Math.cos(a), (s0 / 2) * Math.sin(a)];\n const x0 = (0, vector_1.add)(p0, r1);\n const x1 = (0, vector_1.add)(p1, r2);\n const x2 = (0, vector_1.add)(x1, r3);\n const x3 = (0, vector_1.add)(p1, r3);\n const x4 = (0, vector_1.sub)(x3, r2);\n const x5 = (0, vector_1.sub)(p1, r2);\n const x6 = (0, vector_1.sub)(p0, r1);\n const x7 = (0, vector_1.sub)(x6, r4);\n const x8 = (0, vector_1.sub)(p0, r4);\n const x9 = (0, vector_1.sub)(x0, r4);\n path.moveTo(...x0);\n path.lineTo(...x1);\n path.arcTo(...x2, ...x3, s1 / 2);\n path.arcTo(...x4, ...x5, s1 / 2);\n path.lineTo(...x6);\n path.arcTo(...x7, ...x8, s0 / 2);\n path.arcTo(...x9, ...x0, s0 / 2);\n path.closePath();\n}\n// @todo Support connect and connectStyle.\nconst Trail = (options, context) => {\n const { document } = context;\n return (P, value, defaults) => {\n const { seriesSize, color } = value;\n const { color: defaultColor } = defaults, rest = __rest(defaults, [\"color\"]);\n const path = (0, d3_path_1.path)();\n for (let i = 0; i < P.length - 1; i++) {\n const p0 = P[i];\n const p1 = P[i + 1];\n const s0 = seriesSize[i];\n const s1 = seriesSize[i + 1];\n if ([...p0, ...p1].every(helper_1.defined))\n stroke(path, p0, p1, s0, s1);\n }\n return (0, selection_1.select)(document.createElement('path', {}))\n .call(utils_1.applyStyle, rest)\n .style('fill', color || defaultColor)\n .style('d', path.toString())\n .call(utils_1.applyStyle, options)\n .node();\n };\n};\nexports.Trail = Trail;\nexports.Trail.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'line' });\n//# sourceMappingURL=trail.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HollowBowtie = void 0;\nconst color_1 = require(\"./color\");\n/**\n * ▷◁\n */\nconst HollowBowtie = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'bowtie' }, options), context);\n};\nexports.HollowBowtie = HollowBowtie;\nexports.HollowBowtie.props = Object.assign({ defaultMarker: 'hollowBowtie' }, color_1.Color.props);\n//# sourceMappingURL=hollowBowtie.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Color = exports.getRadius = void 0;\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst marker_1 = require(\"../../utils/marker\");\nconst selection_1 = require(\"../../utils/selection\");\nconst string_1 = require(\"../../utils/string\");\nconst utils_1 = require(\"../utils\");\nfunction getRadius(mode, points, value, coordinate) {\n if (points.length === 1)\n return undefined;\n const { size } = value;\n if (mode === 'fixed')\n return size;\n if (mode === 'normal' || (0, coordinate_1.isFisheye)(coordinate)) {\n const [[x0, y0], [x2, y2]] = points;\n const a = Math.abs((x2 - x0) / 2);\n const b = Math.abs((y2 - y0) / 2);\n return Math.max(0, (a + b) / 2);\n }\n return size;\n}\nexports.getRadius = getRadius;\n/**\n * Render point in different coordinate.\n */\nconst Color = (options, context) => {\n // Render border only when colorAttribute is stroke.\n const { colorAttribute, symbol, mode = 'auto' } = options, style = __rest(options, [\"colorAttribute\", \"symbol\", \"mode\"]);\n const path = marker_1.Symbols.get((0, string_1.camelCase)(symbol)) || marker_1.Symbols.get('point');\n const { coordinate, document } = context;\n return (points, value, defaults) => {\n const { lineWidth, color: defaultColor } = defaults;\n const finalLineWidth = style.stroke ? lineWidth || 1 : lineWidth;\n const { color = defaultColor, transform, opacity } = value;\n const [cx, cy] = (0, utils_1.getOrigin)(points);\n const r = getRadius(mode, points, value, coordinate);\n const finalRadius = r || style.r || defaults.r;\n return (0, selection_1.select)(document.createElement('path', {}))\n .call(utils_1.applyStyle, defaults)\n .style('fill', 'transparent')\n .style('d', path(cx, cy, finalRadius))\n .style('lineWidth', finalLineWidth)\n .style('transform', transform)\n .style('transformOrigin', `${cx - finalRadius} ${cy - finalRadius}`)\n .style('stroke', color)\n .style((0, utils_1.toOpacityKey)(options), opacity)\n .style(colorAttribute, color)\n .call(utils_1.applyStyle, style)\n .node();\n };\n};\nexports.Color = Color;\nexports.Color.props = {\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=color.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.unregisterSymbol = exports.registerSymbol = exports.useMarker = exports.Symbols = void 0;\nconst g_1 = require(\"@antv/g\");\nconst point = (x, y, r) => {\n return [\n ['M', x - r, y],\n ['A', r, r, 0, 1, 0, x + r, y],\n ['A', r, r, 0, 1, 0, x - r, y],\n ['Z'],\n ];\n};\npoint.style = ['fill'];\nconst hollowPoint = point.bind(undefined);\nhollowPoint.style = ['stroke', 'lineWidth'];\nconst square = (x, y, r) => {\n return [\n ['M', x - r, y - r],\n ['L', x + r, y - r],\n ['L', x + r, y + r],\n ['L', x - r, y + r],\n ['Z'],\n ];\n};\nsquare.style = ['fill'];\nconst rect = square.bind(undefined);\nrect.style = ['fill'];\nconst hollowSquare = square.bind(undefined);\nhollowSquare.style = ['stroke', 'lineWidth'];\nconst diamond = (x, y, r) => {\n const hr = r * 0.618;\n return [\n ['M', x - hr, y],\n ['L', x, y - r],\n ['L', x + hr, y],\n ['L', x, y + r],\n ['Z'],\n ];\n};\ndiamond.style = ['fill'];\nconst hollowDiamond = diamond.bind(undefined);\nhollowDiamond.style = ['stroke', 'lineWidth'];\nconst triangle = (x, y, r) => {\n const diffY = r * Math.sin((1 / 3) * Math.PI);\n return [\n ['M', x - r, y + diffY],\n ['L', x, y - diffY],\n ['L', x + r, y + diffY],\n ['Z'],\n ];\n};\ntriangle.style = ['fill'];\nconst hollowTriangle = triangle.bind(undefined);\nhollowTriangle.style = ['stroke', 'lineWidth'];\nconst triangleDown = (x, y, r) => {\n const diffY = r * Math.sin((1 / 3) * Math.PI);\n return [\n ['M', x - r, y - diffY],\n ['L', x + r, y - diffY],\n ['L', x, y + diffY],\n ['Z'],\n ];\n};\ntriangleDown.style = ['fill'];\nconst hollowTriangleDown = triangleDown.bind(undefined);\nhollowTriangleDown.style = ['stroke', 'lineWidth'];\nconst hexagon = (x, y, r) => {\n const diffX = (r / 2) * Math.sqrt(3);\n return [\n ['M', x, y - r],\n ['L', x + diffX, y - r / 2],\n ['L', x + diffX, y + r / 2],\n ['L', x, y + r],\n ['L', x - diffX, y + r / 2],\n ['L', x - diffX, y - r / 2],\n ['Z'],\n ];\n};\nhexagon.style = ['fill'];\nconst hollowHexagon = hexagon.bind(undefined);\nhollowHexagon.style = ['stroke', 'lineWidth'];\nconst bowtie = (x, y, r) => {\n const diffY = r - 1.5;\n return [\n ['M', x - r, y - diffY],\n ['L', x + r, y + diffY],\n ['L', x + r, y - diffY],\n ['L', x - r, y + diffY],\n ['Z'],\n ];\n};\nbowtie.style = ['fill'];\nconst hollowBowtie = bowtie.bind(undefined);\nhollowBowtie.style = ['stroke', 'lineWidth'];\nconst line = (x, y, r) => {\n return [\n ['M', x, y + r],\n ['L', x, y - r],\n ];\n};\nline.style = ['stroke', 'lineWidth'];\nconst cross = (x, y, r) => {\n return [\n ['M', x - r, y - r],\n ['L', x + r, y + r],\n ['M', x + r, y - r],\n ['L', x - r, y + r],\n ];\n};\ncross.style = ['stroke', 'lineWidth'];\nconst tick = (x, y, r) => {\n return [\n ['M', x - r / 2, y - r],\n ['L', x + r / 2, y - r],\n ['M', x, y - r],\n ['L', x, y + r],\n ['M', x - r / 2, y + r],\n ['L', x + r / 2, y + r],\n ];\n};\ntick.style = ['stroke', 'lineWidth'];\nconst plus = (x, y, r) => {\n return [\n ['M', x - r, y],\n ['L', x + r, y],\n ['M', x, y - r],\n ['L', x, y + r],\n ];\n};\nplus.style = ['stroke', 'lineWidth'];\nconst hyphen = (x, y, r) => {\n return [\n ['M', x - r, y],\n ['L', x + r, y],\n ];\n};\nhyphen.style = ['stroke', 'lineWidth'];\nconst dot = (x, y, r) => {\n return [\n ['M', x - r, y],\n ['L', x + r, y],\n ];\n};\ndot.style = ['stroke', 'lineWidth'];\nconst dash = dot.bind(undefined);\ndash.style = ['stroke', 'lineWidth'];\nconst smooth = (x, y, r) => {\n return [\n ['M', x - r, y],\n ['A', r / 2, r / 2, 0, 1, 1, x, y],\n ['A', r / 2, r / 2, 0, 1, 0, x + r, y],\n ];\n};\nsmooth.style = ['stroke', 'lineWidth'];\nconst hv = (x, y, r) => {\n return [\n ['M', x - r - 1, y - 2.5],\n ['L', x, y - 2.5],\n ['L', x, y + 2.5],\n ['L', x + r + 1, y + 2.5],\n ];\n};\nhv.style = ['stroke', 'lineWidth'];\nconst vh = (x, y, r) => {\n return [\n ['M', x - r - 1, y + 2.5],\n ['L', x, y + 2.5],\n ['L', x, y - 2.5],\n ['L', x + r + 1, y - 2.5],\n ];\n};\nvh.style = ['stroke', 'lineWidth'];\nconst hvh = (x, y, r) => {\n return [\n ['M', x - (r + 1), y + 2.5],\n ['L', x - r / 2, y + 2.5],\n ['L', x - r / 2, y - 2.5],\n ['L', x + r / 2, y - 2.5],\n ['L', x + r / 2, y + 2.5],\n ['L', x + r + 1, y + 2.5],\n ];\n};\nhvh.style = ['stroke', 'lineWidth'];\nconst vhv = (x, y, r) => {\n return [\n ['M', x - 5, y + 2.5],\n ['L', x - 5, y],\n ['L', x, y],\n ['L', x, y - 3],\n ['L', x, y + 3],\n ['L', x + 6.5, y + 3],\n ];\n};\nvhv.style = ['stroke', 'lineWidth'];\nexports.Symbols = new Map([\n ['bowtie', bowtie],\n ['cross', cross],\n ['dash', dash],\n ['diamond', diamond],\n ['dot', dot],\n ['hexagon', hexagon],\n ['hollowBowtie', hollowBowtie],\n ['hollowDiamond', hollowDiamond],\n ['hollowHexagon', hollowHexagon],\n ['hollowPoint', hollowPoint],\n ['hollowSquare', hollowSquare],\n ['hollowTriangle', hollowTriangle],\n ['hollowTriangleDown', hollowTriangleDown],\n ['hv', hv],\n ['hvh', hvh],\n ['hyphen', hyphen],\n ['line', line],\n ['plus', plus],\n ['point', point],\n ['rect', rect],\n ['smooth', smooth],\n ['square', square],\n ['tick', tick],\n ['triangleDown', triangleDown],\n ['triangle', triangle],\n ['vh', vh],\n ['vhv', vhv],\n]);\nfunction useMarker(type, _a) {\n var { d, fill, lineWidth, path, stroke, color } = _a, style = __rest(_a, [\"d\", \"fill\", \"lineWidth\", \"path\", \"stroke\", \"color\"]);\n const symbol = exports.Symbols.get(type) || exports.Symbols.get('point');\n return (...args) => {\n const path = new g_1.Path({\n style: Object.assign(Object.assign({}, style), { d: symbol(...args), stroke: symbol.style.includes('stroke') ? color || stroke : '', fill: symbol.style.includes('fill') ? color || fill : '', lineWidth: symbol.style.includes('lineWidth')\n ? lineWidth || lineWidth || 2\n : 0 }),\n });\n return path;\n };\n}\nexports.useMarker = useMarker;\nfunction registerSymbol(type, marker) {\n exports.Symbols.set(type, marker);\n}\nexports.registerSymbol = registerSymbol;\nfunction unregisterSymbol(type) {\n exports.Symbols.delete(type);\n}\nexports.unregisterSymbol = unregisterSymbol;\n//# sourceMappingURL=marker.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.kebabCase = exports.camelCase = void 0;\n/**\n * camelCase('foo-bar');\n * // => 'fooBar'\n * @param s\n */\nfunction camelCase(s) {\n return s.replace(/-(\\w)/g, function (_, letter) {\n return letter.toUpperCase();\n });\n}\nexports.camelCase = camelCase;\n/**\n * kebabCase('fooBar');\n * // => 'foo-bar'\n * @param s\n */\nfunction kebabCase(s) {\n return s.replace(/([A-Z])/g, '-$1').toLowerCase();\n}\nexports.kebabCase = kebabCase;\n//# sourceMappingURL=string.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HollowDiamond = void 0;\nconst color_1 = require(\"./color\");\n/**\n * ◇\n */\nconst HollowDiamond = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'diamond' }, options), context);\n};\nexports.HollowDiamond = HollowDiamond;\nexports.HollowDiamond.props = Object.assign({ defaultMarker: 'hollowDiamond' }, color_1.Color.props);\n//# sourceMappingURL=hollowDiamond.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HollowHexagon = void 0;\nconst color_1 = require(\"./color\");\n/**\n * ⬡\n */\nconst HollowHexagon = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'hexagon' }, options), context);\n};\nexports.HollowHexagon = HollowHexagon;\nexports.HollowHexagon.props = Object.assign({ defaultMarker: 'hollowHexagon' }, color_1.Color.props);\n//# sourceMappingURL=hollowHexagon.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HollowPoint = void 0;\nconst color_1 = require(\"./color\");\n/**\n * ○\n */\nconst HollowPoint = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'point' }, options), context);\n};\nexports.HollowPoint = HollowPoint;\nexports.HollowPoint.props = Object.assign({ defaultMarker: 'hollowPoint' }, color_1.Color.props);\n//# sourceMappingURL=hollow.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HollowSquare = void 0;\nconst color_1 = require(\"./color\");\n/**\n * □\n */\nconst HollowSquare = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'square' }, options), context);\n};\nexports.HollowSquare = HollowSquare;\nexports.HollowSquare.props = Object.assign({ defaultMarker: 'hollowSquare' }, color_1.Color.props);\n//# sourceMappingURL=hollowSquare.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HollowTriangle = void 0;\nconst color_1 = require(\"./color\");\n/**\n * △\n */\nconst HollowTriangle = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'triangle' }, options), context);\n};\nexports.HollowTriangle = HollowTriangle;\nexports.HollowTriangle.props = Object.assign({ defaultMarker: 'hollowTriangle' }, color_1.Color.props);\n//# sourceMappingURL=hollowTriangle.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HollowTriangleDown = void 0;\nconst color_1 = require(\"./color\");\n/**\n * ▽\n */\nconst HollowTriangleDown = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'triangle-down' }, options), context);\n};\nexports.HollowTriangleDown = HollowTriangleDown;\nexports.HollowTriangleDown.props = Object.assign({ defaultMarker: 'hollowTriangleDown' }, color_1.Color.props);\n//# sourceMappingURL=hollowTriangleDown.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HollowCircle = void 0;\nconst circle_1 = require(\"./circle\");\n/**\n * ○\n */\nconst HollowCircle = (options, context) => {\n return (0, circle_1.BaseCircle)(Object.assign({ colorAttribute: 'stroke' }, options), context);\n};\nexports.HollowCircle = HollowCircle;\nexports.HollowCircle.props = Object.assign({ defaultMarker: 'hollowPoint' }, circle_1.Circle.props);\n//# sourceMappingURL=hollowCircle.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Circle = exports.BaseCircle = void 0;\nconst selection_1 = require(\"../../utils/selection\");\nconst utils_1 = require(\"../utils\");\nconst color_1 = require(\"./color\");\n/**\n * Render point in different coordinate.\n */\nconst BaseCircle = (options, context) => {\n // Render border only when colorAttribute is stroke.\n const { colorAttribute, mode = 'auto' } = options, style = __rest(options, [\"colorAttribute\", \"mode\"]);\n const { coordinate, document } = context;\n return (points, value, defaults) => {\n const { lineWidth, color: defaultColor } = defaults;\n const finalLineWidth = style.stroke ? lineWidth || 1 : lineWidth;\n const { color = defaultColor, transform, opacity } = value;\n const [cx, cy] = (0, utils_1.getOrigin)(points);\n const r = (0, color_1.getRadius)(mode, points, value, coordinate);\n const finalRadius = r || style.r || defaults.r;\n return (0, selection_1.select)(document.createElement('circle', {}))\n .call(utils_1.applyStyle, defaults)\n .style('fill', 'transparent')\n .style('cx', cx)\n .style('cy', cy)\n .style('r', finalRadius)\n .style('lineWidth', finalLineWidth)\n .style('transform', transform)\n .style('transformOrigin', `${cx} ${cy}`)\n .style('stroke', color)\n .style((0, utils_1.toOpacityKey)(options), opacity)\n .style(colorAttribute, color)\n .call(utils_1.applyStyle, style)\n .node();\n };\n};\nexports.BaseCircle = BaseCircle;\n/**\n * ●\n */\nconst Circle = (options, context) => {\n return (0, exports.BaseCircle)(Object.assign({ colorAttribute: 'fill' }, options), context);\n};\nexports.Circle = Circle;\nexports.Circle.props = {\n defaultMarker: 'circle',\n defaultEnterAnimation: 'fadeIn',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=circle.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Bowtie = void 0;\nconst color_1 = require(\"./color\");\n/**\n * ▶◀\n */\nconst Bowtie = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill', symbol: 'bowtie' }, options), context);\n};\nexports.Bowtie = Bowtie;\nexports.Bowtie.props = Object.assign({ defaultMarker: 'bowtie' }, color_1.Color.props);\n//# sourceMappingURL=bowtie.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Cross = void 0;\nconst color_1 = require(\"./color\");\n/**\n * ✕\n */\nconst Cross = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'cross' }, options), context);\n};\nexports.Cross = Cross;\nexports.Cross.props = Object.assign({ defaultMarker: 'cross' }, color_1.Color.props);\n//# sourceMappingURL=cross.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Diamond = void 0;\nconst color_1 = require(\"./color\");\n/**\n * ◆\n */\nconst Diamond = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill', symbol: 'diamond' }, options), context);\n};\nexports.Diamond = Diamond;\nexports.Diamond.props = Object.assign({ defaultMarker: 'diamond' }, color_1.Color.props);\n//# sourceMappingURL=diamond.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Hexagon = void 0;\nconst color_1 = require(\"./color\");\n/**\n * ⭓\n */\nconst Hexagon = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill', symbol: 'hexagon' }, options), context);\n};\nexports.Hexagon = Hexagon;\nexports.Hexagon.props = Object.assign({ defaultMarker: 'hexagon' }, color_1.Color.props);\n//# sourceMappingURL=hexagon.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Hyphen = void 0;\nconst color_1 = require(\"./color\");\n/**\n * -\n */\nconst Hyphen = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'hyphen' }, options), context);\n};\nexports.Hyphen = Hyphen;\nexports.Hyphen.props = Object.assign({ defaultMarker: 'hyphen' }, color_1.Color.props);\n//# sourceMappingURL=hyphen.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Line = void 0;\nconst color_1 = require(\"./color\");\n/**\n * |\n */\nconst Line = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'line' }, options), context);\n};\nexports.Line = Line;\nexports.Line.props = Object.assign({ defaultMarker: 'line' }, color_1.Color.props);\n//# sourceMappingURL=line.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Plus = void 0;\nconst color_1 = require(\"./color\");\n/**\n * +\n */\nconst Plus = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'plus' }, options), context);\n};\nexports.Plus = Plus;\nexports.Plus.props = Object.assign({ defaultMarker: 'plus' }, color_1.Color.props);\n//# sourceMappingURL=plus.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Point = void 0;\nconst color_1 = require(\"./color\");\n/**\n * ●\n */\nconst Point = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill', symbol: 'point' }, options), context);\n};\nexports.Point = Point;\nexports.Point.props = Object.assign({ defaultMarker: 'point' }, color_1.Color.props);\n//# sourceMappingURL=point.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Square = void 0;\nconst color_1 = require(\"./color\");\n/**\n * ■\n */\nconst Square = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill', symbol: 'square' }, options), context);\n};\nexports.Square = Square;\nexports.Square.props = Object.assign({ defaultMarker: 'square' }, color_1.Color.props);\n//# sourceMappingURL=square.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Tick = void 0;\nconst color_1 = require(\"./color\");\n/**\n * 工\n */\nconst Tick = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'stroke', symbol: 'tick' }, options), context);\n};\nexports.Tick = Tick;\nexports.Tick.props = Object.assign({ defaultMarker: 'tick' }, color_1.Color.props);\n//# sourceMappingURL=tick.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Triangle = void 0;\nconst color_1 = require(\"./color\");\n/**\n * ▲\n */\nconst Triangle = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill', symbol: 'triangle' }, options), context);\n};\nexports.Triangle = Triangle;\nexports.Triangle.props = Object.assign({ defaultMarker: 'triangle' }, color_1.Color.props);\n//# sourceMappingURL=triangle.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TriangleDown = void 0;\nconst color_1 = require(\"./color\");\n/**\n * ▼\n */\nconst TriangleDown = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill', symbol: 'triangle-down' }, options), context);\n};\nexports.TriangleDown = TriangleDown;\nexports.TriangleDown.props = Object.assign({ defaultMarker: 'triangleDown' }, color_1.Color.props);\n//# sourceMappingURL=triangleDown.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Vector = void 0;\nconst d3_path_1 = require(\"@antv/vendor/d3-path\");\nconst utils_1 = require(\"../utils\");\nconst selection_1 = require(\"../../utils/selection\");\n/**\n * Connect 2 points with a single line with arrow.\n * ----->\n */\nconst Vector = (options, context) => {\n const { arrow = true, arrowSize = '40%' } = options, style = __rest(options, [\"arrow\", \"arrowSize\"]);\n const { document } = context;\n return (points, value, defaults) => {\n const { defaultColor } = defaults, rest = __rest(defaults, [\"defaultColor\"]);\n const { color = defaultColor, transform } = value;\n const [from, to] = points;\n // Draw line\n const path = (0, d3_path_1.path)();\n path.moveTo(...from);\n path.lineTo(...to);\n // Draw 2 arrows.\n if (arrow) {\n // Calculate arrow end point.\n const [arrow1, arrow2] = (0, utils_1.arrowPoints)(from, to, { arrowSize });\n path.moveTo(...arrow1);\n path.lineTo(...to);\n path.lineTo(...arrow2);\n }\n return (0, selection_1.select)(document.createElement('path', {}))\n .call(utils_1.applyStyle, rest)\n .style('d', path.toString())\n .style('stroke', color)\n .style('transform', transform)\n .call(utils_1.applyStyle, style)\n .node();\n };\n};\nexports.Vector = Vector;\nexports.Vector.props = {\n defaultMarker: 'line',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=vector.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Text = void 0;\nconst utils_1 = require(\"../../shape/utils\");\nconst selection_1 = require(\"../../utils/selection\");\nconst advance_1 = require(\"./advance\");\n/**\n * @todo autoRotate when in polar coordinate\n */\nconst Text = (options, context) => {\n const { coordinate } = context;\n return (points, value, defaults) => {\n const { color, text = '', fontSize, rotate = 0, transform = '' } = value;\n const textStyle = {\n text: String(text),\n stroke: color,\n fill: color,\n fontSize,\n };\n const [[x0, y0]] = points;\n return (0, selection_1.select)(new advance_1.Advance())\n .style('x', x0)\n .style('y', y0)\n .call(utils_1.applyStyle, defaults)\n .style('transform', `${transform}rotate(${+rotate})`)\n .style('coordCenter', coordinate.getCenter())\n .call(utils_1.applyStyle, textStyle)\n .call(utils_1.applyStyle, options)\n .node();\n };\n};\nexports.Text = Text;\nexports.Text.props = {\n defaultMarker: 'point',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=text.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Advance = void 0;\nconst util_1 = require(\"@antv/util\");\nconst component_1 = require(\"@antv/component\");\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst createElement_1 = require(\"../../utils/createElement\");\nconst utils_1 = require(\"../utils\");\nconst helper_1 = require(\"../../utils/helper\");\nconst selection_1 = require(\"../../utils/selection\");\nconst vector_1 = require(\"../../utils/vector\");\nfunction getConnectorPoint(shape) {\n const { min: [x0, y0], max: [x1, y1], } = shape.getLocalBounds();\n let x = 0;\n let y = 0;\n if (x0 > 0)\n x = x0;\n if (x1 < 0)\n x = x1;\n if (y0 > 0)\n y = y0;\n if (y1 < 0)\n y = y1;\n return [x, y];\n}\nfunction inferBackgroundBounds(textShape, padding = []) {\n const [top = 0, right = 0, bottom = top, left = right] = padding;\n const container = textShape.parentNode;\n const angle = container.getEulerAngles();\n container.setEulerAngles(0);\n const { min, halfExtents } = textShape.getLocalBounds();\n const [x, y] = min;\n const [hw, hh] = halfExtents;\n container.setEulerAngles(angle);\n return {\n x: x - left,\n y: y - top,\n width: hw * 2 + left + right,\n height: hh * 2 + top + bottom,\n };\n}\nconst cos = (p0, p1, p2) => {\n const a = (0, vector_1.dist)(p0, p1);\n const b = (0, vector_1.dist)(p1, p2);\n const c = (0, vector_1.dist)(p2, p0);\n return (Math.pow(a, 2) + Math.pow(b, 2) - Math.pow(c, 2)) / (2 * a * b);\n};\n// A path from element to label.\n// Adapted drawLabelLine from https://github.com/antvis/G2/blob/master/src/geometry/label/layout/pie/spider.ts\nfunction inferConnectorPath(shape, end, control, coordCenter, left = true, top = true) {\n const path = (points) => (0, d3_shape_1.line)()(points);\n if (!end[0] && !end[1])\n return path([getConnectorPoint(shape), end]);\n if (!control.length)\n return path([[0, 0], end]);\n const [inflection, start] = control;\n const p1 = [...start];\n const p2 = [...inflection];\n // Label has been adjusted, so add offset to the label.\n if (start[0] !== inflection[0]) {\n const offset = left ? -4 : 4;\n p1[1] = start[1];\n // For the label in the first quadrant.\n if (top && !left) {\n p1[0] = Math.max(inflection[0], start[0] - offset);\n if (start[1] < inflection[1]) {\n p2[1] = p1[1];\n }\n else {\n p2[1] = inflection[1];\n p2[0] = Math.max(p2[0], p1[0] - offset);\n }\n }\n // For the label in the second quadrant.\n if (!top && !left) {\n p1[0] = Math.max(inflection[0], start[0] - offset);\n if (start[1] > inflection[1]) {\n p2[1] = p1[1];\n }\n else {\n p2[1] = inflection[1];\n p2[0] = Math.max(p2[0], p1[0] - offset);\n }\n }\n // For the label in the third quadrant.\n if (!top && left) {\n p1[0] = Math.min(inflection[0], start[0] - offset);\n if (start[1] > inflection[1]) {\n p2[1] = p1[1];\n }\n else {\n p2[1] = inflection[1];\n p2[0] = Math.min(p2[0], p1[0] - offset);\n }\n }\n // For the label in the fourth quadrant.\n if (top && left) {\n p1[0] = Math.min(inflection[0], start[0] - offset);\n if (start[1] < inflection[1]) {\n p2[1] = p1[1];\n }\n else {\n p2[1] = inflection[1];\n p2[0] = Math.min(p2[0], p1[0] - offset);\n }\n }\n }\n return path([start, p1, p2, inflection, end]);\n}\nexports.Advance = (0, createElement_1.createElement)((g) => {\n const _a = g.attributes, { className, \n // Do not pass className\n class: _c, transform, rotate, labelTransform, labelTransformOrigin, x, y, x0 = x, y0 = y, text, background, connector, startMarker, endMarker, coordCenter, innerHTML } = _a, rest = __rest(_a, [\"className\", \"class\", \"transform\", \"rotate\", \"labelTransform\", \"labelTransformOrigin\", \"x\", \"y\", \"x0\", \"y0\", \"text\", \"background\", \"connector\", \"startMarker\", \"endMarker\", \"coordCenter\", \"innerHTML\"]);\n g.style.transform = `translate(${x}, ${y})`;\n // Position is invalid, do not render the UI,\n // or clear previous elements.\n if ([x, y, x0, y0].some((v) => !(0, util_1.isNumber)(v))) {\n g.children.forEach((d) => d.remove());\n return;\n }\n const _b = (0, helper_1.subObject)(rest, 'background'), { padding } = _b, backgroundStyle = __rest(_b, [\"padding\"]);\n const _d = (0, helper_1.subObject)(rest, 'connector'), { points: controlPoints = [] } = _d, connectorStyle = __rest(_d, [\"points\"]);\n let textShape;\n if (innerHTML) {\n textShape = (0, selection_1.select)(g)\n .maybeAppend('html', 'html', className)\n .style('zIndex', 0)\n .style('innerHTML', innerHTML)\n .call(utils_1.applyStyle, Object.assign({ transform: labelTransform, transformOrigin: labelTransformOrigin }, rest))\n .node();\n }\n else {\n textShape = (0, selection_1.select)(g)\n .maybeAppend('text', 'text')\n .style('zIndex', 0)\n .style('text', text)\n .call(utils_1.applyStyle, Object.assign({ textBaseline: 'middle', transform: labelTransform, transformOrigin: labelTransformOrigin }, rest))\n .node();\n }\n const rect = (0, selection_1.select)(g)\n .maybeAppend('background', 'rect')\n .style('zIndex', -1)\n .call(utils_1.applyStyle, inferBackgroundBounds(textShape, padding))\n .call(utils_1.applyStyle, background ? backgroundStyle : {})\n .node();\n const left = +x0 < coordCenter[0];\n const top = +y0 < coordCenter[1];\n const end = [+x0 - +x, +y0 - +y];\n const connectorPath = inferConnectorPath(rect, end, controlPoints, coordCenter, left, top);\n const markerStart = startMarker &&\n new component_1.Marker({\n id: 'startMarker',\n style: Object.assign({ x: 0, y: 0 }, (0, helper_1.subObject)(rest, 'startMarker')),\n });\n const markerEnd = endMarker &&\n new component_1.Marker({\n id: 'endMarker',\n style: Object.assign({ x: 0, y: 0 }, (0, helper_1.subObject)(rest, 'endMarker')),\n });\n (0, selection_1.select)(g)\n .maybeAppend('connector', 'path')\n .style('zIndex', 0)\n .style('d', connectorPath)\n .style('markerStart', markerStart)\n .style('markerEnd', markerEnd)\n .call(utils_1.applyStyle, connector ? connectorStyle : {});\n});\n//# sourceMappingURL=advance.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Badge = void 0;\nconst component_1 = require(\"@antv/component\");\nconst createElement_1 = require(\"../../utils/createElement\");\nconst helper_1 = require(\"../../utils/helper\");\nconst selection_1 = require(\"../../utils/selection\");\nconst utils_1 = require(\"../../shape/utils\");\n/**\n * Get the path to draw a built-in badge, which is like a balloon.\n */\nfunction getPath(r) {\n const offset = r / Math.sqrt(2);\n const dy = r * Math.sqrt(2);\n const [p0x, p0y] = [-offset, offset - dy];\n const [p1x, p1y] = [0, 0];\n const [p2x, p2y] = [offset, offset - dy];\n return [\n ['M', p0x, p0y],\n ['A', r, r, 0, 1, 1, p2x, p2y],\n ['L', p1x, p1y],\n ['Z'],\n ];\n}\nfunction inferTextPosition(shape) {\n const { min, max } = shape.getLocalBounds();\n return [(min[0] + max[0]) * 0.5, (min[1] + max[1]) * 0.5];\n}\nconst BadgeShape = (0, createElement_1.createElement)((g) => {\n const _a = g.attributes, { class: className, x: x0, y: y0, transform } = _a, rest = __rest(_a, [\"class\", \"x\", \"y\", \"transform\"]);\n const markerStyle = (0, helper_1.subObject)(rest, 'marker');\n const { size = 24 } = markerStyle;\n const symbol = () => getPath(size / 2);\n const bgShape = (0, selection_1.select)(g)\n .maybeAppend('marker', () => new component_1.Marker({}))\n .call((selection) => selection.node().update(Object.assign({ symbol }, markerStyle)))\n .node();\n const [x, y] = inferTextPosition(bgShape);\n (0, selection_1.select)(g)\n .maybeAppend('text', 'text')\n .style('x', x)\n .style('y', y)\n .call(utils_1.applyStyle, rest);\n});\nconst Badge = (options, context) => {\n const style = __rest(options, []);\n return (points, value, defaults) => {\n const { color: defaultColor } = defaults, rest = __rest(defaults, [\"color\"]);\n const { color = defaultColor, text = '' } = value;\n const textStyle = {\n text: String(text),\n stroke: color,\n fill: color,\n };\n const [[x0, y0]] = points;\n return (0, selection_1.select)(new BadgeShape())\n .call(utils_1.applyStyle, rest)\n .style('transform', `translate(${x0},${y0})`)\n .call(utils_1.applyStyle, textStyle)\n .call(utils_1.applyStyle, style)\n .node();\n };\n};\nexports.Badge = Badge;\nexports.Badge.props = {\n defaultMarker: 'point',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=badge.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Tag = void 0;\nconst g_1 = require(\"@antv/g\");\nconst utils_1 = require(\"../../shape/utils\");\nconst selection_1 = require(\"../../utils/selection\");\n/**\n * @todo autoRotate when in polar coordinate\n * Tag shape for Text mark, used in wordCloud plot.\n */\nconst Tag = (options, context) => {\n const { coordinate } = context;\n return (points, value, defaults) => {\n const { color, text = '', fontSize, rotate = 0, transform = '' } = value;\n const textStyle = {\n text: String(text),\n stroke: color,\n fill: color,\n fontSize,\n textAlign: 'center',\n textBaseline: 'middle',\n };\n const [[x0, y0]] = points;\n const n = (0, selection_1.select)(new g_1.Text())\n .style('x', x0)\n .style('y', y0)\n .call(utils_1.applyStyle, defaults)\n .style('transformOrigin', 'center center')\n .style('transform', `${transform}rotate(${rotate}deg)`)\n .style('coordCenter', coordinate.getCenter())\n .call(utils_1.applyStyle, textStyle)\n .call(utils_1.applyStyle, options)\n .node();\n return n;\n };\n};\nexports.Tag = Tag;\nexports.Tag.props = {\n defaultMarker: 'point',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=tag.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Area = void 0;\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst curve_1 = require(\"./curve\");\nconst Area = (options, context) => {\n const { coordinate } = context;\n return (...params) => {\n const curve = (0, coordinate_1.isPolar)(coordinate) ? d3_shape_1.curveLinearClosed : d3_shape_1.curveLinear;\n return (0, curve_1.Curve)(Object.assign({ curve: curve }, options), context)(...params);\n };\n};\nexports.Area = Area;\nexports.Area.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'square' });\n//# sourceMappingURL=area.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Curve = void 0;\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst selection_1 = require(\"../../utils/selection\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst vector_1 = require(\"../../utils/vector\");\nconst utils_1 = require(\"../utils\");\nconst helper_1 = require(\"../../utils/helper\");\nconst createElement_1 = require(\"../../utils/createElement\");\n/**\n * Given a points sequence, split it into an array of defined points\n * and an array of undefined segments.\n *\n * Input - [p0, p1, p2, p3, p4, p5], p1 ~ p2 is `Y1`, p3 ~ p5 is `Y0`.\n * Output - When all of Y1 & Y0 is defined, move into defined points, or else undefined segments.\n */\nfunction segmentation(points, defined) {\n const definedPointsY1 = [];\n const definedPointsY0 = [];\n const segments = [];\n let m = false; // Is in a undefined sequence.\n let dp = null; // The previous defined point.\n const mid = points.length / 2;\n for (let i = 0; i < mid; i++) {\n const y1 = points[i];\n const y0 = points[i + mid];\n // If current point is a undefined point,\n // enter a undefined sequence.\n if ([...y1, ...y0].some((v) => !defined(v)))\n m = true;\n else {\n definedPointsY1.push(y1);\n definedPointsY0.push(y0);\n // If current point is a defined point,\n // and is in a undefined sequence, save\n // the two closest defined points as this\n // undefined sequence and exit it.\n if (m && dp) {\n m = false;\n const [dpy1, dpy0] = dp;\n segments.push([dpy1, y1, dpy0, y0]);\n }\n // Update the previous defined point.\n dp = [y1, y0];\n }\n }\n return [definedPointsY1.concat(definedPointsY0), segments];\n}\nconst DoubleArea = (0, createElement_1.createElement)((g) => {\n const { areaPath, connectPath, areaStyle, connectStyle } = g.attributes;\n const document = g.ownerDocument;\n (0, selection_1.select)(g)\n .maybeAppend('connect-path', () => document.createElement('path', {}))\n .style('d', connectPath)\n .call(utils_1.applyStyle, connectStyle);\n (0, selection_1.select)(g)\n .maybeAppend('area-path', () => document.createElement('path', {}))\n .style('d', areaPath)\n .call(utils_1.applyStyle, areaStyle);\n});\nconst Curve = (options, context) => {\n const { curve, gradient = false, defined = (d) => !Number.isNaN(d) && d !== undefined && d !== null, connect: connectNulls = false } = options, style = __rest(options, [\"curve\", \"gradient\", \"defined\", \"connect\"]);\n const { coordinate, document } = context;\n return (P, value, defaults) => {\n const { color: defaultColor } = defaults;\n const { color = defaultColor, seriesColor: sc, seriesX: sx, seriesY: sy, } = value;\n const tpShape = (0, coordinate_1.isTranspose)(coordinate);\n const transform = (0, utils_1.getTransform)(coordinate, value);\n const fill = gradient && sc\n ? (0, utils_1.computeGradient)(sc, sx, sy, gradient, undefined, tpShape)\n : color;\n const finalStyle = Object.assign(Object.assign(Object.assign(Object.assign({}, defaults), { stroke: fill, fill: fill }), (transform && { transform })), style);\n const [DP, MS] = segmentation(P, defined);\n const connectStyle = (0, helper_1.subObject)(finalStyle, 'connect');\n const missing = !!MS.length;\n const getPathNode = (path) => {\n return (0, selection_1.select)(document.createElement('path', {}))\n .style('d', path || '')\n .call(utils_1.applyStyle, finalStyle)\n .node();\n };\n if (!(0, coordinate_1.isPolar)(coordinate)) {\n /**\n * Draw area shape by points.\n */\n const areaPath = (points) => {\n const Y1 = points.slice(0, points.length / 2);\n const Y0 = points.slice(points.length / 2);\n return tpShape\n ? (0, d3_shape_1.area)()\n .y((_, idx) => Y1[idx][1])\n .x1((_, idx) => Y1[idx][0])\n .x0((_, idx) => Y0[idx][0])\n .defined((_, idx) => [...Y1[idx], ...Y0[idx]].every(defined))\n .curve(curve)(Y1)\n : (0, d3_shape_1.area)()\n .x((_, idx) => Y1[idx][0])\n .y1((_, idx) => Y1[idx][1])\n .y0((_, idx) => Y0[idx][1])\n .defined((_, idx) => [...Y1[idx], ...Y0[idx]].every(defined))\n .curve(curve)(Y1);\n };\n // Draw one area of connected defined points.\n if (!missing || (connectNulls && !Object.keys(connectStyle).length)) {\n return getPathNode(areaPath(DP));\n }\n // Draw one area of unconnected defined points.\n if (missing && !connectNulls) {\n return getPathNode(areaPath(P));\n }\n // Draw two area.\n // One for unconnected defined points.\n // One for connected segments.\n return (0, selection_1.select)(new DoubleArea())\n .style('areaStyle', finalStyle)\n .style('connectStyle', Object.assign(Object.assign({}, connectStyle), style))\n .style('areaPath', areaPath(P))\n .style('connectPath', MS.map(areaPath).join(''))\n .node();\n }\n else {\n /**\n * Draw areaRadial shape by points.\n */\n const areaRadialPath = (points) => {\n const center = coordinate.getCenter();\n const Y1 = points.slice(0, points.length / 2);\n const Y0 = points.slice(points.length / 2);\n return (0, d3_shape_1.areaRadial)()\n .angle((_, idx) => (0, vector_1.angleWithQuadrant)((0, vector_1.sub)(Y1[idx], center)))\n .outerRadius((_, idx) => (0, vector_1.dist)(Y1[idx], center))\n .innerRadius((_, idx) => (0, vector_1.dist)(Y0[idx], center))\n .defined((_, idx) => [...Y1[idx], ...Y0[idx]].every(defined))\n .curve(curve)(Y0);\n };\n // Draw one area of connected defined points.\n if (!missing || (connectNulls && !Object.keys(connectStyle).length)) {\n return getPathNode(areaRadialPath(DP));\n }\n // Draw one area of unconnected defined points.\n if (missing && !connectNulls) {\n return getPathNode(areaRadialPath(P));\n }\n // Draw two area.\n // One for unconnected defined points.\n // One for connected segments.\n return (0, selection_1.select)(new DoubleArea())\n .style('areaStyle', finalStyle)\n .style('connectStyle', Object.assign(Object.assign({}, connectStyle), style))\n .style('areaPath', areaRadialPath(P))\n .style('connectPath', MS.map(areaRadialPath).join(''))\n .node();\n }\n };\n};\nexports.Curve = Curve;\nexports.Curve.props = {\n defaultMarker: 'smooth',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=curve.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Smooth = void 0;\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst curve_1 = require(\"./curve\");\nconst Smooth = (options, context) => {\n const rest = __rest(options, []);\n const { coordinate } = context;\n return (...params) => {\n const curve = (0, coordinate_1.isPolar)(coordinate)\n ? d3_shape_1.curveCatmullRomClosed\n : (0, coordinate_1.isTranspose)(coordinate)\n ? d3_shape_1.curveMonotoneY\n : d3_shape_1.curveMonotoneX;\n return (0, curve_1.Curve)(Object.assign({ curve }, rest), context)(...params);\n };\n};\nexports.Smooth = Smooth;\nexports.Smooth.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'smooth' });\n//# sourceMappingURL=smooth.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HVH = void 0;\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst curve_1 = require(\"./curve\");\nconst HVH = (options, context) => {\n return (...params) => {\n return (0, curve_1.Curve)(Object.assign({ curve: d3_shape_1.curveStep }, options), context)(...params);\n };\n};\nexports.HVH = HVH;\nexports.HVH.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'hvh' });\n//# sourceMappingURL=hvh.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VH = void 0;\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst curve_1 = require(\"./curve\");\nconst VH = (options, context) => {\n return (...params) => {\n return (0, curve_1.Curve)(Object.assign({ curve: d3_shape_1.curveStepBefore }, options), context)(...params);\n };\n};\nexports.VH = VH;\nexports.VH.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'vh' });\n//# sourceMappingURL=vh.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HV = void 0;\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst curve_1 = require(\"./curve\");\nconst HV = (options, context) => {\n return (...params) => {\n return (0, curve_1.Curve)(Object.assign({ curve: d3_shape_1.curveStepAfter }, options), context)(...params);\n };\n};\nexports.HV = HV;\nexports.HV.props = Object.assign(Object.assign({}, curve_1.Curve.props), { defaultMarker: 'hv' });\n//# sourceMappingURL=hv.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Link = void 0;\nconst vector_1 = require(\"../../shape/vector/vector\");\n/**\n * Connect 2 points with a single line with arrow.\n * ----->\n */\nconst Link = (options, context) => {\n const { arrow = false } = options;\n return (...params) => {\n return (0, vector_1.Vector)(Object.assign(Object.assign({}, options), { arrow }), context)(...params);\n };\n};\nexports.Link = Link;\nexports.Link.props = {\n defaultMarker: 'line',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=link.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Smooth = void 0;\nconst d3_path_1 = require(\"@antv/vendor/d3-path\");\nconst utils_1 = require(\"../utils\");\nconst selection_1 = require(\"../../utils/selection\");\n/**\n * Connect 2 points with a smooth line, used in tree.\n */\nconst Smooth = (options, context) => {\n const style = __rest(options, []);\n const { document } = context;\n return (points, value, defaults) => {\n const { color: defaultColor } = defaults, rest = __rest(defaults, [\"color\"]);\n const { color = defaultColor, transform } = value;\n const [from, to] = points;\n const path = (0, d3_path_1.path)();\n path.moveTo(from[0], from[1]);\n path.bezierCurveTo(from[0] / 2 + to[0] / 2, from[1], from[0] / 2 + to[0] / 2, to[1], to[0], to[1]);\n return (0, selection_1.select)(document.createElement('path', {}))\n .call(utils_1.applyStyle, rest)\n .style('d', path.toString())\n .style('stroke', color)\n .style('transform', transform)\n .call(utils_1.applyStyle, style)\n .node();\n };\n};\nexports.Smooth = Smooth;\nexports.Smooth.props = {\n defaultMarker: 'smooth',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=smooth.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VHV = void 0;\nconst d3_path_1 = require(\"@antv/vendor/d3-path\");\nconst utils_1 = require(\"../utils\");\nconst selection_1 = require(\"../../utils/selection\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst vector_1 = require(\"../../utils/vector\");\n/**\n * Get vhv path in different coordinate.\n */\nfunction getVHVPath(from, to, coordinate, ratio) {\n const path = (0, d3_path_1.path)();\n if ((0, coordinate_1.isPolar)(coordinate)) {\n const center = coordinate.getCenter();\n const a = (0, vector_1.dist)(from, center);\n const b = (0, vector_1.dist)(to, center);\n const radius = (b - a) * ratio + a;\n path.moveTo(from[0], from[1]);\n (0, utils_1.appendArc)(path, from, to, center, radius);\n path.lineTo(to[0], to[1]);\n return path;\n }\n if ((0, coordinate_1.isTranspose)(coordinate)) {\n path.moveTo(from[0], from[1]);\n // VHV in x.\n path.lineTo(from[0] + (to[0] - from[0]) * ratio, from[1]);\n path.lineTo(from[0] + (to[0] - from[0]) * ratio, to[1]);\n path.lineTo(to[0], to[1]);\n return path;\n }\n path.moveTo(from[0], from[1]);\n // VHV in y.\n path.lineTo(from[0], from[1] + (to[1] - from[1]) * ratio);\n path.lineTo(to[0], from[1] + (to[1] - from[1]) * ratio);\n path.lineTo(to[0], to[1]);\n return path;\n}\n/**\n * Connect 2 points with a VHV line, used in tree.\n */\nconst VHV = (options, context) => {\n const { cornerRatio = 1 / 3 } = options, style = __rest(options, [\"cornerRatio\"]);\n const { coordinate, document } = context;\n return (points, value, defaults) => {\n const { defaultColor } = defaults, rest = __rest(defaults, [\"defaultColor\"]);\n const { color = defaultColor, transform } = value;\n const [from, to] = points;\n const path = getVHVPath(from, to, coordinate, cornerRatio);\n return (0, selection_1.select)(document.createElement('path', {}))\n .call(utils_1.applyStyle, rest)\n .style('d', path.toString())\n .style('stroke', color)\n .style('transform', transform)\n .call(utils_1.applyStyle, style)\n .node();\n };\n};\nexports.VHV = VHV;\nexports.VHV.props = {\n defaultMarker: 'vhv',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=vhv.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Arc = void 0;\nconst d3_path_1 = require(\"@antv/vendor/d3-path\");\nconst utils_1 = require(\"../utils\");\nconst selection_1 = require(\"../../utils/selection\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst vector_1 = require(\"../../utils/vector\");\n/**\n * Connect points for 2 points:\n * - In rect, draw half circle.\n * - In polar, draw quadratic curve.\n */\nconst Arc = (options, context) => {\n const style = __rest(options, []);\n const { coordinate, document } = context;\n return (points, value, defaults) => {\n const { color: defaultColor } = defaults, rest = __rest(defaults, [\"color\"]);\n const { color = defaultColor, transform } = value;\n const [from, to] = points;\n const path = (0, d3_path_1.path)();\n path.moveTo(from[0], from[1]);\n if ((0, coordinate_1.isPolar)(coordinate)) {\n const center = coordinate.getCenter();\n path.quadraticCurveTo(center[0], center[1], to[0], to[1]);\n }\n else {\n const center = (0, vector_1.mid)(from, to);\n const raduis = (0, vector_1.dist)(from, to) / 2;\n (0, utils_1.appendArc)(path, from, to, center, raduis);\n }\n return (0, selection_1.select)(document.createElement('path', {}))\n .call(utils_1.applyStyle, rest)\n .style('d', path.toString())\n .style('stroke', color)\n .style('transform', transform)\n .call(utils_1.applyStyle, style)\n .node();\n };\n};\nexports.Arc = Arc;\nexports.Arc.props = {\n defaultMarker: 'smooth',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=arc.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Image = void 0;\nconst utils_1 = require(\"../utils\");\nconst selection_1 = require(\"../../utils/selection\");\nconst utils_2 = require(\"../../mark/utils\");\nconst Image = (options, context) => {\n const { coordinate, document } = context;\n return (points, value, defaults) => {\n const { color: defaultColor } = defaults, rest = __rest(defaults, [\"color\"]);\n const { color = defaultColor, src = '', size = 32, transform = '' } = value;\n let { width = size, height = size } = options;\n const [[x0, y0]] = points;\n // Support percentage width, height.\n const [w, h] = coordinate.getSize();\n width = typeof width === 'string' ? (0, utils_2.p)(width) * w : width;\n height = typeof height === 'string' ? (0, utils_2.p)(height) * h : height;\n const x = x0 - Number(width) / 2;\n const y = y0 - Number(height) / 2;\n return (0, selection_1.select)(document.createElement('image', {}))\n .call(utils_1.applyStyle, rest)\n .style('x', x)\n .style('y', y)\n .style('src', src)\n .style('stroke', color)\n .style('transform', transform)\n .call(utils_1.applyStyle, options)\n .style('width', width)\n .style('height', height)\n .node();\n };\n};\nexports.Image = Image;\nexports.Image.props = {\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=image.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.initializeData = exports.valueof = exports.field = exports.visualMark = exports.p = exports.createBandOffset = exports.bandWidth = exports.basePostInference = exports.basePreInference = exports.baseAnnotationChannels = exports.tooltipXd = exports.tooltip1d = exports.tooltip2d = exports.tooltip3d = exports.baseGeometryChannels = exports.baseChannels = void 0;\nconst transform_1 = require(\"../transform\");\nfunction baseChannels(options = {}) {\n const { shapes } = options;\n return [\n { name: 'color' },\n { name: 'opacity' },\n { name: 'shape', range: shapes },\n { name: 'enterType' },\n { name: 'enterDelay', scaleKey: 'enter' },\n { name: 'enterDuration', scaleKey: 'enter' },\n { name: 'enterEasing' },\n { name: 'key', scale: 'identity' },\n { name: 'groupKey', scale: 'identity' },\n { name: 'label', scale: 'identity' },\n ];\n}\nexports.baseChannels = baseChannels;\nfunction baseGeometryChannels(options = {}) {\n return [...baseChannels(options), { name: 'title', scale: 'identity' }];\n}\nexports.baseGeometryChannels = baseGeometryChannels;\nfunction tooltip3d() {\n return [\n { type: transform_1.MaybeTitle, channel: 'color' },\n { type: transform_1.MaybeTooltip, channel: ['x', 'y', 'z'] },\n ];\n}\nexports.tooltip3d = tooltip3d;\nfunction tooltip2d() {\n return [\n { type: transform_1.MaybeTitle, channel: 'color' },\n { type: transform_1.MaybeTooltip, channel: ['x', 'y'] },\n ];\n}\nexports.tooltip2d = tooltip2d;\nfunction tooltip1d() {\n return [\n { type: transform_1.MaybeTitle, channel: 'x' },\n { type: transform_1.MaybeTooltip, channel: ['y'] },\n ];\n}\nexports.tooltip1d = tooltip1d;\nfunction tooltipXd() {\n return [\n { type: transform_1.MaybeTitle, channel: 'color' },\n { type: transform_1.MaybeTooltip, channel: ['position'] },\n ];\n}\nexports.tooltipXd = tooltipXd;\nfunction baseAnnotationChannels(options = {}) {\n return baseChannels(options);\n}\nexports.baseAnnotationChannels = baseAnnotationChannels;\nfunction basePreInference() {\n return [{ type: transform_1.MaybeKey }];\n}\nexports.basePreInference = basePreInference;\nfunction basePostInference() {\n return [];\n}\nexports.basePostInference = basePostInference;\nfunction bandWidth(scale, x) {\n return scale.getBandWidth(scale.invert(x));\n}\nexports.bandWidth = bandWidth;\nfunction createBandOffset(scale, value, options = {}) {\n const { x: X, y: Y, series: S } = value;\n const { x, y, series } = scale;\n const { style: { bandOffset = series ? 0 : 0.5, bandOffsetX = bandOffset, bandOffsetY = bandOffset, } = {}, } = options;\n const isBandX = !!(x === null || x === void 0 ? void 0 : x.getBandWidth);\n const isBandY = !!(y === null || y === void 0 ? void 0 : y.getBandWidth);\n const isSeries = !!(series === null || series === void 0 ? void 0 : series.getBandWidth);\n if (!isBandX && !isBandY)\n return (d) => d;\n return (d, i) => {\n const widthX = isBandX ? bandWidth(x, X[i]) : 0;\n const widthY = isBandY ? bandWidth(y, Y[i]) : 0;\n const f = () => (bandWidth(series, S[i]) / 2 + +S[i]) * widthX;\n const offset = isSeries && S ? f() : 0;\n const [x0, y0] = d;\n return [x0 + bandOffsetX * widthX + offset, y0 + bandOffsetY * widthY];\n };\n}\nexports.createBandOffset = createBandOffset;\nfunction p(d) {\n return parseFloat(d) / 100;\n}\nexports.p = p;\nfunction visualMark(index, scale, value, coordinate) {\n const { x: X, y: Y } = value;\n const { innerWidth, innerHeight } = coordinate.getOptions();\n const P = Array.from(index, (i) => {\n const x0 = X[i];\n const y0 = Y[i];\n const x = typeof x0 === 'string' ? p(x0) * innerWidth : +x0;\n const y = typeof y0 === 'string' ? p(y0) * innerHeight : +y0;\n return [[x, y]];\n });\n return [index, P];\n}\nexports.visualMark = visualMark;\nfunction field(encode) {\n return typeof encode === 'function' ? encode : (d) => d[encode];\n}\nexports.field = field;\nfunction valueof(data, encode) {\n return Array.from(data, field(encode));\n}\nexports.valueof = valueof;\nfunction initializeData(data, encode) {\n const { source = (d) => d.source, target = (d) => d.target, value = (d) => d.value, } = encode;\n const { links, nodes } = data;\n const LS = valueof(links, source);\n const LT = valueof(links, target);\n const LV = valueof(links, value);\n return {\n links: links.map((_, i) => ({\n target: LT[i],\n source: LS[i],\n value: LV[i],\n })),\n nodes: nodes || Array.from(new Set([...LS, ...LT]), (key) => ({ key })),\n };\n}\nexports.initializeData = initializeData;\n//# sourceMappingURL=utils.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Polygon = void 0;\nconst d3_path_1 = require(\"@antv/vendor/d3-path\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst utils_1 = require(\"../utils\");\nconst selection_1 = require(\"../../utils/selection\");\nconst vector_1 = require(\"../../utils/vector\");\nfunction getPolygonPath(points, coordinate) {\n const path = (0, d3_path_1.path)();\n // In polar, draw arc.\n if ((0, coordinate_1.isPolar)(coordinate)) {\n const center = coordinate.getCenter();\n const closedPoints = [...points, points[0]];\n // Calculate dist array for cache.\n const dists = closedPoints.map((p) => (0, vector_1.dist)(p, center));\n closedPoints.forEach((curr, idx) => {\n if (idx === 0) {\n path.moveTo(curr[0], curr[1]);\n return;\n }\n const currDist = dists[idx];\n const prev = points[idx - 1];\n const prevDist = dists[idx - 1];\n // When radius is equal, draw 2 point with arc.\n // todo: choose a minimum value.\n if (prevDist !== undefined && Math.abs(currDist - prevDist) < 1e-10) {\n (0, utils_1.appendArc)(path, prev, curr, center, currDist);\n }\n else {\n path.lineTo(curr[0], curr[1]);\n }\n });\n path.closePath();\n return path;\n }\n // In rect, draw polygon.\n return (0, utils_1.appendPolygon)(path, points);\n}\nconst Polygon = (options, context) => {\n const { coordinate, document } = context;\n return (points, value, defaults) => {\n const { color: defaultColor } = defaults, rest = __rest(defaults, [\"color\"]);\n const { color = defaultColor, transform } = value;\n const path = getPolygonPath(points, coordinate);\n return (0, selection_1.select)(document.createElement('path', {}))\n .call(utils_1.applyStyle, rest)\n .style('d', path.toString())\n .style('stroke', color)\n .style('fill', color)\n .style('transform', transform)\n .call(utils_1.applyStyle, options)\n .node();\n };\n};\nexports.Polygon = Polygon;\nexports.Polygon.props = {\n defaultMarker: 'square',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=polygon.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Ribbon = void 0;\nconst d3_path_1 = require(\"@antv/vendor/d3-path\");\nconst utils_1 = require(\"../utils\");\nconst selection_1 = require(\"../../utils/selection\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst vector_1 = require(\"../../utils/vector\");\nfunction getRibbonPath(points, coordinate) {\n const [p0, p1, p2, p3] = points;\n const path = (0, d3_path_1.path)();\n // In polar, draw shape only for Chord.\n if ((0, coordinate_1.isPolar)(coordinate)) {\n const center = coordinate.getCenter();\n const radius = (0, vector_1.dist)(center, p0);\n path.moveTo(p0[0], p0[1]);\n // p0 -> p2\n path.quadraticCurveTo(center[0], center[1], p2[0], p2[1]);\n // p2 -> p3\n (0, utils_1.appendArc)(path, p2, p3, center, radius);\n // p3 -> p1\n path.quadraticCurveTo(center[0], center[1], p1[0], p1[1]);\n // p1 -> p0\n (0, utils_1.appendArc)(path, p1, p0, center, radius);\n path.closePath();\n return path;\n }\n // In Rect, draw shape for Sankey.\n path.moveTo(p0[0], p0[1]);\n path.bezierCurveTo(p0[0] / 2 + p2[0] / 2, p0[1], p0[0] / 2 + p2[0] / 2, p2[1], p2[0], p2[1]);\n path.lineTo(p3[0], p3[1]);\n path.bezierCurveTo(p3[0] / 2 + p1[0] / 2, p3[1], p3[0] / 2 + p1[0] / 2, p1[1], p1[0], p1[1]);\n path.lineTo(p0[0], p0[1]);\n path.closePath();\n return path;\n}\n/**\n * Connect points for 4 points:\n * - In rect, draw ribbon used in Sankey.\n * - In polar, draw arc used in Chord.\n */\nconst Ribbon = (options, context) => {\n const style = __rest(options, []);\n const { coordinate, document } = context;\n return (points, value, defaults) => {\n const { color: defaultColor } = defaults, rest = __rest(defaults, [\"color\"]);\n const { color = defaultColor, transform } = value;\n const path = getRibbonPath(points, coordinate);\n return (0, selection_1.select)(document.createElement('path', {}))\n .call(utils_1.applyStyle, rest)\n .style('d', path.toString())\n .style('fill', color || defaultColor)\n .style('stroke', color || defaultColor)\n .style('transform', transform)\n .call(utils_1.applyStyle, style)\n .node();\n };\n};\nexports.Ribbon = Ribbon;\nexports.Ribbon.props = {\n defaultMarker: 'square',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=ribbon.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Box = void 0;\nconst d3_path_1 = require(\"@antv/vendor/d3-path\");\nconst utils_1 = require(\"../utils\");\nconst selection_1 = require(\"../../utils/selection\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst vector_1 = require(\"../../utils/vector\");\nfunction getPath(points, coordinate) {\n const path = (0, d3_path_1.path)();\n if (!(0, coordinate_1.isPolar)(coordinate)) {\n path.moveTo(...points[0]);\n path.lineTo(...points[1]);\n path.moveTo(...points[2]);\n path.lineTo(...points[3]);\n path.moveTo(...points[4]);\n path.lineTo(...points[5]);\n path.lineTo(...points[6]);\n path.lineTo(...points[7]);\n path.closePath();\n path.moveTo(...points[8]);\n path.lineTo(...points[9]);\n path.moveTo(...points[10]);\n path.lineTo(...points[11]);\n path.moveTo(...points[12]);\n path.lineTo(...points[13]);\n }\n else {\n // In polar coordinate.\n const center = coordinate.getCenter();\n const [x, y] = center;\n const startAngle = (0, vector_1.angle)((0, vector_1.sub)(points[0], center));\n const endAngle = (0, vector_1.angle)((0, vector_1.sub)(points[1], center));\n const radiusHigh = (0, vector_1.dist)(center, points[2]);\n const radiusQ3 = (0, vector_1.dist)(center, points[3]);\n const radiusMedian = (0, vector_1.dist)(center, points[8]);\n const radiusQ1 = (0, vector_1.dist)(center, points[10]);\n const radiusLow = (0, vector_1.dist)(center, points[11]);\n path.moveTo(...points[0]);\n path.arc(x, y, radiusHigh, startAngle, endAngle);\n path.arc(x, y, radiusHigh, endAngle, startAngle, true);\n path.moveTo(...points[2]);\n path.lineTo(...points[3]);\n path.moveTo(...points[4]);\n path.arc(x, y, radiusQ3, startAngle, endAngle); // 4 -> 5\n path.lineTo(...points[6]); // 5 -> 6\n path.arc(x, y, radiusQ1, endAngle, startAngle, true); // 6 -> 7\n path.closePath();\n path.moveTo(...points[8]);\n path.arc(x, y, radiusMedian, startAngle, endAngle); // 8 -> 9\n path.arc(x, y, radiusMedian, endAngle, startAngle, true); // 9 -> 8\n path.moveTo(...points[10]);\n path.lineTo(...points[11]);\n path.moveTo(...points[12]);\n path.arc(x, y, radiusLow, startAngle, endAngle); // 12 -> 13\n path.arc(x, y, radiusLow, endAngle, startAngle, true); // 13 -> 12\n }\n return path;\n}\nconst Box = (options, context) => {\n const { coordinate, document } = context;\n return (points, value, defaults) => {\n const { color, transform } = value;\n const { color: defaultColor, fill = defaultColor, stroke = defaultColor } = defaults, rest = __rest(defaults, [\"color\", \"fill\", \"stroke\"]);\n const path = getPath(points, coordinate);\n return (0, selection_1.select)(document.createElement('path', {}))\n .call(utils_1.applyStyle, rest)\n .style('d', path.toString())\n .style('stroke', stroke)\n .style('fill', color || fill)\n .style('transform', transform)\n .call(utils_1.applyStyle, options)\n .node();\n };\n};\nexports.Box = Box;\nexports.Box.props = {\n defaultMarker: 'point',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=box.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Violin = void 0;\nconst d3_path_1 = require(\"@antv/vendor/d3-path\");\nconst utils_1 = require(\"../utils\");\nconst selection_1 = require(\"../../utils/selection\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst vector_1 = require(\"../../utils/vector\");\nfunction getPath(p, coordinate, size = 4) {\n const path = (0, d3_path_1.path)();\n if (!(0, coordinate_1.isPolar)(coordinate)) {\n path.moveTo(...p[2]);\n path.lineTo(...p[3]);\n path.lineTo(p[3][0] - size, p[3][1]);\n path.lineTo(p[10][0] - size, p[10][1]);\n path.lineTo(p[10][0] + size, p[10][1]);\n path.lineTo(p[3][0] + size, p[3][1]);\n path.lineTo(...p[3]);\n path.closePath();\n path.moveTo(...p[10]);\n path.lineTo(...p[11]);\n path.moveTo(p[3][0] + size / 2, p[8][1]);\n path.arc(p[3][0], p[8][1], size / 2, 0, Math.PI * 2);\n path.closePath();\n return path;\n }\n const center = coordinate.getCenter();\n const [x, y] = center;\n const radiusQ3 = (0, vector_1.dist)(center, p[3]);\n const radiusMedian = (0, vector_1.dist)(center, p[8]);\n const radiusQ1 = (0, vector_1.dist)(center, p[10]);\n const middleAngle = (0, vector_1.angle)((0, vector_1.sub)(p[2], center));\n const rectAngle = Math.asin(size / radiusMedian);\n const startAngle = middleAngle - rectAngle;\n const endAngle = middleAngle + rectAngle;\n path.moveTo(...p[2]);\n path.lineTo(...p[3]);\n path.moveTo(Math.cos(startAngle) * radiusQ3 + x, Math.sin(startAngle) * radiusQ3 + y);\n path.arc(x, y, radiusQ3, startAngle, endAngle);\n path.lineTo(Math.cos(endAngle) * radiusQ1 + x, Math.sin(endAngle) * radiusQ1 + y);\n path.arc(x, y, radiusQ1, endAngle, startAngle, true);\n path.lineTo(Math.cos(startAngle) * radiusQ3 + x, Math.sin(startAngle) * radiusQ3 + y);\n path.closePath();\n path.moveTo(...p[10]);\n path.lineTo(...p[11]);\n const a = (startAngle + endAngle) / 2;\n path.moveTo(Math.cos(a) * (radiusMedian + size / 2) + x, Math.sin(a) * (radiusMedian + size / 2) + y);\n path.arc(Math.cos(a) * radiusMedian + x, Math.sin(a) * radiusMedian + y, size / 2, a, Math.PI * 2 + a);\n path.closePath();\n return path;\n}\nconst Violin = (options, context) => {\n const { coordinate, document } = context;\n return (points, value, defaults) => {\n const { color, transform } = value;\n // TODO: how to setting it by size channel.\n const size = 4;\n const { color: defaultColor, fill = defaultColor, stroke = defaultColor } = defaults, rest = __rest(defaults, [\"color\", \"fill\", \"stroke\"]);\n const path = getPath(points, coordinate, size);\n return (0, selection_1.select)(document.createElement('path', {}))\n .call(utils_1.applyStyle, rest)\n .style('d', path.toString())\n .style('stroke', stroke)\n .style('fill', color || fill)\n .style('transform', transform)\n .call(utils_1.applyStyle, options)\n .node();\n };\n};\nexports.Violin = Violin;\nexports.Violin.props = {\n defaultMarker: 'point',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=violin.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Line = void 0;\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst selection_1 = require(\"../../utils/selection\");\nconst vector_1 = require(\"../../utils/vector\");\nconst helper_1 = require(\"../../utils/helper\");\nconst utils_1 = require(\"../utils\");\nfunction getArrowMarker(document, arrowSize, arrowStyle) {\n const arrowMarker = document.createElement('path', {\n style: Object.assign({ d: `M ${arrowSize},${arrowSize} L -${arrowSize},0 L ${arrowSize},-${arrowSize} L 0,0 Z`, transformOrigin: 'center' }, arrowStyle),\n });\n return arrowMarker;\n}\nfunction getPath(points, coordinate) {\n if (!(0, coordinate_1.isPolar)(coordinate))\n return (0, d3_shape_1.line)()\n .x((d) => d[0])\n .y((d) => d[1])(points);\n const center = coordinate.getCenter();\n return (0, d3_shape_1.arc)()({\n startAngle: 0,\n endAngle: Math.PI * 2,\n outerRadius: (0, vector_1.dist)(points[0], center),\n innerRadius: (0, vector_1.dist)(points[1], center),\n });\n}\nfunction getTransform(coordinate, transform) {\n if (!(0, coordinate_1.isPolar)(coordinate))\n return transform;\n const [cx, cy] = coordinate.getCenter();\n return `translate(${cx}, ${cy}) ${transform || ''}`;\n}\nconst Line = (options, context) => {\n const { arrow, arrowSize = 4 } = options, style = __rest(options, [\"arrow\", \"arrowSize\"]);\n const { coordinate, document } = context;\n return (points, value, defaults) => {\n const { color: defaultColor, lineWidth } = defaults, shapeTheme = __rest(defaults, [\"color\", \"lineWidth\"]);\n const { color = defaultColor, size = lineWidth } = value;\n const arrowMarker = arrow\n ? getArrowMarker(document, arrowSize, Object.assign({ fill: style.stroke || color, stroke: style.stroke || color }, (0, helper_1.subObject)(style, 'arrow')))\n : null;\n const path = getPath(points, coordinate);\n const transform = getTransform(coordinate, value.transform);\n return (0, selection_1.select)(document.createElement('path', {}))\n .call(utils_1.applyStyle, shapeTheme)\n .style('d', path)\n .style('stroke', color)\n .style('lineWidth', size)\n .style('transform', transform)\n .style('markerEnd', arrowMarker)\n .call(utils_1.applyStyle, style)\n .node();\n };\n};\nexports.Line = Line;\nexports.Line.props = {\n defaultMarker: 'line',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=line.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Connector = void 0;\nconst g_1 = require(\"@antv/g\");\nconst component_1 = require(\"@antv/component\");\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst helper_1 = require(\"../../utils/helper\");\nconst selection_1 = require(\"../../utils/selection\");\nconst utils_1 = require(\"../utils\");\nfunction inferSymbol(x, y, r) {\n return [['M', x, y], ['L', x + 2 * r, y - r], ['L', x + 2 * r, y + r], ['Z']];\n}\n/**\n * @todo support polar later.\n */\nfunction inferConnectorPath(points) {\n return (0, d3_shape_1.line)()\n .x((d) => d[0])\n .y((d) => d[1])(points);\n}\nfunction getPoints(coordinate, points, sourceOffsetY, targetOffsetY, sourceOffsetX, targetOffsetX, length1 = 0) {\n const [[x0, y0], [x1, y1]] = points;\n if ((0, coordinate_1.isTranspose)(coordinate)) {\n const X0 = x0 + sourceOffsetY;\n const X1 = x1 + targetOffsetY;\n const X = X0 + length1;\n const Y0 = y0 + sourceOffsetX;\n const Y1 = y1 + targetOffsetX;\n return [\n [X0, Y0],\n [X, Y0],\n [X, Y1],\n [X1, Y1],\n ];\n }\n const Y0 = y0 - sourceOffsetY;\n const Y1 = y1 - targetOffsetY;\n const Y = Y0 - length1;\n const X0 = x0 - sourceOffsetX;\n const X1 = x1 - targetOffsetX;\n return [\n [X0, Y0],\n [X0, Y],\n [X1, Y],\n [X1, Y1],\n ];\n}\nconst Connector = (options, context) => {\n const { offsetX = 0, sourceOffsetX = offsetX, targetOffsetX = offsetX, offsetY = 0, sourceOffsetY = offsetY, targetOffsetY = offsetY, connectLength1: length1, endMarker = true } = options, style = __rest(options, [\"offsetX\", \"sourceOffsetX\", \"targetOffsetX\", \"offsetY\", \"sourceOffsetY\", \"targetOffsetY\", \"connectLength1\", \"endMarker\"]);\n const { coordinate } = context;\n return (points, value, defaults) => {\n const { color: defaultColor, connectLength1 } = defaults, rest = __rest(defaults, [\"color\", \"connectLength1\"]);\n const { color, transform } = value;\n const P = getPoints(coordinate, points, sourceOffsetY, targetOffsetY, sourceOffsetX, targetOffsetX, length1 !== null && length1 !== void 0 ? length1 : connectLength1);\n const makerStyle = (0, helper_1.subObject)(Object.assign(Object.assign({}, style), defaults), 'endMarker');\n return (0, selection_1.select)(new g_1.Path())\n .call(utils_1.applyStyle, rest)\n .style('d', inferConnectorPath(P))\n .style('stroke', color || defaultColor)\n .style('transform', transform)\n .style('markerEnd', endMarker\n ? new component_1.Marker({\n className: 'marker',\n style: Object.assign(Object.assign({}, makerStyle), { symbol: inferSymbol }),\n })\n : null)\n .call(utils_1.applyStyle, style)\n .node();\n };\n};\nexports.Connector = Connector;\nexports.Connector.props = {\n defaultMarker: 'line',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=connector.js.map","\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Label = void 0;\nconst selection_1 = require(\"../../utils/selection\");\nconst utils_1 = require(\"../../shape/utils\");\nconst coordinate_1 = require(\"../../utils/coordinate\");\nconst string_1 = require(\"../../utils/string\");\nconst advance_1 = require(\"../text/advance\");\nconst PositionProcessor = __importStar(require(\"./position\"));\nfunction inferPosition(position, coordinate) {\n if (position !== undefined)\n return position;\n if ((0, coordinate_1.isCircular)(coordinate))\n return 'inside';\n if ((0, coordinate_1.isTranspose)(coordinate))\n return 'right';\n return 'top';\n}\nfunction getDefaultStyle(points, value, coordinate, theme, options, labels) {\n // For non-series mark, calc position for label based on\n // position and the bounds of shape.\n const { position } = value;\n const { render } = options;\n const p = inferPosition(position, coordinate);\n const labelType = render\n ? 'htmlLabel'\n : p === 'inside'\n ? 'innerLabel'\n : 'label';\n const t = theme[labelType];\n const v = Object.assign({}, t, value);\n const processor = PositionProcessor[(0, string_1.camelCase)(p)];\n if (!processor) {\n throw new Error(`Unknown position: ${p}`);\n }\n return Object.assign(Object.assign({}, t), processor(p, points, v, coordinate, options, labels));\n}\n/**\n * Render normal label for each mark.\n * @todo Support position option: middle...\n */\nconst Label = (options, context) => {\n const { coordinate, theme } = context;\n const { render } = options;\n return (points, value, style, labels) => {\n const { text, x, y, transform: specifiedTS = '', transformOrigin, className = '' } = value, overrideStyle = __rest(value, [\"text\", \"x\", \"y\", \"transform\", \"transformOrigin\", \"className\"]);\n const _a = getDefaultStyle(points, value, coordinate, theme, options, labels), { rotate = 0, transform = '' } = _a, defaultStyle = __rest(_a, [\"rotate\", \"transform\"]);\n return (0, selection_1.select)(new advance_1.Advance())\n .call(utils_1.applyStyle, defaultStyle)\n .style('text', `${text}`)\n .style('className', `${className} g2-label`)\n .style('innerHTML', render ? render(text, value.datum, value.index) : undefined)\n .style('labelTransform', `${transform} rotate(${+rotate}) ${specifiedTS}`.trim())\n .style('labelTransformOrigin', transformOrigin)\n .style('coordCenter', coordinate.getCenter())\n .call(utils_1.applyStyle, overrideStyle)\n .node();\n };\n};\nexports.Label = Label;\nexports.Label.props = {\n defaultMarker: 'point',\n};\n//# sourceMappingURL=label.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.topRight = exports.topLeft = exports.top = exports.surround = exports.spider = exports.right = exports.outside = exports.left = exports.inside = exports.bottomRight = exports.bottomLeft = exports.bottom = exports.area = void 0;\nvar area_1 = require(\"./area\");\nObject.defineProperty(exports, \"area\", { enumerable: true, get: function () { return area_1.area; } });\nvar bottom_1 = require(\"./bottom\");\nObject.defineProperty(exports, \"bottom\", { enumerable: true, get: function () { return bottom_1.bottom; } });\nvar bottomLeft_1 = require(\"./bottomLeft\");\nObject.defineProperty(exports, \"bottomLeft\", { enumerable: true, get: function () { return bottomLeft_1.bottomLeft; } });\nvar bottomRight_1 = require(\"./bottomRight\");\nObject.defineProperty(exports, \"bottomRight\", { enumerable: true, get: function () { return bottomRight_1.bottomRight; } });\nvar inside_1 = require(\"./inside\");\nObject.defineProperty(exports, \"inside\", { enumerable: true, get: function () { return inside_1.inside; } });\nvar left_1 = require(\"./left\");\nObject.defineProperty(exports, \"left\", { enumerable: true, get: function () { return left_1.left; } });\nvar outside_1 = require(\"./outside\");\nObject.defineProperty(exports, \"outside\", { enumerable: true, get: function () { return outside_1.outside; } });\nvar right_1 = require(\"./right\");\nObject.defineProperty(exports, \"right\", { enumerable: true, get: function () { return right_1.right; } });\nvar spider_1 = require(\"./spider\");\nObject.defineProperty(exports, \"spider\", { enumerable: true, get: function () { return spider_1.spider; } });\nvar surround_1 = require(\"./surround\");\nObject.defineProperty(exports, \"surround\", { enumerable: true, get: function () { return surround_1.surround; } });\nvar top_1 = require(\"./top\");\nObject.defineProperty(exports, \"top\", { enumerable: true, get: function () { return top_1.top; } });\nvar topLeft_1 = require(\"./topLeft\");\nObject.defineProperty(exports, \"topLeft\", { enumerable: true, get: function () { return topLeft_1.topLeft; } });\nvar topRight_1 = require(\"./topRight\");\nObject.defineProperty(exports, \"topRight\", { enumerable: true, get: function () { return topRight_1.topRight; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.area = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst vector_1 = require(\"../../../utils/vector\");\n/**\n * Only for Area label.\n */\nfunction area(position, points, value, coordinate) {\n const l = points.length / 2;\n const Y1 = points.slice(0, l);\n const Y0 = points.slice(l);\n // Get the maximal space for label.\n let idx = (0, d3_array_1.maxIndex)(Y1, (p, i) => Math.abs(p[1] - Y0[i][1]));\n // Do not show label at first and last.\n idx = Math.max(Math.min(idx, l - 2), 1);\n const mid = (i) => [Y1[i][0], (Y1[i][1] + Y0[i][1]) / 2];\n const point = mid(idx);\n const prev = mid(idx - 1);\n const next = mid(idx + 1);\n // todo: G rotate only support deg.\n const rotate = ((0, vector_1.angle)((0, vector_1.sub)(next, prev)) / Math.PI) * 180;\n return {\n x: point[0],\n y: point[1],\n transform: `rotate(${rotate})`,\n textAlign: 'center',\n textBaseline: 'middle',\n };\n}\nexports.area = area;\n//# sourceMappingURL=area.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bottom = void 0;\nvar default_1 = require(\"./default\");\nObject.defineProperty(exports, \"bottom\", { enumerable: true, get: function () { return default_1.getDefaultStyle; } });\n//# sourceMappingURL=bottom.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getDefaultStyle = exports.inferIdentityStyle = exports.inferRotation = exports.pointOfArc = exports.inferRadialStyle = exports.inferNonCircularStyle = void 0;\nconst utils_1 = require(\"../../../shape/utils\");\nconst coordinate_1 = require(\"../../../utils/coordinate\");\nconst helper_1 = require(\"../../../utils/helper\");\nconst vector_1 = require(\"../../../utils/vector\");\nfunction inferNonCircularStyle(position, points, value, coordinate) {\n const { bounds } = value;\n const [[x0, y0], [x1, y1]] = bounds;\n const w = x1 - x0;\n const h = y1 - y0;\n const xy = (options) => {\n const { x: ox, y: oy } = options;\n const px = (0, helper_1.maybePercentage)(value.x, w);\n const py = (0, helper_1.maybePercentage)(value.y, h);\n return Object.assign(Object.assign({}, options), { x: (px || ox) + x0, y: (py || oy) + y0 });\n };\n // 4 direction.\n if (position === 'left')\n return xy({ x: 0, y: h / 2, textAlign: 'start', textBaseline: 'middle' });\n if (position === 'right')\n return xy({ x: w, y: h / 2, textAlign: 'end', textBaseline: 'middle' });\n if (position === 'top')\n return xy({ x: w / 2, y: 0, textAlign: 'center', textBaseline: 'top' });\n if (position === 'bottom')\n return xy({ x: w / 2, y: h, textAlign: 'center', textBaseline: 'bottom' });\n // 4 corner position.\n if (position === 'top-left')\n return xy({ x: 0, y: 0, textAlign: 'start', textBaseline: 'top' });\n if (position === 'top-right')\n return xy({ x: w, y: 0, textAlign: 'end', textBaseline: 'top' });\n if (position === 'bottom-left')\n return xy({ x: 0, y: h, textAlign: 'start', textBaseline: 'bottom' });\n if (position === 'bottom-right')\n return xy({ x: w, y: h, textAlign: 'end', textBaseline: 'bottom' });\n // default return 'inside'\n return xy({\n x: w / 2,\n y: h / 2,\n textAlign: 'center',\n textBaseline: 'middle',\n });\n}\nexports.inferNonCircularStyle = inferNonCircularStyle;\nfunction inferRadialStyle(position, points, value, coordinate) {\n const { y, y1, autoRotate, rotateToAlignArc } = value;\n const center = coordinate.getCenter();\n const arcObject = (0, utils_1.getArcObject)(coordinate, points, [y, y1]);\n const { innerRadius, outerRadius, startAngle, endAngle } = arcObject;\n const angle = position === 'inside' ? (startAngle + endAngle) / 2 : endAngle;\n const rotate = inferRotation(angle, autoRotate, rotateToAlignArc);\n const point = (() => {\n const [p0, p1] = points;\n const radius = innerRadius + (outerRadius - innerRadius) * 0.5;\n const [x, y] = position === 'inside' ? pointOfArc(center, angle, radius) : (0, vector_1.mid)(p0, p1);\n return { x, y };\n })();\n return Object.assign(Object.assign({}, point), { textAlign: position === 'inside' ? 'center' : 'start', textBaseline: 'middle', rotate });\n}\nexports.inferRadialStyle = inferRadialStyle;\nfunction pointOfArc(center, angle, radius) {\n return [\n center[0] + Math.sin(angle) * radius,\n center[1] - Math.cos(angle) * radius,\n ];\n}\nexports.pointOfArc = pointOfArc;\nfunction inferRotation(angle, autoRotate, rotateToAlignArc) {\n if (!autoRotate)\n return 0;\n const append = rotateToAlignArc ? 0 : Math.sin(angle) < 0 ? 90 : -90;\n return (angle / Math.PI) * 180 + append;\n}\nexports.inferRotation = inferRotation;\nfunction inferInnerCircularStyle(position, points, value, coordinate) {\n const { y, y1, autoRotate, rotateToAlignArc, radius: radiusRatio = 0.5, offset = 0, } = value;\n const arcObject = (0, utils_1.getArcObject)(coordinate, points, [y, y1]);\n const { startAngle, endAngle } = arcObject;\n const center = coordinate.getCenter();\n const angle = (startAngle + endAngle) / 2;\n const rotate = inferRotation(angle, autoRotate, rotateToAlignArc);\n const textStyle = { textAlign: 'center', textBaseline: 'middle', rotate };\n const { innerRadius, outerRadius } = arcObject;\n const r0 = innerRadius + (outerRadius - innerRadius) * radiusRatio;\n const r1 = r0 + offset;\n const [x0, y0] = pointOfArc(center, angle, r1);\n return Object.assign({ x: x0, y: y0 }, textStyle);\n}\n// Set to null will not be set with default value as below.\n// const { x = 0 } = options;\nfunction maybeUndefined(d) {\n return d === undefined ? null : d;\n}\nfunction inferIdentityStyle(position, points, value, coordinate) {\n const { bounds } = value;\n const [p] = bounds;\n return {\n x: maybeUndefined(p[0]),\n y: maybeUndefined(p[1]),\n };\n}\nexports.inferIdentityStyle = inferIdentityStyle;\nfunction getDefaultStyle(position, points, value, coordinate) {\n const { bounds } = value;\n // When bounds.length = 1\n // For series mark, such as line and area.\n // The bounds for text is defined with only one point.\n // Use this point as the label position.\n if (bounds.length === 1) {\n return inferIdentityStyle(position, points, value, coordinate);\n }\n const inferDefaultStyle = (0, coordinate_1.isRadial)(coordinate)\n ? inferRadialStyle\n : (0, coordinate_1.isCircular)(coordinate)\n ? inferInnerCircularStyle\n : inferNonCircularStyle;\n return inferDefaultStyle(position, points, value, coordinate);\n}\nexports.getDefaultStyle = getDefaultStyle;\n//# sourceMappingURL=default.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bottomLeft = void 0;\nvar default_1 = require(\"./default\");\nObject.defineProperty(exports, \"bottomLeft\", { enumerable: true, get: function () { return default_1.getDefaultStyle; } });\n//# sourceMappingURL=bottomLeft.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bottomRight = void 0;\nvar default_1 = require(\"./default\");\nObject.defineProperty(exports, \"bottomRight\", { enumerable: true, get: function () { return default_1.getDefaultStyle; } });\n//# sourceMappingURL=bottomRight.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.inside = void 0;\nvar default_1 = require(\"./default\");\nObject.defineProperty(exports, \"inside\", { enumerable: true, get: function () { return default_1.getDefaultStyle; } });\n//# sourceMappingURL=inside.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.left = void 0;\nvar default_1 = require(\"./default\");\nObject.defineProperty(exports, \"left\", { enumerable: true, get: function () { return default_1.getDefaultStyle; } });\n//# sourceMappingURL=left.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.outside = exports.inferOutsideCircularStyle = exports.angleOf = exports.radiusOf = exports.linePoints = void 0;\nconst utils_1 = require(\"../../../shape/utils\");\nconst coordinate_1 = require(\"../../../utils/coordinate\");\nconst default_1 = require(\"./default\");\nfunction linePoints(center, angle, radius, radius1, offsetX) {\n const [x0, y0] = (0, default_1.pointOfArc)(center, angle, radius);\n const [x1, y1] = (0, default_1.pointOfArc)(center, angle, radius1);\n const sign = Math.sin(angle) > 0 ? 1 : -1;\n return [\n [x0, y0],\n [x1, y1],\n [x1 + sign * offsetX, y1],\n ];\n}\nexports.linePoints = linePoints;\nfunction radiusOf(points, value, coordinate) {\n const arcObject = (0, utils_1.getArcObject)(coordinate, points, [value.y, value.y1]);\n const { innerRadius, outerRadius } = arcObject;\n return innerRadius + (outerRadius - innerRadius);\n}\nexports.radiusOf = radiusOf;\nfunction angleOf(points, value, coordinate) {\n const arcObject = (0, utils_1.getArcObject)(coordinate, points, [value.y, value.y1]);\n const { startAngle, endAngle } = arcObject;\n return (startAngle + endAngle) / 2;\n}\nexports.angleOf = angleOf;\nfunction inferOutsideCircularStyle(position, points, value, coordinate) {\n const { autoRotate, rotateToAlignArc, offset = 0, connector = true, connectorLength = offset, connectorLength2 = 0, connectorDistance = 0, } = value;\n const center = coordinate.getCenter();\n const angle = angleOf(points, value, coordinate);\n const sign = Math.sin(angle) > 0 ? 1 : -1;\n const rotate = (0, default_1.inferRotation)(angle, autoRotate, rotateToAlignArc);\n const textStyle = {\n textAlign: sign > 0 || (0, coordinate_1.isRadial)(coordinate) ? 'start' : 'end',\n textBaseline: 'middle',\n rotate,\n };\n const radius = radiusOf(points, value, coordinate);\n const radius1 = radius + (connector ? connectorLength : offset);\n const [[x0, y0], [x1, y1], [x2, y2]] = linePoints(center, angle, radius, radius1, connector ? connectorLength2 : 0);\n const dx = connector ? +connectorDistance * sign : 0;\n const x = x2 + dx;\n const y = y2;\n const connectorStyle = {\n connector,\n connectorPoints: [\n [x1 - x, y1 - y],\n [x2 - x, y2 - y],\n ],\n };\n return Object.assign(Object.assign({ x0,\n y0, x: x2 + dx, y: y2 }, textStyle), connectorStyle);\n}\nexports.inferOutsideCircularStyle = inferOutsideCircularStyle;\nfunction outside(position, points, value, coordinate) {\n const { bounds } = value;\n // When bounds.length = 1\n // For series mark, such as line and area.\n // The bounds for text is defined with only one point.\n // Use this point as the label position.\n if (bounds.length === 1) {\n return (0, default_1.inferIdentityStyle)(position, points, value, coordinate);\n }\n const inferDefaultStyle = (0, coordinate_1.isRadial)(coordinate)\n ? default_1.inferRadialStyle\n : (0, coordinate_1.isCircular)(coordinate)\n ? inferOutsideCircularStyle\n : default_1.inferNonCircularStyle;\n return inferDefaultStyle(position, points, value, coordinate);\n}\nexports.outside = outside;\n//# sourceMappingURL=outside.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.right = void 0;\nvar default_1 = require(\"./default\");\nObject.defineProperty(exports, \"right\", { enumerable: true, get: function () { return default_1.getDefaultStyle; } });\n//# sourceMappingURL=right.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.spider = void 0;\nconst coordinate_1 = require(\"../../../utils/coordinate\");\nconst outside_1 = require(\"./outside\");\nconst utils_1 = require(\"./utils\");\nconst styleByPoints = new WeakMap();\nfunction compute(points, value, coordinate) {\n const { connectorLength, connectorLength2, connectorDistance } = value;\n const style = __rest((0, outside_1.inferOutsideCircularStyle)('outside', points, value, coordinate), []);\n const center = coordinate.getCenter();\n const radius = (0, outside_1.radiusOf)(points, value, coordinate);\n const angle = (0, outside_1.angleOf)(points, value, coordinate);\n const radius1 = radius + connectorLength + connectorLength2;\n const sign = Math.sin(angle) > 0 ? 1 : -1;\n const newX = center[0] + (radius1 + +connectorDistance) * sign;\n const { x: originX } = style;\n const dx = newX - originX;\n style.x += dx;\n style.connectorPoints[0][0] -= dx;\n return style;\n}\n/**\n * Spider label transform only suitable for the labels in polar coordinate,\n * labels should distinguish coordinate type.\n */\nfunction spider(position, points, value, coordinate, options, labels) {\n if (!(0, coordinate_1.isCircular)(coordinate))\n return {};\n if (styleByPoints.has(points))\n return styleByPoints.get(points);\n const computed = labels.map((points) => compute(points, value, coordinate));\n const { width, height } = coordinate.getOptions();\n const left = computed.filter((d) => d.x < width / 2);\n const right = computed.filter((d) => d.x >= width / 2);\n const extendedOptions = Object.assign(Object.assign({}, options), { height });\n (0, utils_1.hideAndDodgeY)(left, extendedOptions);\n (0, utils_1.hideAndDodgeY)(right, extendedOptions);\n computed.forEach((style, i) => styleByPoints.set(labels[i], style));\n return styleByPoints.get(points);\n}\nexports.spider = spider;\n//# sourceMappingURL=spider.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.hideAndDodgeY = exports.dodgeY = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\n// Optimize antiCollision from: https://github.com/antvis/G2/blob/master/src/geometry/label/layout/pie/util.ts\nfunction dodgeY(labels, options = {}) {\n const { labelHeight = 14, height } = options;\n // Sort labels by y and init boxes (one box for each label)\n const sortedLabels = (0, d3_array_1.sort)(labels, (d) => d.y);\n const n = sortedLabels.length;\n const boxes = new Array(n);\n for (let i = 0; i < n; i++) {\n const label = sortedLabels[i];\n const { y } = label;\n boxes[i] = { y, y1: y + labelHeight, labels: [y] };\n }\n // Merge boxes until no overlapping boxes or only one box left.\n // All the boxes should start higher than 0, but maybe higher than height.\n let overlap = true;\n while (overlap) {\n overlap = false;\n // Scan backward because boxes maybe deleted.\n for (let i = boxes.length - 1; i > 0; i--) {\n const box = boxes[i];\n const preBox = boxes[i - 1];\n if (preBox.y1 > box.y) {\n overlap = true;\n preBox.labels.push(...box.labels);\n boxes.splice(i, 1);\n // Compute new y1 to contain the current box.\n preBox.y1 += box.y1 - box.y;\n // Make sure the new box is in the range of [0, height].\n const newHeight = preBox.y1 - preBox.y;\n preBox.y1 = Math.max(Math.min(preBox.y1, height), newHeight);\n preBox.y = preBox.y1 - newHeight;\n }\n }\n }\n let i = 0;\n for (const box of boxes) {\n const { y, labels } = box;\n let prevY = y - labelHeight;\n for (const curY of labels) {\n const label = sortedLabels[i++];\n const expectedY = prevY + labelHeight;\n const dy = expectedY - curY;\n label.connectorPoints[0][1] -= dy;\n label.y = prevY + labelHeight;\n prevY += labelHeight;\n }\n }\n}\nexports.dodgeY = dodgeY;\nfunction hideAndDodgeY(unsorted, options) {\n const labels = (0, d3_array_1.sort)(unsorted, (d) => d.y);\n const { height, labelHeight = 14 } = options;\n const maxCount = Math.ceil(height / labelHeight);\n if (labels.length <= maxCount)\n return dodgeY(labels, options);\n const filtered = [];\n for (let i = 0; i < labels.length; i++) {\n // Hide labels out of range.\n if (i < labels.length - maxCount) {\n labels[i].opacity = 0;\n labels[i].connector = false;\n }\n else\n filtered.push(labels[i]);\n }\n dodgeY(filtered, options);\n}\nexports.hideAndDodgeY = hideAndDodgeY;\n//# sourceMappingURL=utils.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.surround = void 0;\nconst coordinate_1 = require(\"../../../utils/coordinate\");\nconst vector_1 = require(\"../../../utils/vector\");\nconst default_1 = require(\"./default\");\nconst outside_1 = require(\"./outside\");\n/**\n * Surround label transform is used to make labels surround circular.\n */\nfunction surround(position, points, value, coordinate) {\n if (!(0, coordinate_1.isCircular)(coordinate))\n return {};\n const { connectorLength, connectorLength2, connectorDistance } = value;\n const style = __rest((0, outside_1.inferOutsideCircularStyle)('outside', points, value, coordinate), []);\n const { x0, y0 } = style;\n const center = coordinate.getCenter();\n const radius = (0, coordinate_1.getRadius)(coordinate);\n const radius1 = radius + connectorLength;\n const angle = (0, vector_1.angleWithQuadrant)([x0 - center[0], y0 - center[1]]);\n const sign = Math.sin(angle) > 0 ? 1 : -1;\n const [newX, newY] = (0, default_1.pointOfArc)(center, angle, radius1);\n style.x = newX + (connectorLength2 + connectorDistance) * sign;\n style.y = newY;\n return style;\n}\nexports.surround = surround;\n//# sourceMappingURL=surround.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.top = void 0;\nvar default_1 = require(\"./default\");\nObject.defineProperty(exports, \"top\", { enumerable: true, get: function () { return default_1.getDefaultStyle; } });\n//# sourceMappingURL=top.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.topLeft = void 0;\nvar default_1 = require(\"./default\");\nObject.defineProperty(exports, \"topLeft\", { enumerable: true, get: function () { return default_1.getDefaultStyle; } });\n//# sourceMappingURL=topLeft.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.topRight = void 0;\nvar default_1 = require(\"./default\");\nObject.defineProperty(exports, \"topRight\", { enumerable: true, get: function () { return default_1.getDefaultStyle; } });\n//# sourceMappingURL=topRight.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Path = void 0;\nconst color_1 = require(\"./color\");\n/**\n * A filled path.\n */\nconst Path = (options, context) => {\n return (0, color_1.Color)(Object.assign({ colorAttribute: 'fill' }, options), context);\n};\nexports.Path = Path;\nexports.Path.props = {\n defaultMarker: 'hvh',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=path.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Color = void 0;\nconst utils_1 = require(\"../utils\");\nconst selection_1 = require(\"../../utils/selection\");\n/**\n * Draw a filled or hollow path.\n */\nconst Color = (options, context) => {\n const { arrow, colorAttribute } = options, style = __rest(options, [\"arrow\", \"colorAttribute\"]);\n const { coordinate, document } = context;\n return (points, value, defaults) => {\n const { color: defaultColor, stroke } = defaults, rest = __rest(defaults, [\"color\", \"stroke\"]);\n const { d, color = defaultColor } = value;\n const [width, height] = coordinate.getSize();\n return ((0, selection_1.select)(document.createElement('path', {}))\n .call(utils_1.applyStyle, rest)\n // Path support string, function with parameter { width, height }.\n .style('d', typeof d === 'function' ? d({ width, height }) : d)\n .style(colorAttribute, color)\n .call(utils_1.applyStyle, style)\n .node());\n };\n};\nexports.Color = Color;\nexports.Color.props = {\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=color.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Hollow = void 0;\nconst color_1 = require(\"./color\");\n/**\n * A hollow path.\n */\nconst Hollow = (options, context) => {\n return (0, color_1.Color)(Object.assign({ fill: 'none', colorAttribute: 'stroke' }, options), context);\n};\nexports.Hollow = Hollow;\nexports.Hollow.props = {\n defaultMarker: 'hvh',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=hollow.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Density = void 0;\nconst d3_path_1 = require(\"@antv/vendor/d3-path\");\nconst utils_1 = require(\"../utils\");\nconst selection_1 = require(\"../../utils/selection\");\n/**\n * Draw density shape.\n */\nconst Density = (options, context) => {\n const { document } = context;\n return (points, value, defaults) => {\n const { transform } = value;\n const { color: defaultColor } = defaults, rest = __rest(defaults, [\"color\"]);\n const { color = defaultColor } = value;\n const [first, ...p] = points;\n // todo smooth, hollow\n const path = (0, d3_path_1.path)();\n path.moveTo(...first);\n p.forEach(([x, y]) => {\n path.lineTo(x, y);\n });\n path.closePath();\n return (0, selection_1.select)(document.createElement('path', {}))\n .call(utils_1.applyStyle, rest)\n .style('d', path.toString())\n .style('stroke', color || defaultColor) // Always has stroke color.\n .style('fill', color || defaultColor)\n .style('fillOpacity', 0.4)\n .style('transform', transform)\n .call(utils_1.applyStyle, options)\n .node();\n };\n};\nexports.Density = Density;\nexports.Density.props = {\n defaultMarker: 'square',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=density.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Heatmap = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst utils_1 = require(\"../utils\");\nconst selection_1 = require(\"../../utils/selection\");\nconst renderer_1 = require(\"./renderer\");\nfunction deleteKey(obj, fn) {\n return Object.keys(obj).reduce((r, k) => {\n const v = obj[k];\n if (!fn(v, k))\n r[k] = v;\n return r;\n }, {});\n}\nconst Heatmap = (options, context) => {\n const { gradient, opacity, maxOpacity, minOpacity, blur, useGradientOpacity } = options, style = __rest(options, [\"gradient\", \"opacity\", \"maxOpacity\", \"minOpacity\", \"blur\", \"useGradientOpacity\"]);\n const { coordinate, createCanvas, document } = context;\n return (points, value, defaults) => {\n const { transform } = value;\n const [width, height] = coordinate.getSize();\n const data = points.map((p) => ({\n x: p[0],\n y: p[1],\n value: p[2],\n radius: p[3],\n }));\n const min = (0, d3_array_1.min)(points, (p) => p[2]);\n const max = (0, d3_array_1.max)(points, (p) => p[2]);\n const options = {\n gradient,\n opacity,\n minOpacity,\n maxOpacity,\n blur,\n useGradientOpacity,\n };\n const ctx = width && height\n ? (0, renderer_1.HeatmapRenderer)(width, height, min, max, data, deleteKey(options, (v) => v === undefined), createCanvas)\n : { canvas: null };\n return (0, selection_1.select)(document.createElement('image', {}))\n .call(utils_1.applyStyle, defaults)\n .style('x', 0)\n .style('y', 0)\n .style('width', width)\n .style('height', height)\n .style('src', ctx.canvas.toDataURL())\n .style('transform', transform)\n .call(utils_1.applyStyle, style)\n .node();\n };\n};\nexports.Heatmap = Heatmap;\nexports.Heatmap.props = {\n defaultMarker: 'point',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=heatmap.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HeatmapRenderer = void 0;\nconst lru_1 = require(\"../../../utils/lru\");\nconst gradient_1 = require(\"./gradient\");\nfunction newCanvas(createCanvas, width, height) {\n const c = createCanvas ? createCanvas() : document.createElement('canvas');\n c.width = width;\n c.height = height;\n return c;\n}\n/**\n * Get a point with template.\n * @param radius\n * @param blurFactor\n * @returns\n */\nconst getPointTemplate = (0, lru_1.lru)((radius, blurFactor, createCanvas) => {\n const tplCanvas = newCanvas(createCanvas, radius * 2, radius * 2);\n const tplCtx = tplCanvas.getContext('2d');\n const x = radius;\n const y = radius;\n if (blurFactor === 1) {\n tplCtx.beginPath();\n tplCtx.arc(x, y, radius, 0, 2 * Math.PI, false);\n tplCtx.fillStyle = 'rgba(0,0,0,1)';\n tplCtx.fill();\n }\n else {\n const gradient = tplCtx.createRadialGradient(x, y, radius * blurFactor, x, y, radius);\n gradient.addColorStop(0, 'rgba(0,0,0,1)');\n gradient.addColorStop(1, 'rgba(0,0,0,0)');\n tplCtx.fillStyle = gradient;\n tplCtx.fillRect(0, 0, 2 * radius, 2 * radius);\n }\n return tplCanvas;\n}, (radius) => `${radius}`);\n/**\n * Get a color palette with len = 256 base on gradient.\n * @param gradientConfig\n * @returns\n */\nfunction getColorPalette(gradientConfig, createCanvas) {\n const paletteCanvas = newCanvas(createCanvas, 256, 1);\n const paletteCtx = paletteCanvas.getContext('2d');\n const gradient = paletteCtx.createLinearGradient(0, 0, 256, 1);\n (0, gradient_1.parseGradient)(gradientConfig).forEach(([r, c]) => {\n gradient.addColorStop(r, c);\n });\n paletteCtx.fillStyle = gradient;\n paletteCtx.fillRect(0, 0, 256, 1);\n return paletteCtx.getImageData(0, 0, 256, 1).data;\n}\n/**\n * Draw all circle with alpha.\n */\nfunction drawAlpha(shadowCtx, min, max, data, options, createCanvas) {\n const { blur } = options;\n let len = data.length;\n while (len--) {\n const { x, y, value: v, radius } = data[len];\n // Ff value is bigger than max, use max as value.\n const value = Math.min(v, max);\n const rectX = x - radius;\n const rectY = y - radius;\n const tpl = getPointTemplate(radius, 1 - blur, createCanvas);\n // Value from minimum / value range, => [0, 1].\n const templateAlpha = (value - min) / (max - min);\n // Small values are not visible because globalAlpha < .001 cannot be read from imageData.\n shadowCtx.globalAlpha = Math.max(templateAlpha, 0.001);\n shadowCtx.drawImage(tpl, rectX, rectY);\n }\n return shadowCtx;\n}\nfunction colorize(shadowCtx, maxWidth, maxHeight, palette, options) {\n const { minOpacity, opacity, maxOpacity, useGradientOpacity } = options;\n const x = 0;\n const y = 0;\n const width = maxWidth;\n const height = maxHeight;\n const img = shadowCtx.getImageData(x, y, width, height);\n const imgData = img.data;\n const len = imgData.length;\n for (let i = 3; i < len; i += 4) {\n const alpha = imgData[i];\n const offset = alpha * 4;\n if (!offset) {\n continue;\n }\n // Should be in [min, max], min >= 0.\n const finalAlpha = opacity || Math.max(0, Math.min(maxOpacity, Math.max(minOpacity, alpha)));\n // Update rgba.\n imgData[i - 3] = palette[offset];\n imgData[i - 2] = palette[offset + 1];\n imgData[i - 1] = palette[offset + 2];\n imgData[i] = useGradientOpacity ? palette[offset + 3] : finalAlpha;\n }\n return img;\n}\n/**\n * Render a heatmap with canvas.\n * See [heatmap.js](https://github.com/pa7/heatmap.js/blob/master/src/renderer/canvas2d.js).\n */\nfunction HeatmapRenderer(width, height, min, max, data, options, createCanvas) {\n const opts = Object.assign({ blur: 0.85, minOpacity: 0, opacity: 0.6, maxOpacity: 1, gradient: [\n [0.25, 'rgb(0,0,255)'],\n [0.55, 'rgb(0,255,0)'],\n [0.85, 'yellow'],\n [1.0, 'rgb(255,0,0)'],\n ] }, options);\n opts.minOpacity *= 255;\n opts.opacity *= 255;\n opts.maxOpacity *= 255;\n const shadowCanvas = newCanvas(createCanvas, width, height);\n const shadowCtx = shadowCanvas.getContext('2d');\n const palette = getColorPalette(opts.gradient, createCanvas);\n shadowCtx.clearRect(0, 0, width, height);\n drawAlpha(shadowCtx, min, max, data, opts, createCanvas);\n const img = colorize(shadowCtx, width, height, palette, opts);\n const canvas = newCanvas(createCanvas, width, height);\n const ctx = canvas.getContext('2d');\n ctx.putImageData(img, 0, 0);\n return ctx;\n}\nexports.HeatmapRenderer = HeatmapRenderer;\n//# sourceMappingURL=index.js.map","\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.lru = void 0;\nconst flru_1 = __importDefault(require(\"flru\"));\nconst cache = (0, flru_1.default)(3);\n/**\n * A decorator to return new function with LRU cache.\n */\nfunction lru(fn, keyFn = (...args) => `${args[0]}`, maxSize = 16) {\n const cache = (0, flru_1.default)(maxSize);\n return (...args) => {\n const key = keyFn(...args);\n let v = cache.get(key);\n if (cache.has(key))\n return cache.get(key);\n v = fn(...args);\n cache.set(key, v);\n return v;\n };\n}\nexports.lru = lru;\n//# sourceMappingURL=lru.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseGradient = void 0;\n/**\n * Parse heatmap gradient.\n */\nfunction parseGradient(gradient) {\n if (typeof gradient === 'string') {\n return gradient.split(' ').map((stop) => {\n const [r, c] = stop.split(':');\n return [+r, c];\n });\n }\n return gradient;\n}\nexports.parseGradient = parseGradient;\n//# sourceMappingURL=gradient.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Shape = void 0;\n/**\n * Draw a custom shape.\n */\nconst Shape = (options, context) => {\n const { render } = options, rest = __rest(options, [\"render\"]);\n return (points) => {\n const [[x0, y0]] = points;\n return render(Object.assign(Object.assign({}, rest), { x: x0, y: y0 }), context);\n };\n};\nexports.Shape = Shape;\nexports.Shape.props = {\n defaultMarker: 'point',\n defaultEnterAnimation: 'fadeIn',\n defaultUpdateAnimation: 'morphing',\n defaultExitAnimation: 'fadeOut',\n};\n//# sourceMappingURL=shape.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Liquid = void 0;\nconst util_1 = require(\"@antv/util\");\nconst wave_1 = require(\"./wave\");\nconst shapes_1 = require(\"./shapes\");\nconst getLiquidShape = (shape = 'circle') => shapes_1.LiquidShapesPath[shape] || shapes_1.LiquidShapesPath.circle;\nconst Liquid = (options, context) => {\n if (!context)\n return;\n const { coordinate } = context;\n const { liquidOptions, styleOptions } = options;\n const { liquidShape, percent } = liquidOptions;\n const { background: backgroundStyle, outline = {}, wave = {} } = styleOptions, attr = __rest(styleOptions, [\"background\", \"outline\", \"wave\"]);\n const { border = 2, distance = 0 } = outline, outlineStyle = __rest(outline, [\"border\", \"distance\"]);\n const { length = 192, count = 3 } = wave;\n return (points, cfg, defaultAttr) => {\n const { document } = context.canvas;\n const { color, fillOpacity } = defaultAttr;\n const attrs = Object.assign(Object.assign({ fill: color }, defaultAttr), attr);\n const g = document.createElement('g', {});\n // Center x/y.\n const [centerX, centerY] = coordinate.getCenter();\n // [width,height].\n const size = coordinate.getSize();\n const radius = Math.min(...size) / 2;\n // 1、Gets the path of the overall shape.\n const buildPath = (0, util_1.isFunction)(liquidShape)\n ? liquidShape\n : getLiquidShape(liquidShape);\n const shapePath = buildPath(centerX, centerY, radius, ...size);\n // 2、Background create.\n if (Object.keys(backgroundStyle).length) {\n const backgroundShape = document.createElement('path', {\n style: Object.assign({ d: shapePath, fill: '#fff' }, backgroundStyle),\n });\n g.appendChild(backgroundShape);\n }\n // Percent > 0 Mapping water waves.\n if (percent > 0) {\n // 3. Clip create.\n const clipShape = document.createElement('path', {\n style: {\n d: shapePath,\n },\n });\n g.appendChild(clipShape);\n g.style.clipPath = clipShape;\n // 4. Wave create.\n (0, wave_1.addWave)(centerX, centerY, 1 - percent, count, attrs, g, clipShape.getBBox().y, radius * 2, length, true, document);\n }\n // 5. Draw distance.\n const distanceShape = document.createElement('path', {\n style: {\n d: shapePath,\n fill: 'transparent',\n lineWidth: border + 2 * distance,\n stroke: '#fff',\n },\n });\n // 6. Draw border.\n const borderShape = document.createElement('path', {\n style: Object.assign(Object.assign(Object.assign({ d: shapePath, stroke: color, strokeOpacity: fillOpacity, lineWidth: border }, attrs), outlineStyle), { fill: 'transparent' }),\n });\n g.appendChild(distanceShape);\n g.appendChild(borderShape);\n return g;\n };\n};\nexports.Liquid = Liquid;\nexports.Liquid.props = {};\n//# sourceMappingURL=liquid.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.addWave = void 0;\nconst DURATION = 5000;\n/**\n * A function of linear mapping.\n * @param min\n * @param max\n * @param factor\n */\nfunction lerp(min, max, factor) {\n return min + (max - min) * factor;\n}\n/**\n * Using Bessel curve to simulate sine wave.\n * Using Bezier curves to fit sine wave.\n * There is 4 control points for each curve of wave,\n * which is at 1/4 wave length of the sine wave.\n *\n * The control points for a wave from (a) to (d) are a-b-c-d:\n * c *----* d\n * b *\n * |\n * ... a * ..................\n *\n * Whose positions are a: (0, 0), b: (0.5, 0.5), c: (1, 1), d: (PI / 2, 1).\n *\n * @param x x position of the left-most point (a).\n * @param stage 0-3, stating which part of the wave it is.\n * @param waveLength wave length of the sine wave.\n * @param amplitude wave amplitude.\n * @return Sinusoidal segment curve.\n */\nfunction getWaterWavePositions(x, stage, waveLength, amplitude) {\n if (stage === 0) {\n return [\n [x + ((1 / 2) * waveLength) / Math.PI / 2, amplitude / 2],\n [x + ((1 / 2) * waveLength) / Math.PI, amplitude],\n [x + waveLength / 4, amplitude],\n ];\n }\n if (stage === 1) {\n return [\n [x + (((1 / 2) * waveLength) / Math.PI / 2) * (Math.PI - 2), amplitude],\n [\n x + (((1 / 2) * waveLength) / Math.PI / 2) * (Math.PI - 1),\n amplitude / 2,\n ],\n [x + waveLength / 4, 0],\n ];\n }\n if (stage === 2) {\n return [\n [x + ((1 / 2) * waveLength) / Math.PI / 2, -amplitude / 2],\n [x + ((1 / 2) * waveLength) / Math.PI, -amplitude],\n [x + waveLength / 4, -amplitude],\n ];\n }\n return [\n [x + (((1 / 2) * waveLength) / Math.PI / 2) * (Math.PI - 2), -amplitude],\n [\n x + (((1 / 2) * waveLength) / Math.PI / 2) * (Math.PI - 1),\n -amplitude / 2,\n ],\n [x + waveLength / 4, 0],\n ];\n}\n/**\n * Get wave path.\n * @param radius\n * @param waterLevel water level\n * @param waveLength wave length\n * @param phase\n * @param amplitude\n * @param cx center x\n * @param cy center y\n * @return path path\n */\nfunction getWaterWavePath(radius, waterLevel, waveLength, phase, amplitude, cx, cy) {\n const curves = Math.ceil(((2 * radius) / waveLength) * 4) * 4;\n const path = [];\n let _phase = phase;\n // Map phase to [-Math.PI * 2, 0].\n while (_phase < -Math.PI * 2) {\n _phase += Math.PI * 2;\n }\n while (_phase > 0) {\n _phase -= Math.PI * 2;\n }\n _phase = (_phase / Math.PI / 2) * waveLength;\n const left = cx - radius + _phase - radius * 2;\n /**\n * Top-left corner as start point.\n *\n * Draws this point.\n * |\n * \\|/\n * ~~~~~~~~\n * | |\n * +------+\n */\n path.push(['M', left, waterLevel]);\n /**\n * Top wave.\n *\n * ~~~~~~~~ <- Draws this sine wave.\n * | |\n * +------+\n */\n let waveRight = 0;\n for (let c = 0; c < curves; ++c) {\n const stage = c % 4;\n const pos = getWaterWavePositions((c * waveLength) / 4, stage, waveLength, amplitude);\n path.push([\n 'C',\n pos[0][0] + left,\n -pos[0][1] + waterLevel,\n pos[1][0] + left,\n -pos[1][1] + waterLevel,\n pos[2][0] + left,\n -pos[2][1] + waterLevel,\n ]);\n if (c === curves - 1) {\n waveRight = pos[2][0];\n }\n }\n /**\n * Top-right corner.\n *\n * ~~~~~~~~\n * 3. Draws this line. -> | | <- 1. Draws this line.\n * +------+\n * ^\n * |\n * 2. Draws this line.\n */\n path.push(['L', waveRight + left, cy + radius]);\n path.push(['L', left, cy + radius]);\n path.push(['Z']);\n return path;\n}\n/**\n * Add wave.\n * @param x center x\n * @param y center y\n * @param level wave level 0~1\n * @param waveCount wave count\n * @param waveAttrs style\n * @param group g\n * @param minY Minimum height\n * @param radius radius\n * @param waveLength wave length\n * @param animation animation config\n * @param document\n */\nfunction addWave(x, y, level, waveCount, waveAttrs, group, minY, radius, waveLength, animation, document) {\n // Box property Color width height.\n const { fill, fillOpacity, opacity } = waveAttrs;\n // Number of cyclic waveCount.\n for (let idx = 0; idx < waveCount; idx++) {\n const factor = waveCount <= 1 ? 1 : idx / (waveCount - 1);\n const path = getWaterWavePath(radius, minY + radius * level, waveLength, 0, \n // Amplitude height.\n radius / 40, x, y);\n // Create wave path.\n const wave = document.createElement('path', {\n style: {\n d: path,\n fill,\n opacity: lerp(0.2, 0.9, factor) * Number(opacity || fillOpacity),\n },\n });\n group.appendChild(wave);\n try {\n if (animation === false)\n return;\n const keyframes = [\n {\n transform: 'translate(0, 0)',\n },\n {\n transform: `translate(${waveLength * 2}, 0)`,\n },\n ];\n wave.animate(keyframes, {\n duration: lerp(0.5 * DURATION, DURATION, factor) * 2,\n iterations: Infinity,\n });\n }\n catch (e) {\n console.warn('off-screen group animate error!');\n }\n }\n}\nexports.addWave = addWave;\n//# sourceMappingURL=wave.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LiquidShapesPath = void 0;\n/**\n * @param x center x\n * @param y center y\n * @param radius\n */\nfunction circle(x, y, r) {\n return `\n M ${x} ${y - r} \n a ${r} ${r} 0 1 0 0 ${r * 2}\n a ${r} ${r} 0 1 0 0 ${-r * 2}\n Z\n `;\n}\n/**\n * @param x center x\n * @param y center y\n * @param radius\n */\nfunction rect(x, y, r) {\n const GOLDEN_SECTION_RATIO = 0.618;\n const w = r * GOLDEN_SECTION_RATIO;\n return `\n M ${x - w} ${y - r}\n L ${x + w} ${y - r}\n L ${x + w} ${y + r}\n L ${x - w} ${y + r}\n Z\n `;\n}\n/**\n * @param x center x\n * @param y center y\n * @param radius\n */\nfunction diamond(x, y, r) {\n return `\n M ${x} ${y - r}\n L ${x + r} ${y}\n L ${x} ${y + r}\n L ${x - r} ${y}\n Z\n `;\n}\n/**\n * @param x center x\n * @param y center y\n * @param radius\n */\nfunction triangle(x, y, r) {\n return `\n M ${x} ${y - r}\n L ${x + r} ${y + r}\n L ${x - r} ${y + r}\n Z\n `;\n}\n/**\n * @param x center x\n * @param y center y\n * @param radius\n */\nfunction pin(x, y, radius) {\n const w = (radius * 4) / 3;\n const h = Math.max(w, radius * 2);\n const r = w / 2;\n // Attrs of the upper circle.\n const cx = x;\n const cy = r + y - h / 2;\n const theta = Math.asin(r / ((h - r) * 0.85));\n const dy = Math.sin(theta) * r;\n const dx = Math.cos(theta) * r;\n // The start point of the path.\n const x0 = cx - dx;\n const y0 = cy + dy;\n // Control point.\n const cpX = x;\n const cpY = cy + r / Math.sin(theta);\n return `\n M ${x0} ${y0}\n A ${r} ${r} 0 1 1 ${x0 + dx * 2} ${y0}\n Q ${cpX} ${cpY} ${x} ${y + h / 2}\n Q ${cpX} ${cpY} ${x0} ${y0}\n Z \n `;\n}\nexports.LiquidShapesPath = {\n pin,\n rect,\n circle,\n diamond,\n triangle,\n};\n//# sourceMappingURL=shapes.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Round = void 0;\nconst util_1 = require(\"@antv/util\");\n// Get point1 point2 radius.\nconst getR = (point1, point2) => {\n return (Math.sqrt(Math.pow(point1[0] - point2[0], 2) + Math.pow(point1[1] - point2[1], 2)) / 2);\n};\n// Gauge round.\nconst Round = (options, context) => {\n if (!context)\n return;\n const { coordinate } = context;\n if (!(coordinate === null || coordinate === void 0 ? void 0 : coordinate.getCenter))\n return;\n // Get coordinate center point.\n const center = coordinate.getCenter();\n return (points, cfg, defaultCfg) => {\n const { document } = context.canvas;\n const { color, index } = cfg;\n const g = document.createElement('g', {});\n const minR = getR(points[0], points[1]);\n const maxR = getR(points[0], center) * 2;\n /**\n * MinR small circle radius, maxR big circle radius.\n * Draw four arcs.\n * Style lineWidth and stroke for the time being inset.\n */\n const roundPath = document.createElement('path', {\n style: Object.assign(Object.assign(Object.assign({ d: [\n ['M', ...points[0]],\n ['A', minR, minR, 0, 1, 0, ...points[1]],\n ['A', maxR + minR * 2, maxR + minR * 2, 0, 0, 0, ...points[2]],\n ['A', minR, minR, 0, 1, index === 0 ? 0 : 1, ...points[3]],\n ['A', maxR, maxR, 0, 0, 1, ...points[0]],\n ['Z'],\n ] }, defaultCfg), (0, util_1.omit)(options, ['shape', 'last', 'first'])), { fill: color || defaultCfg.color }),\n });\n g.appendChild(roundPath);\n return g;\n };\n};\nexports.Round = Round;\n//# sourceMappingURL=round.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Rect = void 0;\nconst shape_1 = require(\"../shape\");\nconst transform_1 = require(\"../transform\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n rect: shape_1.RectShape,\n hollow: shape_1.RectHollow,\n};\nconst Rect = () => {\n return (index, scale, value, coordinate) => {\n const { x: X, x1: X1, y: Y, y1: Y1 } = value;\n const P = Array.from(index, (i) => {\n const p1 = [+X[i], +Y[i]];\n const p2 = [+X1[i], +Y[i]];\n const p3 = [+X1[i], +Y1[i]];\n const p4 = [+X[i], +Y1[i]];\n return [p1, p2, p3, p4].map((d) => coordinate.map(d));\n });\n return [index, P];\n };\n};\nexports.Rect = Rect;\nexports.Rect.props = {\n defaultShape: 'rect',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', required: true },\n { name: 'y', required: true },\n ],\n preInference: [...(0, utils_1.basePreInference)(), { type: transform_1.MaybeZeroY1 }],\n postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip1d)()],\n interaction: {\n shareTooltip: true,\n },\n};\n//# sourceMappingURL=rect.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Line = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst coordinate_1 = require(\"../utils/coordinate\");\nconst shape_1 = require(\"../shape\");\nconst transform_1 = require(\"../transform\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n line: shape_1.LineShape,\n smooth: shape_1.LineSmooth,\n hv: shape_1.LineHV,\n vh: shape_1.LineVH,\n hvh: shape_1.LineHVH,\n trail: shape_1.LineTrail,\n};\nconst line = (index, scale, value, coordinate) => {\n var _a, _b;\n const { series: S, x: X, y: Y } = value;\n const { x, y } = scale;\n // Because x and y channel is not strictly required in Line.props,\n // it should throw error with empty x or y channels.\n if (X === undefined || Y === undefined) {\n throw new Error('Missing encode for x or y channel.');\n }\n // Group data into series.\n // There is only one series without specified series encode.\n const series = S ? Array.from((0, d3_array_1.group)(index, (i) => S[i]).values()) : [index];\n const I = series.map((group) => group[0]).filter((i) => i !== undefined);\n // A group of data corresponds to one line.\n const xoffset = (((_a = x === null || x === void 0 ? void 0 : x.getBandWidth) === null || _a === void 0 ? void 0 : _a.call(x)) || 0) / 2;\n const yoffset = (((_b = y === null || y === void 0 ? void 0 : y.getBandWidth) === null || _b === void 0 ? void 0 : _b.call(y)) || 0) / 2;\n const P = Array.from(series, (I) => {\n return I.map((i) => coordinate.map([+X[i] + xoffset, +Y[i] + yoffset]));\n });\n return [I, P, series];\n};\nconst parallel = (index, scale, value, coordinate) => {\n // Extract all value for position[number] channels.\n const PV = Object.entries(value)\n .filter(([key]) => key.startsWith('position'))\n .map(([, value]) => value);\n // Because position channel is not strictly required in Line.props,\n // it should throw error with empty position values.\n if (PV.length === 0) {\n throw new Error('Missing encode for position channel.');\n }\n // Close the loop for radar(= parallel + polar) coordinate.\n if ((0, coordinate_1.isPolar)(coordinate))\n PV.push(PV[0]);\n // One data corresponds to one line.\n const P = Array.from(index, (i) => {\n // Transform high dimension vector to a list of two-dimension vectors.\n // [a, b, c] -> [d, e, f, g, h, i]\n const vector = PV.map((pv) => +pv[i]);\n const vectors = coordinate.map(vector);\n // Two-dimension vectors are stored in a flat array, so extract them.\n // [d, e, f, g, h, i] -> [d, e], [f, g], [h, i]\n const points = [];\n for (let i = 0; i < vectors.length; i += 2) {\n points.push([vectors[i], vectors[i + 1]]);\n }\n return points;\n });\n return [index, P];\n};\n/**\n * Convert value for each channel to line shapes.\n */\nconst Line = () => {\n return (index, scale, value, coordinate) => {\n const mark = (0, coordinate_1.isParallel)(coordinate) ? parallel : line;\n return mark(index, scale, value, coordinate);\n };\n};\nexports.Line = Line;\nexports.Line.props = {\n defaultShape: 'line',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }),\n { name: 'x' },\n { name: 'y' },\n { name: 'position', independent: true },\n { name: 'size' },\n { name: 'series', scale: 'band' },\n ],\n preInference: [\n ...(0, utils_1.basePreInference)(),\n // !!!Note This order is very important.\n { type: transform_1.MaybeGradient },\n { type: transform_1.MaybeSeries },\n ],\n postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip1d)(), ...(0, utils_1.tooltipXd)()],\n interaction: {\n shareTooltip: true,\n seriesTooltip: true,\n crosshairs: true,\n },\n};\n//# sourceMappingURL=line.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Point = void 0;\nconst shape_1 = require(\"../shape\");\nconst transform_1 = require(\"../transform\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n hollow: shape_1.PointHollow,\n hollowDiamond: shape_1.PointHollowDiamond,\n hollowHexagon: shape_1.PointHollowHexagon,\n hollowSquare: shape_1.PointHollowSquare,\n hollowTriangleDown: shape_1.PointHollowTriangleDown,\n hollowTriangle: shape_1.PointHollowTriangle,\n hollowBowtie: shape_1.PointHollowBowtie,\n hollowCircle: shape_1.PointHollowCircle,\n point: shape_1.PointShape,\n plus: shape_1.PointPlus,\n diamond: shape_1.PointDiamond,\n square: shape_1.PointSquare,\n triangle: shape_1.PointTriangle,\n hexagon: shape_1.PointHexagon,\n cross: shape_1.PointCross,\n bowtie: shape_1.PointBowtie,\n hyphen: shape_1.PointHyphen,\n line: shape_1.PointLine,\n tick: shape_1.PointTick,\n triangleDown: shape_1.PointTriangleDown,\n circle: shape_1.PointCircle,\n};\n/**\n * Convert value for each channel to point shapes.\n * Calc the bbox of each point based on x, y and r.\n * This is for allowing their radius can be affected by coordinate(e.g. fisheye).\n */\nconst Point = (options) => {\n return (index, scale, value, coordinate) => {\n const { x: X, y: Y, x1: X1, y1: Y1, size: S, dx: DX, dy: DY } = value;\n const [width, height] = coordinate.getSize();\n const offset = (0, utils_1.createBandOffset)(scale, value, options);\n const xy = (i) => {\n const dx = +((DX === null || DX === void 0 ? void 0 : DX[i]) || 0);\n const dy = +((DY === null || DY === void 0 ? void 0 : DY[i]) || 0);\n const x = X1 ? (+X[i] + +X1[i]) / 2 : +X[i];\n const y = Y1 ? (+Y[i] + +Y1[i]) / 2 : +Y[i];\n const cx = x + dx;\n const cy = y + dy;\n return [cx, cy];\n };\n const P = S\n ? Array.from(index, (i) => {\n const [cx, cy] = xy(i);\n const r = +S[i];\n const a = r / width;\n const b = r / height;\n const p1 = [cx - a, cy - b];\n const p2 = [cx + a, cy + b];\n return [\n coordinate.map(offset(p1, i)),\n coordinate.map(offset(p2, i)),\n ];\n })\n : Array.from(index, (i) => [coordinate.map(offset(xy(i), i))]);\n return [index, P];\n };\n};\nexports.Point = Point;\nexports.Point.props = {\n defaultShape: 'hollow',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', required: true },\n { name: 'y', required: true },\n { name: 'series', scale: 'band' },\n { name: 'size', quantitative: 'sqrt' },\n { name: 'dx', scale: 'identity' },\n { name: 'dy', scale: 'identity' },\n ],\n preInference: [\n ...(0, utils_1.basePreInference)(),\n { type: transform_1.MaybeZeroX },\n { type: transform_1.MaybeZeroY },\n ],\n postInference: [...(0, utils_1.basePostInference)(), { type: transform_1.MaybeSize }, ...(0, utils_1.tooltip2d)()],\n};\n//# sourceMappingURL=point.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Text = void 0;\nconst shape_1 = require(\"../shape\");\nconst transform_1 = require(\"../transform\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n text: shape_1.TextShape,\n badge: shape_1.TextBadge,\n tag: shape_1.TextTag,\n};\nconst Text = (options) => {\n const { cartesian = false } = options;\n if (cartesian)\n return utils_1.visualMark;\n return ((index, scale, value, coordinate) => {\n const { x: X, y: Y } = value;\n const offset = (0, utils_1.createBandOffset)(scale, value, options);\n const P = Array.from(index, (i) => {\n const p = [+X[i], +Y[i]];\n return [coordinate.map(offset(p, i))];\n });\n return [index, P];\n });\n};\nexports.Text = Text;\nexports.Text.props = {\n defaultShape: 'text',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', required: true },\n { name: 'y', required: true },\n { name: 'text', scale: 'identity' },\n { name: 'fontSize', scale: 'identity' },\n { name: 'rotate', scale: 'identity' },\n ],\n preInference: [\n ...(0, utils_1.basePreInference)(),\n { type: transform_1.MaybeTuple },\n { type: transform_1.MaybeVisualPosition },\n ],\n postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip2d)()],\n};\n//# sourceMappingURL=text.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Cell = void 0;\nconst shape_1 = require(\"../shape\");\nconst transform_1 = require(\"../transform\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n cell: shape_1.CellShape,\n hollow: shape_1.CellHollow,\n};\n/**\n * Convert value for each channel to Cell shapes.\n * Calc the bbox of each Cell based on x, y and r.\n * This is for allowing their radius can be affected by coordinate(e.g. fisheye).\n */\nconst Cell = () => {\n return (index, scale, value, coordinate) => {\n const { x: X, y: Y } = value;\n const x = scale.x;\n const y = scale.y;\n const P = Array.from(index, (i) => {\n const width = x.getBandWidth(x.invert(+X[i]));\n const height = y.getBandWidth(y.invert(+Y[i]));\n const x1 = +X[i];\n const y1 = +Y[i];\n const p1 = [x1, y1];\n const p2 = [x1 + width, y1];\n const p3 = [x1 + width, y1 + height];\n const p4 = [x1, y1 + height];\n return [p1, p2, p3, p4].map((d) => coordinate.map(d));\n });\n return [index, P];\n };\n};\nexports.Cell = Cell;\nexports.Cell.props = {\n defaultShape: 'cell',\n defaultLabelShape: 'label',\n shape,\n composite: false,\n channels: [\n ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', required: true, scale: 'band' },\n { name: 'y', required: true, scale: 'band' },\n ],\n preInference: [\n ...(0, utils_1.basePreInference)(),\n { type: transform_1.MaybeZeroX },\n { type: transform_1.MaybeZeroY },\n { type: transform_1.MaybeZeroPadding },\n ],\n postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip2d)()],\n};\n//# sourceMappingURL=cell.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Area = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst shape_1 = require(\"../shape\");\nconst transform_1 = require(\"../transform\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n area: shape_1.AreaShape,\n smooth: shape_1.AreaSmooth,\n hvh: shape_1.AreaHVH,\n vh: shape_1.AreaVH,\n hv: shape_1.AreaHV,\n};\n/*\n * Convert value for each channel to area shapes.\n *\n * ▲\n * │\n * │ y2\n * │\n * │ y1 xxxxxxxxxxxxx\n * │ xxxx x\n * │ xxx x\n * │ xxx x\n * │ y0 xxx x\n * │ xxxxxxx x\n * │ x x\n * │ xx x\n * │ x x\n * │ x x\n * │ x x\n * │ x x\n * │ x x\n * │ x x\n * │ x x\n * ────┼─────────x───────────────────────────────x──────────────►\n * │ y3 y4 y5\n */\nconst Area = () => {\n return (index, scale, value, coordinate) => {\n var _a, _b;\n const { x: X, y: Y, y1: Y1, series: S } = value;\n const { x, y } = scale;\n // Group data by series field.\n const series = S ? Array.from((0, d3_array_1.group)(index, (i) => S[i]).values()) : [index];\n const I = series.map((group) => group[0]).filter((i) => i !== undefined);\n // A group of data corresponds to one area.\n const xoffset = (((_a = x === null || x === void 0 ? void 0 : x.getBandWidth) === null || _a === void 0 ? void 0 : _a.call(x)) || 0) / 2;\n const yoffset = (((_b = y === null || y === void 0 ? void 0 : y.getBandWidth) === null || _b === void 0 ? void 0 : _b.call(y)) || 0) / 2;\n const P = Array.from(series, (SI) => {\n const l = SI.length;\n const points = new Array(l * 2);\n for (let idx = 0; idx < SI.length; idx++) {\n const i = SI[idx];\n points[idx] = coordinate.map([+X[i] + xoffset, +Y[i] + yoffset]); // y1\n points[l + idx] = coordinate.map([+X[i] + xoffset, +Y1[i] + yoffset]); // y0\n }\n return points;\n });\n return [I, P, series];\n };\n};\nexports.Area = Area;\nexports.Area.props = {\n defaultShape: 'area',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', required: true },\n { name: 'y', required: true },\n { name: 'size' },\n { name: 'series', scale: 'band' },\n ],\n preInference: [\n ...(0, utils_1.basePreInference)(),\n { type: transform_1.MaybeSeries },\n { type: transform_1.MaybeZeroY1 },\n { type: transform_1.MaybeZeroPadding },\n ],\n postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip1d)()],\n interaction: {\n shareTooltip: true,\n seriesTooltip: true,\n crosshairs: true,\n },\n};\n//# sourceMappingURL=area.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Link = void 0;\nconst transform_1 = require(\"../transform\");\nconst shape_1 = require(\"../shape\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n link: shape_1.LinkShape,\n arc: shape_1.LinkArc,\n smooth: shape_1.LinkSmooth,\n vhv: shape_1.LinkVHV,\n};\n/**\n * Connect `start` to `end` with single line.\n */\nconst Link = (options) => {\n return (index, scale, value, coordinate) => {\n const { x: X, y: Y, x1: X1 = X, y1: Y1 = Y } = value;\n const offset = (0, utils_1.createBandOffset)(scale, value, options);\n const P = index.map((i) => [\n coordinate.map(offset([+X[i], +Y[i]], i)),\n coordinate.map(offset([+X1[i], +Y1[i]], i)),\n ]);\n return [index, P];\n };\n};\nexports.Link = Link;\nexports.Link.props = {\n defaultShape: 'link',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', required: true },\n { name: 'y', required: true },\n ],\n preInference: [\n ...(0, utils_1.basePreInference)(),\n { type: transform_1.MaybeIdentityY },\n { type: transform_1.MaybeIdentityX },\n ],\n postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip2d)()],\n};\n//# sourceMappingURL=link.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Image = void 0;\nconst transform_1 = require(\"../transform\");\nconst shape_1 = require(\"../shape\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n image: shape_1.ImageShape,\n};\nconst Image = (options) => {\n const { cartesian } = options;\n if (cartesian)\n return utils_1.visualMark;\n return (index, scale, value, coordinate) => {\n const { x: X, y: Y } = value;\n const offset = (0, utils_1.createBandOffset)(scale, value, options);\n const P = Array.from(index, (i) => {\n const p = [+X[i], +Y[i]];\n return [coordinate.map(offset(p, i))];\n });\n return [index, P];\n };\n};\nexports.Image = Image;\nexports.Image.props = {\n defaultShape: 'image',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', required: true },\n { name: 'y', required: true },\n { name: 'src', scale: 'identity' },\n { name: 'size' },\n ],\n preInference: [\n ...(0, utils_1.basePreInference)(),\n { type: transform_1.MaybeTuple },\n { type: transform_1.MaybeVisualPosition },\n ],\n postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip2d)()],\n};\n//# sourceMappingURL=image.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Polygon = void 0;\nconst shape_1 = require(\"../shape\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n polygon: shape_1.PolygonShape,\n ribbon: shape_1.PolygonRibbon,\n};\n/**\n * Convert value for each channel to polygon shapes.\n */\nconst Polygon = () => {\n return (index, scale, value, coordinate) => {\n const Xn = Object.entries(value)\n .filter(([key]) => key.startsWith('x'))\n .map(([, value]) => value);\n const Yn = Object.entries(value)\n .filter(([key]) => key.startsWith('y'))\n .map(([, value]) => value);\n const P = index.map((i) => {\n const Pn = [];\n for (let j = 0; j < Xn.length; j++) {\n const x = Xn[j][i];\n if (x === undefined)\n break;\n const y = Yn[j][i];\n Pn.push(coordinate.map([+x, +y]));\n }\n return Pn;\n });\n return [index, P];\n };\n};\nexports.Polygon = Polygon;\nexports.Polygon.props = {\n defaultShape: 'polygon',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', required: true },\n { name: 'y', required: true },\n ],\n preInference: [...(0, utils_1.basePreInference)()],\n postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip2d)()],\n};\n//# sourceMappingURL=polygon.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Box = void 0;\nconst shape_1 = require(\"../shape\");\nconst transform_1 = require(\"../transform\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n box: shape_1.BoxShape,\n violin: shape_1.BoxViolin,\n};\n/**\n * Convert value for each channel to box shapes.\n *\n * p0 p2 p1\n * ──────────┬──────────\n * │\n * │\n * │\n * │\n * │\n * │\n * │ p3\n * p4 ┌─────────┴──────────┐ p5\n * │ │\n * │ │\n * p8 ├────────────────────┤ p9\n * │ │\n * │ p10 │\n * p7 └─────────┬──────────┘ p6\n * │\n * │\n * │\n * │\n * │\n * │\n * │\n * │\n * ───────────┴───────────\n * p12 p11 p13\n */\nconst Box = () => {\n return (index, scale, value, coordinate) => {\n const { x: X, y: Y, y1: Y1, y2: Y2, y3: Y3, y4: Y4, series: S } = value;\n // Calc width for each box.\n // The scales for x and series channels must be band scale.\n const xScale = scale.x;\n const series = scale.series;\n const P = Array.from(index, (i) => {\n const groupWidth = xScale.getBandWidth(xScale.invert(+X[i]));\n const ratio = series ? series.getBandWidth(series.invert(+(S === null || S === void 0 ? void 0 : S[i]))) : 1;\n const width = groupWidth * ratio;\n const offset = (+(S === null || S === void 0 ? void 0 : S[i]) || 0) * groupWidth;\n const x = +X[i] + offset + width / 2;\n const [low, q1, median, q3, high] = [\n +Y[i],\n +Y1[i],\n +Y2[i],\n +Y3[i],\n +Y4[i],\n ];\n const P13 = [\n [x - width / 2, high],\n [x + width / 2, high],\n [x, high],\n [x, q3],\n [x - width / 2, q3],\n [x + width / 2, q3],\n [x + width / 2, q1],\n [x - width / 2, q1],\n [x - width / 2, median],\n [x + width / 2, median],\n [x, q1],\n [x, low],\n [x - width / 2, low],\n [x + width / 2, low],\n ];\n return P13.map((d) => coordinate.map(d));\n });\n return [index, P];\n };\n};\nexports.Box = Box;\nexports.Box.props = {\n defaultShape: 'box',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', scale: 'band', required: true },\n { name: 'y', required: true },\n { name: 'series', scale: 'band' },\n ],\n preInference: [...(0, utils_1.basePreInference)(), { type: transform_1.MaybeZeroX }],\n postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip1d)()],\n interaction: {\n shareTooltip: true,\n },\n};\n//# sourceMappingURL=box.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Vector = void 0;\nconst shape_1 = require(\"../shape\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n vector: shape_1.VectorShape,\n};\n/**\n * Convert value for each channel to start, end.\n * The angle starts from the X axis(right direction).\n */\nconst Vector = () => {\n return (index, scale, value, coordinate) => {\n const { x: X, y: Y, size: S, rotate: R } = value;\n const [width, height] = coordinate.getSize();\n const P = index.map((i) => {\n const angle = (+R[i] / 180) * Math.PI;\n const s = +S[i];\n const a = s / width;\n const b = s / height;\n const vx = a * Math.cos(angle);\n const vy = -b * Math.sin(angle);\n return [\n coordinate.map([+X[i] - vx / 2, +Y[i] - vy / 2]),\n coordinate.map([+X[i] + vx / 2, +Y[i] + vy / 2]),\n ];\n });\n return [index, P];\n };\n};\nexports.Vector = Vector;\nexports.Vector.props = {\n defaultShape: 'vector',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', required: true },\n { name: 'y', required: true },\n { name: 'rotate', required: true, scale: 'identity' },\n { name: 'size', required: true },\n ],\n preInference: [...(0, utils_1.basePreInference)()],\n postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip2d)()],\n};\n//# sourceMappingURL=vector.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LineY = void 0;\nconst util_1 = require(\"@antv/util\");\nconst shape_1 = require(\"../shape\");\nconst transform_1 = require(\"../transform\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n line: shape_1.LineXY,\n};\nconst LineY = (options) => {\n return (index, scale, value, coordinate) => {\n const { y: Y } = value;\n const offset = (0, utils_1.createBandOffset)(scale, value, (0, util_1.deepMix)({ style: { bandOffset: 0 } }, options));\n const P = Array.from(index, (i) => {\n const p1 = [0, Y[i]];\n const p2 = [1, Y[i]];\n return [p1, p2].map((d) => coordinate.map(offset(d, i)));\n });\n return [index, P];\n };\n};\nexports.LineY = LineY;\nexports.LineY.props = {\n defaultShape: 'line',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseAnnotationChannels)({ shapes: Object.keys(shape) }),\n { name: 'y', required: true },\n ],\n preInference: [...(0, utils_1.basePreInference)(), { type: transform_1.MaybeTupleY }],\n postInference: [...(0, utils_1.basePostInference)()],\n};\n//# sourceMappingURL=lineY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LineX = void 0;\nconst util_1 = require(\"@antv/util\");\nconst shape_1 = require(\"../shape\");\nconst transform_1 = require(\"../transform\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n line: shape_1.LineXY,\n};\nconst LineX = (options) => {\n return (index, scale, value, coordinate) => {\n const { x: X } = value;\n const offset = (0, utils_1.createBandOffset)(scale, value, (0, util_1.deepMix)({ style: { bandOffset: 0 } }, options));\n const P = Array.from(index, (i) => {\n const p1 = [X[i], 1];\n const p2 = [X[i], 0];\n return [p1, p2].map((d) => coordinate.map(offset(d, i)));\n });\n return [index, P];\n };\n};\nexports.LineX = LineX;\nexports.LineX.props = {\n defaultShape: 'line',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseAnnotationChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', required: true },\n ],\n preInference: [...(0, utils_1.basePreInference)(), { type: transform_1.MaybeTupleX }],\n postInference: [...(0, utils_1.basePostInference)()],\n};\n//# sourceMappingURL=lineX.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Connector = void 0;\nconst shape_1 = require(\"../shape\");\nconst utils_1 = require(\"./utils\");\nconst link_1 = require(\"./link\");\nconst shape = {\n connector: shape_1.ConnectorShape,\n};\nconst Connector = (...args) => {\n return (0, link_1.Link)(...args);\n};\nexports.Connector = Connector;\nexports.Connector.props = {\n defaultShape: 'connector',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseAnnotationChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', required: true },\n { name: 'y', required: true },\n ],\n preInference: [...(0, utils_1.basePreInference)()],\n postInference: [...(0, utils_1.basePostInference)()],\n};\n//# sourceMappingURL=connector.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Range = exports.AbstractRange = void 0;\nconst shape_1 = require(\"../shape\");\nconst utils_1 = require(\"./utils\");\nfunction extend(channel, extended, value, scale) {\n if (extended)\n return () => [0, 1];\n const { [channel]: C, [`${channel}1`]: C1 } = value;\n return (i) => {\n var _a;\n const offset = ((_a = scale.getBandWidth) === null || _a === void 0 ? void 0 : _a.call(scale, scale.invert(+C1[i]))) || 0;\n return [C[i], C1[i] + offset];\n };\n}\nfunction AbstractRange(options = {}) {\n const { extendX = false, extendY = false } = options;\n return (index, scale, value, coordinate) => {\n const x = extend('x', extendX, value, scale.x);\n const y = extend('y', extendY, value, scale.y);\n const P = Array.from(index, (i) => {\n const [x1, x2] = x(i);\n const [y1, y2] = y(i);\n const p1 = [x1, y1];\n const p2 = [x2, y1];\n const p3 = [x2, y2];\n const p4 = [x1, y2];\n return [p1, p2, p3, p4].map((d) => coordinate.map(d));\n });\n return [index, P];\n };\n}\nexports.AbstractRange = AbstractRange;\nconst shape = { range: shape_1.RangeShape };\nconst Range = () => {\n return AbstractRange();\n};\nexports.Range = Range;\nexports.Range.props = {\n defaultShape: 'range',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseAnnotationChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', required: true },\n { name: 'y', required: true },\n ],\n preInference: [...(0, utils_1.basePreInference)()],\n postInference: [...(0, utils_1.basePostInference)()],\n};\n//# sourceMappingURL=range.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RangeX = void 0;\nconst shape_1 = require(\"../shape\");\nconst transform_1 = require(\"../transform\");\nconst utils_1 = require(\"./utils\");\nconst range_1 = require(\"./range\");\nconst shape = {\n range: shape_1.RangeShape,\n};\nconst RangeX = () => {\n return (0, range_1.AbstractRange)({ extendY: true });\n};\nexports.RangeX = RangeX;\nexports.RangeX.props = {\n defaultShape: 'range',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseAnnotationChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', required: true },\n ],\n preInference: [...(0, utils_1.basePreInference)(), { type: transform_1.MaybeDefaultX }],\n postInference: [...(0, utils_1.basePostInference)()],\n};\n//# sourceMappingURL=rangeX.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RangeY = void 0;\nconst shape_1 = require(\"../shape\");\nconst transform_1 = require(\"../transform\");\nconst utils_1 = require(\"./utils\");\nconst range_1 = require(\"./range\");\nconst shape = {\n range: shape_1.RangeShape,\n};\nconst RangeY = () => {\n return (0, range_1.AbstractRange)({ extendX: true });\n};\nexports.RangeY = RangeY;\nexports.RangeY.props = {\n defaultShape: 'range',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseAnnotationChannels)({ shapes: Object.keys(shape) }),\n { name: 'y', required: true },\n ],\n preInference: [...(0, utils_1.basePreInference)(), { type: transform_1.MaybeDefaultY }],\n postInference: [...(0, utils_1.basePostInference)()],\n};\n//# sourceMappingURL=rangeY.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Sankey = void 0;\nconst util_1 = require(\"@antv/util\");\nconst sankey_1 = require(\"../data/sankey\");\nconst helper_1 = require(\"../utils/helper\");\nconst mark_1 = require(\"../utils/mark\");\nconst utils_1 = require(\"./utils\");\nconst DEFAULT_LAYOUT_OPTIONS = {\n nodeId: (d) => d.key,\n nodeWidth: 0.02,\n nodePadding: 0.02,\n};\nconst DEFAULT_NODE_OPTIONS = {\n type: 'polygon',\n axis: false,\n legend: false,\n encode: {\n shape: 'polygon',\n x: 'x',\n y: 'y',\n },\n scale: {\n x: { type: 'identity' },\n y: { type: 'identity' },\n },\n style: {\n stroke: '#000',\n },\n};\nconst DEFAULT_LINK_OPTIONS = {\n type: 'polygon',\n axis: false,\n legend: false,\n encode: {\n shape: 'ribbon',\n x: 'x',\n y: 'y',\n },\n style: {\n fillOpacity: 0.5,\n stroke: undefined,\n },\n};\nconst DEFAULT_LABEL_OPTIONS = {\n textAlign: (d) => (d.x[0] < 0.5 ? 'start' : 'end'),\n position: (d) => (d.x[0] < 0.5 ? 'right' : 'left'),\n fontSize: 10,\n};\n/**\n * @todo Add interaction\n * @todo Add source-link color mode\n */\nconst Sankey = (options) => {\n const { data, encode = {}, scale, style = {}, layout = {}, nodeLabels = [], linkLabels = [], animate = {}, tooltip = {}, interaction, } = options;\n // Initialize data, generating nodes by link if is not specified.\n const { links, nodes } = (0, utils_1.initializeData)(data, encode);\n // Extract encode for node and link.\n const nodeEncode = (0, helper_1.subObject)(encode, 'node');\n const linkEncode = (0, helper_1.subObject)(encode, 'link');\n const { key: nodeKey = (d) => d.key, color = nodeKey } = nodeEncode;\n // Transform data, using nodeKey as nodeId.\n const { links: linkData, nodes: nodeData } = (0, sankey_1.Sankey)(Object.assign(Object.assign(Object.assign({}, DEFAULT_LAYOUT_OPTIONS), { nodeId: (0, utils_1.field)(nodeKey) }), layout))({ links, nodes });\n // Extract label style and apply defaults.\n const _a = (0, helper_1.subObject)(style, 'label'), { text = nodeKey, spacing = 5 } = _a, labelStyle = __rest(_a, [\"text\", \"spacing\"]);\n const key1 = (0, utils_1.field)(nodeKey);\n const nodeTooltip = (0, mark_1.subTooltip)(tooltip, 'node', {\n title: key1,\n items: [{ field: 'value' }],\n }, true);\n const linkTooltip = (0, mark_1.subTooltip)(tooltip, 'link', {\n title: '',\n items: [\n (d) => ({ name: 'source', value: key1(d.source) }),\n (d) => ({ name: 'target', value: key1(d.target) }),\n ],\n });\n return [\n (0, util_1.deepMix)({}, DEFAULT_NODE_OPTIONS, {\n data: nodeData,\n encode: Object.assign(Object.assign({}, nodeEncode), { color }),\n scale,\n style: (0, helper_1.subObject)(style, 'node'),\n labels: [\n Object.assign(Object.assign(Object.assign({}, DEFAULT_LABEL_OPTIONS), { text, dx: (d) => (d.x[0] < 0.5 ? spacing : -spacing) }), labelStyle),\n ...nodeLabels,\n ],\n tooltip: nodeTooltip,\n animate: (0, mark_1.maybeAnimation)(animate, 'node'),\n axis: false,\n interaction,\n }),\n (0, util_1.deepMix)({}, DEFAULT_LINK_OPTIONS, {\n data: linkData,\n encode: linkEncode,\n labels: linkLabels,\n style: Object.assign({ fill: linkEncode.color ? undefined : '#aaa', lineWidth: 0 }, (0, helper_1.subObject)(style, 'link')),\n tooltip: linkTooltip,\n animate: (0, mark_1.maybeAnimation)(animate, 'link'),\n interaction,\n }),\n ];\n};\nexports.Sankey = Sankey;\nexports.Sankey.props = {};\n//# sourceMappingURL=sankey.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Sankey = void 0;\nconst d3_sankey_1 = require(\"./utils/d3-sankey\");\nconst DEFAULT_OPTIONS = {\n nodeAlign: 'justify',\n nodeWidth: 0.008,\n nodePadding: 0.03,\n nodes: (graph) => graph.nodes,\n links: (graph) => graph.links,\n nodeSort: undefined,\n linkSort: undefined,\n iterations: 6,\n};\nconst ALIGN_METHOD = {\n left: d3_sankey_1.left,\n right: d3_sankey_1.right,\n center: d3_sankey_1.center,\n justify: d3_sankey_1.justify,\n};\nfunction getNodeAlignFunction(nodeAlign) {\n const type = typeof nodeAlign;\n if (type === 'string')\n return ALIGN_METHOD[nodeAlign] || d3_sankey_1.justify;\n if (type === 'function')\n return nodeAlign;\n return d3_sankey_1.justify;\n}\n/**\n * Compute the node and edge position, return a graph representing the Sankey layout. All will be normalized to [[0, 0], [1, 1]]\n * Required graph data (nodes, edges)\n */\nconst Sankey = (options) => {\n return (data) => {\n const { nodeId, nodeSort, nodeAlign, nodeWidth, nodePadding, nodeDepth, nodes: nodeNodes, links: nodeLinks, linkSort, iterations, } = Object.assign({}, DEFAULT_OPTIONS, options);\n const sankeyProcessor = (0, d3_sankey_1.sankey)()\n .nodeSort(nodeSort)\n .linkSort(linkSort)\n .links(nodeLinks)\n .nodes(nodeNodes)\n .nodeWidth(nodeWidth)\n .nodePadding(nodePadding)\n .nodeDepth(nodeDepth)\n .nodeAlign(getNodeAlignFunction(nodeAlign))\n .iterations(iterations)\n .extent([\n [0, 0],\n [1, 1],\n ]);\n if (typeof nodeId === 'function') {\n sankeyProcessor.nodeId(nodeId);\n }\n const layoutData = sankeyProcessor(data);\n const { nodes: N, links: L } = layoutData;\n const nodes = N.map((node) => {\n const { x0, x1, y0, y1 } = node;\n /* points\n * 3---2\n * | |\n * 0---1\n */\n return Object.assign(Object.assign({}, node), { x: [x0, x1, x1, x0], y: [y0, y0, y1, y1] });\n });\n const links = L.map((edge) => {\n const { source, target } = edge;\n const sx = source.x1;\n const tx = target.x0;\n const offset = edge.width / 2;\n return Object.assign(Object.assign({}, edge), { x: [sx, sx, tx, tx], y: [\n edge.y0 + offset,\n edge.y0 - offset,\n edge.y1 + offset,\n edge.y1 - offset,\n ] });\n });\n return { nodes, links };\n };\n};\nexports.Sankey = Sankey;\nexports.Sankey.props = {};\n//# sourceMappingURL=sankey.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sankey = exports.justify = exports.right = exports.left = exports.center = void 0;\n/**\n * Sankey layout, fork from https://github.com/d3/d3-sankey/tree/master/src (todo, optimize algorithm)\n *\n * Major changes:\n *\n * 1. modify some set and map traverse\n * 2. fix some error caused by [empty] array\n * 3. support `nodeDepth` through align method\n */\nconst sankey_1 = require(\"./sankey\");\nObject.defineProperty(exports, \"sankey\", { enumerable: true, get: function () { return sankey_1.Sankey; } });\nvar align_1 = require(\"./align\");\nObject.defineProperty(exports, \"center\", { enumerable: true, get: function () { return align_1.center; } });\nObject.defineProperty(exports, \"left\", { enumerable: true, get: function () { return align_1.left; } });\nObject.defineProperty(exports, \"right\", { enumerable: true, get: function () { return align_1.right; } });\nObject.defineProperty(exports, \"justify\", { enumerable: true, get: function () { return align_1.justify; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Sankey = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst align_1 = require(\"./align\");\nconst constant_1 = require(\"./constant\");\nfunction ascendingSourceBreadth(a, b) {\n return ascendingBreadth(a.source, b.source) || a.index - b.index;\n}\nfunction ascendingTargetBreadth(a, b) {\n return ascendingBreadth(a.target, b.target) || a.index - b.index;\n}\nfunction ascendingBreadth(a, b) {\n return a.y0 - b.y0;\n}\nfunction value(d) {\n return d.value;\n}\nfunction defaultId(d) {\n return d.index;\n}\nfunction defaultNodes(graph) {\n return graph.nodes;\n}\nfunction defaultLinks(graph) {\n return graph.links;\n}\nfunction find(nodeById, id) {\n const node = nodeById.get(id);\n if (!node)\n throw new Error('missing: ' + id);\n return node;\n}\nfunction computeLinkBreadths({ nodes }) {\n for (const node of nodes) {\n let y0 = node.y0;\n let y1 = y0;\n for (const link of node.sourceLinks) {\n link.y0 = y0 + link.width / 2;\n y0 += link.width;\n }\n for (const link of node.targetLinks) {\n link.y1 = y1 + link.width / 2;\n y1 += link.width;\n }\n }\n}\nfunction Sankey() {\n let x0 = 0, y0 = 0, x1 = 1, y1 = 1; // extent\n let dx = 24; // nodeWidth\n let dy = 8, py; // nodePadding\n let id = defaultId;\n let align = align_1.justify;\n let depth;\n let sort;\n let linkSort;\n let nodes = defaultNodes;\n let links = defaultLinks;\n let iterations = 6;\n function sankey(arg) {\n const graph = {\n nodes: nodes(arg),\n links: links(arg),\n };\n computeNodeLinks(graph);\n computeNodeValues(graph);\n computeNodeDepths(graph);\n computeNodeHeights(graph);\n computeNodeBreadths(graph);\n computeLinkBreadths(graph);\n return graph;\n }\n sankey.update = function (graph) {\n computeLinkBreadths(graph);\n return graph;\n };\n sankey.nodeId = function (_) {\n return arguments.length\n ? ((id = typeof _ === 'function' ? _ : (0, constant_1.constant)(_)), sankey)\n : id;\n };\n sankey.nodeAlign = function (_) {\n return arguments.length\n ? ((align = typeof _ === 'function' ? _ : (0, constant_1.constant)(_)), sankey)\n : align;\n };\n sankey.nodeDepth = function (_) {\n return arguments.length\n ? ((depth = typeof _ === 'function' ? _ : _), sankey)\n : depth;\n };\n sankey.nodeSort = function (_) {\n return arguments.length ? ((sort = _), sankey) : sort;\n };\n sankey.nodeWidth = function (_) {\n return arguments.length ? ((dx = +_), sankey) : dx;\n };\n sankey.nodePadding = function (_) {\n return arguments.length ? ((dy = py = +_), sankey) : dy;\n };\n sankey.nodes = function (_) {\n return arguments.length\n ? ((nodes = typeof _ === 'function' ? _ : (0, constant_1.constant)(_)), sankey)\n : nodes;\n };\n sankey.links = function (_) {\n return arguments.length\n ? ((links = typeof _ === 'function' ? _ : (0, constant_1.constant)(_)), sankey)\n : links;\n };\n sankey.linkSort = function (_) {\n return arguments.length ? ((linkSort = _), sankey) : linkSort;\n };\n sankey.size = function (_) {\n return arguments.length\n ? ((x0 = y0 = 0), (x1 = +_[0]), (y1 = +_[1]), sankey)\n : [x1 - x0, y1 - y0];\n };\n sankey.extent = function (_) {\n return arguments.length\n ? ((x0 = +_[0][0]),\n (x1 = +_[1][0]),\n (y0 = +_[0][1]),\n (y1 = +_[1][1]),\n sankey)\n : [\n [x0, y0],\n [x1, y1],\n ];\n };\n sankey.iterations = function (_) {\n return arguments.length ? ((iterations = +_), sankey) : iterations;\n };\n function computeNodeLinks({ nodes, links }) {\n nodes.forEach((node, idx) => {\n node.index = idx;\n node.sourceLinks = [];\n node.targetLinks = [];\n });\n const nodeById = new Map(nodes.map((d) => [id(d), d]));\n links.forEach((link, idx) => {\n link.index = idx;\n let { source, target } = link;\n if (typeof source !== 'object')\n source = link.source = find(nodeById, source);\n if (typeof target !== 'object')\n target = link.target = find(nodeById, target);\n source.sourceLinks.push(link);\n target.targetLinks.push(link);\n });\n if (linkSort != null) {\n for (const { sourceLinks, targetLinks } of nodes) {\n sourceLinks.sort(linkSort);\n targetLinks.sort(linkSort);\n }\n }\n }\n function computeNodeValues({ nodes }) {\n for (const node of nodes) {\n node.value =\n node.fixedValue === undefined\n ? Math.max((0, d3_array_1.sum)(node.sourceLinks, value), (0, d3_array_1.sum)(node.targetLinks, value))\n : node.fixedValue;\n }\n }\n function computeNodeDepths({ nodes }) {\n const n = nodes.length;\n let current = new Set(nodes);\n let next = new Set();\n let x = 0;\n while (current.size) {\n current.forEach((node) => {\n node.depth = x;\n for (const { target } of node.sourceLinks) {\n next.add(target);\n }\n });\n if (++x > n)\n throw new Error('circular link');\n current = next;\n next = new Set();\n }\n // 如果配置了 depth,则设置自定义 depth\n if (depth) {\n const maxDepth = Math.max((0, d3_array_1.max)(nodes, (d) => d.depth) + 1, 0);\n let node;\n for (let i = 0; i < nodes.length; i++) {\n node = nodes[i];\n node.depth = depth.call(null, node, maxDepth);\n }\n }\n }\n function computeNodeHeights({ nodes }) {\n const n = nodes.length;\n let current = new Set(nodes);\n let next = new Set();\n let x = 0;\n while (current.size) {\n current.forEach((node) => {\n node.height = x;\n for (const { source } of node.targetLinks) {\n next.add(source);\n }\n });\n if (++x > n)\n throw new Error('circular link');\n current = next;\n next = new Set();\n }\n }\n function computeNodeLayers({ nodes }) {\n const x = Math.max((0, d3_array_1.max)(nodes, (d) => d.depth) + 1, 0);\n const kx = (x1 - x0 - dx) / (x - 1);\n const columns = new Array(x).fill(0).map(() => []);\n for (const node of nodes) {\n const i = Math.max(0, Math.min(x - 1, Math.floor(align.call(null, node, x))));\n node.layer = i;\n node.x0 = x0 + i * kx;\n node.x1 = node.x0 + dx;\n if (columns[i])\n columns[i].push(node);\n else\n columns[i] = [node];\n }\n if (sort)\n for (const column of columns) {\n column.sort(sort);\n }\n return columns;\n }\n function initializeNodeBreadths(columns) {\n const ky = (0, d3_array_1.min)(columns, (c) => (y1 - y0 - (c.length - 1) * py) / (0, d3_array_1.sum)(c, value));\n for (const nodes of columns) {\n let y = y0;\n for (const node of nodes) {\n node.y0 = y;\n node.y1 = y + node.value * ky;\n y = node.y1 + py;\n for (const link of node.sourceLinks) {\n link.width = link.value * ky;\n }\n }\n y = (y1 - y + py) / (nodes.length + 1);\n for (let i = 0; i < nodes.length; ++i) {\n const node = nodes[i];\n node.y0 += y * (i + 1);\n node.y1 += y * (i + 1);\n }\n reorderLinks(nodes);\n }\n }\n function computeNodeBreadths(graph) {\n const columns = computeNodeLayers(graph);\n py = Math.min(dy, (y1 - y0) / ((0, d3_array_1.max)(columns, (c) => c.length) - 1));\n initializeNodeBreadths(columns);\n for (let i = 0; i < iterations; ++i) {\n const alpha = Math.pow(0.99, i);\n const beta = Math.max(1 - alpha, (i + 1) / iterations);\n relaxRightToLeft(columns, alpha, beta);\n relaxLeftToRight(columns, alpha, beta);\n }\n }\n // Reposition each node based on its incoming (target) links.\n function relaxLeftToRight(columns, alpha, beta) {\n for (let i = 1, n = columns.length; i < n; ++i) {\n const column = columns[i];\n for (const target of column) {\n let y = 0;\n let w = 0;\n for (const { source, value } of target.targetLinks) {\n const v = value * (target.layer - source.layer);\n y += targetTop(source, target) * v;\n w += v;\n }\n if (!(w > 0))\n continue;\n const dy = (y / w - target.y0) * alpha;\n target.y0 += dy;\n target.y1 += dy;\n reorderNodeLinks(target);\n }\n if (sort === undefined)\n column.sort(ascendingBreadth);\n if (column.length)\n resolveCollisions(column, beta);\n }\n }\n // Reposition each node based on its outgoing (source) links.\n function relaxRightToLeft(columns, alpha, beta) {\n for (let n = columns.length, i = n - 2; i >= 0; --i) {\n const column = columns[i];\n for (const source of column) {\n let y = 0;\n let w = 0;\n for (const { target, value } of source.sourceLinks) {\n const v = value * (target.layer - source.layer);\n y += sourceTop(source, target) * v;\n w += v;\n }\n if (!(w > 0))\n continue;\n const dy = (y / w - source.y0) * alpha;\n source.y0 += dy;\n source.y1 += dy;\n reorderNodeLinks(source);\n }\n if (sort === undefined)\n column.sort(ascendingBreadth);\n if (column.length)\n resolveCollisions(column, beta);\n }\n }\n function resolveCollisions(nodes, alpha) {\n const i = nodes.length >> 1;\n const subject = nodes[i];\n resolveCollisionsBottomToTop(nodes, subject.y0 - py, i - 1, alpha);\n resolveCollisionsTopToBottom(nodes, subject.y1 + py, i + 1, alpha);\n resolveCollisionsBottomToTop(nodes, y1, nodes.length - 1, alpha);\n resolveCollisionsTopToBottom(nodes, y0, 0, alpha);\n }\n // Push any overlapping nodes down.\n function resolveCollisionsTopToBottom(nodes, y, i, alpha) {\n for (; i < nodes.length; ++i) {\n const node = nodes[i];\n const dy = (y - node.y0) * alpha;\n if (dy > 1e-6)\n (node.y0 += dy), (node.y1 += dy);\n y = node.y1 + py;\n }\n }\n // Push any overlapping nodes up.\n function resolveCollisionsBottomToTop(nodes, y, i, alpha) {\n for (; i >= 0; --i) {\n const node = nodes[i];\n const dy = (node.y1 - y) * alpha;\n if (dy > 1e-6)\n (node.y0 -= dy), (node.y1 -= dy);\n y = node.y0 - py;\n }\n }\n function reorderNodeLinks({ sourceLinks, targetLinks }) {\n if (linkSort === undefined) {\n for (const { source: { sourceLinks }, } of targetLinks) {\n sourceLinks.sort(ascendingTargetBreadth);\n }\n for (const { target: { targetLinks }, } of sourceLinks) {\n targetLinks.sort(ascendingSourceBreadth);\n }\n }\n }\n function reorderLinks(nodes) {\n if (linkSort === undefined) {\n for (const { sourceLinks, targetLinks } of nodes) {\n sourceLinks.sort(ascendingTargetBreadth);\n targetLinks.sort(ascendingSourceBreadth);\n }\n }\n }\n // Returns the target.y0 that would produce an ideal link from source to target.\n function targetTop(source, target) {\n let y = source.y0 - ((source.sourceLinks.length - 1) * py) / 2;\n for (const { target: node, width } of source.sourceLinks) {\n if (node === target)\n break;\n y += width + py;\n }\n for (const { source: node, width } of target.targetLinks) {\n if (node === source)\n break;\n y -= width;\n }\n return y;\n }\n // Returns the source.y0 that would produce an ideal link from source to target.\n function sourceTop(source, target) {\n let y = target.y0 - ((target.targetLinks.length - 1) * py) / 2;\n for (const { source: node, width } of target.targetLinks) {\n if (node === source)\n break;\n y += width + py;\n }\n for (const { target: node, width } of source.sourceLinks) {\n if (node === target)\n break;\n y -= width;\n }\n return y;\n }\n return sankey;\n}\nexports.Sankey = Sankey;\n//# sourceMappingURL=sankey.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.center = exports.justify = exports.right = exports.left = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nfunction targetDepth(d) {\n return d.target.depth;\n}\nfunction left(node) {\n return node.depth;\n}\nexports.left = left;\nfunction right(node, n) {\n return n - 1 - node.height;\n}\nexports.right = right;\nfunction justify(node, n) {\n return node.sourceLinks.length ? node.depth : n - 1;\n}\nexports.justify = justify;\nfunction center(node) {\n return node.targetLinks.length\n ? node.depth\n : node.sourceLinks.length\n ? (0, d3_array_1.min)(node.sourceLinks, targetDepth) - 1\n : 0;\n}\nexports.center = center;\n//# sourceMappingURL=align.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.constant = void 0;\nfunction constant(x) {\n return function () {\n return x;\n };\n}\nexports.constant = constant;\n//# sourceMappingURL=constant.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.maybeAnimation = exports.isFullTooltip = exports.maybeTooltip = exports.subTooltip = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"./helper\");\nfunction subTooltip(tooltip, name, defaults = {}, main = false) {\n if ((0, helper_1.isUnset)(tooltip))\n return tooltip;\n if (Array.isArray(tooltip) && main)\n return tooltip;\n const sub = (0, helper_1.subObject)(tooltip, name);\n return (0, util_1.deepMix)(defaults, sub);\n}\nexports.subTooltip = subTooltip;\nfunction maybeTooltip(tooltip, defaults = {}) {\n if ((0, helper_1.isUnset)(tooltip))\n return tooltip;\n if (Array.isArray(tooltip))\n return tooltip;\n if (!isFullTooltip(tooltip))\n return tooltip;\n return (0, util_1.deepMix)(defaults, tooltip);\n}\nexports.maybeTooltip = maybeTooltip;\nfunction isFullTooltip(tooltip) {\n if (Object.keys(tooltip).length === 0)\n return true;\n const { title, items } = tooltip;\n return title !== undefined || items !== undefined;\n}\nexports.isFullTooltip = isFullTooltip;\nfunction maybeAnimation(animate, sub) {\n return typeof animate === 'object' ? (0, helper_1.subObject)(animate, sub) : animate;\n}\nexports.maybeAnimation = maybeAnimation;\n//# sourceMappingURL=mark.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Chord = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"../utils/helper\");\nconst mark_1 = require(\"../utils/mark\");\nconst arc_1 = require(\"../data/arc\");\nconst utils_1 = require(\"./utils\");\nconst DEFAULT_LAYOUT_OPTIONS = {\n y: 0,\n thickness: 0.05,\n marginRatio: 0.1,\n id: (node) => node.key,\n source: (edge) => edge.source,\n target: (edge) => edge.target,\n sourceWeight: (edge) => edge.value || 1,\n targetWeight: (edge) => edge.value || 1,\n sortBy: null, // optional, id | weight | frequency | {function}\n};\nconst DEFAULT_NODE_OPTIONS = {\n type: 'polygon',\n axis: false,\n legend: false,\n encode: {\n shape: 'polygon',\n x: 'x',\n y: 'y',\n },\n scale: {\n x: { type: 'identity' },\n y: { type: 'identity' },\n },\n style: {\n opacity: 1,\n fillOpacity: 1,\n lineWidth: 1,\n },\n};\nconst DEFAULT_LINK_OPTIONS = {\n type: 'polygon',\n axis: false,\n legend: false,\n encode: {\n shape: 'ribbon',\n x: 'x',\n y: 'y',\n },\n style: {\n opacity: 0.5,\n lineWidth: 1,\n },\n};\nconst DEFAULT_LABEL_OPTIONS = {\n position: 'outside',\n fontSize: 10,\n};\nconst Chord = (options, context) => {\n const { data, encode = {}, scale, style = {}, layout = {}, nodeLabels = [], linkLabels = [], animate = {}, tooltip = {}, } = options;\n // Initialize data, generating nodes by link if is not specified.\n const { nodes, links } = (0, utils_1.initializeData)(data, encode);\n // Extract encode for node and link.\n const nodeEncode = (0, helper_1.subObject)(encode, 'node');\n const linkEncode = (0, helper_1.subObject)(encode, 'link');\n const { key: nodeKey = (d) => d.key, color = nodeKey } = nodeEncode;\n const { linkEncodeColor = (d) => d.source } = linkEncode;\n const { nodeWidthRatio = DEFAULT_LAYOUT_OPTIONS.thickness, nodePaddingRatio = DEFAULT_LAYOUT_OPTIONS.marginRatio } = layout, restLayout = __rest(layout, [\"nodeWidthRatio\", \"nodePaddingRatio\"]);\n const { nodes: nodeData, edges: linkData } = (0, arc_1.Arc)(Object.assign(Object.assign(Object.assign(Object.assign({}, DEFAULT_LAYOUT_OPTIONS), { id: (0, utils_1.field)(nodeKey), thickness: nodeWidthRatio, marginRatio: nodePaddingRatio }), restLayout), { weight: true }))({ nodes, edges: links });\n // Extract label style and apply defaults.\n const _a = (0, helper_1.subObject)(style, 'label'), { text = nodeKey } = _a, labelStyle = __rest(_a, [\"text\"]);\n const nodeTooltip = (0, mark_1.subTooltip)(tooltip, 'node', {\n title: '',\n items: [(d) => ({ name: d.key, value: d.value })],\n }, true);\n const linkTooltip = (0, mark_1.subTooltip)(tooltip, 'link', {\n title: '',\n items: [(d) => ({ name: `${d.source} -> ${d.target}`, value: d.value })],\n });\n const { height, width } = context;\n const minimumLen = Math.min(height, width);\n return [\n (0, util_1.deepMix)({}, DEFAULT_LINK_OPTIONS, {\n data: linkData,\n encode: Object.assign(Object.assign({}, linkEncode), { color: linkEncodeColor }),\n labels: linkLabels,\n style: Object.assign({ fill: linkEncodeColor ? undefined : '#aaa' }, (0, helper_1.subObject)(style, 'link')),\n tooltip: linkTooltip,\n animate: (0, mark_1.maybeAnimation)(animate, 'link'),\n }),\n (0, util_1.deepMix)({}, DEFAULT_NODE_OPTIONS, {\n data: nodeData,\n encode: Object.assign(Object.assign({}, nodeEncode), { color }),\n scale,\n style: (0, helper_1.subObject)(style, 'node'),\n coordinate: {\n type: 'polar',\n // Leave enough rendering space for the label.\n outerRadius: (minimumLen - 20) / minimumLen,\n startAngle: -Math.PI * 2,\n endAngle: 0,\n },\n labels: [\n Object.assign(Object.assign(Object.assign({}, DEFAULT_LABEL_OPTIONS), { text }), labelStyle),\n ...nodeLabels,\n ],\n tooltip: nodeTooltip,\n animate: (0, mark_1.maybeAnimation)(animate, 'node'),\n axis: false,\n }),\n ];\n};\nexports.Chord = Chord;\nexports.Chord.props = {};\n//# sourceMappingURL=chord.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Arc = void 0;\nconst arc_1 = require(\"../data/utils/arc\");\n/**\n * For arc diagram(edge with weight) or chord diagram(with weight)\n */\nconst Arc = (options) => {\n return (data) => {\n return (0, arc_1.Arc)(options)(data);\n };\n};\nexports.Arc = Arc;\nexports.Arc.props = {};\n//# sourceMappingURL=arc.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Arc = void 0;\nvar arc_1 = require(\"./arc\");\nObject.defineProperty(exports, \"Arc\", { enumerable: true, get: function () { return arc_1.Arc; } });\n//# sourceMappingURL=index.js.map","\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Arc = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst helper_1 = require(\"../../../utils/helper\");\nconst SortMethods = __importStar(require(\"./sort\"));\nconst DEFAULT_OPTIONS = {\n y: 0,\n thickness: 0.05,\n weight: false,\n marginRatio: 0.1,\n id: (node) => node.id,\n source: (edge) => edge.source,\n target: (edge) => edge.target,\n sourceWeight: (edge) => edge.value || 1,\n targetWeight: (edge) => edge.value || 1,\n sortBy: null,\n};\n/**\n * Layout for Arc / Chord diagram with d3 style.\n */\nfunction Arc(options) {\n const { y, thickness, weight, marginRatio, id, source, target, sourceWeight, targetWeight, sortBy, } = Object.assign(Object.assign({}, DEFAULT_OPTIONS), options);\n function arc(data) {\n // Clone first.\n const nodes = data.nodes.map((n) => (Object.assign({}, n)));\n const edges = data.edges.map((n) => (Object.assign({}, n)));\n // Keep reference in below functions.\n preprocess(nodes, edges);\n sortNodes(nodes, edges);\n layoutNodes(nodes, edges);\n layoutEdges(nodes, edges);\n return { nodes, edges };\n }\n /**\n * Calculate id, value, frequency for node, and source,target for edge.\n */\n function preprocess(nodes, edges) {\n edges.forEach((edge) => {\n edge.source = source(edge);\n edge.target = target(edge);\n edge.sourceWeight = sourceWeight(edge);\n edge.targetWeight = targetWeight(edge);\n });\n // Group edges by source, target.\n const edgesBySource = (0, d3_array_1.group)(edges, (e) => e.source);\n const edgesByTarget = (0, d3_array_1.group)(edges, (e) => e.target);\n nodes.forEach((node) => {\n node.id = id(node);\n const sources = edgesBySource.has(node.id)\n ? edgesBySource.get(node.id)\n : [];\n const targets = edgesByTarget.has(node.id)\n ? edgesByTarget.get(node.id)\n : [];\n node.frequency = sources.length + targets.length;\n node.value =\n (0, d3_array_1.sum)(sources, (d) => d.sourceWeight) +\n (0, d3_array_1.sum)(targets, (d) => d.targetWeight);\n });\n return { nodes, edges };\n }\n function sortNodes(nodes, edges) {\n const method = typeof sortBy === 'function' ? sortBy : SortMethods[sortBy];\n if (method) {\n nodes.sort(method);\n }\n }\n function layoutNodes(nodes, edges) {\n const size = nodes.length;\n if (!size) {\n throw (0, helper_1.error)(\"Invalid nodes: it's empty!\");\n }\n // No weight.\n if (!weight) {\n const deltaX = 1 / size;\n nodes.forEach((node, i) => {\n node.x = (i + 0.5) * deltaX;\n node.y = y;\n });\n return { nodes, edges };\n }\n // todo: marginRatio should be in [0, 1)\n // todo: thickness shoule be in (0, 1)\n const margin = marginRatio / (2 * size);\n const total = nodes.reduce((prev, node) => (prev += node.value), 0);\n nodes.reduce((deltaX, node) => {\n node.weight = node.value / total;\n node.width = node.weight * (1 - marginRatio);\n node.height = thickness;\n /* points\n * 3---2\n * | |\n * 0---1\n */\n const minX = margin + deltaX;\n const maxX = minX + node.width;\n const minY = y - thickness / 2;\n const maxY = minY + thickness;\n node.x = [minX, maxX, maxX, minX];\n node.y = [minY, minY, maxY, maxY];\n // Return next deltaX.\n return deltaX + node.width + 2 * margin;\n }, 0);\n return {\n nodes,\n edges,\n };\n }\n /**\n * Get edge layout information from nodes, and save into edge object.\n */\n function layoutEdges(nodes, edges) {\n const nodesMap = new Map(nodes.map((d) => [d.id, d]));\n if (!weight) {\n edges.forEach((edge) => {\n const sourceId = source(edge);\n const targetId = target(edge);\n const sourceNode = nodesMap.get(sourceId);\n const targetNode = nodesMap.get(targetId);\n // Edge's layout information is Equal with node.\n if (sourceNode && targetNode) {\n edge.x = [sourceNode.x, targetNode.x];\n edge.y = [sourceNode.y, targetNode.y];\n }\n });\n return { nodes, edges };\n }\n // Initial edge.x, edge.y.\n edges.forEach((edge) => {\n edge.x = [0, 0, 0, 0];\n edge.y = [y, y, y, y];\n });\n // Group edges by source, target.\n const edgesBySource = (0, d3_array_1.group)(edges, (e) => e.source);\n const edgesByTarget = (0, d3_array_1.group)(edges, (e) => e.target);\n // When weight = true, we need to calculation the bbox of edge start/end.\n nodes.forEach((node) => {\n const { edges, width, x, y, value, id } = node;\n const sourceEdges = edgesBySource.get(id) || [];\n const targetEdges = edgesByTarget.get(id) || [];\n let offset = 0;\n /* points\n * 0----------2\n * | |\n * 1----------3\n */\n sourceEdges.map((edge) => {\n const w = (edge.sourceWeight / value) * width;\n edge.x[0] = x[0] + offset;\n edge.x[1] = x[0] + offset + w;\n offset += w;\n });\n targetEdges.forEach((edge) => {\n const w = (edge.targetWeight / value) * width;\n edge.x[3] = x[0] + offset;\n edge.x[2] = x[0] + offset + w;\n offset += w;\n });\n });\n }\n return arc;\n}\nexports.Arc = Arc;\n//# sourceMappingURL=arc.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.name = exports.id = exports.frequency = exports.weight = void 0;\nfunction weight(a, b) {\n return b.value - a.value;\n}\nexports.weight = weight;\nfunction frequency(a, b) {\n return b.frequency - a.frequency;\n}\nexports.frequency = frequency;\nfunction id(a, b) {\n return `${a.id}`.localeCompare(`${b.id}`);\n}\nexports.id = id;\nfunction name(a, b) {\n return `${a.name}`.localeCompare(`${b.name}`);\n}\nexports.name = name;\n//# sourceMappingURL=sort.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Path = void 0;\nconst shape_1 = require(\"../shape\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n path: shape_1.PathShape,\n hollow: shape_1.PathHollow,\n};\n/**\n * Draw a path.\n */\nconst Path = (options) => {\n return (index, scale, value, coordinate) => {\n // The points is meaning less for path mark,\n // because the position of path shapes specified\n // by the d option. So set [0, 0] for render pipeline.\n return [index, index.map(() => [[0, 0]])];\n };\n};\nexports.Path = Path;\nexports.Path.props = {\n defaultShape: 'path',\n defaultLabelShape: 'label',\n shape,\n composite: false,\n channels: [\n ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }),\n { name: 'd', scale: 'identity' },\n ],\n preInference: [...(0, utils_1.basePreInference)()],\n postInference: [...(0, utils_1.basePostInference)()],\n};\n//# sourceMappingURL=path.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Treemap = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"../utils/helper\");\nconst mark_1 = require(\"../utils/mark\");\nconst treeDataTransform_1 = require(\"../utils/treeDataTransform\");\n// Defaults\nconst GET_DEFAULT_LAYOUT_OPTIONS = (width, height) => ({\n tile: 'treemapSquarify',\n ratio: 0.5 * (1 + Math.sqrt(5)),\n size: [width, height],\n round: false,\n ignoreParentValue: true,\n padding: 0,\n paddingInner: 0,\n paddingOuter: 0,\n paddingTop: 0,\n paddingRight: 0,\n paddingBottom: 0,\n paddingLeft: 0,\n sort: (a, b) => b.value - a.value,\n layer: 0,\n});\nconst GET_DEFAULT_OPTIONS = (width, height) => ({\n type: 'rect',\n axis: false,\n encode: {\n x: 'x',\n y: 'y',\n key: 'id',\n color: (d) => d.path[1],\n },\n scale: {\n x: { domain: [0, width], range: [0, 1] },\n y: { domain: [0, height], range: [0, 1] },\n },\n style: {\n stroke: '#fff',\n },\n state: {\n active: { opacity: 0.6 },\n inactive: { opacity: 1 },\n },\n});\nconst DEFAULT_LABEL_OPTIONS = {\n fontSize: 10,\n text: (d) => (0, util_1.last)(d.path),\n position: 'inside',\n fill: '#000',\n textOverflow: 'clip',\n wordWrap: true,\n maxLines: 1,\n wordWrapWidth: (d) => d.x1 - d.x0,\n isTreemapLabel: true,\n};\nconst DEFAULT_TOOLTIP_OPTIONS = {\n title: (d) => { var _a, _b; return (_b = (_a = d.path) === null || _a === void 0 ? void 0 : _a.join) === null || _b === void 0 ? void 0 : _b.call(_a, '.'); },\n items: [{ field: 'value' }],\n};\nconst DEFAULT_TOOLTIP_OPTIONS_DRILL = {\n title: (d) => (0, util_1.last)(d.path),\n items: [{ field: 'value' }],\n};\nconst Treemap = (options, context) => {\n const { width, height, options: markOptions } = context;\n const { data, encode = {}, scale, style = {}, layout = {}, labels = [], tooltip = {} } = options, resOptions = __rest(options, [\"data\", \"encode\", \"scale\", \"style\", \"layout\", \"labels\", \"tooltip\"]);\n const treemapDrillDown = (0, util_1.get)(markOptions, [\n 'interaction',\n 'treemapDrillDown',\n ]);\n // Layout\n const layoutOptions = (0, util_1.deepMix)({}, GET_DEFAULT_LAYOUT_OPTIONS(width, height), layout, {\n layer: treemapDrillDown\n ? (d) => {\n return d.depth === 1;\n }\n : layout.layer,\n });\n // Data\n const [transformedData, transformedDataAll] = (0, treeDataTransform_1.treeDataTransform)(data, layoutOptions, encode);\n // Label\n const labelStyle = (0, helper_1.subObject)(style, 'label');\n return (0, util_1.deepMix)({}, GET_DEFAULT_OPTIONS(width, height), Object.assign(Object.assign({ data: transformedData, scale,\n style, labels: [\n Object.assign(Object.assign(Object.assign({}, DEFAULT_LABEL_OPTIONS), labelStyle), (treemapDrillDown && { cursor: 'pointer' })),\n ...labels,\n ] }, resOptions), { encode, tooltip: (0, mark_1.maybeTooltip)(tooltip, DEFAULT_TOOLTIP_OPTIONS), axis: false }), treemapDrillDown\n ? {\n interaction: Object.assign(Object.assign({}, resOptions.interaction), { treemapDrillDown: treemapDrillDown\n ? Object.assign(Object.assign({}, treemapDrillDown), { originData: transformedDataAll, layout: layoutOptions }) : undefined }),\n encode: Object.assign({ color: (d) => (0, util_1.last)(d.path) }, encode),\n tooltip: (0, mark_1.maybeTooltip)(tooltip, DEFAULT_TOOLTIP_OPTIONS_DRILL),\n }\n : {});\n};\nexports.Treemap = Treemap;\nexports.Treemap.props = {};\n//# sourceMappingURL=treemap.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.treeDataTransform = void 0;\nconst util_1 = require(\"@antv/util\");\nconst d3_hierarchy_1 = require(\"@antv/vendor/d3-hierarchy\");\nconst utils_1 = require(\"../mark/utils\");\n/**\n * @description Path need when the data is a flat json structure,\n * and the tree object structure do not need.\n */\nfunction generateHierarchyRoot(data, path) {\n if (Array.isArray(data)) {\n return typeof path === 'function'\n ? (0, d3_hierarchy_1.stratify)().path(path)(data)\n : (0, d3_hierarchy_1.stratify)()(data);\n }\n return (0, d3_hierarchy_1.hierarchy)(data);\n}\nfunction addObjectDataPath(root, path = [root.data.name]) {\n // @ts-ignore\n root.id = root.id || root.data.name;\n root.path = path;\n if (root.children) {\n root.children.forEach((item) => {\n // @ts-ignore\n item.id = `${root.id}/${item.data.name}`;\n item.path = [...path, item.data.name];\n addObjectDataPath(item, item.path);\n });\n }\n}\nfunction addArrayDataPath(root) {\n const name = (0, util_1.get)(root, ['data', 'name']);\n if (name.replaceAll) {\n root.path = name.replaceAll('.', '/').split('/');\n }\n if (root.children) {\n root.children.forEach((item) => {\n addArrayDataPath(item);\n });\n }\n}\nfunction getTileMethod(tile, ratio) {\n const tiles = {\n treemapBinary: d3_hierarchy_1.treemapBinary,\n treemapDice: d3_hierarchy_1.treemapDice,\n treemapSlice: d3_hierarchy_1.treemapSlice,\n treemapSliceDice: d3_hierarchy_1.treemapSliceDice,\n treemapSquarify: d3_hierarchy_1.treemapSquarify,\n treemapResquarify: d3_hierarchy_1.treemapResquarify,\n };\n const tileMethod = tile === 'treemapSquarify' ? tiles[tile].ratio(ratio) : tiles[tile];\n if (!tileMethod) {\n throw new TypeError('Invalid tile method!');\n }\n return tileMethod;\n}\nfunction treeDataTransform(data, layout, encode) {\n const { value } = encode;\n const tileMethod = getTileMethod(layout.tile, layout.ratio);\n const root = generateHierarchyRoot(data, layout.path);\n if ((0, util_1.isArray)(data)) {\n addArrayDataPath(root);\n }\n else {\n addObjectDataPath(root);\n }\n // Calculate the value and sort.\n value\n ? root\n .sum((d) => layout.ignoreParentValue && d.children\n ? 0\n : (0, utils_1.field)(value)(d))\n .sort(layout.sort)\n : root.count();\n (0, d3_hierarchy_1.treemap)()\n .tile(tileMethod)\n // @ts-ignore\n .size(layout.size)\n .round(layout.round)\n .paddingInner(layout.paddingInner)\n .paddingOuter(layout.paddingOuter)\n .paddingTop(layout.paddingTop)\n .paddingRight(layout.paddingRight)\n .paddingBottom(layout.paddingBottom)\n .paddingLeft(layout.paddingLeft)(root);\n const nodes = root.descendants().map((d) => Object.assign(d, {\n id: d.id.replace(/^\\//, ''),\n x: [d.x0, d.x1],\n y: [d.y0, d.y1],\n }));\n const filterData = nodes.filter(typeof layout.layer === 'function'\n ? layout.layer\n : (d) => d.height === layout.layer);\n return [filterData, nodes];\n}\nexports.treeDataTransform = treeDataTransform;\n//# sourceMappingURL=treeDataTransform.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Pack = void 0;\nconst util_1 = require(\"@antv/util\");\nconst d3_hierarchy_1 = require(\"@antv/vendor/d3-hierarchy\");\nconst helper_1 = require(\"../utils/helper\");\nconst mark_1 = require(\"../utils/mark\");\nconst utils_1 = require(\"./utils\");\nconst GET_DEFAULT_LAYOUT_OPTIONS = (width, height) => ({\n size: [width, height],\n padding: 0,\n sort: (a, b) => b.value - a.value,\n});\nconst GET_DEFAULT_OPTIONS = (width, height, encode) => ({\n type: 'point',\n axis: false,\n legend: false,\n scale: {\n x: { domain: [0, width] },\n y: { domain: [0, height] },\n size: { type: 'identity' },\n },\n encode: {\n x: 'x',\n y: 'y',\n size: 'r',\n shape: 'point',\n },\n style: {\n fill: !encode.color ? (d) => (d.height === 0 ? '#ddd' : '#fff') : undefined,\n stroke: !encode.color ? (d) => (d.height === 0 ? '' : '#000') : undefined,\n },\n});\nconst DEFAULT_LABEL_OPTIONS = {\n text: '',\n position: 'inside',\n textOverflow: 'clip',\n wordWrap: true,\n maxLines: 1,\n wordWrapWidth: (d) => d.r * 2,\n};\nconst DEFAULT_TOOLTIP_OPTIONS = {\n title: (d) => d.data.name,\n items: [{ field: 'value' }],\n};\nconst dataTransform = (data, layout, encode) => {\n const { value } = encode;\n const root = (0, util_1.isArray)(data)\n ? (0, d3_hierarchy_1.stratify)().path(layout.path)(data)\n : (0, d3_hierarchy_1.hierarchy)(data);\n value ? root.sum((d) => (0, utils_1.field)(value)(d)).sort(layout.sort) : root.count();\n // @ts-ignore\n (0, d3_hierarchy_1.pack)().size(layout.size).padding(layout.padding)(root);\n return root.descendants();\n};\nconst Pack = (markOptions, context) => {\n const { width, height } = context;\n const { data, encode = {}, scale = {}, style = {}, layout = {}, labels = [], tooltip = {} } = markOptions, resOptions = __rest(markOptions, [\"data\", \"encode\", \"scale\", \"style\", \"layout\", \"labels\", \"tooltip\"]);\n const DEFAULT_OPTIONS = GET_DEFAULT_OPTIONS(width, height, encode);\n const transformedData = dataTransform(data, (0, util_1.deepMix)({}, GET_DEFAULT_LAYOUT_OPTIONS(width, height), layout), (0, util_1.deepMix)({}, DEFAULT_OPTIONS['encode'], encode));\n const labelStyle = (0, helper_1.subObject)(style, 'label');\n return (0, util_1.deepMix)({}, DEFAULT_OPTIONS, Object.assign(Object.assign({ data: transformedData, encode,\n scale,\n style, labels: [\n Object.assign(Object.assign({}, DEFAULT_LABEL_OPTIONS), labelStyle),\n ...labels,\n ] }, resOptions), { tooltip: (0, mark_1.maybeTooltip)(tooltip, DEFAULT_TOOLTIP_OPTIONS), axis: false }));\n};\nexports.Pack = Pack;\nexports.Pack.props = {};\n//# sourceMappingURL=pack.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Boxplot = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst helper_1 = require(\"../utils/helper\");\nconst mark_1 = require(\"../utils/mark\");\nfunction min(I, V) {\n return (0, d3_array_1.min)(I, (i) => V[i]);\n}\nfunction max(I, V) {\n return (0, d3_array_1.max)(I, (i) => V[i]);\n}\nfunction lower(I, V) {\n const lo = q1(I, V) * 2.5 - q3(I, V) * 1.5;\n return (0, d3_array_1.min)(I, (i) => (V[i] >= lo ? V[i] : NaN));\n}\nfunction q1(I, V) {\n return (0, d3_array_1.quantile)(I, 0.25, (i) => V[i]);\n}\nfunction q2(I, V) {\n return (0, d3_array_1.quantile)(I, 0.5, (i) => V[i]);\n}\nfunction q3(I, V) {\n return (0, d3_array_1.quantile)(I, 0.75, (i) => V[i]);\n}\nfunction upper(I, V) {\n const hi = q3(I, V) * 2.5 - q1(I, V) * 1.5;\n return (0, d3_array_1.max)(I, (i) => (V[i] <= hi ? V[i] : NaN));\n}\n/**\n * Group marks by x and reserve outlier indexes.\n */\nfunction OutlierY() {\n return (I, mark) => {\n const { encode } = mark;\n const { y, x } = encode;\n const { value: V } = y;\n const { value: X } = x;\n const GI = Array.from((0, d3_array_1.group)(I, (i) => X[+i]).values());\n const FI = GI.flatMap((I) => {\n const lo = lower(I, V);\n const hi = upper(I, V);\n return I.filter((i) => V[i] < lo || V[i] > hi);\n });\n return [FI, mark];\n };\n}\nconst Boxplot = (options) => {\n const { data, encode, style = {}, tooltip = {}, transform, animate } = options, rest = __rest(options, [\"data\", \"encode\", \"style\", \"tooltip\", \"transform\", \"animate\"]);\n const { point = true } = style, restStyle = __rest(style, [\"point\"]);\n const { y } = encode;\n const encodeY = { y, y1: y, y2: y, y3: y, y4: y };\n const qy = { y1: q1, y2: q2, y3: q3 };\n // Tooltips.\n const boxTooltip = (0, mark_1.subTooltip)(tooltip, 'box', {\n items: [\n { channel: 'y', name: 'min' },\n { channel: 'y1', name: 'q1' },\n { channel: 'y2', name: 'q2' },\n { channel: 'y3', name: 'q3' },\n { channel: 'y4', name: 'max' },\n ],\n }, true);\n const pointTooltip = (0, mark_1.subTooltip)(tooltip, 'point', {\n title: { channel: 'x' },\n items: [{ name: 'outlier', channel: 'y' }],\n });\n // Only show min and max instead of lower and upper.\n // Only draw a box.\n if (!point) {\n return Object.assign({ type: 'box', data: data, transform: [\n Object.assign(Object.assign({ type: 'groupX', y: min }, qy), { y4: max }),\n ], encode: Object.assign(Object.assign({}, encode), encodeY), style: restStyle, tooltip: boxTooltip }, rest);\n }\n const boxStyle = (0, helper_1.subObject)(restStyle, 'box');\n const pointStyle = (0, helper_1.subObject)(restStyle, 'point');\n return [\n Object.assign({ type: 'box', data: data, transform: [\n Object.assign(Object.assign({ type: 'groupX', y: lower }, qy), { y4: upper }),\n ], encode: Object.assign(Object.assign({}, encode), encodeY), style: boxStyle, tooltip: boxTooltip, animate: (0, mark_1.maybeAnimation)(animate, 'box') }, rest),\n // Draw outliers.\n {\n type: 'point',\n data: data,\n transform: [{ type: OutlierY }],\n encode,\n style: Object.assign({}, pointStyle),\n tooltip: pointTooltip,\n animate: (0, mark_1.maybeAnimation)(animate, 'point'),\n },\n ];\n};\nexports.Boxplot = Boxplot;\nexports.Boxplot.props = {};\n//# sourceMappingURL=boxplot.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Shape = void 0;\nconst shape_1 = require(\"../shape\");\nconst transform_1 = require(\"../transform\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n shape: shape_1.ShapeShape,\n};\n/**\n * @todo Unify with text, image and point.\n */\nconst Shape = (options) => {\n const { cartesian } = options;\n if (cartesian)\n return utils_1.visualMark;\n return (index, scale, value, coordinate) => {\n const { x: X, y: Y } = value;\n const offset = (0, utils_1.createBandOffset)(scale, value, options);\n const P = Array.from(index, (i) => {\n const p = [+X[i], +Y[i]];\n return [coordinate.map(offset(p, i))];\n });\n return [index, P];\n };\n};\nexports.Shape = Shape;\nexports.Shape.props = {\n defaultShape: 'shape',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n { name: 'x', required: true },\n { name: 'y', required: true },\n ],\n preInference: [\n ...(0, utils_1.basePreInference)(),\n { type: transform_1.MaybeTuple },\n { type: transform_1.MaybeVisualPosition },\n { type: transform_1.MaybeFunctionAttribute },\n ],\n};\n//# sourceMappingURL=shape.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ForceGraph = void 0;\nconst d3_force_1 = require(\"@antv/vendor/d3-force\");\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"../utils/helper\");\nconst mark_1 = require(\"../utils/mark\");\nconst utils_1 = require(\"./utils\");\nconst DEFAULT_LAYOUT_OPTIONS = {\n joint: true,\n};\nconst DEFAULT_LINK_OPTIONS = {\n type: 'link',\n axis: false,\n legend: false,\n encode: {\n x: [(d) => d.source.x, (d) => d.target.x],\n y: [(d) => d.source.y, (d) => d.target.y],\n },\n style: {\n stroke: '#999',\n strokeOpacity: 0.6,\n },\n};\nconst DEFAULT_NODE_OPTIONS = {\n type: 'point',\n axis: false,\n legend: false,\n encode: {\n x: 'x',\n y: 'y',\n size: 5,\n color: 'group',\n shape: 'point',\n },\n style: {\n stroke: '#fff',\n },\n};\nconst DEFAULT_LABEL_OPTIONS = {\n text: '',\n};\nfunction dataTransform(data, layout, encode) {\n const { nodes, links } = data;\n const { joint, nodeStrength, linkStrength } = layout;\n const { nodeKey = (d) => d.id, linkKey = (d) => d.id } = encode;\n const nodeForce = (0, d3_force_1.forceManyBody)();\n const linkForce = (0, d3_force_1.forceLink)(links).id((0, utils_1.field)(linkKey));\n typeof nodeStrength === 'function' && nodeForce.strength(nodeStrength);\n typeof linkStrength === 'function' && linkForce.strength(linkStrength);\n const simulation = (0, d3_force_1.forceSimulation)(nodes)\n .force('link', linkForce)\n .force('charge', nodeForce);\n joint\n ? simulation.force('center', (0, d3_force_1.forceCenter)())\n : simulation.force('x', (0, d3_force_1.forceX)()).force('y', (0, d3_force_1.forceY)());\n simulation.stop();\n const n = Math.ceil(Math.log(simulation.alphaMin()) / Math.log(1 - simulation.alphaDecay()));\n for (let i = 0; i < n; i++)\n simulation.tick();\n return {\n nodesData: nodes,\n linksData: links,\n };\n}\nconst ForceGraph = (options) => {\n const { data, encode: e = {}, scale, style = {}, layout = {}, nodeLabels = [], linkLabels = [], animate = {}, tooltip = {}, } = options;\n const { nodeKey = (d) => d.id, linkKey = (d) => d.id } = e, restEncode = __rest(e, [\"nodeKey\", \"linkKey\"]);\n const encode = Object.assign({ nodeKey, linkKey }, restEncode);\n const nodeEncode = (0, helper_1.subObject)(encode, 'node');\n const linkEncode = (0, helper_1.subObject)(encode, 'link');\n const { links, nodes } = (0, utils_1.initializeData)(data, encode);\n const { nodesData, linksData } = dataTransform({ links, nodes }, (0, util_1.deepMix)({}, DEFAULT_LAYOUT_OPTIONS, layout), encode);\n const linkTooltip = (0, mark_1.subTooltip)(tooltip, 'link', {\n items: [\n (d) => ({ name: 'source', value: (0, utils_1.field)(linkKey)(d.source) }),\n (d) => ({ name: 'target', value: (0, utils_1.field)(linkKey)(d.target) }),\n ],\n });\n const nodeTooltip = (0, mark_1.subTooltip)(tooltip, 'node', {\n items: [(d) => ({ name: 'key', value: (0, utils_1.field)(nodeKey)(d) })],\n }, true);\n return [\n (0, util_1.deepMix)({}, DEFAULT_LINK_OPTIONS, {\n data: linksData,\n encode: linkEncode,\n labels: linkLabels,\n style: (0, helper_1.subObject)(style, 'link'),\n tooltip: linkTooltip,\n animate: (0, mark_1.maybeAnimation)(animate, 'link'),\n }),\n (0, util_1.deepMix)({}, DEFAULT_NODE_OPTIONS, {\n data: nodesData,\n encode: Object.assign({}, nodeEncode),\n scale,\n style: (0, helper_1.subObject)(style, 'node'),\n tooltip: nodeTooltip,\n labels: [\n Object.assign(Object.assign({}, DEFAULT_LABEL_OPTIONS), (0, helper_1.subObject)(style, 'label')),\n ...nodeLabels,\n ],\n animate: (0, mark_1.maybeAnimation)(animate, 'link'),\n }),\n ];\n};\nexports.ForceGraph = ForceGraph;\nexports.ForceGraph.props = {};\n//# sourceMappingURL=forceGraph.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Tree = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"../utils/helper\");\nconst tree_1 = require(\"../data/tree\");\nconst mark_1 = require(\"../utils/mark\");\nconst DEFAULT_LAYOUT_OPTIONS = {\n sortBy: (a, b) => b.value - a.value,\n};\nconst DEFAULT_NODE_OPTIONS = {\n axis: false,\n legend: false,\n type: 'point',\n encode: {\n x: 'x',\n y: 'y',\n size: 2,\n shape: 'point',\n },\n};\nconst DEFAULT_LINK_OPTIONS = {\n type: 'link',\n encode: {\n x: 'x',\n y: 'y',\n shape: 'smooth',\n },\n};\nconst DEFAULT_LABEL_OPTIONS = {\n text: '',\n fontSize: 10,\n};\nconst Tree = (options) => {\n const { data, encode = {}, scale = {}, style = {}, layout = {}, nodeLabels = [], linkLabels = [], animate = {}, tooltip = {}, } = options;\n const valueEncode = encode === null || encode === void 0 ? void 0 : encode.value;\n const { nodes, edges } = (0, tree_1.Tree)(Object.assign(Object.assign(Object.assign({}, DEFAULT_LAYOUT_OPTIONS), layout), { field: valueEncode }))(data);\n const nodeTooltip = (0, mark_1.subTooltip)(tooltip, 'node', {\n title: 'name',\n items: ['value'],\n }, true);\n const linkTooltip = (0, mark_1.subTooltip)(tooltip, 'link', {\n title: '',\n items: [\n (d) => ({ name: 'source', value: d.source.name }),\n (d) => ({ name: 'target', value: d.target.name }),\n ],\n });\n return [\n (0, util_1.deepMix)({}, DEFAULT_LINK_OPTIONS, {\n data: edges,\n encode: (0, helper_1.subObject)(encode, 'link'),\n scale: (0, helper_1.subObject)(scale, 'link'),\n labels: linkLabels,\n style: Object.assign({ stroke: '#999' }, (0, helper_1.subObject)(style, 'link')),\n tooltip: linkTooltip,\n animate: (0, mark_1.maybeAnimation)(animate, 'link'),\n }),\n (0, util_1.deepMix)({}, DEFAULT_NODE_OPTIONS, {\n data: nodes,\n scale: (0, helper_1.subObject)(scale, 'node'),\n encode: (0, helper_1.subObject)(encode, 'node'),\n labels: [\n Object.assign(Object.assign({}, DEFAULT_LABEL_OPTIONS), (0, helper_1.subObject)(style, 'label')),\n ...nodeLabels,\n ],\n style: Object.assign({}, (0, helper_1.subObject)(style, 'node')),\n tooltip: nodeTooltip,\n animate: (0, mark_1.maybeAnimation)(animate, 'node'),\n }),\n ];\n};\nexports.Tree = Tree;\nexports.Tree.props = {};\n//# sourceMappingURL=tree.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Tree = void 0;\nconst d3_hierarchy_1 = require(\"@antv/vendor/d3-hierarchy\");\nconst cluster_1 = require(\"./cluster\");\nconst Tree = (options) => {\n return (0, cluster_1.hierarchyFunction)(d3_hierarchy_1.tree)(options);\n};\nexports.Tree = Tree;\nexports.Tree.props = {};\n//# sourceMappingURL=tree.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Cluster = exports.hierarchyFunction = void 0;\nconst d3_hierarchy_1 = require(\"@antv/vendor/d3-hierarchy\");\nconst hierarchyFunction = (layoutFunction) => (options) => {\n return (data) => {\n const { field = 'value', nodeSize, separation, sortBy, as = ['x', 'y'], } = options;\n const [x, y] = as;\n // Process root data.\n const root = (0, d3_hierarchy_1.hierarchy)(data, (d) => d.children)\n .sum((d) => d[field])\n .sort(sortBy);\n // Layout\n const c = layoutFunction();\n c.size([1, 1]);\n if (nodeSize)\n c.nodeSize(nodeSize);\n if (separation)\n c.separation(separation);\n c(root);\n const nodes = [];\n root.each((node) => {\n node[x] = node.x;\n node[y] = node.y;\n node.name = node.data.name;\n nodes.push(node);\n });\n const edges = root.links();\n edges.forEach((edge) => {\n edge[x] = [edge.source[x], edge.target[x]];\n edge[y] = [edge.source[y], edge.target[y]];\n });\n return { nodes, edges };\n };\n};\nexports.hierarchyFunction = hierarchyFunction;\nconst Cluster = (options) => {\n return (0, exports.hierarchyFunction)(d3_hierarchy_1.cluster)(options);\n};\nexports.Cluster = Cluster;\nexports.Cluster.props = {};\n//# sourceMappingURL=cluster.js.map","\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WordCloud = void 0;\nconst util_1 = require(\"@antv/util\");\nfunction initializeData(data, encode) {\n const { text = 'text', value = 'value' } = encode;\n return data.map((d) => (Object.assign(Object.assign({}, d), { text: d[text], value: d[value] })));\n}\nconst GET_DEFAULT_OPTIONS = () => ({\n axis: false,\n type: 'text',\n encode: {\n x: 'x',\n y: 'y',\n text: 'text',\n rotate: 'rotate',\n fontSize: 'size',\n shape: 'tag',\n },\n scale: {\n x: { range: [0, 1] },\n y: { range: [0, 1] },\n },\n style: {\n fontFamily: (d) => d.fontFamily,\n },\n tooltip: {\n items: [\n (datum) => ({\n name: datum.text,\n value: datum.value,\n }),\n ],\n },\n});\nconst WordCloud = (options, context) => __awaiter(void 0, void 0, void 0, function* () {\n const { width, height } = context;\n const { data, encode = {}, scale, style = {}, layout = {} } = options, resOptions = __rest(options, [\"data\", \"encode\", \"scale\", \"style\", \"layout\"]);\n const initializedData = initializeData(data, encode);\n return (0, util_1.deepMix)({}, GET_DEFAULT_OPTIONS(), Object.assign(Object.assign({ data: {\n value: initializedData,\n transform: [\n Object.assign({ type: 'wordCloud', size: [width, height] }, layout),\n ],\n }, encode,\n scale,\n style }, resOptions), { axis: false }));\n});\nexports.WordCloud = WordCloud;\nexports.WordCloud.props = {};\n//# sourceMappingURL=wordCloud.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Gauge = void 0;\nconst util_1 = require(\"@antv/util\");\nconst g_1 = require(\"@antv/g\");\nconst helper_1 = require(\"../utils/helper\");\nconst coordinate_1 = require(\"../utils/coordinate\");\nconst coordinate_2 = require(\"../coordinate\");\nconst utils_1 = require(\"../shape/utils\");\nconst selection_1 = require(\"../utils/selection\");\nconst shape_1 = require(\"../shape\");\nconst indicatorShape = (options, context) => {\n const { shape, radius } = options, style = __rest(options, [\"shape\", \"radius\"]);\n const pointerStyle = (0, helper_1.subObject)(style, 'pointer');\n const pinStyle = (0, helper_1.subObject)(style, 'pin');\n const { shape: pointerShape } = pointerStyle, resPointerStyle = __rest(pointerStyle, [\"shape\"]);\n const { shape: pinShape } = pinStyle, resPinStyle = __rest(pinStyle, [\"shape\"]);\n const { coordinate, theme } = context;\n return (points, value) => {\n // Invert points.\n const invertedPoints = points.map((p) => coordinate.invert(p));\n // Get new coordinate.\n const [startAngle, endAngle, innerRadius] = (0, coordinate_1.getTransformOptions)(coordinate, 'polar');\n const newCoordinate = coordinate.clone();\n const { color: stroke } = value;\n const newTransformations = (0, coordinate_2.Radial)({\n startAngle,\n endAngle,\n innerRadius,\n outerRadius: radius,\n });\n newTransformations.push(['cartesian']);\n newCoordinate.update({\n transformations: newTransformations,\n });\n const newPoints = invertedPoints.map((p) => newCoordinate.map(p));\n const [x, y] = (0, utils_1.getOrigin)(newPoints);\n const [cx, cy] = coordinate.getCenter();\n const pointerAttrs = Object.assign(Object.assign({ x1: x, y1: y, x2: cx, y2: cy, stroke }, resPointerStyle), style);\n const pinAttrs = Object.assign(Object.assign({ cx,\n cy,\n stroke }, resPinStyle), style);\n const indicatorGroup = (0, selection_1.select)(new g_1.Group());\n if (!(0, helper_1.isUnset)(pointerShape)) {\n typeof pointerShape === 'function'\n ? indicatorGroup.append(() => pointerShape(newPoints, value, newCoordinate, theme))\n : indicatorGroup.append('line').call(utils_1.applyStyle, pointerAttrs).node();\n }\n if (!(0, helper_1.isUnset)(pinShape)) {\n typeof pinShape === 'function'\n ? indicatorGroup.append(() => pinShape(newPoints, value, newCoordinate, theme))\n : indicatorGroup.append('circle').call(utils_1.applyStyle, pinAttrs).node();\n }\n return indicatorGroup.node();\n };\n};\nconst DEFAULT_OPTIONS = {\n coordinate: {\n type: 'radial',\n innerRadius: 0.9,\n outerRadius: 1,\n startAngle: (-11 / 10) * Math.PI,\n endAngle: (1 / 10) * Math.PI,\n },\n axis: {\n x: false,\n },\n legend: false,\n tooltip: false,\n encode: {\n x: 'x',\n y: 'y',\n color: 'color',\n },\n scale: {\n color: {\n range: ['#30BF78', '#D0D0D0'],\n },\n },\n};\nconst DEFAULT_INDICATOR_OPTIONS = {\n style: {\n shape: indicatorShape,\n lineWidth: 4,\n pointerLineCap: 'round',\n pinR: 10,\n pinFill: '#fff',\n radius: 0.6,\n },\n};\nconst DEFAULT_TEXT_OPTIONS = {\n type: 'text',\n style: {\n x: '50%',\n y: '60%',\n textAlign: 'center',\n textBaseline: 'middle',\n fontSize: 20,\n fontWeight: 800,\n fill: '#888',\n },\n tooltip: false,\n};\nfunction getGaugeData(data) {\n if ((0, util_1.isNumber)(data)) {\n // Percent range [0, 1].\n const percent = Math.max(0, Math.min(data, 1));\n return {\n percent,\n target: percent,\n total: 1,\n };\n }\n return data;\n}\nfunction dataTransform(data, scale) {\n const { name = 'score', target, total, percent, thresholds = [], } = getGaugeData(data);\n const _target = percent || target;\n const _total = percent ? 1 : total;\n const newScale = Object.assign({ y: {\n domain: [0, _total],\n } }, scale);\n if (!thresholds.length) {\n return {\n targetData: [{ x: name, y: _target, color: 'target' }],\n totalData: [\n { x: name, y: _target, color: 'target' },\n { x: name, y: _total - _target, color: 'total' },\n ],\n target: _target,\n total: _total,\n scale: newScale,\n };\n }\n return {\n targetData: [{ x: name, y: _target, color: 'target' }],\n totalData: thresholds.map((d, i) => ({\n x: name,\n y: i >= 1 ? d - thresholds[i - 1] : d,\n color: i,\n })),\n target: _target,\n total: _total,\n scale: newScale,\n };\n}\nfunction getTextContent(textStyle, { target, total }) {\n const { content } = textStyle;\n return content ? content(target, total) : target.toString();\n}\nconst Gauge = (options) => {\n const { data = {}, scale = {}, style = {}, animate = {}, transform = [] } = options, resOptions = __rest(options, [\"data\", \"scale\", \"style\", \"animate\", \"transform\"]);\n const { targetData, totalData, target, total, scale: newScale, } = dataTransform(data, scale);\n const _a = (0, helper_1.subObject)(style, 'text'), { tooltip } = _a, textStyle = __rest(_a, [\"tooltip\"]);\n // pointer + pin\n const indicatorStyle = (0, helper_1.filterPrefixObject)(style, ['pointer', 'pin']);\n const arcStyle = (0, helper_1.subObject)(style, 'arc');\n const shape = arcStyle.shape;\n return [\n (0, util_1.deepMix)({}, DEFAULT_OPTIONS, Object.assign({ type: 'interval', transform: [{ type: 'stackY' }], data: totalData, scale: newScale, style: shape === 'round' ? Object.assign(Object.assign({}, arcStyle), { shape: shape_1.GaugeRound }) : arcStyle, animate: typeof animate === 'object' ? (0, helper_1.subObject)(animate, 'arc') : animate }, resOptions)),\n (0, util_1.deepMix)({}, DEFAULT_OPTIONS, DEFAULT_INDICATOR_OPTIONS, Object.assign({ type: 'point', data: targetData, scale: newScale, style: indicatorStyle, animate: typeof animate === 'object' ? (0, helper_1.subObject)(animate, 'indicator') : animate }, resOptions)),\n (0, util_1.deepMix)({}, DEFAULT_TEXT_OPTIONS, {\n style: Object.assign({ text: getTextContent(textStyle, { target, total }) }, textStyle),\n tooltip,\n animate: typeof animate === 'object' ? (0, helper_1.subObject)(animate, 'text') : animate,\n }),\n ];\n};\nexports.Gauge = Gauge;\nexports.Gauge.props = {};\n//# sourceMappingURL=gauge.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Density = void 0;\nconst shape_1 = require(\"../shape\");\nconst transform_1 = require(\"../transform\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n density: shape_1.DensityShape,\n};\nconst Density = () => {\n return (index, scale, value, coordinate) => {\n const { x: X, series: S } = value;\n const Yn = Object.entries(value)\n .filter(([key]) => key.startsWith('y'))\n .map(([, value]) => value);\n const SZn = Object.entries(value)\n .filter(([key]) => key.startsWith('size'))\n .map(([, value]) => value);\n // Because x and y channel is not strictly required in Line.props,\n // it should throw error with empty x or y channels.\n if (X === undefined || Yn === undefined || SZn === undefined) {\n throw new Error('Missing encode for x or y or size channel.');\n }\n // Calc width for each box.\n // The scales for x and series channels must be band scale.\n const xScale = scale.x;\n const series = scale.series;\n const P = Array.from(index, (i) => {\n const groupWidth = xScale.getBandWidth(xScale.invert(+X[i]));\n const ratio = series ? series.getBandWidth(series.invert(+(S === null || S === void 0 ? void 0 : S[i]))) : 1;\n const width = groupWidth * ratio;\n const offset = (+(S === null || S === void 0 ? void 0 : S[i]) || 0) * groupWidth;\n const x = +X[i] + offset + width / 2;\n const PN = [\n ...Yn.map((_, idx) => [x + +SZn[idx][i] / index.length, +Yn[idx][i]]),\n ...Yn.map((_, idx) => [\n x - +SZn[idx][i] / index.length,\n +Yn[idx][i],\n ]).reverse(), // left\n ];\n return PN.map((p) => coordinate.map(p));\n });\n return [index, P];\n };\n};\nexports.Density = Density;\nexports.Density.props = {\n defaultShape: 'density',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', scale: 'band', required: true },\n { name: 'y', required: true },\n { name: 'size', required: true },\n { name: 'series', scale: 'band' },\n { name: 'size', required: true, scale: 'identity' },\n ],\n preInference: [\n ...(0, utils_1.basePreInference)(),\n { type: transform_1.MaybeZeroY1 },\n { type: transform_1.MaybeZeroX },\n ],\n postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip1d)()],\n interaction: { shareTooltip: true },\n};\n//# sourceMappingURL=density.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Heatmap = void 0;\nconst shape_1 = require(\"../shape\");\nconst transform_1 = require(\"../transform\");\nconst utils_1 = require(\"./utils\");\nconst shape = {\n heatmap: shape_1.HeatmapShape,\n};\n/**\n * Draw heatmap with gradient.\n */\nconst Heatmap = (options) => {\n return (index, scale, value, coordinate) => {\n const { x: X, y: Y, size: S, color: C } = value;\n const P = Array.from(index, (i) => {\n // Default size = 40.\n const r = S ? +S[i] : 40;\n // Warning: x, y, value, radius.\n return [...coordinate.map([+X[i], +Y[i]]), C[i], r];\n });\n return [[0], [P]];\n };\n};\nexports.Heatmap = Heatmap;\nexports.Heatmap.props = {\n defaultShape: 'heatmap',\n defaultLabelShape: 'label',\n composite: false,\n shape,\n channels: [\n ...(0, utils_1.baseGeometryChannels)({ shapes: Object.keys(shape) }),\n { name: 'x', required: true },\n { name: 'y', required: true },\n { name: 'color', scale: 'identity', required: true },\n { name: 'size' },\n ],\n preInference: [\n ...(0, utils_1.basePreInference)(),\n { type: transform_1.MaybeZeroX },\n { type: transform_1.MaybeZeroY },\n ],\n postInference: [...(0, utils_1.basePostInference)(), ...(0, utils_1.tooltip2d)()],\n};\n//# sourceMappingURL=heatmap.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Liquid = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"../utils/helper\");\nconst number_1 = require(\"../utils/number\");\nconst shape_1 = require(\"../shape\");\nconst DEFAULT_OPTIONS = {\n axis: {\n x: false,\n y: false,\n },\n legend: false,\n tooltip: false,\n encode: {\n x: 'type',\n y: 'percent',\n },\n scale: {\n y: {\n domain: [0, 1],\n },\n },\n style: {\n shape: shape_1.LiquidShape,\n },\n animate: {\n enter: {\n type: 'fadeIn',\n },\n },\n};\nconst DEFAULT_TEXT_OPTIONS = {\n type: 'text',\n style: {\n x: '50%',\n y: '50%',\n textAlign: 'center',\n textBaseline: 'middle',\n fontSize: 20,\n fontWeight: 800,\n fill: '#888',\n },\n animate: {\n enter: {\n type: 'fadeIn',\n },\n },\n};\nconst Liquid = (options) => {\n const { data = {}, style = {}, animate } = options, resOptions = __rest(options, [\"data\", \"style\", \"animate\"]);\n // Compatible with old data structures: { percent: number } and percent >= 0.\n const percent = Math.max(0, (0, util_1.isNumber)(data) ? data : data === null || data === void 0 ? void 0 : data.percent);\n const newData = [{ percent, type: 'liquid' }];\n const contentStyle = Object.assign(Object.assign({}, (0, helper_1.subObject)(style, 'text')), (0, helper_1.subObject)(style, 'content'));\n const outline = (0, helper_1.subObject)(style, 'outline');\n const wave = (0, helper_1.subObject)(style, 'wave');\n const background = (0, helper_1.subObject)(style, 'background');\n return [\n (0, util_1.deepMix)({}, DEFAULT_OPTIONS, Object.assign({ type: 'interval', data: newData, style: {\n liquidOptions: {\n percent,\n liquidShape: style === null || style === void 0 ? void 0 : style.shape,\n },\n styleOptions: Object.assign(Object.assign({}, style), { outline,\n wave,\n background }),\n }, animate }, resOptions)),\n (0, util_1.deepMix)({}, DEFAULT_TEXT_OPTIONS, {\n style: Object.assign({ text: `${(0, number_1.prettyNumber)(percent * 100)} %` }, contentStyle),\n animate,\n }),\n ];\n};\nexports.Liquid = Liquid;\nexports.Liquid.props = {};\n//# sourceMappingURL=liquid.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Category20 = exports.Category10 = void 0;\nvar category10_1 = require(\"./category10\");\nObject.defineProperty(exports, \"Category10\", { enumerable: true, get: function () { return category10_1.Category10; } });\nvar category20_1 = require(\"./category20\");\nObject.defineProperty(exports, \"Category20\", { enumerable: true, get: function () { return category20_1.Category20; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Category10 = void 0;\n/**\n * Classic palette of AntV for ordinal data with 10 colors.\n */\nconst Category10 = () => {\n return [\n '#5B8FF9',\n '#5AD8A6',\n '#5D7092',\n '#F6BD16',\n '#6F5EF9',\n '#6DC8EC',\n '#945FB9',\n '#FF9845',\n '#1E9493',\n '#FF99C3',\n ];\n};\nexports.Category10 = Category10;\nexports.Category10.props = {};\n//# sourceMappingURL=category10.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Category20 = void 0;\n/**\n * Classic palette of AntV for ordinal data with 20 colors.\n */\nconst Category20 = () => {\n return [\n '#5B8FF9',\n '#CDDDFD',\n '#5AD8A6',\n '#CDF3E4',\n '#5D7092',\n '#CED4DE',\n '#F6BD16',\n '#FCEBB9',\n '#6F5EF9',\n '#D3CEFD',\n '#6DC8EC',\n '#D3EEF9',\n '#945FB9',\n '#DECFEA',\n '#FF9845',\n '#FFE0C7',\n '#1E9493',\n '#BBDEDE',\n '#FF99C3',\n '#FFE0ED',\n ];\n};\nexports.Category20 = Category20;\nexports.Category20.props = {};\n//# sourceMappingURL=category20.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Constant = exports.Sequential = exports.Sqrt = exports.Quantize = exports.Quantile = exports.Threshold = exports.Pow = exports.Log = exports.Time = exports.Point = exports.Identity = exports.Ordinal = exports.Linear = exports.Band = void 0;\nvar band_1 = require(\"./band\");\nObject.defineProperty(exports, \"Band\", { enumerable: true, get: function () { return band_1.Band; } });\nvar linear_1 = require(\"./linear\");\nObject.defineProperty(exports, \"Linear\", { enumerable: true, get: function () { return linear_1.Linear; } });\nvar ordinal_1 = require(\"./ordinal\");\nObject.defineProperty(exports, \"Ordinal\", { enumerable: true, get: function () { return ordinal_1.Ordinal; } });\nvar identity_1 = require(\"./identity\");\nObject.defineProperty(exports, \"Identity\", { enumerable: true, get: function () { return identity_1.Identity; } });\nvar point_1 = require(\"./point\");\nObject.defineProperty(exports, \"Point\", { enumerable: true, get: function () { return point_1.Point; } });\nvar time_1 = require(\"./time\");\nObject.defineProperty(exports, \"Time\", { enumerable: true, get: function () { return time_1.Time; } });\nvar log_1 = require(\"./log\");\nObject.defineProperty(exports, \"Log\", { enumerable: true, get: function () { return log_1.Log; } });\nvar pow_1 = require(\"./pow\");\nObject.defineProperty(exports, \"Pow\", { enumerable: true, get: function () { return pow_1.Pow; } });\nvar threshold_1 = require(\"./threshold\");\nObject.defineProperty(exports, \"Threshold\", { enumerable: true, get: function () { return threshold_1.Threshold; } });\nvar quantile_1 = require(\"./quantile\");\nObject.defineProperty(exports, \"Quantile\", { enumerable: true, get: function () { return quantile_1.Quantile; } });\nvar quantize_1 = require(\"./quantize\");\nObject.defineProperty(exports, \"Quantize\", { enumerable: true, get: function () { return quantize_1.Quantize; } });\nvar sqrt_1 = require(\"./sqrt\");\nObject.defineProperty(exports, \"Sqrt\", { enumerable: true, get: function () { return sqrt_1.Sqrt; } });\nvar sequential_1 = require(\"./sequential\");\nObject.defineProperty(exports, \"Sequential\", { enumerable: true, get: function () { return sequential_1.Sequential; } });\nvar constant_1 = require(\"./constant\");\nObject.defineProperty(exports, \"Constant\", { enumerable: true, get: function () { return constant_1.Constant; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Band = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst Band = (options) => {\n return new scale_1.Band(options);\n};\nexports.Band = Band;\nexports.Band.props = {};\n//# sourceMappingURL=band.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Linear = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst Linear = (options) => {\n return new scale_1.Linear(options);\n};\nexports.Linear = Linear;\nexports.Linear.props = {};\n//# sourceMappingURL=linear.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Ordinal = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst Ordinal = (options) => {\n return new scale_1.Ordinal(options);\n};\nexports.Ordinal = Ordinal;\nexports.Ordinal.props = {};\n//# sourceMappingURL=ordinal.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Identity = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst Identity = (options) => {\n return new scale_1.Identity(options);\n};\nexports.Identity = Identity;\nexports.Identity.props = {};\n//# sourceMappingURL=identity.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Point = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst Point = (options) => {\n return new scale_1.Point(options);\n};\nexports.Point = Point;\nexports.Point.props = {};\n//# sourceMappingURL=point.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Time = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst Time = (options) => {\n return new scale_1.Time(options);\n};\nexports.Time = Time;\nexports.Time.props = {};\n//# sourceMappingURL=time.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Log = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst Log = (options) => {\n return new scale_1.Log(options);\n};\nexports.Log = Log;\nexports.Log.props = {};\n//# sourceMappingURL=log.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Pow = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst Pow = (options) => {\n return new scale_1.Pow(options);\n};\nexports.Pow = Pow;\nexports.Pow.props = {};\n//# sourceMappingURL=pow.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Threshold = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst Threshold = (options) => {\n return new scale_1.Threshold(options);\n};\nexports.Threshold = Threshold;\nexports.Threshold.props = {};\n//# sourceMappingURL=threshold.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Quantile = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst Quantile = (options) => {\n return new scale_1.Quantile(options);\n};\nexports.Quantile = Quantile;\nexports.Quantile.props = {};\n//# sourceMappingURL=quantile.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Quantize = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst Quantize = (options) => {\n return new scale_1.Quantize(options);\n};\nexports.Quantize = Quantize;\nexports.Quantize.props = {};\n//# sourceMappingURL=quantize.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Sqrt = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst Sqrt = (options) => {\n return new scale_1.Sqrt(options);\n};\nexports.Sqrt = Sqrt;\nexports.Sqrt.props = {};\n//# sourceMappingURL=sqrt.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Sequential = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst Sequential = (options) => {\n return new scale_1.Sequential(options);\n};\nexports.Sequential = Sequential;\nexports.Sequential.props = {};\n//# sourceMappingURL=sequential.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Constant = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst Constant = (options) => {\n return new scale_1.Constant(options);\n};\nexports.Constant = Constant;\nexports.Constant.props = {};\n//# sourceMappingURL=constant.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Dark = exports.Light = exports.Academy = exports.ClassicDark = exports.Classic = void 0;\nvar classic_1 = require(\"./classic\");\nObject.defineProperty(exports, \"Classic\", { enumerable: true, get: function () { return classic_1.Classic; } });\nvar classicDark_1 = require(\"./classicDark\");\nObject.defineProperty(exports, \"ClassicDark\", { enumerable: true, get: function () { return classicDark_1.ClassicDark; } });\nvar academy_1 = require(\"./academy\");\nObject.defineProperty(exports, \"Academy\", { enumerable: true, get: function () { return academy_1.Academy; } });\nvar light_1 = require(\"./light\");\nObject.defineProperty(exports, \"Light\", { enumerable: true, get: function () { return light_1.Light; } });\nvar dark_1 = require(\"./dark\");\nObject.defineProperty(exports, \"Dark\", { enumerable: true, get: function () { return dark_1.Dark; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Classic = void 0;\nconst util_1 = require(\"@antv/util\");\nconst light_1 = require(\"./light\");\n/**\n * Default theme.\n */\nconst Classic = (options) => {\n return (0, util_1.deepMix)({}, (0, light_1.Light)(), {\n category10: 'category10',\n category20: 'category20',\n }, options);\n};\nexports.Classic = Classic;\nexports.Classic.props = {};\n//# sourceMappingURL=classic.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Light = exports.tokens = void 0;\nconst util_1 = require(\"@antv/util\");\nconst create_1 = require(\"./create\");\nexports.tokens = {\n colorBlack: '#1D2129',\n colorWhite: '#ffffff',\n colorStroke: '#416180',\n colorDefault: '#1783FF',\n colorBackground: 'transparent',\n category10: [\n '#1783FF',\n '#00C9C9',\n '#F0884D',\n '#D580FF',\n '#7863FF',\n '#60C42D',\n '#BD8F24',\n '#FF80CA',\n '#2491B3',\n '#17C76F',\n ],\n category20: [\n '#1783FF',\n '#00C9C9',\n '#F0884D',\n '#D580FF',\n '#7863FF',\n '#60C42D',\n '#BD8F24',\n '#FF80CA',\n '#2491B3',\n '#17C76F',\n '#AABA01',\n '#BC7CFC',\n '#237CBC',\n '#2DE379',\n '#CE8032',\n '#FF7AF4',\n '#545FD3',\n '#AFE410',\n '#D8C608',\n '#FFA1E0',\n ],\n padding1: 8,\n padding2: 12,\n padding3: 20,\n alpha90: 0.9,\n alpha65: 0.65,\n alpha45: 0.45,\n alpha25: 0.25,\n alpha10: 0.1,\n};\nconst defaults = (0, create_1.create)(exports.tokens);\n/**\n * Default theme.\n */\nconst Light = (options) => {\n return (0, util_1.deepMix)({}, defaults, options);\n};\nexports.Light = Light;\nexports.Light.props = {};\n//# sourceMappingURL=light.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.create = void 0;\nfunction create({ colorDefault, colorBlack, colorWhite, colorStroke, colorBackground, padding1, padding2, padding3, alpha90, alpha65, alpha45, alpha25, alpha10, category10, category20, sizeDefault = 1, padding = 'auto', margin = 16, }) {\n return {\n padding,\n margin,\n size: sizeDefault,\n color: colorDefault,\n category10,\n category20,\n enter: {\n duration: 300,\n fill: 'both',\n delay: 0,\n },\n update: {\n duration: 300,\n fill: 'both',\n delay: 0,\n },\n exit: {\n duration: 300,\n fill: 'both',\n delay: 0,\n },\n view: {\n viewFill: colorBackground,\n plotFill: 'transparent',\n mainFill: 'transparent',\n contentFill: 'transparent',\n },\n line: {\n line: {\n fill: '',\n strokeOpacity: 1,\n lineWidth: 1,\n lineCap: 'round',\n },\n },\n point: {\n point: {\n r: 3,\n fillOpacity: 0.95,\n lineWidth: 0,\n },\n hollow: {\n r: 3,\n strokeOpacity: 0.95,\n lineWidth: 1,\n },\n plus: {\n r: 3,\n strokeOpacity: 0.95,\n lineWidth: 3,\n },\n diamond: {\n r: 3,\n strokeOpacity: 0.95,\n lineWidth: 1,\n },\n },\n interval: {\n rect: {\n fillOpacity: 0.95,\n },\n hollow: {\n fill: '',\n strokeOpacity: 1,\n lineWidth: 2,\n },\n },\n area: {\n area: {\n fillOpacity: 0.85,\n lineWidth: 0,\n },\n },\n polygon: {\n polygon: {\n fillOpacity: 0.95,\n },\n },\n cell: {\n cell: {\n fillOpacity: 0.95,\n },\n hollow: {\n fill: '',\n strokeOpacity: 1,\n lineWidth: 2,\n },\n },\n rect: {\n rect: {\n fillOpacity: 0.95,\n },\n hollow: {\n fill: '',\n strokeOpacity: 1,\n lineWidth: 2,\n },\n },\n link: {\n link: {\n fill: '',\n strokeOpacity: 1,\n },\n },\n vector: {\n vector: {\n fillOpacity: 1,\n },\n },\n box: {\n box: {\n fillOpacity: 0.95,\n stroke: colorBlack,\n lineWidth: 1,\n },\n },\n text: {\n text: {\n fill: '#1D2129',\n fontSize: 12,\n lineWidth: 0,\n connectorStroke: colorStroke,\n connectorStrokeOpacity: 0.45,\n connectorLineWidth: 1,\n backgroundFill: colorStroke,\n backgroundFillOpacity: 0.15,\n backgroundPadding: [2, 4],\n startMarkerSymbol: 'circle',\n startMarkerSize: 4,\n endMarkerSymbol: 'circle',\n endMarkerSize: 4,\n },\n badge: {\n fill: '#1D2129',\n fillOpacity: 0.65,\n lineWidth: 0,\n fontSize: 10,\n textAlign: 'center',\n textBaseline: 'middle',\n markerFill: colorStroke,\n markerFillOpacity: 0.25,\n markerStrokeOpacity: 0,\n },\n },\n lineX: {\n line: {\n stroke: colorStroke,\n strokeOpacity: 0.45,\n lineWidth: 1,\n },\n },\n lineY: {\n line: {\n stroke: colorStroke,\n strokeOpacity: 0.45,\n lineWidth: 1,\n },\n },\n rangeX: {\n range: {\n fill: colorStroke,\n fillOpacity: 0.15,\n lineWidth: 0,\n },\n },\n rangeY: {\n range: {\n fill: colorStroke,\n fillOpacity: 0.15,\n lineWidth: 0,\n },\n },\n connector: {\n connector: {\n stroke: colorStroke,\n strokeOpacity: 0.45,\n lineWidth: 1,\n connectLength1: 12,\n endMarker: true,\n endMarkerSize: 6,\n endMarkerFill: colorStroke,\n endMarkerFillOpacity: 0.95,\n },\n },\n axis: {\n arrow: false,\n gridLineDash: [3, 4],\n gridLineWidth: 0.5,\n gridStroke: colorBlack,\n gridStrokeOpacity: alpha10,\n labelAlign: 'horizontal',\n labelFill: colorBlack,\n labelOpacity: alpha45,\n labelFontSize: 12,\n labelFontWeight: 'normal',\n labelSpacing: padding1,\n line: false,\n lineLineWidth: 0.5,\n lineStroke: colorBlack,\n lineStrokeOpacity: alpha45,\n tickLength: 4,\n tickLineWidth: 1,\n tickStroke: colorBlack,\n tickOpacity: alpha45,\n titleFill: colorBlack,\n titleOpacity: alpha90,\n titleFontSize: 12,\n titleFontWeight: 'normal',\n titleSpacing: 12,\n titleTransformOrigin: 'center',\n lineArrowOffset: 6,\n lineArrowSize: 6,\n },\n axisTop: {\n gridDirection: 'positive',\n labelDirection: 'negative',\n tickDirection: 'negative',\n titlePosition: 'top',\n titleSpacing: 12,\n labelSpacing: 4,\n titleTextBaseline: 'middle',\n },\n axisBottom: {\n gridDirection: 'negative',\n labelDirection: 'positive',\n tickDirection: 'positive',\n titlePosition: 'bottom',\n titleSpacing: 12,\n labelSpacing: 4,\n titleTextBaseline: 'bottom',\n titleTransform: 'translate(0, 8)',\n },\n axisLeft: {\n gridDirection: 'positive',\n labelDirection: 'negative',\n labelSpacing: 4,\n tickDirection: 'negative',\n titlePosition: 'left',\n titleSpacing: 12,\n titleTextBaseline: 'middle',\n titleDirection: 'vertical',\n titleTransform: 'rotate(-90) translate(0, -8)',\n titleTransformOrigin: 'center',\n },\n axisRight: {\n gridDirection: 'negative',\n labelDirection: 'positive',\n labelSpacing: 4,\n tickDirection: 'positive',\n titlePosition: 'right',\n titleSpacing: 12,\n titleTextBaseline: 'top',\n titleDirection: 'vertical',\n titleTransformOrigin: 'center',\n },\n axisLinear: {\n girdClosed: true,\n gridConnect: 'arc',\n gridDirection: 'negative',\n gridType: 'surround',\n titlePosition: 'top',\n titleSpacing: 0,\n },\n axisArc: {\n title: false,\n titlePosition: 'inner',\n line: false,\n tick: true,\n labelSpacing: 4,\n },\n axisRadar: {\n girdClosed: true,\n gridStrokeOpacity: 0.3,\n gridType: 'surround',\n tick: false,\n titlePosition: 'start',\n },\n legendCategory: {\n backgroundFill: 'transparent',\n itemBackgroundFill: 'transparent',\n itemLabelFill: colorBlack,\n itemLabelFillOpacity: alpha90,\n itemLabelFontSize: 12,\n itemLabelFontWeight: 'normal',\n itemMarkerFillOpacity: 1,\n itemMarkerSize: 8,\n itemSpacing: [padding1, padding1],\n itemValueFill: colorBlack,\n itemValueFillOpacity: 0.65,\n itemValueFontSize: 12,\n itemValueFontWeight: 'normal',\n navButtonFill: colorBlack,\n navButtonFillOpacity: 0.65,\n navPageNumFill: colorBlack,\n navPageNumFillOpacity: 0.45,\n navPageNumFontSize: 12,\n padding: 8,\n title: false,\n titleFill: colorBlack,\n titleFillOpacity: 0.65,\n titleFontSize: 12,\n titleFontWeight: 'normal',\n titleSpacing: 4,\n tickStroke: colorBlack,\n tickStrokeOpacity: 0.25,\n rowPadding: padding1,\n colPadding: padding2,\n maxRows: 3,\n maxCols: 3,\n },\n legendContinuous: {\n handleHeight: 12,\n handleLabelFill: colorBlack,\n handleLabelFillOpacity: alpha45,\n handleLabelFontSize: 12,\n handleLabelFontWeight: 'normal',\n handleMarkerFill: colorBlack,\n handleMarkerFillOpacity: 0.6,\n handleMarkerLineWidth: 1,\n handleMarkerStroke: colorBlack,\n handleMarkerStrokeOpacity: 0.25,\n handleWidth: 10,\n labelFill: colorBlack,\n labelFillOpacity: alpha45,\n labelFontSize: 12,\n labelFontWeight: 'normal',\n labelSpacing: 3,\n tick: true,\n tickLength: 12,\n ribbonSize: 12,\n ribbonFill: '#aaa',\n handle: true,\n handleLabel: false,\n handleShape: 'slider',\n handleIconSize: 12 / 1.8,\n indicator: false,\n titleFontSize: 12,\n titleSpacing: 4,\n titleFontWeight: 'normal',\n titleFillOpacity: alpha90,\n tickStroke: colorBlack,\n tickStrokeOpacity: alpha45,\n },\n label: {\n fill: colorBlack,\n fillOpacity: 0.65,\n fontSize: 12,\n fontWeight: 'normal',\n stroke: undefined,\n offset: 12,\n connectorStroke: colorBlack,\n connectorStrokeOpacity: 0.45,\n connectorLineWidth: 1,\n connectorLength: 12,\n connectorLength2: 8,\n connectorDistance: 4,\n },\n innerLabel: {\n fill: colorWhite,\n fontSize: 12,\n fillOpacity: 0.85,\n fontWeight: 'normal',\n stroke: undefined,\n offset: 0,\n },\n htmlLabel: {\n fontSize: 12,\n opacity: 0.65,\n color: colorBlack,\n fontWeight: 'normal',\n },\n slider: {\n trackSize: 16,\n trackFill: colorStroke,\n trackFillOpacity: 1,\n selectionFill: colorDefault,\n selectionFillOpacity: 0.15,\n handleIconSize: 10,\n handleIconFill: '#f7f7f7',\n handleIconFillOpacity: 1,\n handleIconStroke: colorBlack,\n handleIconStrokeOpacity: 0.25,\n handleIconLineWidth: 1,\n handleIconRadius: 2,\n handleLabelFill: colorBlack,\n handleLabelFillOpacity: 0.45,\n handleLabelFontSize: 12,\n handleLabelFontWeight: 'normal',\n },\n scrollbar: {\n padding: [0, 0, 0, 0],\n trackSize: 6,\n isRound: true,\n slidable: true,\n scrollable: true,\n trackFill: '#e5e5e5',\n trackFillOpacity: 0,\n thumbFill: '#000',\n thumbFillOpacity: 0.15,\n thumbHighlightedFillOpacity: 0.2,\n },\n title: {\n spacing: 8,\n titleFill: colorBlack,\n titleFillOpacity: alpha90,\n titleFontSize: 16,\n titleFontWeight: 'bold',\n titleTextBaseline: 'top',\n subtitleFill: colorBlack,\n subtitleFillOpacity: alpha65,\n subtitleFontSize: 12,\n subtitleFontWeight: 'normal',\n subtitleTextBaseline: 'top',\n },\n tooltip: {\n css: {\n '.g2-tooltip': {\n 'font-family': 'sans-serif',\n },\n },\n },\n };\n}\nexports.create = create;\n//# sourceMappingURL=create.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ClassicDark = void 0;\nconst dark_1 = require(\"./dark\");\n/**\n * Dark theme.\n */\nconst ClassicDark = (options) => {\n return Object.assign({}, (0, dark_1.Dark)(), {\n category10: 'category10',\n category20: 'category20',\n }, options);\n};\nexports.ClassicDark = ClassicDark;\nexports.ClassicDark.props = {};\n//# sourceMappingURL=classicDark.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Dark = exports.tokens = void 0;\nconst util_1 = require(\"@antv/util\");\nconst create_1 = require(\"./create\");\nexports.tokens = {\n colorBlack: '#fff',\n colorWhite: '#000',\n colorStroke: '#416180',\n colorDefault: '#1783FF',\n colorBackground: 'transparent',\n category10: [\n '#1783FF',\n '#00C9C9',\n '#F0884D',\n '#D580FF',\n '#7863FF',\n '#60C42D',\n '#BD8F24',\n '#FF80CA',\n '#2491B3',\n '#17C76F',\n ],\n category20: [\n '#1783FF',\n '#00C9C9',\n '#F0884D',\n '#D580FF',\n '#7863FF',\n '#60C42D',\n '#BD8F24',\n '#FF80CA',\n '#2491B3',\n '#17C76F',\n '#AABA01',\n '#BC7CFC',\n '#237CBC',\n '#2DE379',\n '#CE8032',\n '#FF7AF4',\n '#545FD3',\n '#AFE410',\n '#D8C608',\n '#FFA1E0',\n ],\n padding1: 8,\n padding2: 12,\n padding3: 20,\n alpha90: 0.9,\n alpha65: 0.65,\n alpha45: 0.45,\n alpha25: 0.25,\n alpha10: 0.25,\n};\nconst defaults = (0, create_1.create)(exports.tokens);\nconst Dark = (options) => {\n return (0, util_1.deepMix)({}, defaults, {\n tooltip: {\n crosshairsStroke: '#fff',\n crosshairsLineWidth: 1,\n crosshairsStrokeOpacity: 0.25,\n css: {\n '.g2-tooltip': {\n background: '#1f1f1f',\n opacity: 0.95,\n },\n '.g2-tooltip-title': {\n color: '#A6A6A6',\n },\n '.g2-tooltip-list-item-name-label': {\n color: '#A6A6A6',\n },\n '.g2-tooltip-list-item-value': {\n color: '#A6A6A6',\n },\n },\n },\n }, options);\n};\nexports.Dark = Dark;\n//# sourceMappingURL=dark.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Academy = exports.tokens = void 0;\nconst util_1 = require(\"@antv/util\");\nconst create_1 = require(\"./create\");\nexports.tokens = {\n colorBlack: '#000',\n colorWhite: '#fff',\n colorStroke: '#888',\n colorDefault: '#4e79a7',\n colorBackground: 'transparent',\n category10: [\n '#4e79a7',\n '#f28e2c',\n '#e15759',\n '#76b7b2',\n '#59a14f',\n '#edc949',\n '#af7aa1',\n '#ff9da7',\n '#9c755f',\n '#bab0ab',\n ],\n category20: [\n '#4e79a7',\n '#f28e2c',\n '#e15759',\n '#76b7b2',\n '#59a14f',\n '#edc949',\n '#af7aa1',\n '#ff9da7',\n '#9c755f',\n '#bab0ab',\n ],\n padding1: 8,\n padding2: 12,\n padding3: 20,\n alpha90: 0.9,\n alpha65: 0.65,\n alpha45: 0.45,\n alpha25: 0.25,\n alpha10: 0.1,\n};\nconst defaults = (0, create_1.create)(exports.tokens);\nconst Academy = (options) => {\n return (0, util_1.deepMix)({}, defaults, {\n text: { text: { fontSize: 10 } },\n axis: {\n gridLineDash: [0, 0],\n gridLineWidth: 1,\n gridStroke: '#ddd',\n gridStrokeOpacity: 1,\n labelOpacity: 1,\n labelStrokeOpacity: 1,\n labelFontSize: 10,\n line: true,\n lineLineWidth: 1,\n lineStroke: '#888',\n lineStrokeOpacity: 1,\n tickLength: 5,\n tickStrokeOpacity: 1,\n titleOpacity: 1,\n titleStrokeOpacity: 1,\n titleFillOpacity: 1,\n titleFontSize: 11,\n titleFontWeight: 'bold',\n },\n axisLeft: {\n gridFilter: (_, i) => i !== 0,\n },\n axisRight: {\n gridFilter: (_, i) => i !== 0,\n },\n legendCategory: {\n itemLabelFillOpacity: 1,\n itemLabelFontSize: 10,\n itemValueFillOpacity: 1,\n itemValueFontSize: 10,\n titleFillOpacity: 1,\n titleFontSize: 11,\n titleFontWeight: 'bold',\n },\n legendContinuous: {\n handleLabelFontSize: 10,\n labelFillOpacity: 0.45,\n labelFontSize: 10,\n },\n label: {\n fontSize: 10,\n },\n innerLabel: {\n fontSize: 10,\n },\n htmlLabel: {\n fontSize: 10,\n },\n slider: {\n handleLabelFontSize: 10,\n trackFillOpacity: 0.05,\n },\n }, options);\n};\nexports.Academy = Academy;\nexports.Academy.props = {};\n//# sourceMappingURL=academy.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Legends = exports.ScrollbarY = exports.ScrollbarX = exports.SliderY = exports.SliderX = exports.TitleComponent = exports.LegendContinuousSize = exports.LegendContinuousBlockSize = exports.LegendContinuousBlock = exports.LegendContinuous = exports.LegendCategory = exports.AxisRadar = exports.AxisY = exports.AxisX = exports.AxisArc = exports.AxisLinear = void 0;\nvar axis_1 = require(\"./axis\");\nObject.defineProperty(exports, \"AxisLinear\", { enumerable: true, get: function () { return axis_1.LinearAxis; } });\nObject.defineProperty(exports, \"AxisArc\", { enumerable: true, get: function () { return axis_1.ArcAxis; } });\nvar axisX_1 = require(\"./axisX\");\nObject.defineProperty(exports, \"AxisX\", { enumerable: true, get: function () { return axisX_1.AxisX; } });\nvar axisY_1 = require(\"./axisY\");\nObject.defineProperty(exports, \"AxisY\", { enumerable: true, get: function () { return axisY_1.AxisY; } });\nvar axisRadar_1 = require(\"./axisRadar\");\nObject.defineProperty(exports, \"AxisRadar\", { enumerable: true, get: function () { return axisRadar_1.AxisRadar; } });\nvar legendCategory_1 = require(\"./legendCategory\");\nObject.defineProperty(exports, \"LegendCategory\", { enumerable: true, get: function () { return legendCategory_1.LegendCategory; } });\nvar legendContinuous_1 = require(\"./legendContinuous\");\nObject.defineProperty(exports, \"LegendContinuous\", { enumerable: true, get: function () { return legendContinuous_1.LegendContinuous; } });\nvar legendContinuousBlock_1 = require(\"./legendContinuousBlock\");\nObject.defineProperty(exports, \"LegendContinuousBlock\", { enumerable: true, get: function () { return legendContinuousBlock_1.LegendContinuousBlock; } });\nvar legendContinuousBlockSize_1 = require(\"./legendContinuousBlockSize\");\nObject.defineProperty(exports, \"LegendContinuousBlockSize\", { enumerable: true, get: function () { return legendContinuousBlockSize_1.LegendContinuousBlockSize; } });\nvar legendContinuousSize_1 = require(\"./legendContinuousSize\");\nObject.defineProperty(exports, \"LegendContinuousSize\", { enumerable: true, get: function () { return legendContinuousSize_1.LegendContinuousSize; } });\nvar title_1 = require(\"./title\");\nObject.defineProperty(exports, \"TitleComponent\", { enumerable: true, get: function () { return title_1.TitleComponent; } });\nvar sliderX_1 = require(\"./sliderX\");\nObject.defineProperty(exports, \"SliderX\", { enumerable: true, get: function () { return sliderX_1.SliderX; } });\nvar sliderY_1 = require(\"./sliderY\");\nObject.defineProperty(exports, \"SliderY\", { enumerable: true, get: function () { return sliderY_1.SliderY; } });\nvar scrollbarX_1 = require(\"./scrollbarX\");\nObject.defineProperty(exports, \"ScrollbarX\", { enumerable: true, get: function () { return scrollbarX_1.ScrollbarX; } });\nvar scrollbarY_1 = require(\"./scrollbarY\");\nObject.defineProperty(exports, \"ScrollbarY\", { enumerable: true, get: function () { return scrollbarY_1.ScrollbarY; } });\nvar legends_1 = require(\"./legends\");\nObject.defineProperty(exports, \"Legends\", { enumerable: true, get: function () { return legends_1.Legends; } });\n//# sourceMappingURL=index.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ArcAxis = exports.LinearAxis = exports.rotateAxis = void 0;\nconst component_1 = require(\"@antv/component\");\nconst scale_1 = require(\"@antv/scale\");\nconst util_1 = require(\"@antv/util\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst d3_format_1 = require(\"@antv/vendor/d3-format\");\nconst coordinate_1 = require(\"../utils/coordinate\");\nconst number_1 = require(\"../utils/number\");\nconst helper_1 = require(\"../utils/helper\");\nconst utils_1 = require(\"./utils\");\nfunction rotateAxis(axis, options) {\n const { eulerAngles, origin } = options;\n if (origin) {\n axis.setOrigin(origin);\n }\n if (eulerAngles) {\n axis.rotate(eulerAngles[0], eulerAngles[1], eulerAngles[2]);\n }\n}\nexports.rotateAxis = rotateAxis;\nfunction sizeOf(coordinate) {\n // @ts-ignore\n const { innerWidth, innerHeight, depth } = coordinate.getOptions();\n return [innerWidth, innerHeight, depth];\n}\nfunction createFisheye(position, coordinate) {\n const { width, height } = coordinate.getOptions();\n return (tick) => {\n if (!(0, coordinate_1.isFisheye)(coordinate))\n return tick;\n const tickPoint = position === 'bottom' ? [tick, 1] : [0, tick];\n const vector = coordinate.map(tickPoint);\n if (position === 'bottom') {\n const v = vector[0];\n const x = new scale_1.Linear({\n domain: [0, width],\n range: [0, 1],\n });\n return x.map(v);\n }\n else if (position === 'left') {\n const v = vector[1];\n const x = new scale_1.Linear({\n domain: [0, height],\n range: [0, 1],\n });\n return x.map(v);\n }\n return tick;\n };\n}\nfunction ticksOf(scale, domain, tickMethod) {\n if (scale.getTicks)\n return scale.getTicks();\n if (!tickMethod)\n return domain;\n const [min, max] = (0, d3_array_1.extent)(domain, (d) => +d);\n const { tickCount } = scale.getOptions();\n return tickMethod(min, max, tickCount);\n}\n// Set inset for axis.\nfunction createInset(position, coordinate) {\n if ((0, coordinate_1.isPolar)(coordinate))\n return (d) => d;\n const options = coordinate.getOptions();\n const { innerWidth, innerHeight, insetTop, insetBottom, insetLeft, insetRight, } = options;\n const [start, end, size] = position === 'left' || position === 'right'\n ? [insetTop, insetBottom, innerHeight]\n : [insetLeft, insetRight, innerWidth];\n const x = new scale_1.Linear({\n domain: [0, 1],\n range: [start / size, 1 - end / size],\n });\n return (i) => x.map(i);\n}\n/**\n * Calc ticks based on scale and coordinate.\n */\nfunction getData(scale, domain, tickCount, defaultTickFormatter, tickFilter, tickMethod, position, coordinate) {\n var _a;\n if (tickCount !== undefined || tickMethod !== undefined) {\n scale.update(Object.assign(Object.assign({}, (tickCount && { tickCount })), (tickMethod && { tickMethod })));\n }\n const ticks = ticksOf(scale, domain, tickMethod);\n const filteredTicks = tickFilter ? ticks.filter(tickFilter) : ticks;\n const toString = (d) => d instanceof Date\n ? String(d)\n : typeof d === 'object' && !!d\n ? d\n : String(d);\n const labelFormatter = defaultTickFormatter || ((_a = scale.getFormatter) === null || _a === void 0 ? void 0 : _a.call(scale)) || toString;\n const applyInset = createInset(position, coordinate);\n const applyFisheye = createFisheye(position, coordinate);\n const isHorizontal = (position) => ['top', 'bottom', 'center', 'outer'].includes(position);\n const isVertical = (position) => ['left', 'right'].includes(position);\n // @todo GUI should consider the overlap problem for the first\n // and label of arc axis.\n if ((0, coordinate_1.isPolar)(coordinate) || (0, coordinate_1.isTranspose)(coordinate)) {\n return filteredTicks.map((d, i, array) => {\n var _a, _b;\n const offset = ((_a = scale.getBandWidth) === null || _a === void 0 ? void 0 : _a.call(scale, d)) / 2 || 0;\n const tick = applyInset(scale.map(d) + offset);\n const shouldReverse = ((0, coordinate_1.isRadial)(coordinate) && position === 'center') ||\n ((0, coordinate_1.isTranspose)(coordinate) &&\n ((_b = scale.getTicks) === null || _b === void 0 ? void 0 : _b.call(scale)) &&\n isHorizontal(position)) ||\n ((0, coordinate_1.isTranspose)(coordinate) && isVertical(position));\n return {\n value: shouldReverse ? 1 - tick : tick,\n label: toString(labelFormatter((0, number_1.prettyNumber)(d), i, array)),\n id: String(i),\n };\n });\n }\n return filteredTicks.map((d, i, array) => {\n var _a;\n const offset = ((_a = scale.getBandWidth) === null || _a === void 0 ? void 0 : _a.call(scale, d)) / 2 || 0;\n const tick = applyFisheye(applyInset(scale.map(d) + offset));\n const shouldReverse = isVertical(position);\n return {\n value: shouldReverse ? 1 - tick : tick,\n label: toString(labelFormatter((0, number_1.prettyNumber)(d), i, array)),\n id: String(i),\n };\n });\n}\nfunction inferGridLength(position, coordinate, plane = 'xy') {\n const [width, height, depth] = sizeOf(coordinate);\n if (plane === 'xy') {\n if (position.includes('bottom') || position.includes('top'))\n return height;\n return width;\n }\n else if (plane === 'xz') {\n if (position.includes('bottom') || position.includes('top'))\n return depth;\n return width;\n }\n else {\n if (position.includes('bottom') || position.includes('top'))\n return height;\n return depth;\n }\n}\nfunction inferLabelOverlap(transform = [], style) {\n if (transform.length > 0)\n return transform;\n const { labelAutoRotate, labelAutoHide, labelAutoEllipsis, labelAutoWrap } = style;\n const finalTransforms = [];\n const addToTransforms = (overlap, state) => {\n if (state) {\n finalTransforms.push(Object.assign(Object.assign({}, overlap), state));\n }\n };\n addToTransforms({\n type: 'rotate',\n optionalAngles: [0, 15, 30, 45, 60, 90],\n }, labelAutoRotate);\n addToTransforms({ type: 'ellipsis', minLength: 20 }, labelAutoEllipsis);\n addToTransforms({ type: 'hide' }, labelAutoHide);\n addToTransforms({ type: 'wrap', wordWrapWidth: 100, maxLines: 3, recoveryWhenFail: true }, labelAutoWrap);\n return finalTransforms;\n}\nfunction inferArcStyle(position, bbox, innerRadius, outerRadius, coordinate) {\n const { x, y, width, height } = bbox;\n const center = [x + width / 2, y + height / 2];\n const radius = Math.min(width, height) / 2;\n const [startAngle, endAngle] = (0, coordinate_1.angleOf)(coordinate);\n const [w, h] = sizeOf(coordinate);\n const r = Math.min(w, h) / 2;\n const common = {\n center,\n radius,\n startAngle,\n endAngle,\n gridLength: (outerRadius - innerRadius) * r,\n };\n if (position === 'inner') {\n // @ts-ignore\n const { insetLeft, insetTop } = coordinate.getOptions();\n return Object.assign(Object.assign({}, common), { center: [center[0] - insetLeft, center[1] - insetTop], labelAlign: 'perpendicular', labelDirection: 'positive', tickDirection: 'positive', gridDirection: 'negative' });\n }\n // arc outer\n return Object.assign(Object.assign({}, common), { labelAlign: 'parallel', labelDirection: 'negative', tickDirection: 'negative', gridDirection: 'positive' });\n}\nfunction inferGrid(value, coordinate, scale) {\n if ((0, coordinate_1.isTheta)(coordinate) || (0, coordinate_1.isParallel)(coordinate))\n return false;\n // Display axis grid for non-discrete values.\n return value === undefined ? !!scale.getTicks : value;\n}\nfunction infer3DAxisLinearOverrideStyle(coordinate) {\n // @ts-ignore\n const { depth } = coordinate.getOptions();\n return depth\n ? {\n tickIsBillboard: true,\n lineIsBillboard: true,\n labelIsBillboard: true,\n titleIsBillboard: true,\n gridIsBillboard: true,\n }\n : {};\n}\nfunction inferAxisLinearOverrideStyle(position, orientation, bbox, coordinate, xScale) {\n const { x, y, width, height } = bbox;\n if (position === 'bottom') {\n return { startPos: [x, y], endPos: [x + width, y] };\n }\n if (position === 'left') {\n return { startPos: [x + width, y + height], endPos: [x + width, y] };\n }\n if (position === 'right') {\n return { startPos: [x, y + height], endPos: [x, y] };\n }\n if (position === 'top') {\n return { startPos: [x, y + height], endPos: [x + width, y + height] };\n }\n // linear axis, maybe in parallel, polar, radial or radar systems.\n if (position === 'center') {\n // axisY\n if (orientation === 'vertical') {\n return {\n startPos: [x, y],\n endPos: [x, y + height],\n };\n }\n // axisX\n else if (orientation === 'horizontal') {\n return {\n startPos: [x, y],\n endPos: [x + width, y],\n };\n }\n // axis with rotate\n else if (typeof orientation === 'number') {\n const [cx, cy] = coordinate.getCenter();\n const [innerRadius, outerRadius] = (0, coordinate_1.radiusOf)(coordinate);\n const [startAngle, endAngle] = (0, coordinate_1.angleOf)(coordinate);\n const r = Math.min(width, height) / 2;\n // @ts-ignore\n const { insetLeft, insetTop } = coordinate.getOptions();\n const innerR = innerRadius * r;\n const outerR = outerRadius * r;\n const [actualCx, actualCy] = [cx + x - insetLeft, cy + y - insetTop];\n const [cos, sin] = [Math.cos(orientation), Math.sin(orientation)];\n const startPos = [\n actualCx + outerR * cos,\n actualCy + outerR * sin,\n ];\n const endPos = [\n actualCx + innerR * cos,\n actualCy + innerR * sin,\n ];\n const getAxisXDomainLength = () => {\n const { domain } = xScale.getOptions();\n return domain.length;\n };\n const controllAngleCount = (0, coordinate_1.isPolar)(coordinate) && xScale ? getAxisXDomainLength() : 3;\n return {\n startPos,\n endPos,\n gridClosed: Math.abs(endAngle - startAngle - 360) < 1e-6,\n gridCenter: [actualCx, actualCy],\n gridControlAngles: new Array(controllAngleCount)\n .fill(0)\n .map((d, i, arr) => ((endAngle - startAngle) / controllAngleCount) * i),\n };\n }\n }\n // position is inner or outer for arc axis won't be here\n return {};\n}\nconst ArcAxisComponent = (options) => {\n const { order, size, position, orientation, labelFormatter, tickFilter, tickCount, tickMethod, important = {}, style = {}, indexBBox, title, grid = false } = options, rest = __rest(options, [\"order\", \"size\", \"position\", \"orientation\", \"labelFormatter\", \"tickFilter\", \"tickCount\", \"tickMethod\", \"important\", \"style\", \"indexBBox\", \"title\", \"grid\"]);\n return ({ scales: [scale], value, coordinate, theme }) => {\n const { bbox } = value;\n const { domain } = scale.getOptions();\n const data = getData(scale, domain, tickCount, labelFormatter, tickFilter, tickMethod, position, coordinate);\n // Bind computed bbox if exists.\n const labels = indexBBox\n ? data.map((d, i) => {\n const bbox = indexBBox.get(i);\n if (!bbox)\n return d;\n // bbox: [label, bbox]\n // Make than indexBBox can match current label.\n if (bbox[0] !== d.label)\n return d;\n return Object.assign(Object.assign({}, d), { bbox: bbox[1] });\n })\n : data;\n const [innerRadius, outerRadius] = (0, coordinate_1.radiusOf)(coordinate);\n const defaultStyle = inferArcStyle(position, bbox, innerRadius, outerRadius, coordinate);\n const { axis: axisTheme, axisArc = {} } = theme;\n const finalStyle = (0, utils_1.adaptor)((0, util_1.deepMix)({}, axisTheme, axisArc, defaultStyle, Object.assign(Object.assign({ type: 'arc', data: labels, titleText: (0, utils_1.titleContent)(title), grid }, rest), important)));\n return new component_1.Axis({\n // @fixme transform is not valid for arcAxis.\n // @ts-ignore\n style: (0, util_1.omit)(finalStyle, ['transform']),\n });\n };\n};\nfunction inferThemeStyle(scale, coordinate, theme, direction, position, orientation) {\n const baseStyle = theme.axis;\n const positionStyle = ['top', 'right', 'bottom', 'left'].includes(position)\n ? theme[`axis${(0, helper_1.capitalizeFirst)(position)}`]\n : theme.axisLinear;\n const channel = scale.getOptions().name;\n const channelStyle = theme[`axis${(0, util_1.upperFirst)(channel)}`] || {};\n return Object.assign({}, baseStyle, positionStyle, channelStyle);\n}\nfunction inferDefaultStyle(scale, coordinate, theme, direction, position, orientation) {\n const themeStyle = inferThemeStyle(scale, coordinate, theme, direction, position, orientation);\n if (position === 'center') {\n return Object.assign(Object.assign(Object.assign(Object.assign({}, themeStyle), { labelDirection: direction === 'right' ? 'negative' : 'positive' }), (direction === 'center'\n ? { labelTransform: 'translate(50%,0)' }\n : null)), { tickDirection: direction === 'right' ? 'negative' : 'positive', labelSpacing: direction === 'center' ? 0 : 4, titleSpacing: (0, utils_1.isVertical)(orientation) ? 10 : 0, tick: direction === 'center' ? false : undefined });\n }\n return themeStyle;\n}\nconst LinearAxisComponent = (options) => {\n const { direction = 'left', important = {}, labelFormatter, order, orientation, actualPosition, position, size, style = {}, title, tickCount, tickFilter, tickMethod, transform, indexBBox } = options, userDefinitions = __rest(options, [\"direction\", \"important\", \"labelFormatter\", \"order\", \"orientation\", \"actualPosition\", \"position\", \"size\", \"style\", \"title\", \"tickCount\", \"tickFilter\", \"tickMethod\", \"transform\", \"indexBBox\"]);\n return ({ scales, value, coordinate, theme }) => {\n const { bbox } = value;\n const [scale] = scales;\n const { domain, xScale } = scale.getOptions();\n const defaultStyle = inferDefaultStyle(scale, coordinate, theme, direction, position, orientation);\n const internalAxisStyle = Object.assign(Object.assign(Object.assign({}, defaultStyle), style), userDefinitions);\n const gridLength = inferGridLength(actualPosition || position, coordinate, options.plane);\n const overrideStyle = inferAxisLinearOverrideStyle(position, orientation, bbox, coordinate, xScale);\n const threeDOverrideStyle = infer3DAxisLinearOverrideStyle(coordinate);\n const data = getData(scale, domain, tickCount, labelFormatter, tickFilter, tickMethod, position, coordinate);\n // Bind computed bbox if exists.\n const labels = indexBBox\n ? data.map((d, i) => {\n const bbox = indexBBox.get(i);\n if (!bbox)\n return d;\n // bbox: [label, bbox]\n // Make than indexBBox can match current label.\n if (bbox[0] !== d.label)\n return d;\n return Object.assign(Object.assign({}, d), { bbox: bbox[1] });\n })\n : data;\n const finalAxisStyle = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, internalAxisStyle), { type: 'linear', data: labels, crossSize: size, titleText: (0, utils_1.titleContent)(title), labelOverlap: inferLabelOverlap(transform, internalAxisStyle), grid: inferGrid(internalAxisStyle.grid, coordinate, scale), gridLength, \n // Always showLine, make title could align the end of axis.\n line: true, indexBBox }), (!internalAxisStyle.line ? { lineOpacity: 0 } : null)), overrideStyle), threeDOverrideStyle), important);\n // For hide overlap, do not set crossSize.\n const hasHide = finalAxisStyle.labelOverlap.find((d) => d.type === 'hide');\n if (hasHide)\n finalAxisStyle.crossSize = false;\n return new component_1.Axis({\n className: 'axis',\n style: (0, utils_1.adaptor)(finalAxisStyle),\n });\n };\n};\nconst axisFactor = (axis) => {\n return (options) => {\n const { labelFormatter: useDefinedLabelFormatter, labelFilter: userDefinedLabelFilter = () => true, } = options;\n return (context) => {\n var _a;\n const { scales: [scale], } = context;\n const ticks = ((_a = scale.getTicks) === null || _a === void 0 ? void 0 : _a.call(scale)) || scale.getOptions().domain;\n const labelFormatter = typeof useDefinedLabelFormatter === 'string'\n ? (0, d3_format_1.format)(useDefinedLabelFormatter)\n : useDefinedLabelFormatter;\n const labelFilter = (datum, index, array) => userDefinedLabelFilter(ticks[index], index, ticks);\n const normalizedOptions = Object.assign(Object.assign({}, options), { labelFormatter,\n labelFilter,\n scale });\n return axis(normalizedOptions)(context);\n };\n };\n};\nexports.LinearAxis = axisFactor(LinearAxisComponent);\nexports.ArcAxis = axisFactor(ArcAxisComponent);\nexports.LinearAxis.props = {\n defaultPosition: 'center',\n defaultSize: 45,\n defaultOrder: 0,\n defaultCrossPadding: [12, 12],\n defaultPadding: [12, 12],\n};\nexports.ArcAxis.props = {\n defaultPosition: 'outer',\n defaultOrientation: 'vertical',\n defaultSize: 45,\n defaultOrder: 0,\n defaultCrossPadding: [12, 12],\n defaultPadding: [12, 12],\n};\n//# sourceMappingURL=axis.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.adaptor = exports.domainOf = exports.inferComponentShape = exports.isVertical = exports.isHorizontal = exports.scaleOf = exports.LegendCategoryLayout = exports.G2Layout = exports.inferComponentLayout = exports.titleContent = exports.maybeAppend = exports.createComponent = void 0;\nconst g_1 = require(\"@antv/g\");\nconst component_1 = require(\"@antv/component\");\nconst util_1 = require(\"@antv/util\");\nconst selection_1 = require(\"../utils/selection\");\nfunction createComponent(descriptor) {\n return class extends g_1.CustomElement {\n constructor(config) {\n super(config);\n this.descriptor = descriptor;\n }\n connectedCallback() {\n var _a, _b;\n (_b = (_a = this.descriptor).render) === null || _b === void 0 ? void 0 : _b.call(_a, this.attributes, this);\n }\n update(cfg = {}) {\n var _a, _b;\n this.attr((0, util_1.deepMix)({}, this.attributes, cfg));\n (_b = (_a = this.descriptor).render) === null || _b === void 0 ? void 0 : _b.call(_a, this.attributes, this);\n }\n };\n}\nexports.createComponent = createComponent;\nfunction maybeAppend(parent, selector, node) {\n if (!parent.querySelector(selector)) {\n return (0, selection_1.select)(parent).append(node);\n }\n return (0, selection_1.select)(parent).select(selector);\n}\nexports.maybeAppend = maybeAppend;\nfunction titleContent(field) {\n return Array.isArray(field) ? field.join(', ') : `${field || ''}`;\n}\nexports.titleContent = titleContent;\nfunction inferComponentLayout(position, userDefinitions) {\n const preset = {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'flex-start',\n alignItems: 'center',\n };\n let { flexDirection, justifyContent, alignItems } = preset;\n const layout = {\n top: ['row', 'flex-start', 'center'],\n bottom: ['row', 'flex-start', 'center'],\n left: ['column', 'flex-start', 'center'],\n right: ['column', 'flex-start', 'center'],\n center: ['column', 'center', 'center'],\n };\n if (position in layout) {\n [flexDirection, justifyContent, alignItems] = layout[position];\n }\n return Object.assign({ display: 'flex', flexDirection,\n justifyContent,\n alignItems }, userDefinitions);\n}\nexports.inferComponentLayout = inferComponentLayout;\nclass G2Layout extends component_1.Layout {\n get child() {\n var _a;\n return (_a = this.children) === null || _a === void 0 ? void 0 : _a[0];\n }\n update(options) {\n var _a;\n this.attr(options);\n const { subOptions } = options;\n (_a = this.child) === null || _a === void 0 ? void 0 : _a.update(subOptions);\n }\n}\nexports.G2Layout = G2Layout;\nclass LegendCategoryLayout extends G2Layout {\n update(options) {\n var _a;\n const { subOptions } = options;\n this.attr(options);\n (_a = this.child) === null || _a === void 0 ? void 0 : _a.update(subOptions);\n }\n}\nexports.LegendCategoryLayout = LegendCategoryLayout;\nfunction scaleOf(scales, type) {\n var _a;\n return (_a = scales.filter((s) => s.getOptions().name === type)) === null || _a === void 0 ? void 0 : _a[0];\n}\nexports.scaleOf = scaleOf;\nfunction isHorizontal(orientation) {\n return orientation === 'horizontal' || orientation === 0;\n}\nexports.isHorizontal = isHorizontal;\nfunction isVertical(orientation) {\n return orientation === 'vertical' || orientation === -Math.PI / 2;\n}\nexports.isVertical = isVertical;\nfunction inferComponentShape(value, options, component) {\n const { bbox } = value;\n const { position = 'top', size: userDefinedSize, length: userDefinedLength, } = options;\n const isHorizontal = ['top', 'bottom', 'center'].includes(position);\n const [bboxSize, bboxLength] = isHorizontal\n ? [bbox.height, bbox.width]\n : [bbox.width, bbox.height];\n const { defaultSize, defaultLength } = component.props;\n const size = userDefinedSize || defaultSize || bboxSize;\n const length = userDefinedLength || defaultLength || bboxLength;\n const orientation = isHorizontal ? 'horizontal' : 'vertical';\n const [width, height] = isHorizontal ? [length, size] : [size, length];\n return {\n orientation,\n width,\n height,\n size,\n length,\n };\n}\nexports.inferComponentShape = inferComponentShape;\nfunction domainOf(scales) {\n // to get a available scale's domain\n return scales\n .find((scale) => scale.getOptions().domain.length > 0)\n .getOptions().domain;\n}\nexports.domainOf = domainOf;\nfunction adaptor(style) {\n const reservedKeys = [\n 'arrow',\n 'crosshairs',\n 'grid',\n 'handle',\n 'handleLabel',\n 'indicator',\n 'label',\n 'line',\n 'tick',\n 'tip',\n 'title',\n 'trunc',\n ];\n // @ts-ignore\n const { style: styles } = style, rest = __rest(style, [\"style\"]);\n const finalStyle = {};\n Object.entries(rest).forEach(([key, value]) => {\n if (reservedKeys.includes(key)) {\n finalStyle[`show${(0, util_1.upperFirst)(key)}`] = value;\n }\n else\n finalStyle[key] = value;\n });\n return Object.assign(Object.assign({}, finalStyle), styles);\n}\nexports.adaptor = adaptor;\n//# sourceMappingURL=utils.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.axisXConfig = exports.AxisX = void 0;\nconst axis_1 = require(\"./axis\");\n/**\n * LinearAxis component bind to x scale.\n */\nconst AxisX = (options) => {\n return (...args) => {\n // empirical value for crossPadding\n const axisX = (0, axis_1.LinearAxis)(Object.assign({}, { crossPadding: 50 }, options))(...args);\n (0, axis_1.rotateAxis)(axisX, options);\n return axisX;\n };\n};\nexports.AxisX = AxisX;\nexports.AxisX.props = Object.assign(Object.assign({}, axis_1.LinearAxis.props), { defaultPosition: 'bottom' });\nfunction axisXConfig() { }\nexports.axisXConfig = axisXConfig;\n//# sourceMappingURL=axisX.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AxisY = void 0;\nconst axis_1 = require(\"./axis\");\n/**\n * LinearAxis component bind to y scale.\n */\nconst AxisY = (options) => {\n return (...args) => {\n const axisY = (0, axis_1.LinearAxis)(Object.assign({}, { crossPadding: 10 }, options))(...args);\n (0, axis_1.rotateAxis)(axisY, options);\n return axisY;\n };\n};\nexports.AxisY = AxisY;\nexports.AxisY.props = Object.assign(Object.assign({}, axis_1.LinearAxis.props), { defaultPosition: 'left' });\n//# sourceMappingURL=axisY.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AxisRadar = void 0;\nconst coordinate_1 = require(\"../utils/coordinate\");\nconst axis_1 = require(\"./axis\");\nfunction inferTitleTransform(orientation) {\n const internalOrientation = orientation % (Math.PI * 2);\n if (internalOrientation === Math.PI / 2) {\n return { titleTransform: 'translate(0, 50%)' };\n }\n if (internalOrientation > -Math.PI / 2 && internalOrientation < Math.PI / 2) {\n return { titleTransform: 'translate(50%, 0)' };\n }\n if (internalOrientation > Math.PI / 2 &&\n internalOrientation < (Math.PI * 3) / 2) {\n return { titleTransform: 'translate(-50%, 0)' };\n }\n return {};\n}\nfunction inferAxisStyle(options, theme, coordinate, scales) {\n const { radar } = options;\n const [scale] = scales;\n const name = scale.getOptions().name;\n const [startAngle, endAngle] = (0, coordinate_1.angleOf)(coordinate);\n const { axisRadar: radarTheme = {} } = theme;\n return Object.assign(Object.assign({}, radarTheme), { grid: name === 'position', gridConnect: 'line', gridControlAngles: new Array(radar.count).fill(0).map((_, i) => {\n const angle = (endAngle - startAngle) / radar.count;\n return angle * i;\n }) });\n}\nconst AxisRadar = (options) => {\n const { important = {} } = options, restOptions = __rest(options, [\"important\"]);\n return (context) => {\n const { theme, coordinate, scales } = context;\n return (0, axis_1.LinearAxis)(Object.assign(Object.assign(Object.assign({}, restOptions), inferTitleTransform(options.orientation)), { important: Object.assign(Object.assign({}, inferAxisStyle(options, theme, coordinate, scales)), important) }))(context);\n };\n};\nexports.AxisRadar = AxisRadar;\nexports.AxisRadar.props = Object.assign(Object.assign({}, axis_1.LinearAxis.props), { defaultPosition: 'center' });\n//# sourceMappingURL=axisRadar.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LegendCategory = void 0;\nconst component_1 = require(\"@antv/component\");\nconst util_1 = require(\"@antv/util\");\nconst d3_format_1 = require(\"@antv/vendor/d3-format\");\nconst scale_1 = require(\"@antv/scale\");\nconst marker_1 = require(\"../utils/marker\");\nconst utils_1 = require(\"./utils\");\nfunction inferShape(scales, markState) {\n const shapeScale = (0, utils_1.scaleOf)(scales, 'shape');\n const colorScale = (0, utils_1.scaleOf)(scales, 'color');\n // NOTE!!!\n // scaleOrdinal.map will mute domain.\n const shapeScale1 = shapeScale ? shapeScale.clone() : null;\n // Infer the main shape if multiple marks are used.\n const shapes = [];\n for (const [mark, state] of markState) {\n const namespace = mark.type;\n const domain = (colorScale === null || colorScale === void 0 ? void 0 : colorScale.getOptions().domain.length) > 0\n ? colorScale === null || colorScale === void 0 ? void 0 : colorScale.getOptions().domain\n : state.data;\n const shape = domain.map((d, i) => {\n var _a;\n if (shapeScale1)\n return shapeScale1.map(d || 'point');\n return ((_a = mark === null || mark === void 0 ? void 0 : mark.style) === null || _a === void 0 ? void 0 : _a.shape) || state.defaultShape || 'point';\n });\n if (typeof namespace === 'string')\n shapes.push([namespace, shape]);\n }\n if (shapes.length === 0)\n return ['point', ['point']];\n if (shapes.length === 1)\n return shapes[0];\n if (!shapeScale)\n return shapes[0];\n // Evaluate the maximum likelihood of shape\n const { range } = shapeScale.getOptions();\n return shapes\n .map(([namespace, shape]) => {\n let sum = 0;\n for (let i = 0; i < shapes.length; i++) {\n const targetShape = range[i % range.length];\n if (shape[i] === targetShape)\n sum++;\n }\n return [sum / shape.length, [namespace, shape]];\n })\n .sort((a, b) => b[0] - a[0])[0][1];\n}\nfunction inferItemMarker(options, context) {\n const { scales, library, markState } = context;\n const [mark, shapes] = inferShape(scales, markState);\n const { itemMarker, itemMarkerSize: size } = options;\n const create = (name, d) => {\n var _a, _b, _c;\n const marker = ((_c = (_b = (_a = library[`mark.${mark}`]) === null || _a === void 0 ? void 0 : _a.props) === null || _b === void 0 ? void 0 : _b.shape[name]) === null || _c === void 0 ? void 0 : _c.props.defaultMarker) || (0, util_1.last)(name.split('.'));\n const radius = typeof size === 'function' ? size(d) : size;\n return () => (0, marker_1.useMarker)(marker, { color: d.color })(0, 0, radius);\n };\n const shapeOf = (i) => `${shapes[i]}`;\n const shapeScale = (0, utils_1.scaleOf)(scales, 'shape');\n if (shapeScale && !itemMarker)\n return (d, i) => create(shapeOf(i), d);\n if (typeof itemMarker === 'function') {\n return (d, i) => {\n // @todo Fix this in GUI.\n // It should pass primitive value rather object.\n const node = itemMarker(d.id, i);\n if (typeof node === 'string')\n return create(node, d);\n return node;\n };\n }\n return (d, i) => create(itemMarker || shapeOf(i), d);\n}\nfunction inferItemMarkerOpacity(scales) {\n const scale = (0, utils_1.scaleOf)(scales, 'opacity');\n if (scale) {\n const { range } = scale.getOptions();\n return (d, i) => range[i];\n }\n return undefined;\n}\nfunction inferItemMarkerSize(scales, defaults) {\n const scale = (0, utils_1.scaleOf)(scales, 'size');\n if (scale instanceof scale_1.Identity)\n return scale.map(NaN) * 2;\n return defaults;\n}\nfunction inferCategoryStyle(options, context) {\n const { labelFormatter = (d) => `${d}` } = options;\n const { scales, theme } = context;\n const defaultSize = theme.legendCategory.itemMarkerSize;\n const itemMarkerSize = inferItemMarkerSize(scales, defaultSize);\n const baseStyle = {\n itemMarker: inferItemMarker(Object.assign(Object.assign({}, options), { itemMarkerSize }), context),\n itemMarkerSize: itemMarkerSize,\n itemMarkerOpacity: inferItemMarkerOpacity(scales),\n };\n const finalLabelFormatter = typeof labelFormatter === 'string'\n ? (0, d3_format_1.format)(labelFormatter)\n : labelFormatter;\n const colorScale = (0, utils_1.scaleOf)(scales, 'color');\n const domain = (0, utils_1.domainOf)(scales);\n const colorOf = colorScale\n ? (d) => colorScale.map(d)\n : () => context.theme.color;\n return Object.assign(Object.assign({}, baseStyle), { data: domain.map((d) => ({\n id: d,\n label: finalLabelFormatter(d),\n color: colorOf(d),\n })) });\n}\nfunction inferLegendShape(value, options, component) {\n const { position } = options;\n if (position === 'center') {\n const { bbox } = value;\n // to be confirm: if position is center, we should use the width and height of user definition.\n const { width, height } = bbox;\n return { width, height };\n }\n const { width, height } = (0, utils_1.inferComponentShape)(value, options, component);\n return { width, height };\n}\nfunction filterEmptyIds(legendStyle) {\n return Object.assign(Object.assign({}, legendStyle), { data: (legendStyle === null || legendStyle === void 0 ? void 0 : legendStyle.data.filter((item) => item.id !== '')) || [] });\n}\n/**\n * Guide Component for ordinal color scale.\n */\nconst LegendCategory = (options) => {\n const { labelFormatter, layout, order, orientation, position, size, title, cols, itemMarker } = options, style = __rest(options, [\"labelFormatter\", \"layout\", \"order\", \"orientation\", \"position\", \"size\", \"title\", \"cols\", \"itemMarker\"]);\n const { gridRow } = style;\n return (context) => {\n const { value, theme } = context;\n const { bbox } = value;\n const { width, height } = inferLegendShape(value, options, exports.LegendCategory);\n const finalLayout = (0, utils_1.inferComponentLayout)(position, layout);\n const legendStyle = Object.assign(Object.assign(Object.assign(Object.assign({ orientation: ['right', 'left', 'center'].includes(position)\n ? 'vertical'\n : 'horizontal', width,\n height, layout: cols !== undefined ? 'grid' : 'flex' }, (cols !== undefined && { gridCol: cols })), (gridRow !== undefined && { gridRow })), { titleText: (0, utils_1.titleContent)(title) }), inferCategoryStyle(options, context));\n const { legendCategory: legendTheme = {} } = theme;\n // Filter out the data items with empty string IDs in the wordCloud's data before generating the legend.\n const categoryStyle = (0, utils_1.adaptor)(Object.assign({}, legendTheme, filterEmptyIds(legendStyle), style));\n const layoutWrapper = new utils_1.LegendCategoryLayout({\n style: Object.assign(Object.assign({ x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height }, finalLayout), { \n // @ts-ignore\n subOptions: categoryStyle }),\n });\n layoutWrapper.appendChild(new component_1.Category({\n className: 'legend-category',\n style: categoryStyle,\n }));\n return layoutWrapper;\n };\n};\nexports.LegendCategory = LegendCategory;\nexports.LegendCategory.props = {\n defaultPosition: 'top',\n defaultOrder: 1,\n defaultSize: 40,\n defaultCrossPadding: [12, 12],\n defaultPadding: [12, 12],\n};\n//# sourceMappingURL=legendCategory.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LegendContinuous = void 0;\nconst g_1 = require(\"@antv/g\");\nconst component_1 = require(\"@antv/component\");\nconst scale_1 = require(\"@antv/scale\");\nconst d3_format_1 = require(\"@antv/vendor/d3-format\");\nconst array_1 = require(\"../utils/array\");\nconst utils_1 = require(\"./utils\");\nfunction updateShapeDimensions(shape, finalSize, orientation) {\n shape.size = finalSize;\n if ((0, utils_1.isHorizontal)(orientation)) {\n shape.height = finalSize;\n }\n else {\n shape.width = finalSize;\n }\n return shape;\n}\nfunction inferContinuousShape(value, options, component) {\n const { size } = options;\n const shape = (0, utils_1.inferComponentShape)(value, options, component);\n return updateShapeDimensions(shape, size, shape.orientation);\n}\nfunction getFormatter(max) {\n return (value) => ({\n value: value / max,\n label: String(value),\n });\n}\nfunction getQuantizeOrQuantileConfig(shape, colorScale, min, max, range) {\n const thresholds = colorScale.thresholds;\n const formatter = getFormatter(max);\n return Object.assign(Object.assign({}, shape), { color: range, data: [min, ...thresholds, max].map(formatter) });\n}\nfunction getThresholdConfig(shape, colorScale, range) {\n const thresholds = colorScale.thresholds;\n const data = [-Infinity, ...thresholds, Infinity].map((value, index) => ({\n value: index,\n label: value,\n }));\n return Object.assign(Object.assign({}, shape), { data, color: range, labelFilter: (datum, index) => {\n return index > 0 && index < data.length - 1;\n } });\n}\nfunction rangeOf(scale) {\n const { domain } = scale.getOptions();\n const [min, max] = [domain[0], (0, array_1.lastOf)(domain)];\n return [min, max];\n}\n/**\n * if color scale is not defined, create a constant color scale based on default color\n * @param scale\n * @param theme\n */\nfunction createColorScale(scale, defaultColor) {\n const options = scale.getOptions();\n const newScale = scale.clone();\n newScale.update(Object.assign(Object.assign({}, options), { range: [(0, g_1.parseColor)(defaultColor).toString()] }));\n return newScale;\n}\nfunction getLinearConfig(shape, colorScale, sizeScale, opacityScale, scales, theme) {\n const { length } = shape;\n const definedScale = sizeScale || opacityScale;\n // Only use defaultColor when there is no color scale\n // in this view.\n const defaultColor = scales.color\n ? theme.legendContinuous.ribbonFill || 'black'\n : theme.color;\n const scale = colorScale || createColorScale(definedScale, defaultColor);\n const [min, max] = rangeOf(scale);\n const [domainMin, domainMax] = rangeOf([colorScale, sizeScale, opacityScale]\n .filter((d) => d !== undefined)\n .find((d) => !(d instanceof scale_1.Constant)));\n return Object.assign(Object.assign({}, shape), { domain: [domainMin, domainMax], data: scale.getTicks().map((value) => ({ value })), color: new Array(Math.floor(length)).fill(0).map((d, i) => {\n const value = ((max - min) / (length - 1)) * i + min;\n const color = scale.map(value) || defaultColor;\n const opacity = opacityScale ? opacityScale.map(value) : 1;\n return color.replace(/rgb[a]*\\(([\\d]{1,3}) *, *([\\d]{1,3}) *, *([\\d]{1,3})[\\S\\s]*\\)/, (match, p1, p2, p3) => `rgba(${p1}, ${p2}, ${p3}, ${opacity})`);\n }) });\n}\nfunction inferContinuousConfig(scales, scale, value, options, component, theme) {\n const colorScale = (0, utils_1.scaleOf)(scales, 'color');\n const shape = inferContinuousShape(value, options, component);\n if (colorScale instanceof scale_1.Threshold) {\n const { range } = colorScale.getOptions();\n const [min, max] = rangeOf(colorScale);\n // for quantize, quantile scale\n if (colorScale instanceof scale_1.Quantize || colorScale instanceof scale_1.Quantile) {\n return getQuantizeOrQuantileConfig(shape, colorScale, min, max, range);\n }\n // for threshold\n return getThresholdConfig(shape, colorScale, range);\n }\n // for linear, pow, sqrt, log, time, utc scale\n const sizeScale = (0, utils_1.scaleOf)(scales, 'size');\n const opacityScale = (0, utils_1.scaleOf)(scales, 'opacity');\n return getLinearConfig(shape, colorScale, sizeScale, opacityScale, scale, theme);\n}\n/**\n * Guide Component for continuous color scale.\n * @todo Custom style.\n */\nconst LegendContinuous = (options) => {\n const { labelFormatter, layout, order, orientation, position, size, title, style, crossPadding, padding } = options, rest = __rest(options, [\"labelFormatter\", \"layout\", \"order\", \"orientation\", \"position\", \"size\", \"title\", \"style\", \"crossPadding\", \"padding\"]);\n return ({ scales, value, theme, scale }) => {\n const { bbox } = value;\n const { x, y, width, height } = bbox;\n const finalLayout = (0, utils_1.inferComponentLayout)(position, layout);\n const { legendContinuous: legendTheme = {} } = theme;\n const finalStyle = (0, utils_1.adaptor)(Object.assign({}, legendTheme, Object.assign(Object.assign({ titleText: (0, utils_1.titleContent)(title), labelAlign: 'value', labelFormatter: typeof labelFormatter === 'string'\n ? (d) => (0, d3_format_1.format)(labelFormatter)(d.label)\n : labelFormatter }, inferContinuousConfig(scales, scale, value, options, exports.LegendContinuous, theme)), style), rest));\n const layoutWrapper = new utils_1.G2Layout({\n style: Object.assign(Object.assign({ x,\n y,\n width,\n height }, finalLayout), { \n // @ts-ignore\n subOptions: finalStyle }),\n });\n layoutWrapper.appendChild(new component_1.Continuous({\n className: 'legend-continuous',\n style: finalStyle,\n }));\n return layoutWrapper;\n };\n};\nexports.LegendContinuous = LegendContinuous;\nexports.LegendContinuous.props = {\n defaultPosition: 'top',\n defaultOrientation: 'vertical',\n defaultOrder: 1,\n defaultSize: 60,\n defaultLength: 200,\n defaultLegendSize: 60,\n defaultPadding: [20, 10],\n defaultCrossPadding: [12, 12], // [horizontal, vertical]\n};\n//# sourceMappingURL=legendContinuous.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LegendContinuousBlock = void 0;\nconst legendContinuous_1 = require(\"./legendContinuous\");\nconst LegendContinuousBlock = (options) => {\n return (...args) => (0, legendContinuous_1.LegendContinuous)(Object.assign({}, { block: true }, options))(...args);\n};\nexports.LegendContinuousBlock = LegendContinuousBlock;\nexports.LegendContinuousBlock.props = Object.assign(Object.assign({}, legendContinuous_1.LegendContinuous.props), { defaultPosition: 'top', defaultOrientation: 'horizontal' });\n//# sourceMappingURL=legendContinuousBlock.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LegendContinuousBlockSize = void 0;\nconst legendContinuous_1 = require(\"./legendContinuous\");\nconst legendContinuousSize_1 = require(\"./legendContinuousSize\");\nconst LegendContinuousBlockSize = (options) => {\n return (0, legendContinuousSize_1.LegendContinuousSize)(Object.assign({}, { block: true }, options));\n};\nexports.LegendContinuousBlockSize = LegendContinuousBlockSize;\nexports.LegendContinuousBlockSize.props = Object.assign(Object.assign({}, legendContinuous_1.LegendContinuous.props), { defaultPosition: 'top', defaultOrientation: 'horizontal' });\n//# sourceMappingURL=legendContinuousBlockSize.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LegendContinuousSize = void 0;\nconst utils_1 = require(\"./utils\");\nconst legendContinuous_1 = require(\"./legendContinuous\");\nconst LegendContinuousSize = (options) => {\n return (context) => {\n const { scales } = context;\n const sizeScale = (0, utils_1.scaleOf)(scales, 'size');\n return (0, legendContinuous_1.LegendContinuous)(Object.assign({}, {\n type: 'size',\n data: sizeScale.getTicks().map((value, index) => ({\n value,\n label: String(value),\n })),\n }, options))(context);\n };\n};\nexports.LegendContinuousSize = LegendContinuousSize;\nexports.LegendContinuousSize.props = Object.assign(Object.assign({}, legendContinuous_1.LegendContinuous.props), { defaultPosition: 'top', defaultOrientation: 'horizontal' });\n//# sourceMappingURL=legendContinuousSize.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TitleComponent = void 0;\nconst util_1 = require(\"@antv/util\");\nconst utils_1 = require(\"../shape/utils\");\nconst helper_1 = require(\"../utils/helper\");\nconst utils_2 = require(\"./utils\");\nfunction inferStyleByAlign(x, y, width, align) {\n switch (align) {\n case 'center':\n return {\n x: x + width / 2,\n y,\n textAlign: 'middle',\n };\n case 'right':\n return {\n x: x + width,\n y,\n textAlign: 'right',\n };\n default:\n return {\n x,\n y,\n textAlign: 'left',\n };\n }\n}\nconst Title = (0, utils_2.createComponent)({\n render(attributes, container) {\n const { width, title, subtitle, spacing = 2, align = 'left', x, y } = attributes, style = __rest(attributes, [\"width\", \"title\", \"subtitle\", \"spacing\", \"align\", \"x\", \"y\"]);\n container.style.transform = `translate(${x}, ${y})`;\n const titleStyle = (0, helper_1.subObject)(style, 'title');\n const subtitleStyle = (0, helper_1.subObject)(style, 'subtitle');\n const mainTitle = (0, utils_2.maybeAppend)(container, '.title', 'text')\n .attr('className', 'title')\n .call(utils_1.applyStyle, Object.assign(Object.assign(Object.assign({}, inferStyleByAlign(0, 0, width, align)), { fontSize: 14, textBaseline: 'top', text: title }), titleStyle))\n .node();\n const bounds = mainTitle.getLocalBounds();\n (0, utils_2.maybeAppend)(container, '.sub-title', 'text')\n .attr('className', 'sub-title')\n .call((selection) => {\n if (!subtitle)\n return selection.node().remove();\n selection.node().attr(Object.assign(Object.assign(Object.assign({}, inferStyleByAlign(0, bounds.max[1] + spacing, width, align)), { fontSize: 12, textBaseline: 'top', text: subtitle }), subtitleStyle));\n });\n },\n});\n/**\n * Title Component.\n */\nconst TitleComponent = (options) => {\n return ({ value, theme }) => {\n const { x, y, width, height } = value.bbox;\n return new Title({\n style: (0, util_1.deepMix)({}, theme.title, Object.assign({ x,\n y,\n width,\n height }, options)),\n });\n };\n};\nexports.TitleComponent = TitleComponent;\nexports.TitleComponent.props = {\n defaultPosition: 'top',\n defaultOrder: 2,\n defaultSize: 36,\n defaultCrossPadding: [20, 20],\n defaultPadding: [12, 12],\n};\n//# sourceMappingURL=title.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SliderX = void 0;\nconst slider_1 = require(\"./slider\");\n/**\n * SliderX component.\n */\nconst SliderX = (options) => {\n return (0, slider_1.Slider)(Object.assign(Object.assign({}, options), { orientation: 'horizontal' }));\n};\nexports.SliderX = SliderX;\nexports.SliderX.props = Object.assign(Object.assign({}, slider_1.Slider.props), { defaultPosition: 'bottom' });\n//# sourceMappingURL=sliderX.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Slider = void 0;\nconst component_1 = require(\"@antv/component\");\nconst d3_format_1 = require(\"@antv/vendor/d3-format\");\nconst util_1 = require(\"@antv/util\");\nconst coordinate_1 = require(\"../utils/coordinate\");\nconst scale_1 = require(\"../utils/scale\");\nfunction inferPosition(bbox, position, trackSize) {\n const { x, y, width, height } = bbox;\n if (position === 'left')\n return [x + width - trackSize, y];\n if (position === 'right')\n return [x, y];\n if (position === 'bottom')\n return [x, y];\n if (position === 'top')\n return [x, y + height - trackSize];\n}\n/**\n * Slider component.\n */\nconst Slider = (options) => {\n // do not pass size.\n const { orientation, labelFormatter, size, style = {}, position } = options, rest = __rest(options, [\"orientation\", \"labelFormatter\", \"size\", \"style\", \"position\"]);\n return (context) => {\n var _a;\n const { scales: [scale], value, theme, coordinate, } = context;\n const { bbox } = value;\n const { width, height } = bbox;\n const { slider: sliderTheme = {} } = theme;\n const defaultFormatter = ((_a = scale.getFormatter) === null || _a === void 0 ? void 0 : _a.call(scale)) || ((v) => v + '');\n const formatter = typeof labelFormatter === 'string'\n ? (0, d3_format_1.format)(labelFormatter)\n : labelFormatter;\n const isHorizontal = orientation === 'horizontal';\n const reverse = (0, coordinate_1.isTranspose)(coordinate) && isHorizontal;\n const { trackSize = sliderTheme.trackSize } = style;\n const [x0, y0] = inferPosition(bbox, position, trackSize);\n return new component_1.Slider({\n className: 'slider',\n style: Object.assign({}, sliderTheme, Object.assign(Object.assign({ x: x0, y: y0, trackLength: isHorizontal ? width : height, orientation, formatter: (v) => {\n const f = formatter || defaultFormatter;\n const v1 = reverse ? 1 - v : v;\n const tick = (0, scale_1.invert)(scale, v1, true);\n return f(tick);\n }, sparklineData: inferSparklineData(options, context) }, style), rest)),\n });\n };\n};\nexports.Slider = Slider;\nfunction markValue(markState, channels) {\n const [value] = Array.from(markState.entries())\n .filter(([mark]) => mark.type === 'line' || mark.type === 'area')\n .filter(([mark]) => mark.slider)\n .map(([mark]) => {\n const { encode, slider } = mark;\n if (slider === null || slider === void 0 ? void 0 : slider.x) {\n const channel = (name) => {\n const channel = encode[name];\n return [name, channel ? channel.value : undefined];\n };\n return Object.fromEntries(channels.map(channel));\n }\n });\n if (!(value === null || value === void 0 ? void 0 : value.series))\n return value === null || value === void 0 ? void 0 : value.y;\n const result = value.series.reduce((acc, curr, index) => {\n acc[curr] = acc[curr] || [];\n acc[curr].push(value.y[index]);\n return acc;\n }, {});\n return Object.values(result);\n}\nfunction inferSparklineData(options, context) {\n const { markState } = context;\n if ((0, util_1.isArray)(options.sparklineData))\n return options.sparklineData;\n return markValue(markState, ['y', 'series']);\n}\nexports.Slider.props = {\n defaultPosition: 'bottom',\n defaultSize: 24,\n defaultOrder: 1,\n defaultCrossPadding: [12, 12],\n defaultPadding: [12, 12],\n};\n//# sourceMappingURL=slider.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.pixelsOf = exports.abstractOf = exports.selectionOf = exports.domainOf = exports.invert = exports.isOrdinalScale = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nfunction constrain(x, lo, hi) {\n return Math.min(hi, Math.max(lo, x));\n}\nfunction isOrdinalScale(scale) {\n return !!scale.getBandWidth;\n}\nexports.isOrdinalScale = isOrdinalScale;\nfunction invert(scale, x, start) {\n if (!isOrdinalScale(scale))\n return scale.invert(x);\n const { adjustedRange } = scale;\n const { domain } = scale.getOptions();\n const offset = start ? -1 : 0;\n const step = scale.getStep();\n const range = start ? adjustedRange : adjustedRange.map((d) => d + step);\n // R[i0 - 1] < x <= R[i0]\n const i0 = (0, d3_array_1.bisectLeft)(range, x);\n const i1 = constrain(i0 + offset, 0, domain.length - 1);\n return domain[i1];\n}\nexports.invert = invert;\nfunction domainOf(scale, values, ratioX) {\n if (!values)\n return scale.getOptions().domain;\n if (!isOrdinalScale(scale)) {\n const sortedDomain = (0, d3_array_1.sort)(values);\n if (!ratioX)\n return sortedDomain;\n const [d] = sortedDomain;\n const { range } = scale.getOptions();\n const [r0, r1] = range;\n const v = r0 > r1 ? -1 : 1;\n const d1 = scale.invert(scale.map(d) + v * ratioX);\n return [d, d1];\n }\n const { domain } = scale.getOptions();\n const v1 = values[0];\n const start = domain.indexOf(v1);\n if (ratioX) {\n const end = start + Math.round(domain.length * ratioX);\n return domain.slice(start, end);\n }\n const v2 = values[values.length - 1];\n const end = domain.indexOf(v2);\n return domain.slice(start, end + 1);\n}\nexports.domainOf = domainOf;\nfunction selectionOf(x, y, x1, y1, scale, coordinate) {\n const { x: scaleX, y: scaleY } = scale;\n const abstractDomain = (point, start) => {\n const [x, y] = coordinate.invert(point);\n return [invert(scaleX, x, start), invert(scaleY, y, start)];\n };\n const p0 = abstractDomain([x, y], true);\n const p1 = abstractDomain([x1, y1], false);\n const domainX = domainOf(scaleX, [p0[0], p1[0]]);\n const domainY = domainOf(scaleY, [p0[1], p1[1]]);\n return [domainX, domainY];\n}\nexports.selectionOf = selectionOf;\nfunction abstractOf(domain, scale) {\n const [d0, d1] = domain;\n const maybeStep = (scale) => (scale.getStep ? scale.getStep() : 0);\n return [scale.map(d0), scale.map(d1) + maybeStep(scale)];\n}\nexports.abstractOf = abstractOf;\nfunction pixelsOf(selection, scale, coordinate) {\n const { x: scaleX, y: scaleY } = scale;\n const [X, Y] = selection;\n const AX = abstractOf(X, scaleX);\n const AY = abstractOf(Y, scaleY);\n const p0 = [AX[0], AY[0]];\n const p1 = [AX[1], AY[1]];\n const [x, y] = coordinate.map(p0);\n const [x1, y1] = coordinate.map(p1);\n return [x, y, x1, y1];\n}\nexports.pixelsOf = pixelsOf;\n//# sourceMappingURL=scale.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SliderY = void 0;\nconst slider_1 = require(\"./slider\");\n/**\n * SliderY component.\n */\nconst SliderY = (options) => {\n return (0, slider_1.Slider)(Object.assign(Object.assign({}, options), { orientation: 'vertical' }));\n};\nexports.SliderY = SliderY;\nexports.SliderY.props = Object.assign(Object.assign({}, slider_1.Slider.props), { defaultPosition: 'left' });\n//# sourceMappingURL=sliderY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ScrollbarX = void 0;\nconst scrollbar_1 = require(\"./scrollbar\");\n/**\n * ScrollbarX component.\n */\nconst ScrollbarX = (options) => {\n return (0, scrollbar_1.Scrollbar)(Object.assign(Object.assign({}, options), { orientation: 'horizontal' }));\n};\nexports.ScrollbarX = ScrollbarX;\nexports.ScrollbarX.props = Object.assign(Object.assign({}, scrollbar_1.Scrollbar.props), { defaultPosition: 'bottom' });\n//# sourceMappingURL=scrollbarX.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Scrollbar = void 0;\nconst component_1 = require(\"@antv/component\");\n/**\n * Scrollbar component.\n */\nconst Scrollbar = (options) => {\n const { orientation, labelFormatter, style } = options, rest = __rest(options, [\"orientation\", \"labelFormatter\", \"style\"]);\n return ({ scales: [scale], value, theme }) => {\n const { bbox } = value;\n const { x, y, width, height } = bbox;\n const { scrollbar: scrollbarTheme = {} } = theme;\n const { ratio, range } = scale.getOptions();\n const mainSize = orientation === 'horizontal' ? width : height;\n const actualSize = mainSize / ratio;\n const [r0, r1] = range;\n const value1 = r1 > r0 ? 0 : 1;\n return new component_1.Scrollbar({\n className: 'g2-scrollbar',\n style: Object.assign({}, scrollbarTheme, Object.assign(Object.assign(Object.assign(Object.assign({}, style), { x,\n y, trackLength: mainSize, value: value1 }), rest), { orientation, contentLength: actualSize, viewportLength: mainSize })),\n });\n };\n};\nexports.Scrollbar = Scrollbar;\nexports.Scrollbar.props = {\n defaultPosition: 'bottom',\n defaultSize: 24,\n defaultOrder: 1,\n defaultCrossPadding: [12, 12],\n defaultPadding: [12, 12],\n};\n//# sourceMappingURL=scrollbar.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ScrollbarY = void 0;\nconst scrollbar_1 = require(\"./scrollbar\");\n/**\n * ScrollbarY component.\n */\nconst ScrollbarY = (options) => {\n return (0, scrollbar_1.Scrollbar)(Object.assign(Object.assign({}, options), { orientation: 'vertical' }));\n};\nexports.ScrollbarY = ScrollbarY;\nexports.ScrollbarY.props = Object.assign(Object.assign({}, scrollbar_1.Scrollbar.props), { defaultPosition: 'left' });\n//# sourceMappingURL=scrollbarY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Legends = void 0;\nconst g_1 = require(\"@antv/g\");\n// A empty component to pass parse view tree stage.\nconst Legends = (options) => {\n return () => {\n return new g_1.Group();\n };\n};\nexports.Legends = Legends;\nexports.Legends.props = {};\n//# sourceMappingURL=legends.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GrowInY = exports.GrowInX = exports.PathIn = exports.ZoomOut = exports.ZoomIn = exports.WaveIn = exports.Morphing = exports.FadeOut = exports.FadeIn = exports.ScaleOutY = exports.ScaleInY = exports.ScaleOutX = exports.ScaleInX = void 0;\nvar scaleInX_1 = require(\"./scaleInX\");\nObject.defineProperty(exports, \"ScaleInX\", { enumerable: true, get: function () { return scaleInX_1.ScaleInX; } });\nvar scaleOutX_1 = require(\"./scaleOutX\");\nObject.defineProperty(exports, \"ScaleOutX\", { enumerable: true, get: function () { return scaleOutX_1.ScaleOutX; } });\nvar scaleInY_1 = require(\"./scaleInY\");\nObject.defineProperty(exports, \"ScaleInY\", { enumerable: true, get: function () { return scaleInY_1.ScaleInY; } });\nvar scaleOutY_1 = require(\"./scaleOutY\");\nObject.defineProperty(exports, \"ScaleOutY\", { enumerable: true, get: function () { return scaleOutY_1.ScaleOutY; } });\nvar fadeIn_1 = require(\"./fadeIn\");\nObject.defineProperty(exports, \"FadeIn\", { enumerable: true, get: function () { return fadeIn_1.FadeIn; } });\nvar fadeOut_1 = require(\"./fadeOut\");\nObject.defineProperty(exports, \"FadeOut\", { enumerable: true, get: function () { return fadeOut_1.FadeOut; } });\nvar morphing_1 = require(\"./morphing\");\nObject.defineProperty(exports, \"Morphing\", { enumerable: true, get: function () { return morphing_1.Morphing; } });\nvar waveIn_1 = require(\"./waveIn\");\nObject.defineProperty(exports, \"WaveIn\", { enumerable: true, get: function () { return waveIn_1.WaveIn; } });\nvar zoomIn_1 = require(\"./zoomIn\");\nObject.defineProperty(exports, \"ZoomIn\", { enumerable: true, get: function () { return zoomIn_1.ZoomIn; } });\nvar zoomOut_1 = require(\"./zoomOut\");\nObject.defineProperty(exports, \"ZoomOut\", { enumerable: true, get: function () { return zoomOut_1.ZoomOut; } });\nvar pathIn_1 = require(\"./pathIn\");\nObject.defineProperty(exports, \"PathIn\", { enumerable: true, get: function () { return pathIn_1.PathIn; } });\nvar growInX_1 = require(\"./growInX\");\nObject.defineProperty(exports, \"GrowInX\", { enumerable: true, get: function () { return growInX_1.GrowInX; } });\nvar growInY_1 = require(\"./growInY\");\nObject.defineProperty(exports, \"GrowInY\", { enumerable: true, get: function () { return growInY_1.GrowInY; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ScaleInX = void 0;\nconst coordinate_1 = require(\"../utils/coordinate\");\n/**\n * Scale mark from nothing to desired shape in x direction.\n */\nconst ScaleInX = (options, context) => {\n // Small enough to hide or show very small part of mark,\n // but bigger enough to not cause bug.\n const ZERO = 0.0001;\n const { coordinate } = context;\n return (from, _, defaults) => {\n const [shape] = from;\n const { transform: prefix = '', fillOpacity = 1, strokeOpacity = 1, opacity = 1, } = shape.style;\n const [transformOrigin, transform] = (0, coordinate_1.isTranspose)(coordinate)\n ? [`left bottom`, `scale(1, ${ZERO})`] // left-bottom corner\n : [`left top`, `scale(${ZERO}, 1)`]; // left-top corner\n // Using a short fadeIn transition to hide element with scale(0.001)\n // which is still visible.\n const keyframes = [\n {\n transform: `${prefix} ${transform}`.trimStart(),\n transformOrigin,\n fillOpacity: 0,\n strokeOpacity: 0,\n opacity: 0,\n },\n {\n transform: `${prefix} ${transform}`.trimStart(),\n transformOrigin,\n fillOpacity,\n strokeOpacity,\n opacity,\n offset: 0.01,\n },\n {\n transform: `${prefix} scale(1, 1)`.trimStart(),\n transformOrigin,\n fillOpacity,\n strokeOpacity,\n opacity,\n },\n ];\n const animation = shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options));\n return animation;\n };\n};\nexports.ScaleInX = ScaleInX;\n//# sourceMappingURL=scaleInX.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ScaleOutX = void 0;\nconst coordinate_1 = require(\"../utils/coordinate\");\n/**\n * Scale mark from desired shape to nothing in x direction.\n */\nconst ScaleOutX = (options, context) => {\n // Small enough to hide or show very small part of mark,\n // but bigger enough to not cause bug.\n const ZERO = 0.0001;\n const { coordinate } = context;\n return (from, _, defaults) => {\n const [shape] = from;\n const { transform: prefix = '', fillOpacity = 1, strokeOpacity = 1, opacity = 1, } = shape.style;\n const [transformOrigin, transform] = (0, coordinate_1.isTranspose)(coordinate)\n ? [`left bottom`, `scale(1, ${ZERO})`] // left-bottom corner\n : [`left top`, `scale(${ZERO}, 1)`]; // left-top corner\n // Using a short fadeIn transition to hide element with scale(0.001)\n // which is still visible.\n const keyframes = [\n {\n transform: `${prefix} scale(1, 1)`.trimStart(),\n transformOrigin,\n },\n {\n transform: `${prefix} ${transform}`.trimStart(),\n transformOrigin,\n fillOpacity,\n strokeOpacity,\n opacity,\n offset: 0.99,\n },\n {\n transform: `${prefix} ${transform}`.trimStart(),\n transformOrigin,\n fillOpacity: 0,\n strokeOpacity: 0,\n opacity: 0,\n },\n ];\n const animation = shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options));\n return animation;\n };\n};\nexports.ScaleOutX = ScaleOutX;\n//# sourceMappingURL=scaleOutX.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ScaleInY = void 0;\nconst g_1 = require(\"@antv/g\");\nconst coordinate_1 = require(\"../utils/coordinate\");\nconst utils_1 = require(\"../shape/utils\");\n/**\n * Scale mark from nothing to desired shape in y direction.\n */\nconst ScaleInY = (options, context) => {\n // Small enough to hide or show very small part of mark,\n // but bigger enough to not cause bug.\n const ZERO = 0.0001;\n const { coordinate } = context;\n // the polar coordinate need\n g_1.CSS.registerProperty({\n name: 'scaleInYRadius',\n inherits: false,\n initialValue: '',\n interpolable: true,\n syntax: g_1.PropertySyntax.NUMBER,\n });\n return (from, _, defaults) => {\n const [shape] = from;\n const PolarScaleInY = (shape) => {\n const { __data__, style } = shape;\n const { fillOpacity = 1, strokeOpacity = 1, opacity = 1 } = style;\n const { points, y, y1 } = __data__;\n const arcObject = (0, utils_1.getArcObject)(coordinate, points, [y, y1]);\n const { innerRadius, outerRadius } = arcObject;\n const keyframes = [\n {\n scaleInYRadius: innerRadius + ZERO,\n fillOpacity: 0,\n strokeOpacity: 0,\n opacity: 0,\n },\n {\n scaleInYRadius: innerRadius + ZERO,\n fillOpacity,\n strokeOpacity,\n opacity,\n offset: 0.01,\n },\n {\n scaleInYRadius: outerRadius,\n fillOpacity,\n strokeOpacity,\n opacity,\n },\n ];\n const animation = shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options));\n return animation;\n };\n const RectangularScaleInY = (shape) => {\n const { style } = shape;\n const { transform: prefix = '', fillOpacity = 1, strokeOpacity = 1, opacity = 1, } = style;\n const [transformOrigin, transform] = (0, coordinate_1.isTranspose)(coordinate)\n ? [`left top`, `scale(${ZERO}, 1)`] // left-top corner\n : [`left bottom`, `scale(1, ${ZERO})`]; // left-bottom corner\n // Using a short fadeIn transition to hide element with scale(0.001)\n // which is still visible.\n const keyframes = [\n {\n transform: `${prefix} ${transform}`.trimStart(),\n transformOrigin,\n fillOpacity: 0,\n strokeOpacity: 0,\n opacity: 0,\n },\n {\n transform: `${prefix} ${transform}`.trimStart(),\n transformOrigin,\n fillOpacity,\n strokeOpacity,\n opacity,\n offset: 0.01,\n },\n {\n transform: `${prefix} scale(1, 1)`.trimStart(),\n transformOrigin,\n fillOpacity,\n strokeOpacity,\n opacity,\n },\n ];\n const animation = shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options));\n return animation;\n };\n if ((0, coordinate_1.isPolar)(coordinate)) {\n return PolarScaleInY(shape);\n }\n else {\n return RectangularScaleInY(shape);\n }\n };\n};\nexports.ScaleInY = ScaleInY;\n//# sourceMappingURL=scaleInY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ScaleOutY = void 0;\nconst coordinate_1 = require(\"../utils/coordinate\");\n/**\n * Scale mark from desired shape to nothing in y direction.\n */\nconst ScaleOutY = (options, context) => {\n // Small enough to hide or show very small part of mark,\n // but bigger enough to not cause bug.\n const ZERO = 0.0001;\n const { coordinate } = context;\n return (from, _, defaults) => {\n const [shape] = from;\n const { transform: prefix = '', fillOpacity = 1, strokeOpacity = 1, opacity = 1, } = shape.style;\n const [transformOrigin, transform] = (0, coordinate_1.isTranspose)(coordinate)\n ? [`left top`, `scale(${ZERO}, 1)`] // left-top corner\n : [`left bottom`, `scale(1, ${ZERO})`]; // left-bottom corner\n // Using a short fadeIn transition to hide element with scale(0.001)\n // which is still visible.\n const keyframes = [\n {\n transform: `${prefix} scale(1, 1)`.trimStart(),\n transformOrigin,\n },\n {\n transform: `${prefix} ${transform}`.trimStart(),\n transformOrigin,\n fillOpacity,\n strokeOpacity,\n opacity,\n offset: 0.99,\n },\n {\n transform: `${prefix} ${transform}`.trimStart(),\n transformOrigin,\n fillOpacity: 0,\n strokeOpacity: 0,\n opacity: 0,\n },\n ];\n const animation = shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options));\n return animation;\n };\n};\nexports.ScaleOutY = ScaleOutY;\n//# sourceMappingURL=scaleOutY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FadeIn = void 0;\n/**\n * Transform mark from transparent to solid.\n */\nconst FadeIn = (options) => {\n return (from, _, defaults) => {\n const [shape] = from;\n const { fillOpacity = 1, strokeOpacity = 1, opacity = 1 } = shape.style;\n const keyframes = [\n { fillOpacity: 0, strokeOpacity: 0, opacity: 0 },\n {\n fillOpacity,\n strokeOpacity,\n opacity,\n },\n ];\n return shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options));\n };\n};\nexports.FadeIn = FadeIn;\nexports.FadeIn.props = {};\n//# sourceMappingURL=fadeIn.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FadeOut = void 0;\n/**\n * Transform mark from solid to transparent.\n */\nconst FadeOut = (options) => {\n return (from, _, defaults) => {\n const [shape] = from;\n const { fillOpacity = 1, strokeOpacity = 1, opacity = 1 } = shape.style;\n const keyframes = [\n {\n fillOpacity,\n strokeOpacity,\n opacity,\n },\n { fillOpacity: 0, strokeOpacity: 0, opacity: 0 },\n ];\n return shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options));\n };\n};\nexports.FadeOut = FadeOut;\nexports.FadeOut.props = {};\n//# sourceMappingURL=fadeOut.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Morphing = void 0;\nconst g_1 = require(\"@antv/g\");\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"../utils/helper\");\nconst utils_1 = require(\"./utils\");\nfunction localBBoxOf(shape) {\n const { min, max } = shape.getLocalBounds();\n const [x0, y0] = min;\n const [x1, y1] = max;\n const height = y1 - y0;\n const width = x1 - x0;\n return [x0, y0, width, height];\n}\nfunction d(bbox) {\n const [x, y, width, height] = bbox;\n return `\n M ${x} ${y}\n L ${x + width} ${y}\n L ${x + width} ${y + height}\n L ${x} ${y + height}\n Z\n `;\n}\nfunction pack(shape, count) {\n const [x0, y0, width, height] = localBBoxOf(shape);\n const aspect = height / width;\n const col = Math.ceil(Math.sqrt(count / aspect));\n const row = Math.ceil(count / col);\n const B = [];\n const h = height / row;\n let j = 0;\n let n = count;\n while (n > 0) {\n const c = Math.min(n, col);\n const w = width / c;\n for (let i = 0; i < c; i++) {\n const x = x0 + i * w;\n const y = y0 + j * h;\n B.push(d([x, y, w, h]));\n }\n n -= c;\n j += 1;\n }\n return B;\n}\nfunction normalizeSplit(split = 'pack') {\n if (typeof split == 'function')\n return split;\n return pack;\n}\n/**\n * Use attributes relative to geometry to do shape to shape animation.\n *\n * For example, the x, y, width, height of `Rect`, the cx, cy, r of `Circle`.\n * And for `Group`, it will use the bbox of the group.\n */\nfunction shapeToShape(from, to, timeEffect) {\n let { transform: fromTransform } = from.style;\n const { transform: toTransform } = to.style;\n // Replace first to get right bbox after mounting.\n replaceChild(to, from);\n let keys = utils_1.attributeKeys;\n if (from.nodeName === g_1.Shape.GROUP) {\n // Apply translate and scale transform.\n const [x0, y0, w0, h0] = localBBoxOf(from);\n const [x1, y1, w1, h1] = localBBoxOf(to);\n const dx = x0 - x1;\n const dy = y0 - y1;\n const sx = w0 / w1;\n const sy = h0 / h1;\n fromTransform = `translate(${dx}, ${dy}) scale(${sx}, ${sy})`;\n }\n else {\n keys = keys.concat(utils_1.GEOMETRY_ATTRIBUTES[from.nodeName] || []);\n }\n const keyframes = [\n Object.assign({ transform: fromTransform !== null && fromTransform !== void 0 ? fromTransform : 'none' }, (0, utils_1.attributeOf)(from, keys, true)),\n Object.assign({ transform: toTransform !== null && toTransform !== void 0 ? toTransform : 'none' }, (0, utils_1.attributeOf)(to, keys, true)),\n ];\n const animation = to.animate(keyframes, timeEffect);\n return animation;\n}\n/**\n * Replace object and copy className and __data__\n */\nfunction replaceChild(newChild, oldChild) {\n newChild['__data__'] = oldChild['__data__'];\n newChild.className = oldChild.className;\n // @ts-ignore\n newChild.markType = oldChild.markType;\n oldChild.parentNode.replaceChild(newChild, oldChild);\n}\n/**\n * Replace element with a path shape.\n */\nfunction maybePath(node, d) {\n const { nodeName } = node;\n if (nodeName === 'path')\n return node;\n const path = new g_1.Path({\n style: Object.assign(Object.assign({}, (0, utils_1.attributeOf)(node, utils_1.attributeKeys)), { d }),\n });\n replaceChild(path, node);\n return path;\n}\nfunction hasUniqueString(search, pattern) {\n const first = search.indexOf(pattern);\n const last = search.lastIndexOf(pattern);\n return first === last;\n}\n// Path definition with multiple m and M command has sub path.\n// eg. 'M10,10...M20,20', 'm10,10...m20,20'\nfunction hasSubPath(path) {\n return !hasUniqueString(path, 'm') || !hasUniqueString(path, 'M');\n}\nfunction shape2path(shape) {\n const path = (0, g_1.convertToPath)(shape);\n if (!path)\n return;\n // Path definition with sub path can't do path morphing animation,\n // so skip this kind of path.\n if (hasSubPath(path))\n return;\n return path;\n}\n// Check if the path has a markerEnd | markerStart\nfunction hasMarker(shape) {\n const { nodeName } = shape;\n if (nodeName === 'path') {\n const attributes = (0, util_1.get)(shape, 'attributes');\n return attributes.markerEnd || attributes.markerStart;\n }\n return false;\n}\nfunction oneToOne(shape, from, to, timeEffect) {\n // If the nodeTypes of from and to are equal,\n // or non of them can convert to path,\n // the apply shape to shape animation.\n const { nodeName: fromName } = from;\n const { nodeName: toName } = to;\n const fromPath = shape2path(from);\n const toPath = shape2path(to);\n const isSameNodes = fromName === toName && fromName !== 'path';\n const hasNonPathNode = fromPath === undefined || toPath === undefined;\n // Path with mark can not use animate like ordinary path.\n const isPathWithMarker = hasMarker(from) || hasMarker(to);\n if (isSameNodes || hasNonPathNode || isPathWithMarker)\n return shapeToShape(from, to, timeEffect);\n const pathShape = maybePath(shape, fromPath);\n // Convert Path will take transform, anchor, etc into account,\n // so there is no need to specify these attributes in keyframes.\n const keyframes = [\n Object.assign({}, (0, utils_1.attributeOf)(from, utils_1.attributeKeys)),\n Object.assign({}, (0, utils_1.attributeOf)(to, utils_1.attributeKeys)),\n ];\n if (fromPath !== toPath) {\n keyframes[0].d = fromPath;\n keyframes[1].d = toPath;\n const animation = pathShape.animate(keyframes, timeEffect);\n animation.onfinish = () => {\n // Should keep the original path definition.\n (0, helper_1.copyAttributes)(pathShape, to);\n pathShape.style.d = toPath;\n pathShape.style.transform = 'none';\n };\n // Remove transform because it already applied in path\n // converted by convertToPath.\n pathShape.style.transform = 'none';\n return animation;\n }\n // No need to apply animation since fromPath equals toPath.\n return null;\n}\nfunction oneToMultiple(from, to, timeEffect, split) {\n // Hide the shape to be split before being removing.\n from.style.visibility = 'hidden';\n const D = split(from, to.length);\n return to.map((shape, i) => {\n const path = new g_1.Path({\n style: Object.assign({ d: D[i] }, (0, utils_1.attributeOf)(from, utils_1.attributeKeys)),\n });\n return oneToOne(shape, path, shape, timeEffect);\n });\n}\nfunction multipleToOne(from, to, timeEffect, split) {\n const D = split(to, from.length);\n const { fillOpacity = 1, strokeOpacity = 1, opacity = 1 } = to.style;\n const keyframes = [\n { fillOpacity: 0, strokeOpacity: 0, opacity: 0 },\n { fillOpacity: 0, strokeOpacity: 0, opacity: 0, offset: 0.99 },\n {\n fillOpacity,\n strokeOpacity,\n opacity,\n },\n ];\n const animation = to.animate(keyframes, timeEffect);\n const animations = from.map((shape, i) => {\n const path = new g_1.Path({\n style: {\n d: D[i],\n fill: to.style.fill,\n },\n });\n return oneToOne(shape, shape, path, timeEffect);\n });\n return [...animations, animation];\n}\n/**\n * Morphing animations.\n * @todo Support more split function.\n */\nconst Morphing = (options) => {\n return (from, to, defaults) => {\n const split = normalizeSplit(options.split);\n const timeEffect = Object.assign(Object.assign({}, defaults), options);\n const { length: fl } = from;\n const { length: tl } = to;\n if ((fl === 1 && tl === 1) || (fl > 1 && tl > 1)) {\n const [f] = from;\n const [t] = to;\n return oneToOne(f, f, t, timeEffect);\n }\n if (fl === 1 && tl > 1) {\n const [f] = from;\n return oneToMultiple(f, to, timeEffect, split);\n }\n if (fl > 1 && tl === 1) {\n const [t] = to;\n return multipleToOne(from, t, timeEffect, split);\n }\n return null;\n };\n};\nexports.Morphing = Morphing;\nexports.Morphing.props = {};\n//# sourceMappingURL=morphing.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.attributeKeys = exports.attributeOf = exports.GEOMETRY_ATTRIBUTES = void 0;\nconst g_1 = require(\"@antv/g\");\nconst DEFAULT_ATTRIBUTE_VALUE = {\n opacity: 1,\n strokeOpacity: 1,\n fillOpacity: 1,\n lineWidth: 0,\n x: 0,\n y: 0,\n cx: 0,\n cy: 0,\n r: 0,\n rx: 0,\n ry: 0,\n width: 0,\n height: 0,\n};\nexports.GEOMETRY_ATTRIBUTES = {\n [g_1.Shape.CIRCLE]: ['cx', 'cy', 'r'],\n [g_1.Shape.ELLIPSE]: ['cx', 'cy', 'rx', 'ry'],\n [g_1.Shape.RECT]: ['x', 'y', 'width', 'height'],\n [g_1.Shape.IMAGE]: ['x', 'y', 'width', 'height'],\n [g_1.Shape.LINE]: ['x1', 'y1', 'x2', 'y2'],\n [g_1.Shape.POLYLINE]: ['points'],\n [g_1.Shape.POLYGON]: ['points'],\n};\nfunction attributeOf(shape, keys, useDefaultValue = false) {\n const attribute = {};\n for (const key of keys) {\n const value = shape.style[key];\n if (value) {\n attribute[key] = value;\n }\n else if (useDefaultValue) {\n attribute[key] = DEFAULT_ATTRIBUTE_VALUE[key];\n }\n }\n return attribute;\n}\nexports.attributeOf = attributeOf;\nexports.attributeKeys = [\n 'fill',\n 'stroke',\n 'fillOpacity',\n 'strokeOpacity',\n 'opacity',\n 'lineWidth',\n];\n//# sourceMappingURL=utils.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WaveIn = void 0;\nconst d3_shape_1 = require(\"@antv/vendor/d3-shape\");\nconst g_1 = require(\"@antv/g\");\nconst utils_1 = require(\"../shape/utils\");\nconst coordinate_1 = require(\"../utils/coordinate\");\nconst scaleInX_1 = require(\"./scaleInX\");\n/**\n * Transform mark from transparent to solid.\n */\nconst WaveIn = (options, context) => {\n const ZERO = 0.0001;\n // @see https://g-next.antv.vision/zh/docs/api/css/css-properties-values-api#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B1%9E%E6%80%A7\n g_1.CSS.registerProperty({\n name: 'waveInArcAngle',\n inherits: false,\n initialValue: '',\n interpolable: true,\n syntax: g_1.PropertySyntax.NUMBER,\n });\n const { coordinate } = context;\n return (from, to, defaults) => {\n const [shape] = from;\n if (!(0, coordinate_1.isPolar)(coordinate)) {\n return (0, scaleInX_1.ScaleInX)(options, context)(from, to, defaults);\n }\n const { __data__, style } = shape;\n const { radius = 0, inset = 0, fillOpacity = 1, strokeOpacity = 1, opacity = 1, } = style;\n const { points, y, y1 } = __data__;\n const path = (0, d3_shape_1.arc)()\n .cornerRadius(radius)\n .padAngle((inset * Math.PI) / 180);\n const arcObject = (0, utils_1.getArcObject)(coordinate, points, [y, y1]);\n const { startAngle, endAngle } = arcObject;\n const keyframes = [\n // Use custom interpolable CSS property.\n {\n waveInArcAngle: startAngle + ZERO,\n fillOpacity: 0,\n strokeOpacity: 0,\n opacity: 0,\n },\n {\n waveInArcAngle: startAngle + ZERO,\n fillOpacity,\n strokeOpacity,\n opacity,\n offset: 0.01,\n },\n {\n waveInArcAngle: endAngle,\n fillOpacity,\n strokeOpacity,\n opacity,\n },\n ];\n const animation = shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options));\n animation.onframe = function () {\n shape.style.d = path(Object.assign(Object.assign({}, arcObject), { endAngle: Number(shape.style.waveInArcAngle) }));\n };\n animation.onfinish = function () {\n shape.style.d = path(Object.assign(Object.assign({}, arcObject), { endAngle: endAngle }));\n };\n return animation;\n };\n};\nexports.WaveIn = WaveIn;\nexports.WaveIn.props = {};\n//# sourceMappingURL=waveIn.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ZoomIn = void 0;\nconst ZoomIn = (options) => {\n // Small enough to hide or show very small part of mark,\n // but bigger enough to not cause bug.\n const ZERO = 0.0001;\n return (from, _, defaults) => {\n const [shape] = from;\n const { transform: prefix = '', fillOpacity = 1, strokeOpacity = 1, opacity = 1, } = shape.style;\n const transformOrigin = 'center center';\n const keyframes = [\n {\n transform: `${prefix} scale(${ZERO})`.trimStart(),\n transformOrigin,\n fillOpacity: 0,\n strokeOpacity: 0,\n opacity: 0,\n },\n {\n transform: `${prefix} scale(${ZERO})`.trimStart(),\n transformOrigin,\n fillOpacity,\n strokeOpacity,\n opacity,\n offset: 0.01,\n },\n {\n transform: `${prefix} scale(1)`.trimStart(),\n transformOrigin,\n fillOpacity,\n strokeOpacity,\n opacity,\n },\n ];\n const animation = shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options));\n return animation;\n };\n};\nexports.ZoomIn = ZoomIn;\n//# sourceMappingURL=zoomIn.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ZoomOut = void 0;\nconst ZoomOut = (options) => {\n // Small enough to hide or show very small part of mark,\n // but bigger enough to not cause bug.\n const ZERO = 0.0001;\n return (from, _, defaults) => {\n const [shape] = from;\n const { transform: prefix = '', fillOpacity = 1, strokeOpacity = 1, opacity = 1, } = shape.style;\n const transformOrigin = 'center center';\n const keyframes = [\n { transform: `${prefix} scale(1)`.trimStart(), transformOrigin },\n {\n transform: `${prefix} scale(${ZERO})`.trimStart(),\n transformOrigin,\n fillOpacity,\n strokeOpacity,\n opacity,\n offset: 0.99,\n },\n {\n transform: `${prefix} scale(${ZERO})`.trimStart(),\n transformOrigin,\n fillOpacity: 0,\n strokeOpacity: 0,\n opacity: 0,\n },\n ];\n const animation = shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options));\n return animation;\n };\n};\nexports.ZoomOut = ZoomOut;\n//# sourceMappingURL=zoomOut.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PathIn = void 0;\n/**\n * Transform mark from transparent to solid.\n */\nconst PathIn = (options) => {\n return (from, _, defaults) => {\n var _a, _b;\n const [shape] = from;\n const length = ((_b = (_a = shape).getTotalLength) === null || _b === void 0 ? void 0 : _b.call(_a)) || 0;\n const keyframes = [\n { lineDash: [0, length] },\n { lineDash: [length, 0] },\n ];\n return shape.animate(keyframes, Object.assign(Object.assign({}, defaults), options));\n };\n};\nexports.PathIn = PathIn;\nexports.PathIn.props = {};\n//# sourceMappingURL=pathIn.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GrowInX = void 0;\nconst g_1 = require(\"@antv/g\");\nconst scaleInX_1 = require(\"./scaleInX\");\n/**\n * Scale mark from nothing to desired shape in x direction.\n */\nconst GrowInX = (options, context) => {\n return (from, to, defaults) => {\n const [shape] = from;\n const { min: [x, y], halfExtents, } = shape.getLocalBounds();\n const width = halfExtents[0] * 2;\n const height = halfExtents[1] * 2;\n const clipPath = new g_1.Path({\n style: {\n d: `M${x},${y}L${x + width},${y}L${x + width},${y + height}L${x},${y + height}Z`,\n },\n });\n shape.appendChild(clipPath);\n shape.style.clipPath = clipPath;\n const animation = (0, scaleInX_1.ScaleInX)(options, context)([clipPath], to, defaults);\n return animation;\n };\n};\nexports.GrowInX = GrowInX;\nexports.GrowInX.props = {};\n//# sourceMappingURL=growInX.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GrowInY = void 0;\nconst g_1 = require(\"@antv/g\");\nconst scaleInY_1 = require(\"./scaleInY\");\n/**\n * Scale mark from nothing to desired shape in x direction.\n */\nconst GrowInY = (options, context) => {\n return (from, to, defaults) => {\n const [shape] = from;\n const { min: [x, y], halfExtents, } = shape.getLocalBounds();\n const width = halfExtents[0] * 2;\n const height = halfExtents[1] * 2;\n const clipPath = new g_1.Path({\n style: {\n d: `M${x},${y}L${x + width},${y}L${x + width},${y + height}L${x},${y + height}Z`,\n },\n });\n shape.appendChild(clipPath);\n shape.style.clipPath = clipPath;\n const animation = (0, scaleInY_1.ScaleInY)(options, context)([clipPath], to, defaults);\n return animation;\n };\n};\nexports.GrowInY = GrowInY;\nexports.GrowInY.props = {};\n//# sourceMappingURL=growInY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ElementPointMove = exports.TreemapDrillDown = exports.Event = exports.Poptip = exports.ScrollbarFilter = exports.SliderFilter = exports.BrushYFilter = exports.BrushXFilter = exports.BrushFilter = exports.BrushAxisHighlight = exports.BrushYHighlight = exports.BrushXHighlight = exports.BrushHighlight = exports.LegendHighlight = exports.LegendFilter = exports.Tooltip = exports.Fisheye = exports.ChartIndex = exports.ElementSelectByColor = exports.ElementSelectByX = exports.ElementSelect = exports.ElementHighlightByColor = exports.ElementHighlightByX = exports.ElementHighlight = void 0;\nvar elementHighlight_1 = require(\"./elementHighlight\");\nObject.defineProperty(exports, \"ElementHighlight\", { enumerable: true, get: function () { return elementHighlight_1.ElementHighlight; } });\nvar elementHighlightByX_1 = require(\"./elementHighlightByX\");\nObject.defineProperty(exports, \"ElementHighlightByX\", { enumerable: true, get: function () { return elementHighlightByX_1.ElementHighlightByX; } });\nvar elementHighlightByColor_1 = require(\"./elementHighlightByColor\");\nObject.defineProperty(exports, \"ElementHighlightByColor\", { enumerable: true, get: function () { return elementHighlightByColor_1.ElementHighlightByColor; } });\nvar elementSelect_1 = require(\"./elementSelect\");\nObject.defineProperty(exports, \"ElementSelect\", { enumerable: true, get: function () { return elementSelect_1.ElementSelect; } });\nvar elementSelectByX_1 = require(\"./elementSelectByX\");\nObject.defineProperty(exports, \"ElementSelectByX\", { enumerable: true, get: function () { return elementSelectByX_1.ElementSelectByX; } });\nvar elementSelectByColor_1 = require(\"./elementSelectByColor\");\nObject.defineProperty(exports, \"ElementSelectByColor\", { enumerable: true, get: function () { return elementSelectByColor_1.ElementSelectByColor; } });\nvar chartIndex_1 = require(\"./chartIndex\");\nObject.defineProperty(exports, \"ChartIndex\", { enumerable: true, get: function () { return chartIndex_1.ChartIndex; } });\nvar fisheye_1 = require(\"./fisheye\");\nObject.defineProperty(exports, \"Fisheye\", { enumerable: true, get: function () { return fisheye_1.Fisheye; } });\nvar tooltip_1 = require(\"./tooltip\");\nObject.defineProperty(exports, \"Tooltip\", { enumerable: true, get: function () { return tooltip_1.Tooltip; } });\nvar legendFilter_1 = require(\"./legendFilter\");\nObject.defineProperty(exports, \"LegendFilter\", { enumerable: true, get: function () { return legendFilter_1.LegendFilter; } });\nvar legendHighlight_1 = require(\"./legendHighlight\");\nObject.defineProperty(exports, \"LegendHighlight\", { enumerable: true, get: function () { return legendHighlight_1.LegendHighlight; } });\nvar brushHighlight_1 = require(\"./brushHighlight\");\nObject.defineProperty(exports, \"BrushHighlight\", { enumerable: true, get: function () { return brushHighlight_1.BrushHighlight; } });\nvar brushXHighlight_1 = require(\"./brushXHighlight\");\nObject.defineProperty(exports, \"BrushXHighlight\", { enumerable: true, get: function () { return brushXHighlight_1.BrushXHighlight; } });\nvar brushYHighlight_1 = require(\"./brushYHighlight\");\nObject.defineProperty(exports, \"BrushYHighlight\", { enumerable: true, get: function () { return brushYHighlight_1.BrushYHighlight; } });\nvar brushAxisHighlight_1 = require(\"./brushAxisHighlight\");\nObject.defineProperty(exports, \"BrushAxisHighlight\", { enumerable: true, get: function () { return brushAxisHighlight_1.BrushAxisHighlight; } });\nvar brushFilter_1 = require(\"./brushFilter\");\nObject.defineProperty(exports, \"BrushFilter\", { enumerable: true, get: function () { return brushFilter_1.BrushFilter; } });\nvar brushXFilter_1 = require(\"./brushXFilter\");\nObject.defineProperty(exports, \"BrushXFilter\", { enumerable: true, get: function () { return brushXFilter_1.BrushXFilter; } });\nvar brushYFilter_1 = require(\"./brushYFilter\");\nObject.defineProperty(exports, \"BrushYFilter\", { enumerable: true, get: function () { return brushYFilter_1.BrushYFilter; } });\nvar sliderFilter_1 = require(\"./sliderFilter\");\nObject.defineProperty(exports, \"SliderFilter\", { enumerable: true, get: function () { return sliderFilter_1.SliderFilter; } });\nvar scrollbarFilter_1 = require(\"./scrollbarFilter\");\nObject.defineProperty(exports, \"ScrollbarFilter\", { enumerable: true, get: function () { return scrollbarFilter_1.ScrollbarFilter; } });\nvar poptip_1 = require(\"./poptip\");\nObject.defineProperty(exports, \"Poptip\", { enumerable: true, get: function () { return poptip_1.Poptip; } });\nvar event_1 = require(\"./event\");\nObject.defineProperty(exports, \"Event\", { enumerable: true, get: function () { return event_1.Event; } });\nvar treemapDrillDown_1 = require(\"./treemapDrillDown\");\nObject.defineProperty(exports, \"TreemapDrillDown\", { enumerable: true, get: function () { return treemapDrillDown_1.TreemapDrillDown; } });\nvar elementPointMove_1 = require(\"./elementPointMove\");\nObject.defineProperty(exports, \"ElementPointMove\", { enumerable: true, get: function () { return elementPointMove_1.ElementPointMove; } });\n//# sourceMappingURL=index.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ElementHighlight = exports.elementHighlight = void 0;\nconst util_1 = require(\"@antv/util\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst helper_1 = require(\"../utils/helper\");\nconst utils_1 = require(\"./utils\");\n/**\n * highlight a group of elements.\n */\nfunction elementHighlight(root, { elements: elementsof, // given the root of chart returns elements to be manipulated\ndatum, // given each element returns the datum of it\ngroupKey: eleGroupKey = (d) => d, // group elements by specified key\nregionGroupKey = (d) => d, // how to group elements when hover region\nlink = false, // draw link or not\nbackground = false, // draw background or not\ndelay = 60, // delay to unhighlighted element\nscale, coordinate, emitter, state = {}, region = false, regionEleFilter = (el) => utils_1.VALID_FIND_BY_X_MARKS.includes(el.markType), // some elements can not be highlighted by region, like shapes in pie.\n }) {\n var _a, _b;\n const allElements = (_a = elementsof(root)) !== null && _a !== void 0 ? _a : [];\n const elements = region ? allElements.filter(regionEleFilter) : allElements;\n const elementSet = new Set(elements);\n const groupKey = region ? regionGroupKey : eleGroupKey;\n const keyGroup = (0, d3_array_1.group)(elements, groupKey);\n const findElement = (0, utils_1.createFindElementByEvent)({\n elementsof,\n root,\n coordinate,\n scale,\n });\n const valueof = (0, utils_1.createValueof)(elements, datum);\n const [appendLink, removeLink] = (0, utils_1.renderLink)(Object.assign({ elements,\n valueof,\n link,\n coordinate }, (0, helper_1.subObject)(state.active, 'link')));\n const [appendBackground, removeBackground, isBackground] = (0, utils_1.renderBackground)(Object.assign({ document: root.ownerDocument, scale,\n coordinate,\n background,\n valueof }, (0, helper_1.subObject)(state.active, 'background')));\n const elementStyle = (0, util_1.deepMix)(state, {\n active: Object.assign({}, (((_b = state.active) === null || _b === void 0 ? void 0 : _b.offset) && {\n //Apply translate to mock slice out.\n transform: (...params) => {\n const value = state.active.offset(...params);\n const [, i] = params;\n return (0, utils_1.offsetTransform)(elements[i], value, coordinate);\n },\n })),\n });\n const useState = (0, utils_1.createUseState)(elementStyle, elements);\n const { updateState, removeState, hasState } = useState(valueof);\n let out; // Timer for delaying unhighlighted.\n const pointerover = (event) => {\n const { nativeEvent = true } = event;\n let element = event.target;\n if (region) {\n element = findElement(event);\n }\n if (!elementSet.has(element))\n return;\n if (out)\n clearTimeout(out);\n const k = groupKey(element);\n const group = keyGroup.get(k);\n const groupSet = new Set(group);\n for (const e of elements) {\n if (groupSet.has(e)) {\n if (!hasState(e, 'active'))\n updateState(e, 'active');\n }\n else {\n updateState(e, 'inactive');\n removeLink(e);\n }\n if (e !== element)\n removeBackground(e);\n }\n appendBackground(element);\n appendLink(group);\n // Emit events.\n if (!nativeEvent)\n return;\n emitter.emit('element:highlight', {\n nativeEvent,\n data: {\n data: datum(element),\n group: group.map(datum),\n },\n });\n };\n const delayUnhighlighted = () => {\n if (out)\n clearTimeout(out);\n out = setTimeout(() => {\n unhighlighted();\n out = null;\n }, delay);\n };\n const unhighlighted = (nativeEvent = true) => {\n for (const e of elements) {\n removeState(e, 'active', 'inactive');\n removeBackground(e);\n removeLink(e);\n }\n if (nativeEvent) {\n emitter.emit('element:unhighlight', { nativeEvent });\n }\n };\n const pointerout = (event) => {\n let element = event.target;\n if (region) {\n element = findElement(event);\n }\n if (!element) {\n if (delay > 0)\n delayUnhighlighted();\n else\n unhighlighted();\n return;\n }\n if (background && !isBackground(element))\n return;\n if (!background && !elementSet.has(element))\n return;\n if (delay > 0)\n delayUnhighlighted();\n else\n unhighlighted();\n };\n const pointerleave = () => {\n unhighlighted();\n };\n root.addEventListener('pointerover', pointerover);\n root.addEventListener('pointermove', pointerover);\n root.addEventListener('pointerout', pointerout);\n root.addEventListener('pointerleave', pointerleave);\n const onRest = (e) => {\n const { nativeEvent } = e;\n if (nativeEvent)\n return;\n unhighlighted(false);\n };\n const onHighlight = (e) => {\n const { nativeEvent } = e;\n if (nativeEvent)\n return;\n const { data } = e.data;\n const element = (0, utils_1.selectElementByData)(elements, data, datum);\n if (!element)\n return;\n pointerover({ target: element, nativeEvent: false });\n };\n emitter.on('element:highlight', onHighlight);\n emitter.on('element:unhighlight', onRest);\n return () => {\n root.removeEventListener('pointerover', pointerover);\n root.removeEventListener('pointermove', pointerover);\n root.removeEventListener('pointerout', pointerout);\n root.removeEventListener('pointerleave', pointerleave);\n emitter.off('element:highlight', onHighlight);\n emitter.off('element:unhighlight', onRest);\n for (const e of elements) {\n removeBackground(e);\n removeLink(e);\n }\n };\n}\nexports.elementHighlight = elementHighlight;\nfunction ElementHighlight(_a) {\n var { delay, createGroup, createRegionGroup, background = false, link = false } = _a, rest = __rest(_a, [\"delay\", \"createGroup\", \"createRegionGroup\", \"background\", \"link\"]);\n return (context, _, emitter) => {\n const { container, view, options } = context;\n const { scale, coordinate } = view;\n const plotArea = (0, utils_1.selectPlotArea)(container);\n return elementHighlight(plotArea, Object.assign({ elements: utils_1.selectG2Elements, datum: (0, utils_1.createDatumof)(view), groupKey: createGroup ? createGroup(view) : undefined, regionGroupKey: createRegionGroup\n ? createRegionGroup(view)\n : (0, utils_1.createXKey)(view), coordinate,\n scale, state: (0, utils_1.mergeState)(options, [\n ['active', background ? {} : { lineWidth: '1', stroke: '#000' }],\n 'inactive',\n ]), background,\n link,\n delay,\n emitter }, rest));\n };\n}\nexports.ElementHighlight = ElementHighlight;\nElementHighlight.props = {\n reapplyWhenUpdate: true,\n};\n//# sourceMappingURL=elementHighlight.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createFindElementByEvent = exports.VALID_FIND_BY_X_MARKS = exports.maybeRoot = exports.getThetaPath = exports.getElements = exports.getPointsPath = exports.getPointsR = exports.selectElementByData = exports.restoreCursor = exports.setCursor = exports.renderBackground = exports.offsetTransform = exports.renderLink = exports.createValueof = exports.mergeState = exports.useState = exports.createUseState = exports.createDatumof = exports.createXKey = exports.createColorKey = exports.boundsOfBrushArea = exports.brushMousePosition = exports.mousePosition = exports.bboxOf = exports.selectPlotArea = exports.selectFacetViews = exports.selectFacetG2Elements = exports.selectG2Elements = void 0;\nconst g_1 = require(\"@antv/g\");\nconst d3_path_1 = require(\"@antv/vendor/d3-path\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst util_1 = require(\"@antv/util\");\nconst selection_1 = require(\"../utils/selection\");\nconst array_1 = require(\"../utils/array\");\nconst runtime_1 = require(\"../runtime\");\nconst scale_1 = require(\"../utils/scale\");\nconst color_1 = require(\"../shape/interval/color\");\nconst coordinate_1 = require(\"../utils/coordinate\");\nconst style_1 = require(\"../utils/style\");\nconst utils_1 = require(\"../shape/utils\");\nconst vector_1 = require(\"../utils/vector\");\nconst traverse_elements_1 = require(\"../utils/traverse-elements\");\n/**\n * Given root of chart returns elements to be manipulated\n */\nfunction selectG2Elements(root) {\n return (0, selection_1.select)(root)\n .selectAll(`.${runtime_1.ELEMENT_CLASS_NAME}`)\n .nodes()\n .filter((d) => !d.__removed__);\n}\nexports.selectG2Elements = selectG2Elements;\nfunction selectFacetG2Elements(target, viewInstances) {\n return selectFacetViews(target, viewInstances).flatMap(({ container }) => selectG2Elements(container));\n}\nexports.selectFacetG2Elements = selectFacetG2Elements;\nfunction selectFacetViews(target, viewInstances) {\n return viewInstances.filter((d) => d !== target && d.options.parentKey === target.options.key);\n}\nexports.selectFacetViews = selectFacetViews;\nfunction selectPlotArea(root) {\n return (0, selection_1.select)(root).select(`.${runtime_1.PLOT_CLASS_NAME}`).node();\n}\nexports.selectPlotArea = selectPlotArea;\nfunction bboxOf(element) {\n // The geometry bounds of a group is empty, so return the render bounds.\n if (element.tagName === 'g')\n return element.getRenderBounds();\n // Compute the geometry bounds related to the parent.\n const bounds = element.getGeometryBounds();\n const aabb = new g_1.AABB();\n aabb.setFromTransformedAABB(bounds, element.getWorldTransform());\n return aabb;\n}\nexports.bboxOf = bboxOf;\nfunction mousePosition(target, event) {\n const { offsetX, offsetY } = event;\n const bbox = bboxOf(target);\n const { min: [x, y], max: [x1, y1], } = bbox;\n const isOutX = offsetX < x || offsetX > x1;\n const isOutY = offsetY < y || offsetY > y1;\n if (isOutX || isOutY)\n return null;\n return [offsetX - x, offsetY - y];\n}\nexports.mousePosition = mousePosition;\n/**\n * @todo Pass bbox rather than calc it here.\n */\nfunction brushMousePosition(target, event) {\n const { offsetX, offsetY } = event;\n const [x, y, x1, y1] = boundsOfBrushArea(target);\n return [\n Math.min(x1, Math.max(x, offsetX)) - x,\n Math.min(y1, Math.max(y, offsetY)) - y,\n ];\n}\nexports.brushMousePosition = brushMousePosition;\nfunction boundsOfBrushArea(target) {\n // Calc bbox after clipping.\n const bbox = target.getRenderBounds();\n const { min: [x0, y0], max: [x1, y1], } = bbox;\n return [x0, y0, x1, y1];\n}\nexports.boundsOfBrushArea = boundsOfBrushArea;\nfunction createColorKey(view) {\n return (element) => element.__data__.color;\n}\nexports.createColorKey = createColorKey;\nfunction createXKey(view) {\n return (element) => element.__data__.x;\n}\nexports.createXKey = createXKey;\nfunction createDatumof(view) {\n const views = Array.isArray(view) ? view : [view];\n const keyData = new Map(views.flatMap((view) => {\n const marks = Array.from(view.markState.keys());\n return marks.map((mark) => [keyed(view.key, mark.key), mark.data]);\n }));\n return (element) => {\n const { index, markKey, viewKey } = element.__data__;\n const data = keyData.get(keyed(viewKey, markKey));\n return data[index];\n };\n}\nexports.createDatumof = createDatumof;\n/**\n * A state manager for G2Element.\n * The keys for each state's style start with the state name.\n * { selectedFill, selectedStroke } is for selected state.\n * { unselectedFill, unselectedStroke } is for unselected state.\n */\n/**\n * Define state priorities, higher number means higher priority.\n */\nconst STATE_PRIORITIES = {\n selected: 3,\n unselected: 3,\n active: 2,\n inactive: 2,\n default: 1,\n};\n/**\n * Define state groups, states in the same group are mutually exclusive.\n */\nconst STATE_GROUPS = {\n selection: ['selected', 'unselected'],\n highlight: ['active', 'inactive'],\n};\nconst setElementAttribute = (element, k, v) => {\n (0, traverse_elements_1.traverseElements)(element, (el) => {\n if ('setAttribute' in el && typeof el.setAttribute === 'function') {\n el.setAttribute(k, v);\n }\n });\n};\nfunction createUseState(style, elements) {\n // Apply interaction style to all elements.\n elements.forEach((element) => {\n // @ts-ignore\n const currentStyle = element.__interactionStyle__;\n if (currentStyle) {\n // @ts-ignore\n element.__interactionStyle__ = Object.assign(Object.assign({}, currentStyle), style);\n }\n else {\n // @ts-ignore\n element.__interactionStyle__ = style;\n }\n });\n return (valueof = (d, element) => d, setAttribute = setElementAttribute) => useState(undefined, valueof, setAttribute);\n}\nexports.createUseState = createUseState;\nfunction useState(style, valueof = (d, element) => d, setAttribute = setElementAttribute) {\n const STATES = '__states__';\n const ORIGINAL = '__ordinal__';\n // Get state priority.\n const getStatePriority = (stateName) => STATE_PRIORITIES[stateName] || STATE_PRIORITIES.default;\n // Get the group that a state belongs to.\n const getStateGroup = (stateName) => {\n var _a;\n return (_a = Object.entries(STATE_GROUPS).find(([_, states]) => states.includes(stateName))) === null || _a === void 0 ? void 0 : _a[0];\n };\n // Mix style for each state and apply it to element.\n const applyState = (element) => {\n var _a;\n const { [STATES]: states = [], [ORIGINAL]: original = {} } = element;\n // Sort states by priority.\n const sortedStates = [...states].sort((a, b) => getStatePriority(b) - getStatePriority(a));\n // Create a Map to track the highest priority state for each style attribute.\n const styleAttributeMap = new Map();\n // Iterate through all states to find the highest priority state for each style attribute.\n for (const state of sortedStates) {\n // If style exists, use it directly, else use interaction style on element.\n const stateStyles = ((_a = (style !== null && style !== void 0 ? style : element.__interactionStyle__)) === null || _a === void 0 ? void 0 : _a[state]) || {};\n for (const [key, value] of Object.entries(stateStyles)) {\n if (!styleAttributeMap.has(key)) {\n styleAttributeMap.set(key, value);\n }\n }\n }\n // Apply styles including original styles.\n const finalStyle = Object.assign({}, original);\n for (const [key, value] of styleAttributeMap.entries()) {\n finalStyle[key] = value;\n }\n if (Object.keys(finalStyle).length === 0)\n return;\n // Apply final styles to the element.\n for (const [key, value] of Object.entries(finalStyle)) {\n const currentValue = (0, style_1.getStyle)(element, key);\n const v = valueof(value, element);\n setAttribute(element, key, v);\n // Store the attribute if it does not exist in original.\n if (!(key in original))\n original[key] = currentValue;\n }\n element[ORIGINAL] = original;\n };\n const initState = (element) => {\n if (element[STATES])\n return;\n element[STATES] = [];\n return;\n };\n /**\n * Update states and update element, handle conflict states automatically.\n */\n const updateState = (element, ...states) => {\n initState(element);\n const currentStates = element[STATES];\n // Collect all new state groups.\n const newStateGroups = new Set(states\n .map((state) => getStateGroup(state))\n .filter((group) => group !== undefined));\n // Exclude old states that are in the new state group.\n const remainingStates = currentStates.filter((existingState) => !newStateGroups.has(getStateGroup(existingState)));\n element[STATES] = [...remainingStates, ...states];\n applyState(element);\n };\n /**\n * Set the states and update element.\n */\n const setState = (element, ...states) => {\n initState(element);\n element[STATES] = [...states];\n applyState(element);\n };\n /**\n * Remove the states and update element.\n */\n const removeState = (element, ...states) => {\n initState(element);\n for (const state of states) {\n const index = element[STATES].indexOf(state);\n if (index !== -1) {\n element[STATES].splice(index, 1);\n }\n }\n applyState(element);\n };\n const hasState = (element, state) => {\n initState(element);\n return element[STATES].indexOf(state) !== -1;\n };\n return {\n setState,\n updateState,\n removeState,\n hasState,\n };\n}\nexports.useState = useState;\nfunction isEmptyObject(obj) {\n if (obj === undefined)\n return true;\n if (typeof obj !== 'object')\n return false;\n return Object.keys(obj).length === 0;\n}\n// A function to generate key for mark each view.\nfunction keyed(viewKey, markKey) {\n return `${viewKey},${markKey}`;\n}\nfunction mergeState(options, states) {\n // Index state by mark key and view key.\n const views = Array.isArray(options) ? options : [options];\n const markState = views.flatMap((view) => view.marks.map((mark) => [keyed(view.key, mark.key), mark.state]));\n const state = {};\n // Update each specified state.\n for (const descriptor of states) {\n const [key, defaults] = Array.isArray(descriptor)\n ? descriptor\n : [descriptor, {}];\n // Update each specified mark state.\n state[key] = markState.reduce((merged, mark) => {\n // Normalize state.\n const [markKey, markState = {}] = mark;\n const selectedState = isEmptyObject(markState[key])\n ? defaults\n : markState[key];\n // Update each state attribute.\n for (const [attr, value] of Object.entries(selectedState)) {\n const oldValue = merged[attr];\n const newValue = (data, index, array, element) => {\n const k = keyed(element.__data__.viewKey, element.__data__.markKey);\n if (markKey !== k)\n return oldValue === null || oldValue === void 0 ? void 0 : oldValue(data, index, array, element);\n if (typeof value !== 'function')\n return value;\n return value(data, index, array, element);\n };\n merged[attr] = newValue;\n }\n return merged;\n }, {});\n }\n return state;\n}\nexports.mergeState = mergeState;\n// @todo Support elements from different view.\nfunction createValueof(elements, datum) {\n const elementIndex = new Map(elements.map((d, i) => [d, i]));\n const fa = datum ? elements.map(datum) : elements;\n return (d, e) => {\n if (typeof d !== 'function')\n return d;\n const i = elementIndex.get(e);\n const fe = datum ? datum(e) : e;\n return d(fe, i, fa, e);\n };\n}\nexports.createValueof = createValueof;\nfunction renderLink(_a) {\n var { link = false, valueof = (d, element) => d, coordinate } = _a, style = __rest(_a, [\"link\", \"valueof\", \"coordinate\"]);\n const LINK_CLASS_NAME = 'element-link';\n if (!link)\n return [() => { }, () => { }];\n const pointsOf = (element) => element.__data__.points;\n const pathPointsOf = (P0, P1) => {\n const [, p1, p2] = P0;\n const [p0, , , p3] = P1;\n const P = [p1, p0, p3, p2];\n return P;\n };\n const append = (elements) => {\n var _a;\n if (elements.length <= 1)\n return;\n // Sort elements by normalized x to avoid cross.\n const sortedElements = (0, d3_array_1.sort)(elements, (e0, e1) => {\n const { x: x0 } = e0.__data__;\n const { x: x1 } = e1.__data__;\n const dx = x0 - x1;\n return dx;\n });\n for (let i = 1; i < sortedElements.length; i++) {\n const p = (0, d3_path_1.path)();\n const e0 = sortedElements[i - 1];\n const e1 = sortedElements[i];\n const [p0, p1, p2, p3] = pathPointsOf(pointsOf(e0), pointsOf(e1));\n p.moveTo(...p0);\n p.lineTo(...p1);\n p.lineTo(...p2);\n p.lineTo(...p3);\n p.closePath();\n const _b = (0, array_1.mapObject)(style, (d) => valueof(d, e0)), { fill = e0.getAttribute('fill') } = _b, rest = __rest(_b, [\"fill\"]);\n const link = new g_1.Path({\n className: LINK_CLASS_NAME,\n style: Object.assign({ d: p.toString(), fill, zIndex: -2 }, rest),\n });\n // @ts-ignore\n (_a = e0.link) === null || _a === void 0 ? void 0 : _a.remove();\n e0.parentNode.appendChild(link);\n // @ts-ignore\n e0.link = link;\n }\n };\n const remove = (element) => {\n var _a;\n (_a = element.link) === null || _a === void 0 ? void 0 : _a.remove();\n element.link = null;\n };\n return [append, remove];\n}\nexports.renderLink = renderLink;\n// Apply translate to mock slice out.\nfunction offsetTransform(element, offset, coordinate) {\n const append = (t) => {\n const { transform } = element.style;\n return transform ? `${transform} ${t}` : t;\n };\n if ((0, coordinate_1.isPolar)(coordinate)) {\n const { points } = element.__data__;\n const [p0, p1] = (0, coordinate_1.isTranspose)(coordinate) ? (0, utils_1.reorder)(points) : points;\n const center = coordinate.getCenter();\n const v0 = (0, vector_1.sub)(p0, center);\n const v1 = (0, vector_1.sub)(p1, center);\n const a0 = (0, vector_1.angle)(v0);\n const da = (0, vector_1.angleBetween)(v0, v1);\n const amid = a0 + da / 2;\n const dx = offset * Math.cos(amid);\n const dy = offset * Math.sin(amid);\n return append(`translate(${dx}, ${dy})`);\n }\n if ((0, coordinate_1.isTranspose)(coordinate))\n return append(`translate(${offset}, 0)`);\n return append(`translate(0, ${-offset})`);\n}\nexports.offsetTransform = offsetTransform;\nfunction renderBackground(_a) {\n var { document, background, scale, coordinate, valueof } = _a, rest = __rest(_a, [\"document\", \"background\", \"scale\", \"coordinate\", \"valueof\"]);\n const BACKGROUND_CLASS_NAME = 'element-background';\n // Don't have background.\n if (!background)\n return [() => { }, () => { }];\n const extentOf = (scale, x, padding) => {\n const ax = scale.invert(x);\n const mid = x + scale.getBandWidth(ax) / 2;\n const half = scale.getStep(ax) / 2;\n const offset = half * padding;\n return [mid - half + offset, mid + half - offset];\n };\n const sizeXOf = (element, padding) => {\n const { x: scaleX } = scale;\n if (!(0, scale_1.isOrdinalScale)(scaleX))\n return [0, 1];\n const { __data__: data } = element;\n const { x } = data;\n const [e1, e2] = extentOf(scaleX, x, padding);\n return [e1, e2];\n };\n const sizeYOf = (element, padding) => {\n const { y: scaleY } = scale;\n if (!(0, scale_1.isOrdinalScale)(scaleY))\n return [0, 1];\n const { __data__: data } = element;\n const { y } = data;\n const [e1, e2] = extentOf(scaleY, y, padding);\n return [e1, e2];\n };\n const bandShapeOf = (element, style) => {\n const { padding } = style;\n const [x1, x2] = sizeXOf(element, padding);\n const [y1, y2] = sizeYOf(element, padding);\n const points = [\n [x1, y1],\n [x2, y1],\n [x2, y2],\n [x1, y2],\n ].map((d) => coordinate.map(d));\n const { __data__: data } = element;\n const { y: dy, y1: dy1 } = data;\n return (0, color_1.rect)(document, points, { y: dy, y1: dy1 }, coordinate, style);\n };\n // Shape without ordinal style.\n // Clone and scale it.\n const cloneShapeOf = (element, style) => {\n const { transform = 'scale(1.2, 1.2)', transformOrigin = 'center center', stroke = '' } = style, rest = __rest(style, [\"transform\", \"transformOrigin\", \"stroke\"]);\n const finalStyle = Object.assign({ transform, transformOrigin, stroke }, rest);\n const shape = element.cloneNode(true);\n for (const [key, value] of Object.entries(finalStyle)) {\n shape.style[key] = value;\n }\n return shape;\n };\n const isOrdinalShape = () => {\n const { x, y } = scale;\n return [x, y].some(scale_1.isOrdinalScale);\n };\n const append = (element) => {\n if (element.background)\n element.background.remove();\n const _a = (0, array_1.mapObject)(rest, (d) => valueof(d, element)), { fill = '#CCD6EC', fillOpacity = 0.3, zIndex = -2, padding = 0.001, lineWidth = 0 } = _a, style = __rest(_a, [\"fill\", \"fillOpacity\", \"zIndex\", \"padding\", \"lineWidth\"]);\n const finalStyle = Object.assign(Object.assign({}, style), { fill,\n fillOpacity,\n zIndex,\n padding,\n lineWidth });\n const shapeOf = isOrdinalShape() ? bandShapeOf : cloneShapeOf;\n const shape = shapeOf(element, finalStyle);\n shape.className = BACKGROUND_CLASS_NAME;\n element.parentNode.parentNode.appendChild(shape);\n element.background = shape;\n };\n const remove = (element) => {\n var _a;\n (_a = element.background) === null || _a === void 0 ? void 0 : _a.remove();\n element.background = null;\n };\n const is = (element) => {\n return element.className === BACKGROUND_CLASS_NAME;\n };\n return [append, remove, is];\n}\nexports.renderBackground = renderBackground;\nfunction setCursor(root, cursor) {\n // @ts-ignore\n const canvas = root.getRootNode().defaultView;\n const dom = canvas.getContextService().getDomElement();\n if (dom === null || dom === void 0 ? void 0 : dom.style) {\n root.cursor = dom.style.cursor;\n dom.style.cursor = cursor;\n }\n}\nexports.setCursor = setCursor;\nfunction restoreCursor(root) {\n setCursor(root, root.cursor);\n}\nexports.restoreCursor = restoreCursor;\nfunction selectElementByData(elements, data, datum) {\n return elements.find((d) => Object.entries(data).every(([key, value]) => datum(d)[key] === value));\n}\nexports.selectElementByData = selectElementByData;\nfunction getPointsR(point, nextPoint) {\n return Math.sqrt(Math.pow(point[0] - nextPoint[0], 2) + Math.pow(point[1] - nextPoint[1], 2));\n}\nexports.getPointsR = getPointsR;\n// Points create path.\nfunction getPointsPath(points, isClose = false) {\n const path = (0, util_1.filter)(points, (d) => !!d).map((d, i) => {\n return [i === 0 ? 'M' : 'L', ...d];\n });\n if (isClose) {\n path.push(['Z']);\n }\n return path;\n}\nexports.getPointsPath = getPointsPath;\n// Get element.\nfunction getElements(plot) {\n return plot.querySelectorAll('.element');\n}\nexports.getElements = getElements;\n// Get Theta coordinate round path.\nfunction getThetaPath(center, points, isBig = 0) {\n const path = [['M', ...points[1]]];\n const innerRadius = getPointsR(center, points[1]);\n const outerRadius = getPointsR(center, points[0]);\n if (innerRadius === 0) {\n path.push(['L', ...points[3]], ['A', outerRadius, outerRadius, 0, isBig, 1, ...points[0]], ['Z']);\n }\n else {\n path.push(['A', innerRadius, innerRadius, 0, isBig, 0, ...points[2]], ['L', ...points[3]], ['A', outerRadius, outerRadius, 0, isBig, 1, ...points[0]], ['Z']);\n }\n return path;\n}\nexports.getThetaPath = getThetaPath;\nfunction maybeRoot(node, rootOf) {\n if (rootOf(node))\n return node;\n let root = node.parent;\n while (root && !rootOf(root))\n root = root.parent;\n return root;\n}\nexports.maybeRoot = maybeRoot;\nexports.VALID_FIND_BY_X_MARKS = ['interval', 'point', 'density'];\n/**\n * @description Create function that can find element by event.\n * @returns Element find function.\n */\nfunction createFindElementByEvent({ elementsof, root, coordinate, scale, validFindByXMarks = exports.VALID_FIND_BY_X_MARKS, }) {\n var _a, _b;\n let elements = elementsof(root);\n const getValidFindByXMarks = (d) => validFindByXMarks.includes(d.markType);\n const hasValidFindByXMarks = elements.find(getValidFindByXMarks);\n // Try to find element by x position.\n if (hasValidFindByXMarks) {\n elements = elements.filter(getValidFindByXMarks);\n const scaleX = scale.x;\n const scaleSeries = scale.series;\n const bandWidth = (_b = (_a = scaleX === null || scaleX === void 0 ? void 0 : scaleX.getBandWidth) === null || _a === void 0 ? void 0 : _a.call(scaleX)) !== null && _b !== void 0 ? _b : 0;\n const xof = scaleSeries\n ? (d) => {\n const seriesCount = Math.round(1 / scaleSeries.valueBandWidth);\n return (d.__data__.x +\n d.__data__.series * bandWidth +\n bandWidth / (seriesCount * 2));\n }\n : (d) => d.__data__.x + bandWidth / 2;\n // Sort for bisector search.\n elements.sort((a, b) => xof(a) - xof(b));\n return (event) => {\n const mouse = mousePosition(root, event);\n if (!mouse)\n return;\n const [abstractX] = coordinate.invert(mouse);\n const search = (0, d3_array_1.bisector)(xof).center;\n const i = search(elements, abstractX);\n const target = elements[i];\n return target;\n };\n }\n // If there is no valid element find by x, just return the target element.\n return (event) => {\n const { target } = event;\n return maybeRoot(target, (node) => {\n if (!node.classList)\n return false;\n return node.classList.includes('element');\n });\n };\n}\nexports.createFindElementByEvent = createFindElementByEvent;\n//# sourceMappingURL=utils.js.map","\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.destroy = exports.renderToMountedElement = exports.render = void 0;\n__exportStar(require(\"./constant\"), exports);\n__exportStar(require(\"./types/common\"), exports);\n__exportStar(require(\"./types/component\"), exports);\n__exportStar(require(\"./types/options\"), exports);\n__exportStar(require(\"./types/transform\"), exports);\n__exportStar(require(\"./types/encode\"), exports);\n__exportStar(require(\"./types/mark\"), exports);\n__exportStar(require(\"./types/data\"), exports);\nvar render_1 = require(\"./render\");\nObject.defineProperty(exports, \"render\", { enumerable: true, get: function () { return render_1.render; } });\nObject.defineProperty(exports, \"renderToMountedElement\", { enumerable: true, get: function () { return render_1.renderToMountedElement; } });\nObject.defineProperty(exports, \"destroy\", { enumerable: true, get: function () { return render_1.destroy; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MASK_CLASS_NAME = exports.AREA_CLASS_NAME = exports.LABEL_CLASS_NAME = exports.COMPONENT_CLASS_NAME = exports.PLOT_CLASS_NAME = exports.VIEW_CLASS_NAME = exports.ELEMENT_CLASS_NAME = exports.LABEL_LAYER_CLASS_NAME = exports.MAIN_LAYER_CLASS_NAME = void 0;\nexports.MAIN_LAYER_CLASS_NAME = 'main-layer';\nexports.LABEL_LAYER_CLASS_NAME = 'label-layer';\nexports.ELEMENT_CLASS_NAME = 'element';\nexports.VIEW_CLASS_NAME = 'view';\nexports.PLOT_CLASS_NAME = 'plot';\nexports.COMPONENT_CLASS_NAME = 'component';\nexports.LABEL_CLASS_NAME = 'label';\nexports.AREA_CLASS_NAME = 'area';\nexports.MASK_CLASS_NAME = 'mask';\n//# sourceMappingURL=constant.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=common.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=component.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=options.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=transform.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=encode.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=mark.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data.js.map","\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.destroy = exports.renderToMountedElement = exports.render = void 0;\nconst g_1 = require(\"@antv/g\");\nconst g_canvas_1 = require(\"@antv/g-canvas\");\nconst g_plugin_dragndrop_1 = require(\"@antv/g-plugin-dragndrop\");\nconst util_1 = require(\"@antv/util\");\nconst event_emitter_1 = __importDefault(require(\"@antv/event-emitter\"));\nconst selection_1 = require(\"../utils/selection\");\nconst event_1 = require(\"../utils/event\");\nconst helper_1 = require(\"../utils/helper\");\nconst expr_1 = require(\"../utils/expr\");\nconst plot_1 = require(\"./plot\");\nconst constant_1 = require(\"./constant\");\nconst option_preprocess_1 = require(\"./option-preprocess\");\n/**\n * Infer key for each node of view tree.\n * Each key should be unique in the entire view tree.\n * The key is for incremental render when view tree is changed.\n * @todo Fix custom key equals to inferred key.\n */\nfunction inferKeys(options) {\n const root = (0, util_1.deepMix)({}, options);\n const nodeParent = new Map([[root, null]]);\n const nodeIndex = new Map([[null, -1]]);\n const discovered = [root];\n while (discovered.length) {\n const node = discovered.shift();\n // If key of node is not specified, using parentKey and the index for it\n // in parent.children as its key.\n // e.g. The key of node named 'a' will be 'a', and the key of node named\n // 'b' will be 'parent-1' in the following view tree specification.\n // { key: 'parent', children: [{ name: 'a', key: 'a' }, { name: 'b' }] }\n if (node.key === undefined) {\n const parent = nodeParent.get(node);\n const index = nodeIndex.get(node);\n const key = parent === null ? `${0}` : `${parent.key}-${index}`;\n node.key = key;\n }\n const { children = [] } = node;\n if (Array.isArray(children)) {\n for (let i = 0; i < children.length; i++) {\n // Clone node as well.\n const child = (0, util_1.deepMix)({}, children[i]);\n children[i] = child;\n nodeParent.set(child, node);\n nodeIndex.set(child, i);\n discovered.push(child);\n }\n }\n }\n return root;\n}\nfunction Canvas(width, height) {\n const renderer = new g_canvas_1.Renderer();\n // DragAndDropPlugin is for interaction.\n renderer.registerPlugin(new g_plugin_dragndrop_1.Plugin());\n return new g_1.Canvas({\n width,\n height,\n container: document.createElement('div'),\n renderer: renderer,\n });\n}\nfunction render(options, context = {}, resolve = () => { }, reject = (e) => {\n throw e;\n}) {\n const afterParsedOptions = (0, expr_1.parseOptionsExpr)(options);\n // Initialize the context if it is not provided.\n const { width = 640, height = 480, depth = 0 } = afterParsedOptions;\n // Preprocessing here, such as syntactic sugar.\n const preprocessedOption = (0, option_preprocess_1.preprocessOption)(afterParsedOptions);\n const keyed = inferKeys(preprocessedOption);\n const { canvas = Canvas(width, height), emitter = new event_emitter_1.default(), library, } = context;\n context.canvas = canvas;\n context.emitter = emitter;\n const { width: prevWidth, height: prevHeight } = canvas.getConfig();\n if (prevWidth !== width || prevHeight !== height) {\n canvas.resize(width, height);\n }\n emitter.emit(event_1.ChartEvent.BEFORE_RENDER);\n // Plot the chart and mutate context.\n // Make sure that plot chart after container is ready for every time.\n const selection = (0, selection_1.select)(canvas.document.documentElement);\n canvas.ready\n .then(() => (0, plot_1.plot)(Object.assign(Object.assign({}, keyed), { width, height, depth }), selection, context))\n .then(() => {\n // Place the center of whole scene at z axis' origin.\n if (depth) {\n const [x, y] = canvas.document.documentElement.getPosition();\n // Since `render` method can be called for multiple times, use setPosition instead of translate here.\n canvas.document.documentElement.setPosition(x, y, -depth / 2);\n }\n // Wait for the next tick.\n // FIXME: Use `rendered?` event instead of `requestAnimationFrame`.\n canvas.requestAnimationFrame(() => {\n canvas.requestAnimationFrame(() => {\n emitter.emit(event_1.ChartEvent.AFTER_RENDER);\n resolve === null || resolve === void 0 ? void 0 : resolve();\n });\n });\n })\n .catch((e) => {\n reject === null || reject === void 0 ? void 0 : reject(e);\n });\n // Return the container HTML element wraps the canvas or svg element.\n return normalizeContainer(canvas.getConfig().container);\n}\nexports.render = render;\nfunction renderToMountedElement(options, context = {}, resolve = () => { }, reject = (e) => {\n throw e;\n}) {\n var _a;\n // Initialize the context if it is not provided.\n const { width = 640, height = 480 } = options;\n const keyed = inferKeys(options);\n const { group = new g_1.Group(), emitter = new event_emitter_1.default(), library, } = context;\n if (!(group === null || group === void 0 ? void 0 : group.parentElement)) {\n (0, helper_1.error)(`renderToMountedElement can't render chart to unmounted group.`);\n }\n const selection = (0, selection_1.select)(group);\n context.group = group;\n context.emitter = emitter;\n context.canvas =\n context.canvas || ((_a = group === null || group === void 0 ? void 0 : group.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView);\n emitter.emit(event_1.ChartEvent.BEFORE_RENDER);\n // Plot the chart and mutate context.\n // Make sure that plot chart after container is ready for every time.\n (0, plot_1.plot)(Object.assign(Object.assign({}, keyed), { width, height }), selection, context)\n .then(() => {\n var _a;\n (_a = context.canvas) === null || _a === void 0 ? void 0 : _a.requestAnimationFrame(() => {\n emitter.emit(event_1.ChartEvent.AFTER_RENDER);\n resolve === null || resolve === void 0 ? void 0 : resolve();\n });\n })\n .catch((e) => {\n reject === null || reject === void 0 ? void 0 : reject(e);\n });\n // Return the Group wraps the canvas or svg element.\n return group;\n}\nexports.renderToMountedElement = renderToMountedElement;\nfunction destroy(options, context = {}, isDestroyCanvas = false) {\n const { canvas, emitter } = context;\n if (canvas) {\n destroyAllInteractions(canvas);\n isDestroyCanvas ? canvas.destroy() : canvas.destroyChildren();\n }\n emitter.off();\n}\nexports.destroy = destroy;\n/**\n * Destroy all interactions mounted on the canvas.\n */\nfunction destroyAllInteractions(canvas) {\n const viewGroups = canvas.getRoot().querySelectorAll(`.${constant_1.VIEW_CLASS_NAME}`);\n viewGroups === null || viewGroups === void 0 ? void 0 : viewGroups.forEach((group) => {\n const { nameInteraction = new Map() } = group;\n if ((nameInteraction === null || nameInteraction === void 0 ? void 0 : nameInteraction.size) > 0) {\n Array.from(nameInteraction === null || nameInteraction === void 0 ? void 0 : nameInteraction.values()).forEach((value) => {\n value === null || value === void 0 ? void 0 : value.destroy();\n });\n }\n });\n}\nfunction normalizeContainer(container) {\n return typeof container === 'string'\n ? document.getElementById(container)\n : container;\n}\n//# sourceMappingURL=render.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ChartEvent = void 0;\n// to prevent users from tampering with internal values.\nexports.ChartEvent = {\n BEFORE_RENDER: 'beforerender',\n AFTER_RENDER: 'afterrender',\n BEFORE_PAINT: 'beforepaint',\n AFTER_PAINT: 'afterpaint',\n BEFORE_CHANGE_DATA: 'beforechangedata',\n AFTER_CHANGE_DATA: 'afterchangedata',\n BEFORE_CLEAR: 'beforeclear',\n AFTER_CLEAR: 'afterclear',\n BEFORE_DESTROY: 'beforedestroy',\n AFTER_DESTROY: 'afterdestroy',\n BEFORE_CHANGE_SIZE: 'beforechangesize',\n AFTER_CHANGE_SIZE: 'afterchangesize',\n POINTER_TAP: 'pointertap',\n POINTER_DOWN: 'pointerdown',\n POINTER_UP: 'pointerup',\n POINTER_OVER: 'pointerover',\n POINTER_OUT: 'pointerout',\n POINTER_MOVE: 'pointermove',\n POINTER_ENTER: 'pointerenter',\n POINTER_LEAVE: 'pointerleave',\n POINTER_UPOUTSIDE: 'pointerupoutside',\n DRAG_START: 'dragstart',\n DRAG: 'drag',\n DRAG_END: 'dragend',\n DRAG_ENTER: 'dragenter',\n DRAG_LEAVE: 'dragleave',\n DRAG_OVER: 'dragover',\n DROP: 'DROP',\n CLICK: 'click',\n DBLCLICK: 'dblclick',\n};\n//# sourceMappingURL=event.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseOptionsExpr = exports.EXPR_WHITE_LIST = void 0;\nconst expr_1 = require(\"@antv/expr\");\nconst util_1 = require(\"@antv/util\");\nconst lru_1 = require(\"./lru\");\n// Whitelist of properties that can contain expressions.\nexports.EXPR_WHITE_LIST = ['style', 'encode', 'labels', 'children'];\n/**\n * Compiles an expression string into a function.\n * @param expr Expression string to compile.\n * @returns Compiled function or original string if empty.\n */\nconst compileExpression = (0, lru_1.lru)((expr) => {\n const evaluator = (0, expr_1.compile)(expr);\n return (...args) => {\n const paramNames = Array.from({ length: args.length }, (_, i) => String.fromCharCode(97 + i));\n const namedParams = Object.fromEntries(args.map((value, index) => [paramNames[index], value]));\n // global is used to overview what can i get in props.\n return evaluator(Object.assign(Object.assign({}, namedParams), { global: Object.assign({}, namedParams) }));\n };\n}, (expr) => expr, 128);\n/**\n * Processes options object to convert expressions to functions.\n * @param options Options object to process.\n * @param isSpecRoot Whether the options is the root of the spec.\n * @returns Processed options object with expressions converted to functions.\n */\nfunction parseOptionsExpr(options, isSpecRoot = true) {\n if (Array.isArray(options)) {\n return options.map((_, i) => parseOptionsExpr(options[i], isSpecRoot));\n }\n if (typeof options === 'object' && options) {\n return (0, util_1.mapValues)(options, (value, key) => {\n // if options is root and the key is in the white list, parse the expression.\n if (isSpecRoot && exports.EXPR_WHITE_LIST.includes(key)) {\n return parseOptionsExpr(value, key === 'children');\n }\n if (!isSpecRoot) {\n return parseOptionsExpr(value, false);\n }\n return value;\n });\n }\n // if options is a string and is a valid expression.\n if (typeof options === 'string') {\n const trimmed = options.trim();\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n return compileExpression(trimmed.slice(1, -1));\n }\n }\n return options;\n}\nexports.parseOptionsExpr = parseOptionsExpr;\n//# sourceMappingURL=expr.js.map","\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.applyStyle = exports.plot = void 0;\nconst g_1 = require(\"@antv/g\");\nconst util_1 = require(\"@antv/util\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst d3_format_1 = require(\"@antv/vendor/d3-format\");\nconst array_1 = require(\"../utils/array\");\nconst event_1 = require(\"../utils/event\");\nconst helper_1 = require(\"../utils/helper\");\nconst selection_1 = require(\"../utils/selection\");\nconst component_1 = require(\"./component\");\nconst constant_1 = require(\"./constant\");\nconst coordinate_1 = require(\"./coordinate\");\nconst layout_1 = require(\"./layout\");\nconst library_1 = require(\"./library\");\nconst mark_1 = require(\"./mark\");\nconst scale_1 = require(\"./scale\");\nconst transform_1 = require(\"./transform\");\nfunction plot(options, selection, context) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const { library } = context;\n const [useComposition] = (0, library_1.useLibrary)('composition', library);\n const [useInteraction] = (0, library_1.useLibrary)('interaction', library);\n // Some helper functions.\n const marks = new Set(Object.keys(library)\n .map((d) => { var _a; return (_a = /mark\\.(.*)/.exec(d)) === null || _a === void 0 ? void 0 : _a[1]; })\n .filter(helper_1.defined));\n const staticMarks = new Set(Object.keys(library)\n .map((d) => { var _a; return (_a = /component\\.(.*)/.exec(d)) === null || _a === void 0 ? void 0 : _a[1]; })\n .filter(helper_1.defined));\n const typeOf = (node) => {\n const { type } = node;\n if (typeof type === 'function') {\n // @ts-ignore\n const { props = {} } = type;\n const { composite = true } = props;\n if (composite)\n return 'mark';\n }\n if (typeof type !== 'string')\n return type;\n if (marks.has(type) || staticMarks.has(type))\n return 'mark';\n return type;\n };\n const isMark = (node) => typeOf(node) === 'mark';\n const isStandardView = (node) => typeOf(node) === 'standardView';\n const isStaticMark = (node) => {\n const { type } = node;\n if (typeof type !== 'string')\n return false;\n if (staticMarks.has(type))\n return true;\n return false;\n };\n const transform = (node) => {\n if (isStandardView(node))\n return [node];\n const type = typeOf(node);\n const composition = useComposition({ type, static: isStaticMark(node) });\n return composition(node);\n };\n // Some temporary variables help parse the view tree.\n const views = [];\n const viewNode = new Map();\n const nodeState = new Map();\n const discovered = [options];\n const nodeGenerators = [];\n while (discovered.length) {\n const node = discovered.shift();\n if (isStandardView(node)) {\n // Initialize view to get data to be visualized. If the marks\n // of the view have already been initialized (facet view),\n // initialize the view based on the initialized mark states,\n // otherwise initialize it from beginning.\n const state = nodeState.get(node);\n const [view, children] = state\n ? initializeState(state, node, library)\n : yield initializeView(node, context);\n viewNode.set(view, node);\n views.push(view);\n // Transform children, they will be transformed into\n // standardView if they are mark or view node.\n const transformedNodes = children\n .flatMap(transform)\n .map((d) => (0, coordinate_1.coordinate2Transform)(d, library));\n discovered.push(...transformedNodes);\n // Only StandardView can be treated as facet and it\n // should sync position scales among facets normally.\n if (transformedNodes.every(isStandardView)) {\n const states = yield Promise.all(transformedNodes.map((d) => initializeMarks(d, context)));\n // Note!!!\n // This will mutate scales for marks.\n (0, scale_1.syncFacetsScales)(states);\n for (let i = 0; i < transformedNodes.length; i++) {\n const nodeT = transformedNodes[i];\n const state = states[i];\n nodeState.set(nodeT, state);\n }\n }\n }\n else {\n // Apply transform to get data in advance for non-mark composition\n // node, which makes sure that composition node can preprocess the\n // data to produce more nodes based on it.\n const n = isMark(node) ? node : yield applyTransform(node, context);\n const N = transform(n);\n if (Array.isArray(N))\n discovered.push(...N);\n else if (typeof N === 'function')\n nodeGenerators.push(N());\n }\n }\n context.emitter.emit(event_1.ChartEvent.BEFORE_PAINT);\n // Plot chart.\n const enterContainer = new Map();\n const updateContainer = new Map();\n const transitions = [];\n selection\n .selectAll(className(constant_1.VIEW_CLASS_NAME))\n .data(views, (d) => d.key)\n .join((enter) => enter\n .append('g')\n .attr('className', constant_1.VIEW_CLASS_NAME)\n .attr('id', (view) => view.key)\n .call(applyTranslate)\n .each(function (view, i, element) {\n plotView(view, (0, selection_1.select)(element), transitions, context);\n enterContainer.set(view, element);\n }), (update) => update.call(applyTranslate).each(function (view, i, element) {\n plotView(view, (0, selection_1.select)(element), transitions, context);\n updateContainer.set(view, element);\n }), (exit) => exit\n .each(function (d, i, element) {\n // Remove existed interactions.\n const interactions = element['nameInteraction'].values();\n for (const interaction of interactions) {\n interaction.destroy();\n }\n })\n .remove());\n // Apply interactions.\n const viewInstanceof = (viewContainer, updateInteractions, oldStore) => {\n return Array.from(viewContainer.entries()).map(([view, container]) => {\n // Index state by component or interaction name,\n // such as legend, scrollbar, brushFilter.\n // Each state transform options to another options.\n const store = oldStore || new Map();\n const setState = (key, reducer = (x) => x) => store.set(key, reducer);\n const options = viewNode.get(view);\n const update = createUpdateView((0, selection_1.select)(container), options, context);\n return {\n view,\n container,\n options,\n setState,\n update: (from, updateTypes) => __awaiter(this, void 0, void 0, function* () {\n // Apply all state functions to get new options.\n const reducer = (0, helper_1.compose)(Array.from(store.values()));\n const newOptions = reducer(options);\n return yield update(newOptions, from, () => {\n if ((0, util_1.isArray)(updateTypes)) {\n updateInteractions(viewContainer, updateTypes, store);\n }\n });\n }),\n };\n });\n };\n const updateInteractions = (container = updateContainer, updateType, oldStore) => {\n var _a;\n // Interactions for update views.\n const updateViewInstances = viewInstanceof(container, updateInteractions, oldStore);\n for (const target of updateViewInstances) {\n const { options, container } = target;\n const nameInteraction = container['nameInteraction'];\n let typeOptions = inferInteraction(options);\n if (updateType) {\n typeOptions = typeOptions.filter((v) => updateType.includes(v[0]));\n }\n for (const typeOption of typeOptions) {\n const [type, option] = typeOption;\n // Remove interaction for existed views.\n const prevInteraction = nameInteraction.get(type);\n if (prevInteraction)\n (_a = prevInteraction.destroy) === null || _a === void 0 ? void 0 : _a.call(prevInteraction);\n // Apply new interaction.\n if (option) {\n const interaction = useThemeInteraction(target.view, type, option, useInteraction);\n const destroy = interaction(target, updateViewInstances, context.emitter);\n nameInteraction.set(type, { destroy });\n }\n }\n }\n };\n // Interactions for enter views.\n const enterViewInstances = viewInstanceof(enterContainer, updateInteractions);\n for (const target of enterViewInstances) {\n const { options } = target;\n // A Map index interaction by interaction name.\n const nameInteraction = new Map();\n target.container['nameInteraction'] = nameInteraction;\n // Apply interactions.\n for (const typeOption of inferInteraction(options)) {\n const [type, option] = typeOption;\n if (option) {\n const interaction = useThemeInteraction(target.view, type, option, useInteraction);\n const destroy = interaction(target, enterViewInstances, context.emitter);\n nameInteraction.set(type, { destroy });\n }\n }\n }\n updateInteractions();\n // Author animations.\n const { width, height } = options;\n const keyframes = [];\n for (const nodeGenerator of nodeGenerators) {\n // Delay the rendering of animation keyframe. Different animation\n // created by different nodeGenerator will play in the same time.\n // eslint-disable-next-line no-async-promise-executor\n const keyframe = new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\n for (const node of nodeGenerator) {\n const sizedNode = Object.assign({ width, height }, node);\n yield plot(sizedNode, selection, context);\n }\n resolve();\n }));\n keyframes.push(keyframe);\n }\n context.views = views;\n // Clear and update animation.\n (_a = context.animations) === null || _a === void 0 ? void 0 : _a.forEach((animation) => animation === null || animation === void 0 ? void 0 : animation.cancel());\n context.animations = transitions;\n context.emitter.emit(event_1.ChartEvent.AFTER_PAINT);\n // Note!!!\n // The returned promise will never resolved if one of nodeGenerator\n // never stop to yield node, which may created by a keyframe composition\n // with iteration count set to infinite.\n const finished = transitions\n .filter(helper_1.defined)\n .map(cancel)\n .map((d) => d.finished);\n return Promise.all([...finished, ...keyframes]);\n });\n}\nexports.plot = plot;\nfunction applyTranslate(selection) {\n selection.style('transform', (d) => `translate(${d.layout.x}, ${d.layout.y})`);\n}\nfunction definedInteraction(library) {\n const [, createInteraction] = (0, library_1.useLibrary)('interaction', library);\n return (d) => {\n const [name, options] = d;\n try {\n return [name, createInteraction(name)];\n }\n catch (_a) {\n return [name, options.type];\n }\n };\n}\nfunction createUpdateView(selection, options, context) {\n const { library } = context;\n const createDefinedInteraction = definedInteraction(library);\n const filter = (d) => d[1] && d[1].props && d[1].props.reapplyWhenUpdate;\n const interactions = inferInteraction(options);\n const updates = interactions\n .map(createDefinedInteraction)\n .filter(filter)\n .map((d) => d[0]);\n return (newOptions, source, callback) => __awaiter(this, void 0, void 0, function* () {\n const transitions = [];\n const [newView, newChildren] = yield initializeView(newOptions, context);\n plotView(newView, selection, transitions, context);\n // Update interaction need to reapply when update.\n for (const name of updates.filter((d) => d !== source)) {\n updateInteraction(name, selection, newOptions, newView, context);\n }\n for (const child of newChildren) {\n plot(child, selection, context);\n }\n callback();\n return { options: newOptions, view: newView };\n });\n}\nfunction updateInteraction(name, selection, options, view, context) {\n var _a;\n const { library } = context;\n const [useInteraction] = (0, library_1.useLibrary)('interaction', library);\n // Instances for interaction.\n const container = selection.node();\n const nameInteraction = container['nameInteraction'];\n const interactionOptions = inferInteraction(options).find(([d]) => d === name);\n // Destroy older interaction.\n const interaction = nameInteraction.get(name);\n if (!interaction)\n return;\n (_a = interaction.destroy) === null || _a === void 0 ? void 0 : _a.call(interaction);\n if (!interactionOptions[1])\n return;\n // Apply new interaction.\n const applyInteraction = useThemeInteraction(view, name, interactionOptions[1], useInteraction);\n const target = {\n options,\n view,\n container: selection.node(),\n update: (options) => Promise.resolve(options),\n };\n const destroy = applyInteraction(target, [], context.emitter);\n nameInteraction.set(name, { destroy });\n}\nfunction initializeView(options, context) {\n return __awaiter(this, void 0, void 0, function* () {\n const { library } = context;\n const flattenOptions = yield transformMarks(options, context);\n const mergedOptions = bubbleOptions(flattenOptions);\n // @todo Remove this.\n // !!! NOTE: Mute original view options.\n // Update interaction and coordinate for this view.\n options.interaction = mergedOptions.interaction;\n options.coordinate = mergedOptions.coordinate;\n // @ts-ignore\n options.marks = [...mergedOptions.marks, ...mergedOptions.components];\n const transformedOptions = (0, coordinate_1.coordinate2Transform)(mergedOptions, library);\n const state = yield initializeMarks(transformedOptions, context);\n return initializeState(state, transformedOptions, library);\n });\n}\nfunction bubbleOptions(options) {\n const { coordinate: viewCoordinate = {}, interaction: viewInteraction = {}, style: viewStyle = {}, marks } = options, rest = __rest(options, [\"coordinate\", \"interaction\", \"style\", \"marks\"]);\n const markCoordinates = marks.map((d) => d.coordinate || {});\n const markInteractions = marks.map((d) => d.interaction || {});\n const markViewStyles = marks.map((d) => d.viewStyle || {});\n const newCoordinate = [...markCoordinates, viewCoordinate].reduceRight((prev, cur) => (0, util_1.deepMix)(prev, cur), {});\n const newInteraction = [viewInteraction, ...markInteractions].reduce((prev, cur) => (0, util_1.deepMix)(prev, cur), {});\n const newStyle = [...markViewStyles, viewStyle].reduce((prev, cur) => (0, util_1.deepMix)(prev, cur), {});\n return Object.assign(Object.assign({}, rest), { marks, coordinate: newCoordinate, interaction: newInteraction, style: newStyle });\n}\nfunction transformMarks(options, context) {\n return __awaiter(this, void 0, void 0, function* () {\n const { library } = context;\n const [useMark, createMark] = (0, library_1.useLibrary)('mark', library);\n const staticMarks = new Set(Object.keys(library)\n .map((d) => { var _a; return (_a = /component\\.(.*)/.exec(d)) === null || _a === void 0 ? void 0 : _a[1]; })\n .filter(helper_1.defined));\n const { marks } = options;\n const flattenMarks = [];\n const components = [];\n const discovered = [...marks];\n const { width, height } = (0, layout_1.computeRoughPlotSize)(options);\n const markOptions = { options, width, height };\n // Pre order traversal.\n while (discovered.length) {\n const [node] = discovered.splice(0, 1);\n // Apply data transform to get data.\n const mark = (yield applyTransform(node, context));\n const { type = (0, helper_1.error)('G2Mark type is required.'), key } = mark;\n // For components.\n if (staticMarks.has(type))\n components.push(mark);\n else {\n const { props = {} } = createMark(type);\n const { composite = true } = props;\n if (!composite)\n flattenMarks.push(mark);\n else {\n // Unwrap data from { value: data } to data,\n // then the composite mark can process the normalized data.\n const { data } = mark;\n const newMark = Object.assign(Object.assign({}, mark), { data: data ? (Array.isArray(data) ? data : data.value) : data });\n // Convert composite mark to marks.\n const marks = yield useMark(newMark, markOptions);\n const M = Array.isArray(marks) ? marks : [marks];\n discovered.unshift(...M.map((d, i) => (Object.assign(Object.assign({}, d), { key: `${key}-${i}` }))));\n }\n }\n }\n return Object.assign(Object.assign({}, options), { marks: flattenMarks, components });\n });\n}\nfunction initializeMarks(options, context) {\n return __awaiter(this, void 0, void 0, function* () {\n const { library } = context;\n const [useTheme] = (0, library_1.useLibrary)('theme', library);\n const [, createMark] = (0, library_1.useLibrary)('mark', library);\n const { theme: partialTheme, marks: partialMarks, coordinates = [], } = options;\n const theme = useTheme(inferTheme(partialTheme));\n const markState = new Map();\n // Initialize channels for marks.\n for (const markOptions of partialMarks) {\n const { type } = markOptions;\n const { props = {} } = createMark(type);\n const markAndState = yield (0, mark_1.initializeMark)(markOptions, props, context);\n if (markAndState) {\n const [initializedMark, state] = markAndState;\n markState.set(initializedMark, state);\n }\n }\n // Group channels by scale key, each group has scale.\n const scaleChannels = (0, d3_array_1.group)(Array.from(markState.values()).flatMap((d) => d.channels), ({ scaleKey }) => scaleKey);\n // Infer scale for each channel groups.\n for (const channels of scaleChannels.values()) {\n // Merge scale options for these channels.\n const scaleOptions = channels.reduce((total, { scale }) => (0, util_1.deepMix)(total, scale), {});\n const { scaleKey } = channels[0];\n // Use the fields of the first channel as the title.\n const { values: FV } = channels[0];\n const fields = Array.from(new Set(FV.map((d) => d.field).filter(helper_1.defined)));\n const options = (0, util_1.deepMix)({\n guide: { title: fields.length === 0 ? undefined : fields },\n field: fields[0],\n }, scaleOptions);\n // Use the name of the first channel as the scale name.\n const { name } = channels[0];\n const values = channels.flatMap(({ values }) => values.map((d) => d.value));\n const scale = Object.assign(Object.assign({}, (0, scale_1.inferScale)(name, values, options, coordinates, theme, library)), { uid: Symbol('scale'), key: scaleKey });\n channels.forEach((channel) => (channel.scale = scale));\n }\n return markState;\n });\n}\nfunction useThemeInteraction(view, type, option, useInteraction) {\n const theme = view.theme;\n const defaults = typeof type === 'string' ? theme[type] || {} : {};\n const interaction = useInteraction((0, util_1.deepMix)(defaults, Object.assign({ type }, option)));\n return interaction;\n}\nfunction initializeState(markState, options, library) {\n var _a;\n const [useMark] = (0, library_1.useLibrary)('mark', library);\n const [useTheme] = (0, library_1.useLibrary)('theme', library);\n const [useLabelTransform] = (0, library_1.useLibrary)('labelTransform', library);\n const { key, frame = false, theme: partialTheme, clip, style = {}, labelTransform = [], } = options;\n const theme = useTheme(inferTheme(partialTheme));\n // Infer components and compute layout.\n const states = Array.from(markState.values());\n const scales = (0, scale_1.collectScales)(states, options);\n const components = (0, component_1.normalizeComponents)((0, component_1.inferComponent)(inferComponentScales(Array.from(scales), states, markState), options, library));\n const layout = (0, layout_1.computeLayout)(components, options, theme, library);\n const coordinate = (0, coordinate_1.createCoordinate)(layout, options, library);\n const framedStyle = frame\n ? (0, util_1.deepMix)({ mainLineWidth: 1, mainStroke: '#000' }, style)\n : style;\n // Place components and mutate their bbox.\n (0, layout_1.placeComponents)((0, component_1.groupComponents)(components), coordinate, layout);\n // AxisZ need a copy of axisX and axisY to show grids in X-Z & Y-Z planes.\n (0, layout_1.processAxisZ)(components);\n // Index scale instance by uid.\n const uidScale = new Map(Array.from(markState.values()).flatMap((state) => {\n const { channels } = state;\n return channels.map(({ scale }) => [\n scale.uid,\n (0, scale_1.useRelationScale)(scale, library),\n ]);\n }));\n (0, scale_1.groupTransform)(markState, uidScale);\n // Scale from marks and components.\n const scaleInstance = {};\n // Initialize scale from components.\n for (const component of components) {\n const { scales: scaleDescriptors = [] } = component;\n const scales = [];\n for (const descriptor of scaleDescriptors) {\n const { name, uid } = descriptor;\n const scale = (_a = uidScale.get(uid)) !== null && _a !== void 0 ? _a : (0, scale_1.useRelationScale)(descriptor, library);\n scales.push(scale);\n // Delivery the scale of axisX to the AxisY,\n // in order to calculate the angle of axisY component when rendering radar chart.\n if (name === 'y') {\n scale.update(Object.assign(Object.assign({}, scale.getOptions()), { xScale: scaleInstance.x }));\n }\n (0, scale_1.assignScale)(scaleInstance, { [name]: scale });\n }\n component.scaleInstances = scales;\n }\n // Calc data to be rendered for each mark.\n // @todo More readable APIs for Container which stays\n // the same style with JS standard and lodash APIs.\n // @todo More proper way to index scale for different marks.\n const children = [];\n const dataMap = new Map();\n for (const [mark, state] of markState.entries()) {\n const { \n // scale,\n // Callback to create children options based on this mark.\n children: createChildren, \n // The total count of data (both show and hide)for this facet.\n // This is for unit visualization to sync data domain.\n dataDomain, modifier, key: markKey, data, } = mark;\n dataMap.set(markKey, data);\n const { index, channels, tooltip } = state;\n const scale = Object.fromEntries(channels.map(({ name, scale }) => [name, scale]));\n // Transform abstract value to visual value by scales.\n const markScaleInstance = (0, array_1.mapObject)(scale, ({ uid }) => uidScale.get(uid));\n (0, scale_1.assignScale)(scaleInstance, markScaleInstance);\n const value = (0, scale_1.applyScale)(channels, markScaleInstance);\n // Calc points and transformation for each data,\n // and then transform visual value to visual data.\n const calcPoints = useMark(mark);\n const [I, P, S] = filterValid(calcPoints(index, markScaleInstance, value, coordinate));\n const count = dataDomain || I.length;\n const T = modifier ? modifier(P, count, layout) : [];\n const titleOf = (i) => { var _a, _b; return (_b = (_a = tooltip.title) === null || _a === void 0 ? void 0 : _a[i]) === null || _b === void 0 ? void 0 : _b.value; };\n const itemsOf = (i) => tooltip.items.map((V) => V[i]);\n const visualData = I.map((d, i) => {\n const datum = Object.assign({ points: P[i], transform: T[i], index: d, markKey, viewKey: key, data: data[d] }, (tooltip && {\n title: titleOf(d),\n items: itemsOf(d),\n }));\n for (const [k, V] of Object.entries(value)) {\n datum[k] = V[d];\n if (S)\n datum[`series${(0, util_1.upperFirst)(k)}`] = S[i].map((i) => V[i]);\n }\n if (S)\n datum['seriesIndex'] = S[i];\n if (S && tooltip) {\n datum['seriesItems'] = S[i].map((si) => itemsOf(si));\n datum['seriesTitle'] = S[i].map((si) => titleOf(si));\n }\n return datum;\n });\n state.data = visualData;\n state.index = I;\n // Create children options by children callback,\n // and then propagate data to each child.\n const markChildren = createChildren === null || createChildren === void 0 ? void 0 : createChildren(visualData, markScaleInstance, layout);\n children.push(...(markChildren || []));\n }\n const view = {\n layout,\n theme,\n coordinate,\n markState,\n key,\n clip,\n scale: scaleInstance,\n style: framedStyle,\n components,\n data: dataMap,\n labelTransform: (0, helper_1.compose)(labelTransform.map(useLabelTransform)),\n };\n return [view, children];\n}\nfunction plotView(view, selection, transitions, context) {\n return __awaiter(this, void 0, void 0, function* () {\n const { library } = context;\n const { components, theme, layout, markState, coordinate, key, style, clip, scale, } = view;\n // Render background for the different areas.\n const { x, y, width, height } = layout, rest = __rest(layout, [\"x\", \"y\", \"width\", \"height\"]);\n const areaKeys = ['view', 'plot', 'main', 'content'];\n const I = areaKeys.map((_, i) => i);\n const sizeKeys = ['a', 'margin', 'padding', 'inset'];\n const areaStyles = areaKeys.map((d) => (0, helper_1.maybeSubObject)(Object.assign({}, theme.view, style), d));\n const areaSizes = sizeKeys.map((d) => (0, helper_1.subObject)(rest, d));\n const styleArea = (selection) => selection\n .style('x', (i) => areaLayouts[i].x)\n .style('y', (i) => areaLayouts[i].y)\n .style('width', (i) => areaLayouts[i].width)\n .style('height', (i) => areaLayouts[i].height)\n .each(function (i, d, element) {\n applyStyle((0, selection_1.select)(element), areaStyles[i]);\n });\n let px = 0;\n let py = 0;\n let pw = width;\n let ph = height;\n const areaLayouts = I.map((i) => {\n const size = areaSizes[i];\n const { left = 0, top = 0, bottom = 0, right = 0 } = size;\n px += left;\n py += top;\n pw -= left + right;\n ph -= top + bottom;\n return {\n x: px,\n y: py,\n width: pw,\n height: ph,\n };\n });\n selection\n .selectAll(className(constant_1.AREA_CLASS_NAME))\n .data(\n // Only render area with defined style.\n I.filter((i) => (0, helper_1.defined)(areaStyles[i])), (i) => areaKeys[i])\n .join((enter) => enter\n .append('rect')\n .attr('className', constant_1.AREA_CLASS_NAME)\n .style('zIndex', -2)\n .call(styleArea), (update) => update.call(styleArea), (exit) => exit.remove());\n const animationExtent = computeAnimationExtent(markState);\n const componentAnimateOptions = animationExtent\n ? { duration: animationExtent[1] }\n : false;\n // Render components.\n // @todo renderComponent return ctor and options.\n // Key for each type of component.\n // Index them grouped by position.\n for (const [, C] of (0, d3_array_1.groups)(components, (d) => `${d.type}-${d.position}`)) {\n C.forEach((d, i) => (d.index = i));\n }\n const componentsTransitions = selection\n .selectAll(className(constant_1.COMPONENT_CLASS_NAME))\n .data(components, (d) => `${d.type}-${d.position}-${d.index}`)\n .join((enter) => enter\n .append('g')\n .style('zIndex', ({ zIndex }) => zIndex || -1)\n .attr('className', constant_1.COMPONENT_CLASS_NAME)\n .append((options) => (0, component_1.renderComponent)((0, util_1.deepMix)({ animate: componentAnimateOptions, scale }, options), coordinate, theme, library, markState)), (update) => update.transition(function (options, i, element) {\n const { preserve = false } = options;\n if (preserve)\n return;\n const newComponent = (0, component_1.renderComponent)((0, util_1.deepMix)({ animate: componentAnimateOptions, scale }, options), coordinate, theme, library, markState);\n const { attributes } = newComponent;\n const [node] = element.childNodes;\n return node.update(attributes, false);\n }))\n .transitions();\n transitions.push(...componentsTransitions.flat().filter(helper_1.defined));\n // Main layer is for showing the main visual representation such as marks. There\n // may be multiple main layers for a view, each main layer correspond to one of marks.\n // @todo Test DOM structure.\n const T = selection\n .selectAll(className(constant_1.PLOT_CLASS_NAME))\n .data([layout], () => key)\n .join((enter) => enter\n // Make this layer interactive, such as click and mousemove events.\n .append('rect')\n .style('zIndex', 0)\n .style('fill', 'transparent')\n .attr('className', constant_1.PLOT_CLASS_NAME)\n .call(updateBBox)\n .call(updateLayers, Array.from(markState.keys()))\n .call(applyClip, clip), (update) => update\n .call(updateLayers, Array.from(markState.keys()))\n .call((selection) => {\n return animationExtent\n ? animateBBox(selection, animationExtent)\n : updateBBox(selection);\n })\n .call(applyClip, clip))\n .transitions();\n transitions.push(...T.flat());\n // Render marks with corresponding data.\n for (const [mark, state] of markState.entries()) {\n const { data } = state;\n const { key, class: cls, type } = mark;\n const viewNode = selection.select(`#${key}`);\n const shapeFunction = createMarkShapeFunction(mark, state, view, context);\n const enterFunction = createEnterFunction(mark, state, view, library);\n const updateFunction = createUpdateFunction(mark, state, view, library);\n const exitFunction = createExitFunction(mark, state, view, library);\n const facetElements = selectFacetElements(selection, viewNode, cls, 'element');\n const T = viewNode\n .selectAll(className(constant_1.ELEMENT_CLASS_NAME))\n .selectFacetAll(facetElements)\n .data(data, (d) => d.key, (d) => d.groupKey)\n .join((enter) => enter\n .append(shapeFunction)\n // Note!!! Only one className can be set.\n // Using attribute as alternative for other classNames.\n .attr('className', constant_1.ELEMENT_CLASS_NAME)\n .attr('markType', type)\n .transition(function (data, i, element) {\n return enterFunction(data, [element]);\n }), (update) => update.call((selection) => {\n const parent = selection.parent();\n const origin = (0, helper_1.useMemo)((node) => {\n const [x, y] = node.getBounds().min;\n return [x, y];\n });\n selection\n .transition(function (data, index, element) {\n maybeFacetElement(element, parent, origin);\n const node = shapeFunction(data, index);\n const animation = updateFunction(data, [element], [node]);\n if (animation === null || animation === void 0 ? void 0 : animation.length)\n return animation;\n if (element.nodeName === node.nodeName &&\n node.nodeName !== 'g') {\n (0, helper_1.copyAttributes)(element, node);\n }\n else {\n element.parentNode.replaceChild(node, element);\n node.className = constant_1.ELEMENT_CLASS_NAME;\n // @ts-ignore\n node.markType = type;\n // @ts-ignore\n node.__data__ = element.__data__;\n }\n return animation;\n })\n .attr('markType', type)\n .attr('className', constant_1.ELEMENT_CLASS_NAME);\n }), (exit) => {\n return exit\n .each(function (d, i, element) {\n element.__removed__ = true;\n })\n .transition(function (data, i, element) {\n return exitFunction(data, [element]);\n })\n .remove();\n }, (merge) => merge\n // Append elements to be merged.\n .append(shapeFunction)\n .attr('className', constant_1.ELEMENT_CLASS_NAME)\n .attr('markType', type)\n .transition(function (data, i, element) {\n // Remove merged elements after animation finishing.\n const { __fromElements__: fromElements } = element;\n const transition = updateFunction(data, fromElements, [element]);\n const exit = new selection_1.Selection(fromElements, null, element.parentNode);\n exit.transition(transition).remove();\n return transition;\n }), (split) => split\n .transition(function (data, i, element) {\n // Append splitted shapes.\n const enter = new selection_1.Selection([], element.__toData__, element.parentNode);\n const toElements = enter\n .append(shapeFunction)\n .attr('className', constant_1.ELEMENT_CLASS_NAME)\n .attr('markType', type)\n .nodes();\n return updateFunction(data, [element], toElements);\n })\n // Remove elements to be splitted after animation finishing.\n .remove())\n .transitions();\n transitions.push(...T.flat());\n }\n // Plot label for this view.\n plotLabel(view, selection, transitions, library, context);\n });\n}\n/**\n * Auto hide labels be specify label layout.\n */\nfunction plotLabel(view, selection, transitions, library, context) {\n const [useLabelTransform] = (0, library_1.useLibrary)('labelTransform', library);\n const { markState, labelTransform } = view;\n const labelLayer = selection.select(className(constant_1.LABEL_LAYER_CLASS_NAME)).node();\n // A Map index shapeFunction by label.\n const labelShapeFunction = new Map();\n // A Map index options by label.\n const labelDescriptor = new Map();\n // Get all labels for this view.\n const labels = Array.from(markState.entries()).flatMap(([mark, state]) => {\n const { labels: labelOptions = [], key } = mark;\n const shapeFunction = createLabelShapeFunction(mark, state, view, library, context);\n const elements = selection\n .select(`#${key}`)\n .selectAll(className(constant_1.ELEMENT_CLASS_NAME))\n .nodes()\n // Only select the valid element.\n .filter((n) => !n.__removed__);\n return labelOptions.flatMap((labelOption, i) => {\n const { transform = [] } = labelOption, options = __rest(labelOption, [\"transform\"]);\n return elements.flatMap((e) => {\n const L = getLabels(options, i, e);\n L.forEach((l) => {\n labelShapeFunction.set(l, (data) => shapeFunction(Object.assign(Object.assign({}, data), { element: e })));\n labelDescriptor.set(l, labelOption);\n });\n return L;\n });\n });\n });\n // Render all labels.\n const labelShapes = (0, selection_1.select)(labelLayer)\n .selectAll(className(constant_1.LABEL_CLASS_NAME))\n .data(labels, (d) => d.key)\n .join((enter) => enter\n .append((d) => labelShapeFunction.get(d)(d))\n .attr('className', constant_1.LABEL_CLASS_NAME), (update) => update.each(function (d, i, element) {\n // @todo Handle Label with different type.\n const shapeFunction = labelShapeFunction.get(d);\n const node = shapeFunction(d);\n (0, helper_1.copyAttributes)(element, node);\n }), (exit) => exit.remove())\n .nodes();\n // Apply group-level transforms.\n const labelGroups = (0, d3_array_1.group)(labelShapes, (d) => labelDescriptor.get(d.__data__));\n const { coordinate, layout } = view;\n const labelTransformContext = {\n canvas: context.canvas,\n coordinate,\n layout,\n };\n for (const [label, shapes] of labelGroups) {\n const { transform = [] } = label;\n const transformFunction = (0, helper_1.compose)(transform.map(useLabelTransform));\n transformFunction(shapes, labelTransformContext);\n }\n // Apply view-level transform.\n if (labelTransform) {\n labelTransform(labelShapes, labelTransformContext);\n }\n}\nfunction getLabels(label, labelIndex, element) {\n const { seriesIndex: SI, seriesKey, points, key, index } = element.__data__;\n const bounds = getLocalBounds(element);\n if (!SI) {\n return [\n Object.assign(Object.assign({}, label), { key: `${key}-${labelIndex}`, bounds,\n index,\n points, dependentElement: element }),\n ];\n }\n const selector = normalizeLabelSelector(label);\n const F = SI.map((index, i) => (Object.assign(Object.assign({}, label), { key: `${seriesKey[i]}-${labelIndex}`, bounds: [points[i]], index,\n points, dependentElement: element })));\n return selector ? selector(F) : F;\n}\nfunction filterValid([I, P, S]) {\n if (S)\n return [I, P, S];\n const definedIndex = [];\n const definedPoints = [];\n for (let i = 0; i < I.length; i++) {\n const d = I[i];\n const p = P[i];\n if (p.every(([x, y]) => (0, helper_1.defined)(x) && (0, helper_1.defined)(y))) {\n definedIndex.push(d);\n definedPoints.push(p);\n }\n }\n return [definedIndex, definedPoints];\n}\nfunction normalizeLabelSelector(label) {\n const { selector } = label;\n if (!selector)\n return null;\n if (typeof selector === 'function')\n return selector;\n if (selector === 'first')\n return (I) => [I[0]];\n if (selector === 'last')\n return (I) => [I[I.length - 1]];\n throw new Error(`Unknown selector: ${selector}`);\n}\n/**\n * Avoid getting error bounds caused by element animations.\n * @todo Remove this temporary handle method, if runtime supports\n * correct process: drawElement, do label layout and then do\n * transitions together.\n */\nfunction getLocalBounds(element) {\n const cloneElement = element.cloneNode(true);\n const animations = element.getAnimations();\n cloneElement.style.visibility = 'hidden';\n animations.forEach((animation) => {\n const keyframes = animation.effect.getKeyframes();\n cloneElement.attr(keyframes[keyframes.length - 1]);\n });\n element.parentNode.appendChild(cloneElement);\n const bounds = cloneElement.getLocalBounds();\n cloneElement.destroy();\n const { min, max } = bounds;\n return [min, max];\n}\nfunction createLabelShapeFunction(mark, state, view, library, context) {\n const [useShape] = (0, library_1.useLibrary)('shape', library);\n const { data: abstractData, encode } = mark;\n const { data: visualData, defaultLabelShape } = state;\n const point2d = visualData.map((d) => d.points);\n const channel = (0, array_1.mapObject)(encode, (d) => d.value);\n // Assemble Context.\n const { theme, coordinate } = view;\n const shapeContext = Object.assign(Object.assign({}, context), { document: (0, library_1.documentOf)(context), theme,\n coordinate });\n return (options) => {\n // Computed values from data and styles.\n const { index, points } = options;\n const datum = abstractData[index];\n const { formatter = (d) => `${d}`, transform, style: abstractStyle, render, selector, element } = options, abstractOptions = __rest(options, [\"formatter\", \"transform\", \"style\", \"render\", \"selector\", \"element\"]);\n const visualOptions = (0, array_1.mapObject)(Object.assign(Object.assign({}, abstractOptions), abstractStyle), (d) => valueOf(d, datum, index, abstractData, {\n channel,\n element,\n }));\n const { shape = defaultLabelShape, text } = visualOptions, style = __rest(visualOptions, [\"shape\", \"text\"]);\n const f = typeof formatter === 'string' ? (0, d3_format_1.format)(formatter) : formatter;\n const value = Object.assign(Object.assign({}, style), { text: f(text, datum, index, abstractData), datum });\n // Params for create shape.\n const shapeOptions = Object.assign({ type: `label.${shape}`, render }, style);\n const shapeFunction = useShape(shapeOptions, shapeContext);\n const defaults = getDefaultsStyle(theme, 'label', shape, 'label');\n return shapeFunction(points, value, defaults, point2d);\n };\n}\nfunction valueOf(value, datum, i, data, options) {\n if (typeof value === 'function')\n return value(datum, i, data, options);\n if (typeof value !== 'string')\n return value;\n if ((0, helper_1.isStrictObject)(datum) && datum[value] !== undefined)\n return datum[value];\n return value;\n}\n/**\n * Compute max duration for this frame.\n */\nfunction computeAnimationExtent(markState) {\n let maxDuration = -Infinity;\n let minDelay = Infinity;\n for (const [mark, state] of markState) {\n const { animate = {} } = mark;\n const { data } = state;\n const { enter = {}, update = {}, exit = {} } = animate;\n const { type: defaultUpdateType, duration: defaultUpdateDuration = 300, delay: defaultUpdateDelay = 0, } = update;\n const { type: defaultEnterType, duration: defaultEnterDuration = 300, delay: defaultEnterDelay = 0, } = enter;\n const { type: defaultExitType, duration: defaultExitDuration = 300, delay: defaultExitDelay = 0, } = exit;\n for (const d of data) {\n const { updateType = defaultUpdateType, updateDuration = defaultUpdateDuration, updateDelay = defaultUpdateDelay, enterType = defaultEnterType, enterDuration = defaultEnterDuration, enterDelay = defaultEnterDelay, exitDuration = defaultExitDuration, exitDelay = defaultExitDelay, exitType = defaultExitType, } = d;\n if (updateType === undefined || updateType) {\n maxDuration = Math.max(maxDuration, updateDuration + updateDelay);\n minDelay = Math.min(minDelay, updateDelay);\n }\n if (exitType === undefined || exitType) {\n maxDuration = Math.max(maxDuration, exitDuration + exitDelay);\n minDelay = Math.min(minDelay, exitDelay);\n }\n if (enterType === undefined || enterType) {\n maxDuration = Math.max(maxDuration, enterDuration + enterDelay);\n minDelay = Math.min(minDelay, enterDelay);\n }\n }\n }\n if (maxDuration === -Infinity)\n return null;\n return [minDelay, maxDuration - minDelay];\n}\nfunction selectFacetElements(selection, current, facetClassName, elementClassName) {\n const group = selection.node().parentElement;\n return group\n .findAll((node) => node.style.facet !== undefined &&\n node.style.facet === facetClassName &&\n node !== current.node())\n .flatMap((node) => node.getElementsByClassName(elementClassName));\n}\n/**\n * Update the parent of element and apply transform to make it\n * stay in original position.\n */\nfunction maybeFacetElement(element, parent, originOf) {\n if (!element.__facet__)\n return;\n // element -> g#main -> rect#plot\n const prePlot = element.parentNode.parentNode;\n // g#main -> rect#plot\n const newPlot = parent.parentNode;\n const [px, py] = originOf(prePlot);\n const [x, y] = originOf(newPlot);\n const translate = `translate(${px - x}, ${py - y})`;\n (0, helper_1.appendTransform)(element, translate);\n parent.append(element);\n}\nfunction createMarkShapeFunction(mark, state, view, context) {\n const { library } = context;\n const [useShape] = (0, library_1.useLibrary)('shape', library);\n const { data: abstractData, encode } = mark;\n const { defaultShape, data, shape: shapeLibrary } = state;\n const channel = (0, array_1.mapObject)(encode, (d) => d.value);\n const point2d = data.map((d) => d.points);\n const { theme, coordinate } = view;\n const { type: markType, style = {} } = mark;\n const shapeContext = Object.assign(Object.assign({}, context), { document: (0, library_1.documentOf)(context), coordinate,\n theme });\n return (data) => {\n const { shape: styleShape = defaultShape } = style;\n const { shape = styleShape, points, seriesIndex, index: i } = data, v = __rest(data, [\"shape\", \"points\", \"seriesIndex\", \"index\"]);\n const value = Object.assign(Object.assign({}, v), { index: i });\n // Get data-driven style.\n // If it is a series shape, such as area and line,\n // provides the series of abstract data and indices\n // for this shape, otherwise the single datum and\n // index.\n const abstractDatum = seriesIndex\n ? seriesIndex.map((i) => abstractData[i])\n : abstractData[i];\n const I = seriesIndex ? seriesIndex : i;\n const visualStyle = (0, array_1.mapObject)(style, (d) => valueOf(d, abstractDatum, I, abstractData, { channel }));\n // Try get shape from mark first, then from library.\n const shapeFunction = shapeLibrary[shape]\n ? shapeLibrary[shape](visualStyle, shapeContext)\n : useShape(Object.assign(Object.assign({}, visualStyle), { type: shapeName(mark, shape) }), shapeContext);\n const defaults = getDefaultsStyle(theme, markType, shape, defaultShape);\n return shapeFunction(points, value, defaults, point2d);\n };\n}\nfunction getDefaultsStyle(theme, mark, shape, defaultShape) {\n if (typeof mark !== 'string')\n return;\n const { color } = theme;\n const markTheme = theme[mark] || {};\n const shapeTheme = markTheme[shape] || markTheme[defaultShape];\n return Object.assign({ color }, shapeTheme);\n}\nfunction createAnimationFunction(type, mark, state, view, library) {\n var _a, _b;\n const [, createShape] = (0, library_1.useLibrary)('shape', library);\n const [useAnimation] = (0, library_1.useLibrary)('animation', library);\n const { defaultShape, shape: shapeLibrary } = state;\n const { theme, coordinate } = view;\n const upperType = (0, util_1.upperFirst)(type);\n const key = `default${upperType}Animation`;\n // Get shape from mark first, then from library.\n const { [key]: defaultAnimation } = ((_a = shapeLibrary[defaultShape]) === null || _a === void 0 ? void 0 : _a.props) ||\n createShape(shapeName(mark, defaultShape)).props;\n const { [type]: defaultEffectTiming = {} } = theme;\n const animate = ((_b = mark.animate) === null || _b === void 0 ? void 0 : _b[type]) || {};\n const context = { coordinate };\n return (data, from, to) => {\n const { [`${type}Type`]: animation, [`${type}Delay`]: delay, [`${type}Duration`]: duration, [`${type}Easing`]: easing, } = data;\n const options = Object.assign({ type: animation || defaultAnimation }, animate);\n if (!options.type)\n return null;\n const animateFunction = useAnimation(options, context);\n const value = { delay, duration, easing };\n const A = animateFunction(from, to, (0, util_1.deepMix)(defaultEffectTiming, value));\n let an = [];\n if (!Array.isArray(A)) {\n an = [A];\n }\n else {\n an = A;\n }\n return an.filter(Boolean);\n };\n}\nfunction createEnterFunction(mark, state, view, library) {\n return createAnimationFunction('enter', mark, state, view, library);\n}\n/**\n * Animation will not cancel automatically, it should be canceled\n * manually. This is very important for performance.\n */\nfunction cancel(animation) {\n animation.finished.then(() => {\n animation.cancel();\n });\n return animation;\n}\nfunction createUpdateFunction(mark, state, view, library) {\n return createAnimationFunction('update', mark, state, view, library);\n}\nfunction createExitFunction(mark, state, view, library) {\n return createAnimationFunction('exit', mark, state, view, library);\n}\nfunction inferTheme(theme = {}) {\n if (typeof theme === 'string')\n return { type: theme };\n const { type = 'light' } = theme, rest = __rest(theme, [\"type\"]);\n return Object.assign(Object.assign({}, rest), { type });\n}\n/**\n * @todo Infer builtin tooltips.\n */\nfunction inferInteraction(view) {\n const defaults = {\n event: true,\n tooltip: true,\n // @todo Inferred by slider self.\n sliderFilter: true,\n legendFilter: true,\n scrollbarFilter: true,\n };\n const { interaction = {} } = view;\n return Object.entries((0, util_1.deepMix)(defaults, interaction)).reverse();\n}\nfunction applyTransform(node, context) {\n return __awaiter(this, void 0, void 0, function* () {\n const { data } = node, rest = __rest(node, [\"data\"]);\n if (data == undefined)\n return node;\n const [, { data: newData }] = yield (0, transform_1.applyDataTransform)([], { data }, context);\n return Object.assign({ data: newData }, rest);\n });\n}\nfunction updateBBox(selection) {\n selection\n .style('transform', (d) => `translate(${d.paddingLeft + d.marginLeft}, ${d.paddingTop + d.marginTop})`)\n .style('width', (d) => d.innerWidth)\n .style('height', (d) => d.innerHeight);\n}\nfunction animateBBox(selection, extent) {\n const [delay, duration] = extent;\n selection.transition(function (data, i, element) {\n const { transform, width, height } = element.style;\n const { paddingLeft, paddingTop, innerWidth, innerHeight, marginLeft, marginTop, } = data;\n const keyframes = [\n {\n transform,\n width,\n height,\n },\n {\n transform: `translate(${paddingLeft + marginLeft}, ${paddingTop + marginTop})`,\n width: innerWidth,\n height: innerHeight,\n },\n ];\n return element.animate(keyframes, { delay, duration, fill: 'both' });\n });\n}\nfunction shapeName(mark, name) {\n const { type } = mark;\n if (typeof name === 'string')\n return `${type}.${name}`;\n return name;\n}\n/**\n * Create and update layer for each mark.\n * All the layers created here are treated as main layers.\n */\nfunction updateLayers(selection, marks) {\n const facet = (d) => (d.class !== undefined ? `${d.class}` : '');\n // Skip for empty selection, it can't append nodes.\n const nodes = selection.nodes();\n if (nodes.length === 0)\n return;\n selection\n .selectAll(className(constant_1.MAIN_LAYER_CLASS_NAME))\n .data(marks, (d) => d.key)\n .join((enter) => enter\n .append('g')\n .attr('className', constant_1.MAIN_LAYER_CLASS_NAME)\n .attr('id', (d) => d.key)\n .style('facet', facet)\n .style('fill', 'transparent')\n .style('zIndex', (d) => { var _a; return (_a = d.zIndex) !== null && _a !== void 0 ? _a : 0; }), (update) => update\n .style('facet', facet)\n .style('fill', 'transparent')\n .style('zIndex', (d) => { var _a; return (_a = d.zIndex) !== null && _a !== void 0 ? _a : 0; }), (exit) => exit.remove());\n const labelLayer = selection.select(className(constant_1.LABEL_LAYER_CLASS_NAME)).node();\n if (labelLayer)\n return;\n selection\n .append('g')\n .attr('className', constant_1.LABEL_LAYER_CLASS_NAME)\n .style('zIndex', 0);\n}\nfunction className(...names) {\n return names.map((d) => `.${d}`).join('');\n}\nfunction applyClip(selection, clip) {\n if (!selection.node())\n return;\n selection.style('clipPath', (data) => {\n if (!clip)\n return null;\n const { paddingTop: y, paddingLeft: x, marginLeft: x1, marginTop: y1, innerWidth: width, innerHeight: height, } = data;\n return new g_1.Rect({ style: { x: x + x1, y: y + y1, width, height } });\n });\n}\nfunction inferComponentScales(scales, states, markState) {\n // add shape scale to state.\n var _a;\n // for cell, omit shape scale.\n // @todo support shape scale for cell.\n for (const [key] of markState.entries()) {\n if (key.type === 'cell') {\n return scales.filter((scale) => scale.name !== 'shape');\n }\n }\n // can't infer shape scale if there are multiple states.\n if (states.length !== 1 || scales.some((scale) => scale.name === 'shape')) {\n return scales;\n }\n const { defaultShape: shape } = states[0];\n const acceptMarkTypes = ['point', 'line', 'rect', 'hollow'];\n if (!acceptMarkTypes.includes(shape))\n return scales;\n const shapeMap = {\n point: 'point',\n line: 'hyphen',\n rect: 'square',\n hollow: 'hollow',\n };\n // create shape scale\n const field = ((_a = scales.find((scale) => scale.name === 'color')) === null || _a === void 0 ? void 0 : _a.field) || null;\n const shapeScale = {\n field,\n name: 'shape',\n type: 'constant',\n domain: [],\n range: [shapeMap[shape]],\n };\n return [...scales, shapeScale];\n}\nfunction applyStyle(selection, style) {\n for (const [key, value] of Object.entries(style)) {\n selection.style(key, value);\n }\n}\nexports.applyStyle = applyStyle;\n//# sourceMappingURL=plot.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.styleOf = exports.computeTitleBBox = exports.computeLabelsBBox = exports.createScale = exports.computeComponentSize = exports.groupComponents = exports.flatComponents = exports.normalizeComponents = exports.renderComponent = exports.inferComponent = void 0;\nconst util_1 = require(\"@antv/util\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst d3_format_1 = require(\"@antv/vendor/d3-format\");\nconst g_1 = require(\"@antv/g\");\nconst coordinate_1 = require(\"../coordinate\");\nconst array_1 = require(\"../utils/array\");\nconst number_1 = require(\"../utils/number\");\nconst helper_1 = require(\"../utils/helper\");\nconst constant_1 = require(\"../component/constant\");\nconst coordinate_2 = require(\"./coordinate\");\nconst library_1 = require(\"./library\");\nconst scale_1 = require(\"./scale\");\nconst scale_2 = require(\"./types/scale\");\nfunction inferComponent(scales, partialOptions, library) {\n const { coordinates = [], title } = partialOptions;\n const [, createGuideComponent] = (0, library_1.useLibrary)('component', library);\n const displayedScales = scales.filter(({ guide }) => {\n if (guide === null)\n return false;\n return true;\n });\n const components = [];\n // Sliders and scrollbar component.\n const sliders = inferScrollableComponents(partialOptions, scales, library);\n components.push(...sliders);\n // Title components.\n if (title) {\n const { props } = createGuideComponent('title');\n const { defaultPosition, defaultOrientation, defaultOrder, defaultSize, defaultCrossPadding, } = props;\n const titleOptions = typeof title === 'string' ? { title } : title;\n components.push(Object.assign({ type: 'title', position: defaultPosition, orientation: defaultOrientation, order: defaultOrder, crossPadding: defaultCrossPadding[0], defaultSize }, titleOptions));\n }\n // Axis and legends.\n const inferredComponents = inferComponentsType(displayedScales, coordinates);\n inferredComponents.forEach(([type, relativeScales]) => {\n const { props } = createGuideComponent(type);\n const { defaultPosition, defaultPlane = 'xy', defaultOrientation, defaultSize, defaultOrder, defaultLength, defaultPadding: DP = [0, 0], defaultCrossPadding: DCP = [0, 0], } = props;\n // @todo to be confirm if the scale can be merged.\n // const scale: G2ScaleOptions = Object.assign({}, ...relativeScales);\n const scale = (0, util_1.deepMix)({}, ...relativeScales);\n const { guide: guideOptions, field } = scale;\n // A scale may have multiple guides.\n const guides = Array.isArray(guideOptions) ? guideOptions : [guideOptions];\n for (const partialGuide of guides) {\n const [position, orientation] = inferComponentPositionAndOrientation(type, defaultPosition, defaultOrientation, partialGuide, relativeScales, displayedScales, coordinates);\n // Skip if position and orientation are not specified.\n // @example the last axis of radar chart\n if (!position && !orientation)\n continue;\n const isVertical = position === 'left' || position === 'right';\n const defaultPadding = isVertical ? DP[1] : DP[0];\n const defaultCrossPadding = isVertical ? DCP[1] : DCP[0];\n const { size, order = defaultOrder, length = defaultLength, padding = defaultPadding, crossPadding = defaultCrossPadding, } = partialGuide;\n components.push(Object.assign(Object.assign({ title: field }, partialGuide), { defaultSize,\n length,\n position, plane: defaultPlane, orientation,\n padding,\n order,\n crossPadding,\n size,\n type, scales: relativeScales }));\n }\n });\n return components;\n}\nexports.inferComponent = inferComponent;\nfunction renderComponent(component, coordinate, theme, library, markState) {\n const [useGuideComponent] = (0, library_1.useLibrary)('component', library);\n const { scaleInstances: scales, scale, bbox } = component, options = __rest(component, [\"scaleInstances\", \"scale\", \"bbox\"]);\n const value = { bbox, library };\n const render = useGuideComponent(options);\n return render({\n coordinate,\n library,\n markState,\n scales,\n theme,\n value,\n scale,\n });\n}\nexports.renderComponent = renderComponent;\nfunction normalizeComponents(components) {\n return components.map((d) => {\n const component = (0, util_1.deepMix)(d, d.style);\n delete component.style;\n return component;\n });\n}\nexports.normalizeComponents = normalizeComponents;\nfunction flatComponents(components) {\n return components.flatMap((d) => (d.type == 'group' ? d.children : d));\n}\nexports.flatComponents = flatComponents;\n// Wrap legends into a group component.\nfunction groupComponents(components, crossSize) {\n // Group components by key.\n const P = ['left', 'right', 'bottom', 'top'];\n const key = ({ type, position, group }) => {\n if (!P.includes(position))\n return Symbol('independent');\n if (group === undefined) {\n if (type.startsWith('legend'))\n return `legend-${position}`;\n return Symbol('independent');\n }\n if (group === 'independent')\n return Symbol('independent');\n return group;\n };\n const grouped = (0, d3_array_1.groups)(components, key);\n // Update attributes of group components,\n // and maybe flatten group components without enough room.\n return grouped.flatMap(([, components]) => {\n if (components.length === 1)\n return components[0];\n // If crossSize defined, group components only when has\n // enough room.\n if (crossSize !== undefined) {\n // Compute total length.\n const DL = components\n .filter((d) => d.length !== undefined)\n .map((d) => d.length);\n const totalLength = (0, d3_array_1.sum)(DL);\n // If there is no enough room for components,\n // do not group.\n if (totalLength > crossSize) {\n components.forEach((d) => (d.group = Symbol('independent')));\n return components;\n }\n // Group legends and update legend length.\n const emptyLength = crossSize - totalLength;\n const emptyCount = components.length - DL.length;\n const length = emptyLength / emptyCount;\n components.forEach((d) => {\n if (d.length !== undefined)\n return;\n d.length = length;\n });\n }\n // Create a group component.\n const size = (0, d3_array_1.max)(components, (d) => d.size);\n const order = (0, d3_array_1.max)(components, (d) => d.order);\n const crossPadding = (0, d3_array_1.max)(components, (d) => d.crossPadding);\n const position = components[0].position;\n return {\n type: 'group',\n size,\n order,\n position,\n children: components,\n crossPadding,\n };\n });\n}\nexports.groupComponents = groupComponents;\nfunction inferLegendComponentType(scales, coordinates) {\n // Filter accepts scales.\n const channels = ['shape', 'size', 'color', 'opacity'];\n const isConstantSize = (type, name) => type === 'constant' && name === 'size';\n const accepts = scales.filter(({ type, name }) => typeof type === 'string' &&\n channels.includes(name) &&\n !isConstantSize(type, name));\n // Group scales by fields.\n const constants = accepts.filter(({ type }) => type === 'constant');\n const nonConstants = accepts.filter(({ type }) => type !== 'constant');\n const groupKey = (d) => (d.field ? d.field : Symbol('independent'));\n const fieldScales = (0, d3_array_1.groups)(nonConstants, groupKey)\n .map(([key, scales]) => [key, [...scales, ...constants]])\n .filter(([, scales]) => scales.some((scale) => scale.type !== 'constant'));\n const scalesByField = new Map(fieldScales);\n // Skip empty scales.\n if (scalesByField.size === 0)\n return [];\n // Infer components.\n const sort = (arr) => arr.sort(([a], [b]) => a.localeCompare(b));\n const components = Array.from(scalesByField)\n .map(([, scs]) => {\n const combinations = (0, array_1.combine)(scs).sort((a, b) => b.length - a.length);\n const options = combinations.map((combination) => ({\n combination,\n option: combination.map((scale) => [scale.name, getScaleType(scale)]),\n }));\n // For category legend.\n for (const { option, combination } of options) {\n // If every scale is constant, do not display legend.\n if (option.every((d) => d[1] === 'constant'))\n continue;\n if (option.every((d) => d[1] === 'discrete' || d[1] === 'constant')) {\n return ['legendCategory', combination];\n }\n }\n // For reset legend.\n // @todo Remove this.\n for (const [componentType, accords] of constant_1.LEGEND_INFER_STRATEGIES) {\n for (const { option, combination } of options) {\n if (accords.some((accord) => (0, util_1.isEqual)(sort(accord), sort(option)))) {\n return [componentType, combination];\n }\n }\n }\n return null;\n })\n .filter(helper_1.defined);\n return components;\n}\nfunction getScaleType(scale) {\n const { type } = scale;\n if (typeof type !== 'string')\n return null;\n if (type in scale_2.ContinuousScale)\n return 'continuous';\n if (type in scale_2.DiscreteScale)\n return 'discrete';\n if (type in scale_2.DistributionScale)\n return 'distribution';\n if (type in scale_2.ConstantScale)\n return 'constant';\n return null;\n}\nfunction inferAxisComponentType(scales, coordinates) {\n return scales\n .map((scale) => {\n const { name } = scale;\n // todo wait for gui provide helix axis\n if ((0, coordinate_2.isHelix)(coordinates) || (0, coordinate_2.isTheta)(coordinates))\n return null;\n if ((0, coordinate_2.isTranspose)(coordinates) &&\n ((0, coordinate_2.isPolar)(coordinates) || (0, coordinate_2.isRadial)(coordinates)))\n return null;\n // infer axis\n if (name.startsWith('x')) {\n if ((0, coordinate_2.isPolar)(coordinates))\n return ['axisArc', [scale]];\n if ((0, coordinate_2.isRadial)(coordinates))\n return ['axisLinear', [scale]];\n return [(0, coordinate_2.isTranspose)(coordinates) ? 'axisY' : 'axisX', [scale]];\n }\n if (name.startsWith('y')) {\n if ((0, coordinate_2.isPolar)(coordinates))\n return ['axisLinear', [scale]];\n if ((0, coordinate_2.isRadial)(coordinates))\n return ['axisArc', [scale]];\n return [(0, coordinate_2.isTranspose)(coordinates) ? 'axisX' : 'axisY', [scale]];\n }\n // Only support linear axis for z.\n if (name.startsWith('z')) {\n return ['axisZ', [scale]];\n }\n if (name.startsWith('position')) {\n if ((0, coordinate_2.isRadar)(coordinates))\n return ['axisRadar', [scale]];\n if (!(0, coordinate_2.isPolar)(coordinates))\n return ['axisY', [scale]];\n }\n return null;\n })\n .filter(helper_1.defined);\n}\nfunction inferComponentsType(scales, coordinates) {\n const availableScales = scales.filter((scale) => (0, scale_1.isValidScale)(scale));\n return [\n ...inferLegendComponentType(availableScales, coordinates),\n ...inferAxisComponentType(availableScales, coordinates),\n ];\n}\nfunction angleOf(coordinates) {\n const polar = (0, coordinate_2.coordOf)(coordinates, 'polar');\n if (polar.length) {\n const lastPolar = polar[polar.length - 1];\n const { startAngle, endAngle } = (0, coordinate_1.getPolarOptions)(lastPolar);\n return [startAngle, endAngle];\n }\n const radial = (0, coordinate_2.coordOf)(coordinates, 'radial');\n if (radial.length) {\n const lastRadial = radial[radial.length - 1];\n const { startAngle, endAngle } = (0, coordinate_1.getRadialOptions)(lastRadial);\n return [startAngle, endAngle];\n }\n return [-Math.PI / 2, (Math.PI / 2) * 3];\n}\n/**\n * match index of position\n */\nfunction matchPosition(name) {\n const match = /position(\\d*)/g.exec(name);\n if (!match)\n return null;\n return +match[1];\n}\nfunction inferAxisPositionAndOrientation(type, ordinalPosition, relativeScales, scales, coordinates) {\n // a axis only has one scale\n const { name } = relativeScales[0];\n // todo, in current resolution, the radar chart is implement by parallel + polar coordinate.\n // implementation plan to be confirmed.\n // in current implementation, it must to add the first position encode to it's last.\n // so we won't render the last axis repeatably.\n if (type === 'axisRadar') {\n const positions = scales.filter((scale) => scale.name.startsWith('position'));\n const index = matchPosition(name);\n if (index === null)\n return [null, null];\n // infer radar axis orientation\n const [startAngle, endAngle] = angleOf(coordinates);\n const positionLength = (0, coordinate_2.isRadar)(coordinates)\n ? positions.length\n : positions.length - 1;\n const angle = ((endAngle - startAngle) / positionLength) * index + startAngle;\n return ['center', angle];\n }\n if (type === 'axisY' && (0, coordinate_2.isParallel)(coordinates)) {\n return (0, coordinate_2.isTranspose)(coordinates)\n ? ['center', 'horizontal']\n : ['center', 'vertical'];\n }\n // in non-cartesian coordinate systems, infer the arc axis angle\n if (type === 'axisLinear') {\n const [startAngle] = angleOf(coordinates);\n return ['center', startAngle];\n }\n if (type === 'axisArc') {\n if (ordinalPosition[0] === 'inner')\n return ['inner', null];\n return ['outer', null];\n }\n if ((0, coordinate_2.isPolar)(coordinates))\n return ['center', null];\n if ((0, coordinate_2.isRadial)(coordinates))\n return ['center', null];\n if ((type === 'axisX' && (0, coordinate_2.isReflect)(coordinates)) ||\n (type === 'axisX' && (0, coordinate_2.isReflectY)(coordinates))) {\n return ['top', null];\n }\n // if (type === 'axisX') return ['bottom', null];\n return ordinalPosition;\n}\n// @todo Infer position by coordinates.\nfunction inferComponentPositionAndOrientation(type, defaultPosition, defaultOrientation, guide, relativeScales, scales, coordinates) {\n const [startAngle] = angleOf(coordinates);\n const ordinalPositionAndOrientation = [\n guide.position || defaultPosition,\n startAngle !== null && startAngle !== void 0 ? startAngle : defaultOrientation,\n ];\n if (typeof type === 'string' && type.startsWith('axis')) {\n return inferAxisPositionAndOrientation(type, ordinalPositionAndOrientation, relativeScales, scales, coordinates);\n }\n if (typeof type === 'string' &&\n type.startsWith('legend') &&\n (0, coordinate_2.isPolar)(coordinates)) {\n if (guide.position === 'center')\n return ['center', 'vertical'];\n }\n // for general component, use default position\n return ordinalPositionAndOrientation;\n}\nfunction inferScrollableType(name, type, coordinates = []) {\n if (name === 'x')\n return (0, coordinate_2.isTranspose)(coordinates) ? `${type}Y` : `${type}X`;\n if (name === 'y')\n return (0, coordinate_2.isTranspose)(coordinates) ? `${type}X` : `${type}Y`;\n return null;\n}\n/**\n * Infer scrollable components, such as slider and scrollbar.\n */\nfunction inferScrollableComponents(partialOptions, scales, library) {\n const [, createGuideComponent] = (0, library_1.useLibrary)('component', library);\n const { coordinates } = partialOptions;\n function normalized(type, channelName, scale, options) {\n const componentType = inferScrollableType(channelName, type, coordinates);\n if (!options || !componentType)\n return;\n const { props } = createGuideComponent(componentType);\n const { defaultPosition, defaultSize, defaultOrder, defaultCrossPadding: [crossPadding], } = props;\n return Object.assign(Object.assign({ position: defaultPosition, defaultSize, order: defaultOrder, type: componentType, crossPadding }, options), { scales: [scale] });\n }\n return scales\n .filter((d) => d.slider || d.scrollbar)\n .flatMap((scale) => {\n const { slider, scrollbar, name: channelName } = scale;\n return [\n normalized('slider', channelName, scale, slider),\n normalized('scrollbar', channelName, scale, scrollbar),\n ];\n })\n .filter((d) => !!d);\n}\n// !!! Note Mutate component.size and component.\nfunction computeComponentSize(component, crossSize, crossPadding, position, theme, library) {\n // Only compute and update size of components in padding area.\n const { type } = component;\n const paddingAreas = ['left', 'right', 'bottom', 'top'];\n if (!paddingAreas.includes(position))\n return;\n if (typeof type !== 'string')\n return;\n const t = type;\n const createCompute = () => {\n if (t.startsWith('axis'))\n return computeAxisSize;\n if (t.startsWith('group'))\n return computeGroupSize;\n if (t.startsWith('legendContinuous'))\n return computeContinuousLegendSize;\n if (t === 'legendCategory')\n return computeCategoryLegendSize;\n if (t.startsWith('slider'))\n return computeSliderSize;\n if (t === 'title')\n return computeTitleSize;\n if (t.startsWith('scrollbar'))\n return computeScrollbarSize;\n return () => { };\n };\n return createCompute()(component, crossSize, crossPadding, position, theme, library);\n}\nexports.computeComponentSize = computeComponentSize;\nfunction computeGroupSize(component, crossSize, crossPadding, position, theme, library) {\n const { children } = component;\n const maxCrossPadding = (0, d3_array_1.max)(children, (d) => d.crossPadding);\n children.forEach((d) => (d.crossPadding = maxCrossPadding));\n children.forEach((child) => computeComponentSize(child, crossSize, crossPadding, position, theme, library));\n const maxSize = (0, d3_array_1.max)(children, (d) => d.size);\n component.size = maxSize;\n children.forEach((d) => (d.size = maxSize));\n}\nfunction computeScrollbarSize(component, crossSize, crossPadding, position, theme, library) {\n const { trackSize = 6 } = (0, util_1.deepMix)({}, theme.scrollbar, component);\n component.size = trackSize;\n}\nfunction computeTitleSize(component, crossSize, crossPadding, position, theme, library) {\n const _a = (0, util_1.deepMix)({}, theme.title, component), { title, subtitle, spacing = 0 } = _a, style = __rest(_a, [\"title\", \"subtitle\", \"spacing\"]);\n if (title) {\n const titleStyle = (0, helper_1.subObject)(style, 'title');\n const titleBBox = computeLabelSize(title, titleStyle);\n component.size = titleBBox.height;\n }\n if (subtitle) {\n const subtitleStyle = (0, helper_1.subObject)(style, 'subtitle');\n const subtitleBBox = computeLabelSize(subtitle, subtitleStyle);\n component.size += spacing + subtitleBBox.height;\n }\n}\nfunction computeSliderSize(component, crossSize, crossPadding, position, theme, library) {\n const styleOf = () => {\n const { slider } = theme;\n return (0, util_1.deepMix)({}, slider, component);\n };\n const { trackSize, handleIconSize } = styleOf();\n const size = Math.max(trackSize, handleIconSize * 2.4);\n component.size = size;\n}\nfunction computeAxisSize(component, crossSize, crossPadding, position, theme, library) {\n var _a;\n // If padding is auto, use hide as the labelTransform by default\n // to avoid overlap between labels.\n component.transform = component.transform || [{ type: 'hide' }];\n // Vertical or horizontal.\n const isVertical = position === 'left' || position === 'right';\n // Get styles to be applied.\n const style = styleOf(component, position, theme);\n const { tickLength = 0, labelSpacing = 0, titleSpacing = 0, labelAutoRotate } = style, rest = __rest(style, [\"tickLength\", \"labelSpacing\", \"titleSpacing\", \"labelAutoRotate\"]);\n // Compute Labels.\n const scale = createScale(component, library);\n const labelBBoxes = computeLabelsBBox(rest, scale);\n const paddingTick = tickLength + labelSpacing;\n if (labelBBoxes && labelBBoxes.length) {\n const maxLabelWidth = (0, d3_array_1.max)(labelBBoxes, (d) => d.width);\n const maxLabelHeight = (0, d3_array_1.max)(labelBBoxes, (d) => d.height);\n if (isVertical) {\n component.size = maxLabelWidth + paddingTick;\n }\n else {\n const { tickFilter, labelTransform } = component;\n // If the labels can't be placed horizontally, and labelTransform is unset,\n // rotate 90 deg to display them.\n if (overflowX(scale, labelBBoxes, crossSize, crossPadding, tickFilter) &&\n !labelTransform &&\n labelAutoRotate !== false &&\n labelAutoRotate !== null) {\n component.labelTransform = 'rotate(90)';\n component.size = maxLabelWidth + paddingTick;\n }\n else {\n component.labelTransform = (_a = component.labelTransform) !== null && _a !== void 0 ? _a : 'rotate(0)';\n component.size = maxLabelHeight + paddingTick;\n }\n }\n }\n else {\n component.size = tickLength;\n }\n // Compute title.\n const titleBBox = computeTitleBBox(rest);\n if (titleBBox) {\n if (isVertical) {\n component.size += titleSpacing + titleBBox.width;\n }\n else {\n component.size += titleSpacing + titleBBox.height;\n }\n }\n}\nfunction computeContinuousLegendSize(component, crossSize, crossPadding, position, theme, library) {\n // Get styles.\n const styleOf = () => {\n const { legendContinuous } = theme;\n return (0, util_1.deepMix)({}, legendContinuous, component);\n };\n const _a = styleOf(), { labelSpacing = 0, titleSpacing = 0 } = _a, rest = __rest(_a, [\"labelSpacing\", \"titleSpacing\"]);\n // Vertical or horizontal.\n const isVertical = position === 'left' || position === 'right';\n // Ribbon styles.\n const ribbonStyles = (0, helper_1.subObject)(rest, 'ribbon');\n const { size: ribbonSize } = ribbonStyles;\n const handleIconStyles = (0, helper_1.subObject)(rest, 'handleIcon');\n const { size: handleIconSize } = handleIconStyles;\n const mainSize = Math.max(ribbonSize, handleIconSize * 2.4);\n component.size = mainSize;\n // Compute labels.\n const scale = createScale(component, library);\n const labelBBoxes = computeLabelsBBox(rest, scale);\n if (labelBBoxes) {\n const key = isVertical ? 'width' : 'height';\n const size = (0, d3_array_1.max)(labelBBoxes, (d) => d[key]);\n component.size += size + labelSpacing;\n }\n // Compute title.\n const titleBBox = computeTitleBBox(rest);\n if (titleBBox) {\n if (isVertical) {\n component.size = Math.max(component.size, titleBBox.width);\n }\n else {\n component.size += titleSpacing + titleBBox.height;\n }\n }\n}\nfunction computeCategoryLegendSize(component, crossSize0, crossPadding, position, theme, library) {\n const styleOf = () => {\n const { legendCategory } = theme;\n const { title } = component;\n const [defaultTitle, specifiedTitle] = Array.isArray(title)\n ? [title, undefined]\n : [undefined, title];\n return (0, util_1.deepMix)({ title: defaultTitle }, legendCategory, Object.assign(Object.assign({}, component), { title: specifiedTitle }));\n };\n const _a = styleOf(), { itemSpacing, itemMarkerSize, titleSpacing, rowPadding, colPadding, maxCols = Infinity, maxRows = Infinity } = _a, rest = __rest(_a, [\"itemSpacing\", \"itemMarkerSize\", \"titleSpacing\", \"rowPadding\", \"colPadding\", \"maxCols\", \"maxRows\"]);\n const { cols, length } = component;\n const getRows = (rows) => Math.min(rows, maxRows);\n const getCols = (cols) => Math.min(cols, maxCols);\n // Vertical or horizontal.\n const isVertical = position === 'left' || position === 'right';\n const crossSize = length === undefined\n ? crossSize0 + (isVertical ? 0 : crossPadding[0] + crossPadding[1])\n : length;\n // Compute title.\n const titleBBox = computeTitleBBox(rest);\n const scale = createScale(component, library);\n const labelBBoxes = computeLabelsBBox(rest, scale, 'itemLabel');\n const height = Math.max(labelBBoxes[0].height, itemMarkerSize) + rowPadding;\n const widthOf = (w, padding = 0) => itemMarkerSize + w + itemSpacing[0] + padding;\n // Only support grid layout for vertical area.\n const computeVerticalSize = () => {\n let maxSize = -Infinity;\n let pos = 0;\n let cols = 1;\n let rows = 0;\n let maxRows = -Infinity;\n let maxPos = -Infinity;\n const titleHeight = titleBBox ? titleBBox.height : 0;\n const maxHeight = crossSize - titleHeight;\n for (const { width } of labelBBoxes) {\n const w = widthOf(width, colPadding);\n maxSize = Math.max(maxSize, w);\n if (pos + height > maxHeight) {\n cols++;\n maxRows = Math.max(maxRows, rows);\n maxPos = Math.max(maxPos, pos);\n rows = 1;\n pos = height;\n }\n else {\n pos += height;\n rows++;\n }\n }\n if (cols <= 1) {\n maxRows = rows;\n maxPos = pos;\n }\n component.size = maxSize * getCols(cols);\n component.length = maxPos + titleHeight;\n (0, util_1.deepMix)(component, { cols: getCols(cols), gridRow: maxRows });\n };\n // Horizontal grid layout.\n const computeHorizontalGrid = () => {\n const rows = Math.ceil(labelBBoxes.length / cols);\n const maxWidth = (0, d3_array_1.max)(labelBBoxes, (d) => widthOf(d.width)) * cols;\n component.size = height * getRows(rows) - rowPadding;\n component.length = Math.min(maxWidth, crossSize);\n };\n // Horizontal flex layout.\n const computeHorizontalFlex = () => {\n let rows = 1;\n let pos = 0;\n let maxPos = -Infinity;\n for (const { width } of labelBBoxes) {\n const w = widthOf(width, colPadding);\n if (pos + w > crossSize) {\n maxPos = Math.max(maxPos, pos);\n pos = w;\n rows++;\n }\n else {\n pos += w;\n }\n }\n if (rows === 1)\n maxPos = pos;\n component.size = height * getRows(rows) - rowPadding;\n component.length = maxPos;\n };\n if (isVertical)\n computeVerticalSize();\n else if (typeof cols === 'number')\n computeHorizontalGrid();\n else\n computeHorizontalFlex();\n // Compute titles.\n if (titleBBox) {\n if (isVertical) {\n component.size = Math.max(component.size, titleBBox.width);\n }\n else {\n component.size += titleSpacing + titleBBox.height;\n }\n }\n}\nfunction createScale(component, library) {\n const [useScale] = (0, library_1.useLibrary)('scale', library);\n // Init scale, the tickCount of axis has higher priority than scale.\n const { scales, tickCount, tickMethod } = component;\n const scaleOptions = scales.find((d) => d.type !== 'constant' && d.type !== 'identity');\n if (tickCount !== undefined)\n scaleOptions.tickCount = tickCount;\n if (tickMethod !== undefined)\n scaleOptions.tickMethod = tickMethod;\n return useScale(scaleOptions);\n}\nexports.createScale = createScale;\nfunction computeLabelsBBox(component, scale, key = 'label') {\n const { labelFormatter, tickFilter, label = true } = component, style = __rest(component, [\"labelFormatter\", \"tickFilter\", \"label\"]);\n if (!label)\n return null;\n // Get labels to be rendered.\n const labels = labelsOf(scale, labelFormatter, tickFilter);\n const labelStyle = (0, helper_1.subObject)(style, key);\n const labelStyles = labels.map((d, i) => Object.fromEntries(Object.entries(labelStyle).map(([key, value]) => [\n key,\n typeof value === 'function' ? value(d, i) : value,\n ])));\n const labelBBoxes = labels.map((d, i) => {\n const normalizeStyle = labelStyles[i];\n return computeLabelSize(d, normalizeStyle);\n });\n // Cache boxes to avoid computed twice.\n // @todo GUI use untransformed bbox, so it can't cache if\n // label.style has transform attributes.\n const hasTransform = labelStyles.some((d) => d.transform);\n if (!hasTransform) {\n const I = labels.map((_, i) => i);\n component.indexBBox = new Map(I.map((i) => [i, [labels[i], labelBBoxes[i]]]));\n }\n return labelBBoxes;\n}\nexports.computeLabelsBBox = computeLabelsBBox;\nfunction computeTitleBBox(component) {\n const isFalsy = (x) => x === false || x === null;\n const { title } = component, style = __rest(component, [\"title\"]);\n if (isFalsy(title) || title === undefined)\n return null;\n const titleStyle = (0, helper_1.subObject)(style, 'title');\n const { direction, transform } = titleStyle;\n const titleText = Array.isArray(title) ? title.join(',') : title;\n if (typeof titleText !== 'string')\n return null;\n const titleBBox = computeLabelSize(titleText, Object.assign(Object.assign({}, titleStyle), { transform: transform || (direction === 'vertical' ? 'rotate(-90)' : '') }));\n return titleBBox;\n}\nexports.computeTitleBBox = computeTitleBBox;\nfunction styleOf(axis, position, theme) {\n const { title } = axis;\n const [defaultTitle, specifiedTitle] = Array.isArray(title)\n ? [title, undefined]\n : [undefined, title];\n const { axis: baseStyle, \n // @ts-ignore\n [`axis${(0, helper_1.capitalizeFirst)(position)}`]: positionStyle, } = theme;\n return (0, util_1.deepMix)({ title: defaultTitle }, baseStyle, positionStyle, Object.assign(Object.assign({}, axis), { title: specifiedTitle }));\n}\nexports.styleOf = styleOf;\nfunction ticksOf(scale, tickFilter) {\n const ticks = scale.getTicks ? scale.getTicks() : scale.getOptions().domain;\n if (!tickFilter)\n return ticks;\n return ticks.filter(tickFilter);\n}\nfunction labelsOf(scale, labelFormatter, tickFilter) {\n const T = ticksOf(scale, tickFilter);\n const ticks = T.map((d) => (typeof d === 'number' ? (0, number_1.prettyNumber)(d) : d));\n const formatter = labelFormatter\n ? typeof labelFormatter === 'string'\n ? (0, d3_format_1.format)(labelFormatter)\n : labelFormatter\n : scale.getFormatter\n ? scale.getFormatter()\n : (d) => `${d}`;\n return ticks.map(formatter);\n}\nfunction offsetOf(scale, d) {\n if (!scale.getBandWidth)\n return 0;\n const offset = scale.getBandWidth(d) / 2;\n return offset;\n}\nfunction overflowX(scale, labelBBoxes, crossSize, crossPadding, tickFilter) {\n // If actual size bigger than container size, overflow.\n const totalSize = (0, d3_array_1.sum)(labelBBoxes, (d) => d.width);\n if (totalSize > crossSize)\n return true;\n // Clone scale to get visual position for labels.\n const scaleX = scale.clone();\n scaleX.update({ range: [0, crossSize] });\n const ticks = ticksOf(scale, tickFilter);\n const X = ticks.map((d) => scaleX.map(d) + offsetOf(scaleX, d));\n const I = ticks.map((_, i) => i);\n const startX = -crossPadding[0];\n const endX = crossSize + crossPadding[1];\n const extent = (x, bbox) => {\n const { width } = bbox;\n return [x - width / 2, x + width / 2];\n };\n // Collision detection.\n for (let i = 0; i < I.length; i++) {\n const x = X[i];\n const [x0, x1] = extent(x, labelBBoxes[i]);\n // If a label is out of plot area, overflow.\n if (x0 < startX || x1 > endX)\n return true;\n const y = X[i + 1];\n if (y) {\n // If two labels intersect, overflow.\n const [y0] = extent(y, labelBBoxes[i + 1]);\n if (x1 > y0)\n return true;\n }\n }\n return false;\n}\nfunction computeLabelSize(d, style) {\n const shape = normalizeLabel(d);\n const { filter } = style, rest = __rest(style, [\"filter\"]);\n shape.attr(Object.assign(Object.assign({}, rest), { visibility: 'none' }));\n const bbox = shape.getBBox();\n return bbox;\n}\nfunction normalizeLabel(d) {\n if (d instanceof g_1.DisplayObject)\n return d;\n return new g_1.Text({ style: { text: `${d}` } });\n}\n//# sourceMappingURL=component.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LEGEND_INFER_STRATEGIES = void 0;\n/**\n * @examples\n * ✅\n * color - `discrete`, shape - `constant`\n * legendCategory.rule[27] is matched\n *\n * ❎\n * shape - `discrete`, size - `constant`\n * There are no rules to match\n *\n */\nexports.LEGEND_INFER_STRATEGIES = [\n [\n 'legendCategory',\n [\n [\n ['color', 'discrete'],\n ['opacity', 'discrete'],\n ['shape', 'discrete'],\n ['size', 'constant'],\n ],\n [\n ['color', 'discrete'],\n ['opacity', 'constant'],\n ['shape', 'discrete'],\n ['size', 'constant'],\n ],\n [\n ['color', 'discrete'],\n ['opacity', 'discrete'],\n ['shape', 'constant'],\n ['size', 'constant'],\n ],\n [\n ['color', 'discrete'],\n ['opacity', 'constant'],\n ['shape', 'constant'],\n ['size', 'constant'],\n ],\n [\n ['color', 'constant'],\n ['opacity', 'discrete'],\n ['shape', 'discrete'],\n ['size', 'constant'],\n ],\n [\n ['color', 'constant'],\n ['opacity', 'constant'],\n ['shape', 'discrete'],\n ['size', 'constant'],\n ],\n [\n ['color', 'constant'],\n ['opacity', 'discrete'],\n ['shape', 'constant'],\n ['size', 'constant'],\n ],\n [\n ['color', 'discrete'],\n ['shape', 'discrete'],\n ['size', 'constant'],\n ],\n [\n ['color', 'discrete'],\n ['opacity', 'discrete'],\n ['shape', 'discrete'],\n ],\n [\n ['color', 'discrete'],\n ['opacity', 'discrete'],\n ['size', 'constant'],\n ],\n [\n ['color', 'discrete'],\n ['opacity', 'constant'],\n ['shape', 'discrete'],\n ],\n [\n ['color', 'discrete'],\n ['opacity', 'constant'],\n ['size', 'constant'],\n ],\n [\n ['color', 'discrete'],\n ['shape', 'constant'],\n ['size', 'constant'],\n ],\n [\n ['color', 'discrete'],\n ['opacity', 'discrete'],\n ['shape', 'constant'],\n ],\n [\n ['color', 'discrete'],\n ['opacity', 'constant'],\n ['shape', 'constant'],\n ],\n [\n ['color', 'constant'],\n ['shape', 'discrete'],\n ['size', 'constant'],\n ],\n [\n ['color', 'constant'],\n ['opacity', 'discrete'],\n ['shape', 'discrete'],\n ],\n [\n ['color', 'constant'],\n ['opacity', 'discrete'],\n ['size', 'constant'],\n ],\n [\n ['color', 'constant'],\n ['opacity', 'constant'],\n ['shape', 'discrete'],\n ],\n // [\n // ['color', 'constant'],\n // ['opacity', 'constant'],\n // ['size', 'constant'],\n // ],\n // [\n // ['color', 'constant'],\n // ['shape', 'constant'],\n // ['size', 'constant'],\n // ],\n [\n ['color', 'constant'],\n ['opacity', 'discrete'],\n ['shape', 'constant'],\n ],\n [\n ['color', 'discrete'],\n ['shape', 'discrete'],\n ],\n [\n ['color', 'discrete'],\n ['size', 'constant'],\n ],\n [\n ['color', 'discrete'],\n ['opacity', 'discrete'],\n ],\n [\n ['color', 'discrete'],\n ['opacity', 'constant'],\n ],\n [\n ['color', 'discrete'],\n ['shape', 'constant'],\n ],\n [\n ['color', 'constant'],\n ['shape', 'discrete'],\n ],\n [\n ['color', 'constant'],\n ['size', 'constant'],\n ],\n [\n ['color', 'constant'],\n ['opacity', 'discrete'],\n ],\n // [\n // ['color', 'constant'],\n // ['opacity', 'constant'],\n // ],\n // [\n // ['color', 'constant'],\n // ['shape', 'constant'],\n // ],\n [['color', 'discrete']],\n // [['color', 'constant']],\n ],\n ],\n [\n 'legendContinuousSize',\n [\n [\n ['color', 'continuous'],\n ['opacity', 'continuous'],\n ['size', 'continuous'],\n ],\n [\n ['color', 'constant'],\n ['opacity', 'continuous'],\n ['size', 'continuous'],\n ],\n [\n ['color', 'continuous'],\n ['size', 'continuous'],\n ],\n [\n ['color', 'constant'],\n ['size', 'continuous'],\n ],\n [\n ['size', 'continuous'],\n ['opacity', 'continuous'],\n ],\n [['size', 'continuous']],\n ],\n ],\n [\n 'legendContinuousBlockSize',\n [\n [\n ['color', 'distribution'],\n ['opacity', 'distribution'],\n ['size', 'distribution'],\n ],\n [\n ['color', 'distribution'],\n ['size', 'distribution'],\n ],\n ],\n ],\n [\n 'legendContinuousBlock',\n [\n [\n ['color', 'distribution'],\n ['opacity', 'continuous'],\n ],\n [['color', 'distribution']],\n ],\n ],\n [\n 'legendContinuous',\n [\n [\n ['color', 'continuous'],\n ['opacity', 'continuous'],\n ],\n [['color', 'continuous']],\n [['opacity', 'continuous']],\n ],\n ],\n];\n//# sourceMappingURL=constant.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isReflectY = exports.isRadar = exports.isRadial = exports.isReflect = exports.isTheta = exports.isParallel = exports.isTranspose = exports.isHelix = exports.isPolar = exports.coordOf = exports.coordinate2Transform = exports.createCoordinate = void 0;\nconst coord_1 = require(\"@antv/coord\");\nconst library_1 = require(\"./library\");\nfunction createCoordinate(layout, partialOptions, library) {\n const [useCoordinate] = (0, library_1.useLibrary)('coordinate', library);\n const { innerHeight, innerWidth, insetLeft, insetTop, insetRight, insetBottom, } = layout;\n const { coordinates: partialTransform = [] } = partialOptions;\n const transform = inferCoordinate(partialTransform);\n const isCartesian3D = transform[0].type === 'cartesian3D';\n const options = Object.assign(Object.assign({}, layout), { x: insetLeft, y: insetTop, width: innerWidth - insetLeft - insetRight, height: innerHeight - insetBottom - insetTop, transformations: transform.flatMap(useCoordinate) });\n const coordinate = isCartesian3D\n ? // @ts-ignore\n new coord_1.Coordinate3D(options)\n : new coord_1.Coordinate(options);\n return coordinate;\n}\nexports.createCoordinate = createCoordinate;\nfunction coordinate2Transform(node, library) {\n // @ts-ignore\n const { coordinate = {}, coordinates } = node, rest = __rest(node, [\"coordinate\", \"coordinates\"]);\n // If coordinates are already set, it means that the coordinate has been processed\n // during the initialization. There is not need to process it during update.\n if (coordinates)\n return node;\n const { type, transform = [] } = coordinate, options = __rest(coordinate, [\"type\", \"transform\"]);\n if (!type)\n return Object.assign(Object.assign({}, rest), { coordinates: transform });\n const [, createCoordinate] = (0, library_1.useLibrary)('coordinate', library);\n const { transform: isTransform = false } = createCoordinate(type).props || {};\n if (isTransform) {\n throw new Error(`Unknown coordinate: ${type}.`);\n }\n return Object.assign(Object.assign({}, rest), { coordinates: [Object.assign({ type }, options), ...transform] });\n}\nexports.coordinate2Transform = coordinate2Transform;\nfunction coordOf(coordinates, type) {\n return coordinates.filter((d) => d.type === type);\n}\nexports.coordOf = coordOf;\n/**\n * todo Duplication is not considered\n */\nfunction isPolar(coordinates) {\n return coordOf(coordinates, 'polar').length > 0;\n}\nexports.isPolar = isPolar;\nfunction isHelix(coordinates) {\n return coordOf(coordinates, 'helix').length > 0;\n}\nexports.isHelix = isHelix;\n/**\n * todo The number of transposes matters\n */\nfunction isTranspose(coordinates) {\n return coordOf(coordinates, 'transpose').length % 2 === 1;\n}\nexports.isTranspose = isTranspose;\nfunction isParallel(coordinates) {\n return coordOf(coordinates, 'parallel').length > 0;\n}\nexports.isParallel = isParallel;\nfunction isTheta(coordinates) {\n return coordOf(coordinates, 'theta').length > 0;\n}\nexports.isTheta = isTheta;\nfunction isReflect(coordinates) {\n return coordOf(coordinates, 'reflect').length > 0;\n}\nexports.isReflect = isReflect;\nfunction isRadial(coordinates) {\n return coordOf(coordinates, 'radial').length > 0;\n}\nexports.isRadial = isRadial;\nfunction isRadar(coordinates) {\n return coordOf(coordinates, 'radar').length > 0;\n}\nexports.isRadar = isRadar;\n/**\n * todo The axis corresponding to the Y reversal is not reversed\n */\nfunction isReflectY(coordinates) {\n return coordOf(coordinates, 'reflectY').length > 0;\n}\nexports.isReflectY = isReflectY;\nfunction inferCoordinate(coordinates) {\n if (coordinates.find((d) => d.type === 'cartesian' || d.type === 'cartesian3D'))\n return coordinates;\n return [...coordinates, { type: 'cartesian' }];\n}\n//# sourceMappingURL=coordinate.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.documentOf = exports.useLibrary = void 0;\nconst helper_1 = require(\"../utils/helper\");\nconst builtinlib_1 = require(\"../lib/builtinlib\");\nfunction useLibrary(namespace, publicLibrary) {\n const library = Object.assign(Object.assign({}, (0, builtinlib_1.builtinlib)()), publicLibrary);\n const create = (type) => {\n if (typeof type !== 'string')\n return type;\n const key = `${namespace}.${type}`;\n return library[key] || (0, helper_1.error)(`Unknown Component: ${key}`);\n };\n const use = (options, context) => {\n const { type } = options, rest = __rest(options, [\"type\"]);\n if (!type)\n (0, helper_1.error)(`Plot type is required!`);\n const currentLibrary = create(type);\n return currentLibrary === null || currentLibrary === void 0 ? void 0 : currentLibrary(rest, context);\n };\n return [use, create];\n}\nexports.useLibrary = useLibrary;\nfunction documentOf(library) {\n const { canvas, group } = library;\n return ((canvas === null || canvas === void 0 ? void 0 : canvas.document) ||\n (group === null || group === void 0 ? void 0 : group.ownerDocument) ||\n (0, helper_1.error)(`Cannot find library document`));\n}\nexports.documentOf = documentOf;\n//# sourceMappingURL=library.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.builtinlib = void 0;\nconst component_1 = require(\"../component\");\nconst composition_1 = require(\"../composition\");\nconst shape_1 = require(\"../shape\");\nconst event_1 = require(\"../interaction/event\");\n// Some private visual components, they are not public to\n// users, only for runtime.\nfunction builtinlib() {\n return {\n 'component.axisRadar': component_1.AxisRadar,\n 'component.axisLinear': component_1.AxisLinear,\n 'component.axisArc': component_1.AxisArc,\n 'component.legendContinuousBlock': component_1.LegendContinuousBlock,\n 'component.legendContinuousBlockSize': component_1.LegendContinuousBlockSize,\n 'component.legendContinuousSize': component_1.LegendContinuousSize,\n 'interaction.event': event_1.Event,\n 'composition.mark': composition_1.Mark,\n 'composition.view': composition_1.View,\n 'shape.label.label': shape_1.LabelShape,\n };\n}\nexports.builtinlib = builtinlib;\n//# sourceMappingURL=builtinlib.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GeoView = exports.GeoPath = exports.TimingKeyframe = exports.FacetCircle = exports.RepeatMatrix = exports.FacetRect = exports.Mark = exports.View = exports.SpaceFlex = exports.SpaceLayer = void 0;\nvar spaceLayer_1 = require(\"./spaceLayer\");\nObject.defineProperty(exports, \"SpaceLayer\", { enumerable: true, get: function () { return spaceLayer_1.SpaceLayer; } });\nvar spaceFlex_1 = require(\"./spaceFlex\");\nObject.defineProperty(exports, \"SpaceFlex\", { enumerable: true, get: function () { return spaceFlex_1.SpaceFlex; } });\nvar view_1 = require(\"./view\");\nObject.defineProperty(exports, \"View\", { enumerable: true, get: function () { return view_1.View; } });\nvar mark_1 = require(\"./mark\");\nObject.defineProperty(exports, \"Mark\", { enumerable: true, get: function () { return mark_1.Mark; } });\nvar facetRect_1 = require(\"./facetRect\");\nObject.defineProperty(exports, \"FacetRect\", { enumerable: true, get: function () { return facetRect_1.FacetRect; } });\nvar repeatMatrix_1 = require(\"./repeatMatrix\");\nObject.defineProperty(exports, \"RepeatMatrix\", { enumerable: true, get: function () { return repeatMatrix_1.RepeatMatrix; } });\nvar facetCircle_1 = require(\"./facetCircle\");\nObject.defineProperty(exports, \"FacetCircle\", { enumerable: true, get: function () { return facetCircle_1.FacetCircle; } });\nvar timingKeyframe_1 = require(\"./timingKeyframe\");\nObject.defineProperty(exports, \"TimingKeyframe\", { enumerable: true, get: function () { return timingKeyframe_1.TimingKeyframe; } });\nvar geoPath_1 = require(\"./geoPath\");\nObject.defineProperty(exports, \"GeoPath\", { enumerable: true, get: function () { return geoPath_1.GeoPath; } });\nvar geoView_1 = require(\"./geoView\");\nObject.defineProperty(exports, \"GeoView\", { enumerable: true, get: function () { return geoView_1.GeoView; } });\n//# sourceMappingURL=index.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SpaceLayer = void 0;\nconst utils_1 = require(\"./utils\");\n/**\n * @todo Propagate more options to children.\n */\nconst SpaceLayer = () => {\n return (options) => {\n const { children } = options;\n if (!Array.isArray(children))\n return [];\n const { x: viewX = 0, y: viewY = 0, width: viewWidth, height: viewHeight, data: layerData, } = options;\n return children.map((_a) => {\n var { data, x, y, width, height } = _a, rest = __rest(_a, [\"data\", \"x\", \"y\", \"width\", \"height\"]);\n return (Object.assign(Object.assign({}, rest), { data: (0, utils_1.mergeData)(data, layerData), x: x !== null && x !== void 0 ? x : viewX, y: y !== null && y !== void 0 ? y : viewY, width: width !== null && width !== void 0 ? width : viewWidth, height: height !== null && height !== void 0 ? height : viewHeight }));\n });\n };\n};\nexports.SpaceLayer = SpaceLayer;\nexports.SpaceLayer.props = {};\n//# sourceMappingURL=spaceLayer.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.mergeData = exports.isObject = exports.useOverrideAdaptor = exports.useDefaultAdaptor = void 0;\nconst util_1 = require(\"@antv/util\");\n/**\n * Adaptor return default options for raw options.\n */\nfunction useDefaultAdaptor(adaptor) {\n return (options, ...rest) => (0, util_1.deepMix)({}, adaptor(options, ...rest), options);\n}\nexports.useDefaultAdaptor = useDefaultAdaptor;\n/**\n * Adaptor return options override raw options.\n */\nfunction useOverrideAdaptor(adaptor) {\n return (options, ...rest) => (0, util_1.deepMix)({}, options, adaptor(options, ...rest));\n}\nexports.useOverrideAdaptor = useOverrideAdaptor;\nfunction isObject(d) {\n if (d instanceof Date)\n return false;\n return typeof d === 'object';\n}\nexports.isObject = isObject;\nfunction mergeData(dataDescriptor, dataValue) {\n if (!dataDescriptor)\n return dataValue;\n if (Array.isArray(dataDescriptor))\n return dataDescriptor;\n if (isObject(dataDescriptor)) {\n const { value = dataValue } = dataDescriptor, rest = __rest(dataDescriptor, [\"value\"]);\n return Object.assign(Object.assign({}, rest), { value });\n }\n return dataDescriptor;\n}\nexports.mergeData = mergeData;\n//# sourceMappingURL=utils.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SpaceFlex = void 0;\nconst utils_1 = require(\"./utils\");\n/**\n * @todo Propagate more options to children.\n */\nconst SpaceFlex = () => {\n return (options) => {\n const { children } = options;\n if (!Array.isArray(children))\n return [];\n const { direction = 'row', ratio = children.map(() => 1), padding = 0, data: flexData, } = options;\n const [mainStart, mainSize, crossSize, crossStart] = direction === 'col'\n ? ['y', 'height', 'width', 'x']\n : ['x', 'width', 'height', 'y'];\n const sum = ratio.reduce((total, value) => total + value);\n const totalSize = options[mainSize] - padding * (children.length - 1);\n const sizes = ratio.map((value) => totalSize * (value / sum));\n const newChildren = [];\n let next = options[mainStart] || 0;\n for (let i = 0; i < sizes.length; i += 1) {\n const _a = children[i], { data } = _a, rest = __rest(_a, [\"data\"]);\n const newData = (0, utils_1.mergeData)(data, flexData);\n newChildren.push(Object.assign({ [mainStart]: next, [mainSize]: sizes[i], [crossStart]: options[crossStart] || 0, [crossSize]: options[crossSize], data: newData }, rest));\n next += sizes[i] + padding;\n }\n return newChildren;\n };\n};\nexports.SpaceFlex = SpaceFlex;\nexports.SpaceFlex.props = {};\n//# sourceMappingURL=spaceFlex.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.View = void 0;\nconst util_1 = require(\"@antv/util\");\nconst utils_1 = require(\"./utils\");\n/**\n * @todo Propagate more options to children.(e.g. filter)\n * @todo Propagate encode options to children. This is useful for Matrix composition.\n * @todo Move this to runtime, do not treat it as a composition to cause confusion.\n */\nconst View = () => {\n return (options) => {\n const { children } = options, restOptions = __rest(options, [\"children\"]);\n if (!Array.isArray(children))\n return [];\n const { data: viewData, scale: viewScale = {}, axis: viewAxis = {}, legend: viewLegend = {}, encode: viewEncode = {}, transform: viewTransform = [] } = restOptions, rest = __rest(restOptions, [\"data\", \"scale\", \"axis\", \"legend\", \"encode\", \"transform\"]);\n const marks = children.map((_a) => {\n var { data, scale = {}, axis = {}, legend = {}, encode = {}, transform = [] } = _a, rest = __rest(_a, [\"data\", \"scale\", \"axis\", \"legend\", \"encode\", \"transform\"]);\n return (Object.assign({ data: (0, utils_1.mergeData)(data, viewData), scale: (0, util_1.deepMix)({}, viewScale, scale), encode: (0, util_1.deepMix)({}, viewEncode, encode), transform: [...viewTransform, ...transform], axis: axis && viewAxis ? (0, util_1.deepMix)({}, viewAxis, axis) : false, legend: legend && viewLegend ? (0, util_1.deepMix)({}, viewLegend, legend) : false }, rest));\n });\n return [Object.assign(Object.assign({}, rest), { marks, type: 'standardView' })];\n };\n};\nexports.View = View;\nexports.View.props = {};\n//# sourceMappingURL=view.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Mark = void 0;\n// @todo Move this to runtime.\nconst Mark = ({ static: isStatic = false, } = {}) => {\n return (options) => {\n const { width, height, depth, paddingLeft, paddingRight, paddingTop, paddingBottom, padding, inset, insetLeft, insetTop, insetRight, insetBottom, margin, marginLeft, marginBottom, marginTop, marginRight, data, coordinate, theme, component, interaction, x, y, z, key, frame, labelTransform, parentKey, clip, viewStyle, title } = options, mark = __rest(options, [\"width\", \"height\", \"depth\", \"paddingLeft\", \"paddingRight\", \"paddingTop\", \"paddingBottom\", \"padding\", \"inset\", \"insetLeft\", \"insetTop\", \"insetRight\", \"insetBottom\", \"margin\", \"marginLeft\", \"marginBottom\", \"marginTop\", \"marginRight\", \"data\", \"coordinate\", \"theme\", \"component\", \"interaction\", \"x\", \"y\", \"z\", \"key\", \"frame\", \"labelTransform\", \"parentKey\", \"clip\", \"viewStyle\", \"title\"]);\n return [\n Object.assign(Object.assign({ type: 'standardView', x,\n y,\n z,\n key,\n width,\n height,\n depth,\n padding,\n paddingLeft,\n paddingRight,\n paddingTop,\n inset,\n insetLeft,\n insetTop,\n insetRight,\n insetBottom,\n paddingBottom,\n theme,\n coordinate,\n component,\n interaction,\n frame,\n labelTransform,\n margin,\n marginLeft,\n marginBottom,\n marginTop,\n marginRight,\n parentKey,\n clip, style: viewStyle }, (!isStatic && { title })), { marks: [Object.assign(Object.assign(Object.assign({}, mark), { key: `${key}-0`, data }), (isStatic && { title }))] }),\n ];\n };\n};\nexports.Mark = Mark;\nexports.Mark.props = {};\n//# sourceMappingURL=mark.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FacetRect = exports.createInnerGuide = exports.setChildren = exports.setData = exports.toCell = exports.setStyle = exports.setAnimation = exports.inferColor = void 0;\nconst util_1 = require(\"@antv/util\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst vector_1 = require(\"../utils/vector\");\nconst container_1 = require(\"../utils/container\");\nconst array_1 = require(\"../utils/array\");\nconst utils_1 = require(\"./utils\");\nconst setScale = (0, utils_1.useDefaultAdaptor)((options) => {\n const { encode, data, scale, shareSize = false } = options;\n const { x, y } = encode;\n const flexDomain = (encode, channel) => {\n var _a;\n if (encode === undefined || !shareSize)\n return {};\n const groups = (0, d3_array_1.group)(data, (d) => d[encode]);\n const domain = ((_a = scale === null || scale === void 0 ? void 0 : scale[channel]) === null || _a === void 0 ? void 0 : _a.domain) || Array.from(groups.keys());\n const flex = domain.map((key) => {\n if (!groups.has(key))\n return 1;\n return groups.get(key).length;\n });\n return { domain, flex };\n };\n return {\n scale: {\n x: Object.assign(Object.assign({ paddingOuter: 0, paddingInner: 0.1, guide: x === undefined ? null : { position: 'top' } }, (x === undefined && { paddingInner: 0 })), flexDomain(x, 'x')),\n y: Object.assign(Object.assign({ range: [0, 1], paddingOuter: 0, paddingInner: 0.1, guide: y === undefined ? null : { position: 'right' } }, (y === undefined && { paddingInner: 0 })), flexDomain(y, 'y')),\n },\n };\n});\n/**\n * BFS view tree and using the last discovered color encode\n * as the top-level encode for this plot. This is useful when\n * color encode and color scale is specified in mark node.\n * It makes sense because the whole facet should shared the same\n * color encoding, but it also can be override with explicity\n * encode and scale specification.\n */\nexports.inferColor = (0, utils_1.useOverrideAdaptor)((options) => {\n const { data, scale, legend } = options;\n const discovered = [options];\n let encodeColor;\n let scaleColor;\n let legendColor;\n while (discovered.length) {\n const node = discovered.shift();\n const { children, encode = {}, scale = {}, legend = {} } = node;\n const { color: c } = encode;\n const { color: cs } = scale;\n const { color: cl } = legend;\n if (c !== undefined)\n encodeColor = c;\n if (cs !== undefined)\n scaleColor = cs;\n if (cl !== undefined)\n legendColor = cl;\n if (Array.isArray(children)) {\n discovered.push(...children);\n }\n }\n const domainColor = () => {\n var _a;\n const domain = (_a = scale === null || scale === void 0 ? void 0 : scale.color) === null || _a === void 0 ? void 0 : _a.domain;\n if (domain !== undefined)\n return [domain];\n if (encodeColor === undefined)\n return [undefined];\n const color = typeof encodeColor === 'function' ? encodeColor : (d) => d[encodeColor];\n const values = data.map(color);\n if (values.some((d) => typeof d === 'number'))\n return [(0, d3_array_1.extent)(values)];\n return [Array.from(new Set(values)), 'ordinal'];\n };\n const title = typeof encodeColor === 'string' ? encodeColor : '';\n const [domain, type] = domainColor();\n return Object.assign({ encode: { color: { type: 'column', value: domain !== null && domain !== void 0 ? domain : [] } }, scale: { color: (0, util_1.deepMix)({}, scaleColor, { domain, type }) } }, (legend === undefined && {\n legend: { color: (0, util_1.deepMix)({ title }, legendColor) },\n }));\n});\nexports.setAnimation = (0, utils_1.useDefaultAdaptor)(() => ({\n animate: {\n enterType: 'fadeIn',\n },\n}));\nexports.setStyle = (0, utils_1.useOverrideAdaptor)(() => ({\n frame: false,\n encode: {\n shape: 'hollow',\n },\n style: {\n lineWidth: 0,\n },\n}));\nexports.toCell = (0, utils_1.useOverrideAdaptor)(() => ({\n type: 'cell',\n}));\n/**\n * Do not set cell data directly, the children will get wrong do if do\n * so. Use transform to set new data.\n **/\nexports.setData = (0, utils_1.useOverrideAdaptor)((options) => {\n const { data } = options;\n const connector = {\n type: 'custom',\n callback: () => {\n const { data, encode } = options;\n const { x, y } = encode;\n const X = x ? Array.from(new Set(data.map((d) => d[x]))) : [];\n const Y = y ? Array.from(new Set(data.map((d) => d[y]))) : [];\n const cellData = () => {\n if (X.length && Y.length) {\n const cellData = [];\n for (const vx of X) {\n for (const vy of Y) {\n cellData.push({ [x]: vx, [y]: vy });\n }\n }\n return cellData;\n }\n if (X.length)\n return X.map((d) => ({ [x]: d }));\n if (Y.length)\n return Y.map((d) => ({ [y]: d }));\n };\n return cellData();\n },\n };\n return {\n data: { type: 'inline', value: data, transform: [connector] },\n };\n});\n/**\n * @todo Move some options assignment to runtime.\n */\nexports.setChildren = (0, utils_1.useOverrideAdaptor)((options, subLayout = subLayoutRect, createGuideX = createGuideXRect, createGuideY = createGuideYRect, childOptions = {}) => {\n const { data: dataValue, encode, children, scale: facetScale, x: originX = 0, y: originY = 0, shareData = false, key: viewKey, } = options;\n const { value: data } = dataValue;\n // Only support field encode now.\n const { x: encodeX, y: encodeY } = encode;\n const { color: facetScaleColor } = facetScale;\n const { domain: facetDomainColor } = facetScaleColor;\n const createChildren = (visualData, scale, layout) => {\n const { x: scaleX, y: scaleY } = scale;\n const { paddingLeft, paddingTop, marginLeft, marginTop } = layout;\n const { domain: domainX } = scaleX.getOptions();\n const { domain: domainY } = scaleY.getOptions();\n const index = (0, array_1.indexOf)(visualData);\n const bboxs = visualData.map(subLayout);\n const values = visualData.map(({ x, y }) => [\n scaleX.invert(x),\n scaleY.invert(y),\n ]);\n const filters = values.map(([fx, fy]) => (d) => {\n const { [encodeX]: x, [encodeY]: y } = d;\n const inX = encodeX !== undefined ? x === fx : true;\n const inY = encodeY !== undefined ? y === fy : true;\n return inX && inY;\n });\n const facetData2d = filters.map((f) => data.filter(f));\n const maxDataDomain = shareData\n ? (0, d3_array_1.max)(facetData2d, (data) => data.length)\n : undefined;\n const facets = values.map(([fx, fy]) => ({\n columnField: encodeX,\n columnIndex: domainX.indexOf(fx),\n columnValue: fx,\n columnValuesLength: domainX.length,\n rowField: encodeY,\n rowIndex: domainY.indexOf(fy),\n rowValue: fy,\n rowValuesLength: domainY.length,\n }));\n const normalizedChildren = facets.map((facet) => {\n if (Array.isArray(children))\n return children;\n return [children(facet)].flat(1);\n });\n return index.flatMap((i) => {\n const [left, top, width, height] = bboxs[i];\n const facet = facets[i];\n const facetData = facetData2d[i];\n const children = normalizedChildren[i];\n return children.map((_a) => {\n var _b, _c;\n var { scale, key, facet: isFacet = true, axis = {}, legend = {} } = _a, rest = __rest(_a, [\"scale\", \"key\", \"facet\", \"axis\", \"legend\"]);\n const guideY = ((_b = scale === null || scale === void 0 ? void 0 : scale.y) === null || _b === void 0 ? void 0 : _b.guide) || axis.y;\n const guideX = ((_c = scale === null || scale === void 0 ? void 0 : scale.x) === null || _c === void 0 ? void 0 : _c.guide) || axis.x;\n const defaultScale = {\n x: { tickCount: encodeX ? 5 : undefined },\n y: { tickCount: encodeY ? 5 : undefined },\n };\n const newData = isFacet\n ? facetData\n : facetData.length === 0\n ? []\n : data;\n const newScale = {\n color: { domain: facetDomainColor },\n };\n const newAxis = {\n x: createGuide(guideX, createGuideX)(facet, newData),\n y: createGuide(guideY, createGuideY)(facet, newData),\n };\n return Object.assign(Object.assign({ key: `${key}-${i}`, data: newData, margin: 0, x: left + paddingLeft + originX + marginLeft, y: top + paddingTop + originY + marginTop, parentKey: viewKey, width,\n height, paddingLeft: 0, paddingRight: 0, paddingTop: 0, paddingBottom: 0, frame: newData.length ? true : false, dataDomain: maxDataDomain, scale: (0, util_1.deepMix)(defaultScale, scale, newScale), axis: (0, util_1.deepMix)({}, axis, newAxis), \n // Hide all legends for child mark by default,\n // they are displayed in the top-level.\n legend: false }, rest), childOptions);\n });\n });\n };\n return {\n children: createChildren,\n };\n});\nfunction subLayoutRect(data) {\n const { points } = data;\n return (0, vector_1.calcBBox)(points);\n}\n/**\n * Inner guide not show title, tickLine, label and subTickLine,\n * if data is empty, do not show guide.\n */\nfunction createInnerGuide(guide, data) {\n return data.length\n ? (0, util_1.deepMix)({\n title: false,\n tick: null,\n label: null,\n }, guide)\n : (0, util_1.deepMix)({\n title: false,\n tick: null,\n label: null,\n grid: null,\n }, guide);\n}\nexports.createInnerGuide = createInnerGuide;\nfunction createGuideXRect(guide) {\n return (facet, data) => {\n const { rowIndex, rowValuesLength, columnIndex, columnValuesLength } = facet;\n // Only the bottom-most facet show axisX.\n if (rowIndex !== rowValuesLength - 1)\n return createInnerGuide(guide, data);\n // Only the bottom-left facet show title.\n const title = columnIndex !== columnValuesLength - 1 ? false : undefined;\n // If data is empty, do not show cell.\n const grid = data.length ? undefined : null;\n return (0, util_1.deepMix)({ title, grid }, guide);\n };\n}\nfunction createGuideYRect(guide) {\n return (facet, data) => {\n const { rowIndex, columnIndex } = facet;\n // Only the left-most facet show axisY.\n if (columnIndex !== 0)\n return createInnerGuide(guide, data);\n // Only the left-top facet show title.\n const title = rowIndex !== 0 ? false : undefined;\n // If data is empty, do not show cell.\n const grid = data.length ? undefined : null;\n return (0, util_1.deepMix)({ title, grid }, guide);\n };\n}\nfunction createGuide(guide, factory) {\n if (typeof guide === 'function')\n return guide;\n if (guide === null || guide === false)\n return () => null;\n return factory(guide);\n}\nconst FacetRect = () => {\n return (options) => {\n const newOptions = container_1.Container.of(options)\n .call(exports.toCell)\n .call(exports.inferColor)\n .call(exports.setAnimation)\n .call(setScale)\n .call(exports.setStyle)\n .call(exports.setData)\n .call(exports.setChildren)\n .value();\n return [newOptions];\n };\n};\nexports.FacetRect = FacetRect;\nexports.FacetRect.props = {};\n//# sourceMappingURL=facetRect.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Container = void 0;\nclass Container {\n constructor(x) {\n this.$value = x;\n }\n static of(x) {\n return new Container(x);\n }\n call(f, ...rest) {\n return (this.$value = f(this.$value, ...rest)), this;\n }\n value() {\n return this.$value;\n }\n}\nexports.Container = Container;\n//# sourceMappingURL=container.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RepeatMatrix = void 0;\nconst util_1 = require(\"@antv/util\");\nconst container_1 = require(\"../utils/container\");\nconst vector_1 = require(\"../utils/vector\");\nconst array_1 = require(\"../utils/array\");\nconst facetRect_1 = require(\"./facetRect\");\nconst utils_1 = require(\"./utils\");\nconst setScale = (0, utils_1.useDefaultAdaptor)((options) => {\n return {\n scale: {\n x: { guide: null, paddingOuter: 0, paddingInner: 0.1 },\n y: { guide: null, range: [0, 1], paddingOuter: 0, paddingInner: 0.1 },\n },\n };\n});\nconst setChildren = (0, utils_1.useOverrideAdaptor)((options) => {\n const { data, children, x: originX = 0, y: originY = 0, key: viewKey, } = options;\n const createChildren = (visualData, scale, layout) => {\n const { x: scaleX, y: scaleY } = scale;\n const { paddingLeft, paddingTop, marginLeft, marginTop } = layout;\n const { domain: domainX } = scaleX.getOptions();\n const { domain: domainY } = scaleY.getOptions();\n const index = (0, array_1.indexOf)(visualData);\n const bboxs = visualData.map(({ points }) => (0, vector_1.calcBBox)(points));\n const values = visualData.map(({ x, y }) => [\n scaleX.invert(x),\n scaleY.invert(y),\n ]);\n const facets = values.map(([fx, fy]) => ({\n columnField: fx,\n columnIndex: domainX.indexOf(fx),\n columnValue: fx,\n columnValuesLength: domainX.length,\n rowField: fy,\n rowIndex: domainY.indexOf(fy),\n rowValue: fy,\n rowValuesLength: domainY.length,\n }));\n const normalizedChildren = facets.map((facet) => {\n if (Array.isArray(children))\n return children;\n return [children(facet)].flat(1);\n });\n return index.flatMap((i) => {\n const [left, top, width, height] = bboxs[i];\n const [fx, fy] = values[i];\n const facet = facets[i];\n const children = normalizedChildren[i];\n return children.map((d) => {\n var _a, _b;\n const { scale, key, encode, axis, interaction } = d, rest = __rest(d, [\"scale\", \"key\", \"encode\", \"axis\", \"interaction\"]);\n const guideY = (_a = scale === null || scale === void 0 ? void 0 : scale.y) === null || _a === void 0 ? void 0 : _a.guide;\n const guideX = (_b = scale === null || scale === void 0 ? void 0 : scale.x) === null || _b === void 0 ? void 0 : _b.guide;\n const defaultScale = {\n // Do not sync position scales among facets by default.\n x: { facet: false },\n // Do not sync position scales among facets by default.\n y: { facet: false },\n };\n const newAxis = {\n x: createGuideX(guideX)(facet, data),\n y: createGuideY(guideY)(facet, data),\n };\n const defaultAxis = {\n x: { tickCount: 5 },\n y: { tickCount: 5 },\n };\n return Object.assign({ data, parentKey: viewKey, key: `${key}-${i}`, x: left + paddingLeft + originX + marginLeft, y: top + paddingTop + originY + marginTop, width,\n height, margin: 0, paddingLeft: 0, paddingRight: 0, paddingTop: 0, paddingBottom: 0, frame: true, scale: (0, util_1.deepMix)(defaultScale, scale), axis: (0, util_1.deepMix)(defaultAxis, axis, newAxis), \n // Hide all legends for child mark by default,\n // they are displayed in the top-level.\n legend: false, encode: (0, util_1.deepMix)({}, encode, {\n x: fx,\n y: fy,\n }), interaction: (0, util_1.deepMix)({}, interaction, {\n // Register this interaction in parent node.\n legendFilter: false,\n }) }, rest);\n });\n });\n };\n return {\n children: createChildren,\n };\n});\n/**\n * @todo Use transform instead of override data directly.\n */\nconst setData = (0, utils_1.useOverrideAdaptor)((options) => {\n const { encode } = options, rest = __rest(options, [\"encode\"]);\n const { position: P = [], x: X = P, y: Y = [...P].reverse() } = encode, restEncode = __rest(encode, [\"position\", \"x\", \"y\"]);\n const data = [];\n for (const $x of [X].flat(1)) {\n for (const $y of [Y].flat(1)) {\n data.push({ $x, $y });\n }\n }\n return Object.assign(Object.assign({}, rest), { data, encode: Object.assign(Object.assign({}, restEncode), { x: '$x', y: '$y' }), scale: Object.assign(Object.assign({}, ([X].flat(1).length === 1 && { x: { paddingInner: 0 } })), ([Y].flat(1).length === 1 && { y: { paddingInner: 0 } })) });\n});\nfunction createGuideX(guideX) {\n if (typeof guideX === 'function')\n return guideX;\n if (guideX === null)\n return () => null;\n return (facet, data) => {\n const { rowIndex, rowValuesLength } = facet;\n // Only the bottom-most facet show axisX.\n if (rowIndex !== rowValuesLength - 1)\n return (0, facetRect_1.createInnerGuide)(guideX, data);\n };\n}\nfunction createGuideY(guideY) {\n if (typeof guideY === 'function')\n return guideY;\n if (guideY === null)\n return () => null;\n return (facet, data) => {\n const { columnIndex } = facet;\n // Only the left-most facet show axisY.\n if (columnIndex !== 0)\n return (0, facetRect_1.createInnerGuide)(guideY, data);\n };\n}\n/**\n * @todo Layout mode: layer, row, col...\n * @todo Specify show axis or not.\n */\nconst RepeatMatrix = () => {\n return (options) => {\n const newOptions = container_1.Container.of(options)\n .call(facetRect_1.toCell)\n .call(facetRect_1.inferColor)\n .call(setChildren)\n .call(setData)\n .call(facetRect_1.setAnimation)\n .call(facetRect_1.setStyle)\n .call(setScale)\n .value();\n return [newOptions];\n };\n};\nexports.RepeatMatrix = RepeatMatrix;\n//# sourceMappingURL=repeatMatrix.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FacetCircle = void 0;\nconst container_1 = require(\"../utils/container\");\nconst vector_1 = require(\"../utils/vector\");\nconst facetRect_1 = require(\"./facetRect\");\nconst utils_1 = require(\"./utils\");\nconst setScale = (0, utils_1.useDefaultAdaptor)((options) => {\n return {\n scale: {\n x: { guide: { type: 'axisArc' }, paddingOuter: 0, paddingInner: 0.1 },\n y: { guide: null, range: [0, 1], paddingOuter: 0, paddingInner: 0.1 },\n },\n };\n});\nconst setCoordinate = (0, utils_1.useDefaultAdaptor)((options) => {\n return {\n coordinate: { type: 'polar' },\n };\n});\nconst setEncode = (options) => {\n const { encode } = options, rest = __rest(options, [\"encode\"]);\n const { position } = encode;\n return Object.assign(Object.assign({}, rest), { encode: { x: position } });\n};\n/**\n * Every facet should do not show both axisX and axisY by default.\n */\nfunction createGuideFacetCircle(guide) {\n return (facet) => null;\n}\n/**\n * Use the inscribed circle of the sector as the\n * circumscribed circle of the new bbox.\n */\nfunction subLayoutFacetCircle(data) {\n const { points } = data;\n const [p0, p1, p2, p3] = points;\n const sr = (0, vector_1.dist)(p0, p3); // radius of sector\n const v0 = (0, vector_1.sub)(p0, p3);\n const v1 = (0, vector_1.sub)(p1, p2);\n const a01 = (0, vector_1.angleBetween)(v0, v1);\n // sr = ir + ir / sin(theta/2)\n const t = 1 / Math.sin(a01 / 2);\n const ir = sr / (1 + t); // radius of inscribed circle\n const s = ir * Math.sqrt(2); // size of the bbox.\n // This assume the innerRadius of polar is 0.\n // @todo Compute the right origin if it's not 0,\n // or maybe pass the coordinates to get the right center.\n const [x0, y0] = p2;\n const a0 = (0, vector_1.angleWithQuadrant)(v0);\n const a3 = a0 + a01 / 2;\n const d = ir * t;\n const cx = x0 + d * Math.sin(a3); // center x of inscribed circle\n const cy = y0 - d * Math.cos(a3); // center y of inscribed circle\n return [cx - s / 2, cy - s / 2, s, s];\n}\n/**\n * @todo Pack.\n */\nconst FacetCircle = () => {\n return (options) => {\n const newOptions = container_1.Container.of(options)\n .call(facetRect_1.toCell)\n .call(setEncode)\n .call(facetRect_1.inferColor)\n .call(setCoordinate)\n .call(facetRect_1.setData)\n .call(facetRect_1.setChildren, subLayoutFacetCircle, createGuideFacetCircle, createGuideFacetCircle, { frame: false })\n .call(facetRect_1.setAnimation)\n .call(facetRect_1.setStyle)\n .call(setScale)\n .value();\n return [newOptions];\n };\n};\nexports.FacetCircle = FacetCircle;\n//# sourceMappingURL=facetCircle.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TimingKeyframe = void 0;\nconst util_1 = require(\"@antv/util\");\nfunction range(direction, iterationCount, keyframeCount) {\n const start = 0;\n const end = keyframeCount;\n const normal = [start, end];\n const reverse = [-end + 1, -start + 1];\n if (direction === 'normal')\n return normal;\n if (direction === 'reverse')\n return reverse;\n if (direction === 'alternate') {\n return iterationCount % 2 === 0 ? normal : reverse;\n }\n if (direction === 'reverse-alternate') {\n return iterationCount % 2 === 0 ? reverse : normal;\n }\n}\n/**\n * Set animation options for all descendants.\n */\nfunction setAnimation(node, duration, easing) {\n const discovered = [node];\n while (discovered.length) {\n const n = discovered.pop();\n n.animate = (0, util_1.deepMix)({\n enter: {\n duration,\n },\n update: {\n duration,\n easing,\n type: 'morphing',\n fill: 'both',\n },\n exit: {\n type: 'fadeOut',\n duration,\n },\n }, n.animate || {});\n const { children } = n;\n if (Array.isArray(children))\n discovered.push(...children);\n }\n return node;\n}\n/**\n * @todo More options, such as fill, totalDuration...\n */\nconst TimingKeyframe = () => {\n return (options) => {\n const { children = [], duration = 1000, iterationCount = 1, direction = 'normal', easing = 'ease-in-out-sine', } = options;\n const n = children.length;\n if (!Array.isArray(children) || n === 0)\n return [];\n const { key } = children[0];\n const newChildren = children\n .map((d) => (Object.assign(Object.assign({}, d), { key })))\n .map((d) => setAnimation(d, duration, easing));\n return function* () {\n let count = 0;\n let prevIndex;\n while (iterationCount === 'infinite' || count < iterationCount) {\n const [start, end] = range(direction, count, n);\n for (let i = start; i < end; i += 1) {\n // For reverse direction, the range is from negative to negative\n // so the absolute value of i is the real index for newChildren.\n const index = Math.abs(i);\n // This is for preventing alternate or reverse-alternate keyframe\n // to yield two same node one by one when the direction change.\n if (prevIndex !== index)\n yield newChildren[index];\n prevIndex = index;\n }\n count++;\n }\n };\n };\n};\nexports.TimingKeyframe = TimingKeyframe;\nexports.TimingKeyframe.props = {};\n//# sourceMappingURL=timingKeyframe.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GeoPath = void 0;\n/**\n * Wrap GeoPath by a GeoView.\n */\nconst GeoPath = () => {\n return (options) => {\n const { type, data, scale, encode, style, animate, key, state } = options, rest = __rest(options, [\"type\", \"data\", \"scale\", \"encode\", \"style\", \"animate\", \"key\", \"state\"]);\n return [\n Object.assign(Object.assign({ type: 'geoView' }, rest), { children: [\n {\n type: 'geoPath',\n key: `${key}-0`,\n data: {\n value: data,\n },\n scale,\n encode,\n style,\n animate,\n state,\n },\n ] }),\n ];\n };\n};\nexports.GeoPath = GeoPath;\nexports.GeoPath.props = {};\n//# sourceMappingURL=geoPath.js.map","\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GeoView = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst util_1 = require(\"@antv/util\");\nconst d3_geo_1 = require(\"@antv/vendor/d3-geo\");\nconst mark_1 = require(\"../utils/mark\");\nconst d3Projection = __importStar(require(\"./d3Projection\"));\n/**\n * Get projection factory from d3-projection.\n */\nfunction normalizeProjection(type) {\n if (typeof type === 'function')\n return type;\n const name = `geo${(0, util_1.upperFirst)(type)}`;\n const projection = d3Projection[name];\n if (!projection)\n throw new Error(`Unknown coordinate: ${type}`);\n return projection;\n}\n/**\n * @see https://github.com/mapbox/geojson-merge/blob/master/index.js\n */\nfunction mergeGeoJSON(gjs) {\n return {\n type: 'FeatureCollection',\n features: gjs.flatMap((gj) => normalizeGeoJSON(gj).features),\n };\n}\nfunction normalizeGeoJSON(gj) {\n const types = {\n Point: 'geometry',\n MultiPoint: 'geometry',\n LineString: 'geometry',\n MultiLineString: 'geometry',\n Polygon: 'geometry',\n MultiPolygon: 'geometry',\n GeometryCollection: 'geometry',\n Feature: 'feature',\n FeatureCollection: 'featureCollection',\n };\n if (!gj || !gj.type)\n return null;\n const type = types[gj.type];\n if (!type)\n return null;\n if (type === 'geometry') {\n return {\n type: 'FeatureCollection',\n features: [\n {\n type: 'Feature',\n properties: {},\n geometry: gj,\n },\n ],\n };\n }\n else if (type === 'feature') {\n return {\n type: 'FeatureCollection',\n features: [gj],\n };\n }\n else if (type === 'featureCollection') {\n return gj;\n }\n}\n/**\n * Specify the options for d3 projection\n * @see https://github.com/d3/d3-geo#projections\n * @todo Specify key each by each.\n */\nfunction setProjectionOptions(projection, options) {\n var _a;\n for (const [key, value] of Object.entries(options)) {\n (_a = projection[key]) === null || _a === void 0 ? void 0 : _a.call(projection, value);\n }\n}\nfunction setProjectionSize(projection, nodes, layout, options) {\n const defaultOutline = () => {\n const geoNodes = nodes.filter(isGeoPath);\n // For geoPath with sphere mark, use it as outline.\n const sphere = geoNodes.find((d) => d.sphere);\n if (sphere)\n return { type: 'Sphere' };\n // Merge all GeoJSON as the outline.\n return mergeGeoJSON(geoNodes.filter((d) => !d.sphere).flatMap((d) => d.data.value));\n };\n const { outline = defaultOutline() } = options;\n const { size = 'fitExtent' } = options;\n if (size === 'fitExtent') {\n return setFitExtent(projection, outline, layout);\n }\n else if (size === 'fitWidth') {\n return setFitWidth(projection, outline, layout);\n }\n}\nfunction setFitExtent(projection, object, layout) {\n const { x, y, width, height } = layout;\n projection.fitExtent([\n [x, y],\n [width, height],\n ], object);\n}\nfunction setFitWidth(projection, object, layout) {\n const { width, height } = layout;\n const [[x0, y0], [x1, y1]] = (0, d3_geo_1.geoPath)(projection.fitWidth(width, object)).bounds(object);\n const dy = Math.ceil(y1 - y0);\n const l = Math.min(Math.ceil(x1 - x0), dy);\n const s = (projection.scale() * (l - 1)) / l;\n const [tx, ty] = projection.translate();\n const t = ty + (height - dy) / 2;\n projection.scale(s).translate([tx, t]).precision(0.2);\n}\n/**\n * @todo Remove this.\n */\nfunction normalizeDataSource(node) {\n const { data } = node;\n if (Array.isArray(data))\n return Object.assign(Object.assign({}, node), { data: { value: data } });\n const { type } = data;\n if (type === 'graticule10') {\n return Object.assign(Object.assign({}, node), { data: { value: [(0, d3_geo_1.geoGraticule10)()] } });\n }\n else if (type === 'sphere') {\n // Sphere is not a standard type of GeoJSON.\n // Mark this geoPath as sphere geoPath.\n return Object.assign(Object.assign({}, node), { sphere: true, data: { value: [{ type: 'Sphere' }] } });\n }\n return node;\n}\nfunction isGeoPath(d) {\n return d.type === 'geoPath';\n}\n/**\n * A view with geo coordinate.\n */\nconst GeoView = () => {\n return (options) => {\n const { children, coordinate: projection = {} } = options;\n if (!Array.isArray(children))\n return [];\n // Get projection factory.\n const { type = 'equalEarth' } = projection, projectionOptions = __rest(projection, [\"type\"]);\n const createProjection = normalizeProjection(type);\n const nodes = children.map(normalizeDataSource);\n // Set path generator lazily.\n let path;\n // A custom geo coordinate.\n function Geo() {\n return [\n [\n 'custom',\n (x, y, width, height) => {\n // Create and set projection.\n const visual = createProjection();\n const layout = { x, y, width, height };\n setProjectionSize(visual, nodes, layout, projectionOptions);\n setProjectionOptions(visual, projectionOptions);\n // Create path generator.\n path = (0, d3_geo_1.geoPath)(visual);\n // Normalize projection and projection.invert,\n // which normalize projected points.\n const scaleX = new scale_1.Linear({\n domain: [x, x + width],\n });\n const scaleY = new scale_1.Linear({\n domain: [y, y + height],\n });\n const normalize = (point) => {\n const visualPoint = visual(point);\n if (!visualPoint)\n return [null, null];\n const [vx, vy] = visualPoint;\n return [scaleX.map(vx), scaleY.map(vy)];\n };\n const normalizeInvert = (point) => {\n if (!point)\n return null;\n const [px, py] = point;\n const visualPoint = [scaleX.invert(px), scaleY.invert(py)];\n return visual.invert(visualPoint);\n };\n return {\n transform: (point) => normalize(point),\n untransform: (point) => normalizeInvert(point),\n };\n },\n ],\n ];\n }\n function GeoPath(options) {\n const { style, tooltip = {} } = options;\n return Object.assign(Object.assign({}, options), { type: 'path', tooltip: (0, mark_1.maybeTooltip)(tooltip, {\n title: 'id',\n items: [{ channel: 'color' }],\n }), style: Object.assign(Object.assign({}, style), { d: (d) => path(d) || [] }) });\n }\n const t = (d) => (isGeoPath(d) ? GeoPath(d) : d);\n return [\n Object.assign(Object.assign({}, options), { type: 'view', scale: {\n x: { type: 'identity' },\n y: { type: 'identity' },\n }, axis: false, coordinate: { type: Geo }, children: nodes.flatMap(t) }),\n ];\n };\n};\nexports.GeoView = GeoView;\nexports.GeoView.props = {};\n//# sourceMappingURL=geoView.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.geoTransverseMercatorRaw = exports.geoTransverseMercator = exports.geoStereographicRaw = exports.geoStereographic = exports.geoOrthographicRaw = exports.geoOrthographic = exports.geoNaturalEarth1Raw = exports.geoNaturalEarth1 = exports.geoMercatorRaw = exports.geoMercator = exports.geoProjectionMutator = exports.geoProjection = exports.geoIdentity = exports.geoGnomonicRaw = exports.geoGnomonic = exports.geoEquirectangularRaw = exports.geoEquirectangular = exports.geoEqualEarthRaw = exports.geoEqualEarth = exports.geoConicEquidistantRaw = exports.geoConicEquidistant = exports.geoConicEqualAreaRaw = exports.geoConicEqualArea = exports.geoConicConformalRaw = exports.geoConicConformal = exports.geoAzimuthalEquidistantRaw = exports.geoAzimuthalEquidistant = exports.geoAzimuthalEqualAreaRaw = exports.geoAzimuthalEqualArea = exports.geoAlbers = exports.geoAlbersUsa = void 0;\nvar d3_geo_1 = require(\"@antv/vendor/d3-geo\");\nObject.defineProperty(exports, \"geoAlbersUsa\", { enumerable: true, get: function () { return d3_geo_1.geoAlbersUsa; } });\nObject.defineProperty(exports, \"geoAlbers\", { enumerable: true, get: function () { return d3_geo_1.geoAlbers; } });\nObject.defineProperty(exports, \"geoAzimuthalEqualArea\", { enumerable: true, get: function () { return d3_geo_1.geoAzimuthalEqualArea; } });\nObject.defineProperty(exports, \"geoAzimuthalEqualAreaRaw\", { enumerable: true, get: function () { return d3_geo_1.geoAzimuthalEqualAreaRaw; } });\nObject.defineProperty(exports, \"geoAzimuthalEquidistant\", { enumerable: true, get: function () { return d3_geo_1.geoAzimuthalEquidistant; } });\nObject.defineProperty(exports, \"geoAzimuthalEquidistantRaw\", { enumerable: true, get: function () { return d3_geo_1.geoAzimuthalEquidistantRaw; } });\nObject.defineProperty(exports, \"geoConicConformal\", { enumerable: true, get: function () { return d3_geo_1.geoConicConformal; } });\nObject.defineProperty(exports, \"geoConicConformalRaw\", { enumerable: true, get: function () { return d3_geo_1.geoConicConformalRaw; } });\nObject.defineProperty(exports, \"geoConicEqualArea\", { enumerable: true, get: function () { return d3_geo_1.geoConicEqualArea; } });\nObject.defineProperty(exports, \"geoConicEqualAreaRaw\", { enumerable: true, get: function () { return d3_geo_1.geoConicEqualAreaRaw; } });\nObject.defineProperty(exports, \"geoConicEquidistant\", { enumerable: true, get: function () { return d3_geo_1.geoConicEquidistant; } });\nObject.defineProperty(exports, \"geoConicEquidistantRaw\", { enumerable: true, get: function () { return d3_geo_1.geoConicEquidistantRaw; } });\nObject.defineProperty(exports, \"geoEqualEarth\", { enumerable: true, get: function () { return d3_geo_1.geoEqualEarth; } });\nObject.defineProperty(exports, \"geoEqualEarthRaw\", { enumerable: true, get: function () { return d3_geo_1.geoEqualEarthRaw; } });\nObject.defineProperty(exports, \"geoEquirectangular\", { enumerable: true, get: function () { return d3_geo_1.geoEquirectangular; } });\nObject.defineProperty(exports, \"geoEquirectangularRaw\", { enumerable: true, get: function () { return d3_geo_1.geoEquirectangularRaw; } });\nObject.defineProperty(exports, \"geoGnomonic\", { enumerable: true, get: function () { return d3_geo_1.geoGnomonic; } });\nObject.defineProperty(exports, \"geoGnomonicRaw\", { enumerable: true, get: function () { return d3_geo_1.geoGnomonicRaw; } });\nObject.defineProperty(exports, \"geoIdentity\", { enumerable: true, get: function () { return d3_geo_1.geoIdentity; } });\nObject.defineProperty(exports, \"geoProjection\", { enumerable: true, get: function () { return d3_geo_1.geoProjection; } });\nObject.defineProperty(exports, \"geoProjectionMutator\", { enumerable: true, get: function () { return d3_geo_1.geoProjectionMutator; } });\nObject.defineProperty(exports, \"geoMercator\", { enumerable: true, get: function () { return d3_geo_1.geoMercator; } });\nObject.defineProperty(exports, \"geoMercatorRaw\", { enumerable: true, get: function () { return d3_geo_1.geoMercatorRaw; } });\nObject.defineProperty(exports, \"geoNaturalEarth1\", { enumerable: true, get: function () { return d3_geo_1.geoNaturalEarth1; } });\nObject.defineProperty(exports, \"geoNaturalEarth1Raw\", { enumerable: true, get: function () { return d3_geo_1.geoNaturalEarth1Raw; } });\nObject.defineProperty(exports, \"geoOrthographic\", { enumerable: true, get: function () { return d3_geo_1.geoOrthographic; } });\nObject.defineProperty(exports, \"geoOrthographicRaw\", { enumerable: true, get: function () { return d3_geo_1.geoOrthographicRaw; } });\nObject.defineProperty(exports, \"geoStereographic\", { enumerable: true, get: function () { return d3_geo_1.geoStereographic; } });\nObject.defineProperty(exports, \"geoStereographicRaw\", { enumerable: true, get: function () { return d3_geo_1.geoStereographicRaw; } });\nObject.defineProperty(exports, \"geoTransverseMercator\", { enumerable: true, get: function () { return d3_geo_1.geoTransverseMercator; } });\nObject.defineProperty(exports, \"geoTransverseMercatorRaw\", { enumerable: true, get: function () { return d3_geo_1.geoTransverseMercatorRaw; } });\n//# sourceMappingURL=d3Projection.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Event = void 0;\nconst event_1 = require(\"../utils/event\");\nconst helper_1 = require(\"../utils/helper\");\nconst utils_1 = require(\"./utils\");\n// For extended component\nfunction maybeComponentRoot(node) {\n return (0, utils_1.maybeRoot)(node, (node) => node.className === 'component');\n}\n// For extended shape.\nfunction maybeElementRoot(node) {\n return (0, utils_1.maybeRoot)(node, (node) => node.className === 'element');\n}\n// For extended label.\nfunction maybeLabelRoot(node) {\n return (0, utils_1.maybeRoot)(node, (node) => node.className === 'label');\n}\nfunction bubblesEvent(eventType, view, emitter, predicate = (event) => true) {\n return (e) => {\n if (!predicate(e))\n return;\n // Emit plot events.\n emitter.emit(`plot:${eventType}`, e);\n const { target } = e;\n // There is no target for pointerupoutside event if out of canvas.\n if (!target)\n return;\n const { className } = target;\n // If target area is plot area, do not emit extra events.\n if (className === 'plot')\n return;\n // If target is element or child of element.\n const elementRoot = maybeElementRoot(target);\n // If target is component or child of component.\n const componentRoot = maybeComponentRoot(target);\n // If target is babel or child of babel.\n const babelRoot = maybeLabelRoot(target);\n const root = elementRoot || componentRoot || babelRoot;\n if (!root)\n return;\n const { className: elementType, markType } = root;\n const e1 = Object.assign(Object.assign({}, e), { nativeEvent: true });\n if (elementType === 'element') {\n e1['data'] = { data: (0, helper_1.dataOf)(root, view) };\n emitter.emit(`element:${eventType}`, e1);\n emitter.emit(`${markType}:${eventType}`, e1);\n }\n else if (elementType === 'label') {\n //label children [Text2, Rect2, Path2],\n e1['data'] = { data: root.attributes.datum };\n emitter.emit(`label:${eventType}`, e1);\n emitter.emit(`${className}:${eventType}`, e1);\n }\n else {\n emitter.emit(`component:${eventType}`, e1);\n emitter.emit(`${className}:${eventType}`, e1);\n }\n };\n}\n// @todo Provide more info for event.dataset.\nfunction Event() {\n return (context, _, emitter) => {\n const { container, view } = context;\n // Click events.\n const click = bubblesEvent(event_1.ChartEvent.CLICK, view, emitter, (e) => e.detail === 1);\n const dblclick = bubblesEvent(event_1.ChartEvent.DBLCLICK, view, emitter, (e) => e.detail === 2);\n // Pointer events.\n const pointertap = bubblesEvent(event_1.ChartEvent.POINTER_TAP, view, emitter);\n const pointerdown = bubblesEvent(event_1.ChartEvent.POINTER_DOWN, view, emitter);\n const pointerup = bubblesEvent(event_1.ChartEvent.POINTER_UP, view, emitter);\n const pointerover = bubblesEvent(event_1.ChartEvent.POINTER_OVER, view, emitter);\n const pointerout = bubblesEvent(event_1.ChartEvent.POINTER_OUT, view, emitter);\n const pointermove = bubblesEvent(event_1.ChartEvent.POINTER_MOVE, view, emitter);\n const pointerenter = bubblesEvent(event_1.ChartEvent.POINTER_ENTER, view, emitter);\n const pointerleave = bubblesEvent(event_1.ChartEvent.POINTER_LEAVE, view, emitter);\n const pointerupoutside = bubblesEvent(event_1.ChartEvent.POINTER_UPOUTSIDE, view, emitter);\n // Drag and drop events.\n const dragstart = bubblesEvent(event_1.ChartEvent.DRAG_START, view, emitter);\n const drag = bubblesEvent(event_1.ChartEvent.DRAG, view, emitter);\n const dragend = bubblesEvent(event_1.ChartEvent.DRAG_END, view, emitter);\n const dragenter = bubblesEvent(event_1.ChartEvent.DRAG_ENTER, view, emitter);\n const dragleave = bubblesEvent(event_1.ChartEvent.DRAG_LEAVE, view, emitter);\n const dragover = bubblesEvent(event_1.ChartEvent.DRAG_OVER, view, emitter);\n const drop = bubblesEvent(event_1.ChartEvent.DROP, view, emitter);\n // For legacy usage.\n container.addEventListener('click', click);\n container.addEventListener('click', dblclick);\n // Recommend events.\n container.addEventListener('pointertap', pointertap);\n container.addEventListener('pointerdown', pointerdown);\n container.addEventListener('pointerup', pointerup);\n container.addEventListener('pointerover', pointerover);\n container.addEventListener('pointerout', pointerout);\n container.addEventListener('pointermove', pointermove);\n container.addEventListener('pointerenter', pointerenter);\n container.addEventListener('pointerleave', pointerleave);\n container.addEventListener('pointerupoutside', pointerupoutside);\n // Plugin events.\n container.addEventListener('dragstart', dragstart);\n container.addEventListener('drag', drag);\n container.addEventListener('dragend', dragend);\n container.addEventListener('dragenter', dragenter);\n container.addEventListener('dragleave', dragleave);\n container.addEventListener('dragover', dragover);\n container.addEventListener('drop', drop);\n return () => {\n container.removeEventListener('click', click);\n container.removeEventListener('click', dblclick);\n container.removeEventListener('pointertap', pointertap);\n container.removeEventListener('pointerdown', pointerdown);\n container.removeEventListener('pointerup', pointerup);\n container.removeEventListener('pointerover', pointerover);\n container.removeEventListener('pointerout', pointerout);\n container.removeEventListener('pointermove', pointermove);\n container.removeEventListener('pointerenter', pointerenter);\n container.removeEventListener('pointerleave', pointerleave);\n container.removeEventListener('pointerupoutside', pointerupoutside);\n container.removeEventListener('dragstart', dragstart);\n container.removeEventListener('drag', drag);\n container.removeEventListener('dragend', dragend);\n container.removeEventListener('dragenter', dragenter);\n container.removeEventListener('dragleave', dragleave);\n container.removeEventListener('dragover', dragover);\n container.removeEventListener('drop', drop);\n };\n };\n}\nexports.Event = Event;\nEvent.props = {\n reapplyWhenUpdate: true,\n};\n//# sourceMappingURL=event.js.map","\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isValidScale = exports.isPosition = exports.syncFacetsScales = exports.useRelationScale = exports.assignScale = exports.useRelation = exports.collectScales = exports.groupTransform = exports.applyScale = exports.inferScale = void 0;\nconst scale_1 = require(\"@antv/scale\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst d3ScaleChromatic = __importStar(require(\"@antv/vendor/d3-scale-chromatic\"));\nconst util_1 = require(\"@antv/util\");\nconst array_1 = require(\"../utils/array\");\nconst helper_1 = require(\"../utils/helper\");\nconst coordinate_1 = require(\"./coordinate\");\nconst library_1 = require(\"./library\");\nfunction inferScale(name, values, options, coordinates, theme, library) {\n const { guide = {} } = options;\n const type = inferScaleType(name, values, options);\n if (typeof type !== 'string')\n return options;\n const expectedDomain = inferScaleDomain(type, name, values, options);\n const actualDomain = maybeRatio(type, expectedDomain, options);\n return Object.assign(Object.assign(Object.assign({}, options), inferScaleOptions(type, name, values, options, coordinates)), { domain: actualDomain, range: inferScaleRange(type, name, values, options, actualDomain, theme, library), expectedDomain,\n guide,\n name,\n type });\n}\nexports.inferScale = inferScale;\nfunction applyScale(channels, scale) {\n const scaledValue = {};\n for (const channel of channels) {\n const { values, name: scaleName } = channel;\n const scaleInstance = scale[scaleName];\n for (const value of values) {\n const { name, value: V } = value;\n scaledValue[name] = V.map((d) => scaleInstance.map(d));\n }\n }\n return scaledValue;\n}\nexports.applyScale = applyScale;\nfunction groupTransform(markState, uidScale) {\n const channels = Array.from(markState.values()).flatMap((d) => d.channels);\n const scaleGroups = (0, d3_array_1.rollups)(channels, (channels) => channels.map((d) => uidScale.get(d.scale.uid)), (d) => d.name)\n .filter(([, scales]) => scales.some((d) => typeof d.getOptions().groupTransform === 'function') && // only sync scales with groupTransform options\n scales.every((d) => d.getTicks))\n .map((d) => d[1]);\n scaleGroups.forEach((group) => {\n const groupTransform = group.map((d) => d.getOptions().groupTransform)[0];\n groupTransform(group);\n });\n}\nexports.groupTransform = groupTransform;\nfunction collectScales(states, options) {\n var _a;\n const { components = [] } = options;\n const NONE_STATIC_KEYS = [\n 'scale',\n 'encode',\n 'axis',\n 'legend',\n 'data',\n 'transform',\n ];\n // From normal marks.\n const scales = Array.from(new Set(states.flatMap((d) => d.channels.map((d) => d.scale))));\n // From static marks.\n const nameScale = new Map(scales.map((scale) => [scale.name, scale]));\n for (const component of components) {\n const channels = inferChannelsForComponent(component);\n for (const channel of channels) {\n const scale = nameScale.get(channel);\n const staticScale = ((_a = component.scale) === null || _a === void 0 ? void 0 : _a[channel]) || {};\n const { independent = false } = staticScale;\n if (scale && !independent) {\n // Merged with exist scales if is not independent.\n const { guide } = scale;\n const guide1 = typeof guide === 'boolean' ? {} : guide;\n scale.guide = (0, util_1.deepMix)({}, guide1, component);\n Object.assign(scale, staticScale);\n }\n else {\n // Append new scales without exit scales or independent.\n const options1 = Object.assign(Object.assign({}, staticScale), { expectedDomain: staticScale.domain, name: channel, guide: (0, util_1.omit)(component, NONE_STATIC_KEYS) });\n scales.push(options1);\n }\n }\n }\n return scales;\n}\nexports.collectScales = collectScales;\nfunction useRelation(relations) {\n if (!relations || !Array.isArray(relations))\n return [helper_1.identity, helper_1.identity];\n // Store original map and invert.\n let map;\n let invert;\n const conditionalize = (scale) => {\n var _a;\n map = scale.map.bind(scale);\n invert = (_a = scale.invert) === null || _a === void 0 ? void 0 : _a.bind(scale);\n // Distinguish functions[function, output] and value[vale, output] relations.\n const funcRelations = relations.filter(([v]) => typeof v === 'function');\n const valueRelations = relations.filter(([v]) => typeof v !== 'function');\n // Update scale.map\n const valueOutput = new Map(valueRelations);\n scale.map = (x) => {\n for (const [verify, value] of funcRelations) {\n if (verify(x))\n return value;\n }\n if (valueOutput.has(x))\n return valueOutput.get(x);\n return map(x);\n };\n if (!invert)\n return scale;\n // Update scale.invert\n const outputValue = new Map(valueRelations.map(([a, b]) => [b, a]));\n const outputFunc = new Map(funcRelations.map(([a, b]) => [b, a]));\n scale.invert = (x) => {\n if (outputFunc.has(x))\n return x;\n if (outputValue.has(x))\n return outputValue.get(x);\n return invert(x);\n };\n return scale;\n };\n const deconditionalize = (scale) => {\n if (map !== null)\n scale.map = map;\n if (invert !== null)\n scale.invert = invert;\n return scale;\n };\n return [conditionalize, deconditionalize];\n}\nexports.useRelation = useRelation;\nfunction assignScale(target, source) {\n const keys = Object.keys(target);\n for (const scale of Object.values(source)) {\n const { name } = scale.getOptions();\n if (!(name in target))\n target[name] = scale;\n else {\n const I = keys\n .filter((d) => d.startsWith(name))\n // Reg is for extract `1` from `x1`;\n .map((d) => +(d.replace(name, '') || 0));\n const index = (0, d3_array_1.max)(I) + 1;\n const newKey = `${name}${index}`;\n target[newKey] = scale;\n scale.getOptions().key = newKey;\n }\n }\n return target;\n}\nexports.assignScale = assignScale;\nfunction useRelationScale(options, library) {\n const [useScale] = (0, library_1.useLibrary)('scale', library);\n const { relations } = options;\n const [conditionalize] = useRelation(relations);\n const scale = useScale(options);\n return conditionalize(scale);\n}\nexports.useRelationScale = useRelationScale;\nfunction syncFacetsScales(states) {\n const scales = states\n .flatMap((d) => Array.from(d.values()))\n .flatMap((d) => d.channels.map((d) => d.scale));\n syncFacetsScaleByChannel(scales, 'x');\n syncFacetsScaleByChannel(scales, 'y');\n}\nexports.syncFacetsScales = syncFacetsScales;\nfunction inferChannelsForComponent(component) {\n const { channels = [], type, scale = {} } = component;\n const L = ['shape', 'color', 'opacity', 'size'];\n if (channels.length !== 0)\n return channels;\n if (type === 'axisX')\n return ['x'];\n if (type === 'axisY')\n return ['y'];\n if (type === 'legends')\n return Object.keys(scale).filter((d) => L.includes(d));\n return [];\n}\nfunction syncFacetsScaleByChannel(scales, channel) {\n const S = scales.filter(({ name, facet = true }) => facet && name === channel);\n const D = S.flatMap((d) => d.domain);\n const syncedD = S.every(isQuantitativeScale)\n ? (0, d3_array_1.extent)(D)\n : S.every(isDiscreteScale)\n ? Array.from(new Set(D))\n : null;\n if (syncedD === null)\n return;\n for (const scale of S) {\n scale.domain = syncedD;\n }\n}\nfunction maybeRatio(type, domain, options) {\n const { ratio } = options;\n if (ratio === undefined || ratio === null)\n return domain;\n if (isQuantitativeScale({ type })) {\n return clampQuantitativeScale(domain, ratio, type);\n }\n if (isDiscreteScale({ type }))\n return clampDiscreteScale(domain, ratio);\n return domain;\n}\nfunction clampQuantitativeScale(domain, ratio, type) {\n const D = domain.map(Number);\n const scale = new scale_1.Linear({\n domain: D,\n range: [D[0], D[0] + (D[D.length - 1] - D[0]) * ratio],\n });\n if (type === 'time')\n return domain.map((d) => new Date(scale.map(d)));\n return domain.map((d) => scale.map(d));\n}\nfunction clampDiscreteScale(domain, ratio) {\n const index = Math.round(domain.length * ratio);\n return domain.slice(0, index);\n}\nfunction isQuantitativeScale(scale) {\n const { type } = scale;\n if (typeof type !== 'string')\n return false;\n // Do not take quantize, quantile or threshold scale into account,\n // because they are not for position scales. If they are, there is\n // no need to sync them.\n const names = ['linear', 'log', 'pow', 'time'];\n return names.includes(type);\n}\nfunction isDiscreteScale(scale) {\n const { type } = scale;\n if (typeof type !== 'string')\n return false;\n const names = ['band', 'point', 'ordinal'];\n return names.includes(type);\n}\n// @todo More accurate inference for different cases.\nfunction inferScaleType(name, values, options) {\n const { type, domain, range, quantitative, ordinal } = options;\n if (type !== undefined)\n return type;\n if (isObject(values))\n return 'identity';\n if (typeof range === 'string')\n return 'linear';\n if ((domain || range || []).length > 2)\n return asOrdinalType(name, ordinal);\n if (domain !== undefined) {\n if (isOrdinal([domain]))\n return asOrdinalType(name, ordinal);\n if (isTemporal(values))\n return 'time';\n return asQuantitativeType(name, range, quantitative);\n }\n if (isOrdinal(values))\n return asOrdinalType(name, ordinal);\n if (isTemporal(values))\n return 'time';\n return asQuantitativeType(name, range, quantitative);\n}\nfunction inferScaleDomain(type, name, values, options) {\n const { domain } = options;\n if (domain !== undefined)\n return domain;\n switch (type) {\n case 'linear':\n case 'time':\n case 'log':\n case 'pow':\n case 'sqrt':\n case 'quantize':\n case 'threshold':\n return maybeMinMax(inferDomainQ(values, options), options);\n case 'band':\n case 'ordinal':\n case 'point':\n return inferDomainC(values);\n case 'quantile':\n return inferDomainO(values);\n case 'sequential':\n return maybeMinMax(inferDomainS(values), options);\n default:\n return [];\n }\n}\nfunction inferScaleRange(type, name, values, options, domain, theme, library) {\n const { range } = options;\n if (typeof range === 'string')\n return gradientColors(range);\n if (range !== undefined)\n return range;\n const { rangeMin, rangeMax } = options;\n switch (type) {\n case 'linear':\n case 'time':\n case 'log':\n case 'pow':\n case 'sqrt': {\n const colors = categoricalColors(values, options, domain, theme, library);\n const [r0, r1] = inferRangeQ(name, colors);\n return [rangeMin !== null && rangeMin !== void 0 ? rangeMin : r0, rangeMax !== null && rangeMax !== void 0 ? rangeMax : r1];\n }\n case 'band':\n case 'point': {\n const min = name === 'size' ? 5 : 0;\n const max = name === 'size' ? 10 : 1;\n return [rangeMin !== null && rangeMin !== void 0 ? rangeMin : min, rangeMax !== null && rangeMax !== void 0 ? rangeMax : max];\n }\n case 'ordinal': {\n return categoricalColors(values, options, domain, theme, library);\n }\n case 'sequential':\n return undefined;\n case 'constant':\n return [values[0][0]];\n default:\n return [];\n }\n}\nfunction inferScaleOptions(type, name, values, options, coordinates) {\n switch (type) {\n case 'linear':\n case 'time':\n case 'log':\n case 'pow':\n case 'sqrt':\n return inferOptionsQ(coordinates, options);\n case 'band':\n case 'point':\n return inferOptionsC(type, name, coordinates, options);\n case 'sequential':\n return inferOptionsS(options);\n default:\n return options;\n }\n}\nfunction categoricalColors(values, options, domain, theme, library) {\n const [usePalette] = (0, library_1.useLibrary)('palette', library);\n const { category10: c10, category20: c20 } = theme;\n const defaultPalette = (0, array_1.unique)(domain).length <= c10.length ? c10 : c20;\n const { palette = defaultPalette, offset } = options;\n if (Array.isArray(palette))\n return palette;\n // Built-in palettes have higher priority.\n try {\n return usePalette({ type: palette });\n }\n catch (e) {\n const colors = interpolatedColors(palette, domain, offset);\n if (colors)\n return colors;\n throw new Error(`Unknown Component: ${palette} `);\n }\n}\nfunction gradientColors(range) {\n return range.split('-');\n}\nfunction interpolatedColors(palette, domain, offset = (d) => d) {\n if (!palette)\n return null;\n const fullName = (0, util_1.upperFirst)(palette);\n // If scheme have enough colors, then return pre-defined colors.\n const scheme = d3ScaleChromatic[`scheme${fullName}`];\n const interpolator = d3ScaleChromatic[`interpolate${fullName}`];\n if (!scheme && !interpolator)\n return null;\n if (scheme) {\n // If is a one dimension array, return it.\n if (!scheme.some(Array.isArray))\n return scheme;\n const schemeColors = scheme[domain.length];\n if (schemeColors)\n return schemeColors;\n }\n // Otherwise interpolate to get full colors.\n return domain.map((_, i) => interpolator(offset(i / domain.length)));\n}\nfunction inferOptionsS(options) {\n const { palette = 'ylGnBu', offset } = options;\n const name = (0, util_1.upperFirst)(palette);\n const interpolator = d3ScaleChromatic[`interpolate${name}`];\n if (!interpolator)\n throw new Error(`Unknown palette: ${name}`);\n return {\n interpolator: offset ? (x) => interpolator(offset(x)) : interpolator,\n };\n}\nfunction inferOptionsQ(coordinates, options) {\n const { interpolate = scale_1.createInterpolateValue, nice = false, tickCount = 5, } = options;\n return Object.assign(Object.assign({}, options), { interpolate, nice, tickCount });\n}\nfunction inferOptionsC(type, name, coordinates, options) {\n if (options.padding !== undefined ||\n options.paddingInner !== undefined ||\n options.paddingOuter !== undefined) {\n return Object.assign(Object.assign({}, options), { unknown: NaN });\n }\n const padding = inferPadding(type, name, coordinates);\n const { paddingInner = padding, paddingOuter = padding } = options;\n return Object.assign(Object.assign({}, options), { paddingInner,\n paddingOuter,\n padding, unknown: NaN });\n}\nfunction inferPadding(type, name, coordinates) {\n // The scale for enterDelay and enterDuration should has zero padding by default.\n // Because there is no need to add extra delay for the start and the end.\n if (name === 'enterDelay' || name === 'enterDuration')\n return 0;\n if (name === 'size')\n return 0;\n if (type === 'band')\n return (0, coordinate_1.isTheta)(coordinates) ? 0 : 0.1;\n // Point scale need 0.5 padding to make interval between first and last point\n // equal to other intervals in polar coordinate.\n if (type === 'point')\n return 0.5;\n return 0;\n}\nfunction asOrdinalType(name, defaults) {\n if (defaults)\n return defaults;\n return isQuantitative(name) ? 'point' : 'ordinal';\n}\nfunction asQuantitativeType(name, range, defaults) {\n if (defaults)\n return defaults;\n if (name !== 'color')\n return 'linear';\n return range ? 'linear' : 'sequential';\n}\nfunction maybeMinMax(domain, options) {\n if (domain.length === 0)\n return domain;\n const { domainMin, domainMax } = options;\n const [d0, d1] = domain;\n return [domainMin !== null && domainMin !== void 0 ? domainMin : d0, domainMax !== null && domainMax !== void 0 ? domainMax : d1];\n}\nfunction inferDomainQ(values, options) {\n const { zero = false } = options;\n let min = Infinity;\n let max = -Infinity;\n for (const value of values) {\n for (const d of value) {\n if ((0, helper_1.defined)(d)) {\n min = Math.min(min, +d);\n max = Math.max(max, +d);\n }\n }\n }\n if (min === Infinity)\n return [];\n return zero ? [Math.min(0, min), max] : [min, max];\n}\nfunction inferDomainC(values) {\n return Array.from(new Set(values.flat()));\n}\nfunction inferDomainO(values) {\n return values.flat().sort();\n}\nfunction inferDomainS(values) {\n let min = Infinity;\n let max = -Infinity;\n for (const value of values) {\n for (const d of value) {\n if ((0, helper_1.defined)(d)) {\n min = Math.min(min, +d);\n max = Math.max(max, +d);\n }\n }\n }\n if (min === Infinity)\n return [];\n return [min < 0 ? -max : min, max];\n}\n/**\n * @todo More nice default range for enterDelay and enterDuration.\n * @todo Move these to channel definition.\n */\nfunction inferRangeQ(name, palette) {\n if (name === 'enterDelay')\n return [0, 1000];\n if (name == 'enterDuration')\n return [300, 1000];\n if (name.startsWith('y') || name.startsWith('position'))\n return [1, 0];\n if (name === 'color')\n return [(0, array_1.firstOf)(palette), (0, array_1.lastOf)(palette)];\n if (name === 'opacity')\n return [0, 1];\n if (name === 'size')\n return [1, 10];\n return [0, 1];\n}\nfunction isOrdinal(values) {\n return some(values, (d) => {\n const type = typeof d;\n return type === 'string' || type === 'boolean';\n });\n}\nfunction isTemporal(values) {\n return some(values, (d) => d instanceof Date);\n}\nfunction isObject(values) {\n return some(values, helper_1.isStrictObject);\n}\nfunction some(values, callback) {\n for (const V of values) {\n if (V.some(callback))\n return true;\n }\n return false;\n}\nfunction isQuantitative(name) {\n return (name.startsWith('x') ||\n name.startsWith('y') ||\n name.startsWith('position') ||\n name.startsWith('size'));\n}\n// Spatial and temporal position.\nfunction isPosition(name) {\n return (name.startsWith('x') ||\n name.startsWith('y') ||\n name.startsWith('position') ||\n name === 'enterDelay' ||\n name === 'enterDuration' ||\n name === 'updateDelay' ||\n name === 'updateDuration' ||\n name === 'exitDelay' ||\n name === 'exitDuration');\n}\nexports.isPosition = isPosition;\nfunction isValidScale(scale) {\n if (!scale || !scale.type)\n return false;\n if (typeof scale.type === 'function')\n return true;\n const { type, domain, range, interpolator } = scale;\n const isValidDomain = domain && domain.length > 0;\n const isValidRange = range && range.length > 0;\n if ([\n 'linear',\n 'sqrt',\n 'log',\n 'time',\n 'pow',\n 'threshold',\n 'quantize',\n 'quantile',\n 'ordinal',\n 'band',\n 'point',\n ].includes(type) &&\n isValidDomain &&\n isValidRange) {\n return true;\n }\n if (['sequential'].includes(type) &&\n isValidDomain &&\n (isValidRange || interpolator)) {\n return true;\n }\n if (['constant', 'identity'].includes(type) && isValidRange)\n return true;\n return false;\n}\nexports.isValidScale = isValidScale;\n//# sourceMappingURL=scale.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ConstantScale = exports.DiscreteScale = exports.DistributionScale = exports.ContinuousScale = void 0;\nexports.ContinuousScale = {\n linear: 'linear',\n identity: 'identity',\n log: 'log',\n pow: 'pow',\n sqrt: 'sqrt',\n sequential: 'sequential',\n};\nexports.DistributionScale = {\n threshold: 'threshold',\n quantize: 'quantize',\n quantile: 'quantile',\n};\nexports.DiscreteScale = {\n ordinal: 'ordinal',\n band: 'band',\n point: 'point',\n};\nexports.ConstantScale = {\n constant: 'constant',\n};\n//# sourceMappingURL=scale.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.placeComponents = exports.computeRoughPlotSize = exports.computeLayout = exports.processAxisZ = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst util_1 = require(\"@antv/util\");\nconst coordinate_1 = require(\"../utils/coordinate\");\nconst helper_1 = require(\"../utils/helper\");\nconst array_1 = require(\"../utils/array\");\nconst string_1 = require(\"../utils/string\");\nconst component_1 = require(\"./component\");\nconst coordinate_2 = require(\"./coordinate\");\nfunction processAxisZ(components) {\n const axisX = components.find(({ type }) => type === 'axisX');\n const axisY = components.find(({ type }) => type === 'axisY');\n const axisZ = components.find(({ type }) => type === 'axisZ');\n if (axisX && axisY && axisZ) {\n axisX.plane = 'xy';\n axisY.plane = 'xy';\n axisZ.plane = 'yz';\n axisZ.origin = [axisX.bbox.x, axisX.bbox.y, 0];\n axisZ.eulerAngles = [0, -90, 0];\n axisZ.bbox.x = axisX.bbox.x;\n axisZ.bbox.y = axisX.bbox.y;\n components.push(Object.assign(Object.assign({}, axisX), { plane: 'xz', showLabel: false, showTitle: false, origin: [axisX.bbox.x, axisX.bbox.y, 0], eulerAngles: [-90, 0, 0] }));\n components.push(Object.assign(Object.assign({}, axisY), { plane: 'yz', showLabel: false, showTitle: false, origin: [axisY.bbox.x + axisY.bbox.width, axisY.bbox.y, 0], eulerAngles: [0, -90, 0] }));\n components.push(Object.assign(Object.assign({}, axisZ), { plane: 'xz', actualPosition: 'left', showLabel: false, showTitle: false, eulerAngles: [90, -90, 0] }));\n }\n}\nexports.processAxisZ = processAxisZ;\nfunction computeLayout(components, options, theme, library) {\n var _a, _b;\n const { width, height, depth, x = 0, y = 0, z = 0, inset = (_a = theme.inset) !== null && _a !== void 0 ? _a : 0, insetLeft = inset, insetTop = inset, insetBottom = inset, insetRight = inset, margin = (_b = theme.margin) !== null && _b !== void 0 ? _b : 0, marginLeft = margin, marginBottom = margin, marginTop = margin, marginRight = margin, padding = theme.padding, paddingBottom = padding, paddingLeft = padding, paddingRight = padding, paddingTop = padding, } = computeInset(components, options, theme, library);\n const MIN_CONTENT_RATIO = 1 / 4;\n const maybeClamp = (viewWidth, paddingLeft, paddingRight, pl0, pr0) => {\n // Only clamp when has marks.\n const { marks } = options;\n if (marks.length === 0)\n return [pl0, pr0];\n // If size of content is enough, skip.\n const contentSize = viewWidth - pl0 - pr0;\n const diff = contentSize - viewWidth * MIN_CONTENT_RATIO;\n if (diff > 0)\n return [pl0, pr0];\n // Shrink start and end size equally.\n const shrinkSize = viewWidth * (1 - MIN_CONTENT_RATIO);\n return [\n paddingLeft === 'auto' ? (shrinkSize * pl0) / (pl0 + pr0) : pl0,\n paddingRight === 'auto' ? (shrinkSize * pr0) / (pl0 + pr0) : pr0,\n ];\n };\n const roughPadding = (padding) => (padding === 'auto' ? 20 : padding !== null && padding !== void 0 ? padding : 20);\n const rpt = roughPadding(paddingTop);\n const rpb = roughPadding(paddingBottom);\n // Compute paddingLeft and paddingRight first to get innerWidth.\n const horizontalPadding = computePadding(components, height - rpt - rpb, [rpt + marginTop, rpb + marginBottom], ['left', 'right'], options, theme, library);\n const { paddingLeft: pl0, paddingRight: pr0 } = horizontalPadding;\n const viewWidth = width - marginLeft - marginRight;\n const [pl, pr] = maybeClamp(viewWidth, paddingLeft, paddingRight, pl0, pr0);\n const iw = viewWidth - pl - pr;\n // Compute paddingBottom and paddingTop based on innerWidth.\n const verticalPadding = computePadding(components, iw, [pl + marginLeft, pr + marginRight], ['bottom', 'top'], options, theme, library);\n const { paddingTop: pt0, paddingBottom: pb0 } = verticalPadding;\n const viewHeight = height - marginBottom - marginTop;\n const [pb, pt] = maybeClamp(viewHeight, paddingBottom, paddingTop, pb0, pt0);\n const ih = viewHeight - pb - pt;\n return {\n width,\n height,\n depth,\n insetLeft,\n insetTop,\n insetBottom,\n insetRight,\n innerWidth: iw,\n innerHeight: ih,\n paddingLeft: pl,\n paddingRight: pr,\n paddingTop: pt,\n paddingBottom: pb,\n marginLeft,\n marginBottom,\n marginTop,\n marginRight,\n x,\n y,\n z,\n };\n}\nexports.computeLayout = computeLayout;\n// For composite mark with a layout algorithm and without axis,\n// such as worldcloud, circlepack.\nfunction computeRoughPlotSize(options) {\n const { height, width, padding = 0, paddingLeft = padding, paddingRight = padding, paddingTop = padding, paddingBottom = padding, margin = 16, marginLeft = margin, marginRight = margin, marginTop = margin, marginBottom = margin, inset = 0, insetLeft = inset, insetRight = inset, insetTop = inset, insetBottom = inset, } = options;\n // @todo Add this padding to theme.\n // 30 is default size for padding, which defined in runtime.\n const maybeAuto = (padding) => (padding === 'auto' ? 20 : padding);\n const finalWidth = width -\n maybeAuto(paddingLeft) -\n maybeAuto(paddingRight) -\n marginLeft -\n marginRight -\n insetLeft -\n insetRight;\n const finalHeight = height -\n maybeAuto(paddingTop) -\n maybeAuto(paddingBottom) -\n marginTop -\n marginBottom -\n insetTop -\n insetBottom;\n return { width: finalWidth, height: finalHeight };\n}\nexports.computeRoughPlotSize = computeRoughPlotSize;\nfunction computeInset(components, options, theme, library) {\n const { coordinates } = options;\n if (!(0, coordinate_2.isPolar)(coordinates) && !(0, coordinate_2.isRadial)(coordinates)) {\n return options;\n }\n // Filter axis.\n const axes = components.filter((d) => typeof d.type === 'string' && d.type.startsWith('axis'));\n if (axes.length === 0)\n return options;\n const styles = axes.map((component) => {\n const key = component.type === 'axisArc' ? 'arc' : 'linear';\n return (0, component_1.styleOf)(component, key, theme);\n });\n // Compute max labelSpacing.\n const maxLabelSpacing = (0, d3_array_1.max)(styles, (d) => { var _a; return (_a = d.labelSpacing) !== null && _a !== void 0 ? _a : 0; });\n // Compute labelBBoxes.\n const labelBBoxes = axes\n .flatMap((component, i) => {\n const style = styles[i];\n const scale = (0, component_1.createScale)(component, library);\n const labels = (0, component_1.computeLabelsBBox)(style, scale);\n return labels;\n })\n .filter(helper_1.defined);\n const size = (0, d3_array_1.max)(labelBBoxes, (d) => d.height) + maxLabelSpacing;\n // Compute titles.\n const titleBBoxes = axes\n .flatMap((_, i) => {\n const style = styles[i];\n return (0, component_1.computeTitleBBox)(style);\n })\n .filter((d) => d !== null);\n const titleSize = titleBBoxes.length === 0 ? 0 : (0, d3_array_1.max)(titleBBoxes, (d) => d.height);\n // Update inset.\n const { inset = size, insetLeft = inset, insetBottom = inset, insetTop = inset + titleSize, insetRight = inset, } = options;\n return Object.assign(Object.assign({}, options), { insetLeft, insetBottom, insetTop, insetRight });\n}\n/**\n * @todo Support percentage size(e.g. 50%)\n */\nfunction computePadding(components, crossSize, crossPadding, positions, options, theme, library) {\n const positionComponents = (0, d3_array_1.group)(components, (d) => d.position);\n const { padding = theme.padding, paddingLeft = padding, paddingRight = padding, paddingBottom = padding, paddingTop = padding, } = options;\n const layout = {\n paddingBottom,\n paddingLeft,\n paddingTop,\n paddingRight,\n };\n for (const position of positions) {\n const key = `padding${(0, helper_1.capitalizeFirst)((0, string_1.camelCase)(position))}`;\n const components = positionComponents.get(position) || [];\n const value = layout[key];\n const defaultSizeOf = (d) => {\n if (d.size === undefined)\n d.size = d.defaultSize;\n };\n const sizeOf = (d) => {\n if (d.type === 'group') {\n d.children.forEach(defaultSizeOf);\n d.size = (0, d3_array_1.max)(d.children, (d) => d.size);\n }\n else {\n d.size = d.defaultSize;\n }\n };\n const autoSizeOf = (d) => {\n if (d.size)\n return;\n if (value !== 'auto')\n sizeOf(d);\n else {\n // Compute component size dynamically.\n (0, component_1.computeComponentSize)(d, crossSize, crossPadding, position, theme, library);\n defaultSizeOf(d);\n }\n };\n const maybeHide = (d) => {\n if (!d.type.startsWith('axis'))\n return;\n if (d.labelAutoHide === undefined)\n d.labelAutoHide = true;\n };\n const isHorizontal = position === 'bottom' || position === 'top';\n // !!!Note\n // Mute axis component padding.\n // The first axis do not has padding.\n const minOrder = (0, d3_array_1.min)(components, (d) => d.order);\n const axes = components.filter((d) => d.type.startsWith('axis') && d.order == minOrder);\n if (axes.length)\n axes[0].crossPadding = 0;\n // Specified padding.\n if (typeof value === 'number') {\n components.forEach(defaultSizeOf);\n components.forEach(maybeHide);\n }\n else {\n // Compute padding dynamically.\n if (components.length === 0) {\n layout[key] = 0;\n }\n else {\n const size = isHorizontal\n ? crossSize + crossPadding[0] + crossPadding[1]\n : crossSize;\n const grouped = (0, component_1.groupComponents)(components, size);\n grouped.forEach(autoSizeOf);\n const totalSize = grouped.reduce((sum, { size, crossPadding = 12 }) => sum + size + crossPadding, 0);\n layout[key] = totalSize;\n }\n }\n }\n return layout;\n}\nfunction placeComponents(components, coordinate, layout) {\n // Group components by plane & position.\n const positionComponents = (0, d3_array_1.group)(components, (d) => `${d.plane || 'xy'}-${d.position}`);\n const { paddingLeft, paddingRight, paddingTop, paddingBottom, marginLeft, marginTop, marginBottom, marginRight, innerHeight, innerWidth, insetBottom, insetLeft, insetRight, insetTop, height, width, depth, } = layout;\n const planes = {\n xy: createSection({\n width,\n height,\n paddingLeft,\n paddingRight,\n paddingTop,\n paddingBottom,\n marginLeft,\n marginTop,\n marginBottom,\n marginRight,\n innerHeight,\n innerWidth,\n insetBottom,\n insetLeft,\n insetRight,\n insetTop,\n }),\n yz: createSection({\n width: depth,\n height: height,\n paddingLeft: 0,\n paddingRight: 0,\n paddingTop: 0,\n paddingBottom: 0,\n marginLeft: 0,\n marginTop: 0,\n marginBottom: 0,\n marginRight: 0,\n innerWidth: depth,\n innerHeight: height,\n insetBottom: 0,\n insetLeft: 0,\n insetRight: 0,\n insetTop: 0,\n }),\n xz: createSection({\n width,\n height: depth,\n paddingLeft: 0,\n paddingRight: 0,\n paddingTop: 0,\n paddingBottom: 0,\n marginLeft: 0,\n marginTop: 0,\n marginBottom: 0,\n marginRight: 0,\n innerWidth: width,\n innerHeight: depth,\n insetBottom: 0,\n insetLeft: 0,\n insetRight: 0,\n insetTop: 0,\n }),\n };\n for (const [key, components] of positionComponents.entries()) {\n const [plane, position] = key.split('-');\n const area = planes[plane][position];\n /**\n * @description non-entity components: axis in the center, inner, outer, component in the center\n * @description entity components: other components\n * @description no volume components take up no extra space\n */\n const [nonEntityComponents, entityComponents] = (0, array_1.divide)(components, (component) => {\n if (typeof component.type !== 'string')\n return false;\n if (position === 'center')\n return true;\n if (component.type.startsWith('axis') &&\n ['inner', 'outer'].includes(position)) {\n return true;\n }\n return false;\n });\n if (nonEntityComponents.length) {\n placeNonEntityComponents(nonEntityComponents, coordinate, area, position);\n }\n if (entityComponents.length) {\n placePaddingArea(components, coordinate, area);\n }\n }\n}\nexports.placeComponents = placeComponents;\nfunction createSection({ width, height, paddingLeft, paddingRight, paddingTop, paddingBottom, marginLeft, marginTop, marginBottom, marginRight, innerHeight, innerWidth, insetBottom, insetLeft, insetRight, insetTop, }) {\n const pl = paddingLeft + marginLeft;\n const pt = paddingTop + marginTop;\n const pr = paddingRight + marginRight;\n const pb = paddingBottom + marginBottom;\n const plotWidth = width - marginLeft - marginRight;\n const centerSection = [\n pl + insetLeft,\n pt + insetTop,\n innerWidth - insetLeft - insetRight,\n innerHeight - insetTop - insetBottom,\n 'center',\n null,\n null,\n ];\n const xySection = {\n top: [\n pl,\n 0,\n innerWidth,\n pt,\n 'vertical',\n true,\n d3_array_1.ascending,\n marginLeft,\n plotWidth,\n ],\n right: [width - pr, pt, pr, innerHeight, 'horizontal', false, d3_array_1.ascending],\n bottom: [\n pl,\n height - pb,\n innerWidth,\n pb,\n 'vertical',\n false,\n d3_array_1.ascending,\n marginLeft,\n plotWidth,\n ],\n left: [0, pt, pl, innerHeight, 'horizontal', true, d3_array_1.ascending],\n 'top-left': [pl, 0, innerWidth, pt, 'vertical', true, d3_array_1.ascending],\n 'top-right': [pl, 0, innerWidth, pt, 'vertical', true, d3_array_1.ascending],\n 'bottom-left': [\n pl,\n height - pb,\n innerWidth,\n pb,\n 'vertical',\n false,\n d3_array_1.ascending,\n ],\n 'bottom-right': [\n pl,\n height - pb,\n innerWidth,\n pb,\n 'vertical',\n false,\n d3_array_1.ascending,\n ],\n center: centerSection,\n inner: centerSection,\n outer: centerSection,\n };\n return xySection;\n}\nfunction placeNonEntityComponents(components, coordinate, area, position) {\n const [axisComponents, nonAxisComponents] = (0, array_1.divide)(components, (component) => {\n if (typeof component.type === 'string' &&\n component.type.startsWith('axis')) {\n return true;\n }\n return false;\n });\n placeNonEntityAxis(axisComponents, coordinate, area, position);\n // in current stage, only legend component which located in the center can be placed\n placeCenter(nonAxisComponents, coordinate, area);\n}\nfunction placeNonEntityAxis(components, coordinate, area, position) {\n if (position === 'center') {\n if ((0, coordinate_1.isRadar)(coordinate)) {\n placeAxisRadar(components, coordinate, area, position);\n }\n else if ((0, coordinate_1.isPolar)(coordinate)) {\n placeArcLinear(components, coordinate, area);\n }\n else if ((0, coordinate_1.isParallel)(coordinate)) {\n placeAxisParallel(components, coordinate, area, components[0].orientation);\n }\n }\n else if (position === 'inner') {\n placeAxisArcInner(components, coordinate, area);\n }\n else if (position === 'outer') {\n placeAxisArcOuter(components, coordinate, area);\n }\n}\nfunction placeAxisArcInner(components, coordinate, area) {\n const [x, y, , height] = area;\n const [cx, cy] = coordinate.getCenter();\n const [innerRadius] = (0, coordinate_1.radiusOf)(coordinate);\n const r = height / 2;\n const size = innerRadius * r;\n const x0 = cx - size;\n const y0 = cy - size;\n for (let i = 0; i < components.length; i++) {\n const component = components[i];\n component.bbox = {\n x: x + x0,\n y: y + y0,\n width: size * 2,\n height: size * 2,\n };\n }\n}\nfunction placeAxisArcOuter(components, coordinate, area) {\n const [x, y, width, height] = area;\n for (const component of components) {\n component.bbox = { x, y, width, height };\n }\n}\n/**\n * @example arcX, arcY, axisLinear with angle\n */\nfunction placeArcLinear(components, coordinate, area) {\n const [x, y, width, height] = area;\n for (const component of components) {\n component.bbox = { x: x, y, width, height };\n }\n}\nfunction placeAxisParallel(components, coordinate, area, orientation) {\n if (orientation === 'horizontal') {\n placeAxisParallelHorizontal(components, coordinate, area);\n }\n else if (orientation === 'vertical') {\n placeAxisParallelVertical(components, coordinate, area);\n }\n}\nfunction placeAxisParallelVertical(components, coordinate, area) {\n const [x, y, , height] = area;\n // Create a high dimension vector and map to a list of two-dimension points.\n // [0, 0, 0] -> [x0, 0, x1, 0, x2, 0]\n const vector = new Array(components.length).fill(0);\n const points = coordinate.map(vector);\n // Extract x of each points.\n // [x0, 0, x1, 0, x2, 0] -> [x0, x1, x2]\n const X = points.filter((_, i) => i % 2 === 0).map((d) => d + x);\n // Place each axis by coordinate in parallel coordinate.\n for (let i = 0; i < components.length; i++) {\n const component = components[i];\n const x = X[i];\n const width = X[i + 1] - x;\n component.bbox = { x, y, width, height };\n }\n}\nfunction placeAxisParallelHorizontal(components, coordinate, area) {\n const [x, y, width] = area;\n // Create a high dimension vector and map to a list of two-dimension points.\n // [0, 0, 0] -> [height, y0, height, y1, height, y2]\n const vector = new Array(components.length).fill(0);\n const points = coordinate.map(vector);\n // Extract y of each points.\n // [x0, 0, x1, 0, x2, 0] -> [x0, x1, x2]\n const Y = points.filter((_, i) => i % 2 === 1).map((d) => d + y);\n // Place each axis by coordinate in parallel coordinate.\n for (let i = 0; i < components.length; i++) {\n const component = components[i];\n const y = Y[i];\n const height = Y[i + 1] - y;\n component.bbox = { x, y, width, height };\n }\n}\nfunction placeAxisRadar(components, coordinate, area, position) {\n const [x, y, width, height] = area;\n for (const component of components) {\n component.bbox = { x, y, width, height };\n component.radar = {\n index: components.indexOf(component),\n count: components.length,\n };\n }\n}\nfunction placePaddingArea(components, coordinate, area) {\n const [x, y, width, height, direction, reverse, comparator, minX, totalSize] = area;\n const [mainStartKey, mainStartValue, crossStartKey, crossStartValue, mainSizeKey, mainSizeValue, crossSizeKey, crossSizeValue,] = direction === 'vertical'\n ? ['y', y, 'x', x, 'height', height, 'width', width]\n : ['x', x, 'y', y, 'width', width, 'height', height];\n // Sort components by order.\n // The smaller the order, the closer to center.\n components.sort((a, b) => comparator === null || comparator === void 0 ? void 0 : comparator(a.order, b.order));\n const isLarge = (type) => type === 'title' || type === 'group' || type.startsWith('legend');\n const crossSizeOf = (type, small, bigger) => {\n if (bigger === undefined)\n return small;\n if (isLarge(type))\n return bigger;\n return small;\n };\n const crossStartOf = (type, x, minX) => {\n if (minX === undefined)\n return x;\n if (isLarge(type))\n return minX;\n return x;\n };\n const startValue = reverse ? mainStartValue + mainSizeValue : mainStartValue;\n for (let i = 0, start = startValue; i < components.length; i++) {\n const component = components[i];\n const { crossPadding = 0, type } = component;\n const { size } = component;\n component.bbox = {\n [mainStartKey]: reverse\n ? start - size - crossPadding\n : start + crossPadding,\n [crossStartKey]: crossStartOf(type, crossStartValue, minX),\n [mainSizeKey]: size,\n [crossSizeKey]: crossSizeOf(type, crossSizeValue, totalSize),\n };\n start += (size + crossPadding) * (reverse ? -1 : 1);\n }\n // Place group components.\n const groupComponents = components.filter((d) => d.type === 'group');\n for (const group of groupComponents) {\n const { bbox, children } = group;\n const size = bbox[crossSizeKey];\n const step = size / children.length;\n const justifyContent = children.reduce((j, child) => {\n var _a;\n const j0 = (_a = child.layout) === null || _a === void 0 ? void 0 : _a.justifyContent;\n return j0 ? j0 : j;\n }, 'flex-start');\n const L = children.map((d, i) => {\n const { length = step, padding = 0 } = d;\n return length + (i === children.length - 1 ? 0 : padding);\n });\n const totalLength = (0, d3_array_1.sum)(L);\n const diff = size - totalLength;\n const offset = justifyContent === 'flex-start'\n ? 0\n : justifyContent === 'center'\n ? diff / 2\n : diff;\n for (let i = 0, start = bbox[crossStartKey] + offset; i < children.length; i++) {\n const component = children[i];\n const { padding = 0 } = component;\n const interval = i === children.length - 1 ? 0 : padding;\n component.bbox = {\n [mainSizeKey]: bbox[mainSizeKey],\n [mainStartKey]: bbox[mainStartKey],\n [crossStartKey]: start,\n [crossSizeKey]: L[i] - interval,\n };\n (0, util_1.deepMix)(component, { layout: { justifyContent } });\n start += L[i];\n }\n }\n}\n/**\n * @example legend in the center of radial or polar system\n */\nfunction placeCenter(components, coordinate, area) {\n if (components.length === 0)\n return;\n const [x, y, width, height] = area;\n const [innerRadius] = (0, coordinate_1.radiusOf)(coordinate);\n const r = ((height / 2) * innerRadius) / Math.sqrt(2);\n const cx = x + width / 2;\n const cy = y + height / 2;\n for (let i = 0; i < components.length; i++) {\n const component = components[i];\n component.bbox = { x: cx - r, y: cy - r, width: r * 2, height: r * 2 };\n }\n}\n//# sourceMappingURL=layout.js.map","\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createColumnOf = exports.initializeMark = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst helper_1 = require(\"../utils/helper\");\nconst library_1 = require(\"./library\");\nconst transform_1 = require(\"./transform\");\nfunction initializeMark(partialMark, partialProps, context) {\n return __awaiter(this, void 0, void 0, function* () {\n // Apply transform to mark to derive indices, data, encode, etc,.\n const [I, transformedMark] = yield applyMarkTransform(partialMark, partialProps, context);\n const { encode, scale, data, tooltip } = transformedMark;\n // Skip mark with non-tabular data. Do not skip empty\n // data, they are useful for facet to display axes.\n if (Array.isArray(data) === false) {\n return null;\n }\n // Group non-independent channels with same prefix, such as x1, x2 => x.\n // For independent channels, dot not group them, such as position1, position2.\n const { channels: channelDescriptors } = partialProps;\n const nameChannels = (0, d3_array_1.rollups)(Object.entries(encode).filter(([, value]) => (0, helper_1.defined)(value)), (values) => values.map(([key, options]) => (Object.assign({ name: key }, options))), ([key]) => {\n var _a;\n const prefix = (_a = /([^\\d]+)\\d*$/.exec(key)) === null || _a === void 0 ? void 0 : _a[1];\n const descriptor = channelDescriptors.find((d) => d.name === prefix);\n if (descriptor === null || descriptor === void 0 ? void 0 : descriptor.independent)\n return key;\n return prefix;\n });\n // Check required channels and initialize scale options for each channel.\n const channels = channelDescriptors\n .filter((descriptor) => {\n const { name, required } = descriptor;\n if (nameChannels.find(([d]) => d === name))\n return true;\n if (required)\n throw new Error(`Missing encoding for channel: ${name}.`);\n return false;\n })\n .flatMap((descriptor) => {\n const { name, scale: scaleType, scaleKey, range, quantitative, ordinal, } = descriptor;\n const valuesArray = nameChannels.filter(([channel]) => channel.startsWith(name));\n return valuesArray.map(([channel, values], i) => {\n const visual = values.some((d) => d.visual);\n const constant = values.some((d) => d.constant);\n const _a = scale[channel] || {}, { independent = false, \n // Use channel name as default scale key.\n key = scaleKey || channel, \n // Visual channel use identity scale.\n type = constant ? 'constant' : visual ? 'identity' : scaleType } = _a, scaleOptions = __rest(_a, [\"independent\", \"key\", \"type\"]);\n // For constant scale, infer range from data.\n const isConstant = type === 'constant';\n const finalRange = isConstant ? undefined : range;\n return {\n name: channel,\n values,\n // Generate a unique key for independent channel,\n // which will not group with any other channels.\n scaleKey: independent || isConstant ? Symbol('independent') : key,\n scale: Object.assign(Object.assign({ type, range: finalRange }, scaleOptions), { quantitative,\n ordinal }),\n };\n });\n });\n return [transformedMark, Object.assign(Object.assign({}, partialProps), { index: I, channels, tooltip })];\n });\n}\nexports.initializeMark = initializeMark;\nfunction createColumnOf(library) {\n const [useEncode] = (0, library_1.useLibrary)('encode', library);\n return (data, encode) => {\n if (encode === undefined)\n return null;\n if (data === undefined)\n return null;\n return Object.assign(Object.assign({}, encode), { type: 'column', value: useEncode(encode)(data), field: fieldOf(encode) });\n };\n}\nexports.createColumnOf = createColumnOf;\nfunction applyMarkTransform(mark, props, context) {\n return __awaiter(this, void 0, void 0, function* () {\n const { library } = context;\n const [useTransform] = (0, library_1.useLibrary)('transform', library);\n const { preInference = [], postInference = [] } = props;\n const { transform = [] } = mark;\n const transforms = [\n transform_1.applyDefaults,\n transform_1.applyDataTransform,\n transform_1.flatEncode,\n transform_1.inferChannelsType,\n transform_1.maybeVisualChannel,\n transform_1.extractColumns,\n transform_1.maybeArrayField,\n transform_1.maybeNonAnimate,\n transform_1.addGuideToScale,\n transform_1.normalizeTooltip,\n ...preInference.map(useTransform),\n ...transform.map(useTransform),\n ...postInference.map(useTransform),\n transform_1.extractTooltip,\n ];\n let index = [];\n let transformedMark = mark;\n for (const t of transforms) {\n [index, transformedMark] = yield t(index, transformedMark, context);\n }\n return [index, transformedMark];\n });\n}\nfunction fieldOf(encode) {\n const { type, value } = encode;\n if (type === 'field' && typeof value === 'string')\n return value;\n return null;\n}\n//# sourceMappingURL=mark.js.map","\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.maybeNonAnimate = exports.addGuideToScale = exports.maybeArrayField = exports.extractTooltip = exports.normalizeTooltip = exports.extractColumns = exports.maybeVisualChannel = exports.inferChannelsType = exports.flatEncode = exports.applyDataTransform = exports.applyDefaults = exports.CALLBACK_ITEM_SYMBOL = void 0;\nconst util_1 = require(\"@antv/util\");\nconst d3_format_1 = require(\"@antv/vendor/d3-format\");\nconst array_1 = require(\"../utils/array\");\nconst helper_1 = require(\"../utils/helper\");\nconst mark_1 = require(\"../utils/mark\");\nconst library_1 = require(\"./library\");\nconst mark_2 = require(\"./mark\");\nconst scale_1 = require(\"./scale\");\nexports.CALLBACK_ITEM_SYMBOL = Symbol('CALLBACK_ITEM');\n// @todo Add more defaults.\nfunction applyDefaults(I, mark, context) {\n const { encode = {}, scale = {}, transform = [] } = mark, rest = __rest(mark, [\"encode\", \"scale\", \"transform\"]);\n return [I, Object.assign(Object.assign({}, rest), { encode, scale, transform })];\n}\nexports.applyDefaults = applyDefaults;\nfunction applyDataTransform(I, mark, context) {\n return __awaiter(this, void 0, void 0, function* () {\n const { library } = context;\n const { data } = mark;\n const [useData] = (0, library_1.useLibrary)('data', library);\n const descriptor = normalizedDataSource(data);\n const { transform: T = [] } = descriptor, connector = __rest(descriptor, [\"transform\"]);\n const transform = [connector, ...T];\n const transformFunctions = transform.map((t) => useData(t, context));\n const transformedData = yield (0, helper_1.composeAsync)(transformFunctions)(data);\n // Maintain the consistency of shape between input and output data.\n // If the shape of raw data is like { value: any }\n // and the returned transformedData is Object,\n // returns the wrapped data: { value: transformedData },\n // otherwise returns the processed tabular data.\n const newData = data && !Array.isArray(data) && !Array.isArray(transformedData)\n ? { value: transformedData }\n : transformedData;\n return [\n Array.isArray(transformedData) ? (0, array_1.indexOf)(transformedData) : [],\n Object.assign(Object.assign({}, mark), { data: newData }),\n ];\n });\n}\nexports.applyDataTransform = applyDataTransform;\nfunction flatEncode(I, mark, context) {\n const { encode } = mark;\n if (!encode)\n return [I, mark];\n const flattenEncode = {};\n for (const [key, value] of Object.entries(encode)) {\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const name = `${key}${i === 0 ? '' : i}`;\n flattenEncode[name] = value[i];\n }\n }\n else {\n flattenEncode[key] = value;\n }\n }\n return [I, Object.assign(Object.assign({}, mark), { encode: flattenEncode })];\n}\nexports.flatEncode = flatEncode;\nfunction inferChannelsType(I, mark, context) {\n const { encode, data } = mark;\n if (!encode)\n return [I, mark];\n const typedEncode = (0, array_1.mapObject)(encode, (channel) => {\n if (isTypedChannel(channel))\n return channel;\n const type = inferChannelType(data, channel);\n return { type, value: channel };\n });\n return [I, Object.assign(Object.assign({}, mark), { encode: typedEncode })];\n}\nexports.inferChannelsType = inferChannelsType;\nfunction maybeVisualChannel(I, mark, context) {\n const { encode } = mark;\n if (!encode)\n return [I, mark];\n const newEncode = (0, array_1.mapObject)(encode, (channel, name) => {\n const { type } = channel;\n if (type !== 'constant' || (0, scale_1.isPosition)(name))\n return channel;\n return Object.assign(Object.assign({}, channel), { constant: true });\n });\n return [I, Object.assign(Object.assign({}, mark), { encode: newEncode })];\n}\nexports.maybeVisualChannel = maybeVisualChannel;\nfunction extractColumns(I, mark, context) {\n const { encode, data } = mark;\n if (!encode)\n return [I, mark];\n const { library } = context;\n const columnOf = (0, mark_2.createColumnOf)(library);\n const valuedEncode = (0, array_1.mapObject)(encode, (channel) => columnOf(data, channel));\n return [I, Object.assign(Object.assign({}, mark), { encode: valuedEncode })];\n}\nexports.extractColumns = extractColumns;\n/**\n * Normalize mark.tooltip to {title, items}.\n */\nfunction normalizeTooltip(I, mark, context) {\n const { tooltip = {} } = mark;\n if ((0, helper_1.isUnset)(tooltip))\n return [I, mark];\n if (Array.isArray(tooltip)) {\n return [I, Object.assign(Object.assign({}, mark), { tooltip: { items: tooltip } })];\n }\n if ((0, helper_1.isStrictObject)(tooltip) && (0, mark_1.isFullTooltip)(tooltip)) {\n return [I, Object.assign(Object.assign({}, mark), { tooltip })];\n }\n return [I, Object.assign(Object.assign({}, mark), { tooltip: { items: [tooltip] } })];\n}\nexports.normalizeTooltip = normalizeTooltip;\nfunction extractTooltip(I, mark, context) {\n const { data, encode, tooltip = {} } = mark;\n if ((0, helper_1.isUnset)(tooltip))\n return [I, mark];\n const valueOf = (item) => {\n if (!item)\n return item;\n if (typeof item === 'string') {\n return I.map((i) => ({ name: item, value: data[i][item] }));\n }\n if ((0, helper_1.isStrictObject)(item)) {\n const { field, channel, color, name = field, valueFormatter = (d) => d, } = item;\n // Support d3-format.\n const normalizedValueFormatter = typeof valueFormatter === 'string'\n ? (0, d3_format_1.format)(valueFormatter)\n : valueFormatter;\n // Field name.\n const definedChannel = channel && encode[channel];\n const channelField = definedChannel && encode[channel].field;\n const name1 = name || channelField || channel;\n const values = [];\n for (const i of I) {\n const value1 = field\n ? data[i][field]\n : definedChannel\n ? encode[channel].value[i]\n : null;\n values[i] = {\n name: name1,\n color,\n value: normalizedValueFormatter(value1),\n };\n }\n return values;\n }\n if (typeof item === 'function') {\n const values = [];\n for (const i of I) {\n const v = item(data[i], i, data, encode);\n if ((0, helper_1.isStrictObject)(v))\n values[i] = Object.assign(Object.assign({}, v), { [exports.CALLBACK_ITEM_SYMBOL]: true });\n else\n values[i] = { value: v };\n }\n return values;\n }\n return item;\n };\n const { title, items = [] } = tooltip, rest = __rest(tooltip, [\"title\", \"items\"]);\n const newTooltip = Object.assign({ title: valueOf(title), items: Array.isArray(items) ? items.map(valueOf) : [] }, rest);\n return [I, Object.assign(Object.assign({}, mark), { tooltip: newTooltip })];\n}\nexports.extractTooltip = extractTooltip;\nfunction maybeArrayField(I, mark, context) {\n const { encode } = mark, rest = __rest(mark, [\"encode\"]);\n if (!encode)\n return [I, mark];\n const columns = Object.entries(encode);\n const arrayColumns = columns\n .filter(([, channel]) => {\n const { value: V } = channel;\n return Array.isArray(V[0]);\n })\n .flatMap(([key, V]) => {\n const columns = [[key, new Array(I.length).fill(undefined)]];\n const { value: rows } = V, rest = __rest(V, [\"value\"]);\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n if (Array.isArray(row)) {\n for (let j = 0; j < row.length; j++) {\n const column = columns[j] || [\n `${key}${j}`,\n new Array(I).fill(undefined),\n ];\n column[1][i] = row[j];\n columns[j] = column;\n }\n }\n }\n return columns.map(([key, value]) => [\n key,\n Object.assign({ type: 'column', value }, rest),\n ]);\n });\n const newEncode = Object.fromEntries([...columns, ...arrayColumns]);\n return [I, Object.assign(Object.assign({}, rest), { encode: newEncode })];\n}\nexports.maybeArrayField = maybeArrayField;\nfunction addGuideToScale(I, mark, context) {\n const { axis = {}, legend = {}, slider = {}, scrollbar = {} } = mark;\n const normalize = (guide, channel) => {\n if (typeof guide === 'boolean')\n return guide ? {} : null;\n const eachGuide = guide[channel];\n return eachGuide === undefined || eachGuide ? eachGuide : null;\n };\n const axisChannels = typeof axis === 'object'\n ? Array.from(new Set(['x', 'y', 'z', ...Object.keys(axis)]))\n : ['x', 'y', 'z'];\n (0, util_1.deepMix)(mark, {\n scale: Object.assign(Object.assign({}, Object.fromEntries(axisChannels.map((channel) => {\n const scrollbarOptions = normalize(scrollbar, channel);\n return [\n channel,\n Object.assign({ guide: normalize(axis, channel), slider: normalize(slider, channel), scrollbar: scrollbarOptions }, (scrollbarOptions && {\n ratio: scrollbarOptions.ratio === undefined\n ? 0.5\n : scrollbarOptions.ratio,\n })),\n ];\n }))), { color: { guide: normalize(legend, 'color') }, size: { guide: normalize(legend, 'size') }, shape: { guide: normalize(legend, 'shape') }, \n // fixme: opacity is conflict with DisplayObject.opacity\n // to be confirm.\n opacity: { guide: normalize(legend, 'opacity') } }),\n });\n return [I, mark];\n}\nexports.addGuideToScale = addGuideToScale;\nfunction maybeNonAnimate(I, mark, context) {\n const { animate } = mark;\n if (animate || animate === undefined)\n return [I, mark];\n (0, util_1.deepMix)(mark, {\n animate: {\n enter: { type: null },\n exit: { type: null },\n update: { type: null },\n },\n });\n return [I, mark];\n}\nexports.maybeNonAnimate = maybeNonAnimate;\nfunction isTypedChannel(channel) {\n if (typeof channel !== 'object' ||\n channel instanceof Date ||\n channel === null) {\n return false;\n }\n const { type } = channel;\n return (0, helper_1.defined)(type);\n}\nfunction inferChannelType(data, channel) {\n if (typeof channel === 'function')\n return 'transform';\n if (typeof channel === 'string' && isField(data, channel))\n return 'field';\n return 'constant';\n}\nfunction isField(data, value) {\n if (!Array.isArray(data))\n return false;\n return data.some((d) => d[value] !== undefined);\n}\nfunction normalizedDataSource(data) {\n // Liquid、Gauge need number data.\n if ((0, util_1.isNumber)(data))\n return { type: 'inline', value: data };\n // Return null as a placeholder.\n if (!data)\n return { type: 'inline', value: null };\n if (Array.isArray(data))\n return { type: 'inline', value: data };\n const { type = 'inline' } = data, rest = __rest(data, [\"type\"]);\n return Object.assign(Object.assign({}, rest), { type });\n}\n//# sourceMappingURL=transform.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.preprocessOption = void 0;\nconst flow_1 = require(\"../../utils/flow\");\nconst style_1 = require(\"./style\");\nfunction preprocessOption(options) {\n const convertedOptions = adapter(options);\n // If there are children, recursively convert each child node.\n if (convertedOptions.children && Array.isArray(convertedOptions.children)) {\n convertedOptions.children = convertedOptions.children.map((child) => preprocessOption(child));\n }\n return convertedOptions;\n}\nexports.preprocessOption = preprocessOption;\n// Entry point for all syntactic sugar functions.\nfunction adapter(options) {\n //@todo define a type for params of flow\n return (0, flow_1.flow)(style_1.columnWidthRatio)(options);\n}\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.flow = void 0;\n/**\n * 类似 lodash.flow 的方法\n * @param flows\n */\nfunction flow(...flows) {\n return (param) => {\n return flows.reduce((result, f) => {\n return f(result);\n }, param);\n };\n}\nexports.flow = flow;\n//# sourceMappingURL=flow.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.columnWidthRatio = void 0;\nconst util_1 = require(\"@antv/util\");\n// style: { columnWidthRatio: 0.2 } => scale: { x: { padding: 0.8 } }\nfunction columnWidthRatio(options) {\n const { style, scale, type } = options;\n const scaleOption = {};\n const columnWidthRatio = (0, util_1.get)(style, 'columnWidthRatio');\n if (columnWidthRatio && type === 'interval') {\n scaleOption.x = Object.assign(Object.assign({}, scale === null || scale === void 0 ? void 0 : scale.x), { padding: 1 - columnWidthRatio });\n }\n return Object.assign(Object.assign({}, options), { scale: Object.assign(Object.assign({}, scale), scaleOption) });\n}\nexports.columnWidthRatio = columnWidthRatio;\n//# sourceMappingURL=style.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.show = exports.hide = exports.setStyle = exports.getStyle = void 0;\nconst traverse_elements_1 = require(\"./traverse-elements\");\nconst defaultStyle = {\n visibility: 'visible',\n opacity: 1,\n fillOpacity: 1,\n strokeOpacity: 1,\n};\nfunction getStyle(element, key) {\n let value;\n (0, traverse_elements_1.traverseElements)(element, (el) => {\n var _a;\n if (el.tagName !== 'g' && ((_a = el.style) === null || _a === void 0 ? void 0 : _a[key]) !== undefined) {\n value = el.style[key];\n return true;\n }\n return false;\n });\n return value !== null && value !== void 0 ? value : defaultStyle[key];\n}\nexports.getStyle = getStyle;\nfunction setStyle(element, key, value, recursive) {\n element.style[key] = value;\n if (recursive) {\n element.children.forEach((child) => setStyle(child, key, value, recursive));\n }\n}\nexports.setStyle = setStyle;\nfunction hide(element) {\n setStyle(element, 'visibility', 'hidden', true);\n}\nexports.hide = hide;\nfunction show(element) {\n setStyle(element, 'visibility', 'visible', true);\n}\nexports.show = show;\n//# sourceMappingURL=style.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.traverseElements = void 0;\nfunction traverseElements(element, visitor) {\n if (visitor(element))\n return true;\n if (element.tagName === 'g') {\n const { childNodes = [] } = element;\n for (const child of childNodes) {\n if (traverseElements(child, visitor))\n return true;\n }\n }\n return false;\n}\nexports.traverseElements = traverseElements;\n//# sourceMappingURL=traverse-elements.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ElementHighlightByX = void 0;\nconst utils_1 = require(\"./utils\");\nconst elementHighlight_1 = require(\"./elementHighlight\");\nfunction ElementHighlightByX(options) {\n return (0, elementHighlight_1.ElementHighlight)(Object.assign(Object.assign({}, options), { createGroup: utils_1.createXKey }));\n}\nexports.ElementHighlightByX = ElementHighlightByX;\nElementHighlightByX.props = {\n reapplyWhenUpdate: true,\n};\n//# sourceMappingURL=elementHighlightByX.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ElementHighlightByColor = void 0;\nconst utils_1 = require(\"./utils\");\nconst elementHighlight_1 = require(\"./elementHighlight\");\nfunction ElementHighlightByColor(options) {\n return (0, elementHighlight_1.ElementHighlight)(Object.assign(Object.assign({}, options), { createGroup: utils_1.createColorKey }));\n}\nexports.ElementHighlightByColor = ElementHighlightByColor;\nElementHighlightByColor.props = {\n reapplyWhenUpdate: true,\n};\n//# sourceMappingURL=elementHighlightByColor.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ElementSelect = exports.elementSelect = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"../utils/helper\");\nconst traverse_elements_1 = require(\"../utils/traverse-elements\");\nconst utils_1 = require(\"./utils\");\n/**\n * Active a group of elements.\n */\nfunction elementSelect(root, { elements: elementsof, // given the root of chart returns elements to be manipulated\ndatum, // given each element returns the datum of it\ngroupKey = (d) => d, // group elements by specified key\nregionGroupKey = (d) => d, // how to group elements when click region\nlink = false, // draw link or not\nsingle = false, // single select or not\nmultipleSelectHotkey, // hotkey for multi-select mode\ncoordinate, background = false, scale, emitter, state = {}, region = false, regionEleFilter = (el) => utils_1.VALID_FIND_BY_X_MARKS.includes(el.markType), }) {\n var _a;\n const elements = elementsof(root);\n const elementSet = new Set(elements);\n const findElement = (0, utils_1.createFindElementByEvent)({\n elementsof,\n root,\n coordinate,\n scale,\n });\n const keyGroup = (0, d3_array_1.group)(elements, groupKey);\n const regionGroup = (0, d3_array_1.group)(elements, regionGroupKey);\n const valueof = (0, utils_1.createValueof)(elements, datum);\n const [appendLink, removeLink] = (0, utils_1.renderLink)(Object.assign({ link,\n elements,\n valueof,\n coordinate }, (0, helper_1.subObject)(state.selected, 'link')));\n const [appendBackground, removeBackground] = (0, utils_1.renderBackground)(Object.assign({ document: root.ownerDocument, background,\n coordinate,\n scale,\n valueof }, (0, helper_1.subObject)(state.selected, 'background')));\n const elementStyle = (0, util_1.deepMix)(state, {\n selected: Object.assign({}, (((_a = state.selected) === null || _a === void 0 ? void 0 : _a.offset) && {\n // Apply translate to mock slice out.\n transform: (...params) => {\n const value = state.selected.offset(...params);\n const [, i] = params;\n return (0, utils_1.offsetTransform)(elements[i], value, coordinate);\n },\n })),\n });\n const useState = (0, utils_1.createUseState)(elementStyle, elements);\n const { updateState, removeState, hasState } = useState(valueof);\n let isMultiSelectMode = !single; // \"single\" determines whether to multi-select by default\n let activeHotkey = null; // Track the currently active hotkey\n const clear = (nativeEvent = true) => {\n for (const e of elements) {\n removeState(e, 'selected', 'unselected');\n removeLink(e);\n removeBackground(e);\n }\n if (nativeEvent)\n emitter.emit('element:unselect', { nativeEvent: true });\n return;\n };\n const singleSelect = ({ event, element, nativeEvent = true, filter = (el) => true, groupBy = groupKey, groupMap = keyGroup, }) => {\n const filteredElements = elements.filter(filter);\n // Clear states if clicked selected element.\n if (hasState(element, 'selected'))\n clear();\n else {\n const k = groupBy(element);\n const group = groupMap.get(k);\n const groupSet = new Set(group);\n for (const e of filteredElements) {\n if (groupSet.has(e))\n updateState(e, 'selected');\n else {\n updateState(e, 'unselected');\n removeLink(e);\n }\n if (e !== element)\n removeBackground(e);\n }\n appendLink(group);\n appendBackground(element);\n if (!nativeEvent)\n return;\n emitter.emit('element:select', Object.assign(Object.assign({}, event), { nativeEvent, data: {\n data: [datum(element), ...group.map(datum)],\n } }));\n }\n };\n const multipleSelect = ({ event, element, nativeEvent = true, filter = (el) => true, groupBy = groupKey, groupMap = keyGroup, }) => {\n const k = groupBy(element);\n const group = groupMap.get(k);\n const groupSet = new Set(group);\n const filteredElements = elements.filter(filter);\n if (!hasState(element, 'selected')) {\n const hasSelectedGroup = group.some((e) => hasState(e, 'selected'));\n for (const e of filteredElements) {\n if (groupSet.has(e))\n updateState(e, 'selected');\n else if (!hasState(e, 'selected'))\n updateState(e, 'unselected');\n }\n // Append link for each group only once.\n if (!hasSelectedGroup && link)\n appendLink(group);\n appendBackground(element);\n }\n else {\n // If there is no selected elements after resetting this group,\n // clear the states.\n const hasSelected = elements.some((e) => !groupSet.has(e) && hasState(e, 'selected'));\n if (!hasSelected)\n return clear();\n // If there are still some selected elements after resetting this group,\n // only remove the link.\n for (const e of group) {\n updateState(e, 'unselected');\n removeLink(e);\n removeBackground(e);\n }\n }\n if (!nativeEvent)\n return;\n emitter.emit('element:select', Object.assign(Object.assign({}, event), { nativeEvent, data: {\n data: elements.filter((e) => hasState(e, 'selected')).map(datum),\n } }));\n };\n const isClickElementOrGroup = (element) => {\n if (elementSet.has(element))\n return true;\n for (const group of elementSet) {\n const found = (0, traverse_elements_1.traverseElements)(group, (el) => el === element);\n if (found)\n return true;\n }\n return false;\n };\n const getRealElement = (element) => {\n if (elementSet.has(element))\n return element;\n for (const group of elementSet) {\n let match = null;\n (0, traverse_elements_1.traverseElements)(group, (el) => {\n if (el === element)\n match = group;\n });\n if (match)\n return match;\n }\n return element;\n };\n const click = (event) => {\n const { target: element, nativeEvent = true } = event;\n const select = !isMultiSelectMode ? singleSelect : multipleSelect;\n let el = element;\n const isClickElement = isClickElementOrGroup(element);\n if (!region || isClickElement) {\n // Click non-element shape, reset.\n // Such as the rest of content area(background).\n if (!isClickElement)\n return clear();\n return select({\n event,\n element: getRealElement(el),\n nativeEvent,\n groupBy: groupKey,\n });\n }\n else {\n // Click background region area, select elements in the region.\n // Get element at cursor.x position.\n el = findElement(event);\n if (!elementSet.has(el))\n return clear();\n return select({\n event,\n element: el,\n nativeEvent,\n filter: regionEleFilter,\n groupBy: regionGroupKey,\n groupMap: regionGroup,\n });\n }\n };\n // Handle keyboard events for multi-select mode\n const hotkeys = Array.isArray(multipleSelectHotkey)\n ? multipleSelectHotkey\n : [multipleSelectHotkey];\n const handleKeyDown = (event) => {\n if (hotkeys.includes(event.code) && !activeHotkey) {\n activeHotkey = event.code;\n isMultiSelectMode = true;\n }\n };\n const handleKeyUp = (event) => {\n if (event.code === activeHotkey) {\n activeHotkey = null;\n isMultiSelectMode = false;\n }\n };\n root.addEventListener('click', click);\n if (multipleSelectHotkey) {\n // If a hotkey is set, the initial state should be single mode\n isMultiSelectMode = false;\n document.addEventListener('keydown', handleKeyDown);\n document.addEventListener('keyup', handleKeyUp);\n }\n const onSelect = (e) => {\n const { nativeEvent, data } = e;\n if (nativeEvent)\n return;\n const selectedData = !isMultiSelectMode ? data.data.slice(0, 1) : data.data;\n for (const d of selectedData) {\n const element = (0, utils_1.selectElementByData)(elements, d, datum);\n click({ target: element, nativeEvent: false });\n }\n };\n const onUnSelect = () => {\n clear(false);\n };\n emitter.on('element:select', onSelect);\n emitter.on('element:unselect', onUnSelect);\n return () => {\n for (const e of elements)\n removeLink(e);\n root.removeEventListener('click', click);\n if (multipleSelectHotkey) {\n document.removeEventListener('keydown', handleKeyDown);\n document.removeEventListener('keyup', handleKeyUp);\n }\n emitter.off('element:select', onSelect);\n emitter.off('element:unselect', onUnSelect);\n };\n}\nexports.elementSelect = elementSelect;\nfunction ElementSelect(_a) {\n var { createGroup, createRegionGroup, background = false, link = false } = _a, rest = __rest(_a, [\"createGroup\", \"createRegionGroup\", \"background\", \"link\"]);\n return (context, _, emitter) => {\n const { container, view, options } = context;\n const { coordinate, scale } = view;\n const plotArea = (0, utils_1.selectPlotArea)(container);\n return elementSelect(plotArea, Object.assign({ elements: utils_1.selectG2Elements, datum: (0, utils_1.createDatumof)(view), groupKey: createGroup ? createGroup(view) : undefined, regionGroupKey: createRegionGroup\n ? createRegionGroup(view)\n : (0, utils_1.createXKey)(view), coordinate,\n scale, state: (0, utils_1.mergeState)(options, [\n ['selected', background ? {} : { lineWidth: '1', stroke: '#000' }],\n 'unselected',\n ]), background,\n link,\n emitter }, rest));\n };\n}\nexports.ElementSelect = ElementSelect;\nElementSelect.props = {\n reapplyWhenUpdate: true,\n};\n//# sourceMappingURL=elementSelect.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ElementSelectByX = void 0;\nconst utils_1 = require(\"./utils\");\nconst elementSelect_1 = require(\"./elementSelect\");\nfunction ElementSelectByX(options) {\n return (0, elementSelect_1.ElementSelect)(Object.assign(Object.assign({}, options), { createGroup: utils_1.createXKey }));\n}\nexports.ElementSelectByX = ElementSelectByX;\nElementSelectByX.props = {\n reapplyWhenUpdate: true,\n};\n//# sourceMappingURL=elementSelectByX.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ElementSelectByColor = void 0;\nconst utils_1 = require(\"./utils\");\nconst elementSelect_1 = require(\"./elementSelect\");\nfunction ElementSelectByColor(options) {\n return (0, elementSelect_1.ElementSelect)(Object.assign(Object.assign({}, options), { createGroup: utils_1.createColorKey }));\n}\nexports.ElementSelectByColor = ElementSelectByColor;\nElementSelectByColor.props = {\n reapplyWhenUpdate: true,\n};\n//# sourceMappingURL=elementSelectByColor.js.map","\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ChartIndex = void 0;\nconst g_1 = require(\"@antv/g\");\nconst util_1 = require(\"@antv/util\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst helper_1 = require(\"../utils/helper\");\nconst runtime_1 = require(\"../runtime\");\nconst utils_1 = require(\"./utils\");\nfunction maybeTransform(options) {\n const { transform = [] } = options;\n const normalizeY = transform.find((d) => d.type === 'normalizeY');\n if (normalizeY)\n return normalizeY;\n const newNormalizeY = { type: 'normalizeY' };\n transform.push(newNormalizeY);\n options.transform = transform;\n return newNormalizeY;\n}\nfunction markValue(markState, markName, channels) {\n const [value] = Array.from(markState.entries())\n .filter(([mark]) => mark.type === markName)\n .map(([mark]) => {\n const { encode } = mark;\n const channel = (name) => {\n const channel = encode[name];\n return [name, channel ? channel.value : undefined];\n };\n return Object.fromEntries(channels.map(channel));\n });\n return value;\n}\n/**\n * @todo Perf\n */\nfunction ChartIndex(_a) {\n var { wait = 20, leading, trailing = false, labelFormatter = (date) => `${date}` } = _a, style = __rest(_a, [\"wait\", \"leading\", \"trailing\", \"labelFormatter\"]);\n return (context) => {\n const { view, container, update, setState } = context;\n const { markState, scale, coordinate } = view;\n // Get line mark value, exit if it is not existed.\n const value = markValue(markState, 'line', ['x', 'y', 'series']);\n if (!value)\n return;\n // Prepare channel value.\n const { y: Y, x: X, series: S = [] } = value;\n const I = Y.map((_, i) => i);\n const sortedX = (0, d3_array_1.sort)(I.map((i) => X[i]));\n // Prepare shapes.\n const plotArea = (0, utils_1.selectPlotArea)(container);\n const lines = container.getElementsByClassName(runtime_1.ELEMENT_CLASS_NAME);\n const labels = container.getElementsByClassName(runtime_1.LABEL_CLASS_NAME);\n // The format of label key: `${elementKey}-index`,\n // group labels by elementKey.\n const keyofLabel = (d) => d.__data__.key.split('-')[0];\n const keyLabels = (0, d3_array_1.group)(labels, keyofLabel);\n const rule = new g_1.Line({\n style: Object.assign({ x1: 0, y1: 0, x2: 0, y2: plotArea.getAttribute('height'), stroke: 'black', lineWidth: 1 }, (0, helper_1.subObject)(style, 'rule')),\n });\n const text = new g_1.Text({\n style: Object.assign({ x: 0, y: plotArea.getAttribute('height'), text: '', fontSize: 10 }, (0, helper_1.subObject)(style, 'label')),\n });\n rule.append(text);\n plotArea.appendChild(rule);\n // Get the closet date to the rule.\n const dateByFocus = (coordinate, scaleX, focus) => {\n const [normalizedX] = coordinate.invert(focus);\n const date = scaleX.invert(normalizedX);\n return sortedX[(0, d3_array_1.bisectCenter)(sortedX, date)];\n };\n // Update rule and label content.\n const updateRule = (focus, date) => {\n rule.setAttribute('x1', focus[0]);\n rule.setAttribute('x2', focus[0]);\n text.setAttribute('text', labelFormatter(date));\n };\n // Store the new inner state alter rerender the view.\n let newView;\n // Rerender the view to update basis for each line.\n const updateBasisByRerender = (focus) => __awaiter(this, void 0, void 0, function* () {\n // Find the closetDate to the rule.\n const { x: scaleX } = scale;\n const date = dateByFocus(coordinate, scaleX, focus);\n updateRule(focus, date);\n setState('chartIndex', (options) => {\n // Clone options and get line mark.\n const clonedOptions = (0, util_1.deepMix)({}, options);\n const lineMark = clonedOptions.marks.find((d) => d.type === 'line');\n // Update domain of y scale for the line mark.\n const r = (I) => (0, d3_array_1.max)(I, (i) => +Y[i]) / (0, d3_array_1.min)(I, (i) => +Y[i]);\n const k = (0, d3_array_1.max)((0, d3_array_1.rollup)(I, r, (i) => S[i]).values());\n const domainY = [1 / k, k];\n (0, util_1.deepMix)(lineMark, {\n scale: { y: { domain: domainY } },\n });\n // Update normalize options.\n const normalizeY = maybeTransform(lineMark);\n normalizeY.groupBy = 'color';\n normalizeY.basis = (I, Y) => {\n const i = I[(0, d3_array_1.bisector)((i) => X[+i]).center(I, date)];\n return Y[i];\n };\n // Disable animation.\n for (const mark of clonedOptions.marks)\n mark.animate = false;\n return clonedOptions;\n });\n const newState = yield update('chartIndex');\n newView = newState.view;\n });\n // Only apply translate to update basis for each line.\n // If performance is ok, there is no need to use this\n // strategy to update basis.\n const updateBasisByTranslate = (focus) => {\n // Find the closetDate to the rule.\n const { scale, coordinate } = newView;\n const { x: scaleX, y: scaleY } = scale;\n const date = dateByFocus(coordinate, scaleX, focus);\n updateRule(focus, date);\n // Translate mark and label for better performance.\n for (const line of lines) {\n // Compute transform in y direction.\n const { seriesIndex: SI, key } = line.__data__;\n const i = SI[(0, d3_array_1.bisector)((i) => X[+i]).center(SI, date)];\n const p0 = [0, scaleY.map(1)]; // basis point\n const p1 = [0, scaleY.map(Y[i] / Y[SI[0]])];\n const [, y0] = coordinate.map(p0);\n const [, y1] = coordinate.map(p1);\n const dy = y0 - y1;\n line.setAttribute('transform', `translate(0, ${dy})`);\n // Update line and related label.\n const labels = keyLabels.get(key) || [];\n for (const label of labels) {\n // @todo Replace with style.transform.\n // It now has unexpected behavior.\n label.setAttribute('dy', dy);\n }\n }\n };\n const updateBasis = (0, util_1.throttle)((event) => {\n const focus = (0, utils_1.mousePosition)(plotArea, event);\n if (!focus)\n return;\n updateBasisByTranslate(focus);\n }, wait, { leading, trailing });\n updateBasisByRerender([0, 0]);\n plotArea.addEventListener('pointerenter', updateBasis);\n plotArea.addEventListener('pointermove', updateBasis);\n plotArea.addEventListener('pointerleave', updateBasis);\n return () => {\n rule.remove();\n plotArea.removeEventListener('pointerenter', updateBasis);\n plotArea.removeEventListener('pointermove', updateBasis);\n plotArea.removeEventListener('pointerleave', updateBasis);\n };\n };\n}\nexports.ChartIndex = ChartIndex;\nChartIndex.props = {\n reapplyWhenUpdate: true,\n};\n//# sourceMappingURL=chartIndex.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Fisheye = void 0;\nconst util_1 = require(\"@antv/util\");\nconst utils_1 = require(\"./utils\");\nfunction maybeCoordinate(options) {\n const { coordinate = {} } = options;\n const { transform = [] } = coordinate;\n const fisheye = transform.find((d) => d.type === 'fisheye');\n if (fisheye)\n return fisheye;\n const newFisheye = { type: 'fisheye' };\n transform.push(newFisheye);\n coordinate.transform = transform;\n options.coordinate = coordinate;\n return newFisheye;\n}\n/**\n * @todo Bind abstract data or data index.\n */\nfunction Fisheye({ wait = 30, leading, trailing = false, }) {\n return (context) => {\n const { options, update, setState, container } = context;\n const plotArea = (0, utils_1.selectPlotArea)(container);\n const updateFocus = (0, util_1.throttle)((event) => {\n const focus = (0, utils_1.mousePosition)(plotArea, event);\n if (!focus) {\n setState('fisheye');\n update();\n return;\n }\n setState('fisheye', (options) => {\n // Clone options and mutate it.\n // Disable animation.\n const clonedOptions = (0, util_1.deepMix)({}, options, {\n interaction: { tooltip: { preserve: true } },\n });\n for (const mark of clonedOptions.marks)\n mark.animate = false;\n const [x, y] = focus;\n const fisheye = maybeCoordinate(clonedOptions);\n fisheye.focusX = x;\n fisheye.focusY = y;\n fisheye.visual = true;\n return clonedOptions;\n });\n update();\n }, wait, { leading, trailing });\n // Bind events.\n plotArea.addEventListener('pointerenter', updateFocus);\n plotArea.addEventListener('pointermove', updateFocus);\n plotArea.addEventListener('pointerleave', updateFocus);\n return () => {\n plotArea.removeEventListener('pointerenter', updateFocus);\n plotArea.removeEventListener('pointermove', updateFocus);\n plotArea.removeEventListener('pointerleave', updateFocus);\n };\n };\n}\nexports.Fisheye = Fisheye;\n//# sourceMappingURL=fisheye.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Tooltip = exports.tooltip = exports.seriesTooltip = exports.findSeriesElement = exports.findSingleElement = exports.maybeValue = void 0;\nconst g_1 = require(\"@antv/g\");\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst util_1 = require(\"@antv/util\");\nconst component_1 = require(\"@antv/component\");\nconst helper_1 = require(\"../utils/helper\");\nconst coordinate_1 = require(\"../utils/coordinate\");\nconst vector_1 = require(\"../utils/vector\");\nconst scale_1 = require(\"../utils/scale\");\nconst transform_1 = require(\"../runtime/transform\");\nconst utils_1 = require(\"./utils\");\nfunction getContainer(group, mount) {\n if (mount) {\n return typeof mount === 'string' ? document.querySelector(mount) : mount;\n }\n const canvas = group.ownerDocument.defaultView\n .getContextService()\n .getDomElement();\n return canvas.parentElement;\n}\nfunction getBounding(root) {\n const bbox = root.getRenderBounds();\n const { min: [x1, y1], max: [x2, y2], } = bbox;\n return {\n x: x1,\n y: y1,\n width: x2 - x1,\n height: y2 - y1,\n };\n}\nfunction getContainerOffset(container1, container2) {\n const r1 = container1.getBoundingClientRect();\n const r2 = container2.getBoundingClientRect();\n return {\n x: r1.x - r2.x,\n y: r1.y - r2.y,\n };\n}\nfunction createTooltip(container, x0, y0, position, enterable, bounding, containerOffset, css = {}, offset = [10, 10]) {\n const defaults = {\n '.g2-tooltip': {},\n '.g2-tooltip-title': {\n overflow: 'hidden',\n 'white-space': 'nowrap',\n 'text-overflow': 'ellipsis',\n },\n };\n const tooltipElement = new component_1.Tooltip({\n className: 'tooltip',\n style: {\n x: x0,\n y: y0,\n container: containerOffset,\n data: [],\n bounding,\n position,\n enterable,\n title: '',\n offset,\n template: {\n prefixCls: 'g2-',\n },\n style: (0, util_1.deepMix)(defaults, css),\n },\n });\n container.appendChild(tooltipElement.HTMLTooltipElement);\n return tooltipElement;\n}\nfunction showTooltip({ root, data, x, y, render, event, single, position = 'right-bottom', enterable = false, css, mount, bounding, offset, }) {\n const container = getContainer(root, mount);\n const canvasContainer = getContainer(root);\n // All the views share the same tooltip.\n const parent = single ? canvasContainer : root;\n const b = bounding || getBounding(root);\n const containerOffset = getContainerOffset(canvasContainer, container);\n const { tooltipElement = createTooltip(container, x, y, position, enterable, b, containerOffset, css, offset), } = parent;\n const { items, title = '' } = data;\n tooltipElement.update(Object.assign({ x,\n y, data: items, title,\n position,\n enterable, container: containerOffset }, (render !== undefined && {\n content: render(event, { items, title }),\n })));\n parent.tooltipElement = tooltipElement;\n}\nfunction hideTooltip({ root, single, emitter, nativeEvent = true, event = null, }) {\n if (nativeEvent) {\n emitter.emit('tooltip:hide', { nativeEvent });\n }\n const container = getContainer(root);\n const parent = single ? container : root;\n const { tooltipElement } = parent;\n if (tooltipElement) {\n // Must be clientX, clientY.\n tooltipElement.hide(event === null || event === void 0 ? void 0 : event.clientX, event === null || event === void 0 ? void 0 : event.clientY);\n }\n hideRuleY(root);\n hideRuleX(root);\n hideMarker(root);\n}\nfunction destroyTooltip({ root, single }) {\n const container = getContainer(root);\n const parent = single ? container : root;\n if (!parent)\n return;\n const { tooltipElement } = parent;\n if (tooltipElement) {\n tooltipElement.destroy();\n parent.tooltipElement = undefined;\n }\n hideRuleY(root);\n hideRuleX(root);\n hideMarker(root);\n}\nfunction showUndefined(item) {\n const { value } = item;\n return Object.assign(Object.assign({}, item), { value: value === undefined ? 'undefined' : value });\n}\nfunction singleItem(element) {\n const { __data__: datum } = element;\n const { title, items = [] } = datum;\n const newItems = items\n .filter(helper_1.defined)\n .map((_a) => {\n var { color = itemColorOf(element) } = _a, item = __rest(_a, [\"color\"]);\n return (Object.assign(Object.assign({}, item), { color }));\n })\n .map(showUndefined);\n return Object.assign(Object.assign({}, (title && { title })), { items: newItems });\n}\nfunction itemColorOf(element) {\n const fill = element.getAttribute('fill');\n const stroke = element.getAttribute('stroke');\n const { __data__: datum } = element;\n const { color = fill && fill !== 'transparent' ? fill : stroke } = datum;\n return color;\n}\nfunction unique(items, key = (d) => d) {\n const valueName = new Map(items.map((d) => [key(d), d]));\n return Array.from(valueName.values());\n}\nfunction groupItems(elements, scale, groupName, data = elements.map((d) => d['__data__']), theme = {}) {\n const key = (d) => (d instanceof Date ? +d : d);\n const T = unique(data.map((d) => d.title), key).filter(helper_1.defined);\n const newItems = data\n .flatMap((datum, i) => {\n const element = elements[i];\n const { items = [], title } = datum;\n const definedItems = items.filter(helper_1.defined);\n // If there is only one item, use groupName as title by default.\n const useGroupName = groupName !== undefined ? groupName : items.length <= 1 ? true : false;\n return definedItems.map((_a) => {\n var { color = itemColorOf(element) || theme.color, name } = _a, item = __rest(_a, [\"color\", \"name\"]);\n const groupName = (0, helper_1.groupNameOf)(scale, datum);\n // callback's priority is higher than groupName.\n const name1 = useGroupName && !(transform_1.CALLBACK_ITEM_SYMBOL in item)\n ? groupName || name\n : name || groupName;\n return Object.assign(Object.assign({}, item), { color, name: name1 || title });\n });\n })\n .map(showUndefined);\n return Object.assign(Object.assign({}, (T.length > 0 && { title: T.join(',') })), { items: unique(newItems, (d) => `(${key(d.name)}, ${key(d.value)}, ${key(d.color)})`) });\n}\nfunction updateRuleX(root, points, mouse, _a) {\n var { plotWidth, plotHeight, mainWidth, mainHeight, startX, startY, transposed, polar, insetLeft, insetTop } = _a, rest = __rest(_a, [\"plotWidth\", \"plotHeight\", \"mainWidth\", \"mainHeight\", \"startX\", \"startY\", \"transposed\", \"polar\", \"insetLeft\", \"insetTop\"]);\n const defaults = Object.assign({ lineWidth: 1, stroke: '#1b1e23', strokeOpacity: 0.5 }, rest);\n const createCircle = (cx, cy, r) => {\n const circle = new g_1.Circle({\n style: Object.assign({ cx,\n cy,\n r }, defaults),\n });\n root.appendChild(circle);\n return circle;\n };\n const createLine = (x1, x2, y1, y2) => {\n const line = new g_1.Line({\n style: Object.assign({ x1,\n x2,\n y1,\n y2 }, defaults),\n });\n root.appendChild(line);\n return line;\n };\n const minDistPoint = (mouse, points) => {\n // only one point do not need compute\n if (points.length === 1) {\n return points[0];\n }\n const dists = points.map((p) => (0, vector_1.dist)(p, mouse));\n const minDistIndex = (0, d3_array_1.minIndex)(dists, (d) => d);\n return points[minDistIndex];\n };\n const target = minDistPoint(mouse, points);\n const pointsOf = () => {\n if (transposed)\n return [\n startX + target[0],\n startX + target[0],\n startY,\n startY + plotHeight,\n ];\n return [startX, startX + plotWidth, target[1] + startY, target[1] + startY];\n };\n const pointsOfPolar = () => {\n const cx = startX + insetLeft + mainWidth / 2;\n const cy = startY + insetTop + mainHeight / 2;\n const cdist = (0, vector_1.dist)([cx, cy], target);\n return [cx, cy, cdist];\n };\n if (polar) {\n const [cx, cy, r] = pointsOfPolar();\n const ruleX = root.ruleX || createCircle(cx, cy, r);\n ruleX.style.cx = cx;\n ruleX.style.cy = cy;\n ruleX.style.r = r;\n root.ruleX = ruleX;\n }\n else {\n const [x1, x2, y1, y2] = pointsOf();\n const ruleX = root.ruleX || createLine(x1, x2, y1, y2);\n ruleX.style.x1 = x1;\n ruleX.style.x2 = x2;\n ruleX.style.y1 = y1;\n ruleX.style.y2 = y2;\n root.ruleX = ruleX;\n }\n}\nfunction updateRuleY(root, points, _a) {\n var { plotWidth, plotHeight, mainWidth, mainHeight, startX, startY, transposed, polar, insetLeft, insetTop } = _a, rest = __rest(_a, [\"plotWidth\", \"plotHeight\", \"mainWidth\", \"mainHeight\", \"startX\", \"startY\", \"transposed\", \"polar\", \"insetLeft\", \"insetTop\"]);\n const defaults = Object.assign({ lineWidth: 1, stroke: '#1b1e23', strokeOpacity: 0.5 }, rest);\n const Y = points.map((p) => p[1]);\n const X = points.map((p) => p[0]);\n const y = (0, d3_array_1.mean)(Y);\n const x = (0, d3_array_1.mean)(X);\n const pointsOf = () => {\n if (polar) {\n const r = Math.min(mainWidth, mainHeight) / 2;\n const cx = startX + insetLeft + mainWidth / 2;\n const cy = startY + insetTop + mainHeight / 2;\n const a = (0, vector_1.angle)((0, vector_1.sub)([x, y], [cx, cy]));\n const x0 = cx + r * Math.cos(a);\n const y0 = cy + r * Math.sin(a);\n return [cx, x0, cy, y0];\n }\n if (transposed)\n return [startX, startX + plotWidth, y + startY, y + startY];\n return [x + startX, x + startX, startY, startY + plotHeight];\n };\n const [x1, x2, y1, y2] = pointsOf();\n const createLine = () => {\n const line = new g_1.Line({\n style: Object.assign({ x1,\n x2,\n y1,\n y2 }, defaults),\n });\n root.appendChild(line);\n return line;\n };\n // Only update rule with defined series elements.\n if (X.length > 0) {\n const ruleY = root.ruleY || createLine();\n ruleY.style.x1 = x1;\n ruleY.style.x2 = x2;\n ruleY.style.y1 = y1;\n ruleY.style.y2 = y2;\n root.ruleY = ruleY;\n }\n}\nfunction hideRuleY(root) {\n if (root.ruleY) {\n root.ruleY.remove();\n root.ruleY = undefined;\n }\n}\nfunction hideRuleX(root) {\n if (root.ruleX) {\n root.ruleX.remove();\n root.ruleX = undefined;\n }\n}\nfunction updateMarker(root, { data, style, theme }) {\n if (root.markers)\n root.markers.forEach((d) => d.remove());\n const { type = '' } = style;\n const markers = data\n .filter((d) => {\n const [{ x, y }] = d;\n return (0, helper_1.defined)(x) && (0, helper_1.defined)(y);\n })\n .map((d) => {\n const [{ color, element }, point] = d;\n const originColor = color || // encode value\n element.style.fill ||\n element.style.stroke ||\n theme.color;\n const fill = type === 'hollow' ? 'transparent' : originColor;\n const stroke = type === 'hollow' ? originColor : '#fff';\n const shape = new g_1.Circle({\n className: 'g2-tooltip-marker',\n style: Object.assign({ cx: point[0], cy: point[1], fill, r: 4, stroke, lineWidth: 2, \n // Prevents blocking clicks on elements behind.\n pointerEvents: 'none' }, style),\n });\n return shape;\n });\n for (const marker of markers)\n root.appendChild(marker);\n root.markers = markers;\n}\nfunction hideMarker(root) {\n if (root.markers) {\n root.markers.forEach((d) => d.remove());\n root.markers = [];\n }\n}\nfunction interactionKeyof(markState, key) {\n return Array.from(markState.values()).some(\n // @ts-ignore\n (d) => { var _a; return (_a = d.interaction) === null || _a === void 0 ? void 0 : _a[key]; });\n}\nfunction maybeValue(specified, defaults) {\n return specified === undefined ? defaults : specified;\n}\nexports.maybeValue = maybeValue;\nfunction isEmptyTooltipData(data) {\n const { title, items } = data;\n if (items.length === 0 && title === undefined)\n return true;\n return false;\n}\nfunction hasSeries(markState) {\n return Array.from(markState.values()).some(\n // @ts-ignore\n (d) => { var _a; return ((_a = d.interaction) === null || _a === void 0 ? void 0 : _a.seriesTooltip) && d.tooltip; });\n}\n/**\n * Finds a single element based on the mouse event in a non-series context (e.g., single item tooltip).\n * @param root - The root display object of the chart.\n * @param event - The mouse event object (e.g., pointermove, pointerdown).\n * @param elements - Array of chart elements to search within.\n * @param coordinate - The coordinate system of the chart (e.g., Cartesian, polar).\n * @param scale - The scale configurations (e.g., x, series scales).\n * @param shared - Whether the tooltip is shared among multiple elements (e.g., grouped bars).\n * @returns The matched display object or `undefined` if no element is found.\n * @description\n * - Handles bar charts by sorting elements and using bisector search for efficient lookup.\n * - For non-bar charts, directly finds the target element from the event's target.\n * - Adjusts for bar spacing in grouped charts when `shared` is false.\n */\nfunction findSingleElement({ root, event, elements, coordinate, scale, shared, }) {\n var _a, _b;\n const inInterval = (d) => d.markType === 'interval';\n const isBar = elements.every(inInterval) && !(0, coordinate_1.isPolar)(coordinate);\n const scaleX = scale.x;\n const scaleSeries = scale.series;\n const bandWidth = (_b = (_a = scaleX === null || scaleX === void 0 ? void 0 : scaleX.getBandWidth) === null || _a === void 0 ? void 0 : _a.call(scaleX)) !== null && _b !== void 0 ? _b : 0;\n const xof = scaleSeries\n ? (d) => {\n const seriesCount = Math.round(1 / scaleSeries.valueBandWidth);\n return (d.__data__.x +\n d.__data__.series * bandWidth +\n bandWidth / (seriesCount * 2));\n }\n : (d) => d.__data__.x + bandWidth / 2;\n // Sort for bisector search.\n if (isBar)\n elements.sort((a, b) => xof(a) - xof(b));\n const findElementByTarget = (event) => {\n const { target } = event;\n return (0, utils_1.maybeRoot)(target, (node) => {\n if (!node.classList)\n return false;\n return node.classList.includes('element');\n });\n };\n const element = isBar\n ? (event) => {\n const mouse = (0, utils_1.mousePosition)(root, event);\n if (!mouse)\n return;\n const [abstractX] = coordinate.invert(mouse);\n const search = (0, d3_array_1.bisector)(xof).center;\n const i = search(elements, abstractX);\n const target = elements[i];\n if (!shared) {\n // For grouped bar chart without shared options.\n const isGrouped = elements.find((d) => d !== target && xof(d) === xof(target));\n if (isGrouped)\n return findElementByTarget(event);\n }\n return target;\n }\n : findElementByTarget;\n return element(event);\n}\nexports.findSingleElement = findSingleElement;\n/**\n * Finds series-related elements and data based on the mouse event for series tooltips.\n * @param root - The root display object of the chart.\n * @param event - The mouse event object (e.g., pointermove, pointerdown).\n * @param elements - Array of chart elements to search within.\n * @param coordinate - The coordinate system of the chart (e.g., Cartesian, polar).\n * @param scale - The scale configurations (e.g., x, series scales).\n * @param startX - The starting X position of the plot area.\n * @param startY - The starting Y position of the plot area.\n * @returns An object containing:\n * - `selectedElements`: Matched display objects (series and item elements).\n * - `selectedData`: Corresponding data records of the selected elements.\n * - `filteredSeriesData`: Filtered series data closest to the mouse focus.\n * - `abstractX`: A function to convert mouse coordinates to abstract X values.\n * @description\n * - Splits elements into series and item elements for targeted searching.\n * - Handles bar charts and band scales using bisector search and coordinate inversion.\n * - Sorts elements to ensure correct visual ordering (top-to-bottom or right-to-left in transposed mode).\n * - Filters and groups data to provide accurate tooltip information for series.\n */\nfunction findSeriesElement({ root, event, elements, coordinate, scale, startX, startY, }) {\n const transposed = (0, coordinate_1.isTranspose)(coordinate);\n // Split elements into series elements and item elements.\n const seriesElements = [];\n const itemElements = [];\n for (const element of elements) {\n const { __data__: data } = element;\n const { seriesX, title, items } = data;\n if (seriesX)\n seriesElements.push(element);\n else if (title || items)\n itemElements.push(element);\n }\n const inInterval = (d) => d.markType === 'interval';\n const isBar = itemElements.length &&\n itemElements.every(inInterval) &&\n !(0, coordinate_1.isPolar)(coordinate);\n const xof = (d) => d.__data__.x;\n // For band scale x, find the closest series element to focus,\n // useful for interval + line mark.\n const isBandScale = !!scale.x.getBandWidth;\n const closest = isBandScale && itemElements.length > 0;\n // Sorted elements from top to bottom visually,\n // or from right to left in transpose coordinate.\n seriesElements.sort((a, b) => {\n const index = transposed ? 0 : 1;\n const minY = (d) => d.getBounds().min[index];\n return transposed ? minY(b) - minY(a) : minY(a) - minY(b);\n });\n const extent = (d) => {\n const index = transposed ? 1 : 0;\n const { min, max } = d.getLocalBounds();\n return (0, d3_array_1.sort)([min[index], max[index]]);\n };\n // Sort itemElements for bisector search.\n if (isBar)\n elements.sort((a, b) => xof(a) - xof(b));\n else {\n itemElements.sort((a, b) => {\n const [minA, maxA] = extent(a);\n const [minB, maxB] = extent(b);\n const midA = (minA + maxA) / 2;\n const midB = (minB + maxB) / 2;\n return transposed ? midB - midA : midA - midB;\n });\n }\n // Get sortedIndex and X for each series elements\n const elementSortedX = new Map(seriesElements.map((element) => {\n const { __data__: data } = element;\n const { seriesX } = data;\n const seriesIndex = seriesX.map((_, i) => i);\n const sortedIndex = (0, d3_array_1.sort)(seriesIndex, (i) => seriesX[+i]);\n return [element, [sortedIndex, seriesX]];\n }));\n const { x: scaleX } = scale;\n // Apply offset for band scale x.\n const offsetX = (scaleX === null || scaleX === void 0 ? void 0 : scaleX.getBandWidth) ? scaleX.getBandWidth() / 2 : 0;\n const abstractX = (focus) => {\n const [normalizedX] = coordinate.invert(focus);\n return normalizedX - offsetX;\n };\n const indexByFocus = (event, focus, I, X) => {\n // _x is from emit event, to find the right element.\n const { _x } = event;\n const finalX = _x !== undefined ? scaleX.map(_x) : abstractX(focus);\n const DX = X.filter(helper_1.defined);\n const [minX, maxX] = (0, d3_array_1.sort)([DX[0], DX[DX.length - 1]]);\n // If only has one element(minX == maxX), show tooltip when hover whole chart\n const isOnlyOneElement = minX === maxX;\n // If closest is true, always find at least one element.\n // Otherwise, skip element out of plot area.\n if (!closest && (finalX < minX || finalX > maxX) && !isOnlyOneElement)\n return null;\n const search = (0, d3_array_1.bisector)((i) => X[+i]).center;\n const i = search(I, finalX);\n return I[i];\n };\n const elementsByFocus = isBar\n ? (focus, elements) => {\n const search = (0, d3_array_1.bisector)(xof).center;\n const i = search(elements, abstractX(focus));\n const find = elements[i];\n const groups = (0, d3_array_1.group)(elements, xof);\n const selected = groups.get(xof(find));\n return selected;\n }\n : (focus, elements) => {\n const index = transposed ? 1 : 0;\n const x = focus[index];\n const filtered = elements.filter((element) => {\n const [min, max] = extent(element);\n return x >= min && x <= max;\n });\n // If closet is true, always find at least one element.\n if (!closest || filtered.length > 0)\n return filtered;\n // Search the closet element to the focus.\n const search = (0, d3_array_1.bisector)((element) => {\n const [min, max] = extent(element);\n return (min + max) / 2;\n }).center;\n const i = search(elements, x);\n return [elements[i]].filter(helper_1.defined);\n };\n const seriesData = (element, index) => {\n const { __data__: data } = element;\n return Object.fromEntries(Object.entries(data)\n .filter(([key]) => key.startsWith('series') && key !== 'series')\n .map(([key, V]) => {\n const d = V[index];\n return [(0, util_1.lowerFirst)(key.replace('series', '')), d];\n }));\n };\n const mouse = (0, utils_1.mousePosition)(root, event);\n if (!mouse)\n return;\n const focus = [mouse[0] - startX, mouse[1] - startY];\n if (!focus)\n return;\n // Get selected item element.\n const selectedItems = elementsByFocus(focus, itemElements);\n // Get selected data item from both series element and item element.\n const selectedSeriesElements = [];\n const selectedSeriesData = [];\n for (const element of seriesElements) {\n const [sortedIndex, X] = elementSortedX.get(element);\n const index = indexByFocus(event, focus, sortedIndex, X);\n if (index !== null) {\n selectedSeriesElements.push(element);\n const d = seriesData(element, index);\n const { x, y } = d;\n const p = coordinate.map([(x || 0) + offsetX, y || 0]);\n selectedSeriesData.push([Object.assign(Object.assign({}, d), { element }), p]);\n }\n }\n // Filter selectedSeriesData with different x,\n // make sure there is only one x closest to focusX.\n const SX = Array.from(new Set(selectedSeriesData.map((d) => d[0].x)));\n const closestX = SX[(0, d3_array_1.minIndex)(SX, (x) => Math.abs(x - abstractX(focus)))];\n const filteredSeriesData = selectedSeriesData.filter((d) => d[0].x === closestX);\n const selectedData = [\n ...filteredSeriesData.map((d) => d[0]),\n ...selectedItems.map((d) => d.__data__),\n ];\n // Get the displayed tooltip data.\n const selectedElements = [...selectedSeriesElements, ...selectedItems];\n return { selectedElements, selectedData, filteredSeriesData, abstractX };\n}\nexports.findSeriesElement = findSeriesElement;\n/**\n * Show tooltip for series item.\n */\nfunction seriesTooltip(root, _a) {\n var { elements: elementsof, sort: sortFunction, filter: filterFunction, scale, coordinate, crosshairs, crosshairsX, crosshairsY, render, groupName, emitter, wait = 50, leading = true, trailing = false, startX = 0, startY = 0, body = true, single = true, position, enterable, mount, bounding, theme, offset, disableNative = false, marker = true, preserve = false, style: _style = {}, css = {} } = _a, rest = __rest(_a, [\"elements\", \"sort\", \"filter\", \"scale\", \"coordinate\", \"crosshairs\", \"crosshairsX\", \"crosshairsY\", \"render\", \"groupName\", \"emitter\", \"wait\", \"leading\", \"trailing\", \"startX\", \"startY\", \"body\", \"single\", \"position\", \"enterable\", \"mount\", \"bounding\", \"theme\", \"offset\", \"disableNative\", \"marker\", \"preserve\", \"style\", \"css\"]);\n const elements = elementsof(root);\n const style = (0, util_1.deepMix)(_style, rest);\n const polar = (0, coordinate_1.isPolar)(coordinate);\n const transposed = (0, coordinate_1.isTranspose)(coordinate);\n const { innerWidth: plotWidth, innerHeight: plotHeight, width: mainWidth, height: mainHeight, insetLeft, insetTop, } = coordinate.getOptions();\n const update = (0, util_1.throttle)((event) => {\n var _a;\n const mouse = (0, utils_1.mousePosition)(root, event);\n if (!mouse)\n return;\n const bbox = (0, utils_1.bboxOf)(root);\n const x = bbox.min[0];\n const y = bbox.min[1];\n const { selectedElements, selectedData, filteredSeriesData, abstractX } = findSeriesElement({\n root,\n event,\n elements,\n coordinate,\n scale,\n startX,\n startY,\n });\n const tooltipData = groupItems(selectedElements, scale, groupName, selectedData, theme);\n // Sort items and filter items.\n if (sortFunction) {\n tooltipData.items.sort((a, b) => sortFunction(a) - sortFunction(b));\n }\n if (filterFunction) {\n tooltipData.items = tooltipData.items.filter(filterFunction);\n }\n // Hide tooltip with no selected tooltip.\n if (selectedElements.length === 0 || isEmptyTooltipData(tooltipData)) {\n hide(event);\n return;\n }\n if (body) {\n showTooltip({\n root,\n data: tooltipData,\n x: mouse[0] + x,\n y: mouse[1] + y,\n render,\n event,\n single,\n position,\n enterable,\n mount,\n bounding,\n css,\n offset,\n });\n }\n if (crosshairs || crosshairsX || crosshairsY) {\n const ruleStyle = (0, helper_1.subObject)(style, 'crosshairs');\n const ruleStyleX = Object.assign(Object.assign({}, ruleStyle), (0, helper_1.subObject)(style, 'crosshairsX'));\n const ruleStyleY = Object.assign(Object.assign({}, ruleStyle), (0, helper_1.subObject)(style, 'crosshairsY'));\n const points = filteredSeriesData.map((d) => d[1]);\n if (crosshairsX) {\n updateRuleX(root, points, mouse, Object.assign(Object.assign({}, ruleStyleX), { plotWidth,\n plotHeight,\n mainWidth,\n mainHeight,\n insetLeft,\n insetTop,\n startX,\n startY,\n transposed,\n polar }));\n }\n if (crosshairsY) {\n updateRuleY(root, points, Object.assign(Object.assign({}, ruleStyleY), { plotWidth,\n plotHeight,\n mainWidth,\n mainHeight,\n insetLeft,\n insetTop,\n startX,\n startY,\n transposed,\n polar }));\n }\n }\n if (marker) {\n const markerStyles = (0, helper_1.subObject)(style, 'marker');\n updateMarker(root, {\n data: filteredSeriesData,\n style: markerStyles,\n theme,\n });\n }\n // X in focus may related multiple points when dataset is large,\n // so we need to find the first x to show tooltip.\n const firstX = (_a = filteredSeriesData[0]) === null || _a === void 0 ? void 0 : _a[0].x;\n const transformedX = firstX !== null && firstX !== void 0 ? firstX : abstractX(focus);\n emitter.emit('tooltip:show', Object.assign(Object.assign({}, event), { nativeEvent: true, data: Object.assign(Object.assign({}, tooltipData), { data: { x: (0, scale_1.invert)(scale.x, transformedX, true) } }) }));\n }, wait, { leading, trailing });\n const hide = (event) => {\n hideTooltip({ root, single, emitter, event });\n };\n const destroy = () => {\n destroyTooltip({ root, single });\n };\n const onTooltipShow = (_a) => {\n var _b;\n var { nativeEvent, data, offsetX, offsetY } = _a, rest = __rest(_a, [\"nativeEvent\", \"data\", \"offsetX\", \"offsetY\"]);\n if (nativeEvent)\n return;\n const x = (_b = data === null || data === void 0 ? void 0 : data.data) === null || _b === void 0 ? void 0 : _b.x;\n const scaleX = scale.x;\n const x1 = scaleX.map(x);\n const [x2, y2] = coordinate.map([x1, 0.5]);\n const rootBounds = root.getRenderBounds();\n const minX = rootBounds.min[0];\n const minY = rootBounds.min[1];\n update(Object.assign(Object.assign({}, rest), { offsetX: offsetX !== undefined ? offsetX : minX + x2, offsetY: offsetY !== undefined ? offsetY : minY + y2, _x: x }));\n };\n const onTooltipHide = () => {\n hideTooltip({ root, single, emitter, nativeEvent: false });\n };\n const onTooltipDisable = () => {\n removeEventListeners();\n destroy();\n };\n const onTooltipEnable = () => {\n addEventListeners();\n };\n const addEventListeners = () => {\n if (!disableNative) {\n root.addEventListener('pointerdown', update);\n root.addEventListener('pointerenter', update);\n root.addEventListener('pointermove', update);\n // Only emit pointerleave event when the pointer is not in the root area.\n root.addEventListener('pointerleave', (e) => {\n if ((0, utils_1.mousePosition)(root, e))\n return;\n hide(e);\n });\n root.addEventListener('pointerup', hide);\n }\n };\n const removeEventListeners = () => {\n if (!disableNative) {\n root.removeEventListener('pointerdown', update);\n root.removeEventListener('pointerenter', update);\n root.removeEventListener('pointermove', update);\n root.removeEventListener('pointerleave', hide);\n root.removeEventListener('pointerup', hide);\n }\n };\n addEventListeners();\n emitter.on('tooltip:show', onTooltipShow);\n emitter.on('tooltip:hide', onTooltipHide);\n emitter.on('tooltip:disable', onTooltipDisable);\n emitter.on('tooltip:enable', onTooltipEnable);\n return () => {\n removeEventListeners();\n emitter.off('tooltip:show', onTooltipShow);\n emitter.off('tooltip:hide', onTooltipHide);\n emitter.off('tooltip:disable', onTooltipDisable);\n emitter.off('tooltip:enable', onTooltipEnable);\n if (preserve) {\n hideTooltip({ root, single, emitter, nativeEvent: false });\n }\n else {\n destroy();\n }\n };\n}\nexports.seriesTooltip = seriesTooltip;\n/**\n * Show tooltip for non-series item.\n */\nfunction tooltip(root, { elements: elementsof, coordinate, scale, render, groupName, sort: sortFunction, filter: filterFunction, emitter, wait = 50, leading = true, trailing = false, groupKey = (d) => d, // group elements by specified key\nsingle = true, position, enterable, datum, view, mount, bounding, theme, offset, shared = false, body = true, disableNative = false, preserve = false, css = {}, }) {\n const elements = elementsof(root);\n const keyGroup = (0, d3_array_1.group)(elements, groupKey);\n const pointermove = (0, util_1.throttle)((event) => {\n const element = findSingleElement({\n root,\n event,\n elements,\n coordinate,\n scale,\n shared,\n });\n if (!element) {\n hideTooltip({ root, single, emitter, event });\n return;\n }\n const k = groupKey(element);\n const group = keyGroup.get(k);\n if (!group) {\n return;\n }\n const data = group.length === 1 && !shared\n ? singleItem(group[0])\n : groupItems(group, scale, groupName, undefined, theme);\n // Sort items and sort.\n if (sortFunction) {\n data.items.sort((a, b) => sortFunction(a) - sortFunction(b));\n }\n if (filterFunction) {\n data.items = data.items.filter(filterFunction);\n }\n if (isEmptyTooltipData(data)) {\n hideTooltip({ root, single, emitter, event });\n return;\n }\n const { offsetX, offsetY } = event;\n if (body) {\n showTooltip({\n root,\n data,\n x: offsetX,\n y: offsetY,\n render,\n event,\n single,\n position,\n enterable,\n mount,\n bounding,\n css,\n offset,\n });\n }\n emitter.emit('tooltip:show', Object.assign(Object.assign({}, event), { nativeEvent: true, data: Object.assign(Object.assign({}, data), { data: (0, helper_1.dataOf)(element, view) }) }));\n }, wait, { leading, trailing });\n const pointerleave = (event) => {\n hideTooltip({ root, single, emitter, event });\n };\n const addEventListeners = () => {\n if (!disableNative) {\n root.addEventListener('pointerdown', pointermove);\n root.addEventListener('pointermove', pointermove);\n // Only emit pointerleave event when the pointer is not in the root area.\n // !!!DO NOT USE pointerout event, it will emit when the pointer is in the child area.\n root.addEventListener('pointerleave', pointerleave);\n root.addEventListener('pointerup', pointerleave);\n }\n };\n const removeEventListeners = () => {\n if (!disableNative) {\n root.removeEventListener('pointerdown', pointermove);\n root.removeEventListener('pointermove', pointermove);\n root.removeEventListener('pointerleave', pointerleave);\n root.removeEventListener('pointerup', pointerleave);\n }\n };\n const onTooltipShow = ({ nativeEvent, offsetX, offsetY, data: raw }) => {\n if (nativeEvent)\n return;\n const { data } = raw;\n const element = (0, utils_1.selectElementByData)(elements, data, datum);\n if (!element)\n return;\n const bbox = element.getBBox();\n const { x, y, width, height } = bbox;\n const rootBBox = root.getBBox();\n pointermove({\n target: element,\n offsetX: offsetX !== undefined ? offsetX + rootBBox.x : x + width / 2,\n offsetY: offsetY !== undefined ? offsetY + rootBBox.y : y + height / 2,\n });\n };\n const onTooltipHide = ({ nativeEvent } = {}) => {\n if (nativeEvent)\n return;\n hideTooltip({ root, single, emitter, nativeEvent: false });\n };\n const onTooltipDisable = () => {\n removeEventListeners();\n destroyTooltip({ root, single });\n };\n const onTooltipEnable = () => {\n addEventListeners();\n };\n emitter.on('tooltip:show', onTooltipShow);\n emitter.on('tooltip:hide', onTooltipHide);\n emitter.on('tooltip:enable', onTooltipEnable);\n emitter.on('tooltip:disable', onTooltipDisable);\n addEventListeners();\n return () => {\n removeEventListeners();\n emitter.off('tooltip:show', onTooltipShow);\n emitter.off('tooltip:hide', onTooltipHide);\n if (preserve) {\n hideTooltip({ root, single, emitter, nativeEvent: false });\n }\n else {\n destroyTooltip({ root, single });\n }\n };\n}\nexports.tooltip = tooltip;\nfunction Tooltip(options) {\n const { shared, crosshairs, crosshairsX, crosshairsY, series, name, item = () => ({}), facet = false } = options, rest = __rest(options, [\"shared\", \"crosshairs\", \"crosshairsX\", \"crosshairsY\", \"series\", \"name\", \"item\", \"facet\"]);\n return (target, viewInstances, emitter) => {\n const { container, view } = target;\n const { scale, markState, coordinate, theme } = view;\n // Get default value from mark states.\n const defaultSeries = interactionKeyof(markState, 'seriesTooltip');\n const defaultShowCrosshairs = interactionKeyof(markState, 'crosshairs');\n const plotArea = (0, utils_1.selectPlotArea)(container);\n const isSeries = maybeValue(series, defaultSeries);\n const crosshairsSetting = maybeValue(crosshairs, defaultShowCrosshairs);\n // For non-facet and series tooltip.\n if (isSeries && hasSeries(markState) && !facet) {\n return seriesTooltip(plotArea, Object.assign(Object.assign({}, rest), { theme, elements: utils_1.selectG2Elements, scale,\n coordinate, crosshairs: crosshairsSetting, \n // the crosshairsX settings level: crosshairsX > crosshairs > false\n // it means crosshairsX default is false\n crosshairsX: maybeValue(maybeValue(crosshairsX, crosshairs), false), \n // crosshairsY default depend on the crossharisSettings\n crosshairsY: maybeValue(crosshairsY, crosshairsSetting), item,\n emitter }));\n }\n // For facet and series tooltip.\n if (isSeries && facet) {\n // Get sub view instances for this view.\n const facetInstances = viewInstances.filter((d) => d !== target && d.options.parentKey === target.options.key);\n const elements = (0, utils_1.selectFacetG2Elements)(target, viewInstances);\n // Use the scale of the first view.\n const scale = facetInstances[0].view.scale;\n const bbox = plotArea.getBounds();\n const startX = bbox.min[0];\n const startY = bbox.min[1];\n Object.assign(scale, { facet: true });\n // @todo Nested structure rather than flat structure for facet?\n // Add listener to the root area.\n // @ts-ignore\n return seriesTooltip(plotArea.parentNode.parentNode, Object.assign(Object.assign({}, rest), { theme, elements: () => elements, scale,\n coordinate, crosshairs: maybeValue(crosshairs, defaultShowCrosshairs), \n // the crosshairsX settings level: crosshairsX > crosshairs > false\n // it means crosshairsX default is false\n crosshairsX: maybeValue(maybeValue(crosshairsX, crosshairs), false), crosshairsY: maybeValue(crosshairsY, crosshairsSetting), item,\n startX,\n startY,\n emitter }));\n }\n return tooltip(plotArea, Object.assign(Object.assign({}, rest), { datum: (0, utils_1.createDatumof)(view), elements: utils_1.selectG2Elements, scale,\n coordinate, groupKey: shared ? (0, utils_1.createXKey)(view) : undefined, item,\n emitter,\n view,\n theme,\n shared }));\n };\n}\nexports.Tooltip = Tooltip;\nTooltip.props = {\n reapplyWhenUpdate: true,\n};\n//# sourceMappingURL=tooltip.js.map","\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LegendFilter = exports.attributesOf = exports.dataOf = exports.legendClearSetState = exports.legendsContinuousOf = exports.legendsOf = exports.itemsOf = exports.labelOf = exports.markerOf = exports.LEGEND_LABEL_CLASS_NAME = exports.LEGEND_MAKER_CLASS_NAME = exports.LEGEND_ITEMS_CLASS_NAME = exports.CONTINUOUS_LEGEND_CLASS_NAME = exports.CATEGORY_LEGEND_CLASS_NAME = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"../utils/helper\");\nconst utils_1 = require(\"./utils\");\nexports.CATEGORY_LEGEND_CLASS_NAME = 'legend-category';\nexports.CONTINUOUS_LEGEND_CLASS_NAME = 'legend-continuous';\nexports.LEGEND_ITEMS_CLASS_NAME = 'items-item';\nexports.LEGEND_MAKER_CLASS_NAME = 'legend-category-item-marker';\nexports.LEGEND_LABEL_CLASS_NAME = 'legend-category-item-label';\nfunction markerOf(item) {\n return item.getElementsByClassName(exports.LEGEND_MAKER_CLASS_NAME)[0];\n}\nexports.markerOf = markerOf;\nfunction labelOf(item) {\n return item.getElementsByClassName(exports.LEGEND_LABEL_CLASS_NAME)[0];\n}\nexports.labelOf = labelOf;\nfunction itemsOf(root) {\n return root.getElementsByClassName(exports.LEGEND_ITEMS_CLASS_NAME);\n}\nexports.itemsOf = itemsOf;\nfunction legendsOf(root) {\n return root.getElementsByClassName(exports.CATEGORY_LEGEND_CLASS_NAME);\n}\nexports.legendsOf = legendsOf;\nfunction legendsContinuousOf(root) {\n return root.getElementsByClassName(exports.CONTINUOUS_LEGEND_CLASS_NAME);\n}\nexports.legendsContinuousOf = legendsContinuousOf;\nfunction legendClearSetState(root, setState) {\n const legends = [...legendsOf(root), ...legendsContinuousOf(root)];\n legends.forEach((legend) => {\n setState(legend, (v) => v);\n });\n}\nexports.legendClearSetState = legendClearSetState;\nfunction dataOf(root) {\n // legend -> layout -> container\n let parent = root.parentNode;\n while (parent && !parent.__data__) {\n parent = parent.parentNode;\n }\n return parent.__data__;\n}\nexports.dataOf = dataOf;\nfunction attributesOf(root) {\n let child = root;\n while (child && !child.attr('class').startsWith('legend')) {\n child = child.children[0];\n }\n return child.attributes;\n}\nexports.attributesOf = attributesOf;\nfunction legendFilterOrdinal(root, { legends, // given the root of chart returns legends to be manipulated\nmarker: markerOf, // given the legend returns the marker\nlabel: labelOf, // given the legend returns the label\ndatum, // given the legend returns the value\nfilter, // invoke when dispatch filter event,\nemitter, channel, state = {}, // state options\n }) {\n // Index handler by item.\n const itemClick = new Map();\n const itemPointerenter = new Map();\n const itemPointerout = new Map();\n const { unselected = {\n markerStroke: '#aaa',\n markerFill: '#aaa',\n labelFill: '#aaa',\n }, } = state;\n const markerStyle = { unselected: (0, helper_1.subObject)(unselected, 'marker') };\n const labelStyle = { unselected: (0, helper_1.subObject)(unselected, 'label') };\n const { setState: setM, removeState: removeM } = (0, utils_1.useState)(markerStyle, undefined);\n const { setState: setL, removeState: removeL } = (0, utils_1.useState)(labelStyle, undefined);\n const items = Array.from(legends(root));\n let selectedValues = items.map(datum);\n const updateLegendState = () => {\n for (const item of items) {\n const value = datum(item);\n const marker = markerOf(item);\n const label = labelOf(item);\n if (!selectedValues.includes(value)) {\n setM(marker, 'unselected');\n setL(label, 'unselected');\n }\n else {\n removeM(marker, 'unselected');\n removeL(label, 'unselected');\n }\n }\n };\n for (const item of items) {\n // Defined handlers.\n const pointerenter = () => {\n (0, utils_1.setCursor)(root, 'pointer');\n };\n const pointerout = () => {\n (0, utils_1.restoreCursor)(root);\n };\n const click = (event) => __awaiter(this, void 0, void 0, function* () {\n const value = datum(item);\n const index = selectedValues.indexOf(value);\n if (index === -1)\n selectedValues.push(value);\n else\n selectedValues.splice(index, 1);\n yield filter(selectedValues);\n updateLegendState();\n const { nativeEvent = true } = event;\n if (!nativeEvent)\n return;\n if (selectedValues.length === items.length) {\n emitter.emit('legend:reset', { nativeEvent });\n }\n else {\n // Emit events.\n emitter.emit('legend:filter', Object.assign(Object.assign({}, event), { nativeEvent, data: {\n channel,\n values: selectedValues,\n } }));\n }\n });\n // Bind and store handlers.\n item.addEventListener('click', click);\n item.addEventListener('pointerenter', pointerenter);\n item.addEventListener('pointerout', pointerout);\n itemClick.set(item, click);\n itemPointerenter.set(item, pointerenter);\n itemPointerout.set(item, pointerout);\n }\n const onFilter = (event) => __awaiter(this, void 0, void 0, function* () {\n const { nativeEvent } = event;\n if (nativeEvent)\n return;\n const { data } = event;\n const { channel: specifiedChannel, values } = data;\n if (specifiedChannel !== channel)\n return;\n selectedValues = values;\n yield filter(selectedValues);\n updateLegendState();\n });\n const onEnd = (event) => __awaiter(this, void 0, void 0, function* () {\n const { nativeEvent } = event;\n if (nativeEvent)\n return;\n selectedValues = items.map(datum);\n yield filter(selectedValues);\n updateLegendState();\n });\n emitter.on('legend:filter', onFilter);\n emitter.on('legend:reset', onEnd);\n return () => {\n for (const item of items) {\n item.removeEventListener('click', itemClick.get(item));\n item.removeEventListener('pointerenter', itemPointerenter.get(item));\n item.removeEventListener('pointerout', itemPointerout.get(item));\n emitter.off('legend:filter', onFilter);\n emitter.off('legend:reset', onEnd);\n }\n };\n}\nfunction legendFilterContinuous(_, { legend, filter, emitter, channel }) {\n const onValueChange = ({ detail: { value } }) => {\n filter(value);\n emitter.emit({\n nativeEvent: true,\n data: {\n channel,\n values: value,\n },\n });\n };\n legend.addEventListener('valuechange', onValueChange);\n return () => {\n legend.removeEventListener('valuechange', onValueChange);\n };\n}\nfunction filterView(context, // View instance,\n{ legend, // Legend instance.\nchannel, // Filter Channel.\nvalue, // Filtered Values.\nordinal, // Data type of the legend.\nchannels, // Channels for this legend.\nallChannels, // Channels for all legends.\nfacet = false, // For facet.\n }) {\n return __awaiter(this, void 0, void 0, function* () {\n const { view, update, setState } = context;\n setState(legend, (viewOptions) => {\n const { marks } = viewOptions;\n // Add filter transform for every marks,\n // which will skip for mark without color channel.\n const newMarks = marks.map((mark) => {\n if (mark.type === 'legends')\n return mark;\n // Inset after aggregate transform, such as group, and bin.\n const { transform = [], data = [] } = mark;\n const index = transform.findIndex(({ type }) => type.startsWith('group') || type.startsWith('bin'));\n const newTransform = [...transform];\n if (data.length) {\n newTransform.splice(index + 1, 0, {\n type: 'filter',\n [channel]: { value, ordinal },\n });\n }\n // Set domain of scale to preserve encoding.\n const newScale = Object.fromEntries(channels.map((channel) => [\n channel,\n { domain: view.scale[channel].getOptions().domain },\n ]));\n return (0, util_1.deepMix)({}, mark, Object.assign(Object.assign({ transform: newTransform, scale: newScale }, (!ordinal && { animate: false })), { legend: facet\n ? false\n : Object.fromEntries(allChannels.map((d) => [d, { preserve: true }])) }));\n });\n return Object.assign(Object.assign({}, viewOptions), { marks: newMarks });\n });\n yield update();\n });\n}\nfunction filterFacets(facets, options) {\n for (const facet of facets) {\n filterView(facet, Object.assign(Object.assign({}, options), { facet: true }));\n }\n}\nfunction LegendFilter() {\n return (context, contexts, emitter) => {\n const { container } = context;\n const facets = contexts.filter((d) => d !== context);\n const isFacet = facets.length > 0;\n const channelsOf = (legend) => {\n return dataOf(legend).scales.map((d) => d.name);\n };\n const legends = [\n ...legendsOf(container),\n ...legendsContinuousOf(container),\n ];\n const allChannels = legends.flatMap(channelsOf);\n const filter = isFacet\n ? (0, util_1.throttle)(filterFacets, 50, { trailing: true })\n : (0, util_1.throttle)(filterView, 50, { trailing: true });\n const removes = legends.map((legend) => {\n const { name: channel, domain } = dataOf(legend).scales[0];\n const channels = channelsOf(legend);\n const common = {\n legend,\n channel,\n channels,\n allChannels,\n };\n if (legend.className === exports.CATEGORY_LEGEND_CLASS_NAME) {\n return legendFilterOrdinal(container, {\n legends: itemsOf,\n marker: markerOf,\n label: labelOf,\n datum: (d) => {\n const { __data__: datum } = d;\n const { index } = datum;\n return domain[index];\n },\n filter: (value) => {\n const options = Object.assign(Object.assign({}, common), { value, ordinal: true });\n if (isFacet)\n filter(facets, options);\n else\n filter(context, options);\n },\n state: legend.attributes.state,\n channel,\n emitter,\n });\n }\n else {\n return legendFilterContinuous(container, {\n legend,\n filter: (value) => {\n const options = Object.assign(Object.assign({}, common), { value, ordinal: false });\n if (isFacet)\n filter(facets, options);\n else\n filter(context, options);\n },\n emitter,\n channel,\n });\n }\n });\n return () => {\n removes.forEach((remove) => remove());\n };\n };\n}\nexports.LegendFilter = LegendFilter;\n//# sourceMappingURL=legendFilter.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LegendHighlight = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst helper_1 = require(\"../utils/helper\");\nconst utils_1 = require(\"./utils\");\nconst legendFilter_1 = require(\"./legendFilter\");\nfunction LegendHighlight() {\n return (context, _, emitter) => {\n const { container, view, options } = context;\n const legends = (0, legendFilter_1.legendsOf)(container);\n const elements = (0, utils_1.selectG2Elements)(container);\n const channelOf = (legend) => {\n return (0, legendFilter_1.dataOf)(legend).scales[0].name;\n };\n const scaleOf = (channel) => {\n const { scale: { [channel]: scale }, } = view;\n return scale;\n };\n const markState = (0, utils_1.mergeState)(options, ['active', 'inactive']);\n const valueof = (0, utils_1.createValueof)(elements, (0, utils_1.createDatumof)(view));\n const destroys = [];\n // Bind events for each legend.\n for (const legend of legends) {\n const datumOf = (item) => {\n const { data } = legend.attributes;\n const { __data__: datum } = item;\n const { index } = datum;\n return data[index].label;\n };\n const channel = channelOf(legend);\n const items = (0, legendFilter_1.itemsOf)(legend);\n const scale = scaleOf(channel);\n const elementGroup = (0, d3_array_1.group)(elements, (d) => scale.invert(d.__data__[channel]));\n const { state: legendState = {} } = legend.attributes;\n const { inactive = {} } = legendState;\n const { setState, removeState } = (0, utils_1.useState)(markState, valueof);\n // Handle styles of inner item.\n const markerStyle = { inactive: (0, helper_1.subObject)(inactive, 'marker') };\n const labelStyle = { inactive: (0, helper_1.subObject)(inactive, 'label') };\n const { setState: setM, removeState: removeM } = (0, utils_1.useState)(markerStyle);\n const { setState: setL, removeState: removeL } = (0, utils_1.useState)(labelStyle);\n const updateLegendState = (highlight) => {\n for (const item of items) {\n const marker = (0, legendFilter_1.markerOf)(item);\n const label = (0, legendFilter_1.labelOf)(item);\n if (item === highlight || highlight === null) {\n removeM(marker, 'inactive');\n removeL(label, 'inactive');\n }\n else {\n setM(marker, 'inactive');\n setL(label, 'inactive');\n }\n }\n };\n const highlightItem = (event, item) => {\n // Update UI.\n const value = datumOf(item);\n const elementSet = new Set(elementGroup.get(value));\n for (const e of elements) {\n if (elementSet.has(e))\n setState(e, 'active');\n else\n setState(e, 'inactive');\n }\n updateLegendState(item);\n // Emit events.\n const { nativeEvent = true } = event;\n if (!nativeEvent)\n return;\n emitter.emit('legend:highlight', Object.assign(Object.assign({}, event), { nativeEvent, data: { channel, value } }));\n };\n const itemPointerover = new Map();\n // Add listener for the legend items.\n for (const item of items) {\n const pointerover = (event) => {\n highlightItem(event, item);\n };\n item.addEventListener('pointerover', pointerover);\n itemPointerover.set(item, pointerover);\n }\n // Add listener for the legend group.\n const pointerleave = (event) => {\n for (const e of elements)\n removeState(e, 'inactive', 'active');\n updateLegendState(null);\n // Emit events.\n const { nativeEvent = true } = event;\n if (!nativeEvent)\n return;\n emitter.emit('legend:unhighlight', { nativeEvent });\n };\n const onHighlight = (event) => {\n const { nativeEvent, data } = event;\n if (nativeEvent)\n return;\n const { channel: specifiedChannel, value } = data;\n if (specifiedChannel !== channel)\n return;\n const item = items.find((d) => datumOf(d) === value);\n if (!item)\n return;\n highlightItem({ nativeEvent: false }, item);\n };\n const onUnHighlight = (event) => {\n const { nativeEvent } = event;\n if (nativeEvent)\n return;\n pointerleave({ nativeEvent: false });\n };\n legend.addEventListener('pointerleave', pointerleave);\n emitter.on('legend:highlight', onHighlight);\n emitter.on('legend:unhighlight', onUnHighlight);\n const destroy = () => {\n legend.removeEventListener(pointerleave);\n emitter.off('legend:highlight', onHighlight);\n emitter.off('legend:unhighlight', onUnHighlight);\n for (const [item, pointerover] of itemPointerover) {\n item.removeEventListener(pointerover);\n }\n };\n destroys.push(destroy);\n }\n return () => destroys.forEach((d) => d());\n };\n}\nexports.LegendHighlight = LegendHighlight;\n//# sourceMappingURL=legendHighlight.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BrushHighlight = exports.brushHighlight = exports.brush = void 0;\nconst g_1 = require(\"@antv/g\");\nconst helper_1 = require(\"../utils/helper\");\nconst scale_1 = require(\"../utils/scale\");\nconst createElement_1 = require(\"../utils/createElement\");\nconst selection_1 = require(\"../utils/selection\");\nconst utils_1 = require(\"./utils\");\nfunction intersect(bbox1, bbox2) {\n const [minX1, minY1, maxX1, maxY1] = bbox1;\n const [minX2, minY2, maxX2, maxY2] = bbox2;\n return !(minX2 > maxX1 || maxX2 < minX1 || minY2 > maxY1 || maxY2 < minY1);\n}\nfunction normalizeBounds(x, y, x1, y1, extent) {\n const [minX, minY, maxX, maxY] = extent;\n return [\n Math.max(minX, Math.min(x, x1)),\n Math.max(minY, Math.min(y, y1)),\n Math.min(maxX, Math.max(x, x1)),\n Math.min(maxY, Math.max(y, y1)),\n ];\n}\nfunction bboxOf(root) {\n const { width, height } = root.getBBox();\n return [0, 0, width, height];\n}\nfunction applyStyle(selection, style) {\n for (const [key, value] of Object.entries(style)) {\n selection.style(key, value);\n }\n}\nconst ResizableMask = (0, createElement_1.createElement)((g) => {\n const _a = g.attributes, { x, y, width, height, class: className, renders = {}, handleSize: size = 10, document } = _a, style = __rest(_a, [\"x\", \"y\", \"width\", \"height\", \"class\", \"renders\", \"handleSize\", \"document\"]);\n if (!document ||\n width === undefined ||\n height === undefined ||\n x === undefined ||\n y === undefined)\n return;\n const half = size / 2;\n const renderRect = (g, options, document) => {\n if (!g.handle) {\n g.handle = document.createElement('rect');\n g.append(g.handle);\n }\n const { handle } = g;\n handle.attr(options);\n return handle;\n };\n const _b = (0, helper_1.subObject)((0, helper_1.omitPrefixObject)(style, 'handleNW', 'handleNE'), 'handleN'), { render: handleNRender = renderRect } = _b, handleNStyle = __rest(_b, [\"render\"]);\n const _c = (0, helper_1.subObject)(style, 'handleE'), { render: handleERender = renderRect } = _c, handleEStyle = __rest(_c, [\"render\"]);\n const _d = (0, helper_1.subObject)((0, helper_1.omitPrefixObject)(style, 'handleSE', 'handleSW'), 'handleS'), { render: handleSRender = renderRect } = _d, handleSStyle = __rest(_d, [\"render\"]);\n const _e = (0, helper_1.subObject)(style, 'handleW'), { render: handleWRender = renderRect } = _e, handleWStyle = __rest(_e, [\"render\"]);\n const _f = (0, helper_1.subObject)(style, 'handleNW'), { render: handleNWRender = renderRect } = _f, handleNWStyle = __rest(_f, [\"render\"]);\n const _g = (0, helper_1.subObject)(style, 'handleNE'), { render: handleNERender = renderRect } = _g, handleNEStyle = __rest(_g, [\"render\"]);\n const _h = (0, helper_1.subObject)(style, 'handleSE'), { render: handleSERender = renderRect } = _h, handleSEStyle = __rest(_h, [\"render\"]);\n const _j = (0, helper_1.subObject)(style, 'handleSW'), { render: handleSWRender = renderRect } = _j, handleSWStyle = __rest(_j, [\"render\"]);\n const renderHandle = (g, renderNode) => {\n const { id } = g;\n const handle = renderNode(g, g.attributes, document);\n handle.id = id;\n handle.style.draggable = true;\n };\n const appendHandle = (handleRender) => {\n return () => {\n const Node = (0, createElement_1.createElement)((g) => renderHandle(g, handleRender));\n return new Node({});\n };\n };\n const container = (0, selection_1.select)(g)\n .attr('className', className)\n .style('transform', `translate(${x}, ${y})`)\n .style('draggable', true);\n container\n .maybeAppend('selection', 'rect')\n .style('draggable', true)\n .style('fill', 'transparent')\n .call(applyStyle, Object.assign(Object.assign({ width,\n height }, (0, helper_1.omitPrefixObject)(style, 'handle')), { transform: undefined }));\n container\n .maybeAppend('handle-n', appendHandle(handleNRender))\n .style('x', half)\n .style('y', -half)\n .style('width', width - size)\n .style('height', size)\n .style('fill', 'transparent')\n .call(applyStyle, handleNStyle);\n container\n .maybeAppend('handle-e', appendHandle(handleERender))\n .style('x', width - half)\n .style('y', half)\n .style('width', size)\n .style('height', height - size)\n .style('fill', 'transparent')\n .call(applyStyle, handleEStyle);\n container\n .maybeAppend('handle-s', appendHandle(handleSRender))\n .style('x', half)\n .style('y', height - half)\n .style('width', width - size)\n .style('height', size)\n .style('fill', 'transparent')\n .call(applyStyle, handleSStyle);\n container\n .maybeAppend('handle-w', appendHandle(handleWRender))\n .style('x', -half)\n .style('y', half)\n .style('width', size)\n .style('height', height - size)\n .style('fill', 'transparent')\n .call(applyStyle, handleWStyle);\n container\n .maybeAppend('handle-nw', appendHandle(handleNWRender))\n .style('x', -half)\n .style('y', -half)\n .style('width', size)\n .style('height', size)\n .style('fill', 'transparent')\n .call(applyStyle, handleNWStyle);\n container\n .maybeAppend('handle-ne', appendHandle(handleNERender))\n .style('x', width - half)\n .style('y', -half)\n .style('width', size)\n .style('height', size)\n .style('fill', 'transparent')\n .call(applyStyle, handleNEStyle);\n container\n .maybeAppend('handle-se', appendHandle(handleSERender))\n .style('x', width - half)\n .style('y', height - half)\n .style('width', size)\n .style('height', size)\n .style('fill', 'transparent')\n .call(applyStyle, handleSEStyle);\n container\n .maybeAppend('handle-sw', appendHandle(handleSWRender))\n .style('x', -half)\n .style('y', height - half)\n .style('width', size)\n .style('height', size)\n .style('fill', 'transparent')\n .call(applyStyle, handleSWStyle);\n});\nfunction brush(root, _a) {\n var { brushed = () => { }, brushended = () => { }, brushcreated = () => { }, brushstarted = () => { }, brushupdated = () => { }, extent = bboxOf(root), brushRegion = (x, y, x1, y1, extent) => [x, y, x1, y1], reverse = false, fill = '#777', fillOpacity = '0.3', stroke = '#fff', selectedHandles = [\n 'handle-n',\n 'handle-e',\n 'handle-s',\n 'handle-w',\n 'handle-nw',\n 'handle-ne',\n 'handle-se',\n 'handle-sw',\n ] } = _a, style = __rest(_a, [\"brushed\", \"brushended\", \"brushcreated\", \"brushstarted\", \"brushupdated\", \"extent\", \"brushRegion\", \"reverse\", \"fill\", \"fillOpacity\", \"stroke\", \"selectedHandles\"]);\n let start = null; // Start point of mask.\n let end = null; // End point of mask.\n let moveStart = null; // Start point of moving mask.\n let mask = null; // Mask instance.\n let background = null;\n let creating = false;\n const [originX, originY, width, height] = extent;\n (0, utils_1.setCursor)(root, 'crosshair');\n root.style.draggable = true; // Make it response to drag event.\n // Remove old mask and init new mask.\n const initMask = (x, y, event) => {\n brushstarted(event);\n if (mask)\n mask.remove();\n if (background)\n background.remove();\n start = [x, y];\n if (reverse)\n return initReverseMask();\n initNormalMask();\n };\n const initReverseMask = () => {\n background = new g_1.Path({\n style: Object.assign(Object.assign({}, style), { fill,\n fillOpacity,\n stroke, pointerEvents: 'none' }),\n });\n mask = new ResizableMask({\n // @ts-ignore\n style: {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n draggable: true,\n document: root.ownerDocument,\n },\n className: 'mask',\n });\n root.appendChild(background);\n root.appendChild(mask);\n };\n const initNormalMask = () => {\n mask = new ResizableMask({\n // @ts-ignore\n style: Object.assign(Object.assign({ document: root.ownerDocument, x: 0, y: 0 }, style), { fill,\n fillOpacity,\n stroke, draggable: true }),\n className: 'mask',\n });\n root.appendChild(mask);\n };\n // Remove mask and reset states.\n const removeMask = (emit = true) => {\n if (mask)\n mask.remove();\n if (background)\n background.remove();\n start = null;\n end = null;\n moveStart = null;\n creating = false;\n mask = null;\n background = null;\n brushended(emit);\n };\n // Update mask and invoke brushended callback.\n const updateMask = (start, end, emit = true) => {\n const [x, y, x1, y1] = normalizeBounds(start[0], start[1], end[0], end[1], extent);\n const [fx, fy, fx1, fy1] = brushRegion(x, y, x1, y1, extent);\n if (reverse)\n updateReverseMask(fx, fy, fx1, fy1);\n else\n updateNormalMask(fx, fy, fx1, fy1);\n brushed(fx, fy, fx1, fy1, emit);\n return [fx, fy, fx1, fy1];\n };\n const updateNormalMask = (x, y, x1, y1) => {\n mask.style.x = x;\n mask.style.y = y;\n mask.style.width = x1 - x;\n mask.style.height = y1 - y;\n };\n const updateReverseMask = (x, y, x1, y1) => {\n background.style.d = `\n M${originX},${originY}L${width},${originY}L${width},${height}L${originX},${height}Z\n M${x},${y}L${x},${y1}L${x1},${y1}L${x1},${y}Z\n `;\n mask.style.x = x;\n mask.style.y = y;\n mask.style.width = x1 - x;\n mask.style.height = y1 - y;\n };\n // Move and update mask.\n const moveMask = (current) => {\n const clip = (dt, start, end, min, max) => {\n if (dt + start < min)\n return min - start;\n if (dt + end > max)\n return max - end;\n return dt;\n };\n const dx = current[0] - moveStart[0];\n const dy = current[1] - moveStart[1];\n const dx1 = clip(dx, start[0], end[0], originX, width);\n const dy1 = clip(dy, start[1], end[1], originY, height);\n const currentStart = [start[0] + dx1, start[1] + dy1];\n const currentEnd = [end[0] + dx1, end[1] + dy1];\n updateMask(currentStart, currentEnd);\n };\n const handles = {\n 'handle-n': { vector: [0, 1, 0, 0], cursor: 'ns-resize' },\n 'handle-e': { vector: [0, 0, 1, 0], cursor: 'ew-resize' },\n 'handle-s': { vector: [0, 0, 0, 1], cursor: 'ns-resize' },\n 'handle-w': { vector: [1, 0, 0, 0], cursor: 'ew-resize' },\n 'handle-nw': { vector: [1, 1, 0, 0], cursor: 'nwse-resize' },\n 'handle-ne': { vector: [0, 1, 1, 0], cursor: 'nesw-resize' },\n 'handle-se': { vector: [0, 0, 1, 1], cursor: 'nwse-resize' },\n 'handle-sw': { vector: [1, 0, 0, 1], cursor: 'nesw-resize' },\n };\n const isMask = (target) => {\n return isSelection(target) || isHandle(target);\n };\n const isHandle = (target) => {\n const { id } = target;\n if (selectedHandles.indexOf(id) === -1)\n return false;\n return new Set(Object.keys(handles)).has(id);\n };\n const isSelection = (target) => {\n return target === mask.getElementById('selection');\n };\n // If target is plot area, create mask.\n // If target is mask, about to update position.\n const dragstart = (event) => {\n const { target } = event;\n const [offsetX, offsetY] = (0, utils_1.brushMousePosition)(root, event);\n if (!mask || !isMask(target)) {\n initMask(offsetX, offsetY, event);\n creating = true;\n return;\n }\n if (isMask(target)) {\n moveStart = [offsetX, offsetY];\n }\n };\n const drag = (event) => {\n const { target } = event;\n const mouse = (0, utils_1.brushMousePosition)(root, event);\n if (!start)\n return;\n // If target is plot area, resize mask.\n if (!moveStart)\n return updateMask(start, mouse);\n // If target is selection area, move mask.\n if (isSelection(target))\n return moveMask(mouse);\n // If target is handle area, resize mask.\n const [dx, dy] = [mouse[0] - moveStart[0], mouse[1] - moveStart[1]];\n const { id } = target;\n if (handles[id]) {\n const [sx, sy, ex, ey] = handles[id].vector;\n return updateMask([start[0] + dx * sx, start[1] + dy * sy], [end[0] + dx * ex, end[1] + dy * ey]);\n }\n };\n // If target is plot area, finish creating.\n // If target is mask, finish moving mask.\n const dragend = (event) => {\n if (moveStart) {\n moveStart = null;\n // Update start and end;\n const { x, y, width, height } = mask.style;\n start = [x, y];\n end = [x + width, y + height];\n brushupdated(x, y, x + width, y + height, event);\n return;\n }\n end = (0, utils_1.brushMousePosition)(root, event);\n const [fx, fy, fx1, fy1] = updateMask(start, end);\n creating = false;\n brushcreated(fx, fy, fx1, fy1, event);\n };\n // Hide mask.\n const click = (event) => {\n const { target } = event;\n if (mask && !isMask(target))\n removeMask();\n };\n // Update cursor depends on hovered element.\n const pointermove = (event) => {\n const { target } = event;\n if (!mask || !isMask(target) || creating)\n (0, utils_1.setCursor)(root, 'crosshair');\n else if (isSelection(target))\n (0, utils_1.setCursor)(root, 'move');\n else if (isHandle(target))\n (0, utils_1.setCursor)(root, handles[target.id].cursor);\n };\n const pointerleave = () => {\n (0, utils_1.setCursor)(root, 'default');\n };\n root.addEventListener('dragstart', dragstart);\n root.addEventListener('drag', drag);\n root.addEventListener('dragend', dragend);\n root.addEventListener('click', click);\n root.addEventListener('pointermove', pointermove);\n root.addEventListener('pointerleave', pointerleave);\n return {\n mask,\n move(x, y, x1, y1, emit = true) {\n if (!mask)\n initMask(x, y, {});\n start = [x, y];\n end = [x1, y1];\n updateMask([x, y], [x1, y1], emit);\n },\n remove(emit = true) {\n if (mask)\n removeMask(emit);\n },\n destroy() {\n // Do not emit brush:end event.\n if (mask)\n removeMask(false);\n (0, utils_1.setCursor)(root, 'default');\n root.removeEventListener('dragstart', dragstart);\n root.removeEventListener('drag', drag);\n root.removeEventListener('dragend', dragend);\n root.removeEventListener('click', click);\n root.removeEventListener('pointermove', pointermove);\n root.removeEventListener('pointerleave', pointerleave);\n },\n };\n}\nexports.brush = brush;\nfunction selectSiblingViews(target, viewInstances, brushKey) {\n return viewInstances.filter((d) => {\n if (d === target)\n return false;\n const { interaction = {} } = d.options;\n return Object.values(interaction).find((d) => d.brushKey === brushKey);\n });\n}\nfunction selectSiblingContainers(target, viewInstances, brushKey) {\n return selectSiblingViews(target, viewInstances, brushKey).map((d) => (0, utils_1.selectPlotArea)(d.container));\n}\nfunction selectSiblingOptions(target, viewInstances, brushKey) {\n return selectSiblingViews(target, viewInstances, brushKey).map((d) => d.options);\n}\n/**\n * @todo Brush over view for series view.\n * @todo Test perf.\n */\nfunction brushHighlight(root, _a) {\n var { elements: elementof, selectedHandles, siblings: siblingsof = (root) => [], datum, brushRegion, extent: optionalExtent, reverse, scale, coordinate, series = false, key = (d) => d, bboxOf = (root) => {\n const { x, y, width, height } = root.style;\n return { x, y, width, height };\n }, state = {}, emitter } = _a, rest = __rest(_a, [\"elements\", \"selectedHandles\", \"siblings\", \"datum\", \"brushRegion\", \"extent\", \"reverse\", \"scale\", \"coordinate\", \"series\", \"key\", \"bboxOf\", \"state\", \"emitter\"]);\n const elements = elementof(root);\n const siblings = siblingsof(root);\n const siblingElements = siblings.flatMap(elementof);\n const valueof = (0, utils_1.createValueof)(elements, datum);\n const brushStyle = (0, helper_1.subObject)(rest, 'mask');\n const { setState, removeState } = (0, utils_1.useState)(state, valueof);\n const clonedElement = new Map();\n const { width: rootWidth, height: rootHeight, x: ordinalX = 0, y: ordinalY = 0, } = bboxOf(root);\n const extent = optionalExtent\n ? optionalExtent\n : [0, 0, rootWidth, rootHeight];\n const brushended = () => {\n for (const element of [...elements, ...siblingElements]) {\n removeState(element, 'active', 'inactive');\n }\n };\n const brushed = (x, y, x1, y1) => {\n var _a;\n // Hide brush for the sibling view.\n for (const sibling of siblings)\n (_a = sibling.brush) === null || _a === void 0 ? void 0 : _a.remove();\n // Store the key of the active element.\n const keys = new Set();\n // Highlight and store selected elements.\n for (const element of elements) {\n const { min, max } = element.getLocalBounds();\n const [ex, ey] = min;\n const [ex1, ey1] = max;\n if (!intersect([ex, ey, ex1, ey1], [x, y, x1, y1])) {\n setState(element, 'inactive');\n }\n else {\n setState(element, 'active');\n keys.add(key(element));\n }\n }\n // Highlight elements with same key in sibling view.\n for (const element of siblingElements) {\n if (keys.has(key(element)))\n setState(element, 'active');\n else\n setState(element, 'inactive');\n }\n };\n const seriesBrushend = () => {\n for (const element of elements)\n removeState(element, 'inactive');\n for (const cloned of clonedElement.values())\n cloned.remove();\n clonedElement.clear();\n };\n const seriesBrushed = (x, y, x1, y1) => {\n const clone = (element) => {\n const cloned = element.cloneNode();\n cloned.__data__ = element.__data__;\n element.parentNode.appendChild(cloned);\n clonedElement.set(element, cloned);\n return cloned;\n };\n // Create a clipPath shared between all children.\n const clipPath = new g_1.Rect({\n style: {\n x: x + ordinalX,\n y: y + ordinalY,\n width: x1 - x,\n height: y1 - y,\n },\n });\n root.appendChild(clipPath);\n for (const element of elements) {\n const cloned = clonedElement.get(element) || clone(element);\n cloned.style.clipPath = clipPath;\n setState(element, 'inactive');\n setState(cloned, 'active');\n }\n };\n const brushHandler = brush(root, Object.assign(Object.assign({}, brushStyle), { extent,\n brushRegion,\n reverse,\n selectedHandles, brushended: (emit) => {\n const handler = series ? seriesBrushend : brushended;\n if (emit) {\n emitter.emit('brush:remove', { nativeEvent: true });\n }\n handler();\n }, brushed: (x, y, x1, y1, emit) => {\n const selection = (0, scale_1.selectionOf)(x, y, x1, y1, scale, coordinate);\n if (emit) {\n emitter.emit('brush:highlight', {\n nativeEvent: true,\n data: { selection },\n });\n }\n const handler = series ? seriesBrushed : brushed;\n handler(x, y, x1, y1);\n }, brushcreated: (x, y, x1, y1, event) => {\n const selection = (0, scale_1.selectionOf)(x, y, x1, y1, scale, coordinate);\n emitter.emit('brush:end', Object.assign(Object.assign({}, event), { nativeEvent: true, data: { selection } }));\n }, brushupdated: (x, y, x1, y1, event) => {\n const selection = (0, scale_1.selectionOf)(x, y, x1, y1, scale, coordinate);\n emitter.emit('brush:end', Object.assign(Object.assign({}, event), { nativeEvent: true, data: { selection } }));\n }, brushstarted: (e) => {\n emitter.emit('brush:start', e);\n } }));\n // Move brush and highlight data.\n const onHighlight = ({ nativeEvent, data }) => {\n if (nativeEvent)\n return;\n const { selection } = data;\n const [x, y, x1, y1] = (0, scale_1.pixelsOf)(selection, scale, coordinate);\n brushHandler.move(x, y, x1, y1, false);\n };\n emitter.on('brush:highlight', onHighlight);\n // Remove brush and reset data.\n const onRemove = ({ nativeEvent } = {}) => {\n if (nativeEvent)\n return;\n brushHandler.remove(false);\n };\n emitter.on('brush:remove', onRemove);\n // Remove event handlers.\n const preBrushDestroy = brushHandler.destroy.bind(brushHandler);\n brushHandler.destroy = () => {\n emitter.off('brush:highlight', onHighlight);\n emitter.off('brush:remove', onRemove);\n preBrushDestroy();\n };\n return brushHandler;\n}\nexports.brushHighlight = brushHighlight;\nfunction BrushHighlight(_a) {\n var { facet, brushKey } = _a, rest = __rest(_a, [\"facet\", \"brushKey\"]);\n return (target, viewInstances, emitter) => {\n const { container, view, options } = target;\n const plotArea = (0, utils_1.selectPlotArea)(container);\n const defaultOptions = {\n maskFill: '#777',\n maskFillOpacity: '0.3',\n maskStroke: '#fff',\n reverse: false,\n };\n const defaultStates = ['active', ['inactive', { opacity: 0.5 }]];\n const { scale, coordinate } = view;\n if (facet) {\n const bbox = plotArea.getBounds();\n const x = bbox.min[0];\n const y = bbox.min[1];\n const x1 = bbox.max[0];\n const y1 = bbox.max[1];\n return brushHighlight(plotArea.parentNode.parentNode, Object.assign(Object.assign({ elements: () => (0, utils_1.selectFacetG2Elements)(target, viewInstances), datum: (0, utils_1.createDatumof)((0, utils_1.selectFacetViews)(target, viewInstances).map((d) => d.view)), brushRegion: (x, y, x1, y1) => [x, y, x1, y1], extent: [x, y, x1, y1], state: (0, utils_1.mergeState)((0, utils_1.selectFacetViews)(target, viewInstances).map((d) => d.options), defaultStates), emitter,\n scale,\n coordinate, selectedHandles: undefined }, defaultOptions), rest));\n }\n const brush = brushHighlight(plotArea, Object.assign(Object.assign({ elements: utils_1.selectG2Elements, key: (element) => element.__data__.key, siblings: () => selectSiblingContainers(target, viewInstances, brushKey), datum: (0, utils_1.createDatumof)([\n view,\n ...selectSiblingViews(target, viewInstances, brushKey).map((d) => d.view),\n ]), brushRegion: (x, y, x1, y1) => [x, y, x1, y1], extent: undefined, state: (0, utils_1.mergeState)([options, ...selectSiblingOptions(target, viewInstances, brushKey)], defaultStates), emitter,\n scale,\n coordinate, selectedHandles: undefined }, defaultOptions), rest));\n // Bind brush to the view it belongs to.\n //@ts-ignore\n plotArea.brush = brush;\n return () => brush.destroy();\n };\n}\nexports.BrushHighlight = BrushHighlight;\n//# sourceMappingURL=brushHighlight.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BrushXHighlight = exports.brushXRegion = void 0;\nconst brushHighlight_1 = require(\"./brushHighlight\");\nfunction brushXRegion(x, y, x1, y1, extent) {\n const [, minY, , maxY] = extent;\n return [x, minY, x1, maxY];\n}\nexports.brushXRegion = brushXRegion;\nfunction BrushXHighlight(options) {\n return (0, brushHighlight_1.BrushHighlight)(Object.assign(Object.assign({}, options), { brushRegion: brushXRegion, selectedHandles: ['handle-e', 'handle-w'] }));\n}\nexports.BrushXHighlight = BrushXHighlight;\n//# sourceMappingURL=brushXHighlight.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BrushYHighlight = exports.brushYRegion = void 0;\nconst brushHighlight_1 = require(\"./brushHighlight\");\nfunction brushYRegion(x, y, x1, y1, extent) {\n const [minX, , maxX] = extent;\n return [minX, y, maxX, y1];\n}\nexports.brushYRegion = brushYRegion;\nfunction BrushYHighlight(options) {\n return (0, brushHighlight_1.BrushHighlight)(Object.assign(Object.assign({}, options), { brushRegion: brushYRegion, selectedHandles: ['handle-n', 'handle-s'] }));\n}\nexports.BrushYHighlight = BrushYHighlight;\n//# sourceMappingURL=brushYHighlight.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BrushAxisHighlight = exports.brushAxisHighlight = exports.AXIS_HOT_AREA_CLASS_NAME = exports.AXIS_MAIN_CLASS_NAME = exports.AXIS_LINE_CLASS_NAME = exports.AXIS_CLASS_NAME = void 0;\nconst g_1 = require(\"@antv/g\");\nconst helper_1 = require(\"../utils/helper\");\nconst scale_1 = require(\"../utils/scale\");\nconst brushHighlight_1 = require(\"./brushHighlight\");\nconst brushXHighlight_1 = require(\"./brushXHighlight\");\nconst brushYHighlight_1 = require(\"./brushYHighlight\");\nconst utils_1 = require(\"./utils\");\nexports.AXIS_CLASS_NAME = 'axis';\nexports.AXIS_LINE_CLASS_NAME = 'axis-line';\nexports.AXIS_MAIN_CLASS_NAME = 'axis-main-group';\nexports.AXIS_HOT_AREA_CLASS_NAME = 'axis-hot-area';\nfunction axesOf(container) {\n return container.getElementsByClassName(exports.AXIS_CLASS_NAME);\n}\nfunction lineOf(axis) {\n return axis.getElementsByClassName(exports.AXIS_LINE_CLASS_NAME)[0];\n}\nfunction mainGroupOf(axis) {\n return axis.getElementsByClassName(exports.AXIS_MAIN_CLASS_NAME)[0];\n}\n// Use the bounds of main group of axis as the bounds of axis,\n// get rid of grid and title.\nfunction boundsOfAxis(axis) {\n return mainGroupOf(axis).getLocalBounds();\n}\n// Brush for vertical axis.\nfunction verticalBrush(axis, _a) {\n var { cross, offsetX, offsetY } = _a, style = __rest(_a, [\"cross\", \"offsetX\", \"offsetY\"]);\n const bounds = boundsOfAxis(axis);\n const axisLine = lineOf(axis);\n const [lineX] = axisLine.getLocalBounds().min;\n const [minX, minY] = bounds.min;\n const [maxX, maxY] = bounds.max;\n const size = (maxX - minX) * 2;\n return {\n brushRegion: brushYHighlight_1.brushYRegion,\n hotZone: new g_1.Rect({\n className: exports.AXIS_HOT_AREA_CLASS_NAME,\n style: Object.assign({ \n // If it is not cross, draw brush in both side of axisLine,\n // otherwise the draw brush within bounds area.\n width: cross ? size / 2 : size, transform: `translate(${(cross ? minX : lineX - size / 2).toFixed(2)}, ${minY})`, height: maxY - minY }, style),\n }),\n extent: cross\n ? // If it is cross, the x range is ignored.\n (x, y, x1, y1) => [-Infinity, y, Infinity, y1]\n : (x, y, x1, y1) => [\n Math.floor(minX - offsetX),\n y,\n Math.ceil(maxX - offsetX),\n y1,\n ],\n };\n}\n// Brush for horizontal axis.\nfunction horizontalBrush(axis, _a) {\n var { offsetY, offsetX, cross = false } = _a, style = __rest(_a, [\"offsetY\", \"offsetX\", \"cross\"]);\n const bounds = boundsOfAxis(axis);\n const axisLine = lineOf(axis);\n const [, lineY] = axisLine.getLocalBounds().min;\n const [minX, minY] = bounds.min;\n const [maxX, maxY] = bounds.max;\n const size = maxY - minY;\n return {\n brushRegion: brushXHighlight_1.brushXRegion,\n hotZone: new g_1.Rect({\n className: exports.AXIS_HOT_AREA_CLASS_NAME,\n style: Object.assign({ width: maxX - minX, \n // If it is not cross, draw brush in both side of axisLine,\n // otherwise the draw brush within bounds area.\n height: cross ? size : size * 2, transform: `translate(${minX}, ${cross ? minY : lineY - size})` }, style),\n }),\n extent: cross\n ? // If it is cross, the y range is ignored.\n (x, y, x1, y1) => [x, -Infinity, x1, Infinity]\n : (x, y, x1, y1) => [\n x,\n Math.floor(minY - offsetY),\n x1,\n Math.ceil(maxY - offsetY),\n ],\n };\n}\nfunction brushAxisHighlight(root, _a) {\n var { axes: axesOf, // given root, return axes\n elements: elementsOf, // given root, return elements\n points: pointsOf, // given shape, return control points\n horizontal: isHorizontal, // given axis, return direction\n datum, // given shape, return datum\n offsetY, // offsetY for shape area\n offsetX, // offsetX for shape area\n reverse = false, state = {}, emitter, coordinate } = _a, rest = __rest(_a, [\"axes\", \"elements\", \"points\", \"horizontal\", \"datum\", \"offsetY\", \"offsetX\", \"reverse\", \"state\", \"emitter\", \"coordinate\"]) // style\n ;\n const elements = elementsOf(root);\n const axes = axesOf(root);\n const valueof = (0, utils_1.createValueof)(elements, datum);\n const { setState, removeState } = (0, utils_1.useState)(state, valueof);\n const axisExtent = new Map();\n const brushStyle = (0, helper_1.subObject)(rest, 'mask');\n // Only some of shape's points in all mask, it is selected.\n const brushed = (points) => Array.from(axisExtent.values()).every(([x, y, x1, y1]) => points.some(([x0, y0]) => {\n return x0 >= x && x0 <= x1 && y0 >= y && y0 <= y1;\n }));\n const scales = axes.map((d) => d.attributes.scale);\n const extentOf = (D) => (D.length > 2 ? [D[0], D[D.length - 1]] : D);\n const indexDomain = new Map();\n const initIndexDomain = () => {\n indexDomain.clear();\n for (let i = 0; i < axes.length; i++) {\n const scale = scales[i];\n const { domain } = scale.getOptions();\n indexDomain.set(i, extentOf(domain));\n }\n };\n initIndexDomain();\n // Update element when brush changed.\n const updateElement = (i, emit) => {\n const selectedElements = [];\n for (const element of elements) {\n const points = pointsOf(element);\n if (brushed(points)) {\n setState(element, 'active');\n selectedElements.push(element);\n }\n else\n setState(element, 'inactive');\n }\n indexDomain.set(i, selectionOf(selectedElements, i));\n if (!emit)\n return;\n // Emit events.\n const selection = () => {\n if (!cross)\n return Array.from(indexDomain.values());\n const S = [];\n for (const [index, domain] of indexDomain) {\n const scale = scales[index];\n const { name } = scale.getOptions();\n if (name === 'x')\n S[0] = domain;\n else\n S[1] = domain;\n }\n return S;\n };\n emitter.emit('brushAxis:highlight', {\n nativeEvent: true,\n data: {\n selection: selection(),\n },\n });\n };\n const clearElement = (emit) => {\n for (const element of elements)\n removeState(element, 'active', 'inactive');\n initIndexDomain();\n if (!emit)\n return;\n emitter.emit('brushAxis:remove', { nativeEvent: true });\n };\n const selectionOf = (selected, i) => {\n const scale = scales[i];\n const { name } = scale.getOptions();\n const domain = selected.map((d) => {\n const data = d.__data__;\n return scale.invert(data[name]);\n });\n return extentOf((0, scale_1.domainOf)(scale, domain));\n };\n // Distinguish between parallel coordinates and normal charts.\n const cross = axes.some(isHorizontal) && axes.some((d) => !isHorizontal(d));\n const handlers = [];\n for (let i = 0; i < axes.length; i++) {\n const axis = axes[i];\n const createBrush = isHorizontal(axis) ? horizontalBrush : verticalBrush;\n const { hotZone, brushRegion, extent } = createBrush(axis, {\n offsetY,\n offsetX,\n cross,\n zIndex: 999,\n fill: 'transparent', // Make it interactive.\n });\n axis.parentNode.appendChild(hotZone);\n const brushHandler = (0, brushHighlight_1.brush)(hotZone, Object.assign(Object.assign({}, brushStyle), { reverse,\n brushRegion,\n brushended(emit) {\n axisExtent.delete(axis);\n if (Array.from(axisExtent.entries()).length === 0)\n clearElement(emit);\n else\n updateElement(i, emit);\n },\n brushed(x, y, x1, y1, emit) {\n axisExtent.set(axis, extent(x, y, x1, y1));\n updateElement(i, emit);\n } }));\n handlers.push(brushHandler);\n }\n const onRemove = (event = {}) => {\n const { nativeEvent } = event;\n if (nativeEvent)\n return;\n handlers.forEach((d) => d.remove(false));\n };\n const rangeOf = (domain, scale, axis) => {\n const [d0, d1] = domain;\n const maybeStep = (scale) => (scale.getStep ? scale.getStep() : 0);\n const x = abstractOf(d0, scale, axis);\n const x1 = abstractOf(d1, scale, axis) + maybeStep(scale);\n if (isHorizontal(axis))\n return [x, -Infinity, x1, Infinity];\n return [-Infinity, x, Infinity, x1];\n };\n const abstractOf = (x, scale, axis) => {\n const { height, width } = coordinate.getOptions();\n const scale1 = scale.clone();\n if (isHorizontal(axis))\n scale1.update({ range: [0, width] });\n else\n scale1.update({ range: [height, 0] });\n return scale1.map(x);\n };\n const onHighlight = (event) => {\n const { nativeEvent } = event;\n if (nativeEvent)\n return;\n const { selection } = event.data;\n for (let i = 0; i < handlers.length; i++) {\n const domain = selection[i];\n const handler = handlers[i];\n const axis = axes[i];\n if (domain) {\n const scale = scales[i];\n handler.move(...rangeOf(domain, scale, axis), false);\n }\n else {\n handler.remove(false);\n }\n }\n };\n emitter.on('brushAxis:remove', onRemove);\n emitter.on('brushAxis:highlight', onHighlight);\n return () => {\n handlers.forEach((d) => d.destroy());\n emitter.off('brushAxis:remove', onRemove);\n emitter.off('brushAxis:highlight', onHighlight);\n };\n}\nexports.brushAxisHighlight = brushAxisHighlight;\n/**\n * @todo Support mask size.\n */\nfunction BrushAxisHighlight(options) {\n return (target, _, emitter) => {\n const { container, view, options: viewOptions } = target;\n const plotArea = (0, utils_1.selectPlotArea)(container);\n const { x: x0, y: y0 } = plotArea.getBBox();\n const { coordinate } = view;\n return brushAxisHighlight(container, Object.assign({ elements: utils_1.selectG2Elements, axes: axesOf, offsetY: y0, offsetX: x0, points: (element) => element.__data__.points, horizontal: (axis) => {\n const { startPos: [sx, sy], endPos: [ex, ey], } = axis.attributes;\n // attention, non-horizontal does not mean vertical\n // it may has a specific degree angle\n return sx !== ex && sy === ey;\n }, datum: (0, utils_1.createDatumof)(view), state: (0, utils_1.mergeState)(viewOptions, [\n 'active',\n ['inactive', { opacity: 0.5 }],\n ]), coordinate,\n emitter }, options));\n };\n}\nexports.BrushAxisHighlight = BrushAxisHighlight;\n//# sourceMappingURL=brushAxisHighlight.js.map","\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BrushFilter = exports.brushFilter = void 0;\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"../utils/helper\");\nconst scale_1 = require(\"../utils/scale\");\nconst brushHighlight_1 = require(\"./brushHighlight\");\nconst utils_1 = require(\"./utils\");\n// Mock dblclick events.\nfunction dblclick(interval = 300) {\n let preTimeStamp = null;\n return (e) => {\n const { timeStamp } = e;\n if (preTimeStamp !== null && timeStamp - preTimeStamp < interval) {\n preTimeStamp = timeStamp;\n return true;\n }\n preTimeStamp = timeStamp;\n return false;\n };\n}\nfunction brushFilter(root, _a) {\n var { filter, reset, brushRegion, extent: optionalExtent, reverse, emitter, scale, coordinate, selection, series = false } = _a, rest = __rest(_a, [\"filter\", \"reset\", \"brushRegion\", \"extent\", \"reverse\", \"emitter\", \"scale\", \"coordinate\", \"selection\", \"series\"]);\n const brushStyle = (0, helper_1.subObject)(rest, 'mask');\n const { width: rootWidth, height: rootHeight } = root.getBBox();\n const extent = optionalExtent\n ? optionalExtent\n : [0, 0, rootWidth, rootHeight];\n const isDblclick = dblclick();\n const brush = (0, brushHighlight_1.brush)(root, Object.assign(Object.assign({}, brushStyle), { extent,\n brushRegion,\n reverse,\n brushcreated }));\n root.addEventListener('click', click);\n // Filter when brush created.\n function brushcreated(x, y, x1, y1, event) {\n if (x === x1 && y === y1)\n return;\n event.nativeEvent = true;\n filter(selection(x, y, x1, y1), event);\n brush.remove();\n }\n // Reset when dblclick.\n function click(e) {\n if (isDblclick(e)) {\n e.nativeEvent = true;\n reset(e);\n }\n }\n const onFilter = ({ nativeEvent, data }) => {\n if (nativeEvent)\n return;\n const { selection } = data;\n filter(selection, { nativeEvent: false });\n };\n emitter.on('brush:filter', onFilter);\n return () => {\n brush.destroy();\n emitter.off('brush:filter', onFilter);\n root.removeEventListener('click', click);\n };\n}\nexports.brushFilter = brushFilter;\nfunction BrushFilter(_a) {\n var { hideX = true, hideY = true } = _a, rest = __rest(_a, [\"hideX\", \"hideY\"]);\n return (target, viewInstances, emitter) => {\n const { container, view, options: viewOptions, update, setState } = target;\n const plotArea = (0, utils_1.selectPlotArea)(container);\n const defaultOptions = {\n maskFill: '#777',\n maskFillOpacity: '0.3',\n maskStroke: '#fff',\n unhighlightedOpacity: 0.5,\n reverse: false,\n };\n let filtered = false;\n let filtering = false;\n let newView = view;\n const { scale, coordinate } = view;\n return brushFilter(plotArea, Object.assign(Object.assign({ brushRegion: (x, y, x1, y1) => [x, y, x1, y1], selection: (x, y, x1, y1) => {\n const { scale, coordinate } = newView;\n return (0, scale_1.selectionOf)(x, y, x1, y1, scale, coordinate);\n }, filter: (selection, event) => __awaiter(this, void 0, void 0, function* () {\n // Avoid redundant filter.\n if (filtering)\n return;\n filtering = true;\n // Update the domain of x and y scale to filter data.\n const [domainX, domainY] = selection;\n setState('brushFilter', (options) => {\n const { marks } = options;\n const newMarks = marks.map((mark) => (0, util_1.deepMix)({\n // Hide label to keep smooth transition.\n axis: Object.assign(Object.assign({}, (hideX && { x: { transform: [{ type: 'hide' }] } })), (hideY && { y: { transform: [{ type: 'hide' }] } })),\n }, mark, {\n // Set nice to false to avoid modify domain.\n scale: {\n x: { domain: domainX, nice: false },\n y: { domain: domainY, nice: false },\n },\n }));\n return Object.assign(Object.assign({}, viewOptions), { marks: newMarks, clip: true });\n });\n // Emit event.\n emitter.emit('brush:filter', Object.assign(Object.assign({}, event), { data: { selection: [domainX, domainY] } }));\n const newState = yield update();\n newView = newState.view;\n filtering = false;\n filtered = true;\n }), reset: (event) => {\n if (filtering || !filtered)\n return;\n // Emit event.\n const { scale } = view;\n const { x: scaleX, y: scaleY } = scale;\n const domainX = scaleX.getOptions().domain;\n const domainY = scaleY.getOptions().domain;\n emitter.emit('brush:filter', Object.assign(Object.assign({}, event), { data: { selection: [domainX, domainY] } }));\n filtered = false;\n newView = view;\n setState('brushFilter');\n update();\n }, extent: undefined, emitter,\n scale,\n coordinate }, defaultOptions), rest));\n };\n}\nexports.BrushFilter = BrushFilter;\n//# sourceMappingURL=brushFilter.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BrushXFilter = void 0;\nconst brushFilter_1 = require(\"./brushFilter\");\nconst brushXHighlight_1 = require(\"./brushXHighlight\");\nfunction BrushXFilter(options) {\n return (0, brushFilter_1.BrushFilter)(Object.assign(Object.assign({ hideX: true }, options), { brushRegion: brushXHighlight_1.brushXRegion }));\n}\nexports.BrushXFilter = BrushXFilter;\n//# sourceMappingURL=brushXFilter.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BrushYFilter = void 0;\nconst brushFilter_1 = require(\"./brushFilter\");\nconst brushYHighlight_1 = require(\"./brushYHighlight\");\nfunction BrushYFilter(options) {\n return (0, brushFilter_1.BrushFilter)(Object.assign(Object.assign({ hideY: true }, options), { brushRegion: brushYHighlight_1.brushYRegion }));\n}\nexports.BrushYFilter = BrushYFilter;\n//# sourceMappingURL=brushYFilter.js.map","\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SliderFilter = exports.SLIDER_CLASS_NAME = void 0;\nconst util_1 = require(\"@antv/util\");\nconst g_1 = require(\"@antv/g\");\nconst coordinate_1 = require(\"../utils/coordinate\");\nconst scale_1 = require(\"../utils/scale\");\nexports.SLIDER_CLASS_NAME = 'slider';\nfunction filterDataByDomain(options, scaleOptions, prefix, hasState = false, channel0 = 'x', channel1 = 'y') {\n const { marks } = options;\n const newMarks = marks.map((mark) => {\n var _a, _b;\n return (0, util_1.deepMix)({\n // Hide label to keep smooth transition.\n axis: {\n x: { transform: [{ type: 'hide' }] },\n y: { transform: [{ type: 'hide' }] },\n },\n }, mark, {\n scale: scaleOptions,\n // Don't rerender sliders.\n [prefix]: Object.assign(Object.assign({}, (((_a = mark[prefix]) === null || _a === void 0 ? void 0 : _a[channel0]) && {\n [channel0]: Object.assign({ preserve: true }, (hasState && { ratio: null })),\n })), (((_b = mark[prefix]) === null || _b === void 0 ? void 0 : _b[channel1]) && {\n [channel1]: { preserve: true },\n })),\n animate: false,\n });\n });\n // Rerender and update view.\n return Object.assign(Object.assign({}, options), { marks: newMarks, clip: true, animate: false });\n}\nfunction abstractValue(values, scale, reverse) {\n const [x, x1] = values;\n const v = reverse ? (d) => 1 - d : (d) => d;\n const d0 = (0, scale_1.invert)(scale, v(x), true);\n const d1 = (0, scale_1.invert)(scale, v(x1), false);\n return (0, scale_1.domainOf)(scale, [d0, d1]);\n}\nfunction extentOf(domain) {\n return [domain[0], domain[domain.length - 1]];\n}\n/**\n * @todo Support click to reset after fix click and dragend conflict.\n */\nfunction SliderFilter({ initDomain = {}, className = exports.SLIDER_CLASS_NAME, prefix = 'slider', setValue = (component, values) => component.setValues(values), hasState = false, wait = 50, leading = true, trailing = false, getInitValues = (slider) => {\n var _a;\n const values = (_a = slider === null || slider === void 0 ? void 0 : slider.attributes) === null || _a === void 0 ? void 0 : _a.values;\n if (values[0] !== 0 || values[1] !== 1)\n return values;\n}, }) {\n return (context, _, emitter) => {\n const { container, view, update, setState } = context;\n const sliders = container.getElementsByClassName(className);\n if (!sliders.length)\n return () => { };\n let filtering = false;\n const { scale, coordinate, layout } = view;\n const { paddingLeft, paddingTop, paddingBottom, paddingRight } = layout;\n const { x: scaleX, y: scaleY } = scale;\n const transposed = (0, coordinate_1.isTranspose)(coordinate);\n const channelOf = (orientation) => {\n const channel0 = orientation === 'vertical' ? 'y' : 'x';\n const channel1 = orientation === 'vertical' ? 'x' : 'y';\n if (transposed)\n return [channel1, channel0];\n return [channel0, channel1];\n };\n const sliderHandler = new Map();\n const emitHandlers = new Set();\n // Store current domain of x and y scale.\n const channelDomain = {\n x: initDomain.x || scaleX.getOptions().domain,\n y: initDomain.y || scaleY.getOptions().domain,\n };\n for (const slider of sliders) {\n const { orientation } = slider.attributes;\n const [channel0, channel1] = channelOf(orientation);\n const eventName = `${prefix}${(0, util_1.upperFirst)(channel0)}:filter`;\n const isX = channel0 === 'x';\n const { ratio: ratioX } = scaleX.getOptions();\n const { ratio: ratioY } = scaleY.getOptions();\n const domainsOf = (event) => {\n // From abstract values.\n if (event.data) {\n const { selection } = event.data;\n const [X = extentOf(channelDomain.x), Y = extentOf(channelDomain.y)] = selection;\n return isX\n ? [(0, scale_1.domainOf)(scaleX, X, ratioX), (0, scale_1.domainOf)(scaleY, Y, ratioY)]\n : [(0, scale_1.domainOf)(scaleY, Y, ratioY), (0, scale_1.domainOf)(scaleX, X, ratioX)];\n }\n // From visual values.\n const { value: values } = event.detail;\n const scale0 = scale[channel0];\n const domain0 = abstractValue(values, scale0, transposed && orientation === 'horizontal');\n const domain1 = channelDomain[channel1];\n return [domain0, domain1];\n };\n const onValueChange = (0, util_1.throttle)((event) => __awaiter(this, void 0, void 0, function* () {\n const { initValue = false } = event;\n if (filtering && !initValue)\n return;\n filtering = true;\n const { nativeEvent = true } = event;\n // Get and update domain.\n const [domain0, domain1] = domainsOf(event);\n channelDomain[channel0] = domain0;\n channelDomain[channel1] = domain1;\n if (nativeEvent) {\n // Emit events.\n const X = isX ? domain0 : domain1;\n const Y = isX ? domain1 : domain0;\n emitter.emit(eventName, Object.assign(Object.assign({}, event), { nativeEvent, data: { selection: [extentOf(X), extentOf(Y)] } }));\n }\n setState(slider, (options) => (Object.assign(Object.assign({}, filterDataByDomain(options, \n // Set nice to false to avoid modify domain.\n // Only update domain of current slider / scrollbar.\n { [channel0]: { domain: domain0, nice: false } }, prefix, hasState, channel0, channel1)), { paddingLeft,\n paddingTop,\n paddingBottom,\n paddingRight })));\n yield update();\n filtering = false;\n }), wait, { leading, trailing });\n const emitHandler = (event) => {\n const { nativeEvent } = event;\n if (nativeEvent)\n return;\n const { data } = event;\n const { selection } = data;\n const [X, Y] = selection;\n // Update data.\n slider.dispatchEvent(new g_1.CustomEvent('valuechange', {\n data,\n nativeEvent: false,\n }));\n // Update slider.\n const V = isX ? (0, scale_1.abstractOf)(X, scaleX) : (0, scale_1.abstractOf)(Y, scaleY);\n setValue(slider, V);\n };\n emitter.on(eventName, emitHandler);\n slider.addEventListener('valuechange', onValueChange);\n sliderHandler.set(slider, onValueChange);\n emitHandlers.add([eventName, emitHandler]);\n const values = getInitValues(slider);\n if (values) {\n // Init values.\n slider.dispatchEvent(new g_1.CustomEvent('valuechange', {\n detail: {\n value: values,\n },\n nativeEvent: false,\n initValue: true,\n }));\n }\n }\n return () => {\n for (const [slider, handler] of sliderHandler) {\n slider.removeEventListener('valuechange', handler);\n }\n for (const [name, handler] of emitHandlers) {\n emitter.off(name, handler);\n }\n };\n };\n}\nexports.SliderFilter = SliderFilter;\n//# sourceMappingURL=sliderFilter.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ScrollbarFilter = exports.SCROLLBAR_CLASS_NAME = void 0;\nconst sliderFilter_1 = require(\"./sliderFilter\");\nexports.SCROLLBAR_CLASS_NAME = 'g2-scrollbar';\nfunction ScrollbarFilter(options = {}) {\n return (context, _, emitter) => {\n const { view, container } = context;\n const scrollbars = container.getElementsByClassName(exports.SCROLLBAR_CLASS_NAME);\n if (!scrollbars.length)\n return () => { };\n const { scale } = view;\n const { x: scaleX, y: scaleY } = scale;\n // The filtered domain, computed by the ratio attribute.\n const initDomain = {\n x: [...scaleX.getOptions().domain],\n y: [...scaleY.getOptions().domain],\n };\n // The ordinal domain for each channel.\n scaleX.update({ domain: scaleX.getOptions().expectedDomain });\n scaleY.update({ domain: scaleY.getOptions().expectedDomain });\n const interaction = (0, sliderFilter_1.SliderFilter)(Object.assign(Object.assign({}, options), { initDomain, className: exports.SCROLLBAR_CLASS_NAME, prefix: 'scrollbar', hasState: true, setValue: (component, values) => component.setValue(values[0]), getInitValues: (scrollbar) => {\n const values = scrollbar.slider.attributes.values;\n if (values[0] !== 0)\n return values;\n } }));\n return interaction(context, _, emitter);\n };\n}\nexports.ScrollbarFilter = ScrollbarFilter;\n//# sourceMappingURL=scrollbarFilter.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Poptip = void 0;\nconst g_1 = require(\"@antv/g\");\nconst string_1 = require(\"../utils/string\");\nconst helper_1 = require(\"../utils/helper\");\nfunction dom(tag, children, style) {\n return `<${tag} style=\"${Object.entries(style)\n .map(([key, value]) => `${(0, string_1.kebabCase)(key)}:${value}`)\n .join(';')}\">${children}`;\n}\nconst defaultTipStyle = {\n backgroundColor: 'rgba(0,0,0,0.75)',\n color: '#fff',\n width: 'max-content',\n padding: '1px 4px',\n fontSize: '12px',\n borderRadius: '2.5px',\n boxShadow: '0 3px 6px -4px rgba(0,0,0,0.12), 0 6px 16px 0 rgba(0,0,0,0.08), 0 9px 28px 8px rgba(0,0,0,0.05)',\n};\nfunction isTipText(element) {\n if (element.nodeName !== 'text')\n return false;\n if (element.isOverflowing())\n return true;\n return false;\n}\nfunction Poptip(_a) {\n var { offsetX = 8, offsetY = 8 } = _a, style = __rest(_a, [\"offsetX\", \"offsetY\"]);\n return (context) => {\n const { container } = context;\n const [x0, y0] = container.getBounds().min;\n const tipStyle = (0, helper_1.subObject)(style, 'tip');\n const tips = new Set();\n const pointerover = (e) => {\n const { target } = e;\n if (!isTipText(target)) {\n e.stopPropagation();\n return;\n }\n const { offsetX: mouseX, offsetY: mouseY } = e;\n const x = mouseX + offsetX - x0;\n const y = mouseY + offsetY - y0;\n if (target.tip) {\n target.tip.style.x = x;\n target.tip.style.y = y;\n return;\n }\n const { text } = target.style;\n const tipELement = new g_1.HTML({\n className: 'poptip',\n style: {\n innerHTML: dom('div', text, Object.assign(Object.assign({}, defaultTipStyle), tipStyle)),\n x,\n y,\n },\n });\n container.appendChild(tipELement);\n target.tip = tipELement;\n tips.add(tipELement);\n };\n const pointerout = (e) => {\n const { target } = e;\n if (!isTipText(target)) {\n e.stopPropagation();\n return;\n }\n if (!target.tip)\n return;\n target.tip.remove();\n target.tip = null;\n tips.delete(target.tip);\n };\n container.addEventListener('pointerover', pointerover);\n container.addEventListener('pointerout', pointerout);\n return () => {\n container.removeEventListener('pointerover', pointerover);\n container.removeEventListener('pointerout', pointerout);\n tips.forEach((tip) => tip.remove());\n };\n };\n}\nexports.Poptip = Poptip;\nPoptip.props = {\n reapplyWhenUpdate: true,\n};\n//# sourceMappingURL=poptip.js.map","\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TreemapDrillDown = void 0;\nconst g_1 = require(\"@antv/g\");\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"../utils/helper\");\nconst runtime_1 = require(\"../runtime\");\nconst selection_1 = require(\"../utils/selection\");\nconst treeDataTransform_1 = require(\"../utils/treeDataTransform\");\nconst legendFilter_1 = require(\"./legendFilter\");\nconst utils_1 = require(\"./utils\");\nfunction selectPlotArea(root) {\n return (0, selection_1.select)(root).select(`.${runtime_1.PLOT_CLASS_NAME}`).node();\n}\n// Default breadCrumb config.\nconst DEFAULT_BREADCRUMB_STYLE = {\n breadCrumbFill: 'rgba(0, 0, 0, 0.85)',\n breadCrumbFontSize: 12,\n breadCrumbY: 12,\n activeFill: 'rgba(0, 0, 0, 0.5)',\n};\n/**\n * TreemapDrillDown interaction.\n */\nfunction TreemapDrillDown(drillDownOptions = {}) {\n const { originData = [], layout } = drillDownOptions, style = __rest(drillDownOptions, [\"originData\", \"layout\"]);\n const breadCrumb = (0, util_1.deepMix)({}, DEFAULT_BREADCRUMB_STYLE, style);\n const breadCrumbStyle = (0, helper_1.subObject)(breadCrumb, 'breadCrumb');\n const breadCrumbActiveStyle = (0, helper_1.subObject)(breadCrumb, 'active');\n return (context) => {\n const { update, setState, container, options } = context;\n const plotArea = selectPlotArea(container);\n const mark = options.marks[0];\n const { state } = mark;\n // Create breadCrumbTextsGroup,save textSeparator、drillTexts.\n const textGroup = new g_1.Group();\n plotArea.appendChild(textGroup);\n // Modify the data and scale according to the path and the level of the current click, so as to achieve the effect of drilling down and drilling up and initialization.\n const drillDownClick = (path, depth) => __awaiter(this, void 0, void 0, function* () {\n // Clear text.\n textGroup.removeChildren();\n // More path creation text.\n if (depth) {\n let name = '';\n let y = breadCrumbStyle.y;\n let x = 0;\n const textPath = [];\n const maxWidth = plotArea.getBBox().width;\n // Create path: 'type1 / type2 / type3' -> '/ type1 / type2 / type3'.\n const drillTexts = path.map((text, index) => {\n name = `${name}${text}/`;\n textPath.push(text);\n const drillText = new g_1.Text({\n name: name.replace(/\\/$/, ''),\n style: Object.assign(Object.assign({ text,\n x, \n // @ts-ignore\n path: [...textPath], depth: index }, breadCrumbStyle), { y }),\n });\n textGroup.appendChild(drillText);\n x += drillText.getBBox().width;\n const textSeparator = new g_1.Text({\n style: Object.assign(Object.assign({ x, text: ' / ' }, breadCrumbStyle), { y }),\n });\n textGroup.appendChild(textSeparator);\n x += textSeparator.getBBox().width;\n /**\n * Page width exceeds maximum, line feed.\n * | ----maxWidth---- |\n * | / tyep1 / tyep2 / type3 |\n * ->\n * | ----maxWidth---- |\n * | / tyep1 / tyep2 |\n * | / type3 |\n */\n if (x > maxWidth) {\n y = textGroup.getBBox().height + breadCrumbStyle.y;\n x = 0;\n drillText.attr({\n x,\n y,\n });\n x += drillText.getBBox().width;\n textSeparator.attr({\n x,\n y,\n });\n x += textSeparator.getBBox().width;\n }\n if (index === (0, util_1.size)(path) - 1) {\n textSeparator.remove();\n }\n return drillText;\n });\n // Add Active, Add TreemapDrillDown\n drillTexts.forEach((item, index) => {\n // Last drillText\n if (index === (0, util_1.size)(drillTexts) - 1)\n return;\n const originalAttrs = Object.assign({}, item.attributes);\n item.attr('cursor', 'pointer');\n item.addEventListener('mouseenter', () => {\n item.attr(breadCrumbActiveStyle);\n });\n item.addEventListener('mouseleave', () => {\n item.attr(originalAttrs);\n });\n item.addEventListener('click', () => {\n drillDownClick((0, util_1.get)(item, ['style', 'path']), (0, util_1.get)(item, ['style', 'depth']));\n });\n });\n }\n // LegendFilter interaction and treemapDrillDown clash.\n (0, legendFilter_1.legendClearSetState)(container, setState);\n // Update marks.\n setState('treemapDrillDown', (viewOptions) => {\n const { marks } = viewOptions;\n // Add filter transform for every marks,\n // which will skip for mark without color channel.\n const strPath = path.join('/');\n const newMarks = marks.map((mark) => {\n if (mark.type !== 'rect')\n return mark;\n let newData = originData;\n if (depth) {\n const filterData = originData\n .filter((item) => {\n const id = (0, util_1.get)(item, ['id']);\n return id && (id.match(`${strPath}/`) || strPath.match(id));\n })\n .map((item) => ({\n value: item.height === 0 ? (0, util_1.get)(item, ['value']) : undefined,\n name: (0, util_1.get)(item, ['id']),\n }));\n const { paddingLeft, paddingBottom, paddingRight } = layout;\n // New drill layout for calculation x y and filtration data.\n const newLayout = Object.assign(Object.assign({}, layout), { paddingTop: (layout.paddingTop || textGroup.getBBox().height + 10) /\n (depth + 1), paddingLeft: paddingLeft / (depth + 1), paddingBottom: paddingBottom / (depth + 1), paddingRight: paddingRight / (depth + 1), path: (d) => d.name, layer: (d) => d.depth === depth + 1 });\n // Transform the new matrix tree data.\n newData = (0, treeDataTransform_1.treeDataTransform)(filterData, newLayout, {\n value: 'value',\n })[0];\n }\n else {\n newData = originData.filter((item) => {\n return item.depth === 1;\n });\n }\n const colorDomain = [];\n newData.forEach(({ path }) => {\n colorDomain.push((0, util_1.last)(path));\n });\n // TreemapDrillDown by filtering the data and scale.\n return (0, util_1.deepMix)({}, mark, {\n data: newData,\n scale: {\n color: { domain: colorDomain },\n },\n });\n });\n return Object.assign(Object.assign({}, viewOptions), { marks: newMarks });\n });\n // The second argument is to allow the legendFilter event to be re-added; the update method itself causes legend to lose the interaction event.\n yield update(undefined, ['legendFilter']);\n });\n //\n const keyofLabel = (d) => d.attributes.key.split('-')[0];\n const keyofRect = (d) => (0, util_1.get)(d, ['__data__', 'key']);\n // Elements and BreadCrumb click.\n const createDrillClick = (e) => {\n const item = e.target;\n const { markType, nodeName, attributes } = item || {};\n if (markType !== 'rect' && nodeName !== g_1.Shape.TEXT)\n return;\n const key = nodeName === g_1.Shape.TEXT && (0, util_1.get)(attributes, 'isTreemapLabel') === true\n ? keyofLabel(item)\n : keyofRect(item);\n const node = (0, util_1.find)(originData, (d) => d.id === key);\n // Node height = 0 no children\n if ((0, util_1.get)(node, 'height')) {\n drillDownClick((0, util_1.get)(node, 'path'), (0, util_1.get)(node, 'depth'));\n }\n };\n // Add click drill interaction.\n plotArea.addEventListener('click', createDrillClick);\n // Change attributes keys.\n const changeStyleKey = (0, util_1.keys)(Object.assign(Object.assign({}, state.active), state.inactive));\n const createActive = () => {\n const elements = (0, utils_1.getElements)(plotArea);\n elements.forEach((element) => {\n const cursor = (0, util_1.get)(element, ['style', 'cursor']);\n const node = (0, util_1.find)(originData, (d) => d.id === (0, util_1.get)(element, ['__data__', 'key']));\n if (cursor !== 'pointer' && (node === null || node === void 0 ? void 0 : node.height)) {\n element.style.cursor = 'pointer';\n const originalAttrs = (0, util_1.pick)(element.attributes, changeStyleKey);\n element.addEventListener('mouseenter', () => {\n element.attr(state.active);\n });\n element.addEventListener('mouseleave', () => {\n element.attr((0, util_1.deepMix)(originalAttrs, state.inactive));\n });\n }\n });\n };\n createActive();\n // Animate elements update, Add active.\n plotArea.addEventListener('mousemove', createActive);\n return () => {\n textGroup.remove();\n plotArea.removeEventListener('click', createDrillClick);\n plotArea.removeEventListener('mousemove', createActive);\n };\n };\n}\nexports.TreemapDrillDown = TreemapDrillDown;\n//# sourceMappingURL=treemapDrillDown.js.map","\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ElementPointMove = void 0;\nconst g_1 = require(\"@antv/g\");\nconst util_1 = require(\"@antv/util\");\nconst helper_1 = require(\"../utils/helper\");\nconst utils_1 = require(\"./utils\");\nconst DEFAULT_STYLE = {\n pointR: 6,\n pointStrokeWidth: 1,\n pointStroke: '#888',\n pointActiveStroke: '#f5f5f5',\n pathStroke: '#888',\n pathLineDash: [3, 4],\n labelFontSize: 12,\n labelFill: '#888',\n labelStroke: '#fff',\n labelLineWidth: 1,\n labelY: -6,\n labelX: 2,\n};\n// point shape name.\nconst MOVE_POINT_NAME = 'movePoint';\n// Element mouseenter change style.\nconst elementMouseenter = (e) => {\n const element = e.target;\n const { markType } = element;\n // Mark line.\n if (markType === 'line') {\n element.attr('_lineWidth', element.attr('lineWidth') || 1);\n element.attr('lineWidth', element.attr('_lineWidth') + 3);\n }\n // Mark interval.\n if (markType === 'interval') {\n element.attr('_opacity', element.attr('opacity') || 1);\n element.attr('opacity', 0.7 * element.attr('_opacity'));\n }\n};\n// Element mouseleave change style.\nconst elementMouseleave = (e) => {\n const element = e.target;\n const { markType } = element;\n // Mark line.\n if (markType === 'line') {\n element.attr('lineWidth', element.attr('_lineWidth'));\n }\n // Mark interval.\n if (markType === 'interval') {\n element.attr('opacity', element.attr('_opacity'));\n }\n};\n// Get the latest overall data based on the individual data changes.\nconst getNewData = (newChangeData, data, encode) => {\n return data.map((d) => {\n const isUpdate = ['x', 'color'].reduce((v, key) => {\n const field = encode[key];\n if (!field)\n return v;\n if (d[field] !== newChangeData[field])\n return false;\n return v;\n }, true);\n return isUpdate ? Object.assign(Object.assign({}, d), newChangeData) : d;\n });\n};\n// Find mark interval origin element data.\nconst getIntervalDataRatioTransformFn = (element) => {\n const y = (0, util_1.get)(element, ['__data__', 'y']);\n const y1 = (0, util_1.get)(element, ['__data__', 'y1']);\n const v = y1 - y;\n const { __data__: { data, encode, transform }, childNodes, } = element.parentNode;\n const isNormalizeY = (0, util_1.find)(transform, ({ type }) => type === 'normalizeY');\n const yField = (0, util_1.get)(encode, ['y', 'field']);\n const value = data[childNodes.indexOf(element)][yField];\n return (newValue, isTheta = false) => {\n if (isNormalizeY || isTheta) {\n return (newValue / (1 - newValue) / (v / (1 - v))) * value;\n }\n return newValue;\n };\n};\n// Find origin path data.\nconst getPathDataRatioTransformFn = (element, index) => {\n const v = (0, util_1.get)(element, ['__data__', 'seriesItems', index, '0', 'value']);\n const i = (0, util_1.get)(element, ['__data__', 'seriesIndex', index]);\n const { __data__: { data, encode, transform }, } = element.parentNode;\n const isNormalizeY = (0, util_1.find)(transform, ({ type }) => type === 'normalizeY');\n const yField = (0, util_1.get)(encode, ['y', 'field']);\n const value = data[i][yField];\n return (newValue) => {\n if (isNormalizeY) {\n if (v === 1) {\n return newValue;\n }\n return (newValue / (1 - newValue) / (v / (1 - v))) * value;\n }\n return newValue;\n };\n};\n// Point shape select change style.\nconst selectedPointsStyle = (pointsShape, selection, defaultStyle) => {\n pointsShape.forEach((shape, index) => {\n shape.attr('stroke', selection[1] === index\n ? defaultStyle['activeStroke']\n : defaultStyle['stroke']);\n });\n};\n// Create help show message shape.\nconst createHelpShape = (group, circle, pathStyle, labelStyle) => {\n const pathShape = new g_1.Path({\n style: pathStyle,\n });\n const labelShape = new g_1.Text({\n style: labelStyle,\n });\n circle.appendChild(labelShape);\n group.appendChild(pathShape);\n return [pathShape, labelShape];\n};\n// Get color scale type.\nconst getColorType = (scaleColor, color) => {\n const indexOf = (0, util_1.get)(scaleColor, ['options', 'range', 'indexOf']);\n if (!indexOf)\n return;\n const i = scaleColor.options.range.indexOf(color);\n return scaleColor.sortedDomain[i];\n};\n// Get the same direction new point.\nconst getSamePointPosition = (center, point, target) => {\n const oldR = (0, utils_1.getPointsR)(center, point);\n const newR = (0, utils_1.getPointsR)(center, target);\n const ratio = newR / oldR;\n const newX = center[0] + (point[0] - center[0]) * ratio;\n const newY = center[1] + (point[1] - center[1]) * ratio;\n return [newX, newY];\n};\n/**\n * ElementPointMove interaction.\n */\nfunction ElementPointMove(elementPointMoveOptions = {}) {\n const { selection = [], precision = 2 } = elementPointMoveOptions, style = __rest(elementPointMoveOptions, [\"selection\", \"precision\"]);\n const defaultStyle = Object.assign(Object.assign({}, DEFAULT_STYLE), (style || {}));\n // Shape default style.\n const pathDefaultStyle = (0, helper_1.subObject)(defaultStyle, 'path');\n const labelDefaultStyle = (0, helper_1.subObject)(defaultStyle, 'label');\n const pointDefaultStyle = (0, helper_1.subObject)(defaultStyle, 'point');\n return (context, _, emitter) => {\n const { update, setState, container, view, options: { marks, coordinate: coordinateOptions }, } = context;\n const plotArea = (0, utils_1.selectPlotArea)(container);\n let elements = (0, utils_1.getElements)(plotArea);\n let newState;\n let newSelection = selection;\n const { transform = [], type: coordinateType } = coordinateOptions;\n const isTranspose = !!(0, util_1.find)(transform, ({ type }) => type === 'transpose');\n const isPolar = coordinateType === 'polar';\n const isTheta = coordinateType === 'theta';\n const isArea = !!(0, util_1.find)(elements, ({ markType }) => markType === 'area');\n if (isArea) {\n elements = elements.filter(({ markType }) => markType === 'area');\n }\n // Create points\n const pointsGroup = new g_1.Group({\n style: {\n // Tooltip point need down.\n zIndex: 2,\n },\n });\n plotArea.appendChild(pointsGroup);\n const selectedChange = () => {\n emitter.emit('element-point:select', {\n nativeEvent: true,\n data: {\n selection: newSelection,\n },\n });\n };\n const dataChange = (changeData, data) => {\n emitter.emit('element-point:moved', {\n nativeEvent: true,\n data: {\n changeData,\n data,\n },\n });\n };\n // Element click change style.\n const elementClick = (e) => {\n const element = e.target;\n newSelection = [element.parentNode.childNodes.indexOf(element)];\n selectedChange();\n createPoints(element);\n };\n const elementSelect = (d) => {\n const { data: { selection }, nativeEvent, } = d;\n if (nativeEvent)\n return;\n newSelection = selection;\n const element = (0, util_1.get)(elements, [newSelection === null || newSelection === void 0 ? void 0 : newSelection[0]]);\n if (element) {\n createPoints(element);\n }\n };\n // Create select element points.\n const createPoints = (element) => {\n const { attributes, markType, __data__: data } = element;\n const { stroke: fill } = attributes;\n const { points, seriesTitle, color, title, seriesX, y1 } = data;\n // Transpose Currently only do mark interval;\n if (isTranspose && markType !== 'interval')\n return;\n const { scale, coordinate } = (newState === null || newState === void 0 ? void 0 : newState.view) || view;\n const { color: scaleColor, y: scaleY, x: scaleX } = scale;\n const center = coordinate.getCenter();\n pointsGroup.removeChildren();\n let downPoint;\n const updateView = (x, y, color, markTypes) => __awaiter(this, void 0, void 0, function* () {\n setState('elementPointMove', (viewOptions) => {\n var _a;\n // Update marks.\n const newMarks = (((_a = newState === null || newState === void 0 ? void 0 : newState.options) === null || _a === void 0 ? void 0 : _a.marks) || marks).map((mark) => {\n if (!markTypes.includes(mark.type))\n return mark;\n const { data, encode } = mark;\n const encodeKeys = Object.keys(encode);\n // Get change new one element data.\n const newChangeData = encodeKeys.reduce((value, key) => {\n const dataKey = encode[key];\n if (key === 'x') {\n value[dataKey] = x;\n }\n if (key === 'y') {\n value[dataKey] = y;\n }\n if (key === 'color') {\n value[dataKey] = color;\n }\n return value;\n }, {});\n // Get change new all data.\n const newData = getNewData(newChangeData, data, encode);\n dataChange(newChangeData, newData);\n return (0, util_1.deepMix)({}, mark, {\n data: newData,\n // No need animate\n animate: false,\n });\n });\n return Object.assign(Object.assign({}, viewOptions), { marks: newMarks });\n });\n return yield update('elementPointMove');\n });\n if (['line', 'area'].includes(markType)) {\n points.forEach((p, index) => {\n const title = scaleX.invert(seriesX[index]);\n // Area points have bottom point.\n if (!title)\n return;\n const circle = new g_1.Circle({\n name: MOVE_POINT_NAME,\n style: Object.assign({ cx: p[0], cy: p[1], fill }, pointDefaultStyle),\n });\n const ratioTransform = getPathDataRatioTransformFn(element, index);\n circle.addEventListener('mousedown', (e) => {\n const oldPoint = coordinate.output([seriesX[index], 0]);\n const pathLength = seriesTitle === null || seriesTitle === void 0 ? void 0 : seriesTitle.length;\n container.attr('cursor', 'move');\n if (newSelection[1] !== index) {\n newSelection[1] = index;\n selectedChange();\n }\n selectedPointsStyle(pointsGroup.childNodes, newSelection, pointDefaultStyle);\n const [pathShape, labelShape] = createHelpShape(pointsGroup, circle, pathDefaultStyle, labelDefaultStyle);\n // Point move change text\n const pointMousemove = (e) => {\n const newCy = p[1] + e.clientY - downPoint[1];\n // Area/Radar chart.\n if (isArea) {\n // Radar chart.\n if (isPolar) {\n const newCx = p[0] + e.clientX - downPoint[0];\n const [newX, newY] = getSamePointPosition(center, oldPoint, [\n newCx,\n newCy,\n ]);\n const [, initY] = coordinate.output([1, scaleY.output(0)]);\n const [, y] = coordinate.invert([\n newX,\n initY - (points[index + pathLength][1] - newY),\n ]);\n const nextIndex = (index + 1) % pathLength;\n const lastIndex = (index - 1 + pathLength) % pathLength;\n const newPath = (0, utils_1.getPointsPath)([\n points[lastIndex],\n [newX, newY],\n seriesTitle[nextIndex] && points[nextIndex],\n ]);\n labelShape.attr('text', ratioTransform(scaleY.invert(y)).toFixed(precision));\n pathShape.attr('d', newPath);\n circle.attr('cx', newX);\n circle.attr('cy', newY);\n }\n else {\n // Area chart.\n const [, initY] = coordinate.output([1, scaleY.output(0)]);\n const [, y] = coordinate.invert([\n p[0],\n initY - (points[index + pathLength][1] - newCy),\n ]);\n const newPath = (0, utils_1.getPointsPath)([\n points[index - 1],\n [p[0], newCy],\n seriesTitle[index + 1] && points[index + 1],\n ]);\n labelShape.attr('text', ratioTransform(scaleY.invert(y)).toFixed(precision));\n pathShape.attr('d', newPath);\n circle.attr('cy', newCy);\n }\n }\n else {\n // Line chart.\n const [, y] = coordinate.invert([p[0], newCy]);\n const newPath = (0, utils_1.getPointsPath)([\n points[index - 1],\n [p[0], newCy],\n points[index + 1],\n ]);\n labelShape.attr('text', scaleY.invert(y).toFixed(precision));\n pathShape.attr('d', newPath);\n circle.attr('cy', newCy);\n }\n };\n downPoint = [e.clientX, e.clientY];\n window.addEventListener('mousemove', pointMousemove);\n const mouseupFn = () => __awaiter(this, void 0, void 0, function* () {\n container.attr('cursor', 'default');\n window.removeEventListener('mousemove', pointMousemove);\n container.removeEventListener('mouseup', mouseupFn);\n if ((0, util_1.isUndefined)(labelShape.attr('text')))\n return;\n const y = Number(labelShape.attr('text'));\n const colorType = getColorType(scaleColor, color);\n newState = yield updateView(title, y, colorType, [\n 'line',\n 'area',\n ]);\n labelShape.remove();\n pathShape.remove();\n createPoints(element);\n });\n container.addEventListener('mouseup', mouseupFn);\n });\n pointsGroup.appendChild(circle);\n });\n selectedPointsStyle(pointsGroup.childNodes, newSelection, pointDefaultStyle);\n }\n else if (markType === 'interval') {\n // Column chart point.\n let circlePoint = [(points[0][0] + points[1][0]) / 2, points[0][1]];\n // Bar chart point.\n if (isTranspose) {\n circlePoint = [points[0][0], (points[0][1] + points[1][1]) / 2];\n }\n else if (isTheta) {\n // Pie chart point.\n circlePoint = points[0];\n }\n const ratioTransform = getIntervalDataRatioTransformFn(element);\n const circle = new g_1.Circle({\n name: MOVE_POINT_NAME,\n style: Object.assign(Object.assign({ cx: circlePoint[0], cy: circlePoint[1], fill }, pointDefaultStyle), { stroke: pointDefaultStyle['activeStroke'] }),\n });\n circle.addEventListener('mousedown', (e) => {\n container.attr('cursor', 'move');\n const colorType = getColorType(scaleColor, color);\n const [pathShape, labelShape] = createHelpShape(pointsGroup, circle, pathDefaultStyle, labelDefaultStyle);\n // Point move change text\n const pointMousemove = (e) => {\n if (isTranspose) {\n // Bar chart.\n const newCx = circlePoint[0] + e.clientX - downPoint[0];\n const [initX] = coordinate.output([\n scaleY.output(0),\n scaleY.output(0),\n ]);\n const [, x] = coordinate.invert([\n initX + (newCx - points[2][0]),\n circlePoint[1],\n ]);\n const newPath = (0, utils_1.getPointsPath)([\n [newCx, points[0][1]],\n [newCx, points[1][1]],\n points[2],\n points[3],\n ], true);\n labelShape.attr('text', ratioTransform(scaleY.invert(x)).toFixed(precision));\n pathShape.attr('d', newPath);\n circle.attr('cx', newCx);\n }\n else if (isTheta) {\n // Pie chart.\n const newCy = circlePoint[1] + e.clientY - downPoint[1];\n const newCx = circlePoint[0] + e.clientX - downPoint[0];\n const [newXOut, newYOut] = getSamePointPosition(center, [newCx, newCy], circlePoint);\n const [newXIn, newYIn] = getSamePointPosition(center, [newCx, newCy], points[1]);\n const lastPercent = coordinate.invert([newXOut, newYOut])[1];\n const percent = y1 - lastPercent;\n if (percent < 0)\n return;\n const newPath = (0, utils_1.getThetaPath)(center, [[newXOut, newYOut], [newXIn, newYIn], points[2], points[3]], percent > 0.5 ? 1 : 0);\n labelShape.attr('text', ratioTransform(percent, true).toFixed(precision));\n pathShape.attr('d', newPath);\n circle.attr('cx', newXOut);\n circle.attr('cy', newYOut);\n }\n else {\n // Column chart.\n const newCy = circlePoint[1] + e.clientY - downPoint[1];\n const [, initY] = coordinate.output([1, scaleY.output(0)]);\n const [, y] = coordinate.invert([\n circlePoint[0],\n initY - (points[2][1] - newCy),\n ]);\n const newPath = (0, utils_1.getPointsPath)([\n [points[0][0], newCy],\n [points[1][0], newCy],\n points[2],\n points[3],\n ], true);\n labelShape.attr('text', ratioTransform(scaleY.invert(y)).toFixed(precision));\n pathShape.attr('d', newPath);\n circle.attr('cy', newCy);\n }\n };\n downPoint = [e.clientX, e.clientY];\n window.addEventListener('mousemove', pointMousemove);\n // Change mosueup change data and update 、clear shape.\n const mouseupFn = () => __awaiter(this, void 0, void 0, function* () {\n container.attr('cursor', 'default');\n container.removeEventListener('mouseup', mouseupFn);\n window.removeEventListener('mousemove', pointMousemove);\n if ((0, util_1.isUndefined)(labelShape.attr('text')))\n return;\n const y = Number(labelShape.attr('text'));\n newState = yield updateView(title, y, colorType, [markType]);\n labelShape.remove();\n pathShape.remove();\n createPoints(element);\n });\n container.addEventListener('mouseup', mouseupFn);\n });\n pointsGroup.appendChild(circle);\n }\n };\n // Add EventListener.\n elements.forEach((element, index) => {\n if (newSelection[0] === index) {\n createPoints(element);\n }\n element.addEventListener('click', elementClick);\n element.addEventListener('mouseenter', elementMouseenter);\n element.addEventListener('mouseleave', elementMouseleave);\n });\n const rootClick = (e) => {\n const element = e === null || e === void 0 ? void 0 : e.target;\n if (!element ||\n (element.name !== MOVE_POINT_NAME && !elements.includes(element))) {\n newSelection = [];\n selectedChange();\n pointsGroup.removeChildren();\n }\n };\n emitter.on('element-point:select', elementSelect);\n emitter.on('element-point:unselect', rootClick);\n container.addEventListener('mousedown', rootClick);\n // Remove EventListener.\n return () => {\n pointsGroup.remove();\n emitter.off('element-point:select', elementSelect);\n emitter.off('element-point:unselect', rootClick);\n container.removeEventListener('mousedown', rootClick);\n elements.forEach((element) => {\n element.removeEventListener('click', elementClick);\n element.removeEventListener('mouseenter', elementMouseenter);\n element.removeEventListener('mouseleave', elementMouseleave);\n });\n };\n };\n}\nexports.ElementPointMove = ElementPointMove;\n//# sourceMappingURL=elementPointMove.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EMA = exports.Log = exports.Venn = exports.KDE = exports.Slice = exports.Join = exports.WordCloud = exports.Arc = exports.Sankey = exports.Tree = exports.Cluster = exports.Map = exports.Custom = exports.Inline = exports.SortBy = exports.Rename = exports.Pick = exports.Sort = exports.Filter = exports.Fold = exports.Fetch = void 0;\nvar fetch_1 = require(\"./fetch\");\nObject.defineProperty(exports, \"Fetch\", { enumerable: true, get: function () { return fetch_1.Fetch; } });\nvar fold_1 = require(\"./fold\");\nObject.defineProperty(exports, \"Fold\", { enumerable: true, get: function () { return fold_1.Fold; } });\nvar filter_1 = require(\"./filter\");\nObject.defineProperty(exports, \"Filter\", { enumerable: true, get: function () { return filter_1.Filter; } });\nvar sort_1 = require(\"./sort\");\nObject.defineProperty(exports, \"Sort\", { enumerable: true, get: function () { return sort_1.Sort; } });\nvar pick_1 = require(\"./pick\");\nObject.defineProperty(exports, \"Pick\", { enumerable: true, get: function () { return pick_1.Pick; } });\nvar rename_1 = require(\"./rename\");\nObject.defineProperty(exports, \"Rename\", { enumerable: true, get: function () { return rename_1.Rename; } });\nvar sortBy_1 = require(\"./sortBy\");\nObject.defineProperty(exports, \"SortBy\", { enumerable: true, get: function () { return sortBy_1.SortBy; } });\nvar inline_1 = require(\"./inline\");\nObject.defineProperty(exports, \"Inline\", { enumerable: true, get: function () { return inline_1.Inline; } });\nvar custom_1 = require(\"./custom\");\nObject.defineProperty(exports, \"Custom\", { enumerable: true, get: function () { return custom_1.Custom; } });\nvar map_1 = require(\"./map\");\nObject.defineProperty(exports, \"Map\", { enumerable: true, get: function () { return map_1.Map; } });\nvar cluster_1 = require(\"./cluster\");\nObject.defineProperty(exports, \"Cluster\", { enumerable: true, get: function () { return cluster_1.Cluster; } });\nvar tree_1 = require(\"./tree\");\nObject.defineProperty(exports, \"Tree\", { enumerable: true, get: function () { return tree_1.Tree; } });\nvar sankey_1 = require(\"./sankey\");\nObject.defineProperty(exports, \"Sankey\", { enumerable: true, get: function () { return sankey_1.Sankey; } });\nvar arc_1 = require(\"./arc\");\nObject.defineProperty(exports, \"Arc\", { enumerable: true, get: function () { return arc_1.Arc; } });\nvar wordCloud_1 = require(\"./wordCloud\");\nObject.defineProperty(exports, \"WordCloud\", { enumerable: true, get: function () { return wordCloud_1.WordCloud; } });\nvar join_1 = require(\"./join\");\nObject.defineProperty(exports, \"Join\", { enumerable: true, get: function () { return join_1.Join; } });\nvar slice_1 = require(\"./slice\");\nObject.defineProperty(exports, \"Slice\", { enumerable: true, get: function () { return slice_1.Slice; } });\nvar kde_1 = require(\"./kde\");\nObject.defineProperty(exports, \"KDE\", { enumerable: true, get: function () { return kde_1.KDE; } });\nvar venn_1 = require(\"./venn\");\nObject.defineProperty(exports, \"Venn\", { enumerable: true, get: function () { return venn_1.Venn; } });\nvar log_1 = require(\"./log\");\nObject.defineProperty(exports, \"Log\", { enumerable: true, get: function () { return log_1.Log; } });\nvar ema_1 = require(\"./ema\");\nObject.defineProperty(exports, \"EMA\", { enumerable: true, get: function () { return ema_1.EMA; } });\n//# sourceMappingURL=index.js.map","\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Fetch = void 0;\nconst d3_dsv_1 = require(\"@antv/vendor/d3-dsv\");\nconst helper_1 = require(\"../utils/helper\");\nconst Fetch = (options) => {\n const { value, format = value.split('.').pop(), delimiter = ',', autoType = true, } = options;\n return () => __awaiter(void 0, void 0, void 0, function* () {\n const response = yield fetch(value);\n if (format === 'csv') {\n // @see: https://github.com/d3/d3-dsv#dsv_parse\n const str = yield response.text();\n return (0, d3_dsv_1.dsvFormat)(delimiter).parse(str, autoType ? d3_dsv_1.autoType : helper_1.identity);\n }\n else if (format === 'json') {\n return yield response.json();\n }\n throw new Error(`Unknown format: ${format}.`);\n });\n};\nexports.Fetch = Fetch;\nexports.Fetch.props = {};\n//# sourceMappingURL=fetch.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Fold = exports.isEmpty = void 0;\nfunction isEmpty(obj) {\n return !obj || Object.keys(obj).length === 0;\n}\nexports.isEmpty = isEmpty;\n/**\n * Collapses (or “folds”) one or more data fields into two\n * properties: `key` (contains the original data field name)\n * and `value` (contains the original data value.)\n */\nconst Fold = (options) => {\n const { fields, key = 'key', value = 'value' } = options;\n return (data) => {\n if (isEmpty(fields))\n return data;\n return data.flatMap((d) => fields.map((f) => (Object.assign(Object.assign({}, d), { [key]: f, [value]: d[f] }))));\n };\n};\nexports.Fold = Fold;\nexports.Fold.props = {};\n//# sourceMappingURL=fold.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Filter = exports.defined = void 0;\nfunction defined(d) {\n return d !== undefined && d !== null && !Number.isNaN(d);\n}\nexports.defined = defined;\n/**\n * Filter data by specified fields and filter callback for each fields.\n * It saves datum with every fields defined by default.\n */\nconst Filter = (options) => {\n const { callback = defined } = options;\n return (data) => data.filter(callback);\n};\nexports.Filter = Filter;\nexports.Filter.props = {};\n//# sourceMappingURL=filter.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Sort = exports.defined = void 0;\nfunction defined(d) {\n return d !== undefined && d !== null && !Number.isNaN(d);\n}\nexports.defined = defined;\n/**\n * Sort data similar with Array.prototypo.sort.\n */\nconst Sort = (options) => {\n const { callback } = options;\n return (data) => (Array.isArray(data) ? [...data].sort(callback) : data);\n};\nexports.Sort = Sort;\nexports.Sort.props = {};\n//# sourceMappingURL=sort.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Pick = void 0;\nfunction pick(v, fields = []) {\n return fields.reduce((datum, field) => {\n // Pick the data deeply.\n if (field in v) {\n datum[field] = v[field];\n }\n return datum;\n }, {});\n}\n/**\n * Immutable data pick by specified fields.\n */\nconst Pick = (options) => {\n const { fields } = options;\n return (data) => data.map((d) => pick(d, fields));\n};\nexports.Pick = Pick;\nexports.Pick.props = {};\n//# sourceMappingURL=pick.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Rename = exports.isEmpty = void 0;\nfunction isEmpty(obj) {\n return Object.keys(obj).length === 0;\n}\nexports.isEmpty = isEmpty;\n/**\n * Immutable data rename by specified fields.\n */\nconst Rename = (options) => {\n return (data) => {\n if (!options || isEmpty(options))\n return data;\n const rename = (v) => Object.entries(v).reduce((datum, [key, value]) => ((datum[options[key] || key] = value), datum), {});\n return data.map(rename);\n };\n};\nexports.Rename = Rename;\nexports.Rename.props = {};\n//# sourceMappingURL=rename.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SortBy = void 0;\nconst fields_1 = require(\"./utils/fields\");\n/**\n * Immutable data sort by specified fields.\n */\nconst SortBy = (options) => {\n const { fields: F = [] } = options;\n const normalizedF = (0, fields_1.normalizeFields)(F, true);\n return (data) => {\n const comparator = (a, b) => normalizedF.reduce((ret, [field, order = true]) => {\n if (ret !== 0) {\n return ret;\n }\n if (order) {\n return a[field] < b[field] ? -1 : +(a[field] !== b[field]);\n }\n else {\n return a[field] > b[field] ? -1 : +(a[field] !== b[field]);\n }\n }, 0);\n return [...data].sort(comparator);\n };\n};\nexports.SortBy = SortBy;\nexports.SortBy.props = {};\n//# sourceMappingURL=sortBy.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.normalizeFields = void 0;\n/**\n *\n * @description Converts a random format array into a regular two-dimensional array\n * @example ['a', 'b', ['c', value]] => [['a', defaultValue], ['b', defaultValue], ['c', value]]\n */\nfunction normalizeFields(fields, defaultValue) {\n return fields.map((d) => {\n if (Array.isArray(d)) {\n const [field, value = defaultValue] = d;\n return [field, value];\n }\n return [d, defaultValue];\n });\n}\nexports.normalizeFields = normalizeFields;\n//# sourceMappingURL=fields.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Inline = void 0;\nconst Inline = (options) => {\n const { value } = options;\n return () => value;\n};\nexports.Inline = Inline;\nexports.Inline.props = {};\n//# sourceMappingURL=inline.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Custom = void 0;\nconst helper_1 = require(\"../utils/helper\");\n/**\n * Connector transfom by function.\n */\nconst Custom = (options) => {\n const { callback = helper_1.identity } = options;\n return (data) => callback(data);\n};\nexports.Custom = Custom;\nexports.Custom.props = {};\n//# sourceMappingURL=custom.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Map = void 0;\nconst helper_1 = require(\"../utils/helper\");\n/**\n * Map transform by function.\n */\nconst Map = (options) => {\n const { callback = helper_1.identity } = options;\n return (data) => (Array.isArray(data) ? data.map(callback) : data);\n};\nexports.Map = Map;\nexports.Map.props = {};\n//# sourceMappingURL=map.js.map","\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WordCloud = exports.normalizeFontSize = exports.processImageMask = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst flow_1 = require(\"./utils/flow\");\nconst d3_cloud_1 = require(\"./utils/d3-cloud\");\nconst DEFAULT_OPTIONS = {\n fontSize: [20, 60],\n font: 'Impact',\n padding: 2,\n rotate: function () {\n return (~~(Math.random() * 6) - 3) * 30;\n },\n};\n/**\n * Process the image mask of wordCloud.\n * @param img\n * @returns\n */\nfunction processImageMask(img) {\n return new Promise((res, rej) => {\n if (img instanceof HTMLImageElement) {\n res(img);\n return;\n }\n if (typeof img === 'string') {\n const image = new Image();\n image.crossOrigin = 'anonymous';\n image.src = img;\n image.onload = () => res(image);\n image.onerror = () => {\n console.error(`'image ${img} load failed !!!'`);\n rej();\n };\n return;\n }\n rej();\n });\n}\nexports.processImageMask = processImageMask;\n/**\n * normalize fontSize range to d3-cloud fontSize function.\n * @param fontSize\n * @param range\n * @returns\n */\nfunction normalizeFontSize(fontSize, range) {\n if (typeof fontSize === 'function')\n return fontSize;\n if (Array.isArray(fontSize)) {\n const [fMin, fMax] = fontSize;\n if (!range)\n return () => (fMax + fMin) / 2;\n const [min, max] = range;\n if (max === min)\n return () => (fMax + fMin) / 2;\n return ({ value }) => ((fMax - fMin) / (max - min)) * (value - min) + fMin;\n }\n return () => fontSize;\n}\nexports.normalizeFontSize = normalizeFontSize;\nconst WordCloud = (options, context) => {\n return (data) => __awaiter(void 0, void 0, void 0, function* () {\n const cloudOptions = Object.assign({}, DEFAULT_OPTIONS, options, {\n canvas: context.createCanvas,\n });\n const layout = (0, d3_cloud_1.tagCloud)();\n yield (0, flow_1.flow)(layout, cloudOptions)\n .set('fontSize', (v) => {\n const arr = data.map((d) => d.value);\n return normalizeFontSize(v, [(0, d3_array_1.min)(arr), (0, d3_array_1.max)(arr)]);\n })\n .set('font')\n .set('fontStyle')\n .set('fontWeight')\n .set('padding')\n .set('rotate')\n .set('size')\n .set('spiral')\n .set('timeInterval')\n .set('random')\n .set('text')\n .set('on')\n .set('canvas')\n .setAsync('imageMask', processImageMask, layout.createMask);\n layout.words([...data]);\n const result = layout.start();\n const [cw, ch] = cloudOptions.size;\n const defaultBounds = [\n { x: 0, y: 0 },\n { x: cw, y: ch },\n ];\n const { _bounds: bounds = defaultBounds, _tags, hasImage } = result;\n const tags = _tags.map((_a) => {\n var { x, y, font } = _a, rest = __rest(_a, [\"x\", \"y\", \"font\"]);\n return (Object.assign(Object.assign({}, rest), { x: x + cw / 2, y: y + ch / 2, fontFamily: font }));\n });\n // Append two data to replace the corner of top-left and bottom-right, avoid calculate the actual bounds will occur some error.\n const [{ x: tlx, y: tly }, { x: brx, y: bry }] = bounds;\n const invisibleText = { text: '', value: 0, opacity: 0, fontSize: 0 };\n tags.push(Object.assign(Object.assign({}, invisibleText), { x: hasImage ? 0 : tlx, y: hasImage ? 0 : tly }), Object.assign(Object.assign({}, invisibleText), { x: hasImage ? cw : brx, y: hasImage ? ch : bry }));\n return tags;\n });\n};\nexports.WordCloud = WordCloud;\nexports.WordCloud.props = {};\n//# sourceMappingURL=wordCloud.js.map","\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.flow = void 0;\n/**\n * @todo Combine with the `Container` util\n */\nfunction flow(target, source) {\n return {\n set(key, normalize, callback) {\n if (source[key] === undefined)\n return this;\n const value = normalize ? normalize.call(null, source[key]) : source[key];\n if (callback)\n callback.call(null, value);\n else if (typeof target[key] === 'function')\n target[key](value);\n else\n target[key] = value;\n return this;\n },\n setAsync(key, normalize, callback) {\n return __awaiter(this, void 0, void 0, function* () {\n if (source[key] === undefined)\n return this;\n const value = normalize\n ? yield normalize.call(null, source[key])\n : source[key];\n if (callback)\n callback.call(null, value);\n else if (typeof target[key] === 'function')\n target[key](value);\n else\n target[key] = value;\n return this;\n });\n },\n };\n}\nexports.flow = flow;\n//# sourceMappingURL=flow.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.tagCloud = void 0;\nconst cloudRadians = Math.PI / 180, cw = (1 << 11) >> 5, ch = 1 << 11;\nfunction cloudText(d) {\n return d.text;\n}\nfunction cloudFont() {\n return 'serif';\n}\nfunction cloudFontNormal() {\n return 'normal';\n}\nfunction cloudFontSize(d) {\n return d.value;\n}\nfunction cloudRotate() {\n return ~~(Math.random() * 2) * 90;\n}\nfunction cloudPadding() {\n return 1;\n}\nfunction cloudDispatch() {\n return;\n}\n// Fetches a monochrome sprite bitmap for the specified text.\n// Load in batches for speed.\nfunction cloudSprite(contextAndRatio, d, data, di) {\n if (d.sprite)\n return;\n const c = contextAndRatio.context, ratio = contextAndRatio.ratio;\n c.clearRect(0, 0, (cw << 5) / ratio, ch / ratio);\n let x = 0, y = 0, maxh = 0;\n const n = data.length;\n --di;\n while (++di < n) {\n d = data[di];\n c.save();\n c.font =\n d.style +\n ' ' +\n d.weight +\n ' ' +\n ~~((d.size + 1) / ratio) +\n 'px ' +\n d.font;\n let w = c.measureText(d.text + 'm').width * ratio, h = d.size << 1;\n if (d.rotate) {\n const sr = Math.sin(d.rotate * cloudRadians), cr = Math.cos(d.rotate * cloudRadians), wcr = w * cr, wsr = w * sr, hcr = h * cr, hsr = h * sr;\n w =\n ((Math.max(Math.abs(wcr + hsr), Math.abs(wcr - hsr)) + 0x1f) >> 5) << 5;\n h = ~~Math.max(Math.abs(wsr + hcr), Math.abs(wsr - hcr));\n }\n else {\n w = ((w + 0x1f) >> 5) << 5;\n }\n if (h > maxh)\n maxh = h;\n if (x + w >= cw << 5) {\n x = 0;\n y += maxh;\n maxh = 0;\n }\n if (y + h >= ch)\n break;\n c.translate((x + (w >> 1)) / ratio, (y + (h >> 1)) / ratio);\n if (d.rotate)\n c.rotate(d.rotate * cloudRadians);\n c.fillText(d.text, 0, 0);\n if (d.padding) {\n c.lineWidth = 2 * d.padding;\n c.strokeText(d.text, 0, 0);\n }\n c.restore();\n d.width = w;\n d.height = h;\n d.xoff = x;\n d.yoff = y;\n d.x1 = w >> 1;\n d.y1 = h >> 1;\n d.x0 = -d.x1;\n d.y0 = -d.y1;\n d.hasText = true;\n x += w;\n }\n const pixels = c.getImageData(0, 0, (cw << 5) / ratio, ch / ratio).data, sprite = [];\n while (--di >= 0) {\n d = data[di];\n if (!d.hasText)\n continue;\n const w = d.width, w32 = w >> 5;\n let h = d.y1 - d.y0;\n // Zero the buffer\n for (let i = 0; i < h * w32; i++)\n sprite[i] = 0;\n x = d.xoff;\n if (x == null)\n return;\n y = d.yoff;\n let seen = 0, seenRow = -1;\n for (let j = 0; j < h; j++) {\n for (let i = 0; i < w; i++) {\n const k = w32 * j + (i >> 5), m = pixels[((y + j) * (cw << 5) + (x + i)) << 2]\n ? 1 << (31 - (i % 32))\n : 0;\n sprite[k] |= m;\n seen |= m;\n }\n if (seen)\n seenRow = j;\n else {\n d.y0++;\n h--;\n j--;\n y++;\n }\n }\n d.y1 = d.y0 + seenRow;\n d.sprite = sprite.slice(0, (d.y1 - d.y0) * w32);\n }\n}\n// Use mask-based collision detection.\nfunction cloudCollide(tag, board, sw) {\n sw >>= 5;\n const sprite = tag.sprite, w = tag.width >> 5, lx = tag.x - (w << 4), sx = lx & 0x7f, msx = 32 - sx, h = tag.y1 - tag.y0;\n let x = (tag.y + tag.y0) * sw + (lx >> 5), last;\n for (let j = 0; j < h; j++) {\n last = 0;\n for (let i = 0; i <= w; i++) {\n if (((last << msx) | (i < w ? (last = sprite[j * w + i]) >>> sx : 0)) &\n board[x + i])\n return true;\n }\n x += sw;\n }\n return false;\n}\nfunction cloudBounds(bounds, d) {\n const b0 = bounds[0], b1 = bounds[1];\n if (d.x + d.x0 < b0.x)\n b0.x = d.x + d.x0;\n if (d.y + d.y0 < b0.y)\n b0.y = d.y + d.y0;\n if (d.x + d.x1 > b1.x)\n b1.x = d.x + d.x1;\n if (d.y + d.y1 > b1.y)\n b1.y = d.y + d.y1;\n}\nfunction collideRects(a, b) {\n return (a.x + a.x1 > b[0].x &&\n a.x + a.x0 < b[1].x &&\n a.y + a.y1 > b[0].y &&\n a.y + a.y0 < b[1].y);\n}\nfunction archimedeanSpiral(size) {\n const e = size[0] / size[1];\n return function (t) {\n return [e * (t *= 0.1) * Math.cos(t), t * Math.sin(t)];\n };\n}\nfunction rectangularSpiral(size) {\n const dy = 4, dx = (dy * size[0]) / size[1];\n let x = 0, y = 0;\n return function (t) {\n const sign = t < 0 ? -1 : 1;\n // See triangular numbers: T_n = n * (n + 1) / 2.\n switch ((Math.sqrt(1 + 4 * sign * t) - sign) & 3) {\n case 0:\n x += dx;\n break;\n case 1:\n y += dy;\n break;\n case 2:\n x -= dx;\n break;\n default:\n y -= dy;\n break;\n }\n return [x, y];\n };\n}\n// TODO reuse arrays?\nfunction zeroArray(n) {\n const a = [];\n let i = -1;\n while (++i < n)\n a[i] = 0;\n return a;\n}\nfunction cloudCanvas() {\n return document.createElement('canvas');\n}\nfunction functor(d) {\n return typeof d === 'function'\n ? d\n : function () {\n return d;\n };\n}\nconst spirals = {\n archimedean: archimedeanSpiral,\n rectangular: rectangularSpiral,\n};\nfunction tagCloud() {\n let size = [256, 256], text = cloudText, font = cloudFont, fontSize = cloudFontSize, fontWeight = cloudFontNormal, rotate = cloudRotate, padding = cloudPadding, spiral = archimedeanSpiral, random = Math.random, event = cloudDispatch, words = [], timer = null, timeInterval = Infinity, canvas = cloudCanvas;\n const fontStyle = cloudFontNormal;\n const cloud = {};\n cloud.start = function () {\n const [width, height] = size;\n const contextAndRatio = getContext(canvas()), board = cloud.board ? cloud.board : zeroArray((size[0] >> 5) * size[1]), n = words.length, tags = [], data = words\n .map(function (d, i, data) {\n d.text = text.call(this, d, i, data);\n d.font = font.call(this, d, i, data);\n d.style = fontStyle.call(this, d, i, data);\n d.weight = fontWeight.call(this, d, i, data);\n d.rotate = rotate.call(this, d, i, data);\n d.size = ~~fontSize.call(this, d, i, data);\n d.padding = padding.call(this, d, i, data);\n return d;\n })\n .sort(function (a, b) {\n return b.size - a.size;\n });\n let i = -1, bounds = !cloud.board\n ? undefined\n : [\n {\n x: 0,\n y: 0,\n },\n {\n x: width,\n y: height,\n },\n ];\n if (timer)\n clearInterval(timer);\n timer = setInterval(step, 0);\n step();\n function step() {\n const start = Date.now();\n while (Date.now() - start < timeInterval && ++i < n) {\n const d = data[i];\n d.x = (width * (random() + 0.5)) >> 1;\n d.y = (height * (random() + 0.5)) >> 1;\n cloudSprite(contextAndRatio, d, data, i);\n if (d.hasText && place(board, d, bounds)) {\n event.call(null, 'word', { cloud, word: d });\n tags.push(d);\n if (bounds) {\n if (!cloud.hasImage) {\n // update bounds if image mask not set\n cloudBounds(bounds, d);\n }\n }\n else {\n bounds = [\n { x: d.x + d.x0, y: d.y + d.y0 },\n { x: d.x + d.x1, y: d.y + d.y1 },\n ];\n }\n // Temporary hack\n d.x -= size[0] >> 1;\n d.y -= size[1] >> 1;\n }\n }\n cloud._tags = tags;\n cloud._bounds = bounds;\n if (i >= n) {\n cloud.stop();\n event.call(null, 'end', { cloud, words: tags, bounds });\n }\n }\n return cloud;\n };\n cloud.stop = function () {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n return cloud;\n };\n function getContext(canvas) {\n canvas.width = canvas.height = 1;\n const ratio = Math.sqrt(canvas.getContext('2d').getImageData(0, 0, 1, 1).data.length >> 2);\n canvas.width = (cw << 5) / ratio;\n canvas.height = ch / ratio;\n const context = canvas.getContext('2d');\n context.fillStyle = context.strokeStyle = 'red';\n context.textAlign = 'center';\n context.textBaseline = 'middle';\n return { context, ratio };\n }\n function place(board, tag, bounds) {\n // const perimeter = [{ x: 0, y: 0 }, { x: size[0], y: size[1] }],\n const startX = tag.x, startY = tag.y, maxDelta = Math.sqrt(size[0] * size[0] + size[1] * size[1]), s = spiral(size), dt = random() < 0.5 ? 1 : -1;\n let dxdy, t = -dt, dx, dy;\n while ((dxdy = s((t += dt)))) {\n dx = ~~dxdy[0];\n dy = ~~dxdy[1];\n if (Math.min(Math.abs(dx), Math.abs(dy)) >= maxDelta)\n break;\n tag.x = startX + dx;\n tag.y = startY + dy;\n if (tag.x + tag.x0 < 0 ||\n tag.y + tag.y0 < 0 ||\n tag.x + tag.x1 > size[0] ||\n tag.y + tag.y1 > size[1])\n continue;\n // TODO only check for collisions within current bounds.\n if (!bounds || !cloudCollide(tag, board, size[0])) {\n if (!bounds || collideRects(tag, bounds)) {\n const sprite = tag.sprite, w = tag.width >> 5, sw = size[0] >> 5, lx = tag.x - (w << 4), sx = lx & 0x7f, msx = 32 - sx, h = tag.y1 - tag.y0;\n let last, x = (tag.y + tag.y0) * sw + (lx >> 5);\n for (let j = 0; j < h; j++) {\n last = 0;\n for (let i = 0; i <= w; i++) {\n board[x + i] |=\n (last << msx) | (i < w ? (last = sprite[j * w + i]) >>> sx : 0);\n }\n x += sw;\n }\n delete tag.sprite;\n return true;\n }\n }\n }\n return false;\n }\n cloud.createMask = (img) => {\n const can = document.createElement('canvas');\n const [width, height] = size;\n // 当 width 或 height 为 0 时,调用 cxt.getImageData 会报错\n if (!width || !height) {\n return;\n }\n const w32 = width >> 5;\n const board = zeroArray((width >> 5) * height);\n can.width = width;\n can.height = height;\n const cxt = can.getContext('2d');\n cxt.drawImage(img, 0, 0, img.width, img.height, 0, 0, width, height);\n const imageData = cxt.getImageData(0, 0, width, height).data;\n for (let j = 0; j < height; j++) {\n for (let i = 0; i < width; i++) {\n const k = w32 * j + (i >> 5);\n const tmp = (j * width + i) << 2;\n const flag = imageData[tmp] >= 250 &&\n imageData[tmp + 1] >= 250 &&\n imageData[tmp + 2] >= 250;\n const m = flag ? 1 << (31 - (i % 32)) : 0;\n board[k] |= m;\n }\n }\n cloud.board = board;\n cloud.hasImage = true;\n };\n cloud.timeInterval = function (_) {\n timeInterval = _ == null ? Infinity : _;\n };\n cloud.words = function (_) {\n words = _;\n };\n cloud.size = function (_ = []) {\n size = [+_[0], +_[1]];\n };\n cloud.text = function (_) {\n text = functor(_);\n };\n cloud.font = function (_) {\n font = functor(_);\n };\n cloud.fontWeight = function (_) {\n fontWeight = functor(_);\n };\n cloud.rotate = function (_) {\n rotate = functor(_);\n };\n cloud.canvas = function (_) {\n canvas = functor(_);\n };\n cloud.spiral = function (_) {\n spiral = spirals[_] || _;\n };\n cloud.fontSize = function (_) {\n fontSize = functor(_);\n };\n cloud.padding = function (_) {\n padding = functor(_);\n };\n cloud.random = function (_) {\n random = functor(_);\n };\n cloud.on = function (_) {\n event = functor(_);\n };\n return cloud;\n}\nexports.tagCloud = tagCloud;\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Join = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nfunction field(key) {\n return typeof key === 'string' ? (d) => d[key] : key;\n}\n/**\n * Join data with another dataset by SQL style.\n */\nconst Join = (options) => {\n // const { fromKey, from, key, unknown = NaN, ...rest } = options;\n const { join, on, select = [], as = select, unknown = NaN } = options;\n const [key, fromKey] = on;\n const fk = field(fromKey);\n const k = field(key);\n const keyData = (0, d3_array_1.rollup)(join, ([d]) => d, // Get the first matched.\n (d) => fk(d));\n return (data) => data.map((d) => {\n const source = keyData.get(k(d));\n return Object.assign(Object.assign({}, d), select.reduce((prev, key, idx) => ((prev[as[idx]] = source ? source[key] : unknown), prev), {}));\n });\n};\nexports.Join = Join;\nexports.Join.props = {};\n//# sourceMappingURL=join.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Slice = void 0;\n/**\n * Slice data between `start` ~ `end`.\n * Same with https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice\n */\nconst Slice = (options) => {\n const { start, end } = options;\n return (data) => data.slice(start, end);\n};\nexports.Slice = Slice;\nexports.Slice.props = {};\n//# sourceMappingURL=slice.js.map","\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.KDE = exports.defined = void 0;\nconst pdfast_1 = __importDefault(require(\"pdfast\"));\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nfunction defined(d) {\n return d !== undefined && d !== null && !Number.isNaN(d);\n}\nexports.defined = defined;\n/**\n * Kernel Density Estimation base on [pdfast](https://www.npmjs.com/package/pdfast),\n * generating probability density function (pdf) using triangular kernel,\n * optimized to run in O(N + K).\n */\nconst KDE = (options) => {\n const { field, groupBy, as = ['y', 'size'], min, max, size = 10, width, } = options;\n const [yField, sizeField] = as;\n return (data) => {\n const gs = Array.from((0, d3_array_1.group)(data, (d) => groupBy.map((gb) => d[gb]).join('-')).values());\n return gs.map((g) => {\n const pdfResult = pdfast_1.default.create(g.map((i) => i[field]), {\n min,\n max,\n size,\n width,\n });\n const _y = pdfResult.map((result) => result.x);\n const _size = pdfResult.map((result) => result.y);\n return Object.assign(Object.assign({}, g[0]), { [yField]: _y, [sizeField]: _size });\n });\n };\n};\nexports.KDE = KDE;\nexports.KDE.props = {};\n//# sourceMappingURL=kde.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Venn = void 0;\nconst venn_1 = require(\"./utils/venn\");\n/**\n * Layout venn data, get the path string for each set.\n */\nconst Venn = (options) => {\n const { sets = 'sets', size = 'size', as = ['key', 'path'], padding = 0, } = options;\n const [key, path] = as;\n return (data) => {\n // Transform the data, venn layout use `sets` and `size` field.\n const vennData = data.map((d) => (Object.assign(Object.assign({}, d), { sets: d[sets], size: d[size], [key]: d.sets.join('&') })));\n // Sort data, avoid data occlusion.\n vennData.sort((a, b) => a.sets.length - b.sets.length);\n // Layout venn data.\n const solution = (0, venn_1.venn)(vennData);\n let circles;\n return vennData.map((datum) => {\n const setsValue = datum[sets];\n const pathFunc = ({ width, height }) => {\n circles = circles\n ? circles\n : (0, venn_1.scaleSolution)(solution, width, height, padding);\n const setCircles = setsValue.map((set) => circles[set]);\n let p = (0, venn_1.intersectionAreaPath)(setCircles);\n // Close the path for event picker.\n if (!/[zZ]$/.test(p))\n p += ' Z';\n return p;\n };\n return Object.assign(Object.assign({}, datum), { [path]: pathFunc });\n });\n };\n};\nexports.Venn = Venn;\nexports.Venn.props = {};\n//# sourceMappingURL=venn.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.intersectionAreaPath = exports.venn = exports.scaleSolution = void 0;\n/**\n * Code from https://github.com/benfred/venn.js/blob/master/src/.\n */\nvar layout_1 = require(\"./layout\");\nObject.defineProperty(exports, \"scaleSolution\", { enumerable: true, get: function () { return layout_1.scaleSolution; } });\nObject.defineProperty(exports, \"venn\", { enumerable: true, get: function () { return layout_1.venn; } });\nvar diagram_1 = require(\"./diagram\");\nObject.defineProperty(exports, \"intersectionAreaPath\", { enumerable: true, get: function () { return diagram_1.intersectionAreaPath; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.scaleSolution = exports.normalizeSolution = exports.disjointCluster = exports.lossFunction = exports.greedyLayout = exports.constrainedMDSLayout = exports.bestInitialLayout = exports.getDistanceMatrices = exports.distanceFromIntersectArea = exports.venn = void 0;\nconst fmin_1 = require(\"./fmin\");\nconst circleintersection_1 = require(\"./circleintersection\");\n/** given a list of set objects, and their corresponding overlaps.\nupdates the (x, y, radius) attribute on each set such that their positions\nroughly correspond to the desired overlaps */\nfunction venn(areas, parameters) {\n parameters = parameters || {};\n parameters.maxIterations = parameters.maxIterations || 500;\n const initialLayout = parameters.initialLayout || bestInitialLayout;\n const loss = parameters.lossFunction || lossFunction;\n // add in missing pairwise areas as having 0 size\n areas = addMissingAreas(areas);\n // initial layout is done greedily\n const circles = initialLayout(areas, parameters);\n // transform x/y coordinates to a vector to optimize\n const initial = [], setids = [];\n let setid;\n for (setid in circles) {\n // eslint-disable-next-line\n if (circles.hasOwnProperty(setid)) {\n initial.push(circles[setid].x);\n initial.push(circles[setid].y);\n setids.push(setid);\n }\n }\n // optimize initial layout from our loss function\n const solution = (0, fmin_1.nelderMead)(function (values) {\n const current = {};\n for (let i = 0; i < setids.length; ++i) {\n const setid = setids[i];\n current[setid] = {\n x: values[2 * i],\n y: values[2 * i + 1],\n radius: circles[setid].radius,\n };\n }\n return loss(current, areas);\n }, initial, parameters);\n // transform solution vector back to x/y points\n const positions = solution.x;\n for (let i = 0; i < setids.length; ++i) {\n setid = setids[i];\n circles[setid].x = positions[2 * i];\n circles[setid].y = positions[2 * i + 1];\n }\n return circles;\n}\nexports.venn = venn;\nconst SMALL = 1e-10;\n/** Returns the distance necessary for two circles of radius r1 + r2 to\nhave the overlap area 'overlap' */\nfunction distanceFromIntersectArea(r1, r2, overlap) {\n // handle complete overlapped circles\n if (Math.min(r1, r2) * Math.min(r1, r2) * Math.PI <= overlap + SMALL) {\n return Math.abs(r1 - r2);\n }\n return (0, fmin_1.bisect)(function (distance) {\n return (0, circleintersection_1.circleOverlap)(r1, r2, distance) - overlap;\n }, 0, r1 + r2);\n}\nexports.distanceFromIntersectArea = distanceFromIntersectArea;\n/** Missing pair-wise intersection area data can cause problems:\n treating as an unknown means that sets will be laid out overlapping,\n which isn't what people expect. To reflect that we want disjoint sets\n here, set the overlap to 0 for all missing pairwise set intersections */\nfunction addMissingAreas(areas) {\n areas = areas.slice();\n // two circle intersections that aren't defined\n const ids = [], pairs = {};\n let i, j, a, b;\n for (i = 0; i < areas.length; ++i) {\n const area = areas[i];\n if (area.sets.length == 1) {\n ids.push(area.sets[0]);\n }\n else if (area.sets.length == 2) {\n a = area.sets[0];\n b = area.sets[1];\n // @ts-ignore\n pairs[[a, b]] = true;\n // @ts-ignore\n pairs[[b, a]] = true;\n }\n }\n ids.sort((a, b) => {\n return a > b ? 1 : -1;\n });\n for (i = 0; i < ids.length; ++i) {\n a = ids[i];\n for (j = i + 1; j < ids.length; ++j) {\n b = ids[j];\n // @ts-ignore\n if (!([a, b] in pairs)) {\n areas.push({ sets: [a, b], size: 0 });\n }\n }\n }\n return areas;\n}\n/// Returns two matrices, one of the euclidean distances between the sets\n/// and the other indicating if there are subset or disjoint set relationships\nfunction getDistanceMatrices(areas, sets, setids) {\n // initialize an empty distance matrix between all the points\n const distances = (0, fmin_1.zerosM)(sets.length, sets.length), constraints = (0, fmin_1.zerosM)(sets.length, sets.length);\n // compute required distances between all the sets such that\n // the areas match\n areas\n .filter(function (x) {\n return x.sets.length == 2;\n })\n .map(function (current) {\n const left = setids[current.sets[0]], right = setids[current.sets[1]], r1 = Math.sqrt(sets[left].size / Math.PI), r2 = Math.sqrt(sets[right].size / Math.PI), distance = distanceFromIntersectArea(r1, r2, current.size);\n distances[left][right] = distances[right][left] = distance;\n // also update constraints to indicate if its a subset or disjoint\n // relationship\n let c = 0;\n if (current.size + 1e-10 >= Math.min(sets[left].size, sets[right].size)) {\n c = 1;\n }\n else if (current.size <= 1e-10) {\n c = -1;\n }\n constraints[left][right] = constraints[right][left] = c;\n });\n return { distances: distances, constraints: constraints };\n}\nexports.getDistanceMatrices = getDistanceMatrices;\n/// computes the gradient and loss simulatenously for our constrained MDS optimizer\nfunction constrainedMDSGradient(x, fxprime, distances, constraints) {\n let loss = 0, i;\n for (i = 0; i < fxprime.length; ++i) {\n fxprime[i] = 0;\n }\n for (i = 0; i < distances.length; ++i) {\n const xi = x[2 * i], yi = x[2 * i + 1];\n for (let j = i + 1; j < distances.length; ++j) {\n const xj = x[2 * j], yj = x[2 * j + 1], dij = distances[i][j], constraint = constraints[i][j];\n const squaredDistance = (xj - xi) * (xj - xi) + (yj - yi) * (yj - yi), distance = Math.sqrt(squaredDistance), delta = squaredDistance - dij * dij;\n if ((constraint > 0 && distance <= dij) ||\n (constraint < 0 && distance >= dij)) {\n continue;\n }\n loss += 2 * delta * delta;\n fxprime[2 * i] += 4 * delta * (xi - xj);\n fxprime[2 * i + 1] += 4 * delta * (yi - yj);\n fxprime[2 * j] += 4 * delta * (xj - xi);\n fxprime[2 * j + 1] += 4 * delta * (yj - yi);\n }\n }\n return loss;\n}\n/// takes the best working variant of either constrained MDS or greedy\nfunction bestInitialLayout(areas, params) {\n let initial = greedyLayout(areas, params);\n const loss = params.lossFunction || lossFunction;\n // greedylayout is sufficient for all 2/3 circle cases. try out\n // constrained MDS for higher order problems, take its output\n // if it outperforms. (greedy is aesthetically better on 2/3 circles\n // since it axis aligns)\n if (areas.length >= 8) {\n const constrained = constrainedMDSLayout(areas, params), constrainedLoss = loss(constrained, areas), greedyLoss = loss(initial, areas);\n if (constrainedLoss + 1e-8 < greedyLoss) {\n initial = constrained;\n }\n }\n return initial;\n}\nexports.bestInitialLayout = bestInitialLayout;\n/// use the constrained MDS variant to generate an initial layout\nfunction constrainedMDSLayout(areas, params) {\n params = params || {};\n const restarts = params.restarts || 10;\n // bidirectionally map sets to a rowid (so we can create a matrix)\n const sets = [], setids = {};\n let i;\n for (i = 0; i < areas.length; ++i) {\n const area = areas[i];\n if (area.sets.length == 1) {\n setids[area.sets[0]] = sets.length;\n sets.push(area);\n }\n }\n const matrices = getDistanceMatrices(areas, sets, setids);\n let distances = matrices.distances;\n const constraints = matrices.constraints;\n // keep distances bounded, things get messed up otherwise.\n // TODO: proper preconditioner?\n const norm = (0, fmin_1.norm2)(distances.map(fmin_1.norm2)) / distances.length;\n distances = distances.map(function (row) {\n return row.map(function (value) {\n return value / norm;\n });\n });\n const obj = function (x, fxprime) {\n return constrainedMDSGradient(x, fxprime, distances, constraints);\n };\n let best, current;\n for (i = 0; i < restarts; ++i) {\n const initial = (0, fmin_1.zeros)(distances.length * 2).map(Math.random);\n current = (0, fmin_1.conjugateGradient)(obj, initial, params);\n if (!best || current.fx < best.fx) {\n best = current;\n }\n }\n const positions = best.x;\n // translate rows back to (x,y,radius) coordinates\n const circles = {};\n for (i = 0; i < sets.length; ++i) {\n const set = sets[i];\n circles[set.sets[0]] = {\n x: positions[2 * i] * norm,\n y: positions[2 * i + 1] * norm,\n radius: Math.sqrt(set.size / Math.PI),\n };\n }\n if (params.history) {\n for (i = 0; i < params.history.length; ++i) {\n (0, fmin_1.scale)(params.history[i].x, norm);\n }\n }\n return circles;\n}\nexports.constrainedMDSLayout = constrainedMDSLayout;\n/** Lays out a Venn diagram greedily, going from most overlapped sets to\nleast overlapped, attempting to position each new set such that the\noverlapping areas to already positioned sets are basically right */\nfunction greedyLayout(areas, params) {\n const loss = params && params.lossFunction ? params.lossFunction : lossFunction;\n // define a circle for each set\n const circles = {}, setOverlaps = {};\n let set;\n for (let i = 0; i < areas.length; ++i) {\n const area = areas[i];\n if (area.sets.length == 1) {\n set = area.sets[0];\n circles[set] = {\n x: 1e10,\n y: 1e10,\n // rowid: circles.length, // fix to ->\n rowid: Object.keys(circles).length,\n size: area.size,\n radius: Math.sqrt(area.size / Math.PI),\n };\n setOverlaps[set] = [];\n }\n }\n areas = areas.filter(function (a) {\n return a.sets.length == 2;\n });\n // map each set to a list of all the other sets that overlap it\n for (let i = 0; i < areas.length; ++i) {\n const current = areas[i];\n // eslint-disable-next-line\n let weight = current.hasOwnProperty('weight') ? current.weight : 1.0;\n const left = current.sets[0], right = current.sets[1];\n // completely overlapped circles shouldn't be positioned early here\n if (current.size + SMALL >=\n Math.min(circles[left].size, circles[right].size)) {\n weight = 0;\n }\n setOverlaps[left].push({ set: right, size: current.size, weight: weight });\n setOverlaps[right].push({ set: left, size: current.size, weight: weight });\n }\n // get list of most overlapped sets\n const mostOverlapped = [];\n for (set in setOverlaps) {\n // eslint-disable-next-line\n if (setOverlaps.hasOwnProperty(set)) {\n let size = 0;\n for (let i = 0; i < setOverlaps[set].length; ++i) {\n size += setOverlaps[set][i].size * setOverlaps[set][i].weight;\n }\n mostOverlapped.push({ set: set, size: size });\n }\n }\n // sort by size desc\n function sortOrder(a, b) {\n return b.size - a.size;\n }\n mostOverlapped.sort(sortOrder);\n // keep track of what sets have been laid out\n const positioned = {};\n function isPositioned(element) {\n return element.set in positioned;\n }\n // adds a point to the output\n function positionSet(point, index) {\n circles[index].x = point.x;\n circles[index].y = point.y;\n positioned[index] = true;\n }\n // add most overlapped set at (0,0)\n positionSet({ x: 0, y: 0 }, mostOverlapped[0].set);\n // get distances between all points. TODO, necessary?\n // answer: probably not\n // var distances = venn.getDistanceMatrices(circles, areas).distances;\n for (let i = 1; i < mostOverlapped.length; ++i) {\n const setIndex = mostOverlapped[i].set, overlap = setOverlaps[setIndex].filter(isPositioned);\n set = circles[setIndex];\n overlap.sort(sortOrder);\n if (overlap.length === 0) {\n // this shouldn't happen anymore with addMissingAreas\n throw 'ERROR: missing pairwise overlap information';\n }\n const points = [];\n for (let j = 0; j < overlap.length; ++j) {\n // get appropriate distance from most overlapped already added set\n const p1 = circles[overlap[j].set], d1 = distanceFromIntersectArea(set.radius, p1.radius, overlap[j].size);\n // sample positions at 90 degrees for maximum aesthetics\n points.push({ x: p1.x + d1, y: p1.y });\n points.push({ x: p1.x - d1, y: p1.y });\n points.push({ y: p1.y + d1, x: p1.x });\n points.push({ y: p1.y - d1, x: p1.x });\n // if we have at least 2 overlaps, then figure out where the\n // set should be positioned analytically and try those too\n for (let k = j + 1; k < overlap.length; ++k) {\n const p2 = circles[overlap[k].set], d2 = distanceFromIntersectArea(set.radius, p2.radius, overlap[k].size);\n const extraPoints = (0, circleintersection_1.circleCircleIntersection)({ x: p1.x, y: p1.y, radius: d1 }, { x: p2.x, y: p2.y, radius: d2 });\n for (let l = 0; l < extraPoints.length; ++l) {\n points.push(extraPoints[l]);\n }\n }\n }\n // we have some candidate positions for the set, examine loss\n // at each position to figure out where to put it at\n let bestLoss = 1e50, bestPoint = points[0];\n for (let j = 0; j < points.length; ++j) {\n circles[setIndex].x = points[j].x;\n circles[setIndex].y = points[j].y;\n const localLoss = loss(circles, areas);\n if (localLoss < bestLoss) {\n bestLoss = localLoss;\n bestPoint = points[j];\n }\n }\n positionSet(bestPoint, setIndex);\n }\n return circles;\n}\nexports.greedyLayout = greedyLayout;\n/** Given a bunch of sets, and the desired overlaps between these sets - computes\nthe distance from the actual overlaps to the desired overlaps. Note that\nthis method ignores overlaps of more than 2 circles */\nfunction lossFunction(sets, overlaps) {\n let output = 0;\n function getCircles(indices) {\n return indices.map(function (i) {\n return sets[i];\n });\n }\n for (let i = 0; i < overlaps.length; ++i) {\n const area = overlaps[i];\n let overlap;\n if (area.sets.length == 1) {\n continue;\n }\n else if (area.sets.length == 2) {\n const left = sets[area.sets[0]], right = sets[area.sets[1]];\n overlap = (0, circleintersection_1.circleOverlap)(left.radius, right.radius, (0, circleintersection_1.distance)(left, right));\n }\n else {\n overlap = (0, circleintersection_1.intersectionArea)(getCircles(area.sets));\n }\n // eslint-disable-next-line\n const weight = area.hasOwnProperty('weight') ? area.weight : 1.0;\n output += weight * (overlap - area.size) * (overlap - area.size);\n }\n return output;\n}\nexports.lossFunction = lossFunction;\n// orientates a bunch of circles to point in orientation\nfunction orientateCircles(circles, orientation, orientationOrder) {\n if (orientationOrder === null) {\n circles.sort(function (a, b) {\n return b.radius - a.radius;\n });\n }\n else {\n circles.sort(orientationOrder);\n }\n let i;\n // shift circles so largest circle is at (0, 0)\n if (circles.length > 0) {\n const largestX = circles[0].x, largestY = circles[0].y;\n for (i = 0; i < circles.length; ++i) {\n circles[i].x -= largestX;\n circles[i].y -= largestY;\n }\n }\n if (circles.length == 2) {\n // if the second circle is a subset of the first, arrange so that\n // it is off to one side. hack for https://github.com/benfred/venn.js/issues/120\n const dist = (0, circleintersection_1.distance)(circles[0], circles[1]);\n if (dist < Math.abs(circles[1].radius - circles[0].radius)) {\n circles[1].x =\n circles[0].x + circles[0].radius - circles[1].radius - 1e-10;\n circles[1].y = circles[0].y;\n }\n }\n // rotate circles so that second largest is at an angle of 'orientation'\n // from largest\n if (circles.length > 1) {\n const rotation = Math.atan2(circles[1].x, circles[1].y) - orientation;\n let x, y;\n const c = Math.cos(rotation), s = Math.sin(rotation);\n for (i = 0; i < circles.length; ++i) {\n x = circles[i].x;\n y = circles[i].y;\n circles[i].x = c * x - s * y;\n circles[i].y = s * x + c * y;\n }\n }\n // mirror solution if third solution is above plane specified by\n // first two circles\n if (circles.length > 2) {\n let angle = Math.atan2(circles[2].x, circles[2].y) - orientation;\n while (angle < 0) {\n angle += 2 * Math.PI;\n }\n while (angle > 2 * Math.PI) {\n angle -= 2 * Math.PI;\n }\n if (angle > Math.PI) {\n const slope = circles[1].y / (1e-10 + circles[1].x);\n for (i = 0; i < circles.length; ++i) {\n const d = (circles[i].x + slope * circles[i].y) / (1 + slope * slope);\n circles[i].x = 2 * d - circles[i].x;\n circles[i].y = 2 * d * slope - circles[i].y;\n }\n }\n }\n}\nfunction disjointCluster(circles) {\n // union-find clustering to get disjoint sets\n circles.map(function (circle) {\n circle.parent = circle;\n });\n // path compression step in union find\n function find(circle) {\n if (circle.parent !== circle) {\n circle.parent = find(circle.parent);\n }\n return circle.parent;\n }\n function union(x, y) {\n const xRoot = find(x), yRoot = find(y);\n xRoot.parent = yRoot;\n }\n // get the union of all overlapping sets\n for (let i = 0; i < circles.length; ++i) {\n for (let j = i + 1; j < circles.length; ++j) {\n const maxDistance = circles[i].radius + circles[j].radius;\n if ((0, circleintersection_1.distance)(circles[i], circles[j]) + 1e-10 < maxDistance) {\n union(circles[j], circles[i]);\n }\n }\n }\n // find all the disjoint clusters and group them together\n const disjointClusters = {};\n let setid;\n for (let i = 0; i < circles.length; ++i) {\n setid = find(circles[i]).parent.setid;\n if (!(setid in disjointClusters)) {\n disjointClusters[setid] = [];\n }\n disjointClusters[setid].push(circles[i]);\n }\n // cleanup bookkeeping\n circles.map(function (circle) {\n delete circle.parent;\n });\n // return in more usable form\n const ret = [];\n for (setid in disjointClusters) {\n // eslint-disable-next-line\n if (disjointClusters.hasOwnProperty(setid)) {\n ret.push(disjointClusters[setid]);\n }\n }\n return ret;\n}\nexports.disjointCluster = disjointCluster;\nfunction getBoundingBox(circles) {\n const minMax = function (d) {\n const hi = Math.max.apply(null, circles.map(function (c) {\n return c[d] + c.radius;\n })), lo = Math.min.apply(null, circles.map(function (c) {\n return c[d] - c.radius;\n }));\n return { max: hi, min: lo };\n };\n return { xRange: minMax('x'), yRange: minMax('y') };\n}\nfunction normalizeSolution(solution, orientation, orientationOrder) {\n if (orientation === null) {\n orientation = Math.PI / 2;\n }\n // work with a list instead of a dictionary, and take a copy so we\n // don't mutate input\n let circles = [], i, setid;\n for (setid in solution) {\n // eslint-disable-next-line\n if (solution.hasOwnProperty(setid)) {\n const previous = solution[setid];\n circles.push({\n x: previous.x,\n y: previous.y,\n radius: previous.radius,\n setid: setid,\n });\n }\n }\n // get all the disjoint clusters\n const clusters = disjointCluster(circles);\n // orientate all disjoint sets, get sizes\n for (i = 0; i < clusters.length; ++i) {\n orientateCircles(clusters[i], orientation, orientationOrder);\n const bounds = getBoundingBox(clusters[i]);\n clusters[i].size =\n (bounds.xRange.max - bounds.xRange.min) *\n (bounds.yRange.max - bounds.yRange.min);\n clusters[i].bounds = bounds;\n }\n clusters.sort(function (a, b) {\n return b.size - a.size;\n });\n // orientate the largest at 0,0, and get the bounds\n circles = clusters[0];\n // @ts-ignore fixme 从逻辑上看似乎是不对的,后续看看\n let returnBounds = circles.bounds;\n const spacing = (returnBounds.xRange.max - returnBounds.xRange.min) / 50;\n function addCluster(cluster, right, bottom) {\n if (!cluster)\n return;\n const bounds = cluster.bounds;\n let xOffset, yOffset, centreing;\n if (right) {\n xOffset = returnBounds.xRange.max - bounds.xRange.min + spacing;\n }\n else {\n xOffset = returnBounds.xRange.max - bounds.xRange.max;\n centreing =\n (bounds.xRange.max - bounds.xRange.min) / 2 -\n (returnBounds.xRange.max - returnBounds.xRange.min) / 2;\n if (centreing < 0)\n xOffset += centreing;\n }\n if (bottom) {\n yOffset = returnBounds.yRange.max - bounds.yRange.min + spacing;\n }\n else {\n yOffset = returnBounds.yRange.max - bounds.yRange.max;\n centreing =\n (bounds.yRange.max - bounds.yRange.min) / 2 -\n (returnBounds.yRange.max - returnBounds.yRange.min) / 2;\n if (centreing < 0)\n yOffset += centreing;\n }\n for (let j = 0; j < cluster.length; ++j) {\n cluster[j].x += xOffset;\n cluster[j].y += yOffset;\n circles.push(cluster[j]);\n }\n }\n let index = 1;\n while (index < clusters.length) {\n addCluster(clusters[index], true, false);\n addCluster(clusters[index + 1], false, true);\n addCluster(clusters[index + 2], true, true);\n index += 3;\n // have one cluster (in top left). lay out next three relative\n // to it in a grid\n returnBounds = getBoundingBox(circles);\n }\n // convert back to solution form\n const ret = {};\n for (i = 0; i < circles.length; ++i) {\n ret[circles[i].setid] = circles[i];\n }\n return ret;\n}\nexports.normalizeSolution = normalizeSolution;\n/** Scales a solution from venn.venn or venn.greedyLayout such that it fits in\na rectangle of width/height - with padding around the borders. also\ncenters the diagram in the available space at the same time */\nfunction scaleSolution(solution, width, height, padding) {\n const circles = [], setids = [];\n for (const setid in solution) {\n // eslint-disable-next-line\n if (solution.hasOwnProperty(setid)) {\n setids.push(setid);\n circles.push(solution[setid]);\n }\n }\n width -= 2 * padding;\n height -= 2 * padding;\n const bounds = getBoundingBox(circles), xRange = bounds.xRange, yRange = bounds.yRange;\n if (xRange.max == xRange.min || yRange.max == yRange.min) {\n console.log('not scaling solution: zero size detected');\n return solution;\n }\n const xScaling = width / (xRange.max - xRange.min), yScaling = height / (yRange.max - yRange.min), scaling = Math.min(yScaling, xScaling), \n // while we're at it, center the diagram too\n xOffset = (width - (xRange.max - xRange.min) * scaling) / 2, yOffset = (height - (yRange.max - yRange.min) * scaling) / 2;\n const scaled = {};\n for (let i = 0; i < circles.length; ++i) {\n const circle = circles[i];\n scaled[setids[i]] = {\n radius: scaling * circle.radius,\n x: padding + xOffset + (circle.x - xRange.min) * scaling,\n y: padding + yOffset + (circle.y - yRange.min) * scaling,\n };\n }\n return scaled;\n}\nexports.scaleSolution = scaleSolution;\n//# sourceMappingURL=layout.js.map","\n/**\n * Copyright 2016, Ben Frederickson\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * * Neither the name of the author nor the names of contributors may be used to\n * endorse or promote products derived from this software without specific prior\n * written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.scale = exports.weightedSum = exports.norm2 = exports.zerosM = exports.zeros = exports.gradientDescentLineSearch = exports.gradientDescent = exports.conjugateGradientSolve = exports.conjugateGradient = exports.nelderMead = exports.bisect = void 0;\nvar bisect_1 = require(\"./bisect\");\nObject.defineProperty(exports, \"bisect\", { enumerable: true, get: function () { return bisect_1.bisect; } });\nvar nelderMead_1 = require(\"./nelderMead\");\nObject.defineProperty(exports, \"nelderMead\", { enumerable: true, get: function () { return nelderMead_1.nelderMead; } });\nvar conjugateGradient_1 = require(\"./conjugateGradient\");\nObject.defineProperty(exports, \"conjugateGradient\", { enumerable: true, get: function () { return conjugateGradient_1.conjugateGradient; } });\nObject.defineProperty(exports, \"conjugateGradientSolve\", { enumerable: true, get: function () { return conjugateGradient_1.conjugateGradientSolve; } });\nvar gradientDescent_1 = require(\"./gradientDescent\");\nObject.defineProperty(exports, \"gradientDescent\", { enumerable: true, get: function () { return gradientDescent_1.gradientDescent; } });\nObject.defineProperty(exports, \"gradientDescentLineSearch\", { enumerable: true, get: function () { return gradientDescent_1.gradientDescentLineSearch; } });\nvar blas1_1 = require(\"./blas1\");\nObject.defineProperty(exports, \"zeros\", { enumerable: true, get: function () { return blas1_1.zeros; } });\nObject.defineProperty(exports, \"zerosM\", { enumerable: true, get: function () { return blas1_1.zerosM; } });\nObject.defineProperty(exports, \"norm2\", { enumerable: true, get: function () { return blas1_1.norm2; } });\nObject.defineProperty(exports, \"weightedSum\", { enumerable: true, get: function () { return blas1_1.weightedSum; } });\nObject.defineProperty(exports, \"scale\", { enumerable: true, get: function () { return blas1_1.scale; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bisect = void 0;\n/** finds the zeros of a function, given two starting points (which must\n * have opposite signs */\nfunction bisect(f, a, b, parameters) {\n parameters = parameters || {};\n const maxIterations = parameters.maxIterations || 100;\n const tolerance = parameters.tolerance || 1e-10;\n const fA = f(a);\n const fB = f(b);\n let delta = b - a;\n if (fA * fB > 0) {\n throw 'Initial bisect points must have opposite signs';\n }\n if (fA === 0)\n return a;\n if (fB === 0)\n return b;\n for (let i = 0; i < maxIterations; ++i) {\n delta /= 2;\n const mid = a + delta;\n const fMid = f(mid);\n if (fMid * fA >= 0) {\n a = mid;\n }\n if (Math.abs(delta) < tolerance || fMid === 0) {\n return mid;\n }\n }\n return a + delta;\n}\nexports.bisect = bisect;\n//# sourceMappingURL=bisect.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.nelderMead = void 0;\nconst blas1_1 = require(\"./blas1\");\n/** minimizes a function using the downhill simplex method */\nfunction nelderMead(f, x0, parameters) {\n parameters = parameters || {};\n const maxIterations = parameters.maxIterations || x0.length * 200;\n const nonZeroDelta = parameters.nonZeroDelta || 1.05;\n const zeroDelta = parameters.zeroDelta || 0.001;\n const minErrorDelta = parameters.minErrorDelta || 1e-6;\n const minTolerance = parameters.minErrorDelta || 1e-5;\n const rho = parameters.rho !== undefined ? parameters.rho : 1;\n const chi = parameters.chi !== undefined ? parameters.chi : 2;\n const psi = parameters.psi !== undefined ? parameters.psi : -0.5;\n const sigma = parameters.sigma !== undefined ? parameters.sigma : 0.5;\n let maxDiff;\n // initialize simplex.\n const N = x0.length;\n const simplex = new Array(N + 1);\n simplex[0] = x0;\n simplex[0].fx = f(x0);\n simplex[0].id = 0;\n for (let i = 0; i < N; ++i) {\n const point = x0.slice();\n point[i] = point[i] ? point[i] * nonZeroDelta : zeroDelta;\n simplex[i + 1] = point;\n simplex[i + 1].fx = f(point);\n simplex[i + 1].id = i + 1;\n }\n function updateSimplex(value) {\n for (let i = 0; i < value.length; i++) {\n simplex[N][i] = value[i];\n }\n simplex[N].fx = value.fx;\n }\n const sortOrder = (a, b) => a.fx - b.fx;\n const centroid = x0.slice();\n const reflected = x0.slice();\n const contracted = x0.slice();\n const expanded = x0.slice();\n for (let iteration = 0; iteration < maxIterations; ++iteration) {\n simplex.sort(sortOrder);\n if (parameters.history) {\n // copy the simplex (since later iterations will mutate) and\n // sort it to have a consistent order between iterations\n const sortedSimplex = simplex.map((x) => {\n const state = x.slice();\n state.fx = x.fx;\n state.id = x.id;\n return state;\n });\n sortedSimplex.sort((a, b) => a.id - b.id);\n parameters.history.push({\n x: simplex[0].slice(),\n fx: simplex[0].fx,\n simplex: sortedSimplex,\n });\n }\n maxDiff = 0;\n for (let i = 0; i < N; ++i) {\n maxDiff = Math.max(maxDiff, Math.abs(simplex[0][i] - simplex[1][i]));\n }\n if (Math.abs(simplex[0].fx - simplex[N].fx) < minErrorDelta &&\n maxDiff < minTolerance) {\n break;\n }\n // compute the centroid of all but the worst point in the simplex\n for (let i = 0; i < N; ++i) {\n centroid[i] = 0;\n for (let j = 0; j < N; ++j) {\n centroid[i] += simplex[j][i];\n }\n centroid[i] /= N;\n }\n // reflect the worst point past the centroid and compute loss at reflected\n // point\n const worst = simplex[N];\n (0, blas1_1.weightedSum)(reflected, 1 + rho, centroid, -rho, worst);\n reflected.fx = f(reflected);\n // if the reflected point is the best seen, then possibly expand\n if (reflected.fx < simplex[0].fx) {\n (0, blas1_1.weightedSum)(expanded, 1 + chi, centroid, -chi, worst);\n expanded.fx = f(expanded);\n if (expanded.fx < reflected.fx) {\n updateSimplex(expanded);\n }\n else {\n updateSimplex(reflected);\n }\n }\n // if the reflected point is worse than the second worst, we need to\n // contract\n else if (reflected.fx >= simplex[N - 1].fx) {\n let shouldReduce = false;\n if (reflected.fx > worst.fx) {\n // do an inside contraction\n (0, blas1_1.weightedSum)(contracted, 1 + psi, centroid, -psi, worst);\n contracted.fx = f(contracted);\n if (contracted.fx < worst.fx) {\n updateSimplex(contracted);\n }\n else {\n shouldReduce = true;\n }\n }\n else {\n // do an outside contraction\n (0, blas1_1.weightedSum)(contracted, 1 - psi * rho, centroid, psi * rho, worst);\n contracted.fx = f(contracted);\n if (contracted.fx < reflected.fx) {\n updateSimplex(contracted);\n }\n else {\n shouldReduce = true;\n }\n }\n if (shouldReduce) {\n // if we don't contract here, we're done\n if (sigma >= 1)\n break;\n // do a reduction\n for (let i = 1; i < simplex.length; ++i) {\n (0, blas1_1.weightedSum)(simplex[i], 1 - sigma, simplex[0], sigma, simplex[i]);\n simplex[i].fx = f(simplex[i]);\n }\n }\n }\n else {\n updateSimplex(reflected);\n }\n }\n simplex.sort(sortOrder);\n return { fx: simplex[0].fx, x: simplex[0] };\n}\nexports.nelderMead = nelderMead;\n//# sourceMappingURL=nelderMead.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.gemv = exports.weightedSum = exports.scale = exports.norm2 = exports.dot = exports.zerosM = exports.zeros = void 0;\n// need some basic operations on vectors, rather than adding a dependency,\n// just define here\nfunction zeros(x) {\n const r = new Array(x);\n for (let i = 0; i < x; ++i) {\n r[i] = 0;\n }\n return r;\n}\nexports.zeros = zeros;\nfunction zerosM(x, y) {\n return zeros(x).map(() => zeros(y));\n}\nexports.zerosM = zerosM;\nfunction dot(a, b) {\n let ret = 0;\n for (let i = 0; i < a.length; ++i) {\n ret += a[i] * b[i];\n }\n return ret;\n}\nexports.dot = dot;\nfunction norm2(a) {\n return Math.sqrt(dot(a, a));\n}\nexports.norm2 = norm2;\nfunction scale(ret, value, c) {\n for (let i = 0; i < value.length; ++i) {\n ret[i] = value[i] * c;\n }\n}\nexports.scale = scale;\nfunction weightedSum(ret, w1, v1, w2, v2) {\n for (let j = 0; j < ret.length; ++j) {\n ret[j] = w1 * v1[j] + w2 * v2[j];\n }\n}\nexports.weightedSum = weightedSum;\nfunction gemv(output, A, x) {\n for (let i = 0; i < output.length; ++i) {\n output[i] = dot(A[i], x);\n }\n}\nexports.gemv = gemv;\n//# sourceMappingURL=blas1.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.conjugateGradientSolve = exports.conjugateGradient = void 0;\nconst blas1_1 = require(\"./blas1\");\nconst linesearch_1 = require(\"./linesearch\");\nfunction conjugateGradient(f, initial, params) {\n // allocate all memory up front here, keep out of the loop for perfomance\n // reasons\n let current = { x: initial.slice(), fx: 0, fxprime: initial.slice() };\n let next = { x: initial.slice(), fx: 0, fxprime: initial.slice() };\n const yk = initial.slice();\n let temp;\n let a = 1;\n params = params || {};\n const maxIterations = params.maxIterations || initial.length * 20;\n current.fx = f(current.x, current.fxprime);\n const pk = current.fxprime.slice();\n (0, blas1_1.scale)(pk, current.fxprime, -1);\n for (let i = 0; i < maxIterations; ++i) {\n a = (0, linesearch_1.wolfeLineSearch)(f, pk, current, next, a);\n // todo: history in wrong spot?\n if (params.history) {\n params.history.push({\n x: current.x.slice(),\n fx: current.fx,\n fxprime: current.fxprime.slice(),\n alpha: a,\n });\n }\n if (!a) {\n // faiiled to find point that satifies wolfe conditions.\n // reset direction for next iteration\n (0, blas1_1.scale)(pk, current.fxprime, -1);\n }\n else {\n // update direction using Polak–Ribiere CG method\n (0, blas1_1.weightedSum)(yk, 1, next.fxprime, -1, current.fxprime);\n const delta_k = (0, blas1_1.dot)(current.fxprime, current.fxprime);\n const beta_k = Math.max(0, (0, blas1_1.dot)(yk, next.fxprime) / delta_k);\n (0, blas1_1.weightedSum)(pk, beta_k, pk, -1, next.fxprime);\n temp = current;\n current = next;\n next = temp;\n }\n if ((0, blas1_1.norm2)(current.fxprime) <= 1e-5) {\n break;\n }\n }\n if (params.history) {\n params.history.push({\n x: current.x.slice(),\n fx: current.fx,\n fxprime: current.fxprime.slice(),\n alpha: a,\n });\n }\n return current;\n}\nexports.conjugateGradient = conjugateGradient;\n/// Solves a system of lienar equations Ax =b for x\n/// using the conjugate gradient method.\nfunction conjugateGradientSolve(A, b, x, history) {\n const r = x.slice();\n const Ap = x.slice();\n let rsold;\n let rsnew;\n let alpha;\n // r = b - A*x\n (0, blas1_1.gemv)(Ap, A, x);\n (0, blas1_1.weightedSum)(r, 1, b, -1, Ap);\n const p = r.slice();\n rsold = (0, blas1_1.dot)(r, r);\n for (let i = 0; i < b.length; ++i) {\n (0, blas1_1.gemv)(Ap, A, p);\n alpha = rsold / (0, blas1_1.dot)(p, Ap);\n if (history) {\n history.push({ x: x.slice(), p: p.slice(), alpha: alpha });\n }\n //x=x+alpha*p;\n (0, blas1_1.weightedSum)(x, 1, x, alpha, p);\n // r=r-alpha*Ap;\n (0, blas1_1.weightedSum)(r, 1, r, -alpha, Ap);\n rsnew = (0, blas1_1.dot)(r, r);\n if (Math.sqrt(rsnew) <= 1e-10)\n break;\n // p=r+(rsnew/rsold)*p;\n (0, blas1_1.weightedSum)(p, 1, r, rsnew / rsold, p);\n rsold = rsnew;\n }\n if (history) {\n history.push({ x: x.slice(), p: p.slice(), alpha: alpha });\n }\n return x;\n}\nexports.conjugateGradientSolve = conjugateGradientSolve;\n//# sourceMappingURL=conjugateGradient.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.wolfeLineSearch = void 0;\nconst blas1_1 = require(\"./blas1\");\n/// searches along line 'pk' for a point that satifies the wolfe conditions\n/// See 'Numerical Optimization' by Nocedal and Wright p59-60\n/// f : objective function\n/// pk : search direction\n/// current: object containing current gradient/loss\n/// next: output: contains next gradient/loss\n/// returns a: step size taken\nfunction wolfeLineSearch(f, pk, current, next, a, c1, c2) {\n const phi0 = current.fx;\n const phiPrime0 = (0, blas1_1.dot)(current.fxprime, pk);\n let phi = phi0;\n let phi_old = phi0;\n let phiPrime = phiPrime0;\n let a0 = 0;\n a = a || 1;\n c1 = c1 || 1e-6;\n c2 = c2 || 0.1;\n function zoom(a_lo, a_high, phi_lo) {\n for (let iteration = 0; iteration < 16; ++iteration) {\n a = (a_lo + a_high) / 2;\n (0, blas1_1.weightedSum)(next.x, 1.0, current.x, a, pk);\n phi = next.fx = f(next.x, next.fxprime);\n phiPrime = (0, blas1_1.dot)(next.fxprime, pk);\n if (phi > phi0 + c1 * a * phiPrime0 || phi >= phi_lo) {\n a_high = a;\n }\n else {\n if (Math.abs(phiPrime) <= -c2 * phiPrime0) {\n return a;\n }\n if (phiPrime * (a_high - a_lo) >= 0) {\n a_high = a_lo;\n }\n a_lo = a;\n phi_lo = phi;\n }\n }\n return 0;\n }\n for (let iteration = 0; iteration < 10; ++iteration) {\n (0, blas1_1.weightedSum)(next.x, 1.0, current.x, a, pk);\n phi = next.fx = f(next.x, next.fxprime);\n phiPrime = (0, blas1_1.dot)(next.fxprime, pk);\n if (phi > phi0 + c1 * a * phiPrime0 || (iteration && phi >= phi_old)) {\n return zoom(a0, a, phi_old);\n }\n if (Math.abs(phiPrime) <= -c2 * phiPrime0) {\n return a;\n }\n if (phiPrime >= 0) {\n return zoom(a, a0, phi);\n }\n phi_old = phi;\n a0 = a;\n a *= 2;\n }\n return a;\n}\nexports.wolfeLineSearch = wolfeLineSearch;\n//# sourceMappingURL=linesearch.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.gradientDescentLineSearch = exports.gradientDescent = void 0;\nconst blas1_1 = require(\"./blas1\");\nconst linesearch_1 = require(\"./linesearch\");\nfunction gradientDescent(f, initial, params) {\n params = params || {};\n const maxIterations = params.maxIterations || initial.length * 100;\n const learnRate = params.learnRate || 0.001;\n const current = { x: initial.slice(), fx: 0, fxprime: initial.slice() };\n for (let i = 0; i < maxIterations; ++i) {\n current.fx = f(current.x, current.fxprime);\n if (params.history) {\n params.history.push({\n x: current.x.slice(),\n fx: current.fx,\n fxprime: current.fxprime.slice(),\n });\n }\n (0, blas1_1.weightedSum)(current.x, 1, current.x, -learnRate, current.fxprime);\n if ((0, blas1_1.norm2)(current.fxprime) <= 1e-5) {\n break;\n }\n }\n return current;\n}\nexports.gradientDescent = gradientDescent;\nfunction gradientDescentLineSearch(f, initial, params) {\n params = params || {};\n let current = { x: initial.slice(), fx: 0, fxprime: initial.slice() };\n let next = { x: initial.slice(), fx: 0, fxprime: initial.slice() };\n const maxIterations = params.maxIterations || initial.length * 100;\n let learnRate = params.learnRate || 1;\n const pk = initial.slice();\n const c1 = params.c1 || 1e-3;\n const c2 = params.c2 || 0.1;\n let temp;\n let functionCalls = [];\n if (params.history) {\n // wrap the function call to track linesearch samples\n const inner = f;\n f = (x, fxprime) => {\n functionCalls.push(x.slice());\n return inner(x, fxprime);\n };\n }\n current.fx = f(current.x, current.fxprime);\n for (let i = 0; i < maxIterations; ++i) {\n (0, blas1_1.scale)(pk, current.fxprime, -1);\n learnRate = (0, linesearch_1.wolfeLineSearch)(f, pk, current, next, learnRate, c1, c2);\n if (params.history) {\n params.history.push({\n x: current.x.slice(),\n fx: current.fx,\n fxprime: current.fxprime.slice(),\n functionCalls: functionCalls,\n learnRate: learnRate,\n alpha: learnRate,\n });\n functionCalls = [];\n }\n temp = current;\n current = next;\n next = temp;\n if (learnRate === 0 || (0, blas1_1.norm2)(current.fxprime) < 1e-5)\n break;\n }\n return current;\n}\nexports.gradientDescentLineSearch = gradientDescentLineSearch;\n//# sourceMappingURL=gradientDescent.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getCenter = exports.circleCircleIntersection = exports.circleOverlap = exports.distance = exports.circleArea = exports.containedInCircles = exports.intersectionArea = void 0;\nconst SMALL = 1e-10;\n/**\n * Returns the intersection area of a bunch of circles (where each circle\n * is an object having an x,y and radius property)\n */\nfunction intersectionArea(circles, stats) {\n // Get all the intersection points of the circles\n const intersectionPoints = getIntersectionPoints(circles);\n // Filter out points that aren't included in all the circles\n const innerPoints = intersectionPoints.filter(function (p) {\n return containedInCircles(p, circles);\n });\n let arcArea = 0, polygonArea = 0, i;\n const arcs = [];\n // If we have intersection points that are within all the circles,\n // then figure out the area contained by them\n if (innerPoints.length > 1) {\n // Sort the points by angle from the center of the polygon, which lets\n // us just iterate over points to get the edges\n const center = getCenter(innerPoints);\n for (i = 0; i < innerPoints.length; ++i) {\n const p = innerPoints[i];\n p.angle = Math.atan2(p.x - center.x, p.y - center.y);\n }\n innerPoints.sort(function (a, b) {\n return b.angle - a.angle;\n });\n // Iterate over all points, get arc between the points\n // and update the areas\n let p2 = innerPoints[innerPoints.length - 1];\n for (i = 0; i < innerPoints.length; ++i) {\n const p1 = innerPoints[i];\n // Polygon area updates easily ...\n polygonArea += (p2.x + p1.x) * (p1.y - p2.y);\n // Updating the arc area is a little more involved\n const midPoint = { x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 };\n let arc = null;\n for (let j = 0; j < p1.parentIndex.length; ++j) {\n if (p2.parentIndex.indexOf(p1.parentIndex[j]) > -1) {\n // Figure out the angle halfway between the two points\n // on the current circle\n const circle = circles[p1.parentIndex[j]], a1 = Math.atan2(p1.x - circle.x, p1.y - circle.y), a2 = Math.atan2(p2.x - circle.x, p2.y - circle.y);\n let angleDiff = a2 - a1;\n if (angleDiff < 0) {\n angleDiff += 2 * Math.PI;\n }\n // and use that angle to figure out the width of the\n // arc\n const a = a2 - angleDiff / 2;\n let width = distance(midPoint, {\n x: circle.x + circle.radius * Math.sin(a),\n y: circle.y + circle.radius * Math.cos(a),\n });\n // Clamp the width to the largest is can actually be\n // (sometimes slightly overflows because of FP errors)\n if (width > circle.radius * 2) {\n width = circle.radius * 2;\n }\n // Pick the circle whose arc has the smallest width\n if (arc === null || arc.width > width) {\n arc = { circle: circle, width: width, p1: p1, p2: p2 };\n }\n }\n }\n if (arc !== null) {\n arcs.push(arc);\n arcArea += circleArea(arc.circle.radius, arc.width);\n p2 = p1;\n }\n }\n }\n else {\n // No intersection points, is either disjoint - or is completely\n // overlapped. figure out which by examining the smallest circle\n let smallest = circles[0];\n for (i = 1; i < circles.length; ++i) {\n if (circles[i].radius < smallest.radius) {\n smallest = circles[i];\n }\n }\n // Make sure the smallest circle is completely contained in all\n // the other circles\n let disjoint = false;\n for (i = 0; i < circles.length; ++i) {\n if (distance(circles[i], smallest) >\n Math.abs(smallest.radius - circles[i].radius)) {\n disjoint = true;\n break;\n }\n }\n if (disjoint) {\n arcArea = polygonArea = 0;\n }\n else {\n arcArea = smallest.radius * smallest.radius * Math.PI;\n arcs.push({\n circle: smallest,\n p1: { x: smallest.x, y: smallest.y + smallest.radius },\n p2: { x: smallest.x - SMALL, y: smallest.y + smallest.radius },\n width: smallest.radius * 2,\n });\n }\n }\n polygonArea /= 2;\n if (stats) {\n stats.area = arcArea + polygonArea;\n stats.arcArea = arcArea;\n stats.polygonArea = polygonArea;\n stats.arcs = arcs;\n stats.innerPoints = innerPoints;\n stats.intersectionPoints = intersectionPoints;\n }\n return arcArea + polygonArea;\n}\nexports.intersectionArea = intersectionArea;\n/**\n * Returns whether a point is contained by all of a list of circles\n */\nfunction containedInCircles(point, circles) {\n for (let i = 0; i < circles.length; ++i) {\n if (distance(point, circles[i]) > circles[i].radius + SMALL) {\n return false;\n }\n }\n return true;\n}\nexports.containedInCircles = containedInCircles;\n/** Gets all intersection points between a bunch of circles */\nfunction getIntersectionPoints(circles) {\n const ret = [];\n for (let i = 0; i < circles.length; ++i) {\n for (let j = i + 1; j < circles.length; ++j) {\n const intersect = circleCircleIntersection(circles[i], circles[j]);\n for (let k = 0; k < intersect.length; ++k) {\n const p = intersect[k];\n p.parentIndex = [i, j];\n ret.push(p);\n }\n }\n }\n return ret;\n}\n/** Circular segment area calculation. See http://mathworld.wolfram.com/CircularSegment.html */\nfunction circleArea(r, width) {\n return (r * r * Math.acos(1 - width / r) -\n (r - width) * Math.sqrt(width * (2 * r - width)));\n}\nexports.circleArea = circleArea;\n/** Euclidean distance between two points */\nfunction distance(p1, p2) {\n return Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));\n}\nexports.distance = distance;\n/** Returns the overlap area of two circles of radius r1 and r2 - that\nhave their centers separated by distance d. Simpler faster\ncircle intersection for only two circles */\nfunction circleOverlap(r1, r2, d) {\n // no overlap\n if (d >= r1 + r2) {\n return 0;\n }\n // Completely overlapped\n if (d <= Math.abs(r1 - r2)) {\n return Math.PI * Math.min(r1, r2) * Math.min(r1, r2);\n }\n const w1 = r1 - (d * d - r2 * r2 + r1 * r1) / (2 * d), w2 = r2 - (d * d - r1 * r1 + r2 * r2) / (2 * d);\n return circleArea(r1, w1) + circleArea(r2, w2);\n}\nexports.circleOverlap = circleOverlap;\n/** Given two circles (containing a x/y/radius attributes),\nreturns the intersecting points if possible.\nnote: doesn't handle cases where there are infinitely many\nintersection points (circles are equivalent):, or only one intersection point*/\nfunction circleCircleIntersection(p1, p2) {\n const d = distance(p1, p2), r1 = p1.radius, r2 = p2.radius;\n // If to far away, or self contained - can't be done\n if (d >= r1 + r2 || d <= Math.abs(r1 - r2)) {\n return [];\n }\n const a = (r1 * r1 - r2 * r2 + d * d) / (2 * d), h = Math.sqrt(r1 * r1 - a * a), x0 = p1.x + (a * (p2.x - p1.x)) / d, y0 = p1.y + (a * (p2.y - p1.y)) / d, rx = -(p2.y - p1.y) * (h / d), ry = -(p2.x - p1.x) * (h / d);\n return [\n { x: x0 + rx, y: y0 - ry },\n { x: x0 - rx, y: y0 + ry },\n ];\n}\nexports.circleCircleIntersection = circleCircleIntersection;\n/** Returns the center of a bunch of points */\nfunction getCenter(points) {\n const center = { x: 0, y: 0 };\n for (let i = 0; i < points.length; ++i) {\n center.x += points[i].x;\n center.y += points[i].y;\n }\n center.x /= points.length;\n center.y /= points.length;\n return center;\n}\nexports.getCenter = getCenter;\n//# sourceMappingURL=circleintersection.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.intersectionAreaPath = void 0;\nconst circleintersection_1 = require(\"./circleintersection\");\n/**\n * 根据圆心(x, y) 半径 r 返回圆的绘制 path\n * @param x 圆心点 x\n * @param y 圆心点 y\n * @param r 圆的半径\n * @returns 圆的 path\n */\nfunction circlePath(x, y, r) {\n const ret = [];\n // ret.push('\\nM', x, y);\n // ret.push('\\nm', -r, 0);\n // ret.push('\\na', r, r, 0, 1, 0, r * 2, 0);\n // ret.push('\\na', r, r, 0, 1, 0, -r * 2, 0);\n const x0 = x - r;\n const y0 = y;\n ret.push('M', x0, y0);\n ret.push('A', r, r, 0, 1, 0, x0 + 2 * r, y0);\n ret.push('A', r, r, 0, 1, 0, x0, y0);\n return ret.join(' ');\n}\n/** returns a svg path of the intersection area of a bunch of circles */\nfunction intersectionAreaPath(circles) {\n const stats = {};\n (0, circleintersection_1.intersectionArea)(circles, stats);\n const arcs = stats.arcs;\n if (arcs.length === 0) {\n return 'M 0 0';\n }\n else if (arcs.length == 1) {\n const circle = arcs[0].circle;\n return circlePath(circle.x, circle.y, circle.radius);\n }\n else {\n // draw path around arcs\n const ret = ['\\nM', arcs[0].p2.x, arcs[0].p2.y];\n for (let i = 0; i < arcs.length; ++i) {\n const arc = arcs[i], r = arc.circle.radius, wide = arc.width > r;\n ret.push('\\nA', r, r, 0, wide ? 1 : 0, 1, arc.p1.x, arc.p1.y);\n }\n return ret.join(' ');\n }\n}\nexports.intersectionAreaPath = intersectionAreaPath;\n//# sourceMappingURL=diagram.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Log = void 0;\n/**\n * Console.log the data section for dev debugger.\n */\nconst Log = () => {\n return (data) => {\n console.log('G2 data section:', data);\n return data;\n };\n};\nexports.Log = Log;\nexports.Log.props = {};\n//# sourceMappingURL=log.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EMA = exports.ema = void 0;\nfunction ema(values, alpha) {\n if (alpha < 0 || alpha > 1) {\n throw new Error('alpha must be between 0 and 1.');\n }\n if (values.length === 0) {\n return [];\n }\n let last = values[0];\n const smoothed = [];\n for (const point of values) {\n if (point === null || point === undefined) {\n // 如果没有数据的话,使用最近的值\n smoothed.push(point);\n console.warn('EMA:The value is null or undefined', values);\n continue;\n }\n if (last === null || last === undefined) {\n last = point;\n }\n const smoothedVal = last * alpha + (1 - alpha) * point;\n smoothed.push(smoothedVal);\n last = smoothedVal;\n }\n return smoothed;\n}\nexports.ema = ema;\n/**\n * https://en.wikipedia.org/wiki/Exponential_smoothing\n * @param options\n * @returns\n */\nconst EMA = (options) => {\n const { field = 'y', alpha = 0.6, as = field } = options;\n return (data) => {\n const values = data.map((d) => {\n return d[field];\n });\n const out = ema(values, alpha);\n return data.map((d, i) => {\n return Object.assign(Object.assign({}, d), { [as]: out[i] });\n });\n };\n};\nexports.EMA = EMA;\nexports.EMA.props = {};\n//# sourceMappingURL=ema.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExceedAdjust = exports.OverflowHide = exports.ContrastReverse = exports.OverlapDodgeY = exports.OverlapHide = void 0;\nvar overlapHide_1 = require(\"./overlapHide\");\nObject.defineProperty(exports, \"OverlapHide\", { enumerable: true, get: function () { return overlapHide_1.OverlapHide; } });\nvar overlapDodgeY_1 = require(\"./overlapDodgeY\");\nObject.defineProperty(exports, \"OverlapDodgeY\", { enumerable: true, get: function () { return overlapDodgeY_1.OverlapDodgeY; } });\nvar contrastReverse_1 = require(\"./contrastReverse\");\nObject.defineProperty(exports, \"ContrastReverse\", { enumerable: true, get: function () { return contrastReverse_1.ContrastReverse; } });\nvar overflowHide_1 = require(\"./overflowHide\");\nObject.defineProperty(exports, \"OverflowHide\", { enumerable: true, get: function () { return overflowHide_1.OverflowHide; } });\nvar exceedAdjust_1 = require(\"./exceedAdjust\");\nObject.defineProperty(exports, \"ExceedAdjust\", { enumerable: true, get: function () { return exceedAdjust_1.ExceedAdjust; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OverlapHide = void 0;\nconst bounds_1 = require(\"../utils/bounds\");\nconst style_1 = require(\"../utils/style\");\n/**\n * Hide the label when overlap.\n */\nconst OverlapHide = (options) => {\n const { priority } = options;\n return (labels) => {\n const displayLabels = [];\n // When overlap, will hide the next label.\n if (priority)\n labels.sort(priority);\n labels.forEach((l) => {\n (0, style_1.show)(l);\n const b1 = l.getLocalBounds();\n const overlaping = displayLabels.some((dl) => (0, bounds_1.isOverlap)((0, bounds_1.parseAABB)(b1), (0, bounds_1.parseAABB)(dl.getLocalBounds())));\n if (overlaping)\n (0, style_1.hide)(l);\n else\n displayLabels.push(l);\n });\n return labels;\n };\n};\nexports.OverlapHide = OverlapHide;\n//# sourceMappingURL=overlapHide.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isOverlap = exports.isOverflow = exports.isInBounds = exports.parseAABB = void 0;\n// There is a certain error in the calculation of text bounds.\nconst EPSILON = 1e-2;\nfunction parseAABB(min2) {\n const { min, max } = min2;\n return [\n [min[0], min[1]],\n [max[0], max[1]],\n ];\n}\nexports.parseAABB = parseAABB;\n/**\n * Whether the `point` in `bounds`.\n * @param point\n * @param bounds\n * @param threshold\n */\nfunction isInBounds(point, bounds, threshold = EPSILON) {\n const [x, y] = point;\n const [min, max] = bounds;\n return (x >= min[0] - threshold &&\n x <= max[0] + threshold &&\n y >= min[1] - threshold &&\n y <= max[1] + threshold);\n}\nexports.isInBounds = isInBounds;\n/**\n * Whether `b1` is overflow from `b2`.\n * @param b1\n * @param b2\n * @param threshold The threshold to determine whether the bounds is overflowed, default is 0.\n */\nfunction isOverflow(b1, b2, threshold = EPSILON) {\n const [min, max] = b1;\n return !(isInBounds(min, b2, threshold) && isInBounds(max, b2, threshold));\n}\nexports.isOverflow = isOverflow;\n/**\n * Whether `b1` is overlap with `b2`.\n * @param b1\n * @param b2\n * @returns\n */\nfunction isOverlap(b1, b2) {\n const [min1, max1] = b1;\n const [min2, max2] = b2;\n return (min1[0] < max2[0] &&\n max1[0] > min2[0] &&\n min1[1] < max2[1] &&\n max1[1] > min2[1]);\n}\nexports.isOverlap = isOverlap;\n//# sourceMappingURL=bounds.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OverlapDodgeY = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nfunction isSegmentIntersect([a, b], [c, d]) {\n return d > a && b > c;\n}\nfunction useMap() {\n const map = new Map();\n const get = (key) => map.get(key);\n const set = (key, value) => map.set(key, value);\n return [get, set];\n}\nfunction getBoundsWithoutConnector(shape) {\n const node = shape.cloneNode(true);\n const connectorShape = node.getElementById('connector');\n connectorShape && node.removeChild(connectorShape);\n const { min, max } = node.getRenderBounds();\n node.destroy();\n return { min, max };\n}\n/**\n * An iterative dodge method avoids label overlap. (n * log(n))\n */\nconst OverlapDodgeY = (options) => {\n const { maxIterations = 10, maxError = 0.1, padding = 1 } = options;\n return (labels) => {\n const n = labels.length;\n if (n <= 1)\n return labels;\n // Index y, x0, x, height, by label.\n const [y0, setY0] = useMap();\n const [y, setY] = useMap();\n const [h, setH] = useMap();\n const [xx, setXX] = useMap();\n for (const label of labels) {\n const { min, max } = getBoundsWithoutConnector(label);\n const [x0, y0] = min;\n const [x1, y1] = max;\n setY0(label, y0);\n setY(label, y0);\n setH(label, y1 - y0);\n setXX(label, [x0, x1]);\n }\n // Offsets position Y.\n for (let iter = 0; iter < maxIterations; iter++) {\n labels.sort((a, b) => (0, d3_array_1.ascending)(y(a), y(b)));\n let error = 0;\n for (let i = 0; i < n - 1; i++) {\n const l0 = labels[i];\n let j = i + 1;\n let l1;\n // Find the next label overlapping with the current label in x direction.\n while ((l1 = labels[j]) && !isSegmentIntersect(xx(l0), xx(l1)))\n j += 1;\n if (l1) {\n const y0 = y(l0);\n const h0 = h(l0);\n const y1 = y(l1);\n const delta = y1 - (y0 + h0);\n if (delta < padding) {\n const newDelta = (padding - delta) / 2;\n error = Math.max(error, newDelta);\n setY(l0, y0 - newDelta);\n setY(l1, y1 + newDelta);\n }\n }\n }\n if (error < maxError)\n break;\n }\n for (const label of labels) {\n label.style.y += y(label) - y0(label);\n }\n return labels;\n };\n};\nexports.OverlapDodgeY = OverlapDodgeY;\n//# sourceMappingURL=overlapDodgeY.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ContrastReverse = void 0;\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst color_1 = require(\"../utils/color\");\nfunction getsRGB(s) {\n let c = s / 255;\n c = c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n return c;\n}\nfunction getL(r, g, b) {\n return 0.2126 * getsRGB(r) + 0.7152 * getsRGB(g) + 0.0722 * getsRGB(b);\n}\n/**\n * Calculate the contrast. see https://webaim.org/resources/contrastchecker/\n * @param foreground\n * @param background\n */\nfunction contrast(foreground, background) {\n if (!foreground || !background || foreground === background)\n return 1;\n const { r, g, b } = foreground;\n const { r: rb, g: gb, b: bb } = background;\n const L1 = getL(r, g, b);\n const L2 = getL(rb, gb, bb);\n return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);\n}\n/**\n * Reverse color for max contrast.\n */\nfunction mostContrast(color, palette) {\n const i = (0, d3_array_1.maxIndex)(palette, (c) => contrast(color, (0, color_1.parseToRGB)(c)));\n return palette[i];\n}\n/**\n * Reverse the label color when the contrast is lower then `threshold`.\n * The default value of `threshold` is 4.5.\n * More about contract, see https://webaim.org/resources/contrastchecker/\n */\nconst ContrastReverse = (options) => {\n const { threshold = 4.5, palette = ['#000', '#fff'] } = options;\n return (labels) => {\n labels.forEach((l) => {\n const background = l.attr('dependentElement').parsedStyle.fill;\n const foreground = l.parsedStyle.fill;\n const c = contrast(foreground, background);\n if (c < threshold)\n l.attr('fill', mostContrast(background, palette));\n });\n return labels;\n };\n};\nexports.ContrastReverse = ContrastReverse;\n//# sourceMappingURL=contrastReverse.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseToRGB = void 0;\nconst g_1 = require(\"@antv/g\");\nfunction parseToRGB(c) {\n if (typeof c === 'object')\n return c;\n return (0, g_1.parseColor)(c);\n}\nexports.parseToRGB = parseToRGB;\n//# sourceMappingURL=color.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OverflowHide = void 0;\nconst bounds_1 = require(\"../utils/bounds\");\nconst style_1 = require(\"../utils/style\");\n/**\n * Hide the label when the label is overflowed from the element.\n */\nconst OverflowHide = () => {\n return (labels) => {\n labels.forEach((l) => {\n (0, style_1.show)(l);\n const bounds = l.attr('bounds');\n const b = l.getLocalBounds();\n const overflow = (0, bounds_1.isOverflow)((0, bounds_1.parseAABB)(b), bounds);\n if (overflow)\n (0, style_1.hide)(l);\n });\n return labels;\n };\n};\nexports.OverflowHide = OverflowHide;\n//# sourceMappingURL=overflowHide.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExceedAdjust = void 0;\nconst style_1 = require(\"../utils/style\");\nconst adjustPosition = (target, edge) => {\n const [[minEdgeX, minEdgeY], [maxEdgeX, maxEdgeY]] = edge;\n const [[minX, minY], [maxX, maxY]] = target;\n let changeX = 0, changeY = 0;\n // x-axis\n if (minX < minEdgeX) {\n changeX = minEdgeX - minX;\n }\n else if (maxX > maxEdgeX) {\n changeX = maxEdgeX - maxX;\n }\n // y-axis\n if (minY < minEdgeY) {\n changeY = minEdgeY - minY;\n }\n else if (maxY > maxEdgeY) {\n changeY = maxEdgeY - maxY;\n }\n return [changeX, changeY];\n};\n/**\n * adjust the label when exceed the plot\n */\nconst ExceedAdjust = () => {\n return (labels, { canvas, layout }) => {\n labels.forEach((l) => {\n (0, style_1.show)(l);\n const { max, min } = l.getRenderBounds();\n const [xMax, yMax] = max, [xMin, yMin] = min;\n const changeValue = adjustPosition([\n [xMin, yMin],\n [xMax, yMax],\n ], \n // Prevent label overlap in multiple charts by calculating layouts separately to avoid collisions.\n [\n [layout.x, layout.y],\n [layout.x + layout.width, layout.y + layout.height],\n ]);\n // For label with connectorPoints\n if (l.style.connector && l.style.connectorPoints) {\n l.style.connectorPoints[0][0] -= changeValue[0];\n l.style.connectorPoints[0][1] -= changeValue[1];\n }\n l.style.x += changeValue[0];\n l.style.y += changeValue[1];\n });\n return labels;\n };\n};\nexports.ExceedAdjust = ExceedAdjust;\n//# sourceMappingURL=exceedAdjust.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.geolib = void 0;\nconst geoView_1 = require(\"../composition/geoView\");\nconst geoPath_1 = require(\"../composition/geoPath\");\nfunction geolib() {\n return {\n 'composition.geoView': geoView_1.GeoView,\n 'composition.geoPath': geoPath_1.GeoPath,\n };\n}\nexports.geolib = geolib;\n//# sourceMappingURL=geo.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.graphlib = void 0;\nconst mark_1 = require(\"../mark\");\nconst data_1 = require(\"../data\");\nfunction graphlib() {\n return {\n 'data.arc': data_1.Arc,\n 'data.cluster': data_1.Cluster,\n 'mark.forceGraph': mark_1.ForceGraph,\n 'mark.tree': mark_1.Tree,\n 'mark.pack': mark_1.Pack,\n 'mark.sankey': mark_1.Sankey,\n 'mark.chord': mark_1.Chord,\n 'mark.treemap': mark_1.Treemap,\n };\n}\nexports.graphlib = graphlib;\n//# sourceMappingURL=graph.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.plotlib = void 0;\nconst mark_1 = require(\"../mark\");\nconst data_1 = require(\"../data\");\nfunction plotlib() {\n return {\n 'data.venn': data_1.Venn,\n 'mark.boxplot': mark_1.Boxplot,\n 'mark.gauge': mark_1.Gauge,\n 'mark.wordCloud': mark_1.WordCloud,\n 'mark.liquid': mark_1.Liquid,\n };\n}\nexports.plotlib = plotlib;\n//# sourceMappingURL=plot.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.stdlib = void 0;\nconst core_1 = require(\"./core\");\nconst geo_1 = require(\"./geo\");\nconst graph_1 = require(\"./graph\");\nconst plot_1 = require(\"./plot\");\nfunction stdlib() {\n return Object.assign(Object.assign(Object.assign(Object.assign({}, (0, geo_1.geolib)()), (0, graph_1.graphlib)()), (0, plot_1.plotlib)()), (0, core_1.corelib)());\n}\nexports.stdlib = stdlib;\n//# sourceMappingURL=std.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.litelib = void 0;\nconst coordinate_1 = require(\"../coordinate\");\nconst encode_1 = require(\"../encode\");\nconst mark_1 = require(\"../mark\");\nconst palette_1 = require(\"../palette\");\nconst scale_1 = require(\"../scale\");\nconst theme_1 = require(\"../theme\");\nconst component_1 = require(\"../component\");\nconst animation_1 = require(\"../animation\");\nconst interaction_1 = require(\"../interaction\");\nconst composition_1 = require(\"../composition\");\nconst shape_1 = require(\"../shape\");\nconst data_1 = require(\"../data\");\n/**\n * In test stage, don't use it.\n */\nfunction litelib() {\n return {\n 'data.inline': data_1.Inline,\n 'coordinate.cartesian': coordinate_1.Cartesian,\n 'encode.constant': encode_1.Constant,\n 'encode.field': encode_1.Field,\n 'encode.transform': encode_1.Transform,\n 'encode.column': encode_1.Column,\n 'mark.interval': mark_1.Interval,\n 'shape.label.label': shape_1.LabelShape,\n 'palette.category10': palette_1.Category10,\n 'palette.category20': palette_1.Category20,\n 'scale.linear': scale_1.Linear,\n 'scale.ordinal': scale_1.Ordinal,\n 'scale.band': scale_1.Band,\n 'scale.identity': scale_1.Identity,\n 'scale.point': scale_1.Point,\n 'scale.time': scale_1.Time,\n 'scale.log': scale_1.Log,\n 'scale.pow': scale_1.Pow,\n 'scale.sqrt': scale_1.Sqrt,\n 'scale.threshold': scale_1.Threshold,\n 'scale.quantile': scale_1.Quantile,\n 'scale.quantize': scale_1.Quantize,\n 'scale.sequential': scale_1.Sequential,\n 'scale.constant': scale_1.Constant,\n 'theme.classic': theme_1.Classic,\n 'component.axisX': component_1.AxisX,\n 'component.axisY': component_1.AxisY,\n 'component.axisRadar': component_1.AxisRadar,\n 'component.axisLinear': component_1.AxisLinear,\n 'component.axisArc': component_1.AxisArc,\n 'component.legendCategory': component_1.LegendCategory,\n 'component.legendContinuous': component_1.LegendContinuous,\n 'component.legendContinuousBlock': component_1.LegendContinuousBlock,\n 'component.legendContinuousBlockSize': component_1.LegendContinuousBlockSize,\n 'component.legendContinuousSize': component_1.LegendContinuousSize,\n 'component.legends': component_1.Legends,\n 'component.title': component_1.TitleComponent,\n 'component.sliderX': component_1.SliderX,\n 'component.sliderY': component_1.SliderY,\n 'component.scrollbarX': component_1.ScrollbarX,\n 'component.scrollbarY': component_1.ScrollbarY,\n 'animation.scaleInX': animation_1.ScaleInX,\n 'animation.scaleOutX': animation_1.ScaleOutX,\n 'animation.scaleInY': animation_1.ScaleInY,\n 'animation.scaleOutY': animation_1.ScaleOutY,\n 'animation.waveIn': animation_1.WaveIn,\n 'animation.fadeIn': animation_1.FadeIn,\n 'animation.fadeOut': animation_1.FadeOut,\n 'animation.morphing': animation_1.Morphing,\n 'interaction.tooltip': interaction_1.Tooltip,\n 'interaction.legendFilter': interaction_1.LegendFilter,\n 'interaction.legendHighlight': interaction_1.LegendHighlight,\n 'interaction.sliderFilter': interaction_1.SliderFilter,\n 'interaction.scrollbarFilter': interaction_1.ScrollbarFilter,\n 'interaction.poptip': interaction_1.Poptip,\n 'interaction.event': interaction_1.Event,\n 'composition.mark': composition_1.Mark,\n 'composition.view': composition_1.View,\n };\n}\nexports.litelib = litelib;\n//# sourceMappingURL=lite.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.extend = exports.Runtime = exports.register = exports.Chart = void 0;\nvar chart_1 = require(\"./chart\");\nObject.defineProperty(exports, \"Chart\", { enumerable: true, get: function () { return chart_1.Chart; } });\nvar library_1 = require(\"./library\");\nObject.defineProperty(exports, \"register\", { enumerable: true, get: function () { return library_1.register; } });\nvar runtime_1 = require(\"./runtime\");\nObject.defineProperty(exports, \"Runtime\", { enumerable: true, get: function () { return runtime_1.Runtime; } });\nvar extend_1 = require(\"./extend\");\nObject.defineProperty(exports, \"extend\", { enumerable: true, get: function () { return extend_1.extend; } });\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Chart = void 0;\nconst extend_1 = require(\"./extend\");\nconst library_1 = require(\"./library\");\nconst runtime_1 = require(\"./runtime\");\nexports.Chart = (0, extend_1.extend)(runtime_1.Runtime, library_1.library);\n//# sourceMappingURL=chart.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.extend = void 0;\nfunction extend(Runtime, library) {\n class Chart extends Runtime {\n constructor(options) {\n super(Object.assign(Object.assign({}, options), { lib: library }));\n }\n }\n return Chart;\n}\nexports.extend = extend;\n//# sourceMappingURL=extend.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.register = exports.library = void 0;\nconst marker_1 = require(\"../utils/marker\");\nexports.library = {};\n// @todo Warn if override existing key.\nfunction register(key, component) {\n if (key.startsWith('symbol.'))\n (0, marker_1.registerSymbol)(key.split('.').pop(), component);\n else\n Object.assign(exports.library, { [key]: component });\n}\nexports.register = register;\n//# sourceMappingURL=library.js.map","\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Runtime = exports.G2_CHART_KEY = void 0;\nconst g_1 = require(\"@antv/g\");\nconst g_canvas_1 = require(\"@antv/g-canvas\");\nconst g_plugin_dragndrop_1 = require(\"@antv/g-plugin-dragndrop\");\nconst util_1 = require(\"@antv/util\");\nconst event_emitter_1 = __importDefault(require(\"@antv/event-emitter\"));\nconst d3_array_1 = require(\"@antv/vendor/d3-array\");\nconst runtime_1 = require(\"../runtime\");\nconst event_1 = require(\"../utils/event\");\nconst tooltip_1 = require(\"../interaction/tooltip\");\nconst utils_1 = require(\"../interaction/utils\");\nconst utils_2 = require(\"./utils\");\nconst composition_1 = require(\"./composition\");\nconst define_1 = require(\"./define\");\nconst mark_1 = require(\"./mark\");\nconst library_1 = require(\"./library\");\nexports.G2_CHART_KEY = 'G2_CHART_KEY';\nclass Runtime extends composition_1.CompositionNode {\n constructor(options) {\n const { container, canvas, renderer, plugins, lib, createCanvas } = options, rest = __rest(options, [\"container\", \"canvas\", \"renderer\", \"plugins\", \"lib\", \"createCanvas\"]);\n super(rest, 'view');\n // Identifies whether bindAutoFit.\n this._hasBindAutoFit = false;\n this._rendering = false;\n this._trailing = false;\n this._trailingResolve = null;\n this._trailingReject = null;\n this._previousDefinedType = null;\n this._onResize = (0, util_1.debounce)(() => {\n this.forceFit();\n }, 300);\n this._renderer = renderer || new g_canvas_1.Renderer();\n this._plugins = plugins || [];\n this._container = (0, utils_2.normalizeContainer)(container);\n this._emitter = new event_emitter_1.default();\n this._context = {\n library: Object.assign(Object.assign({}, lib), library_1.library),\n emitter: this._emitter,\n canvas,\n createCanvas,\n };\n this._create();\n }\n render() {\n if (this._rendering)\n return this._addToTrailing();\n if (!this._context.canvas)\n this._createCanvas();\n this._bindAutoFit();\n this._rendering = true;\n // @fixme The cancel render is not marked, which will cause additional rendered event.\n // @ref src/runtime/render.ts\n const finished = new Promise((resolve, reject) => (0, runtime_1.render)(this._computedOptions(), this._context, this._createResolve(resolve), this._createReject(reject)));\n const [finished1, resolve, reject] = (0, utils_2.createEmptyPromise)();\n finished\n .then(resolve)\n .catch(reject)\n .then(() => this._renderTrailing());\n return finished1;\n }\n /**\n * @overload\n * @param {G2ViewTree} [options]\n * @returns {Runtime|Spec}\n */\n options(options) {\n if (arguments.length === 0)\n return (0, utils_2.optionsOf)(this);\n const { type } = options;\n if (type)\n this._previousDefinedType = type;\n (0, utils_2.updateRoot)(this, options, this._previousDefinedType, this._marks, this._compositions);\n return this;\n }\n getContainer() {\n return this._container;\n }\n getContext() {\n return this._context;\n }\n on(event, callback, once) {\n this._emitter.on(event, callback, once);\n return this;\n }\n once(event, callback) {\n this._emitter.once(event, callback);\n return this;\n }\n emit(event, ...args) {\n this._emitter.emit(event, ...args);\n return this;\n }\n off(event, callback) {\n this._emitter.off(event, callback);\n return this;\n }\n clear() {\n const options = this.options();\n this.emit(event_1.ChartEvent.BEFORE_CLEAR);\n this._reset();\n (0, runtime_1.destroy)(options, this._context, false);\n this.emit(event_1.ChartEvent.AFTER_CLEAR);\n }\n destroy() {\n const options = this.options();\n this.emit(event_1.ChartEvent.BEFORE_DESTROY);\n this._unbindAutoFit();\n this._reset();\n (0, runtime_1.destroy)(options, this._context, true);\n if (this._container[utils_2.REMOVE_FLAG])\n (0, utils_2.removeContainer)(this._container);\n this.emit(event_1.ChartEvent.AFTER_DESTROY);\n }\n forceFit() {\n // Don't fit if size do not change.\n this.options['autoFit'] = true;\n const { width, height } = (0, utils_2.sizeOf)(this.options(), this._container);\n if (width === this._width && height === this._height) {\n return Promise.resolve(this);\n }\n // Don't call changeSize to prevent update width and height of options.\n this.emit(event_1.ChartEvent.BEFORE_CHANGE_SIZE);\n const finished = this.render();\n finished.then(() => {\n this.emit(event_1.ChartEvent.AFTER_CHANGE_SIZE);\n });\n return finished;\n }\n changeSize(width, height) {\n if (width === this._width && height === this._height) {\n return Promise.resolve(this);\n }\n this.emit(event_1.ChartEvent.BEFORE_CHANGE_SIZE);\n this.attr('width', width);\n this.attr('height', height);\n const finished = this.render();\n finished.then(() => {\n this.emit(event_1.ChartEvent.AFTER_CHANGE_SIZE);\n });\n return finished;\n }\n getDataByXY(point, options = {}) {\n const { shared = false, series, facet = false, startX = 0, startY = 0, } = options;\n const { canvas, views } = this._context;\n const { document } = canvas;\n const { x, y } = point;\n // Temporarily do not handle the multi - view situation.\n const { coordinate, scale, markState, data: dataMap, key } = views[0];\n const elements = document.getElementsByClassName(runtime_1.ELEMENT_CLASS_NAME);\n const groupKey = shared ? (element) => element.__data__.x : (d) => d;\n const keyGroup = (0, d3_array_1.group)(elements, groupKey);\n const container = document.getElementsByClassName(runtime_1.VIEW_CLASS_NAME)[0];\n const root = (0, utils_1.selectPlotArea)(container);\n const hasSeriesInteraction = (markState) => {\n return Array.from(markState.values()).some((d) => {\n var _a, _b;\n return ((_a = d.interaction) === null || _a === void 0 ? void 0 : _a['seriesTooltip']) ||\n ((_b = d.channels) === null || _b === void 0 ? void 0 : _b.some((c) => c.name === 'series' && c.values !== undefined));\n });\n };\n const isSeries = (0, tooltip_1.maybeValue)(series, hasSeriesInteraction(markState));\n const getElementData = (el) => (0, util_1.get)(el, '__data__.data', null);\n const getElementsData = (els) => els.map(getElementData);\n try {\n // For non-facet and series chart.\n if (isSeries &&\n hasSeriesInteraction(markState) &&\n !facet) {\n const { selectedData } = (0, tooltip_1.findSeriesElement)({\n root,\n event: { offsetX: x, offsetY: y },\n elements,\n coordinate,\n scale,\n startX,\n startY,\n });\n const viewData = dataMap.get(`${key}-0`);\n return selectedData.map(({ index }) => viewData[index]);\n }\n // For single chart.\n const element = (0, tooltip_1.findSingleElement)({\n root,\n event: { offsetX: x, offsetY: y },\n elements,\n coordinate,\n scale,\n shared,\n });\n const k = groupKey(element);\n const groupElements = keyGroup.get(k);\n return groupElements ? getElementsData(groupElements) : [];\n }\n catch (e) {\n const topMostElement = canvas.document.elementFromPointSync(x, y);\n return topMostElement ? getElementData(topMostElement) : [];\n }\n }\n _create() {\n const { library } = this._context;\n // @todo After refactor component as mark, remove this.\n const isMark = (key) => key.startsWith('mark.') ||\n key === 'component.axisX' ||\n key === 'component.axisY' ||\n key === 'component.legends';\n const marks = [\n 'mark.mark',\n ...Object.keys(library).filter(isMark),\n ];\n // Create mark generators.\n this._marks = {};\n for (const key of marks) {\n const name = key.split('.').pop();\n class Mark extends mark_1.MarkNode {\n constructor() {\n super({}, name);\n }\n }\n this._marks[name] = Mark;\n this[name] = function (composite) {\n const node = this.append(Mark);\n if (name === 'mark')\n node.type = composite;\n return node;\n };\n }\n // Create composition generators.\n const compositions = [\n 'composition.view',\n ...Object.keys(library).filter((key) => key.startsWith('composition.') && key !== 'composition.mark'),\n ];\n this._compositions = Object.fromEntries(compositions.map((key) => {\n const name = key.split('.').pop();\n let Composition = class Composition extends composition_1.CompositionNode {\n constructor() {\n super({}, name);\n }\n };\n Composition = __decorate([\n (0, define_1.defineProps)((0, define_1.nodeProps)(this._marks))\n ], Composition);\n return [name, Composition];\n }));\n for (const Ctor of Object.values(this._compositions)) {\n (0, define_1.defineProps)((0, define_1.nodeProps)(this._compositions))(Ctor);\n }\n for (const key of compositions) {\n const name = key.split('.').pop();\n this[name] = function () {\n const Composition = this._compositions[name];\n this.type = null;\n return this.append(Composition);\n };\n }\n }\n _reset() {\n const KEYS = ['theme', 'type', 'width', 'height', 'autoFit'];\n this.type = 'view';\n this.value = Object.fromEntries(Object.entries(this.value).filter(([key]) => key.startsWith('margin') ||\n key.startsWith('padding') ||\n key.startsWith('inset') ||\n KEYS.includes(key)));\n this.children = [];\n }\n _renderTrailing() {\n if (!this._trailing)\n return;\n this._trailing = false;\n this.render()\n .then(() => {\n const trailingResolve = this._trailingResolve.bind(this);\n this._trailingResolve = null;\n trailingResolve(this);\n })\n .catch((error) => {\n const trailingReject = this._trailingReject.bind(this);\n this._trailingReject = null;\n trailingReject(error);\n });\n }\n _createResolve(resolve) {\n return () => {\n this._rendering = false;\n resolve(this);\n };\n }\n _createReject(reject) {\n return (error) => {\n this._rendering = false;\n reject(error);\n };\n }\n // Update actual size and key.\n _computedOptions() {\n const options = this.options();\n const { key = exports.G2_CHART_KEY } = options;\n const { width, height, depth } = (0, utils_2.sizeOf)(options, this._container);\n this._width = width;\n this._height = height;\n this._key = key;\n return Object.assign(Object.assign({ key: this._key }, options), { width, height, depth });\n }\n // Create canvas if it does not exist.\n // DragAndDropPlugin is for interaction.\n // It is OK to register more than one time, G will handle this.\n _createCanvas() {\n const { width, height } = (0, utils_2.sizeOf)(this.options(), this._container);\n this._plugins.push(new g_plugin_dragndrop_1.Plugin());\n this._plugins.forEach((d) => this._renderer.registerPlugin(d));\n this._context.canvas = new g_1.Canvas({\n container: this._container,\n width,\n height,\n renderer: this._renderer,\n });\n }\n _addToTrailing() {\n var _a;\n // Resolve previous promise, and give up this task.\n (_a = this._trailingResolve) === null || _a === void 0 ? void 0 : _a.call(this, this);\n // Create new task.\n this._trailing = true;\n const promise = new Promise((resolve, reject) => {\n this._trailingResolve = resolve;\n this._trailingReject = reject;\n });\n return promise;\n }\n _bindAutoFit() {\n const options = this.options();\n const { autoFit } = options;\n if (this._hasBindAutoFit) {\n // If it was bind before, unbind it now.\n if (!autoFit)\n this._unbindAutoFit();\n return;\n }\n if (autoFit) {\n this._hasBindAutoFit = true;\n window.addEventListener('resize', this._onResize);\n }\n }\n _unbindAutoFit() {\n if (this._hasBindAutoFit) {\n this._hasBindAutoFit = false;\n window.removeEventListener('resize', this._onResize);\n }\n }\n}\nexports.Runtime = Runtime;\n//# sourceMappingURL=runtime.js.map","\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createEmptyPromise = exports.updateRoot = exports.optionsOf = exports.sizeOf = exports.valueOf = exports.normalizeRoot = exports.removeContainer = exports.normalizeContainer = exports.MIN_CHART_HEIGHT = exports.MIN_CHART_WIDTH = exports.CALLBACK_NODE = exports.REMOVE_FLAG = exports.VIEW_KEYS = void 0;\nconst util_1 = require(\"@antv/util\");\nconst size_1 = require(\"../utils/size\");\nconst helper_1 = require(\"../utils/helper\");\nconst node_1 = require(\"./node\");\n// Keys can specified by new Chart({...}).\n// Keys can bubble form mark-level options to view-level options.\nexports.VIEW_KEYS = [\n 'width',\n 'height',\n 'depth',\n 'padding',\n 'paddingLeft',\n 'paddingRight',\n 'paddingBottom',\n 'paddingTop',\n 'inset',\n 'insetLeft',\n 'insetRight',\n 'insetTop',\n 'insetBottom',\n 'margin',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'autoFit',\n 'theme',\n 'title',\n 'interaction',\n];\nexports.REMOVE_FLAG = '__remove__';\nexports.CALLBACK_NODE = '__callback__';\n/** Minimum chart width */\nexports.MIN_CHART_WIDTH = 1;\n/** Minimum chart height */\nexports.MIN_CHART_HEIGHT = 1;\nfunction normalizeContainer(container) {\n if (container === undefined) {\n const container = document.createElement('div');\n container[exports.REMOVE_FLAG] = true;\n return container;\n }\n if (typeof container === 'string') {\n const node = document.getElementById(container);\n return node;\n }\n return container;\n}\nexports.normalizeContainer = normalizeContainer;\nfunction removeContainer(container) {\n const parent = container.parentNode;\n if (parent) {\n parent.removeChild(container);\n }\n}\nexports.removeContainer = removeContainer;\nfunction normalizeRoot(node) {\n if (node.type !== null)\n return node;\n const root = node.children[node.children.length - 1];\n for (const key of exports.VIEW_KEYS)\n root.attr(key, node.attr(key));\n return root;\n}\nexports.normalizeRoot = normalizeRoot;\nfunction valueOf(node) {\n return Object.assign(Object.assign({}, node.value), { type: node.type });\n}\nexports.valueOf = valueOf;\nfunction sizeOf(options, container) {\n const { width, height, autoFit, depth = 0 } = options;\n let effectiveWidth = 640;\n let effectiveHeight = 480;\n if (autoFit) {\n const { width: containerWidth, height: containerHeight } = (0, size_1.getContainerSize)(container);\n effectiveWidth = containerWidth || effectiveWidth;\n effectiveHeight = containerHeight || effectiveHeight;\n }\n effectiveWidth = width || effectiveWidth;\n effectiveHeight = height || effectiveHeight;\n return {\n width: Math.max((0, util_1.isNumber)(effectiveWidth) ? effectiveWidth : exports.MIN_CHART_WIDTH, exports.MIN_CHART_WIDTH),\n height: Math.max((0, util_1.isNumber)(effectiveHeight) ? effectiveHeight : exports.MIN_CHART_HEIGHT, exports.MIN_CHART_HEIGHT),\n depth,\n };\n}\nexports.sizeOf = sizeOf;\nfunction optionsOf(node) {\n const root = normalizeRoot(node);\n const discovered = [root];\n const nodeValue = new Map();\n nodeValue.set(root, valueOf(root));\n while (discovered.length) {\n const node = discovered.pop();\n const value = nodeValue.get(node);\n const { children = [] } = node;\n for (const child of children) {\n if (child.type === exports.CALLBACK_NODE) {\n value.children = child.value;\n }\n else {\n const childValue = valueOf(child);\n const { children = [] } = value;\n children.push(childValue);\n discovered.push(child);\n nodeValue.set(child, childValue);\n value.children = children;\n }\n }\n }\n return nodeValue.get(root);\n}\nexports.optionsOf = optionsOf;\nfunction isMark(type, mark) {\n if (typeof type === 'function')\n return true;\n return new Set(Object.keys(mark)).has(type);\n}\nfunction isComposition(type, composition) {\n return (typeof type !== 'function' && new Set(Object.keys(composition)).has(type));\n}\nfunction normalizeRootOptions(node, options, previousType, marks, composition) {\n const { type: oldType } = node;\n const { type = previousType || oldType } = options;\n if (isComposition(type, composition)) {\n for (const key of exports.VIEW_KEYS) {\n if (node.attr(key) !== undefined && options[key] === undefined) {\n options[key] = node.attr(key);\n }\n }\n return options;\n }\n if (isMark(type, marks)) {\n const view = { type: 'view' };\n const mark = Object.assign({}, options);\n for (const key of exports.VIEW_KEYS) {\n if (mark[key] !== undefined) {\n view[key] = mark[key];\n delete mark[key];\n }\n }\n return Object.assign(Object.assign({}, view), { children: [mark] });\n }\n return options;\n}\nfunction typeCtor(type, mark, composition) {\n if (typeof type === 'function')\n return mark.mark;\n const node = Object.assign(Object.assign({}, mark), composition);\n const ctor = node[type];\n if (!ctor)\n throw new Error(`Unknown mark: ${type}.`);\n return ctor;\n}\n// Create node from options.\nfunction createNode(options, mark, composition) {\n if (typeof options === 'function') {\n const node = new node_1.Node();\n node.value = options;\n node.type = exports.CALLBACK_NODE;\n return node;\n }\n const { type, children } = options, value = __rest(options, [\"type\", \"children\"]);\n const Ctor = typeCtor(type, mark, composition);\n const node = new Ctor();\n node.value = value;\n // @ts-ignore\n node.type = type;\n return node;\n}\n// Update node by options.\nfunction updateNode(node, newOptions) {\n const { type, children } = newOptions, value = __rest(newOptions, [\"type\", \"children\"]);\n if (node.type === type || type === undefined) {\n // Update node.\n (0, helper_1.deepAssign)(node.value, value);\n }\n else if (typeof type === 'string') {\n // Transform node.\n node.type = type;\n node.value = value;\n }\n}\n// Create a nested node tree from newOptions, and append it to the parent.\nfunction appendNode(parent, newOptions, mark, composition) {\n if (!parent)\n return;\n const discovered = [[parent, newOptions]];\n while (discovered.length) {\n const [parent, nodeOptions] = discovered.shift();\n const node = createNode(nodeOptions, mark, composition);\n if (Array.isArray(parent.children))\n parent.push(node);\n const { children } = nodeOptions;\n if (Array.isArray(children)) {\n for (const child of children) {\n discovered.push([node, child]);\n }\n }\n else if (typeof children === 'function') {\n discovered.push([node, children]);\n }\n }\n}\n// Update node tree from options.\nfunction updateRoot(node, options, definedType, mark, composition) {\n const rootOptions = normalizeRootOptions(node, options, definedType, mark, composition);\n const discovered = [[null, node, rootOptions]];\n while (discovered.length) {\n const [parent, oldNode, newNode] = discovered.shift();\n // If there is no oldNode, create a node tree directly.\n if (!oldNode) {\n appendNode(parent, newNode, mark, composition);\n }\n else if (!newNode) {\n oldNode.remove();\n }\n else {\n updateNode(oldNode, newNode);\n const { children: newChildren } = newNode;\n const { children: oldChildren } = oldNode;\n if (Array.isArray(newChildren) && Array.isArray(oldChildren)) {\n // Only update node specified in newChildren,\n // the extra oldChildren will remain still.\n const n = Math.max(newChildren.length, oldChildren.length);\n for (let i = 0; i < n; i++) {\n const newChild = newChildren[i];\n const oldChild = oldChildren[i];\n discovered.push([oldNode, oldChild, newChild]);\n }\n }\n else if (typeof newChildren === 'function') {\n discovered.push([oldNode, null, newChildren]);\n }\n }\n }\n}\nexports.updateRoot = updateRoot;\nfunction createEmptyPromise() {\n let reject;\n let resolve;\n const cloned = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return [cloned, resolve, reject];\n}\nexports.createEmptyPromise = createEmptyPromise;\n//# sourceMappingURL=utils.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getBBoxSize = exports.getContainerSize = void 0;\nconst parseInt10 = (d) => (d ? parseInt(d) : 0);\n/**\n * @description Get the element's bounding size.\n * @param container dom element.\n * @returns the element width and height\n */\nfunction getContainerSize(container) {\n // size = width/height - padding.\n const style = getComputedStyle(container);\n const wrapperWidth = container.clientWidth || parseInt10(style.width);\n const wrapperHeight = container.clientHeight || parseInt10(style.height);\n const widthPadding = parseInt10(style.paddingLeft) + parseInt10(style.paddingRight);\n const heightPadding = parseInt10(style.paddingTop) + parseInt10(style.paddingBottom);\n return {\n width: wrapperWidth - widthPadding,\n height: wrapperHeight - heightPadding,\n };\n}\nexports.getContainerSize = getContainerSize;\n/**\n * @description Calculate the real canvas size by view options.\n */\nfunction getBBoxSize(options) {\n const { height, width, padding = 0, paddingLeft = padding, paddingRight = padding, paddingTop = padding, paddingBottom = padding, margin = 0, marginLeft = margin, marginRight = margin, marginTop = margin, marginBottom = margin, inset = 0, insetLeft = inset, insetRight = inset, insetTop = inset, insetBottom = inset, } = options;\n // @todo Add this padding to theme.\n // 30 is default size for padding, which defined in runtime.\n const maybeAuto = (padding) => (padding === 'auto' ? 20 : padding);\n const finalWidth = width -\n maybeAuto(paddingLeft) -\n maybeAuto(paddingRight) -\n marginLeft -\n marginRight -\n insetLeft -\n insetRight;\n const finalHeight = height -\n maybeAuto(paddingTop) -\n maybeAuto(paddingBottom) -\n marginTop -\n marginBottom -\n insetTop -\n insetBottom;\n return { width: finalWidth, height: finalHeight };\n}\nexports.getBBoxSize = getBBoxSize;\n//# sourceMappingURL=size.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Node = void 0;\n/**\n * BFS nodes and execute callback.\n */\nfunction bfs(node, callback) {\n const discovered = [node];\n while (discovered.length) {\n const currentNode = discovered.shift();\n callback && callback(currentNode);\n const children = currentNode.children || [];\n for (const child of children) {\n discovered.push(child);\n }\n }\n}\n/**\n * Hierarchy container.\n */\nclass Node {\n constructor(value = {}, type) {\n // The parent node.\n this.parentNode = null;\n // The children nodes.\n this.children = [];\n // The index of parent children.\n this.index = 0;\n this.type = type;\n this.value = value;\n }\n /**\n * Apply specified transform to current value. Mount the node\n * to replace the original one in the tree and then return it.\n */\n map(transform = (x) => x) {\n const newValue = transform(this.value);\n this.value = newValue;\n return this;\n }\n /**\n * Set or get the specified attribute. It the value is specified, update\n * the attribute of current value and return the node. Otherwise\n * return the the attribute of current value.\n */\n attr(key, value) {\n if (arguments.length === 1)\n return this.value[key];\n return this.map((v) => ((v[key] = value), v));\n }\n /**\n * Create a new node and append to children nodes.\n */\n append(Ctor) {\n const node = new Ctor({});\n node.children = [];\n this.push(node);\n return node;\n }\n push(node) {\n node.parentNode = this;\n node.index = this.children.length;\n this.children.push(node);\n return this;\n }\n /**\n * Remove current node from parentNode.\n */\n remove() {\n const parent = this.parentNode;\n if (parent) {\n const { children } = parent;\n const index = children.findIndex((item) => item === this);\n children.splice(index, 1);\n }\n return this;\n }\n getNodeByKey(key) {\n let targetNode = null;\n const callback = (node) => {\n if (key === node.attr('key')) {\n targetNode = node;\n }\n };\n bfs(this, callback);\n return targetNode;\n }\n getNodesByType(type) {\n const nodes = [];\n const callback = (node) => {\n if (type === node.type) {\n nodes.push(node);\n }\n };\n bfs(this, callback);\n return nodes;\n }\n getNodeByType(type) {\n let node = null;\n bfs(this, (current) => {\n if (node)\n return;\n if (type === current.type)\n node = current;\n });\n return node;\n }\n /**\n * Apply specified callback to the node value.\n */\n call(callback, ...params) {\n callback(this.map(), ...params);\n return this;\n }\n getRoot() {\n // Find the root chart and render.\n let root = this;\n while (root && root.parentNode) {\n root = root.parentNode;\n }\n return root;\n }\n}\nexports.Node = Node;\n//# sourceMappingURL=node.js.map","\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CompositionNode = void 0;\nconst style_1 = require(\"../utils/style\");\nconst node_1 = require(\"./node\");\nconst define_1 = require(\"./define\");\nconst props_1 = require(\"./props\");\nlet CompositionNode = class CompositionNode extends node_1.Node {\n /**\n * Change current node data and its children data.\n */\n changeData(data) {\n var _a;\n const chart = this.getRoot();\n if (!chart)\n return;\n this.attr('data', data);\n if ((_a = this.children) === null || _a === void 0 ? void 0 : _a.length) {\n this.children.forEach((child) => {\n child.attr('data', data);\n });\n }\n return chart === null || chart === void 0 ? void 0 : chart.render();\n }\n /**\n * Get view instance by key.\n */\n getView() {\n const chart = this.getRoot();\n const { views } = chart.getContext();\n if (!(views === null || views === void 0 ? void 0 : views.length))\n return undefined;\n return views.find((view) => view.key === this._key);\n }\n getScale() {\n var _a;\n return (_a = this.getView()) === null || _a === void 0 ? void 0 : _a.scale;\n }\n getScaleByChannel(channel) {\n const scale = this.getScale();\n if (scale)\n return scale[channel];\n return;\n }\n getCoordinate() {\n var _a;\n return (_a = this.getView()) === null || _a === void 0 ? void 0 : _a.coordinate;\n }\n getTheme() {\n var _a;\n return (_a = this.getView()) === null || _a === void 0 ? void 0 : _a.theme;\n }\n getGroup() {\n const key = this._key;\n if (!key)\n return undefined;\n const chart = this.getRoot();\n const chartGroup = chart.getContext().canvas.getRoot();\n return chartGroup.getElementById(key);\n }\n /**\n * Show the view.\n */\n show() {\n const group = this.getGroup();\n if (!group)\n return;\n !group.isVisible() && (0, style_1.show)(group);\n }\n /**\n * Hide the view.\n */\n hide() {\n const group = this.getGroup();\n if (!group)\n return;\n group.isVisible() && (0, style_1.hide)(group);\n }\n};\nCompositionNode = __decorate([\n (0, define_1.defineProps)(props_1.compositionProps)\n], CompositionNode);\nexports.CompositionNode = CompositionNode;\n//# sourceMappingURL=composition.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.nodeProps = exports.defineProps = void 0;\nconst helper_1 = require(\"../utils/helper\");\nfunction defineValueProp(Node, name, { key = name }) {\n Node.prototype[name] = function (value) {\n if (arguments.length === 0)\n return this.attr(key);\n return this.attr(key, value);\n };\n}\nfunction defineArrayProp(Node, name, { key = name }) {\n Node.prototype[name] = function (value) {\n if (arguments.length === 0)\n return this.attr(key);\n if (Array.isArray(value))\n return this.attr(key, value);\n const array = [...(this.attr(key) || []), value];\n return this.attr(key, array);\n };\n}\nfunction defineObjectProp(Node, name, { key: k = name }) {\n Node.prototype[name] = function (key, value) {\n if (arguments.length === 0)\n return this.attr(k);\n if (arguments.length === 1 && typeof key !== 'string') {\n return this.attr(k, key);\n }\n const obj = this.attr(k) || {};\n obj[key] = arguments.length === 1 ? true : value;\n return this.attr(k, obj);\n };\n}\nfunction defineMixProp(Node, name, descriptor) {\n Node.prototype[name] = function (key) {\n if (arguments.length === 0)\n return this.attr(name);\n if (Array.isArray(key))\n return this.attr(name, { items: key });\n if ((0, helper_1.isStrictObject)(key) &&\n (key.title !== undefined || key.items !== undefined)) {\n return this.attr(name, key);\n }\n if (key === null || key === false)\n return this.attr(name, key);\n const obj = this.attr(name) || {};\n const { items = [] } = obj;\n items.push(key);\n obj.items = items;\n return this.attr(name, obj);\n };\n}\nfunction defineNodeProp(Node, name, { ctor }) {\n Node.prototype[name] = function (hocMark) {\n const node = this.append(ctor);\n if (name === 'mark') {\n node.type = hocMark;\n }\n return node;\n };\n}\nfunction defineContainerProp(Node, name, { ctor }) {\n Node.prototype[name] = function () {\n this.type = null;\n return this.append(ctor);\n };\n}\n/**\n * A decorator to define different type of attribute setter or\n * getter for current node.\n */\nfunction defineProps(descriptors) {\n return (Node) => {\n for (const [name, descriptor] of Object.entries(descriptors)) {\n const { type } = descriptor;\n if (type === 'value')\n defineValueProp(Node, name, descriptor);\n else if (type === 'array')\n defineArrayProp(Node, name, descriptor);\n else if (type === 'object')\n defineObjectProp(Node, name, descriptor);\n else if (type === 'node')\n defineNodeProp(Node, name, descriptor);\n else if (type === 'container')\n defineContainerProp(Node, name, descriptor);\n else if (type === 'mix')\n defineMixProp(Node, name, descriptor);\n }\n return Node;\n };\n}\nexports.defineProps = defineProps;\nfunction nodeProps(node) {\n return Object.fromEntries(Object.entries(node).map(([name, ctor]) => [name, { type: 'node', ctor }]));\n}\nexports.nodeProps = nodeProps;\n//# sourceMappingURL=define.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.compositionProps = exports.markProps = exports.commonProps = void 0;\nexports.commonProps = {\n encode: { type: 'object' },\n scale: { type: 'object' },\n data: { type: 'value' },\n transform: { type: 'array' },\n style: { type: 'object' },\n animate: { type: 'object' },\n coordinate: { type: 'object' },\n interaction: { type: 'object' },\n label: { type: 'array', key: 'labels' },\n axis: { type: 'object' },\n legend: { type: 'object' },\n slider: { type: 'object' },\n scrollbar: { type: 'object' },\n state: { type: 'object' },\n layout: { type: 'object' },\n theme: { type: 'object' },\n title: { type: 'value' },\n};\nexports.markProps = Object.assign(Object.assign({}, exports.commonProps), { tooltip: { type: 'mix' }, viewStyle: { type: 'object' } });\nexports.compositionProps = Object.assign(Object.assign({}, exports.commonProps), { labelTransform: { type: 'array' } });\n//# sourceMappingURL=props.js.map","\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MarkNode = void 0;\nconst node_1 = require(\"./node\");\nconst define_1 = require(\"./define\");\nconst props_1 = require(\"./props\");\nlet MarkNode = class MarkNode extends node_1.Node {\n changeData(data) {\n const chart = this.getRoot();\n if (!chart)\n return;\n this.attr('data', data);\n return chart === null || chart === void 0 ? void 0 : chart.render();\n }\n /**\n * Get mark from chart views.\n */\n getMark() {\n var _a;\n const chartView = (_a = this.getRoot()) === null || _a === void 0 ? void 0 : _a.getView();\n if (!chartView)\n return undefined;\n const { markState } = chartView;\n const markKey = Array.from(markState.keys()).find((item) => item.key === this.attr('key'));\n return markState.get(markKey);\n }\n /**\n * Get all scales instance.\n */\n getScale() {\n var _a;\n const chartView = (_a = this.getRoot()) === null || _a === void 0 ? void 0 : _a.getView();\n if (!chartView)\n return undefined;\n return chartView === null || chartView === void 0 ? void 0 : chartView.scale;\n }\n /**\n * Get the scale instance by channel.\n */\n getScaleByChannel(channel) {\n var _a, _b;\n const chartView = (_a = this.getRoot()) === null || _a === void 0 ? void 0 : _a.getView();\n if (!chartView)\n return undefined;\n return (_b = chartView === null || chartView === void 0 ? void 0 : chartView.scale) === null || _b === void 0 ? void 0 : _b[channel];\n }\n /**\n * Get canvas group.\n */\n getGroup() {\n const key = this.attr('key');\n if (!key)\n return undefined;\n const chart = this.getRoot();\n const chartGroup = chart.getContext().canvas.getRoot();\n return chartGroup.getElementById(key);\n }\n};\nMarkNode = __decorate([\n (0, define_1.defineProps)(props_1.markProps)\n], MarkNode);\nexports.MarkNode = MarkNode;\n//# sourceMappingURL=mark.js.map","\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ClassicDark = exports.Classic = exports.Academy = exports.Dark = exports.Light = exports.LinearAxis = exports.selectPlotArea = exports.selectG2Elements = exports.seriesOf = exports.dataOf = exports.Selection = exports.select = exports.ChartEvent = exports.extend = exports.Runtime = exports.register = exports.MASK_CLASS_NAME = exports.AREA_CLASS_NAME = exports.LABEL_CLASS_NAME = exports.COMPONENT_CLASS_NAME = exports.PLOT_CLASS_NAME = exports.VIEW_CLASS_NAME = exports.ELEMENT_CLASS_NAME = exports.LABEL_LAYER_CLASS_NAME = exports.MAIN_LAYER_CLASS_NAME = exports.renderToMountedElement = exports.render = void 0;\nvar runtime_1 = require(\"./runtime\");\nObject.defineProperty(exports, \"render\", { enumerable: true, get: function () { return runtime_1.render; } });\nObject.defineProperty(exports, \"renderToMountedElement\", { enumerable: true, get: function () { return runtime_1.renderToMountedElement; } });\nObject.defineProperty(exports, \"MAIN_LAYER_CLASS_NAME\", { enumerable: true, get: function () { return runtime_1.MAIN_LAYER_CLASS_NAME; } });\nObject.defineProperty(exports, \"LABEL_LAYER_CLASS_NAME\", { enumerable: true, get: function () { return runtime_1.LABEL_LAYER_CLASS_NAME; } });\nObject.defineProperty(exports, \"ELEMENT_CLASS_NAME\", { enumerable: true, get: function () { return runtime_1.ELEMENT_CLASS_NAME; } });\nObject.defineProperty(exports, \"VIEW_CLASS_NAME\", { enumerable: true, get: function () { return runtime_1.VIEW_CLASS_NAME; } });\nObject.defineProperty(exports, \"PLOT_CLASS_NAME\", { enumerable: true, get: function () { return runtime_1.PLOT_CLASS_NAME; } });\nObject.defineProperty(exports, \"COMPONENT_CLASS_NAME\", { enumerable: true, get: function () { return runtime_1.COMPONENT_CLASS_NAME; } });\nObject.defineProperty(exports, \"LABEL_CLASS_NAME\", { enumerable: true, get: function () { return runtime_1.LABEL_CLASS_NAME; } });\nObject.defineProperty(exports, \"AREA_CLASS_NAME\", { enumerable: true, get: function () { return runtime_1.AREA_CLASS_NAME; } });\nObject.defineProperty(exports, \"MASK_CLASS_NAME\", { enumerable: true, get: function () { return runtime_1.MASK_CLASS_NAME; } });\nvar api_1 = require(\"./api\");\nObject.defineProperty(exports, \"register\", { enumerable: true, get: function () { return api_1.register; } });\nObject.defineProperty(exports, \"Runtime\", { enumerable: true, get: function () { return api_1.Runtime; } });\nObject.defineProperty(exports, \"extend\", { enumerable: true, get: function () { return api_1.extend; } });\nvar event_1 = require(\"./utils/event\");\nObject.defineProperty(exports, \"ChartEvent\", { enumerable: true, get: function () { return event_1.ChartEvent; } });\n__exportStar(require(\"./spec\"), exports);\nvar selection_1 = require(\"./utils/selection\");\nObject.defineProperty(exports, \"select\", { enumerable: true, get: function () { return selection_1.select; } });\nObject.defineProperty(exports, \"Selection\", { enumerable: true, get: function () { return selection_1.Selection; } });\nvar helper_1 = require(\"./utils/helper\");\nObject.defineProperty(exports, \"dataOf\", { enumerable: true, get: function () { return helper_1.dataOf; } });\nObject.defineProperty(exports, \"seriesOf\", { enumerable: true, get: function () { return helper_1.seriesOf; } });\nvar utils_1 = require(\"./interaction/utils\");\nObject.defineProperty(exports, \"selectG2Elements\", { enumerable: true, get: function () { return utils_1.selectG2Elements; } });\nObject.defineProperty(exports, \"selectPlotArea\", { enumerable: true, get: function () { return utils_1.selectPlotArea; } });\n__exportStar(require(\"./transform\"), exports);\nvar axis_1 = require(\"./component/axis\");\nObject.defineProperty(exports, \"LinearAxis\", { enumerable: true, get: function () { return axis_1.LinearAxis; } });\nvar theme_1 = require(\"./theme\");\nObject.defineProperty(exports, \"Light\", { enumerable: true, get: function () { return theme_1.Light; } });\nObject.defineProperty(exports, \"Dark\", { enumerable: true, get: function () { return theme_1.Dark; } });\nObject.defineProperty(exports, \"Academy\", { enumerable: true, get: function () { return theme_1.Academy; } });\nObject.defineProperty(exports, \"Classic\", { enumerable: true, get: function () { return theme_1.Classic; } });\nObject.defineProperty(exports, \"ClassicDark\", { enumerable: true, get: function () { return theme_1.ClassicDark; } });\n//# sourceMappingURL=exports.js.map","\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./animate\"), exports);\n__exportStar(require(\"./component\"), exports);\n__exportStar(require(\"./composition\"), exports);\n__exportStar(require(\"./coordinate\"), exports);\n__exportStar(require(\"./coordinateTransform\"), exports);\n__exportStar(require(\"./data\"), exports);\n__exportStar(require(\"./dataTransform\"), exports);\n__exportStar(require(\"./encode\"), exports);\n__exportStar(require(\"./interaction\"), exports);\n__exportStar(require(\"./labelTransform\"), exports);\n__exportStar(require(\"./mark\"), exports);\n__exportStar(require(\"./scale\"), exports);\n__exportStar(require(\"./palette\"), exports);\n__exportStar(require(\"./theme\"), exports);\n__exportStar(require(\"./transform\"), exports);\n//# sourceMappingURL=index.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=animate.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=component.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=composition.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=coordinate.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=coordinateTransform.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=dataTransform.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=encode.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=interaction.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=labelTransform.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=mark.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=scale.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=palette.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=theme.js.map","\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=transform.js.map"]} \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/index.js b/miniprogram_npm/crypto-js/index.js new file mode 100644 index 0000000..ff3deb1 --- /dev/null +++ b/miniprogram_npm/crypto-js/index.js @@ -0,0 +1,7365 @@ +module.exports = (function() { +var __MODS__ = {}; +var __DEFINE__ = function(modId, func, req) { var m = { exports: {}, _tempexports: {} }; __MODS__[modId] = { status: 0, func: func, req: req, m: m }; }; +var __REQUIRE__ = function(modId, source) { if(!__MODS__[modId]) return require(source); if(!__MODS__[modId].status) { var m = __MODS__[modId].m; m._exports = m._tempexports; var desp = Object.getOwnPropertyDescriptor(m, "exports"); if (desp && desp.configurable) Object.defineProperty(m, "exports", { set: function (val) { if(typeof val === "object" && val !== m._exports) { m._exports.__proto__ = val.__proto__; Object.keys(val).forEach(function (k) { m._exports[k] = val[k]; }); } m._tempexports = val }, get: function () { return m._tempexports; } }); __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports); } return __MODS__[modId].m.exports; }; +var __REQUIRE_WILDCARD__ = function(obj) { if(obj && obj.__esModule) { return obj; } else { var newObj = {}; if(obj != null) { for(var k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.default = obj; return newObj; } }; +var __REQUIRE_DEFAULT__ = function(obj) { return obj && obj.__esModule ? obj.default : obj; }; +__DEFINE__(1751263816220, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core"), require("./lib-typedarrays"), require("./enc-utf16"), require("./enc-base64"), require("./enc-base64url"), require("./md5"), require("./sha1"), require("./sha256"), require("./sha224"), require("./sha512"), require("./sha384"), require("./sha3"), require("./ripemd160"), require("./hmac"), require("./pbkdf2"), require("./evpkdf"), require("./cipher-core"), require("./mode-cfb"), require("./mode-ctr"), require("./mode-ctr-gladman"), require("./mode-ofb"), require("./mode-ecb"), require("./pad-ansix923"), require("./pad-iso10126"), require("./pad-iso97971"), require("./pad-zeropadding"), require("./pad-nopadding"), require("./format-hex"), require("./aes"), require("./tripledes"), require("./rc4"), require("./rabbit"), require("./rabbit-legacy"), require("./blowfish")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core", "./lib-typedarrays", "./enc-utf16", "./enc-base64", "./enc-base64url", "./md5", "./sha1", "./sha256", "./sha224", "./sha512", "./sha384", "./sha3", "./ripemd160", "./hmac", "./pbkdf2", "./evpkdf", "./cipher-core", "./mode-cfb", "./mode-ctr", "./mode-ctr-gladman", "./mode-ofb", "./mode-ecb", "./pad-ansix923", "./pad-iso10126", "./pad-iso97971", "./pad-zeropadding", "./pad-nopadding", "./format-hex", "./aes", "./tripledes", "./rc4", "./rabbit", "./rabbit-legacy", "./blowfish"], factory); + } + else { + // Global (browser) + root.CryptoJS = factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS; + +})); +}, function(modId) {var map = {"./core":1751263816221,"./x64-core":1751263816222,"./lib-typedarrays":1751263816223,"./enc-utf16":1751263816224,"./enc-base64":1751263816225,"./enc-base64url":1751263816226,"./md5":1751263816227,"./sha1":1751263816228,"./sha256":1751263816229,"./sha224":1751263816230,"./sha512":1751263816231,"./sha384":1751263816232,"./sha3":1751263816233,"./ripemd160":1751263816234,"./hmac":1751263816235,"./pbkdf2":1751263816236,"./evpkdf":1751263816237,"./cipher-core":1751263816238,"./mode-cfb":1751263816239,"./mode-ctr":1751263816240,"./mode-ctr-gladman":1751263816241,"./mode-ofb":1751263816242,"./mode-ecb":1751263816243,"./pad-ansix923":1751263816244,"./pad-iso10126":1751263816245,"./pad-iso97971":1751263816246,"./pad-zeropadding":1751263816247,"./pad-nopadding":1751263816248,"./format-hex":1751263816249,"./aes":1751263816250,"./tripledes":1751263816251,"./rc4":1751263816252,"./rabbit":1751263816253,"./rabbit-legacy":1751263816254,"./blowfish":1751263816255}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816221, function(require, module, exports) { +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(); + } + else if (typeof define === "function" && define.amd) { + // AMD + define([], factory); + } + else { + // Global (browser) + root.CryptoJS = factory(); + } +}(this, function () { + + /*globals window, global, require*/ + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined) { + + var crypto; + + // Native crypto from window (Browser) + if (typeof window !== 'undefined' && window.crypto) { + crypto = window.crypto; + } + + // Native crypto in web worker (Browser) + if (typeof self !== 'undefined' && self.crypto) { + crypto = self.crypto; + } + + // Native crypto from worker + if (typeof globalThis !== 'undefined' && globalThis.crypto) { + crypto = globalThis.crypto; + } + + // Native (experimental IE 11) crypto from window (Browser) + if (!crypto && typeof window !== 'undefined' && window.msCrypto) { + crypto = window.msCrypto; + } + + // Native crypto from global (NodeJS) + if (!crypto && typeof global !== 'undefined' && global.crypto) { + crypto = global.crypto; + } + + // Native crypto import via require (NodeJS) + if (!crypto && typeof require === 'function') { + try { + crypto = require('crypto'); + } catch (err) {} + } + + /* + * Cryptographically secure pseudorandom number generator + * + * As Math.random() is cryptographically not safe to use + */ + var cryptoSecureRandomInt = function () { + if (crypto) { + // Use getRandomValues method (Browser) + if (typeof crypto.getRandomValues === 'function') { + try { + return crypto.getRandomValues(new Uint32Array(1))[0]; + } catch (err) {} + } + + // Use randomBytes method (NodeJS) + if (typeof crypto.randomBytes === 'function') { + try { + return crypto.randomBytes(4).readInt32LE(); + } catch (err) {} + } + } + + throw new Error('Native crypto module could not be used to get secure random number.'); + }; + + /* + * Local polyfill of Object.create + + */ + var create = Object.create || (function () { + function F() {} + + return function (obj) { + var subtype; + + F.prototype = obj; + + subtype = new F(); + + F.prototype = null; + + return subtype; + }; + }()); + + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + var subtype = create(this); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else { + // Copy one word at a time + for (var j = 0; j < thatSigBytes; j += 4) { + thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2]; + } + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + for (var i = 0; i < nBytes; i += 4) { + words.push(cryptoSecureRandomInt()); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + var processedWords; + + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + return CryptoJS; + +})); +}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816222, function(require, module, exports) { +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var X32WordArray = C_lib.WordArray; + + /** + * x64 namespace. + */ + var C_x64 = C.x64 = {}; + + /** + * A 64-bit word. + */ + var X64Word = C_x64.Word = Base.extend({ + /** + * Initializes a newly created 64-bit word. + * + * @param {number} high The high 32 bits. + * @param {number} low The low 32 bits. + * + * @example + * + * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); + */ + init: function (high, low) { + this.high = high; + this.low = low; + } + + /** + * Bitwise NOTs this word. + * + * @return {X64Word} A new x64-Word object after negating. + * + * @example + * + * var negated = x64Word.not(); + */ + // not: function () { + // var high = ~this.high; + // var low = ~this.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ANDs this word with the passed word. + * + * @param {X64Word} word The x64-Word to AND with this word. + * + * @return {X64Word} A new x64-Word object after ANDing. + * + * @example + * + * var anded = x64Word.and(anotherX64Word); + */ + // and: function (word) { + // var high = this.high & word.high; + // var low = this.low & word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to OR with this word. + * + * @return {X64Word} A new x64-Word object after ORing. + * + * @example + * + * var ored = x64Word.or(anotherX64Word); + */ + // or: function (word) { + // var high = this.high | word.high; + // var low = this.low | word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise XORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to XOR with this word. + * + * @return {X64Word} A new x64-Word object after XORing. + * + * @example + * + * var xored = x64Word.xor(anotherX64Word); + */ + // xor: function (word) { + // var high = this.high ^ word.high; + // var low = this.low ^ word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the left. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftL(25); + */ + // shiftL: function (n) { + // if (n < 32) { + // var high = (this.high << n) | (this.low >>> (32 - n)); + // var low = this.low << n; + // } else { + // var high = this.low << (n - 32); + // var low = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the right. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftR(7); + */ + // shiftR: function (n) { + // if (n < 32) { + // var low = (this.low >>> n) | (this.high << (32 - n)); + // var high = this.high >>> n; + // } else { + // var low = this.high >>> (n - 32); + // var high = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Rotates this word n bits to the left. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotL(25); + */ + // rotL: function (n) { + // return this.shiftL(n).or(this.shiftR(64 - n)); + // }, + + /** + * Rotates this word n bits to the right. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotR(7); + */ + // rotR: function (n) { + // return this.shiftR(n).or(this.shiftL(64 - n)); + // }, + + /** + * Adds this word with the passed word. + * + * @param {X64Word} word The x64-Word to add with this word. + * + * @return {X64Word} A new x64-Word object after adding. + * + * @example + * + * var added = x64Word.add(anotherX64Word); + */ + // add: function (word) { + // var low = (this.low + word.low) | 0; + // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; + // var high = (this.high + word.high + carry) | 0; + + // return X64Word.create(high, low); + // } + }); + + /** + * An array of 64-bit words. + * + * @property {Array} words The array of CryptoJS.x64.Word objects. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var X64WordArray = C_x64.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.x64.WordArray.create(); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ]); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ], 10); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 8; + } + }, + + /** + * Converts this 64-bit word array to a 32-bit word array. + * + * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. + * + * @example + * + * var x32WordArray = x64WordArray.toX32(); + */ + toX32: function () { + // Shortcuts + var x64Words = this.words; + var x64WordsLength = x64Words.length; + + // Convert + var x32Words = []; + for (var i = 0; i < x64WordsLength; i++) { + var x64Word = x64Words[i]; + x32Words.push(x64Word.high); + x32Words.push(x64Word.low); + } + + return X32WordArray.create(x32Words, this.sigBytes); + }, + + /** + * Creates a copy of this word array. + * + * @return {X64WordArray} The clone. + * + * @example + * + * var clone = x64WordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + + // Clone "words" array + var words = clone.words = this.words.slice(0); + + // Clone each X64Word object + var wordsLength = words.length; + for (var i = 0; i < wordsLength; i++) { + words[i] = words[i].clone(); + } + + return clone; + } + }); + }()); + + + return CryptoJS; + +})); +}, function(modId) { var map = {"./core":1751263816221}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816223, function(require, module, exports) { +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Check if typed arrays are supported + if (typeof ArrayBuffer != 'function') { + return; + } + + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + + // Reference original init + var superInit = WordArray.init; + + // Augment WordArray.init to handle typed arrays + var subInit = WordArray.init = function (typedArray) { + // Convert buffers to uint8 + if (typedArray instanceof ArrayBuffer) { + typedArray = new Uint8Array(typedArray); + } + + // Convert other array views to uint8 + if ( + typedArray instanceof Int8Array || + (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) || + typedArray instanceof Int16Array || + typedArray instanceof Uint16Array || + typedArray instanceof Int32Array || + typedArray instanceof Uint32Array || + typedArray instanceof Float32Array || + typedArray instanceof Float64Array + ) { + typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); + } + + // Handle Uint8Array + if (typedArray instanceof Uint8Array) { + // Shortcut + var typedArrayByteLength = typedArray.byteLength; + + // Extract bytes + var words = []; + for (var i = 0; i < typedArrayByteLength; i++) { + words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8); + } + + // Initialize this word array + superInit.call(this, words, typedArrayByteLength); + } else { + // Else call normal init + superInit.apply(this, arguments); + } + }; + + subInit.prototype = WordArray; + }()); + + + return CryptoJS.lib.WordArray; + +})); +}, function(modId) { var map = {"./core":1751263816221}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816224, function(require, module, exports) { +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * UTF-16 BE encoding strategy. + */ + var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = { + /** + * Converts a word array to a UTF-16 BE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 BE string. + * + * @static + * + * @example + * + * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff; + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 BE string to a word array. + * + * @param {string} utf16Str The UTF-16 BE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16.parse(utf16String); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + /** + * UTF-16 LE encoding strategy. + */ + C_enc.Utf16LE = { + /** + * Converts a word array to a UTF-16 LE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 LE string. + * + * @static + * + * @example + * + * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff); + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 LE string to a word array. + * + * @param {string} utf16Str The UTF-16 LE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + function swapEndian(word) { + return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff); + } + }()); + + + return CryptoJS.enc.Utf16; + +})); +}, function(modId) { var map = {"./core":1751263816221}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816225, function(require, module, exports) { +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64 encoding strategy. + */ + var Base64 = C_enc.Base64 = { + /** + * Converts a word array to a Base64 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Base64 string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64 string to a word array. + * + * @param {string} base64Str The Base64 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64.parse(base64String); + */ + parse: function (base64Str) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + var bitsCombined = bits1 | bits2; + words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + + return CryptoJS.enc.Base64; + +})); +}, function(modId) { var map = {"./core":1751263816221}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816226, function(require, module, exports) { +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64url encoding strategy. + */ + var Base64url = C_enc.Base64url = { + /** + * Converts a word array to a Base64url string. + * + * @param {WordArray} wordArray The word array. + * + * @param {boolean} urlSafe Whether to use url safe + * + * @return {string} The Base64url string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64url.stringify(wordArray); + */ + stringify: function (wordArray, urlSafe) { + if (urlSafe === undefined) { + urlSafe = true + } + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = urlSafe ? this._safe_map : this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64url string to a word array. + * + * @param {string} base64Str The Base64url string. + * + * @param {boolean} urlSafe Whether to use url safe + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64url.parse(base64String); + */ + parse: function (base64Str, urlSafe) { + if (urlSafe === undefined) { + urlSafe = true + } + + // Shortcuts + var base64StrLength = base64Str.length; + var map = urlSafe ? this._safe_map : this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', + _safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + var bitsCombined = bits1 | bits2; + words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + + return CryptoJS.enc.Base64url; + +})); +}, function(modId) { var map = {"./core":1751263816221}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816227, function(require, module, exports) { +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var T = []; + + // Compute constants + (function () { + for (var i = 0; i < 64; i++) { + T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; + } + }()); + + /** + * MD5 hash algorithm. + */ + var MD5 = C_algo.MD5 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + + // Shortcuts + var H = this._hash.words; + + var M_offset_0 = M[offset + 0]; + var M_offset_1 = M[offset + 1]; + var M_offset_2 = M[offset + 2]; + var M_offset_3 = M[offset + 3]; + var M_offset_4 = M[offset + 4]; + var M_offset_5 = M[offset + 5]; + var M_offset_6 = M[offset + 6]; + var M_offset_7 = M[offset + 7]; + var M_offset_8 = M[offset + 8]; + var M_offset_9 = M[offset + 9]; + var M_offset_10 = M[offset + 10]; + var M_offset_11 = M[offset + 11]; + var M_offset_12 = M[offset + 12]; + var M_offset_13 = M[offset + 13]; + var M_offset_14 = M[offset + 14]; + var M_offset_15 = M[offset + 15]; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + + // Computation + a = FF(a, b, c, d, M_offset_0, 7, T[0]); + d = FF(d, a, b, c, M_offset_1, 12, T[1]); + c = FF(c, d, a, b, M_offset_2, 17, T[2]); + b = FF(b, c, d, a, M_offset_3, 22, T[3]); + a = FF(a, b, c, d, M_offset_4, 7, T[4]); + d = FF(d, a, b, c, M_offset_5, 12, T[5]); + c = FF(c, d, a, b, M_offset_6, 17, T[6]); + b = FF(b, c, d, a, M_offset_7, 22, T[7]); + a = FF(a, b, c, d, M_offset_8, 7, T[8]); + d = FF(d, a, b, c, M_offset_9, 12, T[9]); + c = FF(c, d, a, b, M_offset_10, 17, T[10]); + b = FF(b, c, d, a, M_offset_11, 22, T[11]); + a = FF(a, b, c, d, M_offset_12, 7, T[12]); + d = FF(d, a, b, c, M_offset_13, 12, T[13]); + c = FF(c, d, a, b, M_offset_14, 17, T[14]); + b = FF(b, c, d, a, M_offset_15, 22, T[15]); + + a = GG(a, b, c, d, M_offset_1, 5, T[16]); + d = GG(d, a, b, c, M_offset_6, 9, T[17]); + c = GG(c, d, a, b, M_offset_11, 14, T[18]); + b = GG(b, c, d, a, M_offset_0, 20, T[19]); + a = GG(a, b, c, d, M_offset_5, 5, T[20]); + d = GG(d, a, b, c, M_offset_10, 9, T[21]); + c = GG(c, d, a, b, M_offset_15, 14, T[22]); + b = GG(b, c, d, a, M_offset_4, 20, T[23]); + a = GG(a, b, c, d, M_offset_9, 5, T[24]); + d = GG(d, a, b, c, M_offset_14, 9, T[25]); + c = GG(c, d, a, b, M_offset_3, 14, T[26]); + b = GG(b, c, d, a, M_offset_8, 20, T[27]); + a = GG(a, b, c, d, M_offset_13, 5, T[28]); + d = GG(d, a, b, c, M_offset_2, 9, T[29]); + c = GG(c, d, a, b, M_offset_7, 14, T[30]); + b = GG(b, c, d, a, M_offset_12, 20, T[31]); + + a = HH(a, b, c, d, M_offset_5, 4, T[32]); + d = HH(d, a, b, c, M_offset_8, 11, T[33]); + c = HH(c, d, a, b, M_offset_11, 16, T[34]); + b = HH(b, c, d, a, M_offset_14, 23, T[35]); + a = HH(a, b, c, d, M_offset_1, 4, T[36]); + d = HH(d, a, b, c, M_offset_4, 11, T[37]); + c = HH(c, d, a, b, M_offset_7, 16, T[38]); + b = HH(b, c, d, a, M_offset_10, 23, T[39]); + a = HH(a, b, c, d, M_offset_13, 4, T[40]); + d = HH(d, a, b, c, M_offset_0, 11, T[41]); + c = HH(c, d, a, b, M_offset_3, 16, T[42]); + b = HH(b, c, d, a, M_offset_6, 23, T[43]); + a = HH(a, b, c, d, M_offset_9, 4, T[44]); + d = HH(d, a, b, c, M_offset_12, 11, T[45]); + c = HH(c, d, a, b, M_offset_15, 16, T[46]); + b = HH(b, c, d, a, M_offset_2, 23, T[47]); + + a = II(a, b, c, d, M_offset_0, 6, T[48]); + d = II(d, a, b, c, M_offset_7, 10, T[49]); + c = II(c, d, a, b, M_offset_14, 15, T[50]); + b = II(b, c, d, a, M_offset_5, 21, T[51]); + a = II(a, b, c, d, M_offset_12, 6, T[52]); + d = II(d, a, b, c, M_offset_3, 10, T[53]); + c = II(c, d, a, b, M_offset_10, 15, T[54]); + b = II(b, c, d, a, M_offset_1, 21, T[55]); + a = II(a, b, c, d, M_offset_8, 6, T[56]); + d = II(d, a, b, c, M_offset_15, 10, T[57]); + c = II(c, d, a, b, M_offset_6, 15, T[58]); + b = II(b, c, d, a, M_offset_13, 21, T[59]); + a = II(a, b, c, d, M_offset_4, 6, T[60]); + d = II(d, a, b, c, M_offset_11, 10, T[61]); + c = II(c, d, a, b, M_offset_2, 15, T[62]); + b = II(b, c, d, a, M_offset_9, 21, T[63]); + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + + var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); + var nBitsTotalL = nBitsTotal; + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( + (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | + (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) + ); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | + (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) + ); + + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 4; i++) { + // Shortcut + var H_i = H[i]; + + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + function FF(a, b, c, d, x, s, t) { + var n = a + ((b & c) | (~b & d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function GG(a, b, c, d, x, s, t) { + var n = a + ((b & d) | (c & ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function HH(a, b, c, d, x, s, t) { + var n = a + (b ^ c ^ d) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function II(a, b, c, d, x, s, t) { + var n = a + (c ^ (b | ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.MD5('message'); + * var hash = CryptoJS.MD5(wordArray); + */ + C.MD5 = Hasher._createHelper(MD5); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacMD5(message, key); + */ + C.HmacMD5 = Hasher._createHmacHelper(MD5); + }(Math)); + + + return CryptoJS.MD5; + +})); +}, function(modId) { var map = {"./core":1751263816221}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816228, function(require, module, exports) { +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Reusable object + var W = []; + + /** + * SHA-1 hash algorithm. + */ + var SHA1 = C_algo.SHA1 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476, + 0xc3d2e1f0 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + + // Computation + for (var i = 0; i < 80; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + W[i] = (n << 1) | (n >>> 31); + } + + var t = ((a << 5) | (a >>> 27)) + e + W[i]; + if (i < 20) { + t += ((b & c) | (~b & d)) + 0x5a827999; + } else if (i < 40) { + t += (b ^ c ^ d) + 0x6ed9eba1; + } else if (i < 60) { + t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; + } else /* if (i < 80) */ { + t += (b ^ c ^ d) - 0x359d3e2a; + } + + e = d; + d = c; + c = (b << 30) | (b >>> 2); + b = a; + a = t; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA1('message'); + * var hash = CryptoJS.SHA1(wordArray); + */ + C.SHA1 = Hasher._createHelper(SHA1); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA1(message, key); + */ + C.HmacSHA1 = Hasher._createHmacHelper(SHA1); + }()); + + + return CryptoJS.SHA1; + +})); +}, function(modId) { var map = {"./core":1751263816221}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816229, function(require, module, exports) { +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Initialization and round constants tables + var H = []; + var K = []; + + // Compute constants + (function () { + function isPrime(n) { + var sqrtN = Math.sqrt(n); + for (var factor = 2; factor <= sqrtN; factor++) { + if (!(n % factor)) { + return false; + } + } + + return true; + } + + function getFractionalBits(n) { + return ((n - (n | 0)) * 0x100000000) | 0; + } + + var n = 2; + var nPrime = 0; + while (nPrime < 64) { + if (isPrime(n)) { + if (nPrime < 8) { + H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); + } + K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); + + nPrime++; + } + + n++; + } + }()); + + // Reusable object + var W = []; + + /** + * SHA-256 hash algorithm. + */ + var SHA256 = C_algo.SHA256 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init(H.slice(0)); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + var f = H[5]; + var g = H[6]; + var h = H[7]; + + // Computation + for (var i = 0; i < 64; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var gamma0x = W[i - 15]; + var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ + ((gamma0x << 14) | (gamma0x >>> 18)) ^ + (gamma0x >>> 3); + + var gamma1x = W[i - 2]; + var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ + ((gamma1x << 13) | (gamma1x >>> 19)) ^ + (gamma1x >>> 10); + + W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; + } + + var ch = (e & f) ^ (~e & g); + var maj = (a & b) ^ (a & c) ^ (b & c); + + var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); + var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); + + var t1 = h + sigma1 + ch + K[i] + W[i]; + var t2 = sigma0 + maj; + + h = g; + g = f; + f = e; + e = (d + t1) | 0; + d = c; + c = b; + b = a; + a = (t1 + t2) | 0; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + H[5] = (H[5] + f) | 0; + H[6] = (H[6] + g) | 0; + H[7] = (H[7] + h) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA256('message'); + * var hash = CryptoJS.SHA256(wordArray); + */ + C.SHA256 = Hasher._createHelper(SHA256); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA256(message, key); + */ + C.HmacSHA256 = Hasher._createHmacHelper(SHA256); + }(Math)); + + + return CryptoJS.SHA256; + +})); +}, function(modId) { var map = {"./core":1751263816221}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816230, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./sha256")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./sha256"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA256 = C_algo.SHA256; + + /** + * SHA-224 hash algorithm. + */ + var SHA224 = C_algo.SHA224 = SHA256.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 + ]); + }, + + _doFinalize: function () { + var hash = SHA256._doFinalize.call(this); + + hash.sigBytes -= 4; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA224('message'); + * var hash = CryptoJS.SHA224(wordArray); + */ + C.SHA224 = SHA256._createHelper(SHA224); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA224(message, key); + */ + C.HmacSHA224 = SHA256._createHmacHelper(SHA224); + }()); + + + return CryptoJS.SHA224; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./sha256":1751263816229}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816231, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + + function X64Word_create() { + return X64Word.create.apply(X64Word, arguments); + } + + // Constants + var K = [ + X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd), + X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc), + X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019), + X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118), + X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe), + X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2), + X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1), + X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694), + X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3), + X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65), + X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483), + X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5), + X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210), + X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4), + X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725), + X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70), + X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926), + X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df), + X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8), + X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b), + X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001), + X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30), + X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910), + X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8), + X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53), + X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8), + X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb), + X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3), + X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60), + X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec), + X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9), + X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b), + X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207), + X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178), + X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6), + X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b), + X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493), + X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c), + X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a), + X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817) + ]; + + // Reusable objects + var W = []; + (function () { + for (var i = 0; i < 80; i++) { + W[i] = X64Word_create(); + } + }()); + + /** + * SHA-512 hash algorithm. + */ + var SHA512 = C_algo.SHA512 = Hasher.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b), + new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1), + new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f), + new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179) + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var H = this._hash.words; + + var H0 = H[0]; + var H1 = H[1]; + var H2 = H[2]; + var H3 = H[3]; + var H4 = H[4]; + var H5 = H[5]; + var H6 = H[6]; + var H7 = H[7]; + + var H0h = H0.high; + var H0l = H0.low; + var H1h = H1.high; + var H1l = H1.low; + var H2h = H2.high; + var H2l = H2.low; + var H3h = H3.high; + var H3l = H3.low; + var H4h = H4.high; + var H4l = H4.low; + var H5h = H5.high; + var H5l = H5.low; + var H6h = H6.high; + var H6l = H6.low; + var H7h = H7.high; + var H7l = H7.low; + + // Working variables + var ah = H0h; + var al = H0l; + var bh = H1h; + var bl = H1l; + var ch = H2h; + var cl = H2l; + var dh = H3h; + var dl = H3l; + var eh = H4h; + var el = H4l; + var fh = H5h; + var fl = H5l; + var gh = H6h; + var gl = H6l; + var hh = H7h; + var hl = H7l; + + // Rounds + for (var i = 0; i < 80; i++) { + var Wil; + var Wih; + + // Shortcut + var Wi = W[i]; + + // Extend message + if (i < 16) { + Wih = Wi.high = M[offset + i * 2] | 0; + Wil = Wi.low = M[offset + i * 2 + 1] | 0; + } else { + // Gamma0 + var gamma0x = W[i - 15]; + var gamma0xh = gamma0x.high; + var gamma0xl = gamma0x.low; + var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7); + var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); + + // Gamma1 + var gamma1x = W[i - 2]; + var gamma1xh = gamma1x.high; + var gamma1xl = gamma1x.low; + var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6); + var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); + + // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] + var Wi7 = W[i - 7]; + var Wi7h = Wi7.high; + var Wi7l = Wi7.low; + + var Wi16 = W[i - 16]; + var Wi16h = Wi16.high; + var Wi16l = Wi16.low; + + Wil = gamma0l + Wi7l; + Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); + Wil = Wil + gamma1l; + Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); + Wil = Wil + Wi16l; + Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); + + Wi.high = Wih; + Wi.low = Wil; + } + + var chh = (eh & fh) ^ (~eh & gh); + var chl = (el & fl) ^ (~el & gl); + var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); + var majl = (al & bl) ^ (al & cl) ^ (bl & cl); + + var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); + var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); + var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9)); + var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9)); + + // t1 = h + sigma1 + ch + K[i] + W[i] + var Ki = K[i]; + var Kih = Ki.high; + var Kil = Ki.low; + + var t1l = hl + sigma1l; + var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); + var t1l = t1l + chl; + var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); + var t1l = t1l + Kil; + var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); + var t1l = t1l + Wil; + var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); + + // t2 = sigma0 + maj + var t2l = sigma0l + majl; + var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); + + // Update working variables + hh = gh; + hl = gl; + gh = fh; + gl = fl; + fh = eh; + fl = el; + el = (dl + t1l) | 0; + eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; + dh = ch; + dl = cl; + ch = bh; + cl = bl; + bh = ah; + bl = al; + al = (t1l + t2l) | 0; + ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; + } + + // Intermediate hash value + H0l = H0.low = (H0l + al); + H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); + H1l = H1.low = (H1l + bl); + H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); + H2l = H2.low = (H2l + cl); + H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); + H3l = H3.low = (H3l + dl); + H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); + H4l = H4.low = (H4l + el); + H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); + H5l = H5.low = (H5l + fl); + H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); + H6l = H6.low = (H6l + gl); + H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); + H7l = H7.low = (H7l + hl); + H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)); + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Convert hash to 32-bit word array before returning + var hash = this._hash.toX32(); + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + }, + + blockSize: 1024/32 + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA512('message'); + * var hash = CryptoJS.SHA512(wordArray); + */ + C.SHA512 = Hasher._createHelper(SHA512); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA512(message, key); + */ + C.HmacSHA512 = Hasher._createHmacHelper(SHA512); + }()); + + + return CryptoJS.SHA512; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./x64-core":1751263816222}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816232, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core", "./sha512"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + var SHA512 = C_algo.SHA512; + + /** + * SHA-384 hash algorithm. + */ + var SHA384 = C_algo.SHA384 = SHA512.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507), + new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939), + new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511), + new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4) + ]); + }, + + _doFinalize: function () { + var hash = SHA512._doFinalize.call(this); + + hash.sigBytes -= 16; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA384('message'); + * var hash = CryptoJS.SHA384(wordArray); + */ + C.SHA384 = SHA512._createHelper(SHA384); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA384(message, key); + */ + C.HmacSHA384 = SHA512._createHmacHelper(SHA384); + }()); + + + return CryptoJS.SHA384; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./x64-core":1751263816222,"./sha512":1751263816231}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816233, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var C_algo = C.algo; + + // Constants tables + var RHO_OFFSETS = []; + var PI_INDEXES = []; + var ROUND_CONSTANTS = []; + + // Compute Constants + (function () { + // Compute rho offset constants + var x = 1, y = 0; + for (var t = 0; t < 24; t++) { + RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; + + var newX = y % 5; + var newY = (2 * x + 3 * y) % 5; + x = newX; + y = newY; + } + + // Compute pi index constants + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; + } + } + + // Compute round constants + var LFSR = 0x01; + for (var i = 0; i < 24; i++) { + var roundConstantMsw = 0; + var roundConstantLsw = 0; + + for (var j = 0; j < 7; j++) { + if (LFSR & 0x01) { + var bitPosition = (1 << j) - 1; + if (bitPosition < 32) { + roundConstantLsw ^= 1 << bitPosition; + } else /* if (bitPosition >= 32) */ { + roundConstantMsw ^= 1 << (bitPosition - 32); + } + } + + // Compute next LFSR + if (LFSR & 0x80) { + // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 + LFSR = (LFSR << 1) ^ 0x71; + } else { + LFSR <<= 1; + } + } + + ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); + } + }()); + + // Reusable objects for temporary values + var T = []; + (function () { + for (var i = 0; i < 25; i++) { + T[i] = X64Word.create(); + } + }()); + + /** + * SHA-3 hash algorithm. + */ + var SHA3 = C_algo.SHA3 = Hasher.extend({ + /** + * Configuration options. + * + * @property {number} outputLength + * The desired number of bits in the output hash. + * Only values permitted are: 224, 256, 384, 512. + * Default: 512 + */ + cfg: Hasher.cfg.extend({ + outputLength: 512 + }), + + _doReset: function () { + var state = this._state = [] + for (var i = 0; i < 25; i++) { + state[i] = new X64Word.init(); + } + + this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var state = this._state; + var nBlockSizeLanes = this.blockSize / 2; + + // Absorb + for (var i = 0; i < nBlockSizeLanes; i++) { + // Shortcuts + var M2i = M[offset + 2 * i]; + var M2i1 = M[offset + 2 * i + 1]; + + // Swap endian + M2i = ( + (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | + (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00) + ); + M2i1 = ( + (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | + (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00) + ); + + // Absorb message into state + var lane = state[i]; + lane.high ^= M2i1; + lane.low ^= M2i; + } + + // Rounds + for (var round = 0; round < 24; round++) { + // Theta + for (var x = 0; x < 5; x++) { + // Mix column lanes + var tMsw = 0, tLsw = 0; + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + tMsw ^= lane.high; + tLsw ^= lane.low; + } + + // Temporary values + var Tx = T[x]; + Tx.high = tMsw; + Tx.low = tLsw; + } + for (var x = 0; x < 5; x++) { + // Shortcuts + var Tx4 = T[(x + 4) % 5]; + var Tx1 = T[(x + 1) % 5]; + var Tx1Msw = Tx1.high; + var Tx1Lsw = Tx1.low; + + // Mix surrounding columns + var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); + var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + lane.high ^= tMsw; + lane.low ^= tLsw; + } + } + + // Rho Pi + for (var laneIndex = 1; laneIndex < 25; laneIndex++) { + var tMsw; + var tLsw; + + // Shortcuts + var lane = state[laneIndex]; + var laneMsw = lane.high; + var laneLsw = lane.low; + var rhoOffset = RHO_OFFSETS[laneIndex]; + + // Rotate lanes + if (rhoOffset < 32) { + tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); + tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); + } else /* if (rhoOffset >= 32) */ { + tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); + tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); + } + + // Transpose lanes + var TPiLane = T[PI_INDEXES[laneIndex]]; + TPiLane.high = tMsw; + TPiLane.low = tLsw; + } + + // Rho pi at x = y = 0 + var T0 = T[0]; + var state0 = state[0]; + T0.high = state0.high; + T0.low = state0.low; + + // Chi + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + // Shortcuts + var laneIndex = x + 5 * y; + var lane = state[laneIndex]; + var TLane = T[laneIndex]; + var Tx1Lane = T[((x + 1) % 5) + 5 * y]; + var Tx2Lane = T[((x + 2) % 5) + 5 * y]; + + // Mix rows + lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); + lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); + } + } + + // Iota + var lane = state[0]; + var roundConstant = ROUND_CONSTANTS[round]; + lane.high ^= roundConstant.high; + lane.low ^= roundConstant.low; + } + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + var blockSizeBits = this.blockSize * 32; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); + dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var state = this._state; + var outputLengthBytes = this.cfg.outputLength / 8; + var outputLengthLanes = outputLengthBytes / 8; + + // Squeeze + var hashWords = []; + for (var i = 0; i < outputLengthLanes; i++) { + // Shortcuts + var lane = state[i]; + var laneMsw = lane.high; + var laneLsw = lane.low; + + // Swap endian + laneMsw = ( + (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | + (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00) + ); + laneLsw = ( + (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | + (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00) + ); + + // Squeeze state to retrieve hash + hashWords.push(laneLsw); + hashWords.push(laneMsw); + } + + // Return final computed hash + return new WordArray.init(hashWords, outputLengthBytes); + }, + + clone: function () { + var clone = Hasher.clone.call(this); + + var state = clone._state = this._state.slice(0); + for (var i = 0; i < 25; i++) { + state[i] = state[i].clone(); + } + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA3('message'); + * var hash = CryptoJS.SHA3(wordArray); + */ + C.SHA3 = Hasher._createHelper(SHA3); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA3(message, key); + */ + C.HmacSHA3 = Hasher._createHmacHelper(SHA3); + }(Math)); + + + return CryptoJS.SHA3; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./x64-core":1751263816222}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816234, function(require, module, exports) { +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** @preserve + (c) 2012 by Cédric Mesnil. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var _zl = WordArray.create([ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]); + var _zr = WordArray.create([ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]); + var _sl = WordArray.create([ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]); + var _sr = WordArray.create([ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]); + + var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]); + var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]); + + /** + * RIPEMD160 hash algorithm. + */ + var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({ + _doReset: function () { + this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]); + }, + + _doProcessBlock: function (M, offset) { + + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + // Swap + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + // Shortcut + var H = this._hash.words; + var hl = _hl.words; + var hr = _hr.words; + var zl = _zl.words; + var zr = _zr.words; + var sl = _sl.words; + var sr = _sr.words; + + // Working variables + var al, bl, cl, dl, el; + var ar, br, cr, dr, er; + + ar = al = H[0]; + br = bl = H[1]; + cr = cl = H[2]; + dr = dl = H[3]; + er = el = H[4]; + // Computation + var t; + for (var i = 0; i < 80; i += 1) { + t = (al + M[offset+zl[i]])|0; + if (i<16){ + t += f1(bl,cl,dl) + hl[0]; + } else if (i<32) { + t += f2(bl,cl,dl) + hl[1]; + } else if (i<48) { + t += f3(bl,cl,dl) + hl[2]; + } else if (i<64) { + t += f4(bl,cl,dl) + hl[3]; + } else {// if (i<80) { + t += f5(bl,cl,dl) + hl[4]; + } + t = t|0; + t = rotl(t,sl[i]); + t = (t+el)|0; + al = el; + el = dl; + dl = rotl(cl, 10); + cl = bl; + bl = t; + + t = (ar + M[offset+zr[i]])|0; + if (i<16){ + t += f5(br,cr,dr) + hr[0]; + } else if (i<32) { + t += f4(br,cr,dr) + hr[1]; + } else if (i<48) { + t += f3(br,cr,dr) + hr[2]; + } else if (i<64) { + t += f2(br,cr,dr) + hr[3]; + } else {// if (i<80) { + t += f1(br,cr,dr) + hr[4]; + } + t = t|0; + t = rotl(t,sr[i]) ; + t = (t+er)|0; + ar = er; + er = dr; + dr = rotl(cr, 10); + cr = br; + br = t; + } + // Intermediate hash value + t = (H[1] + cl + dr)|0; + H[1] = (H[2] + dl + er)|0; + H[2] = (H[3] + el + ar)|0; + H[3] = (H[4] + al + br)|0; + H[4] = (H[0] + bl + cr)|0; + H[0] = t; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | + (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) + ); + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 5; i++) { + // Shortcut + var H_i = H[i]; + + // Swap + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + + function f1(x, y, z) { + return ((x) ^ (y) ^ (z)); + + } + + function f2(x, y, z) { + return (((x)&(y)) | ((~x)&(z))); + } + + function f3(x, y, z) { + return (((x) | (~(y))) ^ (z)); + } + + function f4(x, y, z) { + return (((x) & (z)) | ((y)&(~(z)))); + } + + function f5(x, y, z) { + return ((x) ^ ((y) |(~(z)))); + + } + + function rotl(x,n) { + return (x<>>(32-n)); + } + + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.RIPEMD160('message'); + * var hash = CryptoJS.RIPEMD160(wordArray); + */ + C.RIPEMD160 = Hasher._createHelper(RIPEMD160); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacRIPEMD160(message, key); + */ + C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160); + }(Math)); + + + return CryptoJS.RIPEMD160; + +})); +}, function(modId) { var map = {"./core":1751263816221}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816235, function(require, module, exports) { +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var C_algo = C.algo; + + /** + * HMAC algorithm. + */ + var HMAC = C_algo.HMAC = Base.extend({ + /** + * Initializes a newly created HMAC. + * + * @param {Hasher} hasher The hash algorithm to use. + * @param {WordArray|string} key The secret key. + * + * @example + * + * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); + */ + init: function (hasher, key) { + // Init hasher + hasher = this._hasher = new hasher.init(); + + // Convert string to WordArray, else assume WordArray already + if (typeof key == 'string') { + key = Utf8.parse(key); + } + + // Shortcuts + var hasherBlockSize = hasher.blockSize; + var hasherBlockSizeBytes = hasherBlockSize * 4; + + // Allow arbitrary length keys + if (key.sigBytes > hasherBlockSizeBytes) { + key = hasher.finalize(key); + } + + // Clamp excess bits + key.clamp(); + + // Clone key for inner and outer pads + var oKey = this._oKey = key.clone(); + var iKey = this._iKey = key.clone(); + + // Shortcuts + var oKeyWords = oKey.words; + var iKeyWords = iKey.words; + + // XOR keys with pad constants + for (var i = 0; i < hasherBlockSize; i++) { + oKeyWords[i] ^= 0x5c5c5c5c; + iKeyWords[i] ^= 0x36363636; + } + oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; + + // Set initial values + this.reset(); + }, + + /** + * Resets this HMAC to its initial state. + * + * @example + * + * hmacHasher.reset(); + */ + reset: function () { + // Shortcut + var hasher = this._hasher; + + // Reset + hasher.reset(); + hasher.update(this._iKey); + }, + + /** + * Updates this HMAC with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {HMAC} This HMAC instance. + * + * @example + * + * hmacHasher.update('message'); + * hmacHasher.update(wordArray); + */ + update: function (messageUpdate) { + this._hasher.update(messageUpdate); + + // Chainable + return this; + }, + + /** + * Finalizes the HMAC computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The HMAC. + * + * @example + * + * var hmac = hmacHasher.finalize(); + * var hmac = hmacHasher.finalize('message'); + * var hmac = hmacHasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Shortcut + var hasher = this._hasher; + + // Compute HMAC + var innerHash = hasher.finalize(messageUpdate); + hasher.reset(); + var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); + + return hmac; + } + }); + }()); + + +})); +}, function(modId) { var map = {"./core":1751263816221}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816236, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./sha256"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./sha256", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA256 = C_algo.SHA256; + var HMAC = C_algo.HMAC; + + /** + * Password-Based Key Derivation Function 2 algorithm. + */ + var PBKDF2 = C_algo.PBKDF2 = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hasher to use. Default: SHA256 + * @property {number} iterations The number of iterations to perform. Default: 250000 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: SHA256, + iterations: 250000 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.PBKDF2.create(); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + // Shortcut + var cfg = this.cfg; + + // Init HMAC + var hmac = HMAC.create(cfg.hasher, password); + + // Initial values + var derivedKey = WordArray.create(); + var blockIndex = WordArray.create([0x00000001]); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var blockIndexWords = blockIndex.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + var block = hmac.update(salt).finalize(blockIndex); + hmac.reset(); + + // Shortcuts + var blockWords = block.words; + var blockWordsLength = blockWords.length; + + // Iterations + var intermediate = block; + for (var i = 1; i < iterations; i++) { + intermediate = hmac.finalize(intermediate); + hmac.reset(); + + // Shortcut + var intermediateWords = intermediate.words; + + // XOR intermediate with block + for (var j = 0; j < blockWordsLength; j++) { + blockWords[j] ^= intermediateWords[j]; + } + } + + derivedKey.concat(block); + blockIndexWords[0]++; + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.PBKDF2(password, salt); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 }); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.PBKDF2 = function (password, salt, cfg) { + return PBKDF2.create(cfg).compute(password, salt); + }; + }()); + + + return CryptoJS.PBKDF2; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./sha256":1751263816229,"./hmac":1751263816235}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816237, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./sha1", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var MD5 = C_algo.MD5; + + /** + * This key derivation function is meant to conform with EVP_BytesToKey. + * www.openssl.org/docs/crypto/EVP_BytesToKey.html + */ + var EvpKDF = C_algo.EvpKDF = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hash algorithm to use. Default: MD5 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: MD5, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.EvpKDF.create(); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + var block; + + // Shortcut + var cfg = this.cfg; + + // Init hasher + var hasher = cfg.hasher.create(); + + // Initial values + var derivedKey = WordArray.create(); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + if (block) { + hasher.update(block); + } + block = hasher.update(password).finalize(salt); + hasher.reset(); + + // Iterations + for (var i = 1; i < iterations; i++) { + block = hasher.finalize(block); + hasher.reset(); + } + + derivedKey.concat(block); + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.EvpKDF(password, salt); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 }); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.EvpKDF = function (password, salt, cfg) { + return EvpKDF.create(cfg).compute(password, salt); + }; + }()); + + + return CryptoJS.EvpKDF; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./sha1":1751263816228,"./hmac":1751263816235}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816238, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./evpkdf")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./evpkdf"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Cipher core components. + */ + CryptoJS.lib.Cipher || (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var Base64 = C_enc.Base64; + var C_algo = C.algo; + var EvpKDF = C_algo.EvpKDF; + + /** + * Abstract base cipher template. + * + * @property {number} keySize This cipher's key size. Default: 4 (128 bits) + * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits) + * @property {number} _ENC_XFORM_MODE A constant representing encryption mode. + * @property {number} _DEC_XFORM_MODE A constant representing decryption mode. + */ + var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + * + * @property {WordArray} iv The IV to use for this operation. + */ + cfg: Base.extend(), + + /** + * Creates this cipher in encryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray }); + */ + createEncryptor: function (key, cfg) { + return this.create(this._ENC_XFORM_MODE, key, cfg); + }, + + /** + * Creates this cipher in decryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray }); + */ + createDecryptor: function (key, cfg) { + return this.create(this._DEC_XFORM_MODE, key, cfg); + }, + + /** + * Initializes a newly created cipher. + * + * @param {number} xformMode Either the encryption or decryption transormation mode constant. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @example + * + * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }); + */ + init: function (xformMode, key, cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Store transform mode and key + this._xformMode = xformMode; + this._key = key; + + // Set initial values + this.reset(); + }, + + /** + * Resets this cipher to its initial state. + * + * @example + * + * cipher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-cipher logic + this._doReset(); + }, + + /** + * Adds data to be encrypted or decrypted. + * + * @param {WordArray|string} dataUpdate The data to encrypt or decrypt. + * + * @return {WordArray} The data after processing. + * + * @example + * + * var encrypted = cipher.process('data'); + * var encrypted = cipher.process(wordArray); + */ + process: function (dataUpdate) { + // Append + this._append(dataUpdate); + + // Process available blocks + return this._process(); + }, + + /** + * Finalizes the encryption or decryption process. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt. + * + * @return {WordArray} The data after final processing. + * + * @example + * + * var encrypted = cipher.finalize(); + * var encrypted = cipher.finalize('data'); + * var encrypted = cipher.finalize(wordArray); + */ + finalize: function (dataUpdate) { + // Final data update + if (dataUpdate) { + this._append(dataUpdate); + } + + // Perform concrete-cipher logic + var finalProcessedData = this._doFinalize(); + + return finalProcessedData; + }, + + keySize: 128/32, + + ivSize: 128/32, + + _ENC_XFORM_MODE: 1, + + _DEC_XFORM_MODE: 2, + + /** + * Creates shortcut functions to a cipher's object interface. + * + * @param {Cipher} cipher The cipher to create a helper for. + * + * @return {Object} An object with encrypt and decrypt shortcut functions. + * + * @static + * + * @example + * + * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES); + */ + _createHelper: (function () { + function selectCipherStrategy(key) { + if (typeof key == 'string') { + return PasswordBasedCipher; + } else { + return SerializableCipher; + } + } + + return function (cipher) { + return { + encrypt: function (message, key, cfg) { + return selectCipherStrategy(key).encrypt(cipher, message, key, cfg); + }, + + decrypt: function (ciphertext, key, cfg) { + return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg); + } + }; + }; + }()) + }); + + /** + * Abstract base stream cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits) + */ + var StreamCipher = C_lib.StreamCipher = Cipher.extend({ + _doFinalize: function () { + // Process partial blocks + var finalProcessedBlocks = this._process(!!'flush'); + + return finalProcessedBlocks; + }, + + blockSize: 1 + }); + + /** + * Mode namespace. + */ + var C_mode = C.mode = {}; + + /** + * Abstract base block cipher mode template. + */ + var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ + /** + * Creates this mode for encryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words); + */ + createEncryptor: function (cipher, iv) { + return this.Encryptor.create(cipher, iv); + }, + + /** + * Creates this mode for decryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words); + */ + createDecryptor: function (cipher, iv) { + return this.Decryptor.create(cipher, iv); + }, + + /** + * Initializes a newly created mode. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @example + * + * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words); + */ + init: function (cipher, iv) { + this._cipher = cipher; + this._iv = iv; + } + }); + + /** + * Cipher Block Chaining mode. + */ + var CBC = C_mode.CBC = (function () { + /** + * Abstract base CBC mode. + */ + var CBC = BlockCipherMode.extend(); + + /** + * CBC encryptor. + */ + CBC.Encryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // XOR and encrypt + xorBlock.call(this, words, offset, blockSize); + cipher.encryptBlock(words, offset); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + /** + * CBC decryptor. + */ + CBC.Decryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + // Decrypt and XOR + cipher.decryptBlock(words, offset); + xorBlock.call(this, words, offset, blockSize); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function xorBlock(words, offset, blockSize) { + var block; + + // Shortcut + var iv = this._iv; + + // Choose mixing block + if (iv) { + block = iv; + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + block = this._prevBlock; + } + + // XOR blocks + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= block[i]; + } + } + + return CBC; + }()); + + /** + * Padding namespace. + */ + var C_pad = C.pad = {}; + + /** + * PKCS #5/7 padding strategy. + */ + var Pkcs7 = C_pad.Pkcs7 = { + /** + * Pads data using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to pad. + * @param {number} blockSize The multiple that the data should be padded to. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.pad(wordArray, 4); + */ + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Create padding word + var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; + + // Create padding + var paddingWords = []; + for (var i = 0; i < nPaddingBytes; i += 4) { + paddingWords.push(paddingWord); + } + var padding = WordArray.create(paddingWords, nPaddingBytes); + + // Add padding + data.concat(padding); + }, + + /** + * Unpads data that had been padded using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to unpad. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.unpad(wordArray); + */ + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + /** + * Abstract base block cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits) + */ + var BlockCipher = C_lib.BlockCipher = Cipher.extend({ + /** + * Configuration options. + * + * @property {Mode} mode The block mode to use. Default: CBC + * @property {Padding} padding The padding strategy to use. Default: Pkcs7 + */ + cfg: Cipher.cfg.extend({ + mode: CBC, + padding: Pkcs7 + }), + + reset: function () { + var modeCreator; + + // Reset cipher + Cipher.reset.call(this); + + // Shortcuts + var cfg = this.cfg; + var iv = cfg.iv; + var mode = cfg.mode; + + // Reset block mode + if (this._xformMode == this._ENC_XFORM_MODE) { + modeCreator = mode.createEncryptor; + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + modeCreator = mode.createDecryptor; + // Keep at least one block in the buffer for unpadding + this._minBufferSize = 1; + } + + if (this._mode && this._mode.__creator == modeCreator) { + this._mode.init(this, iv && iv.words); + } else { + this._mode = modeCreator.call(mode, this, iv && iv.words); + this._mode.__creator = modeCreator; + } + }, + + _doProcessBlock: function (words, offset) { + this._mode.processBlock(words, offset); + }, + + _doFinalize: function () { + var finalProcessedBlocks; + + // Shortcut + var padding = this.cfg.padding; + + // Finalize + if (this._xformMode == this._ENC_XFORM_MODE) { + // Pad data + padding.pad(this._data, this.blockSize); + + // Process final blocks + finalProcessedBlocks = this._process(!!'flush'); + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + // Process final blocks + finalProcessedBlocks = this._process(!!'flush'); + + // Unpad data + padding.unpad(finalProcessedBlocks); + } + + return finalProcessedBlocks; + }, + + blockSize: 128/32 + }); + + /** + * A collection of cipher parameters. + * + * @property {WordArray} ciphertext The raw ciphertext. + * @property {WordArray} key The key to this ciphertext. + * @property {WordArray} iv The IV used in the ciphering operation. + * @property {WordArray} salt The salt used with a key derivation function. + * @property {Cipher} algorithm The cipher algorithm. + * @property {Mode} mode The block mode used in the ciphering operation. + * @property {Padding} padding The padding scheme used in the ciphering operation. + * @property {number} blockSize The block size of the cipher. + * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string. + */ + var CipherParams = C_lib.CipherParams = Base.extend({ + /** + * Initializes a newly created cipher params object. + * + * @param {Object} cipherParams An object with any of the possible cipher parameters. + * + * @example + * + * var cipherParams = CryptoJS.lib.CipherParams.create({ + * ciphertext: ciphertextWordArray, + * key: keyWordArray, + * iv: ivWordArray, + * salt: saltWordArray, + * algorithm: CryptoJS.algo.AES, + * mode: CryptoJS.mode.CBC, + * padding: CryptoJS.pad.PKCS7, + * blockSize: 4, + * formatter: CryptoJS.format.OpenSSL + * }); + */ + init: function (cipherParams) { + this.mixIn(cipherParams); + }, + + /** + * Converts this cipher params object to a string. + * + * @param {Format} formatter (Optional) The formatting strategy to use. + * + * @return {string} The stringified cipher params. + * + * @throws Error If neither the formatter nor the default formatter is set. + * + * @example + * + * var string = cipherParams + ''; + * var string = cipherParams.toString(); + * var string = cipherParams.toString(CryptoJS.format.OpenSSL); + */ + toString: function (formatter) { + return (formatter || this.formatter).stringify(this); + } + }); + + /** + * Format namespace. + */ + var C_format = C.format = {}; + + /** + * OpenSSL formatting strategy. + */ + var OpenSSLFormatter = C_format.OpenSSL = { + /** + * Converts a cipher params object to an OpenSSL-compatible string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The OpenSSL-compatible string. + * + * @static + * + * @example + * + * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams); + */ + stringify: function (cipherParams) { + var wordArray; + + // Shortcuts + var ciphertext = cipherParams.ciphertext; + var salt = cipherParams.salt; + + // Format + if (salt) { + wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); + } else { + wordArray = ciphertext; + } + + return wordArray.toString(Base64); + }, + + /** + * Converts an OpenSSL-compatible string to a cipher params object. + * + * @param {string} openSSLStr The OpenSSL-compatible string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString); + */ + parse: function (openSSLStr) { + var salt; + + // Parse base64 + var ciphertext = Base64.parse(openSSLStr); + + // Shortcut + var ciphertextWords = ciphertext.words; + + // Test for salt + if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) { + // Extract salt + salt = WordArray.create(ciphertextWords.slice(2, 4)); + + // Remove salt from ciphertext + ciphertextWords.splice(0, 4); + ciphertext.sigBytes -= 16; + } + + return CipherParams.create({ ciphertext: ciphertext, salt: salt }); + } + }; + + /** + * A cipher wrapper that returns ciphertext as a serializable cipher params object. + */ + var SerializableCipher = C_lib.SerializableCipher = Base.extend({ + /** + * Configuration options. + * + * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL + */ + cfg: Base.extend({ + format: OpenSSLFormatter + }), + + /** + * Encrypts a message. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv }); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Encrypt + var encryptor = cipher.createEncryptor(key, cfg); + var ciphertext = encryptor.finalize(message); + + // Shortcut + var cipherCfg = encryptor.cfg; + + // Create and return serializable cipher params + return CipherParams.create({ + ciphertext: ciphertext, + key: key, + iv: cipherCfg.iv, + algorithm: cipher, + mode: cipherCfg.mode, + padding: cipherCfg.padding, + blockSize: cipher.blockSize, + formatter: cfg.format + }); + }, + + /** + * Decrypts serialized ciphertext. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Decrypt + var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); + + return plaintext; + }, + + /** + * Converts serialized ciphertext to CipherParams, + * else assumed CipherParams already and returns ciphertext unchanged. + * + * @param {CipherParams|string} ciphertext The ciphertext. + * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext. + * + * @return {CipherParams} The unserialized ciphertext. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format); + */ + _parse: function (ciphertext, format) { + if (typeof ciphertext == 'string') { + return format.parse(ciphertext, this); + } else { + return ciphertext; + } + } + }); + + /** + * Key derivation function namespace. + */ + var C_kdf = C.kdf = {}; + + /** + * OpenSSL key derivation function. + */ + var OpenSSLKdf = C_kdf.OpenSSL = { + /** + * Derives a key and IV from a password. + * + * @param {string} password The password to derive from. + * @param {number} keySize The size in words of the key to generate. + * @param {number} ivSize The size in words of the IV to generate. + * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly. + * + * @return {CipherParams} A cipher params object with the key, IV, and salt. + * + * @static + * + * @example + * + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32); + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt'); + */ + execute: function (password, keySize, ivSize, salt, hasher) { + // Generate random salt + if (!salt) { + salt = WordArray.random(64/8); + } + + // Derive key and IV + if (!hasher) { + var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); + } else { + var key = EvpKDF.create({ keySize: keySize + ivSize, hasher: hasher }).compute(password, salt); + } + + + // Separate key and IV + var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); + key.sigBytes = keySize * 4; + + // Return params + return CipherParams.create({ key: key, iv: iv, salt: salt }); + } + }; + + /** + * A serializable cipher wrapper that derives the key from a password, + * and returns ciphertext as a serializable cipher params object. + */ + var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ + /** + * Configuration options. + * + * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL + */ + cfg: SerializableCipher.cfg.extend({ + kdf: OpenSSLKdf + }), + + /** + * Encrypts a message using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password'); + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, cfg.salt, cfg.hasher); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Encrypt + var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); + + // Mix in derived params + ciphertext.mixIn(derivedParams); + + return ciphertext; + }, + + /** + * Decrypts serialized ciphertext using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt, cfg.hasher); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Decrypt + var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); + + return plaintext; + } + }); + }()); + + +})); +}, function(modId) { var map = {"./core":1751263816221,"./evpkdf":1751263816237}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816239, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Cipher Feedback block mode. + */ + CryptoJS.mode.CFB = (function () { + var CFB = CryptoJS.lib.BlockCipherMode.extend(); + + CFB.Encryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + CFB.Decryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { + var keystream; + + // Shortcut + var iv = this._iv; + + // Generate keystream + if (iv) { + keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + keystream = this._prevBlock; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + + return CFB; + }()); + + + return CryptoJS.mode.CFB; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816240, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Counter block mode. + */ + CryptoJS.mode.CTR = (function () { + var CTR = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = CTR.Encryptor = CTR.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Increment counter + counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0 + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTR.Decryptor = Encryptor; + + return CTR; + }()); + + + return CryptoJS.mode.CTR; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816241, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** @preserve + * Counter block mode compatible with Dr Brian Gladman fileenc.c + * derived from CryptoJS.mode.CTR + * Jan Hruby jhruby.web@gmail.com + */ + CryptoJS.mode.CTRGladman = (function () { + var CTRGladman = CryptoJS.lib.BlockCipherMode.extend(); + + function incWord(word) + { + if (((word >> 24) & 0xff) === 0xff) { //overflow + var b1 = (word >> 16)&0xff; + var b2 = (word >> 8)&0xff; + var b3 = word & 0xff; + + if (b1 === 0xff) // overflow b1 + { + b1 = 0; + if (b2 === 0xff) + { + b2 = 0; + if (b3 === 0xff) + { + b3 = 0; + } + else + { + ++b3; + } + } + else + { + ++b2; + } + } + else + { + ++b1; + } + + word = 0; + word += (b1 << 16); + word += (b2 << 8); + word += b3; + } + else + { + word += (0x01 << 24); + } + return word; + } + + function incCounter(counter) + { + if ((counter[0] = incWord(counter[0])) === 0) + { + // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8 + counter[1] = incWord(counter[1]); + } + return counter; + } + + var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + + incCounter(counter); + + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTRGladman.Decryptor = Encryptor; + + return CTRGladman; + }()); + + + + + return CryptoJS.mode.CTRGladman; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816242, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Output Feedback block mode. + */ + CryptoJS.mode.OFB = (function () { + var OFB = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = OFB.Encryptor = OFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var keystream = this._keystream; + + // Generate keystream + if (iv) { + keystream = this._keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + OFB.Decryptor = Encryptor; + + return OFB; + }()); + + + return CryptoJS.mode.OFB; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816243, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Electronic Codebook block mode. + */ + CryptoJS.mode.ECB = (function () { + var ECB = CryptoJS.lib.BlockCipherMode.extend(); + + ECB.Encryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.encryptBlock(words, offset); + } + }); + + ECB.Decryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.decryptBlock(words, offset); + } + }); + + return ECB; + }()); + + + return CryptoJS.mode.ECB; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816244, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * ANSI X.923 padding strategy. + */ + CryptoJS.pad.AnsiX923 = { + pad: function (data, blockSize) { + // Shortcuts + var dataSigBytes = data.sigBytes; + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes; + + // Compute last byte position + var lastBytePos = dataSigBytes + nPaddingBytes - 1; + + // Pad + data.clamp(); + data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8); + data.sigBytes += nPaddingBytes; + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + return CryptoJS.pad.Ansix923; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816245, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * ISO 10126 padding strategy. + */ + CryptoJS.pad.Iso10126 = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Pad + data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)). + concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1)); + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + return CryptoJS.pad.Iso10126; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816246, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * ISO/IEC 9797-1 Padding Method 2. + */ + CryptoJS.pad.Iso97971 = { + pad: function (data, blockSize) { + // Add 0x80 byte + data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1)); + + // Zero pad the rest + CryptoJS.pad.ZeroPadding.pad(data, blockSize); + }, + + unpad: function (data) { + // Remove zero padding + CryptoJS.pad.ZeroPadding.unpad(data); + + // Remove one more byte -- the 0x80 byte + data.sigBytes--; + } + }; + + + return CryptoJS.pad.Iso97971; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816247, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Zero padding strategy. + */ + CryptoJS.pad.ZeroPadding = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Pad + data.clamp(); + data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes); + }, + + unpad: function (data) { + // Shortcut + var dataWords = data.words; + + // Unpad + var i = data.sigBytes - 1; + for (var i = data.sigBytes - 1; i >= 0; i--) { + if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) { + data.sigBytes = i + 1; + break; + } + } + } + }; + + + return CryptoJS.pad.ZeroPadding; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816248, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * A noop padding strategy. + */ + CryptoJS.pad.NoPadding = { + pad: function () { + }, + + unpad: function () { + } + }; + + + return CryptoJS.pad.NoPadding; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816249, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var CipherParams = C_lib.CipherParams; + var C_enc = C.enc; + var Hex = C_enc.Hex; + var C_format = C.format; + + var HexFormatter = C_format.Hex = { + /** + * Converts the ciphertext of a cipher params object to a hexadecimally encoded string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The hexadecimally encoded string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.format.Hex.stringify(cipherParams); + */ + stringify: function (cipherParams) { + return cipherParams.ciphertext.toString(Hex); + }, + + /** + * Converts a hexadecimally encoded ciphertext string to a cipher params object. + * + * @param {string} input The hexadecimally encoded string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.Hex.parse(hexString); + */ + parse: function (input) { + var ciphertext = Hex.parse(input); + return CipherParams.create({ ciphertext: ciphertext }); + } + }; + }()); + + + return CryptoJS.format.Hex; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816250, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Lookup tables + var SBOX = []; + var INV_SBOX = []; + var SUB_MIX_0 = []; + var SUB_MIX_1 = []; + var SUB_MIX_2 = []; + var SUB_MIX_3 = []; + var INV_SUB_MIX_0 = []; + var INV_SUB_MIX_1 = []; + var INV_SUB_MIX_2 = []; + var INV_SUB_MIX_3 = []; + + // Compute lookup tables + (function () { + // Compute double table + var d = []; + for (var i = 0; i < 256; i++) { + if (i < 128) { + d[i] = i << 1; + } else { + d[i] = (i << 1) ^ 0x11b; + } + } + + // Walk GF(2^8) + var x = 0; + var xi = 0; + for (var i = 0; i < 256; i++) { + // Compute sbox + var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); + sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; + SBOX[x] = sx; + INV_SBOX[sx] = x; + + // Compute multiplication + var x2 = d[x]; + var x4 = d[x2]; + var x8 = d[x4]; + + // Compute sub bytes, mix columns tables + var t = (d[sx] * 0x101) ^ (sx * 0x1010100); + SUB_MIX_0[x] = (t << 24) | (t >>> 8); + SUB_MIX_1[x] = (t << 16) | (t >>> 16); + SUB_MIX_2[x] = (t << 8) | (t >>> 24); + SUB_MIX_3[x] = t; + + // Compute inv sub bytes, inv mix columns tables + var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); + INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); + INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); + INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); + INV_SUB_MIX_3[sx] = t; + + // Compute next counter + if (!x) { + x = xi = 1; + } else { + x = x2 ^ d[d[d[x8 ^ x2]]]; + xi ^= d[d[xi]]; + } + } + }()); + + // Precomputed Rcon lookup + var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; + + /** + * AES block cipher algorithm. + */ + var AES = C_algo.AES = BlockCipher.extend({ + _doReset: function () { + var t; + + // Skip reset of nRounds has been set before and key did not change + if (this._nRounds && this._keyPriorReset === this._key) { + return; + } + + // Shortcuts + var key = this._keyPriorReset = this._key; + var keyWords = key.words; + var keySize = key.sigBytes / 4; + + // Compute number of rounds + var nRounds = this._nRounds = keySize + 6; + + // Compute number of key schedule rows + var ksRows = (nRounds + 1) * 4; + + // Compute key schedule + var keySchedule = this._keySchedule = []; + for (var ksRow = 0; ksRow < ksRows; ksRow++) { + if (ksRow < keySize) { + keySchedule[ksRow] = keyWords[ksRow]; + } else { + t = keySchedule[ksRow - 1]; + + if (!(ksRow % keySize)) { + // Rot word + t = (t << 8) | (t >>> 24); + + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + + // Mix Rcon + t ^= RCON[(ksRow / keySize) | 0] << 24; + } else if (keySize > 6 && ksRow % keySize == 4) { + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + } + + keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; + } + } + + // Compute inv key schedule + var invKeySchedule = this._invKeySchedule = []; + for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { + var ksRow = ksRows - invKsRow; + + if (invKsRow % 4) { + var t = keySchedule[ksRow]; + } else { + var t = keySchedule[ksRow - 4]; + } + + if (invKsRow < 4 || ksRow <= 4) { + invKeySchedule[invKsRow] = t; + } else { + invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ + INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]]; + } + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX); + }, + + decryptBlock: function (M, offset) { + // Swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + + this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); + + // Inv swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + }, + + _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { + // Shortcut + var nRounds = this._nRounds; + + // Get input, add round key + var s0 = M[offset] ^ keySchedule[0]; + var s1 = M[offset + 1] ^ keySchedule[1]; + var s2 = M[offset + 2] ^ keySchedule[2]; + var s3 = M[offset + 3] ^ keySchedule[3]; + + // Key schedule row counter + var ksRow = 4; + + // Rounds + for (var round = 1; round < nRounds; round++) { + // Shift rows, sub bytes, mix columns, add round key + var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++]; + var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++]; + var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++]; + var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++]; + + // Update state + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + } + + // Shift rows, sub bytes, add round key + var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]; + var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]; + var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]; + var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]; + + // Set output + M[offset] = t0; + M[offset + 1] = t1; + M[offset + 2] = t2; + M[offset + 3] = t3; + }, + + keySize: 256/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); + */ + C.AES = BlockCipher._createHelper(AES); + }()); + + + return CryptoJS.AES; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./enc-base64":1751263816225,"./md5":1751263816227,"./evpkdf":1751263816237,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816251, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Permuted Choice 1 constants + var PC1 = [ + 57, 49, 41, 33, 25, 17, 9, 1, + 58, 50, 42, 34, 26, 18, 10, 2, + 59, 51, 43, 35, 27, 19, 11, 3, + 60, 52, 44, 36, 63, 55, 47, 39, + 31, 23, 15, 7, 62, 54, 46, 38, + 30, 22, 14, 6, 61, 53, 45, 37, + 29, 21, 13, 5, 28, 20, 12, 4 + ]; + + // Permuted Choice 2 constants + var PC2 = [ + 14, 17, 11, 24, 1, 5, + 3, 28, 15, 6, 21, 10, + 23, 19, 12, 4, 26, 8, + 16, 7, 27, 20, 13, 2, + 41, 52, 31, 37, 47, 55, + 30, 40, 51, 45, 33, 48, + 44, 49, 39, 56, 34, 53, + 46, 42, 50, 36, 29, 32 + ]; + + // Cumulative bit shift constants + var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; + + // SBOXes and round permutation constants + var SBOX_P = [ + { + 0x0: 0x808200, + 0x10000000: 0x8000, + 0x20000000: 0x808002, + 0x30000000: 0x2, + 0x40000000: 0x200, + 0x50000000: 0x808202, + 0x60000000: 0x800202, + 0x70000000: 0x800000, + 0x80000000: 0x202, + 0x90000000: 0x800200, + 0xa0000000: 0x8200, + 0xb0000000: 0x808000, + 0xc0000000: 0x8002, + 0xd0000000: 0x800002, + 0xe0000000: 0x0, + 0xf0000000: 0x8202, + 0x8000000: 0x0, + 0x18000000: 0x808202, + 0x28000000: 0x8202, + 0x38000000: 0x8000, + 0x48000000: 0x808200, + 0x58000000: 0x200, + 0x68000000: 0x808002, + 0x78000000: 0x2, + 0x88000000: 0x800200, + 0x98000000: 0x8200, + 0xa8000000: 0x808000, + 0xb8000000: 0x800202, + 0xc8000000: 0x800002, + 0xd8000000: 0x8002, + 0xe8000000: 0x202, + 0xf8000000: 0x800000, + 0x1: 0x8000, + 0x10000001: 0x2, + 0x20000001: 0x808200, + 0x30000001: 0x800000, + 0x40000001: 0x808002, + 0x50000001: 0x8200, + 0x60000001: 0x200, + 0x70000001: 0x800202, + 0x80000001: 0x808202, + 0x90000001: 0x808000, + 0xa0000001: 0x800002, + 0xb0000001: 0x8202, + 0xc0000001: 0x202, + 0xd0000001: 0x800200, + 0xe0000001: 0x8002, + 0xf0000001: 0x0, + 0x8000001: 0x808202, + 0x18000001: 0x808000, + 0x28000001: 0x800000, + 0x38000001: 0x200, + 0x48000001: 0x8000, + 0x58000001: 0x800002, + 0x68000001: 0x2, + 0x78000001: 0x8202, + 0x88000001: 0x8002, + 0x98000001: 0x800202, + 0xa8000001: 0x202, + 0xb8000001: 0x808200, + 0xc8000001: 0x800200, + 0xd8000001: 0x0, + 0xe8000001: 0x8200, + 0xf8000001: 0x808002 + }, + { + 0x0: 0x40084010, + 0x1000000: 0x4000, + 0x2000000: 0x80000, + 0x3000000: 0x40080010, + 0x4000000: 0x40000010, + 0x5000000: 0x40084000, + 0x6000000: 0x40004000, + 0x7000000: 0x10, + 0x8000000: 0x84000, + 0x9000000: 0x40004010, + 0xa000000: 0x40000000, + 0xb000000: 0x84010, + 0xc000000: 0x80010, + 0xd000000: 0x0, + 0xe000000: 0x4010, + 0xf000000: 0x40080000, + 0x800000: 0x40004000, + 0x1800000: 0x84010, + 0x2800000: 0x10, + 0x3800000: 0x40004010, + 0x4800000: 0x40084010, + 0x5800000: 0x40000000, + 0x6800000: 0x80000, + 0x7800000: 0x40080010, + 0x8800000: 0x80010, + 0x9800000: 0x0, + 0xa800000: 0x4000, + 0xb800000: 0x40080000, + 0xc800000: 0x40000010, + 0xd800000: 0x84000, + 0xe800000: 0x40084000, + 0xf800000: 0x4010, + 0x10000000: 0x0, + 0x11000000: 0x40080010, + 0x12000000: 0x40004010, + 0x13000000: 0x40084000, + 0x14000000: 0x40080000, + 0x15000000: 0x10, + 0x16000000: 0x84010, + 0x17000000: 0x4000, + 0x18000000: 0x4010, + 0x19000000: 0x80000, + 0x1a000000: 0x80010, + 0x1b000000: 0x40000010, + 0x1c000000: 0x84000, + 0x1d000000: 0x40004000, + 0x1e000000: 0x40000000, + 0x1f000000: 0x40084010, + 0x10800000: 0x84010, + 0x11800000: 0x80000, + 0x12800000: 0x40080000, + 0x13800000: 0x4000, + 0x14800000: 0x40004000, + 0x15800000: 0x40084010, + 0x16800000: 0x10, + 0x17800000: 0x40000000, + 0x18800000: 0x40084000, + 0x19800000: 0x40000010, + 0x1a800000: 0x40004010, + 0x1b800000: 0x80010, + 0x1c800000: 0x0, + 0x1d800000: 0x4010, + 0x1e800000: 0x40080010, + 0x1f800000: 0x84000 + }, + { + 0x0: 0x104, + 0x100000: 0x0, + 0x200000: 0x4000100, + 0x300000: 0x10104, + 0x400000: 0x10004, + 0x500000: 0x4000004, + 0x600000: 0x4010104, + 0x700000: 0x4010000, + 0x800000: 0x4000000, + 0x900000: 0x4010100, + 0xa00000: 0x10100, + 0xb00000: 0x4010004, + 0xc00000: 0x4000104, + 0xd00000: 0x10000, + 0xe00000: 0x4, + 0xf00000: 0x100, + 0x80000: 0x4010100, + 0x180000: 0x4010004, + 0x280000: 0x0, + 0x380000: 0x4000100, + 0x480000: 0x4000004, + 0x580000: 0x10000, + 0x680000: 0x10004, + 0x780000: 0x104, + 0x880000: 0x4, + 0x980000: 0x100, + 0xa80000: 0x4010000, + 0xb80000: 0x10104, + 0xc80000: 0x10100, + 0xd80000: 0x4000104, + 0xe80000: 0x4010104, + 0xf80000: 0x4000000, + 0x1000000: 0x4010100, + 0x1100000: 0x10004, + 0x1200000: 0x10000, + 0x1300000: 0x4000100, + 0x1400000: 0x100, + 0x1500000: 0x4010104, + 0x1600000: 0x4000004, + 0x1700000: 0x0, + 0x1800000: 0x4000104, + 0x1900000: 0x4000000, + 0x1a00000: 0x4, + 0x1b00000: 0x10100, + 0x1c00000: 0x4010000, + 0x1d00000: 0x104, + 0x1e00000: 0x10104, + 0x1f00000: 0x4010004, + 0x1080000: 0x4000000, + 0x1180000: 0x104, + 0x1280000: 0x4010100, + 0x1380000: 0x0, + 0x1480000: 0x10004, + 0x1580000: 0x4000100, + 0x1680000: 0x100, + 0x1780000: 0x4010004, + 0x1880000: 0x10000, + 0x1980000: 0x4010104, + 0x1a80000: 0x10104, + 0x1b80000: 0x4000004, + 0x1c80000: 0x4000104, + 0x1d80000: 0x4010000, + 0x1e80000: 0x4, + 0x1f80000: 0x10100 + }, + { + 0x0: 0x80401000, + 0x10000: 0x80001040, + 0x20000: 0x401040, + 0x30000: 0x80400000, + 0x40000: 0x0, + 0x50000: 0x401000, + 0x60000: 0x80000040, + 0x70000: 0x400040, + 0x80000: 0x80000000, + 0x90000: 0x400000, + 0xa0000: 0x40, + 0xb0000: 0x80001000, + 0xc0000: 0x80400040, + 0xd0000: 0x1040, + 0xe0000: 0x1000, + 0xf0000: 0x80401040, + 0x8000: 0x80001040, + 0x18000: 0x40, + 0x28000: 0x80400040, + 0x38000: 0x80001000, + 0x48000: 0x401000, + 0x58000: 0x80401040, + 0x68000: 0x0, + 0x78000: 0x80400000, + 0x88000: 0x1000, + 0x98000: 0x80401000, + 0xa8000: 0x400000, + 0xb8000: 0x1040, + 0xc8000: 0x80000000, + 0xd8000: 0x400040, + 0xe8000: 0x401040, + 0xf8000: 0x80000040, + 0x100000: 0x400040, + 0x110000: 0x401000, + 0x120000: 0x80000040, + 0x130000: 0x0, + 0x140000: 0x1040, + 0x150000: 0x80400040, + 0x160000: 0x80401000, + 0x170000: 0x80001040, + 0x180000: 0x80401040, + 0x190000: 0x80000000, + 0x1a0000: 0x80400000, + 0x1b0000: 0x401040, + 0x1c0000: 0x80001000, + 0x1d0000: 0x400000, + 0x1e0000: 0x40, + 0x1f0000: 0x1000, + 0x108000: 0x80400000, + 0x118000: 0x80401040, + 0x128000: 0x0, + 0x138000: 0x401000, + 0x148000: 0x400040, + 0x158000: 0x80000000, + 0x168000: 0x80001040, + 0x178000: 0x40, + 0x188000: 0x80000040, + 0x198000: 0x1000, + 0x1a8000: 0x80001000, + 0x1b8000: 0x80400040, + 0x1c8000: 0x1040, + 0x1d8000: 0x80401000, + 0x1e8000: 0x400000, + 0x1f8000: 0x401040 + }, + { + 0x0: 0x80, + 0x1000: 0x1040000, + 0x2000: 0x40000, + 0x3000: 0x20000000, + 0x4000: 0x20040080, + 0x5000: 0x1000080, + 0x6000: 0x21000080, + 0x7000: 0x40080, + 0x8000: 0x1000000, + 0x9000: 0x20040000, + 0xa000: 0x20000080, + 0xb000: 0x21040080, + 0xc000: 0x21040000, + 0xd000: 0x0, + 0xe000: 0x1040080, + 0xf000: 0x21000000, + 0x800: 0x1040080, + 0x1800: 0x21000080, + 0x2800: 0x80, + 0x3800: 0x1040000, + 0x4800: 0x40000, + 0x5800: 0x20040080, + 0x6800: 0x21040000, + 0x7800: 0x20000000, + 0x8800: 0x20040000, + 0x9800: 0x0, + 0xa800: 0x21040080, + 0xb800: 0x1000080, + 0xc800: 0x20000080, + 0xd800: 0x21000000, + 0xe800: 0x1000000, + 0xf800: 0x40080, + 0x10000: 0x40000, + 0x11000: 0x80, + 0x12000: 0x20000000, + 0x13000: 0x21000080, + 0x14000: 0x1000080, + 0x15000: 0x21040000, + 0x16000: 0x20040080, + 0x17000: 0x1000000, + 0x18000: 0x21040080, + 0x19000: 0x21000000, + 0x1a000: 0x1040000, + 0x1b000: 0x20040000, + 0x1c000: 0x40080, + 0x1d000: 0x20000080, + 0x1e000: 0x0, + 0x1f000: 0x1040080, + 0x10800: 0x21000080, + 0x11800: 0x1000000, + 0x12800: 0x1040000, + 0x13800: 0x20040080, + 0x14800: 0x20000000, + 0x15800: 0x1040080, + 0x16800: 0x80, + 0x17800: 0x21040000, + 0x18800: 0x40080, + 0x19800: 0x21040080, + 0x1a800: 0x0, + 0x1b800: 0x21000000, + 0x1c800: 0x1000080, + 0x1d800: 0x40000, + 0x1e800: 0x20040000, + 0x1f800: 0x20000080 + }, + { + 0x0: 0x10000008, + 0x100: 0x2000, + 0x200: 0x10200000, + 0x300: 0x10202008, + 0x400: 0x10002000, + 0x500: 0x200000, + 0x600: 0x200008, + 0x700: 0x10000000, + 0x800: 0x0, + 0x900: 0x10002008, + 0xa00: 0x202000, + 0xb00: 0x8, + 0xc00: 0x10200008, + 0xd00: 0x202008, + 0xe00: 0x2008, + 0xf00: 0x10202000, + 0x80: 0x10200000, + 0x180: 0x10202008, + 0x280: 0x8, + 0x380: 0x200000, + 0x480: 0x202008, + 0x580: 0x10000008, + 0x680: 0x10002000, + 0x780: 0x2008, + 0x880: 0x200008, + 0x980: 0x2000, + 0xa80: 0x10002008, + 0xb80: 0x10200008, + 0xc80: 0x0, + 0xd80: 0x10202000, + 0xe80: 0x202000, + 0xf80: 0x10000000, + 0x1000: 0x10002000, + 0x1100: 0x10200008, + 0x1200: 0x10202008, + 0x1300: 0x2008, + 0x1400: 0x200000, + 0x1500: 0x10000000, + 0x1600: 0x10000008, + 0x1700: 0x202000, + 0x1800: 0x202008, + 0x1900: 0x0, + 0x1a00: 0x8, + 0x1b00: 0x10200000, + 0x1c00: 0x2000, + 0x1d00: 0x10002008, + 0x1e00: 0x10202000, + 0x1f00: 0x200008, + 0x1080: 0x8, + 0x1180: 0x202000, + 0x1280: 0x200000, + 0x1380: 0x10000008, + 0x1480: 0x10002000, + 0x1580: 0x2008, + 0x1680: 0x10202008, + 0x1780: 0x10200000, + 0x1880: 0x10202000, + 0x1980: 0x10200008, + 0x1a80: 0x2000, + 0x1b80: 0x202008, + 0x1c80: 0x200008, + 0x1d80: 0x0, + 0x1e80: 0x10000000, + 0x1f80: 0x10002008 + }, + { + 0x0: 0x100000, + 0x10: 0x2000401, + 0x20: 0x400, + 0x30: 0x100401, + 0x40: 0x2100401, + 0x50: 0x0, + 0x60: 0x1, + 0x70: 0x2100001, + 0x80: 0x2000400, + 0x90: 0x100001, + 0xa0: 0x2000001, + 0xb0: 0x2100400, + 0xc0: 0x2100000, + 0xd0: 0x401, + 0xe0: 0x100400, + 0xf0: 0x2000000, + 0x8: 0x2100001, + 0x18: 0x0, + 0x28: 0x2000401, + 0x38: 0x2100400, + 0x48: 0x100000, + 0x58: 0x2000001, + 0x68: 0x2000000, + 0x78: 0x401, + 0x88: 0x100401, + 0x98: 0x2000400, + 0xa8: 0x2100000, + 0xb8: 0x100001, + 0xc8: 0x400, + 0xd8: 0x2100401, + 0xe8: 0x1, + 0xf8: 0x100400, + 0x100: 0x2000000, + 0x110: 0x100000, + 0x120: 0x2000401, + 0x130: 0x2100001, + 0x140: 0x100001, + 0x150: 0x2000400, + 0x160: 0x2100400, + 0x170: 0x100401, + 0x180: 0x401, + 0x190: 0x2100401, + 0x1a0: 0x100400, + 0x1b0: 0x1, + 0x1c0: 0x0, + 0x1d0: 0x2100000, + 0x1e0: 0x2000001, + 0x1f0: 0x400, + 0x108: 0x100400, + 0x118: 0x2000401, + 0x128: 0x2100001, + 0x138: 0x1, + 0x148: 0x2000000, + 0x158: 0x100000, + 0x168: 0x401, + 0x178: 0x2100400, + 0x188: 0x2000001, + 0x198: 0x2100000, + 0x1a8: 0x0, + 0x1b8: 0x2100401, + 0x1c8: 0x100401, + 0x1d8: 0x400, + 0x1e8: 0x2000400, + 0x1f8: 0x100001 + }, + { + 0x0: 0x8000820, + 0x1: 0x20000, + 0x2: 0x8000000, + 0x3: 0x20, + 0x4: 0x20020, + 0x5: 0x8020820, + 0x6: 0x8020800, + 0x7: 0x800, + 0x8: 0x8020000, + 0x9: 0x8000800, + 0xa: 0x20800, + 0xb: 0x8020020, + 0xc: 0x820, + 0xd: 0x0, + 0xe: 0x8000020, + 0xf: 0x20820, + 0x80000000: 0x800, + 0x80000001: 0x8020820, + 0x80000002: 0x8000820, + 0x80000003: 0x8000000, + 0x80000004: 0x8020000, + 0x80000005: 0x20800, + 0x80000006: 0x20820, + 0x80000007: 0x20, + 0x80000008: 0x8000020, + 0x80000009: 0x820, + 0x8000000a: 0x20020, + 0x8000000b: 0x8020800, + 0x8000000c: 0x0, + 0x8000000d: 0x8020020, + 0x8000000e: 0x8000800, + 0x8000000f: 0x20000, + 0x10: 0x20820, + 0x11: 0x8020800, + 0x12: 0x20, + 0x13: 0x800, + 0x14: 0x8000800, + 0x15: 0x8000020, + 0x16: 0x8020020, + 0x17: 0x20000, + 0x18: 0x0, + 0x19: 0x20020, + 0x1a: 0x8020000, + 0x1b: 0x8000820, + 0x1c: 0x8020820, + 0x1d: 0x20800, + 0x1e: 0x820, + 0x1f: 0x8000000, + 0x80000010: 0x20000, + 0x80000011: 0x800, + 0x80000012: 0x8020020, + 0x80000013: 0x20820, + 0x80000014: 0x20, + 0x80000015: 0x8020000, + 0x80000016: 0x8000000, + 0x80000017: 0x8000820, + 0x80000018: 0x8020820, + 0x80000019: 0x8000020, + 0x8000001a: 0x8000800, + 0x8000001b: 0x0, + 0x8000001c: 0x20800, + 0x8000001d: 0x820, + 0x8000001e: 0x20020, + 0x8000001f: 0x8020800 + } + ]; + + // Masks that select the SBOX input + var SBOX_MASK = [ + 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, + 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f + ]; + + /** + * DES block cipher algorithm. + */ + var DES = C_algo.DES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + + // Select 56 bits according to PC1 + var keyBits = []; + for (var i = 0; i < 56; i++) { + var keyBitPos = PC1[i] - 1; + keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1; + } + + // Assemble 16 subkeys + var subKeys = this._subKeys = []; + for (var nSubKey = 0; nSubKey < 16; nSubKey++) { + // Create subkey + var subKey = subKeys[nSubKey] = []; + + // Shortcut + var bitShift = BIT_SHIFTS[nSubKey]; + + // Select 48 bits according to PC2 + for (var i = 0; i < 24; i++) { + // Select from the left 28 key bits + subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6); + + // Select from the right 28 key bits + subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6); + } + + // Since each subkey is applied to an expanded 32-bit input, + // the subkey can be broken into 8 values scaled to 32-bits, + // which allows the key to be used without expansion + subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); + for (var i = 1; i < 7; i++) { + subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3); + } + subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27); + } + + // Compute inverse subkeys + var invSubKeys = this._invSubKeys = []; + for (var i = 0; i < 16; i++) { + invSubKeys[i] = subKeys[15 - i]; + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._subKeys); + }, + + decryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._invSubKeys); + }, + + _doCryptBlock: function (M, offset, subKeys) { + // Get input + this._lBlock = M[offset]; + this._rBlock = M[offset + 1]; + + // Initial permutation + exchangeLR.call(this, 4, 0x0f0f0f0f); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeRL.call(this, 2, 0x33333333); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeLR.call(this, 1, 0x55555555); + + // Rounds + for (var round = 0; round < 16; round++) { + // Shortcuts + var subKey = subKeys[round]; + var lBlock = this._lBlock; + var rBlock = this._rBlock; + + // Feistel function + var f = 0; + for (var i = 0; i < 8; i++) { + f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0]; + } + this._lBlock = rBlock; + this._rBlock = lBlock ^ f; + } + + // Undo swap from last round + var t = this._lBlock; + this._lBlock = this._rBlock; + this._rBlock = t; + + // Final permutation + exchangeLR.call(this, 1, 0x55555555); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeRL.call(this, 2, 0x33333333); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeLR.call(this, 4, 0x0f0f0f0f); + + // Set output + M[offset] = this._lBlock; + M[offset + 1] = this._rBlock; + }, + + keySize: 64/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + // Swap bits across the left and right words + function exchangeLR(offset, mask) { + var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; + this._rBlock ^= t; + this._lBlock ^= t << offset; + } + + function exchangeRL(offset, mask) { + var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; + this._lBlock ^= t; + this._rBlock ^= t << offset; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg); + */ + C.DES = BlockCipher._createHelper(DES); + + /** + * Triple-DES block cipher algorithm. + */ + var TripleDES = C_algo.TripleDES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + // Make sure the key length is valid (64, 128 or >= 192 bit) + if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) { + throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.'); + } + + // Extend the key according to the keying options defined in 3DES standard + var key1 = keyWords.slice(0, 2); + var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4); + var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6); + + // Create DES instances + this._des1 = DES.createEncryptor(WordArray.create(key1)); + this._des2 = DES.createEncryptor(WordArray.create(key2)); + this._des3 = DES.createEncryptor(WordArray.create(key3)); + }, + + encryptBlock: function (M, offset) { + this._des1.encryptBlock(M, offset); + this._des2.decryptBlock(M, offset); + this._des3.encryptBlock(M, offset); + }, + + decryptBlock: function (M, offset) { + this._des3.decryptBlock(M, offset); + this._des2.encryptBlock(M, offset); + this._des1.decryptBlock(M, offset); + }, + + keySize: 192/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg); + */ + C.TripleDES = BlockCipher._createHelper(TripleDES); + }()); + + + return CryptoJS.TripleDES; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./enc-base64":1751263816225,"./md5":1751263816227,"./evpkdf":1751263816237,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816252, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + /** + * RC4 stream cipher algorithm. + */ + var RC4 = C_algo.RC4 = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + var keySigBytes = key.sigBytes; + + // Init sbox + var S = this._S = []; + for (var i = 0; i < 256; i++) { + S[i] = i; + } + + // Key setup + for (var i = 0, j = 0; i < 256; i++) { + var keyByteIndex = i % keySigBytes; + var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff; + + j = (j + S[i] + keyByte) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + } + + // Counters + this._i = this._j = 0; + }, + + _doProcessBlock: function (M, offset) { + M[offset] ^= generateKeystreamWord.call(this); + }, + + keySize: 256/32, + + ivSize: 0 + }); + + function generateKeystreamWord() { + // Shortcuts + var S = this._S; + var i = this._i; + var j = this._j; + + // Generate keystream word + var keystreamWord = 0; + for (var n = 0; n < 4; n++) { + i = (i + 1) % 256; + j = (j + S[i]) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + + keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8); + } + + // Update counters + this._i = i; + this._j = j; + + return keystreamWord; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg); + */ + C.RC4 = StreamCipher._createHelper(RC4); + + /** + * Modified RC4 stream cipher algorithm. + */ + var RC4Drop = C_algo.RC4Drop = RC4.extend({ + /** + * Configuration options. + * + * @property {number} drop The number of keystream words to drop. Default 192 + */ + cfg: RC4.cfg.extend({ + drop: 192 + }), + + _doReset: function () { + RC4._doReset.call(this); + + // Drop + for (var i = this.cfg.drop; i > 0; i--) { + generateKeystreamWord.call(this); + } + } + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg); + */ + C.RC4Drop = StreamCipher._createHelper(RC4Drop); + }()); + + + return CryptoJS.RC4; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./enc-base64":1751263816225,"./md5":1751263816227,"./evpkdf":1751263816237,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816253, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm + */ + var Rabbit = C_algo.Rabbit = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Swap endian + for (var i = 0; i < 4; i++) { + K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) | + (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00); + } + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg); + * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg); + */ + C.Rabbit = StreamCipher._createHelper(Rabbit); + }()); + + + return CryptoJS.Rabbit; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./enc-base64":1751263816225,"./md5":1751263816227,"./evpkdf":1751263816237,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816254, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm. + * + * This is a legacy version that neglected to convert the key to little-endian. + * This error doesn't affect the cipher's security, + * but it does affect its compatibility with other implementations. + */ + var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg); + */ + C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy); + }()); + + + return CryptoJS.RabbitLegacy; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./enc-base64":1751263816225,"./md5":1751263816227,"./evpkdf":1751263816237,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +__DEFINE__(1751263816255, function(require, module, exports) { +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + const N = 16; + + //Origin pbox and sbox, derived from PI + const ORIG_P = [ + 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, + 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89, + 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, + 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, + 0x9216D5D9, 0x8979FB1B + ]; + + const ORIG_S = [ + [ 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, + 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99, + 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, + 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, + 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE, + 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013, + 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, + 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E, + 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60, + 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, + 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE, + 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A, + 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, + 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677, + 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193, + 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032, + 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88, + 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239, + 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, + 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0, + 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3, + 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, + 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88, + 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE, + 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, + 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D, + 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B, + 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, + 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA, + 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463, + 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, + 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09, + 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3, + 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB, + 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279, + 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8, + 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, + 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82, + 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB, + 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, + 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0, + 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B, + 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790, + 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8, + 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4, + 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, + 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7, + 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C, + 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, + 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1, + 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299, + 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9, + 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477, + 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF, + 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, + 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF, + 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA, + 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, + 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41, + 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915, + 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, + 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, + 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664, + 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A ], + [ 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, + 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266, + 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1, + 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, + 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6, + 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1, + 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, + 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1, + 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737, + 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8, + 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF, + 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD, + 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701, + 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7, + 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41, + 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331, + 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF, + 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF, + 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E, + 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87, + 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C, + 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2, + 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16, + 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD, + 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B, + 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509, + 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E, + 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3, + 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F, + 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A, + 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4, + 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960, + 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66, + 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28, + 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802, + 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84, + 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510, + 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF, + 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14, + 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E, + 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50, + 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7, + 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8, + 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281, + 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99, + 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696, + 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128, + 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73, + 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0, + 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0, + 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105, + 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250, + 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3, + 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285, + 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, + 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061, + 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB, + 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E, + 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735, + 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC, + 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9, + 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340, + 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20, + 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7 ], + [ 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, + 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068, + 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF, + 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, + 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45, + 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504, + 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A, + 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB, + 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE, + 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, + 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42, + 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B, + 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, + 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB, + 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527, + 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B, + 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33, + 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C, + 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, + 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC, + 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17, + 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, + 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B, + 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115, + 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922, + 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728, + 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0, + 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, + 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37, + 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D, + 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, + 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B, + 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3, + 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB, + 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D, + 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C, + 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, + 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9, + 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A, + 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, + 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D, + 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC, + 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F, + 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61, + 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2, + 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, + 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2, + 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C, + 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, + 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633, + 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10, + 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169, + 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52, + 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027, + 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, + 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62, + 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634, + 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, + 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24, + 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC, + 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, + 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C, + 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837, + 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0 ], + [ 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, + 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE, + 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B, + 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, + 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8, + 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6, + 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304, + 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22, + 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4, + 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, + 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9, + 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59, + 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, + 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51, + 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28, + 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C, + 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B, + 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28, + 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, + 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD, + 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A, + 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, + 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB, + 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F, + 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991, + 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32, + 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680, + 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, + 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE, + 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB, + 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, + 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47, + 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370, + 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D, + 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84, + 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048, + 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, + 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD, + 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9, + 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, + 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38, + 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F, + 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C, + 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525, + 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1, + 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, + 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964, + 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E, + 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, + 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D, + 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F, + 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299, + 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02, + 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC, + 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, + 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A, + 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6, + 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, + 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0, + 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060, + 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, + 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9, + 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F, + 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 ] + ]; + + var BLOWFISH_CTX = { + pbox: [], + sbox: [] + } + + function F(ctx, x){ + let a = (x >> 24) & 0xFF; + let b = (x >> 16) & 0xFF; + let c = (x >> 8) & 0xFF; + let d = x & 0xFF; + + let y = ctx.sbox[0][a] + ctx.sbox[1][b]; + y = y ^ ctx.sbox[2][c]; + y = y + ctx.sbox[3][d]; + + return y; + } + + function BlowFish_Encrypt(ctx, left, right){ + let Xl = left; + let Xr = right; + let temp; + + for(let i = 0; i < N; ++i){ + Xl = Xl ^ ctx.pbox[i]; + Xr = F(ctx, Xl) ^ Xr; + + temp = Xl; + Xl = Xr; + Xr = temp; + } + + temp = Xl; + Xl = Xr; + Xr = temp; + + Xr = Xr ^ ctx.pbox[N]; + Xl = Xl ^ ctx.pbox[N + 1]; + + return {left: Xl, right: Xr}; + } + + function BlowFish_Decrypt(ctx, left, right){ + let Xl = left; + let Xr = right; + let temp; + + for(let i = N + 1; i > 1; --i){ + Xl = Xl ^ ctx.pbox[i]; + Xr = F(ctx, Xl) ^ Xr; + + temp = Xl; + Xl = Xr; + Xr = temp; + } + + temp = Xl; + Xl = Xr; + Xr = temp; + + Xr = Xr ^ ctx.pbox[1]; + Xl = Xl ^ ctx.pbox[0]; + + return {left: Xl, right: Xr}; + } + + /** + * Initialization ctx's pbox and sbox. + * + * @param {Object} ctx The object has pbox and sbox. + * @param {Array} key An array of 32-bit words. + * @param {int} keysize The length of the key. + * + * @example + * + * BlowFishInit(BLOWFISH_CTX, key, 128/32); + */ + function BlowFishInit(ctx, key, keysize) + { + for(let Row = 0; Row < 4; Row++) + { + ctx.sbox[Row] = []; + for(let Col = 0; Col < 256; Col++) + { + ctx.sbox[Row][Col] = ORIG_S[Row][Col]; + } + } + + let keyIndex = 0; + for(let index = 0; index < N + 2; index++) + { + ctx.pbox[index] = ORIG_P[index] ^ key[keyIndex]; + keyIndex++; + if(keyIndex >= keysize) + { + keyIndex = 0; + } + } + + let Data1 = 0; + let Data2 = 0; + let res = 0; + for(let i = 0; i < N + 2; i += 2) + { + res = BlowFish_Encrypt(ctx, Data1, Data2); + Data1 = res.left; + Data2 = res.right; + ctx.pbox[i] = Data1; + ctx.pbox[i + 1] = Data2; + } + + for(let i = 0; i < 4; i++) + { + for(let j = 0; j < 256; j += 2) + { + res = BlowFish_Encrypt(ctx, Data1, Data2); + Data1 = res.left; + Data2 = res.right; + ctx.sbox[i][j] = Data1; + ctx.sbox[i][j + 1] = Data2; + } + } + + return true; + } + + /** + * Blowfish block cipher algorithm. + */ + var Blowfish = C_algo.Blowfish = BlockCipher.extend({ + _doReset: function () { + // Skip reset of nRounds has been set before and key did not change + if (this._keyPriorReset === this._key) { + return; + } + + // Shortcuts + var key = this._keyPriorReset = this._key; + var keyWords = key.words; + var keySize = key.sigBytes / 4; + + //Initialization pbox and sbox + BlowFishInit(BLOWFISH_CTX, keyWords, keySize); + }, + + encryptBlock: function (M, offset) { + var res = BlowFish_Encrypt(BLOWFISH_CTX, M[offset], M[offset + 1]); + M[offset] = res.left; + M[offset + 1] = res.right; + }, + + decryptBlock: function (M, offset) { + var res = BlowFish_Decrypt(BLOWFISH_CTX, M[offset], M[offset + 1]); + M[offset] = res.left; + M[offset + 1] = res.right; + }, + + blockSize: 64/32, + + keySize: 128/32, + + ivSize: 64/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.Blowfish.encrypt(message, key, cfg); + * var plaintext = CryptoJS.Blowfish.decrypt(ciphertext, key, cfg); + */ + C.Blowfish = BlockCipher._createHelper(Blowfish); + }()); + + + return CryptoJS.Blowfish; + +})); +}, function(modId) { var map = {"./core":1751263816221,"./enc-base64":1751263816225,"./md5":1751263816227,"./evpkdf":1751263816237,"./cipher-core":1751263816238}; return __REQUIRE__(map[modId], modId); }) +return __REQUIRE__(1751263816220); +})() +//miniprogram-npm-outsideDeps=["crypto"] +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/index.js.map b/miniprogram_npm/crypto-js/index.js.map new file mode 100644 index 0000000..c54bf84 --- /dev/null +++ b/miniprogram_npm/crypto-js/index.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["index.js","core.js","x64-core.js","lib-typedarrays.js","enc-utf16.js","enc-base64.js","enc-base64url.js","md5.js","sha1.js","sha256.js","sha224.js","sha512.js","sha384.js","sha3.js","ripemd160.js","hmac.js","pbkdf2.js","evpkdf.js","cipher-core.js","mode-cfb.js","mode-ctr.js","mode-ctr-gladman.js","mode-ofb.js","mode-ecb.js","pad-ansix923.js","pad-iso10126.js","pad-iso97971.js","pad-zeropadding.js","pad-nopadding.js","format-hex.js","aes.js","tripledes.js","rc4.js","rabbit.js","rabbit-legacy.js","blowfish.js"],"names":[],"mappings":";;;;;;;AAAA;AACA;AACA;ACFA,ADGA;ACFA,ADGA;ACFA,ADGA;ACFA,ADGA,AENA;ADIA,ADGA,AENA;ADIA,ADGA,AENA;ADIA,ADGA,AGTA,ADGA;ADIA,ADGA,AGTA,ADGA;ADIA,ADGA,AGTA,ADGA;ADIA,AGTA,AJYA,AGTA,ADGA;ADIA,AGTA,AJYA,AGTA,ADGA;ADIA,AGTA,AJYA,AGTA,ADGA;ADIA,AIZA,ADGA,AJYA,AGTA,ADGA;ADIA,AIZA,ADGA,AJYA,AGTA,ADGA;ADIA,AIZA,ADGA,AJYA,AGTA,ADGA;ADIA,AIZA,ACHA,AFMA,ADGA,ADGA;ADIA,AIZA,ACHA,AFMA,ADGA,ADGA;ADIA,AIZA,ACHA,AFMA,ADGA,ADGA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ALeA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ALeA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ALeA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,ANkBA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,ANkBA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,ANkBA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,ACHA,APqBA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,ACHA,APqBA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,ACHA,APqBA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,AENA,ADGA,APqBA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,AENA,ADGA,APqBA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,AENA,ADGA,APqBA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,AENA,ADGA,AENA,AT2BA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,AENA,ADGA,AENA,AT2BA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,AENA,ADGA,AENA,AT2BA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,AENA,ADGA,AGTA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,AENA,ADGA,AGTA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,AENA,ADGA,AGTA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,ACHA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,AOrBA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,AOrBA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,ADGA,AIZA,AOrBA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,AWjCA,AZoCA,AIZA,AOrBA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,AWjCA,AZoCA,AIZA,AOrBA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,AWjCA,AZoCA,AIZA,AOrBA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,AWjCA,AZoCA,AIZA,AS3BA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,AWjCA,AZoCA,AIZA,AS3BA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,AWjCA,AZoCA,AIZA,AS3BA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AS3BA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AS3BA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;ADIA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AS3BA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AS3BA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AS3BA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AS3BA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AHSA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AHSA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AHSA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,ACHA,AJYA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,ACHA,AJYA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,ACHA,AJYA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AJYA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AJYA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AJYA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AENA,ANkBA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AENA,ANkBA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AENA,ANkBA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AGTA,ADGA,ANkBA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AGTA,ADGA,ANkBA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AGTA,ADGA,ANkBA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ARwBA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ARwBA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ARwBA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,AT2BA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,AT2BA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,AT2BA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AV8BA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AV8BA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AV8BA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,ACHA,AXiCA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,ACHA,AXiCA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,ACHA,AXiCA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,AZoCA,AIZA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AFMA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;AgB/CA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;A4BnFA,AZoCA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;A4BnFA,AZoCA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;A4BnFA,AZoCA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AT2BA;A4BnFA,AZoCA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AZoCA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AZoCA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AFMA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AZoCA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AgBhDA,AlBsDA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AZoCA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AgBhDA,AlBsDA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AZoCA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AgBhDA,AlBsDA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AZoCA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AiBnDA,ADGA,AlBsDA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AZoCA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AiBnDA,ADGA,AlBsDA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AZoCA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AiBnDA,ADGA,AlBsDA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AZoCA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AZoCA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AZoCA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AGTA,ADGA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AENA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,AENA,ADGA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AENA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AENA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AENA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AENA,AENA,ACHA,ACHA,AENA,ADGA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AENA,AENA,ACHA,ACHA,ACHA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AENA,AENA,ACHA,ACHA,ACHA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AENA,AENA,ACHA,ACHA,ACHA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ADGA,AENA,AENA,ACHA,ACHA,ACHA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ACHA,AENA,ACHA,AENA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,ADGA,ADGA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ACHA,AENA,AGTA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,AGTA,AGTA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,AMlBA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,AMlBA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,AMlBA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,AMlBA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,AMlBA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,AMlBA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,AMlBA,AXiCA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,AYpCA,AENA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AIZA,ACHA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AKfA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AKfA,AFMA,AavCA,AYpCA,Ad0CA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AKfA,AFMA,AavCA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AKfA,AFMA,AavCA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AKfA,AFMA,AavCA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AKfA,AFMA,AavCA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AKfA,AFMA,AavCA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AKfA,AFMA,AavCA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AKfA,AFMA,AavCA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AKfA,AFMA,AavCA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AKfA,AWjCA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AKfA,AWjCA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AKfA,AWjCA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AKfA,AWjCA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AKfA,AWjCA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ANkBA,ACHA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,Ac1CA,ALeA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,AS3BA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,AS3BA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,AS3BA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,AS3BA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,AS3BA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AgBhDA,AFMA,ARwBA,AS3BA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,Ac1CA,ARwBA,AS3BA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,Ac1CA,ARwBA,AS3BA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,Ac1CA,ARwBA,AS3BA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,AS3BA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,AS3BA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,AS3BA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,AS3BA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,AS3BA,AkBtDA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ALeA,AIZA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,ADGA,AlBsDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AMlBA,A2BjFA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AiCnGA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AiCnGA,ADGA,AnByDA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AiCnGA,ApB4DA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AavCA,ADGA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA,A7BuFA;A4BnFA,AKfA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;ADIA,AKfA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;ADIA,AKfA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;ADIA,AKfA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;ADIA,AKfA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;ADIA,AKfA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;ADIA,AKfA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;ADIA,AKfA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;ADIA,AKfA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;ADIA,AKfA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;ADIA,AKfA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;ADIA,AKfA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;ADIA,AKfA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;ADIA,AKfA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AFMA,AoB5DA;AIXA,AjBmDA,AjBmDA,AYpCA,AkBtDA;AIXA,AjBmDA,AjBmDA,AYpCA,AkBtDA;AIXA,AjBmDA,AjBmDA,AYpCA,AkBtDA;AIXA,AjBmDA,AjBmDA,AYpCA,AkBtDA;AIXA,AjBmDA,AjBmDA,AYpCA,AkBtDA;AIXA,AjBmDA,AjBmDA,AYpCA,AkBtDA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AIXA,AjBmDA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AjBmDA,A8B1FA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA,AavCA;AbwCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.js","sourcesContent":[";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"), require(\"./lib-typedarrays\"), require(\"./enc-utf16\"), require(\"./enc-base64\"), require(\"./enc-base64url\"), require(\"./md5\"), require(\"./sha1\"), require(\"./sha256\"), require(\"./sha224\"), require(\"./sha512\"), require(\"./sha384\"), require(\"./sha3\"), require(\"./ripemd160\"), require(\"./hmac\"), require(\"./pbkdf2\"), require(\"./evpkdf\"), require(\"./cipher-core\"), require(\"./mode-cfb\"), require(\"./mode-ctr\"), require(\"./mode-ctr-gladman\"), require(\"./mode-ofb\"), require(\"./mode-ecb\"), require(\"./pad-ansix923\"), require(\"./pad-iso10126\"), require(\"./pad-iso97971\"), require(\"./pad-zeropadding\"), require(\"./pad-nopadding\"), require(\"./format-hex\"), require(\"./aes\"), require(\"./tripledes\"), require(\"./rc4\"), require(\"./rabbit\"), require(\"./rabbit-legacy\"), require(\"./blowfish\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\", \"./lib-typedarrays\", \"./enc-utf16\", \"./enc-base64\", \"./enc-base64url\", \"./md5\", \"./sha1\", \"./sha256\", \"./sha224\", \"./sha512\", \"./sha384\", \"./sha3\", \"./ripemd160\", \"./hmac\", \"./pbkdf2\", \"./evpkdf\", \"./cipher-core\", \"./mode-cfb\", \"./mode-ctr\", \"./mode-ctr-gladman\", \"./mode-ofb\", \"./mode-ecb\", \"./pad-ansix923\", \"./pad-iso10126\", \"./pad-iso97971\", \"./pad-zeropadding\", \"./pad-nopadding\", \"./format-hex\", \"./aes\", \"./tripledes\", \"./rc4\", \"./rabbit\", \"./rabbit-legacy\", \"./blowfish\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory();\n\t}\n}(this, function () {\n\n\t/*globals window, global, require*/\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\n\t var crypto;\n\n\t // Native crypto from window (Browser)\n\t if (typeof window !== 'undefined' && window.crypto) {\n\t crypto = window.crypto;\n\t }\n\n\t // Native crypto in web worker (Browser)\n\t if (typeof self !== 'undefined' && self.crypto) {\n\t crypto = self.crypto;\n\t }\n\n\t // Native crypto from worker\n\t if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n\t crypto = globalThis.crypto;\n\t }\n\n\t // Native (experimental IE 11) crypto from window (Browser)\n\t if (!crypto && typeof window !== 'undefined' && window.msCrypto) {\n\t crypto = window.msCrypto;\n\t }\n\n\t // Native crypto from global (NodeJS)\n\t if (!crypto && typeof global !== 'undefined' && global.crypto) {\n\t crypto = global.crypto;\n\t }\n\n\t // Native crypto import via require (NodeJS)\n\t if (!crypto && typeof require === 'function') {\n\t try {\n\t crypto = require('crypto');\n\t } catch (err) {}\n\t }\n\n\t /*\n\t * Cryptographically secure pseudorandom number generator\n\t *\n\t * As Math.random() is cryptographically not safe to use\n\t */\n\t var cryptoSecureRandomInt = function () {\n\t if (crypto) {\n\t // Use getRandomValues method (Browser)\n\t if (typeof crypto.getRandomValues === 'function') {\n\t try {\n\t return crypto.getRandomValues(new Uint32Array(1))[0];\n\t } catch (err) {}\n\t }\n\n\t // Use randomBytes method (NodeJS)\n\t if (typeof crypto.randomBytes === 'function') {\n\t try {\n\t return crypto.randomBytes(4).readInt32LE();\n\t } catch (err) {}\n\t }\n\t }\n\n\t throw new Error('Native crypto module could not be used to get secure random number.');\n\t };\n\n\t /*\n\t * Local polyfill of Object.create\n\n\t */\n\t var create = Object.create || (function () {\n\t function F() {}\n\n\t return function (obj) {\n\t var subtype;\n\n\t F.prototype = obj;\n\n\t subtype = new F();\n\n\t F.prototype = null;\n\n\t return subtype;\n\t };\n\t }());\n\n\t /**\n\t * CryptoJS namespace.\n\t */\n\t var C = {};\n\n\t /**\n\t * Library namespace.\n\t */\n\t var C_lib = C.lib = {};\n\n\t /**\n\t * Base object for prototypal inheritance.\n\t */\n\t var Base = C_lib.Base = (function () {\n\n\n\t return {\n\t /**\n\t * Creates a new object that inherits from this object.\n\t *\n\t * @param {Object} overrides Properties to copy into the new object.\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * field: 'value',\n\t *\n\t * method: function () {\n\t * }\n\t * });\n\t */\n\t extend: function (overrides) {\n\t // Spawn\n\t var subtype = create(this);\n\n\t // Augment\n\t if (overrides) {\n\t subtype.mixIn(overrides);\n\t }\n\n\t // Create default initializer\n\t if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t subtype.init = function () {\n\t subtype.$super.init.apply(this, arguments);\n\t };\n\t }\n\n\t // Initializer's prototype is the subtype object\n\t subtype.init.prototype = subtype;\n\n\t // Reference supertype\n\t subtype.$super = this;\n\n\t return subtype;\n\t },\n\n\t /**\n\t * Extends this object and runs the init method.\n\t * Arguments to create() will be passed to init().\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var instance = MyType.create();\n\t */\n\t create: function () {\n\t var instance = this.extend();\n\t instance.init.apply(instance, arguments);\n\n\t return instance;\n\t },\n\n\t /**\n\t * Initializes a newly created object.\n\t * Override this method to add some logic when your objects are created.\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * init: function () {\n\t * // ...\n\t * }\n\t * });\n\t */\n\t init: function () {\n\t },\n\n\t /**\n\t * Copies properties into this object.\n\t *\n\t * @param {Object} properties The properties to mix in.\n\t *\n\t * @example\n\t *\n\t * MyType.mixIn({\n\t * field: 'value'\n\t * });\n\t */\n\t mixIn: function (properties) {\n\t for (var propertyName in properties) {\n\t if (properties.hasOwnProperty(propertyName)) {\n\t this[propertyName] = properties[propertyName];\n\t }\n\t }\n\n\t // IE won't copy toString using the loop above\n\t if (properties.hasOwnProperty('toString')) {\n\t this.toString = properties.toString;\n\t }\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = instance.clone();\n\t */\n\t clone: function () {\n\t return this.init.prototype.extend(this);\n\t }\n\t };\n\t }());\n\n\t /**\n\t * An array of 32-bit words.\n\t *\n\t * @property {Array} words The array of 32-bit words.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var WordArray = C_lib.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of 32-bit words.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.create();\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 4;\n\t }\n\t },\n\n\t /**\n\t * Converts this word array to a string.\n\t *\n\t * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t *\n\t * @return {string} The stringified word array.\n\t *\n\t * @example\n\t *\n\t * var string = wordArray + '';\n\t * var string = wordArray.toString();\n\t * var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t */\n\t toString: function (encoder) {\n\t return (encoder || Hex).stringify(this);\n\t },\n\n\t /**\n\t * Concatenates a word array to this word array.\n\t *\n\t * @param {WordArray} wordArray The word array to append.\n\t *\n\t * @return {WordArray} This word array.\n\t *\n\t * @example\n\t *\n\t * wordArray1.concat(wordArray2);\n\t */\n\t concat: function (wordArray) {\n\t // Shortcuts\n\t var thisWords = this.words;\n\t var thatWords = wordArray.words;\n\t var thisSigBytes = this.sigBytes;\n\t var thatSigBytes = wordArray.sigBytes;\n\n\t // Clamp excess bits\n\t this.clamp();\n\n\t // Concat\n\t if (thisSigBytes % 4) {\n\t // Copy one byte at a time\n\t for (var i = 0; i < thatSigBytes; i++) {\n\t var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t }\n\t } else {\n\t // Copy one word at a time\n\t for (var j = 0; j < thatSigBytes; j += 4) {\n\t thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];\n\t }\n\t }\n\t this.sigBytes += thatSigBytes;\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Removes insignificant bits.\n\t *\n\t * @example\n\t *\n\t * wordArray.clamp();\n\t */\n\t clamp: function () {\n\t // Shortcuts\n\t var words = this.words;\n\t var sigBytes = this.sigBytes;\n\n\t // Clamp\n\t words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t words.length = Math.ceil(sigBytes / 4);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = wordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone.words = this.words.slice(0);\n\n\t return clone;\n\t },\n\n\t /**\n\t * Creates a word array filled with random bytes.\n\t *\n\t * @param {number} nBytes The number of random bytes to generate.\n\t *\n\t * @return {WordArray} The random word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.random(16);\n\t */\n\t random: function (nBytes) {\n\t var words = [];\n\n\t for (var i = 0; i < nBytes; i += 4) {\n\t words.push(cryptoSecureRandomInt());\n\t }\n\n\t return new WordArray.init(words, nBytes);\n\t }\n\t });\n\n\t /**\n\t * Encoder namespace.\n\t */\n\t var C_enc = C.enc = {};\n\n\t /**\n\t * Hex encoding strategy.\n\t */\n\t var Hex = C_enc.Hex = {\n\t /**\n\t * Converts a word array to a hex string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The hex string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var hexChars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t hexChars.push((bite >>> 4).toString(16));\n\t hexChars.push((bite & 0x0f).toString(16));\n\t }\n\n\t return hexChars.join('');\n\t },\n\n\t /**\n\t * Converts a hex string to a word array.\n\t *\n\t * @param {string} hexStr The hex string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t */\n\t parse: function (hexStr) {\n\t // Shortcut\n\t var hexStrLength = hexStr.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < hexStrLength; i += 2) {\n\t words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t }\n\n\t return new WordArray.init(words, hexStrLength / 2);\n\t }\n\t };\n\n\t /**\n\t * Latin1 encoding strategy.\n\t */\n\t var Latin1 = C_enc.Latin1 = {\n\t /**\n\t * Converts a word array to a Latin1 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Latin1 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var latin1Chars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t latin1Chars.push(String.fromCharCode(bite));\n\t }\n\n\t return latin1Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Latin1 string to a word array.\n\t *\n\t * @param {string} latin1Str The Latin1 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t */\n\t parse: function (latin1Str) {\n\t // Shortcut\n\t var latin1StrLength = latin1Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < latin1StrLength; i++) {\n\t words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t }\n\n\t return new WordArray.init(words, latin1StrLength);\n\t }\n\t };\n\n\t /**\n\t * UTF-8 encoding strategy.\n\t */\n\t var Utf8 = C_enc.Utf8 = {\n\t /**\n\t * Converts a word array to a UTF-8 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-8 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t try {\n\t return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t } catch (e) {\n\t throw new Error('Malformed UTF-8 data');\n\t }\n\t },\n\n\t /**\n\t * Converts a UTF-8 string to a word array.\n\t *\n\t * @param {string} utf8Str The UTF-8 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t */\n\t parse: function (utf8Str) {\n\t return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t }\n\t };\n\n\t /**\n\t * Abstract buffered block algorithm template.\n\t *\n\t * The property blockSize must be implemented in a concrete subtype.\n\t *\n\t * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t */\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t /**\n\t * Resets this block algorithm's data buffer to its initial state.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm.reset();\n\t */\n\t reset: function () {\n\t // Initial values\n\t this._data = new WordArray.init();\n\t this._nDataBytes = 0;\n\t },\n\n\t /**\n\t * Adds new data to this block algorithm's buffer.\n\t *\n\t * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm._append('data');\n\t * bufferedBlockAlgorithm._append(wordArray);\n\t */\n\t _append: function (data) {\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof data == 'string') {\n\t data = Utf8.parse(data);\n\t }\n\n\t // Append\n\t this._data.concat(data);\n\t this._nDataBytes += data.sigBytes;\n\t },\n\n\t /**\n\t * Processes available data blocks.\n\t *\n\t * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t *\n\t * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t *\n\t * @return {WordArray} The processed data.\n\t *\n\t * @example\n\t *\n\t * var processedData = bufferedBlockAlgorithm._process();\n\t * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t */\n\t _process: function (doFlush) {\n\t var processedWords;\n\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\t var dataSigBytes = data.sigBytes;\n\t var blockSize = this.blockSize;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count blocks ready\n\t var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t if (doFlush) {\n\t // Round up to include partial blocks\n\t nBlocksReady = Math.ceil(nBlocksReady);\n\t } else {\n\t // Round down to include only full blocks,\n\t // less the number of blocks that must remain in the buffer\n\t nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t }\n\n\t // Count words ready\n\t var nWordsReady = nBlocksReady * blockSize;\n\n\t // Count bytes ready\n\t var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t // Process blocks\n\t if (nWordsReady) {\n\t for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t // Perform concrete-algorithm logic\n\t this._doProcessBlock(dataWords, offset);\n\t }\n\n\t // Remove processed words\n\t processedWords = dataWords.splice(0, nWordsReady);\n\t data.sigBytes -= nBytesReady;\n\t }\n\n\t // Return processed words\n\t return new WordArray.init(processedWords, nBytesReady);\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = bufferedBlockAlgorithm.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone._data = this._data.clone();\n\n\t return clone;\n\t },\n\n\t _minBufferSize: 0\n\t });\n\n\t /**\n\t * Abstract hasher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t */\n\t var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Initializes a newly created hasher.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t *\n\t * @example\n\t *\n\t * var hasher = CryptoJS.algo.SHA256.create();\n\t */\n\t init: function (cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this hasher to its initial state.\n\t *\n\t * @example\n\t *\n\t * hasher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-hasher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Updates this hasher with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {Hasher} This hasher.\n\t *\n\t * @example\n\t *\n\t * hasher.update('message');\n\t * hasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t // Append\n\t this._append(messageUpdate);\n\n\t // Update the hash\n\t this._process();\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the hash computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @example\n\t *\n\t * var hash = hasher.finalize();\n\t * var hash = hasher.finalize('message');\n\t * var hash = hasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Final message update\n\t if (messageUpdate) {\n\t this._append(messageUpdate);\n\t }\n\n\t // Perform concrete-hasher logic\n\t var hash = this._doFinalize();\n\n\t return hash;\n\t },\n\n\t blockSize: 512/32,\n\n\t /**\n\t * Creates a shortcut function to a hasher's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to create a helper for.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHelper: function (hasher) {\n\t return function (message, cfg) {\n\t return new hasher.init(cfg).finalize(message);\n\t };\n\t },\n\n\t /**\n\t * Creates a shortcut function to the HMAC's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHmacHelper: function (hasher) {\n\t return function (message, key) {\n\t return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t };\n\t }\n\t });\n\n\t /**\n\t * Algorithm namespace.\n\t */\n\t var C_algo = C.algo = {};\n\n\t return C;\n\t}(Math));\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var X32WordArray = C_lib.WordArray;\n\n\t /**\n\t * x64 namespace.\n\t */\n\t var C_x64 = C.x64 = {};\n\n\t /**\n\t * A 64-bit word.\n\t */\n\t var X64Word = C_x64.Word = Base.extend({\n\t /**\n\t * Initializes a newly created 64-bit word.\n\t *\n\t * @param {number} high The high 32 bits.\n\t * @param {number} low The low 32 bits.\n\t *\n\t * @example\n\t *\n\t * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\n\t */\n\t init: function (high, low) {\n\t this.high = high;\n\t this.low = low;\n\t }\n\n\t /**\n\t * Bitwise NOTs this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after negating.\n\t *\n\t * @example\n\t *\n\t * var negated = x64Word.not();\n\t */\n\t // not: function () {\n\t // var high = ~this.high;\n\t // var low = ~this.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ANDs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to AND with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ANDing.\n\t *\n\t * @example\n\t *\n\t * var anded = x64Word.and(anotherX64Word);\n\t */\n\t // and: function (word) {\n\t // var high = this.high & word.high;\n\t // var low = this.low & word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to OR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ORing.\n\t *\n\t * @example\n\t *\n\t * var ored = x64Word.or(anotherX64Word);\n\t */\n\t // or: function (word) {\n\t // var high = this.high | word.high;\n\t // var low = this.low | word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise XORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to XOR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after XORing.\n\t *\n\t * @example\n\t *\n\t * var xored = x64Word.xor(anotherX64Word);\n\t */\n\t // xor: function (word) {\n\t // var high = this.high ^ word.high;\n\t // var low = this.low ^ word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftL(25);\n\t */\n\t // shiftL: function (n) {\n\t // if (n < 32) {\n\t // var high = (this.high << n) | (this.low >>> (32 - n));\n\t // var low = this.low << n;\n\t // } else {\n\t // var high = this.low << (n - 32);\n\t // var low = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftR(7);\n\t */\n\t // shiftR: function (n) {\n\t // if (n < 32) {\n\t // var low = (this.low >>> n) | (this.high << (32 - n));\n\t // var high = this.high >>> n;\n\t // } else {\n\t // var low = this.high >>> (n - 32);\n\t // var high = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotL(25);\n\t */\n\t // rotL: function (n) {\n\t // return this.shiftL(n).or(this.shiftR(64 - n));\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotR(7);\n\t */\n\t // rotR: function (n) {\n\t // return this.shiftR(n).or(this.shiftL(64 - n));\n\t // },\n\n\t /**\n\t * Adds this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to add with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after adding.\n\t *\n\t * @example\n\t *\n\t * var added = x64Word.add(anotherX64Word);\n\t */\n\t // add: function (word) {\n\t // var low = (this.low + word.low) | 0;\n\t // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\n\t // var high = (this.high + word.high + carry) | 0;\n\n\t // return X64Word.create(high, low);\n\t // }\n\t });\n\n\t /**\n\t * An array of 64-bit words.\n\t *\n\t * @property {Array} words The array of CryptoJS.x64.Word objects.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var X64WordArray = C_x64.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create();\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ]);\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ], 10);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 8;\n\t }\n\t },\n\n\t /**\n\t * Converts this 64-bit word array to a 32-bit word array.\n\t *\n\t * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\n\t *\n\t * @example\n\t *\n\t * var x32WordArray = x64WordArray.toX32();\n\t */\n\t toX32: function () {\n\t // Shortcuts\n\t var x64Words = this.words;\n\t var x64WordsLength = x64Words.length;\n\n\t // Convert\n\t var x32Words = [];\n\t for (var i = 0; i < x64WordsLength; i++) {\n\t var x64Word = x64Words[i];\n\t x32Words.push(x64Word.high);\n\t x32Words.push(x64Word.low);\n\t }\n\n\t return X32WordArray.create(x32Words, this.sigBytes);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {X64WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = x64WordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\n\t // Clone \"words\" array\n\t var words = clone.words = this.words.slice(0);\n\n\t // Clone each X64Word object\n\t var wordsLength = words.length;\n\t for (var i = 0; i < wordsLength; i++) {\n\t words[i] = words[i].clone();\n\t }\n\n\t return clone;\n\t }\n\t });\n\t}());\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Check if typed arrays are supported\n\t if (typeof ArrayBuffer != 'function') {\n\t return;\n\t }\n\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\n\t // Reference original init\n\t var superInit = WordArray.init;\n\n\t // Augment WordArray.init to handle typed arrays\n\t var subInit = WordArray.init = function (typedArray) {\n\t // Convert buffers to uint8\n\t if (typedArray instanceof ArrayBuffer) {\n\t typedArray = new Uint8Array(typedArray);\n\t }\n\n\t // Convert other array views to uint8\n\t if (\n\t typedArray instanceof Int8Array ||\n\t (typeof Uint8ClampedArray !== \"undefined\" && typedArray instanceof Uint8ClampedArray) ||\n\t typedArray instanceof Int16Array ||\n\t typedArray instanceof Uint16Array ||\n\t typedArray instanceof Int32Array ||\n\t typedArray instanceof Uint32Array ||\n\t typedArray instanceof Float32Array ||\n\t typedArray instanceof Float64Array\n\t ) {\n\t typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n\t }\n\n\t // Handle Uint8Array\n\t if (typedArray instanceof Uint8Array) {\n\t // Shortcut\n\t var typedArrayByteLength = typedArray.byteLength;\n\n\t // Extract bytes\n\t var words = [];\n\t for (var i = 0; i < typedArrayByteLength; i++) {\n\t words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);\n\t }\n\n\t // Initialize this word array\n\t superInit.call(this, words, typedArrayByteLength);\n\t } else {\n\t // Else call normal init\n\t superInit.apply(this, arguments);\n\t }\n\t };\n\n\t subInit.prototype = WordArray;\n\t}());\n\n\n\treturn CryptoJS.lib.WordArray;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var C_enc = C.enc;\n\n\t /**\n\t * UTF-16 BE encoding strategy.\n\t */\n\t var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {\n\t /**\n\t * Converts a word array to a UTF-16 BE string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-16 BE string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var utf16Chars = [];\n\t for (var i = 0; i < sigBytes; i += 2) {\n\t var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;\n\t utf16Chars.push(String.fromCharCode(codePoint));\n\t }\n\n\t return utf16Chars.join('');\n\t },\n\n\t /**\n\t * Converts a UTF-16 BE string to a word array.\n\t *\n\t * @param {string} utf16Str The UTF-16 BE string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf16.parse(utf16String);\n\t */\n\t parse: function (utf16Str) {\n\t // Shortcut\n\t var utf16StrLength = utf16Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < utf16StrLength; i++) {\n\t words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);\n\t }\n\n\t return WordArray.create(words, utf16StrLength * 2);\n\t }\n\t };\n\n\t /**\n\t * UTF-16 LE encoding strategy.\n\t */\n\t C_enc.Utf16LE = {\n\t /**\n\t * Converts a word array to a UTF-16 LE string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-16 LE string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var utf16Chars = [];\n\t for (var i = 0; i < sigBytes; i += 2) {\n\t var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);\n\t utf16Chars.push(String.fromCharCode(codePoint));\n\t }\n\n\t return utf16Chars.join('');\n\t },\n\n\t /**\n\t * Converts a UTF-16 LE string to a word array.\n\t *\n\t * @param {string} utf16Str The UTF-16 LE string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);\n\t */\n\t parse: function (utf16Str) {\n\t // Shortcut\n\t var utf16StrLength = utf16Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < utf16StrLength; i++) {\n\t words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));\n\t }\n\n\t return WordArray.create(words, utf16StrLength * 2);\n\t }\n\t };\n\n\t function swapEndian(word) {\n\t return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);\n\t }\n\t}());\n\n\n\treturn CryptoJS.enc.Utf16;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var C_enc = C.enc;\n\n\t /**\n\t * Base64 encoding strategy.\n\t */\n\t var Base64 = C_enc.Base64 = {\n\t /**\n\t * Converts a word array to a Base64 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Base64 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var base64String = CryptoJS.enc.Base64.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\t var map = this._map;\n\n\t // Clamp excess bits\n\t wordArray.clamp();\n\n\t // Convert\n\t var base64Chars = [];\n\t for (var i = 0; i < sigBytes; i += 3) {\n\t var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n\t var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n\t var triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n\t for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {\n\t base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n\t }\n\t }\n\n\t // Add padding\n\t var paddingChar = map.charAt(64);\n\t if (paddingChar) {\n\t while (base64Chars.length % 4) {\n\t base64Chars.push(paddingChar);\n\t }\n\t }\n\n\t return base64Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Base64 string to a word array.\n\t *\n\t * @param {string} base64Str The Base64 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Base64.parse(base64String);\n\t */\n\t parse: function (base64Str) {\n\t // Shortcuts\n\t var base64StrLength = base64Str.length;\n\t var map = this._map;\n\t var reverseMap = this._reverseMap;\n\n\t if (!reverseMap) {\n\t reverseMap = this._reverseMap = [];\n\t for (var j = 0; j < map.length; j++) {\n\t reverseMap[map.charCodeAt(j)] = j;\n\t }\n\t }\n\n\t // Ignore padding\n\t var paddingChar = map.charAt(64);\n\t if (paddingChar) {\n\t var paddingIndex = base64Str.indexOf(paddingChar);\n\t if (paddingIndex !== -1) {\n\t base64StrLength = paddingIndex;\n\t }\n\t }\n\n\t // Convert\n\t return parseLoop(base64Str, base64StrLength, reverseMap);\n\n\t },\n\n\t _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n\t };\n\n\t function parseLoop(base64Str, base64StrLength, reverseMap) {\n\t var words = [];\n\t var nBytes = 0;\n\t for (var i = 0; i < base64StrLength; i++) {\n\t if (i % 4) {\n\t var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n\t var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n\t var bitsCombined = bits1 | bits2;\n\t words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n\t nBytes++;\n\t }\n\t }\n\t return WordArray.create(words, nBytes);\n\t }\n\t}());\n\n\n\treturn CryptoJS.enc.Base64;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var C_enc = C.enc;\n\n\t /**\n\t * Base64url encoding strategy.\n\t */\n\t var Base64url = C_enc.Base64url = {\n\t /**\n\t * Converts a word array to a Base64url string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @param {boolean} urlSafe Whether to use url safe\n\t *\n\t * @return {string} The Base64url string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var base64String = CryptoJS.enc.Base64url.stringify(wordArray);\n\t */\n\t stringify: function (wordArray, urlSafe) {\n\t if (urlSafe === undefined) {\n\t urlSafe = true\n\t }\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\t var map = urlSafe ? this._safe_map : this._map;\n\n\t // Clamp excess bits\n\t wordArray.clamp();\n\n\t // Convert\n\t var base64Chars = [];\n\t for (var i = 0; i < sigBytes; i += 3) {\n\t var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n\t var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n\t var triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n\t for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {\n\t base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n\t }\n\t }\n\n\t // Add padding\n\t var paddingChar = map.charAt(64);\n\t if (paddingChar) {\n\t while (base64Chars.length % 4) {\n\t base64Chars.push(paddingChar);\n\t }\n\t }\n\n\t return base64Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Base64url string to a word array.\n\t *\n\t * @param {string} base64Str The Base64url string.\n\t *\n\t * @param {boolean} urlSafe Whether to use url safe\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Base64url.parse(base64String);\n\t */\n\t parse: function (base64Str, urlSafe) {\n\t if (urlSafe === undefined) {\n\t urlSafe = true\n\t }\n\n\t // Shortcuts\n\t var base64StrLength = base64Str.length;\n\t var map = urlSafe ? this._safe_map : this._map;\n\t var reverseMap = this._reverseMap;\n\n\t if (!reverseMap) {\n\t reverseMap = this._reverseMap = [];\n\t for (var j = 0; j < map.length; j++) {\n\t reverseMap[map.charCodeAt(j)] = j;\n\t }\n\t }\n\n\t // Ignore padding\n\t var paddingChar = map.charAt(64);\n\t if (paddingChar) {\n\t var paddingIndex = base64Str.indexOf(paddingChar);\n\t if (paddingIndex !== -1) {\n\t base64StrLength = paddingIndex;\n\t }\n\t }\n\n\t // Convert\n\t return parseLoop(base64Str, base64StrLength, reverseMap);\n\n\t },\n\n\t _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n\t _safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',\n\t };\n\n\t function parseLoop(base64Str, base64StrLength, reverseMap) {\n\t var words = [];\n\t var nBytes = 0;\n\t for (var i = 0; i < base64StrLength; i++) {\n\t if (i % 4) {\n\t var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n\t var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n\t var bitsCombined = bits1 | bits2;\n\t words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n\t nBytes++;\n\t }\n\t }\n\t return WordArray.create(words, nBytes);\n\t }\n\t}());\n\n\n\treturn CryptoJS.enc.Base64url;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Constants table\n\t var T = [];\n\n\t // Compute constants\n\t (function () {\n\t for (var i = 0; i < 64; i++) {\n\t T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n\t }\n\t }());\n\n\t /**\n\t * MD5 hash algorithm.\n\t */\n\t var MD5 = C_algo.MD5 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init([\n\t 0x67452301, 0xefcdab89,\n\t 0x98badcfe, 0x10325476\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Swap endian\n\t for (var i = 0; i < 16; i++) {\n\t // Shortcuts\n\t var offset_i = offset + i;\n\t var M_offset_i = M[offset_i];\n\n\t M[offset_i] = (\n\t (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |\n\t (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)\n\t );\n\t }\n\n\t // Shortcuts\n\t var H = this._hash.words;\n\n\t var M_offset_0 = M[offset + 0];\n\t var M_offset_1 = M[offset + 1];\n\t var M_offset_2 = M[offset + 2];\n\t var M_offset_3 = M[offset + 3];\n\t var M_offset_4 = M[offset + 4];\n\t var M_offset_5 = M[offset + 5];\n\t var M_offset_6 = M[offset + 6];\n\t var M_offset_7 = M[offset + 7];\n\t var M_offset_8 = M[offset + 8];\n\t var M_offset_9 = M[offset + 9];\n\t var M_offset_10 = M[offset + 10];\n\t var M_offset_11 = M[offset + 11];\n\t var M_offset_12 = M[offset + 12];\n\t var M_offset_13 = M[offset + 13];\n\t var M_offset_14 = M[offset + 14];\n\t var M_offset_15 = M[offset + 15];\n\n\t // Working variables\n\t var a = H[0];\n\t var b = H[1];\n\t var c = H[2];\n\t var d = H[3];\n\n\t // Computation\n\t a = FF(a, b, c, d, M_offset_0, 7, T[0]);\n\t d = FF(d, a, b, c, M_offset_1, 12, T[1]);\n\t c = FF(c, d, a, b, M_offset_2, 17, T[2]);\n\t b = FF(b, c, d, a, M_offset_3, 22, T[3]);\n\t a = FF(a, b, c, d, M_offset_4, 7, T[4]);\n\t d = FF(d, a, b, c, M_offset_5, 12, T[5]);\n\t c = FF(c, d, a, b, M_offset_6, 17, T[6]);\n\t b = FF(b, c, d, a, M_offset_7, 22, T[7]);\n\t a = FF(a, b, c, d, M_offset_8, 7, T[8]);\n\t d = FF(d, a, b, c, M_offset_9, 12, T[9]);\n\t c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n\t b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n\t a = FF(a, b, c, d, M_offset_12, 7, T[12]);\n\t d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n\t c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n\t b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n\t a = GG(a, b, c, d, M_offset_1, 5, T[16]);\n\t d = GG(d, a, b, c, M_offset_6, 9, T[17]);\n\t c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n\t b = GG(b, c, d, a, M_offset_0, 20, T[19]);\n\t a = GG(a, b, c, d, M_offset_5, 5, T[20]);\n\t d = GG(d, a, b, c, M_offset_10, 9, T[21]);\n\t c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n\t b = GG(b, c, d, a, M_offset_4, 20, T[23]);\n\t a = GG(a, b, c, d, M_offset_9, 5, T[24]);\n\t d = GG(d, a, b, c, M_offset_14, 9, T[25]);\n\t c = GG(c, d, a, b, M_offset_3, 14, T[26]);\n\t b = GG(b, c, d, a, M_offset_8, 20, T[27]);\n\t a = GG(a, b, c, d, M_offset_13, 5, T[28]);\n\t d = GG(d, a, b, c, M_offset_2, 9, T[29]);\n\t c = GG(c, d, a, b, M_offset_7, 14, T[30]);\n\t b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n\t a = HH(a, b, c, d, M_offset_5, 4, T[32]);\n\t d = HH(d, a, b, c, M_offset_8, 11, T[33]);\n\t c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n\t b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n\t a = HH(a, b, c, d, M_offset_1, 4, T[36]);\n\t d = HH(d, a, b, c, M_offset_4, 11, T[37]);\n\t c = HH(c, d, a, b, M_offset_7, 16, T[38]);\n\t b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n\t a = HH(a, b, c, d, M_offset_13, 4, T[40]);\n\t d = HH(d, a, b, c, M_offset_0, 11, T[41]);\n\t c = HH(c, d, a, b, M_offset_3, 16, T[42]);\n\t b = HH(b, c, d, a, M_offset_6, 23, T[43]);\n\t a = HH(a, b, c, d, M_offset_9, 4, T[44]);\n\t d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n\t c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n\t b = HH(b, c, d, a, M_offset_2, 23, T[47]);\n\n\t a = II(a, b, c, d, M_offset_0, 6, T[48]);\n\t d = II(d, a, b, c, M_offset_7, 10, T[49]);\n\t c = II(c, d, a, b, M_offset_14, 15, T[50]);\n\t b = II(b, c, d, a, M_offset_5, 21, T[51]);\n\t a = II(a, b, c, d, M_offset_12, 6, T[52]);\n\t d = II(d, a, b, c, M_offset_3, 10, T[53]);\n\t c = II(c, d, a, b, M_offset_10, 15, T[54]);\n\t b = II(b, c, d, a, M_offset_1, 21, T[55]);\n\t a = II(a, b, c, d, M_offset_8, 6, T[56]);\n\t d = II(d, a, b, c, M_offset_15, 10, T[57]);\n\t c = II(c, d, a, b, M_offset_6, 15, T[58]);\n\t b = II(b, c, d, a, M_offset_13, 21, T[59]);\n\t a = II(a, b, c, d, M_offset_4, 6, T[60]);\n\t d = II(d, a, b, c, M_offset_11, 10, T[61]);\n\t c = II(c, d, a, b, M_offset_2, 15, T[62]);\n\t b = II(b, c, d, a, M_offset_9, 21, T[63]);\n\n\t // Intermediate hash value\n\t H[0] = (H[0] + a) | 0;\n\t H[1] = (H[1] + b) | 0;\n\t H[2] = (H[2] + c) | 0;\n\t H[3] = (H[3] + d) | 0;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\n\t var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\n\t var nBitsTotalL = nBitsTotal;\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (\n\t (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) |\n\t (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)\n\t );\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n\t (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) |\n\t (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)\n\t );\n\n\t data.sigBytes = (dataWords.length + 1) * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Shortcuts\n\t var hash = this._hash;\n\t var H = hash.words;\n\n\t // Swap endian\n\t for (var i = 0; i < 4; i++) {\n\t // Shortcut\n\t var H_i = H[i];\n\n\t H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |\n\t (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);\n\t }\n\n\t // Return final computed hash\n\t return hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\t function FF(a, b, c, d, x, s, t) {\n\t var n = a + ((b & c) | (~b & d)) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t function GG(a, b, c, d, x, s, t) {\n\t var n = a + ((b & d) | (c & ~d)) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t function HH(a, b, c, d, x, s, t) {\n\t var n = a + (b ^ c ^ d) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t function II(a, b, c, d, x, s, t) {\n\t var n = a + (c ^ (b | ~d)) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.MD5('message');\n\t * var hash = CryptoJS.MD5(wordArray);\n\t */\n\t C.MD5 = Hasher._createHelper(MD5);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacMD5(message, key);\n\t */\n\t C.HmacMD5 = Hasher._createHmacHelper(MD5);\n\t}(Math));\n\n\n\treturn CryptoJS.MD5;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Reusable object\n\t var W = [];\n\n\t /**\n\t * SHA-1 hash algorithm.\n\t */\n\t var SHA1 = C_algo.SHA1 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init([\n\t 0x67452301, 0xefcdab89,\n\t 0x98badcfe, 0x10325476,\n\t 0xc3d2e1f0\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcut\n\t var H = this._hash.words;\n\n\t // Working variables\n\t var a = H[0];\n\t var b = H[1];\n\t var c = H[2];\n\t var d = H[3];\n\t var e = H[4];\n\n\t // Computation\n\t for (var i = 0; i < 80; i++) {\n\t if (i < 16) {\n\t W[i] = M[offset + i] | 0;\n\t } else {\n\t var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n\t W[i] = (n << 1) | (n >>> 31);\n\t }\n\n\t var t = ((a << 5) | (a >>> 27)) + e + W[i];\n\t if (i < 20) {\n\t t += ((b & c) | (~b & d)) + 0x5a827999;\n\t } else if (i < 40) {\n\t t += (b ^ c ^ d) + 0x6ed9eba1;\n\t } else if (i < 60) {\n\t t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;\n\t } else /* if (i < 80) */ {\n\t t += (b ^ c ^ d) - 0x359d3e2a;\n\t }\n\n\t e = d;\n\t d = c;\n\t c = (b << 30) | (b >>> 2);\n\t b = a;\n\t a = t;\n\t }\n\n\t // Intermediate hash value\n\t H[0] = (H[0] + a) | 0;\n\t H[1] = (H[1] + b) | 0;\n\t H[2] = (H[2] + c) | 0;\n\t H[3] = (H[3] + d) | 0;\n\t H[4] = (H[4] + e) | 0;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Return final computed hash\n\t return this._hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA1('message');\n\t * var hash = CryptoJS.SHA1(wordArray);\n\t */\n\t C.SHA1 = Hasher._createHelper(SHA1);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA1(message, key);\n\t */\n\t C.HmacSHA1 = Hasher._createHmacHelper(SHA1);\n\t}());\n\n\n\treturn CryptoJS.SHA1;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Initialization and round constants tables\n\t var H = [];\n\t var K = [];\n\n\t // Compute constants\n\t (function () {\n\t function isPrime(n) {\n\t var sqrtN = Math.sqrt(n);\n\t for (var factor = 2; factor <= sqrtN; factor++) {\n\t if (!(n % factor)) {\n\t return false;\n\t }\n\t }\n\n\t return true;\n\t }\n\n\t function getFractionalBits(n) {\n\t return ((n - (n | 0)) * 0x100000000) | 0;\n\t }\n\n\t var n = 2;\n\t var nPrime = 0;\n\t while (nPrime < 64) {\n\t if (isPrime(n)) {\n\t if (nPrime < 8) {\n\t H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\n\t }\n\t K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\n\n\t nPrime++;\n\t }\n\n\t n++;\n\t }\n\t }());\n\n\t // Reusable object\n\t var W = [];\n\n\t /**\n\t * SHA-256 hash algorithm.\n\t */\n\t var SHA256 = C_algo.SHA256 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init(H.slice(0));\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcut\n\t var H = this._hash.words;\n\n\t // Working variables\n\t var a = H[0];\n\t var b = H[1];\n\t var c = H[2];\n\t var d = H[3];\n\t var e = H[4];\n\t var f = H[5];\n\t var g = H[6];\n\t var h = H[7];\n\n\t // Computation\n\t for (var i = 0; i < 64; i++) {\n\t if (i < 16) {\n\t W[i] = M[offset + i] | 0;\n\t } else {\n\t var gamma0x = W[i - 15];\n\t var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^\n\t ((gamma0x << 14) | (gamma0x >>> 18)) ^\n\t (gamma0x >>> 3);\n\n\t var gamma1x = W[i - 2];\n\t var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^\n\t ((gamma1x << 13) | (gamma1x >>> 19)) ^\n\t (gamma1x >>> 10);\n\n\t W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\n\t }\n\n\t var ch = (e & f) ^ (~e & g);\n\t var maj = (a & b) ^ (a & c) ^ (b & c);\n\n\t var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\n\t var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));\n\n\t var t1 = h + sigma1 + ch + K[i] + W[i];\n\t var t2 = sigma0 + maj;\n\n\t h = g;\n\t g = f;\n\t f = e;\n\t e = (d + t1) | 0;\n\t d = c;\n\t c = b;\n\t b = a;\n\t a = (t1 + t2) | 0;\n\t }\n\n\t // Intermediate hash value\n\t H[0] = (H[0] + a) | 0;\n\t H[1] = (H[1] + b) | 0;\n\t H[2] = (H[2] + c) | 0;\n\t H[3] = (H[3] + d) | 0;\n\t H[4] = (H[4] + e) | 0;\n\t H[5] = (H[5] + f) | 0;\n\t H[6] = (H[6] + g) | 0;\n\t H[7] = (H[7] + h) | 0;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Return final computed hash\n\t return this._hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA256('message');\n\t * var hash = CryptoJS.SHA256(wordArray);\n\t */\n\t C.SHA256 = Hasher._createHelper(SHA256);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA256(message, key);\n\t */\n\t C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\n\t}(Math));\n\n\n\treturn CryptoJS.SHA256;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./sha256\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./sha256\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var C_algo = C.algo;\n\t var SHA256 = C_algo.SHA256;\n\n\t /**\n\t * SHA-224 hash algorithm.\n\t */\n\t var SHA224 = C_algo.SHA224 = SHA256.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init([\n\t 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,\n\t 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4\n\t ]);\n\t },\n\n\t _doFinalize: function () {\n\t var hash = SHA256._doFinalize.call(this);\n\n\t hash.sigBytes -= 4;\n\n\t return hash;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA224('message');\n\t * var hash = CryptoJS.SHA224(wordArray);\n\t */\n\t C.SHA224 = SHA256._createHelper(SHA224);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA224(message, key);\n\t */\n\t C.HmacSHA224 = SHA256._createHmacHelper(SHA224);\n\t}());\n\n\n\treturn CryptoJS.SHA224;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Hasher = C_lib.Hasher;\n\t var C_x64 = C.x64;\n\t var X64Word = C_x64.Word;\n\t var X64WordArray = C_x64.WordArray;\n\t var C_algo = C.algo;\n\n\t function X64Word_create() {\n\t return X64Word.create.apply(X64Word, arguments);\n\t }\n\n\t // Constants\n\t var K = [\n\t X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\n\t X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\n\t X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\n\t X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\n\t X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\n\t X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\n\t X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\n\t X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\n\t X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\n\t X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\n\t X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\n\t X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\n\t X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\n\t X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\n\t X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\n\t X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\n\t X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\n\t X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\n\t X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\n\t X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\n\t X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\n\t X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\n\t X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\n\t X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\n\t X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\n\t X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\n\t X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\n\t X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\n\t X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\n\t X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\n\t X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\n\t X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\n\t X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\n\t X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\n\t X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\n\t X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\n\t X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\n\t X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\n\t X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\n\t X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\n\t ];\n\n\t // Reusable objects\n\t var W = [];\n\t (function () {\n\t for (var i = 0; i < 80; i++) {\n\t W[i] = X64Word_create();\n\t }\n\t }());\n\n\t /**\n\t * SHA-512 hash algorithm.\n\t */\n\t var SHA512 = C_algo.SHA512 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new X64WordArray.init([\n\t new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\n\t new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\n\t new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\n\t new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcuts\n\t var H = this._hash.words;\n\n\t var H0 = H[0];\n\t var H1 = H[1];\n\t var H2 = H[2];\n\t var H3 = H[3];\n\t var H4 = H[4];\n\t var H5 = H[5];\n\t var H6 = H[6];\n\t var H7 = H[7];\n\n\t var H0h = H0.high;\n\t var H0l = H0.low;\n\t var H1h = H1.high;\n\t var H1l = H1.low;\n\t var H2h = H2.high;\n\t var H2l = H2.low;\n\t var H3h = H3.high;\n\t var H3l = H3.low;\n\t var H4h = H4.high;\n\t var H4l = H4.low;\n\t var H5h = H5.high;\n\t var H5l = H5.low;\n\t var H6h = H6.high;\n\t var H6l = H6.low;\n\t var H7h = H7.high;\n\t var H7l = H7.low;\n\n\t // Working variables\n\t var ah = H0h;\n\t var al = H0l;\n\t var bh = H1h;\n\t var bl = H1l;\n\t var ch = H2h;\n\t var cl = H2l;\n\t var dh = H3h;\n\t var dl = H3l;\n\t var eh = H4h;\n\t var el = H4l;\n\t var fh = H5h;\n\t var fl = H5l;\n\t var gh = H6h;\n\t var gl = H6l;\n\t var hh = H7h;\n\t var hl = H7l;\n\n\t // Rounds\n\t for (var i = 0; i < 80; i++) {\n\t var Wil;\n\t var Wih;\n\n\t // Shortcut\n\t var Wi = W[i];\n\n\t // Extend message\n\t if (i < 16) {\n\t Wih = Wi.high = M[offset + i * 2] | 0;\n\t Wil = Wi.low = M[offset + i * 2 + 1] | 0;\n\t } else {\n\t // Gamma0\n\t var gamma0x = W[i - 15];\n\t var gamma0xh = gamma0x.high;\n\t var gamma0xl = gamma0x.low;\n\t var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\n\t var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\n\n\t // Gamma1\n\t var gamma1x = W[i - 2];\n\t var gamma1xh = gamma1x.high;\n\t var gamma1xl = gamma1x.low;\n\t var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\n\t var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\n\n\t // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\n\t var Wi7 = W[i - 7];\n\t var Wi7h = Wi7.high;\n\t var Wi7l = Wi7.low;\n\n\t var Wi16 = W[i - 16];\n\t var Wi16h = Wi16.high;\n\t var Wi16l = Wi16.low;\n\n\t Wil = gamma0l + Wi7l;\n\t Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\n\t Wil = Wil + gamma1l;\n\t Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\n\t Wil = Wil + Wi16l;\n\t Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\n\n\t Wi.high = Wih;\n\t Wi.low = Wil;\n\t }\n\n\t var chh = (eh & fh) ^ (~eh & gh);\n\t var chl = (el & fl) ^ (~el & gl);\n\t var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\n\t var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\n\n\t var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\n\t var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\n\t var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\n\t var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\n\n\t // t1 = h + sigma1 + ch + K[i] + W[i]\n\t var Ki = K[i];\n\t var Kih = Ki.high;\n\t var Kil = Ki.low;\n\n\t var t1l = hl + sigma1l;\n\t var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\n\t var t1l = t1l + chl;\n\t var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\n\t var t1l = t1l + Kil;\n\t var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\n\t var t1l = t1l + Wil;\n\t var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\n\n\t // t2 = sigma0 + maj\n\t var t2l = sigma0l + majl;\n\t var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\n\n\t // Update working variables\n\t hh = gh;\n\t hl = gl;\n\t gh = fh;\n\t gl = fl;\n\t fh = eh;\n\t fl = el;\n\t el = (dl + t1l) | 0;\n\t eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\n\t dh = ch;\n\t dl = cl;\n\t ch = bh;\n\t cl = bl;\n\t bh = ah;\n\t bl = al;\n\t al = (t1l + t2l) | 0;\n\t ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\n\t }\n\n\t // Intermediate hash value\n\t H0l = H0.low = (H0l + al);\n\t H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\n\t H1l = H1.low = (H1l + bl);\n\t H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\n\t H2l = H2.low = (H2l + cl);\n\t H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\n\t H3l = H3.low = (H3l + dl);\n\t H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\n\t H4l = H4.low = (H4l + el);\n\t H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\n\t H5l = H5.low = (H5l + fl);\n\t H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\n\t H6l = H6.low = (H6l + gl);\n\t H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\n\t H7l = H7.low = (H7l + hl);\n\t H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Convert hash to 32-bit word array before returning\n\t var hash = this._hash.toX32();\n\n\t // Return final computed hash\n\t return hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t },\n\n\t blockSize: 1024/32\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA512('message');\n\t * var hash = CryptoJS.SHA512(wordArray);\n\t */\n\t C.SHA512 = Hasher._createHelper(SHA512);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA512(message, key);\n\t */\n\t C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\n\t}());\n\n\n\treturn CryptoJS.SHA512;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"), require(\"./sha512\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\", \"./sha512\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_x64 = C.x64;\n\t var X64Word = C_x64.Word;\n\t var X64WordArray = C_x64.WordArray;\n\t var C_algo = C.algo;\n\t var SHA512 = C_algo.SHA512;\n\n\t /**\n\t * SHA-384 hash algorithm.\n\t */\n\t var SHA384 = C_algo.SHA384 = SHA512.extend({\n\t _doReset: function () {\n\t this._hash = new X64WordArray.init([\n\t new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),\n\t new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),\n\t new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),\n\t new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)\n\t ]);\n\t },\n\n\t _doFinalize: function () {\n\t var hash = SHA512._doFinalize.call(this);\n\n\t hash.sigBytes -= 16;\n\n\t return hash;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA384('message');\n\t * var hash = CryptoJS.SHA384(wordArray);\n\t */\n\t C.SHA384 = SHA512._createHelper(SHA384);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA384(message, key);\n\t */\n\t C.HmacSHA384 = SHA512._createHmacHelper(SHA384);\n\t}());\n\n\n\treturn CryptoJS.SHA384;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_x64 = C.x64;\n\t var X64Word = C_x64.Word;\n\t var C_algo = C.algo;\n\n\t // Constants tables\n\t var RHO_OFFSETS = [];\n\t var PI_INDEXES = [];\n\t var ROUND_CONSTANTS = [];\n\n\t // Compute Constants\n\t (function () {\n\t // Compute rho offset constants\n\t var x = 1, y = 0;\n\t for (var t = 0; t < 24; t++) {\n\t RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;\n\n\t var newX = y % 5;\n\t var newY = (2 * x + 3 * y) % 5;\n\t x = newX;\n\t y = newY;\n\t }\n\n\t // Compute pi index constants\n\t for (var x = 0; x < 5; x++) {\n\t for (var y = 0; y < 5; y++) {\n\t PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;\n\t }\n\t }\n\n\t // Compute round constants\n\t var LFSR = 0x01;\n\t for (var i = 0; i < 24; i++) {\n\t var roundConstantMsw = 0;\n\t var roundConstantLsw = 0;\n\n\t for (var j = 0; j < 7; j++) {\n\t if (LFSR & 0x01) {\n\t var bitPosition = (1 << j) - 1;\n\t if (bitPosition < 32) {\n\t roundConstantLsw ^= 1 << bitPosition;\n\t } else /* if (bitPosition >= 32) */ {\n\t roundConstantMsw ^= 1 << (bitPosition - 32);\n\t }\n\t }\n\n\t // Compute next LFSR\n\t if (LFSR & 0x80) {\n\t // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1\n\t LFSR = (LFSR << 1) ^ 0x71;\n\t } else {\n\t LFSR <<= 1;\n\t }\n\t }\n\n\t ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);\n\t }\n\t }());\n\n\t // Reusable objects for temporary values\n\t var T = [];\n\t (function () {\n\t for (var i = 0; i < 25; i++) {\n\t T[i] = X64Word.create();\n\t }\n\t }());\n\n\t /**\n\t * SHA-3 hash algorithm.\n\t */\n\t var SHA3 = C_algo.SHA3 = Hasher.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {number} outputLength\n\t * The desired number of bits in the output hash.\n\t * Only values permitted are: 224, 256, 384, 512.\n\t * Default: 512\n\t */\n\t cfg: Hasher.cfg.extend({\n\t outputLength: 512\n\t }),\n\n\t _doReset: function () {\n\t var state = this._state = []\n\t for (var i = 0; i < 25; i++) {\n\t state[i] = new X64Word.init();\n\t }\n\n\t this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcuts\n\t var state = this._state;\n\t var nBlockSizeLanes = this.blockSize / 2;\n\n\t // Absorb\n\t for (var i = 0; i < nBlockSizeLanes; i++) {\n\t // Shortcuts\n\t var M2i = M[offset + 2 * i];\n\t var M2i1 = M[offset + 2 * i + 1];\n\n\t // Swap endian\n\t M2i = (\n\t (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) |\n\t (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00)\n\t );\n\t M2i1 = (\n\t (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) |\n\t (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00)\n\t );\n\n\t // Absorb message into state\n\t var lane = state[i];\n\t lane.high ^= M2i1;\n\t lane.low ^= M2i;\n\t }\n\n\t // Rounds\n\t for (var round = 0; round < 24; round++) {\n\t // Theta\n\t for (var x = 0; x < 5; x++) {\n\t // Mix column lanes\n\t var tMsw = 0, tLsw = 0;\n\t for (var y = 0; y < 5; y++) {\n\t var lane = state[x + 5 * y];\n\t tMsw ^= lane.high;\n\t tLsw ^= lane.low;\n\t }\n\n\t // Temporary values\n\t var Tx = T[x];\n\t Tx.high = tMsw;\n\t Tx.low = tLsw;\n\t }\n\t for (var x = 0; x < 5; x++) {\n\t // Shortcuts\n\t var Tx4 = T[(x + 4) % 5];\n\t var Tx1 = T[(x + 1) % 5];\n\t var Tx1Msw = Tx1.high;\n\t var Tx1Lsw = Tx1.low;\n\n\t // Mix surrounding columns\n\t var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));\n\t var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));\n\t for (var y = 0; y < 5; y++) {\n\t var lane = state[x + 5 * y];\n\t lane.high ^= tMsw;\n\t lane.low ^= tLsw;\n\t }\n\t }\n\n\t // Rho Pi\n\t for (var laneIndex = 1; laneIndex < 25; laneIndex++) {\n\t var tMsw;\n\t var tLsw;\n\n\t // Shortcuts\n\t var lane = state[laneIndex];\n\t var laneMsw = lane.high;\n\t var laneLsw = lane.low;\n\t var rhoOffset = RHO_OFFSETS[laneIndex];\n\n\t // Rotate lanes\n\t if (rhoOffset < 32) {\n\t tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));\n\t tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));\n\t } else /* if (rhoOffset >= 32) */ {\n\t tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));\n\t tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));\n\t }\n\n\t // Transpose lanes\n\t var TPiLane = T[PI_INDEXES[laneIndex]];\n\t TPiLane.high = tMsw;\n\t TPiLane.low = tLsw;\n\t }\n\n\t // Rho pi at x = y = 0\n\t var T0 = T[0];\n\t var state0 = state[0];\n\t T0.high = state0.high;\n\t T0.low = state0.low;\n\n\t // Chi\n\t for (var x = 0; x < 5; x++) {\n\t for (var y = 0; y < 5; y++) {\n\t // Shortcuts\n\t var laneIndex = x + 5 * y;\n\t var lane = state[laneIndex];\n\t var TLane = T[laneIndex];\n\t var Tx1Lane = T[((x + 1) % 5) + 5 * y];\n\t var Tx2Lane = T[((x + 2) % 5) + 5 * y];\n\n\t // Mix rows\n\t lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);\n\t lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low);\n\t }\n\t }\n\n\t // Iota\n\t var lane = state[0];\n\t var roundConstant = ROUND_CONSTANTS[round];\n\t lane.high ^= roundConstant.high;\n\t lane.low ^= roundConstant.low;\n\t }\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\t var blockSizeBits = this.blockSize * 32;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);\n\t dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Shortcuts\n\t var state = this._state;\n\t var outputLengthBytes = this.cfg.outputLength / 8;\n\t var outputLengthLanes = outputLengthBytes / 8;\n\n\t // Squeeze\n\t var hashWords = [];\n\t for (var i = 0; i < outputLengthLanes; i++) {\n\t // Shortcuts\n\t var lane = state[i];\n\t var laneMsw = lane.high;\n\t var laneLsw = lane.low;\n\n\t // Swap endian\n\t laneMsw = (\n\t (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) |\n\t (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00)\n\t );\n\t laneLsw = (\n\t (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) |\n\t (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00)\n\t );\n\n\t // Squeeze state to retrieve hash\n\t hashWords.push(laneLsw);\n\t hashWords.push(laneMsw);\n\t }\n\n\t // Return final computed hash\n\t return new WordArray.init(hashWords, outputLengthBytes);\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\n\t var state = clone._state = this._state.slice(0);\n\t for (var i = 0; i < 25; i++) {\n\t state[i] = state[i].clone();\n\t }\n\n\t return clone;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA3('message');\n\t * var hash = CryptoJS.SHA3(wordArray);\n\t */\n\t C.SHA3 = Hasher._createHelper(SHA3);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA3(message, key);\n\t */\n\t C.HmacSHA3 = Hasher._createHmacHelper(SHA3);\n\t}(Math));\n\n\n\treturn CryptoJS.SHA3;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/** @preserve\n\t(c) 2012 by Cédric Mesnil. All rights reserved.\n\n\tRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n\t - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\t - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n\tTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t*/\n\n\t(function (Math) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Constants table\n\t var _zl = WordArray.create([\n\t 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n\t 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,\n\t 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,\n\t 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,\n\t 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]);\n\t var _zr = WordArray.create([\n\t 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,\n\t 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,\n\t 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,\n\t 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,\n\t 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]);\n\t var _sl = WordArray.create([\n\t 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,\n\t 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,\n\t 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,\n\t 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,\n\t 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]);\n\t var _sr = WordArray.create([\n\t 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,\n\t 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,\n\t 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,\n\t 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,\n\t 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]);\n\n\t var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);\n\t var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);\n\n\t /**\n\t * RIPEMD160 hash algorithm.\n\t */\n\t var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\n\t // Swap endian\n\t for (var i = 0; i < 16; i++) {\n\t // Shortcuts\n\t var offset_i = offset + i;\n\t var M_offset_i = M[offset_i];\n\n\t // Swap\n\t M[offset_i] = (\n\t (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |\n\t (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)\n\t );\n\t }\n\t // Shortcut\n\t var H = this._hash.words;\n\t var hl = _hl.words;\n\t var hr = _hr.words;\n\t var zl = _zl.words;\n\t var zr = _zr.words;\n\t var sl = _sl.words;\n\t var sr = _sr.words;\n\n\t // Working variables\n\t var al, bl, cl, dl, el;\n\t var ar, br, cr, dr, er;\n\n\t ar = al = H[0];\n\t br = bl = H[1];\n\t cr = cl = H[2];\n\t dr = dl = H[3];\n\t er = el = H[4];\n\t // Computation\n\t var t;\n\t for (var i = 0; i < 80; i += 1) {\n\t t = (al + M[offset+zl[i]])|0;\n\t if (i<16){\n\t\t t += f1(bl,cl,dl) + hl[0];\n\t } else if (i<32) {\n\t\t t += f2(bl,cl,dl) + hl[1];\n\t } else if (i<48) {\n\t\t t += f3(bl,cl,dl) + hl[2];\n\t } else if (i<64) {\n\t\t t += f4(bl,cl,dl) + hl[3];\n\t } else {// if (i<80) {\n\t\t t += f5(bl,cl,dl) + hl[4];\n\t }\n\t t = t|0;\n\t t = rotl(t,sl[i]);\n\t t = (t+el)|0;\n\t al = el;\n\t el = dl;\n\t dl = rotl(cl, 10);\n\t cl = bl;\n\t bl = t;\n\n\t t = (ar + M[offset+zr[i]])|0;\n\t if (i<16){\n\t\t t += f5(br,cr,dr) + hr[0];\n\t } else if (i<32) {\n\t\t t += f4(br,cr,dr) + hr[1];\n\t } else if (i<48) {\n\t\t t += f3(br,cr,dr) + hr[2];\n\t } else if (i<64) {\n\t\t t += f2(br,cr,dr) + hr[3];\n\t } else {// if (i<80) {\n\t\t t += f1(br,cr,dr) + hr[4];\n\t }\n\t t = t|0;\n\t t = rotl(t,sr[i]) ;\n\t t = (t+er)|0;\n\t ar = er;\n\t er = dr;\n\t dr = rotl(cr, 10);\n\t cr = br;\n\t br = t;\n\t }\n\t // Intermediate hash value\n\t t = (H[1] + cl + dr)|0;\n\t H[1] = (H[2] + dl + er)|0;\n\t H[2] = (H[3] + el + ar)|0;\n\t H[3] = (H[4] + al + br)|0;\n\t H[4] = (H[0] + bl + cr)|0;\n\t H[0] = t;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n\t (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) |\n\t (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00)\n\t );\n\t data.sigBytes = (dataWords.length + 1) * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Shortcuts\n\t var hash = this._hash;\n\t var H = hash.words;\n\n\t // Swap endian\n\t for (var i = 0; i < 5; i++) {\n\t // Shortcut\n\t var H_i = H[i];\n\n\t // Swap\n\t H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |\n\t (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);\n\t }\n\n\t // Return final computed hash\n\t return hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\n\t function f1(x, y, z) {\n\t return ((x) ^ (y) ^ (z));\n\n\t }\n\n\t function f2(x, y, z) {\n\t return (((x)&(y)) | ((~x)&(z)));\n\t }\n\n\t function f3(x, y, z) {\n\t return (((x) | (~(y))) ^ (z));\n\t }\n\n\t function f4(x, y, z) {\n\t return (((x) & (z)) | ((y)&(~(z))));\n\t }\n\n\t function f5(x, y, z) {\n\t return ((x) ^ ((y) |(~(z))));\n\n\t }\n\n\t function rotl(x,n) {\n\t return (x<>>(32-n));\n\t }\n\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.RIPEMD160('message');\n\t * var hash = CryptoJS.RIPEMD160(wordArray);\n\t */\n\t C.RIPEMD160 = Hasher._createHelper(RIPEMD160);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacRIPEMD160(message, key);\n\t */\n\t C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);\n\t}(Math));\n\n\n\treturn CryptoJS.RIPEMD160;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var C_algo = C.algo;\n\n\t /**\n\t * HMAC algorithm.\n\t */\n\t var HMAC = C_algo.HMAC = Base.extend({\n\t /**\n\t * Initializes a newly created HMAC.\n\t *\n\t * @param {Hasher} hasher The hash algorithm to use.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @example\n\t *\n\t * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t */\n\t init: function (hasher, key) {\n\t // Init hasher\n\t hasher = this._hasher = new hasher.init();\n\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof key == 'string') {\n\t key = Utf8.parse(key);\n\t }\n\n\t // Shortcuts\n\t var hasherBlockSize = hasher.blockSize;\n\t var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t // Allow arbitrary length keys\n\t if (key.sigBytes > hasherBlockSizeBytes) {\n\t key = hasher.finalize(key);\n\t }\n\n\t // Clamp excess bits\n\t key.clamp();\n\n\t // Clone key for inner and outer pads\n\t var oKey = this._oKey = key.clone();\n\t var iKey = this._iKey = key.clone();\n\n\t // Shortcuts\n\t var oKeyWords = oKey.words;\n\t var iKeyWords = iKey.words;\n\n\t // XOR keys with pad constants\n\t for (var i = 0; i < hasherBlockSize; i++) {\n\t oKeyWords[i] ^= 0x5c5c5c5c;\n\t iKeyWords[i] ^= 0x36363636;\n\t }\n\t oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this HMAC to its initial state.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.reset();\n\t */\n\t reset: function () {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Reset\n\t hasher.reset();\n\t hasher.update(this._iKey);\n\t },\n\n\t /**\n\t * Updates this HMAC with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {HMAC} This HMAC instance.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.update('message');\n\t * hmacHasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t this._hasher.update(messageUpdate);\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the HMAC computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @example\n\t *\n\t * var hmac = hmacHasher.finalize();\n\t * var hmac = hmacHasher.finalize('message');\n\t * var hmac = hmacHasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Compute HMAC\n\t var innerHash = hasher.finalize(messageUpdate);\n\t hasher.reset();\n\t var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t return hmac;\n\t }\n\t });\n\t}());\n\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./sha256\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./sha256\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var WordArray = C_lib.WordArray;\n\t var C_algo = C.algo;\n\t var SHA256 = C_algo.SHA256;\n\t var HMAC = C_algo.HMAC;\n\n\t /**\n\t * Password-Based Key Derivation Function 2 algorithm.\n\t */\n\t var PBKDF2 = C_algo.PBKDF2 = Base.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t * @property {Hasher} hasher The hasher to use. Default: SHA256\n\t * @property {number} iterations The number of iterations to perform. Default: 250000\n\t */\n\t cfg: Base.extend({\n\t keySize: 128/32,\n\t hasher: SHA256,\n\t iterations: 250000\n\t }),\n\n\t /**\n\t * Initializes a newly created key derivation function.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t *\n\t * @example\n\t *\n\t * var kdf = CryptoJS.algo.PBKDF2.create();\n\t * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });\n\t * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });\n\t */\n\t init: function (cfg) {\n\t this.cfg = this.cfg.extend(cfg);\n\t },\n\n\t /**\n\t * Computes the Password-Based Key Derivation Function 2.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @example\n\t *\n\t * var key = kdf.compute(password, salt);\n\t */\n\t compute: function (password, salt) {\n\t // Shortcut\n\t var cfg = this.cfg;\n\n\t // Init HMAC\n\t var hmac = HMAC.create(cfg.hasher, password);\n\n\t // Initial values\n\t var derivedKey = WordArray.create();\n\t var blockIndex = WordArray.create([0x00000001]);\n\n\t // Shortcuts\n\t var derivedKeyWords = derivedKey.words;\n\t var blockIndexWords = blockIndex.words;\n\t var keySize = cfg.keySize;\n\t var iterations = cfg.iterations;\n\n\t // Generate key\n\t while (derivedKeyWords.length < keySize) {\n\t var block = hmac.update(salt).finalize(blockIndex);\n\t hmac.reset();\n\n\t // Shortcuts\n\t var blockWords = block.words;\n\t var blockWordsLength = blockWords.length;\n\n\t // Iterations\n\t var intermediate = block;\n\t for (var i = 1; i < iterations; i++) {\n\t intermediate = hmac.finalize(intermediate);\n\t hmac.reset();\n\n\t // Shortcut\n\t var intermediateWords = intermediate.words;\n\n\t // XOR intermediate with block\n\t for (var j = 0; j < blockWordsLength; j++) {\n\t blockWords[j] ^= intermediateWords[j];\n\t }\n\t }\n\n\t derivedKey.concat(block);\n\t blockIndexWords[0]++;\n\t }\n\t derivedKey.sigBytes = keySize * 4;\n\n\t return derivedKey;\n\t }\n\t });\n\n\t /**\n\t * Computes the Password-Based Key Derivation Function 2.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var key = CryptoJS.PBKDF2(password, salt);\n\t * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });\n\t * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });\n\t */\n\t C.PBKDF2 = function (password, salt, cfg) {\n\t return PBKDF2.create(cfg).compute(password, salt);\n\t };\n\t}());\n\n\n\treturn CryptoJS.PBKDF2;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./sha1\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./sha1\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var WordArray = C_lib.WordArray;\n\t var C_algo = C.algo;\n\t var MD5 = C_algo.MD5;\n\n\t /**\n\t * This key derivation function is meant to conform with EVP_BytesToKey.\n\t * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n\t */\n\t var EvpKDF = C_algo.EvpKDF = Base.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n\t * @property {number} iterations The number of iterations to perform. Default: 1\n\t */\n\t cfg: Base.extend({\n\t keySize: 128/32,\n\t hasher: MD5,\n\t iterations: 1\n\t }),\n\n\t /**\n\t * Initializes a newly created key derivation function.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t *\n\t * @example\n\t *\n\t * var kdf = CryptoJS.algo.EvpKDF.create();\n\t * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n\t * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n\t */\n\t init: function (cfg) {\n\t this.cfg = this.cfg.extend(cfg);\n\t },\n\n\t /**\n\t * Derives a key from a password.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @example\n\t *\n\t * var key = kdf.compute(password, salt);\n\t */\n\t compute: function (password, salt) {\n\t var block;\n\n\t // Shortcut\n\t var cfg = this.cfg;\n\n\t // Init hasher\n\t var hasher = cfg.hasher.create();\n\n\t // Initial values\n\t var derivedKey = WordArray.create();\n\n\t // Shortcuts\n\t var derivedKeyWords = derivedKey.words;\n\t var keySize = cfg.keySize;\n\t var iterations = cfg.iterations;\n\n\t // Generate key\n\t while (derivedKeyWords.length < keySize) {\n\t if (block) {\n\t hasher.update(block);\n\t }\n\t block = hasher.update(password).finalize(salt);\n\t hasher.reset();\n\n\t // Iterations\n\t for (var i = 1; i < iterations; i++) {\n\t block = hasher.finalize(block);\n\t hasher.reset();\n\t }\n\n\t derivedKey.concat(block);\n\t }\n\t derivedKey.sigBytes = keySize * 4;\n\n\t return derivedKey;\n\t }\n\t });\n\n\t /**\n\t * Derives a key from a password.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var key = CryptoJS.EvpKDF(password, salt);\n\t * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n\t * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n\t */\n\t C.EvpKDF = function (password, salt, cfg) {\n\t return EvpKDF.create(cfg).compute(password, salt);\n\t };\n\t}());\n\n\n\treturn CryptoJS.EvpKDF;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./evpkdf\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./evpkdf\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Cipher core components.\n\t */\n\tCryptoJS.lib.Cipher || (function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var WordArray = C_lib.WordArray;\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var Base64 = C_enc.Base64;\n\t var C_algo = C.algo;\n\t var EvpKDF = C_algo.EvpKDF;\n\n\t /**\n\t * Abstract base cipher template.\n\t *\n\t * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n\t * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n\t * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n\t * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n\t */\n\t var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {WordArray} iv The IV to use for this operation.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Creates this cipher in encryption mode.\n\t *\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {Cipher} A cipher instance.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n\t */\n\t createEncryptor: function (key, cfg) {\n\t return this.create(this._ENC_XFORM_MODE, key, cfg);\n\t },\n\n\t /**\n\t * Creates this cipher in decryption mode.\n\t *\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {Cipher} A cipher instance.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n\t */\n\t createDecryptor: function (key, cfg) {\n\t return this.create(this._DEC_XFORM_MODE, key, cfg);\n\t },\n\n\t /**\n\t * Initializes a newly created cipher.\n\t *\n\t * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\n\t */\n\t init: function (xformMode, key, cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Store transform mode and key\n\t this._xformMode = xformMode;\n\t this._key = key;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this cipher to its initial state.\n\t *\n\t * @example\n\t *\n\t * cipher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-cipher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Adds data to be encrypted or decrypted.\n\t *\n\t * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n\t *\n\t * @return {WordArray} The data after processing.\n\t *\n\t * @example\n\t *\n\t * var encrypted = cipher.process('data');\n\t * var encrypted = cipher.process(wordArray);\n\t */\n\t process: function (dataUpdate) {\n\t // Append\n\t this._append(dataUpdate);\n\n\t // Process available blocks\n\t return this._process();\n\t },\n\n\t /**\n\t * Finalizes the encryption or decryption process.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n\t *\n\t * @return {WordArray} The data after final processing.\n\t *\n\t * @example\n\t *\n\t * var encrypted = cipher.finalize();\n\t * var encrypted = cipher.finalize('data');\n\t * var encrypted = cipher.finalize(wordArray);\n\t */\n\t finalize: function (dataUpdate) {\n\t // Final data update\n\t if (dataUpdate) {\n\t this._append(dataUpdate);\n\t }\n\n\t // Perform concrete-cipher logic\n\t var finalProcessedData = this._doFinalize();\n\n\t return finalProcessedData;\n\t },\n\n\t keySize: 128/32,\n\n\t ivSize: 128/32,\n\n\t _ENC_XFORM_MODE: 1,\n\n\t _DEC_XFORM_MODE: 2,\n\n\t /**\n\t * Creates shortcut functions to a cipher's object interface.\n\t *\n\t * @param {Cipher} cipher The cipher to create a helper for.\n\t *\n\t * @return {Object} An object with encrypt and decrypt shortcut functions.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n\t */\n\t _createHelper: (function () {\n\t function selectCipherStrategy(key) {\n\t if (typeof key == 'string') {\n\t return PasswordBasedCipher;\n\t } else {\n\t return SerializableCipher;\n\t }\n\t }\n\n\t return function (cipher) {\n\t return {\n\t encrypt: function (message, key, cfg) {\n\t return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\n\t },\n\n\t decrypt: function (ciphertext, key, cfg) {\n\t return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\n\t }\n\t };\n\t };\n\t }())\n\t });\n\n\t /**\n\t * Abstract base stream cipher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n\t */\n\t var StreamCipher = C_lib.StreamCipher = Cipher.extend({\n\t _doFinalize: function () {\n\t // Process partial blocks\n\t var finalProcessedBlocks = this._process(!!'flush');\n\n\t return finalProcessedBlocks;\n\t },\n\n\t blockSize: 1\n\t });\n\n\t /**\n\t * Mode namespace.\n\t */\n\t var C_mode = C.mode = {};\n\n\t /**\n\t * Abstract base block cipher mode template.\n\t */\n\t var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\n\t /**\n\t * Creates this mode for encryption.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n\t */\n\t createEncryptor: function (cipher, iv) {\n\t return this.Encryptor.create(cipher, iv);\n\t },\n\n\t /**\n\t * Creates this mode for decryption.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n\t */\n\t createDecryptor: function (cipher, iv) {\n\t return this.Decryptor.create(cipher, iv);\n\t },\n\n\t /**\n\t * Initializes a newly created mode.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n\t */\n\t init: function (cipher, iv) {\n\t this._cipher = cipher;\n\t this._iv = iv;\n\t }\n\t });\n\n\t /**\n\t * Cipher Block Chaining mode.\n\t */\n\t var CBC = C_mode.CBC = (function () {\n\t /**\n\t * Abstract base CBC mode.\n\t */\n\t var CBC = BlockCipherMode.extend();\n\n\t /**\n\t * CBC encryptor.\n\t */\n\t CBC.Encryptor = CBC.extend({\n\t /**\n\t * Processes the data block at offset.\n\t *\n\t * @param {Array} words The data words to operate on.\n\t * @param {number} offset The offset where the block starts.\n\t *\n\t * @example\n\t *\n\t * mode.processBlock(data.words, offset);\n\t */\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher;\n\t var blockSize = cipher.blockSize;\n\n\t // XOR and encrypt\n\t xorBlock.call(this, words, offset, blockSize);\n\t cipher.encryptBlock(words, offset);\n\n\t // Remember this block to use with next block\n\t this._prevBlock = words.slice(offset, offset + blockSize);\n\t }\n\t });\n\n\t /**\n\t * CBC decryptor.\n\t */\n\t CBC.Decryptor = CBC.extend({\n\t /**\n\t * Processes the data block at offset.\n\t *\n\t * @param {Array} words The data words to operate on.\n\t * @param {number} offset The offset where the block starts.\n\t *\n\t * @example\n\t *\n\t * mode.processBlock(data.words, offset);\n\t */\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher;\n\t var blockSize = cipher.blockSize;\n\n\t // Remember this block to use with next block\n\t var thisBlock = words.slice(offset, offset + blockSize);\n\n\t // Decrypt and XOR\n\t cipher.decryptBlock(words, offset);\n\t xorBlock.call(this, words, offset, blockSize);\n\n\t // This block becomes the previous block\n\t this._prevBlock = thisBlock;\n\t }\n\t });\n\n\t function xorBlock(words, offset, blockSize) {\n\t var block;\n\n\t // Shortcut\n\t var iv = this._iv;\n\n\t // Choose mixing block\n\t if (iv) {\n\t block = iv;\n\n\t // Remove IV for subsequent blocks\n\t this._iv = undefined;\n\t } else {\n\t block = this._prevBlock;\n\t }\n\n\t // XOR blocks\n\t for (var i = 0; i < blockSize; i++) {\n\t words[offset + i] ^= block[i];\n\t }\n\t }\n\n\t return CBC;\n\t }());\n\n\t /**\n\t * Padding namespace.\n\t */\n\t var C_pad = C.pad = {};\n\n\t /**\n\t * PKCS #5/7 padding strategy.\n\t */\n\t var Pkcs7 = C_pad.Pkcs7 = {\n\t /**\n\t * Pads data using the algorithm defined in PKCS #5/7.\n\t *\n\t * @param {WordArray} data The data to pad.\n\t * @param {number} blockSize The multiple that the data should be padded to.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n\t */\n\t pad: function (data, blockSize) {\n\t // Shortcut\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count padding bytes\n\t var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t // Create padding word\n\t var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\n\n\t // Create padding\n\t var paddingWords = [];\n\t for (var i = 0; i < nPaddingBytes; i += 4) {\n\t paddingWords.push(paddingWord);\n\t }\n\t var padding = WordArray.create(paddingWords, nPaddingBytes);\n\n\t // Add padding\n\t data.concat(padding);\n\t },\n\n\t /**\n\t * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n\t *\n\t * @param {WordArray} data The data to unpad.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * CryptoJS.pad.Pkcs7.unpad(wordArray);\n\t */\n\t unpad: function (data) {\n\t // Get number of padding bytes from last byte\n\t var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t // Remove padding\n\t data.sigBytes -= nPaddingBytes;\n\t }\n\t };\n\n\t /**\n\t * Abstract base block cipher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n\t */\n\t var BlockCipher = C_lib.BlockCipher = Cipher.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {Mode} mode The block mode to use. Default: CBC\n\t * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n\t */\n\t cfg: Cipher.cfg.extend({\n\t mode: CBC,\n\t padding: Pkcs7\n\t }),\n\n\t reset: function () {\n\t var modeCreator;\n\n\t // Reset cipher\n\t Cipher.reset.call(this);\n\n\t // Shortcuts\n\t var cfg = this.cfg;\n\t var iv = cfg.iv;\n\t var mode = cfg.mode;\n\n\t // Reset block mode\n\t if (this._xformMode == this._ENC_XFORM_MODE) {\n\t modeCreator = mode.createEncryptor;\n\t } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t modeCreator = mode.createDecryptor;\n\t // Keep at least one block in the buffer for unpadding\n\t this._minBufferSize = 1;\n\t }\n\n\t if (this._mode && this._mode.__creator == modeCreator) {\n\t this._mode.init(this, iv && iv.words);\n\t } else {\n\t this._mode = modeCreator.call(mode, this, iv && iv.words);\n\t this._mode.__creator = modeCreator;\n\t }\n\t },\n\n\t _doProcessBlock: function (words, offset) {\n\t this._mode.processBlock(words, offset);\n\t },\n\n\t _doFinalize: function () {\n\t var finalProcessedBlocks;\n\n\t // Shortcut\n\t var padding = this.cfg.padding;\n\n\t // Finalize\n\t if (this._xformMode == this._ENC_XFORM_MODE) {\n\t // Pad data\n\t padding.pad(this._data, this.blockSize);\n\n\t // Process final blocks\n\t finalProcessedBlocks = this._process(!!'flush');\n\t } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t // Process final blocks\n\t finalProcessedBlocks = this._process(!!'flush');\n\n\t // Unpad data\n\t padding.unpad(finalProcessedBlocks);\n\t }\n\n\t return finalProcessedBlocks;\n\t },\n\n\t blockSize: 128/32\n\t });\n\n\t /**\n\t * A collection of cipher parameters.\n\t *\n\t * @property {WordArray} ciphertext The raw ciphertext.\n\t * @property {WordArray} key The key to this ciphertext.\n\t * @property {WordArray} iv The IV used in the ciphering operation.\n\t * @property {WordArray} salt The salt used with a key derivation function.\n\t * @property {Cipher} algorithm The cipher algorithm.\n\t * @property {Mode} mode The block mode used in the ciphering operation.\n\t * @property {Padding} padding The padding scheme used in the ciphering operation.\n\t * @property {number} blockSize The block size of the cipher.\n\t * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\n\t */\n\t var CipherParams = C_lib.CipherParams = Base.extend({\n\t /**\n\t * Initializes a newly created cipher params object.\n\t *\n\t * @param {Object} cipherParams An object with any of the possible cipher parameters.\n\t *\n\t * @example\n\t *\n\t * var cipherParams = CryptoJS.lib.CipherParams.create({\n\t * ciphertext: ciphertextWordArray,\n\t * key: keyWordArray,\n\t * iv: ivWordArray,\n\t * salt: saltWordArray,\n\t * algorithm: CryptoJS.algo.AES,\n\t * mode: CryptoJS.mode.CBC,\n\t * padding: CryptoJS.pad.PKCS7,\n\t * blockSize: 4,\n\t * formatter: CryptoJS.format.OpenSSL\n\t * });\n\t */\n\t init: function (cipherParams) {\n\t this.mixIn(cipherParams);\n\t },\n\n\t /**\n\t * Converts this cipher params object to a string.\n\t *\n\t * @param {Format} formatter (Optional) The formatting strategy to use.\n\t *\n\t * @return {string} The stringified cipher params.\n\t *\n\t * @throws Error If neither the formatter nor the default formatter is set.\n\t *\n\t * @example\n\t *\n\t * var string = cipherParams + '';\n\t * var string = cipherParams.toString();\n\t * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n\t */\n\t toString: function (formatter) {\n\t return (formatter || this.formatter).stringify(this);\n\t }\n\t });\n\n\t /**\n\t * Format namespace.\n\t */\n\t var C_format = C.format = {};\n\n\t /**\n\t * OpenSSL formatting strategy.\n\t */\n\t var OpenSSLFormatter = C_format.OpenSSL = {\n\t /**\n\t * Converts a cipher params object to an OpenSSL-compatible string.\n\t *\n\t * @param {CipherParams} cipherParams The cipher params object.\n\t *\n\t * @return {string} The OpenSSL-compatible string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n\t */\n\t stringify: function (cipherParams) {\n\t var wordArray;\n\n\t // Shortcuts\n\t var ciphertext = cipherParams.ciphertext;\n\t var salt = cipherParams.salt;\n\n\t // Format\n\t if (salt) {\n\t wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n\t } else {\n\t wordArray = ciphertext;\n\t }\n\n\t return wordArray.toString(Base64);\n\t },\n\n\t /**\n\t * Converts an OpenSSL-compatible string to a cipher params object.\n\t *\n\t * @param {string} openSSLStr The OpenSSL-compatible string.\n\t *\n\t * @return {CipherParams} The cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n\t */\n\t parse: function (openSSLStr) {\n\t var salt;\n\n\t // Parse base64\n\t var ciphertext = Base64.parse(openSSLStr);\n\n\t // Shortcut\n\t var ciphertextWords = ciphertext.words;\n\n\t // Test for salt\n\t if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\n\t // Extract salt\n\t salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n\t // Remove salt from ciphertext\n\t ciphertextWords.splice(0, 4);\n\t ciphertext.sigBytes -= 16;\n\t }\n\n\t return CipherParams.create({ ciphertext: ciphertext, salt: salt });\n\t }\n\t };\n\n\t /**\n\t * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n\t */\n\t var SerializableCipher = C_lib.SerializableCipher = Base.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\n\t */\n\t cfg: Base.extend({\n\t format: OpenSSLFormatter\n\t }),\n\n\t /**\n\t * Encrypts a message.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {WordArray|string} message The message to encrypt.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {CipherParams} A cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t */\n\t encrypt: function (cipher, message, key, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Encrypt\n\t var encryptor = cipher.createEncryptor(key, cfg);\n\t var ciphertext = encryptor.finalize(message);\n\n\t // Shortcut\n\t var cipherCfg = encryptor.cfg;\n\n\t // Create and return serializable cipher params\n\t return CipherParams.create({\n\t ciphertext: ciphertext,\n\t key: key,\n\t iv: cipherCfg.iv,\n\t algorithm: cipher,\n\t mode: cipherCfg.mode,\n\t padding: cipherCfg.padding,\n\t blockSize: cipher.blockSize,\n\t formatter: cfg.format\n\t });\n\t },\n\n\t /**\n\t * Decrypts serialized ciphertext.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {WordArray} The plaintext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t */\n\t decrypt: function (cipher, ciphertext, key, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Convert string to CipherParams\n\t ciphertext = this._parse(ciphertext, cfg.format);\n\n\t // Decrypt\n\t var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\n\n\t return plaintext;\n\t },\n\n\t /**\n\t * Converts serialized ciphertext to CipherParams,\n\t * else assumed CipherParams already and returns ciphertext unchanged.\n\t *\n\t * @param {CipherParams|string} ciphertext The ciphertext.\n\t * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n\t *\n\t * @return {CipherParams} The unserialized ciphertext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\n\t */\n\t _parse: function (ciphertext, format) {\n\t if (typeof ciphertext == 'string') {\n\t return format.parse(ciphertext, this);\n\t } else {\n\t return ciphertext;\n\t }\n\t }\n\t });\n\n\t /**\n\t * Key derivation function namespace.\n\t */\n\t var C_kdf = C.kdf = {};\n\n\t /**\n\t * OpenSSL key derivation function.\n\t */\n\t var OpenSSLKdf = C_kdf.OpenSSL = {\n\t /**\n\t * Derives a key and IV from a password.\n\t *\n\t * @param {string} password The password to derive from.\n\t * @param {number} keySize The size in words of the key to generate.\n\t * @param {number} ivSize The size in words of the IV to generate.\n\t * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n\t *\n\t * @return {CipherParams} A cipher params object with the key, IV, and salt.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n\t * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n\t */\n\t execute: function (password, keySize, ivSize, salt, hasher) {\n\t // Generate random salt\n\t if (!salt) {\n\t salt = WordArray.random(64/8);\n\t }\n\n\t // Derive key and IV\n\t if (!hasher) {\n\t var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\n\t } else {\n\t var key = EvpKDF.create({ keySize: keySize + ivSize, hasher: hasher }).compute(password, salt);\n\t }\n\n\n\t // Separate key and IV\n\t var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n\t key.sigBytes = keySize * 4;\n\n\t // Return params\n\t return CipherParams.create({ key: key, iv: iv, salt: salt });\n\t }\n\t };\n\n\t /**\n\t * A serializable cipher wrapper that derives the key from a password,\n\t * and returns ciphertext as a serializable cipher params object.\n\t */\n\t var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\n\t */\n\t cfg: SerializableCipher.cfg.extend({\n\t kdf: OpenSSLKdf\n\t }),\n\n\t /**\n\t * Encrypts a message using a password.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {WordArray|string} message The message to encrypt.\n\t * @param {string} password The password.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {CipherParams} A cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\n\t * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n\t */\n\t encrypt: function (cipher, message, password, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Derive key and other params\n\t var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, cfg.salt, cfg.hasher);\n\n\t // Add IV to config\n\t cfg.iv = derivedParams.iv;\n\n\t // Encrypt\n\t var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\n\n\t // Mix in derived params\n\t ciphertext.mixIn(derivedParams);\n\n\t return ciphertext;\n\t },\n\n\t /**\n\t * Decrypts serialized ciphertext using a password.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t * @param {string} password The password.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {WordArray} The plaintext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\n\t * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\n\t */\n\t decrypt: function (cipher, ciphertext, password, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Convert string to CipherParams\n\t ciphertext = this._parse(ciphertext, cfg.format);\n\n\t // Derive key and other params\n\t var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt, cfg.hasher);\n\n\t // Add IV to config\n\t cfg.iv = derivedParams.iv;\n\n\t // Decrypt\n\t var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\n\n\t return plaintext;\n\t }\n\t });\n\t}());\n\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Cipher Feedback block mode.\n\t */\n\tCryptoJS.mode.CFB = (function () {\n\t var CFB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t CFB.Encryptor = CFB.extend({\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher;\n\t var blockSize = cipher.blockSize;\n\n\t generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\n\n\t // Remember this block to use with next block\n\t this._prevBlock = words.slice(offset, offset + blockSize);\n\t }\n\t });\n\n\t CFB.Decryptor = CFB.extend({\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher;\n\t var blockSize = cipher.blockSize;\n\n\t // Remember this block to use with next block\n\t var thisBlock = words.slice(offset, offset + blockSize);\n\n\t generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\n\n\t // This block becomes the previous block\n\t this._prevBlock = thisBlock;\n\t }\n\t });\n\n\t function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {\n\t var keystream;\n\n\t // Shortcut\n\t var iv = this._iv;\n\n\t // Generate keystream\n\t if (iv) {\n\t keystream = iv.slice(0);\n\n\t // Remove IV for subsequent blocks\n\t this._iv = undefined;\n\t } else {\n\t keystream = this._prevBlock;\n\t }\n\t cipher.encryptBlock(keystream, 0);\n\n\t // Encrypt\n\t for (var i = 0; i < blockSize; i++) {\n\t words[offset + i] ^= keystream[i];\n\t }\n\t }\n\n\t return CFB;\n\t}());\n\n\n\treturn CryptoJS.mode.CFB;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Counter block mode.\n\t */\n\tCryptoJS.mode.CTR = (function () {\n\t var CTR = CryptoJS.lib.BlockCipherMode.extend();\n\n\t var Encryptor = CTR.Encryptor = CTR.extend({\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher\n\t var blockSize = cipher.blockSize;\n\t var iv = this._iv;\n\t var counter = this._counter;\n\n\t // Generate keystream\n\t if (iv) {\n\t counter = this._counter = iv.slice(0);\n\n\t // Remove IV for subsequent blocks\n\t this._iv = undefined;\n\t }\n\t var keystream = counter.slice(0);\n\t cipher.encryptBlock(keystream, 0);\n\n\t // Increment counter\n\t counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0\n\n\t // Encrypt\n\t for (var i = 0; i < blockSize; i++) {\n\t words[offset + i] ^= keystream[i];\n\t }\n\t }\n\t });\n\n\t CTR.Decryptor = Encryptor;\n\n\t return CTR;\n\t}());\n\n\n\treturn CryptoJS.mode.CTR;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/** @preserve\n\t * Counter block mode compatible with Dr Brian Gladman fileenc.c\n\t * derived from CryptoJS.mode.CTR\n\t * Jan Hruby jhruby.web@gmail.com\n\t */\n\tCryptoJS.mode.CTRGladman = (function () {\n\t var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();\n\n\t\tfunction incWord(word)\n\t\t{\n\t\t\tif (((word >> 24) & 0xff) === 0xff) { //overflow\n\t\t\tvar b1 = (word >> 16)&0xff;\n\t\t\tvar b2 = (word >> 8)&0xff;\n\t\t\tvar b3 = word & 0xff;\n\n\t\t\tif (b1 === 0xff) // overflow b1\n\t\t\t{\n\t\t\tb1 = 0;\n\t\t\tif (b2 === 0xff)\n\t\t\t{\n\t\t\t\tb2 = 0;\n\t\t\t\tif (b3 === 0xff)\n\t\t\t\t{\n\t\t\t\t\tb3 = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t++b3;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t++b2;\n\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t++b1;\n\t\t\t}\n\n\t\t\tword = 0;\n\t\t\tword += (b1 << 16);\n\t\t\tword += (b2 << 8);\n\t\t\tword += b3;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\tword += (0x01 << 24);\n\t\t\t}\n\t\t\treturn word;\n\t\t}\n\n\t\tfunction incCounter(counter)\n\t\t{\n\t\t\tif ((counter[0] = incWord(counter[0])) === 0)\n\t\t\t{\n\t\t\t\t// encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8\n\t\t\t\tcounter[1] = incWord(counter[1]);\n\t\t\t}\n\t\t\treturn counter;\n\t\t}\n\n\t var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher\n\t var blockSize = cipher.blockSize;\n\t var iv = this._iv;\n\t var counter = this._counter;\n\n\t // Generate keystream\n\t if (iv) {\n\t counter = this._counter = iv.slice(0);\n\n\t // Remove IV for subsequent blocks\n\t this._iv = undefined;\n\t }\n\n\t\t\t\tincCounter(counter);\n\n\t\t\t\tvar keystream = counter.slice(0);\n\t cipher.encryptBlock(keystream, 0);\n\n\t // Encrypt\n\t for (var i = 0; i < blockSize; i++) {\n\t words[offset + i] ^= keystream[i];\n\t }\n\t }\n\t });\n\n\t CTRGladman.Decryptor = Encryptor;\n\n\t return CTRGladman;\n\t}());\n\n\n\n\n\treturn CryptoJS.mode.CTRGladman;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Output Feedback block mode.\n\t */\n\tCryptoJS.mode.OFB = (function () {\n\t var OFB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t var Encryptor = OFB.Encryptor = OFB.extend({\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher\n\t var blockSize = cipher.blockSize;\n\t var iv = this._iv;\n\t var keystream = this._keystream;\n\n\t // Generate keystream\n\t if (iv) {\n\t keystream = this._keystream = iv.slice(0);\n\n\t // Remove IV for subsequent blocks\n\t this._iv = undefined;\n\t }\n\t cipher.encryptBlock(keystream, 0);\n\n\t // Encrypt\n\t for (var i = 0; i < blockSize; i++) {\n\t words[offset + i] ^= keystream[i];\n\t }\n\t }\n\t });\n\n\t OFB.Decryptor = Encryptor;\n\n\t return OFB;\n\t}());\n\n\n\treturn CryptoJS.mode.OFB;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Electronic Codebook block mode.\n\t */\n\tCryptoJS.mode.ECB = (function () {\n\t var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t ECB.Encryptor = ECB.extend({\n\t processBlock: function (words, offset) {\n\t this._cipher.encryptBlock(words, offset);\n\t }\n\t });\n\n\t ECB.Decryptor = ECB.extend({\n\t processBlock: function (words, offset) {\n\t this._cipher.decryptBlock(words, offset);\n\t }\n\t });\n\n\t return ECB;\n\t}());\n\n\n\treturn CryptoJS.mode.ECB;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * ANSI X.923 padding strategy.\n\t */\n\tCryptoJS.pad.AnsiX923 = {\n\t pad: function (data, blockSize) {\n\t // Shortcuts\n\t var dataSigBytes = data.sigBytes;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count padding bytes\n\t var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;\n\n\t // Compute last byte position\n\t var lastBytePos = dataSigBytes + nPaddingBytes - 1;\n\n\t // Pad\n\t data.clamp();\n\t data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);\n\t data.sigBytes += nPaddingBytes;\n\t },\n\n\t unpad: function (data) {\n\t // Get number of padding bytes from last byte\n\t var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t // Remove padding\n\t data.sigBytes -= nPaddingBytes;\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.Ansix923;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * ISO 10126 padding strategy.\n\t */\n\tCryptoJS.pad.Iso10126 = {\n\t pad: function (data, blockSize) {\n\t // Shortcut\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count padding bytes\n\t var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t // Pad\n\t data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).\n\t concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));\n\t },\n\n\t unpad: function (data) {\n\t // Get number of padding bytes from last byte\n\t var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t // Remove padding\n\t data.sigBytes -= nPaddingBytes;\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.Iso10126;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * ISO/IEC 9797-1 Padding Method 2.\n\t */\n\tCryptoJS.pad.Iso97971 = {\n\t pad: function (data, blockSize) {\n\t // Add 0x80 byte\n\t data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));\n\n\t // Zero pad the rest\n\t CryptoJS.pad.ZeroPadding.pad(data, blockSize);\n\t },\n\n\t unpad: function (data) {\n\t // Remove zero padding\n\t CryptoJS.pad.ZeroPadding.unpad(data);\n\n\t // Remove one more byte -- the 0x80 byte\n\t data.sigBytes--;\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.Iso97971;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Zero padding strategy.\n\t */\n\tCryptoJS.pad.ZeroPadding = {\n\t pad: function (data, blockSize) {\n\t // Shortcut\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Pad\n\t data.clamp();\n\t data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);\n\t },\n\n\t unpad: function (data) {\n\t // Shortcut\n\t var dataWords = data.words;\n\n\t // Unpad\n\t var i = data.sigBytes - 1;\n\t for (var i = data.sigBytes - 1; i >= 0; i--) {\n\t if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {\n\t data.sigBytes = i + 1;\n\t break;\n\t }\n\t }\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.ZeroPadding;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * A noop padding strategy.\n\t */\n\tCryptoJS.pad.NoPadding = {\n\t pad: function () {\n\t },\n\n\t unpad: function () {\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.NoPadding;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var CipherParams = C_lib.CipherParams;\n\t var C_enc = C.enc;\n\t var Hex = C_enc.Hex;\n\t var C_format = C.format;\n\n\t var HexFormatter = C_format.Hex = {\n\t /**\n\t * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.\n\t *\n\t * @param {CipherParams} cipherParams The cipher params object.\n\t *\n\t * @return {string} The hexadecimally encoded string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hexString = CryptoJS.format.Hex.stringify(cipherParams);\n\t */\n\t stringify: function (cipherParams) {\n\t return cipherParams.ciphertext.toString(Hex);\n\t },\n\n\t /**\n\t * Converts a hexadecimally encoded ciphertext string to a cipher params object.\n\t *\n\t * @param {string} input The hexadecimally encoded string.\n\t *\n\t * @return {CipherParams} The cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipherParams = CryptoJS.format.Hex.parse(hexString);\n\t */\n\t parse: function (input) {\n\t var ciphertext = Hex.parse(input);\n\t return CipherParams.create({ ciphertext: ciphertext });\n\t }\n\t };\n\t}());\n\n\n\treturn CryptoJS.format.Hex;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var BlockCipher = C_lib.BlockCipher;\n\t var C_algo = C.algo;\n\n\t // Lookup tables\n\t var SBOX = [];\n\t var INV_SBOX = [];\n\t var SUB_MIX_0 = [];\n\t var SUB_MIX_1 = [];\n\t var SUB_MIX_2 = [];\n\t var SUB_MIX_3 = [];\n\t var INV_SUB_MIX_0 = [];\n\t var INV_SUB_MIX_1 = [];\n\t var INV_SUB_MIX_2 = [];\n\t var INV_SUB_MIX_3 = [];\n\n\t // Compute lookup tables\n\t (function () {\n\t // Compute double table\n\t var d = [];\n\t for (var i = 0; i < 256; i++) {\n\t if (i < 128) {\n\t d[i] = i << 1;\n\t } else {\n\t d[i] = (i << 1) ^ 0x11b;\n\t }\n\t }\n\n\t // Walk GF(2^8)\n\t var x = 0;\n\t var xi = 0;\n\t for (var i = 0; i < 256; i++) {\n\t // Compute sbox\n\t var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n\t sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n\t SBOX[x] = sx;\n\t INV_SBOX[sx] = x;\n\n\t // Compute multiplication\n\t var x2 = d[x];\n\t var x4 = d[x2];\n\t var x8 = d[x4];\n\n\t // Compute sub bytes, mix columns tables\n\t var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n\t SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n\t SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n\t SUB_MIX_2[x] = (t << 8) | (t >>> 24);\n\t SUB_MIX_3[x] = t;\n\n\t // Compute inv sub bytes, inv mix columns tables\n\t var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n\t INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n\t INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n\t INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\n\t INV_SUB_MIX_3[sx] = t;\n\n\t // Compute next counter\n\t if (!x) {\n\t x = xi = 1;\n\t } else {\n\t x = x2 ^ d[d[d[x8 ^ x2]]];\n\t xi ^= d[d[xi]];\n\t }\n\t }\n\t }());\n\n\t // Precomputed Rcon lookup\n\t var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n\t /**\n\t * AES block cipher algorithm.\n\t */\n\t var AES = C_algo.AES = BlockCipher.extend({\n\t _doReset: function () {\n\t var t;\n\n\t // Skip reset of nRounds has been set before and key did not change\n\t if (this._nRounds && this._keyPriorReset === this._key) {\n\t return;\n\t }\n\n\t // Shortcuts\n\t var key = this._keyPriorReset = this._key;\n\t var keyWords = key.words;\n\t var keySize = key.sigBytes / 4;\n\n\t // Compute number of rounds\n\t var nRounds = this._nRounds = keySize + 6;\n\n\t // Compute number of key schedule rows\n\t var ksRows = (nRounds + 1) * 4;\n\n\t // Compute key schedule\n\t var keySchedule = this._keySchedule = [];\n\t for (var ksRow = 0; ksRow < ksRows; ksRow++) {\n\t if (ksRow < keySize) {\n\t keySchedule[ksRow] = keyWords[ksRow];\n\t } else {\n\t t = keySchedule[ksRow - 1];\n\n\t if (!(ksRow % keySize)) {\n\t // Rot word\n\t t = (t << 8) | (t >>> 24);\n\n\t // Sub word\n\t t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\n\t // Mix Rcon\n\t t ^= RCON[(ksRow / keySize) | 0] << 24;\n\t } else if (keySize > 6 && ksRow % keySize == 4) {\n\t // Sub word\n\t t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\t }\n\n\t keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n\t }\n\t }\n\n\t // Compute inv key schedule\n\t var invKeySchedule = this._invKeySchedule = [];\n\t for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\n\t var ksRow = ksRows - invKsRow;\n\n\t if (invKsRow % 4) {\n\t var t = keySchedule[ksRow];\n\t } else {\n\t var t = keySchedule[ksRow - 4];\n\t }\n\n\t if (invKsRow < 4 || ksRow <= 4) {\n\t invKeySchedule[invKsRow] = t;\n\t } else {\n\t invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\n\t INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];\n\t }\n\t }\n\t },\n\n\t encryptBlock: function (M, offset) {\n\t this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\n\t },\n\n\t decryptBlock: function (M, offset) {\n\t // Swap 2nd and 4th rows\n\t var t = M[offset + 1];\n\t M[offset + 1] = M[offset + 3];\n\t M[offset + 3] = t;\n\n\t this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\n\n\t // Inv swap 2nd and 4th rows\n\t var t = M[offset + 1];\n\t M[offset + 1] = M[offset + 3];\n\t M[offset + 3] = t;\n\t },\n\n\t _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n\t // Shortcut\n\t var nRounds = this._nRounds;\n\n\t // Get input, add round key\n\t var s0 = M[offset] ^ keySchedule[0];\n\t var s1 = M[offset + 1] ^ keySchedule[1];\n\t var s2 = M[offset + 2] ^ keySchedule[2];\n\t var s3 = M[offset + 3] ^ keySchedule[3];\n\n\t // Key schedule row counter\n\t var ksRow = 4;\n\n\t // Rounds\n\t for (var round = 1; round < nRounds; round++) {\n\t // Shift rows, sub bytes, mix columns, add round key\n\t var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\n\t var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\n\t var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\n\t var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\n\n\t // Update state\n\t s0 = t0;\n\t s1 = t1;\n\t s2 = t2;\n\t s3 = t3;\n\t }\n\n\t // Shift rows, sub bytes, add round key\n\t var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\n\t var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\n\t var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\n\t var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\n\n\t // Set output\n\t M[offset] = t0;\n\t M[offset + 1] = t1;\n\t M[offset + 2] = t2;\n\t M[offset + 3] = t3;\n\t },\n\n\t keySize: 256/32\n\t });\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n\t */\n\t C.AES = BlockCipher._createHelper(AES);\n\t}());\n\n\n\treturn CryptoJS.AES;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var BlockCipher = C_lib.BlockCipher;\n\t var C_algo = C.algo;\n\n\t // Permuted Choice 1 constants\n\t var PC1 = [\n\t 57, 49, 41, 33, 25, 17, 9, 1,\n\t 58, 50, 42, 34, 26, 18, 10, 2,\n\t 59, 51, 43, 35, 27, 19, 11, 3,\n\t 60, 52, 44, 36, 63, 55, 47, 39,\n\t 31, 23, 15, 7, 62, 54, 46, 38,\n\t 30, 22, 14, 6, 61, 53, 45, 37,\n\t 29, 21, 13, 5, 28, 20, 12, 4\n\t ];\n\n\t // Permuted Choice 2 constants\n\t var PC2 = [\n\t 14, 17, 11, 24, 1, 5,\n\t 3, 28, 15, 6, 21, 10,\n\t 23, 19, 12, 4, 26, 8,\n\t 16, 7, 27, 20, 13, 2,\n\t 41, 52, 31, 37, 47, 55,\n\t 30, 40, 51, 45, 33, 48,\n\t 44, 49, 39, 56, 34, 53,\n\t 46, 42, 50, 36, 29, 32\n\t ];\n\n\t // Cumulative bit shift constants\n\t var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];\n\n\t // SBOXes and round permutation constants\n\t var SBOX_P = [\n\t {\n\t 0x0: 0x808200,\n\t 0x10000000: 0x8000,\n\t 0x20000000: 0x808002,\n\t 0x30000000: 0x2,\n\t 0x40000000: 0x200,\n\t 0x50000000: 0x808202,\n\t 0x60000000: 0x800202,\n\t 0x70000000: 0x800000,\n\t 0x80000000: 0x202,\n\t 0x90000000: 0x800200,\n\t 0xa0000000: 0x8200,\n\t 0xb0000000: 0x808000,\n\t 0xc0000000: 0x8002,\n\t 0xd0000000: 0x800002,\n\t 0xe0000000: 0x0,\n\t 0xf0000000: 0x8202,\n\t 0x8000000: 0x0,\n\t 0x18000000: 0x808202,\n\t 0x28000000: 0x8202,\n\t 0x38000000: 0x8000,\n\t 0x48000000: 0x808200,\n\t 0x58000000: 0x200,\n\t 0x68000000: 0x808002,\n\t 0x78000000: 0x2,\n\t 0x88000000: 0x800200,\n\t 0x98000000: 0x8200,\n\t 0xa8000000: 0x808000,\n\t 0xb8000000: 0x800202,\n\t 0xc8000000: 0x800002,\n\t 0xd8000000: 0x8002,\n\t 0xe8000000: 0x202,\n\t 0xf8000000: 0x800000,\n\t 0x1: 0x8000,\n\t 0x10000001: 0x2,\n\t 0x20000001: 0x808200,\n\t 0x30000001: 0x800000,\n\t 0x40000001: 0x808002,\n\t 0x50000001: 0x8200,\n\t 0x60000001: 0x200,\n\t 0x70000001: 0x800202,\n\t 0x80000001: 0x808202,\n\t 0x90000001: 0x808000,\n\t 0xa0000001: 0x800002,\n\t 0xb0000001: 0x8202,\n\t 0xc0000001: 0x202,\n\t 0xd0000001: 0x800200,\n\t 0xe0000001: 0x8002,\n\t 0xf0000001: 0x0,\n\t 0x8000001: 0x808202,\n\t 0x18000001: 0x808000,\n\t 0x28000001: 0x800000,\n\t 0x38000001: 0x200,\n\t 0x48000001: 0x8000,\n\t 0x58000001: 0x800002,\n\t 0x68000001: 0x2,\n\t 0x78000001: 0x8202,\n\t 0x88000001: 0x8002,\n\t 0x98000001: 0x800202,\n\t 0xa8000001: 0x202,\n\t 0xb8000001: 0x808200,\n\t 0xc8000001: 0x800200,\n\t 0xd8000001: 0x0,\n\t 0xe8000001: 0x8200,\n\t 0xf8000001: 0x808002\n\t },\n\t {\n\t 0x0: 0x40084010,\n\t 0x1000000: 0x4000,\n\t 0x2000000: 0x80000,\n\t 0x3000000: 0x40080010,\n\t 0x4000000: 0x40000010,\n\t 0x5000000: 0x40084000,\n\t 0x6000000: 0x40004000,\n\t 0x7000000: 0x10,\n\t 0x8000000: 0x84000,\n\t 0x9000000: 0x40004010,\n\t 0xa000000: 0x40000000,\n\t 0xb000000: 0x84010,\n\t 0xc000000: 0x80010,\n\t 0xd000000: 0x0,\n\t 0xe000000: 0x4010,\n\t 0xf000000: 0x40080000,\n\t 0x800000: 0x40004000,\n\t 0x1800000: 0x84010,\n\t 0x2800000: 0x10,\n\t 0x3800000: 0x40004010,\n\t 0x4800000: 0x40084010,\n\t 0x5800000: 0x40000000,\n\t 0x6800000: 0x80000,\n\t 0x7800000: 0x40080010,\n\t 0x8800000: 0x80010,\n\t 0x9800000: 0x0,\n\t 0xa800000: 0x4000,\n\t 0xb800000: 0x40080000,\n\t 0xc800000: 0x40000010,\n\t 0xd800000: 0x84000,\n\t 0xe800000: 0x40084000,\n\t 0xf800000: 0x4010,\n\t 0x10000000: 0x0,\n\t 0x11000000: 0x40080010,\n\t 0x12000000: 0x40004010,\n\t 0x13000000: 0x40084000,\n\t 0x14000000: 0x40080000,\n\t 0x15000000: 0x10,\n\t 0x16000000: 0x84010,\n\t 0x17000000: 0x4000,\n\t 0x18000000: 0x4010,\n\t 0x19000000: 0x80000,\n\t 0x1a000000: 0x80010,\n\t 0x1b000000: 0x40000010,\n\t 0x1c000000: 0x84000,\n\t 0x1d000000: 0x40004000,\n\t 0x1e000000: 0x40000000,\n\t 0x1f000000: 0x40084010,\n\t 0x10800000: 0x84010,\n\t 0x11800000: 0x80000,\n\t 0x12800000: 0x40080000,\n\t 0x13800000: 0x4000,\n\t 0x14800000: 0x40004000,\n\t 0x15800000: 0x40084010,\n\t 0x16800000: 0x10,\n\t 0x17800000: 0x40000000,\n\t 0x18800000: 0x40084000,\n\t 0x19800000: 0x40000010,\n\t 0x1a800000: 0x40004010,\n\t 0x1b800000: 0x80010,\n\t 0x1c800000: 0x0,\n\t 0x1d800000: 0x4010,\n\t 0x1e800000: 0x40080010,\n\t 0x1f800000: 0x84000\n\t },\n\t {\n\t 0x0: 0x104,\n\t 0x100000: 0x0,\n\t 0x200000: 0x4000100,\n\t 0x300000: 0x10104,\n\t 0x400000: 0x10004,\n\t 0x500000: 0x4000004,\n\t 0x600000: 0x4010104,\n\t 0x700000: 0x4010000,\n\t 0x800000: 0x4000000,\n\t 0x900000: 0x4010100,\n\t 0xa00000: 0x10100,\n\t 0xb00000: 0x4010004,\n\t 0xc00000: 0x4000104,\n\t 0xd00000: 0x10000,\n\t 0xe00000: 0x4,\n\t 0xf00000: 0x100,\n\t 0x80000: 0x4010100,\n\t 0x180000: 0x4010004,\n\t 0x280000: 0x0,\n\t 0x380000: 0x4000100,\n\t 0x480000: 0x4000004,\n\t 0x580000: 0x10000,\n\t 0x680000: 0x10004,\n\t 0x780000: 0x104,\n\t 0x880000: 0x4,\n\t 0x980000: 0x100,\n\t 0xa80000: 0x4010000,\n\t 0xb80000: 0x10104,\n\t 0xc80000: 0x10100,\n\t 0xd80000: 0x4000104,\n\t 0xe80000: 0x4010104,\n\t 0xf80000: 0x4000000,\n\t 0x1000000: 0x4010100,\n\t 0x1100000: 0x10004,\n\t 0x1200000: 0x10000,\n\t 0x1300000: 0x4000100,\n\t 0x1400000: 0x100,\n\t 0x1500000: 0x4010104,\n\t 0x1600000: 0x4000004,\n\t 0x1700000: 0x0,\n\t 0x1800000: 0x4000104,\n\t 0x1900000: 0x4000000,\n\t 0x1a00000: 0x4,\n\t 0x1b00000: 0x10100,\n\t 0x1c00000: 0x4010000,\n\t 0x1d00000: 0x104,\n\t 0x1e00000: 0x10104,\n\t 0x1f00000: 0x4010004,\n\t 0x1080000: 0x4000000,\n\t 0x1180000: 0x104,\n\t 0x1280000: 0x4010100,\n\t 0x1380000: 0x0,\n\t 0x1480000: 0x10004,\n\t 0x1580000: 0x4000100,\n\t 0x1680000: 0x100,\n\t 0x1780000: 0x4010004,\n\t 0x1880000: 0x10000,\n\t 0x1980000: 0x4010104,\n\t 0x1a80000: 0x10104,\n\t 0x1b80000: 0x4000004,\n\t 0x1c80000: 0x4000104,\n\t 0x1d80000: 0x4010000,\n\t 0x1e80000: 0x4,\n\t 0x1f80000: 0x10100\n\t },\n\t {\n\t 0x0: 0x80401000,\n\t 0x10000: 0x80001040,\n\t 0x20000: 0x401040,\n\t 0x30000: 0x80400000,\n\t 0x40000: 0x0,\n\t 0x50000: 0x401000,\n\t 0x60000: 0x80000040,\n\t 0x70000: 0x400040,\n\t 0x80000: 0x80000000,\n\t 0x90000: 0x400000,\n\t 0xa0000: 0x40,\n\t 0xb0000: 0x80001000,\n\t 0xc0000: 0x80400040,\n\t 0xd0000: 0x1040,\n\t 0xe0000: 0x1000,\n\t 0xf0000: 0x80401040,\n\t 0x8000: 0x80001040,\n\t 0x18000: 0x40,\n\t 0x28000: 0x80400040,\n\t 0x38000: 0x80001000,\n\t 0x48000: 0x401000,\n\t 0x58000: 0x80401040,\n\t 0x68000: 0x0,\n\t 0x78000: 0x80400000,\n\t 0x88000: 0x1000,\n\t 0x98000: 0x80401000,\n\t 0xa8000: 0x400000,\n\t 0xb8000: 0x1040,\n\t 0xc8000: 0x80000000,\n\t 0xd8000: 0x400040,\n\t 0xe8000: 0x401040,\n\t 0xf8000: 0x80000040,\n\t 0x100000: 0x400040,\n\t 0x110000: 0x401000,\n\t 0x120000: 0x80000040,\n\t 0x130000: 0x0,\n\t 0x140000: 0x1040,\n\t 0x150000: 0x80400040,\n\t 0x160000: 0x80401000,\n\t 0x170000: 0x80001040,\n\t 0x180000: 0x80401040,\n\t 0x190000: 0x80000000,\n\t 0x1a0000: 0x80400000,\n\t 0x1b0000: 0x401040,\n\t 0x1c0000: 0x80001000,\n\t 0x1d0000: 0x400000,\n\t 0x1e0000: 0x40,\n\t 0x1f0000: 0x1000,\n\t 0x108000: 0x80400000,\n\t 0x118000: 0x80401040,\n\t 0x128000: 0x0,\n\t 0x138000: 0x401000,\n\t 0x148000: 0x400040,\n\t 0x158000: 0x80000000,\n\t 0x168000: 0x80001040,\n\t 0x178000: 0x40,\n\t 0x188000: 0x80000040,\n\t 0x198000: 0x1000,\n\t 0x1a8000: 0x80001000,\n\t 0x1b8000: 0x80400040,\n\t 0x1c8000: 0x1040,\n\t 0x1d8000: 0x80401000,\n\t 0x1e8000: 0x400000,\n\t 0x1f8000: 0x401040\n\t },\n\t {\n\t 0x0: 0x80,\n\t 0x1000: 0x1040000,\n\t 0x2000: 0x40000,\n\t 0x3000: 0x20000000,\n\t 0x4000: 0x20040080,\n\t 0x5000: 0x1000080,\n\t 0x6000: 0x21000080,\n\t 0x7000: 0x40080,\n\t 0x8000: 0x1000000,\n\t 0x9000: 0x20040000,\n\t 0xa000: 0x20000080,\n\t 0xb000: 0x21040080,\n\t 0xc000: 0x21040000,\n\t 0xd000: 0x0,\n\t 0xe000: 0x1040080,\n\t 0xf000: 0x21000000,\n\t 0x800: 0x1040080,\n\t 0x1800: 0x21000080,\n\t 0x2800: 0x80,\n\t 0x3800: 0x1040000,\n\t 0x4800: 0x40000,\n\t 0x5800: 0x20040080,\n\t 0x6800: 0x21040000,\n\t 0x7800: 0x20000000,\n\t 0x8800: 0x20040000,\n\t 0x9800: 0x0,\n\t 0xa800: 0x21040080,\n\t 0xb800: 0x1000080,\n\t 0xc800: 0x20000080,\n\t 0xd800: 0x21000000,\n\t 0xe800: 0x1000000,\n\t 0xf800: 0x40080,\n\t 0x10000: 0x40000,\n\t 0x11000: 0x80,\n\t 0x12000: 0x20000000,\n\t 0x13000: 0x21000080,\n\t 0x14000: 0x1000080,\n\t 0x15000: 0x21040000,\n\t 0x16000: 0x20040080,\n\t 0x17000: 0x1000000,\n\t 0x18000: 0x21040080,\n\t 0x19000: 0x21000000,\n\t 0x1a000: 0x1040000,\n\t 0x1b000: 0x20040000,\n\t 0x1c000: 0x40080,\n\t 0x1d000: 0x20000080,\n\t 0x1e000: 0x0,\n\t 0x1f000: 0x1040080,\n\t 0x10800: 0x21000080,\n\t 0x11800: 0x1000000,\n\t 0x12800: 0x1040000,\n\t 0x13800: 0x20040080,\n\t 0x14800: 0x20000000,\n\t 0x15800: 0x1040080,\n\t 0x16800: 0x80,\n\t 0x17800: 0x21040000,\n\t 0x18800: 0x40080,\n\t 0x19800: 0x21040080,\n\t 0x1a800: 0x0,\n\t 0x1b800: 0x21000000,\n\t 0x1c800: 0x1000080,\n\t 0x1d800: 0x40000,\n\t 0x1e800: 0x20040000,\n\t 0x1f800: 0x20000080\n\t },\n\t {\n\t 0x0: 0x10000008,\n\t 0x100: 0x2000,\n\t 0x200: 0x10200000,\n\t 0x300: 0x10202008,\n\t 0x400: 0x10002000,\n\t 0x500: 0x200000,\n\t 0x600: 0x200008,\n\t 0x700: 0x10000000,\n\t 0x800: 0x0,\n\t 0x900: 0x10002008,\n\t 0xa00: 0x202000,\n\t 0xb00: 0x8,\n\t 0xc00: 0x10200008,\n\t 0xd00: 0x202008,\n\t 0xe00: 0x2008,\n\t 0xf00: 0x10202000,\n\t 0x80: 0x10200000,\n\t 0x180: 0x10202008,\n\t 0x280: 0x8,\n\t 0x380: 0x200000,\n\t 0x480: 0x202008,\n\t 0x580: 0x10000008,\n\t 0x680: 0x10002000,\n\t 0x780: 0x2008,\n\t 0x880: 0x200008,\n\t 0x980: 0x2000,\n\t 0xa80: 0x10002008,\n\t 0xb80: 0x10200008,\n\t 0xc80: 0x0,\n\t 0xd80: 0x10202000,\n\t 0xe80: 0x202000,\n\t 0xf80: 0x10000000,\n\t 0x1000: 0x10002000,\n\t 0x1100: 0x10200008,\n\t 0x1200: 0x10202008,\n\t 0x1300: 0x2008,\n\t 0x1400: 0x200000,\n\t 0x1500: 0x10000000,\n\t 0x1600: 0x10000008,\n\t 0x1700: 0x202000,\n\t 0x1800: 0x202008,\n\t 0x1900: 0x0,\n\t 0x1a00: 0x8,\n\t 0x1b00: 0x10200000,\n\t 0x1c00: 0x2000,\n\t 0x1d00: 0x10002008,\n\t 0x1e00: 0x10202000,\n\t 0x1f00: 0x200008,\n\t 0x1080: 0x8,\n\t 0x1180: 0x202000,\n\t 0x1280: 0x200000,\n\t 0x1380: 0x10000008,\n\t 0x1480: 0x10002000,\n\t 0x1580: 0x2008,\n\t 0x1680: 0x10202008,\n\t 0x1780: 0x10200000,\n\t 0x1880: 0x10202000,\n\t 0x1980: 0x10200008,\n\t 0x1a80: 0x2000,\n\t 0x1b80: 0x202008,\n\t 0x1c80: 0x200008,\n\t 0x1d80: 0x0,\n\t 0x1e80: 0x10000000,\n\t 0x1f80: 0x10002008\n\t },\n\t {\n\t 0x0: 0x100000,\n\t 0x10: 0x2000401,\n\t 0x20: 0x400,\n\t 0x30: 0x100401,\n\t 0x40: 0x2100401,\n\t 0x50: 0x0,\n\t 0x60: 0x1,\n\t 0x70: 0x2100001,\n\t 0x80: 0x2000400,\n\t 0x90: 0x100001,\n\t 0xa0: 0x2000001,\n\t 0xb0: 0x2100400,\n\t 0xc0: 0x2100000,\n\t 0xd0: 0x401,\n\t 0xe0: 0x100400,\n\t 0xf0: 0x2000000,\n\t 0x8: 0x2100001,\n\t 0x18: 0x0,\n\t 0x28: 0x2000401,\n\t 0x38: 0x2100400,\n\t 0x48: 0x100000,\n\t 0x58: 0x2000001,\n\t 0x68: 0x2000000,\n\t 0x78: 0x401,\n\t 0x88: 0x100401,\n\t 0x98: 0x2000400,\n\t 0xa8: 0x2100000,\n\t 0xb8: 0x100001,\n\t 0xc8: 0x400,\n\t 0xd8: 0x2100401,\n\t 0xe8: 0x1,\n\t 0xf8: 0x100400,\n\t 0x100: 0x2000000,\n\t 0x110: 0x100000,\n\t 0x120: 0x2000401,\n\t 0x130: 0x2100001,\n\t 0x140: 0x100001,\n\t 0x150: 0x2000400,\n\t 0x160: 0x2100400,\n\t 0x170: 0x100401,\n\t 0x180: 0x401,\n\t 0x190: 0x2100401,\n\t 0x1a0: 0x100400,\n\t 0x1b0: 0x1,\n\t 0x1c0: 0x0,\n\t 0x1d0: 0x2100000,\n\t 0x1e0: 0x2000001,\n\t 0x1f0: 0x400,\n\t 0x108: 0x100400,\n\t 0x118: 0x2000401,\n\t 0x128: 0x2100001,\n\t 0x138: 0x1,\n\t 0x148: 0x2000000,\n\t 0x158: 0x100000,\n\t 0x168: 0x401,\n\t 0x178: 0x2100400,\n\t 0x188: 0x2000001,\n\t 0x198: 0x2100000,\n\t 0x1a8: 0x0,\n\t 0x1b8: 0x2100401,\n\t 0x1c8: 0x100401,\n\t 0x1d8: 0x400,\n\t 0x1e8: 0x2000400,\n\t 0x1f8: 0x100001\n\t },\n\t {\n\t 0x0: 0x8000820,\n\t 0x1: 0x20000,\n\t 0x2: 0x8000000,\n\t 0x3: 0x20,\n\t 0x4: 0x20020,\n\t 0x5: 0x8020820,\n\t 0x6: 0x8020800,\n\t 0x7: 0x800,\n\t 0x8: 0x8020000,\n\t 0x9: 0x8000800,\n\t 0xa: 0x20800,\n\t 0xb: 0x8020020,\n\t 0xc: 0x820,\n\t 0xd: 0x0,\n\t 0xe: 0x8000020,\n\t 0xf: 0x20820,\n\t 0x80000000: 0x800,\n\t 0x80000001: 0x8020820,\n\t 0x80000002: 0x8000820,\n\t 0x80000003: 0x8000000,\n\t 0x80000004: 0x8020000,\n\t 0x80000005: 0x20800,\n\t 0x80000006: 0x20820,\n\t 0x80000007: 0x20,\n\t 0x80000008: 0x8000020,\n\t 0x80000009: 0x820,\n\t 0x8000000a: 0x20020,\n\t 0x8000000b: 0x8020800,\n\t 0x8000000c: 0x0,\n\t 0x8000000d: 0x8020020,\n\t 0x8000000e: 0x8000800,\n\t 0x8000000f: 0x20000,\n\t 0x10: 0x20820,\n\t 0x11: 0x8020800,\n\t 0x12: 0x20,\n\t 0x13: 0x800,\n\t 0x14: 0x8000800,\n\t 0x15: 0x8000020,\n\t 0x16: 0x8020020,\n\t 0x17: 0x20000,\n\t 0x18: 0x0,\n\t 0x19: 0x20020,\n\t 0x1a: 0x8020000,\n\t 0x1b: 0x8000820,\n\t 0x1c: 0x8020820,\n\t 0x1d: 0x20800,\n\t 0x1e: 0x820,\n\t 0x1f: 0x8000000,\n\t 0x80000010: 0x20000,\n\t 0x80000011: 0x800,\n\t 0x80000012: 0x8020020,\n\t 0x80000013: 0x20820,\n\t 0x80000014: 0x20,\n\t 0x80000015: 0x8020000,\n\t 0x80000016: 0x8000000,\n\t 0x80000017: 0x8000820,\n\t 0x80000018: 0x8020820,\n\t 0x80000019: 0x8000020,\n\t 0x8000001a: 0x8000800,\n\t 0x8000001b: 0x0,\n\t 0x8000001c: 0x20800,\n\t 0x8000001d: 0x820,\n\t 0x8000001e: 0x20020,\n\t 0x8000001f: 0x8020800\n\t }\n\t ];\n\n\t // Masks that select the SBOX input\n\t var SBOX_MASK = [\n\t 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,\n\t 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f\n\t ];\n\n\t /**\n\t * DES block cipher algorithm.\n\t */\n\t var DES = C_algo.DES = BlockCipher.extend({\n\t _doReset: function () {\n\t // Shortcuts\n\t var key = this._key;\n\t var keyWords = key.words;\n\n\t // Select 56 bits according to PC1\n\t var keyBits = [];\n\t for (var i = 0; i < 56; i++) {\n\t var keyBitPos = PC1[i] - 1;\n\t keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;\n\t }\n\n\t // Assemble 16 subkeys\n\t var subKeys = this._subKeys = [];\n\t for (var nSubKey = 0; nSubKey < 16; nSubKey++) {\n\t // Create subkey\n\t var subKey = subKeys[nSubKey] = [];\n\n\t // Shortcut\n\t var bitShift = BIT_SHIFTS[nSubKey];\n\n\t // Select 48 bits according to PC2\n\t for (var i = 0; i < 24; i++) {\n\t // Select from the left 28 key bits\n\t subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);\n\n\t // Select from the right 28 key bits\n\t subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);\n\t }\n\n\t // Since each subkey is applied to an expanded 32-bit input,\n\t // the subkey can be broken into 8 values scaled to 32-bits,\n\t // which allows the key to be used without expansion\n\t subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);\n\t for (var i = 1; i < 7; i++) {\n\t subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);\n\t }\n\t subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);\n\t }\n\n\t // Compute inverse subkeys\n\t var invSubKeys = this._invSubKeys = [];\n\t for (var i = 0; i < 16; i++) {\n\t invSubKeys[i] = subKeys[15 - i];\n\t }\n\t },\n\n\t encryptBlock: function (M, offset) {\n\t this._doCryptBlock(M, offset, this._subKeys);\n\t },\n\n\t decryptBlock: function (M, offset) {\n\t this._doCryptBlock(M, offset, this._invSubKeys);\n\t },\n\n\t _doCryptBlock: function (M, offset, subKeys) {\n\t // Get input\n\t this._lBlock = M[offset];\n\t this._rBlock = M[offset + 1];\n\n\t // Initial permutation\n\t exchangeLR.call(this, 4, 0x0f0f0f0f);\n\t exchangeLR.call(this, 16, 0x0000ffff);\n\t exchangeRL.call(this, 2, 0x33333333);\n\t exchangeRL.call(this, 8, 0x00ff00ff);\n\t exchangeLR.call(this, 1, 0x55555555);\n\n\t // Rounds\n\t for (var round = 0; round < 16; round++) {\n\t // Shortcuts\n\t var subKey = subKeys[round];\n\t var lBlock = this._lBlock;\n\t var rBlock = this._rBlock;\n\n\t // Feistel function\n\t var f = 0;\n\t for (var i = 0; i < 8; i++) {\n\t f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];\n\t }\n\t this._lBlock = rBlock;\n\t this._rBlock = lBlock ^ f;\n\t }\n\n\t // Undo swap from last round\n\t var t = this._lBlock;\n\t this._lBlock = this._rBlock;\n\t this._rBlock = t;\n\n\t // Final permutation\n\t exchangeLR.call(this, 1, 0x55555555);\n\t exchangeRL.call(this, 8, 0x00ff00ff);\n\t exchangeRL.call(this, 2, 0x33333333);\n\t exchangeLR.call(this, 16, 0x0000ffff);\n\t exchangeLR.call(this, 4, 0x0f0f0f0f);\n\n\t // Set output\n\t M[offset] = this._lBlock;\n\t M[offset + 1] = this._rBlock;\n\t },\n\n\t keySize: 64/32,\n\n\t ivSize: 64/32,\n\n\t blockSize: 64/32\n\t });\n\n\t // Swap bits across the left and right words\n\t function exchangeLR(offset, mask) {\n\t var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;\n\t this._rBlock ^= t;\n\t this._lBlock ^= t << offset;\n\t }\n\n\t function exchangeRL(offset, mask) {\n\t var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;\n\t this._lBlock ^= t;\n\t this._rBlock ^= t << offset;\n\t }\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg);\n\t */\n\t C.DES = BlockCipher._createHelper(DES);\n\n\t /**\n\t * Triple-DES block cipher algorithm.\n\t */\n\t var TripleDES = C_algo.TripleDES = BlockCipher.extend({\n\t _doReset: function () {\n\t // Shortcuts\n\t var key = this._key;\n\t var keyWords = key.words;\n\t // Make sure the key length is valid (64, 128 or >= 192 bit)\n\t if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) {\n\t throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.');\n\t }\n\n\t // Extend the key according to the keying options defined in 3DES standard\n\t var key1 = keyWords.slice(0, 2);\n\t var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4);\n\t var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6);\n\n\t // Create DES instances\n\t this._des1 = DES.createEncryptor(WordArray.create(key1));\n\t this._des2 = DES.createEncryptor(WordArray.create(key2));\n\t this._des3 = DES.createEncryptor(WordArray.create(key3));\n\t },\n\n\t encryptBlock: function (M, offset) {\n\t this._des1.encryptBlock(M, offset);\n\t this._des2.decryptBlock(M, offset);\n\t this._des3.encryptBlock(M, offset);\n\t },\n\n\t decryptBlock: function (M, offset) {\n\t this._des3.decryptBlock(M, offset);\n\t this._des2.encryptBlock(M, offset);\n\t this._des1.decryptBlock(M, offset);\n\t },\n\n\t keySize: 192/32,\n\n\t ivSize: 64/32,\n\n\t blockSize: 64/32\n\t });\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);\n\t */\n\t C.TripleDES = BlockCipher._createHelper(TripleDES);\n\t}());\n\n\n\treturn CryptoJS.TripleDES;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var StreamCipher = C_lib.StreamCipher;\n\t var C_algo = C.algo;\n\n\t /**\n\t * RC4 stream cipher algorithm.\n\t */\n\t var RC4 = C_algo.RC4 = StreamCipher.extend({\n\t _doReset: function () {\n\t // Shortcuts\n\t var key = this._key;\n\t var keyWords = key.words;\n\t var keySigBytes = key.sigBytes;\n\n\t // Init sbox\n\t var S = this._S = [];\n\t for (var i = 0; i < 256; i++) {\n\t S[i] = i;\n\t }\n\n\t // Key setup\n\t for (var i = 0, j = 0; i < 256; i++) {\n\t var keyByteIndex = i % keySigBytes;\n\t var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;\n\n\t j = (j + S[i] + keyByte) % 256;\n\n\t // Swap\n\t var t = S[i];\n\t S[i] = S[j];\n\t S[j] = t;\n\t }\n\n\t // Counters\n\t this._i = this._j = 0;\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t M[offset] ^= generateKeystreamWord.call(this);\n\t },\n\n\t keySize: 256/32,\n\n\t ivSize: 0\n\t });\n\n\t function generateKeystreamWord() {\n\t // Shortcuts\n\t var S = this._S;\n\t var i = this._i;\n\t var j = this._j;\n\n\t // Generate keystream word\n\t var keystreamWord = 0;\n\t for (var n = 0; n < 4; n++) {\n\t i = (i + 1) % 256;\n\t j = (j + S[i]) % 256;\n\n\t // Swap\n\t var t = S[i];\n\t S[i] = S[j];\n\t S[j] = t;\n\n\t keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);\n\t }\n\n\t // Update counters\n\t this._i = i;\n\t this._j = j;\n\n\t return keystreamWord;\n\t }\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg);\n\t */\n\t C.RC4 = StreamCipher._createHelper(RC4);\n\n\t /**\n\t * Modified RC4 stream cipher algorithm.\n\t */\n\t var RC4Drop = C_algo.RC4Drop = RC4.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {number} drop The number of keystream words to drop. Default 192\n\t */\n\t cfg: RC4.cfg.extend({\n\t drop: 192\n\t }),\n\n\t _doReset: function () {\n\t RC4._doReset.call(this);\n\n\t // Drop\n\t for (var i = this.cfg.drop; i > 0; i--) {\n\t generateKeystreamWord.call(this);\n\t }\n\t }\n\t });\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);\n\t */\n\t C.RC4Drop = StreamCipher._createHelper(RC4Drop);\n\t}());\n\n\n\treturn CryptoJS.RC4;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var StreamCipher = C_lib.StreamCipher;\n\t var C_algo = C.algo;\n\n\t // Reusable objects\n\t var S = [];\n\t var C_ = [];\n\t var G = [];\n\n\t /**\n\t * Rabbit stream cipher algorithm\n\t */\n\t var Rabbit = C_algo.Rabbit = StreamCipher.extend({\n\t _doReset: function () {\n\t // Shortcuts\n\t var K = this._key.words;\n\t var iv = this.cfg.iv;\n\n\t // Swap endian\n\t for (var i = 0; i < 4; i++) {\n\t K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) |\n\t (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00);\n\t }\n\n\t // Generate initial state values\n\t var X = this._X = [\n\t K[0], (K[3] << 16) | (K[2] >>> 16),\n\t K[1], (K[0] << 16) | (K[3] >>> 16),\n\t K[2], (K[1] << 16) | (K[0] >>> 16),\n\t K[3], (K[2] << 16) | (K[1] >>> 16)\n\t ];\n\n\t // Generate initial counter values\n\t var C = this._C = [\n\t (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n\t (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n\t (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n\t (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\n\t ];\n\n\t // Carry bit\n\t this._b = 0;\n\n\t // Iterate the system four times\n\t for (var i = 0; i < 4; i++) {\n\t nextState.call(this);\n\t }\n\n\t // Modify the counters\n\t for (var i = 0; i < 8; i++) {\n\t C[i] ^= X[(i + 4) & 7];\n\t }\n\n\t // IV setup\n\t if (iv) {\n\t // Shortcuts\n\t var IV = iv.words;\n\t var IV_0 = IV[0];\n\t var IV_1 = IV[1];\n\n\t // Generate four subvectors\n\t var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n\t var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n\t var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n\t var i3 = (i2 << 16) | (i0 & 0x0000ffff);\n\n\t // Modify counter values\n\t C[0] ^= i0;\n\t C[1] ^= i1;\n\t C[2] ^= i2;\n\t C[3] ^= i3;\n\t C[4] ^= i0;\n\t C[5] ^= i1;\n\t C[6] ^= i2;\n\t C[7] ^= i3;\n\n\t // Iterate the system four times\n\t for (var i = 0; i < 4; i++) {\n\t nextState.call(this);\n\t }\n\t }\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcut\n\t var X = this._X;\n\n\t // Iterate the system\n\t nextState.call(this);\n\n\t // Generate four keystream words\n\t S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n\t S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n\t S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n\t S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n\t for (var i = 0; i < 4; i++) {\n\t // Swap endian\n\t S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |\n\t (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);\n\n\t // Encrypt\n\t M[offset + i] ^= S[i];\n\t }\n\t },\n\n\t blockSize: 128/32,\n\n\t ivSize: 64/32\n\t });\n\n\t function nextState() {\n\t // Shortcuts\n\t var X = this._X;\n\t var C = this._C;\n\n\t // Save old counter values\n\t for (var i = 0; i < 8; i++) {\n\t C_[i] = C[i];\n\t }\n\n\t // Calculate new counter values\n\t C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n\t C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\n\t C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\n\t C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\n\t C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\n\t C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\n\t C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\n\t C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\n\t this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\n\n\t // Calculate the g-values\n\t for (var i = 0; i < 8; i++) {\n\t var gx = X[i] + C[i];\n\n\t // Construct high and low argument for squaring\n\t var ga = gx & 0xffff;\n\t var gb = gx >>> 16;\n\n\t // Calculate high and low result of squaring\n\t var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n\t var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n\t // High XOR low\n\t G[i] = gh ^ gl;\n\t }\n\n\t // Calculate new state values\n\t X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n\t X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;\n\t X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n\t X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;\n\t X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n\t X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;\n\t X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n\t X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;\n\t }\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);\n\t */\n\t C.Rabbit = StreamCipher._createHelper(Rabbit);\n\t}());\n\n\n\treturn CryptoJS.Rabbit;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var StreamCipher = C_lib.StreamCipher;\n\t var C_algo = C.algo;\n\n\t // Reusable objects\n\t var S = [];\n\t var C_ = [];\n\t var G = [];\n\n\t /**\n\t * Rabbit stream cipher algorithm.\n\t *\n\t * This is a legacy version that neglected to convert the key to little-endian.\n\t * This error doesn't affect the cipher's security,\n\t * but it does affect its compatibility with other implementations.\n\t */\n\t var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({\n\t _doReset: function () {\n\t // Shortcuts\n\t var K = this._key.words;\n\t var iv = this.cfg.iv;\n\n\t // Generate initial state values\n\t var X = this._X = [\n\t K[0], (K[3] << 16) | (K[2] >>> 16),\n\t K[1], (K[0] << 16) | (K[3] >>> 16),\n\t K[2], (K[1] << 16) | (K[0] >>> 16),\n\t K[3], (K[2] << 16) | (K[1] >>> 16)\n\t ];\n\n\t // Generate initial counter values\n\t var C = this._C = [\n\t (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n\t (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n\t (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n\t (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\n\t ];\n\n\t // Carry bit\n\t this._b = 0;\n\n\t // Iterate the system four times\n\t for (var i = 0; i < 4; i++) {\n\t nextState.call(this);\n\t }\n\n\t // Modify the counters\n\t for (var i = 0; i < 8; i++) {\n\t C[i] ^= X[(i + 4) & 7];\n\t }\n\n\t // IV setup\n\t if (iv) {\n\t // Shortcuts\n\t var IV = iv.words;\n\t var IV_0 = IV[0];\n\t var IV_1 = IV[1];\n\n\t // Generate four subvectors\n\t var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n\t var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n\t var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n\t var i3 = (i2 << 16) | (i0 & 0x0000ffff);\n\n\t // Modify counter values\n\t C[0] ^= i0;\n\t C[1] ^= i1;\n\t C[2] ^= i2;\n\t C[3] ^= i3;\n\t C[4] ^= i0;\n\t C[5] ^= i1;\n\t C[6] ^= i2;\n\t C[7] ^= i3;\n\n\t // Iterate the system four times\n\t for (var i = 0; i < 4; i++) {\n\t nextState.call(this);\n\t }\n\t }\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcut\n\t var X = this._X;\n\n\t // Iterate the system\n\t nextState.call(this);\n\n\t // Generate four keystream words\n\t S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n\t S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n\t S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n\t S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n\t for (var i = 0; i < 4; i++) {\n\t // Swap endian\n\t S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |\n\t (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);\n\n\t // Encrypt\n\t M[offset + i] ^= S[i];\n\t }\n\t },\n\n\t blockSize: 128/32,\n\n\t ivSize: 64/32\n\t });\n\n\t function nextState() {\n\t // Shortcuts\n\t var X = this._X;\n\t var C = this._C;\n\n\t // Save old counter values\n\t for (var i = 0; i < 8; i++) {\n\t C_[i] = C[i];\n\t }\n\n\t // Calculate new counter values\n\t C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n\t C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\n\t C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\n\t C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\n\t C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\n\t C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\n\t C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\n\t C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\n\t this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\n\n\t // Calculate the g-values\n\t for (var i = 0; i < 8; i++) {\n\t var gx = X[i] + C[i];\n\n\t // Construct high and low argument for squaring\n\t var ga = gx & 0xffff;\n\t var gb = gx >>> 16;\n\n\t // Calculate high and low result of squaring\n\t var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n\t var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n\t // High XOR low\n\t G[i] = gh ^ gl;\n\t }\n\n\t // Calculate new state values\n\t X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n\t X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;\n\t X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n\t X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;\n\t X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n\t X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;\n\t X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n\t X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;\n\t }\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);\n\t */\n\t C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);\n\t}());\n\n\n\treturn CryptoJS.RabbitLegacy;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var BlockCipher = C_lib.BlockCipher;\n\t var C_algo = C.algo;\n\n\t const N = 16;\n\n\t //Origin pbox and sbox, derived from PI\n\t const ORIG_P = [\n\t 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,\n\t 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,\n\t 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,\n\t 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,\n\t 0x9216D5D9, 0x8979FB1B\n\t ];\n\n\t const ORIG_S = [\n\t [ 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,\n\t 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,\n\t 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,\n\t 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,\n\t 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,\n\t 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,\n\t 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,\n\t 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,\n\t 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,\n\t 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,\n\t 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,\n\t 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,\n\t 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,\n\t 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,\n\t 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,\n\t 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,\n\t 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,\n\t 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,\n\t 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,\n\t 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,\n\t 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,\n\t 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,\n\t 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,\n\t 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,\n\t 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,\n\t 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,\n\t 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,\n\t 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,\n\t 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,\n\t 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,\n\t 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,\n\t 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,\n\t 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,\n\t 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,\n\t 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,\n\t 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,\n\t 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,\n\t 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,\n\t 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,\n\t 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,\n\t 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,\n\t 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,\n\t 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,\n\t 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,\n\t 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,\n\t 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,\n\t 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,\n\t 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,\n\t 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,\n\t 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,\n\t 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,\n\t 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,\n\t 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,\n\t 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,\n\t 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,\n\t 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,\n\t 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,\n\t 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,\n\t 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,\n\t 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,\n\t 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,\n\t 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,\n\t 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,\n\t 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A ],\n\t [ 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,\n\t 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,\n\t 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,\n\t 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,\n\t 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,\n\t 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,\n\t 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,\n\t 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,\n\t 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,\n\t 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,\n\t 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,\n\t 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,\n\t 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,\n\t 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,\n\t 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,\n\t 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,\n\t 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,\n\t 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,\n\t 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,\n\t 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,\n\t 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,\n\t 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,\n\t 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,\n\t 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,\n\t 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,\n\t 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,\n\t 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,\n\t 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,\n\t 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,\n\t 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,\n\t 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,\n\t 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,\n\t 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,\n\t 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,\n\t 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,\n\t 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,\n\t 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,\n\t 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,\n\t 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,\n\t 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,\n\t 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,\n\t 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,\n\t 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,\n\t 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,\n\t 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,\n\t 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,\n\t 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,\n\t 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,\n\t 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,\n\t 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,\n\t 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,\n\t 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,\n\t 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,\n\t 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,\n\t 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,\n\t 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,\n\t 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,\n\t 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,\n\t 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,\n\t 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,\n\t 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,\n\t 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,\n\t 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,\n\t 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7 ],\n\t [ 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,\n\t 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,\n\t 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,\n\t 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,\n\t 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,\n\t 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,\n\t 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,\n\t 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,\n\t 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,\n\t 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,\n\t 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,\n\t 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,\n\t 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,\n\t 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,\n\t 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,\n\t 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,\n\t 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,\n\t 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,\n\t 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,\n\t 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,\n\t 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,\n\t 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,\n\t 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,\n\t 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,\n\t 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,\n\t 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,\n\t 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,\n\t 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,\n\t 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,\n\t 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,\n\t 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,\n\t 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,\n\t 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,\n\t 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,\n\t 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,\n\t 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,\n\t 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,\n\t 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,\n\t 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,\n\t 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,\n\t 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,\n\t 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,\n\t 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,\n\t 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,\n\t 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,\n\t 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,\n\t 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,\n\t 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,\n\t 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,\n\t 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,\n\t 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,\n\t 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,\n\t 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,\n\t 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,\n\t 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,\n\t 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,\n\t 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,\n\t 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,\n\t 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,\n\t 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,\n\t 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,\n\t 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,\n\t 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,\n\t 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0 ],\n\t [ 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,\n\t 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,\n\t 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,\n\t 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,\n\t 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,\n\t 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,\n\t 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,\n\t 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,\n\t 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,\n\t 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,\n\t 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,\n\t 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,\n\t 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,\n\t 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,\n\t 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,\n\t 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,\n\t 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,\n\t 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,\n\t 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,\n\t 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,\n\t 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,\n\t 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,\n\t 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,\n\t 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,\n\t 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,\n\t 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,\n\t 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,\n\t 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,\n\t 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,\n\t 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,\n\t 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,\n\t 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,\n\t 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,\n\t 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,\n\t 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,\n\t 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,\n\t 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,\n\t 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,\n\t 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,\n\t 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,\n\t 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,\n\t 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,\n\t 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,\n\t 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,\n\t 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,\n\t 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,\n\t 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,\n\t 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,\n\t 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,\n\t 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,\n\t 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,\n\t 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,\n\t 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,\n\t 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,\n\t 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,\n\t 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,\n\t 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,\n\t 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,\n\t 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,\n\t 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,\n\t 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,\n\t 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,\n\t 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,\n\t 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 ]\n\t ];\n\n\t var BLOWFISH_CTX = {\n\t pbox: [],\n\t sbox: []\n\t }\n\n\t function F(ctx, x){\n\t let a = (x >> 24) & 0xFF;\n\t let b = (x >> 16) & 0xFF;\n\t let c = (x >> 8) & 0xFF;\n\t let d = x & 0xFF;\n\n\t let y = ctx.sbox[0][a] + ctx.sbox[1][b];\n\t y = y ^ ctx.sbox[2][c];\n\t y = y + ctx.sbox[3][d];\n\n\t return y;\n\t }\n\n\t function BlowFish_Encrypt(ctx, left, right){\n\t let Xl = left;\n\t let Xr = right;\n\t let temp;\n\n\t for(let i = 0; i < N; ++i){\n\t Xl = Xl ^ ctx.pbox[i];\n\t Xr = F(ctx, Xl) ^ Xr;\n\n\t temp = Xl;\n\t Xl = Xr;\n\t Xr = temp;\n\t }\n\n\t temp = Xl;\n\t Xl = Xr;\n\t Xr = temp;\n\n\t Xr = Xr ^ ctx.pbox[N];\n\t Xl = Xl ^ ctx.pbox[N + 1];\n\n\t return {left: Xl, right: Xr};\n\t }\n\n\t function BlowFish_Decrypt(ctx, left, right){\n\t let Xl = left;\n\t let Xr = right;\n\t let temp;\n\n\t for(let i = N + 1; i > 1; --i){\n\t Xl = Xl ^ ctx.pbox[i];\n\t Xr = F(ctx, Xl) ^ Xr;\n\n\t temp = Xl;\n\t Xl = Xr;\n\t Xr = temp;\n\t }\n\n\t temp = Xl;\n\t Xl = Xr;\n\t Xr = temp;\n\n\t Xr = Xr ^ ctx.pbox[1];\n\t Xl = Xl ^ ctx.pbox[0];\n\n\t return {left: Xl, right: Xr};\n\t }\n\n\t /**\n\t * Initialization ctx's pbox and sbox.\n\t *\n\t * @param {Object} ctx The object has pbox and sbox.\n\t * @param {Array} key An array of 32-bit words.\n\t * @param {int} keysize The length of the key.\n\t *\n\t * @example\n\t *\n\t * BlowFishInit(BLOWFISH_CTX, key, 128/32);\n\t */\n\t function BlowFishInit(ctx, key, keysize)\n\t {\n\t for(let Row = 0; Row < 4; Row++)\n\t {\n\t ctx.sbox[Row] = [];\n\t for(let Col = 0; Col < 256; Col++)\n\t {\n\t ctx.sbox[Row][Col] = ORIG_S[Row][Col];\n\t }\n\t }\n\n\t let keyIndex = 0;\n\t for(let index = 0; index < N + 2; index++)\n\t {\n\t ctx.pbox[index] = ORIG_P[index] ^ key[keyIndex];\n\t keyIndex++;\n\t if(keyIndex >= keysize)\n\t {\n\t keyIndex = 0;\n\t }\n\t }\n\n\t let Data1 = 0;\n\t let Data2 = 0;\n\t let res = 0;\n\t for(let i = 0; i < N + 2; i += 2)\n\t {\n\t res = BlowFish_Encrypt(ctx, Data1, Data2);\n\t Data1 = res.left;\n\t Data2 = res.right;\n\t ctx.pbox[i] = Data1;\n\t ctx.pbox[i + 1] = Data2;\n\t }\n\n\t for(let i = 0; i < 4; i++)\n\t {\n\t for(let j = 0; j < 256; j += 2)\n\t {\n\t res = BlowFish_Encrypt(ctx, Data1, Data2);\n\t Data1 = res.left;\n\t Data2 = res.right;\n\t ctx.sbox[i][j] = Data1;\n\t ctx.sbox[i][j + 1] = Data2;\n\t }\n\t }\n\n\t return true;\n\t }\n\n\t /**\n\t * Blowfish block cipher algorithm.\n\t */\n\t var Blowfish = C_algo.Blowfish = BlockCipher.extend({\n\t _doReset: function () {\n\t // Skip reset of nRounds has been set before and key did not change\n\t if (this._keyPriorReset === this._key) {\n\t return;\n\t }\n\n\t // Shortcuts\n\t var key = this._keyPriorReset = this._key;\n\t var keyWords = key.words;\n\t var keySize = key.sigBytes / 4;\n\n\t //Initialization pbox and sbox\n\t BlowFishInit(BLOWFISH_CTX, keyWords, keySize);\n\t },\n\n\t encryptBlock: function (M, offset) {\n\t var res = BlowFish_Encrypt(BLOWFISH_CTX, M[offset], M[offset + 1]);\n\t M[offset] = res.left;\n\t M[offset + 1] = res.right;\n\t },\n\n\t decryptBlock: function (M, offset) {\n\t var res = BlowFish_Decrypt(BLOWFISH_CTX, M[offset], M[offset + 1]);\n\t M[offset] = res.left;\n\t M[offset + 1] = res.right;\n\t },\n\n\t blockSize: 64/32,\n\n\t keySize: 128/32,\n\n\t ivSize: 64/32\n\t });\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.Blowfish.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.Blowfish.decrypt(ciphertext, key, cfg);\n\t */\n\t C.Blowfish = BlockCipher._createHelper(Blowfish);\n\t}());\n\n\n\treturn CryptoJS.Blowfish;\n\n}));"]} \ No newline at end of file diff --git a/mock/WxMock.js b/mock/WxMock.js deleted file mode 100644 index aa63393..0000000 --- a/mock/WxMock.js +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable */ -var __request = wx.request; -var Mock = require('./mock.js'); -Object.defineProperty(wx, 'request', { writable: true }); -wx.request = function (config) { - if (typeof Mock._mocked[config.url] == 'undefined') { - __request(config); - return; - } - var resTemplate = Mock._mocked[config.url].template; - var response = Mock.mock(resTemplate); - if (typeof config.success == 'function') { - config.success(response); - } - if (typeof config.complete == 'function') { - config.complete(response); - } -}; -module.exports = Mock; diff --git a/mock/chat.js b/mock/chat.js deleted file mode 100644 index 10f7930..0000000 --- a/mock/chat.js +++ /dev/null @@ -1,140 +0,0 @@ -/** 模拟网络请求的延迟 */ -function delay(ms = 500) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); -} - -// 模拟聊天数据 -const mockData = [ - { - userId: 1, - name: 'Sean', - avatar: '/static/chat/avatar-Sean.png', - messages: [ - { messageId: 1, from: 1, content: '那明天准时见哦😊', time: 1690646400000, read: true }, - { messageId: 2, from: 0, content: '好的,我会记得的', time: 1690646400000, read: true }, - { messageId: 3, from: 1, content: '在吗?', time: Date.now() - 3600000, read: false }, - { - messageId: 4, - from: 1, - content: '有个问题想咨询一下,关于TDesign组件库如何更好地使用', - time: Date.now() - 3600000, - read: false, - }, - ], - }, - { - userId: 2, - name: 'Mollymolly', - avatar: '/static/chat/avatar-Mollymolly.png', - messages: [{ messageId: 5, from: 1, content: '好久不见,最近咋样?', time: 1692100800000, read: true }], - }, - { - userId: 3, - name: 'Andrew', - avatar: '/static/chat/avatar-Andrew.png', - messages: [{ messageId: 6, from: 0, content: '现在没空,晚点再联系你哈', time: 1690084800000, read: true }], - }, - { - userId: 4, - name: 'Kingdom', - avatar: '/static/chat/avatar-Kingdom.png', - messages: [{ messageId: 7, from: 1, content: '真的吗?', time: 1656880200000, read: true }], - }, - { - userId: 5, - name: 'Paige', - avatar: '/static/chat/avatar-Paige.png', - messages: [ - { messageId: 8, from: 1, content: '此次要评审的首页和专区页改版的交互方案', time: 1652963880000, read: true }, - ], - }, -]; - -// 模拟新增一条消息 -function addNewMessage(userId, from, content) { - const index = mockData.map((item) => item.userId).indexOf(userId); - const user = mockData.splice(index, 1)[0]; - mockData.unshift(user); - let messageId = 0; - mockData.forEach((item) => { - messageId += item.messages.length; - }); - const message = { messageId, from, content, time: Date.now(), read: from === 0 }; - user.messages.push(message); - - return message; -} - -/** 模拟SocketTask */ -class MockSocketTask { - constructor(url) { - this.url = url; - this.onopen = () => {}; - this.onmessage = () => {}; - this.onclose = () => {}; - delay(1000).then(() => { - this.onopen(); - }); - } - - onOpen(callback) { - if (typeof callback === 'function') this.onopen = callback; - } - - onMessage(callback) { - if (typeof callback === 'function') this.onmessage = callback; - } - - send(data) { - data = JSON.parse(data); - if (data.type === 'message') { - const { userId, content } = data.data; - delay().then(() => { - const message = addNewMessage(userId, 0, content); - this.onmessage(JSON.stringify({ type: 'message', data: { userId, message } })); - }); - // 模拟3秒后对方回复消息 - delay(3000).then(() => { - const message = addNewMessage(userId, 1, ['收到', '好的', '知道了', '👌OK'].at(Math.floor(Math.random() * 4))); - this.onmessage(JSON.stringify({ type: 'message', data: { userId, message } })); - }); - } - } -} - -/** 连接WebSocket,返回SocketTask对象 */ -export function connectSocket() { - // return wx.connectSocket({ url: 'url' }) - return new MockSocketTask('ws://localhost:8080'); -} - -/** 获取未读消息数量 */ -export function fetchUnreadNum() { - let unreadNum = 0; - mockData.forEach((item) => { - unreadNum += item.messages.filter((message) => !message.read).length; - }); - return delay().then(() => ({ code: 200, data: unreadNum })); -} - -/** 获取完整消息列表 */ -export function fetchMessageList() { - return delay().then(() => ({ code: 200, data: JSON.parse(JSON.stringify(mockData)) })); -} - -/** 将某个用户的所有消息标记为已读 */ -export function markMessagesRead(userId) { - let index = 0; - while (index < mockData.length) { - const user = mockData[index]; - if (user.userId === userId) { - user.messages.forEach((message) => { - message.read = true; - }); - break; - } - index += 1; - } -} diff --git a/mock/dataCenter/getArea.js b/mock/dataCenter/getArea.js deleted file mode 100644 index ba6a9ca..0000000 --- a/mock/dataCenter/getArea.js +++ /dev/null @@ -1,98 +0,0 @@ -export default { - path: '/dataCenter/area', - data: { - returnType: 'succ', - generateType: 'template', - manual: { - succ: { - resStr: { - data: '', - statusCode: '', - header: '', - }, - }, - fail: { - resStr: { - errMsg: 'request:fail 填写错误信息', - }, - }, - }, - template: { - succ: { - data: { - list: [ - { - 标题: '视频A', - 全球: '4442', - 华北: '456', - 华东: '456', - }, - { - 标题: '视频A', - 全球: '4442', - 华北: '456', - 华东: '456', - }, - { - 标题: '视频A', - 全球: '4442', - 华北: '456', - 华东: '456', - }, - { - 标题: '视频A', - 全球: '4442', - 华北: '456', - 华东: '456', - }, - { - 标题: '视频A', - 全球: '4442', - 华北: '456', - 华东: '456', - }, - { - 标题: '视频A', - 全球: '4442', - 华北: '456', - 华东: '456', - }, - { - 标题: '视频A', - 全球: '4442', - 华北: '456', - 华东: '456', - }, - { - 标题: '视频A', - 全球: '4442', - 华北: '456', - 华东: '456', - }, - { - 标题: '视频A', - 全球: '4442', - 华北: '456', - 华东: '456', - }, - { - 标题: '视频A', - 全球: '4442', - 华北: '456', - 华东: '456', - }, - ], - }, - statusCode: 200, - header: { - 'content-type': 'application/json; charset=utf-8', - }, - }, - fail: { - templateStr: { - errMsg: 'request:fail 填写错误信息', - }, - }, - }, - }, -}; diff --git a/mock/dataCenter/getCompleteRate.js b/mock/dataCenter/getCompleteRate.js deleted file mode 100644 index a055502..0000000 --- a/mock/dataCenter/getCompleteRate.js +++ /dev/null @@ -1,62 +0,0 @@ -export default { - path: '/dataCenter/complete-rate', - data: { - returnType: 'succ', - generateType: 'template', - manual: { - succ: { - resStr: { - data: '', - statusCode: '', - header: '', - }, - }, - fail: { - resStr: { - errMsg: 'request:fail 填写错误信息', - }, - }, - }, - template: { - succ: { - data: { - list: [ - { - time: '12:00', - percentage: '80', - }, - { - time: '14:00', - percentage: '60', - }, - { - time: '16:00', - percentage: '85', - }, - { - time: '18:00', - percentage: '43', - }, - { - time: '20:00', - percentage: '60', - }, - { - time: '22:00', - percentage: '95', - }, - ], - }, - statusCode: 200, - header: { - 'content-type': 'application/json; charset=utf-8', - }, - }, - fail: { - templateStr: { - errMsg: 'request:fail 填写错误信息', - }, - }, - }, - }, -}; diff --git a/mock/dataCenter/getInteraction.js b/mock/dataCenter/getInteraction.js deleted file mode 100644 index 1c49e5f..0000000 --- a/mock/dataCenter/getInteraction.js +++ /dev/null @@ -1,32 +0,0 @@ -export default { - path: '/dataCenter/interaction', - data: { - returnType: 'succ', - generateType: 'template', - manual: { - succ: { - resStr: { data: '', statusCode: '', header: '' }, - }, - fail: { - resStr: { errMsg: 'request:fail 填写错误信息' }, - }, - }, - template: { - succ: { - data: { - list: [ - { name: '浏览量', number: '919' }, - { name: '点赞量', number: '887' }, - { name: '分享量', number: '104' }, - { name: '收藏', number: '47' }, - ], - }, - statusCode: 200, - header: { 'content-type': 'application/json; charset=utf-8' }, - }, - fail: { - templateStr: { errMsg: 'request:fail 填写错误信息' }, - }, - }, - }, -}; diff --git a/mock/dataCenter/getMember.js b/mock/dataCenter/getMember.js deleted file mode 100644 index cf6425e..0000000 --- a/mock/dataCenter/getMember.js +++ /dev/null @@ -1,50 +0,0 @@ -export default { - path: '/dataCenter/member', - data: { - returnType: 'succ', - generateType: 'template', - manual: { - succ: { - resStr: { - data: '', - statusCode: '', - header: '', - }, - }, - fail: { - resStr: { - errMsg: 'request:fail 填写错误信息', - }, - }, - }, - template: { - succ: { - data: { - list: [ - { - name: '浏览量', - number: '202W', - }, - { - name: 'PV', - number: '233W', - }, - { - name: 'UV', - number: '102W', - }, - ], - }, - statusCode: 200, - header: { - 'content-type': 'application/json; charset=utf-8', - }, - }, - fail: { - templateStr: { - errMsg: 'request:fail 填写错误信息', - }, - }, - }, - }, -}; diff --git a/mock/dataCenter/index.js b/mock/dataCenter/index.js deleted file mode 100644 index 41e3ba5..0000000 --- a/mock/dataCenter/index.js +++ /dev/null @@ -1,6 +0,0 @@ -import getDataCenterArea from './getArea'; -import getDataCenterMember from './getMember'; -import getDataCompleteRate from './getCompleteRate'; -import getDataInteraction from './getInteraction'; - -export default [getDataCenterArea, getDataCenterMember, getDataCompleteRate, getDataInteraction]; diff --git a/mock/home/getHomeCards.js b/mock/home/getHomeCards.js deleted file mode 100644 index 89370d9..0000000 --- a/mock/home/getHomeCards.js +++ /dev/null @@ -1,79 +0,0 @@ -export default { - path: '/home/cards', - data: { - code: 200, - message: '请求成功', - data: [ - { - url: '/static/home/card0.png', - desc: '少年,星空与梦想', - tags: [ - { - text: 'AI绘画', - theme: 'primary', - }, - { - text: '版权素材', - theme: 'success', - }, - ], - }, - { - url: '/static/home/card1.png', - desc: '仰望星空的少女', - tags: [ - { - text: 'AI绘画', - theme: 'primary', - }, - { - text: '版权素材', - theme: 'success', - }, - ], - }, - { - url: '/static/home/card3.png', - desc: '仰望星空的少年', - tags: [ - { - text: 'AI绘画', - theme: 'primary', - }, - { - text: '版权素材', - theme: 'success', - }, - ], - }, - { - url: '/static/home/card2.png', - desc: '少年,星空与梦想', - tags: [ - { - text: 'AI绘画', - theme: 'primary', - }, - { - text: '版权素材', - theme: 'success', - }, - ], - }, - { - url: '/static/home/card4.png', - desc: '多彩的天空', - tags: [ - { - text: 'AI绘画', - theme: 'primary', - }, - { - text: '版权素材', - theme: 'success', - }, - ], - }, - ], - }, -}; diff --git a/mock/home/getHomeSwipers.js b/mock/home/getHomeSwipers.js deleted file mode 100644 index 0d093fe..0000000 --- a/mock/home/getHomeSwipers.js +++ /dev/null @@ -1,8 +0,0 @@ -export default { - path: '/home/swipers', - data: { - code: 200, - message: '请求成功', - data: new Array(6).fill('/static/home/swiper0.png'), - }, -}; diff --git a/mock/home/index.js b/mock/home/index.js deleted file mode 100644 index eb94d6b..0000000 --- a/mock/home/index.js +++ /dev/null @@ -1,4 +0,0 @@ -import getHomeCards from './getHomeCards'; -import getHomeSwipers from './getHomeSwipers'; - -export default [getHomeCards, getHomeSwipers]; diff --git a/mock/index.js b/mock/index.js deleted file mode 100644 index ec4fdea..0000000 --- a/mock/index.js +++ /dev/null @@ -1,15 +0,0 @@ -import Mock from './WxMock'; -// 导入包含path和data的对象 -import loginMock from './login/index'; -import homeMock from './home/index'; -import searchMock from './search/index'; -import dataCenter from './dataCenter/index'; -import my from './my/index'; - -export default () => { - // 在这里添加新的mock数据 - const mockData = [...loginMock, ...homeMock, ...searchMock, ...dataCenter, ...my]; - mockData.forEach((item) => { - Mock.mock(item.path, { code: 200, success: true, data: item.data }); - }); -}; diff --git a/mock/login/getSendMessage.js b/mock/login/getSendMessage.js deleted file mode 100644 index 608230f..0000000 --- a/mock/login/getSendMessage.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - path: '/login/getSendMessage', - data: { - message: '发送成功', - }, -}; diff --git a/mock/login/index.js b/mock/login/index.js deleted file mode 100644 index d1efb2e..0000000 --- a/mock/login/index.js +++ /dev/null @@ -1,5 +0,0 @@ -import getSendMessage from './getSendMessage'; -import postCodeVerify from './postCodeVerify'; -import postPasswordLogin from './postPasswordLogin'; - -export default [getSendMessage, postCodeVerify, postPasswordLogin]; diff --git a/mock/login/postCodeVerify.js b/mock/login/postCodeVerify.js deleted file mode 100644 index e3eafcf..0000000 --- a/mock/login/postCodeVerify.js +++ /dev/null @@ -1,7 +0,0 @@ -export default { - path: '/login/postCodeVerify', - data: { - message: '验证码正确', - token: '@guid()', - }, -}; diff --git a/mock/login/postPasswordLogin.js b/mock/login/postPasswordLogin.js deleted file mode 100644 index 9098e5f..0000000 --- a/mock/login/postPasswordLogin.js +++ /dev/null @@ -1,7 +0,0 @@ -export default { - path: '/login/postPasswordLogin', - data: { - message: '登录成功', - token: '@guid()', - }, -}; diff --git a/mock/mock.js b/mock/mock.js deleted file mode 100644 index 3290a77..0000000 --- a/mock/mock.js +++ /dev/null @@ -1,9189 +0,0 @@ -/* eslint-disable */ -(function webpackUniversalModuleDefinition(root, factory) { - if (typeof exports === 'object' && typeof module === 'object') module.exports = factory(); - else if (typeof define === 'function' && define.amd) define([], factory); - else if (typeof exports === 'object') exports['Mock'] = factory(); - else root['Mock'] = factory(); -})(this, function () { - return /******/ (function (modules) { - // webpackBootstrap - /******/ // The module cache - /******/ var installedModules = {}; - - /******/ // The require function - /******/ function __webpack_require__(moduleId) { - /******/ // Check if module is in cache - /******/ if (installedModules[moduleId]) /******/ return installedModules[moduleId].exports; - - /******/ // Create a new module (and put it into the cache) - /******/ var module = (installedModules[moduleId] = { - /******/ exports: {}, - /******/ id: moduleId, - /******/ loaded: false, - /******/ - }); - - /******/ // Execute the module function - /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); - - /******/ // Flag the module as loaded - /******/ module.loaded = true; - - /******/ // Return the exports of the module - /******/ return module.exports; - /******/ - } - - /******/ // expose the modules object (__webpack_modules__) - /******/ __webpack_require__.m = modules; - - /******/ // expose the module cache - /******/ __webpack_require__.c = installedModules; - - /******/ // __webpack_public_path__ - /******/ __webpack_require__.p = ''; - - /******/ // Load entry module and return exports - /******/ return __webpack_require__(0); - /******/ - })( - /************************************************************************/ - /******/ [ - /* 0 */ - /***/ function (module, exports, __webpack_require__) { - /* global require, module, window */ - var Handler = __webpack_require__(1); - var Util = __webpack_require__(3); - var Random = __webpack_require__(5); - var RE = __webpack_require__(20); - var toJSONSchema = __webpack_require__(23); - var valid = __webpack_require__(25); - - var XHR; - if (typeof window !== 'undefined') XHR = __webpack_require__(27); - - var Mock = { - Handler: Handler, - Random: Random, - Util: Util, - XHR: XHR, - RE: RE, - toJSONSchema: toJSONSchema, - valid: valid, - heredoc: Util.heredoc, - setup: function (settings) { - return XHR.setup(settings); - }, - _mocked: {}, - }; - - Mock.version = '1.0.1-beta3'; - - // 避免循环依赖 - if (XHR) XHR.Mock = Mock; - - /* - * Mock.mock( template ) - * Mock.mock( function() ) - * Mock.mock( rurl, template ) - * Mock.mock( rurl, function(options) ) - * Mock.mock( rurl, rtype, template ) - * Mock.mock( rurl, rtype, function(options) ) - - 根据数据模板生成模拟数据。 - */ - Mock.mock = function (rurl, rtype, template) { - // Mock.mock(template) - if (arguments.length === 1) { - return Handler.gen(rurl); - } - // Mock.mock(rurl, template) - if (arguments.length === 2) { - template = rtype; - rtype = undefined; - } - // 拦截 XHR - if (XHR) window.XMLHttpRequest = XHR; - Mock._mocked[rurl + (rtype || '')] = { - rurl: rurl, - rtype: rtype, - template: template, - }; - return Mock; - }; - - module.exports = Mock; - - /***/ - }, - /* 1 */ - /***/ function (module, exports, __webpack_require__) { - /* - ## Handler - - 处理数据模板。 - - * Handler.gen( template, name?, context? ) - - 入口方法。 - - * Data Template Definition, DTD - - 处理数据模板定义。 - - * Handler.array( options ) - * Handler.object( options ) - * Handler.number( options ) - * Handler.boolean( options ) - * Handler.string( options ) - * Handler.function( options ) - * Handler.regexp( options ) - - 处理路径(相对和绝对)。 - - * Handler.getValueByKeyPath( key, options ) - - * Data Placeholder Definition, DPD - - 处理数据占位符定义 - - * Handler.placeholder( placeholder, context, templateContext, options ) - - */ - - var Constant = __webpack_require__(2); - var Util = __webpack_require__(3); - var Parser = __webpack_require__(4); - var Random = __webpack_require__(5); - var RE = __webpack_require__(20); - - var Handler = { - extend: Util.extend, - }; - - /* - template 属性值(即数据模板) - name 属性名 - context 数据上下文,生成后的数据 - templateContext 模板上下文, - - Handle.gen(template, name, options) - context - currentContext, templateCurrentContext, - path, templatePath - root, templateRoot - */ - Handler.gen = function (template, name, context) { - /* jshint -W041 */ - name = name == undefined ? '' : name + ''; - - context = context || {}; - context = { - // 当前访问路径,只有属性名,不包括生成规则 - path: context.path || [Constant.GUID], - templatePath: context.templatePath || [Constant.GUID++], - // 最终属性值的上下文 - currentContext: context.currentContext, - // 属性值模板的上下文 - templateCurrentContext: context.templateCurrentContext || template, - // 最终值的根 - root: context.root || context.currentContext, - // 模板的根 - templateRoot: context.templateRoot || context.templateCurrentContext || template, - }; - // console.log('path:', context.path.join('.'), template) - - var rule = Parser.parse(name); - var type = Util.type(template); - var data; - - if (Handler[type]) { - data = Handler[type]({ - // 属性值类型 - type: type, - // 属性值模板 - template: template, - // 属性名 + 生成规则 - name: name, - // 属性名 - parsedName: name ? name.replace(Constant.RE_KEY, '$1') : name, - - // 解析后的生成规则 - rule: rule, - // 相关上下文 - context: context, - }); - - if (!context.root) context.root = data; - return data; - } - - return template; - }; - - Handler.extend({ - array: function (options) { - var result = [], - i, - ii; - - // 'name|1': [] - // 'name|count': [] - // 'name|min-max': [] - if (options.template.length === 0) return result; - - // 'arr': [{ 'email': '@EMAIL' }, { 'email': '@EMAIL' }] - if (!options.rule.parameters) { - for (i = 0; i < options.template.length; i++) { - options.context.path.push(i); - options.context.templatePath.push(i); - result.push( - Handler.gen(options.template[i], i, { - path: options.context.path, - templatePath: options.context.templatePath, - currentContext: result, - templateCurrentContext: options.template, - root: options.context.root || result, - templateRoot: options.context.templateRoot || options.template, - }), - ); - options.context.path.pop(); - options.context.templatePath.pop(); - } - } else { - // 'method|1': ['GET', 'POST', 'HEAD', 'DELETE'] - if (options.rule.min === 1 && options.rule.max === undefined) { - // fix #17 - options.context.path.push(options.name); - options.context.templatePath.push(options.name); - result = Random.pick( - Handler.gen(options.template, undefined, { - path: options.context.path, - templatePath: options.context.templatePath, - currentContext: result, - templateCurrentContext: options.template, - root: options.context.root || result, - templateRoot: options.context.templateRoot || options.template, - }), - ); - options.context.path.pop(); - options.context.templatePath.pop(); - } else { - // 'data|+1': [{}, {}] - if (options.rule.parameters[2]) { - options.template.__order_index = options.template.__order_index || 0; - - options.context.path.push(options.name); - options.context.templatePath.push(options.name); - result = Handler.gen(options.template, undefined, { - path: options.context.path, - templatePath: options.context.templatePath, - currentContext: result, - templateCurrentContext: options.template, - root: options.context.root || result, - templateRoot: options.context.templateRoot || options.template, - })[options.template.__order_index % options.template.length]; - - options.template.__order_index += +options.rule.parameters[2]; - - options.context.path.pop(); - options.context.templatePath.pop(); - } else { - // 'data|1-10': [{}] - for (i = 0; i < options.rule.count; i++) { - // 'data|1-10': [{}, {}] - for (ii = 0; ii < options.template.length; ii++) { - options.context.path.push(result.length); - options.context.templatePath.push(ii); - result.push( - Handler.gen(options.template[ii], result.length, { - path: options.context.path, - templatePath: options.context.templatePath, - currentContext: result, - templateCurrentContext: options.template, - root: options.context.root || result, - templateRoot: options.context.templateRoot || options.template, - }), - ); - options.context.path.pop(); - options.context.templatePath.pop(); - } - } - } - } - } - return result; - }, - object: function (options) { - var result = {}, - keys, - fnKeys, - key, - parsedKey, - inc, - i; - - // 'obj|min-max': {} - /* jshint -W041 */ - if (options.rule.min != undefined) { - keys = Util.keys(options.template); - keys = Random.shuffle(keys); - keys = keys.slice(0, options.rule.count); - for (i = 0; i < keys.length; i++) { - key = keys[i]; - parsedKey = key.replace(Constant.RE_KEY, '$1'); - options.context.path.push(parsedKey); - options.context.templatePath.push(key); - result[parsedKey] = Handler.gen(options.template[key], key, { - path: options.context.path, - templatePath: options.context.templatePath, - currentContext: result, - templateCurrentContext: options.template, - root: options.context.root || result, - templateRoot: options.context.templateRoot || options.template, - }); - options.context.path.pop(); - options.context.templatePath.pop(); - } - } else { - // 'obj': {} - keys = []; - fnKeys = []; // #25 改变了非函数属性的顺序,查找起来不方便 - for (key in options.template) { - (typeof options.template[key] === 'function' ? fnKeys : keys).push(key); - } - keys = keys.concat(fnKeys); - - /* - 会改变非函数属性的顺序 - keys = Util.keys(options.template) - keys.sort(function(a, b) { - var afn = typeof options.template[a] === 'function' - var bfn = typeof options.template[b] === 'function' - if (afn === bfn) return 0 - if (afn && !bfn) return 1 - if (!afn && bfn) return -1 - }) - */ - - for (i = 0; i < keys.length; i++) { - key = keys[i]; - parsedKey = key.replace(Constant.RE_KEY, '$1'); - options.context.path.push(parsedKey); - options.context.templatePath.push(key); - result[parsedKey] = Handler.gen(options.template[key], key, { - path: options.context.path, - templatePath: options.context.templatePath, - currentContext: result, - templateCurrentContext: options.template, - root: options.context.root || result, - templateRoot: options.context.templateRoot || options.template, - }); - options.context.path.pop(); - options.context.templatePath.pop(); - // 'id|+1': 1 - inc = key.match(Constant.RE_KEY); - if (inc && inc[2] && Util.type(options.template[key]) === 'number') { - options.template[key] += parseInt(inc[2], 10); - } - } - } - return result; - }, - number: function (options) { - var result, parts; - if (options.rule.decimal) { - // float - options.template += ''; - parts = options.template.split('.'); - // 'float1|.1-10': 10, - // 'float2|1-100.1-10': 1, - // 'float3|999.1-10': 1, - // 'float4|.3-10': 123.123, - parts[0] = options.rule.range ? options.rule.count : parts[0]; - parts[1] = (parts[1] || '').slice(0, options.rule.dcount); - while (parts[1].length < options.rule.dcount) { - parts[1] += - // 最后一位不能为 0:如果最后一位为 0,会被 JS 引擎忽略掉。 - parts[1].length < options.rule.dcount - 1 - ? Random.character('number') - : Random.character('123456789'); - } - result = parseFloat(parts.join('.'), 10); - } else { - // integer - // 'grade1|1-100': 1, - result = options.rule.range && !options.rule.parameters[2] ? options.rule.count : options.template; - } - return result; - }, - boolean: function (options) { - var result; - // 'prop|multiple': false, 当前值是相反值的概率倍数 - // 'prop|probability-probability': false, 当前值与相反值的概率 - result = options.rule.parameters - ? Random.bool(options.rule.min, options.rule.max, options.template) - : options.template; - return result; - }, - string: function (options) { - var result = '', - i, - placeholders, - ph, - phed; - if (options.template.length) { - // 'foo': '★', - /* jshint -W041 */ - if (options.rule.count == undefined) { - result += options.template; - } - - // 'star|1-5': '★', - for (i = 0; i < options.rule.count; i++) { - result += options.template; - } - // 'email|1-10': '@EMAIL, ', - placeholders = result.match(Constant.RE_PLACEHOLDER) || []; // A-Z_0-9 > \w_ - for (i = 0; i < placeholders.length; i++) { - ph = placeholders[i]; - - // 遇到转义斜杠,不需要解析占位符 - if (/^\\/.test(ph)) { - placeholders.splice(i--, 1); - continue; - } - - phed = Handler.placeholder( - ph, - options.context.currentContext, - options.context.templateCurrentContext, - options, - ); - - // 只有一个占位符,并且没有其他字符 - if (placeholders.length === 1 && ph === result && typeof phed !== typeof result) { - // - result = phed; - break; - - if (Util.isNumeric(phed)) { - result = parseFloat(phed, 10); - break; - } - if (/^(true|false)$/.test(phed)) { - result = phed === 'true' ? true : phed === 'false' ? false : phed; // 已经是布尔值 - break; - } - } - result = result.replace(ph, phed); - } - } else { - // 'ASCII|1-10': '', - // 'ASCII': '', - result = options.rule.range ? Random.string(options.rule.count) : options.template; - } - return result; - }, - function: function (options) { - // ( context, options ) - return options.template.call(options.context.currentContext, options); - }, - regexp: function (options) { - var source = ''; - - // 'name': /regexp/, - /* jshint -W041 */ - if (options.rule.count == undefined) { - source += options.template.source; // regexp.source - } - - // 'name|1-5': /regexp/, - for (var i = 0; i < options.rule.count; i++) { - source += options.template.source; - } - - return RE.Handler.gen(RE.Parser.parse(source)); - }, - }); - - Handler.extend({ - _all: function () { - var re = {}; - for (var key in Random) re[key.toLowerCase()] = key; - return re; - }, - // 处理占位符,转换为最终值 - placeholder: function (placeholder, obj, templateContext, options) { - // console.log(options.context.path) - // 1 key, 2 params - Constant.RE_PLACEHOLDER.exec(''); - var parts = Constant.RE_PLACEHOLDER.exec(placeholder), - key = parts && parts[1], - lkey = key && key.toLowerCase(), - okey = this._all()[lkey], - params = (parts && parts[2]) || ''; - var pathParts = this.splitPathToArray(key); - - // 解析占位符的参数 - try { - // 1. 尝试保持参数的类型 - /* - #24 [Window Firefox 30.0 引用 占位符 抛错](https://github.com/nuysoft/Mock/issues/24) - [BX9056: 各浏览器下 window.eval 方法的执行上下文存在差异](http://www.w3help.org/zh-cn/causes/BX9056) - 应该属于 Window Firefox 30.0 的 BUG - */ - /* jshint -W061 */ - params = eval('(function(){ return [].splice.call(arguments, 0 ) })(' + params + ')'); - } catch (error) { - // 2. 如果失败,只能解析为字符串 - // console.error(error) - // if (error instanceof ReferenceError) params = parts[2].split(/,\s*/); - // else throw error - params = parts[2].split(/,\s*/); - } - - // 占位符优先引用数据模板中的属性 - if (obj && key in obj) return obj[key]; - - // @index @key - // if (Constant.RE_INDEX.test(key)) return +options.name - // if (Constant.RE_KEY.test(key)) return options.name - - // 绝对路径 or 相对路径 - if (key.charAt(0) === '/' || pathParts.length > 1) return this.getValueByKeyPath(key, options); - - // 递归引用数据模板中的属性 - if ( - templateContext && - typeof templateContext === 'object' && - key in templateContext && - placeholder !== templateContext[key] // fix #15 避免自己依赖自己 - ) { - // 先计算被引用的属性值 - templateContext[key] = Handler.gen(templateContext[key], key, { - currentContext: obj, - templateCurrentContext: templateContext, - }); - return templateContext[key]; - } - - // 如果未找到,则原样返回 - if (!(key in Random) && !(lkey in Random) && !(okey in Random)) return placeholder; - - // 递归解析参数中的占位符 - for (var i = 0; i < params.length; i++) { - Constant.RE_PLACEHOLDER.exec(''); - if (Constant.RE_PLACEHOLDER.test(params[i])) { - params[i] = Handler.placeholder(params[i], obj, templateContext, options); - } - } - - var handle = Random[key] || Random[lkey] || Random[okey]; - switch (Util.type(handle)) { - case 'array': - // 自动从数组中取一个,例如 @areas - return Random.pick(handle); - case 'function': - // 执行占位符方法(大多数情况) - handle.options = options; - var re = handle.apply(Random, params); - if (re === undefined) re = ''; // 因为是在字符串中,所以默认为空字符串。 - delete handle.options; - return re; - } - }, - getValueByKeyPath: function (key, options) { - var originalKey = key; - var keyPathParts = this.splitPathToArray(key); - var absolutePathParts = []; - - // 绝对路径 - if (key.charAt(0) === '/') { - absolutePathParts = [options.context.path[0]].concat(this.normalizePath(keyPathParts)); - } else { - // 相对路径 - if (keyPathParts.length > 1) { - absolutePathParts = options.context.path.slice(0); - absolutePathParts.pop(); - absolutePathParts = this.normalizePath(absolutePathParts.concat(keyPathParts)); - } - } - - try { - key = keyPathParts[keyPathParts.length - 1]; - var currentContext = options.context.root; - var templateCurrentContext = options.context.templateRoot; - for (var i = 1; i < absolutePathParts.length - 1; i++) { - currentContext = currentContext[absolutePathParts[i]]; - templateCurrentContext = templateCurrentContext[absolutePathParts[i]]; - } - // 引用的值已经计算好 - if (currentContext && key in currentContext) return currentContext[key]; - - // 尚未计算,递归引用数据模板中的属性 - if ( - templateCurrentContext && - typeof templateCurrentContext === 'object' && - key in templateCurrentContext && - originalKey !== templateCurrentContext[key] // fix #15 避免自己依赖自己 - ) { - // 先计算被引用的属性值 - templateCurrentContext[key] = Handler.gen(templateCurrentContext[key], key, { - currentContext: currentContext, - templateCurrentContext: templateCurrentContext, - }); - return templateCurrentContext[key]; - } - } catch (err) {} - - return '@' + keyPathParts.join('/'); - }, - // https://github.com/kissyteam/kissy/blob/master/src/path/src/path.js - normalizePath: function (pathParts) { - var newPathParts = []; - for (var i = 0; i < pathParts.length; i++) { - switch (pathParts[i]) { - case '..': - newPathParts.pop(); - break; - case '.': - break; - default: - newPathParts.push(pathParts[i]); - } - } - return newPathParts; - }, - splitPathToArray: function (path) { - var parts = path.split(/\/+/); - if (!parts[parts.length - 1]) parts = parts.slice(0, -1); - if (!parts[0]) parts = parts.slice(1); - return parts; - }, - }); - - module.exports = Handler; - - /***/ - }, - /* 2 */ - /***/ function (module, exports) { - /* - ## Constant - - 常量集合。 - */ - /* - RE_KEY - 'name|min-max': value - 'name|count': value - 'name|min-max.dmin-dmax': value - 'name|min-max.dcount': value - 'name|count.dmin-dmax': value - 'name|count.dcount': value - 'name|+step': value - - 1 name, 2 step, 3 range [ min, max ], 4 drange [ dmin, dmax ] - - RE_PLACEHOLDER - placeholder(*) - - [正则查看工具](http://www.regexper.com/) - - #26 生成规则 支持 负数,例如 number|-100-100 - */ - module.exports = { - GUID: 1, - RE_KEY: /(.+)\|(?:\+(\d+)|([\+\-]?\d+-?[\+\-]?\d*)?(?:\.(\d+-?\d*))?)/, - RE_RANGE: /([\+\-]?\d+)-?([\+\-]?\d+)?/, - RE_PLACEHOLDER: /\\*@([^@#%&()\?\s]+)(?:\((.*?)\))?/g, - // /\\*@([^@#%&()\?\s\/\.]+)(?:\((.*?)\))?/g - // RE_INDEX: /^index$/, - // RE_KEY: /^key$/ - }; - - /***/ - }, - /* 3 */ - /***/ function (module, exports) { - /* - ## Utilities - */ - var Util = {}; - - Util.extend = function extend() { - var target = arguments[0] || {}, - i = 1, - length = arguments.length, - options, - name, - src, - copy, - clone; - - if (length === 1) { - target = this; - i = 0; - } - - for (; i < length; i++) { - options = arguments[i]; - if (!options) continue; - - for (name in options) { - src = target[name]; - copy = options[name]; - - if (target === copy) continue; - if (copy === undefined) continue; - - if (Util.isArray(copy) || Util.isObject(copy)) { - if (Util.isArray(copy)) clone = src && Util.isArray(src) ? src : []; - if (Util.isObject(copy)) clone = src && Util.isObject(src) ? src : {}; - - target[name] = Util.extend(clone, copy); - } else { - target[name] = copy; - } - } - } - - return target; - }; - - Util.each = function each(obj, iterator, context) { - var i, key; - if (this.type(obj) === 'number') { - for (i = 0; i < obj; i++) { - iterator(i, i); - } - } else if (obj.length === +obj.length) { - for (i = 0; i < obj.length; i++) { - if (iterator.call(context, obj[i], i, obj) === false) break; - } - } else { - for (key in obj) { - if (iterator.call(context, obj[key], key, obj) === false) break; - } - } - }; - - Util.type = function type(obj) { - return obj === null || obj === undefined - ? String(obj) - : Object.prototype.toString - .call(obj) - .match(/\[object (\w+)\]/)[1] - .toLowerCase(); - }; - - Util.each('String Object Array RegExp Function'.split(' '), function (value) { - Util['is' + value] = function (obj) { - return Util.type(obj) === value.toLowerCase(); - }; - }); - - Util.isObjectOrArray = function (value) { - return Util.isObject(value) || Util.isArray(value); - }; - - Util.isNumeric = function (value) { - return !isNaN(parseFloat(value)) && isFinite(value); - }; - - Util.keys = function (obj) { - var keys = []; - for (var key in obj) { - if (obj.hasOwnProperty(key)) keys.push(key); - } - return keys; - }; - Util.values = function (obj) { - var values = []; - for (var key in obj) { - if (obj.hasOwnProperty(key)) values.push(obj[key]); - } - return values; - }; - - /* - ### Mock.heredoc(fn) - - * Mock.heredoc(fn) - - 以直观、安全的方式书写(多行)HTML 模板。 - - **使用示例**如下所示: - - var tpl = Mock.heredoc(function() { - /*! - {{email}}{{age}} - - *\/ - }) - - **相关阅读** - * [Creating multiline strings in JavaScript](http://stackoverflow.com/questions/805107/creating-multiline-strings-in-javascript)、 - */ - Util.heredoc = function heredoc(fn) { - // 1. 移除起始的 function(){ /*! - // 2. 移除末尾的 */ } - // 3. 移除起始和末尾的空格 - return fn - .toString() - .replace(/^[^\/]+\/\*!?/, '') - .replace(/\*\/[^\/]+$/, '') - .replace(/^[\s\xA0]+/, '') - .replace(/[\s\xA0]+$/, ''); // .trim() - }; - - Util.noop = function () {}; - - module.exports = Util; - - /***/ - }, - /* 4 */ - /***/ function (module, exports, __webpack_require__) { - /* - ## Parser - - 解析数据模板(属性名部分)。 - - * Parser.parse( name ) - - ```json - { - parameters: [ name, inc, range, decimal ], - rnage: [ min , max ], - - min: min, - max: max, - count : count, - - decimal: decimal, - dmin: dmin, - dmax: dmax, - dcount: dcount - } - ``` - */ - - var Constant = __webpack_require__(2); - var Random = __webpack_require__(5); - - /* jshint -W041 */ - module.exports = { - parse: function (name) { - name = name == undefined ? '' : name + ''; - - var parameters = (name || '').match(Constant.RE_KEY); - - var range = parameters && parameters[3] && parameters[3].match(Constant.RE_RANGE); - var min = range && range[1] && parseInt(range[1], 10); // || 1 - var max = range && range[2] && parseInt(range[2], 10); // || 1 - // repeat || min-max || 1 - // var count = range ? !range[2] && parseInt(range[1], 10) || Random.integer(min, max) : 1 - var count = range ? (!range[2] ? parseInt(range[1], 10) : Random.integer(min, max)) : undefined; - - var decimal = parameters && parameters[4] && parameters[4].match(Constant.RE_RANGE); - var dmin = decimal && decimal[1] && parseInt(decimal[1], 10); // || 0, - var dmax = decimal && decimal[2] && parseInt(decimal[2], 10); // || 0, - // int || dmin-dmax || 0 - var dcount = decimal ? (!decimal[2] && parseInt(decimal[1], 10)) || Random.integer(dmin, dmax) : undefined; - - var result = { - // 1 name, 2 inc, 3 range, 4 decimal - parameters: parameters, - // 1 min, 2 max - range: range, - min: min, - max: max, - // min-max - count: count, - // 是否有 decimal - decimal: decimal, - dmin: dmin, - dmax: dmax, - // dmin-dimax - dcount: dcount, - }; - - for (var r in result) { - if (result[r] != undefined) return result; - } - - return {}; - }, - }; - - /***/ - }, - /* 5 */ - /***/ function (module, exports, __webpack_require__) { - /* - ## Mock.Random - - 工具类,用于生成各种随机数据。 - */ - - var Util = __webpack_require__(3); - - var Random = { - extend: Util.extend, - }; - - Random.extend(__webpack_require__(6)); - Random.extend(__webpack_require__(7)); - Random.extend(__webpack_require__(8)); - Random.extend(__webpack_require__(10)); - Random.extend(__webpack_require__(13)); - Random.extend(__webpack_require__(15)); - Random.extend(__webpack_require__(16)); - Random.extend(__webpack_require__(17)); - Random.extend(__webpack_require__(14)); - Random.extend(__webpack_require__(19)); - - module.exports = Random; - - /***/ - }, - /* 6 */ - /***/ function (module, exports) { - /* - ## Basics - */ - module.exports = { - // 返回一个随机的布尔值。 - boolean: function (min, max, cur) { - if (cur !== undefined) { - min = typeof min !== 'undefined' && !isNaN(min) ? parseInt(min, 10) : 1; - max = typeof max !== 'undefined' && !isNaN(max) ? parseInt(max, 10) : 1; - return Math.random() > (1.0 / (min + max)) * min ? !cur : cur; - } - - return Math.random() >= 0.5; - }, - bool: function (min, max, cur) { - return this.boolean(min, max, cur); - }, - // 返回一个随机的自然数(大于等于 0 的整数)。 - natural: function (min, max) { - min = typeof min !== 'undefined' ? parseInt(min, 10) : 0; - max = typeof max !== 'undefined' ? parseInt(max, 10) : 9007199254740992; // 2^53 - return Math.round(Math.random() * (max - min)) + min; - }, - // 返回一个随机的整数。 - integer: function (min, max) { - min = typeof min !== 'undefined' ? parseInt(min, 10) : -9007199254740992; - max = typeof max !== 'undefined' ? parseInt(max, 10) : 9007199254740992; // 2^53 - return Math.round(Math.random() * (max - min)) + min; - }, - int: function (min, max) { - return this.integer(min, max); - }, - // 返回一个随机的浮点数。 - float: function (min, max, dmin, dmax) { - dmin = dmin === undefined ? 0 : dmin; - dmin = Math.max(Math.min(dmin, 17), 0); - dmax = dmax === undefined ? 17 : dmax; - dmax = Math.max(Math.min(dmax, 17), 0); - var ret = this.integer(min, max) + '.'; - for (var i = 0, dcount = this.natural(dmin, dmax); i < dcount; i++) { - ret += - // 最后一位不能为 0:如果最后一位为 0,会被 JS 引擎忽略掉。 - i < dcount - 1 ? this.character('number') : this.character('123456789'); - } - return parseFloat(ret, 10); - }, - // 返回一个随机字符。 - character: function (pool) { - var pools = { - lower: 'abcdefghijklmnopqrstuvwxyz', - upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', - number: '0123456789', - symbol: '!@#$%^&*()[]', - }; - pools.alpha = pools.lower + pools.upper; - pools['undefined'] = pools.lower + pools.upper + pools.number + pools.symbol; - - pool = pools[('' + pool).toLowerCase()] || pool; - return pool.charAt(this.natural(0, pool.length - 1)); - }, - char: function (pool) { - return this.character(pool); - }, - // 返回一个随机字符串。 - string: function (pool, min, max) { - var len; - switch (arguments.length) { - case 0: // () - len = this.natural(3, 7); - break; - case 1: // ( length ) - len = pool; - pool = undefined; - break; - case 2: - // ( pool, length ) - if (typeof arguments[0] === 'string') { - len = min; - } else { - // ( min, max ) - len = this.natural(pool, min); - pool = undefined; - } - break; - case 3: - len = this.natural(min, max); - break; - } - - var text = ''; - for (var i = 0; i < len; i++) { - text += this.character(pool); - } - - return text; - }, - str: function (/*pool, min, max*/) { - return this.string.apply(this, arguments); - }, - // 返回一个整型数组。 - range: function (start, stop, step) { - // range( stop ) - if (arguments.length <= 1) { - stop = start || 0; - start = 0; - } - // range( start, stop ) - step = arguments[2] || 1; - - start = +start; - stop = +stop; - step = +step; - - var len = Math.max(Math.ceil((stop - start) / step), 0); - var idx = 0; - var range = new Array(len); - - while (idx < len) { - range[idx++] = start; - start += step; - } - - return range; - }, - }; - - /***/ - }, - /* 7 */ - /***/ function (module, exports) { - /* - ## Date - */ - var patternLetters = { - yyyy: 'getFullYear', - yy: function (date) { - return ('' + date.getFullYear()).slice(2); - }, - y: 'yy', - - MM: function (date) { - var m = date.getMonth() + 1; - return m < 10 ? '0' + m : m; - }, - M: function (date) { - return date.getMonth() + 1; - }, - - dd: function (date) { - var d = date.getDate(); - return d < 10 ? '0' + d : d; - }, - d: 'getDate', - - HH: function (date) { - var h = date.getHours(); - return h < 10 ? '0' + h : h; - }, - H: 'getHours', - hh: function (date) { - var h = date.getHours() % 12; - return h < 10 ? '0' + h : h; - }, - h: function (date) { - return date.getHours() % 12; - }, - - mm: function (date) { - var m = date.getMinutes(); - return m < 10 ? '0' + m : m; - }, - m: 'getMinutes', - - ss: function (date) { - var s = date.getSeconds(); - return s < 10 ? '0' + s : s; - }, - s: 'getSeconds', - - SS: function (date) { - var ms = date.getMilliseconds(); - return (ms < 10 && '00' + ms) || (ms < 100 && '0' + ms) || ms; - }, - S: 'getMilliseconds', - - A: function (date) { - return date.getHours() < 12 ? 'AM' : 'PM'; - }, - a: function (date) { - return date.getHours() < 12 ? 'am' : 'pm'; - }, - T: 'getTime', - }; - module.exports = { - // 日期占位符集合。 - _patternLetters: patternLetters, - // 日期占位符正则。 - _rformat: new RegExp( - (function () { - var re = []; - for (var i in patternLetters) re.push(i); - return '(' + re.join('|') + ')'; - })(), - 'g', - ), - // 格式化日期。 - _formatDate: function (date, format) { - return format.replace(this._rformat, function creatNewSubString($0, flag) { - return typeof patternLetters[flag] === 'function' - ? patternLetters[flag](date) - : patternLetters[flag] in patternLetters - ? creatNewSubString($0, patternLetters[flag]) - : date[patternLetters[flag]](); - }); - }, - // 生成一个随机的 Date 对象。 - _randomDate: function (min, max) { - // min, max - min = min === undefined ? new Date(0) : min; - max = max === undefined ? new Date() : max; - return new Date(Math.random() * (max.getTime() - min.getTime())); - }, - // 返回一个随机的日期字符串。 - date: function (format) { - format = format || 'yyyy-MM-dd'; - return this._formatDate(this._randomDate(), format); - }, - // 返回一个随机的时间字符串。 - time: function (format) { - format = format || 'HH:mm:ss'; - return this._formatDate(this._randomDate(), format); - }, - // 返回一个随机的日期和时间字符串。 - datetime: function (format) { - format = format || 'yyyy-MM-dd HH:mm:ss'; - return this._formatDate(this._randomDate(), format); - }, - // 返回当前的日期和时间字符串。 - now: function (unit, format) { - // now(unit) now(format) - if (arguments.length === 1) { - // now(format) - if (!/year|month|day|hour|minute|second|week/.test(unit)) { - format = unit; - unit = ''; - } - } - unit = (unit || '').toLowerCase(); - format = format || 'yyyy-MM-dd HH:mm:ss'; - - var date = new Date(); - - /* jshint -W086 */ - // 参考自 http://momentjs.cn/docs/#/manipulating/start-of/ - switch (unit) { - case 'year': - date.setMonth(0); - case 'month': - date.setDate(1); - case 'week': - case 'day': - date.setHours(0); - case 'hour': - date.setMinutes(0); - case 'minute': - date.setSeconds(0); - case 'second': - date.setMilliseconds(0); - } - switch (unit) { - case 'week': - date.setDate(date.getDate() - date.getDay()); - } - - return this._formatDate(date, format); - }, - }; - - /***/ - }, - /* 8 */ - /***/ function (module, exports, __webpack_require__) { - /* WEBPACK VAR INJECTION */ (function (module) { - /* global document */ - /* - ## Image - */ - module.exports = { - // 常见的广告宽高 - _adSize: [ - '300x250', - '250x250', - '240x400', - '336x280', - '180x150', - '720x300', - '468x60', - '234x60', - '88x31', - '120x90', - '120x60', - '120x240', - '125x125', - '728x90', - '160x600', - '120x600', - '300x600', - ], - // 常见的屏幕宽高 - _screenSize: [ - '320x200', - '320x240', - '640x480', - '800x480', - '800x480', - '1024x600', - '1024x768', - '1280x800', - '1440x900', - '1920x1200', - '2560x1600', - ], - // 常见的视频宽高 - _videoSize: ['720x480', '768x576', '1280x720', '1920x1080'], - /* - 生成一个随机的图片地址。 - - 替代图片源 - http://fpoimg.com/ - 参考自 - http://rensanning.iteye.com/blog/1933310 - http://code.tutsplus.com/articles/the-top-8-placeholders-for-web-designers--net-19485 - */ - image: function (size, background, foreground, format, text) { - // Random.image( size, background, foreground, text ) - if (arguments.length === 4) { - text = format; - format = undefined; - } - // Random.image( size, background, text ) - if (arguments.length === 3) { - text = foreground; - foreground = undefined; - } - // Random.image() - if (!size) size = this.pick(this._adSize); - - if (background && ~background.indexOf('#')) background = background.slice(1); - if (foreground && ~foreground.indexOf('#')) foreground = foreground.slice(1); - - // http://dummyimage.com/600x400/cc00cc/470047.png&text=hello - return ( - 'http://dummyimage.com/' + - size + - (background ? '/' + background : '') + - (foreground ? '/' + foreground : '') + - (format ? '.' + format : '') + - (text ? '&text=' + text : '') - ); - }, - img: function () { - return this.image.apply(this, arguments); - }, - - /* - BrandColors - http://brandcolors.net/ - A collection of major brand color codes curated by Galen Gidman. - 大牌公司的颜色集合 - - // 获取品牌和颜色 - $('h2').each(function(index, item){ - item = $(item) - console.log('\'' + item.text() + '\'', ':', '\'' + item.next().text() + '\'', ',') - }) - */ - _brandColors: { - '4ormat': '#fb0a2a', - '500px': '#02adea', - 'About.me (blue)': '#00405d', - 'About.me (yellow)': '#ffcc33', - Addvocate: '#ff6138', - Adobe: '#ff0000', - Aim: '#fcd20b', - Amazon: '#e47911', - Android: '#a4c639', - "Angie's List": '#7fbb00', - AOL: '#0060a3', - Atlassian: '#003366', - Behance: '#053eff', - 'Big Cartel': '#97b538', - bitly: '#ee6123', - Blogger: '#fc4f08', - Boeing: '#0039a6', - 'Booking.com': '#003580', - Carbonmade: '#613854', - Cheddar: '#ff7243', - 'Code School': '#3d4944', - Delicious: '#205cc0', - Dell: '#3287c1', - Designmoo: '#e54a4f', - Deviantart: '#4e6252', - 'Designer News': '#2d72da', - Devour: '#fd0001', - DEWALT: '#febd17', - 'Disqus (blue)': '#59a3fc', - 'Disqus (orange)': '#db7132', - Dribbble: '#ea4c89', - Dropbox: '#3d9ae8', - Drupal: '#0c76ab', - Dunked: '#2a323a', - eBay: '#89c507', - Ember: '#f05e1b', - Engadget: '#00bdf6', - Envato: '#528036', - Etsy: '#eb6d20', - Evernote: '#5ba525', - 'Fab.com': '#dd0017', - Facebook: '#3b5998', - Firefox: '#e66000', - 'Flickr (blue)': '#0063dc', - 'Flickr (pink)': '#ff0084', - Forrst: '#5b9a68', - Foursquare: '#25a0ca', - Garmin: '#007cc3', - GetGlue: '#2d75a2', - Gimmebar: '#f70078', - GitHub: '#171515', - 'Google Blue': '#0140ca', - 'Google Green': '#16a61e', - 'Google Red': '#dd1812', - 'Google Yellow': '#fcca03', - 'Google+': '#dd4b39', - Grooveshark: '#f77f00', - Groupon: '#82b548', - 'Hacker News': '#ff6600', - HelloWallet: '#0085ca', - 'Heroku (light)': '#c7c5e6', - 'Heroku (dark)': '#6567a5', - HootSuite: '#003366', - Houzz: '#73ba37', - HTML5: '#ec6231', - IKEA: '#ffcc33', - IMDb: '#f3ce13', - Instagram: '#3f729b', - Intel: '#0071c5', - Intuit: '#365ebf', - Kickstarter: '#76cc1e', - kippt: '#e03500', - Kodery: '#00af81', - LastFM: '#c3000d', - LinkedIn: '#0e76a8', - Livestream: '#cf0005', - Lumo: '#576396', - Mixpanel: '#a086d3', - Meetup: '#e51937', - Nokia: '#183693', - NVIDIA: '#76b900', - Opera: '#cc0f16', - Path: '#e41f11', - 'PayPal (dark)': '#1e477a', - 'PayPal (light)': '#3b7bbf', - Pinboard: '#0000e6', - Pinterest: '#c8232c', - PlayStation: '#665cbe', - Pocket: '#ee4056', - Prezi: '#318bff', - Pusha: '#0f71b4', - Quora: '#a82400', - 'QUOTE.fm': '#66ceff', - Rdio: '#008fd5', - Readability: '#9c0000', - 'Red Hat': '#cc0000', - Resource: '#7eb400', - Rockpack: '#0ba6ab', - Roon: '#62b0d9', - RSS: '#ee802f', - Salesforce: '#1798c1', - Samsung: '#0c4da2', - Shopify: '#96bf48', - Skype: '#00aff0', - Snagajob: '#f47a20', - Softonic: '#008ace', - SoundCloud: '#ff7700', - 'Space Box': '#f86960', - Spotify: '#81b71a', - Sprint: '#fee100', - Squarespace: '#121212', - StackOverflow: '#ef8236', - Staples: '#cc0000', - 'Status Chart': '#d7584f', - Stripe: '#008cdd', - StudyBlue: '#00afe1', - StumbleUpon: '#f74425', - 'T-Mobile': '#ea0a8e', - Technorati: '#40a800', - 'The Next Web': '#ef4423', - Treehouse: '#5cb868', - Trulia: '#5eab1f', - Tumblr: '#34526f', - 'Twitch.tv': '#6441a5', - Twitter: '#00acee', - TYPO3: '#ff8700', - Ubuntu: '#dd4814', - Ustream: '#3388ff', - Verizon: '#ef1d1d', - Vimeo: '#86c9ef', - Vine: '#00a478', - Virb: '#06afd8', - 'Virgin Media': '#cc0000', - Wooga: '#5b009c', - 'WordPress (blue)': '#21759b', - 'WordPress (orange)': '#d54e21', - 'WordPress (grey)': '#464646', - Wunderlist: '#2b88d9', - XBOX: '#9bc848', - XING: '#126567', - 'Yahoo!': '#720e9e', - Yandex: '#ffcc00', - Yelp: '#c41200', - YouTube: '#c4302b', - Zalongo: '#5498dc', - Zendesk: '#78a300', - Zerply: '#9dcc7a', - Zootool: '#5e8b1d', - }, - _brandNames: function () { - var brands = []; - for (var b in this._brandColors) { - brands.push(b); - } - return brands; - }, - /* - 生成一段随机的 Base64 图片编码。 - - https://github.com/imsky/holder - Holder renders image placeholders entirely on the client side. - - dataImageHolder: function(size) { - return 'holder.js/' + size - }, - */ - dataImage: function (size, text) { - var canvas; - if (typeof document !== 'undefined') { - canvas = document.createElement('canvas'); - } else { - /* - https://github.com/Automattic/node-canvas - npm install canvas --save - 安装问题: - * http://stackoverflow.com/questions/22953206/gulp-issues-with-cario-install-command-not-found-when-trying-to-installing-canva - * https://github.com/Automattic/node-canvas/issues/415 - * https://github.com/Automattic/node-canvas/wiki/_pages - - PS:node-canvas 的安装过程实在是太繁琐了,所以不放入 package.json 的 dependencies。 - */ - var Canvas = module.require('canvas'); - canvas = new Canvas(); - } - - var ctx = canvas && canvas.getContext && canvas.getContext('2d'); - if (!canvas || !ctx) return ''; - - if (!size) size = this.pick(this._adSize); - text = text !== undefined ? text : size; - - size = size.split('x'); - - var width = parseInt(size[0], 10), - height = parseInt(size[1], 10), - background = this._brandColors[this.pick(this._brandNames())], - foreground = '#FFF', - text_height = 14, - font = 'sans-serif'; - - canvas.width = width; - canvas.height = height; - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - ctx.fillStyle = background; - ctx.fillRect(0, 0, width, height); - ctx.fillStyle = foreground; - ctx.font = 'bold ' + text_height + 'px ' + font; - ctx.fillText(text, width / 2, height / 2, width); - return canvas.toDataURL('image/png'); - }, - }; - /* WEBPACK VAR INJECTION */ - }).call(exports, __webpack_require__(9)(module)); - - /***/ - }, - /* 9 */ - /***/ function (module, exports) { - module.exports = function (module) { - if (!module.webpackPolyfill) { - module.deprecate = function () {}; - module.paths = []; - // module.parent = undefined by default - module.children = []; - module.webpackPolyfill = 1; - } - return module; - }; - - /***/ - }, - /* 10 */ - /***/ function (module, exports, __webpack_require__) { - /* - ## Color - - http://llllll.li/randomColor/ - A color generator for JavaScript. - randomColor generates attractive colors by default. More specifically, randomColor produces bright colors with a reasonably high saturation. This makes randomColor particularly useful for data visualizations and generative art. - - http://randomcolour.com/ - var bg_colour = Math.floor(Math.random() * 16777215).toString(16); - bg_colour = "#" + ("000000" + bg_colour).slice(-6); - document.bgColor = bg_colour; - - http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/ - Creating random colors is actually more difficult than it seems. The randomness itself is easy, but aesthetically pleasing randomness is more difficult. - https://github.com/devongovett/color-generator - - http://www.paulirish.com/2009/random-hex-color-code-snippets/ - Random Hex Color Code Generator in JavaScript - - http://chancejs.com/#color - chance.color() - // => '#79c157' - chance.color({format: 'hex'}) - // => '#d67118' - chance.color({format: 'shorthex'}) - // => '#60f' - chance.color({format: 'rgb'}) - // => 'rgb(110,52,164)' - - http://tool.c7sky.com/webcolor - 网页设计常用色彩搭配表 - - https://github.com/One-com/one-color - An OO-based JavaScript color parser/computation toolkit with support for RGB, HSV, HSL, CMYK, and alpha channels. - API 很赞 - - https://github.com/harthur/color - JavaScript color conversion and manipulation library - - https://github.com/leaverou/css-colors - Share & convert CSS colors - http://leaverou.github.io/css-colors/#slategray - Type a CSS color keyword, #hex, hsl(), rgba(), whatever: - - 色调 hue - http://baike.baidu.com/view/23368.htm - 色调指的是一幅画中画面色彩的总体倾向,是大的色彩效果。 - 饱和度 saturation - http://baike.baidu.com/view/189644.htm - 饱和度是指色彩的鲜艳程度,也称色彩的纯度。饱和度取决于该色中含色成分和消色成分(灰色)的比例。含色成分越大,饱和度越大;消色成分越大,饱和度越小。 - 亮度 brightness - http://baike.baidu.com/view/34773.htm - 亮度是指发光体(反光体)表面发光(反光)强弱的物理量。 - 照度 luminosity - 物体被照亮的程度,采用单位面积所接受的光通量来表示,表示单位为勒[克斯](Lux,lx) ,即 1m / m2 。 - - http://stackoverflow.com/questions/1484506/random-color-generator-in-javascript - var letters = '0123456789ABCDEF'.split('') - var color = '#' - for (var i = 0; i < 6; i++) { - color += letters[Math.floor(Math.random() * 16)] - } - return color - - // 随机生成一个无脑的颜色,格式为 '#RRGGBB'。 - // _brainlessColor() - var color = Math.floor( - Math.random() * - (16 * 16 * 16 * 16 * 16 * 16 - 1) - ).toString(16) - color = "#" + ("000000" + color).slice(-6) - return color.toUpperCase() - */ - - var Convert = __webpack_require__(11); - var DICT = __webpack_require__(12); - - module.exports = { - // 随机生成一个有吸引力的颜色,格式为 '#RRGGBB'。 - color: function (name) { - if (name || DICT[name]) return DICT[name].nicer; - return this.hex(); - }, - // #DAC0DE - hex: function () { - var hsv = this._goldenRatioColor(); - var rgb = Convert.hsv2rgb(hsv); - var hex = Convert.rgb2hex(rgb[0], rgb[1], rgb[2]); - return hex; - }, - // rgb(128,255,255) - rgb: function () { - var hsv = this._goldenRatioColor(); - var rgb = Convert.hsv2rgb(hsv); - return 'rgb(' + parseInt(rgb[0], 10) + ', ' + parseInt(rgb[1], 10) + ', ' + parseInt(rgb[2], 10) + ')'; - }, - // rgba(128,255,255,0.3) - rgba: function () { - var hsv = this._goldenRatioColor(); - var rgb = Convert.hsv2rgb(hsv); - return ( - 'rgba(' + - parseInt(rgb[0], 10) + - ', ' + - parseInt(rgb[1], 10) + - ', ' + - parseInt(rgb[2], 10) + - ', ' + - Math.random().toFixed(2) + - ')' - ); - }, - // hsl(300,80%,90%) - hsl: function () { - var hsv = this._goldenRatioColor(); - var hsl = Convert.hsv2hsl(hsv); - return 'hsl(' + parseInt(hsl[0], 10) + ', ' + parseInt(hsl[1], 10) + ', ' + parseInt(hsl[2], 10) + ')'; - }, - // http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/ - // https://github.com/devongovett/color-generator/blob/master/index.js - // 随机生成一个有吸引力的颜色。 - _goldenRatioColor: function (saturation, value) { - this._goldenRatio = 0.618033988749895; - this._hue = this._hue || Math.random(); - this._hue += this._goldenRatio; - this._hue %= 1; - - if (typeof saturation !== 'number') saturation = 0.5; - if (typeof value !== 'number') value = 0.95; - - return [this._hue * 360, saturation * 100, value * 100]; - }, - }; - - /***/ - }, - /* 11 */ - /***/ function (module, exports) { - /* - ## Color Convert - - http://blog.csdn.net/idfaya/article/details/6770414 - 颜色空间RGB与HSV(HSL)的转换 - */ - // https://github.com/harthur/color-convert/blob/master/conversions.js - module.exports = { - rgb2hsl: function rgb2hsl(rgb) { - var r = rgb[0] / 255, - g = rgb[1] / 255, - b = rgb[2] / 255, - min = Math.min(r, g, b), - max = Math.max(r, g, b), - delta = max - min, - h, - s, - l; - - if (max == min) h = 0; - else if (r == max) h = (g - b) / delta; - else if (g == max) h = 2 + (b - r) / delta; - else if (b == max) h = 4 + (r - g) / delta; - - h = Math.min(h * 60, 360); - - if (h < 0) h += 360; - - l = (min + max) / 2; - - if (max == min) s = 0; - else if (l <= 0.5) s = delta / (max + min); - else s = delta / (2 - max - min); - - return [h, s * 100, l * 100]; - }, - rgb2hsv: function rgb2hsv(rgb) { - var r = rgb[0], - g = rgb[1], - b = rgb[2], - min = Math.min(r, g, b), - max = Math.max(r, g, b), - delta = max - min, - h, - s, - v; - - if (max === 0) s = 0; - else s = ((delta / max) * 1000) / 10; - - if (max == min) h = 0; - else if (r == max) h = (g - b) / delta; - else if (g == max) h = 2 + (b - r) / delta; - else if (b == max) h = 4 + (r - g) / delta; - - h = Math.min(h * 60, 360); - - if (h < 0) h += 360; - - v = ((max / 255) * 1000) / 10; - - return [h, s, v]; - }, - hsl2rgb: function hsl2rgb(hsl) { - var h = hsl[0] / 360, - s = hsl[1] / 100, - l = hsl[2] / 100, - t1, - t2, - t3, - rgb, - val; - - if (s === 0) { - val = l * 255; - return [val, val, val]; - } - - if (l < 0.5) t2 = l * (1 + s); - else t2 = l + s - l * s; - t1 = 2 * l - t2; - - rgb = [0, 0, 0]; - for (var i = 0; i < 3; i++) { - t3 = h + (1 / 3) * -(i - 1); - if (t3 < 0) t3++; - if (t3 > 1) t3--; - - if (6 * t3 < 1) val = t1 + (t2 - t1) * 6 * t3; - else if (2 * t3 < 1) val = t2; - else if (3 * t3 < 2) val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; - else val = t1; - - rgb[i] = val * 255; - } - - return rgb; - }, - hsl2hsv: function hsl2hsv(hsl) { - var h = hsl[0], - s = hsl[1] / 100, - l = hsl[2] / 100, - sv, - v; - l *= 2; - s *= l <= 1 ? l : 2 - l; - v = (l + s) / 2; - sv = (2 * s) / (l + s); - return [h, sv * 100, v * 100]; - }, - hsv2rgb: function hsv2rgb(hsv) { - var h = hsv[0] / 60; - var s = hsv[1] / 100; - var v = hsv[2] / 100; - var hi = Math.floor(h) % 6; - - var f = h - Math.floor(h); - var p = 255 * v * (1 - s); - var q = 255 * v * (1 - s * f); - var t = 255 * v * (1 - s * (1 - f)); - - v = 255 * v; - - switch (hi) { - case 0: - return [v, t, p]; - case 1: - return [q, v, p]; - case 2: - return [p, v, t]; - case 3: - return [p, q, v]; - case 4: - return [t, p, v]; - case 5: - return [v, p, q]; - } - }, - hsv2hsl: function hsv2hsl(hsv) { - var h = hsv[0], - s = hsv[1] / 100, - v = hsv[2] / 100, - sl, - l; - - l = (2 - s) * v; - sl = s * v; - sl /= l <= 1 ? l : 2 - l; - l /= 2; - return [h, sl * 100, l * 100]; - }, - // http://www.140byt.es/keywords/color - rgb2hex: function ( - a, // red, as a number from 0 to 255 - b, // green, as a number from 0 to 255 - c, // blue, as a number from 0 to 255 - ) { - return '#' + (((((256 + a) << 8) | b) << 8) | c).toString(16).slice(1); - }, - hex2rgb: function ( - a, // take a "#xxxxxx" hex string, - ) { - a = ('0x' + a.slice(1).replace(a.length > 4 ? a : /./g, '$&$&')) | 0; - return [a >> 16, (a >> 8) & 255, a & 255]; - }, - }; - - /***/ - }, - /* 12 */ - /***/ function (module, exports) { - /* - ## Color 字典数据 - - 字典数据来源 [A nicer color palette for the web](http://clrs.cc/) - */ - module.exports = { - // name value nicer - navy: { - value: '#000080', - nicer: '#001F3F', - }, - blue: { - value: '#0000ff', - nicer: '#0074D9', - }, - aqua: { - value: '#00ffff', - nicer: '#7FDBFF', - }, - teal: { - value: '#008080', - nicer: '#39CCCC', - }, - olive: { - value: '#008000', - nicer: '#3D9970', - }, - green: { - value: '#008000', - nicer: '#2ECC40', - }, - lime: { - value: '#00ff00', - nicer: '#01FF70', - }, - yellow: { - value: '#ffff00', - nicer: '#FFDC00', - }, - orange: { - value: '#ffa500', - nicer: '#FF851B', - }, - red: { - value: '#ff0000', - nicer: '#FF4136', - }, - maroon: { - value: '#800000', - nicer: '#85144B', - }, - fuchsia: { - value: '#ff00ff', - nicer: '#F012BE', - }, - purple: { - value: '#800080', - nicer: '#B10DC9', - }, - silver: { - value: '#c0c0c0', - nicer: '#DDDDDD', - }, - gray: { - value: '#808080', - nicer: '#AAAAAA', - }, - black: { - value: '#000000', - nicer: '#111111', - }, - white: { - value: '#FFFFFF', - nicer: '#FFFFFF', - }, - }; - - /***/ - }, - /* 13 */ - /***/ function (module, exports, __webpack_require__) { - /* - ## Text - - http://www.lipsum.com/ - */ - var Basic = __webpack_require__(6); - var Helper = __webpack_require__(14); - - function range(defaultMin, defaultMax, min, max) { - return min === undefined - ? Basic.natural(defaultMin, defaultMax) // () - : max === undefined - ? min // ( len ) - : Basic.natural(parseInt(min, 10), parseInt(max, 10)); // ( min, max ) - } - - module.exports = { - // 随机生成一段文本。 - paragraph: function (min, max) { - var len = range(3, 7, min, max); - var result = []; - for (var i = 0; i < len; i++) { - result.push(this.sentence()); - } - return result.join(' '); - }, - // - cparagraph: function (min, max) { - var len = range(3, 7, min, max); - var result = []; - for (var i = 0; i < len; i++) { - result.push(this.csentence()); - } - return result.join(''); - }, - // 随机生成一个句子,第一个单词的首字母大写。 - sentence: function (min, max) { - var len = range(12, 18, min, max); - var result = []; - for (var i = 0; i < len; i++) { - result.push(this.word()); - } - return Helper.capitalize(result.join(' ')) + '.'; - }, - // 随机生成一个中文句子。 - csentence: function (min, max) { - var len = range(12, 18, min, max); - var result = []; - for (var i = 0; i < len; i++) { - result.push(this.cword()); - } - - return result.join('') + '。'; - }, - // 随机生成一个单词。 - word: function (min, max) { - var len = range(3, 10, min, max); - var result = ''; - for (var i = 0; i < len; i++) { - result += Basic.character('lower'); - } - return result; - }, - // 随机生成一个或多个汉字。 - cword: function (pool, min, max) { - // 最常用的 500 个汉字 http://baike.baidu.com/view/568436.htm - var DICT_KANZI = - '的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严龙飞'; - - var len; - switch (arguments.length) { - case 0: // () - pool = DICT_KANZI; - len = 1; - break; - case 1: // ( pool ) - if (typeof arguments[0] === 'string') { - len = 1; - } else { - // ( length ) - len = pool; - pool = DICT_KANZI; - } - break; - case 2: - // ( pool, length ) - if (typeof arguments[0] === 'string') { - len = min; - } else { - // ( min, max ) - len = this.natural(pool, min); - pool = DICT_KANZI; - } - break; - case 3: - len = this.natural(min, max); - break; - } - - var result = ''; - for (var i = 0; i < len; i++) { - result += pool.charAt(this.natural(0, pool.length - 1)); - } - return result; - }, - // 随机生成一句标题,其中每个单词的首字母大写。 - title: function (min, max) { - var len = range(3, 7, min, max); - var result = []; - for (var i = 0; i < len; i++) { - result.push(this.capitalize(this.word())); - } - return result.join(' '); - }, - // 随机生成一句中文标题。 - ctitle: function (min, max) { - var len = range(3, 7, min, max); - var result = []; - for (var i = 0; i < len; i++) { - result.push(this.cword()); - } - return result.join(''); - }, - }; - - /***/ - }, - /* 14 */ - /***/ function (module, exports, __webpack_require__) { - /* - ## Helpers - */ - - var Util = __webpack_require__(3); - - module.exports = { - // 把字符串的第一个字母转换为大写。 - capitalize: function (word) { - return (word + '').charAt(0).toUpperCase() + (word + '').substr(1); - }, - // 把字符串转换为大写。 - upper: function (str) { - return (str + '').toUpperCase(); - }, - // 把字符串转换为小写。 - lower: function (str) { - return (str + '').toLowerCase(); - }, - // 从数组中随机选取一个元素,并返回。 - pick: function pick(arr, min, max) { - // pick( item1, item2 ... ) - if (!Util.isArray(arr)) { - arr = [].slice.call(arguments); - min = 1; - max = 1; - } else { - // pick( [ item1, item2 ... ] ) - if (min === undefined) min = 1; - - // pick( [ item1, item2 ... ], count ) - if (max === undefined) max = min; - } - - if (min === 1 && max === 1) return arr[this.natural(0, arr.length - 1)]; - - // pick( [ item1, item2 ... ], min, max ) - return this.shuffle(arr, min, max); - - // 通过参数个数判断方法签名,扩展性太差!#90 - // switch (arguments.length) { - // case 1: - // // pick( [ item1, item2 ... ] ) - // return arr[this.natural(0, arr.length - 1)] - // case 2: - // // pick( [ item1, item2 ... ], count ) - // max = min - // /* falls through */ - // case 3: - // // pick( [ item1, item2 ... ], min, max ) - // return this.shuffle(arr, min, max) - // } - }, - /* - 打乱数组中元素的顺序,并返回。 - Given an array, scramble the order and return it. - - 其他的实现思路: - // https://code.google.com/p/jslibs/wiki/JavascriptTips - result = result.sort(function() { - return Math.random() - 0.5 - }) - */ - shuffle: function shuffle(arr, min, max) { - arr = arr || []; - var old = arr.slice(0), - result = [], - index = 0, - length = old.length; - for (var i = 0; i < length; i++) { - index = this.natural(0, old.length - 1); - result.push(old[index]); - old.splice(index, 1); - } - switch (arguments.length) { - case 0: - case 1: - return result; - case 2: - max = min; - /* falls through */ - case 3: - min = parseInt(min, 10); - max = parseInt(max, 10); - return result.slice(0, this.natural(min, max)); - } - }, - /* - * Random.order(item, item) - * Random.order([item, item ...]) - - 顺序获取数组中的元素 - - [JSON导入数组支持数组数据录入](https://github.com/thx/RAP/issues/22) - - 不支持单独调用! - */ - order: function order(array) { - order.cache = order.cache || {}; - - if (arguments.length > 1) array = [].slice.call(arguments, 0); - - // options.context.path/templatePath - var options = order.options; - var templatePath = options.context.templatePath.join('.'); - - var cache = (order.cache[templatePath] = order.cache[templatePath] || { - index: 0, - array: array, - }); - - return cache.array[cache.index++ % cache.array.length]; - }, - }; - - /***/ - }, - /* 15 */ - /***/ function (module, exports) { - /* - ## Name - - [Beyond the Top 1000 Names](http://www.ssa.gov/oact/babynames/limits.html) - */ - module.exports = { - // 随机生成一个常见的英文名。 - first: function () { - var names = [ - // male - 'James', - 'John', - 'Robert', - 'Michael', - 'William', - 'David', - 'Richard', - 'Charles', - 'Joseph', - 'Thomas', - 'Christopher', - 'Daniel', - 'Paul', - 'Mark', - 'Donald', - 'George', - 'Kenneth', - 'Steven', - 'Edward', - 'Brian', - 'Ronald', - 'Anthony', - 'Kevin', - 'Jason', - 'Matthew', - 'Gary', - 'Timothy', - 'Jose', - 'Larry', - 'Jeffrey', - 'Frank', - 'Scott', - 'Eric', - ].concat([ - // female - 'Mary', - 'Patricia', - 'Linda', - 'Barbara', - 'Elizabeth', - 'Jennifer', - 'Maria', - 'Susan', - 'Margaret', - 'Dorothy', - 'Lisa', - 'Nancy', - 'Karen', - 'Betty', - 'Helen', - 'Sandra', - 'Donna', - 'Carol', - 'Ruth', - 'Sharon', - 'Michelle', - 'Laura', - 'Sarah', - 'Kimberly', - 'Deborah', - 'Jessica', - 'Shirley', - 'Cynthia', - 'Angela', - 'Melissa', - 'Brenda', - 'Amy', - 'Anna', - ]); - return this.pick(names); - // or this.capitalize(this.word()) - }, - // 随机生成一个常见的英文姓。 - last: function () { - var names = [ - 'Smith', - 'Johnson', - 'Williams', - 'Brown', - 'Jones', - 'Miller', - 'Davis', - 'Garcia', - 'Rodriguez', - 'Wilson', - 'Martinez', - 'Anderson', - 'Taylor', - 'Thomas', - 'Hernandez', - 'Moore', - 'Martin', - 'Jackson', - 'Thompson', - 'White', - 'Lopez', - 'Lee', - 'Gonzalez', - 'Harris', - 'Clark', - 'Lewis', - 'Robinson', - 'Walker', - 'Perez', - 'Hall', - 'Young', - 'Allen', - ]; - return this.pick(names); - // or this.capitalize(this.word()) - }, - // 随机生成一个常见的英文姓名。 - name: function (middle) { - return this.first() + ' ' + (middle ? this.first() + ' ' : '') + this.last(); - }, - /* - 随机生成一个常见的中文姓。 - [世界常用姓氏排行](http://baike.baidu.com/view/1719115.htm) - [玄派网 - 网络小说创作辅助平台](http://xuanpai.sinaapp.com/) - */ - cfirst: function () { - var names = ( - '王 李 张 刘 陈 杨 赵 黄 周 吴 ' + - '徐 孙 胡 朱 高 林 何 郭 马 罗 ' + - '梁 宋 郑 谢 韩 唐 冯 于 董 萧 ' + - '程 曹 袁 邓 许 傅 沈 曾 彭 吕 ' + - '苏 卢 蒋 蔡 贾 丁 魏 薛 叶 阎 ' + - '余 潘 杜 戴 夏 锺 汪 田 任 姜 ' + - '范 方 石 姚 谭 廖 邹 熊 金 陆 ' + - '郝 孔 白 崔 康 毛 邱 秦 江 史 ' + - '顾 侯 邵 孟 龙 万 段 雷 钱 汤 ' + - '尹 黎 易 常 武 乔 贺 赖 龚 文' - ).split(' '); - return this.pick(names); - }, - /* - 随机生成一个常见的中文名。 - [中国最常见名字前50名_三九算命网](http://www.name999.net/xingming/xingshi/20131004/48.html) - */ - clast: function () { - var names = ('伟 芳 娜 秀英 敏 静 丽 强 磊 军 ' + '洋 勇 艳 杰 娟 涛 明 超 秀兰 霞 ' + '平 刚 桂英').split( - ' ', - ); - return this.pick(names); - }, - // 随机生成一个常见的中文姓名。 - cname: function () { - return this.cfirst() + this.clast(); - }, - }; - - /***/ - }, - /* 16 */ - /***/ function (module, exports) { - /* - ## Web - */ - module.exports = { - /* - 随机生成一个 URL。 - - [URL 规范](http://www.w3.org/Addressing/URL/url-spec.txt) - http Hypertext Transfer Protocol - ftp File Transfer protocol - gopher The Gopher protocol - mailto Electronic mail address - mid Message identifiers for electronic mail - cid Content identifiers for MIME body part - news Usenet news - nntp Usenet news for local NNTP access only - prospero Access using the prospero protocols - telnet rlogin tn3270 Reference to interactive sessions - wais Wide Area Information Servers - */ - url: function (protocol, host) { - return ( - (protocol || this.protocol()) + - '://' + // protocol? - (host || this.domain()) + // host? - '/' + - this.word() - ); - }, - // 随机生成一个 URL 协议。 - protocol: function () { - return this.pick( - // 协议簇 - 'http ftp gopher mailto mid cid news nntp prospero telnet rlogin tn3270 wais'.split(' '), - ); - }, - // 随机生成一个域名。 - domain: function (tld) { - return this.word() + '.' + (tld || this.tld()); - }, - /* - 随机生成一个顶级域名。 - 国际顶级域名 international top-level domain-names, iTLDs - 国家顶级域名 national top-level domainnames, nTLDs - [域名后缀大全](http://www.163ns.com/zixun/post/4417.html) - */ - tld: function () { - // Top Level Domain - return this.pick( - // 域名后缀 - ( - 'com net org edu gov int mil cn ' + - // 国内域名 - 'com.cn net.cn gov.cn org.cn ' + - // 中文国内域名 - '中国 中国互联.公司 中国互联.网络 ' + - // 新国际域名 - 'tel biz cc tv info name hk mobi asia cd travel pro museum coop aero ' + - // 世界各国域名后缀 - 'ad ae af ag ai al am an ao aq ar as at au aw az ba bb bd be bf bg bh bi bj bm bn bo br bs bt bv bw by bz ca cc cf cg ch ci ck cl cm cn co cq cr cu cv cx cy cz de dj dk dm do dz ec ee eg eh es et ev fi fj fk fm fo fr ga gb gd ge gf gh gi gl gm gn gp gr gt gu gw gy hk hm hn hr ht hu id ie il in io iq ir is it jm jo jp ke kg kh ki km kn kp kr kw ky kz la lb lc li lk lr ls lt lu lv ly ma mc md mg mh ml mm mn mo mp mq mr ms mt mv mw mx my mz na nc ne nf ng ni nl no np nr nt nu nz om qa pa pe pf pg ph pk pl pm pn pr pt pw py re ro ru rw sa sb sc sd se sg sh si sj sk sl sm sn so sr st su sy sz tc td tf tg th tj tk tm tn to tp tr tt tv tw tz ua ug uk us uy va vc ve vg vn vu wf ws ye yu za zm zr zw' - ).split(' '), - ); - }, - // 随机生成一个邮件地址。 - email: function (domain) { - return this.character('lower') + '.' + this.word() + '@' + (domain || this.word() + '.' + this.tld()); - // return this.character('lower') + '.' + this.last().toLowerCase() + '@' + this.last().toLowerCase() + '.' + this.tld() - // return this.word() + '@' + (domain || this.domain()) - }, - // 随机生成一个 IP 地址。 - ip: function () { - return ( - this.natural(0, 255) + - '.' + - this.natural(0, 255) + - '.' + - this.natural(0, 255) + - '.' + - this.natural(0, 255) - ); - }, - }; - - /***/ - }, - /* 17 */ - /***/ function (module, exports, __webpack_require__) { - /* - ## Address - */ - - var DICT = __webpack_require__(18); - var REGION = ['东北', '华北', '华东', '华中', '华南', '西南', '西北']; - - module.exports = { - // 随机生成一个大区。 - region: function () { - return this.pick(REGION); - }, - // 随机生成一个(中国)省(或直辖市、自治区、特别行政区)。 - province: function () { - return this.pick(DICT).name; - }, - // 随机生成一个(中国)市。 - city: function (prefix) { - var province = this.pick(DICT); - var city = this.pick(province.children); - return prefix ? [province.name, city.name].join(' ') : city.name; - }, - // 随机生成一个(中国)县。 - county: function (prefix) { - var province = this.pick(DICT); - var city = this.pick(province.children); - var county = this.pick(city.children) || { - name: '-', - }; - return prefix ? [province.name, city.name, county.name].join(' ') : county.name; - }, - // 随机生成一个邮政编码(六位数字)。 - zip: function (len) { - var zip = ''; - for (var i = 0; i < (len || 6); i++) zip += this.natural(0, 9); - return zip; - }, - - // address: function() {}, - // phone: function() {}, - // areacode: function() {}, - // street: function() {}, - // street_suffixes: function() {}, - // street_suffix: function() {}, - // states: function() {}, - // state: function() {}, - }; - - /***/ - }, - /* 18 */ - /***/ function (module, exports) { - /* - ## Address 字典数据 - - 字典数据来源 http://www.atatech.org/articles/30028?rnd=254259856 - - 国标 省(市)级行政区划码表 - - 华北 北京市 天津市 河北省 山西省 内蒙古自治区 - 东北 辽宁省 吉林省 黑龙江省 - 华东 上海市 江苏省 浙江省 安徽省 福建省 江西省 山东省 - 华南 广东省 广西壮族自治区 海南省 - 华中 河南省 湖北省 湖南省 - 西南 重庆市 四川省 贵州省 云南省 西藏自治区 - 西北 陕西省 甘肃省 青海省 宁夏回族自治区 新疆维吾尔自治区 - 港澳台 香港特别行政区 澳门特别行政区 台湾省 - - **排序** - - ```js - var map = {} - _.each(_.keys(REGIONS),function(id){ - map[id] = REGIONS[ID] - }) - JSON.stringify(map) - ``` - */ - var DICT = { - 110000: '北京', - 110100: '北京市', - 110101: '东城区', - 110102: '西城区', - 110105: '朝阳区', - 110106: '丰台区', - 110107: '石景山区', - 110108: '海淀区', - 110109: '门头沟区', - 110111: '房山区', - 110112: '通州区', - 110113: '顺义区', - 110114: '昌平区', - 110115: '大兴区', - 110116: '怀柔区', - 110117: '平谷区', - 110228: '密云县', - 110229: '延庆县', - 110230: '其它区', - 120000: '天津', - 120100: '天津市', - 120101: '和平区', - 120102: '河东区', - 120103: '河西区', - 120104: '南开区', - 120105: '河北区', - 120106: '红桥区', - 120110: '东丽区', - 120111: '西青区', - 120112: '津南区', - 120113: '北辰区', - 120114: '武清区', - 120115: '宝坻区', - 120116: '滨海新区', - 120221: '宁河县', - 120223: '静海县', - 120225: '蓟县', - 120226: '其它区', - 130000: '河北省', - 130100: '石家庄市', - 130102: '长安区', - 130103: '桥东区', - 130104: '桥西区', - 130105: '新华区', - 130107: '井陉矿区', - 130108: '裕华区', - 130121: '井陉县', - 130123: '正定县', - 130124: '栾城县', - 130125: '行唐县', - 130126: '灵寿县', - 130127: '高邑县', - 130128: '深泽县', - 130129: '赞皇县', - 130130: '无极县', - 130131: '平山县', - 130132: '元氏县', - 130133: '赵县', - 130181: '辛集市', - 130182: '藁城市', - 130183: '晋州市', - 130184: '新乐市', - 130185: '鹿泉市', - 130186: '其它区', - 130200: '唐山市', - 130202: '路南区', - 130203: '路北区', - 130204: '古冶区', - 130205: '开平区', - 130207: '丰南区', - 130208: '丰润区', - 130223: '滦县', - 130224: '滦南县', - 130225: '乐亭县', - 130227: '迁西县', - 130229: '玉田县', - 130230: '曹妃甸区', - 130281: '遵化市', - 130283: '迁安市', - 130284: '其它区', - 130300: '秦皇岛市', - 130302: '海港区', - 130303: '山海关区', - 130304: '北戴河区', - 130321: '青龙满族自治县', - 130322: '昌黎县', - 130323: '抚宁县', - 130324: '卢龙县', - 130398: '其它区', - 130400: '邯郸市', - 130402: '邯山区', - 130403: '丛台区', - 130404: '复兴区', - 130406: '峰峰矿区', - 130421: '邯郸县', - 130423: '临漳县', - 130424: '成安县', - 130425: '大名县', - 130426: '涉县', - 130427: '磁县', - 130428: '肥乡县', - 130429: '永年县', - 130430: '邱县', - 130431: '鸡泽县', - 130432: '广平县', - 130433: '馆陶县', - 130434: '魏县', - 130435: '曲周县', - 130481: '武安市', - 130482: '其它区', - 130500: '邢台市', - 130502: '桥东区', - 130503: '桥西区', - 130521: '邢台县', - 130522: '临城县', - 130523: '内丘县', - 130524: '柏乡县', - 130525: '隆尧县', - 130526: '任县', - 130527: '南和县', - 130528: '宁晋县', - 130529: '巨鹿县', - 130530: '新河县', - 130531: '广宗县', - 130532: '平乡县', - 130533: '威县', - 130534: '清河县', - 130535: '临西县', - 130581: '南宫市', - 130582: '沙河市', - 130583: '其它区', - 130600: '保定市', - 130602: '新市区', - 130603: '北市区', - 130604: '南市区', - 130621: '满城县', - 130622: '清苑县', - 130623: '涞水县', - 130624: '阜平县', - 130625: '徐水县', - 130626: '定兴县', - 130627: '唐县', - 130628: '高阳县', - 130629: '容城县', - 130630: '涞源县', - 130631: '望都县', - 130632: '安新县', - 130633: '易县', - 130634: '曲阳县', - 130635: '蠡县', - 130636: '顺平县', - 130637: '博野县', - 130638: '雄县', - 130681: '涿州市', - 130682: '定州市', - 130683: '安国市', - 130684: '高碑店市', - 130699: '其它区', - 130700: '张家口市', - 130702: '桥东区', - 130703: '桥西区', - 130705: '宣化区', - 130706: '下花园区', - 130721: '宣化县', - 130722: '张北县', - 130723: '康保县', - 130724: '沽源县', - 130725: '尚义县', - 130726: '蔚县', - 130727: '阳原县', - 130728: '怀安县', - 130729: '万全县', - 130730: '怀来县', - 130731: '涿鹿县', - 130732: '赤城县', - 130733: '崇礼县', - 130734: '其它区', - 130800: '承德市', - 130802: '双桥区', - 130803: '双滦区', - 130804: '鹰手营子矿区', - 130821: '承德县', - 130822: '兴隆县', - 130823: '平泉县', - 130824: '滦平县', - 130825: '隆化县', - 130826: '丰宁满族自治县', - 130827: '宽城满族自治县', - 130828: '围场满族蒙古族自治县', - 130829: '其它区', - 130900: '沧州市', - 130902: '新华区', - 130903: '运河区', - 130921: '沧县', - 130922: '青县', - 130923: '东光县', - 130924: '海兴县', - 130925: '盐山县', - 130926: '肃宁县', - 130927: '南皮县', - 130928: '吴桥县', - 130929: '献县', - 130930: '孟村回族自治县', - 130981: '泊头市', - 130982: '任丘市', - 130983: '黄骅市', - 130984: '河间市', - 130985: '其它区', - 131000: '廊坊市', - 131002: '安次区', - 131003: '广阳区', - 131022: '固安县', - 131023: '永清县', - 131024: '香河县', - 131025: '大城县', - 131026: '文安县', - 131028: '大厂回族自治县', - 131081: '霸州市', - 131082: '三河市', - 131083: '其它区', - 131100: '衡水市', - 131102: '桃城区', - 131121: '枣强县', - 131122: '武邑县', - 131123: '武强县', - 131124: '饶阳县', - 131125: '安平县', - 131126: '故城县', - 131127: '景县', - 131128: '阜城县', - 131181: '冀州市', - 131182: '深州市', - 131183: '其它区', - 140000: '山西省', - 140100: '太原市', - 140105: '小店区', - 140106: '迎泽区', - 140107: '杏花岭区', - 140108: '尖草坪区', - 140109: '万柏林区', - 140110: '晋源区', - 140121: '清徐县', - 140122: '阳曲县', - 140123: '娄烦县', - 140181: '古交市', - 140182: '其它区', - 140200: '大同市', - 140202: '城区', - 140203: '矿区', - 140211: '南郊区', - 140212: '新荣区', - 140221: '阳高县', - 140222: '天镇县', - 140223: '广灵县', - 140224: '灵丘县', - 140225: '浑源县', - 140226: '左云县', - 140227: '大同县', - 140228: '其它区', - 140300: '阳泉市', - 140302: '城区', - 140303: '矿区', - 140311: '郊区', - 140321: '平定县', - 140322: '盂县', - 140323: '其它区', - 140400: '长治市', - 140421: '长治县', - 140423: '襄垣县', - 140424: '屯留县', - 140425: '平顺县', - 140426: '黎城县', - 140427: '壶关县', - 140428: '长子县', - 140429: '武乡县', - 140430: '沁县', - 140431: '沁源县', - 140481: '潞城市', - 140482: '城区', - 140483: '郊区', - 140485: '其它区', - 140500: '晋城市', - 140502: '城区', - 140521: '沁水县', - 140522: '阳城县', - 140524: '陵川县', - 140525: '泽州县', - 140581: '高平市', - 140582: '其它区', - 140600: '朔州市', - 140602: '朔城区', - 140603: '平鲁区', - 140621: '山阴县', - 140622: '应县', - 140623: '右玉县', - 140624: '怀仁县', - 140625: '其它区', - 140700: '晋中市', - 140702: '榆次区', - 140721: '榆社县', - 140722: '左权县', - 140723: '和顺县', - 140724: '昔阳县', - 140725: '寿阳县', - 140726: '太谷县', - 140727: '祁县', - 140728: '平遥县', - 140729: '灵石县', - 140781: '介休市', - 140782: '其它区', - 140800: '运城市', - 140802: '盐湖区', - 140821: '临猗县', - 140822: '万荣县', - 140823: '闻喜县', - 140824: '稷山县', - 140825: '新绛县', - 140826: '绛县', - 140827: '垣曲县', - 140828: '夏县', - 140829: '平陆县', - 140830: '芮城县', - 140881: '永济市', - 140882: '河津市', - 140883: '其它区', - 140900: '忻州市', - 140902: '忻府区', - 140921: '定襄县', - 140922: '五台县', - 140923: '代县', - 140924: '繁峙县', - 140925: '宁武县', - 140926: '静乐县', - 140927: '神池县', - 140928: '五寨县', - 140929: '岢岚县', - 140930: '河曲县', - 140931: '保德县', - 140932: '偏关县', - 140981: '原平市', - 140982: '其它区', - 141000: '临汾市', - 141002: '尧都区', - 141021: '曲沃县', - 141022: '翼城县', - 141023: '襄汾县', - 141024: '洪洞县', - 141025: '古县', - 141026: '安泽县', - 141027: '浮山县', - 141028: '吉县', - 141029: '乡宁县', - 141030: '大宁县', - 141031: '隰县', - 141032: '永和县', - 141033: '蒲县', - 141034: '汾西县', - 141081: '侯马市', - 141082: '霍州市', - 141083: '其它区', - 141100: '吕梁市', - 141102: '离石区', - 141121: '文水县', - 141122: '交城县', - 141123: '兴县', - 141124: '临县', - 141125: '柳林县', - 141126: '石楼县', - 141127: '岚县', - 141128: '方山县', - 141129: '中阳县', - 141130: '交口县', - 141181: '孝义市', - 141182: '汾阳市', - 141183: '其它区', - 150000: '内蒙古自治区', - 150100: '呼和浩特市', - 150102: '新城区', - 150103: '回民区', - 150104: '玉泉区', - 150105: '赛罕区', - 150121: '土默特左旗', - 150122: '托克托县', - 150123: '和林格尔县', - 150124: '清水河县', - 150125: '武川县', - 150126: '其它区', - 150200: '包头市', - 150202: '东河区', - 150203: '昆都仑区', - 150204: '青山区', - 150205: '石拐区', - 150206: '白云鄂博矿区', - 150207: '九原区', - 150221: '土默特右旗', - 150222: '固阳县', - 150223: '达尔罕茂明安联合旗', - 150224: '其它区', - 150300: '乌海市', - 150302: '海勃湾区', - 150303: '海南区', - 150304: '乌达区', - 150305: '其它区', - 150400: '赤峰市', - 150402: '红山区', - 150403: '元宝山区', - 150404: '松山区', - 150421: '阿鲁科尔沁旗', - 150422: '巴林左旗', - 150423: '巴林右旗', - 150424: '林西县', - 150425: '克什克腾旗', - 150426: '翁牛特旗', - 150428: '喀喇沁旗', - 150429: '宁城县', - 150430: '敖汉旗', - 150431: '其它区', - 150500: '通辽市', - 150502: '科尔沁区', - 150521: '科尔沁左翼中旗', - 150522: '科尔沁左翼后旗', - 150523: '开鲁县', - 150524: '库伦旗', - 150525: '奈曼旗', - 150526: '扎鲁特旗', - 150581: '霍林郭勒市', - 150582: '其它区', - 150600: '鄂尔多斯市', - 150602: '东胜区', - 150621: '达拉特旗', - 150622: '准格尔旗', - 150623: '鄂托克前旗', - 150624: '鄂托克旗', - 150625: '杭锦旗', - 150626: '乌审旗', - 150627: '伊金霍洛旗', - 150628: '其它区', - 150700: '呼伦贝尔市', - 150702: '海拉尔区', - 150703: '扎赉诺尔区', - 150721: '阿荣旗', - 150722: '莫力达瓦达斡尔族自治旗', - 150723: '鄂伦春自治旗', - 150724: '鄂温克族自治旗', - 150725: '陈巴尔虎旗', - 150726: '新巴尔虎左旗', - 150727: '新巴尔虎右旗', - 150781: '满洲里市', - 150782: '牙克石市', - 150783: '扎兰屯市', - 150784: '额尔古纳市', - 150785: '根河市', - 150786: '其它区', - 150800: '巴彦淖尔市', - 150802: '临河区', - 150821: '五原县', - 150822: '磴口县', - 150823: '乌拉特前旗', - 150824: '乌拉特中旗', - 150825: '乌拉特后旗', - 150826: '杭锦后旗', - 150827: '其它区', - 150900: '乌兰察布市', - 150902: '集宁区', - 150921: '卓资县', - 150922: '化德县', - 150923: '商都县', - 150924: '兴和县', - 150925: '凉城县', - 150926: '察哈尔右翼前旗', - 150927: '察哈尔右翼中旗', - 150928: '察哈尔右翼后旗', - 150929: '四子王旗', - 150981: '丰镇市', - 150982: '其它区', - 152200: '兴安盟', - 152201: '乌兰浩特市', - 152202: '阿尔山市', - 152221: '科尔沁右翼前旗', - 152222: '科尔沁右翼中旗', - 152223: '扎赉特旗', - 152224: '突泉县', - 152225: '其它区', - 152500: '锡林郭勒盟', - 152501: '二连浩特市', - 152502: '锡林浩特市', - 152522: '阿巴嘎旗', - 152523: '苏尼特左旗', - 152524: '苏尼特右旗', - 152525: '东乌珠穆沁旗', - 152526: '西乌珠穆沁旗', - 152527: '太仆寺旗', - 152528: '镶黄旗', - 152529: '正镶白旗', - 152530: '正蓝旗', - 152531: '多伦县', - 152532: '其它区', - 152900: '阿拉善盟', - 152921: '阿拉善左旗', - 152922: '阿拉善右旗', - 152923: '额济纳旗', - 152924: '其它区', - 210000: '辽宁省', - 210100: '沈阳市', - 210102: '和平区', - 210103: '沈河区', - 210104: '大东区', - 210105: '皇姑区', - 210106: '铁西区', - 210111: '苏家屯区', - 210112: '东陵区', - 210113: '新城子区', - 210114: '于洪区', - 210122: '辽中县', - 210123: '康平县', - 210124: '法库县', - 210181: '新民市', - 210184: '沈北新区', - 210185: '其它区', - 210200: '大连市', - 210202: '中山区', - 210203: '西岗区', - 210204: '沙河口区', - 210211: '甘井子区', - 210212: '旅顺口区', - 210213: '金州区', - 210224: '长海县', - 210281: '瓦房店市', - 210282: '普兰店市', - 210283: '庄河市', - 210298: '其它区', - 210300: '鞍山市', - 210302: '铁东区', - 210303: '铁西区', - 210304: '立山区', - 210311: '千山区', - 210321: '台安县', - 210323: '岫岩满族自治县', - 210381: '海城市', - 210382: '其它区', - 210400: '抚顺市', - 210402: '新抚区', - 210403: '东洲区', - 210404: '望花区', - 210411: '顺城区', - 210421: '抚顺县', - 210422: '新宾满族自治县', - 210423: '清原满族自治县', - 210424: '其它区', - 210500: '本溪市', - 210502: '平山区', - 210503: '溪湖区', - 210504: '明山区', - 210505: '南芬区', - 210521: '本溪满族自治县', - 210522: '桓仁满族自治县', - 210523: '其它区', - 210600: '丹东市', - 210602: '元宝区', - 210603: '振兴区', - 210604: '振安区', - 210624: '宽甸满族自治县', - 210681: '东港市', - 210682: '凤城市', - 210683: '其它区', - 210700: '锦州市', - 210702: '古塔区', - 210703: '凌河区', - 210711: '太和区', - 210726: '黑山县', - 210727: '义县', - 210781: '凌海市', - 210782: '北镇市', - 210783: '其它区', - 210800: '营口市', - 210802: '站前区', - 210803: '西市区', - 210804: '鲅鱼圈区', - 210811: '老边区', - 210881: '盖州市', - 210882: '大石桥市', - 210883: '其它区', - 210900: '阜新市', - 210902: '海州区', - 210903: '新邱区', - 210904: '太平区', - 210905: '清河门区', - 210911: '细河区', - 210921: '阜新蒙古族自治县', - 210922: '彰武县', - 210923: '其它区', - 211000: '辽阳市', - 211002: '白塔区', - 211003: '文圣区', - 211004: '宏伟区', - 211005: '弓长岭区', - 211011: '太子河区', - 211021: '辽阳县', - 211081: '灯塔市', - 211082: '其它区', - 211100: '盘锦市', - 211102: '双台子区', - 211103: '兴隆台区', - 211121: '大洼县', - 211122: '盘山县', - 211123: '其它区', - 211200: '铁岭市', - 211202: '银州区', - 211204: '清河区', - 211221: '铁岭县', - 211223: '西丰县', - 211224: '昌图县', - 211281: '调兵山市', - 211282: '开原市', - 211283: '其它区', - 211300: '朝阳市', - 211302: '双塔区', - 211303: '龙城区', - 211321: '朝阳县', - 211322: '建平县', - 211324: '喀喇沁左翼蒙古族自治县', - 211381: '北票市', - 211382: '凌源市', - 211383: '其它区', - 211400: '葫芦岛市', - 211402: '连山区', - 211403: '龙港区', - 211404: '南票区', - 211421: '绥中县', - 211422: '建昌县', - 211481: '兴城市', - 211482: '其它区', - 220000: '吉林省', - 220100: '长春市', - 220102: '南关区', - 220103: '宽城区', - 220104: '朝阳区', - 220105: '二道区', - 220106: '绿园区', - 220112: '双阳区', - 220122: '农安县', - 220181: '九台市', - 220182: '榆树市', - 220183: '德惠市', - 220188: '其它区', - 220200: '吉林市', - 220202: '昌邑区', - 220203: '龙潭区', - 220204: '船营区', - 220211: '丰满区', - 220221: '永吉县', - 220281: '蛟河市', - 220282: '桦甸市', - 220283: '舒兰市', - 220284: '磐石市', - 220285: '其它区', - 220300: '四平市', - 220302: '铁西区', - 220303: '铁东区', - 220322: '梨树县', - 220323: '伊通满族自治县', - 220381: '公主岭市', - 220382: '双辽市', - 220383: '其它区', - 220400: '辽源市', - 220402: '龙山区', - 220403: '西安区', - 220421: '东丰县', - 220422: '东辽县', - 220423: '其它区', - 220500: '通化市', - 220502: '东昌区', - 220503: '二道江区', - 220521: '通化县', - 220523: '辉南县', - 220524: '柳河县', - 220581: '梅河口市', - 220582: '集安市', - 220583: '其它区', - 220600: '白山市', - 220602: '浑江区', - 220621: '抚松县', - 220622: '靖宇县', - 220623: '长白朝鲜族自治县', - 220625: '江源区', - 220681: '临江市', - 220682: '其它区', - 220700: '松原市', - 220702: '宁江区', - 220721: '前郭尔罗斯蒙古族自治县', - 220722: '长岭县', - 220723: '乾安县', - 220724: '扶余市', - 220725: '其它区', - 220800: '白城市', - 220802: '洮北区', - 220821: '镇赉县', - 220822: '通榆县', - 220881: '洮南市', - 220882: '大安市', - 220883: '其它区', - 222400: '延边朝鲜族自治州', - 222401: '延吉市', - 222402: '图们市', - 222403: '敦化市', - 222404: '珲春市', - 222405: '龙井市', - 222406: '和龙市', - 222424: '汪清县', - 222426: '安图县', - 222427: '其它区', - 230000: '黑龙江省', - 230100: '哈尔滨市', - 230102: '道里区', - 230103: '南岗区', - 230104: '道外区', - 230106: '香坊区', - 230108: '平房区', - 230109: '松北区', - 230111: '呼兰区', - 230123: '依兰县', - 230124: '方正县', - 230125: '宾县', - 230126: '巴彦县', - 230127: '木兰县', - 230128: '通河县', - 230129: '延寿县', - 230181: '阿城区', - 230182: '双城市', - 230183: '尚志市', - 230184: '五常市', - 230186: '其它区', - 230200: '齐齐哈尔市', - 230202: '龙沙区', - 230203: '建华区', - 230204: '铁锋区', - 230205: '昂昂溪区', - 230206: '富拉尔基区', - 230207: '碾子山区', - 230208: '梅里斯达斡尔族区', - 230221: '龙江县', - 230223: '依安县', - 230224: '泰来县', - 230225: '甘南县', - 230227: '富裕县', - 230229: '克山县', - 230230: '克东县', - 230231: '拜泉县', - 230281: '讷河市', - 230282: '其它区', - 230300: '鸡西市', - 230302: '鸡冠区', - 230303: '恒山区', - 230304: '滴道区', - 230305: '梨树区', - 230306: '城子河区', - 230307: '麻山区', - 230321: '鸡东县', - 230381: '虎林市', - 230382: '密山市', - 230383: '其它区', - 230400: '鹤岗市', - 230402: '向阳区', - 230403: '工农区', - 230404: '南山区', - 230405: '兴安区', - 230406: '东山区', - 230407: '兴山区', - 230421: '萝北县', - 230422: '绥滨县', - 230423: '其它区', - 230500: '双鸭山市', - 230502: '尖山区', - 230503: '岭东区', - 230505: '四方台区', - 230506: '宝山区', - 230521: '集贤县', - 230522: '友谊县', - 230523: '宝清县', - 230524: '饶河县', - 230525: '其它区', - 230600: '大庆市', - 230602: '萨尔图区', - 230603: '龙凤区', - 230604: '让胡路区', - 230605: '红岗区', - 230606: '大同区', - 230621: '肇州县', - 230622: '肇源县', - 230623: '林甸县', - 230624: '杜尔伯特蒙古族自治县', - 230625: '其它区', - 230700: '伊春市', - 230702: '伊春区', - 230703: '南岔区', - 230704: '友好区', - 230705: '西林区', - 230706: '翠峦区', - 230707: '新青区', - 230708: '美溪区', - 230709: '金山屯区', - 230710: '五营区', - 230711: '乌马河区', - 230712: '汤旺河区', - 230713: '带岭区', - 230714: '乌伊岭区', - 230715: '红星区', - 230716: '上甘岭区', - 230722: '嘉荫县', - 230781: '铁力市', - 230782: '其它区', - 230800: '佳木斯市', - 230803: '向阳区', - 230804: '前进区', - 230805: '东风区', - 230811: '郊区', - 230822: '桦南县', - 230826: '桦川县', - 230828: '汤原县', - 230833: '抚远县', - 230881: '同江市', - 230882: '富锦市', - 230883: '其它区', - 230900: '七台河市', - 230902: '新兴区', - 230903: '桃山区', - 230904: '茄子河区', - 230921: '勃利县', - 230922: '其它区', - 231000: '牡丹江市', - 231002: '东安区', - 231003: '阳明区', - 231004: '爱民区', - 231005: '西安区', - 231024: '东宁县', - 231025: '林口县', - 231081: '绥芬河市', - 231083: '海林市', - 231084: '宁安市', - 231085: '穆棱市', - 231086: '其它区', - 231100: '黑河市', - 231102: '爱辉区', - 231121: '嫩江县', - 231123: '逊克县', - 231124: '孙吴县', - 231181: '北安市', - 231182: '五大连池市', - 231183: '其它区', - 231200: '绥化市', - 231202: '北林区', - 231221: '望奎县', - 231222: '兰西县', - 231223: '青冈县', - 231224: '庆安县', - 231225: '明水县', - 231226: '绥棱县', - 231281: '安达市', - 231282: '肇东市', - 231283: '海伦市', - 231284: '其它区', - 232700: '大兴安岭地区', - 232702: '松岭区', - 232703: '新林区', - 232704: '呼中区', - 232721: '呼玛县', - 232722: '塔河县', - 232723: '漠河县', - 232724: '加格达奇区', - 232725: '其它区', - 310000: '上海', - 310100: '上海市', - 310101: '黄浦区', - 310104: '徐汇区', - 310105: '长宁区', - 310106: '静安区', - 310107: '普陀区', - 310108: '闸北区', - 310109: '虹口区', - 310110: '杨浦区', - 310112: '闵行区', - 310113: '宝山区', - 310114: '嘉定区', - 310115: '浦东新区', - 310116: '金山区', - 310117: '松江区', - 310118: '青浦区', - 310120: '奉贤区', - 310230: '崇明县', - 310231: '其它区', - 320000: '江苏省', - 320100: '南京市', - 320102: '玄武区', - 320104: '秦淮区', - 320105: '建邺区', - 320106: '鼓楼区', - 320111: '浦口区', - 320113: '栖霞区', - 320114: '雨花台区', - 320115: '江宁区', - 320116: '六合区', - 320124: '溧水区', - 320125: '高淳区', - 320126: '其它区', - 320200: '无锡市', - 320202: '崇安区', - 320203: '南长区', - 320204: '北塘区', - 320205: '锡山区', - 320206: '惠山区', - 320211: '滨湖区', - 320281: '江阴市', - 320282: '宜兴市', - 320297: '其它区', - 320300: '徐州市', - 320302: '鼓楼区', - 320303: '云龙区', - 320305: '贾汪区', - 320311: '泉山区', - 320321: '丰县', - 320322: '沛县', - 320323: '铜山区', - 320324: '睢宁县', - 320381: '新沂市', - 320382: '邳州市', - 320383: '其它区', - 320400: '常州市', - 320402: '天宁区', - 320404: '钟楼区', - 320405: '戚墅堰区', - 320411: '新北区', - 320412: '武进区', - 320481: '溧阳市', - 320482: '金坛市', - 320483: '其它区', - 320500: '苏州市', - 320505: '虎丘区', - 320506: '吴中区', - 320507: '相城区', - 320508: '姑苏区', - 320581: '常熟市', - 320582: '张家港市', - 320583: '昆山市', - 320584: '吴江区', - 320585: '太仓市', - 320596: '其它区', - 320600: '南通市', - 320602: '崇川区', - 320611: '港闸区', - 320612: '通州区', - 320621: '海安县', - 320623: '如东县', - 320681: '启东市', - 320682: '如皋市', - 320684: '海门市', - 320694: '其它区', - 320700: '连云港市', - 320703: '连云区', - 320705: '新浦区', - 320706: '海州区', - 320721: '赣榆县', - 320722: '东海县', - 320723: '灌云县', - 320724: '灌南县', - 320725: '其它区', - 320800: '淮安市', - 320802: '清河区', - 320803: '淮安区', - 320804: '淮阴区', - 320811: '清浦区', - 320826: '涟水县', - 320829: '洪泽县', - 320830: '盱眙县', - 320831: '金湖县', - 320832: '其它区', - 320900: '盐城市', - 320902: '亭湖区', - 320903: '盐都区', - 320921: '响水县', - 320922: '滨海县', - 320923: '阜宁县', - 320924: '射阳县', - 320925: '建湖县', - 320981: '东台市', - 320982: '大丰市', - 320983: '其它区', - 321000: '扬州市', - 321002: '广陵区', - 321003: '邗江区', - 321023: '宝应县', - 321081: '仪征市', - 321084: '高邮市', - 321088: '江都区', - 321093: '其它区', - 321100: '镇江市', - 321102: '京口区', - 321111: '润州区', - 321112: '丹徒区', - 321181: '丹阳市', - 321182: '扬中市', - 321183: '句容市', - 321184: '其它区', - 321200: '泰州市', - 321202: '海陵区', - 321203: '高港区', - 321281: '兴化市', - 321282: '靖江市', - 321283: '泰兴市', - 321284: '姜堰区', - 321285: '其它区', - 321300: '宿迁市', - 321302: '宿城区', - 321311: '宿豫区', - 321322: '沭阳县', - 321323: '泗阳县', - 321324: '泗洪县', - 321325: '其它区', - 330000: '浙江省', - 330100: '杭州市', - 330102: '上城区', - 330103: '下城区', - 330104: '江干区', - 330105: '拱墅区', - 330106: '西湖区', - 330108: '滨江区', - 330109: '萧山区', - 330110: '余杭区', - 330122: '桐庐县', - 330127: '淳安县', - 330182: '建德市', - 330183: '富阳市', - 330185: '临安市', - 330186: '其它区', - 330200: '宁波市', - 330203: '海曙区', - 330204: '江东区', - 330205: '江北区', - 330206: '北仑区', - 330211: '镇海区', - 330212: '鄞州区', - 330225: '象山县', - 330226: '宁海县', - 330281: '余姚市', - 330282: '慈溪市', - 330283: '奉化市', - 330284: '其它区', - 330300: '温州市', - 330302: '鹿城区', - 330303: '龙湾区', - 330304: '瓯海区', - 330322: '洞头县', - 330324: '永嘉县', - 330326: '平阳县', - 330327: '苍南县', - 330328: '文成县', - 330329: '泰顺县', - 330381: '瑞安市', - 330382: '乐清市', - 330383: '其它区', - 330400: '嘉兴市', - 330402: '南湖区', - 330411: '秀洲区', - 330421: '嘉善县', - 330424: '海盐县', - 330481: '海宁市', - 330482: '平湖市', - 330483: '桐乡市', - 330484: '其它区', - 330500: '湖州市', - 330502: '吴兴区', - 330503: '南浔区', - 330521: '德清县', - 330522: '长兴县', - 330523: '安吉县', - 330524: '其它区', - 330600: '绍兴市', - 330602: '越城区', - 330621: '绍兴县', - 330624: '新昌县', - 330681: '诸暨市', - 330682: '上虞市', - 330683: '嵊州市', - 330684: '其它区', - 330700: '金华市', - 330702: '婺城区', - 330703: '金东区', - 330723: '武义县', - 330726: '浦江县', - 330727: '磐安县', - 330781: '兰溪市', - 330782: '义乌市', - 330783: '东阳市', - 330784: '永康市', - 330785: '其它区', - 330800: '衢州市', - 330802: '柯城区', - 330803: '衢江区', - 330822: '常山县', - 330824: '开化县', - 330825: '龙游县', - 330881: '江山市', - 330882: '其它区', - 330900: '舟山市', - 330902: '定海区', - 330903: '普陀区', - 330921: '岱山县', - 330922: '嵊泗县', - 330923: '其它区', - 331000: '台州市', - 331002: '椒江区', - 331003: '黄岩区', - 331004: '路桥区', - 331021: '玉环县', - 331022: '三门县', - 331023: '天台县', - 331024: '仙居县', - 331081: '温岭市', - 331082: '临海市', - 331083: '其它区', - 331100: '丽水市', - 331102: '莲都区', - 331121: '青田县', - 331122: '缙云县', - 331123: '遂昌县', - 331124: '松阳县', - 331125: '云和县', - 331126: '庆元县', - 331127: '景宁畲族自治县', - 331181: '龙泉市', - 331182: '其它区', - 340000: '安徽省', - 340100: '合肥市', - 340102: '瑶海区', - 340103: '庐阳区', - 340104: '蜀山区', - 340111: '包河区', - 340121: '长丰县', - 340122: '肥东县', - 340123: '肥西县', - 340192: '其它区', - 340200: '芜湖市', - 340202: '镜湖区', - 340203: '弋江区', - 340207: '鸠江区', - 340208: '三山区', - 340221: '芜湖县', - 340222: '繁昌县', - 340223: '南陵县', - 340224: '其它区', - 340300: '蚌埠市', - 340302: '龙子湖区', - 340303: '蚌山区', - 340304: '禹会区', - 340311: '淮上区', - 340321: '怀远县', - 340322: '五河县', - 340323: '固镇县', - 340324: '其它区', - 340400: '淮南市', - 340402: '大通区', - 340403: '田家庵区', - 340404: '谢家集区', - 340405: '八公山区', - 340406: '潘集区', - 340421: '凤台县', - 340422: '其它区', - 340500: '马鞍山市', - 340503: '花山区', - 340504: '雨山区', - 340506: '博望区', - 340521: '当涂县', - 340522: '其它区', - 340600: '淮北市', - 340602: '杜集区', - 340603: '相山区', - 340604: '烈山区', - 340621: '濉溪县', - 340622: '其它区', - 340700: '铜陵市', - 340702: '铜官山区', - 340703: '狮子山区', - 340711: '郊区', - 340721: '铜陵县', - 340722: '其它区', - 340800: '安庆市', - 340802: '迎江区', - 340803: '大观区', - 340811: '宜秀区', - 340822: '怀宁县', - 340823: '枞阳县', - 340824: '潜山县', - 340825: '太湖县', - 340826: '宿松县', - 340827: '望江县', - 340828: '岳西县', - 340881: '桐城市', - 340882: '其它区', - 341000: '黄山市', - 341002: '屯溪区', - 341003: '黄山区', - 341004: '徽州区', - 341021: '歙县', - 341022: '休宁县', - 341023: '黟县', - 341024: '祁门县', - 341025: '其它区', - 341100: '滁州市', - 341102: '琅琊区', - 341103: '南谯区', - 341122: '来安县', - 341124: '全椒县', - 341125: '定远县', - 341126: '凤阳县', - 341181: '天长市', - 341182: '明光市', - 341183: '其它区', - 341200: '阜阳市', - 341202: '颍州区', - 341203: '颍东区', - 341204: '颍泉区', - 341221: '临泉县', - 341222: '太和县', - 341225: '阜南县', - 341226: '颍上县', - 341282: '界首市', - 341283: '其它区', - 341300: '宿州市', - 341302: '埇桥区', - 341321: '砀山县', - 341322: '萧县', - 341323: '灵璧县', - 341324: '泗县', - 341325: '其它区', - 341400: '巢湖市', - 341421: '庐江县', - 341422: '无为县', - 341423: '含山县', - 341424: '和县', - 341500: '六安市', - 341502: '金安区', - 341503: '裕安区', - 341521: '寿县', - 341522: '霍邱县', - 341523: '舒城县', - 341524: '金寨县', - 341525: '霍山县', - 341526: '其它区', - 341600: '亳州市', - 341602: '谯城区', - 341621: '涡阳县', - 341622: '蒙城县', - 341623: '利辛县', - 341624: '其它区', - 341700: '池州市', - 341702: '贵池区', - 341721: '东至县', - 341722: '石台县', - 341723: '青阳县', - 341724: '其它区', - 341800: '宣城市', - 341802: '宣州区', - 341821: '郎溪县', - 341822: '广德县', - 341823: '泾县', - 341824: '绩溪县', - 341825: '旌德县', - 341881: '宁国市', - 341882: '其它区', - 350000: '福建省', - 350100: '福州市', - 350102: '鼓楼区', - 350103: '台江区', - 350104: '仓山区', - 350105: '马尾区', - 350111: '晋安区', - 350121: '闽侯县', - 350122: '连江县', - 350123: '罗源县', - 350124: '闽清县', - 350125: '永泰县', - 350128: '平潭县', - 350181: '福清市', - 350182: '长乐市', - 350183: '其它区', - 350200: '厦门市', - 350203: '思明区', - 350205: '海沧区', - 350206: '湖里区', - 350211: '集美区', - 350212: '同安区', - 350213: '翔安区', - 350214: '其它区', - 350300: '莆田市', - 350302: '城厢区', - 350303: '涵江区', - 350304: '荔城区', - 350305: '秀屿区', - 350322: '仙游县', - 350323: '其它区', - 350400: '三明市', - 350402: '梅列区', - 350403: '三元区', - 350421: '明溪县', - 350423: '清流县', - 350424: '宁化县', - 350425: '大田县', - 350426: '尤溪县', - 350427: '沙县', - 350428: '将乐县', - 350429: '泰宁县', - 350430: '建宁县', - 350481: '永安市', - 350482: '其它区', - 350500: '泉州市', - 350502: '鲤城区', - 350503: '丰泽区', - 350504: '洛江区', - 350505: '泉港区', - 350521: '惠安县', - 350524: '安溪县', - 350525: '永春县', - 350526: '德化县', - 350527: '金门县', - 350581: '石狮市', - 350582: '晋江市', - 350583: '南安市', - 350584: '其它区', - 350600: '漳州市', - 350602: '芗城区', - 350603: '龙文区', - 350622: '云霄县', - 350623: '漳浦县', - 350624: '诏安县', - 350625: '长泰县', - 350626: '东山县', - 350627: '南靖县', - 350628: '平和县', - 350629: '华安县', - 350681: '龙海市', - 350682: '其它区', - 350700: '南平市', - 350702: '延平区', - 350721: '顺昌县', - 350722: '浦城县', - 350723: '光泽县', - 350724: '松溪县', - 350725: '政和县', - 350781: '邵武市', - 350782: '武夷山市', - 350783: '建瓯市', - 350784: '建阳市', - 350785: '其它区', - 350800: '龙岩市', - 350802: '新罗区', - 350821: '长汀县', - 350822: '永定县', - 350823: '上杭县', - 350824: '武平县', - 350825: '连城县', - 350881: '漳平市', - 350882: '其它区', - 350900: '宁德市', - 350902: '蕉城区', - 350921: '霞浦县', - 350922: '古田县', - 350923: '屏南县', - 350924: '寿宁县', - 350925: '周宁县', - 350926: '柘荣县', - 350981: '福安市', - 350982: '福鼎市', - 350983: '其它区', - 360000: '江西省', - 360100: '南昌市', - 360102: '东湖区', - 360103: '西湖区', - 360104: '青云谱区', - 360105: '湾里区', - 360111: '青山湖区', - 360121: '南昌县', - 360122: '新建县', - 360123: '安义县', - 360124: '进贤县', - 360128: '其它区', - 360200: '景德镇市', - 360202: '昌江区', - 360203: '珠山区', - 360222: '浮梁县', - 360281: '乐平市', - 360282: '其它区', - 360300: '萍乡市', - 360302: '安源区', - 360313: '湘东区', - 360321: '莲花县', - 360322: '上栗县', - 360323: '芦溪县', - 360324: '其它区', - 360400: '九江市', - 360402: '庐山区', - 360403: '浔阳区', - 360421: '九江县', - 360423: '武宁县', - 360424: '修水县', - 360425: '永修县', - 360426: '德安县', - 360427: '星子县', - 360428: '都昌县', - 360429: '湖口县', - 360430: '彭泽县', - 360481: '瑞昌市', - 360482: '其它区', - 360483: '共青城市', - 360500: '新余市', - 360502: '渝水区', - 360521: '分宜县', - 360522: '其它区', - 360600: '鹰潭市', - 360602: '月湖区', - 360622: '余江县', - 360681: '贵溪市', - 360682: '其它区', - 360700: '赣州市', - 360702: '章贡区', - 360721: '赣县', - 360722: '信丰县', - 360723: '大余县', - 360724: '上犹县', - 360725: '崇义县', - 360726: '安远县', - 360727: '龙南县', - 360728: '定南县', - 360729: '全南县', - 360730: '宁都县', - 360731: '于都县', - 360732: '兴国县', - 360733: '会昌县', - 360734: '寻乌县', - 360735: '石城县', - 360781: '瑞金市', - 360782: '南康市', - 360783: '其它区', - 360800: '吉安市', - 360802: '吉州区', - 360803: '青原区', - 360821: '吉安县', - 360822: '吉水县', - 360823: '峡江县', - 360824: '新干县', - 360825: '永丰县', - 360826: '泰和县', - 360827: '遂川县', - 360828: '万安县', - 360829: '安福县', - 360830: '永新县', - 360881: '井冈山市', - 360882: '其它区', - 360900: '宜春市', - 360902: '袁州区', - 360921: '奉新县', - 360922: '万载县', - 360923: '上高县', - 360924: '宜丰县', - 360925: '靖安县', - 360926: '铜鼓县', - 360981: '丰城市', - 360982: '樟树市', - 360983: '高安市', - 360984: '其它区', - 361000: '抚州市', - 361002: '临川区', - 361021: '南城县', - 361022: '黎川县', - 361023: '南丰县', - 361024: '崇仁县', - 361025: '乐安县', - 361026: '宜黄县', - 361027: '金溪县', - 361028: '资溪县', - 361029: '东乡县', - 361030: '广昌县', - 361031: '其它区', - 361100: '上饶市', - 361102: '信州区', - 361121: '上饶县', - 361122: '广丰县', - 361123: '玉山县', - 361124: '铅山县', - 361125: '横峰县', - 361126: '弋阳县', - 361127: '余干县', - 361128: '鄱阳县', - 361129: '万年县', - 361130: '婺源县', - 361181: '德兴市', - 361182: '其它区', - 370000: '山东省', - 370100: '济南市', - 370102: '历下区', - 370103: '市中区', - 370104: '槐荫区', - 370105: '天桥区', - 370112: '历城区', - 370113: '长清区', - 370124: '平阴县', - 370125: '济阳县', - 370126: '商河县', - 370181: '章丘市', - 370182: '其它区', - 370200: '青岛市', - 370202: '市南区', - 370203: '市北区', - 370211: '黄岛区', - 370212: '崂山区', - 370213: '李沧区', - 370214: '城阳区', - 370281: '胶州市', - 370282: '即墨市', - 370283: '平度市', - 370285: '莱西市', - 370286: '其它区', - 370300: '淄博市', - 370302: '淄川区', - 370303: '张店区', - 370304: '博山区', - 370305: '临淄区', - 370306: '周村区', - 370321: '桓台县', - 370322: '高青县', - 370323: '沂源县', - 370324: '其它区', - 370400: '枣庄市', - 370402: '市中区', - 370403: '薛城区', - 370404: '峄城区', - 370405: '台儿庄区', - 370406: '山亭区', - 370481: '滕州市', - 370482: '其它区', - 370500: '东营市', - 370502: '东营区', - 370503: '河口区', - 370521: '垦利县', - 370522: '利津县', - 370523: '广饶县', - 370591: '其它区', - 370600: '烟台市', - 370602: '芝罘区', - 370611: '福山区', - 370612: '牟平区', - 370613: '莱山区', - 370634: '长岛县', - 370681: '龙口市', - 370682: '莱阳市', - 370683: '莱州市', - 370684: '蓬莱市', - 370685: '招远市', - 370686: '栖霞市', - 370687: '海阳市', - 370688: '其它区', - 370700: '潍坊市', - 370702: '潍城区', - 370703: '寒亭区', - 370704: '坊子区', - 370705: '奎文区', - 370724: '临朐县', - 370725: '昌乐县', - 370781: '青州市', - 370782: '诸城市', - 370783: '寿光市', - 370784: '安丘市', - 370785: '高密市', - 370786: '昌邑市', - 370787: '其它区', - 370800: '济宁市', - 370802: '市中区', - 370811: '任城区', - 370826: '微山县', - 370827: '鱼台县', - 370828: '金乡县', - 370829: '嘉祥县', - 370830: '汶上县', - 370831: '泗水县', - 370832: '梁山县', - 370881: '曲阜市', - 370882: '兖州市', - 370883: '邹城市', - 370884: '其它区', - 370900: '泰安市', - 370902: '泰山区', - 370903: '岱岳区', - 370921: '宁阳县', - 370923: '东平县', - 370982: '新泰市', - 370983: '肥城市', - 370984: '其它区', - 371000: '威海市', - 371002: '环翠区', - 371081: '文登市', - 371082: '荣成市', - 371083: '乳山市', - 371084: '其它区', - 371100: '日照市', - 371102: '东港区', - 371103: '岚山区', - 371121: '五莲县', - 371122: '莒县', - 371123: '其它区', - 371200: '莱芜市', - 371202: '莱城区', - 371203: '钢城区', - 371204: '其它区', - 371300: '临沂市', - 371302: '兰山区', - 371311: '罗庄区', - 371312: '河东区', - 371321: '沂南县', - 371322: '郯城县', - 371323: '沂水县', - 371324: '苍山县', - 371325: '费县', - 371326: '平邑县', - 371327: '莒南县', - 371328: '蒙阴县', - 371329: '临沭县', - 371330: '其它区', - 371400: '德州市', - 371402: '德城区', - 371421: '陵县', - 371422: '宁津县', - 371423: '庆云县', - 371424: '临邑县', - 371425: '齐河县', - 371426: '平原县', - 371427: '夏津县', - 371428: '武城县', - 371481: '乐陵市', - 371482: '禹城市', - 371483: '其它区', - 371500: '聊城市', - 371502: '东昌府区', - 371521: '阳谷县', - 371522: '莘县', - 371523: '茌平县', - 371524: '东阿县', - 371525: '冠县', - 371526: '高唐县', - 371581: '临清市', - 371582: '其它区', - 371600: '滨州市', - 371602: '滨城区', - 371621: '惠民县', - 371622: '阳信县', - 371623: '无棣县', - 371624: '沾化县', - 371625: '博兴县', - 371626: '邹平县', - 371627: '其它区', - 371700: '菏泽市', - 371702: '牡丹区', - 371721: '曹县', - 371722: '单县', - 371723: '成武县', - 371724: '巨野县', - 371725: '郓城县', - 371726: '鄄城县', - 371727: '定陶县', - 371728: '东明县', - 371729: '其它区', - 410000: '河南省', - 410100: '郑州市', - 410102: '中原区', - 410103: '二七区', - 410104: '管城回族区', - 410105: '金水区', - 410106: '上街区', - 410108: '惠济区', - 410122: '中牟县', - 410181: '巩义市', - 410182: '荥阳市', - 410183: '新密市', - 410184: '新郑市', - 410185: '登封市', - 410188: '其它区', - 410200: '开封市', - 410202: '龙亭区', - 410203: '顺河回族区', - 410204: '鼓楼区', - 410205: '禹王台区', - 410211: '金明区', - 410221: '杞县', - 410222: '通许县', - 410223: '尉氏县', - 410224: '开封县', - 410225: '兰考县', - 410226: '其它区', - 410300: '洛阳市', - 410302: '老城区', - 410303: '西工区', - 410304: '瀍河回族区', - 410305: '涧西区', - 410306: '吉利区', - 410307: '洛龙区', - 410322: '孟津县', - 410323: '新安县', - 410324: '栾川县', - 410325: '嵩县', - 410326: '汝阳县', - 410327: '宜阳县', - 410328: '洛宁县', - 410329: '伊川县', - 410381: '偃师市', - 410400: '平顶山市', - 410402: '新华区', - 410403: '卫东区', - 410404: '石龙区', - 410411: '湛河区', - 410421: '宝丰县', - 410422: '叶县', - 410423: '鲁山县', - 410425: '郏县', - 410481: '舞钢市', - 410482: '汝州市', - 410483: '其它区', - 410500: '安阳市', - 410502: '文峰区', - 410503: '北关区', - 410505: '殷都区', - 410506: '龙安区', - 410522: '安阳县', - 410523: '汤阴县', - 410526: '滑县', - 410527: '内黄县', - 410581: '林州市', - 410582: '其它区', - 410600: '鹤壁市', - 410602: '鹤山区', - 410603: '山城区', - 410611: '淇滨区', - 410621: '浚县', - 410622: '淇县', - 410623: '其它区', - 410700: '新乡市', - 410702: '红旗区', - 410703: '卫滨区', - 410704: '凤泉区', - 410711: '牧野区', - 410721: '新乡县', - 410724: '获嘉县', - 410725: '原阳县', - 410726: '延津县', - 410727: '封丘县', - 410728: '长垣县', - 410781: '卫辉市', - 410782: '辉县市', - 410783: '其它区', - 410800: '焦作市', - 410802: '解放区', - 410803: '中站区', - 410804: '马村区', - 410811: '山阳区', - 410821: '修武县', - 410822: '博爱县', - 410823: '武陟县', - 410825: '温县', - 410881: '济源市', - 410882: '沁阳市', - 410883: '孟州市', - 410884: '其它区', - 410900: '濮阳市', - 410902: '华龙区', - 410922: '清丰县', - 410923: '南乐县', - 410926: '范县', - 410927: '台前县', - 410928: '濮阳县', - 410929: '其它区', - 411000: '许昌市', - 411002: '魏都区', - 411023: '许昌县', - 411024: '鄢陵县', - 411025: '襄城县', - 411081: '禹州市', - 411082: '长葛市', - 411083: '其它区', - 411100: '漯河市', - 411102: '源汇区', - 411103: '郾城区', - 411104: '召陵区', - 411121: '舞阳县', - 411122: '临颍县', - 411123: '其它区', - 411200: '三门峡市', - 411202: '湖滨区', - 411221: '渑池县', - 411222: '陕县', - 411224: '卢氏县', - 411281: '义马市', - 411282: '灵宝市', - 411283: '其它区', - 411300: '南阳市', - 411302: '宛城区', - 411303: '卧龙区', - 411321: '南召县', - 411322: '方城县', - 411323: '西峡县', - 411324: '镇平县', - 411325: '内乡县', - 411326: '淅川县', - 411327: '社旗县', - 411328: '唐河县', - 411329: '新野县', - 411330: '桐柏县', - 411381: '邓州市', - 411382: '其它区', - 411400: '商丘市', - 411402: '梁园区', - 411403: '睢阳区', - 411421: '民权县', - 411422: '睢县', - 411423: '宁陵县', - 411424: '柘城县', - 411425: '虞城县', - 411426: '夏邑县', - 411481: '永城市', - 411482: '其它区', - 411500: '信阳市', - 411502: '浉河区', - 411503: '平桥区', - 411521: '罗山县', - 411522: '光山县', - 411523: '新县', - 411524: '商城县', - 411525: '固始县', - 411526: '潢川县', - 411527: '淮滨县', - 411528: '息县', - 411529: '其它区', - 411600: '周口市', - 411602: '川汇区', - 411621: '扶沟县', - 411622: '西华县', - 411623: '商水县', - 411624: '沈丘县', - 411625: '郸城县', - 411626: '淮阳县', - 411627: '太康县', - 411628: '鹿邑县', - 411681: '项城市', - 411682: '其它区', - 411700: '驻马店市', - 411702: '驿城区', - 411721: '西平县', - 411722: '上蔡县', - 411723: '平舆县', - 411724: '正阳县', - 411725: '确山县', - 411726: '泌阳县', - 411727: '汝南县', - 411728: '遂平县', - 411729: '新蔡县', - 411730: '其它区', - 420000: '湖北省', - 420100: '武汉市', - 420102: '江岸区', - 420103: '江汉区', - 420104: '硚口区', - 420105: '汉阳区', - 420106: '武昌区', - 420107: '青山区', - 420111: '洪山区', - 420112: '东西湖区', - 420113: '汉南区', - 420114: '蔡甸区', - 420115: '江夏区', - 420116: '黄陂区', - 420117: '新洲区', - 420118: '其它区', - 420200: '黄石市', - 420202: '黄石港区', - 420203: '西塞山区', - 420204: '下陆区', - 420205: '铁山区', - 420222: '阳新县', - 420281: '大冶市', - 420282: '其它区', - 420300: '十堰市', - 420302: '茅箭区', - 420303: '张湾区', - 420321: '郧县', - 420322: '郧西县', - 420323: '竹山县', - 420324: '竹溪县', - 420325: '房县', - 420381: '丹江口市', - 420383: '其它区', - 420500: '宜昌市', - 420502: '西陵区', - 420503: '伍家岗区', - 420504: '点军区', - 420505: '猇亭区', - 420506: '夷陵区', - 420525: '远安县', - 420526: '兴山县', - 420527: '秭归县', - 420528: '长阳土家族自治县', - 420529: '五峰土家族自治县', - 420581: '宜都市', - 420582: '当阳市', - 420583: '枝江市', - 420584: '其它区', - 420600: '襄阳市', - 420602: '襄城区', - 420606: '樊城区', - 420607: '襄州区', - 420624: '南漳县', - 420625: '谷城县', - 420626: '保康县', - 420682: '老河口市', - 420683: '枣阳市', - 420684: '宜城市', - 420685: '其它区', - 420700: '鄂州市', - 420702: '梁子湖区', - 420703: '华容区', - 420704: '鄂城区', - 420705: '其它区', - 420800: '荆门市', - 420802: '东宝区', - 420804: '掇刀区', - 420821: '京山县', - 420822: '沙洋县', - 420881: '钟祥市', - 420882: '其它区', - 420900: '孝感市', - 420902: '孝南区', - 420921: '孝昌县', - 420922: '大悟县', - 420923: '云梦县', - 420981: '应城市', - 420982: '安陆市', - 420984: '汉川市', - 420985: '其它区', - 421000: '荆州市', - 421002: '沙市区', - 421003: '荆州区', - 421022: '公安县', - 421023: '监利县', - 421024: '江陵县', - 421081: '石首市', - 421083: '洪湖市', - 421087: '松滋市', - 421088: '其它区', - 421100: '黄冈市', - 421102: '黄州区', - 421121: '团风县', - 421122: '红安县', - 421123: '罗田县', - 421124: '英山县', - 421125: '浠水县', - 421126: '蕲春县', - 421127: '黄梅县', - 421181: '麻城市', - 421182: '武穴市', - 421183: '其它区', - 421200: '咸宁市', - 421202: '咸安区', - 421221: '嘉鱼县', - 421222: '通城县', - 421223: '崇阳县', - 421224: '通山县', - 421281: '赤壁市', - 421283: '其它区', - 421300: '随州市', - 421302: '曾都区', - 421321: '随县', - 421381: '广水市', - 421382: '其它区', - 422800: '恩施土家族苗族自治州', - 422801: '恩施市', - 422802: '利川市', - 422822: '建始县', - 422823: '巴东县', - 422825: '宣恩县', - 422826: '咸丰县', - 422827: '来凤县', - 422828: '鹤峰县', - 422829: '其它区', - 429004: '仙桃市', - 429005: '潜江市', - 429006: '天门市', - 429021: '神农架林区', - 430000: '湖南省', - 430100: '长沙市', - 430102: '芙蓉区', - 430103: '天心区', - 430104: '岳麓区', - 430105: '开福区', - 430111: '雨花区', - 430121: '长沙县', - 430122: '望城区', - 430124: '宁乡县', - 430181: '浏阳市', - 430182: '其它区', - 430200: '株洲市', - 430202: '荷塘区', - 430203: '芦淞区', - 430204: '石峰区', - 430211: '天元区', - 430221: '株洲县', - 430223: '攸县', - 430224: '茶陵县', - 430225: '炎陵县', - 430281: '醴陵市', - 430282: '其它区', - 430300: '湘潭市', - 430302: '雨湖区', - 430304: '岳塘区', - 430321: '湘潭县', - 430381: '湘乡市', - 430382: '韶山市', - 430383: '其它区', - 430400: '衡阳市', - 430405: '珠晖区', - 430406: '雁峰区', - 430407: '石鼓区', - 430408: '蒸湘区', - 430412: '南岳区', - 430421: '衡阳县', - 430422: '衡南县', - 430423: '衡山县', - 430424: '衡东县', - 430426: '祁东县', - 430481: '耒阳市', - 430482: '常宁市', - 430483: '其它区', - 430500: '邵阳市', - 430502: '双清区', - 430503: '大祥区', - 430511: '北塔区', - 430521: '邵东县', - 430522: '新邵县', - 430523: '邵阳县', - 430524: '隆回县', - 430525: '洞口县', - 430527: '绥宁县', - 430528: '新宁县', - 430529: '城步苗族自治县', - 430581: '武冈市', - 430582: '其它区', - 430600: '岳阳市', - 430602: '岳阳楼区', - 430603: '云溪区', - 430611: '君山区', - 430621: '岳阳县', - 430623: '华容县', - 430624: '湘阴县', - 430626: '平江县', - 430681: '汨罗市', - 430682: '临湘市', - 430683: '其它区', - 430700: '常德市', - 430702: '武陵区', - 430703: '鼎城区', - 430721: '安乡县', - 430722: '汉寿县', - 430723: '澧县', - 430724: '临澧县', - 430725: '桃源县', - 430726: '石门县', - 430781: '津市市', - 430782: '其它区', - 430800: '张家界市', - 430802: '永定区', - 430811: '武陵源区', - 430821: '慈利县', - 430822: '桑植县', - 430823: '其它区', - 430900: '益阳市', - 430902: '资阳区', - 430903: '赫山区', - 430921: '南县', - 430922: '桃江县', - 430923: '安化县', - 430981: '沅江市', - 430982: '其它区', - 431000: '郴州市', - 431002: '北湖区', - 431003: '苏仙区', - 431021: '桂阳县', - 431022: '宜章县', - 431023: '永兴县', - 431024: '嘉禾县', - 431025: '临武县', - 431026: '汝城县', - 431027: '桂东县', - 431028: '安仁县', - 431081: '资兴市', - 431082: '其它区', - 431100: '永州市', - 431102: '零陵区', - 431103: '冷水滩区', - 431121: '祁阳县', - 431122: '东安县', - 431123: '双牌县', - 431124: '道县', - 431125: '江永县', - 431126: '宁远县', - 431127: '蓝山县', - 431128: '新田县', - 431129: '江华瑶族自治县', - 431130: '其它区', - 431200: '怀化市', - 431202: '鹤城区', - 431221: '中方县', - 431222: '沅陵县', - 431223: '辰溪县', - 431224: '溆浦县', - 431225: '会同县', - 431226: '麻阳苗族自治县', - 431227: '新晃侗族自治县', - 431228: '芷江侗族自治县', - 431229: '靖州苗族侗族自治县', - 431230: '通道侗族自治县', - 431281: '洪江市', - 431282: '其它区', - 431300: '娄底市', - 431302: '娄星区', - 431321: '双峰县', - 431322: '新化县', - 431381: '冷水江市', - 431382: '涟源市', - 431383: '其它区', - 433100: '湘西土家族苗族自治州', - 433101: '吉首市', - 433122: '泸溪县', - 433123: '凤凰县', - 433124: '花垣县', - 433125: '保靖县', - 433126: '古丈县', - 433127: '永顺县', - 433130: '龙山县', - 433131: '其它区', - 440000: '广东省', - 440100: '广州市', - 440103: '荔湾区', - 440104: '越秀区', - 440105: '海珠区', - 440106: '天河区', - 440111: '白云区', - 440112: '黄埔区', - 440113: '番禺区', - 440114: '花都区', - 440115: '南沙区', - 440116: '萝岗区', - 440183: '增城市', - 440184: '从化市', - 440189: '其它区', - 440200: '韶关市', - 440203: '武江区', - 440204: '浈江区', - 440205: '曲江区', - 440222: '始兴县', - 440224: '仁化县', - 440229: '翁源县', - 440232: '乳源瑶族自治县', - 440233: '新丰县', - 440281: '乐昌市', - 440282: '南雄市', - 440283: '其它区', - 440300: '深圳市', - 440303: '罗湖区', - 440304: '福田区', - 440305: '南山区', - 440306: '宝安区', - 440307: '龙岗区', - 440308: '盐田区', - 440309: '其它区', - 440320: '光明新区', - 440321: '坪山新区', - 440322: '大鹏新区', - 440323: '龙华新区', - 440400: '珠海市', - 440402: '香洲区', - 440403: '斗门区', - 440404: '金湾区', - 440488: '其它区', - 440500: '汕头市', - 440507: '龙湖区', - 440511: '金平区', - 440512: '濠江区', - 440513: '潮阳区', - 440514: '潮南区', - 440515: '澄海区', - 440523: '南澳县', - 440524: '其它区', - 440600: '佛山市', - 440604: '禅城区', - 440605: '南海区', - 440606: '顺德区', - 440607: '三水区', - 440608: '高明区', - 440609: '其它区', - 440700: '江门市', - 440703: '蓬江区', - 440704: '江海区', - 440705: '新会区', - 440781: '台山市', - 440783: '开平市', - 440784: '鹤山市', - 440785: '恩平市', - 440786: '其它区', - 440800: '湛江市', - 440802: '赤坎区', - 440803: '霞山区', - 440804: '坡头区', - 440811: '麻章区', - 440823: '遂溪县', - 440825: '徐闻县', - 440881: '廉江市', - 440882: '雷州市', - 440883: '吴川市', - 440884: '其它区', - 440900: '茂名市', - 440902: '茂南区', - 440903: '茂港区', - 440923: '电白县', - 440981: '高州市', - 440982: '化州市', - 440983: '信宜市', - 440984: '其它区', - 441200: '肇庆市', - 441202: '端州区', - 441203: '鼎湖区', - 441223: '广宁县', - 441224: '怀集县', - 441225: '封开县', - 441226: '德庆县', - 441283: '高要市', - 441284: '四会市', - 441285: '其它区', - 441300: '惠州市', - 441302: '惠城区', - 441303: '惠阳区', - 441322: '博罗县', - 441323: '惠东县', - 441324: '龙门县', - 441325: '其它区', - 441400: '梅州市', - 441402: '梅江区', - 441421: '梅县', - 441422: '大埔县', - 441423: '丰顺县', - 441424: '五华县', - 441426: '平远县', - 441427: '蕉岭县', - 441481: '兴宁市', - 441482: '其它区', - 441500: '汕尾市', - 441502: '城区', - 441521: '海丰县', - 441523: '陆河县', - 441581: '陆丰市', - 441582: '其它区', - 441600: '河源市', - 441602: '源城区', - 441621: '紫金县', - 441622: '龙川县', - 441623: '连平县', - 441624: '和平县', - 441625: '东源县', - 441626: '其它区', - 441700: '阳江市', - 441702: '江城区', - 441721: '阳西县', - 441723: '阳东县', - 441781: '阳春市', - 441782: '其它区', - 441800: '清远市', - 441802: '清城区', - 441821: '佛冈县', - 441823: '阳山县', - 441825: '连山壮族瑶族自治县', - 441826: '连南瑶族自治县', - 441827: '清新区', - 441881: '英德市', - 441882: '连州市', - 441883: '其它区', - 441900: '东莞市', - 442000: '中山市', - 442101: '东沙群岛', - 445100: '潮州市', - 445102: '湘桥区', - 445121: '潮安区', - 445122: '饶平县', - 445186: '其它区', - 445200: '揭阳市', - 445202: '榕城区', - 445221: '揭东区', - 445222: '揭西县', - 445224: '惠来县', - 445281: '普宁市', - 445285: '其它区', - 445300: '云浮市', - 445302: '云城区', - 445321: '新兴县', - 445322: '郁南县', - 445323: '云安县', - 445381: '罗定市', - 445382: '其它区', - 450000: '广西壮族自治区', - 450100: '南宁市', - 450102: '兴宁区', - 450103: '青秀区', - 450105: '江南区', - 450107: '西乡塘区', - 450108: '良庆区', - 450109: '邕宁区', - 450122: '武鸣县', - 450123: '隆安县', - 450124: '马山县', - 450125: '上林县', - 450126: '宾阳县', - 450127: '横县', - 450128: '其它区', - 450200: '柳州市', - 450202: '城中区', - 450203: '鱼峰区', - 450204: '柳南区', - 450205: '柳北区', - 450221: '柳江县', - 450222: '柳城县', - 450223: '鹿寨县', - 450224: '融安县', - 450225: '融水苗族自治县', - 450226: '三江侗族自治县', - 450227: '其它区', - 450300: '桂林市', - 450302: '秀峰区', - 450303: '叠彩区', - 450304: '象山区', - 450305: '七星区', - 450311: '雁山区', - 450321: '阳朔县', - 450322: '临桂区', - 450323: '灵川县', - 450324: '全州县', - 450325: '兴安县', - 450326: '永福县', - 450327: '灌阳县', - 450328: '龙胜各族自治县', - 450329: '资源县', - 450330: '平乐县', - 450331: '荔浦县', - 450332: '恭城瑶族自治县', - 450333: '其它区', - 450400: '梧州市', - 450403: '万秀区', - 450405: '长洲区', - 450406: '龙圩区', - 450421: '苍梧县', - 450422: '藤县', - 450423: '蒙山县', - 450481: '岑溪市', - 450482: '其它区', - 450500: '北海市', - 450502: '海城区', - 450503: '银海区', - 450512: '铁山港区', - 450521: '合浦县', - 450522: '其它区', - 450600: '防城港市', - 450602: '港口区', - 450603: '防城区', - 450621: '上思县', - 450681: '东兴市', - 450682: '其它区', - 450700: '钦州市', - 450702: '钦南区', - 450703: '钦北区', - 450721: '灵山县', - 450722: '浦北县', - 450723: '其它区', - 450800: '贵港市', - 450802: '港北区', - 450803: '港南区', - 450804: '覃塘区', - 450821: '平南县', - 450881: '桂平市', - 450882: '其它区', - 450900: '玉林市', - 450902: '玉州区', - 450903: '福绵区', - 450921: '容县', - 450922: '陆川县', - 450923: '博白县', - 450924: '兴业县', - 450981: '北流市', - 450982: '其它区', - 451000: '百色市', - 451002: '右江区', - 451021: '田阳县', - 451022: '田东县', - 451023: '平果县', - 451024: '德保县', - 451025: '靖西县', - 451026: '那坡县', - 451027: '凌云县', - 451028: '乐业县', - 451029: '田林县', - 451030: '西林县', - 451031: '隆林各族自治县', - 451032: '其它区', - 451100: '贺州市', - 451102: '八步区', - 451119: '平桂管理区', - 451121: '昭平县', - 451122: '钟山县', - 451123: '富川瑶族自治县', - 451124: '其它区', - 451200: '河池市', - 451202: '金城江区', - 451221: '南丹县', - 451222: '天峨县', - 451223: '凤山县', - 451224: '东兰县', - 451225: '罗城仫佬族自治县', - 451226: '环江毛南族自治县', - 451227: '巴马瑶族自治县', - 451228: '都安瑶族自治县', - 451229: '大化瑶族自治县', - 451281: '宜州市', - 451282: '其它区', - 451300: '来宾市', - 451302: '兴宾区', - 451321: '忻城县', - 451322: '象州县', - 451323: '武宣县', - 451324: '金秀瑶族自治县', - 451381: '合山市', - 451382: '其它区', - 451400: '崇左市', - 451402: '江州区', - 451421: '扶绥县', - 451422: '宁明县', - 451423: '龙州县', - 451424: '大新县', - 451425: '天等县', - 451481: '凭祥市', - 451482: '其它区', - 460000: '海南省', - 460100: '海口市', - 460105: '秀英区', - 460106: '龙华区', - 460107: '琼山区', - 460108: '美兰区', - 460109: '其它区', - 460200: '三亚市', - 460300: '三沙市', - 460321: '西沙群岛', - 460322: '南沙群岛', - 460323: '中沙群岛的岛礁及其海域', - 469001: '五指山市', - 469002: '琼海市', - 469003: '儋州市', - 469005: '文昌市', - 469006: '万宁市', - 469007: '东方市', - 469025: '定安县', - 469026: '屯昌县', - 469027: '澄迈县', - 469028: '临高县', - 469030: '白沙黎族自治县', - 469031: '昌江黎族自治县', - 469033: '乐东黎族自治县', - 469034: '陵水黎族自治县', - 469035: '保亭黎族苗族自治县', - 469036: '琼中黎族苗族自治县', - 471005: '其它区', - 500000: '重庆', - 500100: '重庆市', - 500101: '万州区', - 500102: '涪陵区', - 500103: '渝中区', - 500104: '大渡口区', - 500105: '江北区', - 500106: '沙坪坝区', - 500107: '九龙坡区', - 500108: '南岸区', - 500109: '北碚区', - 500110: '万盛区', - 500111: '双桥区', - 500112: '渝北区', - 500113: '巴南区', - 500114: '黔江区', - 500115: '长寿区', - 500222: '綦江区', - 500223: '潼南县', - 500224: '铜梁县', - 500225: '大足区', - 500226: '荣昌县', - 500227: '璧山县', - 500228: '梁平县', - 500229: '城口县', - 500230: '丰都县', - 500231: '垫江县', - 500232: '武隆县', - 500233: '忠县', - 500234: '开县', - 500235: '云阳县', - 500236: '奉节县', - 500237: '巫山县', - 500238: '巫溪县', - 500240: '石柱土家族自治县', - 500241: '秀山土家族苗族自治县', - 500242: '酉阳土家族苗族自治县', - 500243: '彭水苗族土家族自治县', - 500381: '江津区', - 500382: '合川区', - 500383: '永川区', - 500384: '南川区', - 500385: '其它区', - 510000: '四川省', - 510100: '成都市', - 510104: '锦江区', - 510105: '青羊区', - 510106: '金牛区', - 510107: '武侯区', - 510108: '成华区', - 510112: '龙泉驿区', - 510113: '青白江区', - 510114: '新都区', - 510115: '温江区', - 510121: '金堂县', - 510122: '双流县', - 510124: '郫县', - 510129: '大邑县', - 510131: '蒲江县', - 510132: '新津县', - 510181: '都江堰市', - 510182: '彭州市', - 510183: '邛崃市', - 510184: '崇州市', - 510185: '其它区', - 510300: '自贡市', - 510302: '自流井区', - 510303: '贡井区', - 510304: '大安区', - 510311: '沿滩区', - 510321: '荣县', - 510322: '富顺县', - 510323: '其它区', - 510400: '攀枝花市', - 510402: '东区', - 510403: '西区', - 510411: '仁和区', - 510421: '米易县', - 510422: '盐边县', - 510423: '其它区', - 510500: '泸州市', - 510502: '江阳区', - 510503: '纳溪区', - 510504: '龙马潭区', - 510521: '泸县', - 510522: '合江县', - 510524: '叙永县', - 510525: '古蔺县', - 510526: '其它区', - 510600: '德阳市', - 510603: '旌阳区', - 510623: '中江县', - 510626: '罗江县', - 510681: '广汉市', - 510682: '什邡市', - 510683: '绵竹市', - 510684: '其它区', - 510700: '绵阳市', - 510703: '涪城区', - 510704: '游仙区', - 510722: '三台县', - 510723: '盐亭县', - 510724: '安县', - 510725: '梓潼县', - 510726: '北川羌族自治县', - 510727: '平武县', - 510781: '江油市', - 510782: '其它区', - 510800: '广元市', - 510802: '利州区', - 510811: '昭化区', - 510812: '朝天区', - 510821: '旺苍县', - 510822: '青川县', - 510823: '剑阁县', - 510824: '苍溪县', - 510825: '其它区', - 510900: '遂宁市', - 510903: '船山区', - 510904: '安居区', - 510921: '蓬溪县', - 510922: '射洪县', - 510923: '大英县', - 510924: '其它区', - 511000: '内江市', - 511002: '市中区', - 511011: '东兴区', - 511024: '威远县', - 511025: '资中县', - 511028: '隆昌县', - 511029: '其它区', - 511100: '乐山市', - 511102: '市中区', - 511111: '沙湾区', - 511112: '五通桥区', - 511113: '金口河区', - 511123: '犍为县', - 511124: '井研县', - 511126: '夹江县', - 511129: '沐川县', - 511132: '峨边彝族自治县', - 511133: '马边彝族自治县', - 511181: '峨眉山市', - 511182: '其它区', - 511300: '南充市', - 511302: '顺庆区', - 511303: '高坪区', - 511304: '嘉陵区', - 511321: '南部县', - 511322: '营山县', - 511323: '蓬安县', - 511324: '仪陇县', - 511325: '西充县', - 511381: '阆中市', - 511382: '其它区', - 511400: '眉山市', - 511402: '东坡区', - 511421: '仁寿县', - 511422: '彭山县', - 511423: '洪雅县', - 511424: '丹棱县', - 511425: '青神县', - 511426: '其它区', - 511500: '宜宾市', - 511502: '翠屏区', - 511521: '宜宾县', - 511522: '南溪区', - 511523: '江安县', - 511524: '长宁县', - 511525: '高县', - 511526: '珙县', - 511527: '筠连县', - 511528: '兴文县', - 511529: '屏山县', - 511530: '其它区', - 511600: '广安市', - 511602: '广安区', - 511603: '前锋区', - 511621: '岳池县', - 511622: '武胜县', - 511623: '邻水县', - 511681: '华蓥市', - 511683: '其它区', - 511700: '达州市', - 511702: '通川区', - 511721: '达川区', - 511722: '宣汉县', - 511723: '开江县', - 511724: '大竹县', - 511725: '渠县', - 511781: '万源市', - 511782: '其它区', - 511800: '雅安市', - 511802: '雨城区', - 511821: '名山区', - 511822: '荥经县', - 511823: '汉源县', - 511824: '石棉县', - 511825: '天全县', - 511826: '芦山县', - 511827: '宝兴县', - 511828: '其它区', - 511900: '巴中市', - 511902: '巴州区', - 511903: '恩阳区', - 511921: '通江县', - 511922: '南江县', - 511923: '平昌县', - 511924: '其它区', - 512000: '资阳市', - 512002: '雁江区', - 512021: '安岳县', - 512022: '乐至县', - 512081: '简阳市', - 512082: '其它区', - 513200: '阿坝藏族羌族自治州', - 513221: '汶川县', - 513222: '理县', - 513223: '茂县', - 513224: '松潘县', - 513225: '九寨沟县', - 513226: '金川县', - 513227: '小金县', - 513228: '黑水县', - 513229: '马尔康县', - 513230: '壤塘县', - 513231: '阿坝县', - 513232: '若尔盖县', - 513233: '红原县', - 513234: '其它区', - 513300: '甘孜藏族自治州', - 513321: '康定县', - 513322: '泸定县', - 513323: '丹巴县', - 513324: '九龙县', - 513325: '雅江县', - 513326: '道孚县', - 513327: '炉霍县', - 513328: '甘孜县', - 513329: '新龙县', - 513330: '德格县', - 513331: '白玉县', - 513332: '石渠县', - 513333: '色达县', - 513334: '理塘县', - 513335: '巴塘县', - 513336: '乡城县', - 513337: '稻城县', - 513338: '得荣县', - 513339: '其它区', - 513400: '凉山彝族自治州', - 513401: '西昌市', - 513422: '木里藏族自治县', - 513423: '盐源县', - 513424: '德昌县', - 513425: '会理县', - 513426: '会东县', - 513427: '宁南县', - 513428: '普格县', - 513429: '布拖县', - 513430: '金阳县', - 513431: '昭觉县', - 513432: '喜德县', - 513433: '冕宁县', - 513434: '越西县', - 513435: '甘洛县', - 513436: '美姑县', - 513437: '雷波县', - 513438: '其它区', - 520000: '贵州省', - 520100: '贵阳市', - 520102: '南明区', - 520103: '云岩区', - 520111: '花溪区', - 520112: '乌当区', - 520113: '白云区', - 520121: '开阳县', - 520122: '息烽县', - 520123: '修文县', - 520151: '观山湖区', - 520181: '清镇市', - 520182: '其它区', - 520200: '六盘水市', - 520201: '钟山区', - 520203: '六枝特区', - 520221: '水城县', - 520222: '盘县', - 520223: '其它区', - 520300: '遵义市', - 520302: '红花岗区', - 520303: '汇川区', - 520321: '遵义县', - 520322: '桐梓县', - 520323: '绥阳县', - 520324: '正安县', - 520325: '道真仡佬族苗族自治县', - 520326: '务川仡佬族苗族自治县', - 520327: '凤冈县', - 520328: '湄潭县', - 520329: '余庆县', - 520330: '习水县', - 520381: '赤水市', - 520382: '仁怀市', - 520383: '其它区', - 520400: '安顺市', - 520402: '西秀区', - 520421: '平坝县', - 520422: '普定县', - 520423: '镇宁布依族苗族自治县', - 520424: '关岭布依族苗族自治县', - 520425: '紫云苗族布依族自治县', - 520426: '其它区', - 522200: '铜仁市', - 522201: '碧江区', - 522222: '江口县', - 522223: '玉屏侗族自治县', - 522224: '石阡县', - 522225: '思南县', - 522226: '印江土家族苗族自治县', - 522227: '德江县', - 522228: '沿河土家族自治县', - 522229: '松桃苗族自治县', - 522230: '万山区', - 522231: '其它区', - 522300: '黔西南布依族苗族自治州', - 522301: '兴义市', - 522322: '兴仁县', - 522323: '普安县', - 522324: '晴隆县', - 522325: '贞丰县', - 522326: '望谟县', - 522327: '册亨县', - 522328: '安龙县', - 522329: '其它区', - 522400: '毕节市', - 522401: '七星关区', - 522422: '大方县', - 522423: '黔西县', - 522424: '金沙县', - 522425: '织金县', - 522426: '纳雍县', - 522427: '威宁彝族回族苗族自治县', - 522428: '赫章县', - 522429: '其它区', - 522600: '黔东南苗族侗族自治州', - 522601: '凯里市', - 522622: '黄平县', - 522623: '施秉县', - 522624: '三穗县', - 522625: '镇远县', - 522626: '岑巩县', - 522627: '天柱县', - 522628: '锦屏县', - 522629: '剑河县', - 522630: '台江县', - 522631: '黎平县', - 522632: '榕江县', - 522633: '从江县', - 522634: '雷山县', - 522635: '麻江县', - 522636: '丹寨县', - 522637: '其它区', - 522700: '黔南布依族苗族自治州', - 522701: '都匀市', - 522702: '福泉市', - 522722: '荔波县', - 522723: '贵定县', - 522725: '瓮安县', - 522726: '独山县', - 522727: '平塘县', - 522728: '罗甸县', - 522729: '长顺县', - 522730: '龙里县', - 522731: '惠水县', - 522732: '三都水族自治县', - 522733: '其它区', - 530000: '云南省', - 530100: '昆明市', - 530102: '五华区', - 530103: '盘龙区', - 530111: '官渡区', - 530112: '西山区', - 530113: '东川区', - 530121: '呈贡区', - 530122: '晋宁县', - 530124: '富民县', - 530125: '宜良县', - 530126: '石林彝族自治县', - 530127: '嵩明县', - 530128: '禄劝彝族苗族自治县', - 530129: '寻甸回族彝族自治县', - 530181: '安宁市', - 530182: '其它区', - 530300: '曲靖市', - 530302: '麒麟区', - 530321: '马龙县', - 530322: '陆良县', - 530323: '师宗县', - 530324: '罗平县', - 530325: '富源县', - 530326: '会泽县', - 530328: '沾益县', - 530381: '宣威市', - 530382: '其它区', - 530400: '玉溪市', - 530402: '红塔区', - 530421: '江川县', - 530422: '澄江县', - 530423: '通海县', - 530424: '华宁县', - 530425: '易门县', - 530426: '峨山彝族自治县', - 530427: '新平彝族傣族自治县', - 530428: '元江哈尼族彝族傣族自治县', - 530429: '其它区', - 530500: '保山市', - 530502: '隆阳区', - 530521: '施甸县', - 530522: '腾冲县', - 530523: '龙陵县', - 530524: '昌宁县', - 530525: '其它区', - 530600: '昭通市', - 530602: '昭阳区', - 530621: '鲁甸县', - 530622: '巧家县', - 530623: '盐津县', - 530624: '大关县', - 530625: '永善县', - 530626: '绥江县', - 530627: '镇雄县', - 530628: '彝良县', - 530629: '威信县', - 530630: '水富县', - 530631: '其它区', - 530700: '丽江市', - 530702: '古城区', - 530721: '玉龙纳西族自治县', - 530722: '永胜县', - 530723: '华坪县', - 530724: '宁蒗彝族自治县', - 530725: '其它区', - 530800: '普洱市', - 530802: '思茅区', - 530821: '宁洱哈尼族彝族自治县', - 530822: '墨江哈尼族自治县', - 530823: '景东彝族自治县', - 530824: '景谷傣族彝族自治县', - 530825: '镇沅彝族哈尼族拉祜族自治县', - 530826: '江城哈尼族彝族自治县', - 530827: '孟连傣族拉祜族佤族自治县', - 530828: '澜沧拉祜族自治县', - 530829: '西盟佤族自治县', - 530830: '其它区', - 530900: '临沧市', - 530902: '临翔区', - 530921: '凤庆县', - 530922: '云县', - 530923: '永德县', - 530924: '镇康县', - 530925: '双江拉祜族佤族布朗族傣族自治县', - 530926: '耿马傣族佤族自治县', - 530927: '沧源佤族自治县', - 530928: '其它区', - 532300: '楚雄彝族自治州', - 532301: '楚雄市', - 532322: '双柏县', - 532323: '牟定县', - 532324: '南华县', - 532325: '姚安县', - 532326: '大姚县', - 532327: '永仁县', - 532328: '元谋县', - 532329: '武定县', - 532331: '禄丰县', - 532332: '其它区', - 532500: '红河哈尼族彝族自治州', - 532501: '个旧市', - 532502: '开远市', - 532522: '蒙自市', - 532523: '屏边苗族自治县', - 532524: '建水县', - 532525: '石屏县', - 532526: '弥勒市', - 532527: '泸西县', - 532528: '元阳县', - 532529: '红河县', - 532530: '金平苗族瑶族傣族自治县', - 532531: '绿春县', - 532532: '河口瑶族自治县', - 532533: '其它区', - 532600: '文山壮族苗族自治州', - 532621: '文山市', - 532622: '砚山县', - 532623: '西畴县', - 532624: '麻栗坡县', - 532625: '马关县', - 532626: '丘北县', - 532627: '广南县', - 532628: '富宁县', - 532629: '其它区', - 532800: '西双版纳傣族自治州', - 532801: '景洪市', - 532822: '勐海县', - 532823: '勐腊县', - 532824: '其它区', - 532900: '大理白族自治州', - 532901: '大理市', - 532922: '漾濞彝族自治县', - 532923: '祥云县', - 532924: '宾川县', - 532925: '弥渡县', - 532926: '南涧彝族自治县', - 532927: '巍山彝族回族自治县', - 532928: '永平县', - 532929: '云龙县', - 532930: '洱源县', - 532931: '剑川县', - 532932: '鹤庆县', - 532933: '其它区', - 533100: '德宏傣族景颇族自治州', - 533102: '瑞丽市', - 533103: '芒市', - 533122: '梁河县', - 533123: '盈江县', - 533124: '陇川县', - 533125: '其它区', - 533300: '怒江傈僳族自治州', - 533321: '泸水县', - 533323: '福贡县', - 533324: '贡山独龙族怒族自治县', - 533325: '兰坪白族普米族自治县', - 533326: '其它区', - 533400: '迪庆藏族自治州', - 533421: '香格里拉县', - 533422: '德钦县', - 533423: '维西傈僳族自治县', - 533424: '其它区', - 540000: '西藏自治区', - 540100: '拉萨市', - 540102: '城关区', - 540121: '林周县', - 540122: '当雄县', - 540123: '尼木县', - 540124: '曲水县', - 540125: '堆龙德庆县', - 540126: '达孜县', - 540127: '墨竹工卡县', - 540128: '其它区', - 542100: '昌都地区', - 542121: '昌都县', - 542122: '江达县', - 542123: '贡觉县', - 542124: '类乌齐县', - 542125: '丁青县', - 542126: '察雅县', - 542127: '八宿县', - 542128: '左贡县', - 542129: '芒康县', - 542132: '洛隆县', - 542133: '边坝县', - 542134: '其它区', - 542200: '山南地区', - 542221: '乃东县', - 542222: '扎囊县', - 542223: '贡嘎县', - 542224: '桑日县', - 542225: '琼结县', - 542226: '曲松县', - 542227: '措美县', - 542228: '洛扎县', - 542229: '加查县', - 542231: '隆子县', - 542232: '错那县', - 542233: '浪卡子县', - 542234: '其它区', - 542300: '日喀则地区', - 542301: '日喀则市', - 542322: '南木林县', - 542323: '江孜县', - 542324: '定日县', - 542325: '萨迦县', - 542326: '拉孜县', - 542327: '昂仁县', - 542328: '谢通门县', - 542329: '白朗县', - 542330: '仁布县', - 542331: '康马县', - 542332: '定结县', - 542333: '仲巴县', - 542334: '亚东县', - 542335: '吉隆县', - 542336: '聂拉木县', - 542337: '萨嘎县', - 542338: '岗巴县', - 542339: '其它区', - 542400: '那曲地区', - 542421: '那曲县', - 542422: '嘉黎县', - 542423: '比如县', - 542424: '聂荣县', - 542425: '安多县', - 542426: '申扎县', - 542427: '索县', - 542428: '班戈县', - 542429: '巴青县', - 542430: '尼玛县', - 542431: '其它区', - 542432: '双湖县', - 542500: '阿里地区', - 542521: '普兰县', - 542522: '札达县', - 542523: '噶尔县', - 542524: '日土县', - 542525: '革吉县', - 542526: '改则县', - 542527: '措勤县', - 542528: '其它区', - 542600: '林芝地区', - 542621: '林芝县', - 542622: '工布江达县', - 542623: '米林县', - 542624: '墨脱县', - 542625: '波密县', - 542626: '察隅县', - 542627: '朗县', - 542628: '其它区', - 610000: '陕西省', - 610100: '西安市', - 610102: '新城区', - 610103: '碑林区', - 610104: '莲湖区', - 610111: '灞桥区', - 610112: '未央区', - 610113: '雁塔区', - 610114: '阎良区', - 610115: '临潼区', - 610116: '长安区', - 610122: '蓝田县', - 610124: '周至县', - 610125: '户县', - 610126: '高陵县', - 610127: '其它区', - 610200: '铜川市', - 610202: '王益区', - 610203: '印台区', - 610204: '耀州区', - 610222: '宜君县', - 610223: '其它区', - 610300: '宝鸡市', - 610302: '渭滨区', - 610303: '金台区', - 610304: '陈仓区', - 610322: '凤翔县', - 610323: '岐山县', - 610324: '扶风县', - 610326: '眉县', - 610327: '陇县', - 610328: '千阳县', - 610329: '麟游县', - 610330: '凤县', - 610331: '太白县', - 610332: '其它区', - 610400: '咸阳市', - 610402: '秦都区', - 610403: '杨陵区', - 610404: '渭城区', - 610422: '三原县', - 610423: '泾阳县', - 610424: '乾县', - 610425: '礼泉县', - 610426: '永寿县', - 610427: '彬县', - 610428: '长武县', - 610429: '旬邑县', - 610430: '淳化县', - 610431: '武功县', - 610481: '兴平市', - 610482: '其它区', - 610500: '渭南市', - 610502: '临渭区', - 610521: '华县', - 610522: '潼关县', - 610523: '大荔县', - 610524: '合阳县', - 610525: '澄城县', - 610526: '蒲城县', - 610527: '白水县', - 610528: '富平县', - 610581: '韩城市', - 610582: '华阴市', - 610583: '其它区', - 610600: '延安市', - 610602: '宝塔区', - 610621: '延长县', - 610622: '延川县', - 610623: '子长县', - 610624: '安塞县', - 610625: '志丹县', - 610626: '吴起县', - 610627: '甘泉县', - 610628: '富县', - 610629: '洛川县', - 610630: '宜川县', - 610631: '黄龙县', - 610632: '黄陵县', - 610633: '其它区', - 610700: '汉中市', - 610702: '汉台区', - 610721: '南郑县', - 610722: '城固县', - 610723: '洋县', - 610724: '西乡县', - 610725: '勉县', - 610726: '宁强县', - 610727: '略阳县', - 610728: '镇巴县', - 610729: '留坝县', - 610730: '佛坪县', - 610731: '其它区', - 610800: '榆林市', - 610802: '榆阳区', - 610821: '神木县', - 610822: '府谷县', - 610823: '横山县', - 610824: '靖边县', - 610825: '定边县', - 610826: '绥德县', - 610827: '米脂县', - 610828: '佳县', - 610829: '吴堡县', - 610830: '清涧县', - 610831: '子洲县', - 610832: '其它区', - 610900: '安康市', - 610902: '汉滨区', - 610921: '汉阴县', - 610922: '石泉县', - 610923: '宁陕县', - 610924: '紫阳县', - 610925: '岚皋县', - 610926: '平利县', - 610927: '镇坪县', - 610928: '旬阳县', - 610929: '白河县', - 610930: '其它区', - 611000: '商洛市', - 611002: '商州区', - 611021: '洛南县', - 611022: '丹凤县', - 611023: '商南县', - 611024: '山阳县', - 611025: '镇安县', - 611026: '柞水县', - 611027: '其它区', - 620000: '甘肃省', - 620100: '兰州市', - 620102: '城关区', - 620103: '七里河区', - 620104: '西固区', - 620105: '安宁区', - 620111: '红古区', - 620121: '永登县', - 620122: '皋兰县', - 620123: '榆中县', - 620124: '其它区', - 620200: '嘉峪关市', - 620300: '金昌市', - 620302: '金川区', - 620321: '永昌县', - 620322: '其它区', - 620400: '白银市', - 620402: '白银区', - 620403: '平川区', - 620421: '靖远县', - 620422: '会宁县', - 620423: '景泰县', - 620424: '其它区', - 620500: '天水市', - 620502: '秦州区', - 620503: '麦积区', - 620521: '清水县', - 620522: '秦安县', - 620523: '甘谷县', - 620524: '武山县', - 620525: '张家川回族自治县', - 620526: '其它区', - 620600: '武威市', - 620602: '凉州区', - 620621: '民勤县', - 620622: '古浪县', - 620623: '天祝藏族自治县', - 620624: '其它区', - 620700: '张掖市', - 620702: '甘州区', - 620721: '肃南裕固族自治县', - 620722: '民乐县', - 620723: '临泽县', - 620724: '高台县', - 620725: '山丹县', - 620726: '其它区', - 620800: '平凉市', - 620802: '崆峒区', - 620821: '泾川县', - 620822: '灵台县', - 620823: '崇信县', - 620824: '华亭县', - 620825: '庄浪县', - 620826: '静宁县', - 620827: '其它区', - 620900: '酒泉市', - 620902: '肃州区', - 620921: '金塔县', - 620922: '瓜州县', - 620923: '肃北蒙古族自治县', - 620924: '阿克塞哈萨克族自治县', - 620981: '玉门市', - 620982: '敦煌市', - 620983: '其它区', - 621000: '庆阳市', - 621002: '西峰区', - 621021: '庆城县', - 621022: '环县', - 621023: '华池县', - 621024: '合水县', - 621025: '正宁县', - 621026: '宁县', - 621027: '镇原县', - 621028: '其它区', - 621100: '定西市', - 621102: '安定区', - 621121: '通渭县', - 621122: '陇西县', - 621123: '渭源县', - 621124: '临洮县', - 621125: '漳县', - 621126: '岷县', - 621127: '其它区', - 621200: '陇南市', - 621202: '武都区', - 621221: '成县', - 621222: '文县', - 621223: '宕昌县', - 621224: '康县', - 621225: '西和县', - 621226: '礼县', - 621227: '徽县', - 621228: '两当县', - 621229: '其它区', - 622900: '临夏回族自治州', - 622901: '临夏市', - 622921: '临夏县', - 622922: '康乐县', - 622923: '永靖县', - 622924: '广河县', - 622925: '和政县', - 622926: '东乡族自治县', - 622927: '积石山保安族东乡族撒拉族自治县', - 622928: '其它区', - 623000: '甘南藏族自治州', - 623001: '合作市', - 623021: '临潭县', - 623022: '卓尼县', - 623023: '舟曲县', - 623024: '迭部县', - 623025: '玛曲县', - 623026: '碌曲县', - 623027: '夏河县', - 623028: '其它区', - 630000: '青海省', - 630100: '西宁市', - 630102: '城东区', - 630103: '城中区', - 630104: '城西区', - 630105: '城北区', - 630121: '大通回族土族自治县', - 630122: '湟中县', - 630123: '湟源县', - 630124: '其它区', - 632100: '海东市', - 632121: '平安县', - 632122: '民和回族土族自治县', - 632123: '乐都区', - 632126: '互助土族自治县', - 632127: '化隆回族自治县', - 632128: '循化撒拉族自治县', - 632129: '其它区', - 632200: '海北藏族自治州', - 632221: '门源回族自治县', - 632222: '祁连县', - 632223: '海晏县', - 632224: '刚察县', - 632225: '其它区', - 632300: '黄南藏族自治州', - 632321: '同仁县', - 632322: '尖扎县', - 632323: '泽库县', - 632324: '河南蒙古族自治县', - 632325: '其它区', - 632500: '海南藏族自治州', - 632521: '共和县', - 632522: '同德县', - 632523: '贵德县', - 632524: '兴海县', - 632525: '贵南县', - 632526: '其它区', - 632600: '果洛藏族自治州', - 632621: '玛沁县', - 632622: '班玛县', - 632623: '甘德县', - 632624: '达日县', - 632625: '久治县', - 632626: '玛多县', - 632627: '其它区', - 632700: '玉树藏族自治州', - 632721: '玉树市', - 632722: '杂多县', - 632723: '称多县', - 632724: '治多县', - 632725: '囊谦县', - 632726: '曲麻莱县', - 632727: '其它区', - 632800: '海西蒙古族藏族自治州', - 632801: '格尔木市', - 632802: '德令哈市', - 632821: '乌兰县', - 632822: '都兰县', - 632823: '天峻县', - 632824: '其它区', - 640000: '宁夏回族自治区', - 640100: '银川市', - 640104: '兴庆区', - 640105: '西夏区', - 640106: '金凤区', - 640121: '永宁县', - 640122: '贺兰县', - 640181: '灵武市', - 640182: '其它区', - 640200: '石嘴山市', - 640202: '大武口区', - 640205: '惠农区', - 640221: '平罗县', - 640222: '其它区', - 640300: '吴忠市', - 640302: '利通区', - 640303: '红寺堡区', - 640323: '盐池县', - 640324: '同心县', - 640381: '青铜峡市', - 640382: '其它区', - 640400: '固原市', - 640402: '原州区', - 640422: '西吉县', - 640423: '隆德县', - 640424: '泾源县', - 640425: '彭阳县', - 640426: '其它区', - 640500: '中卫市', - 640502: '沙坡头区', - 640521: '中宁县', - 640522: '海原县', - 640523: '其它区', - 650000: '新疆维吾尔自治区', - 650100: '乌鲁木齐市', - 650102: '天山区', - 650103: '沙依巴克区', - 650104: '新市区', - 650105: '水磨沟区', - 650106: '头屯河区', - 650107: '达坂城区', - 650109: '米东区', - 650121: '乌鲁木齐县', - 650122: '其它区', - 650200: '克拉玛依市', - 650202: '独山子区', - 650203: '克拉玛依区', - 650204: '白碱滩区', - 650205: '乌尔禾区', - 650206: '其它区', - 652100: '吐鲁番地区', - 652101: '吐鲁番市', - 652122: '鄯善县', - 652123: '托克逊县', - 652124: '其它区', - 652200: '哈密地区', - 652201: '哈密市', - 652222: '巴里坤哈萨克自治县', - 652223: '伊吾县', - 652224: '其它区', - 652300: '昌吉回族自治州', - 652301: '昌吉市', - 652302: '阜康市', - 652323: '呼图壁县', - 652324: '玛纳斯县', - 652325: '奇台县', - 652327: '吉木萨尔县', - 652328: '木垒哈萨克自治县', - 652329: '其它区', - 652700: '博尔塔拉蒙古自治州', - 652701: '博乐市', - 652702: '阿拉山口市', - 652722: '精河县', - 652723: '温泉县', - 652724: '其它区', - 652800: '巴音郭楞蒙古自治州', - 652801: '库尔勒市', - 652822: '轮台县', - 652823: '尉犁县', - 652824: '若羌县', - 652825: '且末县', - 652826: '焉耆回族自治县', - 652827: '和静县', - 652828: '和硕县', - 652829: '博湖县', - 652830: '其它区', - 652900: '阿克苏地区', - 652901: '阿克苏市', - 652922: '温宿县', - 652923: '库车县', - 652924: '沙雅县', - 652925: '新和县', - 652926: '拜城县', - 652927: '乌什县', - 652928: '阿瓦提县', - 652929: '柯坪县', - 652930: '其它区', - 653000: '克孜勒苏柯尔克孜自治州', - 653001: '阿图什市', - 653022: '阿克陶县', - 653023: '阿合奇县', - 653024: '乌恰县', - 653025: '其它区', - 653100: '喀什地区', - 653101: '喀什市', - 653121: '疏附县', - 653122: '疏勒县', - 653123: '英吉沙县', - 653124: '泽普县', - 653125: '莎车县', - 653126: '叶城县', - 653127: '麦盖提县', - 653128: '岳普湖县', - 653129: '伽师县', - 653130: '巴楚县', - 653131: '塔什库尔干塔吉克自治县', - 653132: '其它区', - 653200: '和田地区', - 653201: '和田市', - 653221: '和田县', - 653222: '墨玉县', - 653223: '皮山县', - 653224: '洛浦县', - 653225: '策勒县', - 653226: '于田县', - 653227: '民丰县', - 653228: '其它区', - 654000: '伊犁哈萨克自治州', - 654002: '伊宁市', - 654003: '奎屯市', - 654021: '伊宁县', - 654022: '察布查尔锡伯自治县', - 654023: '霍城县', - 654024: '巩留县', - 654025: '新源县', - 654026: '昭苏县', - 654027: '特克斯县', - 654028: '尼勒克县', - 654029: '其它区', - 654200: '塔城地区', - 654201: '塔城市', - 654202: '乌苏市', - 654221: '额敏县', - 654223: '沙湾县', - 654224: '托里县', - 654225: '裕民县', - 654226: '和布克赛尔蒙古自治县', - 654227: '其它区', - 654300: '阿勒泰地区', - 654301: '阿勒泰市', - 654321: '布尔津县', - 654322: '富蕴县', - 654323: '福海县', - 654324: '哈巴河县', - 654325: '青河县', - 654326: '吉木乃县', - 654327: '其它区', - 659001: '石河子市', - 659002: '阿拉尔市', - 659003: '图木舒克市', - 659004: '五家渠市', - 710000: '台湾', - 710100: '台北市', - 710101: '中正区', - 710102: '大同区', - 710103: '中山区', - 710104: '松山区', - 710105: '大安区', - 710106: '万华区', - 710107: '信义区', - 710108: '士林区', - 710109: '北投区', - 710110: '内湖区', - 710111: '南港区', - 710112: '文山区', - 710113: '其它区', - 710200: '高雄市', - 710201: '新兴区', - 710202: '前金区', - 710203: '芩雅区', - 710204: '盐埕区', - 710205: '鼓山区', - 710206: '旗津区', - 710207: '前镇区', - 710208: '三民区', - 710209: '左营区', - 710210: '楠梓区', - 710211: '小港区', - 710212: '其它区', - 710241: '苓雅区', - 710242: '仁武区', - 710243: '大社区', - 710244: '冈山区', - 710245: '路竹区', - 710246: '阿莲区', - 710247: '田寮区', - 710248: '燕巢区', - 710249: '桥头区', - 710250: '梓官区', - 710251: '弥陀区', - 710252: '永安区', - 710253: '湖内区', - 710254: '凤山区', - 710255: '大寮区', - 710256: '林园区', - 710257: '鸟松区', - 710258: '大树区', - 710259: '旗山区', - 710260: '美浓区', - 710261: '六龟区', - 710262: '内门区', - 710263: '杉林区', - 710264: '甲仙区', - 710265: '桃源区', - 710266: '那玛夏区', - 710267: '茂林区', - 710268: '茄萣区', - 710300: '台南市', - 710301: '中西区', - 710302: '东区', - 710303: '南区', - 710304: '北区', - 710305: '安平区', - 710306: '安南区', - 710307: '其它区', - 710339: '永康区', - 710340: '归仁区', - 710341: '新化区', - 710342: '左镇区', - 710343: '玉井区', - 710344: '楠西区', - 710345: '南化区', - 710346: '仁德区', - 710347: '关庙区', - 710348: '龙崎区', - 710349: '官田区', - 710350: '麻豆区', - 710351: '佳里区', - 710352: '西港区', - 710353: '七股区', - 710354: '将军区', - 710355: '学甲区', - 710356: '北门区', - 710357: '新营区', - 710358: '后壁区', - 710359: '白河区', - 710360: '东山区', - 710361: '六甲区', - 710362: '下营区', - 710363: '柳营区', - 710364: '盐水区', - 710365: '善化区', - 710366: '大内区', - 710367: '山上区', - 710368: '新市区', - 710369: '安定区', - 710400: '台中市', - 710401: '中区', - 710402: '东区', - 710403: '南区', - 710404: '西区', - 710405: '北区', - 710406: '北屯区', - 710407: '西屯区', - 710408: '南屯区', - 710409: '其它区', - 710431: '太平区', - 710432: '大里区', - 710433: '雾峰区', - 710434: '乌日区', - 710435: '丰原区', - 710436: '后里区', - 710437: '石冈区', - 710438: '东势区', - 710439: '和平区', - 710440: '新社区', - 710441: '潭子区', - 710442: '大雅区', - 710443: '神冈区', - 710444: '大肚区', - 710445: '沙鹿区', - 710446: '龙井区', - 710447: '梧栖区', - 710448: '清水区', - 710449: '大甲区', - 710450: '外埔区', - 710451: '大安区', - 710500: '金门县', - 710507: '金沙镇', - 710508: '金湖镇', - 710509: '金宁乡', - 710510: '金城镇', - 710511: '烈屿乡', - 710512: '乌坵乡', - 710600: '南投县', - 710614: '南投市', - 710615: '中寮乡', - 710616: '草屯镇', - 710617: '国姓乡', - 710618: '埔里镇', - 710619: '仁爱乡', - 710620: '名间乡', - 710621: '集集镇', - 710622: '水里乡', - 710623: '鱼池乡', - 710624: '信义乡', - 710625: '竹山镇', - 710626: '鹿谷乡', - 710700: '基隆市', - 710701: '仁爱区', - 710702: '信义区', - 710703: '中正区', - 710704: '中山区', - 710705: '安乐区', - 710706: '暖暖区', - 710707: '七堵区', - 710708: '其它区', - 710800: '新竹市', - 710801: '东区', - 710802: '北区', - 710803: '香山区', - 710804: '其它区', - 710900: '嘉义市', - 710901: '东区', - 710902: '西区', - 710903: '其它区', - 711100: '新北市', - 711130: '万里区', - 711131: '金山区', - 711132: '板桥区', - 711133: '汐止区', - 711134: '深坑区', - 711135: '石碇区', - 711136: '瑞芳区', - 711137: '平溪区', - 711138: '双溪区', - 711139: '贡寮区', - 711140: '新店区', - 711141: '坪林区', - 711142: '乌来区', - 711143: '永和区', - 711144: '中和区', - 711145: '土城区', - 711146: '三峡区', - 711147: '树林区', - 711148: '莺歌区', - 711149: '三重区', - 711150: '新庄区', - 711151: '泰山区', - 711152: '林口区', - 711153: '芦洲区', - 711154: '五股区', - 711155: '八里区', - 711156: '淡水区', - 711157: '三芝区', - 711158: '石门区', - 711200: '宜兰县', - 711214: '宜兰市', - 711215: '头城镇', - 711216: '礁溪乡', - 711217: '壮围乡', - 711218: '员山乡', - 711219: '罗东镇', - 711220: '三星乡', - 711221: '大同乡', - 711222: '五结乡', - 711223: '冬山乡', - 711224: '苏澳镇', - 711225: '南澳乡', - 711226: '钓鱼台', - 711300: '新竹县', - 711314: '竹北市', - 711315: '湖口乡', - 711316: '新丰乡', - 711317: '新埔镇', - 711318: '关西镇', - 711319: '芎林乡', - 711320: '宝山乡', - 711321: '竹东镇', - 711322: '五峰乡', - 711323: '横山乡', - 711324: '尖石乡', - 711325: '北埔乡', - 711326: '峨眉乡', - 711400: '桃园县', - 711414: '中坜市', - 711415: '平镇市', - 711416: '龙潭乡', - 711417: '杨梅市', - 711418: '新屋乡', - 711419: '观音乡', - 711420: '桃园市', - 711421: '龟山乡', - 711422: '八德市', - 711423: '大溪镇', - 711424: '复兴乡', - 711425: '大园乡', - 711426: '芦竹乡', - 711500: '苗栗县', - 711519: '竹南镇', - 711520: '头份镇', - 711521: '三湾乡', - 711522: '南庄乡', - 711523: '狮潭乡', - 711524: '后龙镇', - 711525: '通霄镇', - 711526: '苑里镇', - 711527: '苗栗市', - 711528: '造桥乡', - 711529: '头屋乡', - 711530: '公馆乡', - 711531: '大湖乡', - 711532: '泰安乡', - 711533: '铜锣乡', - 711534: '三义乡', - 711535: '西湖乡', - 711536: '卓兰镇', - 711700: '彰化县', - 711727: '彰化市', - 711728: '芬园乡', - 711729: '花坛乡', - 711730: '秀水乡', - 711731: '鹿港镇', - 711732: '福兴乡', - 711733: '线西乡', - 711734: '和美镇', - 711735: '伸港乡', - 711736: '员林镇', - 711737: '社头乡', - 711738: '永靖乡', - 711739: '埔心乡', - 711740: '溪湖镇', - 711741: '大村乡', - 711742: '埔盐乡', - 711743: '田中镇', - 711744: '北斗镇', - 711745: '田尾乡', - 711746: '埤头乡', - 711747: '溪州乡', - 711748: '竹塘乡', - 711749: '二林镇', - 711750: '大城乡', - 711751: '芳苑乡', - 711752: '二水乡', - 711900: '嘉义县', - 711919: '番路乡', - 711920: '梅山乡', - 711921: '竹崎乡', - 711922: '阿里山乡', - 711923: '中埔乡', - 711924: '大埔乡', - 711925: '水上乡', - 711926: '鹿草乡', - 711927: '太保市', - 711928: '朴子市', - 711929: '东石乡', - 711930: '六脚乡', - 711931: '新港乡', - 711932: '民雄乡', - 711933: '大林镇', - 711934: '溪口乡', - 711935: '义竹乡', - 711936: '布袋镇', - 712100: '云林县', - 712121: '斗南镇', - 712122: '大埤乡', - 712123: '虎尾镇', - 712124: '土库镇', - 712125: '褒忠乡', - 712126: '东势乡', - 712127: '台西乡', - 712128: '仑背乡', - 712129: '麦寮乡', - 712130: '斗六市', - 712131: '林内乡', - 712132: '古坑乡', - 712133: '莿桐乡', - 712134: '西螺镇', - 712135: '二仑乡', - 712136: '北港镇', - 712137: '水林乡', - 712138: '口湖乡', - 712139: '四湖乡', - 712140: '元长乡', - 712400: '屏东县', - 712434: '屏东市', - 712435: '三地门乡', - 712436: '雾台乡', - 712437: '玛家乡', - 712438: '九如乡', - 712439: '里港乡', - 712440: '高树乡', - 712441: '盐埔乡', - 712442: '长治乡', - 712443: '麟洛乡', - 712444: '竹田乡', - 712445: '内埔乡', - 712446: '万丹乡', - 712447: '潮州镇', - 712448: '泰武乡', - 712449: '来义乡', - 712450: '万峦乡', - 712451: '崁顶乡', - 712452: '新埤乡', - 712453: '南州乡', - 712454: '林边乡', - 712455: '东港镇', - 712456: '琉球乡', - 712457: '佳冬乡', - 712458: '新园乡', - 712459: '枋寮乡', - 712460: '枋山乡', - 712461: '春日乡', - 712462: '狮子乡', - 712463: '车城乡', - 712464: '牡丹乡', - 712465: '恒春镇', - 712466: '满州乡', - 712500: '台东县', - 712517: '台东市', - 712518: '绿岛乡', - 712519: '兰屿乡', - 712520: '延平乡', - 712521: '卑南乡', - 712522: '鹿野乡', - 712523: '关山镇', - 712524: '海端乡', - 712525: '池上乡', - 712526: '东河乡', - 712527: '成功镇', - 712528: '长滨乡', - 712529: '金峰乡', - 712530: '大武乡', - 712531: '达仁乡', - 712532: '太麻里乡', - 712600: '花莲县', - 712615: '花莲市', - 712616: '新城乡', - 712617: '太鲁阁', - 712618: '秀林乡', - 712619: '吉安乡', - 712620: '寿丰乡', - 712621: '凤林镇', - 712622: '光复乡', - 712623: '丰滨乡', - 712624: '瑞穗乡', - 712625: '万荣乡', - 712626: '玉里镇', - 712627: '卓溪乡', - 712628: '富里乡', - 712700: '澎湖县', - 712707: '马公市', - 712708: '西屿乡', - 712709: '望安乡', - 712710: '七美乡', - 712711: '白沙乡', - 712712: '湖西乡', - 712800: '连江县', - 712805: '南竿乡', - 712806: '北竿乡', - 712807: '莒光乡', - 712808: '东引乡', - 810000: '香港特别行政区', - 810100: '香港岛', - 810101: '中西区', - 810102: '湾仔', - 810103: '东区', - 810104: '南区', - 810200: '九龙', - 810201: '九龙城区', - 810202: '油尖旺区', - 810203: '深水埗区', - 810204: '黄大仙区', - 810205: '观塘区', - 810300: '新界', - 810301: '北区', - 810302: '大埔区', - 810303: '沙田区', - 810304: '西贡区', - 810305: '元朗区', - 810306: '屯门区', - 810307: '荃湾区', - 810308: '葵青区', - 810309: '离岛区', - 820000: '澳门特别行政区', - 820100: '澳门半岛', - 820200: '离岛', - 990000: '海外', - 990100: '海外', - }; - - // id pid/parentId name children - function tree(list) { - var mapped = {}; - for (var i = 0, item; i < list.length; i++) { - item = list[i]; - if (!item || !item.id) continue; - mapped[item.id] = item; - } - - var result = []; - for (var ii = 0; ii < list.length; ii++) { - item = list[ii]; - - if (!item) continue; - /* jshint -W041 */ - if (item.pid == undefined && item.parentId == undefined) { - result.push(item); - continue; - } - var parent = mapped[item.pid] || mapped[item.parentId]; - if (!parent) continue; - if (!parent.children) parent.children = []; - parent.children.push(item); - } - return result; - } - - var DICT_FIXED = (function () { - var fixed = []; - for (var id in DICT) { - var pid = - id.slice(2, 6) === '0000' - ? undefined - : id.slice(4, 6) == '00' - ? id.slice(0, 2) + '0000' - : id.slice(0, 4) + '00'; - fixed.push({ - id: id, - pid: pid, - name: DICT[id], - }); - } - return tree(fixed); - })(); - - module.exports = DICT_FIXED; - - /***/ - }, - /* 19 */ - /***/ function (module, exports, __webpack_require__) { - /* - ## Miscellaneous - */ - var DICT = __webpack_require__(18); - module.exports = { - // Dice - d4: function () { - return this.natural(1, 4); - }, - d6: function () { - return this.natural(1, 6); - }, - d8: function () { - return this.natural(1, 8); - }, - d12: function () { - return this.natural(1, 12); - }, - d20: function () { - return this.natural(1, 20); - }, - d100: function () { - return this.natural(1, 100); - }, - /* - 随机生成一个 GUID。 - - http://www.broofa.com/2008/09/javascript-uuid-function/ - [UUID 规范](http://www.ietf.org/rfc/rfc4122.txt) - UUIDs (Universally Unique IDentifier) - GUIDs (Globally Unique IDentifier) - The formal definition of the UUID string representation is provided by the following ABNF [7]: - UUID = time-low "-" time-mid "-" - time-high-and-version "-" - clock-seq-and-reserved - clock-seq-low "-" node - time-low = 4hexOctet - time-mid = 2hexOctet - time-high-and-version = 2hexOctet - clock-seq-and-reserved = hexOctet - clock-seq-low = hexOctet - node = 6hexOctet - hexOctet = hexDigit hexDigit - hexDigit = - "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" / - "a" / "b" / "c" / "d" / "e" / "f" / - "A" / "B" / "C" / "D" / "E" / "F" - - https://github.com/victorquinn/chancejs/blob/develop/chance.js#L1349 - */ - guid: function () { - var pool = 'abcdefABCDEF1234567890', - guid = - this.string(pool, 8) + - '-' + - this.string(pool, 4) + - '-' + - this.string(pool, 4) + - '-' + - this.string(pool, 4) + - '-' + - this.string(pool, 12); - return guid; - }, - uuid: function () { - return this.guid(); - }, - /* - 随机生成一个 18 位身份证。 - - [身份证](http://baike.baidu.com/view/1697.htm#4) - 地址码 6 + 出生日期码 8 + 顺序码 3 + 校验码 1 - [《中华人民共和国行政区划代码》国家标准(GB/T2260)](http://zhidao.baidu.com/question/1954561.html) - */ - id: function () { - var id, - sum = 0, - rank = ['7', '9', '10', '5', '8', '4', '2', '1', '6', '3', '7', '9', '10', '5', '8', '4', '2'], - last = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']; - - id = this.pick(DICT).id + this.date('yyyyMMdd') + this.string('number', 3); - - for (var i = 0; i < id.length; i++) { - sum += id[i] * rank[i]; - } - id += last[sum % 11]; - - return id; - }, - - /* - 生成一个全局的自增整数。 - 类似自增主键(auto increment primary key)。 - */ - increment: (function () { - var key = 0; - return function (step) { - return (key += +step || 1); // step? - }; - })(), - inc: function (step) { - return this.increment(step); - }, - }; - - /***/ - }, - /* 20 */ - /***/ function (module, exports, __webpack_require__) { - var Parser = __webpack_require__(21); - var Handler = __webpack_require__(22); - module.exports = { - Parser: Parser, - Handler: Handler, - }; - - /***/ - }, - /* 21 */ - /***/ function (module, exports) { - // https://github.com/nuysoft/regexp - // forked from https://github.com/ForbesLindesay/regexp - - function parse(n) { - if ('string' != typeof n) { - var l = new TypeError('The regexp to parse must be represented as a string.'); - throw l; - } - return (index = 1), (cgs = {}), parser.parse(n); - } - - function Token(n) { - (this.type = n), (this.offset = Token.offset()), (this.text = Token.text()); - } - - function Alternate(n, l) { - Token.call(this, 'alternate'), (this.left = n), (this.right = l); - } - - function Match(n) { - Token.call(this, 'match'), (this.body = n.filter(Boolean)); - } - - function Group(n, l) { - Token.call(this, n), (this.body = l); - } - - function CaptureGroup(n) { - Group.call(this, 'capture-group'), - (this.index = cgs[this.offset] || (cgs[this.offset] = index++)), - (this.body = n); - } - - function Quantified(n, l) { - Token.call(this, 'quantified'), (this.body = n), (this.quantifier = l); - } - - function Quantifier(n, l) { - Token.call(this, 'quantifier'), (this.min = n), (this.max = l), (this.greedy = !0); - } - - function CharSet(n, l) { - Token.call(this, 'charset'), (this.invert = n), (this.body = l); - } - - function CharacterRange(n, l) { - Token.call(this, 'range'), (this.start = n), (this.end = l); - } - - function Literal(n) { - Token.call(this, 'literal'), (this.body = n), (this.escaped = this.body != this.text); - } - - function Unicode(n) { - Token.call(this, 'unicode'), (this.code = n.toUpperCase()); - } - - function Hex(n) { - Token.call(this, 'hex'), (this.code = n.toUpperCase()); - } - - function Octal(n) { - Token.call(this, 'octal'), (this.code = n.toUpperCase()); - } - - function BackReference(n) { - Token.call(this, 'back-reference'), (this.code = n.toUpperCase()); - } - - function ControlCharacter(n) { - Token.call(this, 'control-character'), (this.code = n.toUpperCase()); - } - - var parser = (function () { - function n(n, l) { - function u() { - this.constructor = n; - } - (u.prototype = l.prototype), (n.prototype = new u()); - } - function l(n, l, u, t, r) { - function e(n, l) { - function u(n) { - function l(n) { - return n.charCodeAt(0).toString(16).toUpperCase(); - } - return n - .replace(/\\/g, '\\\\') - .replace(/"/g, '\\"') - .replace(/\x08/g, '\\b') - .replace(/\t/g, '\\t') - .replace(/\n/g, '\\n') - .replace(/\f/g, '\\f') - .replace(/\r/g, '\\r') - .replace(/[\x00-\x07\x0B\x0E\x0F]/g, function (n) { - return '\\x0' + l(n); - }) - .replace(/[\x10-\x1F\x80-\xFF]/g, function (n) { - return '\\x' + l(n); - }) - .replace(/[\u0180-\u0FFF]/g, function (n) { - return '\\u0' + l(n); - }) - .replace(/[\u1080-\uFFFF]/g, function (n) { - return '\\u' + l(n); - }); - } - var t, r; - switch (n.length) { - case 0: - t = 'end of input'; - break; - - case 1: - t = n[0]; - break; - - default: - t = n.slice(0, -1).join(', ') + ' or ' + n[n.length - 1]; - } - return (r = l ? '"' + u(l) + '"' : 'end of input'), 'Expected ' + t + ' but ' + r + ' found.'; - } - (this.expected = n), - (this.found = l), - (this.offset = u), - (this.line = t), - (this.column = r), - (this.name = 'SyntaxError'), - (this.message = e(n, l)); - } - function u(n) { - function u() { - return n.substring(Lt, qt); - } - function t() { - return Lt; - } - function r(l) { - function u(l, u, t) { - var r, e; - for (r = u; t > r; r++) - (e = n.charAt(r)), - '\n' === e - ? (l.seenCR || l.line++, (l.column = 1), (l.seenCR = !1)) - : '\r' === e || '\u2028' === e || '\u2029' === e - ? (l.line++, (l.column = 1), (l.seenCR = !0)) - : (l.column++, (l.seenCR = !1)); - } - return ( - Mt !== l && - (Mt > l && - ((Mt = 0), - (Dt = { - line: 1, - column: 1, - seenCR: !1, - })), - u(Dt, Mt, l), - (Mt = l)), - Dt - ); - } - function e(n) { - Ht > qt || (qt > Ht && ((Ht = qt), (Ot = [])), Ot.push(n)); - } - function o(n) { - var l = 0; - for (n.sort(); l < n.length; ) n[l - 1] === n[l] ? n.splice(l, 1) : l++; - } - function c() { - var l, u, t, r, o; - return ( - (l = qt), - (u = i()), - null !== u - ? ((t = qt), - 124 === n.charCodeAt(qt) ? ((r = fl), qt++) : ((r = null), 0 === Wt && e(sl)), - null !== r - ? ((o = c()), null !== o ? ((r = [r, o]), (t = r)) : ((qt = t), (t = il))) - : ((qt = t), (t = il)), - null === t && (t = al), - null !== t - ? ((Lt = l), (u = hl(u, t)), null === u ? ((qt = l), (l = u)) : (l = u)) - : ((qt = l), (l = il))) - : ((qt = l), (l = il)), - l - ); - } - function i() { - var n, l, u, t, r; - if (((n = qt), (l = f()), null === l && (l = al), null !== l)) - if (((u = qt), Wt++, (t = d()), Wt--, null === t ? (u = al) : ((qt = u), (u = il)), null !== u)) { - for (t = [], r = h(), null === r && (r = a()); null !== r; ) - t.push(r), (r = h()), null === r && (r = a()); - null !== t - ? ((r = s()), - null === r && (r = al), - null !== r - ? ((Lt = n), (l = dl(l, t, r)), null === l ? ((qt = n), (n = l)) : (n = l)) - : ((qt = n), (n = il))) - : ((qt = n), (n = il)); - } else (qt = n), (n = il); - else (qt = n), (n = il); - return n; - } - function a() { - var n; - return (n = x()), null === n && ((n = Q()), null === n && (n = B())), n; - } - function f() { - var l, u; - return ( - (l = qt), - 94 === n.charCodeAt(qt) ? ((u = pl), qt++) : ((u = null), 0 === Wt && e(vl)), - null !== u && ((Lt = l), (u = wl())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function s() { - var l, u; - return ( - (l = qt), - 36 === n.charCodeAt(qt) ? ((u = Al), qt++) : ((u = null), 0 === Wt && e(Cl)), - null !== u && ((Lt = l), (u = gl())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function h() { - var n, l, u; - return ( - (n = qt), - (l = a()), - null !== l - ? ((u = d()), - null !== u - ? ((Lt = n), (l = bl(l, u)), null === l ? ((qt = n), (n = l)) : (n = l)) - : ((qt = n), (n = il))) - : ((qt = n), (n = il)), - n - ); - } - function d() { - var n, l, u; - return ( - Wt++, - (n = qt), - (l = p()), - null !== l - ? ((u = k()), - null === u && (u = al), - null !== u - ? ((Lt = n), (l = Tl(l, u)), null === l ? ((qt = n), (n = l)) : (n = l)) - : ((qt = n), (n = il))) - : ((qt = n), (n = il)), - Wt--, - null === n && ((l = null), 0 === Wt && e(kl)), - n - ); - } - function p() { - var n; - return ( - (n = v()), - null === n && - ((n = w()), - null === n && - ((n = A()), null === n && ((n = C()), null === n && ((n = g()), null === n && (n = b()))))), - n - ); - } - function v() { - var l, u, t, r, o, c; - return ( - (l = qt), - 123 === n.charCodeAt(qt) ? ((u = xl), qt++) : ((u = null), 0 === Wt && e(yl)), - null !== u - ? ((t = T()), - null !== t - ? (44 === n.charCodeAt(qt) ? ((r = ml), qt++) : ((r = null), 0 === Wt && e(Rl)), - null !== r - ? ((o = T()), - null !== o - ? (125 === n.charCodeAt(qt) ? ((c = Fl), qt++) : ((c = null), 0 === Wt && e(Ql)), - null !== c - ? ((Lt = l), (u = Sl(t, o)), null === u ? ((qt = l), (l = u)) : (l = u)) - : ((qt = l), (l = il))) - : ((qt = l), (l = il))) - : ((qt = l), (l = il))) - : ((qt = l), (l = il))) - : ((qt = l), (l = il)), - l - ); - } - function w() { - var l, u, t, r; - return ( - (l = qt), - 123 === n.charCodeAt(qt) ? ((u = xl), qt++) : ((u = null), 0 === Wt && e(yl)), - null !== u - ? ((t = T()), - null !== t - ? (n.substr(qt, 2) === Ul ? ((r = Ul), (qt += 2)) : ((r = null), 0 === Wt && e(El)), - null !== r - ? ((Lt = l), (u = Gl(t)), null === u ? ((qt = l), (l = u)) : (l = u)) - : ((qt = l), (l = il))) - : ((qt = l), (l = il))) - : ((qt = l), (l = il)), - l - ); - } - function A() { - var l, u, t, r; - return ( - (l = qt), - 123 === n.charCodeAt(qt) ? ((u = xl), qt++) : ((u = null), 0 === Wt && e(yl)), - null !== u - ? ((t = T()), - null !== t - ? (125 === n.charCodeAt(qt) ? ((r = Fl), qt++) : ((r = null), 0 === Wt && e(Ql)), - null !== r - ? ((Lt = l), (u = Bl(t)), null === u ? ((qt = l), (l = u)) : (l = u)) - : ((qt = l), (l = il))) - : ((qt = l), (l = il))) - : ((qt = l), (l = il)), - l - ); - } - function C() { - var l, u; - return ( - (l = qt), - 43 === n.charCodeAt(qt) ? ((u = jl), qt++) : ((u = null), 0 === Wt && e($l)), - null !== u && ((Lt = l), (u = ql())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function g() { - var l, u; - return ( - (l = qt), - 42 === n.charCodeAt(qt) ? ((u = Ll), qt++) : ((u = null), 0 === Wt && e(Ml)), - null !== u && ((Lt = l), (u = Dl())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function b() { - var l, u; - return ( - (l = qt), - 63 === n.charCodeAt(qt) ? ((u = Hl), qt++) : ((u = null), 0 === Wt && e(Ol)), - null !== u && ((Lt = l), (u = Wl())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function k() { - var l; - return 63 === n.charCodeAt(qt) ? ((l = Hl), qt++) : ((l = null), 0 === Wt && e(Ol)), l; - } - function T() { - var l, u, t; - if ( - ((l = qt), - (u = []), - zl.test(n.charAt(qt)) ? ((t = n.charAt(qt)), qt++) : ((t = null), 0 === Wt && e(Il)), - null !== t) - ) - for (; null !== t; ) - u.push(t), zl.test(n.charAt(qt)) ? ((t = n.charAt(qt)), qt++) : ((t = null), 0 === Wt && e(Il)); - else u = il; - return null !== u && ((Lt = l), (u = Jl(u))), null === u ? ((qt = l), (l = u)) : (l = u), l; - } - function x() { - var l, u, t, r; - return ( - (l = qt), - 40 === n.charCodeAt(qt) ? ((u = Kl), qt++) : ((u = null), 0 === Wt && e(Nl)), - null !== u - ? ((t = R()), - null === t && ((t = F()), null === t && ((t = m()), null === t && (t = y()))), - null !== t - ? (41 === n.charCodeAt(qt) ? ((r = Pl), qt++) : ((r = null), 0 === Wt && e(Vl)), - null !== r - ? ((Lt = l), (u = Xl(t)), null === u ? ((qt = l), (l = u)) : (l = u)) - : ((qt = l), (l = il))) - : ((qt = l), (l = il))) - : ((qt = l), (l = il)), - l - ); - } - function y() { - var n, l; - return ( - (n = qt), - (l = c()), - null !== l && ((Lt = n), (l = Yl(l))), - null === l ? ((qt = n), (n = l)) : (n = l), - n - ); - } - function m() { - var l, u, t; - return ( - (l = qt), - n.substr(qt, 2) === Zl ? ((u = Zl), (qt += 2)) : ((u = null), 0 === Wt && e(_l)), - null !== u - ? ((t = c()), - null !== t - ? ((Lt = l), (u = nu(t)), null === u ? ((qt = l), (l = u)) : (l = u)) - : ((qt = l), (l = il))) - : ((qt = l), (l = il)), - l - ); - } - function R() { - var l, u, t; - return ( - (l = qt), - n.substr(qt, 2) === lu ? ((u = lu), (qt += 2)) : ((u = null), 0 === Wt && e(uu)), - null !== u - ? ((t = c()), - null !== t - ? ((Lt = l), (u = tu(t)), null === u ? ((qt = l), (l = u)) : (l = u)) - : ((qt = l), (l = il))) - : ((qt = l), (l = il)), - l - ); - } - function F() { - var l, u, t; - return ( - (l = qt), - n.substr(qt, 2) === ru ? ((u = ru), (qt += 2)) : ((u = null), 0 === Wt && e(eu)), - null !== u - ? ((t = c()), - null !== t - ? ((Lt = l), (u = ou(t)), null === u ? ((qt = l), (l = u)) : (l = u)) - : ((qt = l), (l = il))) - : ((qt = l), (l = il)), - l - ); - } - function Q() { - var l, u, t, r, o; - if ( - (Wt++, - (l = qt), - 91 === n.charCodeAt(qt) ? ((u = iu), qt++) : ((u = null), 0 === Wt && e(au)), - null !== u) - ) - if ( - (94 === n.charCodeAt(qt) ? ((t = pl), qt++) : ((t = null), 0 === Wt && e(vl)), - null === t && (t = al), - null !== t) - ) { - for (r = [], o = S(), null === o && (o = U()); null !== o; ) - r.push(o), (o = S()), null === o && (o = U()); - null !== r - ? (93 === n.charCodeAt(qt) ? ((o = fu), qt++) : ((o = null), 0 === Wt && e(su)), - null !== o - ? ((Lt = l), (u = hu(t, r)), null === u ? ((qt = l), (l = u)) : (l = u)) - : ((qt = l), (l = il))) - : ((qt = l), (l = il)); - } else (qt = l), (l = il); - else (qt = l), (l = il); - return Wt--, null === l && ((u = null), 0 === Wt && e(cu)), l; - } - function S() { - var l, u, t, r; - return ( - Wt++, - (l = qt), - (u = U()), - null !== u - ? (45 === n.charCodeAt(qt) ? ((t = pu), qt++) : ((t = null), 0 === Wt && e(vu)), - null !== t - ? ((r = U()), - null !== r - ? ((Lt = l), (u = wu(u, r)), null === u ? ((qt = l), (l = u)) : (l = u)) - : ((qt = l), (l = il))) - : ((qt = l), (l = il))) - : ((qt = l), (l = il)), - Wt--, - null === l && ((u = null), 0 === Wt && e(du)), - l - ); - } - function U() { - var n, l; - return Wt++, (n = G()), null === n && (n = E()), Wt--, null === n && ((l = null), 0 === Wt && e(Au)), n; - } - function E() { - var l, u; - return ( - (l = qt), - Cu.test(n.charAt(qt)) ? ((u = n.charAt(qt)), qt++) : ((u = null), 0 === Wt && e(gu)), - null !== u && ((Lt = l), (u = bu(u))), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function G() { - var n; - return ( - (n = L()), - null === n && - ((n = Y()), - null === n && - ((n = H()), - null === n && - ((n = O()), - null === n && - ((n = W()), - null === n && - ((n = z()), - null === n && - ((n = I()), - null === n && - ((n = J()), - null === n && - ((n = K()), - null === n && - ((n = N()), - null === n && - ((n = P()), - null === n && - ((n = V()), - null === n && - ((n = X()), - null === n && - ((n = _()), - null === n && - ((n = nl()), - null === n && - ((n = ll()), - null === n && ((n = ul()), null === n && (n = tl()))))))))))))))))), - n - ); - } - function B() { - var n; - return (n = j()), null === n && ((n = q()), null === n && (n = $())), n; - } - function j() { - var l, u; - return ( - (l = qt), - 46 === n.charCodeAt(qt) ? ((u = ku), qt++) : ((u = null), 0 === Wt && e(Tu)), - null !== u && ((Lt = l), (u = xu())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function $() { - var l, u; - return ( - Wt++, - (l = qt), - mu.test(n.charAt(qt)) ? ((u = n.charAt(qt)), qt++) : ((u = null), 0 === Wt && e(Ru)), - null !== u && ((Lt = l), (u = bu(u))), - null === u ? ((qt = l), (l = u)) : (l = u), - Wt--, - null === l && ((u = null), 0 === Wt && e(yu)), - l - ); - } - function q() { - var n; - return ( - (n = M()), - null === n && - ((n = D()), - null === n && - ((n = Y()), - null === n && - ((n = H()), - null === n && - ((n = O()), - null === n && - ((n = W()), - null === n && - ((n = z()), - null === n && - ((n = I()), - null === n && - ((n = J()), - null === n && - ((n = K()), - null === n && - ((n = N()), - null === n && - ((n = P()), - null === n && - ((n = V()), - null === n && - ((n = X()), - null === n && - ((n = Z()), - null === n && - ((n = _()), - null === n && - ((n = nl()), - null === n && - ((n = ll()), - null === n && - ((n = ul()), null === n && (n = tl()))))))))))))))))))), - n - ); - } - function L() { - var l, u; - return ( - (l = qt), - n.substr(qt, 2) === Fu ? ((u = Fu), (qt += 2)) : ((u = null), 0 === Wt && e(Qu)), - null !== u && ((Lt = l), (u = Su())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function M() { - var l, u; - return ( - (l = qt), - n.substr(qt, 2) === Fu ? ((u = Fu), (qt += 2)) : ((u = null), 0 === Wt && e(Qu)), - null !== u && ((Lt = l), (u = Uu())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function D() { - var l, u; - return ( - (l = qt), - n.substr(qt, 2) === Eu ? ((u = Eu), (qt += 2)) : ((u = null), 0 === Wt && e(Gu)), - null !== u && ((Lt = l), (u = Bu())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function H() { - var l, u; - return ( - (l = qt), - n.substr(qt, 2) === ju ? ((u = ju), (qt += 2)) : ((u = null), 0 === Wt && e($u)), - null !== u && ((Lt = l), (u = qu())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function O() { - var l, u; - return ( - (l = qt), - n.substr(qt, 2) === Lu ? ((u = Lu), (qt += 2)) : ((u = null), 0 === Wt && e(Mu)), - null !== u && ((Lt = l), (u = Du())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function W() { - var l, u; - return ( - (l = qt), - n.substr(qt, 2) === Hu ? ((u = Hu), (qt += 2)) : ((u = null), 0 === Wt && e(Ou)), - null !== u && ((Lt = l), (u = Wu())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function z() { - var l, u; - return ( - (l = qt), - n.substr(qt, 2) === zu ? ((u = zu), (qt += 2)) : ((u = null), 0 === Wt && e(Iu)), - null !== u && ((Lt = l), (u = Ju())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function I() { - var l, u; - return ( - (l = qt), - n.substr(qt, 2) === Ku ? ((u = Ku), (qt += 2)) : ((u = null), 0 === Wt && e(Nu)), - null !== u && ((Lt = l), (u = Pu())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function J() { - var l, u; - return ( - (l = qt), - n.substr(qt, 2) === Vu ? ((u = Vu), (qt += 2)) : ((u = null), 0 === Wt && e(Xu)), - null !== u && ((Lt = l), (u = Yu())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function K() { - var l, u; - return ( - (l = qt), - n.substr(qt, 2) === Zu ? ((u = Zu), (qt += 2)) : ((u = null), 0 === Wt && e(_u)), - null !== u && ((Lt = l), (u = nt())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function N() { - var l, u; - return ( - (l = qt), - n.substr(qt, 2) === lt ? ((u = lt), (qt += 2)) : ((u = null), 0 === Wt && e(ut)), - null !== u && ((Lt = l), (u = tt())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function P() { - var l, u; - return ( - (l = qt), - n.substr(qt, 2) === rt ? ((u = rt), (qt += 2)) : ((u = null), 0 === Wt && e(et)), - null !== u && ((Lt = l), (u = ot())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function V() { - var l, u; - return ( - (l = qt), - n.substr(qt, 2) === ct ? ((u = ct), (qt += 2)) : ((u = null), 0 === Wt && e(it)), - null !== u && ((Lt = l), (u = at())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function X() { - var l, u; - return ( - (l = qt), - n.substr(qt, 2) === ft ? ((u = ft), (qt += 2)) : ((u = null), 0 === Wt && e(st)), - null !== u && ((Lt = l), (u = ht())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function Y() { - var l, u, t; - return ( - (l = qt), - n.substr(qt, 2) === dt ? ((u = dt), (qt += 2)) : ((u = null), 0 === Wt && e(pt)), - null !== u - ? (n.length > qt ? ((t = n.charAt(qt)), qt++) : ((t = null), 0 === Wt && e(vt)), - null !== t - ? ((Lt = l), (u = wt(t)), null === u ? ((qt = l), (l = u)) : (l = u)) - : ((qt = l), (l = il))) - : ((qt = l), (l = il)), - l - ); - } - function Z() { - var l, u, t; - return ( - (l = qt), - 92 === n.charCodeAt(qt) ? ((u = At), qt++) : ((u = null), 0 === Wt && e(Ct)), - null !== u - ? (gt.test(n.charAt(qt)) ? ((t = n.charAt(qt)), qt++) : ((t = null), 0 === Wt && e(bt)), - null !== t - ? ((Lt = l), (u = kt(t)), null === u ? ((qt = l), (l = u)) : (l = u)) - : ((qt = l), (l = il))) - : ((qt = l), (l = il)), - l - ); - } - function _() { - var l, u, t, r; - if ( - ((l = qt), - n.substr(qt, 2) === Tt ? ((u = Tt), (qt += 2)) : ((u = null), 0 === Wt && e(xt)), - null !== u) - ) { - if ( - ((t = []), - yt.test(n.charAt(qt)) ? ((r = n.charAt(qt)), qt++) : ((r = null), 0 === Wt && e(mt)), - null !== r) - ) - for (; null !== r; ) - t.push(r), yt.test(n.charAt(qt)) ? ((r = n.charAt(qt)), qt++) : ((r = null), 0 === Wt && e(mt)); - else t = il; - null !== t - ? ((Lt = l), (u = Rt(t)), null === u ? ((qt = l), (l = u)) : (l = u)) - : ((qt = l), (l = il)); - } else (qt = l), (l = il); - return l; - } - function nl() { - var l, u, t, r; - if ( - ((l = qt), - n.substr(qt, 2) === Ft ? ((u = Ft), (qt += 2)) : ((u = null), 0 === Wt && e(Qt)), - null !== u) - ) { - if ( - ((t = []), - St.test(n.charAt(qt)) ? ((r = n.charAt(qt)), qt++) : ((r = null), 0 === Wt && e(Ut)), - null !== r) - ) - for (; null !== r; ) - t.push(r), St.test(n.charAt(qt)) ? ((r = n.charAt(qt)), qt++) : ((r = null), 0 === Wt && e(Ut)); - else t = il; - null !== t - ? ((Lt = l), (u = Et(t)), null === u ? ((qt = l), (l = u)) : (l = u)) - : ((qt = l), (l = il)); - } else (qt = l), (l = il); - return l; - } - function ll() { - var l, u, t, r; - if ( - ((l = qt), - n.substr(qt, 2) === Gt ? ((u = Gt), (qt += 2)) : ((u = null), 0 === Wt && e(Bt)), - null !== u) - ) { - if ( - ((t = []), - St.test(n.charAt(qt)) ? ((r = n.charAt(qt)), qt++) : ((r = null), 0 === Wt && e(Ut)), - null !== r) - ) - for (; null !== r; ) - t.push(r), St.test(n.charAt(qt)) ? ((r = n.charAt(qt)), qt++) : ((r = null), 0 === Wt && e(Ut)); - else t = il; - null !== t - ? ((Lt = l), (u = jt(t)), null === u ? ((qt = l), (l = u)) : (l = u)) - : ((qt = l), (l = il)); - } else (qt = l), (l = il); - return l; - } - function ul() { - var l, u; - return ( - (l = qt), - n.substr(qt, 2) === Tt ? ((u = Tt), (qt += 2)) : ((u = null), 0 === Wt && e(xt)), - null !== u && ((Lt = l), (u = $t())), - null === u ? ((qt = l), (l = u)) : (l = u), - l - ); - } - function tl() { - var l, u, t; - return ( - (l = qt), - 92 === n.charCodeAt(qt) ? ((u = At), qt++) : ((u = null), 0 === Wt && e(Ct)), - null !== u - ? (n.length > qt ? ((t = n.charAt(qt)), qt++) : ((t = null), 0 === Wt && e(vt)), - null !== t - ? ((Lt = l), (u = bu(t)), null === u ? ((qt = l), (l = u)) : (l = u)) - : ((qt = l), (l = il))) - : ((qt = l), (l = il)), - l - ); - } - var rl, - el = arguments.length > 1 ? arguments[1] : {}, - ol = { - regexp: c, - }, - cl = c, - il = null, - al = '', - fl = '|', - sl = '"|"', - hl = function (n, l) { - return l ? new Alternate(n, l[1]) : n; - }, - dl = function (n, l, u) { - return new Match([n].concat(l).concat([u])); - }, - pl = '^', - vl = '"^"', - wl = function () { - return new Token('start'); - }, - Al = '$', - Cl = '"$"', - gl = function () { - return new Token('end'); - }, - bl = function (n, l) { - return new Quantified(n, l); - }, - kl = 'Quantifier', - Tl = function (n, l) { - return l && (n.greedy = !1), n; - }, - xl = '{', - yl = '"{"', - ml = ',', - Rl = '","', - Fl = '}', - Ql = '"}"', - Sl = function (n, l) { - return new Quantifier(n, l); - }, - Ul = ',}', - El = '",}"', - Gl = function (n) { - return new Quantifier(n, 1 / 0); - }, - Bl = function (n) { - return new Quantifier(n, n); - }, - jl = '+', - $l = '"+"', - ql = function () { - return new Quantifier(1, 1 / 0); - }, - Ll = '*', - Ml = '"*"', - Dl = function () { - return new Quantifier(0, 1 / 0); - }, - Hl = '?', - Ol = '"?"', - Wl = function () { - return new Quantifier(0, 1); - }, - zl = /^[0-9]/, - Il = '[0-9]', - Jl = function (n) { - return +n.join(''); - }, - Kl = '(', - Nl = '"("', - Pl = ')', - Vl = '")"', - Xl = function (n) { - return n; - }, - Yl = function (n) { - return new CaptureGroup(n); - }, - Zl = '?:', - _l = '"?:"', - nu = function (n) { - return new Group('non-capture-group', n); - }, - lu = '?=', - uu = '"?="', - tu = function (n) { - return new Group('positive-lookahead', n); - }, - ru = '?!', - eu = '"?!"', - ou = function (n) { - return new Group('negative-lookahead', n); - }, - cu = 'CharacterSet', - iu = '[', - au = '"["', - fu = ']', - su = '"]"', - hu = function (n, l) { - return new CharSet(!!n, l); - }, - du = 'CharacterRange', - pu = '-', - vu = '"-"', - wu = function (n, l) { - return new CharacterRange(n, l); - }, - Au = 'Character', - Cu = /^[^\\\]]/, - gu = '[^\\\\\\]]', - bu = function (n) { - return new Literal(n); - }, - ku = '.', - Tu = '"."', - xu = function () { - return new Token('any-character'); - }, - yu = 'Literal', - mu = /^[^|\\\/.[()?+*$\^]/, - Ru = '[^|\\\\\\/.[()?+*$\\^]', - Fu = '\\b', - Qu = '"\\\\b"', - Su = function () { - return new Token('backspace'); - }, - Uu = function () { - return new Token('word-boundary'); - }, - Eu = '\\B', - Gu = '"\\\\B"', - Bu = function () { - return new Token('non-word-boundary'); - }, - ju = '\\d', - $u = '"\\\\d"', - qu = function () { - return new Token('digit'); - }, - Lu = '\\D', - Mu = '"\\\\D"', - Du = function () { - return new Token('non-digit'); - }, - Hu = '\\f', - Ou = '"\\\\f"', - Wu = function () { - return new Token('form-feed'); - }, - zu = '\\n', - Iu = '"\\\\n"', - Ju = function () { - return new Token('line-feed'); - }, - Ku = '\\r', - Nu = '"\\\\r"', - Pu = function () { - return new Token('carriage-return'); - }, - Vu = '\\s', - Xu = '"\\\\s"', - Yu = function () { - return new Token('white-space'); - }, - Zu = '\\S', - _u = '"\\\\S"', - nt = function () { - return new Token('non-white-space'); - }, - lt = '\\t', - ut = '"\\\\t"', - tt = function () { - return new Token('tab'); - }, - rt = '\\v', - et = '"\\\\v"', - ot = function () { - return new Token('vertical-tab'); - }, - ct = '\\w', - it = '"\\\\w"', - at = function () { - return new Token('word'); - }, - ft = '\\W', - st = '"\\\\W"', - ht = function () { - return new Token('non-word'); - }, - dt = '\\c', - pt = '"\\\\c"', - vt = 'any character', - wt = function (n) { - return new ControlCharacter(n); - }, - At = '\\', - Ct = '"\\\\"', - gt = /^[1-9]/, - bt = '[1-9]', - kt = function (n) { - return new BackReference(n); - }, - Tt = '\\0', - xt = '"\\\\0"', - yt = /^[0-7]/, - mt = '[0-7]', - Rt = function (n) { - return new Octal(n.join('')); - }, - Ft = '\\x', - Qt = '"\\\\x"', - St = /^[0-9a-fA-F]/, - Ut = '[0-9a-fA-F]', - Et = function (n) { - return new Hex(n.join('')); - }, - Gt = '\\u', - Bt = '"\\\\u"', - jt = function (n) { - return new Unicode(n.join('')); - }, - $t = function () { - return new Token('null-character'); - }, - qt = 0, - Lt = 0, - Mt = 0, - Dt = { - line: 1, - column: 1, - seenCR: !1, - }, - Ht = 0, - Ot = [], - Wt = 0; - if ('startRule' in el) { - if (!(el.startRule in ol)) throw new Error('Can\'t start parsing from rule "' + el.startRule + '".'); - cl = ol[el.startRule]; - } - if (((Token.offset = t), (Token.text = u), (rl = cl()), null !== rl && qt === n.length)) return rl; - throw ( - (o(Ot), - (Lt = Math.max(qt, Ht)), - new l(Ot, Lt < n.length ? n.charAt(Lt) : null, Lt, r(Lt).line, r(Lt).column)) - ); - } - return ( - n(l, Error), - { - SyntaxError: l, - parse: u, - } - ); - })(), - index = 1, - cgs = {}; - - module.exports = parser; - - /***/ - }, - /* 22 */ - /***/ function (module, exports, __webpack_require__) { - /* - ## RegExp Handler - - https://github.com/ForbesLindesay/regexp - https://github.com/dmajda/pegjs - http://www.regexper.com/ - - 每个节点的结构 - { - type: '', - offset: number, - text: '', - body: {}, - escaped: true/false - } - - type 可选值 - alternate | 选择 - match 匹配 - capture-group () 捕获组 - non-capture-group (?:...) 非捕获组 - positive-lookahead (?=p) 零宽正向先行断言 - negative-lookahead (?!p) 零宽负向先行断言 - quantified a* 重复节点 - quantifier * 量词 - charset [] 字符集 - range {m, n} 范围 - literal a 直接量字符 - unicode \uxxxx Unicode - hex \x 十六进制 - octal 八进制 - back-reference \n 反向引用 - control-character \cX 控制字符 - - // Token - start ^ 开头 - end $ 结尾 - any-character . 任意字符 - backspace [\b] 退格直接量 - word-boundary \b 单词边界 - non-word-boundary \B 非单词边界 - digit \d ASCII 数字,[0-9] - non-digit \D 非 ASCII 数字,[^0-9] - form-feed \f 换页符 - line-feed \n 换行符 - carriage-return \r 回车符 - white-space \s 空白符 - non-white-space \S 非空白符 - tab \t 制表符 - vertical-tab \v 垂直制表符 - word \w ASCII 字符,[a-zA-Z0-9] - non-word \W 非 ASCII 字符,[^a-zA-Z0-9] - null-character \o NUL 字符 - */ - - var Util = __webpack_require__(3); - var Random = __webpack_require__(5); - /* - - */ - var Handler = { - extend: Util.extend, - }; - - // http://en.wikipedia.org/wiki/ASCII#ASCII_printable_code_chart - /*var ASCII_CONTROL_CODE_CHART = { - '@': ['\u0000'], - A: ['\u0001'], - B: ['\u0002'], - C: ['\u0003'], - D: ['\u0004'], - E: ['\u0005'], - F: ['\u0006'], - G: ['\u0007', '\a'], - H: ['\u0008', '\b'], - I: ['\u0009', '\t'], - J: ['\u000A', '\n'], - K: ['\u000B', '\v'], - L: ['\u000C', '\f'], - M: ['\u000D', '\r'], - N: ['\u000E'], - O: ['\u000F'], - P: ['\u0010'], - Q: ['\u0011'], - R: ['\u0012'], - S: ['\u0013'], - T: ['\u0014'], - U: ['\u0015'], - V: ['\u0016'], - W: ['\u0017'], - X: ['\u0018'], - Y: ['\u0019'], - Z: ['\u001A'], - '[': ['\u001B', '\e'], - '\\': ['\u001C'], - ']': ['\u001D'], - '^': ['\u001E'], - '_': ['\u001F'] - }*/ - - // ASCII printable code chart - // var LOWER = 'abcdefghijklmnopqrstuvwxyz' - // var UPPER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' - // var NUMBER = '0123456789' - // var SYMBOL = ' !"#$%&\'()*+,-./' + ':;<=>?@' + '[\\]^_`' + '{|}~' - var LOWER = ascii(97, 122); - var UPPER = ascii(65, 90); - var NUMBER = ascii(48, 57); - var OTHER = ascii(32, 47) + ascii(58, 64) + ascii(91, 96) + ascii(123, 126); // 排除 95 _ ascii(91, 94) + ascii(96, 96) - var PRINTABLE = ascii(32, 126); - var SPACE = ' \f\n\r\t\v\u00A0\u2028\u2029'; - var CHARACTER_CLASSES = { - '\\w': LOWER + UPPER + NUMBER + '_', // ascii(95, 95) - '\\W': OTHER.replace('_', ''), - '\\s': SPACE, - '\\S': (function () { - var result = PRINTABLE; - for (var i = 0; i < SPACE.length; i++) { - result = result.replace(SPACE[i], ''); - } - return result; - })(), - '\\d': NUMBER, - '\\D': LOWER + UPPER + OTHER, - }; - - function ascii(from, to) { - var result = ''; - for (var i = from; i <= to; i++) { - result += String.fromCharCode(i); - } - return result; - } - - // var ast = RegExpParser.parse(regexp.source) - Handler.gen = function (node, result, cache) { - cache = cache || { - guid: 1, - }; - return Handler[node.type] ? Handler[node.type](node, result, cache) : Handler.token(node, result, cache); - }; - - Handler.extend({ - /* jshint unused:false */ - token: function (node, result, cache) { - switch (node.type) { - case 'start': - case 'end': - return ''; - case 'any-character': - return Random.character(); - case 'backspace': - return ''; - case 'word-boundary': // TODO - return ''; - case 'non-word-boundary': // TODO - break; - case 'digit': - return Random.pick(NUMBER.split('')); - case 'non-digit': - return Random.pick((LOWER + UPPER + OTHER).split('')); - case 'form-feed': - break; - case 'line-feed': - return node.body || node.text; - case 'carriage-return': - break; - case 'white-space': - return Random.pick(SPACE.split('')); - case 'non-white-space': - return Random.pick((LOWER + UPPER + NUMBER).split('')); - case 'tab': - break; - case 'vertical-tab': - break; - case 'word': // \w [a-zA-Z0-9] - return Random.pick((LOWER + UPPER + NUMBER).split('')); - case 'non-word': // \W [^a-zA-Z0-9] - return Random.pick(OTHER.replace('_', '').split('')); - case 'null-character': - break; - } - return node.body || node.text; - }, - /* - { - type: 'alternate', - offset: 0, - text: '', - left: { - boyd: [] - }, - right: { - boyd: [] - } - } - */ - alternate: function (node, result, cache) { - // node.left/right {} - return this.gen(Random.boolean() ? node.left : node.right, result, cache); - }, - /* - { - type: 'match', - offset: 0, - text: '', - body: [] - } - */ - match: function (node, result, cache) { - result = ''; - // node.body [] - for (var i = 0; i < node.body.length; i++) { - result += this.gen(node.body[i], result, cache); - } - return result; - }, - // () - 'capture-group': function (node, result, cache) { - // node.body {} - result = this.gen(node.body, result, cache); - cache[cache.guid++] = result; - return result; - }, - // (?:...) - 'non-capture-group': function (node, result, cache) { - // node.body {} - return this.gen(node.body, result, cache); - }, - // (?=p) - 'positive-lookahead': function (node, result, cache) { - // node.body - return this.gen(node.body, result, cache); - }, - // (?!p) - 'negative-lookahead': function (node, result, cache) { - // node.body - return ''; - }, - /* - { - type: 'quantified', - offset: 3, - text: 'c*', - body: { - type: 'literal', - offset: 3, - text: 'c', - body: 'c', - escaped: false - }, - quantifier: { - type: 'quantifier', - offset: 4, - text: '*', - min: 0, - max: Infinity, - greedy: true - } - } - */ - quantified: function (node, result, cache) { - result = ''; - // node.quantifier {} - var count = this.quantifier(node.quantifier); - // node.body {} - for (var i = 0; i < count; i++) { - result += this.gen(node.body, result, cache); - } - return result; - }, - /* - quantifier: { - type: 'quantifier', - offset: 4, - text: '*', - min: 0, - max: Infinity, - greedy: true - } - */ - quantifier: function (node, result, cache) { - var min = Math.max(node.min, 0); - var max = isFinite(node.max) ? node.max : min + Random.integer(3, 7); - return Random.integer(min, max); - }, - /* - - */ - charset: function (node, result, cache) { - // node.invert - if (node.invert) return this['invert-charset'](node, result, cache); - - // node.body [] - var literal = Random.pick(node.body); - return this.gen(literal, result, cache); - }, - 'invert-charset': function (node, result, cache) { - var pool = PRINTABLE; - for (var i = 0, item; i < node.body.length; i++) { - item = node.body[i]; - switch (item.type) { - case 'literal': - pool = pool.replace(item.body, ''); - break; - case 'range': - var min = this.gen(item.start, result, cache).charCodeAt(); - var max = this.gen(item.end, result, cache).charCodeAt(); - for (var ii = min; ii <= max; ii++) { - pool = pool.replace(String.fromCharCode(ii), ''); - } - /* falls through */ - default: - var characters = CHARACTER_CLASSES[item.text]; - if (characters) { - for (var iii = 0; iii <= characters.length; iii++) { - pool = pool.replace(characters[iii], ''); - } - } - } - } - return Random.pick(pool.split('')); - }, - range: function (node, result, cache) { - // node.start, node.end - var min = this.gen(node.start, result, cache).charCodeAt(); - var max = this.gen(node.end, result, cache).charCodeAt(); - return String.fromCharCode(Random.integer(min, max)); - }, - literal: function (node, result, cache) { - return node.escaped ? node.body : node.text; - }, - // Unicode \u - unicode: function (node, result, cache) { - return String.fromCharCode(parseInt(node.code, 16)); - }, - // 十六进制 \xFF - hex: function (node, result, cache) { - return String.fromCharCode(parseInt(node.code, 16)); - }, - // 八进制 \0 - octal: function (node, result, cache) { - return String.fromCharCode(parseInt(node.code, 8)); - }, - // 反向引用 - 'back-reference': function (node, result, cache) { - return cache[node.code] || ''; - }, - /* - http://en.wikipedia.org/wiki/C0_and_C1_control_codes - */ - CONTROL_CHARACTER_MAP: (function () { - var CONTROL_CHARACTER = '@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ _'.split(' '); - var CONTROL_CHARACTER_UNICODE = - '\u0000 \u0001 \u0002 \u0003 \u0004 \u0005 \u0006 \u0007 \u0008 \u0009 \u000A \u000B \u000C \u000D \u000E \u000F \u0010 \u0011 \u0012 \u0013 \u0014 \u0015 \u0016 \u0017 \u0018 \u0019 \u001A \u001B \u001C \u001D \u001E \u001F'.split( - ' ', - ); - var map = {}; - for (var i = 0; i < CONTROL_CHARACTER.length; i++) { - map[CONTROL_CHARACTER[i]] = CONTROL_CHARACTER_UNICODE[i]; - } - return map; - })(), - 'control-character': function (node, result, cache) { - return this.CONTROL_CHARACTER_MAP[node.code]; - }, - }); - - module.exports = Handler; - - /***/ - }, - /* 23 */ - /***/ function (module, exports, __webpack_require__) { - module.exports = __webpack_require__(24); - - /***/ - }, - /* 24 */ - /***/ function (module, exports, __webpack_require__) { - /* - ## toJSONSchema - - 把 Mock.js 风格的数据模板转换成 JSON Schema。 - - > [JSON Schema](http://json-schema.org/) - */ - var Constant = __webpack_require__(2); - var Util = __webpack_require__(3); - var Parser = __webpack_require__(4); - - function toJSONSchema(template, name, path /* Internal Use Only */) { - // type rule properties items - path = path || []; - var result = { - name: typeof name === 'string' ? name.replace(Constant.RE_KEY, '$1') : name, - template: template, - type: Util.type(template), // 可能不准确,例如 { 'name|1': [{}, {} ...] } - rule: Parser.parse(name), - }; - result.path = path.slice(0); - result.path.push(name === undefined ? 'ROOT' : result.name); - - switch (result.type) { - case 'array': - result.items = []; - Util.each(template, function (value, index) { - result.items.push(toJSONSchema(value, index, result.path)); - }); - break; - case 'object': - result.properties = []; - Util.each(template, function (value, name) { - result.properties.push(toJSONSchema(value, name, result.path)); - }); - break; - } - - return result; - } - - module.exports = toJSONSchema; - - /***/ - }, - /* 25 */ - /***/ function (module, exports, __webpack_require__) { - module.exports = __webpack_require__(26); - - /***/ - }, - /* 26 */ - /***/ function (module, exports, __webpack_require__) { - /* - ## valid(template, data) - - 校验真实数据 data 是否与数据模板 template 匹配。 - - 实现思路: - 1. 解析规则。 - 先把数据模板 template 解析为更方便机器解析的 JSON-Schame - name 属性名 - type 属性值类型 - template 属性值模板 - properties 对象属性数组 - items 数组元素数组 - rule 属性值生成规则 - 2. 递归验证规则。 - 然后用 JSON-Schema 校验真实数据,校验项包括属性名、值类型、值、值生成规则。 - - 提示信息 - https://github.com/fge/json-schema-validator/blob/master/src/main/resources/com/github/fge/jsonschema/validator/validation.properties - [JSON-Schama validator](http://json-schema-validator.herokuapp.com/) - [Regexp Demo](http://demos.forbeslindesay.co.uk/regexp/) - */ - var Constant = __webpack_require__(2); - var Util = __webpack_require__(3); - var toJSONSchema = __webpack_require__(23); - - function valid(template, data) { - var schema = toJSONSchema(template); - var result = Diff.diff(schema, data); - for (var i = 0; i < result.length; i++) { - // console.log(template, data) - // console.warn(Assert.message(result[i])) - } - return result; - } - - /* - ## name - 有生成规则:比较解析后的 name - 无生成规则:直接比较 - ## type - 无类型转换:直接比较 - 有类型转换:先试着解析 template,然后再检查? - ## value vs. template - 基本类型 - 无生成规则:直接比较 - 有生成规则: - number - min-max.dmin-dmax - min-max.dcount - count.dmin-dmax - count.dcount - +step - 整数部分 - 小数部分 - boolean - string - min-max - count - ## properties - 对象 - 有生成规则:检测期望的属性个数,继续递归 - 无生成规则:检测全部的属性个数,继续递归 - ## items - 数组 - 有生成规则: - `'name|1': [{}, {} ...]` 其中之一,继续递归 - `'name|+1': [{}, {} ...]` 顺序检测,继续递归 - `'name|min-max': [{}, {} ...]` 检测个数,继续递归 - `'name|count': [{}, {} ...]` 检测个数,继续递归 - 无生成规则:检测全部的元素个数,继续递归 - */ - var Diff = { - diff: function diff(schema, data, name /* Internal Use Only */) { - var result = []; - - // 先检测名称 name 和类型 type,如果匹配,才有必要继续检测 - if (this.name(schema, data, name, result) && this.type(schema, data, name, result)) { - this.value(schema, data, name, result); - this.properties(schema, data, name, result); - this.items(schema, data, name, result); - } - - return result; - }, - /* jshint unused:false */ - name: function (schema, data, name, result) { - var length = result.length; - - Assert.equal('name', schema.path, name + '', schema.name + '', result); - - return result.length === length; - }, - type: function (schema, data, name, result) { - var length = result.length; - - switch (schema.type) { - case 'string': - // 跳过含有『占位符』的属性值,因为『占位符』返回值的类型可能和模板不一致,例如 '@int' 会返回一个整形值 - if (schema.template.match(Constant.RE_PLACEHOLDER)) return true; - break; - case 'array': - if (schema.rule.parameters) { - // name|count: array - if (schema.rule.min !== undefined && schema.rule.max === undefined) { - // 跳过 name|1: array,因为最终值的类型(很可能)不是数组,也不一定与 `array` 中的类型一致 - if (schema.rule.count === 1) return true; - } - // 跳过 name|+inc: array - if (schema.rule.parameters[2]) return true; - } - break; - case 'function': - // 跳过 `'name': function`,因为函数可以返回任何类型的值。 - return true; - } - - Assert.equal('type', schema.path, Util.type(data), schema.type, result); - - return result.length === length; - }, - value: function (schema, data, name, result) { - var length = result.length; - - var rule = schema.rule; - var templateType = schema.type; - if (templateType === 'object' || templateType === 'array' || templateType === 'function') return true; - - // 无生成规则 - if (!rule.parameters) { - switch (templateType) { - case 'regexp': - Assert.match('value', schema.path, data, schema.template, result); - return result.length === length; - case 'string': - // 同样跳过含有『占位符』的属性值,因为『占位符』的返回值会通常会与模板不一致 - if (schema.template.match(Constant.RE_PLACEHOLDER)) return result.length === length; - break; - } - Assert.equal('value', schema.path, data, schema.template, result); - return result.length === length; - } - - // 有生成规则 - var actualRepeatCount; - switch (templateType) { - case 'number': - var parts = (data + '').split('.'); - parts[0] = +parts[0]; - - // 整数部分 - // |min-max - if (rule.min !== undefined && rule.max !== undefined) { - Assert.greaterThanOrEqualTo('value', schema.path, parts[0], Math.min(rule.min, rule.max), result); - // , 'numeric instance is lower than the required minimum (minimum: {expected}, found: {actual})') - Assert.lessThanOrEqualTo('value', schema.path, parts[0], Math.max(rule.min, rule.max), result); - } - // |count - if (rule.min !== undefined && rule.max === undefined) { - Assert.equal('value', schema.path, parts[0], rule.min, result, '[value] ' + name); - } - - // 小数部分 - if (rule.decimal) { - // |dmin-dmax - if (rule.dmin !== undefined && rule.dmax !== undefined) { - Assert.greaterThanOrEqualTo('value', schema.path, parts[1].length, rule.dmin, result); - Assert.lessThanOrEqualTo('value', schema.path, parts[1].length, rule.dmax, result); - } - // |dcount - if (rule.dmin !== undefined && rule.dmax === undefined) { - Assert.equal('value', schema.path, parts[1].length, rule.dmin, result); - } - } - - break; - - case 'boolean': - break; - - case 'string': - // 'aaa'.match(/a/g) - actualRepeatCount = data.match(new RegExp(schema.template, 'g')); - actualRepeatCount = actualRepeatCount ? actualRepeatCount.length : 0; - - // |min-max - if (rule.min !== undefined && rule.max !== undefined) { - Assert.greaterThanOrEqualTo('repeat count', schema.path, actualRepeatCount, rule.min, result); - Assert.lessThanOrEqualTo('repeat count', schema.path, actualRepeatCount, rule.max, result); - } - // |count - if (rule.min !== undefined && rule.max === undefined) { - Assert.equal('repeat count', schema.path, actualRepeatCount, rule.min, result); - } - - break; - - case 'regexp': - actualRepeatCount = data.match(new RegExp(schema.template.source.replace(/^\^|\$$/g, ''), 'g')); - actualRepeatCount = actualRepeatCount ? actualRepeatCount.length : 0; - - // |min-max - if (rule.min !== undefined && rule.max !== undefined) { - Assert.greaterThanOrEqualTo('repeat count', schema.path, actualRepeatCount, rule.min, result); - Assert.lessThanOrEqualTo('repeat count', schema.path, actualRepeatCount, rule.max, result); - } - // |count - if (rule.min !== undefined && rule.max === undefined) { - Assert.equal('repeat count', schema.path, actualRepeatCount, rule.min, result); - } - break; - } - - return result.length === length; - }, - properties: function (schema, data, name, result) { - var length = result.length; - - var rule = schema.rule; - var keys = Util.keys(data); - if (!schema.properties) return; - - // 无生成规则 - if (!schema.rule.parameters) { - Assert.equal('properties length', schema.path, keys.length, schema.properties.length, result); - } else { - // 有生成规则 - // |min-max - if (rule.min !== undefined && rule.max !== undefined) { - Assert.greaterThanOrEqualTo( - 'properties length', - schema.path, - keys.length, - Math.min(rule.min, rule.max), - result, - ); - Assert.lessThanOrEqualTo( - 'properties length', - schema.path, - keys.length, - Math.max(rule.min, rule.max), - result, - ); - } - // |count - if (rule.min !== undefined && rule.max === undefined) { - // |1, |>1 - if (rule.count !== 1) Assert.equal('properties length', schema.path, keys.length, rule.min, result); - } - } - - if (result.length !== length) return false; - - for (var i = 0; i < keys.length; i++) { - result.push.apply( - result, - this.diff( - (function () { - var property; - Util.each(schema.properties, function (item /*, index*/) { - if (item.name === keys[i]) property = item; - }); - return property || schema.properties[i]; - })(), - data[keys[i]], - keys[i], - ), - ); - } - - return result.length === length; - }, - items: function (schema, data, name, result) { - var length = result.length; - - if (!schema.items) return; - - var rule = schema.rule; - - // 无生成规则 - if (!schema.rule.parameters) { - Assert.equal('items length', schema.path, data.length, schema.items.length, result); - } else { - // 有生成规则 - // |min-max - if (rule.min !== undefined && rule.max !== undefined) { - Assert.greaterThanOrEqualTo( - 'items', - schema.path, - data.length, - Math.min(rule.min, rule.max) * schema.items.length, - result, - '[{utype}] array is too short: {path} must have at least {expected} elements but instance has {actual} elements', - ); - Assert.lessThanOrEqualTo( - 'items', - schema.path, - data.length, - Math.max(rule.min, rule.max) * schema.items.length, - result, - '[{utype}] array is too long: {path} must have at most {expected} elements but instance has {actual} elements', - ); - } - // |count - if (rule.min !== undefined && rule.max === undefined) { - // |1, |>1 - if (rule.count === 1) return result.length === length; - else Assert.equal('items length', schema.path, data.length, rule.min * schema.items.length, result); - } - // |+inc - if (rule.parameters[2]) return result.length === length; - } - - if (result.length !== length) return false; - - for (var i = 0; i < data.length; i++) { - result.push.apply( - result, - this.diff(schema.items[i % schema.items.length], data[i], i % schema.items.length), - ); - } - - return result.length === length; - }, - }; - - /* - 完善、友好的提示信息 - - Equal, not equal to, greater than, less than, greater than or equal to, less than or equal to - 路径 验证类型 描述 - - Expect path.name is less than or equal to expected, but path.name is actual. - - Expect path.name is less than or equal to expected, but path.name is actual. - Expect path.name is greater than or equal to expected, but path.name is actual. - - */ - var Assert = { - message: function (item) { - return (item.message || "[{utype}] Expect {path}'{ltype} {action} {expected}, but is {actual}") - .replace('{utype}', item.type.toUpperCase()) - .replace('{ltype}', item.type.toLowerCase()) - .replace('{path}', (Util.isArray(item.path) && item.path.join('.')) || item.path) - .replace('{action}', item.action) - .replace('{expected}', item.expected) - .replace('{actual}', item.actual); - }, - equal: function (type, path, actual, expected, result, message) { - if (actual === expected) return true; - switch (type) { - case 'type': - // 正则模板 === 字符串最终值 - if (expected === 'regexp' && actual === 'string') return true; - break; - } - - var item = { - path: path, - type: type, - actual: actual, - expected: expected, - action: 'is equal to', - message: message, - }; - item.message = Assert.message(item); - result.push(item); - return false; - }, - // actual matches expected - match: function (type, path, actual, expected, result, message) { - if (expected.test(actual)) return true; - - var item = { - path: path, - type: type, - actual: actual, - expected: expected, - action: 'matches', - message: message, - }; - item.message = Assert.message(item); - result.push(item); - return false; - }, - notEqual: function (type, path, actual, expected, result, message) { - if (actual !== expected) return true; - var item = { - path: path, - type: type, - actual: actual, - expected: expected, - action: 'is not equal to', - message: message, - }; - item.message = Assert.message(item); - result.push(item); - return false; - }, - greaterThan: function (type, path, actual, expected, result, message) { - if (actual > expected) return true; - var item = { - path: path, - type: type, - actual: actual, - expected: expected, - action: 'is greater than', - message: message, - }; - item.message = Assert.message(item); - result.push(item); - return false; - }, - lessThan: function (type, path, actual, expected, result, message) { - if (actual < expected) return true; - var item = { - path: path, - type: type, - actual: actual, - expected: expected, - action: 'is less to', - message: message, - }; - item.message = Assert.message(item); - result.push(item); - return false; - }, - greaterThanOrEqualTo: function (type, path, actual, expected, result, message) { - if (actual >= expected) return true; - var item = { - path: path, - type: type, - actual: actual, - expected: expected, - action: 'is greater than or equal to', - message: message, - }; - item.message = Assert.message(item); - result.push(item); - return false; - }, - lessThanOrEqualTo: function (type, path, actual, expected, result, message) { - if (actual <= expected) return true; - var item = { - path: path, - type: type, - actual: actual, - expected: expected, - action: 'is less than or equal to', - message: message, - }; - item.message = Assert.message(item); - result.push(item); - return false; - }, - }; - - valid.Diff = Diff; - valid.Assert = Assert; - - module.exports = valid; - - /***/ - }, - /* 27 */ - /***/ function (module, exports, __webpack_require__) { - module.exports = __webpack_require__(28); - - /***/ - }, - /* 28 */ - /***/ function (module, exports, __webpack_require__) { - /* global window, document, location, Event, setTimeout */ - /* - ## MockXMLHttpRequest - - 期望的功能: - 1. 完整地覆盖原生 XHR 的行为 - 2. 完整地模拟原生 XHR 的行为 - 3. 在发起请求时,自动检测是否需要拦截 - 4. 如果不必拦截,则执行原生 XHR 的行为 - 5. 如果需要拦截,则执行虚拟 XHR 的行为 - 6. 兼容 XMLHttpRequest 和 ActiveXObject - new window.XMLHttpRequest() - new window.ActiveXObject("Microsoft.XMLHTTP") - - 关键方法的逻辑: - * new 此时尚无法确定是否需要拦截,所以创建原生 XHR 对象是必须的。 - * open 此时可以取到 URL,可以决定是否进行拦截。 - * send 此时已经确定了请求方式。 - - 规范: - http://xhr.spec.whatwg.org/ - http://www.w3.org/TR/XMLHttpRequest2/ - - 参考实现: - https://github.com/philikon/MockHttpRequest/blob/master/lib/mock.js - https://github.com/trek/FakeXMLHttpRequest/blob/master/fake_xml_http_request.js - https://github.com/ilinsky/xmlhttprequest/blob/master/XMLHttpRequest.js - https://github.com/firebug/firebug-lite/blob/master/content/lite/xhr.js - https://github.com/thx/RAP/blob/master/lab/rap.plugin.xinglie.js - - **需不需要全面重写 XMLHttpRequest?** - http://xhr.spec.whatwg.org/#interface-xmlhttprequest - 关键属性 readyState、status、statusText、response、responseText、responseXML 是 readonly,所以,试图通过修改这些状态,来模拟响应是不可行的。 - 因此,唯一的办法是模拟整个 XMLHttpRequest,就像 jQuery 对事件模型的封装。 - - // Event handlers - onloadstart loadstart - onprogress progress - onabort abort - onerror error - onload load - ontimeout timeout - onloadend loadend - onreadystatechange readystatechange - */ - - var Util = __webpack_require__(3); - - // 备份原生 XMLHttpRequest - window._XMLHttpRequest = window.XMLHttpRequest; - window._ActiveXObject = window.ActiveXObject; - - /* - PhantomJS - TypeError: '[object EventConstructor]' is not a constructor (evaluating 'new Event("readystatechange")') - - https://github.com/bluerail/twitter-bootstrap-rails-confirm/issues/18 - https://github.com/ariya/phantomjs/issues/11289 - */ - try { - new window.Event('custom'); - } catch (exception) { - window.Event = function (type, bubbles, cancelable, detail) { - var event = document.createEvent('CustomEvent'); // MUST be 'CustomEvent' - event.initCustomEvent(type, bubbles, cancelable, detail); - return event; - }; - } - - var XHR_STATES = { - // The object has been constructed. - UNSENT: 0, - // The open() method has been successfully invoked. - OPENED: 1, - // All redirects (if any) have been followed and all HTTP headers of the response have been received. - HEADERS_RECEIVED: 2, - // The response's body is being received. - LOADING: 3, - // The data transfer has been completed or something went wrong during the transfer (e.g. infinite redirects). - DONE: 4, - }; - - var XHR_EVENTS = 'readystatechange loadstart progress abort error load timeout loadend'.split(' '); - var XHR_REQUEST_PROPERTIES = 'timeout withCredentials'.split(' '); - var XHR_RESPONSE_PROPERTIES = - 'readyState responseURL status statusText responseType response responseText responseXML'.split(' '); - - // https://github.com/trek/FakeXMLHttpRequest/blob/master/fake_xml_http_request.js#L32 - var HTTP_STATUS_CODES = { - 100: 'Continue', - 101: 'Switching Protocols', - 200: 'OK', - 201: 'Created', - 202: 'Accepted', - 203: 'Non-Authoritative Information', - 204: 'No Content', - 205: 'Reset Content', - 206: 'Partial Content', - 300: 'Multiple Choice', - 301: 'Moved Permanently', - 302: 'Found', - 303: 'See Other', - 304: 'Not Modified', - 305: 'Use Proxy', - 307: 'Temporary Redirect', - 400: 'Bad Request', - 401: 'Unauthorized', - 402: 'Payment Required', - 403: 'Forbidden', - 404: 'Not Found', - 405: 'Method Not Allowed', - 406: 'Not Acceptable', - 407: 'Proxy Authentication Required', - 408: 'Request Timeout', - 409: 'Conflict', - 410: 'Gone', - 411: 'Length Required', - 412: 'Precondition Failed', - 413: 'Request Entity Too Large', - 414: 'Request-URI Too Long', - 415: 'Unsupported Media Type', - 416: 'Requested Range Not Satisfiable', - 417: 'Expectation Failed', - 422: 'Unprocessable Entity', - 500: 'Internal Server Error', - 501: 'Not Implemented', - 502: 'Bad Gateway', - 503: 'Service Unavailable', - 504: 'Gateway Timeout', - 505: 'HTTP Version Not Supported', - }; - - /* - MockXMLHttpRequest - */ - - function MockXMLHttpRequest() { - // 初始化 custom 对象,用于存储自定义属性 - this.custom = { - events: {}, - requestHeaders: {}, - responseHeaders: {}, - }; - } - - MockXMLHttpRequest._settings = { - timeout: '10-100', - /* - timeout: 50, - timeout: '10-100', - */ - }; - - MockXMLHttpRequest.setup = function (settings) { - Util.extend(MockXMLHttpRequest._settings, settings); - return MockXMLHttpRequest._settings; - }; - - Util.extend(MockXMLHttpRequest, XHR_STATES); - Util.extend(MockXMLHttpRequest.prototype, XHR_STATES); - - // 标记当前对象为 MockXMLHttpRequest - MockXMLHttpRequest.prototype.mock = true; - - // 是否拦截 Ajax 请求 - MockXMLHttpRequest.prototype.match = false; - - // 初始化 Request 相关的属性和方法 - Util.extend(MockXMLHttpRequest.prototype, { - // https://xhr.spec.whatwg.org/#the-open()-method - // Sets the request method, request URL, and synchronous flag. - open: function (method, url, async, username, password) { - var that = this; - - Util.extend(this.custom, { - method: method, - url: url, - async: typeof async === 'boolean' ? async : true, - username: username, - password: password, - options: { - url: url, - type: method, - }, - }); - - this.custom.timeout = (function (timeout) { - if (typeof timeout === 'number') return timeout; - if (typeof timeout === 'string' && !~timeout.indexOf('-')) return parseInt(timeout, 10); - if (typeof timeout === 'string' && ~timeout.indexOf('-')) { - var tmp = timeout.split('-'); - var min = parseInt(tmp[0], 10); - var max = parseInt(tmp[1], 10); - return Math.round(Math.random() * (max - min)) + min; - } - })(MockXMLHttpRequest._settings.timeout); - - // 查找与请求参数匹配的数据模板 - var item = find(this.custom.options); - - function handle(event) { - // 同步属性 NativeXMLHttpRequest => MockXMLHttpRequest - for (var i = 0; i < XHR_RESPONSE_PROPERTIES.length; i++) { - try { - that[XHR_RESPONSE_PROPERTIES[i]] = xhr[XHR_RESPONSE_PROPERTIES[i]]; - } catch (e) {} - } - // 触发 MockXMLHttpRequest 上的同名事件 - that.dispatchEvent(new Event(event.type /*, false, false, that*/)); - } - - // 如果未找到匹配的数据模板,则采用原生 XHR 发送请求。 - if (!item) { - // 创建原生 XHR 对象,调用原生 open(),监听所有原生事件 - var xhr = createNativeXMLHttpRequest(); - this.custom.xhr = xhr; - - // 初始化所有事件,用于监听原生 XHR 对象的事件 - for (var i = 0; i < XHR_EVENTS.length; i++) { - xhr.addEventListener(XHR_EVENTS[i], handle); - } - - // xhr.open() - if (username) xhr.open(method, url, async, username, password); - else xhr.open(method, url, async); - - // 同步属性 MockXMLHttpRequest => NativeXMLHttpRequest - for (var j = 0; j < XHR_REQUEST_PROPERTIES.length; j++) { - try { - xhr[XHR_REQUEST_PROPERTIES[j]] = that[XHR_REQUEST_PROPERTIES[j]]; - } catch (e) {} - } - - return; - } - - // 找到了匹配的数据模板,开始拦截 XHR 请求 - this.match = true; - this.custom.template = item; - this.readyState = MockXMLHttpRequest.OPENED; - this.dispatchEvent(new Event('readystatechange' /*, false, false, this*/)); - }, - // https://xhr.spec.whatwg.org/#the-setrequestheader()-method - // Combines a header in author request headers. - setRequestHeader: function (name, value) { - // 原生 XHR - if (!this.match) { - this.custom.xhr.setRequestHeader(name, value); - return; - } - - // 拦截 XHR - var requestHeaders = this.custom.requestHeaders; - if (requestHeaders[name]) requestHeaders[name] += ',' + value; - else requestHeaders[name] = value; - }, - timeout: 0, - withCredentials: false, - upload: {}, - // https://xhr.spec.whatwg.org/#the-send()-method - // Initiates the request. - send: function send(data) { - var that = this; - this.custom.options.body = data; - - // 原生 XHR - if (!this.match) { - this.custom.xhr.send(data); - return; - } - - // 拦截 XHR - - // X-Requested-With header - this.setRequestHeader('X-Requested-With', 'MockXMLHttpRequest'); - - // loadstart The fetch initiates. - this.dispatchEvent(new Event('loadstart' /*, false, false, this*/)); - - if (this.custom.async) setTimeout(done, this.custom.timeout); // 异步 - else done(); // 同步 - - function done() { - that.readyState = MockXMLHttpRequest.HEADERS_RECEIVED; - that.dispatchEvent(new Event('readystatechange' /*, false, false, that*/)); - that.readyState = MockXMLHttpRequest.LOADING; - that.dispatchEvent(new Event('readystatechange' /*, false, false, that*/)); - - that.status = 200; - that.statusText = HTTP_STATUS_CODES[200]; - - // fix #92 #93 by @qddegtya - that.response = that.responseText = JSON.stringify( - convert(that.custom.template, that.custom.options), - null, - 4, - ); - - that.readyState = MockXMLHttpRequest.DONE; - that.dispatchEvent(new Event('readystatechange' /*, false, false, that*/)); - that.dispatchEvent(new Event('load' /*, false, false, that*/)); - that.dispatchEvent(new Event('loadend' /*, false, false, that*/)); - } - }, - // https://xhr.spec.whatwg.org/#the-abort()-method - // Cancels any network activity. - abort: function abort() { - // 原生 XHR - if (!this.match) { - this.custom.xhr.abort(); - return; - } - - // 拦截 XHR - this.readyState = MockXMLHttpRequest.UNSENT; - this.dispatchEvent(new Event('abort', false, false, this)); - this.dispatchEvent(new Event('error', false, false, this)); - }, - }); - - // 初始化 Response 相关的属性和方法 - Util.extend(MockXMLHttpRequest.prototype, { - responseURL: '', - status: MockXMLHttpRequest.UNSENT, - statusText: '', - // https://xhr.spec.whatwg.org/#the-getresponseheader()-method - getResponseHeader: function (name) { - // 原生 XHR - if (!this.match) { - return this.custom.xhr.getResponseHeader(name); - } - - // 拦截 XHR - return this.custom.responseHeaders[name.toLowerCase()]; - }, - // https://xhr.spec.whatwg.org/#the-getallresponseheaders()-method - // http://www.utf8-chartable.de/ - getAllResponseHeaders: function () { - // 原生 XHR - if (!this.match) { - return this.custom.xhr.getAllResponseHeaders(); - } - - // 拦截 XHR - var responseHeaders = this.custom.responseHeaders; - var headers = ''; - for (var h in responseHeaders) { - if (!responseHeaders.hasOwnProperty(h)) continue; - headers += h + ': ' + responseHeaders[h] + '\r\n'; - } - return headers; - }, - overrideMimeType: function (/*mime*/) {}, - responseType: '', // '', 'text', 'arraybuffer', 'blob', 'document', 'json' - response: null, - responseText: '', - responseXML: null, - }); - - // EventTarget - Util.extend(MockXMLHttpRequest.prototype, { - addEventListener: function addEventListener(type, handle) { - var events = this.custom.events; - if (!events[type]) events[type] = []; - events[type].push(handle); - }, - removeEventListener: function removeEventListener(type, handle) { - var handles = this.custom.events[type] || []; - for (var i = 0; i < handles.length; i++) { - if (handles[i] === handle) { - handles.splice(i--, 1); - } - } - }, - dispatchEvent: function dispatchEvent(event) { - var handles = this.custom.events[event.type] || []; - for (var i = 0; i < handles.length; i++) { - handles[i].call(this, event); - } - - var ontype = 'on' + event.type; - if (this[ontype]) this[ontype](event); - }, - }); - - // Inspired by jQuery - function createNativeXMLHttpRequest() { - var isLocal = (function () { - var rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/; - var rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/; - var ajaxLocation = location.href; - var ajaxLocParts = rurl.exec(ajaxLocation.toLowerCase()) || []; - return rlocalProtocol.test(ajaxLocParts[1]); - })(); - - return window.ActiveXObject ? (!isLocal && createStandardXHR()) || createActiveXHR() : createStandardXHR(); - - function createStandardXHR() { - try { - return new window._XMLHttpRequest(); - } catch (e) {} - } - - function createActiveXHR() { - try { - return new window._ActiveXObject('Microsoft.XMLHTTP'); - } catch (e) {} - } - } - - // 查找与请求参数匹配的数据模板:URL,Type - function find(options) { - for (var sUrlType in MockXMLHttpRequest.Mock._mocked) { - var item = MockXMLHttpRequest.Mock._mocked[sUrlType]; - if ( - (!item.rurl || match(item.rurl, options.url)) && - (!item.rtype || match(item.rtype, options.type.toLowerCase())) - ) { - // console.log('[mock]', options.url, '>', item.rurl) - return item; - } - } - - function match(expected, actual) { - if (Util.type(expected) === 'string') { - return expected === actual; - } - if (Util.type(expected) === 'regexp') { - return expected.test(actual); - } - } - } - - // 数据模板 => 响应数据 - function convert(item, options) { - return Util.isFunction(item.template) ? item.template(options) : MockXMLHttpRequest.Mock.mock(item.template); - } - - module.exports = MockXMLHttpRequest; - - /***/ - }, - /******/ - ], - ); -}); diff --git a/mock/my/getPersonalInfo.js b/mock/my/getPersonalInfo.js deleted file mode 100644 index 5f97ffa..0000000 --- a/mock/my/getPersonalInfo.js +++ /dev/null @@ -1,21 +0,0 @@ -import { getLocalUrl } from '~/utils/util.js'; - -export default { - path: '/api/genPersonalInfo', - data: { - code: 200, - message: 'success', - data: { - image: '/static/avatar1.png', - name: '小小轩', - star: '天枰座', - gender: 0, - birth: '1994-09-27', - address: ['440000', '440300'], - brief: '在你身边,为你设计', - photos: [ - - ], - }, - }, -}; diff --git a/mock/my/getServiceList.js b/mock/my/getServiceList.js deleted file mode 100644 index c2ac427..0000000 --- a/mock/my/getServiceList.js +++ /dev/null @@ -1,19 +0,0 @@ -export default { - path: '/api/getServiceList', - data: { - code: 200, - message: 'success', - data: { - service: [ - { image: '/static/icon_wx.png', name: '微信', type: 'weixin', url: '' }, - { image: '/static/icon_qq.png', name: 'QQ', type: 'QQ', url: '' }, - { image: '/static/icon_doc.png', name: '腾讯文档', type: 'document', url: '' }, - { image: '/static/icon_map.png', name: '腾讯地图', type: 'map', url: '' }, - { image: '/static/icon_td.png', name: '数据中心', type: 'data', url: '/pages/dataCenter/index' }, - { image: '/static/icon_td.png', name: '数据中心', type: 'data', url: '/pages/dataCenter/index' }, - { image: '/static/icon_td.png', name: '数据中心', type: 'data', url: '/pages/dataCenter/index' }, - { image: '/static/icon_td.png', name: '数据中心', type: 'data', url: '/pages/dataCenter/index' }, - ], - }, - }, -}; diff --git a/mock/my/index.js b/mock/my/index.js deleted file mode 100644 index 841a2f6..0000000 --- a/mock/my/index.js +++ /dev/null @@ -1,4 +0,0 @@ -import getServiceList from './getServiceList'; -import getPersonalInfo from './getPersonalInfo'; - -export default [getServiceList, getPersonalInfo]; diff --git a/mock/request.js b/mock/request.js deleted file mode 100644 index 8c65de4..0000000 --- a/mock/request.js +++ /dev/null @@ -1,21 +0,0 @@ -import service from './service/index'; - -const failResponse = { - code: null, - data: null, - message: 'invaild path', -}; - -export const request = (url, data) => - new Promise((resolve, reject) => { - const waitTime = Math.random() * 300 + 200; - const target = service.find((item) => item.path === url); - setTimeout(() => { - if (target) { - const { response } = target; - resolve(typeof response === 'function' ? response(data) : response); - } else { - reject(failResponse); - } - }, waitTime); // 200-500ms - }); diff --git a/mock/search/getSearchHistory.js b/mock/search/getSearchHistory.js deleted file mode 100644 index 203188c..0000000 --- a/mock/search/getSearchHistory.js +++ /dev/null @@ -1,8 +0,0 @@ -export default { - path: '/api/searchHistory', - code: 200, - message: '请求成功', - data: { - historyWords: ['AI绘画', 'Stable Diffusion', '版权素材', '星空', 'illustration', '原创'], - }, -}; diff --git a/mock/search/getSearchPopular.js b/mock/search/getSearchPopular.js deleted file mode 100644 index 7618001..0000000 --- a/mock/search/getSearchPopular.js +++ /dev/null @@ -1,15 +0,0 @@ -export default { - path: '/api/searchPopular', - code: 200, - message: '请求成功', - data: { - popularWords: [ - '考研和靠边同时上岸应该怎么选?有哪些参考建议', - '日常饮食中,如何选择优质蛋白', - '你有没有网购维权成功的经历?求分享经验', - '夏季带孩子旅游,你的必备物品有哪些', - '在海外越卖越贵,中国汽车做对了什么', - '当HR问你离职原因,怎么回答最能被接受', - ], - }, -}; diff --git a/mock/search/index.js b/mock/search/index.js deleted file mode 100644 index 22dc2ef..0000000 --- a/mock/search/index.js +++ /dev/null @@ -1,4 +0,0 @@ -import getSearchHistory from './getSearchHistory'; -import getSearchPopular from './getSearchPopular'; - -export default [getSearchHistory, getSearchPopular]; diff --git a/package.json b/package.json index 069a9b6..abe25ea 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "license": "MIT", "description": "a start-kit for wechat miniprogram powerby TDesign miniprogram", "dependencies": { + "@antv/g2": "^5.3.3", "crypto-js": "^4.2.0", "tdesign-miniprogram": "^1.8.6" }, diff --git a/pages/AddTherapeuticRegimen/index.js b/pages/AddTherapeuticRegimen/index.js index 6cbdb18..9e2d311 100644 --- a/pages/AddTherapeuticRegimen/index.js +++ b/pages/AddTherapeuticRegimen/index.js @@ -16,15 +16,17 @@ Page({ "name": "", "dose": "", "frequency": "", - "time": "饭前" + "time": "饭前", + }], + reminder: { + "morning": "08:00", + "noon": "12:00", + "evening": "18:00" + }, start_date: '', end_date: '', - reminder: { - "morning": "08:00", - "noon": "12:00", - "evening": "18:00" - }, + // 下拉 selectList: [], selectValue: '', @@ -100,26 +102,7 @@ Page({ }; }, - originFiles: [ - { - url: 'https://tdesign.gtimg.com/mobile/demos/example4.png', - name: 'uploaded1.png', - type: 'image', - removeBtn: true, - }, - { - url: 'https://tdesign.gtimg.com/mobile/demos/example6.png', - name: 'uploaded2.png', - type: 'image', - removeBtn: true, - }, - { - url: 'https://tdesign.gtimg.com/mobile/demos/example5.png', - name: 'uploaded3.png', - type: 'image', - removeBtn: true, - }, - ], + gridConfig: { column: 4, width: 160, @@ -245,6 +228,34 @@ Page({ }) }, async saveData(){ + if(!this.data.start_date || !this.data.end_date){ + wx.showToast({ + title: '请选择用药周期', + icon: 'none' + }) + return + } + // 校验 detail 是否有空缺项 + const hasDetailEmpty = this.data.detail.some(item => { + return !item.name || !item.dose || !item.frequency || !item.time; + }); + if (hasDetailEmpty) { + wx.showToast({ + title: '请完整填写所有用药信息', + icon: 'none' + }); + return; + } + // 校验 reminder 是否有空缺项 + const reminder = this.data.reminder; + if (!reminder.morning || !reminder.noon || !reminder.evening) { + wx.showToast({ + title: '请设置完整的提醒时间', + icon: 'none' + }); + return; + } + if(this.data.id){ const res = await request(`patient/medicine_scheme/${this.data.id}`,'put',{ detail: JSON.stringify(this.data.detail), @@ -295,7 +306,7 @@ Page({ const formData = { - key: file.name, //上传文件名称 + key: 'upload_file/' + file.name, //上传文件名称 policy: res.policy, //表单域 'x-oss-signature-version': res.x_oss_signature_version, //指定签名的版本和算法 'x-oss-credential': res.x_oss_credential, //指明派生密钥的参数集 @@ -316,7 +327,7 @@ Page({ success(res) { console.log('上传响应:', res); if (res.statusCode === 200) { - callback(null, 'https://image-fudan.oss-cn-beijing.aliyuncs.com/'+ file.name); // 上传成功 + callback(null, 'https://image-fudan.oss-cn-beijing.aliyuncs.com/upload_file/'+ file.name); // 上传成功 } else { console.error('上传失败,状态码:', res.statusCode); console.error('失败响应:', res); diff --git a/pages/AddTherapeuticRegimen/index.json b/pages/AddTherapeuticRegimen/index.json index 96d930c..1b92b81 100644 --- a/pages/AddTherapeuticRegimen/index.json +++ b/pages/AddTherapeuticRegimen/index.json @@ -6,7 +6,6 @@ "t-row": "tdesign-miniprogram/row/row", "t-col": "tdesign-miniprogram/col/col", "t-button": "tdesign-miniprogram/button/button", - "t-upload": "tdesign-miniprogram/upload/upload", "t-radio": "tdesign-miniprogram/radio/radio", "t-radio-group": "tdesign-miniprogram/radio-group/radio-group", "t-tag": "tdesign-miniprogram/tag/tag", diff --git a/pages/AddTherapeuticRegimen/index.less b/pages/AddTherapeuticRegimen/index.less index 881dd7b..132d4e2 100644 --- a/pages/AddTherapeuticRegimen/index.less +++ b/pages/AddTherapeuticRegimen/index.less @@ -22,6 +22,7 @@ } } .title{ + font-size: 32rpx; margin-bottom: 20rpx; margin-left: 30rpx; display: flex; @@ -29,6 +30,12 @@ .iconfont{ color: #A8A8A8; } + .title-text::after{ + content: '*'; + color: red; + font-size: 32rpx; + margin-left: 4rpx; + } } .therapeuticRegimen-item{ border-radius: 24rpx; @@ -49,11 +56,12 @@ .input-example { // background-color: var(--bg-color-demo); // padding: 10rpx 0; + padding-bottom: 20rpx; position: relative; .tip{ position: absolute; right: -36rpx; - top: 34rpx; + top: 24rpx; z-index: 999; } } @@ -110,10 +118,17 @@ } } .day-time{ + margin-top: 24rpx; + background-color: #fff; padding: 24rpx; - padding-right: 0; + border-radius: 24rpx; + .day-title{ + margin-bottom: 20rpx; + font-size: 32rpx; + } } .day-time-item{ + margin-top: 24rpx; height: 72rpx; background: rgba(0,91,162,0.1); border-radius: 12rpx; diff --git a/pages/AddTherapeuticRegimen/index.wxml b/pages/AddTherapeuticRegimen/index.wxml index abed2bb..45dae8f 100644 --- a/pages/AddTherapeuticRegimen/index.wxml +++ b/pages/AddTherapeuticRegimen/index.wxml @@ -1,4 +1,4 @@ - + @@ -6,15 +6,16 @@ 拍照导入 - - - - - + + + + - 用药周期 + + 用药周期 + @@ -22,9 +23,7 @@ - - @@ -35,42 +34,23 @@ - 药品信息 + 药品信息 - - - - - + + + + + + + + + 饭前/饭后 @@ -81,52 +61,47 @@ - 添加用药 + + + 添加用药 + - + + + 用药提醒 + + + + + + {{reminder.morning}} + + + + + + + {{reminder.noon}} + + + + + + + {{reminder.evening}} + + + + + 保存 - - + - - + - - - - - + + + + \ No newline at end of file diff --git a/pages/articleList/index.js b/pages/articleList/index.js index e9c11e5..5f82add 100644 --- a/pages/articleList/index.js +++ b/pages/articleList/index.js @@ -6,7 +6,13 @@ Page({ * 页面的初始数据 */ data: { - articles:[] + title: '', + articles: [], + page: 1, + page_size: 10, + hasMore: true, + loading: false, + searchKeyword: '' }, // Helper function to strip HTML tags and convert to plain text @@ -15,17 +21,70 @@ Page({ return html.replace(/<[^>]*>/g, ''); }, - async getList(){ - const res = await request('patient/articles', 'get', { title: '', page: 1, page_size: 10 }); - // Convert rich text content to plain text for each article - const articlesWithPlainText = res.list.map(article => ({ - ...article, - contentText: this.stripHtml(article.content) - })); + // 搜索输入处理 + onSearchInput(e) { this.setData({ - articles: articlesWithPlainText - }) + searchKeyword: e.detail.value + }); }, + + // 执行搜索 + async onSearch() { + this.setData({ + page: 1, + articles: [], + hasMore: true + }); + await this.getList(); + }, + + // 获取文章列表 + async getList(){ + if (this.data.loading || !this.data.hasMore) return; + + this.setData({ loading: true }); + + try { + const res = await request('patient/articles', 'get', { + title: this.data.searchKeyword, + page: this.data.page, + page_size: this.data.page_size + }); + + // Convert rich text content to plain text for each article + const articlesWithPlainText = res.list.map(article => ({ + ...article, + contentText: this.stripHtml(article.content) + })); + + // 如果是第一页,直接替换;否则追加 + const newArticles = this.data.page === 1 ? articlesWithPlainText : [...this.data.articles, ...articlesWithPlainText]; + + this.setData({ + articles: newArticles, + hasMore: res.list.length === this.data.page_size, + loading: false + }); + } catch (error) { + console.error('获取文章列表失败:', error); + this.setData({ loading: false }); + wx.showToast({ + title: '获取数据失败', + icon: 'none' + }); + } + }, + + // 加载更多数据 + async loadMore() { + if (this.data.hasMore && !this.data.loading) { + this.setData({ + page: this.data.page + 1 + }); + await this.getList(); + } + }, + async preview(e){ console.log(e.currentTarget.dataset.index) const index = e.currentTarget.dataset.index @@ -34,6 +93,7 @@ Page({ url: '/pages/article/index', }) }, + /** * 生命周期函数--监听页面加载 */ @@ -73,14 +133,21 @@ Page({ * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh() { - + this.setData({ + page: 1, + articles: [], + hasMore: true + }); + this.getList().then(() => { + wx.stopPullDownRefresh(); + }); }, /** * 页面上拉触底事件的处理函数 */ onReachBottom() { - + this.loadMore(); }, /** diff --git a/pages/articleList/index.json b/pages/articleList/index.json index ed7825a..fab2dff 100644 --- a/pages/articleList/index.json +++ b/pages/articleList/index.json @@ -1,6 +1,8 @@ { "usingComponents": { - + "t-navbar": "tdesign-miniprogram/navbar/navbar" }, - "navigationStyle": "custom" + "navigationStyle": "custom", + "enablePullDownRefresh": true, + "backgroundTextStyle": "dark" } \ No newline at end of file diff --git a/pages/articleList/index.less b/pages/articleList/index.less index 314631e..63f1293 100644 --- a/pages/articleList/index.less +++ b/pages/articleList/index.less @@ -45,31 +45,24 @@ .box_3 { background-color: rgba(255,255,255,1.000000); border-radius: 40rpx; - align-self: center; margin-top: 36rpx; - flex-direction: row; display: flex; justify-content: space-between; padding: 10rpx 10rpx 10rpx 24rpx; } .text_2 { - overflow-wrap: break-word; - color: rgba(153,153,153,1); + display: block; font-size: 28rpx; - letter-spacing: 0rpx; font-family: PingFangSC-Regular; - font-weight: normal; - text-align: left; - white-space: nowrap; - line-height: 28rpx; - margin-top: 16rpx; + height: 60rpx; + width: 86%; } .image-wrapper_1 { - background: url(https://lanhu-oss-2537-2.lanhuapp.com/SketchPngeb1bdfed45398833c1be38e3d13139b3b54af3b3409a3daffb97ec58f9bb7445) 100% no-repeat; - background-size: 100% 100%; display: flex; flex-direction: column; padding: 14rpx 30rpx 14rpx 30rpx; + background: linear-gradient( 270deg, #EBF5FE 0%, #D1E4F2 100%); +border-radius: 30rpx; } .thumbnail_1 { width: 32rpx; @@ -183,4 +176,44 @@ height: 140rpx; display: flex; flex-direction: column; +} + +// 加载状态和分页提示样式 +.loading-container { + display: flex; + justify-content: center; + align-items: center; + padding: 40rpx 0; +} + +.loading-text { + color: rgba(96,98,102,1); + font-size: 28rpx; + font-family: PingFangSC-Regular; +} + +.no-more-container { + display: flex; + justify-content: center; + align-items: center; + padding: 40rpx 0; +} + +.no-more-text { + color: rgba(96,98,102,1); + font-size: 28rpx; + font-family: PingFangSC-Regular; +} + +.empty-container { + display: flex; + justify-content: center; + align-items: center; + padding: 100rpx 0; +} + +.empty-text { + color: rgba(96,98,102,1); + font-size: 28rpx; + font-family: PingFangSC-Regular; } \ No newline at end of file diff --git a/pages/articleList/index.wxml b/pages/articleList/index.wxml index 907e383..81eac90 100644 --- a/pages/articleList/index.wxml +++ b/pages/articleList/index.wxml @@ -1,15 +1,19 @@ - + + - - - - 健康教育 - + - 请输入搜索关键词 - - + + + @@ -19,6 +23,17 @@ + + + + 加载中... + + + 没有更多数据了 + + + 暂无相关文章 + \ No newline at end of file diff --git a/pages/clockIn/index copy.less b/pages/clockIn/index copy.less deleted file mode 100644 index 6bc07e3..0000000 --- a/pages/clockIn/index copy.less +++ /dev/null @@ -1,44 +0,0 @@ -/* pages/clockIn/index.wxss */ -.clockin{ - padding: 36rpx; - padding-bottom: 120rpx; - .new-time{ - font-size: 28rpx; - } - .clockin-item{ - margin-top: 36rpx; - background-color: #fff; - border-radius: 20rpx; - padding: 28rpx; - .t-button{ - } - .item-top{ - display: flex; - justify-content: space-between; - margin-bottom: 20rpx; - font-size: 28rpx; - .active{ - color: var(--td-brand-color); - } - } - .medicine-name{ - font-weight: bold; - margin-bottom: 12rpx; - } - .dose{ - font-size: 28rpx; - margin-bottom: 16rpx; - } - } - .footer-example{ - position: fixed; - bottom: 42rpx; - width: 100%; - left: 0; - text-align: center; - color: var(--td-brand-color); - font-size: 28rpx; - line-height: 60rpx; - line-height: 60rpx; - } -} \ No newline at end of file diff --git a/pages/clockIn/index copy.wxml b/pages/clockIn/index copy.wxml deleted file mode 100644 index 9f3298f..0000000 --- a/pages/clockIn/index copy.wxml +++ /dev/null @@ -1,20 +0,0 @@ - - - {{newTime}} - - - - {{item.medicine_time}} - 已完成 - - - - {{detail.name}} - {{detail.dose}} {{detail.time}} - 打卡 - - - - - 历史服药记录 > - \ No newline at end of file diff --git a/pages/clockIn/index.less b/pages/clockIn/index.less index d0eb142..041554f 100644 --- a/pages/clockIn/index.less +++ b/pages/clockIn/index.less @@ -82,9 +82,26 @@ box-sizing: border-box; border-radius: 24rpx; background: linear-gradient( 180deg, #EDF3F8 0%, #F7FAFC 100%); + position: relative; + z-index: 1; } .group-item{ padding-bottom: 30rpx; + position: relative; + .after{ + position: absolute; + width: 0; + height: calc(100% - 40rpx); + top: 34rpx; + left: 10rpx; + border-left: 2rpx dashed rgba(0,91,162,0.7); + z-index: 0; + } +} +.group-item:last-child{ + .after{ + display: none; + } } .section_2 { width: 112rpx; @@ -97,7 +114,7 @@ border-radius: 100%; width: 20rpx; height: 20rpx; - border: 2.5px solid rgba(142,181,213,1); + border: 2.5px solid var(--td-brand-color); display: flex; flex-direction: column; margin: 6rpx 0 2rpx 0; @@ -105,7 +122,8 @@ } .text_4 { overflow-wrap: break-word; - color: rgba(144,147,153,1); + color: var(--td-text-color); + font-size: 28rpx; font-family: Alibaba-PuHuiTi-M; font-weight: normal; @@ -113,6 +131,15 @@ white-space: nowrap; line-height: 28rpx; } +.active{ + .group_4{ + border-color: rgba(142,181,213,1); + + } + .text_4{ + color: rgba(144,147,153,1); + } +} .section_3 { display: flex; flex-direction: row; diff --git a/pages/clockIn/index.wxml b/pages/clockIn/index.wxml index 81b2e79..0c3a3aa 100644 --- a/pages/clockIn/index.wxml +++ b/pages/clockIn/index.wxml @@ -2,13 +2,14 @@ - 2025年3月1日 - 历史服药记录 + {{list[0].medicine_date}} + 历史服药记录 - + + {{item.medicine_time}} @@ -22,7 +23,7 @@ - 未打卡 + 已打卡 打卡 diff --git a/pages/forGetPassword/index.js b/pages/diagnosticResults/index.js similarity index 78% rename from pages/forGetPassword/index.js rename to pages/diagnosticResults/index.js index 8c68f2b..73e499a 100644 --- a/pages/forGetPassword/index.js +++ b/pages/diagnosticResults/index.js @@ -1,18 +1,25 @@ -// pages/forGetPassword/index.js +import request from '~/api/request'; Page({ /** * 页面的初始数据 */ data: { - + msg: '' + }, + handleBack(){ + wx.navigateBack() + }, + handleDocter(){ + console.log('联系医生') }, - /** * 生命周期函数--监听页面加载 */ onLoad(options) { - + this.setData({ + msg: options.msg + }) }, /** diff --git a/pages/diagnosticResults/index.json b/pages/diagnosticResults/index.json new file mode 100644 index 0000000..9cf8709 --- /dev/null +++ b/pages/diagnosticResults/index.json @@ -0,0 +1,6 @@ +{ + "usingComponents": { + "t-navbar": "tdesign-miniprogram/navbar/navbar" + }, + "navigationStyle": "custom" +} \ No newline at end of file diff --git a/pages/diagnosticResults/index.less b/pages/diagnosticResults/index.less new file mode 100644 index 0000000..ccd0440 --- /dev/null +++ b/pages/diagnosticResults/index.less @@ -0,0 +1,129 @@ +/* pages/emergency/index.wxss */ + +.emergency{ + padding: 28rpx; + + .image_3 { + + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 0; + } + .image_2{ + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 0; + } + .emergency-container{ + position: relative; + z-index: 1; + .title{ + text-align: center; + font-size: 48rpx; + color: #005BA2; + margin: 80rpx 0rpx 0rpx 0; + font-weight: bold; + image{ + width: 380rpx; + height: 380rpx; + } + } + .high-risk{ + color: #D00F16; + font-size: 36rpx; + font-weight: bold; + text-align: center; + margin-top: -40rpx; + margin-bottom: 24rpx; + } + .msg-text{ + font-size: 30rpx; + color: #606266; + text-align: center; + } + .check-item{ + background: #FFFFFF; + border-radius: 24rpx; + margin-bottom: 32rpx; + border: 2rpx solid #FFFFFF; + padding: 24rpx; + position: relative; + view{ + display: inline-block; + + .name{ + display: block; + font-size: 36rpx; + color: var(--td-text-color); + font-weight: bold; + margin-bottom: 16rpx; + } + .text{ + font-size: 30rpx; + color: #606266; + } + } + .block{ + padding-left: 100rpx; + } + + .icon-box{ + position: absolute; + left: 38rpx; + top: 50%; + transform: translateY(-50%); + } + .check-box{ + position: absolute; + box-sizing: border-box; + right: 28rpx; + top: 50%; + transform: translateY(-50%); + width: 50rpx; + height: 50rpx; + border-radius: 8rpx; + border: 2rpx solid #606266; + color: #FFFFFF; + display: flex; + align-items: center; + justify-content: center; + } + } + .active{ + background: rgba(0,91,162,0.1); + border: 2rpx solid var(--td-brand-color); + .check-box{ + background-color: var(--td-brand-color); + border-color: var(--td-brand-color); + } + } + } + .btn{ + width: 80%; + margin-left: 10%; + height: 96rpx; + display: flex; + justify-content: center; + align-items: center; + font-size: 32rpx; + border-radius: 24rpx; + } + .btn-1{ + background: linear-gradient( 270deg, #E23C3C 0%, #F17373 100%); + + color: #fff; + margin-top: 80rpx; + } + .btn-2{ + color: #888888; + background: #FFFFFF; + margin-top: 32rpx; + } +} + diff --git a/pages/diagnosticResults/index.wxml b/pages/diagnosticResults/index.wxml new file mode 100644 index 0000000..1afed14 --- /dev/null +++ b/pages/diagnosticResults/index.wxml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + 高危预警 + + + 您的症状组合提示可能存在胆管炎风险 + + + + + diff --git a/pages/emergency/index.js b/pages/emergency/index.js index 427f5b8..f679e47 100644 --- a/pages/emergency/index.js +++ b/pages/emergency/index.js @@ -1,4 +1,4 @@ -// pages/emergency/index.js +import request from '~/api/request'; Page({ /** @@ -7,55 +7,73 @@ Page({ data: { visible: false, current: ['checkbox1', 'checkbox2'], - options: [ - - { - label: '发热', - value: 'checkbox1', - content: '体温≥38°', - maxContentRow: 2, - icon: "rectangle" - }, - { - label: '白色或陶土样大便', - value: 'checkbox2', - content: '排便颜色异常', - maxContentRow: 2, - // defaultChecked: ' default-checked', - icon: "rectangle" - }, - { - label: '腹胀/食欲下降', - value: 'checkbox3', - content: '消化系统不适', - maxContentRow: 2, - icon: "rectangle" - }, - { - label: '消化道出血', - value: 'checkbox4', - content: '血便或黑便', - maxContentRow: 2, - icon: "rectangle" - }, - ], + options: [], + message: '' }, - - openFlow(){ + handleCheck(e) { + const { + index + } = e.currentTarget.dataset this.setData({ - visible: true + [`options[${index}].checked`]: !this.data.options[index].checked }) }, - closeFlow(){ + async openFlow() { + const list = this.data.options.filter(item => item.checked).map(item => { + return { + id: item.id, + title: item.title, + description: item.description + } + }) + + const res = await request('patient/symptom/submit', 'post', { + detail: JSON.stringify(list), + }) + wx.navigateTo({ + url: '/pages/diagnosticResults/index?msg=' + res.message + }) + + }, + closeFlow() { this.setData({ visible: false }) }, + + async getList(){ + const res = await request('patient/symptoms', 'get') + // const list = res.list.map((item, index) => { + // let icon = '' + // if(index == 0){ + // icon = 'iconfont icon-fare' + // } + // if(index == 1){ + // icon = 'iconfont icon-dabianhui' + // } + // if(index == 2){ + // icon = 'iconfont icon-xiaohuaneike' + // } + // if(index == 3){ + // icon = 'iconfont icon-dabianhong' + // } + // return { + // ...item, + // icon: icon, + // checked: false + // } + + // }) + this.setData({ + options: res.list + }) + }, /** * 生命周期函数--监听页面加载 */ onLoad(options) { + this.getList() }, /** diff --git a/pages/emergency/index.json b/pages/emergency/index.json index 1c2193e..89f0172 100644 --- a/pages/emergency/index.json +++ b/pages/emergency/index.json @@ -4,7 +4,8 @@ "t-checkbox-group": "tdesign-miniprogram/checkbox-group/checkbox-group", "t-button": "tdesign-miniprogram/button/button", "t-popup": "tdesign-miniprogram/popup/popup", - "t-icon": "tdesign-miniprogram/icon/icon" + "t-icon": "tdesign-miniprogram/icon/icon", + "t-navbar": "tdesign-miniprogram/navbar/navbar" }, - "navigationBarTitleText": "紧急通道" + "navigationStyle": "custom" } \ No newline at end of file diff --git a/pages/emergency/index.less b/pages/emergency/index.less index 2399267..ce1d484 100644 --- a/pages/emergency/index.less +++ b/pages/emergency/index.less @@ -8,7 +8,86 @@ margin-top: 28rpx; margin-bottom: 28rpx; } - + .image_3 { + + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 0; + } + .emergency-container{ + position: relative; + z-index: 1; + .title{ + text-align: center; + font-size: 48rpx; + color: #005BA2; + margin: 80rpx 0; + font-weight: bold; + } + .check-item{ + background: #FFFFFF; + border-radius: 24rpx; + margin-bottom: 32rpx; + border: 2rpx solid #FFFFFF; + padding: 24rpx; + position: relative; + view{ + display: inline-block; + + .name{ + display: block; + font-size: 36rpx; + color: var(--td-text-color); + font-weight: bold; + margin-bottom: 16rpx; + } + .text{ + font-size: 30rpx; + color: #606266; + } + } + .block{ + padding-left: 100rpx; + } + + .icon-box{ + position: absolute; + left: 38rpx; + top: 50%; + transform: translateY(-50%); + image{ + width: 48rpx; + height: 48rpx; + } + } + .check-box{ + position: absolute; + box-sizing: border-box; + right: 38rpx; + top: 50%; + transform: translateY(-50%); + width: 40rpx; + height: 40rpx; + border-radius: 8rpx; + border: 2rpx solid #606266; + color: #FFFFFF; + display: flex; + align-items: center; + justify-content: center; + } + } + .active{ + background: rgba(0,91,162,0.1); + border: 2rpx solid var(--td-brand-color); + .check-box{ + background-color: var(--td-brand-color); + border-color: var(--td-brand-color); + } + } + } } .t-overlay{ diff --git a/pages/emergency/index.wxml b/pages/emergency/index.wxml index dbbf886..56e73b2 100644 --- a/pages/emergency/index.wxml +++ b/pages/emergency/index.wxml @@ -1,11 +1,35 @@ - -症状自检 - - - -提交 + + + + + + + 症状自检 + + + + + + + {{item.title}} + {{item.description}} + + + + + + + 提交 + 高危预警 - 您的症状组合提示可能存在胆管炎风险 + {{message}} 立即联系医生 暂不处理 diff --git a/pages/followUp/index.js b/pages/followUp/index.js index 78173d0..e13d199 100644 --- a/pages/followUp/index.js +++ b/pages/followUp/index.js @@ -10,16 +10,19 @@ Page({ style: 'border: 2rpx solid #efefef;border-radius: 12rpx;', form: { + follow_name: '', liver_function_image:[], b_mode_image: [], blood_routine_image: [], coagulation_function_image: [], - liver_function_image: [], mdt_image: [], nutritional_indicator_image: [] }, - - + isName: true, + isTime: true, + isDoctor: true, + isHeight: true, + isWeight: true, @@ -119,10 +122,33 @@ Page({ }, onInput(e) { - const { key } = e.currentTarget.dataset; - // this.setData({ - // ['form.key']: e.detail.value, - // }); + const { key, tips } = e.currentTarget.dataset; + + if(e.detail.value){ + this.setData({ + [tips]: true, + [`form.${key}`]: e.detail.value + }); + } else { + this.setData({ + [tips]: false, + [`form.${key}`]: e.detail.value + }) + } + + + }, + onInputTime(e){ + const { tips } = e.currentTarget.dataset; + if(e.detail.value){ + this.setData({ + [tips]: true, + }); + } else { + this.setData({ + [tips]: false, + }) + } }, showPicker(e) { const { mode } = e.currentTarget.dataset; @@ -134,20 +160,26 @@ Page({ }, onPickerChange(e) { - console.log(e) - this.setData({ - ['form.follow_date']: e.detail.value - }) + if(e.detail.value){ + this.setData({ + isTime: true, + ['form.follow_date']: e.detail.value + }) + } else { + this.setData({ + isTime: false, + ['form.follow_date']: e.detail.value + }) + } + }, handleSuccess(e) { - console.log(e.detail) const { files } = e.detail; this.setData({ originFiles: files, }); }, handleRemove(e) { - console.log(e.detail.file); const { index } = e.detail; const { originFiles } = this.data; originFiles.splice(index, 1); @@ -158,20 +190,52 @@ Page({ handleClick(e) { console.log(e.detail.file); }, - toQuestionnaire() { + + planId:'', + async toQuestionnaire() { + let valid = true; + // 必填项校验 + if(!this.data.form.follow_name){ + this.setData({ isName: false }); + valid = false; + } + if(!this.data.form.follow_date){ + this.setData({ isTime: false }); + valid = false; + } + if(!this.data.form.follow_hospital){ + this.setData({ isDoctor: false }); + valid = false; + } + if(!this.data.form.height){ + this.setData({ isHeight: false }); + valid = false; + } + if(!this.data.form.weight){ + this.setData({ isWeight: false }); + valid = false; + } + if(!valid) return const data = this.data.form data.liver_function_image = data.liver_function_image.length > 0 ? data.liver_function_image.join(',') : '' data.b_mode_image = data.b_mode_image.length > 0 ? data.b_mode_image.join(',') : '', data.blood_routine_image = data.blood_routine_image.length > 0 ? data.blood_routine_image.join(',') : '', data.coagulation_function_image = data.coagulation_function_image.length > 0 ? data.coagulation_function_image.join(',') : '', - data.liver_function_image = data.liver_function_image.length > 0 ? data.liver_function_image.join(',') : '', data.mdt_image = data.mdt_image.length > 0 ? data.mdt_image.join(',') : '', data.nutritional_indicator_image = data.nutritional_indicator_image.length > 0 ? data.nutritional_indicator_image.join(',') : '' - console.log(data) - request('patient/follow_questionnaire', 'post', data) + await request('patient/follow_questionnaire', 'post',{planId: this.planId, ...data}) + wx.showToast({ + title: '提交成功', + icon: 'success', + duration: 2000, + complete: () => { + wx.navigateBack({ + delta: 1 + }) + } + }) }, handleChangeGroup(e) { - console.log(e) const { mode } = e.currentTarget.dataset this.setData({ [`form.${mode}`]: e.detail.value @@ -186,7 +250,7 @@ Page({ const formData = { - key: file.name, //上传文件名称 + key: 'upload_file/' + file.name, //上传文件名称 policy: res.policy, //表单域 'x-oss-signature-version': res.x_oss_signature_version, //指定签名的版本和算法 'x-oss-credential': res.x_oss_credential, //指明派生密钥的参数集 @@ -207,7 +271,7 @@ Page({ success(res) { console.log('上传响应:', res); if (res.statusCode === 200) { - callback(null, 'https://image-fudan.oss-cn-beijing.aliyuncs.com/'+ file.name); // 上传成功 + callback(null, 'https://image-fudan.oss-cn-beijing.aliyuncs.com/upload_file/'+ file.name); // 上传成功 } else { console.error('上传失败,状态码:', res.statusCode); console.error('失败响应:', res); @@ -302,7 +366,8 @@ Page({ * 生命周期函数--监听页面加载 */ onLoad(options) { - + console.log(options) + this.planId = options.planId }, /** diff --git a/pages/followUp/index.json b/pages/followUp/index.json index 757974a..26510af 100644 --- a/pages/followUp/index.json +++ b/pages/followUp/index.json @@ -6,7 +6,6 @@ "t-row": "tdesign-miniprogram/row/row", "t-col": "tdesign-miniprogram/col/col", "t-button": "tdesign-miniprogram/button/button", - "t-upload": "tdesign-miniprogram/upload/upload", "t-radio": "tdesign-miniprogram/radio/radio", "t-radio-group": "tdesign-miniprogram/radio-group/radio-group", "t-image-viewer": "tdesign-miniprogram/image-viewer/image-viewer" diff --git a/pages/followUp/index.less b/pages/followUp/index.less index 59640e1..fa2afa3 100644 --- a/pages/followUp/index.less +++ b/pages/followUp/index.less @@ -10,10 +10,13 @@ padding-bottom: 20rpx; } .custom-label { - display: inline-flex; + color: var(--td-text-color-primary); + font-size: 24rpx; + line-height: 40rpx; + margin: 0 8rpx 16rpx; } - .custom-label::after, .input-example__label::after { + .custom-label::after { content: '*'; color: red; font-size: 32rpx; diff --git a/pages/followUp/index.wxml b/pages/followUp/index.wxml index 3a5cf1a..92b27ec 100644 --- a/pages/followUp/index.wxml +++ b/pages/followUp/index.wxml @@ -3,54 +3,60 @@ 提交 - + \ No newline at end of file diff --git a/pages/forGetPassword/index.json b/pages/forGetPassword/index.json deleted file mode 100644 index 23a275d..0000000 --- a/pages/forGetPassword/index.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "navigationStyle": "custom", - "usingComponents": { - "t-navbar": "tdesign-miniprogram/navbar/navbar", - "t-input": "tdesign-miniprogram/input/input", - "t-icon": "tdesign-miniprogram/icon/icon", - "t-link": "tdesign-miniprogram/link/link", - "t-button": "tdesign-miniprogram/button/button", - "t-radio-group": "tdesign-miniprogram/radio-group/radio-group", - "t-radio": "tdesign-miniprogram/radio/radio" - } -} \ No newline at end of file diff --git a/pages/forGetPassword/index.less b/pages/forGetPassword/index.less deleted file mode 100644 index b1a3e1a..0000000 --- a/pages/forGetPassword/index.less +++ /dev/null @@ -1,95 +0,0 @@ -/* pages/forGetPassword/index.wxss */ -.login { - &__title { - color: rgba(0, 0, 0, 0.9); - font-size: 56rpx; - font-weight: 600; - line-height: 72rpx; - padding: 16rpx 32rpx 40rpx; - } - - &__input { - .input-label { - display: flex; - padding-right: 32rpx; - box-sizing: border-box; - border-right: 1rpx solid #e7e7e7; - } - - .input-icon { - margin-left: 8rpx; - } - } - - &__tips { - color: rgba(0, 0, 0, 0.4); - font-size: 24rpx; - font-style: normal; - font-weight: 400; - line-height: 40rpx; - margin: 24rpx 32rpx 32rpx; - } - - &__button { - margin: 0 32rpx; - } - - &__password--forget { - display: flex; - font-size: 24rpx; - align-items: center; - margin: 32rpx; - line-height: 40rpx; - } - - &__others { - margin: 64rpx 32rpx auto 32rpx; - display: flex; - align-items: center; - justify-content: space-between; - - &-label { - min-width: 96rpx; - color: rgba(0, 0, 0, 0.6); - font-size: 24rpx; - line-height: 40rpx; - } - - &-buttons { - flex: 1; - margin-left: 32rpx; - display: flex; - align-items: center; - justify-content: flex-end; - - .button { - margin: 0 !important; - - &:not(:last-child) { - margin-right: 32rpx !important; - } - } - } - } - - // 覆盖组件样式 - .radio-class { - --td-radio-icon-size: 32rpx; - --td-radio-label-line-height: 40rpx; - - align-items: center; - } - - .radio-class-icon { - margin-top: 0 !important; - } - - .radio-class-label { - margin-left: 8rpx !important; - font-size: 24rpx !important; - line-height: 40rpx !important; - } - .login__button{ - margin-top: 40rpx; - } -} diff --git a/pages/forGetPassword/index.wxml b/pages/forGetPassword/index.wxml deleted file mode 100644 index 4a9091b..0000000 --- a/pages/forGetPassword/index.wxml +++ /dev/null @@ -1,51 +0,0 @@ - - - \ No newline at end of file diff --git a/pages/home/index.js b/pages/home/index.js index 0759589..1d2e8d0 100644 --- a/pages/home/index.js +++ b/pages/home/index.js @@ -1,130 +1,10 @@ import * as echarts from '../../ec-canvas/echarts.min'; import request from '~/api/request'; + +import { heightList, weightList } from '../../assets/js/heightWeight'; + const app = getApp(); -function initChart(canvas, width, height, dpr) { - const chart = echarts.init(canvas, null, { - width: width, - height: height, - devicePixelRatio: dpr - }); - canvas.setChart(chart); - - var option = { - title: { - text: '', - left: 'left', - fontSize: 6 - }, - legend: { - data: ['实际身高', '标准范围'], - bottom: 0, - left: 'center', - z: 100 - }, - grid: { - containLabel: true, - top: '5%', - left: '1%', - right: '5%', - bottom: '10%' - }, - tooltip: { - show: true, - trigger: 'axis' - }, - xAxis: { - type: 'category', - boundaryGap: false, - data: ['出生', '1月', '2月', '3月', '4月', '5月'], - }, - yAxis: { - x: 'center', - type: 'value', - splitLine: { - lineStyle: { - type: 'dashed' - } - } - }, - series: [{ - name: '实际身高', - type: 'line', - smooth: true, - data: [] - }, { - name: '标准范围', - type: 'line', - smooth: true, - data: [120, 130, 140, 150, 160, 170] - }] - }; - - chart.setOption(option); - return chart; -} - -function initChart2(canvas, width, height, dpr) { - const chart = echarts.init(canvas, null, { - width: width, - height: height, - devicePixelRatio: dpr - }); - canvas.setChart(chart); - - var option = { - title: { - text: '', - left: 'left', - fontSize: 12 - }, - legend: { - data: ['实际体重', '标准范围'], - bottom: 0, - left: 'center', - z: 100 - }, - grid: { - containLabel: true, - top: '5%', - left: '1%', - right: '5%', - bottom: '10%' - }, - tooltip: { - show: true, - trigger: 'axis' - }, - xAxis: { - type: 'category', - boundaryGap: false, - data: ['出生', '1月', '2月', '3月', '4月', '5月'], - }, - yAxis: { - x: 'center', - type: 'value', - splitLine: { - lineStyle: { - type: 'dashed' - } - } - }, - series: [{ - name: '实际体重', - type: 'line', - smooth: true, - data: [] - }, { - name: '标准范围', - type: 'line', - smooth: true, - data: [120, 130, 140, 150, 160, 170] - }] - }; - - chart.setOption(option); - return chart; -} Page({ onShareAppMessage: function (res) { @@ -152,15 +32,26 @@ Page({ heightChart: null, weightChart: null, carList: [], - carLength: 0 + carLength: 0, + }, - + standardHeight:[], + standardWeight:[], // Helper function to strip HTML tags and convert to plain text stripHtml(html) { if (!html) return ''; return html.replace(/<[^>]*>/g, ''); }, - + async getPersonalInfo() { + const info = await request('patient/basic/0').then((res) => res); + if(info.sex == 1){ + this.standardHeight = heightList.boy + this.standardWeight = weightList.boy + }else{ + this.standardHeight = heightList.girl + this.standardWeight = weightList.girl + } + }, async getSfList(){ this.followPlans() @@ -211,7 +102,7 @@ Page({ page: 1, page_size: 10 }) - const carList = res3.list.map(item => { + const carList = res3.list.slice(0, 3).map(item => { item.detail = JSON.parse(item.detail) return item }) @@ -239,185 +130,33 @@ Page({ const res = await request('patient/chat/0', 'get') const heightData = [] const weightData = [] - + if(res.list.length > 0){ res.list.forEach(item => { heightData.push(item.height) weightData.push(item.weight) + }) } this.setData({ heightData, - weightData - }, () => { - this.initCharts(); + weightData, + }); + this.initHeightChart() }, - initCharts() { - // 初始化身高图表 - if (!this.heightChart) { - const chart1 = this.selectComponent('#mychart-dom-height'); - if (chart1) { - chart1.init((canvas, width, height, dpr) => { - const chart = echarts.init(canvas, null, { - width: width, - height: height, - devicePixelRatio: dpr - }); - canvas.setChart(chart); - - const option = { - title: { - text: '', - left: 'left', - fontSize: 6 - }, - legend: { - data: ['实际身高', '标准范围'], - bottom: 0, - left: 'center', - z: 100 - }, - grid: { - containLabel: true, - top: '5%', - left: '1%', - right: '5%', - bottom: '10%' - }, - tooltip: { - show: true, - trigger: 'axis' - }, - xAxis: { - type: 'category', - boundaryGap: false, - data: ['出生', '1月', '2月', '3月', '4月', '5月'], - }, - yAxis: { - x: 'center', - type: 'value', - splitLine: { - lineStyle: { - type: 'dashed' - } - } - }, - series: [{ - name: '实际身高', - type: 'line', - smooth: true, - data: this.data.heightData - }, { - name: '标准范围', - type: 'line', - smooth: true, - data: [120, 130, 140, 150, 160, 170] - }] - }; - - chart.setOption(option); - this.heightChart = chart; - return chart; - }); - } - } - - // 初始化体重图表 - if (!this.weightChart) { - const chart2 = this.selectComponent('#mychart-dom-weight'); - if (chart2) { - chart2.init((canvas, width, height, dpr) => { - const chart = echarts.init(canvas, null, { - width: width, - height: height, - devicePixelRatio: dpr - }); - canvas.setChart(chart); - - const option = { - title: { - text: '', - left: 'left', - fontSize: 12 - }, - legend: { - data: ['实际体重', '标准范围'], - bottom: 0, - left: 'center', - z: 100 - }, - grid: { - containLabel: true, - top: '5%', - left: '1%', - right: '5%', - bottom: '10%' - }, - tooltip: { - show: true, - trigger: 'axis' - }, - xAxis: { - type: 'category', - boundaryGap: false, - data: ['出生', '1月', '2月', '3月', '4月', '5月'], - }, - yAxis: { - x: 'center', - type: 'value', - splitLine: { - lineStyle: { - type: 'dashed' - } - } - }, - series: [{ - name: '实际体重', - type: 'line', - smooth: true, - data: this.data.weightData - }, { - name: '标准范围', - type: 'line', - smooth: true, - data: [120, 130, 140, 150, 160, 170] - }] - }; - - chart.setOption(option); - this.weightChart = chart; - return chart; - }); - } - } - }, + onLoad(){ this.getSfList() - setTimeout(() => { - this.getChartData().then(() => { - if (this.data.activeIndex === 0) { - this.initHeightChart(); - } else { - this.initWeightChart(); - } - }); - }, 500); + this.getChartData() + this.getPersonalInfo() }, onReady() { - // setTimeout(() => { - // this.getChartData().then(() => { - // if (this.data.activeIndex === 0) { - // this.initHeightChart(); - // } else { - // this.initWeightChart(); - // } - // }); - // }, 500); + }, changeChart(e) { @@ -475,6 +214,11 @@ Page({ // 初始化身高图表 initHeightChart() { + const standardHeight = this.standardHeight + const standardLower = standardHeight.map(item => item[0]); + const standardUpper = standardHeight.map(item => item[1]); + const standardRange = standardUpper.map((up, i) => up - standardLower[i]); + const chartComp = this.selectComponent('#mychart-dom-height'); if (chartComp) { chartComp.init((canvas, width, height, dpr) => { @@ -482,14 +226,44 @@ Page({ canvas.setChart(chart); chart.setOption({ title: { text: '', left: 'left', fontSize: 6 }, - legend: { data: ['实际身高', '标准范围'], bottom: 0, left: 'center', z: 100 }, - grid: { containLabel: true, top: '5%', left: '1%', right: '5%', bottom: '10%' }, - tooltip: { show: true, trigger: 'axis' }, - xAxis: { type: 'category', boundaryGap: false, data: ['出生', '1月', '2月', '3月', '4月', '5月'] }, + grid: { containLabel: true, top: '5%', left: '1%', right: '5%', bottom: '3%' }, + tooltip: { + show: true, + trigger: 'axis', + formatter: function (params) { + const param = params[0]; + return `${param.axisValue}\n${param.seriesName}: ${param.value} cm`; + } + }, + xAxis: { type: 'category', boundaryGap: false, data: ['出生', '1月', '2月', '3月', '4月', '5月', '6月'] }, yAxis: { x: 'center', type: 'value', splitLine: { lineStyle: { type: 'dashed' } } }, series: [ - { name: '实际身高', type: 'line', smooth: true, data: this.data.heightData }, - { name: '标准范围', type: 'line', smooth: true, data: [120, 130, 140, 150, 160, 170] } + { + name: '实际身高', + type: 'line', + smooth: true, + data: this.data.heightData + }, + { + name: '标准下界', + type: 'line', + symbol: 'none', + data: standardLower, + lineStyle: { opacity: 0 }, + stack: '标准范围', + areaStyle: { opacity: 0 }, + tooltip: { show: false } + }, + { + name: '标准范围', + type: 'line', + symbol: 'none', + data: standardRange, + lineStyle: { opacity: 0 }, + stack: '标准范围', + areaStyle: { color: 'rgba(135,206,250,0.3)' }, + tooltip: { show: false } + } ] }); return chart; @@ -499,21 +273,56 @@ Page({ // 初始化体重图表 initWeightChart() { + const standardWeight = this.standardWeight + const standardLower = standardWeight.map(item => item[0]); + const standardUpper = standardWeight.map(item => item[1]); + const standardRange = standardUpper.map((up, i) => up - standardLower[i]); + const chartComp = this.selectComponent('#mychart-dom-weight'); if (chartComp) { chartComp.init((canvas, width, height, dpr) => { const chart = echarts.init(canvas, null, { width, height, devicePixelRatio: dpr }); canvas.setChart(chart); chart.setOption({ - title: { text: '', left: 'left', fontSize: 12 }, - legend: { data: ['实际体重', '标准范围'], bottom: 0, left: 'center', z: 100 }, - grid: { containLabel: true, top: '5%', left: '1%', right: '5%', bottom: '10%' }, - tooltip: { show: true, trigger: 'axis' }, - xAxis: { type: 'category', boundaryGap: false, data: ['出生', '1月', '2月', '3月', '4月', '5月'] }, + title: { text: '', left: 'left', fontSize: 6 }, + grid: { containLabel: true, top: '5%', left: '1%', right: '5%', bottom: '3%' }, + tooltip: { + show: true, + trigger: 'axis', + formatter: function (params) { + const param = params[0]; + return `${param.axisValue}\n${param.seriesName}: ${param.value} cm`; + } + }, + xAxis: { type: 'category', boundaryGap: false, data: ['出生', '1月', '2月', '3月', '4月', '5月', '6月'] }, yAxis: { x: 'center', type: 'value', splitLine: { lineStyle: { type: 'dashed' } } }, series: [ - { name: '实际体重', type: 'line', smooth: true, data: this.data.weightData }, - { name: '标准范围', type: 'line', smooth: true, data: [120, 130, 140, 150, 160, 170] } + { + name: '实际体重', + type: 'line', + smooth: true, + data: this.data.weightData + }, + { + name: '标准下界', + type: 'line', + symbol: 'none', + data: standardLower, + lineStyle: { opacity: 0 }, + stack: '标准范围', + areaStyle: { opacity: 0 }, + tooltip: { show: false } + }, + { + name: '标准范围', + type: 'line', + symbol: 'none', + data: standardRange, + lineStyle: { opacity: 0 }, + stack: '标准范围', + areaStyle: { color: 'rgba(135,206,250,0.3)' }, + tooltip: { show: false } + } ] }); return chart; diff --git a/pages/home/index.json b/pages/home/index.json index efb5c0b..5bdfe4d 100644 --- a/pages/home/index.json +++ b/pages/home/index.json @@ -1,17 +1,11 @@ { "navigationStyle": "custom", "navigationBarTitleText": "首页", + "styleIsolation": "apply-shared", "usingComponents": { - "t-tabs": "tdesign-miniprogram/tabs/tabs", - "t-tab-panel": "tdesign-miniprogram/tab-panel/tab-panel", - "t-swiper": "tdesign-miniprogram/swiper/swiper", - "t-swiper-nav": "tdesign-miniprogram/swiper-nav/swiper-nav", - "t-pull-down-refresh": "tdesign-miniprogram/pull-down-refresh/pull-down-refresh", - "t-message": "tdesign-miniprogram/message/message", "t-button": "tdesign-miniprogram/button/button", "t-icon": "tdesign-miniprogram/icon/icon", - "nav": "/components/nav", - "card": "/components/card", - "ec-canvas": "../../ec-canvas/ec-canvas" + "ec-canvas": "../../ec-canvas/ec-canvas", + "t-navbar": "tdesign-miniprogram/navbar/navbar" } } diff --git a/pages/home/index.less b/pages/home/index.less index b4b17af..0069b56 100644 --- a/pages/home/index.less +++ b/pages/home/index.less @@ -3,9 +3,11 @@ @home-tab-item-height: 96rpx; .home-container { - height: calc(100vh - @tab-bar-height); - padding-top: 160rpx; position: relative; + height: 100vh; + overflow: hidden; + // padding-top: 20rpx; + // padding-top: @home-tab-item-height; .home-top-bg{ width: 100%; height: auto; @@ -16,11 +18,13 @@ } .home-content { - // height: calc(100% - @nav-bar-height); + height: calc(100vh - 180rpx); + overflow: scroll; padding: 28rpx; - padding-bottom: 0; + position: relative; z-index: 1; + .item-title-img{ height: 36rpx; // width: auto; @@ -62,7 +66,7 @@ .echarts-canvas-container { width: 100%; - height: 600rpx; + height: 500rpx; } .echarts-canvas { @@ -218,18 +222,21 @@ .emergency-access { position: fixed; - right: 40rpx; - bottom: 220rpx; - background-color: red; - color: #fff; - width: 90rpx; - height: 90rpx; + right: 24rpx; + bottom: 80rpx; + width: 100rpx; + height: 100rpx; z-index: 9999; border-radius: 120rpx; display: flex; align-items: center; justify-content: center; - box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, .04), 0px 8px 20px rgba(0, 0, 0, .08); + background: linear-gradient( 152deg, #FF7954 0%, #D43030 100%); + box-shadow: 0rpx 2rpx 20rpx 0rpx rgba(236,89,68,0.21); + text{ + color: #fff; + font-size: 48rpx; + } } .box_3 { @@ -383,4 +390,25 @@ text-align: right; white-space: nowrap; line-height: 32rpx; -} \ No newline at end of file +} +.car-item{ + position: relative; + .after{ + position: absolute; + width: 0; + height: 100%; + top: 28rpx; + left: 8rpx; + border-left: 2rpx dashed rgba(0,91,162,0.7); + } +} +.car-item:last-child{ + .after{ + display: none; + } + +} +.tooltip{ + background-color: var(--td-brand-color); + color: #fff; +} diff --git a/pages/home/index.wxml b/pages/home/index.wxml index f0090d2..0c16f20 100644 --- a/pages/home/index.wxml +++ b/pages/home/index.wxml @@ -1,12 +1,17 @@ - - + + + - - 宝宝成长曲线 + + 宝宝生长曲线 - 身高曲线 @@ -22,15 +27,15 @@ - + - + 更多 - - + + {{item.medicine_time}} @@ -51,9 +56,9 @@ - + - + @@ -68,7 +73,7 @@ - 健康推送 + 健康推送 更多 @@ -84,13 +89,8 @@ - - + - + \ No newline at end of file diff --git a/pages/login/login.json b/pages/login/login.json index 92048bf..172cb9d 100644 --- a/pages/login/login.json +++ b/pages/login/login.json @@ -1,12 +1,6 @@ { "navigationStyle": "custom", "usingComponents": { - "t-navbar": "tdesign-miniprogram/navbar/navbar", - "t-input": "tdesign-miniprogram/input/input", - "t-icon": "tdesign-miniprogram/icon/icon", - "t-link": "tdesign-miniprogram/link/link", - "t-button": "tdesign-miniprogram/button/button", - "t-radio-group": "tdesign-miniprogram/radio-group/radio-group", - "t-radio": "tdesign-miniprogram/radio/radio" + } } diff --git a/pages/login/login.less b/pages/login/login.less index f2e5b2e..93f0a1b 100644 --- a/pages/login/login.less +++ b/pages/login/login.less @@ -8,7 +8,7 @@ flex-direction: column; } .image-wrapper_1 { - background: url('/assets/images/top-bg.png') center center no-repeat; + background: url('https://image-fudan.oss-cn-beijing.aliyuncs.com/mini_images/top-bg.png') center center no-repeat; background-size: 100% 100%; padding-bottom: 80rpx; display: flex; diff --git a/pages/login/login.wxml b/pages/login/login.wxml index 534f306..d361ddc 100644 --- a/pages/login/login.wxml +++ b/pages/login/login.wxml @@ -2,8 +2,8 @@ - - + +