diff --git a/packages/pathway-mapper/dist/index.es5.js b/packages/pathway-mapper/dist/index.es5.js index 42f290c4..b7cd1dbf 100644 --- a/packages/pathway-mapper/dist/index.es5.js +++ b/packages/pathway-mapper/dist/index.es5.js @@ -1,2 +1,2 @@ -module.exports=function(t){var e={};function a(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,a),o.l=!0,o.exports}return a.m=t,a.c=e,a.d=function(t,e,i){a.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},a.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},a.t=function(t,e){if(1&e&&(t=a(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(a.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)a.d(i,o,function(e){return t[e]}.bind(null,o));return i},a.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return a.d(e,"a",e),e},a.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},a.p="",a(a.s=80)}([function(t,e){t.exports=require("react")},function(t,e){t.exports=require("react-bootstrap")},function(t,e){t.exports=require("mobx")},function(t,e){t.exports=require("autobind-decorator")},function(t,e){t.exports=require("jquery")},function(t,e){t.exports=require("mobx-react")},function(t,e){t.exports=require("lodash")},function(t,e){t.exports=require("cytoscape")},function(t){t.exports=JSON.parse('{"ACC-2016-TP53-RB-pathway":["ACC-2016-TP53-RB-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","CDK4\\twyMGXBw8cUj6\\tGENE\\t-1\\t262\\t231\\t","RB1\\tLrJe2ktmcVzK\\tGENE\\t-1\\t262\\t340\\t","CDKN2A\\tN18olkvEcUJu\\tGENE\\t-1\\t387\\t127\\t","TP53\\t-VLZ5keBcXa3\\tGENE\\t-1\\t488\\t340\\t","MDM2\\t79evo3OUcVFA\\tGENE\\t-1\\t488\\t231\\t","CCNE1\\t-le5m2j6cWa2\\tGENE\\t-1\\t80\\t340\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","d3auWK_1cit5\\t79evo3OUcVFA\\t-VLZ5keBcXa3\\tINHIBITS","w4Yp60k9chhi\\tN18olkvEcUJu\\t79evo3OUcVFA\\tINHIBITS","XhRgnqAscgwV\\tN18olkvEcUJu\\twyMGXBw8cUj6\\tINHIBITS","0E_Xe1cUckq-\\twyMGXBw8cUj6\\tLrJe2ktmcVzK\\tINHIBITS","K9h1lRMzclc1\\t-le5m2j6cWa2\\tLrJe2ktmcVzK\\tINHIBITS"],"ACC-2016-WNT-signaling-pathway":["ACC-2016-WNT-signaling-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","CTNNB1\\taS-MtgKvdBTI\\tGENE\\t-1\\t396\\t371\\t","MEN1\\tWoDJQ15LdCGw\\tGENE\\t-1\\t615\\t371\\t","APC\\tquRewaVqdAAg\\tGENE\\t-1\\t396\\t277\\t","WNT\\tg2oPjTN1c_MF\\tFAMILY\\t-1\\t396\\t183\\t","ZNRF3\\tD1VT3C7Tc9uz\\tGENE\\t-1\\t396\\t87\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","mcDc9E8ddKPh\\tWoDJQ15LdCGw\\taS-MtgKvdBTI\\tINHIBITS","xhr-qCdhdMnS\\tg2oPjTN1c_MF\\tquRewaVqdAAg\\tINHIBITS","MRNaHfmqdLIB\\tquRewaVqdAAg\\taS-MtgKvdBTI\\tINHIBITS","V58DLRlddN04\\tD1VT3C7Tc9uz\\tg2oPjTN1c_MF\\tINHIBITS"],"BLCA-2014-Histone-modification-pathway":["BLCA-2014-Histone-modification-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","KDM1A\\tibAwJma20izY\\tGENE\\t-1\\t330\\t280\\t","K9 (Ac, me1-3)\\tUdMq7kedz9FO\\tPROCESS\\t-1\\t441\\t185\\t","K4 (me1-3)\\t6Itl25k-0F3S\\tPROCESS\\t-1\\t214\\t185\\t","KDM6B\\tKGmluEtPHXqp\\tGENE\\t_aOp5kW01GfD\\t685\\t332\\t","KDM4B\\t5_51HfxoHY9n\\tGENE\\tWWAQi_-h1FbJ\\t500\\t329\\t","H3\\t_L15u0RJ0Eq5\\tPROCESS\\t-1\\t1128\\t185\\t","K36 (me1-3)\\tyE8mFlUU0AcJ\\tPROCESS\\t-1\\t785\\t185\\t","KDM1B\\tf-uYX8eW0o-j\\tGENE\\t-1\\t330\\t338\\t","K27 (Ac, me1-3)\\tqU2DuUfoz_fU\\tPROCESS\\t-1\\t612\\t185\\t","K79 (me1-3)\\tsGOXj0dB0CoY\\tPROCESS\\t-1\\t945\\t185\\t","KDM4A\\tZN4FWAEl0yGP\\tGENE\\t-1\\t859\\t280\\t","KDM5B\\t2NfOJGRNHYQB\\tGENE\\tNnEeq-Df1E_j\\t151\\t333\\t","KDM4A\\tw2_Nlv2xHY9d\\tGENE\\tWWAQi_-h1FbJ\\t500\\t280\\t","Demethylases\\tHX269Het1CgI\\tPROCESS\\t-1\\t1107\\t280\\t","KDM4A-KDM4B\\tWWAQi_-h1FbJ\\tCOMPARTMENT\\t-1\\t500\\t304\\t","KDM5A-KDM5B\\tNnEeq-Df1E_j\\tCOMPARTMENT\\t-1\\t151\\t306\\t","KDM6A\\ttsbexFtHHXqU\\tGENE\\t_aOp5kW01GfD\\t685\\t280\\t","KDM5A\\tZGtryZF-HYPy\\tGENE\\tNnEeq-Df1E_j\\t151\\t280\\t","KDM6A-KDM6B\\t_aOp5kW01GfD\\tCOMPARTMENT\\t-1\\t685\\t306\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","QFzccFLP1rXn\\tUdMq7kedz9FO\\tqU2DuUfoz_fU\\tBINDS","1iLfbX2611ie\\tsGOXj0dB0CoY\\t_L15u0RJ0Eq5\\tBINDS","KtQPDuFH2B4M\\tNnEeq-Df1E_j\\t6Itl25k-0F3S\\tACTIVATES","1ufB4tsp2MbY\\tZN4FWAEl0yGP\\tyE8mFlUU0AcJ\\tACTIVATES","F6Hoq3VR2Fbi\\tibAwJma20izY\\t6Itl25k-0F3S\\tACTIVATES","c5Dw1pvh2GJ7\\tibAwJma20izY\\tUdMq7kedz9FO\\tACTIVATES","B85D8ro61xLn\\tyE8mFlUU0AcJ\\tsGOXj0dB0CoY\\tBINDS","e_aGaIGw1pWA\\t6Itl25k-0F3S\\tUdMq7kedz9FO\\tBINDS","EVjpyavJ2DfI\\tf-uYX8eW0o-j\\t6Itl25k-0F3S\\tACTIVATES","f0P9R0dZ2J5O\\t_aOp5kW01GfD\\tqU2DuUfoz_fU\\tACTIVATES","g_eFQ6zG2Hu-\\tWWAQi_-h1FbJ\\tUdMq7kedz9FO\\tACTIVATES","T1GuzceK1uZK\\tqU2DuUfoz_fU\\tyE8mFlUU0AcJ\\tBINDS"],"BLCA-2014-RTK-RAS-PI(3)K-pathway":["BLCA-2014-RTK-RAS-PI(3)K-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","ERBB2\\taqgx5yiY4na1\\tGENE\\tG_Vyif7SpoW2\\t584\\t98\\t","NRAS\\tAbEoLGCY4sp9\\tGENE\\tydhBmSAbpTKc\\t476\\t183\\t","TSC2\\tUD1lE2yO48n8\\tGENE\\t2_7tyoaRphSY\\t503\\t496\\t","PIK3CA\\ts5486n5gpU_K\\tGENE\\t-1\\t658\\t184\\t","PTEN\\ttiSgM3o0pX_z\\tGENE\\t-1\\t860\\t184\\t","FGFR3\\t5yUJdgCL4naU\\tGENE\\tG_Vyif7SpoW2\\t272\\t98\\t","Survival\\tt8b0oOIypis0\\tPROCESS\\t-1\\t791\\t584\\t","HRAS\\tLtxngbVT4spa\\tGENE\\tydhBmSAbpTKc\\t322\\t183\\t","RAS\\tG_Vyif7SpoW2\\tFAMILY\\t-1\\t506\\t98\\t","STK11\\t8wk4zb43pfsu\\tGENE\\t-1\\t317\\t469\\t","INPP4B\\tlGy7ILYwpZag\\tGENE\\t-1\\t804\\t266\\t","MTOR\\tVyT8z_EcpexB\\tGENE\\t-1\\t722\\t470\\t","TSC\\t2_7tyoaRphSY\\tFAMILY\\t-1\\t503\\t470\\t","Proliferation\\t1PYLl_CZpjUH\\tPROCESS\\t-1\\t665\\t584\\t","EGFR\\tMO1TWgRb4nbC\\tGENE\\tG_Vyif7SpoW2\\t429\\t98\\t","RAS\\tydhBmSAbpTKc\\tFAMILY\\t-1\\t399\\t183\\t","AKT\\tEuvUiqD6pbqL\\tGENE\\t-1\\t659\\t349\\t","TSC1\\tlj3YtBzu48oT\\tGENE\\t2_7tyoaRphSY\\t503\\t444\\t","ERBB3\\tSUuAzaJ-4nar\\tGENE\\tG_Vyif7SpoW2\\t739\\t98\\t","NF1\\tevdrZPc3pW-g\\tGENE\\t-1\\t399\\t270\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","arJi2bQrqEdS\\tevdrZPc3pW-g\\tydhBmSAbpTKc\\tINHIBITS","F1IgAgZPppxS\\tG_Vyif7SpoW2\\tydhBmSAbpTKc\\tACTIVATES","OqD_HmKHqQIw\\tEuvUiqD6pbqL\\t2_7tyoaRphSY\\tINHIBITS","PY7KfKiCqL9D\\tlGy7ILYwpZag\\ts5486n5gpU_K\\tINHIBITS","0PkuH29SqKeN\\ttiSgM3o0pX_z\\ts5486n5gpU_K\\tINHIBITS","zNMzC5CMqORJ\\ts5486n5gpU_K\\tEuvUiqD6pbqL\\tACTIVATES","UB7BIf_SqRqo\\t2_7tyoaRphSY\\tVyT8z_EcpexB\\tINHIBITS","OQI-iqX2qTLl\\t8wk4zb43pfsu\\t2_7tyoaRphSY\\tACTIVATES","9Vm-zOAgqGbc\\tydhBmSAbpTKc\\ts5486n5gpU_K\\tACTIVATES","uN421vA1qaeA\\tVyT8z_EcpexB\\tt8b0oOIypis0\\tACTIVATES","ZTgU7FgfqZmN\\tVyT8z_EcpexB\\t1PYLl_CZpjUH\\tACTIVATES"],"BLCA-2014-TP53-RB-pathway":["BLCA-2014-TP53-RB-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","Cell cycle progression\\tok7nDiB9oQJI\\tPROCESS\\t-1\\t414\\t436\\t","CCNE1\\thm8HJrbqoWfo\\tGENE\\t-1\\t414\\t353\\t","TP53\\tJYRUofjRoSmI\\tGENE\\t-1\\t605\\t179\\t","MDM2\\t2XKi6b0joGD_\\tGENE\\t-1\\t413\\t179\\t","E2F3\\tmz71J5tHoOtX\\tGENE\\t-1\\t219\\t436\\t","Apoptosis\\t4-9gyc8LoX1s\\tPROCESS\\t-1\\t689\\t264\\t","CDKN2A\\t9A-DhP0-oFUi\\tGENE\\t-1\\t219\\t179\\t","CCND1\\tCsMIDjOQoHLw\\tGENE\\t-1\\t219\\t264\\t","FBXW7\\tmULNbFKfoZFg\\tGENE\\t-1\\t625\\t353\\t","ATM\\tjsI1OPG9oTvl\\tGENE\\t-1\\t605\\t85\\t","CDKN1A\\tmBClqwIZoU7d\\tGENE\\t-1\\t526\\t264\\t","RB1\\t-ACCNJRfoNBI\\tFAMILY\\t-1\\t219\\t353\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","B1RLlLrEo4cn\\tmz71J5tHoOtX\\tok7nDiB9oQJI\\tACTIVATES","As7hIoBSo17y\\tCsMIDjOQoHLw\\t-ACCNJRfoNBI\\tINHIBITS","mjgKjVX6ow0m\\t2XKi6b0joGD_\\tJYRUofjRoSmI\\tINHIBITS","5BaXTZDuo7H8\\tmULNbFKfoZFg\\thm8HJrbqoWfo\\tINHIBITS","PMdhVppIoyDR\\tJYRUofjRoSmI\\tmBClqwIZoU7d\\tACTIVATES","w2p9WUJxo22X\\t-ACCNJRfoNBI\\tmz71J5tHoOtX\\tINHIBITS","0hmD92TIo0ux\\t9A-DhP0-oFUi\\tCsMIDjOQoHLw\\tINHIBITS","RfMPHF4FouzT\\tjsI1OPG9oTvl\\tJYRUofjRoSmI\\tACTIVATES","toSMm4K7owET\\tJYRUofjRoSmI\\t2XKi6b0joGD_\\tACTIVATES","LPb5J4Quo8EC\\tmBClqwIZoU7d\\thm8HJrbqoWfo\\tINHIBITS","_PGdKZ50o5vL\\thm8HJrbqoWfo\\t-ACCNJRfoNBI\\tINHIBITS","Vcmxazyaoz8N\\t9A-DhP0-oFUi\\t2XKi6b0joGD_\\tINHIBITS","sABkuA1_oywi\\tJYRUofjRoSmI\\t4-9gyc8LoX1s\\tACTIVATES"],"BRCA-2012-Cell-cycle-signaling-pathway":["BRCA-2012-Cell-cycle-signaling-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","BRCA2\\tVHmofL2iBtHB\\tGENE\\t9ZypvHQTebqG\\t302\\t521\\t","p53/p21\\tK8vhHZlJewmz\\tPROCESS\\t-1\\t16\\t368\\t","Cell-cycle arrest\\trsfgLtPJBro0\\tPROCESS\\tPve6lcOCerP2\\t518\\t505\\t","BRCA1\\tPqa6yIQ4BtGs\\tGENE\\t9ZypvHQTebqG\\t145\\t521\\t","ATM\\tTQqdq6ZHdybO\\tGENE\\t-1\\t-54\\t427\\t","S/G2/M checkpoints\\teokFGf8gBroW\\tPROCESS\\tPve6lcOCerP2\\t518\\t452\\t","S-phase entry\\tplt5oIp7Broo\\tPROCESS\\tPve6lcOCerP2\\t518\\t401\\t","Cell cycle\\tPve6lcOCerP2\\tFAMILY\\t-1\\t518\\t453\\t","RB1\\tCequZQzRd8SZ\\tGENE\\t-1\\t321\\t329\\t","BRCA\\t9ZypvHQTebqG\\tFAMILY\\t-1\\t223\\t521\\t","CCNE1\\tglg_i-QQdz9z\\tGENE\\t-1\\t133\\t329\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","GjwkZT93eu2S\\tCequZQzRd8SZ\\tPve6lcOCerP2\\tACTIVATES","vbkfiLK9etui\\t9ZypvHQTebqG\\tPve6lcOCerP2\\tACTIVATES","dQvMCZFxeWIc\\tglg_i-QQdz9z\\tCequZQzRd8SZ\\tINHIBITS","OyM7Rh_ueTR2\\tTQqdq6ZHdybO\\tglg_i-QQdz9z\\tINHIBITS","fcvz9ztueiRb\\tTQqdq6ZHdybO\\t9ZypvHQTebqG\\tACTIVATES"],"BRCA-2012-RTK-RAS-PI(3)K-pathway":["BRCA-2012-RTK-RAS-PI(3)K-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","PIK3R1\\tLTI-_zA12M8_\\tGENE\\tQl_rV6PWbR4f\\t561\\t293\\t","MAP3K1\\tV2U7rAinbMri\\tGENE\\t-1\\t803\\t220\\t","IKBKB\\tv5be8J7cbT7P\\tGENE\\t-1\\t812\\t416\\t","AKT1\\t2eyyNjOs2P7t\\tGENE\\tb8_iWiV3bSnI\\t738\\t293\\t","PI3K\\tQl_rV6PWbR4f\\tFAMILY\\t-1\\t481\\t293\\t","NF-kB\\tf-dza7Cyd34R\\tPROCESS\\t-1\\t940\\t406\\t","PTEN\\tvmp2PR9WbESK\\tGENE\\t-1\\t480\\t218\\t","Proliferation\\tQgBC5rX5baS9\\tPROCESS\\t-1\\t1277\\t416\\t","MAP2K4\\thDh8Gi4cbOJg\\tGENE\\t-1\\t1075\\t220\\t","ERBB2\\tkuccSffw2Nzs\\tGENE\\tTi_1UFukcA6d\\t205\\t220\\t","PIK3CA\\tj3qYklwW2M9a\\tGENE\\tQl_rV6PWbR4f\\t402\\t293\\t","AKT3\\tpH6LKha-2P8C\\tGENE\\tb8_iWiV3bSnI\\t897\\t293\\t","PAK1\\tVjIN5hOKbQmQ\\tGENE\\t-1\\t480\\t416\\t","AKT\\tb8_iWiV3bSnI\\tFAMILY\\t-1\\t818\\t293\\t","CCND1\\tPKgbIo4AbVyY\\tGENE\\t-1\\t1084\\t416\\t","RTK\\tTi_1UFukcA6d\\tFAMILY\\t-1\\t205\\t292\\t","JNK/JUN Mediated Apoptosis\\t-MmWzJ2DbXrO\\tPROCESS\\t-1\\t1300\\t211\\t","IGF1R\\tL4qe8zf82Nz8\\tGENE\\tTi_1UFukcA6d\\t205\\t293\\t","EGFR\\tq9k-_XR32Nze\\tGENE\\tTi_1UFukcA6d\\t205\\t364\\t","Evading apoptosis\\tg1G4oW6RbY6F\\tPROCESS\\t-1\\t1274\\t293\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","fhs_9IT6cUqw\\tb8_iWiV3bSnI\\tg1G4oW6RbY6F\\tACTIVATES","teIhB-fucGLJ\\tVjIN5hOKbQmQ\\tb8_iWiV3bSnI\\tACTIVATES","huxShVp3cIQO\\tQl_rV6PWbR4f\\tb8_iWiV3bSnI\\tACTIVATES","WtHX5Q0hcXDM\\tPKgbIo4AbVyY\\tQgBC5rX5baS9\\tACTIVATES","wAq3PQHjcaoH\\tb8_iWiV3bSnI\\tv5be8J7cbT7P\\tACTIVATES","HE2KQFFscPqE\\thDh8Gi4cbOJg\\tPKgbIo4AbVyY\\tACTIVATES","kzZuvBjdcQut\\tPKgbIo4AbVyY\\thDh8Gi4cbOJg\\tINHIBITS","R6qp66fdcDsp\\tTi_1UFukcA6d\\tQl_rV6PWbR4f\\tACTIVATES","8xgflgJ1cSju\\tv5be8J7cbT7P\\tPKgbIo4AbVyY\\tACTIVATES","i-Pphq4BcWBa\\tb8_iWiV3bSnI\\tQgBC5rX5baS9\\tACTIVATES","4s_OHeX4cTjW\\thDh8Gi4cbOJg\\t-MmWzJ2DbXrO\\tACTIVATES","fegnTqNPcJpy\\tV2U7rAinbMri\\thDh8Gi4cbOJg\\tACTIVATES","tj1nKgy9cExZ\\tvmp2PR9WbESK\\tQl_rV6PWbR4f\\tINHIBITS"],"BRCA-2012-TP53-pathway":["BRCA-2012-TP53-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","TP53\\tAtC08ZQJc2KU\\tGENE\\t-1\\t491\\t349\\t","Apoptosis\\toHj1iu9Nc3_k\\tPROCESS\\t-1\\t491\\t453\\t","MDM4\\teUAyFKEv_rSt\\tGENE\\tY4IgKFahc81t\\t690\\t375\\t","MDM2\\tEDekyeJO_rSa\\tGENE\\tY4IgKFahc81t\\t690\\t319\\t","AKT1\\tnWtQqBkt_evA\\tGENE\\t-1\\t491\\t245\\t","CHEK2\\tEZw1mFjYc0Pb\\tGENE\\t-1\\t300\\t350\\t","MDM\\tY4IgKFahc81t\\tFAMILY\\t-1\\t690\\t347\\t","ATM\\tDEtr5Wpj_eup\\tGENE\\t-1\\t300\\t245\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","EQR_Azwj_evL\\tDEtr5Wpj_eup\\tEZw1mFjYc0Pb\\tACTIVATES","sV9ZEeJ9dMg3\\tY4IgKFahc81t\\tAtC08ZQJc2KU\\tINHIBITS","kudrU-U-_evP\\tnWtQqBkt_evA\\tAtC08ZQJc2KU\\tINHIBITS","hxwMi4kydOBT\\tAtC08ZQJc2KU\\toHj1iu9Nc3_k\\tACTIVATES","uh5qfjUjdKB7\\tEZw1mFjYc0Pb\\tAtC08ZQJc2KU\\tACTIVATES"],"Cell Cycle":["Cell Cycle","","Regulation of mitotic cell cycle progression involving a signaling cascade of cyclins and cyclin-dependent kinases as well as a number of regulatory checkpoints.","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","MDM2\\txPwjUPwi3Y86\\tGENE\\t-1\\t413\\t179","CDKN1A\\tFQbPaPlV3Y9Q\\tGENE\\t-1\\t526\\t264","FBXW7\\t_Honmyd33Y9K\\tGENE\\t-1\\t625\\t353","CCND1\\tKf3hsGsT3Y9F\\tGENE\\t-1\\t219\\t264","Cell cycle progression\\tyazwmMvz3Y8y\\tPROCESS\\t-1\\t414\\t436","CCNE1\\t4-ZVTw8b3Y81\\tGENE\\t-1\\t414\\t353","Apoptosis\\tSwnDUEnB3Y8_\\tPROCESS\\t-1\\t689\\t264","RB1\\tAFGazwPj3Y9U\\tFAMILY\\t-1\\t219\\t353","E2F3\\tb7YoPaEx3Y88\\tGENE\\t-1\\t219\\t436","CDKN2A\\tE6EgzvEy3Y9C\\tGENE\\t-1\\t219\\t179","TP53\\tmIL53nP63Y83\\tGENE\\t-1\\t605\\t179","ATM\\t4fc8CUod3Y9N\\tGENE\\t-1\\t605\\t85","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPEINTERACTION_PUBMED_ID","3H557euy3Y9b\\t_Honmyd33Y9K\\t4-ZVTw8b3Y81\\tINHIBITS\\t","rC-lNx0W3Y9d\\tAFGazwPj3Y9U\\tb7YoPaEx3Y88\\tINHIBITS\\t","Qm2ZEnCl3Y9Z\\tKf3hsGsT3Y9F\\tAFGazwPj3Y9U\\tINHIBITS\\t","pPO3_YVM3Y9e\\tE6EgzvEy3Y9C\\tKf3hsGsT3Y9F\\tINHIBITS\\t","pGNnucwd3Y9g\\tmIL53nP63Y83\\txPwjUPwi3Y86\\tACTIVATES\\t","ygTYWu2k3Y9k\\tE6EgzvEy3Y9C\\txPwjUPwi3Y86\\tINHIBITS\\t","tq-BTuks3Y9i\\tFQbPaPlV3Y9Q\\t4-ZVTw8b3Y81\\tINHIBITS\\t","HPSR11Er3Y9b\\tmIL53nP63Y83\\tFQbPaPlV3Y9Q\\tACTIVATES\\t","h7AyF28j3Y9n\\tmIL53nP63Y83\\tSwnDUEnB3Y8_\\tACTIVATES\\t","vYHEvpqL3Y9f\\t4fc8CUod3Y9N\\tmIL53nP63Y83\\tACTIVATES\\t","4ELiZPT23Y9j\\t4-ZVTw8b3Y81\\tAFGazwPj3Y9U\\tINHIBITS\\t","jDEpTZhK3Y9X\\tb7YoPaEx3Y88\\tyazwmMvz3Y8y\\tACTIVATES\\t","_gVnliZV3Y9a\\txPwjUPwi3Y86\\tmIL53nP63Y83\\tINHIBITS\\t"],"COADREAD-2012-RTK-RAS-PI(3)K-pathway":["COADREAD-2012-RTK-RAS-PI(3)K-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","IRS2\\tZvdL-fZM3WuZ\\tGENE\\t-1\\t189\\t452\\t","PIK3CA\\tMBUXnNN2z5Dt\\tGENE\\taDGGPsUl3doC\\t189\\t525\\t","KRAS\\trKR_2SY2z0N3\\tGENE\\tD6EmJIZx6Gzg\\t555\\t462\\t","ERBB2\\tStF--npjzyS_\\tGENE\\tjs1qiakd6GP4\\t404\\t298\\t","IGF2\\tWv-EmNFT15yN\\tGENE\\t-1\\t189\\t298\\t","PI3K\\taDGGPsUl3doC\\tFAMILY\\t-1\\t110\\t526\\t","BRAF\\tPUJ8AKki53pG\\tGENE\\t-1\\t479\\t549\\t","NRAS\\t8s1jKwvjz0Nm\\tGENE\\tD6EmJIZx6Gzg\\t406\\t462\\t","Cell survival\\t1UmcnGh24P6f\\tPROCESS\\t-1\\t323\\t697\\t","ERBB3\\tdg3Vl9qGzyTZ\\tGENE\\tjs1qiakd6GP4\\t556\\t300\\t","IGF1R\\tcYzz8jlS2HaK\\tGENE\\t-1\\t189\\t380\\t","RAS\\tD6EmJIZx6Gzg\\tFAMILY\\t-1\\t480\\t462\\t","PIK3R1\\to9hOOpRM0I1T\\tGENE\\taDGGPsUl3doC\\t32\\t527\\t","RTK\\tjs1qiakd6GP4\\tFAMILY\\t-1\\t480\\t299\\t","Translation\\tRmlBMHs64SgD\\tPROCESS\\t-1\\t478\\t696\\t","Proliferation\\trlRx40Am4Oyw\\tPROCESS\\t-1\\t164\\t697\\t","PTEN\\ttSZugv-P3gVw\\tGENE\\t-1\\t29\\t452\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","6Shu_O4w4GqO\\tcYzz8jlS2HaK\\tZvdL-fZM3WuZ\\tACTIVATES","kgTzvfUL0djR\\tMBUXnNN2z5Dt\\tRmlBMHs64SgD\\tNONE","LrWZyqWL6OUk\\tD6EmJIZx6Gzg\\tPUJ8AKki53pG\\tACTIVATES","MIyPv49C6PmS\\tPUJ8AKki53pG\\trlRx40Am4Oyw\\tACTIVATES","6nSDsRMc6QPJ\\tPUJ8AKki53pG\\t1UmcnGh24P6f\\tACTIVATES","AQSQDQcZ0XWo\\tZvdL-fZM3WuZ\\tMBUXnNN2z5Dt\\tACTIVATES","ZfrWje290c1T\\tMBUXnNN2z5Dt\\t1UmcnGh24P6f\\tACTIVATES","_hzFGzTL6RE2\\tPUJ8AKki53pG\\tRmlBMHs64SgD\\tACTIVATES","bp_I0EHv0cD4\\tMBUXnNN2z5Dt\\trlRx40Am4Oyw\\tACTIVATES","PQG4E-ga6Mza\\tjs1qiakd6GP4\\tD6EmJIZx6Gzg\\tACTIVATES","NKPl8Kdr0I1e\\to9hOOpRM0I1T\\tMBUXnNN2z5Dt\\tINHIBITS","OoqtDBRI0V5J\\ttSZugv-P3gVw\\tMBUXnNN2z5Dt\\tINHIBITS","Vqm7Wl0M4AE0\\tWv-EmNFT15yN\\tcYzz8jlS2HaK\\tACTIVATES","09Csuz540e3h\\tMBUXnNN2z5Dt\\tRmlBMHs64SgD\\tACTIVATES"],"COADREAD-2012-TGF-B-signaling-pathway":["COADREAD-2012-TGF-B-signaling-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","TGF-B\\tnTPdmpNKy_zW\\tGENE\\t-1\\t-38\\t-358\\t","ACVR2A\\t4qJ5NXmkEupe\\tGENE\\tRckLIrYUzEOc\\t278\\t-262\\t","TGFBR2\\t7GmKbJadEtyf\\tGENE\\t5i_MJPAPzCI1\\t44\\t-262\\t","ACTIVIN\\tZc2sWHBVzArX\\tGENE\\t-1\\t360\\t-358\\t","ACVR2A-ACVR1B\\tRckLIrYUzEOc\\tCOMPARTMENT\\t-1\\t360\\t-262\\t","SMAD\\t7j1T7wlqzcoy\\tFAMILY\\t-1\\t158\\t-86\\t","SMAD2\\tEgBC5uQzE1qC\\tGENE\\t7j1T7wlqzcoy\\t82\\t-117\\t","SMAD4\\tQuKCy3EaE1pk\\tGENE\\t7j1T7wlqzcoy\\t160\\t-55\\t","MYC\\tBIYl4Hkdzdoj\\tGENE\\t-1\\t-65\\t74\\t","TGFBR1-TGFBR2\\t5i_MJPAPzCI1\\tCOMPARTMENT\\t-1\\t-38\\t-262\\t","TGFBR1\\tjQFRXXNIEtyK\\tGENE\\t5i_MJPAPzCI1\\t-121\\t-262\\t","ACVR1B\\tRSw1VMOMEupS\\tGENE\\tRckLIrYUzEOc\\t443\\t-262\\t","SMAD3\\tx-JW3Hq6E1qN\\tGENE\\t7j1T7wlqzcoy\\t235\\t-117\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","2jvzewjJ0UDH\\t5i_MJPAPzCI1\\t7j1T7wlqzcoy\\tACTIVATES","X5m06a6REtyq\\tjQFRXXNIEtyK\\t7GmKbJadEtyf\\tBINDS","76dv_Epi0O5A\\tnTPdmpNKy_zW\\t5i_MJPAPzCI1\\tACTIVATES","RBUTTCdV0RK3\\tZc2sWHBVzArX\\tRckLIrYUzEOc\\tACTIVATES","4m5j1DYC0VIG\\tRckLIrYUzEOc\\t7j1T7wlqzcoy\\tACTIVATES","aVez8qmz0X7C\\t7j1T7wlqzcoy\\tBIYl4Hkdzdoj\\tINHIBITS","dMNeGuPcEupl\\t4qJ5NXmkEupe\\tRSw1VMOMEupS\\tBINDS"],"COADREAD-2012-TP53-pathway":["COADREAD-2012-TP53-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","Proliferation\\tFD2DCZc_8Eck\\tPROCESS\\t-1\\t569\\t199\\t","TP53\\t2LzUgOci77hf\\tGENE\\t-1\\t386\\t239\\t","DNA replication stress\\teArivqeT78y7\\tPROCESS\\t-1\\t204\\t145\\t","ATM\\tB4xPctkP764L\\tGENE\\t-1\\t386\\t145\\t","Oncogenic stress\\tR-scgH-q793l\\tPROCESS\\t-1\\t204\\t239\\t","Cell survival\\tltgdAJkI8Hs-\\tPROCESS\\t-1\\t569\\t266\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","igOuMrr-QXvV\\tR-scgH-q793l\\t2LzUgOci77hf\\tACTIVATES","WlE3wQIvQdms\\t2LzUgOci77hf\\tltgdAJkI8Hs-\\tINHIBITS","nfX2BMaKQcgf\\t2LzUgOci77hf\\tFD2DCZc_8Eck\\tINHIBITS","gVpKeF6ZQW1o\\teArivqeT78y7\\tB4xPctkP764L\\tACTIVATES","KXWREHzWQaXR\\tB4xPctkP764L\\t2LzUgOci77hf\\tACTIVATES"],"COADREAD-2012-WNT-signaling-pathway":["COADREAD-2012-WNT-signaling-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","Proliferation, stem/progenitor phenotype\\tbl6HjsSUV6cV\\tPROCESS\\t-1\\t1030\\t629\\t","DKK3\\tGFrq4NgHEGRM\\tGENE\\tg331vTgZWK6e\\t255\\t154\\t","TCF7L2\\tfah7MVZYUjS9\\tGENE\\t-1\\t462\\t456\\t","DKK\\tg331vTgZWK6e\\tFAMILY\\t-1\\t333\\t125\\t","TCF7\\t6tzFiifNEEEJ\\tGENE\\t61GfHXD5WEXh\\t682\\t571\\t","DKK4\\tRAXuusnwEGQo\\tGENE\\tg331vTgZWK6e\\t411\\t154\\t","CTNNB1\\tEmU8OBXdUMCO\\tGENE\\t-1\\t682\\t392\\t","DKK1\\tUE5vCnmWEGQ6\\tGENE\\tg331vTgZWK6e\\t255\\t96\\t","CTNNB1-TCF7\\t61GfHXD5WEXh\\tCOMPARTMENT\\t-1\\t682\\t539\\t","AXIN2\\tH8L_66uLUHPT\\tGENE\\t-1\\t682\\t312\\t","FAM123B\\tXwg-_Y4_UGRt\\tGENE\\t-1\\t525\\t312\\t","APC\\txIqHk3KBUIjc\\tGENE\\t-1\\t838\\t312\\t","ARID1A\\th0U_424iUWu5\\tGENE\\t-1\\t1030\\t456\\t","CTNNB1\\tKZpYtS9vEEEm\\tGENE\\t61GfHXD5WEXh\\t682\\t507\\t","FZD10\\tP1FIiIlqEFL_\\tGENE\\tT5QZmrnYWA-N\\t762\\t199\\t","LRP5\\twGjsVLW4EFLn\\tGENE\\tT5QZmrnYWA-N\\t600\\t199\\t","WNT\\tcFdN3nQcTwwO\\tGENE\\t-1\\t682\\t47\\t","MYC\\t4hScAPjlUSym\\tGENE\\t-1\\t1030\\t535\\t","DKK2\\tzOVzq_6jEGRb\\tGENE\\tg331vTgZWK6e\\t411\\t96\\t","LRP5-FZD10\\tT5QZmrnYWA-N\\tCOMPARTMENT\\t-1\\t681\\t199\\t","FBXW7\\tbXlgw4GKUVh3\\tGENE\\t-1\\t862\\t456\\t","SOX9\\tPOzVx5kyURM7\\tGENE\\t-1\\t459\\t550\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","j9mmGRLjHKlo\\tEmU8OBXdUMCO\\t61GfHXD5WEXh\\tACTIVATES","f_sY8_lUHUPL\\t61GfHXD5WEXh\\t4hScAPjlUSym\\tINDUCES","esOZ1gJeWfDK\\tT5QZmrnYWA-N\\txIqHk3KBUIjc\\tINHIBITS","ADfnqwAaHX4H\\t4hScAPjlUSym\\tbl6HjsSUV6cV\\tACTIVATES","42Liap6TWjUw\\txIqHk3KBUIjc\\tEmU8OBXdUMCO\\tINHIBITS","Gi2m7VhSWdIe\\tT5QZmrnYWA-N\\tXwg-_Y4_UGRt\\tINHIBITS","hDuqU9RREFMQ\\twGjsVLW4EFLn\\tP1FIiIlqEFL_\\tBINDS","6Rn05rJaWhts\\tXwg-_Y4_UGRt\\tEmU8OBXdUMCO\\tINHIBITS","Rmg0swQ7HQ4z\\t61GfHXD5WEXh\\tPOzVx5kyURM7\\tREPRESSES","dYBVjbKCWM3N\\tg331vTgZWK6e\\tT5QZmrnYWA-N\\tINHIBITS","Z4VdiqohHMM_\\tfah7MVZYUjS9\\t61GfHXD5WEXh\\tINHIBITS","p11d6T2rHOIN\\tbXlgw4GKUVh3\\t61GfHXD5WEXh\\tINHIBITS","l1NcyeMdWigH\\tH8L_66uLUHPT\\tEmU8OBXdUMCO\\tINHIBITS","cdUCacfNHR1f\\tPOzVx5kyURM7\\t61GfHXD5WEXh\\tINHIBITS","IlOH9qIEHVc_\\tbXlgw4GKUVh3\\t4hScAPjlUSym\\tINHIBITS","kvbDlRZ2EEEx\\tKZpYtS9vEEEm\\t6tzFiifNEEEJ\\tBINDS","MUhUjbP3Wa2w\\tg331vTgZWK6e\\tcFdN3nQcTwwO\\tINHIBITS","2OZGWP_oWeBV\\tT5QZmrnYWA-N\\tH8L_66uLUHPT\\tINHIBITS","_xkBTQ9sHWYw\\th0U_424iUWu5\\t4hScAPjlUSym\\tREPRESSES","Af3sU0_EWJva\\tcFdN3nQcTwwO\\tT5QZmrnYWA-N\\tACTIVATES"],"ESAD-2017-Cell-cycle-pathway":["ESAD-2017-Cell-cycle-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","CDKN2A\\t0b0592b4-4330-47c9-9a88-7d8c7940a680\\tGENE\\t-1\\t219\\t205\\t","CYCLINS\\tbfd14661-8f74-45d0-aec4-eff4de124c14\\tFAMILY\\t-1\\t612\\t205\\t","RB1\\t362e59dd-fb26-4d70-8a5e-357b38ed5e4b\\tGENE\\t-1\\t986\\t205\\t","CCNE1\\t65337ed5-11c6-4a91-a177-14c9c0fb42df\\tGENE\\tbfd14661-8f74-45d0-aec4-eff4de124c14\\t454\\t205\\t","CCND1\\ta3661efd-abce-474e-ab02-f2eb355d2487\\tGENE\\tbfd14661-8f74-45d0-aec4-eff4de124c14\\t613\\t205\\t","CDK6\\t4ad57397-dfc1-4efc-91fa-be799f5b885d\\tGENE\\tbfd14661-8f74-45d0-aec4-eff4de124c14\\t770\\t205\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","2c47aaf9-8ddc-4097-bc51-716d7dce4cb9\\tbfd14661-8f74-45d0-aec4-eff4de124c14\\t362e59dd-fb26-4d70-8a5e-357b38ed5e4b\\tINHIBITS","67638113-dece-48c9-8982-3e420e681508\\t0b0592b4-4330-47c9-9a88-7d8c7940a680\\tbfd14661-8f74-45d0-aec4-eff4de124c14\\tINHIBITS"],"ESAD-2017-RTK-RAS-PI(3)K-pathway":["ESAD-2017-RTK-RAS-PI(3)K-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","PIK3R1\\t51f0d970-2e2b-47e2-90bd-0d0d881d70ed\\tGENE\\t-1\\t1056\\t335\\t","PTEN\\t8214d1b9-75ba-4fbb-86d2-fe45dd392767\\tGENE\\t-1\\t778\\t335\\t","PIK3CA\\t49a250be-042c-4910-9774-802dfb0e08f3\\tGENE\\t-1\\t918\\t227\\t","KRAS\\tbea46283-55f2-4650-acee-58d23d8c11fc\\tGENE\\t-1\\t358\\t227\\t","MYC\\tb33f6617-57e5-4e3a-bd28-6ff114d96321\\tGENE\\t-1\\t1256\\t227\\t","RTK\\td76b7fd4-b8f5-4e92-b2ce-b783fe58b9f2\\tFAMILY\\t-1\\t673\\t130\\t","MET\\t82180331-e6f8-4487-9c6c-1c898cb05cf1\\tGENE\\td76b7fd4-b8f5-4e92-b2ce-b783fe58b9f2\\t595\\t130\\t","IGF1R\\te7741571-a281-4b1d-ab5f-1e6d22cd3cf7\\tGENE\\td76b7fd4-b8f5-4e92-b2ce-b783fe58b9f2\\t754\\t130\\t","RTK\\t230ace17-b770-4cc8-8d00-55c2a2075c3e\\tFAMILY\\td76b7fd4-b8f5-4e92-b2ce-b783fe58b9f2\\t1075\\t130\\t","FGFR1\\tfb4252b0-5bfd-495d-99bc-c7143789403c\\tGENE\\td76b7fd4-b8f5-4e92-b2ce-b783fe58b9f2\\t914\\t130\\t","ERBB2\\t0c2d7f5d-9da8-4a3c-bf55-53976781fa86\\tGENE\\td76b7fd4-b8f5-4e92-b2ce-b783fe58b9f2\\t271\\t130\\t","EGFR\\t34b79c41-bc49-4c8e-b5f7-ddad188915bb\\tGENE\\td76b7fd4-b8f5-4e92-b2ce-b783fe58b9f2\\t434\\t130\\t","FGFR2\\t91dd9bca-e153-4016-8c4a-0dbb7e12d024\\tGENE\\td76b7fd4-b8f5-4e92-b2ce-b783fe58b9f2\\t1075\\t130\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","0738d86a-d46d-4a8f-b3f4-b96baba1bfa1\\t49a250be-042c-4910-9774-802dfb0e08f3\\tb33f6617-57e5-4e3a-bd28-6ff114d96321\\tACTIVATES","625b533f-ac20-4dbf-abdc-2c9fe3cafe97\\t51f0d970-2e2b-47e2-90bd-0d0d881d70ed\\t49a250be-042c-4910-9774-802dfb0e08f3\\tINHIBITS","f687da01-5f2a-4168-b41f-04f0014ab954\\t8214d1b9-75ba-4fbb-86d2-fe45dd392767\\t49a250be-042c-4910-9774-802dfb0e08f3\\tINHIBITS","49ee44ff-b6ff-47f0-81bf-effa2cf34191\\t49a250be-042c-4910-9774-802dfb0e08f3\\tbea46283-55f2-4650-acee-58d23d8c11fc\\tACTIVATES","d1a956b7-db6a-4653-9da4-d0b26357fb5a\\tbea46283-55f2-4650-acee-58d23d8c11fc\\t49a250be-042c-4910-9774-802dfb0e08f3\\tACTIVATES","73b63049-5e6c-4793-8536-86b4ec006b2d\\td76b7fd4-b8f5-4e92-b2ce-b783fe58b9f2\\t49a250be-042c-4910-9774-802dfb0e08f3\\tACTIVATES","49655771-0e8d-42ce-a71e-76d3bc8c742c\\td76b7fd4-b8f5-4e92-b2ce-b783fe58b9f2\\tbea46283-55f2-4650-acee-58d23d8c11fc\\tACTIVATES"],"ESAD-2017-WNT-CTNNB1-pathway":["ESAD-2017-WNT-CTNNB1-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","PTCH1\\t623d9d6b-6d32-4a0a-a826-df9b880ca03a\\tGENE\\t-1\\t212\\t126\\t","APC\\t792b8fd9-ae87-4972-8da4-1140378b63e5\\tGENE\\t-1\\t382\\t126\\t","FBXW7\\tfaa556d4-6e8d-456d-b9d0-a4c35873f9a8\\tGENE\\t-1\\t553\\t126\\t","ARID1A\\t1cdc0d84-e27f-44ed-981e-12994fed8711\\tGENE\\t-1\\t731\\t126\\t","CTNNB1\\td6eb299d-a7c3-4c78-b9e7-4808773bb690\\tGENE\\t-1\\t446\\t214\\t","MYC\\tdd894023-67b6-4bcc-baad-a441556f4168\\tGENE\\t-1\\t793\\t214\\t","PIK3CA\\t8009d529-453b-4c3e-b694-7e0070b7f0a5\\tGENE\\t-1\\t793\\t303\\t","Cell proliferation\\td80f3360-7aa0-442a-ae2a-59f0e8379f86\\tPROCESS\\t-1\\t999\\t214\\t","Embryonic development\\t2e65076c-a0ae-47d9-8860-4ba6c1c89e1c\\tPROCESS\\t-1\\t210\\t214\\t","SMAD\\t08936961-1fad-4b39-ada5-839a1864de96\\tFAMILY\\t-1\\t985\\t126\\t","SMAD2\\t0235338c-0433-48b9-87e3-e50923aed67c\\tGENE\\t08936961-1fad-4b39-ada5-839a1864de96\\t901\\t126\\t","SMAD4\\t1b3e587e-ec76-417a-92ef-34976b0f46bd\\tGENE\\t08936961-1fad-4b39-ada5-839a1864de96\\t1070\\t126\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","a1155daf-ac03-4bbd-9ae0-0a738ec73d95\\t8009d529-453b-4c3e-b694-7e0070b7f0a5\\tdd894023-67b6-4bcc-baad-a441556f4168\\tACTIVATES","0562cbe7-7462-45c1-bd49-109e7ef97f74\\tdd894023-67b6-4bcc-baad-a441556f4168\\td80f3360-7aa0-442a-ae2a-59f0e8379f86\\tACTIVATES","b7fe88fe-76f0-4f45-b80c-eb9937d3fed0\\t623d9d6b-6d32-4a0a-a826-df9b880ca03a\\t2e65076c-a0ae-47d9-8860-4ba6c1c89e1c\\tINHIBITS","d1682a0d-a521-4f33-8097-a57b695d6fe4\\t792b8fd9-ae87-4972-8da4-1140378b63e5\\td6eb299d-a7c3-4c78-b9e7-4808773bb690\\tINHIBITS","0e07ea0f-7144-42b7-831d-11a660f45ddb\\tfaa556d4-6e8d-456d-b9d0-a4c35873f9a8\\td6eb299d-a7c3-4c78-b9e7-4808773bb690\\tINHIBITS","91b66dea-a6b4-4991-8ac2-184904f361b0\\tfaa556d4-6e8d-456d-b9d0-a4c35873f9a8\\tdd894023-67b6-4bcc-baad-a441556f4168\\tINHIBITS","ba347f10-d89d-47ed-97fc-8eed4454b4ba\\td6eb299d-a7c3-4c78-b9e7-4808773bb690\\tdd894023-67b6-4bcc-baad-a441556f4168\\tACTIVATES","b8423ddf-8f5c-4718-81b4-132ae25ed3e5\\t1cdc0d84-e27f-44ed-981e-12994fed8711\\tdd894023-67b6-4bcc-baad-a441556f4168\\tINHIBITS","a7180fc6-8113-47eb-b090-39d1cc8c5825\\t08936961-1fad-4b39-ada5-839a1864de96\\tdd894023-67b6-4bcc-baad-a441556f4168\\tINHIBITS"],"GBM-2008-Cell-cycle-signaling-pathway":["GBM-2008-Cell-cycle-signaling-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","RB1\\t0cQitpJLOoEG\\tFAMILY\\t-1\\t472\\t279\\t","CYCLINS\\tSBGkYw2NOhMr\\tFAMILY\\t-1\\t472\\t168\\t","G1/S Progression\\t0kD7D3DGOtD1\\tPROCESS\\t-1\\t472\\t374\\t","CCND2\\tGrNFDrs1AoNL\\tGENE\\tSBGkYw2NOhMr\\t472\\t168\\t","CDKN2B\\tTbTnj_R5ONS9\\tGENE\\t-1\\t444\\t87\\t","CDK4\\tPs45UaX4AoNo\\tGENE\\tSBGkYw2NOhMr\\t317\\t168\\t","CDK6\\tVnEu6OlPAoNe\\tGENE\\tSBGkYw2NOhMr\\t627\\t168\\t","CDKN2C\\tr8WJLoQLOONy\\tGENE\\t-1\\t625\\t87\\t","CDKN2A\\tcnleYFDsOMzx\\tGENE\\t-1\\t294\\t87\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","Rpso-cKyOzoj\\tTbTnj_R5ONS9\\tSBGkYw2NOhMr\\tINHIBITS","3InwuSCoO0br\\tr8WJLoQLOONy\\tSBGkYw2NOhMr\\tINHIBITS","-zXgQSv4Oy04\\tcnleYFDsOMzx\\tSBGkYw2NOhMr\\tINHIBITS","6NO_fL3nO3r4\\tSBGkYw2NOhMr\\t0cQitpJLOoEG\\tINHIBITS","1pimX-ZiO6F6\\t0cQitpJLOoEG\\t0kD7D3DGOtD1\\tINHIBITS"],"GBM-2008-RTK-RAS-PI(3)K-pathway":["GBM-2008-RTK-RAS-PI(3)K-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","PDGFRA\\tiD415efHLG3J\\tGENE\\tIdrkrh8-K31j\\t441\\t-61\\t","RAS\\t8XXLbCwXLtrQ\\tFAMILY\\t-1\\t246\\t53\\t","NF1\\tKe7_FRmuLw42\\tGENE\\t-1\\t21\\t54\\t","RTK\\tIdrkrh8-K31j\\tFAMILY\\t-1\\t365\\t-61\\t","PI(3)K\\tuWMSz1XlL2nL\\tFAMILY\\t-1\\t529\\t50\\t","PTEN\\tLOErZTMUL6hc\\tGENE\\t-1\\t721\\t50\\t","AKT\\tsgb8KI1XMIrn\\tFAMILY\\t-1\\t529\\t129\\t","EGFR\\t7T8gHIR6LG2s\\tGENE\\tIdrkrh8-K31j\\t134\\t-61\\t","FOXO\\t1cIfqNkTMN--\\tGENE\\t-1\\t529\\t205\\t","MET\\tXcKqo6xILG3V\\tGENE\\tIdrkrh8-K31j\\t597\\t-61\\t","ERBB2\\tvJOD-MZOLG2-\\tGENE\\tIdrkrh8-K31j\\t287\\t-61\\t","Proliferation, survival, translation\\tk9I_xTrbMS6S\\tPROCESS\\t-1\\t247\\t206\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","ApGQ0rEtL1TV\\tKe7_FRmuLw42\\t8XXLbCwXLtrQ\\tINHIBITS","s5CFkxUKL0kl\\tIdrkrh8-K31j\\t8XXLbCwXLtrQ\\tACTIVATES","jrs5QL8rMbv3\\t8XXLbCwXLtrQ\\tk9I_xTrbMS6S\\tACTIVATES","WEpyeQmyMeC8\\tsgb8KI1XMIrn\\t1cIfqNkTMN--\\tINHIBITS","ytXepIulMGGL\\tIdrkrh8-K31j\\tuWMSz1XlL2nL\\tACTIVATES","_g47pqc4MGwz\\tLOErZTMUL6hc\\tuWMSz1XlL2nL\\tINHIBITS","u1UwLh90MdLo\\tuWMSz1XlL2nL\\tsgb8KI1XMIrn\\tACTIVATES"],"GBM-2008-TP53-pathway":["GBM-2008-TP53-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","Activated oncogenes\\tx-laQtq0NSZI\\tPROCESS\\t-1\\t724\\t57\\t","MDM2\\tVIrh6R4jNYOQ\\tGENE\\t-1\\t724\\t208\\t","Apoptosis\\tLxZckK4_NmKp\\tPROCESS\\t-1\\t886\\t297\\t","MDM4\\t0z81KeWTNfOj\\tGENE\\t-1\\t886\\t234\\t","Senescence\\tX0XgoUzfNjH-\\tPROCESS\\t-1\\t546\\t297\\t","CDKN2A\\tIXX8d7kuNVHa\\tGENE\\t-1\\t724\\t135\\t","TP53\\t6RLrPg8rNa4o\\tGENE\\t-1\\t724\\t297\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","4PNvvSvKNtxu\\tIXX8d7kuNVHa\\tVIrh6R4jNYOQ\\tINHIBITS","gX_WY_rANxtC\\tVIrh6R4jNYOQ\\t6RLrPg8rNa4o\\tINHIBITS","EznJNkeAN1al\\t6RLrPg8rNa4o\\tX0XgoUzfNjH-\\tACTIVATES","kaHvTklZNzas\\t0z81KeWTNfOj\\t6RLrPg8rNa4o\\tINHIBITS","wTOjoJHdNq6N\\tx-laQtq0NSZI\\tIXX8d7kuNVHa\\tACTIVATES","5-9bxAL_N0gO\\t6RLrPg8rNa4o\\tLxZckK4_NmKp\\tACTIVATES"],"GBM-2013-Cell-cycle-signaling-pathway":["GBM-2013-Cell-cycle-signaling-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","CDKN2C\\tnFMLgWuEmv0Q\\tGENE\\t-1\\t667\\t136\\t","CDK4\\tszeVZ7Elmxvu\\tGENE\\t-1\\t386\\t249\\t","CDK6\\tWvJWw5HPm0Ab\\tGENE\\t-1\\t694\\t249\\t","Cyclins\\tAvEeR8GgnDvF\\tFAMILY\\t-1\\t541\\t249\\t","CDKN2A\\tWHDg2nj1B2yR\\tGENE\\t-1\\t320\\t136\\t","Cell cycle control\\tKJEq6EA_m3Cj\\tPROCESS\\t-1\\t793\\t383\\t","CDKN2B\\tv1zGJhukB2ym\\tGENE\\t-1\\t470\\t136\\t","RB1\\tNc0stK1rm13Y\\tFAMILY\\t-1\\t541\\t383\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","4yIGldfunbSO\\tNc0stK1rm13Y\\tKJEq6EA_m3Cj\\tACTIVATES","aqdBLSknB2zK\\tv1zGJhukB2ym\\tszeVZ7Elmxvu\\tINHIBITS","bxdBRxkfnYu4\\tszeVZ7Elmxvu\\tNc0stK1rm13Y\\tINHIBITS","AQXakgefnZf1\\tAvEeR8GgnDvF\\tNc0stK1rm13Y\\tINHIBITS","bdgYHwINnW4B\\tnFMLgWuEmv0Q\\tAvEeR8GgnDvF\\tINHIBITS","Xslj1XfeB2yz\\tWHDg2nj1B2yR\\tszeVZ7Elmxvu\\tINHIBITS","ve_EiwTjnXrI\\tnFMLgWuEmv0Q\\tWvJWw5HPm0Ab\\tINHIBITS","Q7Uq8jBIB2y5\\tWHDg2nj1B2yR\\tAvEeR8GgnDvF\\tINHIBITS","IL38zL5VB2yv\\tWHDg2nj1B2yR\\tWvJWw5HPm0Ab\\tINHIBITS","6jn1TNkoB2zN\\tv1zGJhukB2ym\\tAvEeR8GgnDvF\\tINHIBITS","BSaYCBi7naes\\tWvJWw5HPm0Ab\\tNc0stK1rm13Y\\tINHIBITS","JZERPNMdnWL9\\tnFMLgWuEmv0Q\\tszeVZ7Elmxvu\\tINHIBITS","n7Nithx-B2zB\\tv1zGJhukB2ym\\tWvJWw5HPm0Ab\\tINHIBITS"],"GBM-2013-RTK-RAS-PI(3)K-pathway":["GBM-2013-RTK-RAS-PI(3)K-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","NF1\\tpQ2sq0Chk7o8\\tGENE\\t-1\\t843\\t223\\t","RAS\\tXfDonLT2k9rr\\tFAMILY\\t-1\\t674\\t223\\t","BRAF\\tJKmqofwVk_cd\\tGENE\\t-1\\t674\\t334\\t","EGFR\\tHG7A5p2q4D3f\\tGENE\\tZvpmFM7llCzi\\t331\\t113\\t","PI3K(3)K\\tE0625yTsk46l\\tGENE\\t-1\\t428\\t225\\t","AKT Pathway\\tTTwvf1BelBTM\\tPROCESS\\t-1\\t428\\t338\\t","MET\\tsZJ7Kmrg4D35\\tGENE\\tZvpmFM7llCzi\\t643\\t113\\t","MAPK Pathway\\tdAkBkKN-lAKT\\tPROCESS\\t-1\\t862\\t335\\t","PTEN\\t8kyYeHGHk4NK\\tGENE\\t-1\\t255\\t225\\t","RTK\\tZvpmFM7llCzi\\tFAMILY\\t-1\\t565\\t113\\t","FGFR\\t8z2n3qaU4D3L\\tGENE\\tZvpmFM7llCzi\\t800\\t113\\t","PDGFRA\\t-jXEzRew4D3r\\tGENE\\tZvpmFM7llCzi\\t487\\t113\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","f9EmKbzjlk77\\tJKmqofwVk_cd\\tdAkBkKN-lAKT\\tACTIVATES","qj0ZCvR8le5E\\t8kyYeHGHk4NK\\tE0625yTsk46l\\tINHIBITS","4DrueUbLljf-\\tE0625yTsk46l\\tTTwvf1BelBTM\\tACTIVATES","c4Kpa4R5lgcQ\\tZvpmFM7llCzi\\tXfDonLT2k9rr\\tACTIVATES","CEeo6oGYlifg\\tXfDonLT2k9rr\\tJKmqofwVk_cd\\tACTIVATES","zingzci6lhXA\\tpQ2sq0Chk7o8\\tXfDonLT2k9rr\\tINHIBITS","LTVgdZNOld9G\\tZvpmFM7llCzi\\tE0625yTsk46l\\tACTIVATES"],"GBM-2013-TP53-pathway":["GBM-2013-TP53-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","TP53\\tux4NOBO4mBSe\\tGENE\\t-1\\t416\\t243\\t","MDM4\\tO3CQIh-OmCOD\\tGENE\\t-1\\t222\\t243\\t","Senescence/Apoptosis\\tTIZhBhfymDVV\\tPROCESS\\t-1\\t416\\t355\\t","MDM2\\tdNRsoLpZmAuu\\tGENE\\t-1\\t416\\t133\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","BrX7DMKemS8w\\tdNRsoLpZmAuu\\tux4NOBO4mBSe\\tINHIBITS","jHRb2o3YmTqF\\tO3CQIh-OmCOD\\tux4NOBO4mBSe\\tINHIBITS","MnYnmX_dmV0E\\tux4NOBO4mBSe\\tTIZhBhfymDVV\\tACTIVATES"],"HIPPO":["HIPPO","","Involved in the control of organ size. Central to this pathway is the regulation of the transcription co-activators YAP/TAZ that promote the transcription of genes involved in cell proliferation.","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY\\tWIDTH\\tHEIGHT--","\\t8f940396-e035-4b9e-8574-b5eadf26e98c\\tFAMILY\\t-1\\t91\\t64\\t150\\t52","DCHS1\\t8d4d3dca-9217-4539-b15e-63ce7f5df09a\\tGENE\\t8f940396-e035-4b9e-8574-b5eadf26e98c\\t91\\t34\\t150\\t52","DCHS2\\tf51ccf81-94a8-425f-80ce-4d55489b9660\\tGENE\\t8f940396-e035-4b9e-8574-b5eadf26e98c\\t91\\t95\\t150\\t52","\\t623300c3-2a9c-45d4-be51-ad67eea733b7\\tFAMILY\\t-1\\t369\\t61\\t150\\t52","FAT1\\t901800a8-6c9f-42f6-a9b6-2e8b1483ec63\\tGENE\\t623300c3-2a9c-45d4-be51-ad67eea733b7\\t291\\t32\\t150\\t52","FAT2\\t775d810d-bfc1-434c-949d-71f4bd38d374\\tGENE\\t623300c3-2a9c-45d4-be51-ad67eea733b7\\t448\\t31\\t150\\t52","FAT3\\tc4f71e12-c88e-409d-9f26-7bc84b3f6cb8\\tGENE\\t623300c3-2a9c-45d4-be51-ad67eea733b7\\t291\\t92\\t150\\t52","FAT4\\t075bc3e3-74b9-4d0c-a20d-58b77cb3c3f6\\tGENE\\t623300c3-2a9c-45d4-be51-ad67eea733b7\\t448\\t91\\t150\\t52","\\tde4dab24-648f-4406-8adf-0c08d62b3173\\tFAMILY\\t-1\\t714\\t60\\t150\\t52","TAOK1\\t3e53e820-8a91-4329-86f1-e59948a9003a\\tGENE\\tde4dab24-648f-4406-8adf-0c08d62b3173\\t636\\t32\\t150\\t52","TAOK3\\t7a7b38dc-e47d-4f33-9cec-3570a23b2f85\\tGENE\\tde4dab24-648f-4406-8adf-0c08d62b3173\\t636\\t89\\t150\\t52","TAOK2\\t8a51ead1-a5d3-41b8-bf2e-99fc2169857b\\tGENE\\tde4dab24-648f-4406-8adf-0c08d62b3173\\t793\\t31\\t150\\t52","\\ta495c90c-7f17-4369-81bc-bc8894ba1c0d\\tFAMILY\\t-1\\t374\\t324\\t456.5888856128265\\t242.9161558761191","SAV1\\t267c0160-0919-403d-bd52-ea84c001f357\\tGENE\\ta495c90c-7f17-4369-81bc-bc8894ba1c0d\\t277\\t257\\t150\\t52","\\t71e2f614-626b-4fbe-9e18-17c83c401062\\tFAMILY\\ta495c90c-7f17-4369-81bc-bc8894ba1c0d\\t455\\t258\\t212.8900278180157\\t116.0130640290517","STK3\\t9f5e8c36-52a9-4e62-bf7c-b1f3b02d8740\\tGENE\\t71e2f614-626b-4fbe-9e18-17c83c401062\\t455\\t230\\t150\\t52","STK4\\t3e08fb0d-ef9f-49b9-8037-ed940df282af\\tGENE\\t71e2f614-626b-4fbe-9e18-17c83c401062\\t455\\t287\\t150\\t52","\\t7ef3236d-1aa7-4082-a396-751554a11282\\tFAMILY\\ta495c90c-7f17-4369-81bc-bc8894ba1c0d\\t277\\t390\\t154.12303621103598\\t117.89002781801568","LATS1\\t2897d4be-7047-4af4-958b-b978a0d944f5\\tGENE\\t7ef3236d-1aa7-4082-a396-751554a11282\\t277\\t362\\t150\\t52","LATS2\\t944868e7-e040-49a8-8773-3da725d368c3\\tGENE\\t7ef3236d-1aa7-4082-a396-751554a11282\\t277\\t419\\t150\\t52","\\tb6626b2a-d8ef-4d7a-9645-8e9a7a538795\\tFAMILY\\ta495c90c-7f17-4369-81bc-bc8894ba1c0d\\t455\\t390\\t150\\t52","MOB1A\\t54416ef1-d8c0-492d-b465-49adb95ad62e\\tGENE\\tb6626b2a-d8ef-4d7a-9645-8e9a7a538795\\t454\\t362\\t150\\t52","MOB1B\\t44429ea1-e73d-43f8-8caf-c7fb319956ff\\tGENE\\tb6626b2a-d8ef-4d7a-9645-8e9a7a538795\\t455\\t419\\t150\\t52","\\t4df2d8ec-903b-4445-a7a5-f5b105fd49f1\\tFAMILY\\t-1\\t710\\t324\\t150\\t52","NF2\\tfd29bca1-db7d-4f62-bce0-49510642adb3\\tGENE\\t4df2d8ec-903b-4445-a7a5-f5b105fd49f1\\t709\\t295\\t150\\t52","WWC1\\te9119bdc-4312-40a5-837e-dc079d103e63\\tGENE\\t4df2d8ec-903b-4445-a7a5-f5b105fd49f1\\t710\\t353\\t150\\t52","\\t8d5398c4-941f-4153-a392-ebaef3fff177\\tFAMILY\\t-1\\t373\\t590\\t179.71700255004964\\t76.76416879170804","YAP1\\t3cf01f62-ef45-4722-8cad-565456928871\\tGENE\\t8d5398c4-941f-4153-a392-ebaef3fff177\\t373\\t559\\t150\\t52","TAZ\\t9ed35563-0451-451b-a750-c33f5e94108f\\tGENE\\t8d5398c4-941f-4153-a392-ebaef3fff177\\t373\\t620\\t150\\t52","\\tbb742872-aa08-4e50-87de-846f64cea394\\tFAMILY\\t-1\\t91\\t590\\t150\\t52","CRB1\\t1ea26f01-462c-4a16-b568-b9de2242fa5b\\tGENE\\tbb742872-aa08-4e50-87de-846f64cea394\\t91\\t560\\t150\\t52","CRB2\\te054585c-47a2-4b4a-9cb7-cbbfc61e900f\\tGENE\\tbb742872-aa08-4e50-87de-846f64cea394\\t91\\t620\\t150\\t52","PTPN14\\td88a9331-971e-4ad2-817a-a3dadbebd4de\\tGENE\\t-1\\t606\\t538\\t150\\t52","\\t8f2ee28b-9fc4-4b61-ad07-e0c0b0b4c566\\tFAMILY\\t-1\\t606\\t672\\t150\\t52","CSNK1E\\t63916e9d-dcd6-45db-8fbe-3d480ef92c5f\\tGENE\\t8f2ee28b-9fc4-4b61-ad07-e0c0b0b4c566\\t606\\t640\\t150\\t52","CSNK1D\\t0e5136c0-186c-4aba-893c-7f0ce5bdf56d\\tGENE\\t8f2ee28b-9fc4-4b61-ad07-e0c0b0b4c566\\t606\\t705\\t150\\t52","TEAD2\\t0d1f1291-ec19-4f6d-8e74-1f11a020144b\\tGENE\\t-1\\t373\\t794\\t150\\t52","Cell proliferation and differentiation\\tfb37aa0c-49bb-4db6-b185-bc5a64a72540\\tPROCESS\\t-1\\t372\\t922\\t150\\t52","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE\\tINTERACTION_PUBMED_ID\\tEDGE_NAME\\tEDGE_BENDS","17a941fe-ab44-43f4-8a4e-daa3939947a1\\t8f940396-e035-4b9e-8574-b5eadf26e98c\\ta495c90c-7f17-4369-81bc-bc8894ba1c0d\\tACTIVATES\\t\\t\\t","a7d8a94f-4d02-46ed-8726-9c4e3e8bda7e\\t623300c3-2a9c-45d4-be51-ad67eea733b7\\ta495c90c-7f17-4369-81bc-bc8894ba1c0d\\tACTIVATES\\t\\t\\t","ee173361-b9ad-458a-80d3-0138572470d4\\tde4dab24-648f-4406-8adf-0c08d62b3173\\ta495c90c-7f17-4369-81bc-bc8894ba1c0d\\tACTIVATES\\t\\t\\t","e63e86f3-3b5e-4e37-8837-43d92a67ea7d\\t4df2d8ec-903b-4445-a7a5-f5b105fd49f1\\ta495c90c-7f17-4369-81bc-bc8894ba1c0d\\tACTIVATES\\t\\t\\t","04ca3e1e-1693-4ec6-ab80-2724e2e3a0b9\\ta495c90c-7f17-4369-81bc-bc8894ba1c0d\\t8d5398c4-941f-4153-a392-ebaef3fff177\\tINHIBITS\\t\\t\\t","81a3fb4e-3e69-47b6-b499-e9fdfe65a37e\\tbb742872-aa08-4e50-87de-846f64cea394\\t8d5398c4-941f-4153-a392-ebaef3fff177\\tINHIBITS\\t\\t\\t","b6c3a4db-545a-4c25-bf4a-f0a3a8de36d2\\t8f2ee28b-9fc4-4b61-ad07-e0c0b0b4c566\\t8d5398c4-941f-4153-a392-ebaef3fff177\\tINHIBITS\\t\\t\\t","fce1ac6e-bc2e-4369-ab6e-287731618cc1\\td88a9331-971e-4ad2-817a-a3dadbebd4de\\t8d5398c4-941f-4153-a392-ebaef3fff177\\tINHIBITS\\t\\t\\t","b3fafa92-cfc7-460d-94d1-09ce977c3111\\t8d5398c4-941f-4153-a392-ebaef3fff177\\t0d1f1291-ec19-4f6d-8e74-1f11a020144b\\tACTIVATES\\t\\t\\t","7b0d95b6-acc4-46a0-85e4-9cbacd5b11de\\t0d1f1291-ec19-4f6d-8e74-1f11a020144b\\tfb37aa0c-49bb-4db6-b185-bc5a64a72540\\tACTIVATES\\t\\t\\t"],"HNSC-2015-Apoptosis-pathway":["HNSC-2015-Apoptosis-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","Cell cycle and survival\\temPjU9d6DgGP\\tPROCESS\\t-1\\t348\\t484\\t","TRAF3\\tIBsoHlQJDZF8\\tGENE\\t-1\\t530\\t285\\t","FADD\\tDLlGnDdfDTRw\\tGENE\\t-1\\t373\\t199\\t","TNFR-LTBR\\ts0lGLs3rDXus\\tCOMPARTMENT\\t-1\\t452\\t106\\t","LTBR\\tM8fueNVgIWYI\\tGENE\\ts0lGLs3rDXus\\t530\\t106\\t","Inflammation angiogenesis migration\\tyeoJnxV0DfTf\\tPROCESS\\t-1\\t581\\t484\\t","BIRC2\\t54AiNjv7DUd9\\tGENE\\t-1\\t530\\t199\\t","NF-kB\\tVeOlULKnDabs\\tGENE\\t-1\\t455\\t382\\t","CASP8\\tkpwET4bNDYMG\\tGENE\\t-1\\t373\\t285\\t","TNFR\\t1f2UD5ctIWYb\\tGENE\\ts0lGLs3rDXus\\t373\\t106\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","lvrnvkjrD9P-\\ts0lGLs3rDXus\\t54AiNjv7DUd9\\tACTIVATES","N_skSg-mECnc\\tkpwET4bNDYMG\\tVeOlULKnDabs\\tINHIBITS","OMDbwzxED_x2\\t54AiNjv7DUd9\\tkpwET4bNDYMG\\tINHIBITS","HH4ug7YuD7Fv\\ts0lGLs3rDXus\\tDLlGnDdfDTRw\\tACTIVATES","f-O5DenwEBjr\\t54AiNjv7DUd9\\tIBsoHlQJDZF8\\tINHIBITS","U1LEKmYqIWYs\\t1f2UD5ctIWYb\\tM8fueNVgIWYI\\tBINDS","hhJPfTk9EHgb\\tVeOlULKnDabs\\temPjU9d6DgGP\\tACTIVATES","h3Fekoz9EAiL\\tDLlGnDdfDTRw\\tkpwET4bNDYMG\\tACTIVATES","Acyl78aaEDXf\\tIBsoHlQJDZF8\\tVeOlULKnDabs\\tINHIBITS","O9oIu8SeEIN_\\tVeOlULKnDabs\\tyeoJnxV0DfTf\\tACTIVATES"],"HNSC-2015-Cell-cycle-signaling-pathway":["HNSC-2015-Cell-cycle-signaling-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","CDKN2A\\tprbNZ7N4F2yz\\tGENE\\t-1\\t346\\t201\\t","Cell cycle and survival\\tUF0yWD0cGVp6\\tPROCESS\\t-1\\t859\\t466\\t","let-7c\\t1Fbfq0EnF4FD\\tGENE\\t-1\\t761\\t201\\t","HRAS\\ttR7G7jSMFyKn\\tGENE\\t-1\\t456\\t71\\t","HPVE\\tOUtOuzrFGWsp\\tFAMILY\\t-1\\t347\\t333\\t","RB1\\tKkBOpjMSGBEp\\tFAMILY\\t-1\\t570\\t334\\t","TP53\\tm6QJybSmGSEj\\tGENE\\t-1\\t531\\t466\\t","MYC\\tPu1nPMkoGUcO\\tGENE\\t-1\\t931\\t334\\t","PIK3CA\\tz2FkIMy8FypC\\tGENE\\t-1\\t678\\t71\\t","CCND1\\tS0n0th2eCfb9\\tGENE\\t-swYow3RF5GO\\t570\\t171\\t","CYCLINS\\t-swYow3RF5GO\\tFAMILY\\t-1\\t570\\t197\\t","E2F1\\tBNAC4UcvF_fD\\tGENE\\t-1\\t764\\t334\\t","HPVE7\\t6jlQIfmICrjy\\tGENE\\tOUtOuzrFGWsp\\t347\\t360\\t","CDK6\\tPPI7pGMpCfcQ\\tGENE\\t-swYow3RF5GO\\t570\\t224\\t","HPVE6\\t4bkc06NyCrjd\\tGENE\\tOUtOuzrFGWsp\\t347\\t307\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","idn2SG2QHMC0\\tBNAC4UcvF_fD\\tUF0yWD0cGVp6\\tACTIVATES","njhnQe9vCfci\\tz2FkIMy8FypC\\tS0n0th2eCfb9\\tACTIVATES","5CzfV-h-HQkB\\tOUtOuzrFGWsp\\tm6QJybSmGSEj\\tINHIBITS","UpECTCkVHGkl\\t1Fbfq0EnF4FD\\t-swYow3RF5GO\\tINHIBITS","wnpqGTZ4HNFG\\tPu1nPMkoGUcO\\tUF0yWD0cGVp6\\tACTIVATES","WfTDsR48HJ8K\\t-swYow3RF5GO\\tKkBOpjMSGBEp\\tINHIBITS","mHie46k1HIGn\\tprbNZ7N4F2yz\\t-swYow3RF5GO\\tINHIBITS","EJXQGmWDCfcZ\\ttR7G7jSMFyKn\\tS0n0th2eCfb9\\tACTIVATES","naU-KiGLHOkS\\tOUtOuzrFGWsp\\tKkBOpjMSGBEp\\tINHIBITS","lU11XAdWHRyG\\tm6QJybSmGSEj\\tUF0yWD0cGVp6\\tINHIBITS","hgYpZiWwHLEw\\tKkBOpjMSGBEp\\tBNAC4UcvF_fD\\tINHIBITS"],"HNSC-2015-Notch-signaling-pathway":["HNSC-2015-Notch-signaling-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","TP63\\t0_tmgKZGEdGo\\tGENE\\t-1\\t290\\t306\\t","Differentiation\\teeVhg40NEiK2\\tPROCESS\\t-1\\t553\\t481\\t","CTNNB1\\tB311fstqEcj1\\tGENE\\t-1\\t485\\t306\\t","FAT1\\tKm28lPDkEe1-\\tGENE\\t-1\\t676\\t253\\t","AJUBA\\txmIHMSMOEfhM\\tGENE\\t-1\\t676\\t350\\t","NFE2L2\\tuBK84iGaEx2k\\tGENE\\t-1\\t835\\t108\\t","Inflammation angiogenesis migration\\tcVmq2gc7EhfK\\tPROCESS\\t-1\\t290\\t480\\t","NOTCH\\tM36IzzXCEbYd\\tFAMILY\\t-1\\t485\\t108\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","ICbcotEzE6EA\\tKm28lPDkEe1-\\tB311fstqEcj1\\tINHIBITS","wuF8plb4E1Me\\tuBK84iGaEx2k\\tM36IzzXCEbYd\\tACTIVATES","aGzvs7zSE3y2\\t0_tmgKZGEdGo\\tM36IzzXCEbYd\\tINHIBITS","3EBZZzaxE5Fm\\tM36IzzXCEbYd\\tB311fstqEcj1\\tINHIBITS","_u545Mo9E_ul\\t0_tmgKZGEdGo\\teeVhg40NEiK2\\tINHIBITS","n1ZzhYJJE6z0\\txmIHMSMOEfhM\\tB311fstqEcj1\\tINHIBITS","qJsbtzEME7xA\\tB311fstqEcj1\\teeVhg40NEiK2\\tINHIBITS","qbufdsXRFBiJ\\t0_tmgKZGEdGo\\tcVmq2gc7EhfK\\tACTIVATES","XfMK86WqE21I\\tM36IzzXCEbYd\\t0_tmgKZGEdGo\\tINHIBITS"],"HNSC-2015-Oxidative-stress-response-pathway":["HNSC-2015-Oxidative-stress-response-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","NFE2L2\\tgt4I0Om0FTv6\\tGENE\\t-1\\t436\\t285\\t","KEAP1\\tZsX3OXk3FSsm\\tGENE\\t-1\\t529\\t167\\t","NOTCH\\tBvJxfxK3FnBO\\tGENE\\t-1\\t169\\t285\\t","CUL3\\tIcPGDcXRFSKm\\tGENE\\t-1\\t339\\t167\\t","Oxidative damage\\tfVzq-7uHFVEN\\tPROCESS\\t-1\\t436\\t413\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","EnpWtdTqFdCy\\tIcPGDcXRFSKm\\tgt4I0Om0FTv6\\tINHIBITS","evdmv52VFpzm\\tgt4I0Om0FTv6\\tBvJxfxK3FnBO\\tACTIVATES","cPEAdB0SFfMR\\tgt4I0Om0FTv6\\tfVzq-7uHFVEN\\tACTIVATES","H-KG07b7Fd8r\\tZsX3OXk3FSsm\\tgt4I0Om0FTv6\\tINHIBITS"],"HNSC-2015-RTK-RAS-PI(3)K-pathway":["HNSC-2015-RTK-RAS-PI(3)K-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","PIK3CA\\txi9Q36e2CS_G\\tGENE\\t-1\\t540\\t244\\t","NF-kB\\tOOiOvVaWCyaI\\tGENE\\t-1\\t878\\t459\\t","HRAS\\tCh4RV-nlCR-8\\tGENE\\t-1\\t320\\t244\\t","IGF1R\\tYDvyAEat8pkt\\tGENE\\tYgFgrMTKCakc\\t850\\t145\\t","ERBB2\\to8fELaID8pjp\\tGENE\\tYgFgrMTKCakc\\t385\\t145\\t","EGFR\\tmYeWqovL8pkK\\tGENE\\tYgFgrMTKCakc\\t227\\t145\\t","RTK\\tYgFgrMTKCakc\\tFAMILY\\t-1\\t538\\t145\\t","FGFR1\\ts8sttQyx8pj-\\tGENE\\tYgFgrMTKCakc\\t541\\t145\\t","PTEN\\tWh8DCYlCCT_j\\tGENE\\t-1\\t722\\t244\\t","CCND1\\ts_2ubRksCYIg\\tGENE\\t-1\\t403\\t337\\t","MYC\\tM33a4yWMGH-j\\tGENE\\t-1\\t540\\t459\\t","FGFR3\\t-jbsv2rK8pkb\\tGENE\\tYgFgrMTKCakc\\t696\\t145\\t","Cell cycle and survival\\tNZQP-jwUGJDJ\\tPROCESS\\t-1\\t540\\t568\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","Vp8BMTADCsgK\\tYgFgrMTKCakc\\txi9Q36e2CS_G\\tACTIVATES","zMOtnYBFCu5s\\txi9Q36e2CS_G\\ts_2ubRksCYIg\\tACTIVATES","P2bwQGViCuNZ\\tCh4RV-nlCR-8\\ts_2ubRksCYIg\\tACTIVATES","9-cqR59DCtQQ\\tWh8DCYlCCT_j\\txi9Q36e2CS_G\\tINHIBITS","kFlNIRpWC2i-\\txi9Q36e2CS_G\\tOOiOvVaWCyaI\\tACTIVATES","S3jvgVzsGPMY\\txi9Q36e2CS_G\\tM33a4yWMGH-j\\tACTIVATES","GnyxNL7aCqke\\tYgFgrMTKCakc\\tCh4RV-nlCR-8\\tACTIVATES","rrzkeHNUGQDo\\tM33a4yWMGH-j\\tNZQP-jwUGJDJ\\tACTIVATES"],"KIRC-2013-RTK-RAS-PI(3)K-pathway":["KIRC-2013-RTK-RAS-PI(3)K-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","TSC1\\tuggsxb8--Aro\\tGENE\\txqEGjsx0iLFB\\t702\\t215\\t","RHEB\\tB86G1W3Bjaf-\\tGENE\\t-1\\t653\\t670\\t","TSC2\\tYkjc8ADw-rzF\\tGENE\\tkKqxit2Aj0o5\\t727\\t575\\t","4E-BP1\\tunH_CS0VjeEN\\tGENE\\t-1\\t755\\t833\\t","TSC\\tkKqxit2Aj0o5\\tFAMILY\\t-1\\t647\\t575\\t","RHEB\\t2laMuTAjiL1w\\tGENE\\t-1\\t891\\t255\\t","HIF1a\\taDLkX3Z9j92r\\tGENE\\t-1\\t755\\t918\\t","GRB10\\tx5Guo0spjf2e\\tGENE\\t-1\\t839\\t414\\t","MTOR\\tMC8l6rXMiOdd\\tGENE\\t-1\\t1074\\t255\\t","TSC\\txqEGjsx0iLFB\\tFAMILY\\t-1\\t702\\t249\\t","SQSTM1\\txQtLvkz9iNc7\\tGENE\\t-1\\t943\\t153\\t","TSC1\\tJ-ydcJGW-rzg\\tGENE\\tkKqxit2Aj0o5\\t568\\t575\\t","EGFR\\tQFhgkr8diB8z\\tGENE\\t-1\\t164\\t312\\t","PI3K\\tbHiksp77jREY\\tFAMILY\\t-1\\t560\\t414\\t","AKT\\t-Wom9AxOiG4E\\tGENE\\t-1\\t528\\t255\\t","mTORC2\\tdbgxtYHIjWfx\\tGENE\\t-1\\t478\\t493\\t","MiR21\\tGmrxvGcKjTyz\\tGENE\\t-1\\t332\\t533\\t","PIK3CA\\tGBWHCv3viEa6\\tGENE\\t-1\\t354\\t255\\t","IGF1R\\tozct1VALiSY1\\tGENE\\t-1\\t165\\t216\\t","VHL\\t0_wT5Rrrj_Rx\\tGENE\\t-1\\t935\\t919\\t","mTORC1\\tcYFqGJE4jcVJ\\tGENE\\t-1\\t653\\t750\\t","TSC2\\tj9ld37Vz-AsM\\tGENE\\txqEGjsx0iLFB\\t702\\t283\\t","PTEN\\tW2_xSgDziDku\\tGENE\\t-1\\t354\\t174\\t","AKT\\t7HbV79PdjsOU\\tFAMILY\\t-1\\t653\\t494\\t","GNB2L1\\tSfiCTcbNiA5M\\tGENE\\t-1\\t88\\t112\\t","PTEN\\twRO7VWWjjSA-\\tGENE\\t-1\\t332\\t414\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","OpzjVyUGkJHV\\tGmrxvGcKjTyz\\twRO7VWWjjSA-\\tINHIBITS","18MKxE0wiw13\\txqEGjsx0iLFB\\t2laMuTAjiL1w\\tINHIBITS","G-HTkvEckQ4C\\tB86G1W3Bjaf-\\tcYFqGJE4jcVJ\\tACTIVATES","04k9T_t2itkQ\\tW2_xSgDziDku\\tGBWHCv3viEa6\\tINHIBITS","TqPzh3WykXc5\\tunH_CS0VjeEN\\tx5Guo0spjf2e\\tACTIVATES","S7T11oBFisjk\\tQFhgkr8diB8z\\tGBWHCv3viEa6\\tACTIVATES","ahebq1NykUH5\\tunH_CS0VjeEN\\taDLkX3Z9j92r\\tACTIVATES","6najj9ABkSVJ\\tcYFqGJE4jcVJ\\tunH_CS0VjeEN\\tACTIVATES","qPyUZvk3kMq-\\tdbgxtYHIjWfx\\t7HbV79PdjsOU\\tACTIVATES","qHd1pkOTiy5k\\t2laMuTAjiL1w\\tMC8l6rXMiOdd\\tACTIVATES","aPTPKe-XkVXQ\\t0_wT5Rrrj_Rx\\taDLkX3Z9j92r\\tINHIBITS","8vMP0eF_kPj5\\tkKqxit2Aj0o5\\tB86G1W3Bjaf-\\tINHIBITS","NZt5xBGSkYb0\\tx5Guo0spjf2e\\tbHiksp77jREY\\tINHIBITS","3fJZoOEQkKNq\\tbHiksp77jREY\\tdbgxtYHIjWfx\\tACTIVATES","rAhe36tpix6d\\txQtLvkz9iNc7\\tMC8l6rXMiOdd\\tINDUCES","CAu1f-WdkHx4\\twRO7VWWjjSA-\\tbHiksp77jREY\\tINHIBITS","4vMHKnyOkLIf\\tbHiksp77jREY\\t7HbV79PdjsOU\\tACTIVATES","J7kaij8Aivlh\\t-Wom9AxOiG4E\\txqEGjsx0iLFB\\tINHIBITS","fT5lfcHziqX2\\tSfiCTcbNiA5M\\tozct1VALiSY1\\tINDUCES","_2k1_2B-iri2\\tozct1VALiSY1\\tGBWHCv3viEa6\\tACTIVATES","kxVoCQxViupL\\tGBWHCv3viEa6\\t-Wom9AxOiG4E\\tACTIVATES","7jMvZJMZkN4v\\t7HbV79PdjsOU\\tkKqxit2Aj0o5\\tINHIBITS"],"LUAD-2014-Cell-cycle-signaling-pathway":["LUAD-2014-Cell-cycle-signaling-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","CCND1\\tYWcsnrJvCMfJ\\tGENE\\tEaAZ2J517xuW\\t365\\t177\\t","RB1\\t-65hVCUu7wNj\\tGENE\\t-1\\t521\\t303\\t","CDKN2A\\tyiKTF0xl7qs-\\tGENE\\t-1\\t521\\t88\\t","CYCLINS\\tEaAZ2J517xuW\\tFAMILY\\t-1\\t521\\t177\\t","CDK4\\tpYVVzOz7CMfp\\tGENE\\tEaAZ2J517xuW\\t521\\t177\\t","Cell cycle progression\\tSBA7nphX7zI1\\tPROCESS\\t-1\\t521\\t400\\t","CCNE1\\t0FQDESQiCMfb\\tGENE\\tEaAZ2J517xuW\\t676\\t177\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","EbOzzWJa8KyF\\tEaAZ2J517xuW\\t-65hVCUu7wNj\\tINHIBITS","eB12pAOW8MCi\\t-65hVCUu7wNj\\tSBA7nphX7zI1\\tACTIVATES","u6mSj8wD8Jp9\\tyiKTF0xl7qs-\\tEaAZ2J517xuW\\tINHIBITS"],"LUAD-2014-Histone-modification-pathway":["LUAD-2014-Histone-modification-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","SETD2\\tTEmP07vg8mqu\\tGENE\\t-1\\t678\\t182\\t","ARID1B\\tZC3AHrzf8h-f\\tGENE\\t-1\\t379\\t168\\t","Histone methylation\\toQNlmw1I8ng2\\tPROCESS\\t-1\\t678\\t333\\t","ARID2\\tUWhx7SxC8jmN\\tGENE\\t-1\\t226\\t244\\t","ARID1A\\t0ddAggf58hhA\\tGENE\\t-1\\t226\\t168\\t","Nucleosome remodeling\\tkv9VBnuH8l5E\\tPROCESS\\t-1\\t306\\t341\\t","SMARCA4\\t6xqXYMOE8kSp\\tGENE\\t-1\\t379\\t244\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","7D5lYDIi83WM\\tZC3AHrzf8h-f\\tkv9VBnuH8l5E\\tACTIVATES","C0gJJbpq84Fz\\t6xqXYMOE8kSp\\tkv9VBnuH8l5E\\tACTIVATES","_MCNndis82m-\\tUWhx7SxC8jmN\\tkv9VBnuH8l5E\\tACTIVATES","fc6_K-lT85Yv\\tTEmP07vg8mqu\\toQNlmw1I8ng2\\tACTIVATES","PkwUIXyU81xJ\\t0ddAggf58hhA\\tkv9VBnuH8l5E\\tACTIVATES"],"LUAD-2014-Oxidative-stress-response-pathway":["LUAD-2014-Oxidative-stress-response-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","KEAP1\\tx6qal2M_6fp6\\tGENE\\t-1\\t292\\t147\\t","NFE2L2\\t3OAnmFLj6kBV\\tGENE\\t-1\\t381\\t244\\t","CUL3\\tax7M8UNp6gH0\\tGENE\\t-1\\t460\\t147\\t","Oxidative stress response\\tqQRuLibB6k26\\tPROCESS\\t-1\\t381\\t345\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","puzswCQS65LP\\tx6qal2M_6fp6\\t3OAnmFLj6kBV\\tINHIBITS","ASasYVxW65_T\\tax7M8UNp6gH0\\t3OAnmFLj6kBV\\tINHIBITS","5XC9ZlAR67EJ\\t3OAnmFLj6kBV\\tqQRuLibB6k26\\tINHIBITS"],"LUAD-2014-RTK-RAS-PI(3)K-pathway":["LUAD-2014-RTK-RAS-PI(3)K-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","KRAS\\thCWC-xR96DqX\\tGENE\\t0aa7a88C5GOW\\t612\\t170\\t","EGFR\\tR5V3H_6E6eEo\\tGENE\\tmFXQLvHD4isJ\\t304\\t68\\t","RAS\\t0aa7a88C5GOW\\tFAMILY\\t-1\\t690\\t202\\t","MAP2K1\\tcwgYdqrk4hBA\\tGENE\\t-1\\t690\\t439\\t","PIK3R1\\tbqBJhHco4YrE\\tGENE\\t-1\\t149\\t251\\t","TSC2\\tY9HFp8YO-n8e\\tGENE\\tEXtYcXdy4Qsz\\t470\\t384\\t","Translation\\t9M7XTM_-4WR7\\tPROCESS\\t-1\\t781\\t637\\t","AKT1\\t25v4OB1H4IlR\\tGENE\\t-1\\t393\\t279\\t","STK11\\ts7zEz-oY4ag8\\tGENE\\t-1\\t149\\t322\\t","ALK\\tpjtEjnD36eE_\\tGENE\\tmFXQLvHD4isJ\\t773\\t68\\t","AMPK\\tFyui5tkl4cr5\\tGENE\\t-1\\t149\\t390\\t","NRAS\\tnKsKU-PQ6DrJ\\tGENE\\t0aa7a88C5GOW\\t768\\t170\\t","Proliferation\\tecQpjv9Q4Urm\\tPROCESS\\t-1\\t465\\t637\\t","HRAS\\tup6fI0q16Dq0\\tGENE\\t0aa7a88C5GOW\\t612\\t233\\t","NF1\\tQkA8DtgZ4Feb\\tGENE\\t-1\\t988\\t207\\t","ERBB2\\tEXN40CQ46eDV\\tGENE\\tmFXQLvHD4isJ\\t458\\t68\\t","ROS1\\twLhuE7H66eEA\\tGENE\\tmFXQLvHD4isJ\\t1076\\t68\\t","TSC1\\tj4o-n6HA-n8F\\tGENE\\tEXtYcXdy4Qsz\\t316\\t384\\t","RIT1\\ttYpKvL066Dru\\tGENE\\t0aa7a88C5GOW\\t768\\t233\\t","RET\\tds40mB756eC4\\tGENE\\tmFXQLvHD4isJ\\t925\\t68\\t","PTEN\\tua2-F70X4XuC\\tGENE\\t-1\\t149\\t178\\t","Cell survival\\tNmj0_LZZ4VXj\\tPROCESS\\t-1\\t622\\t637\\t","MTOR\\tNCFq_dYD4Py9\\tGENE\\t-1\\t393\\t542\\t","TSC\\tEXtYcXdy4Qsz\\tFAMILY\\t-1\\t393\\t384\\t","MET\\tTXeWKOZB6eDs\\tGENE\\tmFXQLvHD4isJ\\t609\\t68\\t","BRAF\\t8-YqWx2X4f5G\\tGENE\\t-1\\t690\\t365\\t","PIK3CA\\t8Qu-Lwni4HZ-\\tGENE\\t-1\\t393\\t178\\t","RTK\\tmFXQLvHD4isJ\\tFAMILY\\t-1\\t690\\t68\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","IBP-n3fS5SVk\\tcwgYdqrk4hBA\\t9M7XTM_-4WR7\\tACTIVATES","gUN_eI4KYtT7\\tNCFq_dYD4Py9\\tecQpjv9Q4Urm\\tACTIVATES","m9Gf2Xzf5WX3\\tEXtYcXdy4Qsz\\tNCFq_dYD4Py9\\tACTIVATES","yqPnLI4M5aT7\\tFyui5tkl4cr5\\tNCFq_dYD4Py9\\tACTIVATES","lIoLBw5O5RdC\\tcwgYdqrk4hBA\\tNmj0_LZZ4VXj\\tACTIVATES","qg8iuvID5Mhz\\t0aa7a88C5GOW\\t8-YqWx2X4f5G\\tACTIVATES","o72iUn2l5c3a\\tua2-F70X4XuC\\t8Qu-Lwni4HZ-\\tINHIBITS","j1x2CWxh5Iy4\\tmFXQLvHD4isJ\\t0aa7a88C5GOW\\tACTIVATES","EuuexlE5Y05b\\tNCFq_dYD4Py9\\t9M7XTM_-4WR7\\tACTIVATES","8Uu5IYEq5KQg\\tQkA8DtgZ4Feb\\t0aa7a88C5GOW\\tINHIBITS","2pXFnqhL5OzR\\tcwgYdqrk4hBA\\tecQpjv9Q4Urm\\tACTIVATES","gE5bPX0c5VDK\\t25v4OB1H4IlR\\tEXtYcXdy4Qsz\\tINHIBITS","HshnmzcdYu-I\\tNCFq_dYD4Py9\\tNmj0_LZZ4VXj\\tACTIVATES","UuK2Sd1m5T5a\\t8Qu-Lwni4HZ-\\t25v4OB1H4IlR\\tACTIVATES","pSaMDCCD5eRf\\tbqBJhHco4YrE\\t8Qu-Lwni4HZ-\\tINHIBITS","6eV4lZbQYv3r\\tNCFq_dYD4Py9\\tNmj0_LZZ4VXj\\tACTIVATES","VFskMcwI5bY7\\ts7zEz-oY4ag8\\tFyui5tkl4cr5\\tACTIVATES","zPkLVdf35NoU\\t8-YqWx2X4f5G\\tcwgYdqrk4hBA\\tACTIVATES"],"LUAD-2014-TP53-pathway":["LUAD-2014-TP53-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","TP53\\tCQjbRdgs7ItD\\tGENE\\t-1\\t436\\t249\\t","Cell survival\\tSVkWhzV37N80\\tPROCESS\\t-1\\t510\\t348\\t","Proliferation\\tfz0X8H7D7J7L\\tPROCESS\\t-1\\t342\\t347\\t","ATM\\tgjYBW9Ea7HZc\\tGENE\\t-1\\t510\\t151\\t","MDM2\\tSdbPatXY7HDu\\tGENE\\t-1\\t342\\t151\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","npAcARys7a_k\\tCQjbRdgs7ItD\\tSVkWhzV37N80\\tINHIBITS","VGJAIfU07X_O\\tSdbPatXY7HDu\\tCQjbRdgs7ItD\\tINHIBITS","yaRRpgbw7aKj\\tCQjbRdgs7ItD\\tfz0X8H7D7J7L\\tINHIBITS","6yEDoser7Y_S\\tgjYBW9Ea7HZc\\tCQjbRdgs7ItD\\tACTIVATES"],"LUSC-2012-Notch-signaling-pathway":["LUSC-2012-Notch-signaling-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","TP63\\tjwpnNGJWSGmo\\tGENE\\t-1\\t665\\t118\\t","NOTCH1\\tuCLr0FZ-DVjI\\tGENE\\tqDU9qUkVWgQy\\t307\\t245\\t","NOTCH\\tqDU9qUkVWgQy\\tFAMILY\\t-1\\t385\\t245\\t","FOXP1\\tOQXnexCbWaQC\\tGENE\\t-1\\t781\\t245\\t","NOTCH2\\t8xqf1lEoDVjf\\tGENE\\tqDU9qUkVWgQy\\t462\\t245\\t","SOX2\\tz9OhKjOpSGPy\\tGENE\\t-1\\t392\\t118\\t","ASCL4\\tB7vcA7ATWYcn\\tGENE\\t-1\\t624\\t245\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","PLEAy9rIWrEw\\tz9OhKjOpSGPy\\tqDU9qUkVWgQy\\tINHIBITS","JC1sUBM-WtKp\\tz9OhKjOpSGPy\\tB7vcA7ATWYcn\\tINHIBITS","lP_hmn57Wt5k\\tz9OhKjOpSGPy\\tOQXnexCbWaQC\\tINHIBITS","NJbf1vyhWr_5\\tjwpnNGJWSGmo\\tqDU9qUkVWgQy\\tINHIBITS"],"LUSC-2012-Oxidative-stress-response-pathway":["LUSC-2012-Oxidative-stress-response-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","CUL3\\tlReeCCfNRhiB\\tGENE\\t-1\\t567\\t154\\t","NFE2L2\\tb31Gx6nxRij2\\tGENE\\t-1\\t480\\t256\\t","KEAP1\\t74W2ldwARhHq\\tGENE\\t-1\\t381\\t154\\t","Oxidative stress response\\tHZ9RxRrPRkFz\\tPROCESS\\t-1\\t480\\t363\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","RQOk_9p-Rv2F\\tb31Gx6nxRij2\\tHZ9RxRrPRkFz\\tACTIVATES","CT9Gtmm5Rqtm\\t74W2ldwARhHq\\tb31Gx6nxRij2\\tINHIBITS","HHBAbZS1Rto5\\tlReeCCfNRhiB\\tb31Gx6nxRij2\\tINHIBITS"],"LUSC-2012-RTK-RAS-PI(3)K-pathway":["LUSC-2012-RTK-RAS-PI(3)K-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","FGFR1\\tMvptxoO61bRr\\tGENE\\tyiHWlSi0ZceY\\t1097\\t185\\t","KRAS\\tsWfNqwir1dxE\\tGENE\\twfQD-GssZd01\\t894\\t292\\t","PTEN\\tZymRaEU8XIRY\\tGENE\\t-1\\t188\\t185\\t","ERBB3\\tRm4wq0_z1bQa\\tGENE\\tyiHWlSi0ZceY\\t936\\t185\\t","Proliferation\\tP8EboRv6ZME9\\tPROCESS\\t-1\\t494\\t543\\t","AMPK\\t02umJdNsXOpl\\tGENE\\t-1\\t42\\t405\\t","RTK\\tyiHWlSi0ZceY\\tFAMILY\\t-1\\t1023\\t185\\t","AKT\\toxyofYva1T05\\tFAMILY\\t-1\\t389\\t292\\t","AKT2\\tlarrnE_S1WJv\\tGENE\\toxyofYva1T05\\t389\\t292\\t","RAS\\twfQD-GssZd01\\tFAMILY\\t-1\\t894\\t292\\t","Translation\\tHR4vBeq2ZNsn\\tPROCESS\\t-1\\t798\\t543\\t","NF1\\tiabVj2PwYZp2\\tGENE\\t-1\\t1250\\t339\\t","FGFR3\\t2C2nCxu91bRd\\tGENE\\tyiHWlSi0ZceY\\t1424\\t185\\t","STK11\\tO4y17G4EXLUD\\tGENE\\t-1\\t-49\\t300\\t","EGFR\\tAx89UA0r1bQ9\\tGENE\\tyiHWlSi0ZceY\\t622\\t185\\t","TSC2\\tzY7tgwSJ1XbR\\tGENE\\tqLC0RZ4XXsZX\\t403\\t380\\t","TSC\\tqLC0RZ4XXsZX\\tFAMILY\\t-1\\t324\\t380\\t","MTOR\\t9xgTtYW2XQeX\\tGENE\\t-1\\t147\\t480\\t","RASA1\\tDvdwOn2xYWd3\\tGENE\\t-1\\t1250\\t270\\t","AKT3\\tzzXDUqB91WKC\\tGENE\\toxyofYva1T05\\t546\\t292\\t","FGFR2\\tXUUZCJbJ1bRO\\tGENE\\tyiHWlSi0ZceY\\t1259\\t185\\t","PI3K\\tFq9ew-K6XKj-\\tFAMILY\\t-1\\t383\\t185\\t","NRAS\\tW0krGYlI1dxY\\tGENE\\twfQD-GssZd01\\t1054\\t292\\t","ERBB2\\ttKS__G_N1bQt\\tGENE\\tyiHWlSi0ZceY\\t780\\t185\\t","AKT1\\tO_LJqz4I1WJd\\tGENE\\toxyofYva1T05\\t232\\t292\\t","HRAS\\tXIj4ze_l1dxl\\tGENE\\twfQD-GssZd01\\t734\\t292\\t","Cell survival\\tnNugUqXiZNB6\\tPROCESS\\t-1\\t644\\t543\\t","BRAF\\tT1CL0I79YgGR\\tGENE\\t-1\\t894\\t405\\t","PIK3CA\\tcykG-Tsv1fu4\\tGENE\\tFq9ew-K6XKj-\\t383\\t185\\t","TSC1\\t1paUtI_G1Xbd\\tGENE\\tqLC0RZ4XXsZX\\t245\\t380\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","QLi86o6iaTAU\\tT1CL0I79YgGR\\tnNugUqXiZNB6\\tACTIVATES","gB5T8yfp3IU3\\t9xgTtYW2XQeX\\tHR4vBeq2ZNsn\\tACTIVATES","sXH_uS-e1T1m\\toxyofYva1T05\\tHR4vBeq2ZNsn\\tACTIVATES","WUv8Ij4AaR-n\\tT1CL0I79YgGR\\tP8EboRv6ZME9\\tACTIVATES","RCM2k2xJ1T1r\\toxyofYva1T05\\tqLC0RZ4XXsZX\\tINHIBITS","4bGJbkzlaO_3\\tDvdwOn2xYWd3\\twfQD-GssZd01\\tINHIBITS","awuopxpi1T1c\\toxyofYva1T05\\tP8EboRv6ZME9\\tACTIVATES","WURhbp8YX5ol\\tO4y17G4EXLUD\\t02umJdNsXOpl\\tACTIVATES","fTcRATeQaEYa\\twfQD-GssZd01\\tT1CL0I79YgGR\\tACTIVATES","-RCFsGxvaQmo\\tiabVj2PwYZp2\\twfQD-GssZd01\\tINHIBITS","9dW1i3sN3Gtu\\t9xgTtYW2XQeX\\tP8EboRv6ZME9\\tACTIVATES","Uc5AjjxV3HcN\\t9xgTtYW2XQeX\\tnNugUqXiZNB6\\tACTIVATES","vYmJjY8pX14b\\tZymRaEU8XIRY\\tFq9ew-K6XKj-\\tINHIBITS","pzSfIS3bX6g_\\t02umJdNsXOpl\\t9xgTtYW2XQeX\\tACTIVATES","3eElg70UaNdN\\tyiHWlSi0ZceY\\twfQD-GssZd01\\tACTIVATES","-GLnxzAk1T1w\\toxyofYva1T05\\tnNugUqXiZNB6\\tACTIVATES","eDF8oz7ZaT8J\\tT1CL0I79YgGR\\tHR4vBeq2ZNsn\\tACTIVATES","vecmsBiI1T1S\\tFq9ew-K6XKj-\\toxyofYva1T05\\tACTIVATES"],"MYC":["MYC","","Involves a number of transcription regulation complexes: MYC-MAX, MAX-MXD, MAX-MGA, and the energy sensing, MondoA-Mlx complex in the regulation of apoptotic response and cell differentiation.","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","MXD1\\tYd6m7-sCeh37\\tGENE\\tTrTubnzSeh3h\\t151\\t436","MXD4\\tplDFXS0peh30\\tGENE\\tTrTubnzSeh3h\\t488\\t436","MXI1\\tdNmw_8oVeh3k\\tGENE\\tTrTubnzSeh3h\\t651\\t436","MGA\\tGt92f6Iyeh3a\\tGENE\\tLwRHv9NUeh3R\\t580\\t310","MYC/MAX Complex\\tOCJ3wBBPeh4J\\tCOMPLEX\\t-1\\t479\\t172","MYC\\tKDr5caJdeh4X\\tGENE\\tOCJ3wBBPeh4J\\t313\\t172","MYCL\\tm1nG2P8zeh4p\\tGENE\\tOCJ3wBBPeh4J\\t645\\t173","MLXIPL\\t6ZvsmDKBeh3H\\tGENE\\tIuhA7dyleh3B\\t571\\t658","MAX/MXD Complex\\tTrTubnzSeh3h\\tCOMPLEX\\t-1\\t483\\t436","MAX\\tyGKkO3Ajeh3V\\tGENE\\tLwRHv9NUeh3R\\t344\\t310","MXD3\\ta19O0LiCeh3p\\tGENE\\tTrTubnzSeh3h\\t323\\t436","MLXIP\\tO9V1RuKxeh3K\\tGENE\\tIuhA7dyleh3B\\t395\\t656","MLX\\teH1TNcCVeh3F\\tGENE\\tIuhA7dyleh3B\\t490\\t550","MYCN\\tMn3yUjZveh4v\\tGENE\\tOCJ3wBBPeh4J\\t478\\t173","MLX/MONDO Complex\\tIuhA7dyleh3B\\tCOMPLEX\\t-1\\t483\\t604","MNT\\tmfvZ3Tqreh3u\\tGENE\\tTrTubnzSeh3h\\t815\\t436","MAX/MGA Complex\\tLwRHv9NUeh3R\\tCOMPLEX\\t-1\\t462\\t310","Cell growth, proliferation, apoptosis\\trU4TiKfKeh43\\tPROCESS\\t-1\\t-237\\t433","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPEINTERACTION_PUBMED_ID","w4MBdulYeh48\\tOCJ3wBBPeh4J\\tyGKkO3Ajeh3V\\tBINDS\\t","kmXInTa9eh5O\\t6ZvsmDKBeh3H\\teH1TNcCVeh3F\\tBINDS\\t","Hv8GfgZPeh5T\\tyGKkO3Ajeh3V\\tGt92f6Iyeh3a\\tNONE\\t","9h-taWpfeh5Z\\tLwRHv9NUeh3R\\trU4TiKfKeh43\\tINHIBITS\\t","eTpDGcg6eh5B\\tOCJ3wBBPeh4J\\trU4TiKfKeh43\\tACTIVATES\\t","mfpvepQNeh5c\\tTrTubnzSeh3h\\tIuhA7dyleh3B\\tBINDS\\t","QJOD8bddeh5I\\tIuhA7dyleh3B\\trU4TiKfKeh43\\tACTIVATES\\t","9ShDYkfTeh5Q\\tO9V1RuKxeh3K\\teH1TNcCVeh3F\\tBINDS\\t","Vfrm_1Ezeh5E\\tTrTubnzSeh3h\\trU4TiKfKeh43\\tINHIBITS\\t","nrV2aZn8eh5L\\tyGKkO3Ajeh3V\\tTrTubnzSeh3h\\tBINDS\\t"],"NOTCH":["NOTCH","","Pathway involved in cell-cell communication, cell fate. Cleavage of Notch receptors leads to the displacement of a transcription repressor complex on RBPJ (a transcription factor also known as CSL) accompanied by recruitment of an activation complex (including MAMLs) leads to transcription of Notch target genes.","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","NRARP\\tIyt-kiQdVYR4\\tGENE\\t-1\\t1392\\t357","CUL1\\tORzx_8_5UAjR\\tGENE\\t-1\\t861\\t171","CREBBP\\thrOQVgOCWtHH\\tGENE\\tamGWWOzfWrg1\\t1006\\t344","NCOR2\\ttRKlqV2HWQET\\tGENE\\t1WQdsd0RVSHH\\t919\\t500","SPEN\\tt3mLgYfBWQD4\\tGENE\\t1WQdsd0RVSHH\\t1078\\t439","NOTCH3\\t2YXLvEuJWVnS\\tGENE\\tfLn2ytnZVU-1\\t386\\t344"," \\tamGWWOzfWrg1\\tCOMPLEX\\t-1\\t1089\\t309","CNTN6\\t8xDiqqMtUlgK\\tGENE\\t-1\\t153\\t344","HES-X\\tCCp9TqYNVWpA\\tGENE\\t-1\\t1392\\t221","KAT2B\\tW6JlNq1wWtHA\\tGENE\\tamGWWOzfWrg1\\t1171\\t274","KDM5A\\tTHgZUx73WQED\\tGENE\\t1WQdsd0RVSHH\\t1240\\t439","DNER\\t8lwlJT8zUt7J\\tGENE\\t-1\\t386\\t439","NCOR1\\tVh9n-uUkWQDu\\tGENE\\t1WQdsd0RVSHH\\t917\\t440","CLEAVED NOTCH\\tH-nBa6GpUrhI\\tCOMPLEX\\t-1\\t781\\t316","FBXW7\\t5nfQJAxjT_z9\\tGENE\\t-1\\t630\\t171"," \\t1WQdsd0RVSHH\\tFAMILY\\t-1\\t1079\\t469","NOTCH1\\tVG_45lkLWVm6\\tGENE\\tfLn2ytnZVU-1\\t386\\t274","MALM3\\tdAIql3LLWtG5\\tGENE\\tamGWWOzfWrg1\\t1007\\t274","NOV\\tfhalsWFrUkbl\\tGENE\\t-1\\t153\\t274","JAG2\\tEjlh1U2VT-P2\\tGENE\\t-1\\t285\\t171"," \\tfLn2ytnZVU-1\\tCOMPLEX\\t-1\\t472\\t309","HEY-X\\t0mJB_ECxVXFr\\tGENE\\t-1\\t1392\\t288","PSEN2\\tXzuk75kgUufI\\tGENE\\t-1\\t558\\t439","EP300\\tq34LVe78WtHT\\tGENE\\tamGWWOzfWrg1\\t1170\\t344","NOTCH2\\tYBZcjlo4WVnH\\tGENE\\tfLn2ytnZVU-1\\t558\\t274","ARRDC1\\tQj8O9GJNT_AD\\tGENE\\t-1\\t454\\t171","NOTCH4\\tQf89YkiEWVne\\tGENE\\tfLn2ytnZVU-1\\t558\\t344","Cell growth, apoptosis\\tNvu3J1djU_IC\\tPROCESS\\t-1\\t1562\\t439","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPEINTERACTION_PUBMED_ID","3ZGBwutXWvCf\\t1WQdsd0RVSHH\\tamGWWOzfWrg1\\tINHIBITS\\t","ojk1D4nOWbct\\tEjlh1U2VT-P2\\tfLn2ytnZVU-1\\tACTIVATES\\t","U40tVKQcWjcm\\tXzuk75kgUufI\\tfLn2ytnZVU-1\\tACTIVATES\\t","qgZ5w26hWm8v\\t8xDiqqMtUlgK\\tfLn2ytnZVU-1\\tINHIBITS\\t","xzRJacuuWiP-\\t5nfQJAxjT_z9\\tH-nBa6GpUrhI\\tINHIBITS\\t","_RaZlGxreARX\\tIyt-kiQdVYR4\\tNvu3J1djU_IC\\tINHIBITS\\t","6YudlCKlWygq\\tamGWWOzfWrg1\\tCCp9TqYNVWpA\\tACTIVATES\\t","6YYOMrO7W1Lu\\tamGWWOzfWrg1\\tIyt-kiQdVYR4\\tACTIVATES\\t","y9nj-EHqWlEU\\tfhalsWFrUkbl\\tfLn2ytnZVU-1\\tINHIBITS\\t","QgTnL-0zWfX-\\t8lwlJT8zUt7J\\tfLn2ytnZVU-1\\tACTIVATES\\t","YvuJzpCJWoS3\\tORzx_8_5UAjR\\t5nfQJAxjT_z9\\tACTIVATES\\t","QWoJOCVzW3SR\\t0mJB_ECxVXFr\\tNvu3J1djU_IC\\tACTIVATES\\t","9I6RH1JoWwwW\\tH-nBa6GpUrhI\\tamGWWOzfWrg1\\tACTIVATES\\t","4oG8A9OTWz_Z\\tamGWWOzfWrg1\\t0mJB_ECxVXFr\\tACTIVATES\\t","WZmI2ceJWg0e\\tQj8O9GJNT_AD\\tfLn2ytnZVU-1\\tINHIBITS\\t","U1KCxbf0W2Wy\\tCCp9TqYNVWpA\\tNvu3J1djU_IC\\tACTIVATES\\t"],"NRF2":["NRF2","","Involves the regulation of the transcription factor NFE2L2 by KEAP1. NFE2L2 regulates genes with the antioxidant response elements (ARE) that aid in cellular response against oxidative stress thought to aid in cancer chemoresistance.","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","KEAP1\\tOkLgTv_3eszi\\tGENE\\t-1\\t294\\t147","CUL3\\tpxCvh_ojeszm\\tGENE\\t-1\\t469\\t147","Oxidative Stress Response\\tE9bpVpoWeszr\\tPROCESS\\t-1\\t598\\t240","NFE2L2\\tsKw8nuDgeszp\\tGENE\\t-1\\t385\\t240","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPEINTERACTION_PUBMED_ID","wIxLZx13eszt\\tOkLgTv_3eszi\\tsKw8nuDgeszp\\tINHIBITS\\t","aWKwI8rJesz1\\tsKw8nuDgeszp\\tE9bpVpoWeszr\\tACTIVATES\\t","Ng79Bysjeszx\\tpxCvh_ojeszm\\tsKw8nuDgeszp\\tINHIBITS\\t"],"OV-2011-Cell-cycle-signaling-pathway":["OV-2011-Cell-cycle-signaling-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","CDKN2A\\toN50crvCRjmK\\tGENE\\t-1\\t635\\t68\\t","RB1\\ttJj5RrqJRq1h\\tGENE\\t-1\\t635\\t299\\t","CCNE1\\tSx3IX8ExBTXu\\tGENE\\tFY8bF0WdRsru\\t639\\t148\\t","CCND1\\tBIDGlk8LBTX9\\tGENE\\tFY8bF0WdRsru\\t550\\t207\\t","CYCLINS\\tFY8bF0WdRsru\\tFAMILY\\t-1\\t634\\t177\\t","Cell cycle progression\\tnnswnmMyRv3y\\tPROCESS\\t-1\\t635\\t373\\t","CCND2\\tIxg8lLJLBTXd\\tGENE\\tFY8bF0WdRsru\\t719\\t207\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","duEMY1UXR86v\\tFY8bF0WdRsru\\ttJj5RrqJRq1h\\tINHIBITS","__OC9xbiR-Fr\\ttJj5RrqJRq1h\\tnnswnmMyRv3y\\tACTIVATES","VqDZTZnER7cZ\\toN50crvCRjmK\\tFY8bF0WdRsru\\tINHIBITS"],"OV-2011-Notch-signaling-pathway":["OV-2011-Notch-signaling-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","MAML3\\twTL7UE_SDIWe\\tGENE\\tZ64sAxBCSrsH\\t800\\t380\\t","JAG1\\tEy82kzAQDKzS\\tGENE\\tHPXERf3USgjx\\t462\\t280\\t","MAML1\\tICfP9aB2DIWS\\tGENE\\tZ64sAxBCSrsH\\t800\\t247\\t","JAG2\\tFvIadI1RDKzA\\tGENE\\tHPXERf3USgjx\\t462\\t351\\t","JAG\\tHPXERf3USgjx\\tFAMILY\\t-1\\t462\\t315\\t","NOTCH3\\txiGB_3VdSfd3\\tGENE\\t-1\\t632\\t316\\t","MAML2\\t9xWqi9JKDIWF\\tGENE\\tZ64sAxBCSrsH\\t800\\t314\\t","MAML\\tZ64sAxBCSrsH\\tFAMILY\\t-1\\t800\\t314\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","osh5OcaxTA2q\\tHPXERf3USgjx\\txiGB_3VdSfd3\\tINHIBITS","AivX6u8YTCYD\\tZ64sAxBCSrsH\\txiGB_3VdSfd3\\tINHIBITS"],"OV-2011-RTK-RAS-PI(3)K-pathway":["OV-2011-RTK-RAS-PI(3)K-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","KRAS\\t4SZmwk65Q2AX\\tGENE\\t-1\\t529\\t119\\t","AKT\\tJXx22AmtmHua\\tFAMILY\\t-1\\t263\\t234\\t","AKT2\\t1QP6Io9jmSsb\\tGENE\\tJXx22AmtmHua\\t263\\t203\\t","NF1\\tbKlDARX_QzeJ\\tGENE\\t-1\\t529\\t41\\t","Proliferation/survival\\teyOUahBEQth7\\tPROCESS\\t-1\\t413\\t402\\t","AKT1\\tpw2OFJfHmSsq\\tGENE\\tJXx22AmtmHua\\t263\\t265\\t","PTEN\\tqx1xPdYgQgUA\\tGENE\\t-1\\t263\\t41\\t","BRAF\\tXLdjd_rNQ5TF\\tGENE\\t-1\\t529\\t239\\t","PIK3CA\\t9WGkKXm-QhuR\\tGENE\\t-1\\t263\\t119\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","lwcl1MvdmPEO\\tJXx22AmtmHua\\teyOUahBEQth7\\tACTIVATES","6CO_N8liRIA4\\tbKlDARX_QzeJ\\t4SZmwk65Q2AX\\tINHIBITS","TDBL0RUZRJb3\\t4SZmwk65Q2AX\\tXLdjd_rNQ5TF\\tACTIVATES","uXgITAznRMO2\\tXLdjd_rNQ5TF\\teyOUahBEQth7\\tACTIVATES","vkkqRMcgQ90m\\t4SZmwk65Q2AX\\t9WGkKXm-QhuR\\tACTIVATES","oxMyRc9ImLT_\\t9WGkKXm-QhuR\\tJXx22AmtmHua\\tACTIVATES","_9kjQAkpdEP0\\tqx1xPdYgQgUA\\t9WGkKXm-QhuR\\tINHIBITS"],"PI3K":["PI3K","","A signaling cascade involving PI3K phosphorylation of AKT leading to the activation of the mTORC1 complex. The mTORC1 functions as a metabolic sensor and controls protein abundance by affecting processes involved in protein production and RNA translation leading to changes in cell growth and survival.","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","AKT3\\teWz9lexke0kY\\tGENE\\tyEOAK96Ye0j-\\t752\\t327","RPTOR\\tKHzd_YdNe0jd\\tGENE\\tJKE-mm1le0jZ\\t759\\t730","PIK3CA\\tBpH76ff7e0iw\\tGENE\\t-1\\t595\\t176","PIK3R2\\t5lBs8QfFe0i_\\tGENE\\tiK4blWyDe0i1\\t804\\t167","RHEB\\t8eeCwYTqe0jC\\tGENE\\t-1\\t599\\t619","PIK3R\\tiK4blWyDe0i1\\tFAMILY\\t-1\\t804\\t166","AKT\\tyEOAK96Ye0j-\\tFAMILY\\t-1\\t594\\t327","mTORC2\\tMMeMHe4ze0kj\\tFAMILY\\t-1\\t421\\t730","TSC\\t3b8rKMrke0jF\\tFAMILY\\t-1\\t596\\t486","AKT2\\t9o76blkNe0kR\\tGENE\\tyEOAK96Ye0j-\\t594\\t327","mTORC1\\tJKE-mm1le0jZ\\tFAMILY\\t-1\\t678\\t730","PPP2R1A\\tHY1OO1uEe0jv\\tGENE\\t-1\\t971\\t326","PIK3R3\\tGy1IflZce0i5\\tGENE\\tiK4blWyDe0i1\\t804\\t227","PTEN\\tHL_nLOSce0jV\\tGENE\\t-1\\t594\\t91","MTOR\\t_WbyV7oYe0jj\\tGENE\\tJKE-mm1le0jZ\\t597\\t730","PIK3R1\\tj_DI0z3Xe0i8\\tGENE\\tiK4blWyDe0i1\\t804\\t106","Cell growth\\t_wytH85He0jQ\\tPROCESS\\t-1\\t601\\t860","INPP4B\\t2ZOWMzsce0j4\\tGENE\\t-1\\t372\\t178","TSC1\\tx2juQzTie0jM\\tGENE\\t3b8rKMrke0jF\\t596\\t459","TSC2\\tzs4f_I93e0jJ\\tGENE\\t3b8rKMrke0jF\\t596\\t513","RICTOR\\tDg3B9H1Me0ks\\tGENE\\tMMeMHe4ze0kj\\t421\\t730","AKT1\\tTDuOMRUee0kH\\tGENE\\tyEOAK96Ye0j-\\t437\\t327","STK11\\tURGrIXe2e0kd\\tGENE\\t-1\\t336\\t483","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPEINTERACTION_PUBMED_ID","an7n5soQe0k8\\tyEOAK96Ye0j-\\t3b8rKMrke0jF\\tINHIBITS\\t","YeQpbZw0e0lG\\t3b8rKMrke0jF\\t8eeCwYTqe0jC\\tINHIBITS\\t","wjtVfwEee0lB\\tJKE-mm1le0jZ\\t_wytH85He0jQ\\tACTIVATES\\t","6Mr0F0gAe0lD\\tURGrIXe2e0kd\\t3b8rKMrke0jF\\tACTIVATES\\t","EigHAJh7e0lI\\tHL_nLOSce0jV\\tBpH76ff7e0iw\\tINHIBITS\\t","s7B8LZsde0k-\\tBpH76ff7e0iw\\tyEOAK96Ye0j-\\tACTIVATES\\t","1T4VmG08e0lL\\tiK4blWyDe0i1\\tBpH76ff7e0iw\\tINHIBITS\\t","3yNlj0Tge0k2\\t8eeCwYTqe0jC\\tJKE-mm1le0jZ\\tACTIVATES\\t","NuGuIugXe0k6\\t2ZOWMzsce0j4\\tBpH76ff7e0iw\\tINHIBITS\\t","pYhyONrDe0lP\\tDg3B9H1Me0ks\\tURGrIXe2e0kd\\tACTIVATES\\t","h-JnEMgBe0lN\\tHY1OO1uEe0jv\\tyEOAK96Ye0j-\\tINHIBITS\\t"],"RTK-RAS":["RTK-RAS","","A signaling cascade pathway initiated by activation of RTKs followed signal transduction through Ras then Raf and then MEK family members. This cascade leads to the activation of several transcription factors that regulate processes involving cell proliferation and survival.","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","NRAS\\tQHZo7kkDfrMO\\tGENE\\tb8V1sXZDfrL1\\t1142\\t348","ROS1\\ttNj2tohofrKR\\tGENE\\t8tMooF5vfrKJ\\t664\\t166","KIT\\tgWlRUSfzfrKt\\tGENE\\t8tMooF5vfrKJ\\t1142\\t104","Translation\\t7CK2REgNfrKF\\tPROCESS\\t-1\\t881\\t625","PTPN11\\tjTtQAhJrfrJx\\tGENE\\t-1\\t504\\t348","RAS\\tb8V1sXZDfrL1\\tFAMILY\\t-1\\t1063\\t348","RET\\tyjRzsMVifrKy\\tGENE\\t8tMooF5vfrKJ\\t504\\t166","CBL\\t0a_o8sXafrJh\\tGENE\\t-1\\t504\\t262","Proliferation\\t3VFXQGLzfrJ-\\tPROCESS\\t-1\\t559\\t626","FLT3\\tIpmlW5vMfrLc\\tGENE\\t8tMooF5vfrKJ\\t982\\t166","NF1\\t59lXGxKMfrJn\\tGENE\\t-1\\t1142\\t262","NTRK2\\t5SlBGbo1frLr\\tGENE\\t8tMooF5vfrKJ\\t1302\\t166","ERRFI1\\t-V-9_6fAfrJj\\tGENE\\t-1\\t664\\t262","ARAF\\tcBahXkGvfrMn\\tGENE\\tsApg3-IVfrMe\\t982\\t429","FGFR3\\t1EucZO9pfrLJ\\tGENE\\t8tMooF5vfrKJ\\t824\\t104","HRAS\\tBB8hBTZ4frME\\tGENE\\tb8V1sXZDfrL1\\t982\\t348","MET\\t_yKldPkzfrKZ\\tGENE\\t8tMooF5vfrKJ\\t1142\\t41","RAF1\\tLk9sb9wzfrM5\\tGENE\\tsApg3-IVfrMe\\t1302\\t429","RAC1\\tzDRSUmjffrJ7\\tGENE\\t-1\\t614\\t511","FGFR1\\tRFZ2wD4YfrKf\\tGENE\\t8tMooF5vfrKJ\\t504\\t104","MEK\\t3psJQJmGfrJV\\tFAMILY\\t-1\\t1062\\t511","FGFR2\\tnTecsKLYfrKj\\tGENE\\t8tMooF5vfrKJ\\t664\\t104","KRAS\\te8tWMLoVfrL9\\tGENE\\tb8V1sXZDfrL1\\t824\\t348","BRAF\\tNM12nD_nfrMx\\tGENE\\tsApg3-IVfrMe\\t1142\\t429","ERBB2\\tC45Adl13frKV\\tGENE\\t8tMooF5vfrKJ\\t664\\t41","ERBB4\\tZ-e0kCBwfrKN\\tGENE\\t8tMooF5vfrKJ\\t982\\t41","MAPK1\\tR9ZNAxVRfrJ3\\tGENE\\t-1\\t783\\t511","RAF\\tsApg3-IVfrMe\\tFAMILY\\t-1\\t1142\\t429","EGFR\\t9Psi8emvfrK3\\tGENE\\t8tMooF5vfrKJ\\t504\\t41","RASA1\\tZSZjKexZfrJ0\\tGENE\\t-1\\t1301\\t262","FGFR4\\tMfs6mvKHfrKo\\tGENE\\t8tMooF5vfrKJ\\t982\\t104","IGF1R\\tCvsyhyzdfrLQ\\tGENE\\t8tMooF5vfrKJ\\t1302\\t104","ERBB3\\trORV55VHfrK9\\tGENE\\t8tMooF5vfrKJ\\t824\\t41","Cell survival\\tvmWLLGP3frKC\\tPROCESS\\t-1\\t718\\t626","SOS1\\tbdPjTyaDfrJu\\tGENE\\t-1\\t982\\t262","RIT1\\tpTVg5xU2frMW\\tGENE\\tb8V1sXZDfrL1\\t1302\\t348","MAP2K2\\tgqrpYTM0frJa\\tGENE\\t3psJQJmGfrJV\\t1142\\t511","ALK\\t1o_9LYSFfrLV\\tGENE\\t8tMooF5vfrKJ\\t824\\t166","NTRK1\\tT6ceghhpfrLj\\tGENE\\t8tMooF5vfrKJ\\t1142\\t166","RTKs\\t8tMooF5vfrKJ\\tFAMILY\\t-1\\t903\\t103","PDGFRA\\ty8PZ8iiyfrLD\\tGENE\\t8tMooF5vfrKJ\\t1302\\t41","MAP2K1\\tQ2i0HY0HfrJe\\tGENE\\t3psJQJmGfrJV\\t982\\t511","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPEINTERACTION_PUBMED_ID","Rokn-zgqfrNN\\t-V-9_6fAfrJj\\t8tMooF5vfrKJ\\tINHIBITS\\t","BvZejKrrfrNX\\t59lXGxKMfrJn\\tb8V1sXZDfrL1\\tINHIBITS\\t","CEWkH2kYfrNa\\tZSZjKexZfrJ0\\tb8V1sXZDfrL1\\tINHIBITS\\t","In_EmpIgfrNv\\tR9ZNAxVRfrJ3\\t7CK2REgNfrKF\\tACTIVATES\\t","NYpLslu-frNh\\tsApg3-IVfrMe\\t3psJQJmGfrJV\\tACTIVATES\\t","8OWp0SRTfrNm\\tzDRSUmjffrJ7\\tR9ZNAxVRfrJ3\\tACTIVATES\\t","OnjXx-jmfrNk\\t3psJQJmGfrJV\\tR9ZNAxVRfrJ3\\tACTIVATES\\t","HPbM8huafrNU\\tbdPjTyaDfrJu\\tb8V1sXZDfrL1\\tACTIVATES\\t","qtmobl6_frNF\\t0a_o8sXafrJh\\t8tMooF5vfrKJ\\tINHIBITS\\t","8EmU4xtSfrNo\\tR9ZNAxVRfrJ3\\t3VFXQGLzfrJ-\\tACTIVATES\\t","n_C1QGZ2frNr\\tR9ZNAxVRfrJ3\\tvmWLLGP3frKC\\tACTIVATES\\t","vQrHXLexfrNR\\t8tMooF5vfrKJ\\tbdPjTyaDfrJu\\tACTIVATES\\t","gs6EgVUcfrNd\\tb8V1sXZDfrL1\\tsApg3-IVfrMe\\tACTIVATES\\t"],"SKCM-2015-Cell-cycle-signaling-pathway":["SKCM-2015-Cell-cycle-signaling-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","CDKN2A\\tnpKTJggFJS4I\\tGENE\\t-1\\t442\\t89\\t","CYCLINS\\tIba11JzIJVxh\\tFAMILY\\t-1\\t520\\t175\\t","CDK4\\tWcN_CcOrC9iS\\tGENE\\tIba11JzIJVxh\\t442\\t175\\t","E2F\\tXI_rBXYxJXPk\\tGENE\\t-1\\t520\\t372\\t","CCND1\\tv_gEFTZBC9il\\tGENE\\tIba11JzIJVxh\\t599\\t175\\t","Cell cycle progression\\te_ZEQUYtJz1B\\tPROCESS\\t-1\\t520\\t484\\t","RB1\\t4vxRSXTEJWO8\\tGENE\\t-1\\t520\\t276\\t","CDKN2B\\tuK5CVzIeJayA\\tGENE\\t-1\\t599\\t89\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","vJf6xitbJwIp\\tnpKTJggFJS4I\\tIba11JzIJVxh\\tINHIBITS","MrgZ3psqKpK7\\tXI_rBXYxJXPk\\te_ZEQUYtJz1B\\tACTIVATES","fQLLdtj0JzEP\\t4vxRSXTEJWO8\\tXI_rBXYxJXPk\\tINHIBITS","Msdh3q6kJxC4\\tuK5CVzIeJayA\\tIba11JzIJVxh\\tINHIBITS","vjchZOt9JyOV\\tIba11JzIJVxh\\t4vxRSXTEJWO8\\tINHIBITS"],"SKCM-2015-Histone-modification-pathway":["SKCM-2015-Histone-modification-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","AURKA\\tUUHLK2LeLlq4\\tGENE\\t-1\\t425\\t166\\t","PPP6C\\tyZeIXzgALlHL\\tGENE\\t-1\\t231\\t166\\t","ARID2\\t4dCj0PbWLn10\\tGENE\\t-1\\t425\\t308\\t","Genetic stability\\txWY6P0idNRza\\tPROCESS\\t-1\\t624\\t195\\t","Chromatin remodeling\\t-c29Xam0NfMu\\tPROCESS\\t-1\\t231\\t263\\t","Chromatid segregation\\tCl7g3xLYLmwQ\\tPROCESS\\t-1\\t624\\t133\\t","Transcriptional control\\tX7mpJiW8Lodu\\tPROCESS\\t-1\\t231\\t342\\t","Epigenetic regulation\\t8D0fnb8SLrSQ\\tPROCESS\\t-1\\t231\\t437\\t","IDH1\\tuHqIeo66Lqq9\\tGENE\\t-1\\t425\\t435\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","9WzDoyMZNXKq\\tUUHLK2LeLlq4\\tCl7g3xLYLmwQ\\tACTIVATES","nh2AMryLNpj_\\tuHqIeo66Lqq9\\t8D0fnb8SLrSQ\\tACTIVATES","3ixp2EynNWMa\\tyZeIXzgALlHL\\tUUHLK2LeLlq4\\tACTIVATES","-scKWlPDNX6-\\tUUHLK2LeLlq4\\txWY6P0idNRza\\tACTIVATES","8YJTZK-INn2c\\t4dCj0PbWLn10\\t-c29Xam0NfMu\\tACTIVATES","MdvHv-NFNoui\\t4dCj0PbWLn10\\tX7mpJiW8Lodu\\tACTIVATES"],"SKCM-2015-RTK-RAS-PI(3)K-pathway":["SKCM-2015-RTK-RAS-PI(3)K-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","Proliferation\\tOpbQ5N5BIR7T\\tPROCESS\\t-1\\t528\\t524\\t","NF1\\tz9P8VET8IH-v\\tGENE\\t-1\\t256\\t147\\t","NRAS\\tstZUUqWp9HOb\\tGENE\\tdQrC9TeNIX-m\\t374\\t236\\t","Survival\\tDXOfiysJIUYY\\tPROCESS\\t-1\\t1107\\t329\\t","RAS\\tdQrC9TeNIX-m\\tFAMILY\\t-1\\t529\\t236\\t","RAC1\\t8CZU3OY7IlD5\\tGENE\\t-1\\t880\\t364\\t","KIT\\tyhNL3UBnIL-5\\tGENE\\t-1\\t880\\t120\\t","AKT Pathway\\t5m3zxs1KINf7\\tPROCESS\\t-1\\t880\\t241\\t","MAP2K1\\teNN9GlQaIQwL\\tGENE\\t-1\\t528\\t435\\t","PTEN\\tRtyOk-X-ITE3\\tGENE\\t-1\\t1106\\t241\\t","BRAF\\t4dRiJZfvIPWm\\tGENE\\t-1\\t528\\t338\\t","KRAS\\thksSbzGD9HOJ\\tGENE\\tdQrC9TeNIX-m\\t685\\t236\\t","HRAS\\tNNEMBzDV9HNw\\tGENE\\tdQrC9TeNIX-m\\t530\\t236\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","soPzg51UIxxj\\t8CZU3OY7IlD5\\t5m3zxs1KINf7\\tACTIVATES","Cf02-ifyItuD\\tdQrC9TeNIX-m\\t4dRiJZfvIPWm\\tACTIVATES","BqXWl69hI1zW\\tyhNL3UBnIL-5\\t5m3zxs1KINf7\\tACTIVATES","1Aepvid-IqoA\\tz9P8VET8IH-v\\tdQrC9TeNIX-m\\tINHIBITS","J01_493NIzbP\\t4dRiJZfvIPWm\\t5m3zxs1KINf7\\tACTIVATES","PCKlXBgfIu2g\\t4dRiJZfvIPWm\\teNN9GlQaIQwL\\tACTIVATES","q7PHpnTgIwuD\\t8CZU3OY7IlD5\\teNN9GlQaIQwL\\tACTIVATES","FxAnigvrI2_i\\t5m3zxs1KINf7\\tDXOfiysJIUYY\\tACTIVATES","uglecyI1IsGD\\tyhNL3UBnIL-5\\tdQrC9TeNIX-m\\tACTIVATES","iCnUjDjmIvi5\\teNN9GlQaIQwL\\tOpbQ5N5BIR7T\\tACTIVATES","HEzFrHkCI0l-\\tRtyOk-X-ITE3\\t5m3zxs1KINf7\\tINHIBITS"],"SKCM-2015-TP53-pathway":["SKCM-2015-TP53-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","Apoptosis\\tTc8UdIhSLCIT\\tPROCESS\\t-1\\t289\\t372\\t","TP53\\tGBRktWHeLBFQ\\tGENE\\t-1\\t381\\t273\\t","MDM2\\t-VggHhz9K-1w\\tGENE\\t-1\\t381\\t193\\t","CDKN2B\\tB3XBHs3yK9o7\\tGENE\\t-1\\t456\\t108\\t","Senescence\\tcLoUlZOZLD0x\\tPROCESS\\t-1\\t456\\t372\\t","CDKN2A\\thml0YQ9_K8tc\\tGENE\\t-1\\t289\\t108\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","gBzu2KRcLSuV\\tB3XBHs3yK9o7\\t-VggHhz9K-1w\\tINHIBITS","XenUWWntLTzX\\t-VggHhz9K-1w\\tGBRktWHeLBFQ\\tINHIBITS","WNkolmuaLVxV\\tGBRktWHeLBFQ\\tcLoUlZOZLD0x\\tACTIVATES","N3sY9gBuLVHA\\tGBRktWHeLBFQ\\tTc8UdIhSLCIT\\tACTIVATES","2r21RRvbLR21\\thml0YQ9_K8tc\\t-VggHhz9K-1w\\tINHIBITS"],"STAD-2014-RTK-RAS-PI(3)K-pathway":["STAD-2014-RTK-RAS-PI(3)K-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","PTEN\\t6OFxgP6h9_xG\\tGENE\\t-1\\t341\\t496\\t","RASA1\\tY6PU3f3t93HB\\tGENE\\t-1\\t419\\t172\\t","KRAS\\txCs5lqYG7Z1Z\\tGENE\\t7oEmRnmC-RqY\\t341\\t265\\t","JAK2\\tL1LDTgi27i0r\\tGENE\\tuCiynVqo-CBg\\t167\\t366\\t","PIK3R1\\tij4dXcH1-Ah1\\tGENE\\t-1\\t516\\t496\\t","RAS\\t7oEmRnmC-RqY\\tFAMILY\\t-1\\t420\\t265\\t","NRAS\\tdwqmccUP7Z1E\\tGENE\\t7oEmRnmC-RqY\\t499\\t265\\t","ERBB2\\tL6F3ltyJ7i1T\\tGENE\\tuCiynVqo-CBg\\t167\\t233\\t","EGFR\\tOrbXhKLA7i1D\\tGENE\\tuCiynVqo-CBg\\t167\\t164\\t","FGFR2\\tGc4Ktrgt7i1M\\tGENE\\tuCiynVqo-CBg\\t167\\t430\\t","PIK3CA\\tWBOfcnh9993x\\tGENE\\t-1\\t419\\t394\\t","MET\\tgbmLOkrS7i1x\\tGENE\\tuCiynVqo-CBg\\t167\\t496\\t","RTK\\tuCiynVqo-CBg\\tFAMILY\\t-1\\t167\\t330\\t","ERBB3\\t6Uq7nWdq7i1f\\tGENE\\tuCiynVqo-CBg\\t167\\t299\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","20X5Aj7K-bWX\\t6OFxgP6h9_xG\\tWBOfcnh9993x\\tINHIBITS","VZzlIbfS-edr\\tuCiynVqo-CBg\\t7oEmRnmC-RqY\\tACTIVATES","KrNMU6gX-f84\\tuCiynVqo-CBg\\tWBOfcnh9993x\\tACTIVATES","1JHahVpJ-cGV\\tij4dXcH1-Ah1\\tWBOfcnh9993x\\tINHIBITS","IyUACdpr-YSa\\t7oEmRnmC-RqY\\tWBOfcnh9993x\\tACTIVATES","OPPikJRZ-XUc\\tY6PU3f3t93HB\\t7oEmRnmC-RqY\\tINHIBITS","vbNOH609-aVf\\tWBOfcnh9993x\\t7oEmRnmC-RqY\\tACTIVATES"],"TGF-Beta":["TGF-Beta","","A signaling network involved in growth, proliferation, apoptosis, and differentiation involving the activation of TGFβ receptors by the cytokine TGFβ that leads to the activation of gene transcription by SMADs.","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","SMAD2\\t0qBZliXOfmft\\tGENE\\tXkk8SKlafmfn\\t335\\t410","SMAD\\tXkk8SKlafmfn\\tFAMILY\\t-1\\t424\\t446","Activin ligands\\tt_Q1Nr-BfmfR\\tGENE\\t-1\\t509\\t146","ACVR2B\\t9Ev1i-2HfmfX\\tGENE\\tboabbY81fmfT\\t508\\t307","TGFBR\\tfXKkJObYfmfb\\tFAMILY\\t-1\\t329\\t277","ACVR2A\\t_sm7432ofmfV\\tGENE\\tboabbY81fmfT\\t509\\t244","SMAD3\\tgepyfePvfmfz\\tGENE\\tXkk8SKlafmfn\\t514\\t410","TGFBR2\\tDOJnFoHNfmfi\\tGENE\\tfXKkJObYfmfb\\t329\\t311","TGFB ligands\\tgOOpkueqfmfM\\tGENE\\t-1\\t329\\t146","ACVR2\\tboabbY81fmfT\\tFAMILY\\t-1\\t508\\t275","TGFBR1\\tSb4zGrL3fmfe\\tGENE\\tfXKkJObYfmfb\\t329\\t244","Proliferation, stem/progenitor phenotype\\tA7jMDR2Mfmf-\\tPROCESS\\t-1\\t427\\t588","SMAD4\\tOKApI7Qwfmf4\\tGENE\\tXkk8SKlafmfn\\t428\\t483","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPEINTERACTION_PUBMED_ID","7FzJ455ZfmgP\\tboabbY81fmfT\\tXkk8SKlafmfn\\tACTIVATES\\t","WEH0_CRqfmgL\\tfXKkJObYfmfb\\tXkk8SKlafmfn\\tACTIVATES\\t","hnOBi-Z1fmgI\\tt_Q1Nr-BfmfR\\tboabbY81fmfT\\tACTIVATES\\t","Ax3S1Kd8fmgE\\tgOOpkueqfmfM\\tfXKkJObYfmfb\\tACTIVATES\\t"],"THCA-2014-RTK-RAS-PI(3)K-pathway":["THCA-2014-RTK-RAS-PI(3)K-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","MTOR\\tG9y6ZBee_nmX\\tGENE\\t-1\\t649\\t417\\t","NRAS\\tOjQjq-cc7_5M\\tGENE\\tEOfQTOkE_iLF\\t646\\t25\\t","AKT\\tfi2ldWMn_lnk\\tGENE\\t-1\\t647\\t265\\t","BCL2\\tjwugB2iP_y0Y\\tGENE\\t-1\\t841\\t559\\t","NTR1\\turLIUCXQ70w-\\tGENE\\tKen9wGw8AKU3\\t293\\t-7\\t","RAS\\t1TJ8hV1I_ZR5\\tFAMILY\\t-1\\t374\\t186\\t","RAF\\txSi1Do6v_sYj\\tGENE\\t-1\\t841\\t186\\t","DUSPs\\t7C2rFt7t_fdn\\tGENE\\t-1\\t298\\t524\\t","BRAF\\tpq87LogY_1LI\\tGENE\\t-1\\t1024\\t186\\t","pERK\\tF4o-nfWI_urx\\tGENE\\t-1\\t841\\t344\\t","Apoptosis\\tAoCFeVPVAu6s\\tPROCESS\\t-1\\t841\\t636\\t","BRAF\\tPAsWh9Rz_dco\\tGENE\\t-1\\t167\\t276\\t","HRAS\\tLPvNA7nc7_57\\tGENE\\tEOfQTOkE_iLF\\t804\\t25\\t","NTR\\tKen9wGw8AKU3\\tFAMILY\\t-1\\t371\\t22\\t","BAD\\tUiVUw9Es_x5s\\tGENE\\t-1\\t841\\t489\\t","Cell proliferation/Growth\\ttGen8Qvz_qez\\tPROCESS\\t-1\\t298\\t628\\t","KRAS\\tr0hPxhCH7_5n\\tGENE\\tEOfQTOkE_iLF\\t961\\t25\\t","PI3K\\tK3RfoHn2_kQ2\\tGENE\\t-1\\t647\\t186\\t","pMEK\\tlMJhnvzk_tYZ\\tGENE\\t-1\\t841\\t264\\t","pMEK\\teM1eNr4K_cOi\\tGENE\\t-1\\t298\\t346\\t","p90\\t-6lLHt7R_v9K\\tGENE\\t-1\\t841\\t419\\t","NTR3\\tJtRMUb9N70xa\\tGENE\\tKen9wGw8AKU3\\t378\\t51\\t","Protein synthesis\\tWQ8orp6Y_ouv\\tPROCESS\\t-1\\t649\\t627\\t","RAS\\tEOfQTOkE_iLF\\tFAMILY\\t-1\\t804\\t25\\t","NTR2\\tWK-XNi2970xq\\tGENE\\tKen9wGw8AKU3\\t450\\t-7\\t","RET\\tCDUJn7rL_YRR\\tGENE\\t-1\\t167\\t186\\t","pERK\\tGyr_vYK7_eUm\\tGENE\\t-1\\t298\\t434\\t","RAF\\tEJdSJtPH_amI\\tGENE\\t-1\\t374\\t276\\t","TSC2\\tEhaBKk9-_mvL\\tGENE\\t-1\\t647\\t345\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","HComBP3QBFSr\\txSi1Do6v_sYj\\tlMJhnvzk_tYZ\\tACTIVATES","5ow_H43KBLyc\\tjwugB2iP_y0Y\\tAoCFeVPVAu6s\\tINHIBITS","lafIlqasBaaQ\\tEJdSJtPH_amI\\teM1eNr4K_cOi\\tACTIVATES","pCtfuSydBdaS\\t7C2rFt7t_fdn\\tGyr_vYK7_eUm\\tINHIBITS","YyPlgJXcA__s\\tEhaBKk9-_mvL\\tG9y6ZBee_nmX\\tINHIBITS","iA_J_DZbBefG\\t7C2rFt7t_fdn\\ttGen8Qvz_qez\\tACTIVATES","sJ4XKEpFA6LY\\tKen9wGw8AKU3\\tEOfQTOkE_iLF\\tACTIVATES","8BieawZKA3u7\\tCDUJn7rL_YRR\\t1TJ8hV1I_ZR5\\tACTIVATES","r79uM2_gBZKl\\t1TJ8hV1I_ZR5\\tEJdSJtPH_amI\\tACTIVATES","ACvH-CYzA8yR\\tEOfQTOkE_iLF\\tK3RfoHn2_kQ2\\tACTIVATES","TmRxcbx_Bbb7\\teM1eNr4K_cOi\\tGyr_vYK7_eUm\\tACTIVATES","teHhboSJBVGJ\\tpq87LogY_1LI\\txSi1Do6v_sYj\\tINHIBITS","XmrMteXSBBt-\\tG9y6ZBee_nmX\\tWQ8orp6Y_ouv\\tACTIVATES","hU00JaNWBYJR\\tPAsWh9Rz_dco\\teM1eNr4K_cOi\\tACTIVATES","FXb60wuvBcMi\\tGyr_vYK7_eUm\\t7C2rFt7t_fdn\\tACTIVATES","-iHJfCCVA_Hh\\tfi2ldWMn_lnk\\tEhaBKk9-_mvL\\tACTIVATES","aW6elpjvBKyK\\tUiVUw9Es_x5s\\tjwugB2iP_y0Y\\tINHIBITS","LlJV17wNBHMh\\tlMJhnvzk_tYZ\\tF4o-nfWI_urx\\tACTIVATES","z-CbE5XoBJ5o\\t-6lLHt7R_v9K\\tUiVUw9Es_x5s\\tINHIBITS","F9EcWkHvBUJ2\\tpq87LogY_1LI\\txSi1Do6v_sYj\\tACTIVATES","GqN5v_YIBEbi\\tEOfQTOkE_iLF\\txSi1Do6v_sYj\\tACTIVATES","FWnfRc3YBC44\\t-6lLHt7R_v9K\\tG9y6ZBee_nmX\\tINHIBITS","AV9s-fteA9y7\\tK3RfoHn2_kQ2\\tfi2ldWMn_lnk\\tACTIVATES","3BgREqkhA22-\\tKen9wGw8AKU3\\t1TJ8hV1I_ZR5\\tACTIVATES","r31OK-oJBIby\\tF4o-nfWI_urx\\t-6lLHt7R_v9K\\tACTIVATES"],"TP53":["TP53","","Pathway centered around the regulation of the tumor suppressor TP53, a gene that regulates apoptosis, cell cycle arrest, senescence, and DNA repair.","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","Cell survival, proliferation\\txDGjGXGMfyG3\\tPROCESS\\t-1\\t133\\t449","CDKN2A\\tgx_YWb90fyGp\\tGENE\\t-1\\t-23\\t235","MDM4\\tsT2W03HDfyGe\\tGENE\\tlK7pvMYZfyGU\\t319\\t127","DNA replication stress\\tYvaYsZcufyHH\\tPROCESS\\t-1\\t597\\t51","RPS6KA3\\tIu0kJKKGfyGM\\tGENE\\t-1\\t597\\t328","MDM2\\tqv-3H9tXfyGZ\\tGENE\\tlK7pvMYZfyGU\\t149\\t127","Senescence, apoptosis\\tIkv91AlOfyG-\\tPROCESS\\t-1\\t325\\t448","\\tlK7pvMYZfyGU\\tFAMILY\\t-1\\t234\\t127","TP53\\tES5FXiJLfyGu\\tGENE\\t-1\\t233\\t328","Oncogenic stress\\tHZxSxJBmfyHE\\tPROCESS\\t-1\\t333\\t222","ATM\\tc4Ad6ZYBfyGx\\tGENE\\t-1\\t597\\t130","CHEK2\\tJvx4WzdtfyGk\\tGENE\\t-1\\t597\\t225","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPEINTERACTION_PUBMED_ID","8KZq5XsifyHL\\tES5FXiJLfyGu\\txDGjGXGMfyG3\\tINHIBITS\\t","5e5CkdqDfyHg\\tgx_YWb90fyGp\\tES5FXiJLfyGu\\tINHIBITS\\t","WAvkWWubfyHO\\tJvx4WzdtfyGk\\tIu0kJKKGfyGM\\tACTIVATES\\t","wMOYIFFAfyHS\\tgx_YWb90fyGp\\tlK7pvMYZfyGU\\tINHIBITS\\t","Zd519CgjfyHd\\tHZxSxJBmfyHE\\tES5FXiJLfyGu\\tACTIVATES\\t","lFKJrXsmfyHb\\tES5FXiJLfyGu\\tIkv91AlOfyG-\\tACTIVATES\\t","geyskuwAfyHV\\tlK7pvMYZfyGU\\tES5FXiJLfyGu\\tINHIBITS\\t","t-G0U6EJfyHR\\tIu0kJKKGfyGM\\tES5FXiJLfyGu\\tACTIVATES\\t","vNvONKmFfyHj\\tYvaYsZcufyHH\\tc4Ad6ZYBfyGx\\tACTIVATES\\t","25K5WaLwfyHX\\tc4Ad6ZYBfyGx\\tJvx4WzdtfyGk\\tACTIVATES\\t"],"UCEC-2013-RTK-RAS-PI(3)K-pathway":["UCEC-2013-RTK-RAS-PI(3)K-pathway","","","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","RTK\\tZAPqdjSDgCgU\\tFAMILY\\t-1\\t391\\t148\\t","SOX17\\tBXxulVFjgHIs\\tGENE\\t-1\\t227\\t344\\t","KRAS\\t76Wg78V_gDdz\\tGENE\\t-1\\t391\\t260\\t","Proliferation\\tsoh0TxsPgq1P\\tPROCESS\\t-1\\t803\\t409\\t","PTEN\\tQha2pMPigm3R\\tGENE\\t-1\\t1085\\t215\\t","Translation\\t0L6ulMimgteS\\tPROCESS\\t-1\\t1056\\t409\\t","Proliferation\\tMsHCffb6gNY_\\tPROCESS\\t-1\\t391\\t515\\t","CTNNB1\\ti1tsajIagMAh\\tGENE\\t-1\\t391\\t430\\t","PIK3R1\\tOJ-s2c_vgnZa\\tGENE\\t-1\\t1085\\t295\\t","GSK3B\\twXwgUTNkgFnQ\\tGENE\\t-1\\t391\\t344\\t","FBXW7\\t57SvZmLzgKXg\\tGENE\\t-1\\t557\\t344\\t","Cell survival\\tNI-5QJa7gr4W\\tPROCESS\\t-1\\t935\\t409\\t","ERBB2\\tY1idRwsY3N1k\\tGENE\\tZAPqdjSDgCgU\\t469\\t148\\t","PIK3CA\\tsJDwUf9sgpI_\\tGENE\\t-1\\t915\\t256\\t","FGFR2\\tM56YC0J03N1R\\tGENE\\tZAPqdjSDgCgU\\t313\\t148\\t","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE","pauS7C64g9TO\\tOJ-s2c_vgnZa\\tsJDwUf9sgpI_\\tINHIBITS","9ZMCIs5Ygf4j\\twXwgUTNkgFnQ\\ti1tsajIagMAh\\tINHIBITS","BXhEIXgdhBkV\\tsJDwUf9sgpI_\\t0L6ulMimgteS\\tACTIVATES","DLrHfIVSgegJ\\t76Wg78V_gDdz\\twXwgUTNkgFnQ\\tINHIBITS","y_ifcFbCgcdH\\tZAPqdjSDgCgU\\t76Wg78V_gDdz\\tACTIVATES","F5LjanELggnD\\tBXxulVFjgHIs\\ti1tsajIagMAh\\tINHIBITS","2-tF8Ncmgiab\\ti1tsajIagMAh\\tMsHCffb6gNY_\\tACTIVATES","tJv0DWt8g-nF\\tsJDwUf9sgpI_\\tsoh0TxsPgq1P\\tACTIVATES","rps45EGCg_aW\\tsJDwUf9sgpI_\\tNI-5QJa7gr4W\\tACTIVATES","w8Id1r73g8Xz\\tQha2pMPigm3R\\tsJDwUf9sgpI_\\tINHIBITS","daN2ajyqghSz\\t57SvZmLzgKXg\\ti1tsajIagMAh\\tINHIBITS"],"WNT":["WNT","","Involved in both development and tissue homeostasis. The canonical Wnt pathway involves signal transduction initiated by Wnt ligand binding to Frizzled family receptors leading to the dysregulation of beta-catenin degradation and ultimately, the induction of transcription via TCF/LEF transcription factors by beta-catenin.","","--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY--","SFRP3\\tEiQGCkYbf2Ue\\tGENE\\taqCo94T-f2UY\\t214\\t113","DKK\\tRpK5JOBLf2U5\\tFAMILY\\t-1\\t819\\t306","TLE1\\toLjLH1mCf2T6\\tGENE\\tz1BS71lif2T2\\t702\\t625","TLE4\\tUjSaC5Phf2T3\\tGENE\\tz1BS71lif2T2\\t858\\t685","SFRP1\\tLgjBpjM-f2Ux\\tGENE\\taqCo94T-f2UY\\t63\\t147","Groucho\\tz1BS71lif2T2\\tFAMILY\\t-1\\t780\\t655","APC\\tKzWeNNlbf2UJ\\tGENE\\t-1\\t228\\t521","TCF7L1\\tletl9duUf2WR\\tGENE\\tabIO9oDkf2WA\\t341\\t691","WIF1\\t5iL99X9Jf2Tw\\tGENE\\t-1\\t452\\t61","TLE2\\tR0vKN1sif2T9\\tGENE\\tz1BS71lif2T2\\t858\\t625","DKK1\\tDRSXFgEQf2U9\\tGENE\\tRpK5JOBLf2U5\\t739\\t275","TCF7L2\\tRPLZ4osLf2Wb\\tGENE\\tabIO9oDkf2WA\\t499\\t690","AXIN1\\tKq4oChNGf2Vz\\tGENE\\tkoQkppv4f2Vq\\t599\\t443","WNT Dual Receptor Complex\\tqRabkjW8f2VS\\tCOMPLEX\\t-1\\t458\\t304","SFRP2\\thqXcbX1yf2U1\\tGENE\\taqCo94T-f2UY\\t63\\t203","LRP5\\tDK7CkEYCf2Vi\\tGENE\\tqRabkjW8f2VS\\t536\\t276","TCF7\\tpK9uMdhUf2WH\\tGENE\\tabIO9oDkf2WA\\t422\\t632","TLE3\\tmA6zfzOUf2UA\\tGENE\\tz1BS71lif2T2\\t702\\t685","Cell proliferation\\thFWwt8jrf2UV\\tPROCESS\\t-1\\t135\\t667","TCF/LEF\\tabIO9oDkf2WA\\tCOMPLEX\\t-1\\t420\\t661","AXIN\\tkoQkppv4f2Vq\\tFAMILY\\t-1\\t678\\t443","RNF43\\telbyeD9tf2UD\\tGENE\\t-1\\t144\\t303","CTNNB1\\t3GRyWPj8f2UM\\tGENE\\t-1\\t417\\t485","DKK2\\tyYuxYP9Qf2VC\\tGENE\\tRpK5JOBLf2U5\\t899\\t275","FZDs\\tjR_K-66Df2VX\\tGENE\\tqRabkjW8f2VS\\t381\\t301","DKK4\\tlRy7Jj0Nf2VN\\tGENE\\tRpK5JOBLf2U5\\t899\\t337","SFRP\\taqCo94T-f2UY\\tFAMILY\\t-1\\t138\\t169","WNT ligands\\twCThVVjSf2Tz\\tGENE\\t-1\\t452\\t168","LRP6\\tnr8aMEmUf2Vd\\tGENE\\tqRabkjW8f2VS\\t536\\t332","GSK3B\\tmuxig_C-f2UG\\tGENE\\t-1\\t228\\t446","SFRP5\\tB0f2GOAff2Us\\tGENE\\taqCo94T-f2UY\\t214\\t226","AMER1\\tpAChF0thf2US\\tGENE\\t-1\\t599\\t519","SFRP4\\tQMwh9gC-f2Ul\\tGENE\\taqCo94T-f2UY\\t214\\t170","AXIN2\\tpD0TMIi_f2V5\\tGENE\\tkoQkppv4f2Vq\\t758\\t443","DKK3\\twStErGAEf2VH\\tGENE\\tRpK5JOBLf2U5\\t739\\t337","","--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPEINTERACTION_PUBMED_ID","XWIzsv56f2Wm\\taqCo94T-f2UY\\twCThVVjSf2Tz\\tINHIBITS\\t","Bps0rTlOf2W1\\tpAChF0thf2US\\t3GRyWPj8f2UM\\tINHIBITS\\t","Bt39Pfi9f2W-\\tqRabkjW8f2VS\\tmuxig_C-f2UG\\tACTIVATES\\t","x3LsoTaTf2Ww\\telbyeD9tf2UD\\tqRabkjW8f2VS\\tINHIBITS\\t","PgNv7XZif2XA\\tmuxig_C-f2UG\\t3GRyWPj8f2UM\\tINHIBITS\\t","-u2h2V6ef2XK\\tabIO9oDkf2WA\\thFWwt8jrf2UV\\tACTIVATES\\t","an6n-VWDf2Wt\\twCThVVjSf2Tz\\tqRabkjW8f2VS\\tACTIVATES\\t","h4-_HrCRf2W4\\tqRabkjW8f2VS\\tkoQkppv4f2Vq\\tACTIVATES\\t","3NL_goRgf2W6\\tkoQkppv4f2Vq\\t3GRyWPj8f2UM\\tINHIBITS\\t","-q76c9PDf2Wy\\tRpK5JOBLf2U5\\tqRabkjW8f2VS\\tINHIBITS\\t","h9BN2IKjf2Wr\\t5iL99X9Jf2Tw\\twCThVVjSf2Tz\\tINHIBITS\\t","rRLoK5NMf2XD\\tKzWeNNlbf2UJ\\t3GRyWPj8f2UM\\tINHIBITS\\t","l7-kESH_f2XH\\tz1BS71lif2T2\\tabIO9oDkf2WA\\tINHIBITS\\t"]}')},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNDdweCIgaGVpZ2h0PSI0N3B4IiB2aWV3Qm94PSIwIDAgNDcgNDciIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ3IDQ3OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxnPgoJPGcgaWQ9IkxheWVyXzFfMTEwXyI+CgkJPGc+CgkJCTxwYXRoIGQ9Ik0xNy41NjcsMTUuOTM4bC0yLjg1OS0yLjcwMmMwLjMzMy0wLjYwNSwwLjUzOS0xLjI5LDAuNTM5LTIuMDI5YzAtMi4zNDItMS44OTctNC4yMzktNC4yNC00LjIzOQoJCQkJYy0yLjM0MywwLTQuMjQzLDEuODk2LTQuMjQzLDQuMjM5YzAsMi4zNDMsMS45LDQuMjQxLDQuMjQzLDQuMjQxYzAuODI2LDAsMS41OS0wLjI0NiwyLjI0Mi0wLjY1NGwyLjg1NSwyLjY5OQoJCQkJQzE2LjUzNiwxNi45MjIsMTcuMDIzLDE2LjM5OSwxNy41NjcsMTUuOTM4eiIvPgoJCQk8cGF0aCBkPSJNMjkuNjYsMTUuNmwzLjc5OS02LjM5M2MwLjM3NCwwLjEwNywwLjc2MiwwLjE4NCwxLjE2OSwwLjE4NGMyLjM0NywwLDQuMjQ0LTEuODk4LDQuMjQ0LTQuMjQxCgkJCQljMC0yLjM0Mi0xLjg5Ny00LjIzOS00LjI0NC00LjIzOWMtMi4zNDMsMC00LjIzOSwxLjg5Ni00LjIzOSw0LjIzOWMwLDEuMTYzLDAuNDY5LDIuMjE0LDEuMjI3LDIuOTgxbC0zLjc4Nyw2LjM3NQoJCQkJQzI4LjQ4LDE0LjgwMSwyOS4wOTQsMTUuMTY5LDI5LjY2LDE1LjZ6Ii8+CgkJCTxwYXRoIGQ9Ik00Mi43NjIsMjAuOTUyYy0xLjgyNCwwLTMuMzY5LDEuMTU5LTMuOTY4LDIuNzc1bC01LjI3OC0wLjUyMWMwLDAuMDQsMC4wMDYsMC4wNzgsMC4wMDYsMC4xMTcKCQkJCWMwLDAuNjg4LTAuMDc2LDEuMzYtMC4yMTMsMi4wMDlsNS4yNzYsMC41MjFjMC4zMTksMi4wMjQsMi4wNjIsMy41NzYsNC4xNzcsMy41NzZjMi4zNDIsMCw0LjIzOC0xLjg5Niw0LjIzOC00LjIzOAoJCQkJQzQ3LDIyLjg1LDQ1LjEwNCwyMC45NTIsNDIuNzYyLDIwLjk1MnoiLz4KCQkJPHBhdGggZD0iTTI4LjE5NywzNy42MjRsLTEuMTgtNS4xNTZjLTAuNjY2LDAuMjMyLTEuMzU5LDAuMzk4LTIuMDgyLDAuNDgxbDEuMTgyLDUuMTU3Yy0xLjM1NSwwLjcwOS0yLjI5LDIuMTEtMi4yOSwzLjc0NgoJCQkJYzAsMi4zNDIsMS44OTYsNC4yMzcsNC4yNDMsNC4yMzdjMi4zNDIsMCw0LjIzOC0xLjg5Niw0LjIzOC00LjIzN0MzMi4zMTEsMzkuNTUzLDMwLjQ3OSwzNy42OTIsMjguMTk3LDM3LjYyNHoiLz4KCQkJPHBhdGggZD0iTTE0LjM1NywyNS4zN2wtNi41NywyLjIwMWMtMC43NTgtMS4xNTgtMi4wNjMtMS45MjYtMy41NDgtMS45MjZDMS44OTYsMjUuNjQ1LDAsMjcuNTQyLDAsMjkuODg0CgkJCQljMCwyLjM0NSwxLjg5Niw0LjI0Miw0LjIzOSw0LjI0MmMyLjM0MSwwLDQuMjQyLTEuODk3LDQuMjQyLTQuMjQyYzAtMC4wOTgtMC4wMjEtMC4xODgtMC4wMjktMC4yODRsNi41OTEtMi4yMDcKCQkJCUMxNC43NDYsMjYuNzUyLDE0LjUxLDI2LjA3NywxNC4zNTcsMjUuMzd6Ii8+CgkJCTxjaXJjbGUgY3g9IjIzLjgzIiBjeT0iMjMuMzIzIiByPSI3LjI3MSIvPgoJCTwvZz4KCTwvZz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K"},function(t,e){t.exports=require("react-toastify")},function(t,e){t.exports=require("oncoprintjs")},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNTUwLjgwMXB4IiBoZWlnaHQ9IjU1MC44MDFweCIgdmlld0JveD0iMCAwIDU1MC44MDEgNTUwLjgwMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUwLjgwMSA1NTAuODAxOyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNMTQ2Ljc0NywyNzYuNzA4YzAtMTMuOTk4LTkuNzExLTIyLjM1Mi0yNi44ODctMjIuMzUyYy02Ljk5LDAtMTEuNzI2LDAuNjc1LTE0LjIwNCwxLjM1NXY0NC45MjcKCQljMi45MzIsMC42NzYsNi41MzksMC44OTYsMTEuNTIsMC44OTZDMTM1LjQ0OSwzMDEuNTQ2LDE0Ni43NDcsMjkyLjI4LDE0Ni43NDcsMjc2LjcwOHoiLz4KCTxwYXRoIGQ9Ik00ODguNDI2LDE5Ny4wMTlINDc1LjJ2LTYzLjgxNmMwLTAuMzk4LTAuMDYzLTAuNzk5LTAuMTE2LTEuMjAyYy0wLjAyMS0yLjUzNC0wLjgyNy01LjAyMy0yLjU2Mi02Ljk5NUwzNjYuMzI1LDMuNjk0CgkJYy0wLjAzMi0wLjAzMS0wLjA2My0wLjA0Mi0wLjA4NS0wLjA3NmMtMC42MzMtMC43MDctMS4zNzEtMS4yOTUtMi4xNTEtMS44MDRjLTAuMjMxLTAuMTU1LTAuNDY0LTAuMjg1LTAuNzA2LTAuNDE5CgkJYy0wLjY3Ni0wLjM2OS0xLjM5My0wLjY3NS0yLjEzMS0wLjg5NmMtMC4yLTAuMDU2LTAuMzgtMC4xMzgtMC41OC0wLjE5QzM1OS44NywwLjExOSwzNTkuMDM3LDAsMzU4LjE5MywwSDk3LjIKCQljLTExLjkxOCwwLTIxLjYsOS42OTMtMjEuNiwyMS42MDF2MTc1LjQxM0g2Mi4zNzdjLTE3LjA0OSwwLTMwLjg3MywxMy44MTgtMzAuODczLDMwLjg3M3YxNjAuNTQ1CgkJYzAsMTcuMDQzLDEzLjgyNCwzMC44NywzMC44NzMsMzAuODdoMTMuMjI0VjUyOS4yYzAsMTEuOTA3LDkuNjgyLDIxLjYwMSwyMS42LDIxLjYwMWgzNTYuNGMxMS45MDcsMCwyMS42LTkuNjkzLDIxLjYtMjEuNjAxCgkJVjQxOS4zMDJoMTMuMjI2YzE3LjA0NCwwLDMwLjg3MS0xMy44MjcsMzAuODcxLTMwLjg3di0xNjAuNTRDNTE5LjI5NywyMTAuODM4LDUwNS40NywxOTcuMDE5LDQ4OC40MjYsMTk3LjAxOXogTTk3LjIsMjEuNjA1CgkJaDI1MC4xOTN2MTEwLjUxM2MwLDUuOTY3LDQuODQxLDEwLjgsMTAuOCwxMC44aDk1LjQwN3Y1NC4xMDhIOTcuMlYyMS42MDV6IE0yMzQuMzQ0LDMzNS44NnY0NS44MzFoLTMxLjYwMVYyMjkuNTI0aDQwLjE4NAoJCWwzMS42MTEsNTUuNzU5YzkuMDI1LDE2LjAzMSwxOC4wNjQsMzQuOTgzLDI0LjgyNSw1Mi4xNTRoMC42NzVjLTIuMjU3LTIwLjEwMy0yLjkzMy00MC42NDMtMi45MzMtNjMuNDR2LTQ0LjQ3M2gzMS42MTR2MTUyLjE2NwoJCWgtMzYuMTE3bC0zMi41MTYtNTguNzAzYy05LjA0OS0xNi4yNTMtMTguOTcxLTM1Ljg5Mi0yNi40MzgtNTMuNzI3bC0wLjY2NSwwLjIyMkMyMzMuOTA2LDI4OS41OCwyMzQuMzQ0LDMxMS4wMjcsMjM0LjM0NCwzMzUuODZ6CgkJIE03MS41NTYsMzgxLjY5MVYyMzEuNTZjMTAuNjEzLTEuODA0LDI1LjUxNi0zLjE1OSw0Ni41MDYtMy4xNTljMjEuMjE1LDAsMzYuMzUzLDQuMDYxLDQ2LjUwOSwxMi4xOTIKCQljOS42OTgsNy42NzMsMTYuMjU1LDIwLjMxMywxNi4yNTUsMzUuMjE5YzAsMTQuODk3LTQuOTU5LDI3LjU0OS0xMy45OTksMzYuMTIzYy0xMS43MzgsMTEuMDYzLTI5LjEyMywxNi4wMzEtNDkuNDQxLDE2LjAzMQoJCWMtNC41MjIsMC04LjU5My0wLjIzMS0xMS43MzYtMC42NzV2NTQuNDExSDcxLjU1NlYzODEuNjkxeiBNNDUzLjYwMSw1MjMuMzUzSDk3LjJWNDE5LjMwMmgzNTYuNFY1MjMuMzUzeiBNNDg1LjY1MiwzNzQuNjg4CgkJYy0xMC42MSwzLjYwNy0zMC43MTMsOC41ODUtNTAuODA1LDguNTg1Yy0yNy43NTksMC00Ny44NzItNy4wMDMtNjEuODU3LTIwLjU0NWMtMTMuOTk1LTEzLjEtMjEuNjg0LTMyLjk3LTIxLjQ1Mi01NS4zMTgKCQljMC4yMjItNTAuNTY5LDM3LjAzLTc5LjQ2Myw4Ni45MTctNzkuNDYzYzE5LjY0NCwwLDM0Ljc4MywzLjgyOSw0Mi4yMTksNy40NDZsLTcuMjE0LDI3LjU0M2MtOC4zNjktMy42MTctMTguNzUyLTYuNTUtMzUuNDU4LTYuNTUKCQljLTI4LjY1NiwwLTUwLjM0MSwxNi4yNTYtNTAuMzQxLDQ5LjIyYzAsMzEuMzgyLDE5LjY0OSw0OS44OTIsNDcuODcyLDQ5Ljg5MmM3Ljg5NSwwLDE0LjIxOC0wLjkwMSwxNi45MzQtMi4yNTd2LTMxLjgzNWgtMjMuNDkzCgkJdi0yNi44NjloNTYuNjc5VjM3NC42ODh6Ii8+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+Cg=="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNTUwLjgwMXB4IiBoZWlnaHQ9IjU1MC44MDFweCIgdmlld0JveD0iMCAwIDU1MC44MDEgNTUwLjgwMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUwLjgwMSA1NTAuODAxOyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNNDg4LjQyNiwxOTcuMDE5SDQ3NS4ydi02My44MTZjMC0wLjM5OC0wLjA2My0wLjc5OS0wLjExNi0xLjIwMmMtMC4wMjEtMi41MzQtMC44MjctNS4wMjMtMi41NjItNi45OTVMMzY2LjMyNSwzLjY5NAoJCWMtMC4wMzItMC4wMzEtMC4wNjMtMC4wNDItMC4wODUtMC4wNzZjLTAuNjMzLTAuNzA3LTEuMzcxLTEuMjk1LTIuMTUxLTEuODA0Yy0wLjIzMS0wLjE1NS0wLjQ2NC0wLjI4NS0wLjcwNi0wLjQxOQoJCWMtMC42NzYtMC4zNjktMS4zOTMtMC42NzUtMi4xMzEtMC44OTZjLTAuMi0wLjA1Ni0wLjM4LTAuMTM4LTAuNTgtMC4xOUMzNTkuODcsMC4xMTksMzU5LjAzNywwLDM1OC4xOTMsMEg5Ny4yCgkJYy0xMS45MTgsMC0yMS42LDkuNjkzLTIxLjYsMjEuNjAxdjE3NS40MTNINjIuMzc3Yy0xNy4wNDksMC0zMC44NzMsMTMuODE4LTMwLjg3MywzMC44NzN2MTYwLjU0NQoJCWMwLDE3LjA0MywxMy44MjQsMzAuODcsMzAuODczLDMwLjg3aDEzLjIyNFY1MjkuMmMwLDExLjkwNyw5LjY4MiwyMS42MDEsMjEuNiwyMS42MDFoMzU2LjRjMTEuOTA3LDAsMjEuNi05LjY5MywyMS42LTIxLjYwMQoJCVY0MTkuMzAyaDEzLjIyNmMxNy4wNDQsMCwzMC44NzEtMTMuODI3LDMwLjg3MS0zMC44N3YtMTYwLjU0QzUxOS4yOTcsMjEwLjgzOCw1MDUuNDcsMTk3LjAxOSw0ODguNDI2LDE5Ny4wMTl6IE05Ny4yLDIxLjYwNQoJCWgyNTAuMTkzdjExMC41MTNjMCw1Ljk2Nyw0Ljg0MSwxMC44LDEwLjgsMTAuOGg5NS40MDd2NTQuMTA4SDk3LjJWMjEuNjA1eiBNMzM4Ljg3MSwyMjUuNjcyTDI4NC41NDUsMzg2Ljk2aC00Mi41OTEKCQlsLTUxLjY5LTE2MS4yODhoMzkuOTY3bDE5LjYxNyw2OC4xOTZjNS41MDgsMTkuMTQzLDEwLjUzMSwzNy41NjcsMTQuMzYsNTcuNjdoMC43MTdjNC4wNjEtMTkuMzg1LDkuMDg5LTM4LjUyNywxNC41OTItNTYuOTUzCgkJbDIwLjU4NS02OC45MThoMzguNzdWMjI1LjY3MnogTTY4LjQ1OCwzNzkuNTRsNy40MTUtMzAuMTUzYzkuODExLDUuMDIxLDI0Ljg4OCwxMC4wNTEsNDAuNDM5LDEwLjA1MQoJCWMxNi43NTEsMCwyNS42MDctNi45MzUsMjUuNjA3LTE3LjQ2NWMwLTEwLjA1Mi03LjY2Mi0xNS43OTUtMjcuMDUtMjIuNzM0Yy0yNi44LTkuMzI4LTQ0LjI2My0yNC4xNjgtNDQuMjYzLTQ3LjYxMQoJCWMwLTI3LjUyNCwyMi45NzEtNDguNTc5LDYxLjAxNC00OC41NzljMTguMTg4LDAsMzEuNTkxLDMuODIzLDQxLjE1OSw4LjEzMWwtOC4xMjYsMjkuNDM3Yy02LjQ2NS0zLjExNi0xNy45NDUtNy42NTctMzMuNzQ1LTcuNjU3CgkJYy0xNS43OTEsMC0yMy40NTQsNy4xODMtMjMuNDU0LDE1LjU1MmMwLDEwLjI5Niw5LjA4OSwxNC44NDIsMjkuOTE3LDIyLjczMWMyOC40NjgsMTAuNTM2LDQxLjg3MSwyNS4zNjUsNDEuODcxLDQ4LjA5NAoJCWMwLDI3LjA0Mi0yMC44MTIsNTAuMDEzLTY1LjA5LDUwLjAxM0M5NS43MzEsMzg5LjM0OSw3Ny41MzgsMzg0LjU3MSw2OC40NTgsMzc5LjU0eiBNNDUzLjYwMSw1MjMuMzUzSDk3LjJWNDE5LjMwMmgzNTYuNFY1MjMuMzUzegoJCSBNNDg4LjkxMSwzNzkuNTRjLTExLjI0MywzLjgyMy0zMi41MzcsOS4xMDMtNTMuODMxLDkuMTAzYy0yOS40MzcsMC01MC43My03LjQyNi02NS41Ny0yMS43NzkKCQljLTE0LjgzOS0xMy44NzUtMjIuOTcxLTM0Ljk0Mi0yMi43MzgtNTguNjI1YzAuMjUzLTUzLjYwNCwzOS4yNTUtODQuMjM1LDkyLjEzNy04NC4yMzVjMjAuODEsMCwzNi44NTIsNC4wNzMsNDQuNzQsNy44OTYKCQlsLTcuNjU3LDI5LjIwMmMtOC44NTktMy44MjktMTkuODQ5LTYuOTUtMzcuNTY3LTYuOTVjLTMwLjM5NiwwLTUzLjM1NywxNy4yMzMtNTMuMzU3LDUyLjE3M2MwLDMzLjI2NSwyMC44MSw1Mi44ODIsNTAuNzMsNTIuODgyCgkJYzguMzc1LDAsMTUuMDcyLTAuOTYsMTcuOTQtMi4zOTV2LTMzLjc0NWgtMjQuODc1di0yOC40NzFoNjAuMDQ5VjM3OS41NEw0ODguOTExLDM3OS41NHoiLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K"},function(t,e){t.exports=require("file-saver")},function(t,e){t.exports="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItZWRpdCI+PHBhdGggZD0iTTExIDRINGEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoMTRhMiAyIDAgMCAwIDItMnYtNyI+PC9wYXRoPjxwYXRoIGQ9Ik0xOC41IDIuNWEyLjEyMSAyLjEyMSAwIDAgMSAzIDNMMTIgMTVsLTQgMSAxLTQgOS41LTkuNXoiPjwvcGF0aD48L3N2Zz4="},function(t,e){t.exports=require("tippy.js")},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE4LjEuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMjMuNjI1IDIzLjYyNSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjMuNjI1IDIzLjYyNTsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggc3R5bGU9ImZpbGw6IzAzMDEwNDsiIGQ9Ik0xMS44MTIsMEM1LjI4OSwwLDAsNS4yODksMCwxMS44MTJzNS4yODksMTEuODEzLDExLjgxMiwxMS44MTNzMTEuODEzLTUuMjksMTEuODEzLTExLjgxMw0KCQlTMTguMzM1LDAsMTEuODEyLDB6IE0xNC4yNzEsMTguMzA3Yy0wLjYwOCwwLjI0LTEuMDkyLDAuNDIyLTEuNDU1LDAuNTQ4Yy0wLjM2MiwwLjEyNi0wLjc4MywwLjE4OS0xLjI2MiwwLjE4OQ0KCQljLTAuNzM2LDAtMS4zMDktMC4xOC0xLjcxNy0wLjUzOXMtMC42MTEtMC44MTQtMC42MTEtMS4zNjdjMC0wLjIxNSwwLjAxNS0wLjQzNSwwLjA0NS0wLjY1OWMwLjAzMS0wLjIyNCwwLjA4LTAuNDc2LDAuMTQ3LTAuNzU5DQoJCWwwLjc2MS0yLjY4OGMwLjA2Ny0wLjI1OCwwLjEyNS0wLjUwMywwLjE3MS0wLjczMWMwLjA0Ni0wLjIzLDAuMDY4LTAuNDQxLDAuMDY4LTAuNjMzYzAtMC4zNDItMC4wNzEtMC41ODItMC4yMTItMC43MTcNCgkJYy0wLjE0My0wLjEzNS0wLjQxMi0wLjIwMS0wLjgxMy0wLjIwMWMtMC4xOTYsMC0wLjM5OCwwLjAyOS0wLjYwNSwwLjA5Yy0wLjIwNSwwLjA2My0wLjM4MywwLjEyLTAuNTI5LDAuMTc2bDAuMjAxLTAuODI4DQoJCWMwLjQ5OC0wLjIwMywwLjk3NS0wLjM3NywxLjQzLTAuNTIxYzAuNDU1LTAuMTQ2LDAuODg1LTAuMjE4LDEuMjktMC4yMThjMC43MzEsMCwxLjI5NSwwLjE3OCwxLjY5MiwwLjUzDQoJCWMwLjM5NSwwLjM1MywwLjU5NCwwLjgxMiwwLjU5NCwxLjM3NmMwLDAuMTE3LTAuMDE0LDAuMzIzLTAuMDQxLDAuNjE3Yy0wLjAyNywwLjI5NS0wLjA3OCwwLjU2NC0wLjE1MiwwLjgxMWwtMC43NTcsMi42OA0KCQljLTAuMDYyLDAuMjE1LTAuMTE3LDAuNDYxLTAuMTY3LDAuNzM2Yy0wLjA0OSwwLjI3NS0wLjA3MywwLjQ4NS0wLjA3MywwLjYyNmMwLDAuMzU2LDAuMDc5LDAuNTk5LDAuMjM5LDAuNzI4DQoJCWMwLjE1OCwwLjEyOSwwLjQzNSwwLjE5NCwwLjgyNywwLjE5NGMwLjE4NSwwLDAuMzkyLTAuMDMzLDAuNjI2LTAuMDk3YzAuMjMyLTAuMDY0LDAuNC0wLjEyMSwwLjUwNi0wLjE3TDE0LjI3MSwxOC4zMDd6DQoJCSBNMTQuMTM3LDcuNDI5Yy0wLjM1MywwLjMyOC0wLjc3OCwwLjQ5Mi0xLjI3NSwwLjQ5MmMtMC40OTYsMC0wLjkyNC0wLjE2NC0xLjI4LTAuNDkyYy0wLjM1NC0wLjMyOC0wLjUzMy0wLjcyNy0wLjUzMy0xLjE5Mw0KCQljMC0wLjQ2NSwwLjE4LTAuODY1LDAuNTMzLTEuMTk2YzAuMzU2LTAuMzMyLDAuNzg0LTAuNDk3LDEuMjgtMC40OTdjMC40OTcsMCwwLjkyMywwLjE2NSwxLjI3NSwwLjQ5Nw0KCQljMC4zNTMsMC4zMzEsMC41MywwLjczMSwwLjUzLDEuMTk2QzE0LjY2Nyw2LjcwMywxNC40OSw3LjEwMSwxNC4xMzcsNy40Mjl6Ii8+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg=="},function(t,e,a){},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iQ2FwYV8xIgogICB4PSIwcHgiCiAgIHk9IjBweCIKICAgdmlld0JveD0iMCAwIDU3IDU3IgogICBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1NyA1NzsiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImFkZC1zZWxlY3RlZC1uZXcuc3ZnIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjQgKDVkYTY4OWMzMTMsIDIwMTktMDEtMTQpIj48bWV0YWRhdGEKICAgaWQ9Im1ldGFkYXRhNDciPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGU+PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgaWQ9ImRlZnM0NSI+CgkKCQoJCgkKPC9kZWZzPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTA5NyIKICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNzE5IgogICBpZD0ibmFtZWR2aWV3NDMiCiAgIHNob3dncmlkPSJmYWxzZSIKICAgaW5rc2NhcGU6em9vbT0iNC4xNDAzNTA5IgogICBpbmtzY2FwZTpjeD0iLTEwLjc0Nzg4MSIKICAgaW5rc2NhcGU6Y3k9IjI4LjUiCiAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIKICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iQ2FwYV8xIiAvPgo8cGF0aAogICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICBpZD0icGF0aDIiCiAgIGQ9Ik0gMjguNjYsNiBIIDkuMzQgQyA3LjQ5OCw2IDYsNy40OTggNiw5LjM0IFYgMjguNjYgQyA2LDMwLjUwMiA3LjQ5OCwzMiA5LjM0LDMyIEggMjguNjYgQyAzMC41MDIsMzIgMzIsMzAuNTAyIDMyLDI4LjY2IFYgOS4zNCBDIDMyLDcuNDk4IDMwLjUwMiw2IDI4LjY2LDYgWiIgLz48cGF0aAogICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICBpZD0icGF0aDgiCiAgIGQ9Ik0gNTEsMzcgSCA0MSBWIDI3IGMgMCwtMS4xMDQgLTAuODk2LC0yIC0yLC0yIC0xLjEwNCwwIC0yLDAuODk2IC0yLDIgViAzNyBIIDI3IGMgLTEuMTA0LDAgLTIsMC44OTYgLTIsMiAwLDEuMTA0IDAuODk2LDIgMiwyIGggMTAgdiAxMCBjIDAsMS4xMDQgMC44OTYsMiAyLDIgMS4xMDQsMCAyLC0wLjg5NiAyLC0yIFYgNDEgaCAxMCBjIDEuMTA0LDAgMiwtMC44OTYgMiwtMiAwLC0xLjEwNCAtMC44OTYsLTIgLTIsLTIgeiIgLz4KPGcKICAgaWQ9ImcxMiI+CjwvZz4KPGcKICAgaWQ9ImcxNCI+CjwvZz4KPGcKICAgaWQ9ImcxNiI+CjwvZz4KPGcKICAgaWQ9ImcxOCI+CjwvZz4KPGcKICAgaWQ9ImcyMCI+CjwvZz4KPGcKICAgaWQ9ImcyMiI+CjwvZz4KPGcKICAgaWQ9ImcyNCI+CjwvZz4KPGcKICAgaWQ9ImcyNiI+CjwvZz4KPGcKICAgaWQ9ImcyOCI+CjwvZz4KPGcKICAgaWQ9ImczMCI+CjwvZz4KPGcKICAgaWQ9ImczMiI+CjwvZz4KPGcKICAgaWQ9ImczNCI+CjwvZz4KPGcKICAgaWQ9ImczNiI+CjwvZz4KPGcKICAgaWQ9ImczOCI+CjwvZz4KPGcKICAgaWQ9Imc0MCI+CjwvZz4KPC9zdmc+"},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTcgNTciIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDU3IDU3OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Zz4NCgk8cGF0aCBkPSJNMjIuNjYsMEgzLjM0QzEuNDk4LDAsMCwxLjQ5OCwwLDMuMzR2MTkuMzJDMCwyNC41MDIsMS40OTgsMjYsMy4zNCwyNmgxOS4zMmMxLjg0MiwwLDMuMzQtMS40OTgsMy4zNC0zLjM0VjMuMzQNCgkJQzI2LDEuNDk4LDI0LjUwMiwwLDIyLjY2LDB6Ii8+DQoJPHBhdGggZD0iTTMzLjM0LDI2aDE5LjMyYzEuODQyLDAsMy4zNC0xLjQ5OCwzLjM0LTMuMzRWMy4zNEM1NiwxLjQ5OCw1NC41MDIsMCw1Mi42NiwwSDMzLjM0QzMxLjQ5OCwwLDMwLDEuNDk4LDMwLDMuMzR2MTkuMzINCgkJQzMwLDI0LjUwMiwzMS40OTgsMjYsMzMuMzQsMjZ6Ii8+DQoJPHBhdGggZD0iTTIyLjY2LDMwSDMuMzRDMS40OTgsMzAsMCwzMS40OTgsMCwzMy4zNHYxOS4zMkMwLDU0LjUwMiwxLjQ5OCw1NiwzLjM0LDU2aDE5LjMyYzEuODQyLDAsMy4zNC0xLjQ5OCwzLjM0LTMuMzRWMzMuMzQNCgkJQzI2LDMxLjQ5OCwyNC41MDIsMzAsMjIuNjYsMzB6Ii8+DQoJPHBhdGggZD0iTTU1LDQxSDQ1VjMxYzAtMS4xMDQtMC44OTYtMi0yLTJzLTIsMC44OTYtMiwydjEwSDMxYy0xLjEwNCwwLTIsMC44OTYtMiwyczAuODk2LDIsMiwyaDEwdjEwYzAsMS4xMDQsMC44OTYsMiwyLDINCgkJczItMC44OTYsMi0yVjQ1aDEwYzEuMTA0LDAsMi0wLjg5NiwyLTJTNTYuMTA0LDQxLDU1LDQxeiIvPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPC9zdmc+DQo="},function(t,e){t.exports=require("tippy.js/dist/tippy.css")},function(t,e){t.exports=require("react-tooltip")},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNzUuNDA2cHgiIGhlaWdodD0iNzUuNDA2cHgiIHZpZXdCb3g9IjAgMCA3NS40MDYgNzUuNDA2IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA3NS40MDYgNzUuNDA2OyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNMzUuNDM2LDBINy43NTV2NjMuOTUyaDI3LjY4MkwzNS40MzYsMEwzNS40MzYsMHogTTMyLjU3Myw2MS4wODlIMTAuNjE4VjIuODYzaDIxLjk1NVY2MS4wODl6IE03MC4yNzQsMjYuNDg4aC0yNy42OAoJCXYzNy40NjRoMjcuNjgyVjI2LjQ4OEg3MC4yNzR6IE02Ny40MTIsNjEuMDg5SDQ1LjQ1N1YyOS4zNTFoMjEuOTU1VjYxLjA4OXogTTc0LjU3MSw3MC4zOTV2NS4wMTJIMC44MzV2LTUuMDEySDc0LjU3MXoiLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K"},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iOTAuOTU2cHgiIGhlaWdodD0iOTAuOTU3cHgiIHZpZXdCb3g9IjAgMCA5MC45NTYgOTAuOTU3IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA5MC45NTYgOTAuOTU3OyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNNDEuNjYxLDEzLjUwMUgxMy45Nzl2NjMuOTUzaDI3LjY4MlYxMy41MDF6IE0zOC43OTcsNzQuNTkxSDE2Ljg0MlYxNi4zNjZoMjEuOTU1Vjc0LjU5MXogTTc2LjQ5OSwyNi43NDdINDguODE4djM3LjQ2NQoJCUg3Ni41TDc2LjQ5OSwyNi43NDdMNzYuNDk5LDI2Ljc0N3ogTTczLjYzNyw2MS4zNDdINTEuNjgyVjI5LjYwOWgyMS45NTVWNjEuMzQ3eiBNMTAuOTc4LDQyLjk3M3Y1LjAxMUgwdi01LjAxMUgxMC45Nzh6CgkJIE05MC45NTYsNDIuOTczdjUuMDExSDc5Ljk3OXYtNS4wMTFIOTAuOTU2eiIvPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+Cjwvc3ZnPgo="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNzUuNDA2cHgiIGhlaWdodD0iNzUuNDA2cHgiIHZpZXdCb3g9IjAgMCA3NS40MDYgNzUuNDA2IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA3NS40MDYgNzUuNDA2OyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNMzUuNDM2LDExLjQ1NEg3Ljc1NXY2My45NTJoMjcuNjgyTDM1LjQzNiwxMS40NTRMMzUuNDM2LDExLjQ1NHogTTMyLjU3Myw3Mi41NDNIMTAuNjE4VjE0LjMxN2gyMS45NTVWNzIuNTQzegoJCSBNNzAuMjc0LDExLjQ1NGgtMjcuNjh2MzcuNDY0aDI3LjY4MlYxMS40NTRINzAuMjc0eiBNNjcuNDEyLDQ2LjA1NUg0NS40NTdWMTQuMzE3aDIxLjk1NVY0Ni4wNTV6IE0wLjgzNSw1LjAxMVYwaDczLjczNnY1LjAxMQoJCUgwLjgzNXoiLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K"},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iOTAuOTU2cHgiIGhlaWdodD0iOTAuOTU2cHgiIHZpZXdCb3g9IjAgMCA5MC45NTYgOTAuOTU2IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA5MC45NTYgOTAuOTU2OyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNNzcuNDU0LDQxLjY2MVYxMy45NzlIMTMuNTAydjI3LjY4Mkg3Ny40NTR6IE0xNi4zNjUsMzguNzk3VjE2Ljg0Mmg1OC4yMjZ2MjEuOTU1SDE2LjM2NXogTTY0LjIxLDc2LjQ5OVY0OC44MThIMjYuNzQ2CgkJVjc2LjVMNjQuMjEsNzYuNDk5TDY0LjIxLDc2LjQ5OXogTTI5LjYwOSw3My42MzdWNTEuNjgyaDMxLjczN3YyMS45NTVIMjkuNjA5eiBNNDcuOTgyLDEwLjk3OGgtNS4wMVYwaDUuMDFWMTAuOTc4egoJCSBNNDcuOTgyLDkwLjk1NmgtNS4wMVY3OS45NzloNS4wMVY5MC45NTZ6Ii8+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+Cg=="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNzUuNDA2cHgiIGhlaWdodD0iNzUuNDA2cHgiIHZpZXdCb3g9IjAgMCA3NS40MDYgNzUuNDA2IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA3NS40MDYgNzUuNDA2OyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNNzUuNDA2LDM1LjQzNlY3Ljc1NUgxMS40NTR2MjcuNjgyTDc1LjQwNiwzNS40MzZMNzUuNDA2LDM1LjQzNnogTTE0LjMxNywzMi41NzNWMTAuNjE4aDU4LjIyNnYyMS45NTVIMTQuMzE3egoJCSBNNDguOTE4LDcwLjI3NVY0Mi41OTVIMTEuNDU0djI3LjY4Mkw0OC45MTgsNzAuMjc1TDQ4LjkxOCw3MC4yNzV6IE0xNC4zMTcsNjcuNDEyVjQ1LjQ1N2gzMS43Mzh2MjEuOTU1SDE0LjMxN3ogTTUuMDExLDc0LjU3MUgwCgkJVjAuODM1aDUuMDExVjc0LjU3MXoiLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K"},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNzUuNDA2cHgiIGhlaWdodD0iNzUuNDA2cHgiIHZpZXdCb3g9IjAgMCA3NS40MDYgNzUuNDA2IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA3NS40MDYgNzUuNDA2OyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNNjMuOTUyLDM1LjQzNlY3Ljc1NUgwdjI3LjY4Mkw2My45NTIsMzUuNDM2TDYzLjk1MiwzNS40MzZ6IE0yLjg2MywzMi41NzNWMTAuNjE4SDYxLjA5djIxLjk1NUgyLjg2M3ogTTYzLjk1Miw3MC4yNzUKCQlWNDIuNTk1SDI2LjQ4OHYyNy42ODJMNjMuOTUyLDcwLjI3NUw2My45NTIsNzAuMjc1eiBNMjkuMzUxLDY3LjQxMlY0NS40NTdoMzEuNzM3djIxLjk1NUgyOS4zNTF6IE03MC4zOTUsMC44MzVoNS4wMTJ2NzMuNzM2CgkJaC01LjAxMlYwLjgzNXoiLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K"},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOC4xLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iQ2FwYV8xIgogICB4PSIwcHgiCiAgIHk9IjBweCIKICAgdmlld0JveD0iMCAwIDYxMiA2MTIiCiAgIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDYxMiA2MTI7IgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkxIHIxMzcyNSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZGVsZXRlLXNpbXBsZS5zdmciPjxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQzIj48cmRmOlJERj48Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPjwvY2M6V29yaz48L3JkZjpSREY+PC9tZXRhZGF0YT48ZGVmcwogICAgIGlkPSJkZWZzNDEiIC8+PHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaWQ9Im5hbWVkdmlldzM5IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIxLjA5MDcwMDciCiAgICAgaW5rc2NhcGU6Y3g9IjI5NS4wMzQwOCIKICAgICBpbmtzY2FwZTpjeT0iMzMwLjg1NDQ4IgogICAgIGlua3NjYXBlOndpbmRvdy14PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJDYXBhXzEiIC8+PGcKICAgICBpZD0iZzUiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45OTc4ODEzNSwwLDAsMC45OTc4ODEzNSwxLjczMDQwMTIsMC45MjM3Mjg0NykiPjxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InBhdGg3IgogICAgICAgZD0iTSA1ODcuODI2LDE4Ni45NjYgQyA1NzEuNzEsMTQ5LjYzNCA1NDkuODgyLDExNy4xOTggNTIyLjM0Miw4OS42NTggNDk0LjgwMiw2Mi4xMTggNDYyLjM2Niw0MC4yOSA0MjUuMDM0LDI0LjE3NCAzODcuNzAyLDguMDU4IDM0OC4wMjQsMCAzMDYsMCAyNzcuODQ4LDAgMjUwLjcxNiwzLjY3MiAyMjQuNjA0LDExLjAxNiAxOTguNDkyLDE4LjM2IDE3NC4xMTQsMjguNjYyIDE1MS40Nyw0MS45MjIgMTI4LjgyNiw1NS4xODIgMTA4LjIyMiw3MS4wOTQgODkuNjU4LDg5LjY1OCA3MS4wOTQsMTA4LjIyMiA1NS4xODIsMTI4LjgyNiA0MS45MjIsMTUxLjQ3IDI4LjY2MiwxNzQuMTE2IDE4LjM2LDE5OC40OTIgMTEuMDE2LDIyNC42MDQgMy42NzIsMjUwLjcxNiAwLDI3Ny44NDggMCwzMDYgYyAwLDI4LjE1MiAzLjY3Miw1NS4yODQgMTEuMDE2LDgxLjM5NiA3LjM0NCwyNi4xMSAxNy42NDYsNTAuNDg3IDMwLjkwNiw3My4xMzQgMTMuMjYsMjIuNjQ0IDI5LjE3Miw0My4yNDkgNDcuNzM2LDYxLjgxMiAxOC41NjQsMTguNTY0IDM5LjE2OCwzNC40NzggNjEuODEyLDQ3LjczNiAyMi42NDQsMTMuMjYgNDcuMDIyLDIzLjU2MSA3My4xMzQsMzAuOTA2IEMgMjUwLjcxNiw2MDguMzI4IDI3Ny44NDgsNjEyIDMwNiw2MTIgYyAyOC4xNTIsMCA1NS4yODQsLTMuNjcyIDgxLjM5NiwtMTEuMDE2IDI2LjExMSwtNy4zNDYgNTAuNDg4LC0xNy42NDYgNzMuMTM1LC0zMC45MDYgMjIuNjQ0LC0xMy4yNTkgNDMuMjQ5LC0yOS4xNzIgNjEuODEyLC00Ny43MzYgMTguNTY0LC0xOC41NjMgMzQuNDc4LC0zOS4xNjggNDcuNzM2LC02MS44MTIgMTMuMjYsLTIyLjY0NiAyMy41NjEsLTQ3LjAyMyAzMC45MDYsLTczLjEzNSBDIDYwOC4zMjgsMzYxLjI4NCA2MTIsMzM0LjE1MiA2MTIsMzA2IDYxMiwyNjMuOTc2IDYwMy45NDIsMjI0LjI5OCA1ODcuODI2LDE4Ni45NjYgWiBNIDQ2OC4xOCwzOTEuNjggYyAyLjA0LDIuMDQgMy4wNjMsNC4yODQgMy4wNjMsNi43MzIgMCwyLjQ0OCAtMS4wMjEsNC40ODggLTMuMDYzLDYuMTIgbCAtNTkuOTc2LDYwLjU4OCBjIC0xLjYzMSwxLjYzMiAtMy44NzYsMi40NDggLTYuNzMyLDIuNDQ4IC0yLjg1NCwwIC00Ljg5NSwtMC44MTYgLTYuMTIsLTIuNDQ4IEwgMzA5LjA2LDM3OC44MjggMjIzLjM4LDQ2NS4xMiBjIC0yLjQ0OCwxLjYzMiAtNC42OTIsMi40NDggLTYuNzMyLDIuNDQ4IC0xLjYzMiwwIC0zLjY3MiwtMC44MTYgLTYuMTIsLTIuNDQ4IGwgLTU5Ljk3NiwtNjAuNTg4IGMgLTIuMDQsLTEuMjI2IC0zLjA2LC0zLjI2NyAtMy4wNiwtNi4xMiAwLC0yLjQ0OCAxLjAyLC00LjY5MiAzLjA2LC02LjczMiBsIDg1LjY4LC04NS42OCAtODUuNjgsLTg1LjY4IGMgLTIuMDQsLTIuMDQgLTMuMDYsLTQuMjg0IC0zLjA2LC02LjczMiAwLC0yLjg1NiAxLjAyLC00Ljg5NiAzLjA2LC02LjEyIGwgNTkuOTc2LC02MC41ODggYyAxLjYzMiwtMS42MzIgMy42NzIsLTIuNDQ4IDYuMTIsLTIuNDQ4IDIuNDQ4LDAgNC42OTIsMC44MTYgNi43MzIsMi40NDggbCA4NS42OCw4Ni4yOTIgODYuMjkyLC04Ni4yOTIgYyAxLjYzNSwtMS42MzIgMy42NzUsLTIuNDQ4IDYuMTIsLTIuNDQ4IDIuNDQ4LDAgNC42OTIsMC44MTYgNi43MzIsMi40NDggbCA1OS45NzYsNjAuNTg4IGMgMi4wNCwxLjYzMiAzLjA2MywzLjY3MiAzLjA2Myw2LjEyIDAsMi40NDggLTEuMDIxLDQuNjkyIC0zLjA2Myw2LjczMiBMIDM4Mi41LDMwNiBsIDg1LjY4LDg1LjY4IHoiCiAgICAgICBzdHlsZT0iZmlsbDojMDEwMDAyIiAvPjwvZz48ZwogICAgIGlkPSJnOSIgLz48ZwogICAgIGlkPSJnMTEiIC8+PGcKICAgICBpZD0iZzEzIiAvPjxnCiAgICAgaWQ9ImcxNSIgLz48ZwogICAgIGlkPSJnMTciIC8+PGcKICAgICBpZD0iZzE5IiAvPjxnCiAgICAgaWQ9ImcyMSIgLz48ZwogICAgIGlkPSJnMjMiIC8+PGcKICAgICBpZD0iZzI1IiAvPjxnCiAgICAgaWQ9ImcyNyIgLz48ZwogICAgIGlkPSJnMjkiIC8+PGcKICAgICBpZD0iZzMxIiAvPjxnCiAgICAgaWQ9ImczMyIgLz48ZwogICAgIGlkPSJnMzUiIC8+PGcKICAgICBpZD0iZzM3IiAvPjwvc3ZnPg=="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNTQxLjkxMXB4IiBoZWlnaHQ9IjU0MS45MTFweCIgdmlld0JveD0iMCAwIDU0MS45MTEgNTQxLjkxMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTQxLjkxMSA1NDEuOTExOyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNNDY3LjgyNiw4Ljc4MXY0Ny40NTFINzQuMDkxVjguNzgxYzAtNC42MDgtMy43MjktOC4zMzQtOC4zMzQtOC4zMzRjLTQuNjA3LDAtOC4zMzQsMy43MjctOC4zMzQsOC4zMzR2NDkuMDY4SDguMzM0CgkJQzMuNzMsNTcuODQ5LDAsNjEuNTg0LDAsNjYuMTgzYzAsNC42MDcsMy43Myw4LjMzNCw4LjMzNCw4LjMzNGg0OS4wODN2MzkyLjg2OEg4LjMzNGMtNC42MDQsMC04LjMzNCwzLjcyOS04LjMzNCw4LjMzNAoJCWMwLDQuNjEsMy43Myw4LjMzNCw4LjMzNCw4LjMzNGg0OS4wODN2NDkuMDc3YzAsNC42MDQsMy43MjcsOC4zMzQsOC4zMzQsOC4zMzRjNC42MDQsMCw4LjMzNC0zLjcyOSw4LjMzNC04LjMzNHYtNDkuMDc3aDM5My43NAoJCXY0OS4wNzdjMCw0LjYwNCwzLjcyOSw4LjMzNCw4LjMzNCw4LjMzNGM0LjYxLDAsOC4zMzQtMy43MjksOC4zMzQtOC4zMzR2LTQ5LjA3N2g0OS4wODNjNC42MDQsMCw4LjMzNC0zLjcyNCw4LjMzNC04LjMzNAoJCWMwLTQuNjA0LTMuNzI5LTguMzM0LTguMzM0LTguMzM0aC00OC4zMzJWNzQuNTE3aDQ4LjMzMmM0LjYwNCwwLDguMzM0LTMuNzI3LDguMzM0LTguMzM0YzAtNC41OTktMy43MjktOC4zMzQtOC4zMzQtOC4zMzRoLTQ5LjA4MwoJCVY4Ljc4MWMwLTQuNjA4LTMuNzI0LTguMzM0LTguMzM0LTguMzM0QzQ3MS41NTUsMC40NDYsNDY3LjgyNiw0LjE3Myw0NjcuODI2LDguNzgxeiBNNDY4LjIwNCwzNDAuNTI4djEyNi44NTdIMzQwLjQxM1YzNDAuNTI4CgkJSDQ2OC4yMDR6IE0zMzQuODU3LDM0MC41Mjh2MTI2Ljg1N0gyMDcuNDM2VjM0MC41MjhIMzM0Ljg1N3ogTTIwMS41MDQsMzQwLjUyOHYxMjYuODU3SDc0LjA5MVYzNDAuNTI4SDIwMS41MDR6IE00NjguMjA0LDIwNy4xNzIKCQl2MTI3LjhIMzQwLjQxM3YtMTI3LjhINDY4LjIwNHogTTMzNC44NTcsMjA3LjE3MnYxMjcuOEgyMDcuNDM2di0xMjcuOEgzMzQuODU3eiBNMjAxLjUwNCwyMDcuMTcydjEyNy44SDc0LjA5MXYtMTI3LjhIMjAxLjUwNHoKCQkgTTQ2OC4yMDQsNzMuODI5djEyNy43ODhIMzQwLjQxM1Y3My44MjlINDY4LjIwNHogTTMzNC44NTcsNzMuODI5djEyNy43ODhIMjA3LjQzNlY3My44MjlIMzM0Ljg1N3ogTTIwMS41MDQsNzMuODI5djEyNy43ODgKCQlINzQuMDkxVjczLjgyOUgyMDEuNTA0eiBNMzIzLjQxNCw4My44ODVWMTg4Ljc5SDIxOC41MDZWODMuODg1SDMyMy40MTR6Ii8+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+Cg=="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNDE4cHgiIGhlaWdodD0iNDE4cHgiIHZpZXdCb3g9IjAgMCA0MTggNDE4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0MTggNDE4OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxnPgoJPGc+CgkJPGc+CgkJCTxwYXRoIGQ9Ik05MS42MDYsMTQzLjcwM2MtMy4xNDYtMy4xNDYtNy44NzctNC4wODctMTEuOTg4LTIuMzg1Yy00LjExLDEuNzAzLTYuNzksNS43MTQtNi43OSwxMC4xNjN2MTE1LjAzNwoJCQkJYzAsNC40NDksMi42OCw4LjQ2MSw2Ljc5LDEwLjE2NGMxLjM2MSwwLjU2MywyLjc5LDAuODM2LDQuMjA4LDAuODM2YzIuODYyLDAsNS42NzYtMS4xMTYsNy43OC0zLjIyMmw1Ny41Mi01Ny41MTkKCQkJCWMyLjA2My0yLjA2MywzLjIyMi00Ljg2MSwzLjIyMi03Ljc3OHMtMS4xNTktNS43MTYtMy4yMjItNy43NzhMOTEuNjA2LDE0My43MDN6Ii8+CgkJCTxwYXRoIGQ9Ik0zMzguMzgyLDE0MS4zMThjLTQuMTA3LTEuNy04Ljg0MS0wLjc2My0xMS45ODcsMi4zODVsLTU3LjUyMSw1Ny41MTljLTIuMDYyLDIuMDYzLTMuMjIyLDQuODYxLTMuMjIyLDcuNzc4CgkJCQlzMS4xNTgsNS43MTYsMy4yMjIsNy43NzdsNTcuNTIxLDU3LjUyYzIuMTA0LDIuMTA0LDQuOTE4LDMuMjIzLDcuNzc5LDMuMjIzYzEuNDE3LDAsMi44NDgtMC4yNzIsNC4yMDgtMC44MzgKCQkJCWM0LjExLTEuNzAzLDYuNzktNS43MTQsNi43OS0xMC4xNjJWMTUxLjQ4MUMzNDUuMTcyLDE0Ny4wMzIsMzQyLjQ5MiwxNDMuMDIxLDMzOC4zODIsMTQxLjMxOHoiLz4KCQkJPHBhdGggZD0iTTIxMiwwaC02Yy02LjA3NSwwLTExLDQuOTI1LTExLDExdjM1YzAsNi4wNzUsNC45MjUsMTEsMTEsMTFoNmM2LjA3NSwwLDExLTQuOTI1LDExLTExVjExQzIyMyw0LjkyNSwyMTguMDc1LDAsMjEyLDB6IgoJCQkJLz4KCQkJPHBhdGggZD0iTTIxMiw5NS4zNTJoLTZjLTYuMDc1LDAtMTEsNC45MjUtMTEsMTF2NzIuNDczYzAsNi4wNzUsNC45MjUsMTEsMTEsMTFoNmM2LjA3NSwwLDExLTQuOTI1LDExLTExdi03Mi40NzMKCQkJCUMyMjMsMTAwLjI3NiwyMTguMDc1LDk1LjM1MiwyMTIsOTUuMzUyeiIvPgoJCQk8cGF0aCBkPSJNMjEyLDIyOC4xNzZoLTZjLTYuMDc1LDAtMTEsNC45MjYtMTEsMTF2NzIuNDc0YzAsNi4wNzUsNC45MjUsMTEsMTEsMTFoNmM2LjA3NSwwLDExLTQuOTI1LDExLTExdi03Mi40NzQKCQkJCUMyMjMsMjMzLjEwMiwyMTguMDc1LDIyOC4xNzYsMjEyLDIyOC4xNzZ6Ii8+CgkJCTxwYXRoIGQ9Ik0yMTIsMzYxaC02Yy02LjA3NSwwLTExLDQuOTI1LTExLDExdjM1YzAsNi4wNzUsNC45MjUsMTEsMTEsMTFoNmM2LjA3NSwwLDExLTQuOTI1LDExLTExdi0zNQoJCQkJQzIyMywzNjUuOTI1LDIxOC4wNzUsMzYxLDIxMiwzNjF6Ii8+CgkJPC9nPgoJPC9nPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+Cjwvc3ZnPgo="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNDk3LjE5OXB4IiBoZWlnaHQ9IjQ5Ny4xOTlweCIgdmlld0JveD0iMCAwIDQ5Ny4xOTkgNDk3LjE5OSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDk3LjE5OSA0OTcuMTk5OyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNMTkxLjIsMjQ4LjZjMC0xNS4zLDUuNy0yOC43LDE3LjItNDAuMnMyNC45LTE3LjIsNDAuMi0xNy4yTDE5MS4yLDI0OC42eiBNMTc0LDI2NS44Yy0xLjktNS43LTEuOS0xMS41LTEuOS0xNy4yCgkJYzAtNDIuMSwzNC40LTc2LjUsNzYuNS03Ni41YzUuNzAxLDAsMTEuNSwwLDE3LjIwMSwxLjlsNTEuNi01MS42Yy0yMS01LjctNDQtNy43LTY4LjktNy43Qzc2LjUsMTE0LjcsMCwyNDguNiwwLDI0OC42CgkJczMwLjYsNTMuNSw5Ny41LDkzLjdMMTc0LDI2NS44eiBNMzA2LDI0OC42TDI0OC42LDMwNmMxNS4zLDAsMjguNzAxLTUuNyw0MC4yMDEtMTcuMkMzMDAuMTk5LDI3Ny4zLDMwNiwyNjMuODk5LDMwNiwyNDguNnoKCQkgTTM5OS42OTksMTU0Ljg5OWwtNzYuNSw3Ni41YzEuOSw1LjcsMS45LDExLjUsMS45LDE3LjJjMCw0Mi4xLTM0LjQsNzYuNS03Ni41LDc2LjVjLTUuNywwLTExLjUsMC0xNy4yLTEuOUwxNzkuOCwzNzQuOAoJCWMyMSw1LjcsNDQsNy42LDY4LjgsNy42YzE3Mi4wOTksMCwyNDguNTk5LTEzMy45LDI0OC41OTktMTMzLjlTNDY2LjYsMTk1LjEsMzk5LjY5OSwxNTQuODk5eiBNNDAxLjQsNzYuODk5bC0zMjQuNSwzMjQuNQoJCWwxOC45LDE4LjlMNDIwLjQsOTUuN0w0MDEuNCw3Ni44OTl6Ii8+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+Cg=="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iQ2FwYV8xIgogICB4PSIwcHgiCiAgIHk9IjBweCIKICAgd2lkdGg9IjQ4NS4yMTVweCIKICAgaGVpZ2h0PSI0ODUuMjE1cHgiCiAgIHZpZXdCb3g9IjAgMCA0ODUuMjE1IDQ4NS4yMTUiCiAgIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ4NS4yMTUgNDg1LjIxNTsiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJfbGF5b3V0LXByb3BlcnRpZXMuc3ZnIj48bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0MSI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGUgLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczM5IiAvPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTA4OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI2NjYiCiAgICAgaWQ9Im5hbWVkdmlldzM3IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIwLjQ4NjM4MjMzIgogICAgIGlua3NjYXBlOmN4PSItNzYuMzQ1OTcyIgogICAgIGlua3NjYXBlOmN5PSI0MDcuMDg3MTYiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjY0OSIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iNTAiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJDYXBhXzEiIC8+PGcKICAgICBpZD0iZzEwMzQ5IgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNTU1NjUxLDAsMCw5LjU1NTY1MSwzMy42MTk5MTksMjAuMDQ5NjkzKSI+PGcKICAgICAgIGlkPSJMYXllcl8xXzExMF8iPjxnCiAgICAgICAgIGlkPSJnMTAzNTIiPjxwYXRoCiAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICBkPSJtIDE3LjU2NywxNS45MzggLTIuODU5LC0yLjcwMiBjIDAuMzMzLC0wLjYwNSAwLjUzOSwtMS4yOSAwLjUzOSwtMi4wMjkgMCwtMi4zNDIgLTEuODk3LC00LjIzOSAtNC4yNCwtNC4yMzkgLTIuMzQzLDAgLTQuMjQzLDEuODk2IC00LjI0Myw0LjIzOSAwLDIuMzQzIDEuOSw0LjI0MSA0LjI0Myw0LjI0MSAwLjgyNiwwIDEuNTksLTAuMjQ2IDIuMjQyLC0wLjY1NCBsIDIuODU1LDIuNjk5IGMgMC40MzIsLTAuNTcxIDAuOTE5LC0xLjA5NCAxLjQ2MywtMS41NTUgeiIKICAgICAgICAgICBpZD0icGF0aDEwMzU0IiAvPjxwYXRoCiAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICBkPSJtIDI5LjY2LDE1LjYgMy43OTksLTYuMzkzIGMgMC4zNzQsMC4xMDcgMC43NjIsMC4xODQgMS4xNjksMC4xODQgMi4zNDcsMCA0LjI0NCwtMS44OTggNC4yNDQsLTQuMjQxIDAsLTIuMzQyIC0xLjg5NywtNC4yMzkgLTQuMjQ0LC00LjIzOSAtMi4zNDMsMCAtNC4yMzksMS44OTYgLTQuMjM5LDQuMjM5IDAsMS4xNjMgMC40NjksMi4yMTQgMS4yMjcsMi45ODEgbCAtMy43ODcsNi4zNzUgYyAwLjY1MSwwLjI5NSAxLjI2NSwwLjY2MyAxLjgzMSwxLjA5NCB6IgogICAgICAgICAgIGlkPSJwYXRoMTAzNTYiIC8+PHBhdGgKICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgIGQ9Im0gNDIuNzYyLDIwLjk1MiBjIC0xLjgyNCwwIC0zLjM2OSwxLjE1OSAtMy45NjgsMi43NzUgbCAtNS4yNzgsLTAuNTIxIGMgMCwwLjA0IDAuMDA2LDAuMDc4IDAuMDA2LDAuMTE3IDAsMC42ODggLTAuMDc2LDEuMzYgLTAuMjEzLDIuMDA5IGwgNS4yNzYsMC41MjEgYyAwLjMxOSwyLjAyNCAyLjA2MiwzLjU3NiA0LjE3NywzLjU3NiAyLjM0MiwwIDQuMjM4LC0xLjg5NiA0LjIzOCwtNC4yMzggMCwtMi4zNDEgLTEuODk2LC00LjIzOSAtNC4yMzgsLTQuMjM5IHoiCiAgICAgICAgICAgaWQ9InBhdGgxMDM1OCIgLz48cGF0aAogICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgZD0ibSAyOC4xOTcsMzcuNjI0IC0xLjE4LC01LjE1NiBjIC0wLjY2NiwwLjIzMiAtMS4zNTksMC4zOTggLTIuMDgyLDAuNDgxIGwgMS4xODIsNS4xNTcgYyAtMS4zNTUsMC43MDkgLTIuMjksMi4xMSAtMi4yOSwzLjc0NiAwLDIuMzQyIDEuODk2LDQuMjM3IDQuMjQzLDQuMjM3IDIuMzQyLDAgNC4yMzgsLTEuODk2IDQuMjM4LC00LjIzNyAwLjAwMywtMi4yOTkgLTEuODI5LC00LjE2IC00LjExMSwtNC4yMjggeiIKICAgICAgICAgICBpZD0icGF0aDEwMzYwIiAvPjxjaXJjbGUKICAgICAgICAgICBjeD0iMjMuODMiCiAgICAgICAgICAgY3k9IjIzLjMyMyIKICAgICAgICAgICByPSI3LjI3MDk5OTkiCiAgICAgICAgICAgaWQ9ImNpcmNsZTEwMzY0IiAvPjwvZz48L2c+PC9nPjxnCiAgICAgaWQ9ImcxMDM2NiIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCg5LjU1NTY1MSwwLDAsOS41NTU2NTEsMTcuNjE5OTE5LDE4LjA0OTY5MykiIC8+PGcKICAgICBpZD0iZzEwMzY4IgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNTU1NjUxLDAsMCw5LjU1NTY1MSwxNy42MTk5MTksMTguMDQ5NjkzKSIgLz48ZwogICAgIGlkPSJnMTAzNzAiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOS41NTU2NTEsMCwwLDkuNTU1NjUxLDE3LjYxOTkxOSwxOC4wNDk2OTMpIiAvPjxnCiAgICAgaWQ9ImcxMDM3MiIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCg5LjU1NTY1MSwwLDAsOS41NTU2NTEsMTcuNjE5OTE5LDE4LjA0OTY5MykiIC8+PGcKICAgICBpZD0iZzEwMzc0IgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNTU1NjUxLDAsMCw5LjU1NTY1MSwxNy42MTk5MTksMTguMDQ5NjkzKSIgLz48ZwogICAgIGlkPSJnMTAzNzYiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOS41NTU2NTEsMCwwLDkuNTU1NjUxLDE3LjYxOTkxOSwxOC4wNDk2OTMpIiAvPjxnCiAgICAgaWQ9ImcxMDM3OCIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCg5LjU1NTY1MSwwLDAsOS41NTU2NTEsMTcuNjE5OTE5LDE4LjA0OTY5MykiIC8+PGcKICAgICBpZD0iZzEwMzgwIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNTU1NjUxLDAsMCw5LjU1NTY1MSwxNy42MTk5MTksMTguMDQ5NjkzKSIgLz48ZwogICAgIGlkPSJnMTAzODIiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOS41NTU2NTEsMCwwLDkuNTU1NjUxLDE3LjYxOTkxOSwxOC4wNDk2OTMpIiAvPjxnCiAgICAgaWQ9ImcxMDM4NCIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCg5LjU1NTY1MSwwLDAsOS41NTU2NTEsMTcuNjE5OTE5LDE4LjA0OTY5MykiIC8+PGcKICAgICBpZD0iZzEwMzg2IgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNTU1NjUxLDAsMCw5LjU1NTY1MSwxNy42MTk5MTksMTguMDQ5NjkzKSIgLz48ZwogICAgIGlkPSJnMTAzODgiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOS41NTU2NTEsMCwwLDkuNTU1NjUxLDE3LjYxOTkxOSwxOC4wNDk2OTMpIiAvPjxnCiAgICAgaWQ9ImcxMDM5MCIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCg5LjU1NTY1MSwwLDAsOS41NTU2NTEsMTcuNjE5OTE5LDE4LjA0OTY5MykiIC8+PGcKICAgICBpZD0iZzEwMzkyIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNTU1NjUxLDAsMCw5LjU1NTY1MSwxNy42MTk5MTksMTguMDQ5NjkzKSIgLz48ZwogICAgIGlkPSJnMTAzOTQiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOS41NTU2NTEsMCwwLDkuNTU1NjUxLDE3LjYxOTkxOSwxOC4wNDk2OTMpIiAvPjxnCiAgICAgaWQ9Imc0MzIwIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDQuNzU0NDI3MSwwLDAsNC43NTQ0MjcxLDcuODM5OTM2MSwyNjAuNzI3NDEpIj48ZwogICAgICAgaWQ9Imc0MjgwIj48cGF0aAogICAgICAgICBpZD0icGF0aDQyODIiCiAgICAgICAgIGQ9Im0gNDEuNTM0LDI4LjY2IDEuOTU3LDAgQyA0NC44NzcsMjguNjYgNDYsMjcuNTM2IDQ2LDI2LjE1IGwgMCwtNi4zIGMgMCwtMS4zODUgLTEuMTI0LC0yLjUwOSAtMi41MDksLTIuNTA5IGwgLTEuOTUxLDAgMCwwLjAwNiBDIDQxLjE0OCwxNi4xNCA0MC42ODcsMTQuOTgzIDQwLjEwMywxMy44ODkgbCAxLjM4MSwtMS4zODEgYyAwLjk3OSwtMC45OCAwLjk3OSwtMi41NjkgMCwtMy41NDkgTCAzNy4wNCw0LjUxNyBjIC0wLjk3OSwtMC45NzkgLTIuNTY3LC0wLjk3OSAtMy41NDcsMCBsIC0xLjM4MiwxLjM4IEMgMzEuMDE3LDUuMzEzIDI5Ljg2MSw0Ljg1MiAyOC42NTQsNC40NjEgbCAwLjAwNiwwIDAsLTEuOTUxIEMgMjguNjYsMS4xMjQgMjcuNTM3LDAgMjYuMTUsMCBsIC02LjMsMCBjIC0xLjM4NiwwIC0yLjUwOSwxLjEyNCAtMi41MDksMi41MSBsIDAsMS45NTUgMC4wMTQsLTEwZS00IGMgLTEuMjA3LDAuMzY3IC0yLjM2MywwLjg1IC0zLjQ1OCwxLjQzNSBMIDEyLjUxNiw0LjUxOCBjIC0wLjk4LC0wLjk3OSAtMi41NjgsLTAuOTc5IC0zLjU0OCwwIEwgNC41MjUsOC45NjEgQyAzLjU0Niw5Ljk0IDMuNTQ1LDExLjUyNyA0LjUyMywxMi41MDcgTCA1LjksMTMuODg5IEMgNS4zMTYsMTQuOTgzIDQuODUxLDE2LjE0IDQuNDYsMTcuMzQ2IGwgMCwtMC4wMDUgLTEuOTUxLDAgQyAxLjEyNCwxNy4zNDEgMCwxOC40NjUgMCwxOS44NSBsIDAsNi4zMDEgYyAwLDEuMzg3IDEuMTI0LDIuNTExIDIuNTA5LDIuNTExIGwgMS45NjQsMCAtMC4wMDYsLTAuMDE1IGMgMC4zNjcsMS4yMDcgMC44NTMsMi4zNjIgMS40MzYsMy40NTcgbCAtMS4zOCwxLjM4MSBjIC0wLjk4LDAuOTc5IC0wLjk3OSwyLjU2NyAwLDMuNTQ3IGwgNC40NDMsNC40NDIgYyAwLjk3OSwwLjk3OSAyLjU2OCwwLjk3OSAzLjU0OCwwIGwgMS4zODEsLTEuMzgxIGMgMS4wOTQsMC41ODQgMi4yNTEsMS4wNzIgMy40NTgsMS40MzggbCAtMC4wMTQsLTAuMDA2IDAsMS45NjUgYyAwLDEuMzg3IDEuMTIzLDIuNTEgMi41MDksMi41MSBsIDYuMywwIGMgMS4zODcsMCAyLjUxLC0xLjEyMyAyLjUxLC0yLjUxIGwgMCwtMS45NSAtMC4wMDYsMCBjIDEuMjA3LC0wLjM5MiAyLjM2MywtMC44NTYgMy40NTcsLTEuNDQgbCAxLjM4MSwxLjM3OSBjIDAuOTgsMC45NzkgMi41NjgsMC45NzkgMy41NDcsMCBsIDQuNDQzLC00LjQ0NSBjIDAuOTc5LC0wLjk3OSAwLjk3OSwtMi41NjYgMCwtMy41NDcgbCAtMS4zODMsLTEuMzgzIGMgMC41ODQsLTEuMDk0IDEuMDY4LC0yLjI1IDEuNDM2LC0zLjQ1NyBsIDEwZS00LDAuMDEzIHogTSAyMy4wMjEsMzYuNzE0IEMgMTUuNDQ0LDM2LjcyMyA5LjI3OCwzMC41NTcgOS4yODcsMjIuOTggOS4yOTYsMTUuNDQxIDE1LjQ1LDkuMjg3IDIyLjk4OSw5LjI3OCBjIDcuNTc4LC0wLjAwOSAxMy43NDQsNi4xNTcgMTMuNzM0LDEzLjczNCAtMC4wMSw3LjUzOSAtNi4xNjIsMTMuNjkzIC0xMy43MDIsMTMuNzAyIHoiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+PC9nPjxnCiAgICAgICBpZD0iZzQyODQiIC8+PGcKICAgICAgIGlkPSJnNDI4NiIgLz48ZwogICAgICAgaWQ9Imc0Mjg4IiAvPjxnCiAgICAgICBpZD0iZzQyOTAiIC8+PGcKICAgICAgIGlkPSJnNDI5MiIgLz48ZwogICAgICAgaWQ9Imc0Mjk0IiAvPjxnCiAgICAgICBpZD0iZzQyOTYiIC8+PGcKICAgICAgIGlkPSJnNDI5OCIgLz48ZwogICAgICAgaWQ9Imc0MzAwIiAvPjxnCiAgICAgICBpZD0iZzQzMDIiIC8+PGcKICAgICAgIGlkPSJnNDMwNCIgLz48ZwogICAgICAgaWQ9Imc0MzA2IiAvPjxnCiAgICAgICBpZD0iZzQzMDgiIC8+PGcKICAgICAgIGlkPSJnNDMxMCIgLz48ZwogICAgICAgaWQ9Imc0MzEyIiAvPjwvZz48L3N2Zz4="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE2LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgd2lkdGg9IjQ4OC43OHB4IiBoZWlnaHQ9IjQ4OC43OHB4IiB2aWV3Qm94PSIwIDAgNDg4Ljc4IDQ4OC43OCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDg4Ljc4IDQ4OC43ODsiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPGc+DQoJCTxwYXRoIGQ9Ik0xNDEuNDA4LDExOS44NzJjMTIuMjkzLTEzLjExMiwyOS42NTMtMjAuNzcsNDcuNjI0LTIwLjc3aDI0Ny40MDVWNDcuODI4YzAtMTIuNTY5LTEwLjQ2OC0yMi42NTItMjMuMDM2LTIyLjY1Mkg3NS4zOTcNCgkJCWMtMTIuNTc1LDAtMjIuNDkxLDEwLjA4My0yMi40OTEsMjIuNjUydjEwMS4wNDZoNjEuNDQ1TDE0MS40MDgsMTE5Ljg3MnoiLz4NCgkJPHBhdGggZD0iTTQ4My4wMTksMTQ5LjI1M2MtMS43MDktMS45MjQtMy43MTctMy41NS01LjkyMy00Ljc4Yy0zLjM1Mi0xLjg2MS03LjE1MS0yLjkyLTExLjA3MS0yLjkySDE4OS4wMzJsMCwwDQoJCQljLTYsMC0xMS43MzUsMi40MDktMTUuOTgzLDYuNjAxYy0wLjIxNCwwLjIwOC0wLjQyMywwLjQzOC0wLjYyNiwwLjY1MWwtOS4yNzUsOS45MTFsLTIzLjYyMiwyNS4yMDcNCgkJCWMtMC41NDIsMC41NzMtMS4xMDUsMS4yMTktMS42OTQsMS43MzZjLTQuMTEzLDMuNTcyLTkuNDEsNS42NjctMTQuOTE1LDUuNjY3aC0wLjAwNUgyMi43NjhsMCwwDQoJCQljLTUuNjg0LDAtMTEuMTExLDIuMDIyLTE1LjI3MSw1Ljc5MWMtMC42NjcsMC41ODktMS4yOTMsMS4xNzktMS44ODgsMS44NTdjLTAuNDE3LDAuNDc5LTAuODAzLDAuOTQ4LTEuMTgzLDEuNDU5DQoJCQljLTMuNDgyLDQuNzQ0LTUuMDIsMTAuNjYxLTQuMjE3LDE2LjU0MmwyNi40NzksMTk0LjE4MmMzLjU2NSwyNi4xNCwyMy41NTMsNDYuNjEyLDQ4LjY5Miw1MS4yODQNCgkJCWMzLjU5MiwwLjY2Nyw3LjI4OCwxLjE2MywxMS4wNTgsMS4xNjNoMzE0LjI2MWMyNy43NjEsMCw1MS41MjItMTkuMDAzLDU4LjM1NC00NS4xOTRjMC43MDQtMi43MDYsMS4yMjYtNS41NjcsMS41NTUtOC40Mg0KCQkJbDE1LjI2NS0xMzIuMjg5bDEyLjc3Mi0xMTAuNjc0YzAuMDY3LTAuNjQ3LDAuMTA4LTEuMjkzLDAuMTI1LTEuOTI5QzQ4OC45NDcsMTU5LjI5OSw0ODYuOTA5LDE1My42MjMsNDgzLjAxOSwxNDkuMjUzeiIvPg0KCTwvZz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg0K"},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iQ2FwYV8xIgogICB4PSIwcHgiCiAgIHk9IjBweCIKICAgd2lkdGg9IjQ4OXB4IgogICBoZWlnaHQ9IjQ4OS4wMDFweCIKICAgdmlld0JveD0iMCAwIDQ4OSA0ODkuMDAxIgogICBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0ODkgNDg5LjAwMTsiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJuZXcuc3ZnIj48bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0MSI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczM5IiAvPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNjkwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjQ4MCIKICAgICBpZD0ibmFtZWR2aWV3MzciCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuNDgyNjE2NTkiCiAgICAgaW5rc2NhcGU6Y3g9IjI0NC41IgogICAgIGlua3NjYXBlOmN5PSIyNDQuNTAwNSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9IkNhcGFfMSIgLz48ZwogICAgIGlkPSJnMyIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk2MTk2NzY5LDAsMCwwLjk2MTk2NzY5LDkuMDEwNzg0OCwxMCkiPjxwYXRoCiAgICAgICBkPSJNIDM1NS43NjgsMCA4Ni4yMTgsMCBDIDUzLjMzLDAgMjYuNTc3LDI2Ljc1MyAyNi41NzcsNTkuNjM2IGwgMCwzNjkuNzI5IGMgMCwzMi44ODMgMjYuNzUyLDU5LjYzNiA1OS42NDEsNTkuNjM2IGwgMzE2LjU2NiwwIGMgMzIuODg5LC0xMGUtNCA1OS42NDEsLTI2Ljc1NCA1OS42NDEsLTU5LjYzNyBsIDAsLTMyMC4yMDQgTCAzNTUuNzY4LDAgWiBtIDQ3LjAxNiw0NDYuNDc5IC0zMTYuNTY2LDAgYyAtOS40MzcsMCAtMTcuMTE5LC03LjY3OCAtMTcuMTE5LC0xNy4xMTMgbCAwLC0zNjkuNzMgYyAwLC05LjQzNyA3LjY4MywtMTcuMTE0IDE3LjExOSwtMTcuMTE0IGwgMjQ4LjY0MiwwIDAsNDcuNjA0IGMgMCwyMS4wNDMgMTcuMTA5LDM4LjE2MiAzOC4xNTIsMzguMzc1IGwgNDYuODkxLDAuNDc3IDAsMzAwLjM4OCBjIDAsOS40MzUgLTcuNjg0LDE3LjExMyAtMTcuMTE5LDE3LjExMyB6IgogICAgICAgaWQ9InBhdGg1IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz48L2c+PGcKICAgICBpZD0iZzciIC8+PGcKICAgICBpZD0iZzkiIC8+PGcKICAgICBpZD0iZzExIiAvPjxnCiAgICAgaWQ9ImcxMyIgLz48ZwogICAgIGlkPSJnMTUiIC8+PGcKICAgICBpZD0iZzE3IiAvPjxnCiAgICAgaWQ9ImcxOSIgLz48ZwogICAgIGlkPSJnMjEiIC8+PGcKICAgICBpZD0iZzIzIiAvPjxnCiAgICAgaWQ9ImcyNSIgLz48ZwogICAgIGlkPSJnMjciIC8+PGcKICAgICBpZD0iZzI5IiAvPjxnCiAgICAgaWQ9ImczMSIgLz48ZwogICAgIGlkPSJnMzMiIC8+PGcKICAgICBpZD0iZzM1IiAvPjwvc3ZnPg=="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMjYuNjMzOTQybW0iCiAgIGhlaWdodD0iMjYuNjIyNzY1bW0iCiAgIHZpZXdCb3g9IjAgMCAyNi42MzM5NDIgMjYuNjIyNzY1IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmc4IgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJwb3J0YWwuc3ZnIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzMiI+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDUwMDgiCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIGlkPSJwYXRoNTAwNiIKICAgICAgICAgZD0iTSAwLDAgSCAzMTIuMDQzIFYgNzQuNDQ4MiBIIDAgWiIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDUwMTYiCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIGlkPSJwYXRoNTAxNCIKICAgICAgICAgZD0iTSAwLDc0LjQ0OCBIIDMxMi4wNDMgViAwIEggMCBaIiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoNTExMiIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGgKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGg1MTEwIgogICAgICAgICBkPSJNIDAsMCBIIDMxMi4wNDMgViA3NC40NDgyIEggMCBaIiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoNTEyMCIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGgKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGg1MTE4IgogICAgICAgICBkPSJNIDAsNzQuNDQ4IEggMzEyLjA0MyBWIDAgSCAwIFoiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBpZD0iY2xpcFBhdGg1MzMyIgogICAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBpZD0icGF0aDUzMzAiCiAgICAgICAgIGQ9Ik0gMCw3NC40NDggSCAzMTIuMDQzIFYgMCBIIDAgWiIgLz4KICAgIDwvY2xpcFBhdGg+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIxLjk3OTg5OSIKICAgICBpbmtzY2FwZTpjeD0iNTUuNTM1Njg4IgogICAgIGlua3NjYXBlOmN5PSItNTEuMDYwODE5IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJtbSIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDE3IgogICAgIGlua3NjYXBlOndpbmRvdy14PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBmaXQtbWFyZ2luLXRvcD0iMCIKICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAiCiAgICAgZml0LW1hcmdpbi1yaWdodD0iMCIKICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE1Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDcuNDExNjExLC04OS4yODgwNCkiPgogICAgPHJlY3QKICAgICAgIHJ5PSIwIgogICAgICAgeT0iOTYuMTU3Mzc5IgogICAgICAgeD0iNjEuMTYxNDcyIgogICAgICAgaGVpZ2h0PSI1Ljk5OTk5OTUiCiAgICAgICB3aWR0aD0iNS45OTk5OTk1IgogICAgICAgaWQ9InJlY3Q1NTA0IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC45ODk5OTk5OTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNzQ1MDk4MDU7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuNTU0MDg2MzM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MCIgLz4KICAgIDxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHk9IjEwMy4wMjY3MyIKICAgICAgIHg9IjU0LjI5MjEyMiIKICAgICAgIGhlaWdodD0iNS45OTk5OTk1IgogICAgICAgd2lkdGg9IjUuOTk5OTk5NSIKICAgICAgIGlkPSJyZWN0NTUwNC0zIgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC45ODk5OTk5OTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNzQ1MDk4MDU7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuNTU0MDg2MzM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MCIgLz4KICAgIDxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHk9Ijg5LjI4ODA0IgogICAgICAgeD0iNjguMDMwODIzIgogICAgICAgaGVpZ2h0PSI1Ljk5OTk5OTUiCiAgICAgICB3aWR0aD0iNS45OTk5OTk1IgogICAgICAgaWQ9InJlY3Q1NTA0LTMtNSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuOTg5OTk5OTk7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjU4ODIzNTMyO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU1NDA4NjMzO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjAiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSIxMDkuODk2MDciCiAgICAgICB4PSI0Ny40MjI3NzkiCiAgICAgICBoZWlnaHQ9IjUuOTk5OTk5NSIKICAgICAgIHdpZHRoPSI1Ljk5OTk5OTUiCiAgICAgICBpZD0icmVjdDU1MDQtMy01LTkiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk4OTk5OTk5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC41ODgyMzUzMjtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41NTQwODYzMztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowIiAvPgogICAgPHBhdGgKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDU1NTEtNyIKICAgICAgIGQ9Im0gNjguMzg0OTY3LDEwMi4xMjA4OSBhIDUuNjA5MDczNCw1LjcyMTk1ODQgMCAwIDAgNS42MDkzNTQsLTUuNzIxOTI4IDUuNjA5MDczNCw1LjcyMTk1ODQgMCAwIDAgLTAuMDA5OSwtMC4yMDUwODcgaCAtNS45MTcwNTMgdiA1LjkxMDcwNSBhIDUuNjA5MDczNCw1LjcyMTk1ODQgMCAwIDAgMC4zMTc2MzQsMC4wMTYzIHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk4OTk5OTk5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC41ODgyMzUzMjtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC44MDg2MTU1NztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowIiAvPgogICAgPHBhdGgKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDU2NjMiCiAgICAgICBkPSJtIDQ4LjI3MzAxMSwxMDEuMTk2NDggdiAtNy41ODIwNTMgYyAwLC0xLjkxNDE0NCAxLjQxOTUxMSwtMy40NTUxMzQgMy4xODI3NjEsLTMuNDU1MTM0IHYgMCBoIDE0Ljc2NzI3MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojOTg5NDk0O3N0cm9rZS13aWR0aDoxLjcyMjc5OTY2O3N0cm9rZS1saW5lY2FwOnNxdWFyZTtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3BhaW50LW9yZGVyOmZpbGwgbWFya2VycyBzdHJva2UiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJyZWN0NTYxNyIKICAgICAgIGQ9Im0gNzMuMjM3ODEzLDEwMi44MzA0MyA0ZS02LDkuMTU0OTggYyAwLDEuNzI3MTggLTEuMzgzMjYzLDMuMTE3NjYgLTMuMTAxNDg1LDMuMTE3NjYgSCA1NS44NDYwNzciCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6Izk4OTQ5NDtzdHJva2Utd2lkdGg6MS42MTU0NzExMjtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtwYWludC1vcmRlcjpmaWxsIG1hcmtlcnMgc3Ryb2tlIiAvPgogICAgPHBhdGgKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDU1NTEtNy00IgogICAgICAgZD0ibSA2MS41MTU2MTgsMTA4Ljk5MDIzIGEgNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCA1LjYwOTM1NCwtNS43MjE5MiA1LjYwOTA3MzQsNS43MjE5NTg0IDAgMCAwIC0wLjAwOTksLTAuMjA1MDkgSCA2MS4xOTc5NyB2IDUuOTEwNzEgYSA1LjYwOTA3MzQsNS43MjE5NTg0IDAgMCAwIDAuMzE3NjM0LDAuMDE2MyB6IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC45ODk5OTk5OTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNzQ1MDk4MDU7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuODA4NjE1NTc7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MCIgLz4KICAgIDxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InBhdGg1NTUxLTctNC0zIgogICAgICAgZD0ibSA1OS45Mzc5NzUsOTYuMTkzODc0IGEgNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCAtNS42MDkzNTQsNS43MjE5MjYgNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCAwLjAwOTksMC4yMDUwOSBoIDUuOTE3MDUzIHYgLTUuOTEwNzExIGEgNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCAtMC4zMTc2MzQsLTAuMDE2MyB6IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC45ODk5OTk5OTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuODA4NjE1NTc7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MCIgLz4KICAgIDxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InBhdGg1NTUxLTctNC0zLTAiCiAgICAgICBkPSJtIDUzLjA2ODYzMywxMDMuMDYzMjIgYSA1LjYwOTA3MzQsNS43MjE5NTg0IDAgMCAwIC01LjYwOTM1Myw1LjcyMTkzIDUuNjA5MDczNCw1LjcyMTk1ODQgMCAwIDAgMC4wMDk5LDAuMjA1MDggaCA1LjkxNzA1MyB2IC01LjkxMDcxIGEgNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCAtMC4zMTc2MzQsLTAuMDE2MyB6IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC45ODk5OTk5OTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNTg4MjM1MzI7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuODA4NjE1NTc7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MCIgLz4KICA8L2c+Cjwvc3ZnPgo="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE2LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgd2lkdGg9IjQ1LjY3OHB4IiBoZWlnaHQ9IjQ1LjY3OHB4IiB2aWV3Qm94PSIwIDAgNDUuNjc4IDQ1LjY3OCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDUuNjc4IDQ1LjY3ODsiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPGc+DQoJCTxwYXRoIGQ9Ik0zOC45ODgsNi42ODljLTguOTE5LTguOTE4LTIzLjM4LTguOTE5LTMyLjMsMGMtOC45MTgsOC45MTktOC45MTcsMjMuMzgsMCwzMi4yOTljOC45Miw4LjkxOSwyMy4zODEsOC45MTksMzIuMywwDQoJCQlDNDcuOTA4LDMwLjA2OSw0Ny45MDYsMTUuNjA4LDM4Ljk4OCw2LjY4OXogTTIxLjg5MywzNi4wMTZjLTEuNzMsMC0yLjkwNi0xLjI3Mi0yLjkwNi0yLjk3MWMwLTEuNzMsMS4yMDktMi45NzIsMi45MDYtMi45NzINCgkJCWMxLjc2NCwwLDIuOTA2LDEuMjQxLDIuOTM4LDIuOTcyQzI0LjgzMSwzNC43NDIsMjMuNjU2LDM2LjAxNiwyMS44OTMsMzYuMDE2eiBNMjYuMjE1LDIxLjk4MWMtMS4zMiwxLjQ2Ni0xLjg1NiwyLjg2MS0xLjgyLDQuNDY4DQoJCQljMCwxLjE5My0wLjk2OSwyLjE2Mi0yLjE2MywyLjE2MkgyMS43N2MtMS4xODIsMC0yLjE0NS0wLjk0OS0yLjE2MS0yLjEzMWwtMC4wMDUtMC4zMTdjLTAuMTA3LTEuODIzLDAuNTAxLTMuNjgxLDIuMTA5LTUuNjExDQoJCQljMS4xNDUtMS4zNTksMi4wNzItMi41MDIsMi4wNzItMy43MThjMC0xLjI1LTAuODIyLTIuMDczLTIuNjA3LTIuMTQ2Yy0wLjU0OSwwLTEuMTUsMC4wOTMtMS43MzEsMC4yNTYNCgkJCWMtMS4wNTYsMC4yOTctMi4xNTYtMC4yOTgtMi40ODItMS4zNDVsLTAuMDA2LTAuMDJjLTAuMzI5LTEuMDU0LDAuMjQ3LTIuMTc1LDEuMjk0LTIuNTIzYzEuMTU3LTAuMzg1LDIuNTc0LTAuNjU3LDQuMTQtMC42NTcNCgkJCWM0LjcyLDAsNi44NjQsMi42MDksNi44NjQsNS41NzZDMjkuMjU2LDE4LjY5MiwyNy41NzUsMjAuNDc5LDI2LjIxNSwyMS45ODF6Ii8+DQoJPC9nPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPC9zdmc+DQo="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iQ2FwYV8xIgogICB4PSIwcHgiCiAgIHk9IjBweCIKICAgd2lkdGg9IjQ3MS42MDhweCIKICAgaGVpZ2h0PSI0NzEuNjA4cHgiCiAgIHZpZXdCb3g9IjAgMCA0NzEuNjA4IDQ3MS42MDgiCiAgIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ3MS42MDggNDcxLjYwODsiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJyZWRvLnN2ZyI+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDEiPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+PGRjOnRpdGxlPjwvZGM6dGl0bGU+PC9jYzpXb3JrPjwvcmRmOlJERj48L21ldGFkYXRhPjxkZWZzCiAgICAgaWQ9ImRlZnMzOSIgLz48c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEyMjkiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODE2IgogICAgIGlkPSJuYW1lZHZpZXczNyIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iMC41MDA0MTU2IgogICAgIGlua3NjYXBlOmN4PSIyMzUuODA0IgogICAgIGlua3NjYXBlOmN5PSIyMzUuODA0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjAiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iQ2FwYV8xIiAvPjxnCiAgICAgaWQ9ImczIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KC0xLDAsMCwxLDQ3My42MDYyMSwwKSI+PHBhdGgKICAgICAgIGQ9Im0gMzg0LjUzNTE5LDkxLjA2Nzc0NCBjIC04MS40NTk1NCwtODEuNDU2ODc5MSAtMjE0LjAwODA3LC04MS40NTY4NzkxIC0yOTUuNDY1ODI4LDAgLTgxLjQ1Nzc2NDEsODEuNDU2ODc2IC04MS40NTY4NzgxLDIxNC4wMTE2MDYgMCwyOTUuNDY1ODI2IDgxLjQ1Njg2OCw4MS40NTk1MyAyMTQuMDA1NDA4LDgxLjQ1OTUzIDI5NS40NjU4MjgsMCA4MS40NTk1MywtODEuNDUzMzQgODEuNDU5NTMsLTIxNC4wMDI3NSAwLC0yOTUuNDY1ODI2IHogTSAzNjguMzI4ODMsMzcwLjMzODcyIGMgLTcyLjUxODU5LDcyLjUxODU5IC0xOTAuNTM2Myw3Mi41MTg1OSAtMjYzLjA2NjM5LDAgLTcyLjUxNjgxNywtNzIuNTMwMDkgLTcyLjUxNjgxNywtMTkwLjU0MjUgMCwtMjYzLjA2NzI3IDcyLjUyOTIsLTcyLjUyNjU1OSAxOTAuNTM2MjksLTcyLjUyNjU1OSAyNjMuMDY2MzksMCA3Mi41MjU2Nyw3Mi41MjQ3NyA3Mi41MjU2NywxOTAuNTM3MTggMCwyNjMuMDY3MjcgeiBtIDEyLjQ0MzQ3LC0xOTguMTI3NiAtMTEuNjIwNzYsNTIuMzI5NzEgYyAtMC4zMTM1LDEuNDQ3MDYgLTEuNzQzNzMsMi4zNDY4MiAtMy4xODI4MiwyLjAzNTk4IC0wLjQ0MDE0LC0wLjA5MzkgLTEwLjk1MDM2LC0yLjM1ODM0IC0yNi4yOTg1OCwtMi4zNTgzNCAtMjUuODg5NDQsMCAtNzEuNjI0MTMsNi44NTE4NCAtMTAxLjgzMTcyLDQ5LjU1MzM4IGwgNi4yOTY1Niw2LjI5NjU3IDcwLjUwMzg2LDMwLjU1OTE3IGMgMi4zNjU0MiwxLjAzNzAzIDMuNzU3NTgsMy41MDY5NSAzLjM5MTgzLDYuMDY3MiAtMC4zNTA3LDIuNTQ5NjIgLTIuMzYxLDQuNTU0NjEgLTQuOTMwOTksNC44NzM0MiBsIC0xNzUuNjA1MTksMjIuOTU5MDEgYyAtMS43NTg3OSwwLjIzMDI1IC0zLjUzODgzLC0wLjM3NzI2IC00Ljc5NzI2LC0xLjYyNzcyIC0xLjI2NjQsLTEuMjYxOTcgLTEuODU1MzIsLTMuMDM2NyAtMS42MzU2OSwtNC44MDYxMiBsIDIyLjk1OSwtMTc1LjYwNzg1IGMgMC4xNjQ3MywtMS4yODUgMC43NTM2NCwtMi40MzYyNyAxLjYyMzMsLTMuMzA1MDMgMC44NTgxNCwtMC44NTkwMyAxLjk4OTA0LC0xLjQ0Nzk1IDMuMjYzNDEsLTEuNjMxMjcgMi41NDY5NywtMC4zNTc3OCA1LjAxNzc3LDEuMDM3MDMgNi4wNTM5MiwzLjM5NDQ4IGwgMzAuNTY3MTQsNzAuNTA2NTIgMC4xNTc2MywwLjE1NzYzIGMgNDcuMTQxOTEsLTU5LjQwMTE3IDExNS40MTU4NCwtNjYuNDg5NDYgMTQ1LjAyODMxLC02Ni40ODk0NiAxMy41NDY5MywwIDI2LjY5NjIyLDEuMzQ1MjIgMzguMDIzODQsMy44ODY4NyAxLjQ1MzI2LDAuMzMyMSAyLjM2MzY1LDEuNzYzMjIgMi4wMzQyMSwzLjIwNTg1IHoiCiAgICAgICBpZD0icGF0aDUiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPjwvZz48ZwogICAgIGlkPSJnNyIgLz48ZwogICAgIGlkPSJnOSIgLz48ZwogICAgIGlkPSJnMTEiIC8+PGcKICAgICBpZD0iZzEzIiAvPjxnCiAgICAgaWQ9ImcxNSIgLz48ZwogICAgIGlkPSJnMTciIC8+PGcKICAgICBpZD0iZzE5IiAvPjxnCiAgICAgaWQ9ImcyMSIgLz48ZwogICAgIGlkPSJnMjMiIC8+PGcKICAgICBpZD0iZzI1IiAvPjxnCiAgICAgaWQ9ImcyNyIgLz48ZwogICAgIGlkPSJnMjkiIC8+PGcKICAgICBpZD0iZzMxIiAvPjxnCiAgICAgaWQ9ImczMyIgLz48ZwogICAgIGlkPSJnMzUiIC8+PC9zdmc+"},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE4LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDM5Mi42MiAzOTIuNjIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDM5Mi42MiAzOTIuNjI7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxyZWN0IHg9IjE0NC44NjYiIHk9IjMyMC44OTciIHdpZHRoPSIyMy41MDUiIGhlaWdodD0iMjUiLz4NCgk8cGF0aCBkPSJNMzA5Ljc5NSwwSDI2Ni40OUgxMjYuMTMxSDgyLjgyNUMzNy42NjcsMCwwLjkyOSwzNi43MzgsMC45MjksODEuODk2djIyOC44MjhjMCw0NS4xNTgsMzYuNzM4LDgxLjg5Niw4MS44OTYsODEuODk2aDU4LjMyDQoJCWgxMTMuNDQzaDU1LjIwNmM0NS4xNTcsMCw4MS44OTYtMzYuNzM4LDgxLjg5Ni04MS44OTZWODEuODk2QzM5MS42OTEsMzYuNzM4LDM1NC45NTIsMCwzMDkuNzk1LDB6IE0yNjYuNDksMzANCgkJYzE0LjM1NCwwLDI2LjAzLDkuNTQyLDI2LjAzLDIxLjI3VjE3NC4zM2MwLDExLjcyOS0xMS42NzcsMjEuMjcxLTI2LjAzLDIxLjI3MUgxMjYuMTMxYy0xNC4zNTQsMC0yNi4wMzEtOS41NDItMjYuMDMxLTIxLjI3MQ0KCQlWNTEuMjdjMC0xMS43MjgsMTEuNjc4LTIxLjI3LDI2LjAzMS0yMS4yN0gyNjYuNDl6IE0xNDEuMTQ2LDM2Mi42MmMtNi4yNTksMC0xMS4zNTItNS4wOTItMTEuMzUyLTExLjM1MXYtMzAuMDY2DQoJCWMwLTYuMjU5LDUuMDkzLTExLjM1MSwxMS4zNTItMTEuMzUxaDExMy40NDNjNi4yNTksMCwxMS4zNTEsNS4wOTIsMTEuMzUxLDExLjM1MXYzMC4wNjZjMCw2LjI1OS01LjA5MiwxMS4zNTEtMTEuMzUxLDExLjM1MQ0KCQlIMTQxLjE0NnogTTM2MS42OTEsMzEwLjcyNGMwLDI4LjYxNi0yMy4yOCw1MS44OTYtNTEuODk2LDUxLjg5NmgtMTUuNDUyYzEuMDMyLTMuNjEsMS41OTctNy40MTQsMS41OTctMTEuMzUxdi0zMC4wNjYNCgkJYzAtMjIuODAxLTE4LjU1LTQxLjM1MS00MS4zNTEtNDEuMzUxSDE0MS4xNDZjLTIyLjgwMiwwLTQxLjM1MiwxOC41NS00MS4zNTIsNDEuMzUxdjMwLjA2NmMwLDMuOTM3LDAuNTY1LDcuNzQyLDEuNTk3LDExLjM1MQ0KCQlIODIuODI1Yy0yOC42MTYsMC01MS44OTYtMjMuMjgtNTEuODk2LTUxLjg5NlY4MS44OTZjMC0yNS45MSwxOS4wODctNDcuNDQ0LDQzLjkzOC01MS4yODVDNzEuODExLDM2LjkzNSw3MC4xLDQzLjkyMSw3MC4xLDUxLjI3DQoJCVYxNzQuMzNjMCwyOC4yNzEsMjUuMTM2LDUxLjI3MSw1Ni4wMzEsNTEuMjcxSDI2Ni40OWMzMC44OTYsMCw1Ni4wMy0yMyw1Ni4wMy01MS4yNzFWNTEuMjdjMC03LjM0OC0xLjcxMS0xNC4zMzQtNC43NjctMjAuNjU5DQoJCWMyNC44NTEsMy44NDEsNDMuOTM4LDI1LjM3NSw0My45MzgsNTEuMjg1VjMxMC43MjR6Ii8+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg=="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMjYuNjMzOTQybW0iCiAgIGhlaWdodD0iMjYuNjIyNzY1bW0iCiAgIHZpZXdCb3g9IjAgMCAyNi42MzM5NDIgMjYuNjIyNzY1IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmc4IgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJzZXR0aW5ncy5zdmciPgogIDxkZWZzCiAgICAgaWQ9ImRlZnMyIj4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoNTAwOCIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGgKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGg1MDA2IgogICAgICAgICBkPSJNIDAsMCBIIDMxMi4wNDMgViA3NC40NDgyIEggMCBaIiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoNTAxNiIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGgKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGg1MDE0IgogICAgICAgICBkPSJNIDAsNzQuNDQ4IEggMzEyLjA0MyBWIDAgSCAwIFoiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBpZD0iY2xpcFBhdGg1MTEyIgogICAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBpZD0icGF0aDUxMTAiCiAgICAgICAgIGQ9Ik0gMCwwIEggMzEyLjA0MyBWIDc0LjQ0ODIgSCAwIFoiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBpZD0iY2xpcFBhdGg1MTIwIgogICAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBpZD0icGF0aDUxMTgiCiAgICAgICAgIGQ9Ik0gMCw3NC40NDggSCAzMTIuMDQzIFYgMCBIIDAgWiIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDUzMzIiCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIGlkPSJwYXRoNTMzMCIKICAgICAgICAgZD0iTSAwLDc0LjQ0OCBIIDMxMi4wNDMgViAwIEggMCBaIiAvPgogICAgPC9jbGlwUGF0aD4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjEuOTc5ODk5IgogICAgIGlua3NjYXBlOmN4PSI1NS41MzU2ODgiCiAgICAgaW5rc2NhcGU6Y3k9Ii01MS4wNjA4MTkiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9Im1tIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGZpdC1tYXJnaW4tdG9wPSIwIgogICAgIGZpdC1tYXJnaW4tbGVmdD0iMCIKICAgICBmaXQtbWFyZ2luLXJpZ2h0PSIwIgogICAgIGZpdC1tYXJnaW4tYm90dG9tPSIwIiAvPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTUiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIgogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00Ny40MTE2MTEsLTg5LjI4ODA0KSI+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5Ni4xNTczNzkiCiAgICAgICB4PSI2MS4xNjE0NzIiCiAgICAgICBoZWlnaHQ9IjUuOTk5OTk5NSIKICAgICAgIHdpZHRoPSI1Ljk5OTk5OTUiCiAgICAgICBpZD0icmVjdDU1MDQiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk4OTk5OTk5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC43NDUwOTgwNTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41NTQwODYzMztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowIiAvPgogICAgPHJlY3QKICAgICAgIHJ5PSIwIgogICAgICAgeT0iMTAzLjAyNjczIgogICAgICAgeD0iNTQuMjkyMTIyIgogICAgICAgaGVpZ2h0PSI1Ljk5OTk5OTUiCiAgICAgICB3aWR0aD0iNS45OTk5OTk1IgogICAgICAgaWQ9InJlY3Q1NTA0LTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk4OTk5OTk5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC43NDUwOTgwNTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41NTQwODYzMztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowIiAvPgogICAgPHJlY3QKICAgICAgIHJ5PSIwIgogICAgICAgeT0iODkuMjg4MDQiCiAgICAgICB4PSI2OC4wMzA4MjMiCiAgICAgICBoZWlnaHQ9IjUuOTk5OTk5NSIKICAgICAgIHdpZHRoPSI1Ljk5OTk5OTUiCiAgICAgICBpZD0icmVjdDU1MDQtMy01IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC45ODk5OTk5OTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNTg4MjM1MzI7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuNTU0MDg2MzM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MCIgLz4KICAgIDxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHk9IjEwOS44OTYwNyIKICAgICAgIHg9IjQ3LjQyMjc3OSIKICAgICAgIGhlaWdodD0iNS45OTk5OTk1IgogICAgICAgd2lkdGg9IjUuOTk5OTk5NSIKICAgICAgIGlkPSJyZWN0NTUwNC0zLTUtOSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuOTg5OTk5OTk7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjU4ODIzNTMyO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU1NDA4NjMzO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjAiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNTU1MS03IgogICAgICAgZD0ibSA2OC4zODQ5NjcsMTAyLjEyMDg5IGEgNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCA1LjYwOTM1NCwtNS43MjE5MjggNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCAtMC4wMDk5LC0wLjIwNTA4NyBoIC01LjkxNzA1MyB2IDUuOTEwNzA1IGEgNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCAwLjMxNzYzNCwwLjAxNjMgeiIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuOTg5OTk5OTk7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjU4ODIzNTMyO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjgwODYxNTU3O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjAiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNTY2MyIKICAgICAgIGQ9Im0gNDguMjczMDExLDEwMS4xOTY0OCB2IC03LjU4MjA1MyBjIDAsLTEuOTE0MTQ0IDEuNDE5NTExLC0zLjQ1NTEzNCAzLjE4Mjc2MSwtMy40NTUxMzQgdiAwIGggMTQuNzY3MjcxIgogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiM5ODk0OTQ7c3Ryb2tlLXdpZHRoOjEuNzIyNzk5NjY7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7cGFpbnQtb3JkZXI6ZmlsbCBtYXJrZXJzIHN0cm9rZSIgLz4KICAgIDxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InJlY3Q1NjE3IgogICAgICAgZD0ibSA3My4yMzc4MTMsMTAyLjgzMDQzIDRlLTYsOS4xNTQ5OCBjIDAsMS43MjcxOCAtMS4zODMyNjMsMy4xMTc2NiAtMy4xMDE0ODUsMy4xMTc2NiBIIDU1Ljg0NjA3NyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojOTg5NDk0O3N0cm9rZS13aWR0aDoxLjYxNTQ3MTEyO3N0cm9rZS1saW5lY2FwOnNxdWFyZTtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3BhaW50LW9yZGVyOmZpbGwgbWFya2VycyBzdHJva2UiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNTU1MS03LTQiCiAgICAgICBkPSJtIDYxLjUxNTYxOCwxMDguOTkwMjMgYSA1LjYwOTA3MzQsNS43MjE5NTg0IDAgMCAwIDUuNjA5MzU0LC01LjcyMTkyIDUuNjA5MDczNCw1LjcyMTk1ODQgMCAwIDAgLTAuMDA5OSwtMC4yMDUwOSBIIDYxLjE5Nzk3IHYgNS45MTA3MSBhIDUuNjA5MDczNCw1LjcyMTk1ODQgMCAwIDAgMC4zMTc2MzQsMC4wMTYzIHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk4OTk5OTk5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC43NDUwOTgwNTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC44MDg2MTU1NztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowIiAvPgogICAgPHBhdGgKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDU1NTEtNy00LTMiCiAgICAgICBkPSJtIDU5LjkzNzk3NSw5Ni4xOTM4NzQgYSA1LjYwOTA3MzQsNS43MjE5NTg0IDAgMCAwIC01LjYwOTM1NCw1LjcyMTkyNiA1LjYwOTA3MzQsNS43MjE5NTg0IDAgMCAwIDAuMDA5OSwwLjIwNTA5IGggNS45MTcwNTMgdiAtNS45MTA3MTEgYSA1LjYwOTA3MzQsNS43MjE5NTg0IDAgMCAwIC0wLjMxNzYzNCwtMC4wMTYzIHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk4OTk5OTk5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC44MDg2MTU1NztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowIiAvPgogICAgPHBhdGgKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDU1NTEtNy00LTMtMCIKICAgICAgIGQ9Im0gNTMuMDY4NjMzLDEwMy4wNjMyMiBhIDUuNjA5MDczNCw1LjcyMTk1ODQgMCAwIDAgLTUuNjA5MzUzLDUuNzIxOTMgNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCAwLjAwOTksMC4yMDUwOCBoIDUuOTE3MDUzIHYgLTUuOTEwNzEgYSA1LjYwOTA3MzQsNS43MjE5NTg0IDAgMCAwIC0wLjMxNzYzNCwtMC4wMTYzIHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk4OTk5OTk5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC41ODgyMzUzMjtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC44MDg2MTU1NztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowIiAvPgogICAgPGcKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMjkzMzQyMzksMCwwLDAuMjkzMzQyMzksNjAuNTUxODAzLDEwMi40MTcwNSkiCiAgICAgICBpZD0iZzU0ODYiPgogICAgICA8ZwogICAgICAgICBpZD0iZzMiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICBkPSJtIDQxLjUzNCwyOC42NiBoIDEuOTU3IEMgNDQuODc3LDI4LjY2IDQ2LDI3LjUzNiA0NiwyNi4xNSB2IC02LjMgYyAwLC0xLjM4NSAtMS4xMjQsLTIuNTA5IC0yLjUwOSwtMi41MDkgSCA0MS41NCB2IDAuMDA2IEMgNDEuMTQ4LDE2LjE0IDQwLjY4NywxNC45ODMgNDAuMTAzLDEzLjg4OSBsIDEuMzgxLC0xLjM4MSBjIDAuOTc5LC0wLjk4IDAuOTc5LC0yLjU2OSAwLC0zLjU0OSBMIDM3LjA0LDQuNTE3IGMgLTAuOTc5LC0wLjk3OSAtMi41NjcsLTAuOTc5IC0zLjU0NywwIGwgLTEuMzgyLDEuMzggQyAzMS4wMTcsNS4zMTMgMjkuODYxLDQuODUyIDI4LjY1NCw0LjQ2MSBIIDI4LjY2IFYgMi41MSBDIDI4LjY2LDEuMTI0IDI3LjUzNywwIDI2LjE1LDAgaCAtNi4zIGMgLTEuMzg2LDAgLTIuNTA5LDEuMTI0IC0yLjUwOSwyLjUxIHYgMS45NTUgbCAwLjAxNCwtMTBlLTQgYyAtMS4yMDcsMC4zNjcgLTIuMzYzLDAuODUgLTMuNDU4LDEuNDM1IEwgMTIuNTE2LDQuNTE4IGMgLTAuOTgsLTAuOTc5IC0yLjU2OCwtMC45NzkgLTMuNTQ4LDAgTCA0LjUyNSw4Ljk2MSBDIDMuNTQ2LDkuOTQgMy41NDUsMTEuNTI3IDQuNTIzLDEyLjUwNyBMIDUuOSwxMy44ODkgQyA1LjMxNiwxNC45ODMgNC44NTEsMTYuMTQgNC40NiwxNy4zNDYgViAxNy4zNDEgSCAyLjUwOSBDIDEuMTI0LDE3LjM0MSAwLDE4LjQ2NSAwLDE5Ljg1IHYgNi4zMDEgYyAwLDEuMzg3IDEuMTI0LDIuNTExIDIuNTA5LDIuNTExIEggNC40NzMgTCA0LjQ2NywyOC42NDcgYyAwLjM2NywxLjIwNyAwLjg1MywyLjM2MiAxLjQzNiwzLjQ1NyBsIC0xLjM4LDEuMzgxIGMgLTAuOTgsMC45NzkgLTAuOTc5LDIuNTY3IDAsMy41NDcgbCA0LjQ0Myw0LjQ0MiBjIDAuOTc5LDAuOTc5IDIuNTY4LDAuOTc5IDMuNTQ4LDAgbCAxLjM4MSwtMS4zODEgYyAxLjA5NCwwLjU4NCAyLjI1MSwxLjA3MiAzLjQ1OCwxLjQzOCBsIC0wLjAxNCwtMC4wMDYgdiAxLjk2NSBjIDAsMS4zODcgMS4xMjMsMi41MSAyLjUwOSwyLjUxIGggNi4zIGMgMS4zODcsMCAyLjUxLC0xLjEyMyAyLjUxLC0yLjUxIHYgLTEuOTUgaCAtMC4wMDYgYyAxLjIwNywtMC4zOTIgMi4zNjMsLTAuODU2IDMuNDU3LC0xLjQ0IGwgMS4zODEsMS4zNzkgYyAwLjk4LDAuOTc5IDIuNTY4LDAuOTc5IDMuNTQ3LDAgbCA0LjQ0MywtNC40NDUgYyAwLjk3OSwtMC45NzkgMC45NzksLTIuNTY2IDAsLTMuNTQ3IGwgLTEuMzgzLC0xLjM4MyBjIDAuNTg0LC0xLjA5NCAxLjA2OCwtMi4yNSAxLjQzNiwtMy40NTcgeiBNIDIzLjAyMSwzNi43MTQgQyAxNS40NDQsMzYuNzIzIDkuMjc4LDMwLjU1NyA5LjI4NywyMi45OCA5LjI5NiwxNS40NDEgMTUuNDUsOS4yODcgMjIuOTg5LDkuMjc4IGMgNy41NzgsLTAuMDA5IDEzLjc0NCw2LjE1NyAxMy43MzQsMTMuNzM0IC0wLjAxLDcuNTM5IC02LjE2MiwxMy42OTMgLTEzLjcwMiwxMy43MDIgeiIKICAgICAgICAgICBpZD0icGF0aDUiIC8+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc3IiAvPgogICAgICA8ZwogICAgICAgICBpZD0iZzkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMTEiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMTMiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMTUiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMTciIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMTkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMjEiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMjMiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMjUiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMjciIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMjkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMzEiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMzMiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMzUiIC8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K"},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNzMuMDU4cHgiIGhlaWdodD0iNzMuMDU4cHgiIHZpZXdCb3g9IjAgMCA3My4wNTggNzMuMDU4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA3My4wNTggNzMuMDU4OyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8ZyBpZD0iRXllIj4KCQk8Zz4KCQkJPHBhdGggZD0iTTcyLjg5MywzNS45NjVjLTAuNTgtMC45MjUtMTQuNDMyLTIyLjU0MS0zNS4xNi0yMi41NDFoLTIuNDA2Yy0yMC43MjksMC0zNC41OCwyMS42MTYtMzUuMTU5LDIyLjU0MQoJCQkJYy0wLjIyMywwLjM0Ny0wLjIyMywwLjc5LDAsMS4xMzdjMC41NzksMC45MTcsMTQuNDMyLDIyLjUzMiwzNS4xNTksMjIuNTMyaDIuNDA2YzIwLjcyOSwwLDM0LjU4LTIxLjYxNSwzNS4xNTktMjIuNTMyCgkJCQlDNzMuMTEzLDM2Ljc1NSw3My4xMTMsMzYuMzEyLDcyLjg5MywzNS45NjV6IE00NS4yNjcsMzYuNTI5YzAsNC42OS0zLjkyLDguNTA2LTguNzM2LDguNTA2Yy00LjgxNywwLTguNzM1LTMuODEyLTguNzM1LTguNTA2CgkJCQljMC00LjY4NywzLjkxOC04LjUwOCw4LjczNS04LjUwOEM0MS4zNDcsMjguMDIyLDQ1LjI2NywzMS44NDQsNDUuMjY3LDM2LjUyOXoiLz4KCQk8L2c+Cgk8L2c+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+Cg=="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iQ2FwYV8xIgogICB4PSIwcHgiCiAgIHk9IjBweCIKICAgd2lkdGg9IjQ3MS42MDhweCIKICAgaGVpZ2h0PSI0NzEuNjA4cHgiCiAgIHZpZXdCb3g9IjAgMCA0NzEuNjA4IDQ3MS42MDgiCiAgIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ3MS42MDggNDcxLjYwODsiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJ1bmRvLnN2ZyI+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDEiPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+PC9jYzpXb3JrPjwvcmRmOlJERj48L21ldGFkYXRhPjxkZWZzCiAgICAgaWQ9ImRlZnMzOSIgLz48c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEyMjkiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODE2IgogICAgIGlkPSJuYW1lZHZpZXczNyIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iMC41MDA0MTU2IgogICAgIGlua3NjYXBlOmN4PSIyMzUuODA0IgogICAgIGlua3NjYXBlOmN5PSIyMzUuODA0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjAiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iQ2FwYV8xIiAvPjxnCiAgICAgaWQ9ImczIj48cGF0aAogICAgICAgZD0ibSAzODQuNTM1MTksOTEuMDY3NzQ0IGMgLTgxLjQ1OTU0LC04MS40NTY4NzkxIC0yMTQuMDA4MDcsLTgxLjQ1Njg3OTEgLTI5NS40NjU4MjgsMCAtODEuNDU3NzY0MSw4MS40NTY4NzYgLTgxLjQ1Njg3ODEsMjE0LjAxMTYwNiAwLDI5NS40NjU4MjYgODEuNDU2ODY4LDgxLjQ1OTUzIDIxNC4wMDU0MDgsODEuNDU5NTMgMjk1LjQ2NTgyOCwwIDgxLjQ1OTUzLC04MS40NTMzNCA4MS40NTk1MywtMjE0LjAwMjc1IDAsLTI5NS40NjU4MjYgeiBNIDM2OC4zMjg4MywzNzAuMzM4NzIgYyAtNzIuNTE4NTksNzIuNTE4NTkgLTE5MC41MzYzLDcyLjUxODU5IC0yNjMuMDY2MzksMCAtNzIuNTE2ODE3LC03Mi41MzAwOSAtNzIuNTE2ODE3LC0xOTAuNTQyNSAwLC0yNjMuMDY3MjcgNzIuNTI5MiwtNzIuNTI2NTU5IDE5MC41MzYyOSwtNzIuNTI2NTU5IDI2My4wNjYzOSwwIDcyLjUyNTY3LDcyLjUyNDc3IDcyLjUyNTY3LDE5MC41MzcxOCAwLDI2My4wNjcyNyB6IG0gMTIuNDQzNDcsLTE5OC4xMjc2IC0xMS42MjA3Niw1Mi4zMjk3MSBjIC0wLjMxMzUsMS40NDcwNiAtMS43NDM3MywyLjM0NjgyIC0zLjE4MjgyLDIuMDM1OTggLTAuNDQwMTQsLTAuMDkzOSAtMTAuOTUwMzYsLTIuMzU4MzQgLTI2LjI5ODU4LC0yLjM1ODM0IC0yNS44ODk0NCwwIC03MS42MjQxMyw2Ljg1MTg0IC0xMDEuODMxNzIsNDkuNTUzMzggbCA2LjI5NjU2LDYuMjk2NTcgNzAuNTAzODYsMzAuNTU5MTcgYyAyLjM2NTQyLDEuMDM3MDMgMy43NTc1OCwzLjUwNjk1IDMuMzkxODMsNi4wNjcyIC0wLjM1MDcsMi41NDk2MiAtMi4zNjEsNC41NTQ2MSAtNC45MzA5OSw0Ljg3MzQyIGwgLTE3NS42MDUxOSwyMi45NTkwMSBjIC0xLjc1ODc5LDAuMjMwMjUgLTMuNTM4ODMsLTAuMzc3MjYgLTQuNzk3MjYsLTEuNjI3NzIgLTEuMjY2NCwtMS4yNjE5NyAtMS44NTUzMiwtMy4wMzY3IC0xLjYzNTY5LC00LjgwNjEyIGwgMjIuOTU5LC0xNzUuNjA3ODUgYyAwLjE2NDczLC0xLjI4NSAwLjc1MzY0LC0yLjQzNjI3IDEuNjIzMywtMy4zMDUwMyAwLjg1ODE0LC0wLjg1OTAzIDEuOTg5MDQsLTEuNDQ3OTUgMy4yNjM0MSwtMS42MzEyNyAyLjU0Njk3LC0wLjM1Nzc4IDUuMDE3NzcsMS4wMzcwMyA2LjA1MzkyLDMuMzk0NDggbCAzMC41NjcxNCw3MC41MDY1MiAwLjE1NzYzLDAuMTU3NjMgYyA0Ny4xNDE5MSwtNTkuNDAxMTcgMTE1LjQxNTg0LC02Ni40ODk0NiAxNDUuMDI4MzEsLTY2LjQ4OTQ2IDEzLjU0NjkzLDAgMjYuNjk2MjIsMS4zNDUyMiAzOC4wMjM4NCwzLjg4Njg3IDEuNDUzMjYsMC4zMzIxIDIuMzYzNjUsMS43NjMyMiAyLjAzNDIxLDMuMjA1ODUgeiIKICAgICAgIGlkPSJwYXRoNSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+PC9nPjxnCiAgICAgaWQ9Imc3IiAvPjxnCiAgICAgaWQ9Imc5IiAvPjxnCiAgICAgaWQ9ImcxMSIgLz48ZwogICAgIGlkPSJnMTMiIC8+PGcKICAgICBpZD0iZzE1IiAvPjxnCiAgICAgaWQ9ImcxNyIgLz48ZwogICAgIGlkPSJnMTkiIC8+PGcKICAgICBpZD0iZzIxIiAvPjxnCiAgICAgaWQ9ImcyMyIgLz48ZwogICAgIGlkPSJnMjUiIC8+PGcKICAgICBpZD0iZzI3IiAvPjxnCiAgICAgaWQ9ImcyOSIgLz48ZwogICAgIGlkPSJnMzEiIC8+PGcKICAgICBpZD0iZzMzIiAvPjxnCiAgICAgaWQ9ImczNSIgLz48L3N2Zz4="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMTc0IgogICBoZWlnaHQ9IjQ3Ljg4NzMxIgogICB2aWV3Qm94PSIwIDAgMTYzLjEyNSA0NC44OTQzNTQiCiAgIGlkPSJzdmc0Mzk5IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTIuMSByMTUzNzEiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImNvbXBhcnRtZW50LnN2ZyI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQ0MDEiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjEuNCIKICAgICBpbmtzY2FwZTpjeD0iNTcuNTQ1NjA4IgogICAgIGlua3NjYXBlOmN5PSI5NS4yMzMzOTkiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgZml0LW1hcmdpbi10b3A9IjAiCiAgICAgZml0LW1hcmdpbi1sZWZ0PSIwIgogICAgIGZpdC1tYXJnaW4tcmlnaHQ9IjAiCiAgICAgZml0LW1hcmdpbi1ib3R0b209IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIHVuaXRzPSJweCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NDA0Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjc0LjQ1MDM1LC0zMTYuMDU0MzYpIj4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDo2LjgyOTY5OTA0O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0Mjk4NSIKICAgICAgIHdpZHRoPSIxNTYuMjk1MyIKICAgICAgIGhlaWdodD0iMzguMDY0NjU1IgogICAgICAgeD0iMjc3Ljg2NTIiCiAgICAgICB5PSIzMTkuNDY5MjEiCiAgICAgICByeT0iOS44MjMxMjExIgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjUzLjk1OTk5OSIKICAgICAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSI1My45NTk5OTkiCiAgICAgICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9IkM6XFVzZXJzXHVndXJcR29vZ2xlIERyaXZlXHRvb2xiYXJcbWFjcm9tb2xlY3VsZS5wbmciIC8+CiAgICA8dGV4dAogICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjI4LjEyNXB4O2xpbmUtaGVpZ2h0OjEyNSU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuOTM3NXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB4PSIzMDMuODM1MTEiCiAgICAgICB5PSIzNDIuNTQ0NDkiCiAgICAgICBpZD0idGV4dDgxOCI+PHRzcGFuCiAgICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCiAgICAgICAgIGlkPSJ0c3BhbjgxNiIKICAgICAgICAgeD0iMzAzLjgzNTExIgogICAgICAgICB5PSIzNDIuNTQ0NDkiCiAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTVweDtzdHJva2Utd2lkdGg6MC45Mzc1cHgiPkNvbXBhcnRtZW50PC90c3Bhbj48L3RleHQ+CiAgPC9nPgo8L3N2Zz4K"},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMTc0IgogICBoZWlnaHQ9IjQ0LjQ0MjgyMiIKICAgdmlld0JveD0iMCAwIDE2My4xMjUgNDEuNjY1MTQ2IgogICBpZD0ic3ZnNDM5OSIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJjb21wbGV4LnN2ZyI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQ0MDEiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjEuNCIKICAgICBpbmtzY2FwZTpjeD0iNTUuODIzMzUzIgogICAgIGlua3NjYXBlOmN5PSI5My41MTExNjYiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgZml0LW1hcmdpbi10b3A9IjAiCiAgICAgZml0LW1hcmdpbi1sZWZ0PSIwIgogICAgIGZpdC1tYXJnaW4tcmlnaHQ9IjAiCiAgICAgZml0LW1hcmdpbi1ib3R0b209IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIHVuaXRzPSJweCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NDA0Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjc2LjA2NDk3LC0zMTcuNjY4OTcpIj4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozLjIzMTI2OTg0O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0Mjk4NSIKICAgICAgIHdpZHRoPSIxNTkuODkzNzQiCiAgICAgICBoZWlnaHQ9IjM4LjQzMzg3NiIKICAgICAgIHg9IjI3Ny42ODA2IgogICAgICAgeT0iMzE5LjI4NDYxIgogICAgICAgcnk9IjAiCiAgICAgICBpbmtzY2FwZTpleHBvcnQteGRwaT0iNTMuOTU5OTk5IgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjUzLjk1OTk5OSIKICAgICAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iQzpcVXNlcnNcdWd1clxHb29nbGUgRHJpdmVcdG9vbGJhclxtYWNyb21vbGVjdWxlLnBuZyIgLz4KICAgIDx0ZXh0CiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXNpemU6MjguMTI1cHg7bGluZS1oZWlnaHQ6MTI1JTtmb250LWZhbWlseTpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC45Mzc1cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIHg9IjMyNC43MTYwOSIKICAgICAgIHk9IjM0Mi42OTEwMSIKICAgICAgIGlkPSJ0ZXh0ODE4Ij48dHNwYW4KICAgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKICAgICAgICAgaWQ9InRzcGFuODE2IgogICAgICAgICB4PSIzMjQuNzE2MDkiCiAgICAgICAgIHk9IjM0Mi42OTEwMSIKICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxNXB4O3N0cm9rZS13aWR0aDowLjkzNzVweCI+Q29tcGxleDwvdHNwYW4+PC90ZXh0PgogIDwvZz4KPC9zdmc+Cg=="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMTczLjk5OTM3IgogICBoZWlnaHQ9IjQ1LjA4MjAwMSIKICAgdmlld0JveD0iMCAwIDE2My4xMjQ0MiA0Mi4yNjQzNzYiCiAgIGlkPSJzdmc0Mzk5IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTIuMSByMTUzNzEiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImZhbWlseS5zdmciPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0NDAxIiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIxLjQiCiAgICAgaW5rc2NhcGU6Y3g9IjE3MS44OTQ3NyIKICAgICBpbmtzY2FwZTpjeT0iOTMuNTExMTkyIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGZpdC1tYXJnaW4tdG9wPSIwIgogICAgIGZpdC1tYXJnaW4tbGVmdD0iMCIKICAgICBmaXQtbWFyZ2luLXJpZ2h0PSIwIgogICAgIGZpdC1tYXJnaW4tYm90dG9tPSIwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDE3IgogICAgIGlua3NjYXBlOndpbmRvdy14PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICB1bml0cz0icHgiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDQwNCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI3Ni4wNjQ5OCwtMzE3LjA2OTc3KSI+CiAgICA8cmVjdAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzkzOTM5MztzdHJva2Utd2lkdGg6My4yNTUxMTgzNztzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDI5ODUiCiAgICAgICB3aWR0aD0iMTU5Ljg2OTI5IgogICAgICAgaGVpZ2h0PSIzOS4wMDkyNTgiCiAgICAgICB4PSIyNzcuNjkyNTQiCiAgICAgICB5PSIzMTguNjk3MzMiCiAgICAgICByeT0iMCIKICAgICAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSI1My45NTk5OTkiCiAgICAgICBpbmtzY2FwZTpleHBvcnQteWRwaT0iNTMuOTU5OTk5IgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSJDOlxVc2Vyc1x1Z3VyXEdvb2dsZSBEcml2ZVx0b29sYmFyXG1hY3JvbW9sZWN1bGUucG5nIiAvPgogICAgPHRleHQKICAgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToyOC4xMjVweDtsaW5lLWhlaWdodDoxMjUlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjkzNzVweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgeD0iMzMyLjg2MDMyIgogICAgICAgeT0iMzQyLjM5MTQyIgogICAgICAgaWQ9InRleHQ4MTgiPjx0c3BhbgogICAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgogICAgICAgICBpZD0idHNwYW44MTYiCiAgICAgICAgIHg9IjMzMi44NjAzMiIKICAgICAgICAgeT0iMzQyLjM5MTQyIgogICAgICAgICBzdHlsZT0iZm9udC1zaXplOjE1cHg7c3Ryb2tlLXdpZHRoOjAuOTM3NXB4Ij5GYW1pbHk8L3RzcGFuPjwvdGV4dD4KICA8L2c+Cjwvc3ZnPgo="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMTc0IgogICBoZWlnaHQ9IjQ0LjQ0MjgyMiIKICAgdmlld0JveD0iMCAwIDE2My4xMjUgNDEuNjY1MTQ2IgogICBpZD0ic3ZnNDM5OSIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJnZW5lLnN2ZyI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQ0MDEiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjEuNCIKICAgICBpbmtzY2FwZTpjeD0iNTUuODIzMzUzIgogICAgIGlua3NjYXBlOmN5PSI5My41MTExNjYiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgZml0LW1hcmdpbi10b3A9IjAiCiAgICAgZml0LW1hcmdpbi1sZWZ0PSIwIgogICAgIGZpdC1tYXJnaW4tcmlnaHQ9IjAiCiAgICAgZml0LW1hcmdpbi1ib3R0b209IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIHVuaXRzPSJweCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NDA0Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjc2LjA2NDk3LC0zMTcuNjY4OTcpIj4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozLjIzMTI2OTg0O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0Mjk4NSIKICAgICAgIHdpZHRoPSIxNTkuODkzNzQiCiAgICAgICBoZWlnaHQ9IjM4LjQzMzg3NiIKICAgICAgIHg9IjI3Ny42ODA2IgogICAgICAgeT0iMzE5LjI4NDYxIgogICAgICAgcnk9IjkuOTE4NDAzNiIKICAgICAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSI1My45NTk5OTkiCiAgICAgICBpbmtzY2FwZTpleHBvcnQteWRwaT0iNTMuOTU5OTk5IgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSJDOlxVc2Vyc1x1Z3VyXEdvb2dsZSBEcml2ZVx0b29sYmFyXG1hY3JvbW9sZWN1bGUucG5nIiAvPgogICAgPHRleHQKICAgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToyOC4xMjVweDtsaW5lLWhlaWdodDoxMjUlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjkzNzVweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgeD0iMzM4LjA3NTQ3IgogICAgICAgeT0iMzQzLjk0NzExIgogICAgICAgaWQ9InRleHQ4MTgiPjx0c3BhbgogICAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgogICAgICAgICBpZD0idHNwYW44MTYiCiAgICAgICAgIHg9IjMzOC4wNzU0NyIKICAgICAgICAgeT0iMzQzLjk0NzExIgogICAgICAgICBzdHlsZT0iZm9udC1zaXplOjE1cHg7c3Ryb2tlLXdpZHRoOjAuOTM3NXB4Ij5HZW5lPC90c3Bhbj48L3RleHQ+CiAgPC9nPgo8L3N2Zz4K"},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMTc0IgogICBoZWlnaHQ9IjQ0LjQ0MjgyMiIKICAgdmlld0JveD0iMCAwIDE2My4xMjUgNDEuNjY1MTQ2IgogICBpZD0ic3ZnNDM5OSIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJwcm9jZXNzLnN2ZyI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQ0MDEiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjEuNCIKICAgICBpbmtzY2FwZTpjeD0iLTYwLjI0ODA3NiIKICAgICBpbmtzY2FwZTpjeT0iOTMuNTExMTY2IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGZpdC1tYXJnaW4tdG9wPSIwIgogICAgIGZpdC1tYXJnaW4tbGVmdD0iMCIKICAgICBmaXQtbWFyZ2luLXJpZ2h0PSIwIgogICAgIGZpdC1tYXJnaW4tYm90dG9tPSIwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDE3IgogICAgIGlua3NjYXBlOndpbmRvdy14PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICB1bml0cz0icHgiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDQwNCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI3Ni4wNjQ5NywtMzE3LjY2ODk3KSI+CiAgICA8dGV4dAogICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjI4LjEyNXB4O2xpbmUtaGVpZ2h0OjEyNSU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuOTM3NXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB4PSIzMjguNzE1MTIiCiAgICAgICB5PSIzNDMuODQwOTEiCiAgICAgICBpZD0idGV4dDgxOCI+PHRzcGFuCiAgICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCiAgICAgICAgIGlkPSJ0c3BhbjgxNiIKICAgICAgICAgeD0iMzI4LjcxNTEyIgogICAgICAgICB5PSIzNDMuODQwOTEiCiAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTVweDtzdHJva2Utd2lkdGg6MC45Mzc1cHgiPlByb2Nlc3M8L3RzcGFuPjwvdGV4dD4KICA8L2c+Cjwvc3ZnPgo="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/Pgo8c3ZnIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0gIjQ0IiBoZWlnaHQ9ICI0NCIgdmlld0JveD0iMCAwIDQ0IDQ0IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNDQgNDQiPgogIDxjaXJjbGUgY3g9IjIyIiBjeT0iMjIiIHI9IjIyIiBmaWxsPSIjZmZmIi8+CiAgPHBhdGggZD0ibTIyLDBjLTEyLjIsMC0yMiw5LjgtMjIsMjJzOS44LDIyIDIyLDIyIDIyLTkuOCAyMi0yMi05LjgtMjItMjItMjJ6bS0xLjMsMTkuM2wtMS40LDEuNGMtMC40LDAuNC0xLDAuNC0xLjQsMGwtNC00Yy0wLjMtMC4zLTAuOS0wLjEtMC45LDAuNHYxYzAsMC42LTAuNCwxLTEsMWgtMmMtMC42LDAtMS0wLjQtMS0xdi04YzAtMC42IDAuNC0xIDEtMWg4YzAuNiwwIDEsMC40IDEsMXYyYzAsMC42LTAuNCwxLTEsMWgtMWMtMC40LDAtMC43LDAuNS0wLjQsMC45bDQsNGMwLjUsMC4zIDAuNSwwLjkgMC4xLDEuM3ptMTQuMywxNC43YzAsMC42LTAuNCwxLTEsMWgtOGMtMC42LDAtMS0wLjQtMS0xdi0yYzAtMC42IDAuNC0xIDEtMWgxYzAuNCwwIDAuNy0wLjUgMC40LTAuOWwtNC00Yy0wLjQtMC40LTAuNC0xIDAtMS40bDEuNC0xLjRjMC40LTAuNCAxLTAuNCAxLjQsMGw0LDRjMC4zLDAuMyAwLjksMC4xIDAuOS0wLjR2LTFjMC0wLjYgMC40LTEgMS0xaDJjMC42LDAgMSwwLjQgMSwxdjguMWgtMC4xeiIvPgo8L3N2Zz4K"},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNjUiCiAgIGhlaWdodD0iMTkuNzg3MjE4IgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJhY3RpdmF0ZXMuc3ZnIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9IkM6XFVzZXJzXHVndXJcRGVza3RvcFxpbnRlcmFjdGlvbi1sZWdlbmQuMjAxNi4wNC4wMS5wbmciCiAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIzMDAiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSIzMDAiCiAgIHZpZXdCb3g9IjAgMCA2MC45Mzc1MDEgMTguNTUwNTE2Ij4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8bWFya2VyCiAgICAgICBpbmtzY2FwZTpzdG9ja2lkPSJUcmlhbmdsZU91dEwiCiAgICAgICBvcmllbnQ9ImF1dG8iCiAgICAgICByZWZZPSIwIgogICAgICAgcmVmWD0iMCIKICAgICAgIGlkPSJtYXJrZXIxMjAyIgogICAgICAgc3R5bGU9Im92ZXJmbG93OnZpc2libGUiCiAgICAgICBpbmtzY2FwZTppc3N0b2NrPSJ0cnVlIj4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgxMjAwIgogICAgICAgICBkPSJNIDUuNzcsMCAtMi44OCw1IFYgLTUgWiIKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwM3B0O3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC44KSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDwvbWFya2VyPgogICAgPG1hcmtlcgogICAgICAgaW5rc2NhcGU6c3RvY2tpZD0iVHJpYW5nbGVPdXRMIgogICAgICAgb3JpZW50PSJhdXRvIgogICAgICAgcmVmWT0iMCIKICAgICAgIHJlZlg9IjAiCiAgICAgICBpZD0iVHJpYW5nbGVPdXRMIgogICAgICAgc3R5bGU9Im92ZXJmbG93OnZpc2libGUiCiAgICAgICBpbmtzY2FwZTppc3N0b2NrPSJ0cnVlIj4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGg5NTkiCiAgICAgICAgIGQ9Ik0gNS43NywwIC0yLjg4LDUgViAtNSBaIgogICAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDAzcHQ7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjgpIgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPC9tYXJrZXI+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI3LjkxOTU5NTkiCiAgICAgaW5rc2NhcGU6Y3g9Ii00LjgxMTAzNTciCiAgICAgaW5rc2NhcGU6Y3k9IjE4LjQ2ODYyMSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTAxNyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgZml0LW1hcmdpbi10b3A9IjAiCiAgICAgZml0LW1hcmdpbi1sZWZ0PSIwIgogICAgIGZpdC1tYXJnaW4tcmlnaHQ9IjAiCiAgICAgZml0LW1hcmdpbi1ib3R0b209IjAiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGUgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI3NS42NDI0NywtMjgxLjI5NjQ5KSI+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6My43NDk5OTk5MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJtIDI3NS42NDI0NywyOTAuNTcxNzUgaCA0Ny4zNTA4OSIKICAgICAgIGlkPSJwYXRoNDk0OSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOnR5cGU9InN0YXIiCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6My43NTtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtwYWludC1vcmRlcjpmaWxsIG1hcmtlcnMgc3Ryb2tlIgogICAgICAgaWQ9InBhdGg0OTUzIgogICAgICAgc29kaXBvZGk6c2lkZXM9IjMiCiAgICAgICBzb2RpcG9kaTpjeD0iMjEyLjQyOTAyIgogICAgICAgc29kaXBvZGk6Y3k9IjI1My43OTgyNiIKICAgICAgIHNvZGlwb2RpOnIxPSIxMS4wNTczNDciCiAgICAgICBzb2RpcG9kaTpyMj0iNS41Mjg2NzM2IgogICAgICAgc29kaXBvZGk6YXJnMT0iMC45MTQ0NDc5NiIKICAgICAgIHNvZGlwb2RpOmFyZzI9IjEuOTYxNjQ1NSIKICAgICAgIGlua3NjYXBlOmZsYXRzaWRlZD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJvdW5kZWQ9IjAiCiAgICAgICBpbmtzY2FwZTpyYW5kb21pemVkPSIwIgogICAgICAgZD0ibSAyMTkuMTc2NTIsMjYyLjU1ODE4IC0xNy43MDc1NywtNy4yOTYzNyAxNS4xNzI2MiwtMTEuNjg3MDEgeiIKICAgICAgIGlua3NjYXBlOnRyYW5zZm9ybS1jZW50ZXIteD0iLTIuNjk0NjIxOSIKICAgICAgIGlua3NjYXBlOnRyYW5zZm9ybS1jZW50ZXIteT0iMC4wNzg0ODk2NTMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjM5NDM0MDk4LDAuODk5Nzc1MDQsLTAuOTE4OTY0MTksMC4zODYxMDY2Myw0NzQuOTg1ODMsMS4zNjE3MzI5KSIgLz4KICA8L2c+Cjwvc3ZnPgo="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNjUiCiAgIGhlaWdodD0iMTkuNzg3MjE4IgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJiaW5kcy5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iQzpcVXNlcnNcdWd1clxEZXNrdG9wXGludGVyYWN0aW9uLWxlZ2VuZC4yMDE2LjA0LjAxLnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjMwMCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjMwMCIKICAgdmlld0JveD0iMCAwIDYwLjkzNzUwMSAxOC41NTA1MTYiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxtYXJrZXIKICAgICAgIGlua3NjYXBlOnN0b2NraWQ9IlRyaWFuZ2xlT3V0TCIKICAgICAgIG9yaWVudD0iYXV0byIKICAgICAgIHJlZlk9IjAiCiAgICAgICByZWZYPSIwIgogICAgICAgaWQ9Im1hcmtlcjEyMDIiCiAgICAgICBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGlua3NjYXBlOmlzc3RvY2s9InRydWUiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDEyMDAiCiAgICAgICAgIGQ9Ik0gNS43NywwIC0yLjg4LDUgViAtNSBaIgogICAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDAzcHQ7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjgpIgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPC9tYXJrZXI+CiAgICA8bWFya2VyCiAgICAgICBpbmtzY2FwZTpzdG9ja2lkPSJUcmlhbmdsZU91dEwiCiAgICAgICBvcmllbnQ9ImF1dG8iCiAgICAgICByZWZZPSIwIgogICAgICAgcmVmWD0iMCIKICAgICAgIGlkPSJUcmlhbmdsZU91dEwiCiAgICAgICBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGlua3NjYXBlOmlzc3RvY2s9InRydWUiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDk1OSIKICAgICAgICAgZD0iTSA1Ljc3LDAgLTIuODgsNSBWIC01IFoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMDNwdDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuOCkiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L21hcmtlcj4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjcuOTE5NTk1OSIKICAgICBpbmtzY2FwZTpjeD0iLTQuODExMDM1NyIKICAgICBpbmtzY2FwZTpjeT0iMTguNDY4NjIxIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDE3IgogICAgIGlua3NjYXBlOndpbmRvdy14PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBmaXQtbWFyZ2luLXRvcD0iMCIKICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAiCiAgICAgZml0LW1hcmdpbi1yaWdodD0iMCIKICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjc1LjY0MjQ3LC0yODEuMjk2NDkpIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozLjc1O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Im0gMjc1LjY0MjQ3LDI5MC41NzE3NSBoIDYwLjkzNzUiCiAgICAgICBpZD0icGF0aDQ5NDkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICA8L2c+Cjwvc3ZnPgo="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNjUiCiAgIGhlaWdodD0iMTkuNzg3MjE4IgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJpbmR1Y2VzLnN2ZyIKICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSJDOlxVc2Vyc1x1Z3VyXERlc2t0b3BcaW50ZXJhY3Rpb24tbGVnZW5kLjIwMTYuMDQuMDEucG5nIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iMzAwIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iMzAwIgogICB2aWV3Qm94PSIwIDAgNjAuOTM3NTAxIDE4LjU1MDUxNiI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPG1hcmtlcgogICAgICAgaW5rc2NhcGU6c3RvY2tpZD0iVHJpYW5nbGVPdXRMIgogICAgICAgb3JpZW50PSJhdXRvIgogICAgICAgcmVmWT0iMCIKICAgICAgIHJlZlg9IjAiCiAgICAgICBpZD0ibWFya2VyMTIwMiIKICAgICAgIHN0eWxlPSJvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgaW5rc2NhcGU6aXNzdG9jaz0idHJ1ZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTIwMCIKICAgICAgICAgZD0iTSA1Ljc3LDAgLTIuODgsNSBWIC01IFoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMDNwdDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuOCkiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L21hcmtlcj4KICAgIDxtYXJrZXIKICAgICAgIGlua3NjYXBlOnN0b2NraWQ9IlRyaWFuZ2xlT3V0TCIKICAgICAgIG9yaWVudD0iYXV0byIKICAgICAgIHJlZlk9IjAiCiAgICAgICByZWZYPSIwIgogICAgICAgaWQ9IlRyaWFuZ2xlT3V0TCIKICAgICAgIHN0eWxlPSJvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgaW5rc2NhcGU6aXNzdG9jaz0idHJ1ZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoOTU5IgogICAgICAgICBkPSJNIDUuNzcsMCAtMi44OCw1IFYgLTUgWiIKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwM3B0O3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC44KSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDwvbWFya2VyPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iNy45MTk1OTU5IgogICAgIGlua3NjYXBlOmN4PSItNC44MTEwMzU3IgogICAgIGlua3NjYXBlOmN5PSIxOC40Njg2MjEiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGZpdC1tYXJnaW4tdG9wPSIwIgogICAgIGZpdC1tYXJnaW4tbGVmdD0iMCIKICAgICBmaXQtbWFyZ2luLXJpZ2h0PSIwIgogICAgIGZpdC1tYXJnaW4tYm90dG9tPSIwIiAvPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIgogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNzUuNjQyNDcsLTI4MS4yOTY0OSkiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjMuNzQ5OTk5OTM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5OjcuNDk5OTk5ODcsNy40OTk5OTk4NztzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNob2Zmc2V0OjAiCiAgICAgICBkPSJtIDI3NS42NDI0NywyOTAuNTcxNzUgaCA0Ny4zNTA4OSIKICAgICAgIGlkPSJwYXRoNDk0OSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOnR5cGU9InN0YXIiCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6My43NTtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtwYWludC1vcmRlcjpmaWxsIG1hcmtlcnMgc3Ryb2tlIgogICAgICAgaWQ9InBhdGg0OTUzIgogICAgICAgc29kaXBvZGk6c2lkZXM9IjMiCiAgICAgICBzb2RpcG9kaTpjeD0iMjEyLjQyOTAyIgogICAgICAgc29kaXBvZGk6Y3k9IjI1My43OTgyNiIKICAgICAgIHNvZGlwb2RpOnIxPSIxMS4wNTczNDciCiAgICAgICBzb2RpcG9kaTpyMj0iNS41Mjg2NzM2IgogICAgICAgc29kaXBvZGk6YXJnMT0iMC45MTQ0NDc5NiIKICAgICAgIHNvZGlwb2RpOmFyZzI9IjEuOTYxNjQ1NSIKICAgICAgIGlua3NjYXBlOmZsYXRzaWRlZD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJvdW5kZWQ9IjAiCiAgICAgICBpbmtzY2FwZTpyYW5kb21pemVkPSIwIgogICAgICAgZD0ibSAyMTkuMTc2NTIsMjYyLjU1ODE4IC0xNy43MDc1NywtNy4yOTYzNyAxNS4xNzI2MiwtMTEuNjg3MDEgeiIKICAgICAgIGlua3NjYXBlOnRyYW5zZm9ybS1jZW50ZXIteD0iLTIuNjk0NjIxOSIKICAgICAgIGlua3NjYXBlOnRyYW5zZm9ybS1jZW50ZXIteT0iMC4wNzg0ODk2NTMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjM5NDM0MDk4LDAuODk5Nzc1MDQsLTAuOTE4OTY0MTksMC4zODYxMDY2Myw0NzQuOTg1ODMsMS4zNjE3MzI5KSIgLz4KICA8L2c+Cjwvc3ZnPgo="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNjUiCiAgIGhlaWdodD0iMTkuNzg3MjE4IgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJpbmhpYml0cy5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iQzpcVXNlcnNcdWd1clxEZXNrdG9wXGludGVyYWN0aW9uLWxlZ2VuZC4yMDE2LjA0LjAxLnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjMwMCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjMwMCIKICAgdmlld0JveD0iMCAwIDYwLjkzNzUwMSAxOC41NTA1MTYiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxtYXJrZXIKICAgICAgIGlua3NjYXBlOnN0b2NraWQ9IlN0b3BMIgogICAgICAgb3JpZW50PSJhdXRvIgogICAgICAgcmVmWT0iMC4wIgogICAgICAgcmVmWD0iMC4wIgogICAgICAgaWQ9IlN0b3BMIgogICAgICAgc3R5bGU9Im92ZXJmbG93OnZpc2libGUiCiAgICAgICBpbmtzY2FwZTppc3N0b2NrPSJ0cnVlIj4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGg5ODYiCiAgICAgICAgIGQ9Ik0gMC4wLDUuNjUgTCAwLjAsLTUuNjUiCiAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjFwdDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuOCkiIC8+CiAgICA8L21hcmtlcj4KICAgIDxtYXJrZXIKICAgICAgIGlua3NjYXBlOnN0b2NraWQ9IlRyaWFuZ2xlT3V0TCIKICAgICAgIG9yaWVudD0iYXV0byIKICAgICAgIHJlZlk9IjAiCiAgICAgICByZWZYPSIwIgogICAgICAgaWQ9Im1hcmtlcjEyMDIiCiAgICAgICBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGlua3NjYXBlOmlzc3RvY2s9InRydWUiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDEyMDAiCiAgICAgICAgIGQ9Ik0gNS43NywwIC0yLjg4LDUgViAtNSBaIgogICAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDAzcHQ7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjgpIgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPC9tYXJrZXI+CiAgICA8bWFya2VyCiAgICAgICBpbmtzY2FwZTpzdG9ja2lkPSJUcmlhbmdsZU91dEwiCiAgICAgICBvcmllbnQ9ImF1dG8iCiAgICAgICByZWZZPSIwIgogICAgICAgcmVmWD0iMCIKICAgICAgIGlkPSJUcmlhbmdsZU91dEwiCiAgICAgICBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGlua3NjYXBlOmlzc3RvY2s9InRydWUiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDk1OSIKICAgICAgICAgZD0iTSA1Ljc3LDAgLTIuODgsNSBWIC01IFoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMDNwdDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuOCkiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L21hcmtlcj4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjcuOTE5NTk1OSIKICAgICBpbmtzY2FwZTpjeD0iLTQuODExMDM1NyIKICAgICBpbmtzY2FwZTpjeT0iMTMuOTIyOTM0IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDE3IgogICAgIGlua3NjYXBlOndpbmRvdy14PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBmaXQtbWFyZ2luLXRvcD0iMCIKICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAiCiAgICAgZml0LW1hcmdpbi1yaWdodD0iMCIKICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZSAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjc1LjY0MjQ3LC0yODEuMjk2NDkpIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozLjc0OTk5OTkzO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Im0gMjc1LjY0MjQ3LDI5MC41NzE3NSBoIDU5Ljc4MDUiCiAgICAgICBpZD0icGF0aDQ5NDkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC43NDUwOTgwNDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi43NzU5Mzc1NjtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTo4LjMyNzgxMjQ2LCAyLjc3NTkzNzQ5O3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtwYWludC1vcmRlcjpmaWxsIG1hcmtlcnMgc3Ryb2tlIgogICAgICAgaWQ9InJlY3Q0OTgxIgogICAgICAgd2lkdGg9IjAuOTc0MTY5NTUiCiAgICAgICBoZWlnaHQ9IjE1Ljg4OTcwMyIKICAgICAgIHg9IjMzNC4yMTc4MyIKICAgICAgIHk9IjI4Mi42MjY4OSIgLz4KICA8L2c+Cjwvc3ZnPgo="},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNjUiCiAgIGhlaWdodD0iMTkuNzg3MjE4IgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJyZXByZXNzZXMuc3ZnIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9IkM6XFVzZXJzXHVndXJcRGVza3RvcFxpbnRlcmFjdGlvbi1sZWdlbmQuMjAxNi4wNC4wMS5wbmciCiAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIzMDAiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSIzMDAiCiAgIHZpZXdCb3g9IjAgMCA2MC45Mzc1MDEgMTguNTUwNTE2Ij4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8bWFya2VyCiAgICAgICBpbmtzY2FwZTpzdG9ja2lkPSJTdG9wTCIKICAgICAgIG9yaWVudD0iYXV0byIKICAgICAgIHJlZlk9IjAuMCIKICAgICAgIHJlZlg9IjAuMCIKICAgICAgIGlkPSJTdG9wTCIKICAgICAgIHN0eWxlPSJvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgaW5rc2NhcGU6aXNzdG9jaz0idHJ1ZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoOTg2IgogICAgICAgICBkPSJNIDAuMCw1LjY1IEwgMC4wLC01LjY1IgogICAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxcHQ7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjgpIiAvPgogICAgPC9tYXJrZXI+CiAgICA8bWFya2VyCiAgICAgICBpbmtzY2FwZTpzdG9ja2lkPSJUcmlhbmdsZU91dEwiCiAgICAgICBvcmllbnQ9ImF1dG8iCiAgICAgICByZWZZPSIwIgogICAgICAgcmVmWD0iMCIKICAgICAgIGlkPSJtYXJrZXIxMjAyIgogICAgICAgc3R5bGU9Im92ZXJmbG93OnZpc2libGUiCiAgICAgICBpbmtzY2FwZTppc3N0b2NrPSJ0cnVlIj4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgxMjAwIgogICAgICAgICBkPSJNIDUuNzcsMCAtMi44OCw1IFYgLTUgWiIKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwM3B0O3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC44KSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDwvbWFya2VyPgogICAgPG1hcmtlcgogICAgICAgaW5rc2NhcGU6c3RvY2tpZD0iVHJpYW5nbGVPdXRMIgogICAgICAgb3JpZW50PSJhdXRvIgogICAgICAgcmVmWT0iMCIKICAgICAgIHJlZlg9IjAiCiAgICAgICBpZD0iVHJpYW5nbGVPdXRMIgogICAgICAgc3R5bGU9Im92ZXJmbG93OnZpc2libGUiCiAgICAgICBpbmtzY2FwZTppc3N0b2NrPSJ0cnVlIj4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGg5NTkiCiAgICAgICAgIGQ9Ik0gNS43NywwIC0yLjg4LDUgViAtNSBaIgogICAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDAzcHQ7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjgpIgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPC9tYXJrZXI+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI3LjkxOTU5NTkiCiAgICAgaW5rc2NhcGU6Y3g9Ii0yNS4zMjk3NTkiCiAgICAgaW5rc2NhcGU6Y3k9IjEzLjkyMjkzNCIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTAxNyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgZml0LW1hcmdpbi10b3A9IjAiCiAgICAgZml0LW1hcmdpbi1sZWZ0PSIwIgogICAgIGZpdC1tYXJnaW4tcmlnaHQ9IjAiCiAgICAgZml0LW1hcmdpbi1ib3R0b209IjAiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGUgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI3NS42NDI0NywtMjgxLjI5NjQ5KSI+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6My43NTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6Ny40OTk5OTk4NywgNy40OTk5OTk4NztzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJtIDI3NS42NDI0NywyOTAuNTcxNzUgaCA1OS43ODA1IgogICAgICAgaWQ9InBhdGg0OTQ5IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cmVjdAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNzQ1MDk4MDQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuNzc1OTM3NTY7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6OC4zMjc4MTIzNSwgMi43NzU5Mzc0NTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7cGFpbnQtb3JkZXI6ZmlsbCBtYXJrZXJzIHN0cm9rZSIKICAgICAgIGlkPSJyZWN0NDk4MSIKICAgICAgIHdpZHRoPSIwLjk3NDE2OTU1IgogICAgICAgaGVpZ2h0PSIxNS44ODk3MDMiCiAgICAgICB4PSIzMzIuMzQyODMiCiAgICAgICB5PSIyODIuNjI2ODkiIC8+CiAgPC9nPgo8L3N2Zz4K"},function(t,e){t.exports=require("react-toastify/dist/ReactToastify.min.css")},function(t,e,a){},function(t,e,a){},function(t,e,a){},function(t,e){t.exports="data:image/png;base64,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"},function(t,e){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAh0AAABxCAYAAABxyRHvAAAABGdBTUEAALGPC/xhBQAAQABJREFUeAHt3QeYLEdxAOBBPBtjbIxlA8YEP4GMyME2CAS2HgIEmCSRjEWQSCKDyAgEepgghIgig0GPnDMyGR6YnHMGCRBRIGOwwXlcf0Mtc3Oze7t3t3v33nV93+7szvR0V1dXV1VXV3efrQ1oNin88Ic/bPLzpS99qfnyl7/cfOtb32rOOOOM5sc//nHz05/+tPnlL3/ZZBXOdrazNec85zmb85znPM15z3ve5k//9E+b7du3NwcccEBzyUtesjn/+c/fnO985yvXffbZZ5PWuqJVKVApUClQKVApsFdSYOfZNovR8ZOf/KT5+te/3nz6059uPvKRjxQD4wc/+EExOn7xi1+sC/UZJIyOP/mTP2kufvGLN1e+8pWbK17xis3+++9fDJF1KaRmUilQKVApUClQKVApMESBjTU6vvrVrzbvf//7m7e97W3F2GB0/N///d8QonO9d9GLXrS57GUv2xx66KHNjh07mktd6lJzLa9mXilQKVApUClQKbAFKbB4o+P73/9+8/a3v7155Stf2Xz4wx9uzjrrrE1Fd1MzV7rSlZrDDz+8ud71rlemZzYVghWZSoFKgUqBSoFKgT2TAoszOr7whS80u3btal796lc3p59++qYnl/iQC17wgs0NbnCD5sgjj2yucpWrbHqcK4KVApUClQKVApUCm5gC8zc6Pve5zzUnn3xyMTYEfq4FxGSc+9znbn73d3+3+Z3f+Z3mt37rt5pt27Y1DATwv//7v83//M//NP/xH/9RAkx//vOfNz/72c/WUmR5V3m8Hve4xz3K9MuaM6wZVApUClQKVApUCmw9CszP6Pje977XPOEJT2ie//znl1Ums9D2j//4j5s/+7M/a8RaXPrSl24udrGLNRe5yEWaP/iDPxgZHec4xzma3/7t315idDA40uhgeKTR8aMf/ag57bTTGitgvvKVrzTf+c53yioYaWcBRs/Nbnaz5gEPeECJAZnl3Zq2UqBSoFKgUqBSYItTYP2NDt6GF77whc0//MM/TD2N8nu/93vN5S53ueav//qvm4MPPrisJrHUlSdjHsAIsfT2U5/6VPOud72r+cQnPtF84xvfmKooXhXLce95z3uWD0OoQqVApUClQKVApUClwIoUWF+j49vf/nbzoAc9qHn5y1++Ysm8FAceeGDxHBxyyCFlxchG7Z1x5plnNp/85Ceb17/+9c1b3vKWYpCsVIGzn/3szdWudrXmhBNOaA466KCVktfnlQKVApUClQKVAludAutndFj2KubBstdJwEtgiuI2t7lNMTo2ytAYh+N3v/vd5tRTT21e9KIXNR/4wAdGG4+NS68+xx9/fHOXu9ylYYhUqBSoFKgUqBSoFKgUGKTA+hgdT33qU5tjjz22+fd///fBUtwUp3G7292uufOd71xiNMYm3CQPxIS89a1vbdTt3e9+90SsTAPd8Y53bB772MeWmJOJievDSoFKgUqBSoFKga1JgbUZHQIxH/rQhzYnnXTSWI+A1SVHHHFE8+AHP7hsRb6n0Znx8ZrXvKY58cQTGytxxoF6Xv/612+e8YxnlO3Xx6Wr9ysFKgUqBSoFKgW2KAVWb3T853/+Z3PMMcc0z3rWs8bS7hKXuESJeTjssMPGptkTHjjbRfDpk570pObpT39682//9m+DaJteEQz7ghe8oKy2GUxUb1YKVApUClQKVApsTQqszuj47//+7+Ze97rXRIPjtre9bfEOOOdkbwErc+ym+sAHPrD5/Oc/P1itNDys4LnwhS88mKberBSoFKgUqBSoFNiCFNg581GrPBz3v//9Bw0Oy0n33XffEgdxyimnlIPV9iaiMiiue93rNm9+85vLlJG9QvrAMPnnf/7nEr9iP5AKlQKVApUClQKVApUCv6LATEaHGI4nP/nJzdOe9rRl9GNwOEqesWEVy2ZblbIM4VXeUE8bl4ndsFeHnVH7wPB473vf29zvfvdr/vVf/7X/uP6vFKgUqBSoFKgU2JIUOPvOgGlq7vTXN73pTUXRml7pAkVsKsGUAk/AVgDGxt/8zd8U4+pjH/tY06cJelk+/F//9V9l6/S6nHYrcEWtY6VApUClQKXABArsntro+PKXv9yI0/jxj3+8LD8eDvtaXOMa11j2bG++YcVKHgTnxNz+tuo8Hla8bI/dVS9zmcuMzojZm2lS61YpUClQKVApUCkwhgK7p5pesf+G80ZOHzgd9g//8A+b5zznORt6EBr8NmoaQ1yHGJe73/3ug9u2W+nyiEc8onHKboVKgUqBSoFKgUqBrUyBFY0O0wTPfe5zyy6dfUJRuI9+9KPL/hT9Z4v6z+Cw9fod7nCHQS/MIvBwCu1xxx3X3OQmN1kWy2K5LWPNWTSTNk9bBJ61jEqBSoFKgUqBSoGNpMCKRodplcc97nHLcBQoStHbYXSjgBK3OZm9M2zgZSvyoemfReDn4LfHPOYxzV/8xV8sK860yz/90z81r3jFK8ZuorbspXqjUqBSoFKgUqBSYC+jwNliJN6OqxNledRRRzUveclLliW58pWvXLwftjffCEiD4ylPecqS4m9605uW5bwbgZcYDlum/93f/V3zL//yL0vwEmx7qUtdqtDM6pcKlQLzogA+FMCM58Qd+cwDyAflgL4YEWi9qOBp3lh19fHbsn749HFyXIGDJitUCuypFMDT+p2PgT+e3sNWik7eHMxGWDe84Q1HgiUbylH0b3zjGzcscHScwZH4baThQeA96lGPKjuxEv5dMB113/vetzzfCEYhkH0mAcG9WmWhvn1B3y9LvTei7n089tb/+M9BhXnSs8MVr3nNa666TcfRibFhWbjl89rcfx+ruHj9HvnIRzZXvOIVx70+1X154SkCVr38Puc5z1mMKDzKmHJMwWmnnVb2Bzrf+c7XfOUrXylnIP30pz8dved9RtCtb33rctDkVIVvoUTTyIUkB/mg/7omoO8kyLSrlSuT8t5qz+z9ZBXpRz/60caO34cffnhz8YtffEl7bHKa7Bw7BNKZH//4xy8zODDQ0UcfvWkNDgQ31UIQPvvZzy4HzS2yERgWpnkYbBijC4Tyi1/84uZWt7pVc+lLX7r7aO6/CexPfOITzZlnnjm2LG0rMNiKnBQUYxP3HhA8VvBMCuiVpx1qh6agetnVv6uggDb+0pe+VPjva1/7WmlDnrdXvepVazYA+ugo6wc/+EExPPA1oyANWsqf0l8tyM806fve977iOfziF7/Y/OxnPyvZnetc52r222+/5qCDDmouf/nLFwPr+c9/ftkhWb+TjtEFN/mkQjz3uc/dHHzwwatFaa9975e//GWDV6bdyBD9KTv9GA98//vfLyv0su3HEeo85zlPaS8D1gqrowDe3rVrV9kr66yzzmroGvR3rtkFLnCB1WW6EW+Fch6E8GS0MZIw9bLks//++7dnnHHG4DvzvhkrQdp73/veS/Dp49f9Hx6PNpTsvNFaln+M0NpXv/rVbYyuluEa7t32Pve5Txsddtl787yBdte5znXaYNTSrmEALMPNvYte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"},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE2LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgd2lkdGg9IjQ1Ljk1OHB4IiBoZWlnaHQ9IjQ1Ljk1OHB4IiB2aWV3Qm94PSIwIDAgNDUuOTU4IDQ1Ljk1OCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDUuOTU4IDQ1Ljk1ODsiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggZD0iTTIyLjk3OSwwQzEwLjI4OCwwLDAsMTAuMjg5LDAsMjIuOTc5czEwLjI4OCwyMi45NzksMjIuOTc5LDIyLjk3OWMxMi42OSwwLDIyLjk3OS0xMC4yODksMjIuOTc5LTIyLjk3OVMzNS42NywwLDIyLjk3OSwweg0KCQkgTTMyLjI1MywyNi45NzdoLTUuMzAxdjUuMjg5YzAsMi4yMDctMS43NjUsMy45OTYtMy45NzIsMy45OTZjLTIuMjA2LDAtMy45NzEtMS43ODktMy45NzEtMy45OTZ2LTUuMjkxSDEzLjcxDQoJCWMtMi4yMDcsMC00LjAwNi0xLjc4OS00LjAwNi0zLjk5N2MwLTIuMjA3LDEuNzk2LTMuOTk2LDQuMDAzLTMuOTk2aDUuMzAydi01LjI4OWMwLTIuMjA4LDEuNzY1LTMuOTk3LDMuOTcxLTMuOTk3DQoJCWMyLjIwOCwwLDMuOTcyLDEuNzg5LDMuOTcyLDMuOTk3djUuMjloNS4zMDFjMi4yMDcsMCwzLjk5NywxLjc5LDMuOTk3LDMuOTk3QzM2LjI1LDI1LjE4OCwzNC40NiwyNi45NzcsMzIuMjUzLDI2Ljk3N3oiLz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg0K"},function(t,e){t.exports="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOC4xLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iQ2FwYV8xIgogICB4PSIwcHgiCiAgIHk9IjBweCIKICAgdmlld0JveD0iMCAwIDYxMiA2MTIiCiAgIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDYxMiA2MTI7IgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkxIHIxMzcyNSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZGVsZXRlLXNpbXBsZS5zdmciPjxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQzIj48cmRmOlJERj48Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPjwvY2M6V29yaz48L3JkZjpSREY+PC9tZXRhZGF0YT48ZGVmcwogICAgIGlkPSJkZWZzNDEiIC8+PHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaWQ9Im5hbWVkdmlldzM5IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIxLjA5MDcwMDciCiAgICAgaW5rc2NhcGU6Y3g9IjI5NS4wMzQwOCIKICAgICBpbmtzY2FwZTpjeT0iMzMwLjg1NDQ4IgogICAgIGlua3NjYXBlOndpbmRvdy14PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJDYXBhXzEiIC8+PGcKICAgICBpZD0iZzUiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45OTc4ODEzNSwwLDAsMC45OTc4ODEzNSwxLjczMDQwMTIsMC45MjM3Mjg0NykiPjxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InBhdGg3IgogICAgICAgZD0iTSA1ODcuODI2LDE4Ni45NjYgQyA1NzEuNzEsMTQ5LjYzNCA1NDkuODgyLDExNy4xOTggNTIyLjM0Miw4OS42NTggNDk0LjgwMiw2Mi4xMTggNDYyLjM2Niw0MC4yOSA0MjUuMDM0LDI0LjE3NCAzODcuNzAyLDguMDU4IDM0OC4wMjQsMCAzMDYsMCAyNzcuODQ4LDAgMjUwLjcxNiwzLjY3MiAyMjQuNjA0LDExLjAxNiAxOTguNDkyLDE4LjM2IDE3NC4xMTQsMjguNjYyIDE1MS40Nyw0MS45MjIgMTI4LjgyNiw1NS4xODIgMTA4LjIyMiw3MS4wOTQgODkuNjU4LDg5LjY1OCA3MS4wOTQsMTA4LjIyMiA1NS4xODIsMTI4LjgyNiA0MS45MjIsMTUxLjQ3IDI4LjY2MiwxNzQuMTE2IDE4LjM2LDE5OC40OTIgMTEuMDE2LDIyNC42MDQgMy42NzIsMjUwLjcxNiAwLDI3Ny44NDggMCwzMDYgYyAwLDI4LjE1MiAzLjY3Miw1NS4yODQgMTEuMDE2LDgxLjM5NiA3LjM0NCwyNi4xMSAxNy42NDYsNTAuNDg3IDMwLjkwNiw3My4xMzQgMTMuMjYsMjIuNjQ0IDI5LjE3Miw0My4yNDkgNDcuNzM2LDYxLjgxMiAxOC41NjQsMTguNTY0IDM5LjE2OCwzNC40NzggNjEuODEyLDQ3LjczNiAyMi42NDQsMTMuMjYgNDcuMDIyLDIzLjU2MSA3My4xMzQsMzAuOTA2IEMgMjUwLjcxNiw2MDguMzI4IDI3Ny44NDgsNjEyIDMwNiw2MTIgYyAyOC4xNTIsMCA1NS4yODQsLTMuNjcyIDgxLjM5NiwtMTEuMDE2IDI2LjExMSwtNy4zNDYgNTAuNDg4LC0xNy42NDYgNzMuMTM1LC0zMC45MDYgMjIuNjQ0LC0xMy4yNTkgNDMuMjQ5LC0yOS4xNzIgNjEuODEyLC00Ny43MzYgMTguNTY0LC0xOC41NjMgMzQuNDc4LC0zOS4xNjggNDcuNzM2LC02MS44MTIgMTMuMjYsLTIyLjY0NiAyMy41NjEsLTQ3LjAyMyAzMC45MDYsLTczLjEzNSBDIDYwOC4zMjgsMzYxLjI4NCA2MTIsMzM0LjE1MiA2MTIsMzA2IDYxMiwyNjMuOTc2IDYwMy45NDIsMjI0LjI5OCA1ODcuODI2LDE4Ni45NjYgWiBNIDQ2OC4xOCwzOTEuNjggYyAyLjA0LDIuMDQgMy4wNjMsNC4yODQgMy4wNjMsNi43MzIgMCwyLjQ0OCAtMS4wMjEsNC40ODggLTMuMDYzLDYuMTIgbCAtNTkuOTc2LDYwLjU4OCBjIC0xLjYzMSwxLjYzMiAtMy44NzYsMi40NDggLTYuNzMyLDIuNDQ4IC0yLjg1NCwwIC00Ljg5NSwtMC44MTYgLTYuMTIsLTIuNDQ4IEwgMzA5LjA2LDM3OC44MjggMjIzLjM4LDQ2NS4xMiBjIC0yLjQ0OCwxLjYzMiAtNC42OTIsMi40NDggLTYuNzMyLDIuNDQ4IC0xLjYzMiwwIC0zLjY3MiwtMC44MTYgLTYuMTIsLTIuNDQ4IGwgLTU5Ljk3NiwtNjAuNTg4IGMgLTIuMDQsLTEuMjI2IC0zLjA2LC0zLjI2NyAtMy4wNiwtNi4xMiAwLC0yLjQ0OCAxLjAyLC00LjY5MiAzLjA2LC02LjczMiBsIDg1LjY4LC04NS42OCAtODUuNjgsLTg1LjY4IGMgLTIuMDQsLTIuMDQgLTMuMDYsLTQuMjg0IC0zLjA2LC02LjczMiAwLC0yLjg1NiAxLjAyLC00Ljg5NiAzLjA2LC02LjEyIGwgNTkuOTc2LC02MC41ODggYyAxLjYzMiwtMS42MzIgMy42NzIsLTIuNDQ4IDYuMTIsLTIuNDQ4IDIuNDQ4LDAgNC42OTIsMC44MTYgNi43MzIsMi40NDggbCA4NS42OCw4Ni4yOTIgODYuMjkyLC04Ni4yOTIgYyAxLjYzNSwtMS42MzIgMy42NzUsLTIuNDQ4IDYuMTIsLTIuNDQ4IDIuNDQ4LDAgNC42OTIsMC44MTYgNi43MzIsMi40NDggbCA1OS45NzYsNjAuNTg4IGMgMi4wNCwxLjYzMiAzLjA2MywzLjY3MiAzLjA2Myw2LjEyIDAsMi40NDggLTEuMDIxLDQuNjkyIC0zLjA2Myw2LjczMiBMIDM4Mi41LDMwNiBsIDg1LjY4LDg1LjY4IHoiCiAgICAgICBzdHlsZT0iZmlsbDojMDEwMDAyIiAvPjwvZz48ZwogICAgIGlkPSJnOSIgLz48ZwogICAgIGlkPSJnMTEiIC8+PGcKICAgICBpZD0iZzEzIiAvPjxnCiAgICAgaWQ9ImcxNSIgLz48ZwogICAgIGlkPSJnMTciIC8+PGcKICAgICBpZD0iZzE5IiAvPjxnCiAgICAgaWQ9ImcyMSIgLz48ZwogICAgIGlkPSJnMjMiIC8+PGcKICAgICBpZD0iZzI1IiAvPjxnCiAgICAgaWQ9ImcyNyIgLz48ZwogICAgIGlkPSJnMjkiIC8+PGcKICAgICBpZD0iZzMxIiAvPjxnCiAgICAgaWQ9ImczMyIgLz48ZwogICAgIGlkPSJnMzUiIC8+PGcKICAgICBpZD0iZzM3IiAvPjwvc3ZnPg=="},function(t,e){t.exports=require("sharedb/lib/client")},function(t,e){t.exports=require("jquery-ui-dist/jquery-ui")},function(t,e){t.exports=require("cytoscape-edgehandles")},function(t,e){t.exports=require("cytoscape-edge-editing")},function(t,e){t.exports=require("cytoscape-fcose")},function(t,e){t.exports=require("cytoscape-node-editing")},function(t,e){t.exports=require("cytoscape-undo-redo")},function(t,e){t.exports=require("cytoscape-panzoom")},function(t,e){var a,i,o,n,r,l,c,I,g,d,u,s,C;t.exports=(a=[{selector:"node",style:{"text-valign":"center","text-halign":"center",color:"#1e2829",width:function(t){return t.data("w")||0},height:function(t){return t.data("h")||0},"background-color":"white",shape:function(t){return I(t)},"border-width":function(t){return o(t)},"border-color":function(t){return d(t)},"font-size":14}},{selector:"node[name]",style:{label:"data(name)"}},{selector:"node:parent",style:{shape:function(t){return I(t)},"text-valign":function(t){return"bottom"},"text-margin-y":2,"padding-left":function(t){return i(t)},"padding-right":function(t){return i(t)},"padding-bottom":function(t){return i(t)},"padding-top":function(t){return i(t)},"background-opacity":.5,"border-width":function(t){return n(t)},"border-color":function(t){return d(t)},"background-color":function(t){return g(t)}}},{selector:"edge",style:{"arrow-scale":1.7,"curve-style":"bezier","text-background-color":"#EEEEEE","text-background-opacity":0,"target-arrow-shape":function(t){return s(t)},width:1,"line-color":function(t){return u(t)},"target-arrow-color":function(t){return u(t)},"line-style":function(t){return C(t)},opacity:1}},{selector:"edge[name]",style:{label:function(t){var e=t.data("name");return""===e?e:e+"\n ⁠"},"text-wrap":"wrap","edge-text-rotation":"autorotate","text-background-opacity":"0"}},{selector:".eh-handle",style:{"background-color":"#1abc9c",width:12,height:12,shape:"ellipse","overlay-opacity":0,"border-width":12,"border-opacity":0}},{selector:".eh-hover",css:{"background-color":"#1abc9c"}},{selector:".eh-source",css:{"border-width":2,"border-color":"#1abc9c"}},{selector:".eh-target",css:{"border-width":2,"background-color":"#1abc9c","border-color":"#1abc9c"}},{selector:".eh-preview, .eh-ghost-edge",css:{"line-color":"#1abc9c","target-arrow-color":"#1abc9c","source-arrow-color":"#1abc9c"}},{selector:".highlightedEdge",style:{width:3.5,"border-width":4,"line-color":"#1abc9c","target-arrow-color":"#1abc9c","arrow-scale":2}},{selector:".highlightedNode",style:{"border-width":function(t){return r(t)},"border-color":"#1abc9c","background-color":"#fff"}},{selector:".invalidGene",style:{"border-width":2,"border-color":"#e94332",color:"#e94332"}},{selector:".invalidGeneHighlight",style:{"border-width":3,"font-weight":"bold","border-color":"#e94332",color:"#e94332"}},{selector:"node:selected",style:{"border-width":function(t){return l(t)},"border-color":"#ffc90e"}},{selector:".highlightedNode:selected, .invalidGeneHighlight:selected",style:{"border-width":function(t){return c(t)}}},{selector:"edge:selected",style:{width:3,"line-color":"#ffc90e","target-arrow-color":"#ffc90e"}}],i=function(t){switch(t._private.data.type){case"FAMILY":return 5;case"COMPLEX":return"5";case"COMPARTMENT":case"PROCESS":return 10;default:return 5}},o=function(t){switch(t._private.data.type){case"GENE":return 1;case"PROCESS":return 0;case"FAMILY":return 2;case"COMPARTMENT":return 4;default:return 1}},n=function(t){switch(t._private.data.type){case"GENE":return 1;case"PROCESS":return 0;case"FAMILY":return 2;case"COMPLEX":return 1;case"COMPARTMENT":return 4;default:return 1}},r=function(t){switch(t._private.data.type){case"GENE":return 3;case"PROCESS":return 1;case"FAMILY":return 4;case"COMPARTMENT":return 6;default:return 3}},l=function(t){switch(t._private.data.type){case"GENE":return 2;case"PROCESS":return 1;case"FAMILY":return 3;case"COMPARTMENT":return 5;default:return 2}},c=function(t){switch(t._private.data.type){case"GENE":return 3;case"PROCESS":return 1;case"FAMILY":return 4;case"COMPARTMENT":return 6;default:return 3}},I=function(t){switch(t._private.data.type){case"GENE":case"PROCESS":return"roundrectangle";case"FAMILY":return"rectangle";case"COMPARTMENT":return"roundrectangle";case"COMPLEX":return"rectangle";default:return"roundrectangle"}},g=function(t){return"#fff"},d=function(t){switch(t._private.data.type){case"GENE":return"#00000a";case"FAMILY":return"#a3a3a3";case"COMPLEX":case"COMPARTMENT":default:return"#000000"}},u=function(t){return"#1b1b1b"},s=function(t){switch(t._private.data.type){case"ACTIVATES":return"triangle";case"INHIBITS":return"tee";case"INDUCES":return"triangle";case"REPRESSES":return"tee";case"BINDS":default:return"none"}},C=function(t){switch(t._private.data.type){case"ACTIVATES":case"INHIBITS":return"solid";case"INDUCES":case"REPRESSES":return"dashed";case"BINDS":default:return"solid"}},a)},function(t,e){var a={zoomFactor:.05,zoomDelay:45,minZoom:.1,maxZoom:10,fitPadding:50,panSpeed:10,panDistance:10,panDragAreaSize:75,panMinPercentSpeed:.25,panInactiveArea:8,panIndicatorMinOpacity:.5,zoomOnly:!1,fitSelector:void 0,animateOnFit:function(){return!1},fitAnimationDuration:1e3,sliderHandleIcon:"fa fa-minus",zoomInIcon:"fa fa-plus",zoomOutIcon:"fa fa-minus",resetIcon:"fa fa-expand"};t.exports=a},function(t,e){t.exports=require("cytoscape-navigator")},function(t,e){t.exports=require("cytoscape-context-menus")},function(t,e){t.exports=require("konva")},function(t,e){t.exports=require("cytoscape-view-utilities")},function(t,e){t.exports=require("cytoscape-grid-guide")},function(t,e){t.exports=require("cytoscape-popper")},function(t,e){t.exports=require("cytoscape-layout-utilities")},function(t,e){t.exports=require("@datastructures-js/max-heap")},function(t,e,a){"use strict";a.r(e),a.d(e,"EModalType",(function(){return $e})),a.d(e,"PathwayMapper",(function(){return za}));var i,o=a(3),n=a.n(o),r=a(2),l=a(5),c=a(0),I=a.n(c),g=a(1),d=a(10),u=(a(54),a(22)),s=a.n(u),C=(a(55),a(56),a(57),a(18),a(8)),A=a(14),M=function(){function t(){}return Object.defineProperty(t,"exportGraph",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e,a){var i=t.pathwayTitle+"\n\n";i+=t.pathwayDetails+"\n\n";var o=e.nodes(),n=e.edges();if(i+="--NODE_NAME\tNODE_ID\tNODE_TYPE\tPARENT_ID\tPOSX\tPOSY\tWIDTH\tHEIGHT--\n",o)for(var r=0;r4?b[4]:"0",M=b.length>5?b[5]:"0",p={group:"nodes",data:{id:u,name:d,type:s,w:b.length>7?b[6]:"PROCESS"===s?6*d.length+24:"150",h:b.length>7?b[7]:"PROCESS"===s?"24":"52",parent:-1},position:{x:parseInt(A),y:parseInt(M)}};"-1"!=C&&(p.data.parent=C),a.push(p)}for(var N=n;N4?b[4].split(";"):[],w=b.length>5?b[5]:"",D=b.length>6?b[6]:"",T=b.length>7?b[7]:"",L=[];if(D)for(var f=D.split(")"),O=0;O=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},N=function(){function t(){Object.defineProperty(this,"pathwayInfo",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(this),this.pathwayInfo={pathwayTitle:"New Pathway",pathwayDetails:""}}return Object.defineProperty(t.prototype,"getPathwayInfo",{get:function(){return this.pathwayInfo},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"setPathwayInfo",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.pathwayInfo=t}}),Object.defineProperty(t.prototype,"b64toBlob",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e,a){void 0===a&&(a=512),e=e||"";for(var i=atob(t),o=[],n=0;n0){var n=a[0],r=n.boundingBox(),l=n.outerHeight(),c=this;a.forEach((function(e,a){if(0!=a&&null==i[e.parent().id()]){var o=c.calculateNewPosition(t,e,r,l);c.changePosition(e,0,0,o)}})),this.editor.handleChangePositionByAlignment(c.movedNodes)}}}),Object.defineProperty(t.prototype,"calculateNewPosition",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e,a,i){var o,n=e.position(),r=e.boundingBox(),l=e.isParent()?e.outerHeight()-(r.h-e.outerHeight())/2-(e.outerHeight()-e.height())/2:e.height(),c=e.isParent()?r.h-e.outerHeight():0;if("vLeft"===t)o={x:a.x1+r.w/2,y:n.y};else if("vCen"===t)o={x:a.x1+a.w/2,y:n.y};else if("vRight"===t)o={x:a.x2-r.w/2,y:n.y};else if("hTop"===t)o={x:n.x,y:a.y1+r.h/2};else if("hMid"===t&&e.isParent()&&""==e.data("name"))o={x:n.x,y:a.y1+a.h/2};else if("hMid"===t)o={x:n.x,y:a.y1+i/2+c/2};else if("hBot"===t&&e.isParent()&&""==e.data("name"))o={x:n.x,y:a.y2-r.h/2};else{if("hBot"!==t)return void console.log("Error: wrong alignment name "+t);o={x:n.x,y:a.y1+i-l/2}}return o}}),Object.defineProperty(t.prototype,"changePosition",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e,a,i){if(t.isParent()){var o=t.children(),n=t.boundingBox(),r=this;o.forEach((function(t,e){var a=t.boundingBox(),o=-(n.x1-a.x1)-n.w/2+a.w/2,l=-(n.y1-a.y1)-n.h/2+a.h/2;t.isParent()?r.changePosition(t,0,0,{x:i.x+o,y:i.y+l}):r.changePosition(t,o,l,i)}))}else{var l={x:i.x+e,y:i.y+a};this.movedNodes.push({node:t,nextPosition:l,oldPosition:null})}}}),t}(),m=(i=function(t,e){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(t,e)},function(t,e){function a(){this.constructor=t}i(t,e),t.prototype=null===e?Object.create(e):(a.prototype=e.prototype,new a)}),j=function(t){function e(e){return t.call(this,e)||this}return m(e,t),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return I.a.createElement(g.Modal,{show:this.props.show,onHide:function(){t.props.handleClose($e.ABOUT)}},I.a.createElement(g.Modal.Header,{closeButton:!0},I.a.createElement(g.Modal.Title,null,"About")),I.a.createElement(g.Modal.Body,null,I.a.createElement("h3",{id:"about-model-header"},"PathwayMapper 2.2"),I.a.createElement("div",{className:"aboutImageContent"},I.a.createElement("img",{src:a(58),alt:"",height:"34px"})),I.a.createElement("div",{className:"aboutImageContent"},I.a.createElement("img",{src:a(59),alt:"",height:"34px"})),I.a.createElement("div",{className:"adressText"},I.a.createElement("p",null,"i-Vis information Visualization Lab"),I.a.createElement("p",null,"Bilkent University, Ankara, Turkey")),I.a.createElement("div",{className:"adressText"},I.a.createElement("p",null,"Memorial Sloan-Kettering Cancer Center"),I.a.createElement("p",null,"New York, USA"))),I.a.createElement(g.Modal.Footer,null,I.a.createElement("a",{href:"https://github.com/iVis-at-Bilkent/pathway-mapper"},"https://github.com/iVis-at-Bilkent/pathway-mapper")))}}),e}(I.a.Component),w=a(11),D=a(15),T=a.n(D),L=a(9),f=a.n(L),O=a(12),v=a.n(O),G=a(13),S=a.n(G),P=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),z=a(19),Y=a(20);function Z(t){return[parseInt(t[1]+t[2],16),parseInt(t[3]+t[4],16),parseInt(t[5]+t[6],16),1]}var R,B={type:"rectangle",fill:Z("#bebebe"),x:0,y:0,width:6,height:20,stroke:[0,0,0,0],"stroke-width":0},x=["Amplification","Deep Deletion","Fusion","Germline Mutation","Missense Mutation (putative driver)","Missense Mutation (unknown significance)","Other Mutation","Promoter Mutation","Truncating Mutation (putative driver)","Truncating Mutation (unknown significance)","Inframe Mutation (putative driver)","Inframe Mutation (unknown significance)"],W=[{type:"rectangle",fill:Z("#ff0000"),x:0,y:0,width:6,height:20},{type:"rectangle",fill:Z("#0000ff"),x:0,y:0,width:6,height:20},{type:"rectangle",fill:Z("#8B00C9"),x:0,y:4,width:6,height:12},{type:"rectangle",fill:Z("#FFFFFF"),x:0,y:8.75,width:6,height:1.6},{type:"rectangle",fill:Z("#008000"),x:0,y:6.66,width:6,height:6.66},{type:"rectangle",fill:Z("#53D400"),x:0,y:6.66,width:6,height:6.66},{type:"rectangle",fill:Z("#cf58bc"),x:0,y:6.66,width:6,height:6.66},{type:"rectangle",fill:Z("#00B7CE"),x:0,y:6.66,width:6,height:6.66},{type:"rectangle",fill:Z("#000000"),x:0,y:6.66,width:6,height:6.66},{type:"rectangle",fill:Z("#708090"),x:0,y:6.66,width:6,height:6.66},{type:"rectangle",fill:Z("#993404"),x:0,y:6.66,width:6,height:6.66},{type:"rectangle",fill:Z("#a68028"),x:0,y:6.66,width:6,height:6.66}],k=function(t){function e(e){return t.call(this,e)||this}return P(e,t),Object.defineProperty(e.prototype,"generateOncoprintLegend",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t="http://www.w3.org/2000/svg",e=document.createElementNS(t,"svg");return W.forEach((function(a,i){var o=i%3*280,n=o+9,r=38*Math.floor(i/3),l=r+15,c=document.createElementNS(t,"g");a.stroke||(a.stroke=[0,0,0,0],a["stroke-width"]=0),c.appendChild(Object(w.shapeToSvg)(B,o,r)),c.appendChild(Object(w.shapeToSvg)(a,o,r));var I=document.createElementNS(t,"text");I.setAttributeNS(null,"x",n.toString()),I.setAttributeNS(null,"y",l.toString()),I.setAttributeNS(null,"font-size","12"),I.setAttributeNS(null,"font-family","Arial");var g=document.createTextNode(x[i]);I.appendChild(g),c.appendChild(I),e.appendChild(c)})),e.setAttribute("width","840"),e.setAttribute("height","175"),e.style.paddingTop="20px",e.setAttribute("xmlns",t),e}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return I.a.createElement(g.Modal,{bsSize:"lg",id:"cBioHelpModal",className:"pathwayMapper",show:this.props.show,onHide:function(){t.props.handleClose($e.CHELP)}},I.a.createElement(g.Modal.Header,{closeButton:!0},I.a.createElement(g.Modal.Title,null,"PathwayMapper cBioPortal Edition 2.2")),!this.props.patientView&&I.a.createElement(g.Modal.Body,null,I.a.createElement("p",{className:"leftText"},"PathwayMapper shows you your genes of interest with the alteration frequencies of selected genetic profiles of the chosen study overlaid on a TCGA pathway using a white to red color scale (the more frequently altered a gene is, the more red it's shown). All available TCGA pathways are ranked with the aim to choose the pathway that matches your interest the most. By default we display the pathway with highest ranking with the default ranking options but you may look at your genes of interest in the context of other pathways as well by choosing from the pathway table.",I.a.createElement("br",null),I.a.createElement("br",null),"Refer to the documentation ",I.a.createElement("a",{href:"https://github.com/iVis-at-Bilkent/pathway-mapper",target:"_blank"},"here")," for the notation used.",I.a.createElement("br",null),I.a.createElement("br",null),"To search for a particular pathway of your interest, use the search field on top of the pathway table. To switch to another pathway, click on the button in the associated row of the pathway table. Ranking criteria might be changed by changing the options at the bottom of the table.",I.a.createElement("br",null),I.a.createElement("br",null),"The buttons on top of the pathway are:",I.a.createElement("ul",null,I.a.createElement("table",{cellPadding:5},I.a.createElement("tr",null,I.a.createElement("td",null,I.a.createElement("img",{height:"22px",width:"22px",src:v.a}))," ",I.a.createElement("td",null,"Save as PNG")),I.a.createElement("tr",null,I.a.createElement("td",null,I.a.createElement("img",{height:"22px",width:"22px",src:S.a}))," ",I.a.createElement("td",null,"Save as SVG")),I.a.createElement("tr",null,I.a.createElement("td",null,I.a.createElement("img",{height:"22px",width:"22px",src:f.a}))," ",I.a.createElement("td",null,"Perform layout: Layout is recalculated taking current node positions into account")),I.a.createElement("tr",null,I.a.createElement("td",null,I.a.createElement("img",{height:"22px",width:"22px",src:z}))," ",I.a.createElement("td",null,"Add selected genes to query: You may select additional genes from the pathway by left clicking (Shift + left click to add more genes)")),I.a.createElement("tr",null,I.a.createElement("td",null,I.a.createElement("img",{height:"22px",width:"22px",src:Y}))," ",I.a.createElement("td",null,"Add all valid genes to query: All valid gene symbols will be added to the query; others will be ignored")),I.a.createElement("tr",null,I.a.createElement("td",null,I.a.createElement("img",{height:"22px",width:"22px",src:T.a}))," ",I.a.createElement("td",null,"Edit pathway: Edit both the topology and the geometry of the current pathway with the full blown PathwayMapper editor")))))),",",this.props.patientView&&I.a.createElement(g.Modal.Body,null,I.a.createElement("p",{className:"leftText"},"PathwayMapper shows you your genes of interest with the mutation types, copy number alterations and fusions of selected genetic profiles of the chosen study overlaid on a TCGA pathway using the OncoPrint color scheme. All available TCGA pathways are ranked with the aim to choose the pathway that matches your interest the most. By default we display the pathway with the highest number of genes of interest matching the ones in a pathway but you may look at your genes of interest in the context of other pathways as well by choosing from the pathway table.",I.a.createElement("br",null),I.a.createElement("br",null),"Refer to the documentation ",I.a.createElement("a",{href:"https://github.com/iVis-at-Bilkent/pathway-mapper",target:"_blank"},"here")," for the notation used.",I.a.createElement("br",null),I.a.createElement("br",null),"Genetic alteration legend:",I.a.createElement("br",null),I.a.createElement("div",{className:"container",style:{paddingLeft:"45px",width:"fit-content"},dangerouslySetInnerHTML:{__html:this.generateOncoprintLegend().outerHTML}}),I.a.createElement("p",{style:{paddingLeft:"45px"}},"Putative driver and unknown significance annotations are based on data from OncoKB and CancerHotspots.org."),I.a.createElement("br",null),"To search for a particular pathway of your interest, use the search field on top of the pathway table. To switch to another pathway, click on the button in the associated row of the pathway table.",I.a.createElement("br",null),I.a.createElement("br",null),"The buttons on top of the pathway are:",I.a.createElement("ul",null,I.a.createElement("table",{cellPadding:5},I.a.createElement("tr",null,I.a.createElement("td",null,I.a.createElement("img",{height:"22px",width:"22px",src:v.a}))," ",I.a.createElement("td",null,"Save as PNG")),I.a.createElement("tr",null,I.a.createElement("td",null,I.a.createElement("img",{height:"22px",width:"22px",src:S.a}))," ",I.a.createElement("td",null,"Save as SVG")),I.a.createElement("tr",null,I.a.createElement("td",null,I.a.createElement("img",{height:"22px",width:"22px",src:f.a}))," ",I.a.createElement("td",null,"Perform layout: Layout is recalculated taking current node positions into account")))))))}}),e}(I.a.Component),U=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),H=function(t){function e(e){return t.call(this,e)||this}return U(e,t),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return I.a.createElement(g.Modal,{show:this.props.show,onHide:function(){t.props.handleClose($e.CONFIRMATION)}},I.a.createElement(g.Modal.Header,{closeButton:!0},I.a.createElement(g.Modal.Title,null,"Confirmation")),I.a.createElement(g.Modal.Body,null,I.a.createElement("div",null,"All unsaved changes will be lost. Do you want to continue?")),I.a.createElement(g.Modal.Footer,null,I.a.createElement(g.Button,{onClick:function(){e.pendingFunction(),t.props.handleClose($e.CONFIRMATION)}},"Yes"),I.a.createElement(g.Button,{onClick:function(){t.props.handleClose($e.CONFIRMATION)}},"No")))}}),e}(I.a.Component),Q=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),K=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r};!function(t){t[t.GRID=0]="GRID",t[t.GUIDE=1]="GUIDE",t[t.NONE=2]="NONE"}(R||(R={}));var X,V,F,J=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"gridSize",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"guideColor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"defaultSettings",{enumerable:!0,configurable:!0,writable:!0,value:h.defaultGridGuideOptions}),Object.defineProperty(a,"enabledType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(a),a.gridSize=a.defaultSettings.gridSpacing,a.guideColor=a.defaultSettings.guidelinesStyle.strokeStyle,a}return Q(e,t),Object.defineProperty(e.prototype,"setEnabledType",{enumerable:!1,configurable:!0,writable:!0,value:function(t){t!==this.enabledType?this.enabledType=t:this.enabledType=R.NONE}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return I.a.createElement(g.Modal,{dialogClassName:"gridModal",show:this.props.show,onShow:function(){t.enabledType=t.props.pathwayActions.enabledType},onHide:function(){t.props.handleClose($e.GRID)}},I.a.createElement(g.Modal.Header,{closeButton:!0},I.a.createElement(g.Modal.Title,null,"Grid Settings")),I.a.createElement(g.Modal.Body,null,I.a.createElement(g.Form,{id:"gripOptionsForm",className:"leftText"},I.a.createElement(g.Row,null,I.a.createElement(g.Col,{sm:8},I.a.createElement(g.ControlLabel,null,"Enable Grids:")),I.a.createElement(g.Col,{sm:4},I.a.createElement(g.Checkbox,{checked:this.enabledType===R.GRID,onChange:function(){t.setEnabledType(R.GRID)}}))),I.a.createElement(g.Row,null,I.a.createElement(g.Col,{sm:8},I.a.createElement(g.ControlLabel,null,"Enable Guidelines:")),I.a.createElement(g.Col,{sm:4},I.a.createElement(g.Checkbox,{checked:this.enabledType===R.GUIDE,onChange:function(){t.setEnabledType(R.GUIDE)}}))),I.a.createElement(g.Row,null,I.a.createElement(g.Col,{sm:8},I.a.createElement(g.ControlLabel,null,"Grid Size:")),I.a.createElement(g.Col,{sm:4},I.a.createElement(g.FormControl,{type:"text",value:this.gridSize,onChange:function(e){t.gridSize=e.target.value}}))),I.a.createElement(g.Row,{style:{marginTop:"10px"}},I.a.createElement(g.Col,{sm:8},I.a.createElement(g.ControlLabel,null,"Guideline Color:")),I.a.createElement(g.Col,{sm:4},I.a.createElement("input",{id:"guidelineColor",type:"color",className:"form-control",value:this.guideColor,onChange:function(e){t.guideColor=e.target.value}}))))),I.a.createElement(g.Modal.Footer,null,I.a.createElement(g.Button,{onClick:function(){t.props.pathwayActions.enabledType=t.enabledType,t.props.pathwayActions.adjustGridSettings(t.gridSize,t.guideColor),t.props.pathwayActions.enabledType===R.GRID?t.props.pathwayActions.toggleGrid(!0):t.props.pathwayActions.enabledType===R.GUIDE?t.props.pathwayActions.toggleGuide(!0):t.props.pathwayActions.toggleGrid(!1),t.props.handleClose($e.GRID)}},"Save")))}}),K([r.observable],e.prototype,"gridSize",void 0),K([r.observable],e.prototype,"guideColor",void 0),K([r.observable],e.prototype,"enabledType",void 0),e=K([l.observer],e)}(I.a.Component),q=function(){function t(){}return Object.defineProperty(t,"createGraphHierarchy",{enumerable:!1,configurable:!0,writable:!0,value:function(t){for(var e=[],a={},i=0,o=t.length;i0?a[l.parent().id()].childNodes.push(l):e.push(l)}return e}}),Object.defineProperty(t,"createGraphHierarchyRealTime",{enumerable:!1,configurable:!0,writable:!0,value:function(t){for(var e=[],a={},i=0,o=t.length;i0||""!==a.outerHTML?i.GENOMICDATA_LABEL_Y_OFFSET:0;if(i.svg.appendChild(i.createNodeLabel(t,n)),e)for(;e.length>0;){var l=e[0],c=t.position(),I=l.getAttribute("x"),g=l.getAttribute("y");l.setAttribute("x",c.x-t.width()/2+parseFloat(I)),l.setAttribute("y",c.y-t.height()/2+parseFloat(g)),i.svg.appendChild(l)}else if(""!==a.outerHTML){c=t.position();var d=parseInt(a.getAttribute("width")),u=parseInt(a.getAttribute("height")),s=c.y+t.height()/2-(u+8);a.setAttribute("x",c.x-d/2),a.setAttribute("y",s),i.svg.appendChild(a)}if(t.childNodes)for(var C in t.childNodes)r(t.childNodes[C])};for(var l in n){var c=n[l];r(c)}return e.forEach((function(t){i.drawEdge(t)})),this.svg.outerHTML}}),Object.defineProperty(t.prototype,"drawEdge",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=t.sourceEndpoint(),a=t.targetEndpoint(),i=t.style("target-arrow-shape"),o=t.style("line-style"),n=t.style("curve-style"),r="segments"===n?t.segmentPoints():t.controlPoints(),l=this.createEdgeLabel(t);l&&this.svg.appendChild(l);var c={x:e.x,y:e.y},I={x:a.x,y:a.y};r&&r.length>0&&(c={x:r[r.length-1].x,y:r[r.length-1].y});var g=this.unitVector({x:a.x-c.x,y:a.y-c.y}),d=this.scale(g,-1),u=a.x,s=a.y;if("triangle"===i){u=a.x+this.TRIANGLE_ARROW_HEAD_HEIGHT*d.x,s=a.y+this.TRIANGLE_ARROW_HEAD_HEIGHT*d.y;var C=this.rotateVector(g,Math.PI/2),A=this.rotateVector(g,-Math.PI/2);C=this.scale(C,this.TRIANGLE_ARROW_HEAD_WIDTH/2),A=this.scale(A,this.TRIANGLE_ARROW_HEAD_WIDTH/2);var M=u+C.x,p=s+C.y;I={x:(M+(b=u+A.x))/2,y:(p+(y=s+A.y))/2};var N=document.createElementNS(this.SVGNameSpace,"polygon");N.setAttribute("points",M+","+p+","+b+","+y+","+a.x+","+a.y),this.svg.appendChild(N)}else if("tee"===i){u=a.x,s=a.y;C=this.rotateVector(g,Math.PI/2),A=this.rotateVector(g,-Math.PI/2);C=this.scale(C,this.T_ARROW_HEAD_HEIGHT/2),A=this.scale(A,this.T_ARROW_HEAD_HEIGHT/2);var b,y;M=u+C.x,p=s+C.y;I={x:(M+(b=u+A.x))/2,y:(p+(y=s+A.y))/2};var h=document.createElementNS(this.SVGNameSpace,"line");h.setAttribute("x1",M),h.setAttribute("y1",p),h.setAttribute("x2",b),h.setAttribute("y2",y),h.setAttribute("stroke-width",this.T_ARROW_HEAD_WIDTH.toString()),h.setAttribute("stroke","black"),this.svg.appendChild(h)}if(!r||r.length<1){var E=document.createElementNS(this.SVGNameSpace,"line");E.setAttribute("x1",e.x),E.setAttribute("y1",e.y),E.setAttribute("x2",I.x),E.setAttribute("y2",I.y),E.setAttribute("stroke-width",this.EDGE_WIDTH.toString()),E.setAttribute("stroke","black"),"dashed"===o&&E.setAttribute("stroke-dasharray",this.DASH_PARAMETERS),this.svg.appendChild(E)}else if("unbundled-bezier"===n||"bezier"===n){for(var m=document.createElementNS(this.SVGNameSpace,"path"),j=[],w=0;wa[a.length-1].value)return{lower:{value:a[a.length-1].value,color:a[a.length-1].color},upper:{value:1/0,color:a[a.length-1].color}};for(var i=0;i=a[i].value&&e0&&(d+=-1*u,u=0),g=function(t,e,a,i,o){var n=Math.log(1+i),r=Math.log(1+a),l=(Math.log(1+(o>=0?o:-1*o))-r)/(n-r)*(o>=0?.8:1.2);return{r:t.r+l*(e.r-t.r),g:t.g+l*(e.g-t.g),b:t.b+l*(e.b-t.b)}}(C,s,u,d,Number(n))}var A="";if(n){A="rgb("+Math.round(g.r)+", "+Math.round(g.g)+", "+Math.round(g.b)+")",(y=document.createElementNS(a,"rect")).setAttribute("x",t),y.setAttribute("y",e),y.setAttribute("width",i),y.setAttribute("height",o),y.setAttribute("style","stroke-width:1;stroke:rgb(0,0,0);opacity:1;fill:"+A+";"),"-"===n[0]&&(n=n.substr(1));var M=n<.5&&n>0?"<0.5":Number(n).toFixed(1),p=-101==n?"N/P":M+"%",N=i/2-4*p.length,b=document.createElementNS(a,"text");b.setAttribute("x",t+N),b.setAttribute("y",e+o/2+14/3),b.setAttribute("font-family","Arial"),b.setAttribute("font-size","14"),b.innerHTML=p,r.appendChild(y),r.appendChild(b)}else{var y;A="rgb(210,210,210)",(y=document.createElementNS(a,"rect")).setAttribute("x",t),y.setAttribute("y",e),y.setAttribute("width",i),y.setAttribute("height",o),y.setAttribute("style","stroke-width:1;stroke:rgb(0,0,0);opacity:1;fill:"+A+";"),r.appendChild(y)}}return l}}),Object.defineProperty(t.prototype,"getRequiredWidthForGenomicData",{enumerable:!1,configurable:!0,writable:!0,value:function(t){return 150+35*(t>3?t-3:0)}}),Object.defineProperty(t.prototype,"updateColorScheme",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.colorScheme=t}}),Object.defineProperty(t.prototype,"showGenomicData",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e=this,a=this.countVisibleGenomicDataByType();a<1?this.hideGenomicData():(this.cy.nodes('[type="GENE"]').forEach((function(e){e.data("w",t.getRequiredWidthForGenomicData(a))})),this.cy.style().selector('node[type="GENE"]').style("text-margin-y",(function(t){return t.data("name")in e.genomicDataMap?-15:0})).style("background-image",(function(t){var a=encodeURIComponent(e.generateSVGForNode(t).outerHTML);return"undefined"===a?"none":"data:image/svg+xml;utf8,"+a})).update())}}),Object.defineProperty(t.prototype,"parseGenomicData",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.genomicDataMap=this.genomicDataMap||{},this.visibleGenomicDataMapByType=this.visibleGenomicDataMapByType||{},this.groupedGenomicDataMap=this.groupedGenomicDataMap||{};for(var a=[],i=t.split("\n"),o=i[0].split("\t"),n=1;n12?o-12:0),c=l-10;r.setAttribute("width",l),r.setAttribute("height",n.h),r.setAttribute("xmlns",a);var I={w:c,h:25,x:l/2-c/2,y:n.h/2+12.5-18},g=0;for(var d in e[i]){var u=e[i],s=d;if(this.visibleGenomicDataMapByType[i]){var C=this.getOncoprintColors(s);void 0!==u[s]?A(I.x+g*I.w/o,I.y,I.w/o,I.h,100,r,s,C):A(I.x+g*I.w/o,I.y,I.w/o,I.h,null,r,"",null),g++}}function A(t,e,i,o,n,r,l,c){if(n){var I=document.createElementNS(a,"rect");I.setAttribute("x",t),I.setAttribute("y",e),I.setAttribute("width",i),I.setAttribute("height",o),I.setAttribute("style","stroke-width:1;stroke:rgb(0,0,0);opacity:1;fill:"+c+";");var g=i/2-16,d=document.createElementNS(a,"text");"rgb(0,0,0)"===c&&d.setAttribute("fill","white"),d.setAttribute("x",t+g),d.setAttribute("y",e+o/2+14/3),d.setAttribute("font-family","Arial"),d.setAttribute("font-size","14"),d.innerHTML=l.substring(0,4),r.appendChild(I),r.appendChild(d)}else c="rgb(210,210,210)"}return r}}),Object.defineProperty(t.prototype,"generateOncoprintForPatientNode",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this.patientData[t.data("name")],a="http://www.w3.org/2000/svg",i=document.createElementNS(a,"svg");if(!e)return{outerHTML:""};var o=new w.GeneticAlterationRuleSet(e.geneticTrackRuleSetParams),n=o.getUniversalShapes(6,23),r=o.getSpecificShapesForDatum(e.geneticTrackData,6,23).map((function(t){return n.concat(t)}));return r.forEach((function(t,e){var o=9*e,n=document.createElementNS(a,"g");t.forEach((function(t){return n.appendChild(Object(w.shapeToSvg)(t,o,8))})),i.appendChild(n)})),i.setAttribute("width",(9*r.length).toString()),i.setAttribute("height",31..toString()),i.setAttribute("xmlns",a),i}}),Object.defineProperty(t.prototype,"getCNADisplayString",{enumerable:!1,configurable:!0,writable:!0,value:function(t){return{"-2":"HOMODELETED","-1":"HETLOSS",1:"GAIN",2:"AMPLIFIED"}[t]}}),Object.defineProperty(t.prototype,"generateSvgIconForSample",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){return''+e+""}}),Object.defineProperty(t.prototype,"generateHTMLContentForNodeTooltip",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){var a=this,i=e.sampleColors,o=e.sampleIndex,n=e[t.data("name")],r=et()("
");return r.css({"max-width":"200px","max-height":"200px","word-wrap":"break-word","overflow-y":"auto"}),n.geneticTrackData.forEach((function(t,e){var n=t.sample,l=i[n],c=(o[n]+1).toString(),I=a.generateSvgIconForSample(l,c),g=e>0?"10px":"0px",d=et()("
");d.css({"margin-top":g});var u=t.data,s=[],C=[],A=[];u.forEach((function(e){var i=e.gene.hugoGeneSymbol;if(t.disp_mut&&e.proteinChange&&"Fusion"!==e.mutationType){var o=e.proteinChange;s.push({gene:i,proteinChange:o})}if(t.disp_cna&&e.alteration){var n=e.alteration,r=a.getCNADisplayString(n);C.push({gene:i,cnaLabel:r})}if(t.disp_fusion&&e.proteinChange&&"Fusion"===e.mutationType){o=e.proteinChange;A.push({gene:i,proteinChange:o})}}));var M=s.length>0?"Mutation: ":"",p=C.length>0?"CNA: ":"",N=A.length>0?"Fusion: ":"";s.forEach((function(t,e){M+=""+t.gene+" "+t.proteinChange+"",e!==s.length-1?M+=", ":M+="
"})),C.forEach((function(t,e){p+=""+t.gene+" "+t.cnaLabel+"",e!==C.length-1?p+=", ":p+="
"})),A.forEach((function(t,e){N+=""+t.gene+" "+t.proteinChange+"",e!==A.length-1?N+=", ":N+="
"}));var b=" "+n+"
";d.append(et()("
"+I+b+M+p+N+NaN)),r.append(d)})),r}}),t}()),nt=function(){return(nt=Object.assign||function(t){for(var e,a=1,i=arguments.length;a=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},lt=a(6),ct=function(){function t(e,a,i,o,n,l,c,I,g){Object.defineProperty(this,"cy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"genomicDataOverlayManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"edgeEditing",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"selectedNodeStack",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"layoutProperties",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"FIT_CONSTANT",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"observers",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"svgExporter",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"undoRedoManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isCbioPortal",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isCollaborative",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"shareDBManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"portalAccessor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"viewUtilities",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"profiles",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"genomicDataOverlayColorScheme",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"colorSchemeChangeCallback",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(this),this.cy=i,this.isCollaborative=e,this.isCbioPortal=o,this.profiles=c,this.genomicDataOverlayColorScheme=I,this.colorSchemeChangeCallback=g;var d={bendPositionsFunction:function(t){return t.data("bendPointPositions")},controlPositionsFunction:function(t){return t.data("controlPointPositions")},undoable:!0,anchorShapeSizeFactor:6,enabled:!this.isCbioPortal,handleReconnectEdge:this.isCollaborative?this.reconnectEdge.bind(this):void 0,enableMultipleAnchorRemovalOption:!0};this.edgeEditing=this.cy.edgeEditing(d),this.portalAccessor=l,this.isCollaborative&&(this.shareDBManager=a),this.FIT_CONSTANT=50,this.layoutProperties=lt.clone(t.defaultLayoutProperties),this.observers=[],this.genomicDataOverlayManager=new ot(this.cy),this.svgExporter=new _(this.edgeEditing,this),this.selectedNodeStack={},this.undoRedoManager=n,this.undoRedoManager.action("changePositions",this.doChangePosition,this.undoChangePosition),this.undoRedoManager.action("changeNodeSize",this.doChangeNodeSize,this.undoChangeNodeSize),this.undoRedoManager.action("changeCompoundSize",this.doChangeCompoundSize,this.undoChangeCompoundSize),this.undoRedoManager.action("changeName",this.doChangename,this.undoChangeName),this.undoRedoManager.action("hideNode",this.doHide,this.undoHide),this.undoRedoManager.action("showAllNodes",this.doShow,this.undoShow),this.undoRedoManager.action("highlightInvalidGenes",this.doHighlightInvalidGenes,this.undoHighlightInvalidGenes),this.undoRedoManager.action("removeHighlightInvalidGenes",this.undoHighlightInvalidGenes,this.doHighlightInvalidGenes),this.undoRedoManager.action("highlightOthers",this.doHighlight,this.undoHighlight),this.undoRedoManager.action("removeOtherHighlight",this.undoHighlight,this.doHighlight)}return Object.defineProperty(t.prototype,"setProfile",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.profiles[t]=e}}),Object.defineProperty(t.prototype,"addProfile",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.profiles.push(t)}}),Object.defineProperty(t.prototype,"removeProfiles",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.profiles.length=0}}),Object.defineProperty(t.prototype,"setGenomicDataOverlayColorScheme",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.genomicDataOverlayColorScheme=t}}),Object.defineProperty(t.prototype,"setViewUtilities",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.viewUtilities=t}}),Object.defineProperty(t.prototype,"getGenomicDataOverlayColorScheme",{enumerable:!1,configurable:!0,writable:!0,value:function(){return this.genomicDataOverlayColorScheme}}),Object.defineProperty(t.prototype,"handleChangePositionByAlignment",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.isCollaborative?this.shareDBManager.changeElementsPositionByAlignment(t):this.undoRedoManager.do("changePositions",t)}}),Object.defineProperty(t.prototype,"doChangePosition",{enumerable:!1,configurable:!0,writable:!0,value:function(t){for(var e=[],a=0;a0&&(n.forEach((function(t){a[t.id()]=!0})),o=o.union(t(n))),o=o.union(e.remove()),i.cy.nodes().updateCompoundBounds(),o}(t);this.undoRedoManager.do("remove",o);for(var n=0;n0&&(r.data.source=I.id()),c.length>0&&(r.data.target=c.id()),!(c.length<0&&I.length<0)){var g=this.cy.filter('edge[source = "'+I.id()+'"][target = "'+c.id()+'"]'),d=!1;g.forEach((function(t){return t.data().type!=r.data.type||(d=!0,!1)})),d||(delete r.data.id,i.push(r))}}this.cy.add(i)}}),Object.defineProperty(t.prototype,"fitGraph",{enumerable:!1,configurable:!0,writable:!0,value:function(){if(this.isCollaborative){this.cy.fit(this.FIT_CONSTANT);var t={zoomLevel:this.cy.zoom(),panLevel:this.cy.pan()};this.updateGlobalOptions(t)}else this.cy.fit(this.FIT_CONSTANT)}}),Object.defineProperty(t.prototype,"loadFile",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.isCollaborative?this.loadfileShareDB(t,e):this.loadFileCy(t,e),this.edgeEditing.initAnchorPoints(this.cy.edges()),this.fitGraph()}}),Object.defineProperty(t.prototype,"loadFileCy",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.removeElementCy(this.cy.elements()),this.addNodesCy(t),this.addEdgesCy(e)}}),Object.defineProperty(t.prototype,"loadfileShareDB",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.shareDBManager.loadGraph(t,e)}}),Object.defineProperty(t.prototype,"removeAllElements",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.isCollaborative?this.shareDBManager.removeAllElements():this.cy.remove(this.cy.elements())}}),Object.defineProperty(t.prototype,"updateHighlight",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){e?this.undoRedoManager.do("highlightOthers",t):this.undoRedoManager.do("removeOtherHighlight",t)}}),Object.defineProperty(t.prototype,"updateVisibility",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){e?this.viewUtilities.hide(t):this.viewUtilities.show(t)}}),Object.defineProperty(t.prototype,"updateElementCallback",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=t.oi,a=e.id,i=this.cy.$("#"+a);if(this.changeNameCy(i,e.name),i.isNode())i.isParent()?(i.style("min-width",e.minWidth),i.style("min-width-bias-left",e.minWidthBiasLeft),i.style("min-width-bias-right",e.minWidthBiasRight),i.style("min-height",e.minHeight),i.style("min-height-bias-top",e.minHeightBiasTop),i.style("min-height-bias-bottom",e.minHeightBiasBottom)):(i.data("w",e.w),i.data("h",e.h),i.position({x:e.x,y:e.y})),this.updateVisibility(i,e.isHidden),this.updateHighlight(i,e.isHighlighted),e.isInvalidGene?this.doHighlightInvalidGenes(i):this.undoHighlightInvalidGenes(i);else if(i.isEdge()){var o=e.pubmedIDs;i.data("pubmedIDs",o),this.updateHighlight(i,e.isHighlighted);var n=e.anchorPoints;if(e.source!==i.source().id()||e.target!==i.target().id()){var r={source:e.source,target:e.target};i.move(r),this.edgeEditing.initAnchorPoints(i)}else{if("bezier"===e.edgeCurveStyle){var l=this.edgeEditing.getAnchorsAsArray(i);if(l&&l.length>0)for(var c=0;c0&&(n=52,e<4?150>o&&(o=150):a>o&&(o=a)),i.setSizeOfElement(t,o,n)}}))}else{var o=this.cy.undoRedo(),n=[],r=this.genomicDataOverlayManager.countVisibleGenomicDataByType(),l=150+36*(r-3);t.forEach((function(t){if(t.isParent()){i={ele:t,oldMinWidth:t.style("min-width"),newMinWidth:0,oldMinWidthBiasLeft:t.style("min-width-bias-left"),newMinWidthBiasLeft:0,oldMinWidthBiasRight:t.style("min-width-bias-right"),newMinWidthBiasRight:0,oldMinHeight:t.style("min-height"),newMinHeight:0,oldMinHeightBiasTop:t.style("min-height-bias-top"),newMinHeightBiasTop:0,oldMinHeightBiasBottom:t.style("min-height-bias-bottom"),newMinHeightBiasBottom:0};n.push({name:"changeCompoundSize",param:i})}else{var e=150,a=52;if(""!=t.data("name"))e=6*t.style("label").length+24,a=24;"PROCESS"!==t.data("type")&&r>0&&(a=52,r<4?150>e&&(e=150):l>e&&(e=l));var i={ele:t,oldWidth:t.width(),newWidth:e,oldHeight:t.height(),newHeight:a};n.push({name:"changeNodeSize",param:i})}})),o.do("batch",n)}this.cy.nodeEditing("get").refreshGrapples()}}),Object.defineProperty(t,"defaultLayoutProperties",{enumerable:!0,configurable:!0,writable:!0,value:{name:"fcose",nodeRepulsion:4500,idealEdgeLength:50,edgeElasticity:.45,nestingFactor:.1,gravity:.25,numIter:2500,tile:!0,animate:!0,randomize:!1,gravityRangeCompound:1.5,gravityCompound:1,gravityRange:3.8,tilingPaddingVertical:10,tilingPaddingHorizontal:10,initialEnergyOnIncremental:.5,animationDuration:2e3,animationEasing:"cubic-bezier(0.17,0.72,0.41,0.98)"}}),rt([r.observable],t.prototype,"profiles",void 0),rt([r.observable],t.prototype,"genomicDataOverlayColorScheme",void 0),rt([r.action.bound],t.prototype,"setProfile",null),rt([r.action.bound],t.prototype,"addProfile",null),rt([r.action.bound],t.prototype,"removeProfiles",null),rt([r.action.bound],t.prototype,"setGenomicDataOverlayColorScheme",null),rt([n.a],t.prototype,"setViewUtilities",null),rt([n.a],t.prototype,"doHide",null),rt([n.a],t.prototype,"undoHide",null),rt([n.a],t.prototype,"doShow",null),rt([n.a],t.prototype,"undoShow",null),rt([n.a],t.prototype,"updateVisibility",null),t}(),It=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),gt=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},dt=function(t){function e(e){var i=t.call(this,e)||this;return Object.defineProperty(i,"internalLayoutProperties",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(i),i.internalLayoutProperties=y.a.clone(ct.defaultLayoutProperties),a.layoutProperties=y.a.clone(ct.defaultLayoutProperties),i}var a;return It(e,t),a=e,Object.defineProperty(e.prototype,"updateInternalLayoutProperty",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.internalLayoutProperties[t]=e}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return I.a.createElement(g.Modal,{id:"layoutPropertiesDiv",show:this.props.show,onEnter:function(){t.internalLayoutProperties=y.a.clone(a.layoutProperties)},onHide:function(){t.internalLayoutProperties=y.a.clone(a.layoutProperties),t.props.handleClose($e.LAYOUT)}},I.a.createElement(g.Modal.Header,{closeButton:!0},I.a.createElement(g.Modal.Title,null,"Layout Properties")),I.a.createElement(g.Modal.Body,{id:"layoutPropsForm",className:"leftText"},I.a.createElement(g.Form,null,I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{className:"control-label",sm:6},"Node Repulsion:"),I.a.createElement(g.Col,{sm:6},I.a.createElement(g.FormControl,{type:"number",value:this.internalLayoutProperties.nodeRepulsion.toString(),onChange:function(e){t.updateInternalLayoutProperty("nodeRepulsion",Number(e.target.value))}}))),I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{className:"rightAlignText",sm:6},I.a.createElement(g.ControlLabel,null,"Ideal Edge Length:")),I.a.createElement(g.Col,{sm:6},I.a.createElement(g.FormControl,{type:"number",value:this.internalLayoutProperties.idealEdgeLength.toString(),onChange:function(e){t.updateInternalLayoutProperty("idealEdgeLength",Number(e.target.value))}}))),I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{className:"rightAlignText",sm:6},I.a.createElement(g.ControlLabel,null,"Edge Elasticity:")),I.a.createElement(g.Col,{sm:6},I.a.createElement(g.FormControl,{type:"number",value:this.internalLayoutProperties.edgeElasticity.toString(),onChange:function(e){t.updateInternalLayoutProperty("edgeElasticity",Number(e.target.value))}}))),I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{className:"rightAlignText",sm:6},I.a.createElement(g.ControlLabel,null,"Nesting Factor:")),I.a.createElement(g.Col,{sm:6},I.a.createElement(g.FormControl,{type:"number",value:this.internalLayoutProperties.nestingFactor.toString(),onChange:function(e){t.updateInternalLayoutProperty("nestingFactor",Number(e.target.value))}}))),I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{className:"rightAlignText",sm:6},I.a.createElement(g.ControlLabel,null,"Gravity:")),I.a.createElement(g.Col,{sm:6},I.a.createElement(g.FormControl,{type:"number",value:this.internalLayoutProperties.gravity.toString(),onChange:function(e){t.updateInternalLayoutProperty("gravity",Number(e.target.value))}}))),I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{className:"rightAlignText",sm:6},I.a.createElement(g.ControlLabel,null,"Gravity Range:")),I.a.createElement(g.Col,{sm:6},I.a.createElement(g.FormControl,{type:"number",value:this.internalLayoutProperties.gravityRange.toString(),onChange:function(e){t.updateInternalLayoutProperty("gravityRange",Number(e.target.value))}}))),I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{className:"rightAlignText",sm:6},I.a.createElement(g.ControlLabel,null,"Compound Gravity:")),I.a.createElement(g.Col,{sm:6},I.a.createElement(g.FormControl,{type:"number",value:this.internalLayoutProperties.gravityCompound.toString(),onChange:function(e){t.updateInternalLayoutProperty("gravityCompound",Number(e.target.value))}}))),I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{className:"rightAlignText",sm:6},I.a.createElement(g.ControlLabel,null,"Compound Gravity Range:")),I.a.createElement(g.Col,{sm:6},I.a.createElement(g.FormControl,{type:"number",value:this.internalLayoutProperties.gravityRangeCompound.toString(),onChange:function(e){t.updateInternalLayoutProperty("gravityRangeCompound",Number(e.target.value))}}))),I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{className:"rightAlignText",sm:6},I.a.createElement(g.ControlLabel,null,"Number of Iterations:")),I.a.createElement(g.Col,{sm:6},I.a.createElement(g.FormControl,{type:"number",value:this.internalLayoutProperties.numIter.toString(),onChange:function(e){t.updateInternalLayoutProperty("numIter",Number(e.target.value))}}))),I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{className:"rightAlignText",sm:6},I.a.createElement(g.ControlLabel,null,"Tiling Vertical Padding:")),I.a.createElement(g.Col,{sm:6},I.a.createElement(g.FormControl,{type:"number",value:this.internalLayoutProperties.tilingPaddingVertical.toString(),onChange:function(e){t.updateInternalLayoutProperty("tilingPaddingVertical",Number(e.target.value))}}))),I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{className:"rightAlignText",sm:6},I.a.createElement(g.ControlLabel,null,"Tiling Horizontal Padding:")),I.a.createElement(g.Col,{sm:6},I.a.createElement(g.FormControl,{type:"number",value:this.internalLayoutProperties.tilingPaddingHorizontal.toString(),onChange:function(e){t.updateInternalLayoutProperty("tilingPaddingHorizontal",Number(e.target.value))}}))),I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{className:"rightAlignText",sm:6},I.a.createElement(g.ControlLabel,null,"Tile Disconnected:")),I.a.createElement(g.Col,{sm:6},I.a.createElement(g.Checkbox,{className:"layProps",checked:this.internalLayoutProperties.tile,onChange:function(e){t.updateInternalLayoutProperty("tile",!t.internalLayoutProperties.tile)}}))),I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{className:"control-label",sm:6},"Animate:"),I.a.createElement(g.Col,{sm:6},I.a.createElement(g.Checkbox,{className:"layProps",checked:this.internalLayoutProperties.animate,onChange:function(e){t.updateInternalLayoutProperty("animate",!t.internalLayoutProperties.animate)}}))),I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{className:"rightAlignText",sm:6},I.a.createElement(g.ControlLabel,null,"Incremental:")),I.a.createElement(g.Col,{sm:6},I.a.createElement(g.Checkbox,{className:"layProps",checked:!this.internalLayoutProperties.randomize,onChange:function(e){t.updateInternalLayoutProperty("randomize",!t.internalLayoutProperties.randomize)}}))),I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{className:"rightAlignText",sm:6},I.a.createElement(g.ControlLabel,null,"Incremental Cooling Factor:")),I.a.createElement(g.Col,{sm:6},I.a.createElement(g.FormControl,{type:"number",value:this.internalLayoutProperties.initialEnergyOnIncremental.toString(),onChange:function(e){t.updateInternalLayoutProperty("initialEnergyOnIncremental",Number(e.target.value))}}))))),I.a.createElement(g.Modal.Footer,null,I.a.createElement(g.Button,{onClick:function(){a.layoutProperties=y.a.clone(t.internalLayoutProperties),t.props.pathwayActions.setLayoutProperties(a.layoutProperties),t.props.handleClose($e.LAYOUT)}},"Save"),I.a.createElement(g.Button,{onClick:function(){t.internalLayoutProperties=y.a.clone(ct.defaultLayoutProperties),a.layoutProperties=y.a.clone(t.internalLayoutProperties),t.props.pathwayActions.setLayoutProperties(t.internalLayoutProperties)}},"Default")))}}),gt([r.observable],e.prototype,"internalLayoutProperties",void 0),gt([r.action.bound],e.prototype,"updateInternalLayoutProperty",null),e=a=gt([l.observer],e)}(I.a.Component),ut=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),st=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},Ct=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"pathwayInfo",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),a}return ut(e,t),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return this.pathwayInfo=this.props.pathwayActions.getPathwayInfo,I.a.createElement(g.Modal,{id:"pathwayDetailsDiv",show:this.props.show,onHide:function(){t.props.handleClose(4)}},I.a.createElement(g.Modal.Header,{closeButton:!0},I.a.createElement(g.Modal.Title,null,"Pathway Properties")),I.a.createElement(g.Modal.Body,null,I.a.createElement(g.Form,{id:"pathwayDetailsForm"},I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{style:{textAlign:"left"},sm:4},I.a.createElement(g.ControlLabel,null,"Pathway Title:")),I.a.createElement(g.Col,{sm:8},I.a.createElement(g.FormControl,{type:"text",onChange:function(e){t.pathwayInfo.pathwayTitle=e.target.value},value:this.pathwayInfo.pathwayTitle}))),I.a.createElement(g.InputGroup,null,I.a.createElement(g.Col,{style:{textAlign:"left"},sm:4},I.a.createElement(g.ControlLabel,null,"Pathway Description:")),I.a.createElement(g.Col,{sm:8},I.a.createElement("textarea",{className:"form-control",rows:3,onChange:function(e){t.pathwayInfo.pathwayDetails=e.target.value},value:this.pathwayInfo.pathwayDetails}))))),I.a.createElement(g.Modal.Footer,null,I.a.createElement(g.Button,{onClick:function(){t.props.pathwayActions.setPathwayInfo(t.pathwayInfo),t.props.handleClose($e.PW_DETAILS)}},"Save")))}}),e=st([l.observer],e)}(I.a.Component),At=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),Mt=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},pt=a(60),Nt=a(61),bt=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"colorMappings",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"showUniqueValuesWarningModal",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(a),a.initColorMappings(),a}return At(e,t),Object.defineProperty(e.prototype,"componentDidUpdate",{enumerable:!1,configurable:!0,writable:!0,value:function(t){!1===t.show&&!0===this.props.show&&this.initColorMappings()}}),Object.defineProperty(e.prototype,"initColorMappings",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.colorMappings=Object.entries(this.props.colorValueMapping).map((function(t){return{value:t[0],color:t[1]}})).sort((function(t,e){return Number(t.value)-Number(e.value)}))}}),Object.defineProperty(e.prototype,"handleColorChange",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.colorMappings[t].color=e}}),Object.defineProperty(e.prototype,"handleValueChange",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.colorMappings[t].value=e}}),Object.defineProperty(e.prototype,"addDefaultColorMapping",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.colorMappings.push({value:"0",color:"#ffffff"})}}),Object.defineProperty(e.prototype,"removeColorMapping",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.colorMappings.splice(t,1)}}),Object.defineProperty(e.prototype,"setDefaultColorMapping",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.colorMappings=[{value:"-100",color:"#0000ff"},{value:"0",color:"#ffffff"},{value:"100",color:"#ff0000"}]}}),Object.defineProperty(e.prototype,"setShowUniqueValuesWarningModal",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.showUniqueValuesWarningModal=t}}),Object.defineProperty(e.prototype,"handleSaveColorScheme",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t={};return this.colorMappings.forEach((function(e){t[e.value]=e.color})),Object.keys(t).length<2?(this.setShowUniqueValuesWarningModal(!0),!1):(this.props.handleColorMappingChange(t),!0)}}),Object.defineProperty(e.prototype,"close",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.props.handleClose($e.PROFILES_COLOR_SCHEME)}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e=this.colorMappings.map((function(e,a){return I.a.createElement(g.Row,{style:{padding:"10px"}},I.a.createElement(g.Col,{md:2}),I.a.createElement(g.Col,{md:3},I.a.createElement("input",{value:e.value,style:{width:"50px"},onChange:function(e){var i=e.target.value;t.handleValueChange(a,i)}})),I.a.createElement(g.Col,{md:3},I.a.createElement("input",{type:"color",value:e.color,onChange:function(e){var i=e.target.value;t.handleColorChange(a,i)}})),I.a.createElement(g.Col,{md:1},I.a.createElement("img",{src:Nt,className:"icon-small "+(t.colorMappings.length>2?"icon-enabled":"icon-disabled"),title:"Remove",onClick:function(){t.removeColorMapping(a)}})),I.a.createElement(g.Col,{md:2}))}));return I.a.createElement(g.Modal,{show:this.props.show,onHide:function(){t.close()},bsSize:"small"},I.a.createElement(g.Modal.Header,{closeButton:!0},I.a.createElement(g.Modal.Title,null,"Study Data Overlay Color Scheme")),I.a.createElement(g.Modal.Body,null,I.a.createElement(g.Row,{style:{paddingTop:"10px",paddingLeft:"10px",paddingRight:"10px"}},I.a.createElement(g.Col,{md:2}),I.a.createElement(g.Col,{md:3},I.a.createElement("label",null,"Value")),I.a.createElement(g.Col,{md:3},I.a.createElement("label",null,"Color")),I.a.createElement(g.Col,{md:3})),I.a.createElement("hr",{className:"horizontal-rule"}),e,I.a.createElement("img",{src:pt,className:"icon-small icon-enabled",onClick:this.addDefaultColorMapping,title:"Add New Value-Color Mapping"}),I.a.createElement(g.Modal,{show:this.showUniqueValuesWarningModal,onHide:function(){return t.setShowUniqueValuesWarningModal(!1)},bsSize:"small"},I.a.createElement(g.Modal.Header,{closeButton:!0},I.a.createElement(g.Modal.Title,null,"Warning")),I.a.createElement(g.Modal.Body,null,I.a.createElement("p",null,"Please set at least two unique value-color mappings.")),I.a.createElement(g.Modal.Footer,null,I.a.createElement(g.Button,{onClick:function(){t.setShowUniqueValuesWarningModal(!1)}},"OK")))),I.a.createElement(g.Modal.Footer,null,I.a.createElement(g.Button,{onClick:function(){t.close()}},"Cancel"),I.a.createElement(g.Button,{onClick:function(){t.setDefaultColorMapping()}},"Default"),I.a.createElement(g.Button,{onClick:function(){t.handleSaveColorScheme()&&t.close()}},"Save")))}}),Mt([r.observable],e.prototype,"colorMappings",void 0),Mt([r.observable],e.prototype,"showUniqueValuesWarningModal",void 0),Mt([r.action.bound],e.prototype,"handleColorChange",null),Mt([r.action.bound],e.prototype,"handleValueChange",null),Mt([r.action.bound],e.prototype,"addDefaultColorMapping",null),Mt([r.action.bound],e.prototype,"removeColorMapping",null),Mt([r.action.bound],e.prototype,"setDefaultColorMapping",null),Mt([r.action.bound],e.prototype,"setShowUniqueValuesWarningModal",null),Mt([n.a],e.prototype,"handleSaveColorScheme",null),Mt([n.a],e.prototype,"close",null),e=Mt([l.observer],e)}(I.a.Component),yt=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),ht=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},Et=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"showEnabledProfileWarningModal",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object(r.makeObservable)(a),a}return yt(e,t),Object.defineProperty(e.prototype,"setShowEnabledProfileWarningModal",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.showEnabledProfileWarningModal=t}}),Object.defineProperty(e.prototype,"profileEnabledMap",{get:function(){var t=this,e=[];this.props.profiles.forEach((function(a){a.enabled&&e.length-1;a[t.profileId]=i})),a},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"handleProfileLabelClicked",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.props.handleProfileLabelClicked(t)}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e=this.props.profiles.map((function(e,a){return I.a.createElement(I.a.Fragment,{key:a},I.a.createElement(g.Button,{onClick:function(){var e=t.props.profiles.filter((function(t){return t.enabled})).length;t.props.profiles[a].enabled||e0?e:I.a.createElement("h4",{className:"modal-title"},"There is currently no data to show"),I.a.createElement(g.Modal,{show:this.showEnabledProfileWarningModal,onHide:function(){return t.setShowEnabledProfileWarningModal(!1)}},I.a.createElement(g.Modal.Header,{closeButton:!0},I.a.createElement(g.Modal.Title,null,"Warning")),I.a.createElement(g.Modal.Body,null,I.a.createElement("p",null,"At most 6 data sets can be displayed at the same time, please disable some other data set before enabling this.")),I.a.createElement(g.Modal.Footer,null,I.a.createElement(g.Button,{onClick:function(){t.setShowEnabledProfileWarningModal(!1)}},"OK")))))}}),ht([r.observable],e.prototype,"showEnabledProfileWarningModal",void 0),ht([r.action],e.prototype,"setShowEnabledProfileWarningModal",null),ht([r.computed],e.prototype,"profileEnabledMap",null),e=ht([l.observer],e)}(I.a.Component),mt=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),jt=function(t){function e(e){return t.call(this,e)||this}return mt(e,t),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return I.a.createElement(g.Modal,{id:"quickHelpModal",show:this.props.show,onHide:function(){t.props.handleClose($e.HELP)}},I.a.createElement(g.Modal.Header,{closeButton:!0},I.a.createElement(g.Modal.Title,null,"Quick Help")),I.a.createElement(g.Modal.Body,null,I.a.createElement("ul",{className:"leftText"},I.a.createElement("li",null,I.a.createElement("strong",null,"To add a node:")," Drag and drop from node palette"),I.a.createElement("li",null,I.a.createElement("strong",null,"To add an interaction:")," Click on interaction type; then click on small circle on source node and release on target node"),I.a.createElement("li",null,I.a.createElement("strong",null,"To add a node into a container (family, complex, compartment or process):"),' Drag the node into its container node or select nodes to be contained and right click on container node and choose "Add Selected Into This"'),I.a.createElement("li",null,I.a.createElement("strong",null,"To delete nodes/interactions:")," Select and perform Edit > Delete Selected"),I.a.createElement("li",null,I.a.createElement("strong",null,"To overlay experiment data:")," Select Alteration % > Load From cBioPortal..."))))}}),e}(I.a.Component),wt=function(){function t(){}return Object.defineProperty(t.prototype,"getDataTypes",{enumerable:!1,configurable:!0,writable:!0,value:function(){return[t.MUTATION,t.GENE_EXPRESSION,t.CNA]}}),Object.defineProperty(t.prototype,"fetchCancerStudies",{enumerable:!1,configurable:!0,writable:!0,value:function(e){var a={},i=new XMLHttpRequest;i.onreadystatechange=function(){if(i.readyState===XMLHttpRequest.DONE&&200===i.status){for(var t=i.responseText.split(/\r?\n|\r/),o=1;o=t.Z_SCORE_UPPER_THRESHOLD||parseFloat(g[u])<=t.Z_SCORE_LOWER_THRESHOLD)&&d++:d++);c[a][g[1]]=d/l*100}i(c)}}),Object.defineProperty(t.prototype,"getProfileData",{enumerable:!1,configurable:!0,writable:!0,value:function(e,a){var i=new XMLHttpRequest,o=this;i.onreadystatechange=function(){i.readyState===XMLHttpRequest.DONE&&200===i.status&&(o.calcAlterationPercentages(i.responseText,e.geneticProfileId,a),d.toast.success(e.geneticProfileId+" has been succesfully loaded from cBioPortal."))};var n=t.GET_PROFILE_DATA_URL;n+="&case_set_id="+e.caseSetId+"_sequenced",n+="&genetic_profile_id="+e.geneticProfileId,n+="&gene_list=";for(var r=!0,l=0,c=e.genes;l=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},ft=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"dataTypes",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(a,"dataTypeFetchResultsReady",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(a,"currentlySelectedItemIndex",{enumerable:!0,configurable:!0,writable:!0,value:-1}),Object.defineProperty(a,"selectedStudies",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(a,"checkboxModalPosition",{enumerable:!0,configurable:!0,writable:!0,value:{bottom:0}}),Object.defineProperty(a,"selectedDataTypesPerStudy",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(a,"itemArray",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(a,"searchQuery",{enumerable:!0,configurable:!0,writable:!0,value:""}),Object.defineProperty(a,"showDataTypeSelectionModal",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(a,"studyListItemCheckboxChecked",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(a,"selectedStudyData",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"portalAccessor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(a),a.selectedStudyData=[],a.portalAccessor=new wt,a.fetchStudy(),a}return Dt(e,t),Object.defineProperty(e.prototype,"setDataTypeFetchResultsReady",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.dataTypeFetchResultsReady=t}}),Object.defineProperty(e.prototype,"setItemArray",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.itemArray=t}}),Object.defineProperty(e.prototype,"setSearchQuery",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.searchQuery=t}}),Object.defineProperty(e.prototype,"setSelectedStudyData",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.selectedStudyData=t}}),Object.defineProperty(e.prototype,"setDataTypeProperties",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.dataTypes[t]=e}}),Object.defineProperty(e.prototype,"initStudyListItemCheckboxChecked",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.studyListItemCheckboxChecked=Array(t).fill(!1)}}),Object.defineProperty(e.prototype,"initSelectedDataTypesPerStudy",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.selectedDataTypesPerStudy=Array(t).fill("")}}),Object.defineProperty(e.prototype,"toggleStudyListItemCheckboxChecked",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.studyListItemCheckboxChecked[t]=!this.studyListItemCheckboxChecked[t]}}),Object.defineProperty(e.prototype,"addSelectedStudy",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.selectedStudies.push(t)}}),Object.defineProperty(e.prototype,"removeSelectedStudy",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.selectedStudies=this.selectedStudies.filter((function(e){return e.data[0]!=t[0]}))}}),Object.defineProperty(e.prototype,"clearSelectedStudies",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.selectedStudies=[]}}),Object.defineProperty(e.prototype,"setShowDataTypeSelectionModal",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.showDataTypeSelectionModal=t}}),Object.defineProperty(e.prototype,"clearStudyCheckboxesChecked",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this.studyListItemCheckboxChecked.length;this.studyListItemCheckboxChecked=Array(t).fill(!1)}}),Object.defineProperty(e.prototype,"clearSelectedDataTypesPerStudy",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this.studyListItemCheckboxChecked.length;this.selectedDataTypesPerStudy=Array(t).fill("")}}),Object.defineProperty(e.prototype,"unselectDataTypesForStudy",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.selectedDataTypesPerStudy[t]=""}}),Object.defineProperty(e.prototype,"preparePortalAccess",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this;this.setDataTypeFetchResultsReady(!1),this.portalAccessor.getSupportedGeneticProfiles(t,(function(t){e.disableAllDataTypes();for(var a=0,i=Object.keys(t);a1&&this.selectedStudyData[1]||"Choose study"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return I.a.createElement(g.Modal,{id:"cbioPortalModal",show:this.props.show,onHide:function(){t.props.handleClose($e.STUDY),t.resetModal()}},I.a.createElement(g.Modal.Header,{closeButton:!0},I.a.createElement(g.Modal.Title,null,"Profile Data from cBioPortal")),I.a.createElement(g.Modal.Body,null,I.a.createElement("div",{id:"cancerDropDown",style:{textAlign:"left"}},I.a.createElement("h4",null,"Select Cancer Study"),I.a.createElement("form",null,I.a.createElement(g.FormControl,{type:"text",placeholder:"Search studies",onChange:function(e){return t.setSearchQuery(e.target.value)}})),I.a.createElement(g.ListGroup,{style:{maxHeight:"200px",overflow:"auto",marginTop:"10px",border:"1px solid #ccc",borderRadius:"4px"}},this.itemArray.length<1?I.a.createElement("span",null,"Fetching studies from cBioPortal..."):this.itemArray.map((function(t,e){return{item:t,index:e}})).filter((function(e){return e.item[1].toLowerCase().includes(t.searchQuery.toLowerCase())})).map((function(e){var a=e.item,i=e.index,o=a[1],n=a[0];return I.a.createElement(g.ListGroupItem,{id:"listgroupitem"+i,key:n,style:{padding:"5px 5px"}},I.a.createElement(g.Checkbox,{checked:t.studyListItemCheckboxChecked[i],style:{marginTop:"0px",marginBottom:"0px"},onClick:function(){var e=document.getElementById("listgroupitem"+i).getBoundingClientRect();t.checkboxModalPosition={bottom:e.bottom-30},t.setSelectedStudyData(a),t.preparePortalAccess(n),t.toggleStudyListItemCheckboxChecked(i),t.currentlySelectedItemIndex=i,t.studyListItemCheckboxChecked[i]?t.setShowDataTypeSelectionModal(!0):(t.removeSelectedStudy(a),t.unselectDataTypesForStudy(i))}},o),""!=t.selectedDataTypesPerStudy[i]&&I.a.createElement("span",{style:{fontSize:"12px",marginLeft:"25px"}},t.selectedDataTypesPerStudy[i]))})))),I.a.createElement("div",{style:{marginTop:"10px"}},I.a.createElement("p",{style:{textAlign:"left"}},I.a.createElement("b",null,"Warning:"),' At most six different data sets will be overlayed on the genes. You can toggle which ones are to be displayed via "Alteration %" ',">",' "View Settings" menu.')),I.a.createElement(g.Modal,{style:{position:"absolute",top:this.checkboxModalPosition.bottom+"px"},dialogClassName:"fitContent",show:this.showDataTypeSelectionModal,onHide:function(){t.setShowDataTypeSelectionModal(!1)}},I.a.createElement(g.Modal.Body,null,!1===this.dataTypeFetchResultsReady?I.a.createElement("span",null,"Fetching data types from cBioPortal..."):Object.keys(this.dataTypes).map((function(e){return I.a.createElement(g.Checkbox,{inline:!0,key:e,disabled:!t.dataTypes[e].enabled,onClick:function(){t.handleCheckboxClick(e)},checked:t.dataTypes[e].checked},e)}))),I.a.createElement(g.Modal.Footer,null,I.a.createElement(g.Button,{onClick:function(){var e=Tt({},t.dataTypes);0==Object.keys(e).filter((function(t){return e[t].checked})).length&&(t.studyListItemCheckboxChecked[t.currentlySelectedItemIndex]=!1),t.setShowDataTypeSelectionModal(!1)}},"Cancel"),I.a.createElement(g.Button,{onClick:function(){var e=Tt({},t.dataTypes);t.addSelectedStudy({data:t.selectedStudyData,dataTypes:e}),t.selectedDataTypesPerStudy[t.currentlySelectedItemIndex]=Object.keys(e).filter((function(t){return e[t].checked})).join(", "),t.setShowDataTypeSelectionModal(!1)}},"Add")))),I.a.createElement(g.Modal.Footer,null,I.a.createElement(g.Button,{bsClass:"success",onClick:function(){t.selectedStudies.forEach((function(e){t.props.loadFromCBio(e.dataTypes,e.data)})),t.props.handleClose($e.STUDY),t.resetModal()}},"Load Data")))}}),Lt([r.observable],e.prototype,"dataTypes",void 0),Lt([r.observable],e.prototype,"dataTypeFetchResultsReady",void 0),Lt([r.observable],e.prototype,"selectedStudies",void 0),Lt([r.observable],e.prototype,"selectedDataTypesPerStudy",void 0),Lt([r.observable],e.prototype,"itemArray",void 0),Lt([r.observable],e.prototype,"searchQuery",void 0),Lt([r.observable],e.prototype,"showDataTypeSelectionModal",void 0),Lt([r.observable],e.prototype,"studyListItemCheckboxChecked",void 0),Lt([r.observable],e.prototype,"selectedStudyData",void 0),Lt([r.observable],e.prototype,"portalAccessor",void 0),Lt([r.action.bound],e.prototype,"setDataTypeFetchResultsReady",null),Lt([r.action.bound],e.prototype,"setItemArray",null),Lt([r.action.bound],e.prototype,"setSearchQuery",null),Lt([r.action.bound],e.prototype,"setSelectedStudyData",null),Lt([r.action.bound],e.prototype,"setDataTypeProperties",null),Lt([r.action.bound],e.prototype,"initStudyListItemCheckboxChecked",null),Lt([r.action.bound],e.prototype,"initSelectedDataTypesPerStudy",null),Lt([r.action.bound],e.prototype,"toggleStudyListItemCheckboxChecked",null),Lt([r.action.bound],e.prototype,"addSelectedStudy",null),Lt([r.action.bound],e.prototype,"removeSelectedStudy",null),Lt([r.action.bound],e.prototype,"clearSelectedStudies",null),Lt([r.action.bound],e.prototype,"setShowDataTypeSelectionModal",null),Lt([r.action.bound],e.prototype,"clearStudyCheckboxesChecked",null),Lt([r.action.bound],e.prototype,"clearSelectedDataTypesPerStudy",null),Lt([r.action.bound],e.prototype,"unselectDataTypesForStudy",null),Lt([n.a],e.prototype,"resetModal",null),Lt([n.a],e.prototype,"handleCheckboxClick",null),Lt([r.computed],e.prototype,"selectedStudyDataTitle",null),e=Lt([l.observer],e)}(I.a.Component),Ot=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),vt=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},Gt=["Cell Cycle","HIPPO","MYC","NOTCH","NRF2","PI3K","RTK-RAS","TGF-Beta","TP53","WNT"],St=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"bestPathways",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"shownPathways",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"dropDownTitle",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"selectedPathway",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"isPercentageMatch",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"isAlterationEnabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"considerOnlyTCGAPanPathways",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"isExpanded",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"COUNT_PERC_EXPLANATION",{enumerable:!0,configurable:!0,writable:!0,value:"Whether we should favor the number of genes of interest matching the ones in a pathway or the percentage of such genes in that pathway. For instance, suppose genes of interest are A, B, and C, and the pathway contains genes B, C, D, and E. When we consider count, the score is 2 (for the two genes that match). However, when we consider percentage the score will be 50% as 2 of the 4 genes in the pathway are among genes of interest."}),Object.defineProperty(a,"ALTERATION_EXPLANATION",{enumerable:!0,configurable:!0,writable:!0,value:"When this is checked, each matching gene will not directly contribute to the score as 1 unit but with the alteration frequency percentage of that gene. For instance, suppose genes of interest are A, B, and C with alteration frequencies of 0.5, 0.2, and 0.3, respectively, and the pathway contains genes B, C, D, and E. When this is option isn't checked, the score will be 2 for match count and 50% for the match percentage. However, when this option is checked, the scores will be 0.2+0.3=0.5 and (0.2+0.3)/4=12.5% for match count and percentage, respectively."}),Object.defineProperty(a,"TCGA_PANCAN_EXPLANATION",{enumerable:!0,configurable:!0,writable:!0,value:"The pathways listed above were retrieved from PathwayMapper. When this option is checked, only the pathways under TCGA > PanCanAtlas will be shown. Uncheck to show all."}),Object(r.makeObservable)(a),a.isPercentageMatch=0,a.isAlterationEnabled=0,a.considerOnlyTCGAPanPathways=!0,a.dropDownTitle="Match count",a.isExpanded=!1,a.setBestPathwayMethod(0),a.selectedPathway=a.shownPathways[0].pathwayName,a}return Ot(e,t),Object.defineProperty(e.prototype,"setBestPathwayMethod",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.bestPathways=this.props.bestPathwaysAlgos[t],this.filterBestPathwaysByTCGAPanPathways()}}),Object.defineProperty(e.prototype,"onPathwayClick",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.selectedPathway=t,this.props.pathwayActions.changePathway(this.selectedPathway)}}),Object.defineProperty(e.prototype,"onApplyClick",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.setBestPathwayMethod(2*this.isAlterationEnabled+this.isPercentageMatch)}}),Object.defineProperty(e.prototype,"filterBestPathwaysByTCGAPanPathways",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;this.shownPathways=this.bestPathways.filter((function(e){return!t.considerOnlyTCGAPanPathways||Gt.indexOf(e.pathwayName)>-1})),this.considerOnlyTCGAPanPathways&&Gt.indexOf(this.selectedPathway)<0&&(this.selectedPathway=this.shownPathways[0].pathwayName,this.props.pathwayActions.changePathway(this.selectedPathway))}}),Object.defineProperty(e.prototype,"toggleConsiderOnlyTCGAPanPathways",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.considerOnlyTCGAPanPathways=!this.considerOnlyTCGAPanPathways,this.filterBestPathwaysByTCGAPanPathways()}}),Object.defineProperty(e.prototype,"componentDidMount",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.props.pathwayActions.changePathway(this.selectedPathway)}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return I.a.createElement("div",{id:"ranking-bar"},this.props.tableComponent&&this.props.tableComponent(this.shownPathways.map((function(t){return{name:t.pathwayName,score:t.score,genes:t.genesMatched}})),this.selectedPathway,this.onPathwayClick),I.a.createElement("div",{className:"indent"},I.a.createElement(g.Checkbox,{checked:this.considerOnlyTCGAPanPathways,id:"tcgaPathwaysCheckbox",onClick:this.toggleConsiderOnlyTCGAPanPathways,style:{fontSize:"13px"}},"Show TCGA PanCancer Atlas pathways only ",I.a.createElement("span",{"data-tip":this.TCGA_PANCAN_EXPLANATION,"data-border":"true","data-type":"light","data-place":"left","data-effect":"solid","data-html":"true","data-delay-hide":"500",className:"fa fa-question-circle styles-module__infoIcon__zMiog"}))),!this.props.patientView&&I.a.createElement("div",{className:"info-entry"},I.a.createElement("div",{id:"criteria-title",className:"info-title"},I.a.createElement("b",{style:{display:"inline-block"}}," Ranking options")),I.a.createElement("div",{className:"indent"},I.a.createElement(g.DropdownButton,{title:this.dropDownTitle,id:"0",style:{fontSize:"13px"}},I.a.createElement(g.MenuItem,{style:{fontSize:"13px"},onClick:function(){t.isPercentageMatch=0,t.dropDownTitle="Match count",t.onApplyClick()}},"Match count"),I.a.createElement(g.MenuItem,{style:{fontSize:"13px"},onClick:function(){t.isPercentageMatch=1,t.dropDownTitle="Match percentage",t.onApplyClick()}},"Match percentage"))," ",I.a.createElement("div",{"data-tip":this.COUNT_PERC_EXPLANATION,"data-border":"true","data-type":"light","data-place":"left","data-effect":"solid",className:"fa fa-question-circle styles-module__infoIcon__zMiog"}),I.a.createElement(g.Checkbox,{id:"alterationCheckBox",onClick:function(){t.isAlterationEnabled=1===t.isAlterationEnabled?0:1,t.onApplyClick()},style:{fontSize:"13px",marginTop:"18px",bottom:"4px"}},"Consider alteration frequency ",I.a.createElement("span",{"data-tip":this.ALTERATION_EXPLANATION,"data-border":"true","data-type":"light","data-place":"left","data-effect":"solid",className:"fa fa-question-circle styles-module__infoIcon__zMiog"})))))}}),vt([r.observable],e.prototype,"bestPathways",void 0),vt([r.observable],e.prototype,"shownPathways",void 0),vt([r.observable],e.prototype,"dropDownTitle",void 0),vt([r.observable],e.prototype,"selectedPathway",void 0),vt([r.observable],e.prototype,"considerOnlyTCGAPanPathways",void 0),vt([r.observable],e.prototype,"isExpanded",void 0),vt([n.a],e.prototype,"setBestPathwayMethod",null),vt([n.a],e.prototype,"onPathwayClick",null),vt([n.a],e.prototype,"onApplyClick",null),vt([r.action.bound],e.prototype,"filterBestPathwaysByTCGAPanPathways",null),vt([r.action.bound],e.prototype,"toggleConsiderOnlyTCGAPanPathways",null),e=vt([l.observer],e)}(I.a.Component),Pt=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),zt=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},Yt=a(19),Zt=a(20),Rt=a(17),Bt=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"selectedGenes",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"editor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(a),a.selectedGenes=[],a}return Pt(e,t),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e="q="+JSON.stringify(this.props.alterationData)+"&g="+this.props.genes.map((function(t){return t.hugoGeneSymbol})).join("+");return I.a.createElement("div",{id:"toolbar",style:{marginLeft:"0px"}},I.a.createElement("img",{height:"22px",width:"22px","data-border":"true","data-type":"light","data-tip":"Save as PNG","data-place":"right","data-effect":"solid",src:v.a,onClick:function(){t.props.pathwayActions.saveAs("PNG")}}),I.a.createElement("img",{height:"22px",width:"22px","data-border":"true","data-type":"light","data-tip":"Save as SVG","data-place":"right","data-effect":"solid",src:S.a,onClick:function(){t.props.pathwayActions.saveAs("SVG")}}),I.a.createElement("img",{height:"22px",width:"22px","data-border":"true","data-type":"light","data-tip":"Perform layout","data-place":"right","data-effect":"solid",src:f.a,onClick:this.props.pathwayActions.performLayout}),!this.props.patientView&&[I.a.createElement("img",{height:"22px",width:"22px","data-border":"true","data-type":"light","data-tip":"Add selected genes to query","data-place":"right","data-effect":"solid",src:Yt,onClick:function(){t.selectedGenes=t.props.pathwayActions.getSelectedNodes().filter((function(t){return"GENE"===t.data().type})).map((function(t){return t.data().name}));var e=t.props.pathwayActions.getSelectedNodes().filter((function(t){return"GENE"!==t.data().type})).map((function(t){return t.data().name})),a=[],i="";e.length>0&&(i+="Selection contains nodes that are not genes: "+e.join(", ")+". "),t.selectedGenes.forEach((function(e){t.props.validGenes.hasOwnProperty(e)||a.push(e)})),0===a.length?t.selectedGenes.length>0&&0===e.length&&t.props.onAddGenes(t.selectedGenes):i+="Following gene symbols are invalid or already in gene list: "+a.join(", ")+".",i.length>0&&t.props.showMessage(i)}}),I.a.createElement("img",{height:"22px",width:"22px","data-border":"true","data-type":"light","data-tip":"Add all valid genes to query","data-place":"right","data-effect":"solid",src:Zt,onClick:function(){t.selectedGenes=t.props.pathwayGenes.filter((function(e){return t.props.validGenes.hasOwnProperty(e)})),t.selectedGenes.length>0&&t.props.onAddGenes(t.selectedGenes)}}),I.a.createElement("img",{height:"22px",width:"22px","data-border":"true","data-type":"light","data-tip":"Edit pathway","data-place":"right","data-effect":"solid",src:T.a,onClick:function(){window.open("http://pathwaymapper.org/?pathwayName="+t.props.selectedPathway+"&"+e)}})],I.a.createElement("img",{height:"22px",width:"22px","data-border":"true","data-type":"light","data-tip":"Help","data-place":"right","data-effect":"solid",src:Rt,onClick:function(){t.props.handleOpen($e.CHELP)}}))}}),zt([r.observable],e.prototype,"selectedGenes",void 0),zt([r.observable],e.prototype,"editor",void 0),e=zt([l.observer],e)}(I.a.Component),xt=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},Wt=function(){function t(t,e,a,i,o,n){Object.defineProperty(this,"selectedPathway",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"fileManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"editor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"undoRedoManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pathwayHandler",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"handleOpen",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eh",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"profiles",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"gridOptionsManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"uploader",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"merger",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isCBioPortal",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isCollaborative",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"viewOperationsManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"overlayUploader",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"enabledType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(this),this.pathwayHandler=t,this.profiles=e,this.fileManager=a,this.handleOpen=i,this.isCBioPortal=o,this.isCollaborative=n,this.enabledType=R.NONE}return Object.defineProperty(t.prototype,"addProfile",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.profiles.push(t)}}),Object.defineProperty(t.prototype,"clearProfiles",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.profiles.length=0}}),Object.defineProperty(t.prototype,"emphasizeQueryGenes",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.editor&&this.editor.cy.nodes().forEach((function(e){var a=e.data().name,i=e.data().type;t.includes(a)&&"GENE"===i&&e.style({"border-width":"4px","font-weight":"bold"})}))}}),Object.defineProperty(t.prototype,"getSelectedNodes",{enumerable:!1,configurable:!0,writable:!0,value:function(){return this.editor.cy.nodes(":selected")}}),Object.defineProperty(t.prototype,"setLayoutProperties",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.editor.saveLayoutProperties(t)}}),Object.defineProperty(t.prototype,"doesCyHaveElements",{enumerable:!1,configurable:!0,writable:!0,value:function(){return this.editor.cy.elements().length>0}}),Object.defineProperty(t.prototype,"toggleGrid",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.gridOptionsManager.setSnapToGuidelines(!1),this.gridOptionsManager.setShowGrid(t)}}),Object.defineProperty(t.prototype,"toggleGuide",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.gridOptionsManager.setSnapToGuidelines(t),this.gridOptionsManager.setShowGrid(!1)}}),Object.defineProperty(t.prototype,"adjustGridSettings",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.gridOptionsManager.currentProperties.gridSpacing=t,this.gridOptionsManager.currentProperties.guidelinesStyle.strokeStyle=e,this.gridOptionsManager.currentProperties.guidelinesStyle.horizontalDistColor=e,this.gridOptionsManager.currentProperties.guidelinesStyle.verticalDistColor=e}}),Object.defineProperty(t.prototype,"resizeToContent",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.resizeNodesToContent(this.editor.cy.nodes())}}),Object.defineProperty(t.prototype,"align",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.viewOperationsManager.handleNodeAlignment(t)}}),Object.defineProperty(t.prototype,"onChangeFile",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){var a=t.target.files[0];this.processFile(a,e),t.target.value=""}}),Object.defineProperty(t.prototype,"uploadOverlay",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.overlayUploader.click()}}),Object.defineProperty(t.prototype,"overlayFromText",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this,a=new FormData;a.append("graphFile",t);var i=new XMLHttpRequest;i.onreadystatechange=function(){if(i.readyState===XMLHttpRequest.DONE&&200===i.status){var t=i.responseText.split("\n");if(t.length>0)t[0].split("\t").slice(1).forEach((function(t){return e.addProfile({profileId:t,enabled:!0})}));else console.log("Error: No valid data");e.editor.addGenomicData(i.responseText)}},i.open("POST","/loadGraph"),i.send(a)}}),Object.defineProperty(t.prototype,"upload",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;this.editor.cy.elements().length>0?(this.handleOpen($e.CONFIRMATION),H.pendingFunction=function(){t.uploader.click()}):this.uploader.click()}}),Object.defineProperty(t.prototype,"merge",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.merger.click()}}),Object.defineProperty(t.prototype,"setOverlayUploader",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.overlayUploader=t}}),Object.defineProperty(t.prototype,"setUploaders",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){e?this.merger=t:this.uploader=t}}),Object.defineProperty(t.prototype,"getPathwayInfo",{get:function(){return this.fileManager.getPathwayInfo},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"setPathwayInfo",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.fileManager.setPathwayInfo(t)}}),Object.defineProperty(t.prototype,"undo",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.undoRedoManager.undo()}}),Object.defineProperty(t.prototype,"redo",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.undoRedoManager.redo()}}),Object.defineProperty(t.prototype,"export",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.eh.hide(),this.fileManager.saveGraph(t,this.editor)}}),Object.defineProperty(t.prototype,"resetUndoStack",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.undoRedoManager.reset()}}),Object.defineProperty(t.prototype,"newPathway",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e=function(){t.editor.removeAllElements(),t.fileManager.setPathwayInfo({pathwayTitle:"New Pathway",pathwayDetails:""}),t.resetUndoStack(),t.pathwayHandler("Dummy")};this.editor.cy.elements().length>0?(this.handleOpen($e.CONFIRMATION),H.pendingFunction=e):e()}}),Object.defineProperty(t.prototype,"changePathway",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.pathwayHandler(t),this.isCBioPortal||(this.fileManager.setPathwayInfo({pathwayTitle:t,pathwayDetails:""}),this.editor&&this.resetUndoStack())}}),Object.defineProperty(t.prototype,"highlightNeighbours",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.highlightNeighbors()}}),Object.defineProperty(t.prototype,"highlightSelected",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.highlightSelected()}}),Object.defineProperty(t.prototype,"validateGenes",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.validateGenes()}}),Object.defineProperty(t.prototype,"showAll",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.showAllNodes()}}),Object.defineProperty(t.prototype,"hideSelected",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.hideSelectedNodes()}}),Object.defineProperty(t.prototype,"deleteSelected",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this.editor.cy.elements(":selected");this.editor.removeElement(t)}}),Object.defineProperty(t.prototype,"addEdge",{enumerable:!1,configurable:!0,writable:!0,value:function(t){if(window.edgeAddingMode=t+1,-1===t)return this.eh.disable(),void this.eh.hide();this.eh.enable()}}),Object.defineProperty(t.prototype,"changeNodeName",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){var a=this.editor.cy.$('[name="'+t+'"]')[0];this.editor.changeName(a,e)}}),Object.defineProperty(t.prototype,"addNode",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e={type:t.toUpperCase(),name:"New "+t,w:"150",h:"52"},a=this.editor.cy.extent(),i={x:(a.x1+a.x2)/2,y:(a.y1+a.y2)/2};this.editor.addNode(e,i),this.pathwayHandler("Additional Pathway")}}),Object.defineProperty(t.prototype,"searchGene",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e="node[name @*= '"+t+"']",a=this.editor.cy.filter(e),i=this.editor.cy.collection();a.forEach((function(t,e){t.hasClass("highlightedNode")||t.hasClass("invalidGeneHighlight")||(i=i.union(t))})),this.editor.highlightBySearch(i)}}),Object.defineProperty(t.prototype,"removeAllData",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.removeGenomicData(),this.clearProfiles()}}),Object.defineProperty(t.prototype,"removeAllHighlight",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.removeAllHighlight()}}),Object.defineProperty(t.prototype,"processFile",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){var a=this,i=new FormData;i.append("graphFile",t);var o=new XMLHttpRequest;o.onreadystatechange=function(){if(o.readyState===XMLHttpRequest.DONE)if(200===o.status){var t=M.parseGraph(o.responseText,!1);if(e){a.editor.mergeGraph(t.nodes,t.edges);var i=a.editor.cy.json();t.nodes=i.elements.nodes,t.edges=i.elements.edges,t.title="Additional Pathway"}else a.editor.loadFile(t.nodes,t.edges),a.fileManager.setPathwayInfo({pathwayTitle:t.title,pathwayDetails:t.description});a.pathwayHandler(t.title+"_imported"),a.resetUndoStack()}else console.error("Error processing file: "+o.readyState+o.responseText)},o.open("POST","/loadGraph"),o.send(i)}}),Object.defineProperty(t.prototype,"saveAs",{enumerable:!1,configurable:!0,writable:!0,value:function(t){"SVG"===t?this.fileManager.saveAsSVG(this.editor):"PNG"===t?this.fileManager.saveAsPNG(this.editor.cy):"JPEG"===t&&this.fileManager.saveAsJPEG(this.editor.cy)}}),Object.defineProperty(t.prototype,"editorHandler",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e,a,i,o){this.editor=t,this.eh=e,this.undoRedoManager=a,this.viewOperationsManager=i,this.gridOptionsManager=o}}),Object.defineProperty(t.prototype,"loadSampleData",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.addGenomicData("gene\tlung\tovarian\tbreast\ty\nPTEN\t-7\t-20\t10\t20\nNF1\t-12\t-4\t30\t20\nPIK3CA\t18\t40\t-50\t20\nKRAS\t11\t-5\t0\t20\nZIYA\t0\t-2\t0\t20\nAKT1\t3\t30\t-10\t20\nAKT2\t6\t-3\t20\t20\nAKT3\t6\t-3\t20\t20\n\n"),this.addProfile({profileId:"lung",enabled:!0}),this.addProfile({profileId:"ovarian",enabled:!0}),this.addProfile({profileId:"breast",enabled:!0})}}),Object.defineProperty(t.prototype,"performLayout",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.performLayout()}}),xt([r.observable],t.prototype,"selectedPathway",void 0),xt([r.observable],t.prototype,"enabledType",void 0),xt([r.action.bound],t.prototype,"addProfile",null),xt([r.action.bound],t.prototype,"clearProfiles",null),xt([n.a],t.prototype,"toggleGrid",null),xt([n.a],t.prototype,"toggleGuide",null),xt([n.a],t.prototype,"resizeToContent",null),xt([n.a],t.prototype,"align",null),xt([n.a],t.prototype,"onChangeFile",null),xt([n.a],t.prototype,"upload",null),xt([n.a],t.prototype,"merge",null),xt([n.a],t.prototype,"setUploaders",null),xt([r.computed],t.prototype,"getPathwayInfo",null),xt([n.a],t.prototype,"setPathwayInfo",null),xt([n.a],t.prototype,"undo",null),xt([n.a],t.prototype,"redo",null),xt([n.a],t.prototype,"export",null),xt([n.a],t.prototype,"resetUndoStack",null),xt([n.a],t.prototype,"newPathway",null),xt([n.a],t.prototype,"changePathway",null),xt([n.a],t.prototype,"highlightNeighbours",null),xt([n.a],t.prototype,"highlightSelected",null),xt([n.a],t.prototype,"validateGenes",null),xt([n.a],t.prototype,"showAll",null),xt([n.a],t.prototype,"hideSelected",null),xt([n.a],t.prototype,"deleteSelected",null),xt([n.a],t.prototype,"addEdge",null),xt([n.a],t.prototype,"changeNodeName",null),xt([n.a],t.prototype,"addNode",null),xt([n.a],t.prototype,"searchGene",null),xt([n.a],t.prototype,"removeAllData",null),xt([n.a],t.prototype,"removeAllHighlight",null),xt([n.a],t.prototype,"processFile",null),xt([n.a],t.prototype,"saveAs",null),xt([n.a],t.prototype,"editorHandler",null),xt([n.a],t.prototype,"loadSampleData",null),xt([n.a],t.prototype,"performLayout",null),t}(),kt=a(17),Ut=a.n(kt),Ht=a(23),Qt=a.n(Ht),Kt=a(24),Xt=a.n(Kt),Vt=a(25),Ft=a.n(Vt),Jt=a(26),qt=a.n(Jt),_t=a(27),$t=a.n(_t),te=a(28),ee=a.n(te),ae=a(29),ie=a.n(ae),oe=a(30),ne=a.n(oe),re=a(31),le=a.n(re),ce=a(32),Ie=a.n(ce),ge=a(33),de=a.n(ge),ue=a(34),se=a.n(ue),Ce=a(35),Ae=a.n(Ce),Me=a(36),pe=a.n(Me),Ne=a(37),be=a.n(Ne),ye=a(38),he=a.n(ye),Ee=a(39),me=a.n(Ee),je=a(40),we=a.n(je),De=a(41),Te=a.n(De),Le=a(42),fe=a.n(Le),Oe=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),ve=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},Ge=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"searchedGene",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(a),a.searchedGene="",a.props.pathwayActions.enabledType=R.NONE,a}return Oe(e,t),Object.defineProperty(e.prototype,"setEnabledType",{enumerable:!1,configurable:!0,writable:!0,value:function(t){t===this.props.pathwayActions.enabledType?this.props.pathwayActions.enabledType=R.NONE:this.props.pathwayActions.enabledType=t,this.props.pathwayActions.enabledType===R.GRID?this.props.pathwayActions.toggleGrid(!0):this.props.pathwayActions.enabledType===R.GUIDE?this.props.pathwayActions.toggleGuide(!0):this.props.pathwayActions.toggleGrid(!1)}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e=[{svg:Ae.a,function:this.props.pathwayActions.newPathway,tooltip:"New Pathway"},{svg:se.a,function:this.props.pathwayActions.upload,tooltip:"Import Pathway"},{svg:me.a,function:function(){t.props.pathwayActions.export(!1)},tooltip:"Export Pathway"}],a=[{svg:ie.a,function:this.props.pathwayActions.deleteSelected,tooltip:"Delete Selected"}];this.props.pathwayActions.isCollaborative||a.push({svg:fe.a,function:function(){t.props.pathwayActions.undo()},tooltip:"Undo"},{svg:he.a,function:function(){t.props.pathwayActions.redo()},tooltip:"Redo"});var i=[{svg:Ft.a,function:function(){t.props.pathwayActions.align("hTop")},tooltip:"Align Horizontal Top"},{svg:Xt.a,function:function(){t.props.pathwayActions.align("hMid")},tooltip:"Align Horizontal Middle"},{svg:Qt.a,function:function(){t.props.pathwayActions.align("hBot")},tooltip:"Align Horizontal Bottom"},{svg:$t.a,function:function(){t.props.pathwayActions.align("vLeft")},tooltip:"Align Vertical Left"},{svg:qt.a,function:function(){t.props.pathwayActions.align("vCen")},tooltip:"Align Vertical Center"},{svg:ee.a,function:function(){t.props.pathwayActions.align("vRight")},tooltip:"Align Vertical Right"}],o=[{isFocused:this.props.pathwayActions.enabledType===R.GRID,svg:ne.a,function:function(){t.setEnabledType(R.GRID)},tooltip:"Enable Grid: Show and snap to grid"},{isFocused:this.props.pathwayActions.enabledType===R.GUIDE,svg:le.a,function:function(){t.setEnabledType(R.GUIDE)},tooltip:"Enable Guidelines: Enable and snap to alignment guidelines"}],n=[{svg:Ie.a,function:function(){t.props.pathwayActions.hideSelected()},tooltip:"Hide Selected"},{svg:Te.a,function:function(){t.props.pathwayActions.showAll()},tooltip:"Show All"}],r=[{svg:f.a,function:function(){t.props.pathwayActions.performLayout()},tooltip:"Perform Layout"},{svg:de.a,function:function(){t.props.handleOpen($e.LAYOUT)},tooltip:"Layout Properties"}],l=[e,a,i,o,n,[{svg:pe.a,function:function(){t.props.handleOpen($e.STUDY)},tooltip:"Fetch Genomic Data From cBioPortal"},{svg:we.a,function:function(){t.props.handleOpen($e.PROFILES)},tooltip:"Genomic Data Visibility Settings"}],r,[{svg:be.a,function:function(){t.props.handleOpen($e.HELP)},tooltip:"Quick Help"},{svg:Ut.a,function:function(){t.props.handleOpen($e.ABOUT)},tooltip:"About"}]];return I.a.createElement(g.Navbar,{fluid:!0,style:{backgroundColor:"#eff0f2",minHeight:"0px"},className:"pathway-toolbar"},I.a.createElement(g.ButtonToolbar,{className:"toolbar pathway-toolbar",style:{marginBottom:"0px",paddingBottom:"0px"}},l.map((function(t,e){return I.a.createElement(g.ButtonGroup,{key:e},t.map((function(t,e){return I.a.createElement(g.Button,{key:e,className:"toolbar-button"+(t.isFocused?" toolbar-button-focused":""),style:{padding:0}},I.a.createElement("img",{height:"22px",width:"22px",src:t.svg,"data-tip":t.tooltip,"data-place":"bottom","data-effect":"solid",onClick:t.function}))})))})),I.a.createElement(g.ButtonGroup,{id:"searchGeneToolbar"},I.a.createElement(g.FormGroup,null,I.a.createElement(g.InputGroup,null,I.a.createElement(g.FormControl,{id:"searchGene",type:"text",style:{maxHeight:"32px",borderTopRightRadius:0,borderBottomRightRadius:0},onChange:function(e){t.searchedGene=e.target.value},placeholder:"Search Genes...",onKeyPress:function(e){"Enter"===e.key&&t.props.pathwayActions.searchGene(t.searchedGene)}}),I.a.createElement(g.InputGroup.Addon,{id:"search-gene-input-group-addon",onClick:function(){t.props.pathwayActions.searchGene(t.searchedGene)},style:{cursor:"pointer"}},I.a.createElement(g.Glyphicon,{glyph:"search"})))))))}}),ve([r.observable],e.prototype,"searchedGene",void 0),e=ve([l.observer],e)}(I.a.Component),Se=a(7),Pe=a.n(Se),ze=a(43),Ye=a.n(ze),Ze=a(44),Re=a.n(Ze),Be=a(45),xe=a.n(Be),We=a(46),ke=a.n(We),Ue=a(47),He=a.n(Ue),Qe=a(48),Ke=a.n(Qe),Xe=function(){function t(t,e,a,i,o){Object.defineProperty(this,"cy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"editor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"handleOpen",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"undoRedoManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isCollaborative",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.cy=t,this.editor=e,this.handleOpen=a,this.undoRedoManager=i,this.isCollaborative=o,this.init()}return Object.defineProperty(t.prototype,"init",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e=this,a=this.cy.scratch("cycontextmenus")?this.cy.contextMenus("get"):this.cy.contextMenus(),i=[{id:"deleteSelected",content:"Delete Selected",coreAsWell:!0,onClickFunction:function(){var a=t.cy.elements(":selected");e.editor.removeElement(a)},disabled:!1,hasTrailingDivider:!1},{id:"hideSelected",content:"Hide Selected",coreAsWell:!0,onClickFunction:function(){e.editor.hideSelectedNodes()},disabled:!1,hasTrailingDivider:!1},{id:"loadFromCBioPortal",content:"Load From cBioPortal...",coreAsWell:!0,onClickFunction:function(){t.handleOpen($e.STUDY)},disabled:!1,hasTrailingDivider:!1},{id:"remove",content:"Delete",selector:"node, edge",onClickFunction:function(t){var a=t.target,i=e.cy.nodes(":selected").union(a);e.editor.removeElement(i)},disabled:!1,hasTrailingDivider:!1,coreAsWell:!1},{id:"addSelected",content:"Add Selected Into This",selector:"node",onClickFunction:function(t){var a=t.target,i=e.cy.nodes(":selected"),o=a.data("type"),n=e.cy.collection();if(!("GENE"===a._private.data.type||i.size()<1)){var r=!1;if(i.forEach((function(t,i){return a.id()==t.id()?(r=!0,!1):!t.isParent()||!(r=e.isChildren(t,a))})),!r){i.forEach((function(t,e){"FAMILY"==o||"COMPLEX"==o?"COMPARTMENT"!=t.data("type")&&"PROCESS"!=t.data("type")&&(n=n.add(t)):n=n.add(t)}));var l=a.id();e.editor.changeParents(n,l),i.unselect()}}},disabled:!1,hasTrailingDivider:!1,coreAsWell:!1},{id:"removeSelected",content:"Remove Selected From Parent",selector:"node",onClickFunction:function(t){var a=t.target,i=e.cy.nodes(":selected"),o=!1;i.forEach((function(t,i){return!t.isParent()||!(o=e.isChildren(t,a))})),o||(e.editor.changeParents(i,null),i.unselect())},disabled:!1,hasTrailingDivider:!1,coreAsWell:!1},{id:"performLayout",content:"Perform Layout",coreAsWell:!0,onClickFunction:function(){t.editor.performLayout()},disabled:!1,hasTrailingDivider:!1}],o=[{id:"undoAction",content:"Undo",coreAsWell:!0,onClickFunction:function(){t.undoRedoManager.undo()},disabled:!1,hasTrailingDivider:!1},{id:"redoAction",content:"Redo",coreAsWell:!0,onClickFunction:function(){t.undoRedoManager.redo()},disabled:!1,hasTrailingDivider:!1}];this.isCollaborative||(i=i.concat(o)),a.appendMenuItems(i)}}),Object.defineProperty(t.prototype,"isChildren",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){for(var a=e.parent()[0];a;){if(a.id()==t.id())return!0;a=a.parent()[0]}return!1}}),t}(),Ve=function(){function t(t,e){Object.defineProperty(this,"cy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"editor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.cy=t,this.editor=e}return Object.defineProperty(t.prototype,"generateEdgeQtip",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this,a=t.data("pubmedIDs"),i=document.createElement("div"),o=document.createElement("div");o.classList.add("row","node-tooltip-header"),o.innerHTML="INTERACTION DETAILS",i.append(o);var n=document.createElement("div");n.classList.add("col-xs-6","inputCol");var r=document.createElement("input");r.type="text",r.value=t.data("name"),r.classList.add("form-control"),r.addEventListener("change",(function(a){var i=a.target.value;e.editor.changeName(t,i)})),n.appendChild(r);var l=document.createElement("div");l.classList.add("row","geneDetails");var c=document.createElement("div");c.classList.add("col-xs-6","qtipLabel"),c.innerHTML="Label:",l.appendChild(c),l.appendChild(n),i.appendChild(l),i.appendChild(document.createElement("hr"));var I=document.createElement("div");I.classList.add("col-xs-6","inputCol");var g=document.createElement("input");g.type="text",g.classList.add("form-control"),g.addEventListener("change",(function(a){var i=a.target.value.split(";");a.target.value="",e.editor.addPubmedIDs(t,i),s(t.data("pubmedIDs"))})),I.appendChild(g);var d=document.createElement("div");d.classList.add("row","geneDetails");var u=document.createElement("div");function s(a){document.getElementsByClassName("pubmedIDList").length>0&&document.getElementsByClassName("pubmedIDList").item(0).remove();var o=document.createElement("div");o.classList.add("pubmedIDList"),o.appendChild(document.createElement("hr"));var n=document.createElement("label");for(var r in n.classList.add("col-xs-12","pubmedIDLabel"),n.innerHTML="Pubmed IDs",o.appendChild(n),a)if(a.hasOwnProperty(r)){var l=a[r];if(!isNaN(l)){var c=document.createElement("div"),I=document.createElement("i");I.classList.add("fa","fa-times","qtipRemovePmedID"),I.setAttribute("aria-hidden","true"),I.setAttribute("pubmedId",l),I.addEventListener("click",(function(a){a.target.parentElement.remove();var i=a.target.getAttribute("pubmedId");e.editor.removePubmedID(t,[i]),0===t.data("pubmedIDs").length&&document.getElementsByClassName("pubmedIDList").item(0).remove()}));var g=document.createElement("div"),d=document.createElement("label"),u=document.createElement("a");u.setAttribute("target","_blank");var s="https://www.ncbi.nlm.nih.gov/pubmed/"+l;u.setAttribute("href",s),u.innerHTML=l.toString(),d.appendChild(u),g.appendChild(d),g.appendChild(I),c.appendChild(g),o.appendChild(c)}}t.data("pubmedIDs").length>0&&i.appendChild(o)}return u.classList.add("col-xs-6","qtipLabel"),u.innerHTML="Add Pubmed ID(s):",d.appendChild(u),d.appendChild(I),i.appendChild(d),a.length>0&&s(a),i.classList.add("tooltip-text-style"),i}}),Object.defineProperty(t.prototype,"generateNodeQtip",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this,a=document.createElement("div");a.classList.add("row","node-tooltip-header"),a.innerHTML=t.data("type").toUpperCase()+" DETAILS";var i=document.createElement("div");i.classList.add("col-xs-8","inputCol");var o=document.createElement("input");o.type="text",o.value=t.data("name"),o.classList.add("form-control"),o.addEventListener("change",(function(a){var i=a.target.value;e.editor.changeName(t,i)})),i.appendChild(o);var n=document.createElement("div"),r=document.createElement("div");r.classList.add("row","geneDetails");var l=document.createElement("div");if(l.classList.add("col-xs-4","qtipLabel"),l.innerHTML="Name:",r.appendChild(l),r.appendChild(i),n.append(a),n.append(r),"GENE"===t.data("type")){var c=document.createElement("div");c.classList.add("row","centerText","geneDetails");var I=document.createElement("button");I.type="button",I.classList.add("btn","btn-default"),I.innerHTML="My Cancer Genome",I.addEventListener("click",(function(e){e.preventDefault();var a=t.data("name");window.open("https://www.mycancergenome.org/content/gene/"+a)})),c.append(I),n.append(c)}return n.classList.add("tooltip-text-style"),n}}),Object.defineProperty(t.prototype,"addQtipToElements",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this;t.forEach((function(t){var a=t.popperRef(),i=document.createElement("div");document.body.appendChild(i);var o=it()(i,{getReferenceClientRect:a.getBoundingClientRect,trigger:"manual",placement:"bottom",interactive:!0,theme:"pathwaymapper",content:function(){return t.isNode()?e.generateNodeQtip(t):e.generateEdgeQtip(t)},onHidden:function(t){t.destroy(),i.remove()}});e.cy.one("pan zoom",(function(){i&&i._tippy&&o.hide()})),t.one("showqtipevent",(function(){o.show()}))}))}}),Object.defineProperty(t.prototype,"capitalizeFirstLetter",{enumerable:!1,configurable:!0,writable:!0,value:function(t){return t.charAt(0).toUpperCase()+t.slice(1)}}),t}(),Fe=function(){function t(t){Object.defineProperty(this,"NODEMAP_NAME",{enumerable:!0,configurable:!0,writable:!0,value:"nodes"}),Object.defineProperty(this,"EDGEMAP_NAME",{enumerable:!0,configurable:!0,writable:!0,value:"edges"}),Object.defineProperty(this,"LAYOUT_PROPS_NAME",{enumerable:!0,configurable:!0,writable:!0,value:"layoutProperties"}),Object.defineProperty(this,"GLOBAL_OPTS_NAME",{enumerable:!0,configurable:!0,writable:!0,value:"globalOptions"}),Object.defineProperty(this,"GENOMIC_DATA_MAP_NAME",{enumerable:!0,configurable:!0,writable:!0,value:"genomicDataMap"}),Object.defineProperty(this,"VISIBLE_GENOMIC_DATA_MAP_NAME",{enumerable:!0,configurable:!0,writable:!0,value:"visibleGenomicDataMapByType"}),Object.defineProperty(this,"GENOMIC_DATA_GROUP_NAME",{enumerable:!0,configurable:!0,writable:!0,value:"genomicDataGroupList"}),Object.defineProperty(this,"GENOMIC_DATA_GROUP_COUNT",{enumerable:!0,configurable:!0,writable:!0,value:"genomicDataGroupCount"}),Object.defineProperty(this,"GENOMIC_DATA_COLOR_SCHEME_NAME",{enumerable:!0,configurable:!0,writable:!0,value:"genomicDataColorScheme"}),Object.defineProperty(this,"doc",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"postFileLoad",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"editor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"reconnectEdge",{enumerable:!0,configurable:!0,writable:!0,value:function(t,e,a){var i=this.doc.data[this.EDGEMAP_NAME],o=i[a.id],n=o.id;if(o.source=t,o.target=e,!i.hasOwnProperty(n))throw new Error("Element does not exist in Real Time");this.updateShareDBObject(this.EDGEMAP_NAME,n,o)}}),this.postFileLoad=t}return Object.defineProperty(t.prototype,"getDoc",{enumerable:!1,configurable:!0,writable:!0,value:function(){return this.doc}}),Object.defineProperty(t.prototype,"setEditor",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.editor=t}}),Object.defineProperty(t.prototype,"applyShareDBOperation",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.doc.submitOp(t,this.shareDBError)}}),Object.defineProperty(t.prototype,"clearShareDBGenomicData",{enumerable:!1,configurable:!0,writable:!0,value:function(){for(var t=[],e=this.doc.data[this.GENOMIC_DATA_MAP_NAME],a=this.doc.data[this.VISIBLE_GENOMIC_DATA_MAP_NAME],i=this.doc.data[this.GENOMIC_DATA_GROUP_NAME],o=this.doc.data[this.GENOMIC_DATA_GROUP_COUNT],n=0,r=Object.keys(e);n=0&&o.push(l)}for(n=0;n0)for(var c=0,I=t.children;c0?(I.data.anchorPoints=I.data.bendPointPositions,delete I.data.bendPointPositions,g="segments"):I.data.controlPointPositions&&I.data.controlPointPositions.length>0&&(I.data.anchorPoints=I.data.controlPointPositions,delete I.data.controlPointPositions,g="unbundled-bezier");var d=I.data;d.edgeCurveStyle=g;var u=a.getCustomObjId();d.id=u;var s=a.edgeInitializer(d);a.insertShareDBObject(a.EDGEMAP_NAME,u,s)}}}),Object.defineProperty(t.prototype,"mergeGraph",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){var a=this,i=a.doc.data[this.NODEMAP_NAME],o={},n={},r={};for(var l in i){var c=i[l];o[c.id]=c,n[c.name]=c}function I(t,e){if(t.data.name in n){var i=n[t.data.name].id;if(r[t.data.id]=i,t.children.length>0)for(var o=0,l=t.children;o0)for(var d=0,u=t.children;d0&&e.pubmedIDs.push(t.pubmedIDs)):e.pubmedIDs=[],t.anchorPoints?(null==e.anchorPoints&&(e.anchorPoints=[]),Array.isArray(t.anchorPoints[0])?e.anchorPoints=t.anchorPoints[0]:e.anchorPoints=t.anchorPoints):e.anchorPoints=[],e}}),Object.defineProperty(t.prototype,"nodeInitializer",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e={};return e.id=t.id||this.getCustomObjId(),e.name=t.name||"undefined",e.type=t.type||"undefined",e.parent=t.parent||"undefined",e.x=t.x||"undefined",e.y=t.y||"undefined",e.w=t.w||"undefined",e.h=t.h||"undefined",e.minWidth=t.minWidth||0,e.minWidthBiasLeft=t.minWidth||0,e.minWidthBiasRight=t.minWidth||0,e.minHeight=t.minWidth||0,e.minHeightBiasTop=t.minWidth||0,e.minHeightBiasBottom=t.minWidth||0,e.isHidden=t.isHidden||!1,e.isInvalidGene=t.isInvalidGene||!1,e.isHighlighted=t.isHighlighted||!1,e}}),Object.defineProperty(t.prototype,"layoutPropertiesInitializer",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e={};return e.name=t.name||"undefined",e.nodeRepulsion=t.nodeRepulsion||"undefined",e.idealEdgeLength=t.idealEdgeLength||"undefined",e.edgeElasticity=t.edgeElasticity||"undefined",e.nestingFactor=t.nestingFactor||"undefined",e.gravity=t.gravity||"undefined",e.numIter=t.numIter||"undefined",e.tile=t.tile||"undefined",e.animate=t.animate||"undefined",e.randomize=t.randomize||!1,e.gravityRangeCompound=t.gravityRangeCompound||"undefined",e.gravityCompound=t.gravityCompound||"undefined",e.gravityRange=t.gravityRange||"undefined",e.tilingPaddingVertical=t.tilingPaddingVertical||"undefined",e.tilingPaddingHorizontal=t.tilingPaddingHorizontal||"undefined",e.initialEnergyOnIncremental=t.initialEnergyOnIncremental||"undefined",e}}),Object.defineProperty(t.prototype,"globalOptionsInitializer",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e={};return e.zoomLevel=t.zoomLevel||"undefined",e.panLevel=t.panLevel||"undefined",e}}),Object.defineProperty(t.prototype,"getCustomObjId",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=Date.now();return"undefined"!=typeof performance&&"function"==typeof performance.now&&(t+=performance.now()),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){var a=(t+16*Math.random())%16|0;return t=Math.floor(t/16),("x"===e?a:3&a|8).toString(16)}))}}),Object.defineProperty(t.prototype,"getParam",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=new RegExp(t+"=(.*?)($|&)","g"),a=window.location.search.match(e);return a=a&&a.length?(a=a[0]).replace(t+"=","").replace("&",""):null}}),t}(),Je=(a(63),function(){function t(t,e,a){Object.defineProperty(this,"pathwayHandler",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"cy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"editor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.editor=t,this.cy=e,this.pathwayHandler=a,this.initNodeAdd()}return Object.defineProperty(t.prototype,"initNodeAdd",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e={height:30,width:30,padding:5,backgroundColorDiv:"#fbfbfb",borderColorDiv:"#fff",borderWidthDiv:"0px",borderRadiusDiv:"5px",icon:"",nodeParams:function(){return{}}},a=this;et.a.fn.cytoscapeNodeadd=function(i){var o=et.a.extend(!0,{},e,i),n=i,r={destroy:function(){et()(this).find(".ui-cytoscape-nodeadd").remove()},init:function(){return et()(this).each((function(){for(var e=0,i=o.components;e
');r.append(l);var c=et()('
');l.append(c),c.bind("mousedown",(function(t){t.stopPropagation(),t.preventDefault()})),r.find(".ui-cytoscape-nodeadd-nodediv").css({background:o.backgroundColorDiv,border:o.borderWidthDiv+" solid "+o.borderColorDiv,"border-radius":o.borderRadiusDiv}),r.find("#ui-cytoscape-nodeadd-icon").draggable({helper:"clone",cursor:"pointer"})}var I=et()(this);I.droppable({activeClass:"ui-state-highlight",drop:function(e,i){I.removeClass("ui-state-highlight");var o=I.offset(),n=e.pageX-o.left,r=e.pageY-o.top,l=et()(i.helper).attr("nodeType").toUpperCase(),c=t.cy,g={},d={};c.nodes().forEach((function(t){var e=t.renderedBoundingBox();n<=e.x2&&n>=e.x1&&r<=e.y2&&r>=e.y1&&"GENE"!=t.data().type&&(t.children().length>0&&(d[t.id()]=!0),d[t._private.data.parent]&&delete g[t._private.data.parent],g[t.id()]=t)}));var u=g[Object.keys(g)[0]],s={w:"0",h:"100",parent:0,type:l,name:"New "+et()(i.helper).attr("nodeType")};u&&("FAMILY"==u.data().type||"COMPLEX"==u.data().type?"COMPARTMENT"!=l&&"PROCESS"!=l&&(s.parent=u.id()):s.parent=u.id()),"PROCESS"===l?(s.w="100",s.h="35"):(s.w="150",s.h="52"),n=n/c.zoom()+c.extent().x1,r=r/c.zoom()+c.extent().y1,t.editor.addNode(s,{x:n,y:r}),a.pathwayHandler("Additional Pathway")}})}))}};return r[n]?r[n].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof n&&n?(et.a.error("No such function `"+n+"` for jquery.cytoscapenodeadd"),et()(this)):r.init.apply(this,arguments)},et.a.fn.cynodeadd=et.a.fn.cytoscapeNodeadd;try{Pe()("core","nodeadd",(function(t){et()(this.container()).cytoscapeNodeadd(t)}))}catch(t){console.log(t)}}}),t}()),qe=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),_e=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r};window.$=et.a;var $e,ta=a(64),ea=a(65),aa=a(66),ia=a(67),oa=a(68),na=a(69),ra=a(70),la=a(71),ca=a(72),Ia=a(73),ga=a(74),da=a(75),ua=a(76),sa=a(77),Ca=a(78),Aa=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"cy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"cyDiv",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"editor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"edgeAddingMode",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"viewOperationsManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"qtipManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"genomicDataExplorerView",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"pathwayDetailsView",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"viewUtilities",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"isCollaborative",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"isCbioPortal",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"shareDBManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"cxtMenuManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"dragDropNodeAddManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"undoRedoManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"portalAccessor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"isMountedFirst",{enumerable:!0,configurable:!0,writable:!0,value:!0}),Object.defineProperty(a,"eh",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"lastSelectedEdge",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),a.isCollaborative=e.isCollaborative,a.edgeAddingMode=0,a.isCbioPortal=e.isCbioPortal,a}return qe(e,t),Object.defineProperty(e.prototype,"componentWillUpdate",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.props.selectedPathway!==t.selectedPathway&&this.getPathway(t.selectedPathway)}}),Object.defineProperty(e.prototype,"componentDidUpdate",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.isCbioPortal&&t.selectedPathway!==this.props.selectedPathway&&this.props.onPathwayChangeCompleted()}}),Object.defineProperty(e.prototype,"getPathway",{enumerable:!1,configurable:!0,writable:!0,value:function(t){if(t&&""!==t){var e=C[t];if(e){var a=M.parseGraph(e,!0);this.editor.loadFile(a.nodes,a.edges)}}}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){return I.a.createElement("div",{className:this.props.isCbioPortal?"":"cyContainer",style:{border:"3px solid "+(this.isCbioPortal?"#4389c0":"#1abc9c")}},I.a.createElement("div",{ref:this.cyDivHandler,id:"cy",style:{height:this.isCbioPortal?"800px":"100%",borderRadius:"6px",marginTop:"0px"}}),I.a.createElement("div",{className:"cytoscape-navigator-wrapper"}))}}),Object.defineProperty(e.prototype,"componentDidMount",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.isMountedFirst&&(this.init(),this.isMountedFirst=!1),this.getPathway(this.props.selectedPathway)}}),Object.defineProperty(e.prototype,"cyDivHandler",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.cyDiv=t}}),Object.defineProperty(e.prototype,"init",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.portalAccessor=new wt,this.initCyJS(),this.initCyHandlers(),this.initKeyboardHandlers(),this.initUndoRedoFunctionality(),this.initCBioPortalFunctionalities(),this.placePanzoomAndOverlay()}}),Object.defineProperty(e.prototype,"placePanzoomAndOverlay",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=et()(this.cyDiv).offset().top,e=et()(this.cyDiv).offset().left,a=et()(this.cyDiv).outerHeight(),i=et()(this.cyDiv).outerWidth(),o=et()(".cytoscape-navigator-wrapper").outerHeight(),n=et()(".cytoscape-navigator-wrapper").outerWidth();this.isCbioPortal?(et()(".cytoscape-navigator-wrapper").css("bottom",10.5),et()(".cytoscape-navigator-wrapper").css("right",0)):(et()(".cytoscape-navigator-wrapper").css("top",a+t-o-5+16),et()(".cytoscape-navigator-wrapper").css("left",i+e-n-5+24-.5+.35)),et()(".cytoscape-navigator-wrapper").css("z-index",1039),et()(".cy-panzoom").css("position","relative"),et()(".cy-panzoom").css("top",2),et()(".cy-panzoom").css("left",i-51),et()(".cy-panzoom").css("z-index",1039),et()(".cy-panzoom").css("width",200)}}),Object.defineProperty(e.prototype,"getPathwayData",{enumerable:!1,configurable:!0,writable:!0,value:function(){return this.pathwayDetailsView.getPathwayData()}}),Object.defineProperty(e.prototype,"initCyJS",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;try{na(Pe.a,et.a)}catch(t){console.log(t)}try{ca(Pe.a)}catch(t){console.log(t)}try{ua(Pe.a,et.a)}catch(t){console.log(t)}try{oa(Pe.a)}catch(t){console.log(t)}try{Ia(Pe.a,et.a)}catch(t){console.log(t)}try{ia(Pe.a,et.a,ga)}catch(t){console.log(t)}try{ea(Pe.a,et.a,ga)}catch(t){console.log(t)}try{da(Pe.a,et.a)}catch(t){console.log(t)}try{ta(Pe.a,et.a)}catch(t){console.log(t)}try{sa(Pe.a)}catch(t){console.log(t)}try{aa(Pe.a)}catch(t){console.log(t)}try{Ca(Pe.a)}catch(t){console.log(t)}this.cy=Pe()({container:this.cyDiv,boxSelectionEnabled:!0,autounselectify:!1,wheelSensitivity:.1,style:ra,textureOnViewport:!1,motionBlur:!0,layout:{name:"preset"}}),this.edgeAddingMode=0,this.undoRedoManager=this.cy.undoRedo(),this.shareDBManager=new Fe((function(){t.shareDBManager.getDoc()})),this.editor=new ct(this.isCollaborative,this.shareDBManager,this.cy,this.isCbioPortal,this.undoRedoManager,this.portalAccessor,this.props.profiles,this.props.genomicDataOverlayColorScheme,this.props.colorSchemeChangeCallback),this.shareDBManager.setEditor(this.editor),this.isCollaborative&&this.shareDBManager.initShareDB(),this.qtipManager=new Ve(this.cy,this.editor),this.cxtMenuManager=new Xe(this.cy,this.editor,this.props.handleOpen,this.undoRedoManager,this.props.isCollaborative),this.dragDropNodeAddManager=new Je(this.editor,this.cy,this.props.pathwayHandler),this.cy.panzoom(la),this.cy.layoutUtilities({desiredAspectRatio:this.cy.width()/this.cy.height()}),this.cy.nodeadd({components:[{container:et()("#simpleNodeDiv"),nodeType:"Gene",icon:ke.a},{container:et()("#familyNodeDiv"),nodeType:"Family",icon:xe.a},{container:et()("#complexNodeDiv"),nodeType:"Complex",icon:Re.a},{container:et()("#compartmentNodeDiv"),nodeType:"Compartment",icon:Ye.a},{container:et()("#processNodeDiv"),nodeType:"Process",icon:He.a}]});var e=this,a={preview:!0,stackOrder:4,handleSize:10,handleColor:"#1abc9c",handleLineType:"ghost",handleLineWidth:1,handleNodes:"node",hoverDelay:1,cxt:!1,enabled:!1,toggleOffOnLeave:!0,edgeType:function(t,e){return"flat"},handlePosition:function(t){return"middle top"},loopAllowed:function(t){return!1},nodeLoopOffset:-50,nodeParams:function(t,e){return{}},edgeParams:function(t,e,a){return{}},start:function(t){e.getGlobalEdgeType()},complete:function(t,a,i){e.cy.remove(i),e.editor.addEdge({source:t.id(),target:a[0].id(),type:e.getGlobalEdgeType(window.edgeAddingMode),pubmedIDs:[],name:""})},stop:function(t){e.edgeAddingMode=-1,e.eh.disable(),e.eh.hide(),e.props.setActiveEdge(-1)}};this.eh=this.cy.edgehandles(a),this.eh.disable(),this.props.editorHandler(this.editor,this.eh,this.undoRedoManager),this.isCbioPortal||this.cy.nodeEditing({padding:5,undoable:!0,grappleSize:8,grappleColor:"#ffc90e",inactiveGrappleStroke:"inside 1px blue",boundingRectangle:!0,boundingRectangleLineDash:[4,8],boundingRectangleLineColor:"ffc90e",boundingRectangleLineWidth:1.5,zIndex:999,moveSelectedNodesOnKeyEvents:function(){return!0},minWidth:function(t){var e=t.data("resizeMinWidth");return e||15},minHeight:function(t){var e=t.data("resizeMinHeight");return e||15},getCompoundMinWidth:function(t){return t.style("min-width")},getCompoundMinHeight:function(t){return t.style("min-height")},getCompoundMinWidthBiasRight:function(t){return t.style("min-width-bias-right")},getCompoundMinWidthBiasLeft:function(t){return t.style("min-width-bias-left")},getCompoundMinHeightBiasTop:function(t){return t.style("min-height-bias-top")},getCompoundMinHeightBiasBottom:function(t){return t.style("min-height-bias-bottom")},isFixedAspectRatioResizeMode:function(t){return t.is(".fixedAspectRatioResizeMode")},isNoResizeMode:function(t){},setWidth:function(t,e){t.style("width",e)},setHeight:function(t,e){t.style("height",e)},setCompoundMinWidth:function(t,e){t.style("min-width",e)},setCompoundMinHeight:function(t,e){t.style("min-height",e)},setCompoundMinWidthBiasLeft:function(t,e){t.style("min-width-bias-left",e)},setCompoundMinWidthBiasRight:function(t,e){t.style("min-width-bias-right",e)},setCompoundMinHeightBiasTop:function(t,e){t.style("min-height-bias-top",e)},setCompoundMinHeightBiasBottom:function(t,e){t.style("min-height-bias-bottom",e)},cursors:{default:"default",inactive:"not-allowed",nw:"nw-resize",n:"n-resize",ne:"ne-resize",e:"e-resize",se:"se-resize",s:"s-resize",sw:"sw-resize",w:"w-resize"},resizeToContentCueImage:Ke.a,resizeToContentFunction:this.editor.resizeNodesToContent.bind(this.editor)});this.cy.navigator({container:".cytoscape-navigator-wrapper",viewLiveFramerate:0,thumbnailEventFramerate:10,thumbnailLiveFramerate:!1,dblClickDelay:200,removeCustomContainer:!0,rerenderDelay:100});this.viewUtilities=this.cy.viewUtilities({node:{highlighted:{"border-width":2,"border-color":"#bc1142"},unhighlighted:{opacity:function(t){return t.css("opacity")}}},edge:{highlighted:{},unhighlighted:{opacity:function(t){return t.css("opacity")}}},setVisibilityOnHide:!1,setDisplayOnHide:!0,neighbor:function(){return!1},neighborSelectTime:500}),this.editor.setViewUtilities(this.viewUtilities),this.placePanzoomAndOverlay()}}),Object.defineProperty(e.prototype,"getGlobalEdgeType",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t="NONE";return 1===window.edgeAddingMode?t="ACTIVATES":2===window.edgeAddingMode?t="INHIBITS":3===window.edgeAddingMode?t="INDUCES":4===window.edgeAddingMode?t="REPRESSES":5===window.edgeAddingMode&&(t="BINDS"),t}}),Object.defineProperty(e.prototype,"initCyHandlers",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t,e,a=this,i=this;this.cy.on("tap",(function(a){var i=a.target;-1!==e&&-1!==t&&clearTimeout(e),t===i?(i.trigger("doubleTap"),t=-1):(e=setTimeout((function(){t=-1}),300),t=i)})),this.cy.on("doubleTap","node",(function(t){i.props.isCbioPortal||t.target===this&&(i.qtipManager.addQtipToElements(t.target),t.target.trigger("showqtipevent"))})),this.cy.on("doubleTap","edge",(function(t){i.props.isCbioPortal||t.target===this&&(i.qtipManager.addQtipToElements(t.target),t.target.trigger("showqtipevent"))})),this.cy.on("select","node",(function(t){a.editor.pushSelectedNodeStack(t.target)})),this.cy.on("unselect","node",(function(t){a.editor.removeElementFromSelectedNodeStack(t.target)})),this.cy.on("free","node",(function(t){var e=a.cy.nodes(":selected"),i=t.target;i=(i=i.union(i.descendants())).union(e),a.editor.moveElements(i)})),this.cy.on("layoutstop",(function(){a.editor.postLayout()})),this.cy.on("nodeediting.resizeend",(function(t,e,i){i.data("w",i.width()),i.data("h",i.height()),a.editor.resizeElements(i)})),this.cy.on("select","edge",(function(t){a.lastSelectedEdge=t.target})),this.cy.on("bendPointMovement",(function(){a.editor.updateEdgeAnchorPoints(a.lastSelectedEdge)})),this.cy.on("nodeediting.moveend",(function(){a.editor.changeNodePositionsByArrows(a.cy.nodes(":selected"))}))}}),Object.defineProperty(e.prototype,"initKeyboardHandlers",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;this.isCollaborative||this.isCbioPortal?(et()('a[role="redo"]').hide(),et()('a[role="undo"]').hide()):et()(document).keydown((function(e){89===e.which&&(e.ctrlKey||e.metaKey)?t.undoRedoManager.redo():90===e.which&&(e.ctrlKey||e.metaKey)&&t.undoRedoManager.undo()})),et()(document).keydown((function(e){if(65===e.which&&(e.ctrlKey||e.metaKey))"TEXTAREA"!=(a=document.activeElement.tagName)&&"INPUT"!=a&&(e.preventDefault(),t.cy.elements().select());else if(8===e.which||46===e.which){var a;if("TEXTAREA"!=(a=document.activeElement.tagName)&&"INPUT"!=a){var i=t.cy.$(":selected");t.editor.removeElement(i)}}}))}}),Object.defineProperty(e.prototype,"initUndoRedoFunctionality",{enumerable:!1,configurable:!0,writable:!0,value:function(){(this.isCollaborative||this.isCbioPortal)&&(et()('[role="undo"]').hide(),et()('[role="redo"]').hide())}}),Object.defineProperty(e.prototype,"initCBioPortalFunctionalities",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.isCbioPortal&&this.cy.contextMenus("get").destroy()}}),_e([n.a],e.prototype,"cyDivHandler",null),e=_e([l.observer],e)}(I.a.Component),Ma=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),pa=function(t){function e(e){return t.call(this,e)||this}return Ma(e,t),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){for(var t=this,e={},a=0,i=Object.keys(C);a=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},Oa=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"activeEdge",{enumerable:!0,configurable:!0,writable:!0,value:-1}),Object(r.makeObservable)(a),e.setActiveEdgeHandler(a.setActiveEdge),a}return La(e,t),Object.defineProperty(e.prototype,"addEdge",{enumerable:!1,configurable:!0,writable:!0,value:function(t){if(t===this.activeEdge)return this.setActiveEdge(-1),void this.props.pathwayActions.addEdge(-1);this.setActiveEdge(t),this.props.pathwayActions.addEdge(t)}}),Object.defineProperty(e.prototype,"setActiveEdge",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.activeEdge=t}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e=[ba.a,wa.a,ma.a,Ta.a,ha.a];return I.a.createElement("div",{id:"pathway-sidebar",className:"sideBarWrapper"},I.a.createElement(g.Panel,{className:"pnl"},I.a.createElement(g.Panel.Heading,{className:"pnl-header"},"Network"),I.a.createElement(g.Panel.Body,{className:"pnl-body pathwayPanel"},I.a.createElement("div",{className:"buttonContainer"},I.a.createElement(g.Button,{onClick:function(){t.props.handleOpen($e.PW_DETAILS)}},"Properties")),I.a.createElement("div",{className:"buttonContainer"},I.a.createElement(g.Button,{onClick:function(){t.props.pathwayActions.upload()}},"Import")),I.a.createElement("div",{className:"buttonContainer"},I.a.createElement(g.Button,{onClick:function(){t.props.pathwayActions.export(!1)}},"Export")))),I.a.createElement(g.Panel,{className:"pnl"},I.a.createElement(g.Panel.Heading,{className:"pnl-header"},"Node Palette"),I.a.createElement(g.Panel.Body,{className:"pnl-body"},["simpleNodeDiv","familyNodeDiv","complexNodeDiv","compartmentNodeDiv","processNodeDiv"].map((function(t){return I.a.createElement("div",{key:t,id:t,"data-tip":"Click on this and drag to the location on drawing canvas and release!","data-effect":"solid","data-place":"bottom","data-delay-show":"1000",className:"dragButtonContainer"})})))),I.a.createElement(g.Panel,{className:"pnl edgePanel"},I.a.createElement(g.Panel.Heading,{className:"pnl-header"},"Interaction Palette"),I.a.createElement(g.Panel.Body,{className:"pnl-body edgePaletteWrapper"},I.a.createElement("div",{className:"list-group edge-palette"},["Activates","Inhibits","Induces","Represses","Binds"].map((function(a,i){return I.a.createElement("div",{key:i,"data-tip":"Click to activate; then, start the interaction from the little circle on the source node!","data-effect":"solid","data-place":"bottom","data-delay-show":"1000"},I.a.createElement("a",{style:{marginBottom:"5px"},className:"list-group-item "+(t.activeEdge===i?"active":""),onClick:function(){t.addEdge(i)},href:"#"},I.a.createElement("img",{style:{width:"30px"},className:"pull-left",src:e[i]})," ",a))}))))))}}),fa([r.observable],e.prototype,"activeEdge",void 0),fa([r.action.bound],e.prototype,"setActiveEdge",null),e=fa([l.observer],e)}(I.a.Component),va=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),Ga=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},Sa=a(79),Pa=Sa();!function(t){t[t.STUDY=0]="STUDY",t[t.CONFIRMATION=1]="CONFIRMATION",t[t.PROFILES=2]="PROFILES",t[t.ABOUT=3]="ABOUT",t[t.PW_DETAILS=4]="PW_DETAILS",t[t.GRID=5]="GRID",t[t.HELP=6]="HELP",t[t.LAYOUT=7]="LAYOUT",t[t.CHELP=8]="CHELP",t[t.PROFILES_COLOR_SCHEME=9]="PROFILES_COLOR_SCHEME"}($e||($e={}));var za=function(t){function e(e){var i=t.call(this,e)||this;return Object.defineProperty(i,"MAX_ALLOWED_PROFILES_ENABLED",{enumerable:!0,configurable:!0,writable:!0,value:6}),Object.defineProperty(i,"selectedPathway",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"fileManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"editor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"pathwayActions",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"isModalShown",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"colorValueMap",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"portalAccessor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"alterationData",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"patientData",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(i,"pathwayGeneMap",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(i,"bestPathwaysAlgos",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(i,"oldName",{enumerable:!0,configurable:!0,writable:!0,value:""}),Object.defineProperty(i,"profiles",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(i,"setActiveEdge",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"viewOperationsManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"gridOptionsManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(i),i.fileManager=new N,i.pathwayActions=new Wt(i.pathwayHandler,i.profiles,i.fileManager,i.handleOpen,i.props.isCBioPortal,i.props.isCollaborative),i.selectedPathway="",i.props.pathwayName&&i.pathwayActions.changePathway(i.props.pathwayName),i.isModalShown=[!1,!1,!1,!1,!1,!1,!1,!1,!1,!1],i.alterationData={},i.extractAllGenes(),i.colorValueMap={"-100":"#0000ff",0:"#ffffff",100:"#ff0000"},i.props.isCBioPortal&&(i.props.cBioAlterationData&&(i.props.patientView?(i.calculatePatientData(i.props.cBioAlterationData),i.addSampleIconData(i.props.sampleIconData)):i.calculateAlterationData(i.props.cBioAlterationData)),i.props.addGenomicDataHandler&&i.props.addGenomicDataHandler(i.addGenomicData),i.profiles.push({profileId:a.CBIO_PROFILE_NAME,enabled:!0}),i.getBestPathway(0),i.getBestPathway(1),i.getBestPathway(2),i.getBestPathway(3)),i}var a;return va(e,t),a=e,Object.defineProperty(e.prototype,"setColorMapping",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.colorValueMap=t,this.editor.updateGenomicDataColorScheme(this.colorValueMap)}}),Object.defineProperty(e.prototype,"setSelectedPathway",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.selectedPathway=t}}),Object.defineProperty(e.prototype,"setEditor",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.editor=t}}),Object.defineProperty(e.prototype,"addProfile",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.profiles.push(t)}}),Object.defineProperty(e.prototype,"toggleProfileEnabled",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.profiles[t].enabled=!this.profiles[t].enabled}}),Object.defineProperty(e.prototype,"calculateAlterationData",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this;this.alterationData[a.CBIO_PROFILE_NAME]={},t.forEach((function(t){var i=t.altered/t.sequenced*100;e.alterationData[a.CBIO_PROFILE_NAME][t.gene]=Object.is(i,NaN)?-101:i}))}}),Object.defineProperty(e.prototype,"calculatePatientData",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this;this.alterationData[a.CBIO_PROFILE_NAME]={};var i=t.map((function(t){return t.gene})).filter((function(t,e,a){return a.indexOf(t)==e}));this.patientData.PatientView=1,i.forEach((function(t){e.patientData[t]={}})),t.forEach((function(t){var i=t.altered/t.sequenced*100;e.alterationData[a.CBIO_PROFILE_NAME][t.gene]=Object.is(i,NaN)?-101:i,e.patientData[t.gene][t.percentAltered]=Object.is(i,NaN)?-101:i,e.patientData[t.gene].geneticTrackData=t.geneticTrackData,e.patientData[t.gene].geneticTrackRuleSetParams=t.geneticTrackRuleSetParams}))}}),Object.defineProperty(e.prototype,"addSampleIconData",{enumerable:!1,configurable:!0,writable:!0,value:function(t){t&&(this.patientData.sampleColors=t.sampleColors,this.patientData.sampleIndex=t.sampleIndex)}}),Object.defineProperty(e.prototype,"getGeneStudyMap",{enumerable:!1,configurable:!0,writable:!0,value:function(t){for(var e={},a=0,i=Object.keys(t);a0;){var C=Pa.extractMax();n=C.getValue().pathwayName;o.push({score:C.getKey(),genesMatched:i[n],pathwayName:n})}0===this.bestPathwaysAlgos.length&&this.setSelectedPathway(o[0].pathwayName),this.bestPathwaysAlgos.push(o)}}),Object.defineProperty(e.prototype,"includePathway",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){for(var a={},i=0,o=t.nodes;i4?b[4]:"0",M=b.length>5?b[5]:"0",p={group:"nodes",data:{id:u,name:d,type:s,w:b.length>7?b[6]:"PROCESS"===s?6*d.length+24:"150",h:b.length>7?b[7]:"PROCESS"===s?"24":"52",parent:-1},position:{x:parseInt(A),y:parseInt(M)}};"-1"!=C&&(p.data.parent=C),a.push(p)}for(var N=n;N4?b[4].split(";"):[],w=b.length>5?b[5]:"",D=b.length>6?b[6]:"",T=b.length>7?b[7]:"",L=[];if(D)for(var f=D.split(")"),O=0;O=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},N=function(){function t(){Object.defineProperty(this,"pathwayInfo",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(this),this.pathwayInfo={pathwayTitle:"New Pathway",pathwayDetails:""}}return Object.defineProperty(t.prototype,"getPathwayInfo",{get:function(){return this.pathwayInfo},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"setPathwayInfo",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.pathwayInfo=t}}),Object.defineProperty(t.prototype,"b64toBlob",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e,a){void 0===a&&(a=512),e=e||"";for(var i=atob(t),o=[],n=0;n0){var n=a[0],r=n.boundingBox(),l=n.outerHeight(),c=this;a.forEach((function(e,a){if(0!=a&&null==i[e.parent().id()]){var o=c.calculateNewPosition(t,e,r,l);c.changePosition(e,0,0,o)}})),this.editor.handleChangePositionByAlignment(c.movedNodes)}}}),Object.defineProperty(t.prototype,"calculateNewPosition",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e,a,i){var o,n=e.position(),r=e.boundingBox(),l=e.isParent()?e.outerHeight()-(r.h-e.outerHeight())/2-(e.outerHeight()-e.height())/2:e.height(),c=e.isParent()?r.h-e.outerHeight():0;if("vLeft"===t)o={x:a.x1+r.w/2,y:n.y};else if("vCen"===t)o={x:a.x1+a.w/2,y:n.y};else if("vRight"===t)o={x:a.x2-r.w/2,y:n.y};else if("hTop"===t)o={x:n.x,y:a.y1+r.h/2};else if("hMid"===t&&e.isParent()&&""==e.data("name"))o={x:n.x,y:a.y1+a.h/2};else if("hMid"===t)o={x:n.x,y:a.y1+i/2+c/2};else if("hBot"===t&&e.isParent()&&""==e.data("name"))o={x:n.x,y:a.y2-r.h/2};else{if("hBot"!==t)return void console.log("Error: wrong alignment name "+t);o={x:n.x,y:a.y1+i-l/2}}return o}}),Object.defineProperty(t.prototype,"changePosition",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e,a,i){if(t.isParent()){var o=t.children(),n=t.boundingBox(),r=this;o.forEach((function(t,e){var a=t.boundingBox(),o=-(n.x1-a.x1)-n.w/2+a.w/2,l=-(n.y1-a.y1)-n.h/2+a.h/2;t.isParent()?r.changePosition(t,0,0,{x:i.x+o,y:i.y+l}):r.changePosition(t,o,l,i)}))}else{var l={x:i.x+e,y:i.y+a};this.movedNodes.push({node:t,nextPosition:l,oldPosition:null})}}}),t}(),m=(i=function(t,e){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(t,e)},function(t,e){function a(){this.constructor=t}i(t,e),t.prototype=null===e?Object.create(e):(a.prototype=e.prototype,new a)}),j=function(t){function e(e){return t.call(this,e)||this}return m(e,t),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return g.a.createElement(I.Modal,{show:this.props.show,onHide:function(){t.props.handleClose($e.ABOUT)}},g.a.createElement(I.Modal.Header,{closeButton:!0},g.a.createElement(I.Modal.Title,null,"About")),g.a.createElement(I.Modal.Body,null,g.a.createElement("h3",{id:"about-model-header"},"PathwayMapper 2.2"),g.a.createElement("div",{className:"aboutImageContent"},g.a.createElement("img",{src:a(58),alt:"",height:"34px"})),g.a.createElement("div",{className:"aboutImageContent"},g.a.createElement("img",{src:a(59),alt:"",height:"34px"})),g.a.createElement("div",{className:"adressText"},g.a.createElement("p",null,"i-Vis information Visualization Lab"),g.a.createElement("p",null,"Bilkent University, Ankara, Turkey")),g.a.createElement("div",{className:"adressText"},g.a.createElement("p",null,"Memorial Sloan-Kettering Cancer Center"),g.a.createElement("p",null,"New York, USA"))),g.a.createElement(I.Modal.Footer,null,g.a.createElement("a",{href:"https://github.com/iVis-at-Bilkent/pathway-mapper"},"https://github.com/iVis-at-Bilkent/pathway-mapper")))}}),e}(g.a.Component),w=a(11),D=a(15),T=a.n(D),L=a(9),f=a.n(L),O=a(12),v=a.n(O),G=a(13),S=a.n(G),P=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),z=a(19),Y=a(20);function Z(t){return[parseInt(t[1]+t[2],16),parseInt(t[3]+t[4],16),parseInt(t[5]+t[6],16),1]}var R,B={type:"rectangle",fill:Z("#bebebe"),x:0,y:0,width:6,height:20,stroke:[0,0,0,0],"stroke-width":0},x=["Amplification","Deep Deletion","Fusion","Germline Mutation","Missense Mutation (putative driver)","Missense Mutation (unknown significance)","Other Mutation","Promoter Mutation","Truncating Mutation (putative driver)","Truncating Mutation (unknown significance)","Inframe Mutation (putative driver)","Inframe Mutation (unknown significance)"],W=[{type:"rectangle",fill:Z("#ff0000"),x:0,y:0,width:6,height:20},{type:"rectangle",fill:Z("#0000ff"),x:0,y:0,width:6,height:20},{type:"rectangle",fill:Z("#8B00C9"),x:0,y:4,width:6,height:12},{type:"rectangle",fill:Z("#FFFFFF"),x:0,y:8.75,width:6,height:1.6},{type:"rectangle",fill:Z("#008000"),x:0,y:6.66,width:6,height:6.66},{type:"rectangle",fill:Z("#53D400"),x:0,y:6.66,width:6,height:6.66},{type:"rectangle",fill:Z("#cf58bc"),x:0,y:6.66,width:6,height:6.66},{type:"rectangle",fill:Z("#00B7CE"),x:0,y:6.66,width:6,height:6.66},{type:"rectangle",fill:Z("#000000"),x:0,y:6.66,width:6,height:6.66},{type:"rectangle",fill:Z("#708090"),x:0,y:6.66,width:6,height:6.66},{type:"rectangle",fill:Z("#993404"),x:0,y:6.66,width:6,height:6.66},{type:"rectangle",fill:Z("#a68028"),x:0,y:6.66,width:6,height:6.66}],k=function(t){function e(e){return t.call(this,e)||this}return P(e,t),Object.defineProperty(e.prototype,"generateOncoprintLegend",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t="http://www.w3.org/2000/svg",e=document.createElementNS(t,"svg");return W.forEach((function(a,i){var o=i%3*280,n=o+9,r=38*Math.floor(i/3),l=r+15,c=document.createElementNS(t,"g");a.stroke||(a.stroke=[0,0,0,0],a["stroke-width"]=0),c.appendChild(Object(w.shapeToSvg)(B,o,r)),c.appendChild(Object(w.shapeToSvg)(a,o,r));var g=document.createElementNS(t,"text");g.setAttributeNS(null,"x",n.toString()),g.setAttributeNS(null,"y",l.toString()),g.setAttributeNS(null,"font-size","12"),g.setAttributeNS(null,"font-family","Arial");var I=document.createTextNode(x[i]);g.appendChild(I),c.appendChild(g),e.appendChild(c)})),e.setAttribute("width","840"),e.setAttribute("height","175"),e.style.paddingTop="20px",e.setAttribute("xmlns",t),e}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return g.a.createElement(I.Modal,{bsSize:"lg",id:"cBioHelpModal",className:"pathwayMapper",show:this.props.show,onHide:function(){t.props.handleClose($e.CHELP)}},g.a.createElement(I.Modal.Header,{closeButton:!0},g.a.createElement(I.Modal.Title,null,"PathwayMapper cBioPortal Edition 2.2")),!this.props.patientView&&g.a.createElement(I.Modal.Body,null,g.a.createElement("p",{className:"leftText"},"PathwayMapper shows you your genes of interest with the alteration frequencies of selected genetic profiles of the chosen study overlaid on a TCGA pathway using a white to red color scale (the more frequently altered a gene is, the more red it's shown). All available TCGA pathways are ranked with the aim to choose the pathway that matches your interest the most. By default we display the pathway with highest ranking with the default ranking options but you may look at your genes of interest in the context of other pathways as well by choosing from the pathway table.",g.a.createElement("br",null),g.a.createElement("br",null),"Refer to the documentation ",g.a.createElement("a",{href:"https://github.com/iVis-at-Bilkent/pathway-mapper",target:"_blank"},"here")," for the notation used.",g.a.createElement("br",null),g.a.createElement("br",null),"To search for a particular pathway of your interest, use the search field on top of the pathway table. To switch to another pathway, click on the button in the associated row of the pathway table. Ranking criteria might be changed by changing the options at the bottom of the table.",g.a.createElement("br",null),g.a.createElement("br",null),"The buttons on top of the pathway are:",g.a.createElement("ul",null,g.a.createElement("table",{cellPadding:5},g.a.createElement("tr",null,g.a.createElement("td",null,g.a.createElement("img",{height:"22px",width:"22px",src:v.a}))," ",g.a.createElement("td",null,"Save as PNG")),g.a.createElement("tr",null,g.a.createElement("td",null,g.a.createElement("img",{height:"22px",width:"22px",src:S.a}))," ",g.a.createElement("td",null,"Save as SVG")),g.a.createElement("tr",null,g.a.createElement("td",null,g.a.createElement("img",{height:"22px",width:"22px",src:f.a}))," ",g.a.createElement("td",null,"Perform layout: Layout is recalculated taking current node positions into account")),g.a.createElement("tr",null,g.a.createElement("td",null,g.a.createElement("img",{height:"22px",width:"22px",src:z}))," ",g.a.createElement("td",null,"Add selected genes to query: You may select additional genes from the pathway by left clicking (Shift + left click to add more genes)")),g.a.createElement("tr",null,g.a.createElement("td",null,g.a.createElement("img",{height:"22px",width:"22px",src:Y}))," ",g.a.createElement("td",null,"Add all valid genes to query: All valid gene symbols will be added to the query; others will be ignored")),g.a.createElement("tr",null,g.a.createElement("td",null,g.a.createElement("img",{height:"22px",width:"22px",src:T.a}))," ",g.a.createElement("td",null,"Edit pathway: Edit both the topology and the geometry of the current pathway with the full blown PathwayMapper editor")))))),",",this.props.patientView&&g.a.createElement(I.Modal.Body,null,g.a.createElement("p",{className:"leftText"},"PathwayMapper shows you your genes of interest with the mutation types, copy number alterations and fusions of selected genetic profiles of the chosen study overlaid on a TCGA pathway using the OncoPrint color scheme. All available TCGA pathways are ranked with the aim to choose the pathway that matches your interest the most. By default we display the pathway with the highest number of genes of interest matching the ones in a pathway but you may look at your genes of interest in the context of other pathways as well by choosing from the pathway table.",g.a.createElement("br",null),g.a.createElement("br",null),"Refer to the documentation ",g.a.createElement("a",{href:"https://github.com/iVis-at-Bilkent/pathway-mapper",target:"_blank"},"here")," for the notation used.",g.a.createElement("br",null),g.a.createElement("br",null),"Genetic alteration legend:",g.a.createElement("br",null),g.a.createElement("div",{className:"container",style:{paddingLeft:"45px",width:"fit-content"},dangerouslySetInnerHTML:{__html:this.generateOncoprintLegend().outerHTML}}),g.a.createElement("p",{style:{paddingLeft:"45px"}},"Putative driver and unknown significance annotations are based on data from OncoKB and CancerHotspots.org."),g.a.createElement("br",null),"To search for a particular pathway of your interest, use the search field on top of the pathway table. To switch to another pathway, click on the button in the associated row of the pathway table.",g.a.createElement("br",null),g.a.createElement("br",null),"The buttons on top of the pathway are:",g.a.createElement("ul",null,g.a.createElement("table",{cellPadding:5},g.a.createElement("tr",null,g.a.createElement("td",null,g.a.createElement("img",{height:"22px",width:"22px",src:v.a}))," ",g.a.createElement("td",null,"Save as PNG")),g.a.createElement("tr",null,g.a.createElement("td",null,g.a.createElement("img",{height:"22px",width:"22px",src:S.a}))," ",g.a.createElement("td",null,"Save as SVG")),g.a.createElement("tr",null,g.a.createElement("td",null,g.a.createElement("img",{height:"22px",width:"22px",src:f.a}))," ",g.a.createElement("td",null,"Perform layout: Layout is recalculated taking current node positions into account")))))))}}),e}(g.a.Component),U=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),H=function(t){function e(e){return t.call(this,e)||this}return U(e,t),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return g.a.createElement(I.Modal,{show:this.props.show,onHide:function(){t.props.handleClose($e.CONFIRMATION)}},g.a.createElement(I.Modal.Header,{closeButton:!0},g.a.createElement(I.Modal.Title,null,"Confirmation")),g.a.createElement(I.Modal.Body,null,g.a.createElement("div",null,"All unsaved changes will be lost. Do you want to continue?")),g.a.createElement(I.Modal.Footer,null,g.a.createElement(I.Button,{onClick:function(){e.pendingFunction(),t.props.handleClose($e.CONFIRMATION)}},"Yes"),g.a.createElement(I.Button,{onClick:function(){t.props.handleClose($e.CONFIRMATION)}},"No")))}}),e}(g.a.Component),Q=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),K=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r};!function(t){t[t.GRID=0]="GRID",t[t.GUIDE=1]="GUIDE",t[t.NONE=2]="NONE"}(R||(R={}));var X,V,F,J=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"gridSize",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"guideColor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"defaultSettings",{enumerable:!0,configurable:!0,writable:!0,value:h.defaultGridGuideOptions}),Object.defineProperty(a,"enabledType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(a),a.gridSize=a.defaultSettings.gridSpacing,a.guideColor=a.defaultSettings.guidelinesStyle.strokeStyle,a}return Q(e,t),Object.defineProperty(e.prototype,"setEnabledType",{enumerable:!1,configurable:!0,writable:!0,value:function(t){t!==this.enabledType?this.enabledType=t:this.enabledType=R.NONE}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return g.a.createElement(I.Modal,{dialogClassName:"gridModal",show:this.props.show,onShow:function(){t.enabledType=t.props.pathwayActions.enabledType},onHide:function(){t.props.handleClose($e.GRID)}},g.a.createElement(I.Modal.Header,{closeButton:!0},g.a.createElement(I.Modal.Title,null,"Grid Settings")),g.a.createElement(I.Modal.Body,null,g.a.createElement(I.Form,{id:"gripOptionsForm",className:"leftText"},g.a.createElement(I.Row,null,g.a.createElement(I.Col,{sm:8},g.a.createElement(I.ControlLabel,null,"Enable Grids:")),g.a.createElement(I.Col,{sm:4},g.a.createElement(I.Checkbox,{checked:this.enabledType===R.GRID,onChange:function(){t.setEnabledType(R.GRID)}}))),g.a.createElement(I.Row,null,g.a.createElement(I.Col,{sm:8},g.a.createElement(I.ControlLabel,null,"Enable Guidelines:")),g.a.createElement(I.Col,{sm:4},g.a.createElement(I.Checkbox,{checked:this.enabledType===R.GUIDE,onChange:function(){t.setEnabledType(R.GUIDE)}}))),g.a.createElement(I.Row,null,g.a.createElement(I.Col,{sm:8},g.a.createElement(I.ControlLabel,null,"Grid Size:")),g.a.createElement(I.Col,{sm:4},g.a.createElement(I.FormControl,{type:"text",value:this.gridSize,onChange:function(e){t.gridSize=e.target.value}}))),g.a.createElement(I.Row,{style:{marginTop:"10px"}},g.a.createElement(I.Col,{sm:8},g.a.createElement(I.ControlLabel,null,"Guideline Color:")),g.a.createElement(I.Col,{sm:4},g.a.createElement("input",{id:"guidelineColor",type:"color",className:"form-control",value:this.guideColor,onChange:function(e){t.guideColor=e.target.value}}))))),g.a.createElement(I.Modal.Footer,null,g.a.createElement(I.Button,{onClick:function(){t.props.pathwayActions.enabledType=t.enabledType,t.props.pathwayActions.adjustGridSettings(t.gridSize,t.guideColor),t.props.pathwayActions.enabledType===R.GRID?t.props.pathwayActions.toggleGrid(!0):t.props.pathwayActions.enabledType===R.GUIDE?t.props.pathwayActions.toggleGuide(!0):t.props.pathwayActions.toggleGrid(!1),t.props.handleClose($e.GRID)}},"Save")))}}),K([r.observable],e.prototype,"gridSize",void 0),K([r.observable],e.prototype,"guideColor",void 0),K([r.observable],e.prototype,"enabledType",void 0),e=K([l.observer],e)}(g.a.Component),q=function(){function t(){}return Object.defineProperty(t,"createGraphHierarchy",{enumerable:!1,configurable:!0,writable:!0,value:function(t){for(var e=[],a={},i=0,o=t.length;i0?a[l.parent().id()].childNodes.push(l):e.push(l)}return e}}),Object.defineProperty(t,"createGraphHierarchyRealTime",{enumerable:!1,configurable:!0,writable:!0,value:function(t){for(var e=[],a={},i=0,o=t.length;i0||""!==a.outerHTML?i.GENOMICDATA_LABEL_Y_OFFSET:0;if(i.svg.appendChild(i.createNodeLabel(t,n)),e)for(;e.length>0;){var l=e[0],c=t.position(),g=l.getAttribute("x"),I=l.getAttribute("y");l.setAttribute("x",c.x-t.width()/2+parseFloat(g)),l.setAttribute("y",c.y-t.height()/2+parseFloat(I)),i.svg.appendChild(l)}else if(""!==a.outerHTML){c=t.position();var d=parseInt(a.getAttribute("width")),u=parseInt(a.getAttribute("height")),s=c.y+t.height()/2-(u+8);a.setAttribute("x",c.x-d/2),a.setAttribute("y",s),i.svg.appendChild(a)}if(t.childNodes)for(var C in t.childNodes)r(t.childNodes[C])};for(var l in n){var c=n[l];r(c)}return e.forEach((function(t){i.drawEdge(t)})),this.svg.outerHTML}}),Object.defineProperty(t.prototype,"drawEdge",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=t.sourceEndpoint(),a=t.targetEndpoint(),i=t.style("target-arrow-shape"),o=t.style("line-style"),n=t.style("curve-style"),r="segments"===n?t.segmentPoints():t.controlPoints(),l=this.createEdgeLabel(t);l&&this.svg.appendChild(l);var c={x:e.x,y:e.y},g={x:a.x,y:a.y};r&&r.length>0&&(c={x:r[r.length-1].x,y:r[r.length-1].y});var I=this.unitVector({x:a.x-c.x,y:a.y-c.y}),d=this.scale(I,-1),u=a.x,s=a.y;if("triangle"===i){u=a.x+this.TRIANGLE_ARROW_HEAD_HEIGHT*d.x,s=a.y+this.TRIANGLE_ARROW_HEAD_HEIGHT*d.y;var C=this.rotateVector(I,Math.PI/2),A=this.rotateVector(I,-Math.PI/2);C=this.scale(C,this.TRIANGLE_ARROW_HEAD_WIDTH/2),A=this.scale(A,this.TRIANGLE_ARROW_HEAD_WIDTH/2);var M=u+C.x,p=s+C.y;g={x:(M+(b=u+A.x))/2,y:(p+(y=s+A.y))/2};var N=document.createElementNS(this.SVGNameSpace,"polygon");N.setAttribute("points",M+","+p+","+b+","+y+","+a.x+","+a.y),this.svg.appendChild(N)}else if("tee"===i){u=a.x,s=a.y;C=this.rotateVector(I,Math.PI/2),A=this.rotateVector(I,-Math.PI/2);C=this.scale(C,this.T_ARROW_HEAD_HEIGHT/2),A=this.scale(A,this.T_ARROW_HEAD_HEIGHT/2);var b,y;M=u+C.x,p=s+C.y;g={x:(M+(b=u+A.x))/2,y:(p+(y=s+A.y))/2};var h=document.createElementNS(this.SVGNameSpace,"line");h.setAttribute("x1",M),h.setAttribute("y1",p),h.setAttribute("x2",b),h.setAttribute("y2",y),h.setAttribute("stroke-width",this.T_ARROW_HEAD_WIDTH.toString()),h.setAttribute("stroke","black"),this.svg.appendChild(h)}if(!r||r.length<1){var E=document.createElementNS(this.SVGNameSpace,"line");E.setAttribute("x1",e.x),E.setAttribute("y1",e.y),E.setAttribute("x2",g.x),E.setAttribute("y2",g.y),E.setAttribute("stroke-width",this.EDGE_WIDTH.toString()),E.setAttribute("stroke","black"),"dashed"===o&&E.setAttribute("stroke-dasharray",this.DASH_PARAMETERS),this.svg.appendChild(E)}else if("unbundled-bezier"===n||"bezier"===n){for(var m=document.createElementNS(this.SVGNameSpace,"path"),j=[],w=0;wa[a.length-1].value)return{lower:{value:a[a.length-1].value,color:a[a.length-1].color},upper:{value:1/0,color:a[a.length-1].color}};for(var i=0;i=a[i].value&&e0&&(d+=-1*u,u=0),I=function(t,e,a,i,o){var n=Math.log(1+i),r=Math.log(1+a),l=(Math.log(1+(o>=0?o:-1*o))-r)/(n-r)*(o>=0?.8:1.2);return{r:t.r+l*(e.r-t.r),g:t.g+l*(e.g-t.g),b:t.b+l*(e.b-t.b)}}(C,s,u,d,Number(n))}var A="";if(n){A="rgb("+Math.round(I.r)+", "+Math.round(I.g)+", "+Math.round(I.b)+")",(y=document.createElementNS(a,"rect")).setAttribute("x",t),y.setAttribute("y",e),y.setAttribute("width",i),y.setAttribute("height",o),y.setAttribute("style","stroke-width:1;stroke:rgb(0,0,0);opacity:1;fill:"+A+";"),"-"===n[0]&&(n=n.substr(1));var M=n<.5&&n>0?"<0.5":Number(n).toFixed(1),p=-101==n?"N/P":M+"%",N=i/2-4*p.length,b=document.createElementNS(a,"text");b.setAttribute("x",t+N),b.setAttribute("y",e+o/2+14/3),b.setAttribute("font-family","Arial"),b.setAttribute("font-size","14"),b.innerHTML=p,r.appendChild(y),r.appendChild(b)}else{var y;A="rgb(210,210,210)",(y=document.createElementNS(a,"rect")).setAttribute("x",t),y.setAttribute("y",e),y.setAttribute("width",i),y.setAttribute("height",o),y.setAttribute("style","stroke-width:1;stroke:rgb(0,0,0);opacity:1;fill:"+A+";"),r.appendChild(y)}}return l}}),Object.defineProperty(t.prototype,"getRequiredWidthForGenomicData",{enumerable:!1,configurable:!0,writable:!0,value:function(t){return 150+35*(t>3?t-3:0)}}),Object.defineProperty(t.prototype,"updateColorScheme",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.colorScheme=t}}),Object.defineProperty(t.prototype,"showGenomicData",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e=this,a=this.countVisibleGenomicDataByType();a<1?this.hideGenomicData():(this.cy.nodes('[type="GENE"]').forEach((function(e){e.data("w",t.getRequiredWidthForGenomicData(a))})),this.cy.style().selector('node[type="GENE"]').style("text-margin-y",(function(t){return t.data("name")in e.genomicDataMap?-15:0})).style("background-image",(function(t){var a=encodeURIComponent(e.generateSVGForNode(t).outerHTML);return"undefined"===a?"none":"data:image/svg+xml;utf8,"+a})).update())}}),Object.defineProperty(t.prototype,"parseGenomicData",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.genomicDataMap=this.genomicDataMap||{},this.visibleGenomicDataMapByType=this.visibleGenomicDataMapByType||{},this.groupedGenomicDataMap=this.groupedGenomicDataMap||{};for(var a=[],i=t.split("\n"),o=i[0].split("\t"),n=1;n12?o-12:0),c=l-10;r.setAttribute("width",l),r.setAttribute("height",n.h),r.setAttribute("xmlns",a);var g={w:c,h:25,x:l/2-c/2,y:n.h/2+12.5-18},I=0;for(var d in e[i]){var u=e[i],s=d;if(this.visibleGenomicDataMapByType[i]){var C=this.getOncoprintColors(s);void 0!==u[s]?A(g.x+I*g.w/o,g.y,g.w/o,g.h,100,r,s,C):A(g.x+I*g.w/o,g.y,g.w/o,g.h,null,r,"",null),I++}}function A(t,e,i,o,n,r,l,c){if(n){var g=document.createElementNS(a,"rect");g.setAttribute("x",t),g.setAttribute("y",e),g.setAttribute("width",i),g.setAttribute("height",o),g.setAttribute("style","stroke-width:1;stroke:rgb(0,0,0);opacity:1;fill:"+c+";");var I=i/2-16,d=document.createElementNS(a,"text");"rgb(0,0,0)"===c&&d.setAttribute("fill","white"),d.setAttribute("x",t+I),d.setAttribute("y",e+o/2+14/3),d.setAttribute("font-family","Arial"),d.setAttribute("font-size","14"),d.innerHTML=l.substring(0,4),r.appendChild(g),r.appendChild(d)}else c="rgb(210,210,210)"}return r}}),Object.defineProperty(t.prototype,"generateOncoprintForPatientNode",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this.patientData[t.data("name")],a="http://www.w3.org/2000/svg",i=document.createElementNS(a,"svg");if(!e)return{outerHTML:""};var o=new w.GeneticAlterationRuleSet(e.geneticTrackRuleSetParams),n=o.getUniversalShapes(6,23),r=o.getSpecificShapesForDatum(e.geneticTrackData,6,23).map((function(t){return n.concat(t)}));return r.forEach((function(t,e){var o=9*e,n=document.createElementNS(a,"g");t.forEach((function(t){return n.appendChild(Object(w.shapeToSvg)(t,o,8))})),i.appendChild(n)})),i.setAttribute("width",(9*r.length).toString()),i.setAttribute("height",31..toString()),i.setAttribute("xmlns",a),i}}),Object.defineProperty(t.prototype,"getCNADisplayString",{enumerable:!1,configurable:!0,writable:!0,value:function(t){return{"-2":"HOMODELETED","-1":"HETLOSS",1:"GAIN",2:"AMPLIFIED"}[t]}}),Object.defineProperty(t.prototype,"generateSvgIconForSample",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){return''+e+""}}),Object.defineProperty(t.prototype,"generateHTMLContentForNodeTooltip",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){var a=this,i=e.sampleColors,o=e.sampleIndex,n=e[t.data("name")],r=et()("
");return r.css({"max-width":"200px","max-height":"200px","word-wrap":"break-word","overflow-y":"auto"}),n.geneticTrackData.forEach((function(t,e){var n=t.sample,l=i[n],c=(o[n]+1).toString(),g=a.generateSvgIconForSample(l,c),I=e>0?"10px":"0px",d=et()("
");d.css({"margin-top":I});var u=t.data,s=[],C=[],A=[];u.forEach((function(e){var i=e.gene.hugoGeneSymbol;if(t.disp_mut&&e.proteinChange&&"Fusion"!==e.mutationType){var o=e.proteinChange;s.push({gene:i,proteinChange:o})}if(t.disp_cna&&e.alteration){var n=e.alteration,r=a.getCNADisplayString(n);C.push({gene:i,cnaLabel:r})}if(t.disp_fusion&&e.proteinChange&&"Fusion"===e.mutationType){o=e.proteinChange;A.push({gene:i,proteinChange:o})}}));var M=s.length>0?"Mutation: ":"",p=C.length>0?"CNA: ":"",N=A.length>0?"Fusion: ":"";s.forEach((function(t,e){M+=""+t.gene+" "+t.proteinChange+"",e!==s.length-1?M+=", ":M+="
"})),C.forEach((function(t,e){p+=""+t.gene+" "+t.cnaLabel+"",e!==C.length-1?p+=", ":p+="
"})),A.forEach((function(t,e){N+=""+t.gene+" "+t.proteinChange+"",e!==A.length-1?N+=", ":N+="
"}));var b=" "+n+"
";d.append(et()("
"+g+b+M+p+N+NaN)),r.append(d)})),r}}),t}()),nt=function(){return(nt=Object.assign||function(t){for(var e,a=1,i=arguments.length;a=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},lt=a(6),ct=function(){function t(e,a,i,o,n,l,c,g,I){Object.defineProperty(this,"cy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"genomicDataOverlayManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"edgeEditing",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"selectedNodeStack",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"layoutProperties",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"FIT_CONSTANT",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"observers",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"svgExporter",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"undoRedoManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isCbioPortal",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isCollaborative",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"shareDBManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"portalAccessor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"viewUtilities",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"profiles",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"genomicDataOverlayColorScheme",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"colorSchemeChangeCallback",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(this),this.cy=i,this.isCollaborative=e,this.isCbioPortal=o,this.profiles=c,this.genomicDataOverlayColorScheme=g,this.colorSchemeChangeCallback=I;var d={bendPositionsFunction:function(t){return t.data("bendPointPositions")},controlPositionsFunction:function(t){return t.data("controlPointPositions")},undoable:!0,anchorShapeSizeFactor:6,enabled:!this.isCbioPortal,handleReconnectEdge:this.isCollaborative?this.reconnectEdge.bind(this):void 0,enableMultipleAnchorRemovalOption:!0};this.edgeEditing=this.cy.edgeEditing(d),this.portalAccessor=l,this.isCollaborative&&(this.shareDBManager=a),this.FIT_CONSTANT=50,this.layoutProperties=lt.clone(t.defaultLayoutProperties),this.observers=[],this.genomicDataOverlayManager=new ot(this.cy),this.svgExporter=new _(this.edgeEditing,this),this.selectedNodeStack={},this.undoRedoManager=n,this.undoRedoManager.action("changePositions",this.doChangePosition,this.undoChangePosition),this.undoRedoManager.action("changeNodeSize",this.doChangeNodeSize,this.undoChangeNodeSize),this.undoRedoManager.action("changeCompoundSize",this.doChangeCompoundSize,this.undoChangeCompoundSize),this.undoRedoManager.action("changeName",this.doChangename,this.undoChangeName),this.undoRedoManager.action("hideNode",this.doHide,this.undoHide),this.undoRedoManager.action("showAllNodes",this.doShow,this.undoShow),this.undoRedoManager.action("highlightInvalidGenes",this.doHighlightInvalidGenes,this.undoHighlightInvalidGenes),this.undoRedoManager.action("removeHighlightInvalidGenes",this.undoHighlightInvalidGenes,this.doHighlightInvalidGenes),this.undoRedoManager.action("highlightOthers",this.doHighlight,this.undoHighlight),this.undoRedoManager.action("removeOtherHighlight",this.undoHighlight,this.doHighlight)}return Object.defineProperty(t.prototype,"setProfile",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.profiles[t]=e}}),Object.defineProperty(t.prototype,"addProfile",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.profiles.push(t)}}),Object.defineProperty(t.prototype,"removeProfiles",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.profiles.length=0}}),Object.defineProperty(t.prototype,"setGenomicDataOverlayColorScheme",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.genomicDataOverlayColorScheme=t}}),Object.defineProperty(t.prototype,"setViewUtilities",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.viewUtilities=t}}),Object.defineProperty(t.prototype,"getGenomicDataOverlayColorScheme",{enumerable:!1,configurable:!0,writable:!0,value:function(){return this.genomicDataOverlayColorScheme}}),Object.defineProperty(t.prototype,"handleChangePositionByAlignment",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.isCollaborative?this.shareDBManager.changeElementsPositionByAlignment(t):this.undoRedoManager.do("changePositions",t)}}),Object.defineProperty(t.prototype,"doChangePosition",{enumerable:!1,configurable:!0,writable:!0,value:function(t){for(var e=[],a=0;a0&&(n.forEach((function(t){a[t.id()]=!0})),o=o.union(t(n))),o=o.union(e.remove()),i.cy.nodes().updateCompoundBounds(),o}(t);this.undoRedoManager.do("remove",o);for(var n=0;n0&&(r.data.source=g.id()),c.length>0&&(r.data.target=c.id()),!(c.length<0&&g.length<0)){var I=this.cy.filter('edge[source = "'+g.id()+'"][target = "'+c.id()+'"]'),d=!1;I.forEach((function(t){return t.data().type!=r.data.type||(d=!0,!1)})),d||(delete r.data.id,i.push(r))}}this.cy.add(i)}}),Object.defineProperty(t.prototype,"fitGraph",{enumerable:!1,configurable:!0,writable:!0,value:function(){if(this.isCollaborative){this.cy.fit(this.FIT_CONSTANT);var t={zoomLevel:this.cy.zoom(),panLevel:this.cy.pan()};this.updateGlobalOptions(t)}else this.cy.fit(this.FIT_CONSTANT)}}),Object.defineProperty(t.prototype,"loadFile",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.isCollaborative?this.loadfileShareDB(t,e):this.loadFileCy(t,e),this.edgeEditing.initAnchorPoints(this.cy.edges()),this.fitGraph()}}),Object.defineProperty(t.prototype,"loadFileCy",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.removeElementCy(this.cy.elements()),this.addNodesCy(t),this.addEdgesCy(e)}}),Object.defineProperty(t.prototype,"loadfileShareDB",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.shareDBManager.loadGraph(t,e)}}),Object.defineProperty(t.prototype,"removeAllElements",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.isCollaborative?this.shareDBManager.removeAllElements():this.cy.remove(this.cy.elements())}}),Object.defineProperty(t.prototype,"updateHighlight",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){e?this.undoRedoManager.do("highlightOthers",t):this.undoRedoManager.do("removeOtherHighlight",t)}}),Object.defineProperty(t.prototype,"updateVisibility",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){e?this.viewUtilities.hide(t):this.viewUtilities.show(t)}}),Object.defineProperty(t.prototype,"updateElementCallback",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=t.oi,a=e.id,i=this.cy.$("#"+a);if(this.changeNameCy(i,e.name),i.isNode())i.isParent()?(i.style("min-width",e.minWidth),i.style("min-width-bias-left",e.minWidthBiasLeft),i.style("min-width-bias-right",e.minWidthBiasRight),i.style("min-height",e.minHeight),i.style("min-height-bias-top",e.minHeightBiasTop),i.style("min-height-bias-bottom",e.minHeightBiasBottom)):(i.data("w",e.w),i.data("h",e.h),i.position({x:e.x,y:e.y})),this.updateVisibility(i,e.isHidden),this.updateHighlight(i,e.isHighlighted),e.isInvalidGene?this.doHighlightInvalidGenes(i):this.undoHighlightInvalidGenes(i);else if(i.isEdge()){var o=e.pubmedIDs;i.data("pubmedIDs",o),this.updateHighlight(i,e.isHighlighted);var n=e.anchorPoints;if(e.source!==i.source().id()||e.target!==i.target().id()){var r={source:e.source,target:e.target};i.move(r),this.edgeEditing.initAnchorPoints(i)}else{if("bezier"===e.edgeCurveStyle){var l=this.edgeEditing.getAnchorsAsArray(i);if(l&&l.length>0)for(var c=0;c=6?a.visibilityMap[t]=!1:a.visibilityMap[t]&&i++})),this.shareDBManager.addGenomicVisibilityData(a.visibilityMap)}else this.genomicDataOverlayManager.addGenomicDataLocally(t,e)}}),Object.defineProperty(t.prototype,"adjustVisibilityShareDB",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){var a=this.profiles.map((function(t){return t.profileId})).indexOf(t);this.setProfile(a,nt(nt({},this.profiles[a]),{enabled:e}))}}),Object.defineProperty(t.prototype,"addToProfiles",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.profiles.map((function(t){return t.profileId})).includes(t)||this.addProfile({profileId:t,enabled:!0})}}),Object.defineProperty(t.prototype,"addPortalGenomicData",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){if(this.isCollaborative){var a=this.genomicDataOverlayManager.preparePortalGenomicDataShareDB(t);this.shareDBManager.addGenomicData(a.genomicDataMap),this.shareDBManager.groupGenomicData(Object.keys(a.visibilityMap),e),this.shareDBManager.addGenomicVisibilityData(a.visibilityMap)}else this.genomicDataOverlayManager.addPortalGenomicData(t,e)}}),Object.defineProperty(t.prototype,"shareDBGenomicDataHandler",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e="od"===Object.keys(t)[1],a=t.oi,i=t.p[1];e?this.genomicDataOverlayManager.removeGenomicDataWithGeneSymbol(i):this.genomicDataOverlayManager.addGenomicDataWithGeneSymbol(i,a)}}),Object.defineProperty(t.prototype,"shareDBGenomicDataGroupChangeHandler",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this,a="od"===Object.keys(t)[1],i=t.oi,o=t.p[1];a||(this.genomicDataOverlayManager.addGenomicGroupData(o,i),1!==i.length&&console.log("Grouped genomic data expected to be of length 1"),i.forEach((function(t){e.addToProfiles(t)}))),this.genomicDataOverlayManager.showGenomicData(),this.genomicDataOverlayManager.notifyObservers()}}),Object.defineProperty(t.prototype,"shareDBGenomicDataVisibilityHandler",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=t.oi,a=t.p[1];"od"===Object.keys(t)[1]?(this.genomicDataOverlayManager.removeGenomicVisData(),this.removeProfiles()):(this.genomicDataOverlayManager.addGenomicVisData(a,e),this.adjustVisibilityShareDB(a,e)),this.genomicDataOverlayManager.showGenomicData(),this.genomicDataOverlayManager.notifyObservers()}}),Object.defineProperty(t.prototype,"updateGenomicDataColorSchemeHandler",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=t.li;this.setGenomicDataOverlayColorScheme(e),this.colorSchemeChangeCallback(e),this.genomicDataOverlayManager.updateColorScheme(e),this.genomicDataOverlayManager.showGenomicData(),this.genomicDataOverlayManager.notifyObservers()}}),Object.defineProperty(t.prototype,"resizeNodesToContent",{enumerable:!1,configurable:!0,writable:!0,value:function(t){if(this.isCollaborative){var e=this.genomicDataOverlayManager.countVisibleGenomicDataByType(),a=148+36*(e-3),i=this.shareDBManager;t.forEach((function(t){if(t.isParent())i.resizeCompound(t,0,0,0,0,0,0);else{var o=150,n=52;if(""!=t.data("name"))o=10*t.style("label").length+6,n=24;"PROCESS"!==t.data("type")&&e>0&&(n=52,e<4?150>o&&(o=150):a>o&&(o=a)),i.setSizeOfElement(t,o,n)}}))}else{var o=this.cy.undoRedo(),n=[],r=this.genomicDataOverlayManager.countVisibleGenomicDataByType(),l=150+36*(r-3);t.forEach((function(t){if(t.isParent()){i={ele:t,oldMinWidth:t.style("min-width"),newMinWidth:0,oldMinWidthBiasLeft:t.style("min-width-bias-left"),newMinWidthBiasLeft:0,oldMinWidthBiasRight:t.style("min-width-bias-right"),newMinWidthBiasRight:0,oldMinHeight:t.style("min-height"),newMinHeight:0,oldMinHeightBiasTop:t.style("min-height-bias-top"),newMinHeightBiasTop:0,oldMinHeightBiasBottom:t.style("min-height-bias-bottom"),newMinHeightBiasBottom:0};n.push({name:"changeCompoundSize",param:i})}else{var e=150,a=52;if(""!=t.data("name"))e=6*t.style("label").length+24,a=24;"PROCESS"!==t.data("type")&&r>0&&(a=52,r<4?150>e&&(e=150):l>e&&(e=l));var i={ele:t,oldWidth:t.width(),newWidth:e,oldHeight:t.height(),newHeight:a};n.push({name:"changeNodeSize",param:i})}})),o.do("batch",n)}this.cy.nodeEditing("get").refreshGrapples()}}),Object.defineProperty(t,"defaultLayoutProperties",{enumerable:!0,configurable:!0,writable:!0,value:{name:"fcose",nodeRepulsion:4500,idealEdgeLength:50,edgeElasticity:.45,nestingFactor:.1,gravity:.25,numIter:2500,tile:!0,animate:!0,randomize:!1,gravityRangeCompound:1.5,gravityCompound:1,gravityRange:3.8,tilingPaddingVertical:10,tilingPaddingHorizontal:10,initialEnergyOnIncremental:.5,animationDuration:2e3,animationEasing:"cubic-bezier(0.17,0.72,0.41,0.98)"}}),rt([r.observable],t.prototype,"profiles",void 0),rt([r.observable],t.prototype,"genomicDataOverlayColorScheme",void 0),rt([r.action.bound],t.prototype,"setProfile",null),rt([r.action.bound],t.prototype,"addProfile",null),rt([r.action.bound],t.prototype,"removeProfiles",null),rt([r.action.bound],t.prototype,"setGenomicDataOverlayColorScheme",null),rt([n.a],t.prototype,"setViewUtilities",null),rt([n.a],t.prototype,"doHide",null),rt([n.a],t.prototype,"undoHide",null),rt([n.a],t.prototype,"doShow",null),rt([n.a],t.prototype,"undoShow",null),rt([n.a],t.prototype,"updateVisibility",null),t}(),gt=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),It=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},dt=function(t){function e(e){var i=t.call(this,e)||this;return Object.defineProperty(i,"internalLayoutProperties",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(i),i.internalLayoutProperties=y.a.clone(ct.defaultLayoutProperties),a.layoutProperties=y.a.clone(ct.defaultLayoutProperties),i}var a;return gt(e,t),a=e,Object.defineProperty(e.prototype,"updateInternalLayoutProperty",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.internalLayoutProperties[t]=e}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return g.a.createElement(I.Modal,{id:"layoutPropertiesDiv",show:this.props.show,onEnter:function(){t.internalLayoutProperties=y.a.clone(a.layoutProperties)},onHide:function(){t.internalLayoutProperties=y.a.clone(a.layoutProperties),t.props.handleClose($e.LAYOUT)}},g.a.createElement(I.Modal.Header,{closeButton:!0},g.a.createElement(I.Modal.Title,null,"Layout Properties")),g.a.createElement(I.Modal.Body,{id:"layoutPropsForm",className:"leftText"},g.a.createElement(I.Form,null,g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{className:"control-label",sm:6},"Node Repulsion:"),g.a.createElement(I.Col,{sm:6},g.a.createElement(I.FormControl,{type:"number",value:this.internalLayoutProperties.nodeRepulsion.toString(),onChange:function(e){t.updateInternalLayoutProperty("nodeRepulsion",Number(e.target.value))}}))),g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{className:"rightAlignText",sm:6},g.a.createElement(I.ControlLabel,null,"Ideal Edge Length:")),g.a.createElement(I.Col,{sm:6},g.a.createElement(I.FormControl,{type:"number",value:this.internalLayoutProperties.idealEdgeLength.toString(),onChange:function(e){t.updateInternalLayoutProperty("idealEdgeLength",Number(e.target.value))}}))),g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{className:"rightAlignText",sm:6},g.a.createElement(I.ControlLabel,null,"Edge Elasticity:")),g.a.createElement(I.Col,{sm:6},g.a.createElement(I.FormControl,{type:"number",value:this.internalLayoutProperties.edgeElasticity.toString(),onChange:function(e){t.updateInternalLayoutProperty("edgeElasticity",Number(e.target.value))}}))),g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{className:"rightAlignText",sm:6},g.a.createElement(I.ControlLabel,null,"Nesting Factor:")),g.a.createElement(I.Col,{sm:6},g.a.createElement(I.FormControl,{type:"number",value:this.internalLayoutProperties.nestingFactor.toString(),onChange:function(e){t.updateInternalLayoutProperty("nestingFactor",Number(e.target.value))}}))),g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{className:"rightAlignText",sm:6},g.a.createElement(I.ControlLabel,null,"Gravity:")),g.a.createElement(I.Col,{sm:6},g.a.createElement(I.FormControl,{type:"number",value:this.internalLayoutProperties.gravity.toString(),onChange:function(e){t.updateInternalLayoutProperty("gravity",Number(e.target.value))}}))),g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{className:"rightAlignText",sm:6},g.a.createElement(I.ControlLabel,null,"Gravity Range:")),g.a.createElement(I.Col,{sm:6},g.a.createElement(I.FormControl,{type:"number",value:this.internalLayoutProperties.gravityRange.toString(),onChange:function(e){t.updateInternalLayoutProperty("gravityRange",Number(e.target.value))}}))),g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{className:"rightAlignText",sm:6},g.a.createElement(I.ControlLabel,null,"Compound Gravity:")),g.a.createElement(I.Col,{sm:6},g.a.createElement(I.FormControl,{type:"number",value:this.internalLayoutProperties.gravityCompound.toString(),onChange:function(e){t.updateInternalLayoutProperty("gravityCompound",Number(e.target.value))}}))),g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{className:"rightAlignText",sm:6},g.a.createElement(I.ControlLabel,null,"Compound Gravity Range:")),g.a.createElement(I.Col,{sm:6},g.a.createElement(I.FormControl,{type:"number",value:this.internalLayoutProperties.gravityRangeCompound.toString(),onChange:function(e){t.updateInternalLayoutProperty("gravityRangeCompound",Number(e.target.value))}}))),g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{className:"rightAlignText",sm:6},g.a.createElement(I.ControlLabel,null,"Number of Iterations:")),g.a.createElement(I.Col,{sm:6},g.a.createElement(I.FormControl,{type:"number",value:this.internalLayoutProperties.numIter.toString(),onChange:function(e){t.updateInternalLayoutProperty("numIter",Number(e.target.value))}}))),g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{className:"rightAlignText",sm:6},g.a.createElement(I.ControlLabel,null,"Tiling Vertical Padding:")),g.a.createElement(I.Col,{sm:6},g.a.createElement(I.FormControl,{type:"number",value:this.internalLayoutProperties.tilingPaddingVertical.toString(),onChange:function(e){t.updateInternalLayoutProperty("tilingPaddingVertical",Number(e.target.value))}}))),g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{className:"rightAlignText",sm:6},g.a.createElement(I.ControlLabel,null,"Tiling Horizontal Padding:")),g.a.createElement(I.Col,{sm:6},g.a.createElement(I.FormControl,{type:"number",value:this.internalLayoutProperties.tilingPaddingHorizontal.toString(),onChange:function(e){t.updateInternalLayoutProperty("tilingPaddingHorizontal",Number(e.target.value))}}))),g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{className:"rightAlignText",sm:6},g.a.createElement(I.ControlLabel,null,"Tile Disconnected:")),g.a.createElement(I.Col,{sm:6},g.a.createElement(I.Checkbox,{className:"layProps",checked:this.internalLayoutProperties.tile,onChange:function(e){t.updateInternalLayoutProperty("tile",!t.internalLayoutProperties.tile)}}))),g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{className:"control-label",sm:6},"Animate:"),g.a.createElement(I.Col,{sm:6},g.a.createElement(I.Checkbox,{className:"layProps",checked:this.internalLayoutProperties.animate,onChange:function(e){t.updateInternalLayoutProperty("animate",!t.internalLayoutProperties.animate)}}))),g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{className:"rightAlignText",sm:6},g.a.createElement(I.ControlLabel,null,"Incremental:")),g.a.createElement(I.Col,{sm:6},g.a.createElement(I.Checkbox,{className:"layProps",checked:!this.internalLayoutProperties.randomize,onChange:function(e){t.updateInternalLayoutProperty("randomize",!t.internalLayoutProperties.randomize)}}))),g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{className:"rightAlignText",sm:6},g.a.createElement(I.ControlLabel,null,"Incremental Cooling Factor:")),g.a.createElement(I.Col,{sm:6},g.a.createElement(I.FormControl,{type:"number",value:this.internalLayoutProperties.initialEnergyOnIncremental.toString(),onChange:function(e){t.updateInternalLayoutProperty("initialEnergyOnIncremental",Number(e.target.value))}}))))),g.a.createElement(I.Modal.Footer,null,g.a.createElement(I.Button,{onClick:function(){a.layoutProperties=y.a.clone(t.internalLayoutProperties),t.props.pathwayActions.setLayoutProperties(a.layoutProperties),t.props.handleClose($e.LAYOUT)}},"Save"),g.a.createElement(I.Button,{onClick:function(){t.internalLayoutProperties=y.a.clone(ct.defaultLayoutProperties),a.layoutProperties=y.a.clone(t.internalLayoutProperties),t.props.pathwayActions.setLayoutProperties(t.internalLayoutProperties)}},"Default")))}}),It([r.observable],e.prototype,"internalLayoutProperties",void 0),It([r.action.bound],e.prototype,"updateInternalLayoutProperty",null),e=a=It([l.observer],e)}(g.a.Component),ut=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),st=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},Ct=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"pathwayInfo",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),a}return ut(e,t),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return this.pathwayInfo=this.props.pathwayActions.getPathwayInfo,g.a.createElement(I.Modal,{id:"pathwayDetailsDiv",show:this.props.show,onHide:function(){t.props.handleClose(4)}},g.a.createElement(I.Modal.Header,{closeButton:!0},g.a.createElement(I.Modal.Title,null,"Pathway Properties")),g.a.createElement(I.Modal.Body,null,g.a.createElement(I.Form,{id:"pathwayDetailsForm"},g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{style:{textAlign:"left"},sm:4},g.a.createElement(I.ControlLabel,null,"Pathway Title:")),g.a.createElement(I.Col,{sm:8},g.a.createElement(I.FormControl,{type:"text",onChange:function(e){t.pathwayInfo.pathwayTitle=e.target.value},value:this.pathwayInfo.pathwayTitle}))),g.a.createElement(I.InputGroup,null,g.a.createElement(I.Col,{style:{textAlign:"left"},sm:4},g.a.createElement(I.ControlLabel,null,"Pathway Description:")),g.a.createElement(I.Col,{sm:8},g.a.createElement("textarea",{className:"form-control",rows:3,onChange:function(e){t.pathwayInfo.pathwayDetails=e.target.value},value:this.pathwayInfo.pathwayDetails}))))),g.a.createElement(I.Modal.Footer,null,g.a.createElement(I.Button,{onClick:function(){t.props.pathwayActions.setPathwayInfo(t.pathwayInfo),t.props.handleClose($e.PW_DETAILS)}},"Save")))}}),e=st([l.observer],e)}(g.a.Component),At=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),Mt=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},pt=a(60),Nt=a(61),bt=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"colorMappings",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"showUniqueValuesWarningModal",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(a),a.initColorMappings(),a}return At(e,t),Object.defineProperty(e.prototype,"componentDidUpdate",{enumerable:!1,configurable:!0,writable:!0,value:function(t){!1===t.show&&!0===this.props.show&&this.initColorMappings()}}),Object.defineProperty(e.prototype,"initColorMappings",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.colorMappings=Object.entries(this.props.colorValueMapping).map((function(t){return{value:t[0],color:t[1]}})).sort((function(t,e){return Number(t.value)-Number(e.value)}))}}),Object.defineProperty(e.prototype,"handleColorChange",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.colorMappings[t].color=e}}),Object.defineProperty(e.prototype,"handleValueChange",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.colorMappings[t].value=e}}),Object.defineProperty(e.prototype,"addDefaultColorMapping",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.colorMappings.push({value:"0",color:"#ffffff"})}}),Object.defineProperty(e.prototype,"removeColorMapping",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.colorMappings.splice(t,1)}}),Object.defineProperty(e.prototype,"setDefaultColorMapping",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.colorMappings=[{value:"-100",color:"#0000ff"},{value:"0",color:"#ffffff"},{value:"100",color:"#ff0000"}]}}),Object.defineProperty(e.prototype,"setShowUniqueValuesWarningModal",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.showUniqueValuesWarningModal=t}}),Object.defineProperty(e.prototype,"handleSaveColorScheme",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t={};return this.colorMappings.forEach((function(e){t[e.value]=e.color})),Object.keys(t).length<2?(this.setShowUniqueValuesWarningModal(!0),!1):(this.props.handleColorMappingChange(t),!0)}}),Object.defineProperty(e.prototype,"close",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.props.handleClose($e.PROFILES_COLOR_SCHEME)}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e=this.colorMappings.map((function(e,a){return g.a.createElement(I.Row,{style:{padding:"10px"}},g.a.createElement(I.Col,{md:2}),g.a.createElement(I.Col,{md:3},g.a.createElement("input",{value:e.value,style:{width:"50px"},onChange:function(e){var i=e.target.value;t.handleValueChange(a,i)}})),g.a.createElement(I.Col,{md:3},g.a.createElement("input",{type:"color",value:e.color,onChange:function(e){var i=e.target.value;t.handleColorChange(a,i)}})),g.a.createElement(I.Col,{md:1},g.a.createElement("img",{src:Nt,className:"icon-small "+(t.colorMappings.length>2?"icon-enabled":"icon-disabled"),title:"Remove",onClick:function(){t.removeColorMapping(a)}})),g.a.createElement(I.Col,{md:2}))}));return g.a.createElement(I.Modal,{show:this.props.show,onHide:function(){t.close()},bsSize:"small"},g.a.createElement(I.Modal.Header,{closeButton:!0},g.a.createElement(I.Modal.Title,null,"Study Data Overlay Color Scheme")),g.a.createElement(I.Modal.Body,null,g.a.createElement(I.Row,{style:{paddingTop:"10px",paddingLeft:"10px",paddingRight:"10px"}},g.a.createElement(I.Col,{md:2}),g.a.createElement(I.Col,{md:3},g.a.createElement("label",null,"Value")),g.a.createElement(I.Col,{md:3},g.a.createElement("label",null,"Color")),g.a.createElement(I.Col,{md:3})),g.a.createElement("hr",{className:"horizontal-rule"}),e,g.a.createElement("img",{src:pt,className:"icon-small icon-enabled",onClick:this.addDefaultColorMapping,title:"Add New Value-Color Mapping"}),g.a.createElement(I.Modal,{show:this.showUniqueValuesWarningModal,onHide:function(){return t.setShowUniqueValuesWarningModal(!1)},bsSize:"small"},g.a.createElement(I.Modal.Header,{closeButton:!0},g.a.createElement(I.Modal.Title,null,"Warning")),g.a.createElement(I.Modal.Body,null,g.a.createElement("p",null,"Please set at least two unique value-color mappings.")),g.a.createElement(I.Modal.Footer,null,g.a.createElement(I.Button,{onClick:function(){t.setShowUniqueValuesWarningModal(!1)}},"OK")))),g.a.createElement(I.Modal.Footer,null,g.a.createElement(I.Button,{onClick:function(){t.close()}},"Cancel"),g.a.createElement(I.Button,{onClick:function(){t.setDefaultColorMapping()}},"Default"),g.a.createElement(I.Button,{onClick:function(){t.handleSaveColorScheme()&&t.close()}},"Save")))}}),Mt([r.observable],e.prototype,"colorMappings",void 0),Mt([r.observable],e.prototype,"showUniqueValuesWarningModal",void 0),Mt([r.action.bound],e.prototype,"handleColorChange",null),Mt([r.action.bound],e.prototype,"handleValueChange",null),Mt([r.action.bound],e.prototype,"addDefaultColorMapping",null),Mt([r.action.bound],e.prototype,"removeColorMapping",null),Mt([r.action.bound],e.prototype,"setDefaultColorMapping",null),Mt([r.action.bound],e.prototype,"setShowUniqueValuesWarningModal",null),Mt([n.a],e.prototype,"handleSaveColorScheme",null),Mt([n.a],e.prototype,"close",null),e=Mt([l.observer],e)}(g.a.Component),yt=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),ht=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},Et=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"showEnabledProfileWarningModal",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object(r.makeObservable)(a),a}return yt(e,t),Object.defineProperty(e.prototype,"setShowEnabledProfileWarningModal",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.showEnabledProfileWarningModal=t}}),Object.defineProperty(e.prototype,"profileEnabledMap",{get:function(){var t=this,e=[];this.props.profiles.forEach((function(a){a.enabled&&e.length-1;a[t.profileId]=i})),a},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"handleProfileLabelClicked",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.props.handleProfileLabelClicked(t)}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e=this.props.profiles.map((function(e,a){return g.a.createElement(g.a.Fragment,{key:a},g.a.createElement(I.Button,{onClick:function(){var e=t.props.profiles.filter((function(t){return t.enabled})).length;t.props.profiles[a].enabled||e0?e:g.a.createElement("h4",{className:"modal-title"},"There is currently no data to show"),g.a.createElement(I.Modal,{show:this.showEnabledProfileWarningModal,onHide:function(){return t.setShowEnabledProfileWarningModal(!1)}},g.a.createElement(I.Modal.Header,{closeButton:!0},g.a.createElement(I.Modal.Title,null,"Warning")),g.a.createElement(I.Modal.Body,null,g.a.createElement("p",null,"At most 6 data sets can be displayed at the same time, please disable some other data set before enabling this.")),g.a.createElement(I.Modal.Footer,null,g.a.createElement(I.Button,{onClick:function(){t.setShowEnabledProfileWarningModal(!1)}},"OK")))))}}),ht([r.observable],e.prototype,"showEnabledProfileWarningModal",void 0),ht([r.action],e.prototype,"setShowEnabledProfileWarningModal",null),ht([r.computed],e.prototype,"profileEnabledMap",null),e=ht([l.observer],e)}(g.a.Component),mt=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),jt=function(t){function e(e){return t.call(this,e)||this}return mt(e,t),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return g.a.createElement(I.Modal,{id:"quickHelpModal",show:this.props.show,onHide:function(){t.props.handleClose($e.HELP)}},g.a.createElement(I.Modal.Header,{closeButton:!0},g.a.createElement(I.Modal.Title,null,"Quick Help")),g.a.createElement(I.Modal.Body,null,g.a.createElement("ul",{className:"leftText"},g.a.createElement("li",null,g.a.createElement("strong",null,"To add a node:")," Drag and drop from node palette"),g.a.createElement("li",null,g.a.createElement("strong",null,"To add an interaction:")," Click on interaction type; then click on small circle on source node and release on target node"),g.a.createElement("li",null,g.a.createElement("strong",null,"To add a node into a container (family, complex, compartment or process):"),' Drag the node into its container node or select nodes to be contained and right click on container node and choose "Add Selected Into This"'),g.a.createElement("li",null,g.a.createElement("strong",null,"To delete nodes/interactions:")," Select and perform Edit > Delete Selected"),g.a.createElement("li",null,g.a.createElement("strong",null,"To overlay experiment data:")," Select Alteration % > Load From cBioPortal..."))))}}),e}(g.a.Component),wt=function(){function t(){}return Object.defineProperty(t.prototype,"getDataTypes",{enumerable:!1,configurable:!0,writable:!0,value:function(){return[t.MUTATION,t.GENE_EXPRESSION,t.CNA]}}),Object.defineProperty(t.prototype,"fetchCancerStudies",{enumerable:!1,configurable:!0,writable:!0,value:function(e){var a={},i=new XMLHttpRequest;i.onreadystatechange=function(){if(i.readyState===XMLHttpRequest.DONE&&200===i.status){for(var t=i.responseText.split(/\r?\n|\r/),o=1;o=t.Z_SCORE_UPPER_THRESHOLD||parseFloat(I[u])<=t.Z_SCORE_LOWER_THRESHOLD)&&d++:d++);c[a][I[1]]=d/l*100}i(c)}}),Object.defineProperty(t.prototype,"getProfileData",{enumerable:!1,configurable:!0,writable:!0,value:function(e,a){var i=new XMLHttpRequest,o=this;i.onreadystatechange=function(){i.readyState===XMLHttpRequest.DONE&&200===i.status&&(o.calcAlterationPercentages(i.responseText,e.geneticProfileId,a),d.toast.success(e.geneticProfileId+" has been succesfully loaded from cBioPortal."))};var n=t.GET_PROFILE_DATA_URL;n+="&case_set_id="+e.caseSetId+"_sequenced",n+="&genetic_profile_id="+e.geneticProfileId,n+="&gene_list=";for(var r=!0,l=0,c=e.genes;l=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},ft=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"dataTypes",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(a,"dataTypeFetchResultsReady",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(a,"currentlySelectedItemIndex",{enumerable:!0,configurable:!0,writable:!0,value:-1}),Object.defineProperty(a,"selectedStudies",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(a,"checkboxModalPosition",{enumerable:!0,configurable:!0,writable:!0,value:{bottom:0}}),Object.defineProperty(a,"selectedDataTypesPerStudy",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(a,"itemArray",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(a,"searchQuery",{enumerable:!0,configurable:!0,writable:!0,value:""}),Object.defineProperty(a,"showDataTypeSelectionModal",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(a,"studyListItemCheckboxChecked",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(a,"selectedStudyData",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"portalAccessor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(a),a.selectedStudyData=[],a.portalAccessor=new wt,a.fetchStudy(),a}return Dt(e,t),Object.defineProperty(e.prototype,"setDataTypeFetchResultsReady",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.dataTypeFetchResultsReady=t}}),Object.defineProperty(e.prototype,"setItemArray",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.itemArray=t}}),Object.defineProperty(e.prototype,"setSearchQuery",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.searchQuery=t}}),Object.defineProperty(e.prototype,"setSelectedStudyData",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.selectedStudyData=t}}),Object.defineProperty(e.prototype,"setDataTypeProperties",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.dataTypes[t]=e}}),Object.defineProperty(e.prototype,"initStudyListItemCheckboxChecked",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.studyListItemCheckboxChecked=Array(t).fill(!1)}}),Object.defineProperty(e.prototype,"initSelectedDataTypesPerStudy",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.selectedDataTypesPerStudy=Array(t).fill("")}}),Object.defineProperty(e.prototype,"toggleStudyListItemCheckboxChecked",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.studyListItemCheckboxChecked[t]=!this.studyListItemCheckboxChecked[t]}}),Object.defineProperty(e.prototype,"addSelectedStudy",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.selectedStudies.push(t)}}),Object.defineProperty(e.prototype,"removeSelectedStudy",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.selectedStudies=this.selectedStudies.filter((function(e){return e.data[0]!=t[0]}))}}),Object.defineProperty(e.prototype,"clearSelectedStudies",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.selectedStudies=[]}}),Object.defineProperty(e.prototype,"setShowDataTypeSelectionModal",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.showDataTypeSelectionModal=t}}),Object.defineProperty(e.prototype,"clearStudyCheckboxesChecked",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this.studyListItemCheckboxChecked.length;this.studyListItemCheckboxChecked=Array(t).fill(!1)}}),Object.defineProperty(e.prototype,"clearSelectedDataTypesPerStudy",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this.studyListItemCheckboxChecked.length;this.selectedDataTypesPerStudy=Array(t).fill("")}}),Object.defineProperty(e.prototype,"unselectDataTypesForStudy",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.selectedDataTypesPerStudy[t]=""}}),Object.defineProperty(e.prototype,"preparePortalAccess",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this;this.setDataTypeFetchResultsReady(!1),this.portalAccessor.getSupportedGeneticProfiles(t,(function(t){e.disableAllDataTypes();for(var a=0,i=Object.keys(t);a1&&this.selectedStudyData[1]||"Choose study"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return g.a.createElement(I.Modal,{id:"cbioPortalModal",show:this.props.show,onHide:function(){t.props.handleClose($e.STUDY),t.resetModal()}},g.a.createElement(I.Modal.Header,{closeButton:!0},g.a.createElement(I.Modal.Title,null,"Profile Data from cBioPortal")),g.a.createElement(I.Modal.Body,null,g.a.createElement("div",{id:"cancerDropDown",style:{textAlign:"left"}},g.a.createElement("h4",null,"Select Cancer Study"),g.a.createElement("form",null,g.a.createElement(I.FormControl,{type:"text",placeholder:"Search studies",onChange:function(e){return t.setSearchQuery(e.target.value)}})),g.a.createElement(I.ListGroup,{style:{maxHeight:"200px",overflow:"auto",marginTop:"10px",border:"1px solid #ccc",borderRadius:"4px"}},this.itemArray.length<1?g.a.createElement("span",null,"Fetching studies from cBioPortal..."):this.itemArray.map((function(t,e){return{item:t,index:e}})).filter((function(e){return e.item[1].toLowerCase().includes(t.searchQuery.toLowerCase())})).map((function(e){var a=e.item,i=e.index,o=a[1],n=a[0];return g.a.createElement(I.ListGroupItem,{id:"listgroupitem"+i,key:n,style:{padding:"5px 5px"}},g.a.createElement(I.Checkbox,{checked:t.studyListItemCheckboxChecked[i],style:{marginTop:"0px",marginBottom:"0px"},onClick:function(){var e=document.getElementById("listgroupitem"+i).getBoundingClientRect();t.checkboxModalPosition={bottom:e.bottom-30},t.setSelectedStudyData(a),t.preparePortalAccess(n),t.toggleStudyListItemCheckboxChecked(i),t.currentlySelectedItemIndex=i,t.studyListItemCheckboxChecked[i]?t.setShowDataTypeSelectionModal(!0):(t.removeSelectedStudy(a),t.unselectDataTypesForStudy(i))}},o),""!=t.selectedDataTypesPerStudy[i]&&g.a.createElement("span",{style:{fontSize:"12px",marginLeft:"25px"}},t.selectedDataTypesPerStudy[i]))})))),g.a.createElement("div",{style:{marginTop:"10px"}},g.a.createElement("p",{style:{textAlign:"left"}},g.a.createElement("b",null,"Warning:"),' At most six different data sets will be overlayed on the genes. You can toggle which ones are to be displayed via "Alteration %" ',">",' "View Settings" menu.')),g.a.createElement(I.Modal,{style:{position:"absolute",top:this.checkboxModalPosition.bottom+"px"},dialogClassName:"fitContent",show:this.showDataTypeSelectionModal,onHide:function(){t.setShowDataTypeSelectionModal(!1)}},g.a.createElement(I.Modal.Body,null,!1===this.dataTypeFetchResultsReady?g.a.createElement("span",null,"Fetching data types from cBioPortal..."):Object.keys(this.dataTypes).map((function(e){return g.a.createElement(I.Checkbox,{inline:!0,key:e,disabled:!t.dataTypes[e].enabled,onClick:function(){t.handleCheckboxClick(e)},checked:t.dataTypes[e].checked},e)}))),g.a.createElement(I.Modal.Footer,null,g.a.createElement(I.Button,{onClick:function(){var e=Tt({},t.dataTypes);0==Object.keys(e).filter((function(t){return e[t].checked})).length&&(t.studyListItemCheckboxChecked[t.currentlySelectedItemIndex]=!1),t.setShowDataTypeSelectionModal(!1)}},"Cancel"),g.a.createElement(I.Button,{onClick:function(){var e=Tt({},t.dataTypes);t.addSelectedStudy({data:t.selectedStudyData,dataTypes:e}),t.selectedDataTypesPerStudy[t.currentlySelectedItemIndex]=Object.keys(e).filter((function(t){return e[t].checked})).join(", "),t.setShowDataTypeSelectionModal(!1)}},"Add")))),g.a.createElement(I.Modal.Footer,null,g.a.createElement(I.Button,{bsClass:"success",onClick:function(){t.selectedStudies.forEach((function(e){t.props.loadFromCBio(e.dataTypes,e.data)})),t.props.handleClose($e.STUDY),t.resetModal()}},"Load Data")))}}),Lt([r.observable],e.prototype,"dataTypes",void 0),Lt([r.observable],e.prototype,"dataTypeFetchResultsReady",void 0),Lt([r.observable],e.prototype,"selectedStudies",void 0),Lt([r.observable],e.prototype,"selectedDataTypesPerStudy",void 0),Lt([r.observable],e.prototype,"itemArray",void 0),Lt([r.observable],e.prototype,"searchQuery",void 0),Lt([r.observable],e.prototype,"showDataTypeSelectionModal",void 0),Lt([r.observable],e.prototype,"studyListItemCheckboxChecked",void 0),Lt([r.observable],e.prototype,"selectedStudyData",void 0),Lt([r.observable],e.prototype,"portalAccessor",void 0),Lt([r.action.bound],e.prototype,"setDataTypeFetchResultsReady",null),Lt([r.action.bound],e.prototype,"setItemArray",null),Lt([r.action.bound],e.prototype,"setSearchQuery",null),Lt([r.action.bound],e.prototype,"setSelectedStudyData",null),Lt([r.action.bound],e.prototype,"setDataTypeProperties",null),Lt([r.action.bound],e.prototype,"initStudyListItemCheckboxChecked",null),Lt([r.action.bound],e.prototype,"initSelectedDataTypesPerStudy",null),Lt([r.action.bound],e.prototype,"toggleStudyListItemCheckboxChecked",null),Lt([r.action.bound],e.prototype,"addSelectedStudy",null),Lt([r.action.bound],e.prototype,"removeSelectedStudy",null),Lt([r.action.bound],e.prototype,"clearSelectedStudies",null),Lt([r.action.bound],e.prototype,"setShowDataTypeSelectionModal",null),Lt([r.action.bound],e.prototype,"clearStudyCheckboxesChecked",null),Lt([r.action.bound],e.prototype,"clearSelectedDataTypesPerStudy",null),Lt([r.action.bound],e.prototype,"unselectDataTypesForStudy",null),Lt([n.a],e.prototype,"resetModal",null),Lt([n.a],e.prototype,"handleCheckboxClick",null),Lt([r.computed],e.prototype,"selectedStudyDataTitle",null),e=Lt([l.observer],e)}(g.a.Component),Ot=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),vt=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},Gt=["Cell Cycle","HIPPO","MYC","NOTCH","NRF2","PI3K","RTK-RAS","TGF-Beta","TP53","WNT"],St=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"bestPathways",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"shownPathways",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"dropDownTitle",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"selectedPathway",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"isPercentageMatch",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"isAlterationEnabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"considerOnlyTCGAPanPathways",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"isExpanded",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"COUNT_PERC_EXPLANATION",{enumerable:!0,configurable:!0,writable:!0,value:"Whether we should favor the number of genes of interest matching the ones in a pathway or the percentage of such genes in that pathway. For instance, suppose genes of interest are A, B, and C, and the pathway contains genes B, C, D, and E. When we consider count, the score is 2 (for the two genes that match). However, when we consider percentage the score will be 50% as 2 of the 4 genes in the pathway are among genes of interest."}),Object.defineProperty(a,"ALTERATION_EXPLANATION",{enumerable:!0,configurable:!0,writable:!0,value:"When this is checked, each matching gene will not directly contribute to the score as 1 unit but with the alteration frequency percentage of that gene. For instance, suppose genes of interest are A, B, and C with alteration frequencies of 0.5, 0.2, and 0.3, respectively, and the pathway contains genes B, C, D, and E. When this is option isn't checked, the score will be 2 for match count and 50% for the match percentage. However, when this option is checked, the scores will be 0.2+0.3=0.5 and (0.2+0.3)/4=12.5% for match count and percentage, respectively."}),Object.defineProperty(a,"TCGA_PANCAN_EXPLANATION",{enumerable:!0,configurable:!0,writable:!0,value:"The pathways listed above were retrieved from PathwayMapper. When this option is checked, only the pathways under TCGA > PanCanAtlas will be shown. Uncheck to show all."}),Object(r.makeObservable)(a),a.isPercentageMatch=0,a.isAlterationEnabled=0,a.considerOnlyTCGAPanPathways=!0,a.dropDownTitle="Match count",a.isExpanded=!1,a.setBestPathwayMethod(0),a.selectedPathway=a.shownPathways[0].pathwayName,a}return Ot(e,t),Object.defineProperty(e.prototype,"setBestPathwayMethod",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.bestPathways=this.props.bestPathwaysAlgos[t],this.filterBestPathwaysByTCGAPanPathways()}}),Object.defineProperty(e.prototype,"onPathwayClick",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.selectedPathway=t,this.props.pathwayActions.changePathway(this.selectedPathway)}}),Object.defineProperty(e.prototype,"onApplyClick",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.setBestPathwayMethod(2*this.isAlterationEnabled+this.isPercentageMatch)}}),Object.defineProperty(e.prototype,"filterBestPathwaysByTCGAPanPathways",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;this.shownPathways=this.bestPathways.filter((function(e){return!t.considerOnlyTCGAPanPathways||Gt.indexOf(e.pathwayName)>-1})),this.considerOnlyTCGAPanPathways&&Gt.indexOf(this.selectedPathway)<0&&(this.selectedPathway=this.shownPathways[0].pathwayName,this.props.pathwayActions.changePathway(this.selectedPathway))}}),Object.defineProperty(e.prototype,"toggleConsiderOnlyTCGAPanPathways",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.considerOnlyTCGAPanPathways=!this.considerOnlyTCGAPanPathways,this.filterBestPathwaysByTCGAPanPathways()}}),Object.defineProperty(e.prototype,"componentDidMount",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.props.pathwayActions.changePathway(this.selectedPathway)}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;return g.a.createElement("div",{id:"ranking-bar"},this.props.tableComponent&&this.props.tableComponent(this.shownPathways.map((function(t){return{name:t.pathwayName,score:t.score,genes:t.genesMatched}})),this.selectedPathway,this.onPathwayClick),g.a.createElement("div",{className:"indent"},g.a.createElement(I.Checkbox,{checked:this.considerOnlyTCGAPanPathways,id:"tcgaPathwaysCheckbox",onClick:this.toggleConsiderOnlyTCGAPanPathways,style:{fontSize:"13px"}},"Show TCGA PanCancer Atlas pathways only ",g.a.createElement("span",{"data-tip":this.TCGA_PANCAN_EXPLANATION,"data-border":"true","data-type":"light","data-place":"left","data-effect":"solid","data-html":"true","data-delay-hide":"500",className:"fa fa-question-circle styles-module__infoIcon__zMiog"}))),!this.props.patientView&&g.a.createElement("div",{className:"info-entry"},g.a.createElement("div",{id:"criteria-title",className:"info-title"},g.a.createElement("b",{style:{display:"inline-block"}}," Ranking options")),g.a.createElement("div",{className:"indent"},g.a.createElement(I.DropdownButton,{title:this.dropDownTitle,id:"0",style:{fontSize:"13px"}},g.a.createElement(I.MenuItem,{style:{fontSize:"13px"},onClick:function(){t.isPercentageMatch=0,t.dropDownTitle="Match count",t.onApplyClick()}},"Match count"),g.a.createElement(I.MenuItem,{style:{fontSize:"13px"},onClick:function(){t.isPercentageMatch=1,t.dropDownTitle="Match percentage",t.onApplyClick()}},"Match percentage"))," ",g.a.createElement("div",{"data-tip":this.COUNT_PERC_EXPLANATION,"data-border":"true","data-type":"light","data-place":"left","data-effect":"solid",className:"fa fa-question-circle styles-module__infoIcon__zMiog"}),g.a.createElement(I.Checkbox,{id:"alterationCheckBox",onClick:function(){t.isAlterationEnabled=1===t.isAlterationEnabled?0:1,t.onApplyClick()},style:{fontSize:"13px",marginTop:"18px",bottom:"4px"}},"Consider alteration frequency ",g.a.createElement("span",{"data-tip":this.ALTERATION_EXPLANATION,"data-border":"true","data-type":"light","data-place":"left","data-effect":"solid",className:"fa fa-question-circle styles-module__infoIcon__zMiog"})))))}}),vt([r.observable],e.prototype,"bestPathways",void 0),vt([r.observable],e.prototype,"shownPathways",void 0),vt([r.observable],e.prototype,"dropDownTitle",void 0),vt([r.observable],e.prototype,"selectedPathway",void 0),vt([r.observable],e.prototype,"considerOnlyTCGAPanPathways",void 0),vt([r.observable],e.prototype,"isExpanded",void 0),vt([n.a],e.prototype,"setBestPathwayMethod",null),vt([n.a],e.prototype,"onPathwayClick",null),vt([n.a],e.prototype,"onApplyClick",null),vt([r.action.bound],e.prototype,"filterBestPathwaysByTCGAPanPathways",null),vt([r.action.bound],e.prototype,"toggleConsiderOnlyTCGAPanPathways",null),e=vt([l.observer],e)}(g.a.Component),Pt=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),zt=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},Yt=a(19),Zt=a(20),Rt=a(17),Bt=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"selectedGenes",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"editor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(a),a.selectedGenes=[],a}return Pt(e,t),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e="q="+JSON.stringify(this.props.alterationData)+"&g="+this.props.genes.map((function(t){return t.hugoGeneSymbol})).join("+");return g.a.createElement("div",{id:"toolbar",style:{marginLeft:"0px"}},g.a.createElement("img",{height:"22px",width:"22px","data-border":"true","data-type":"light","data-tip":"Save as PNG","data-place":"right","data-effect":"solid",src:v.a,onClick:function(){t.props.pathwayActions.saveAs("PNG")}}),g.a.createElement("img",{height:"22px",width:"22px","data-border":"true","data-type":"light","data-tip":"Save as SVG","data-place":"right","data-effect":"solid",src:S.a,onClick:function(){t.props.pathwayActions.saveAs("SVG")}}),g.a.createElement("img",{height:"22px",width:"22px","data-border":"true","data-type":"light","data-tip":"Perform layout","data-place":"right","data-effect":"solid",src:f.a,onClick:this.props.pathwayActions.performLayout}),!this.props.patientView&&[g.a.createElement("img",{height:"22px",width:"22px","data-border":"true","data-type":"light","data-tip":"Add selected genes to query","data-place":"right","data-effect":"solid",src:Yt,onClick:function(){t.selectedGenes=t.props.pathwayActions.getSelectedNodes().filter((function(t){return"GENE"===t.data().type})).map((function(t){return t.data().name}));var e=t.props.pathwayActions.getSelectedNodes().filter((function(t){return"GENE"!==t.data().type})).map((function(t){return t.data().name})),a=[],i="";e.length>0&&(i+="Selection contains nodes that are not genes: "+e.join(", ")+". "),t.selectedGenes.forEach((function(e){t.props.validGenes.hasOwnProperty(e)||a.push(e)})),0===a.length?t.selectedGenes.length>0&&0===e.length&&t.props.onAddGenes(t.selectedGenes):i+="Following gene symbols are invalid or already in gene list: "+a.join(", ")+".",i.length>0&&t.props.showMessage(i)}}),g.a.createElement("img",{height:"22px",width:"22px","data-border":"true","data-type":"light","data-tip":"Add all valid genes to query","data-place":"right","data-effect":"solid",src:Zt,onClick:function(){t.selectedGenes=t.props.pathwayGenes.filter((function(e){return t.props.validGenes.hasOwnProperty(e)})),t.selectedGenes.length>0&&t.props.onAddGenes(t.selectedGenes)}}),g.a.createElement("img",{height:"22px",width:"22px","data-border":"true","data-type":"light","data-tip":"Edit pathway","data-place":"right","data-effect":"solid",src:T.a,onClick:function(){window.open("http://pathwaymapper.org/?pathwayName="+t.props.selectedPathway+"&"+e)}})],g.a.createElement("img",{height:"22px",width:"22px","data-border":"true","data-type":"light","data-tip":"Help","data-place":"right","data-effect":"solid",src:Rt,onClick:function(){t.props.handleOpen($e.CHELP)}}))}}),zt([r.observable],e.prototype,"selectedGenes",void 0),zt([r.observable],e.prototype,"editor",void 0),e=zt([l.observer],e)}(g.a.Component),xt=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},Wt=function(){function t(t,e,a,i,o,n){Object.defineProperty(this,"selectedPathway",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"fileManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"editor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"undoRedoManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pathwayHandler",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"handleOpen",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eh",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"profiles",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"gridOptionsManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"uploader",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"merger",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isCBioPortal",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isCollaborative",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"viewOperationsManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"overlayUploader",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"enabledType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(this),this.pathwayHandler=t,this.profiles=e,this.fileManager=a,this.handleOpen=i,this.isCBioPortal=o,this.isCollaborative=n,this.enabledType=R.NONE}return Object.defineProperty(t.prototype,"addProfile",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.profiles.push(t)}}),Object.defineProperty(t.prototype,"clearProfiles",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.profiles.length=0}}),Object.defineProperty(t.prototype,"emphasizeQueryGenes",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.editor&&this.editor.cy.nodes().forEach((function(e){var a=e.data().name,i=e.data().type;t.includes(a)&&"GENE"===i&&e.style({"border-width":"4px","font-weight":"bold"})}))}}),Object.defineProperty(t.prototype,"getSelectedNodes",{enumerable:!1,configurable:!0,writable:!0,value:function(){return this.editor.cy.nodes(":selected")}}),Object.defineProperty(t.prototype,"setLayoutProperties",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.editor.saveLayoutProperties(t)}}),Object.defineProperty(t.prototype,"doesCyHaveElements",{enumerable:!1,configurable:!0,writable:!0,value:function(){return this.editor.cy.elements().length>0}}),Object.defineProperty(t.prototype,"toggleGrid",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.gridOptionsManager.setSnapToGuidelines(!1),this.gridOptionsManager.setShowGrid(t)}}),Object.defineProperty(t.prototype,"toggleGuide",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.gridOptionsManager.setSnapToGuidelines(t),this.gridOptionsManager.setShowGrid(!1)}}),Object.defineProperty(t.prototype,"adjustGridSettings",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){this.gridOptionsManager.currentProperties.gridSpacing=t,this.gridOptionsManager.currentProperties.guidelinesStyle.strokeStyle=e,this.gridOptionsManager.currentProperties.guidelinesStyle.horizontalDistColor=e,this.gridOptionsManager.currentProperties.guidelinesStyle.verticalDistColor=e}}),Object.defineProperty(t.prototype,"resizeToContent",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.resizeNodesToContent(this.editor.cy.nodes())}}),Object.defineProperty(t.prototype,"align",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.viewOperationsManager.handleNodeAlignment(t)}}),Object.defineProperty(t.prototype,"onChangeFile",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){var a=t.target.files[0];this.processFile(a,e),t.target.value=""}}),Object.defineProperty(t.prototype,"uploadOverlay",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.overlayUploader.click()}}),Object.defineProperty(t.prototype,"overlayFromText",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this,a=new FormData;a.append("graphFile",t);var i=new XMLHttpRequest;i.onreadystatechange=function(){if(i.readyState===XMLHttpRequest.DONE&&200===i.status){var t=i.responseText.split("\n");if(t.length>0)t[0].split("\t").slice(1).forEach((function(t){return e.addProfile({profileId:t,enabled:!0})}));else console.log("Error: No valid data");e.editor.addGenomicData(i.responseText)}},i.open("POST","/loadGraph"),i.send(a)}}),Object.defineProperty(t.prototype,"upload",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;this.editor.cy.elements().length>0?(this.handleOpen($e.CONFIRMATION),H.pendingFunction=function(){t.uploader.click()}):this.uploader.click()}}),Object.defineProperty(t.prototype,"merge",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.merger.click()}}),Object.defineProperty(t.prototype,"setOverlayUploader",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.overlayUploader=t}}),Object.defineProperty(t.prototype,"setUploaders",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){e?this.merger=t:this.uploader=t}}),Object.defineProperty(t.prototype,"getPathwayInfo",{get:function(){return this.fileManager.getPathwayInfo},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"setPathwayInfo",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.fileManager.setPathwayInfo(t)}}),Object.defineProperty(t.prototype,"undo",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.undoRedoManager.undo()}}),Object.defineProperty(t.prototype,"redo",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.undoRedoManager.redo()}}),Object.defineProperty(t.prototype,"export",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.eh.hide(),this.fileManager.saveGraph(t,this.editor)}}),Object.defineProperty(t.prototype,"resetUndoStack",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.undoRedoManager.reset()}}),Object.defineProperty(t.prototype,"newPathway",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e=function(){t.editor.removeAllElements(),t.fileManager.setPathwayInfo({pathwayTitle:"New Pathway",pathwayDetails:""}),t.resetUndoStack(),t.pathwayHandler("Dummy")};this.editor.cy.elements().length>0?(this.handleOpen($e.CONFIRMATION),H.pendingFunction=e):e()}}),Object.defineProperty(t.prototype,"changePathway",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.pathwayHandler(t),this.isCBioPortal||(this.fileManager.setPathwayInfo({pathwayTitle:t,pathwayDetails:""}),this.editor&&this.resetUndoStack())}}),Object.defineProperty(t.prototype,"highlightNeighbours",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.highlightNeighbors()}}),Object.defineProperty(t.prototype,"highlightSelected",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.highlightSelected()}}),Object.defineProperty(t.prototype,"validateGenes",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.validateGenes()}}),Object.defineProperty(t.prototype,"showAll",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.showAllNodes()}}),Object.defineProperty(t.prototype,"hideSelected",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.hideSelectedNodes()}}),Object.defineProperty(t.prototype,"deleteSelected",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this.editor.cy.elements(":selected");this.editor.removeElement(t)}}),Object.defineProperty(t.prototype,"addEdge",{enumerable:!1,configurable:!0,writable:!0,value:function(t){if(window.edgeAddingMode=t+1,-1===t)return this.eh.disable(),void this.eh.hide();this.eh.enable()}}),Object.defineProperty(t.prototype,"changeNodeName",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){var a=this.editor.cy.$('[name="'+t+'"]')[0];this.editor.changeName(a,e)}}),Object.defineProperty(t.prototype,"addNode",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e={type:t.toUpperCase(),name:"New "+t,w:"150",h:"52"},a=this.editor.cy.extent(),i={x:(a.x1+a.x2)/2,y:(a.y1+a.y2)/2};this.editor.addNode(e,i),this.pathwayHandler("Additional Pathway")}}),Object.defineProperty(t.prototype,"searchGene",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e="node[name @*= '"+t+"']",a=this.editor.cy.filter(e),i=this.editor.cy.collection();a.forEach((function(t,e){t.hasClass("highlightedNode")||t.hasClass("invalidGeneHighlight")||(i=i.union(t))})),this.editor.highlightBySearch(i)}}),Object.defineProperty(t.prototype,"removeAllData",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.removeGenomicData(),this.clearProfiles()}}),Object.defineProperty(t.prototype,"removeAllHighlight",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.removeAllHighlight()}}),Object.defineProperty(t.prototype,"processFile",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){var a=this,i=new FormData;i.append("graphFile",t);var o=new XMLHttpRequest;o.onreadystatechange=function(){if(o.readyState===XMLHttpRequest.DONE)if(200===o.status){var t=M.parseGraph(o.responseText,!1);if(e){a.editor.mergeGraph(t.nodes,t.edges);var i=a.editor.cy.json();t.nodes=i.elements.nodes,t.edges=i.elements.edges,t.title="Additional Pathway"}else a.editor.loadFile(t.nodes,t.edges),a.fileManager.setPathwayInfo({pathwayTitle:t.title,pathwayDetails:t.description});a.pathwayHandler(t.title+"_imported"),a.resetUndoStack()}else console.error("Error processing file: "+o.readyState+o.responseText)},o.open("POST","/loadGraph"),o.send(i)}}),Object.defineProperty(t.prototype,"saveAs",{enumerable:!1,configurable:!0,writable:!0,value:function(t){"SVG"===t?this.fileManager.saveAsSVG(this.editor):"PNG"===t?this.fileManager.saveAsPNG(this.editor.cy):"JPEG"===t&&this.fileManager.saveAsJPEG(this.editor.cy)}}),Object.defineProperty(t.prototype,"editorHandler",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e,a,i,o){this.editor=t,this.eh=e,this.undoRedoManager=a,this.viewOperationsManager=i,this.gridOptionsManager=o}}),Object.defineProperty(t.prototype,"exists",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=!1;return this.profiles.forEach((function(a){a.profileId===t&&(e=!0)})),e}}),Object.defineProperty(t.prototype,"loadSampleData",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.exists("lung")||this.exists("ovarian")||this.exists("breast")||(this.editor.addGenomicData("gene\tlung\tovarian\tbreast\nPTEN\t-7\t-20\t10\nNF1\t-12\t-4\t30\nPIK3CA\t18\t40\t-50\nKRAS\t11\t-5\t0\nZIYA\t0\t-2\t0\nAKT1\t3\t30\t-10\nAKT2\t6\t-3\t20\nAKT3\t6\t-3\t20\n\n"),this.isCollaborative||(this.addProfile({profileId:"lung",enabled:this.profiles.length<6}),this.addProfile({profileId:"ovarian",enabled:this.profiles.length<6}),this.addProfile({profileId:"breast",enabled:this.profiles.length<6})))}}),Object.defineProperty(t.prototype,"performLayout",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.editor.performLayout()}}),xt([r.observable],t.prototype,"selectedPathway",void 0),xt([r.observable],t.prototype,"enabledType",void 0),xt([r.action.bound],t.prototype,"addProfile",null),xt([r.action.bound],t.prototype,"clearProfiles",null),xt([n.a],t.prototype,"toggleGrid",null),xt([n.a],t.prototype,"toggleGuide",null),xt([n.a],t.prototype,"resizeToContent",null),xt([n.a],t.prototype,"align",null),xt([n.a],t.prototype,"onChangeFile",null),xt([n.a],t.prototype,"upload",null),xt([n.a],t.prototype,"merge",null),xt([n.a],t.prototype,"setUploaders",null),xt([r.computed],t.prototype,"getPathwayInfo",null),xt([n.a],t.prototype,"setPathwayInfo",null),xt([n.a],t.prototype,"undo",null),xt([n.a],t.prototype,"redo",null),xt([n.a],t.prototype,"export",null),xt([n.a],t.prototype,"resetUndoStack",null),xt([n.a],t.prototype,"newPathway",null),xt([n.a],t.prototype,"changePathway",null),xt([n.a],t.prototype,"highlightNeighbours",null),xt([n.a],t.prototype,"highlightSelected",null),xt([n.a],t.prototype,"validateGenes",null),xt([n.a],t.prototype,"showAll",null),xt([n.a],t.prototype,"hideSelected",null),xt([n.a],t.prototype,"deleteSelected",null),xt([n.a],t.prototype,"addEdge",null),xt([n.a],t.prototype,"changeNodeName",null),xt([n.a],t.prototype,"addNode",null),xt([n.a],t.prototype,"searchGene",null),xt([n.a],t.prototype,"removeAllData",null),xt([n.a],t.prototype,"removeAllHighlight",null),xt([n.a],t.prototype,"processFile",null),xt([n.a],t.prototype,"saveAs",null),xt([n.a],t.prototype,"editorHandler",null),xt([n.a],t.prototype,"exists",null),xt([n.a],t.prototype,"loadSampleData",null),xt([n.a],t.prototype,"performLayout",null),t}(),kt=a(17),Ut=a.n(kt),Ht=a(23),Qt=a.n(Ht),Kt=a(24),Xt=a.n(Kt),Vt=a(25),Ft=a.n(Vt),Jt=a(26),qt=a.n(Jt),_t=a(27),$t=a.n(_t),te=a(28),ee=a.n(te),ae=a(29),ie=a.n(ae),oe=a(30),ne=a.n(oe),re=a(31),le=a.n(re),ce=a(32),ge=a.n(ce),Ie=a(33),de=a.n(Ie),ue=a(34),se=a.n(ue),Ce=a(35),Ae=a.n(Ce),Me=a(36),pe=a.n(Me),Ne=a(37),be=a.n(Ne),ye=a(38),he=a.n(ye),Ee=a(39),me=a.n(Ee),je=a(40),we=a.n(je),De=a(41),Te=a.n(De),Le=a(42),fe=a.n(Le),Oe=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),ve=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},Ge=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"searchedGene",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(a),a.searchedGene="",a.props.pathwayActions.enabledType=R.NONE,a}return Oe(e,t),Object.defineProperty(e.prototype,"setEnabledType",{enumerable:!1,configurable:!0,writable:!0,value:function(t){t===this.props.pathwayActions.enabledType?this.props.pathwayActions.enabledType=R.NONE:this.props.pathwayActions.enabledType=t,this.props.pathwayActions.enabledType===R.GRID?this.props.pathwayActions.toggleGrid(!0):this.props.pathwayActions.enabledType===R.GUIDE?this.props.pathwayActions.toggleGuide(!0):this.props.pathwayActions.toggleGrid(!1)}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e=[{svg:Ae.a,function:this.props.pathwayActions.newPathway,tooltip:"New Pathway"},{svg:se.a,function:this.props.pathwayActions.upload,tooltip:"Import Pathway"},{svg:me.a,function:function(){t.props.pathwayActions.export(!1)},tooltip:"Export Pathway"}],a=[{svg:ie.a,function:this.props.pathwayActions.deleteSelected,tooltip:"Delete Selected"}];this.props.pathwayActions.isCollaborative||a.push({svg:fe.a,function:function(){t.props.pathwayActions.undo()},tooltip:"Undo"},{svg:he.a,function:function(){t.props.pathwayActions.redo()},tooltip:"Redo"});var i=[{svg:Ft.a,function:function(){t.props.pathwayActions.align("hTop")},tooltip:"Align Horizontal Top"},{svg:Xt.a,function:function(){t.props.pathwayActions.align("hMid")},tooltip:"Align Horizontal Middle"},{svg:Qt.a,function:function(){t.props.pathwayActions.align("hBot")},tooltip:"Align Horizontal Bottom"},{svg:$t.a,function:function(){t.props.pathwayActions.align("vLeft")},tooltip:"Align Vertical Left"},{svg:qt.a,function:function(){t.props.pathwayActions.align("vCen")},tooltip:"Align Vertical Center"},{svg:ee.a,function:function(){t.props.pathwayActions.align("vRight")},tooltip:"Align Vertical Right"}],o=[{isFocused:this.props.pathwayActions.enabledType===R.GRID,svg:ne.a,function:function(){t.setEnabledType(R.GRID)},tooltip:"Enable Grid: Show and snap to grid"},{isFocused:this.props.pathwayActions.enabledType===R.GUIDE,svg:le.a,function:function(){t.setEnabledType(R.GUIDE)},tooltip:"Enable Guidelines: Enable and snap to alignment guidelines"}],n=[{svg:ge.a,function:function(){t.props.pathwayActions.hideSelected()},tooltip:"Hide Selected"},{svg:Te.a,function:function(){t.props.pathwayActions.showAll()},tooltip:"Show All"}],r=[{svg:f.a,function:function(){t.props.pathwayActions.performLayout()},tooltip:"Perform Layout"},{svg:de.a,function:function(){t.props.handleOpen($e.LAYOUT)},tooltip:"Layout Properties"}],l=[e,a,i,o,n,[{svg:pe.a,function:function(){t.props.handleOpen($e.STUDY)},tooltip:"Fetch Genomic Data From cBioPortal"},{svg:we.a,function:function(){t.props.handleOpen($e.PROFILES)},tooltip:"Genomic Data Visibility Settings"}],r,[{svg:be.a,function:function(){t.props.handleOpen($e.HELP)},tooltip:"Quick Help"},{svg:Ut.a,function:function(){t.props.handleOpen($e.ABOUT)},tooltip:"About"}]];return g.a.createElement(I.Navbar,{fluid:!0,style:{backgroundColor:"#eff0f2",minHeight:"0px"},className:"pathway-toolbar"},g.a.createElement(I.ButtonToolbar,{className:"toolbar pathway-toolbar",style:{marginBottom:"0px",paddingBottom:"0px"}},l.map((function(t,e){return g.a.createElement(I.ButtonGroup,{key:e},t.map((function(t,e){return g.a.createElement(I.Button,{key:e,className:"toolbar-button"+(t.isFocused?" toolbar-button-focused":""),style:{padding:0}},g.a.createElement("img",{height:"22px",width:"22px",src:t.svg,"data-tip":t.tooltip,"data-place":"bottom","data-effect":"solid",onClick:t.function}))})))})),g.a.createElement(I.ButtonGroup,{id:"searchGeneToolbar"},g.a.createElement(I.FormGroup,null,g.a.createElement(I.InputGroup,null,g.a.createElement(I.FormControl,{id:"searchGene",type:"text",style:{maxHeight:"32px",borderTopRightRadius:0,borderBottomRightRadius:0},onChange:function(e){t.searchedGene=e.target.value},placeholder:"Search Genes...",onKeyPress:function(e){"Enter"===e.key&&t.props.pathwayActions.searchGene(t.searchedGene)}}),g.a.createElement(I.InputGroup.Addon,{id:"search-gene-input-group-addon",onClick:function(){t.props.pathwayActions.searchGene(t.searchedGene)},style:{cursor:"pointer"}},g.a.createElement(I.Glyphicon,{glyph:"search"})))))))}}),ve([r.observable],e.prototype,"searchedGene",void 0),e=ve([l.observer],e)}(g.a.Component),Se=a(7),Pe=a.n(Se),ze=a(43),Ye=a.n(ze),Ze=a(44),Re=a.n(Ze),Be=a(45),xe=a.n(Be),We=a(46),ke=a.n(We),Ue=a(47),He=a.n(Ue),Qe=a(48),Ke=a.n(Qe),Xe=function(){function t(t,e,a,i,o){Object.defineProperty(this,"cy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"editor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"handleOpen",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"undoRedoManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isCollaborative",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.cy=t,this.editor=e,this.handleOpen=a,this.undoRedoManager=i,this.isCollaborative=o,this.init()}return Object.defineProperty(t.prototype,"init",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e=this,a=this.cy.scratch("cycontextmenus")?this.cy.contextMenus("get"):this.cy.contextMenus(),i=[{id:"deleteSelected",content:"Delete Selected",coreAsWell:!0,onClickFunction:function(){var a=t.cy.elements(":selected");e.editor.removeElement(a)},disabled:!1,hasTrailingDivider:!1},{id:"hideSelected",content:"Hide Selected",coreAsWell:!0,onClickFunction:function(){e.editor.hideSelectedNodes()},disabled:!1,hasTrailingDivider:!1},{id:"loadFromCBioPortal",content:"Load From cBioPortal...",coreAsWell:!0,onClickFunction:function(){t.handleOpen($e.STUDY)},disabled:!1,hasTrailingDivider:!1},{id:"remove",content:"Delete",selector:"node, edge",onClickFunction:function(t){var a=t.target,i=e.cy.nodes(":selected").union(a);e.editor.removeElement(i)},disabled:!1,hasTrailingDivider:!1,coreAsWell:!1},{id:"addSelected",content:"Add Selected Into This",selector:"node",onClickFunction:function(t){var a=t.target,i=e.cy.nodes(":selected"),o=a.data("type"),n=e.cy.collection();if(!("GENE"===a._private.data.type||i.size()<1)){var r=!1;if(i.forEach((function(t,i){return a.id()==t.id()?(r=!0,!1):!t.isParent()||!(r=e.isChildren(t,a))})),!r){i.forEach((function(t,e){"FAMILY"==o||"COMPLEX"==o?"COMPARTMENT"!=t.data("type")&&"PROCESS"!=t.data("type")&&(n=n.add(t)):n=n.add(t)}));var l=a.id();e.editor.changeParents(n,l),i.unselect()}}},disabled:!1,hasTrailingDivider:!1,coreAsWell:!1},{id:"removeSelected",content:"Remove Selected From Parent",selector:"node",onClickFunction:function(t){var a=t.target,i=e.cy.nodes(":selected"),o=!1;i.forEach((function(t,i){return!t.isParent()||!(o=e.isChildren(t,a))})),o||(e.editor.changeParents(i,null),i.unselect())},disabled:!1,hasTrailingDivider:!1,coreAsWell:!1},{id:"performLayout",content:"Perform Layout",coreAsWell:!0,onClickFunction:function(){t.editor.performLayout()},disabled:!1,hasTrailingDivider:!1}],o=[{id:"undoAction",content:"Undo",coreAsWell:!0,onClickFunction:function(){t.undoRedoManager.undo()},disabled:!1,hasTrailingDivider:!1},{id:"redoAction",content:"Redo",coreAsWell:!0,onClickFunction:function(){t.undoRedoManager.redo()},disabled:!1,hasTrailingDivider:!1}];this.isCollaborative||(i=i.concat(o)),a.appendMenuItems(i)}}),Object.defineProperty(t.prototype,"isChildren",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){for(var a=e.parent()[0];a;){if(a.id()==t.id())return!0;a=a.parent()[0]}return!1}}),t}(),Ve=function(){function t(t,e){Object.defineProperty(this,"cy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"editor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.cy=t,this.editor=e}return Object.defineProperty(t.prototype,"generateEdgeQtip",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this,a=t.data("pubmedIDs"),i=document.createElement("div"),o=document.createElement("div");o.classList.add("row","node-tooltip-header"),o.innerHTML="INTERACTION DETAILS",i.append(o);var n=document.createElement("div");n.classList.add("col-xs-6","inputCol");var r=document.createElement("input");r.type="text",r.value=t.data("name"),r.classList.add("form-control"),r.addEventListener("change",(function(a){var i=a.target.value;e.editor.changeName(t,i)})),n.appendChild(r);var l=document.createElement("div");l.classList.add("row","geneDetails");var c=document.createElement("div");c.classList.add("col-xs-6","qtipLabel"),c.innerHTML="Label:",l.appendChild(c),l.appendChild(n),i.appendChild(l),i.appendChild(document.createElement("hr"));var g=document.createElement("div");g.classList.add("col-xs-6","inputCol");var I=document.createElement("input");I.type="text",I.classList.add("form-control"),I.addEventListener("change",(function(a){var i=a.target.value.split(";");a.target.value="",e.editor.addPubmedIDs(t,i),s(t.data("pubmedIDs"))})),g.appendChild(I);var d=document.createElement("div");d.classList.add("row","geneDetails");var u=document.createElement("div");function s(a){document.getElementsByClassName("pubmedIDList").length>0&&document.getElementsByClassName("pubmedIDList").item(0).remove();var o=document.createElement("div");o.classList.add("pubmedIDList"),o.appendChild(document.createElement("hr"));var n=document.createElement("label");for(var r in n.classList.add("col-xs-12","pubmedIDLabel"),n.innerHTML="Pubmed IDs",o.appendChild(n),a)if(a.hasOwnProperty(r)){var l=a[r];if(!isNaN(l)){var c=document.createElement("div"),g=document.createElement("i");g.classList.add("fa","fa-times","qtipRemovePmedID"),g.setAttribute("aria-hidden","true"),g.setAttribute("pubmedId",l),g.addEventListener("click",(function(a){a.target.parentElement.remove();var i=a.target.getAttribute("pubmedId");e.editor.removePubmedID(t,[i]),0===t.data("pubmedIDs").length&&document.getElementsByClassName("pubmedIDList").item(0).remove()}));var I=document.createElement("div"),d=document.createElement("label"),u=document.createElement("a");u.setAttribute("target","_blank");var s="https://www.ncbi.nlm.nih.gov/pubmed/"+l;u.setAttribute("href",s),u.innerHTML=l.toString(),d.appendChild(u),I.appendChild(d),I.appendChild(g),c.appendChild(I),o.appendChild(c)}}t.data("pubmedIDs").length>0&&i.appendChild(o)}return u.classList.add("col-xs-6","qtipLabel"),u.innerHTML="Add Pubmed ID(s):",d.appendChild(u),d.appendChild(g),i.appendChild(d),a.length>0&&s(a),i.classList.add("tooltip-text-style"),i}}),Object.defineProperty(t.prototype,"generateNodeQtip",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this,a=document.createElement("div");a.classList.add("row","node-tooltip-header"),a.innerHTML=t.data("type").toUpperCase()+" DETAILS";var i=document.createElement("div");i.classList.add("col-xs-8","inputCol");var o=document.createElement("input");o.type="text",o.value=t.data("name"),o.classList.add("form-control"),o.addEventListener("change",(function(a){var i=a.target.value;e.editor.changeName(t,i)})),i.appendChild(o);var n=document.createElement("div"),r=document.createElement("div");r.classList.add("row","geneDetails");var l=document.createElement("div");if(l.classList.add("col-xs-4","qtipLabel"),l.innerHTML="Name:",r.appendChild(l),r.appendChild(i),n.append(a),n.append(r),"GENE"===t.data("type")){var c=document.createElement("div");c.classList.add("row","centerText","geneDetails");var g=document.createElement("button");g.type="button",g.classList.add("btn","btn-default"),g.innerHTML="My Cancer Genome",g.addEventListener("click",(function(e){e.preventDefault();var a=t.data("name");window.open("https://www.mycancergenome.org/content/gene/"+a)})),c.append(g),n.append(c)}return n.classList.add("tooltip-text-style"),n}}),Object.defineProperty(t.prototype,"addQtipToElements",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this;t.forEach((function(t){var a=t.popperRef(),i=document.createElement("div");document.body.appendChild(i);var o=it()(i,{getReferenceClientRect:a.getBoundingClientRect,trigger:"manual",placement:"bottom",interactive:!0,theme:"pathwaymapper",content:function(){return t.isNode()?e.generateNodeQtip(t):e.generateEdgeQtip(t)},onHidden:function(t){t.destroy(),i.remove()}});e.cy.one("pan zoom",(function(){i&&i._tippy&&o.hide()})),t.one("showqtipevent",(function(){o.show()}))}))}}),Object.defineProperty(t.prototype,"capitalizeFirstLetter",{enumerable:!1,configurable:!0,writable:!0,value:function(t){return t.charAt(0).toUpperCase()+t.slice(1)}}),t}(),Fe=function(){function t(t){Object.defineProperty(this,"NODEMAP_NAME",{enumerable:!0,configurable:!0,writable:!0,value:"nodes"}),Object.defineProperty(this,"EDGEMAP_NAME",{enumerable:!0,configurable:!0,writable:!0,value:"edges"}),Object.defineProperty(this,"LAYOUT_PROPS_NAME",{enumerable:!0,configurable:!0,writable:!0,value:"layoutProperties"}),Object.defineProperty(this,"GLOBAL_OPTS_NAME",{enumerable:!0,configurable:!0,writable:!0,value:"globalOptions"}),Object.defineProperty(this,"GENOMIC_DATA_MAP_NAME",{enumerable:!0,configurable:!0,writable:!0,value:"genomicDataMap"}),Object.defineProperty(this,"VISIBLE_GENOMIC_DATA_MAP_NAME",{enumerable:!0,configurable:!0,writable:!0,value:"visibleGenomicDataMapByType"}),Object.defineProperty(this,"GENOMIC_DATA_GROUP_NAME",{enumerable:!0,configurable:!0,writable:!0,value:"genomicDataGroupList"}),Object.defineProperty(this,"GENOMIC_DATA_GROUP_COUNT",{enumerable:!0,configurable:!0,writable:!0,value:"genomicDataGroupCount"}),Object.defineProperty(this,"GENOMIC_DATA_COLOR_SCHEME_NAME",{enumerable:!0,configurable:!0,writable:!0,value:"genomicDataColorScheme"}),Object.defineProperty(this,"doc",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"postFileLoad",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"editor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"reconnectEdge",{enumerable:!0,configurable:!0,writable:!0,value:function(t,e,a){var i=this.doc.data[this.EDGEMAP_NAME],o=i[a.id],n=o.id;if(o.source=t,o.target=e,!i.hasOwnProperty(n))throw new Error("Element does not exist in Real Time");this.updateShareDBObject(this.EDGEMAP_NAME,n,o)}}),this.postFileLoad=t}return Object.defineProperty(t.prototype,"getDoc",{enumerable:!1,configurable:!0,writable:!0,value:function(){return this.doc}}),Object.defineProperty(t.prototype,"setEditor",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.editor=t}}),Object.defineProperty(t.prototype,"applyShareDBOperation",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.doc.submitOp(t,this.shareDBError)}}),Object.defineProperty(t.prototype,"clearShareDBGenomicData",{enumerable:!1,configurable:!0,writable:!0,value:function(){for(var t=[],e=this.doc.data[this.GENOMIC_DATA_MAP_NAME],a=this.doc.data[this.VISIBLE_GENOMIC_DATA_MAP_NAME],i=this.doc.data[this.GENOMIC_DATA_GROUP_NAME],o=this.doc.data[this.GENOMIC_DATA_GROUP_COUNT],n=0,r=Object.keys(e);n=0&&o.push(l)}for(n=0;n0)for(var c=0,g=t.children;c0?(g.data.anchorPoints=g.data.bendPointPositions,delete g.data.bendPointPositions,I="segments"):g.data.controlPointPositions&&g.data.controlPointPositions.length>0&&(g.data.anchorPoints=g.data.controlPointPositions,delete g.data.controlPointPositions,I="unbundled-bezier");var d=g.data;d.edgeCurveStyle=I;var u=a.getCustomObjId();d.id=u;var s=a.edgeInitializer(d);a.insertShareDBObject(a.EDGEMAP_NAME,u,s)}}}),Object.defineProperty(t.prototype,"mergeGraph",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){var a=this,i=a.doc.data[this.NODEMAP_NAME],o={},n={},r={};for(var l in i){var c=i[l];o[c.id]=c,n[c.name]=c}function g(t,e){if(t.data.name in n){var i=n[t.data.name].id;if(r[t.data.id]=i,t.children.length>0)for(var o=0,l=t.children;o0)for(var d=0,u=t.children;d0&&e.pubmedIDs.push(t.pubmedIDs)):e.pubmedIDs=[],t.anchorPoints?(null==e.anchorPoints&&(e.anchorPoints=[]),Array.isArray(t.anchorPoints[0])?e.anchorPoints=t.anchorPoints[0]:e.anchorPoints=t.anchorPoints):e.anchorPoints=[],e}}),Object.defineProperty(t.prototype,"nodeInitializer",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e={};return e.id=t.id||this.getCustomObjId(),e.name=t.name||"undefined",e.type=t.type||"undefined",e.parent=t.parent||"undefined",e.x=t.x||"undefined",e.y=t.y||"undefined",e.w=t.w||"undefined",e.h=t.h||"undefined",e.minWidth=t.minWidth||0,e.minWidthBiasLeft=t.minWidth||0,e.minWidthBiasRight=t.minWidth||0,e.minHeight=t.minWidth||0,e.minHeightBiasTop=t.minWidth||0,e.minHeightBiasBottom=t.minWidth||0,e.isHidden=t.isHidden||!1,e.isInvalidGene=t.isInvalidGene||!1,e.isHighlighted=t.isHighlighted||!1,e}}),Object.defineProperty(t.prototype,"layoutPropertiesInitializer",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e={};return e.name=t.name||"undefined",e.nodeRepulsion=t.nodeRepulsion||"undefined",e.idealEdgeLength=t.idealEdgeLength||"undefined",e.edgeElasticity=t.edgeElasticity||"undefined",e.nestingFactor=t.nestingFactor||"undefined",e.gravity=t.gravity||"undefined",e.numIter=t.numIter||"undefined",e.tile=t.tile||"undefined",e.animate=t.animate||"undefined",e.randomize=t.randomize||!1,e.gravityRangeCompound=t.gravityRangeCompound||"undefined",e.gravityCompound=t.gravityCompound||"undefined",e.gravityRange=t.gravityRange||"undefined",e.tilingPaddingVertical=t.tilingPaddingVertical||"undefined",e.tilingPaddingHorizontal=t.tilingPaddingHorizontal||"undefined",e.initialEnergyOnIncremental=t.initialEnergyOnIncremental||"undefined",e}}),Object.defineProperty(t.prototype,"globalOptionsInitializer",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e={};return e.zoomLevel=t.zoomLevel||"undefined",e.panLevel=t.panLevel||"undefined",e}}),Object.defineProperty(t.prototype,"getCustomObjId",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=Date.now();return"undefined"!=typeof performance&&"function"==typeof performance.now&&(t+=performance.now()),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){var a=(t+16*Math.random())%16|0;return t=Math.floor(t/16),("x"===e?a:3&a|8).toString(16)}))}}),Object.defineProperty(t.prototype,"getParam",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=new RegExp(t+"=(.*?)($|&)","g"),a=window.location.search.match(e);return a=a&&a.length?(a=a[0]).replace(t+"=","").replace("&",""):null}}),t}(),Je=(a(63),function(){function t(t,e,a){Object.defineProperty(this,"pathwayHandler",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"cy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"editor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.editor=t,this.cy=e,this.pathwayHandler=a,this.initNodeAdd()}return Object.defineProperty(t.prototype,"initNodeAdd",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e={height:30,width:30,padding:5,backgroundColorDiv:"#fbfbfb",borderColorDiv:"#fff",borderWidthDiv:"0px",borderRadiusDiv:"5px",icon:"",nodeParams:function(){return{}}},a=this;et.a.fn.cytoscapeNodeadd=function(i){var o=et.a.extend(!0,{},e,i),n=i,r={destroy:function(){et()(this).find(".ui-cytoscape-nodeadd").remove()},init:function(){return et()(this).each((function(){for(var e=0,i=o.components;e
');r.append(l);var c=et()('
');l.append(c),c.bind("mousedown",(function(t){t.stopPropagation(),t.preventDefault()})),r.find(".ui-cytoscape-nodeadd-nodediv").css({background:o.backgroundColorDiv,border:o.borderWidthDiv+" solid "+o.borderColorDiv,"border-radius":o.borderRadiusDiv}),r.find("#ui-cytoscape-nodeadd-icon").draggable({helper:"clone",cursor:"pointer"})}var g=et()(this);g.droppable({activeClass:"ui-state-highlight",drop:function(e,i){g.removeClass("ui-state-highlight");var o=g.offset(),n=e.pageX-o.left,r=e.pageY-o.top,l=et()(i.helper).attr("nodeType").toUpperCase(),c=t.cy,I={},d={};c.nodes().forEach((function(t){var e=t.renderedBoundingBox();n<=e.x2&&n>=e.x1&&r<=e.y2&&r>=e.y1&&"GENE"!=t.data().type&&(t.children().length>0&&(d[t.id()]=!0),d[t._private.data.parent]&&delete I[t._private.data.parent],I[t.id()]=t)}));var u=I[Object.keys(I)[0]],s={w:"0",h:"100",parent:0,type:l,name:"New "+et()(i.helper).attr("nodeType")};u&&("FAMILY"==u.data().type||"COMPLEX"==u.data().type?"COMPARTMENT"!=l&&"PROCESS"!=l&&(s.parent=u.id()):s.parent=u.id()),"PROCESS"===l?(s.w="100",s.h="35"):(s.w="150",s.h="52"),n=n/c.zoom()+c.extent().x1,r=r/c.zoom()+c.extent().y1,t.editor.addNode(s,{x:n,y:r}),a.pathwayHandler("Additional Pathway")}})}))}};return r[n]?r[n].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof n&&n?(et.a.error("No such function `"+n+"` for jquery.cytoscapenodeadd"),et()(this)):r.init.apply(this,arguments)},et.a.fn.cynodeadd=et.a.fn.cytoscapeNodeadd;try{Pe()("core","nodeadd",(function(t){et()(this.container()).cytoscapeNodeadd(t)}))}catch(t){console.log(t)}}}),t}()),qe=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),_e=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r};window.$=et.a;var $e,ta=a(64),ea=a(65),aa=a(66),ia=a(67),oa=a(68),na=a(69),ra=a(70),la=a(71),ca=a(72),ga=a(73),Ia=a(74),da=a(75),ua=a(76),sa=a(77),Ca=a(78),Aa=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"cy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"cyDiv",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"editor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"edgeAddingMode",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"viewOperationsManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"qtipManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"genomicDataExplorerView",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"pathwayDetailsView",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"viewUtilities",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"isCollaborative",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"isCbioPortal",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"shareDBManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"cxtMenuManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"dragDropNodeAddManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"undoRedoManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"portalAccessor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"isMountedFirst",{enumerable:!0,configurable:!0,writable:!0,value:!0}),Object.defineProperty(a,"eh",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(a,"lastSelectedEdge",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),a.isCollaborative=e.isCollaborative,a.edgeAddingMode=0,a.isCbioPortal=e.isCbioPortal,a}return qe(e,t),Object.defineProperty(e.prototype,"componentWillUpdate",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.props.selectedPathway!==t.selectedPathway&&this.getPathway(t.selectedPathway)}}),Object.defineProperty(e.prototype,"componentDidUpdate",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.isCbioPortal&&t.selectedPathway!==this.props.selectedPathway&&this.props.onPathwayChangeCompleted()}}),Object.defineProperty(e.prototype,"getPathway",{enumerable:!1,configurable:!0,writable:!0,value:function(t){if(t&&""!==t){var e=C[t];if(e){var a=M.parseGraph(e,!0);this.editor.loadFile(a.nodes,a.edges)}}}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){return g.a.createElement("div",{className:this.props.isCbioPortal?"":"cyContainer",style:{border:"3px solid "+(this.isCbioPortal?"#4389c0":"#1abc9c")}},g.a.createElement("div",{ref:this.cyDivHandler,id:"cy",style:{height:this.isCbioPortal?"800px":"100%",borderRadius:"6px",marginTop:"0px"}}),g.a.createElement("div",{className:"cytoscape-navigator-wrapper"}))}}),Object.defineProperty(e.prototype,"componentDidMount",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.isMountedFirst&&(this.init(),this.isMountedFirst=!1),this.getPathway(this.props.selectedPathway)}}),Object.defineProperty(e.prototype,"cyDivHandler",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.cyDiv=t}}),Object.defineProperty(e.prototype,"init",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.portalAccessor=new wt,this.initCyJS(),this.initCyHandlers(),this.initKeyboardHandlers(),this.initUndoRedoFunctionality(),this.initCBioPortalFunctionalities(),this.placePanzoomAndOverlay()}}),Object.defineProperty(e.prototype,"placePanzoomAndOverlay",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=et()(this.cyDiv).offset().top,e=et()(this.cyDiv).offset().left,a=et()(this.cyDiv).outerHeight(),i=et()(this.cyDiv).outerWidth(),o=et()(".cytoscape-navigator-wrapper").outerHeight(),n=et()(".cytoscape-navigator-wrapper").outerWidth();this.isCbioPortal?(et()(".cytoscape-navigator-wrapper").css("bottom",10.5),et()(".cytoscape-navigator-wrapper").css("right",0)):(et()(".cytoscape-navigator-wrapper").css("top",a+t-o-5+16),et()(".cytoscape-navigator-wrapper").css("left",i+e-n-5+24-.5+.35)),et()(".cytoscape-navigator-wrapper").css("z-index",1039),et()(".cy-panzoom").css("position","relative"),et()(".cy-panzoom").css("top",2),et()(".cy-panzoom").css("left",i-51),et()(".cy-panzoom").css("z-index",1039),et()(".cy-panzoom").css("width",200)}}),Object.defineProperty(e.prototype,"getPathwayData",{enumerable:!1,configurable:!0,writable:!0,value:function(){return this.pathwayDetailsView.getPathwayData()}}),Object.defineProperty(e.prototype,"initCyJS",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;try{na(Pe.a,et.a)}catch(t){console.log(t)}try{ca(Pe.a)}catch(t){console.log(t)}try{ua(Pe.a,et.a)}catch(t){console.log(t)}try{oa(Pe.a)}catch(t){console.log(t)}try{ga(Pe.a,et.a)}catch(t){console.log(t)}try{ia(Pe.a,et.a,Ia)}catch(t){console.log(t)}try{ea(Pe.a,et.a,Ia)}catch(t){console.log(t)}try{da(Pe.a,et.a)}catch(t){console.log(t)}try{ta(Pe.a,et.a)}catch(t){console.log(t)}try{sa(Pe.a)}catch(t){console.log(t)}try{aa(Pe.a)}catch(t){console.log(t)}try{Ca(Pe.a)}catch(t){console.log(t)}this.cy=Pe()({container:this.cyDiv,boxSelectionEnabled:!0,autounselectify:!1,wheelSensitivity:.1,style:ra,textureOnViewport:!1,motionBlur:!0,layout:{name:"preset"}}),this.edgeAddingMode=0,this.undoRedoManager=this.cy.undoRedo(),this.shareDBManager=new Fe((function(){t.shareDBManager.getDoc()})),this.editor=new ct(this.isCollaborative,this.shareDBManager,this.cy,this.isCbioPortal,this.undoRedoManager,this.portalAccessor,this.props.profiles,this.props.genomicDataOverlayColorScheme,this.props.colorSchemeChangeCallback),this.shareDBManager.setEditor(this.editor),this.isCollaborative&&this.shareDBManager.initShareDB(),this.qtipManager=new Ve(this.cy,this.editor),this.cxtMenuManager=new Xe(this.cy,this.editor,this.props.handleOpen,this.undoRedoManager,this.props.isCollaborative),this.dragDropNodeAddManager=new Je(this.editor,this.cy,this.props.pathwayHandler),this.cy.panzoom(la),this.cy.layoutUtilities({desiredAspectRatio:this.cy.width()/this.cy.height()}),this.cy.nodeadd({components:[{container:et()("#simpleNodeDiv"),nodeType:"Gene",icon:ke.a},{container:et()("#familyNodeDiv"),nodeType:"Family",icon:xe.a},{container:et()("#complexNodeDiv"),nodeType:"Complex",icon:Re.a},{container:et()("#compartmentNodeDiv"),nodeType:"Compartment",icon:Ye.a},{container:et()("#processNodeDiv"),nodeType:"Process",icon:He.a}]});var e=this,a={preview:!0,stackOrder:4,handleSize:10,handleColor:"#1abc9c",handleLineType:"ghost",handleLineWidth:1,handleNodes:"node",hoverDelay:1,cxt:!1,enabled:!1,toggleOffOnLeave:!0,edgeType:function(t,e){return"flat"},handlePosition:function(t){return"middle top"},loopAllowed:function(t){return!1},nodeLoopOffset:-50,nodeParams:function(t,e){return{}},edgeParams:function(t,e,a){return{}},start:function(t){e.getGlobalEdgeType()},complete:function(t,a,i){e.cy.remove(i),e.editor.addEdge({source:t.id(),target:a[0].id(),type:e.getGlobalEdgeType(window.edgeAddingMode),pubmedIDs:[],name:""})},stop:function(t){e.edgeAddingMode=-1,e.eh.disable(),e.eh.hide(),e.props.setActiveEdge(-1)}};this.eh=this.cy.edgehandles(a),this.eh.disable(),this.props.editorHandler(this.editor,this.eh,this.undoRedoManager),this.isCbioPortal||this.cy.nodeEditing({padding:5,undoable:!0,grappleSize:8,grappleColor:"#ffc90e",inactiveGrappleStroke:"inside 1px blue",boundingRectangle:!0,boundingRectangleLineDash:[4,8],boundingRectangleLineColor:"ffc90e",boundingRectangleLineWidth:1.5,zIndex:999,moveSelectedNodesOnKeyEvents:function(){return!0},minWidth:function(t){var e=t.data("resizeMinWidth");return e||15},minHeight:function(t){var e=t.data("resizeMinHeight");return e||15},getCompoundMinWidth:function(t){return t.style("min-width")},getCompoundMinHeight:function(t){return t.style("min-height")},getCompoundMinWidthBiasRight:function(t){return t.style("min-width-bias-right")},getCompoundMinWidthBiasLeft:function(t){return t.style("min-width-bias-left")},getCompoundMinHeightBiasTop:function(t){return t.style("min-height-bias-top")},getCompoundMinHeightBiasBottom:function(t){return t.style("min-height-bias-bottom")},isFixedAspectRatioResizeMode:function(t){return t.is(".fixedAspectRatioResizeMode")},isNoResizeMode:function(t){},setWidth:function(t,e){t.data("w",e)},setHeight:function(t,e){t.data("h",e)},setCompoundMinWidth:function(t,e){t.style("min-width",e)},setCompoundMinHeight:function(t,e){t.style("min-height",e)},setCompoundMinWidthBiasLeft:function(t,e){t.style("min-width-bias-left",e)},setCompoundMinWidthBiasRight:function(t,e){t.style("min-width-bias-right",e)},setCompoundMinHeightBiasTop:function(t,e){t.style("min-height-bias-top",e)},setCompoundMinHeightBiasBottom:function(t,e){t.style("min-height-bias-bottom",e)},cursors:{default:"default",inactive:"not-allowed",nw:"nw-resize",n:"n-resize",ne:"ne-resize",e:"e-resize",se:"se-resize",s:"s-resize",sw:"sw-resize",w:"w-resize"},resizeToContentCueImage:Ke.a,resizeToContentFunction:this.editor.resizeNodesToContent.bind(this.editor)});this.cy.navigator({container:".cytoscape-navigator-wrapper",viewLiveFramerate:0,thumbnailEventFramerate:10,thumbnailLiveFramerate:!1,dblClickDelay:200,removeCustomContainer:!0,rerenderDelay:100});this.viewUtilities=this.cy.viewUtilities({node:{highlighted:{"border-width":2,"border-color":"#bc1142"},unhighlighted:{opacity:function(t){return t.css("opacity")}}},edge:{highlighted:{},unhighlighted:{opacity:function(t){return t.css("opacity")}}},setVisibilityOnHide:!1,setDisplayOnHide:!0,neighbor:function(){return!1},neighborSelectTime:500}),this.editor.setViewUtilities(this.viewUtilities),this.placePanzoomAndOverlay()}}),Object.defineProperty(e.prototype,"getGlobalEdgeType",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t="NONE";return 1===window.edgeAddingMode?t="ACTIVATES":2===window.edgeAddingMode?t="INHIBITS":3===window.edgeAddingMode?t="INDUCES":4===window.edgeAddingMode?t="REPRESSES":5===window.edgeAddingMode&&(t="BINDS"),t}}),Object.defineProperty(e.prototype,"initCyHandlers",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t,e,a=this,i=this;this.cy.on("tap",(function(a){var i=a.target;-1!==e&&-1!==t&&clearTimeout(e),t===i?(i.trigger("doubleTap"),t=-1):(e=setTimeout((function(){t=-1}),300),t=i)})),this.cy.on("doubleTap","node",(function(t){i.props.isCbioPortal||t.target===this&&(i.qtipManager.addQtipToElements(t.target),t.target.trigger("showqtipevent"))})),this.cy.on("doubleTap","edge",(function(t){i.props.isCbioPortal||t.target===this&&(i.qtipManager.addQtipToElements(t.target),t.target.trigger("showqtipevent"))})),this.cy.on("select","node",(function(t){a.editor.pushSelectedNodeStack(t.target)})),this.cy.on("unselect","node",(function(t){a.editor.removeElementFromSelectedNodeStack(t.target)})),this.cy.on("free","node",(function(t){var e=a.cy.nodes(":selected"),i=t.target;i=(i=i.union(i.descendants())).union(e),a.editor.moveElements(i)})),this.cy.on("layoutstop",(function(){a.editor.postLayout()})),this.cy.on("nodeediting.resizeend",(function(t,e,i){i.data("w",i.width()),i.data("h",i.height()),a.editor.resizeElements(i)})),this.cy.on("select","edge",(function(t){a.lastSelectedEdge=t.target})),this.cy.on("bendPointMovement",(function(){a.editor.updateEdgeAnchorPoints(a.lastSelectedEdge)})),this.cy.on("nodeediting.moveend",(function(){a.editor.changeNodePositionsByArrows(a.cy.nodes(":selected"))}))}}),Object.defineProperty(e.prototype,"initKeyboardHandlers",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this;this.isCollaborative||this.isCbioPortal?(et()('a[role="redo"]').hide(),et()('a[role="undo"]').hide()):et()(document).keydown((function(e){89===e.which&&(e.ctrlKey||e.metaKey)?t.undoRedoManager.redo():90===e.which&&(e.ctrlKey||e.metaKey)&&t.undoRedoManager.undo()})),et()(document).keydown((function(e){if(65===e.which&&(e.ctrlKey||e.metaKey))"TEXTAREA"!=(a=document.activeElement.tagName)&&"INPUT"!=a&&(e.preventDefault(),t.cy.elements().select());else if(8===e.which||46===e.which){var a;if("TEXTAREA"!=(a=document.activeElement.tagName)&&"INPUT"!=a){var i=t.cy.$(":selected");t.editor.removeElement(i)}}}))}}),Object.defineProperty(e.prototype,"initUndoRedoFunctionality",{enumerable:!1,configurable:!0,writable:!0,value:function(){(this.isCollaborative||this.isCbioPortal)&&(et()('[role="undo"]').hide(),et()('[role="redo"]').hide())}}),Object.defineProperty(e.prototype,"initCBioPortalFunctionalities",{enumerable:!1,configurable:!0,writable:!0,value:function(){this.isCbioPortal&&this.cy.contextMenus("get").destroy()}}),_e([n.a],e.prototype,"cyDivHandler",null),e=_e([l.observer],e)}(g.a.Component),Ma=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),pa=function(t){function e(e){return t.call(this,e)||this}return Ma(e,t),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){for(var t=this,e={},a=0,i=Object.keys(C);a=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},Oa=function(t){function e(e){var a=t.call(this,e)||this;return Object.defineProperty(a,"activeEdge",{enumerable:!0,configurable:!0,writable:!0,value:-1}),Object(r.makeObservable)(a),e.setActiveEdgeHandler(a.setActiveEdge),a}return La(e,t),Object.defineProperty(e.prototype,"addEdge",{enumerable:!1,configurable:!0,writable:!0,value:function(t){if(t===this.activeEdge)return this.setActiveEdge(-1),void this.props.pathwayActions.addEdge(-1);this.setActiveEdge(t),this.props.pathwayActions.addEdge(t)}}),Object.defineProperty(e.prototype,"setActiveEdge",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.activeEdge=t}}),Object.defineProperty(e.prototype,"render",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=this,e=[ba.a,wa.a,ma.a,Ta.a,ha.a];return g.a.createElement("div",{id:"pathway-sidebar",className:"sideBarWrapper"},g.a.createElement(I.Panel,{className:"pnl"},g.a.createElement(I.Panel.Heading,{className:"pnl-header"},"Network"),g.a.createElement(I.Panel.Body,{className:"pnl-body pathwayPanel"},g.a.createElement("div",{className:"buttonContainer"},g.a.createElement(I.Button,{onClick:function(){t.props.handleOpen($e.PW_DETAILS)}},"Properties")),g.a.createElement("div",{className:"buttonContainer"},g.a.createElement(I.Button,{onClick:function(){t.props.pathwayActions.upload()}},"Import")),g.a.createElement("div",{className:"buttonContainer"},g.a.createElement(I.Button,{onClick:function(){t.props.pathwayActions.export(!1)}},"Export")))),g.a.createElement(I.Panel,{className:"pnl"},g.a.createElement(I.Panel.Heading,{className:"pnl-header"},"Node Palette"),g.a.createElement(I.Panel.Body,{className:"pnl-body"},["simpleNodeDiv","familyNodeDiv","complexNodeDiv","compartmentNodeDiv","processNodeDiv"].map((function(t){return g.a.createElement("div",{key:t,id:t,"data-tip":"Click on this and drag to the location on drawing canvas and release!","data-effect":"solid","data-place":"bottom","data-delay-show":"1000",className:"dragButtonContainer"})})))),g.a.createElement(I.Panel,{className:"pnl edgePanel"},g.a.createElement(I.Panel.Heading,{className:"pnl-header"},"Interaction Palette"),g.a.createElement(I.Panel.Body,{className:"pnl-body edgePaletteWrapper"},g.a.createElement("div",{className:"list-group edge-palette"},["Activates","Inhibits","Induces","Represses","Binds"].map((function(a,i){return g.a.createElement("div",{key:i,"data-tip":"Click to activate; then, start the interaction from the little circle on the source node!","data-effect":"solid","data-place":"bottom","data-delay-show":"1000"},g.a.createElement("a",{style:{marginBottom:"5px"},className:"list-group-item "+(t.activeEdge===i?"active":""),onClick:function(){t.addEdge(i)},href:"#"},g.a.createElement("img",{style:{width:"30px"},className:"pull-left",src:e[i]})," ",a))}))))))}}),fa([r.observable],e.prototype,"activeEdge",void 0),fa([r.action.bound],e.prototype,"setActiveEdge",null),e=fa([l.observer],e)}(g.a.Component),va=function(){var t=function(e,a){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a])})(e,a)};return function(e,a){function i(){this.constructor=e}t(e,a),e.prototype=null===a?Object.create(a):(i.prototype=a.prototype,new i)}}(),Ga=function(t,e,a,i){var o,n=arguments.length,r=n<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,a,i);else for(var l=t.length-1;l>=0;l--)(o=t[l])&&(r=(n<3?o(r):n>3?o(e,a,r):o(e,a))||r);return n>3&&r&&Object.defineProperty(e,a,r),r},Sa=a(79),Pa=Sa();!function(t){t[t.STUDY=0]="STUDY",t[t.CONFIRMATION=1]="CONFIRMATION",t[t.PROFILES=2]="PROFILES",t[t.ABOUT=3]="ABOUT",t[t.PW_DETAILS=4]="PW_DETAILS",t[t.GRID=5]="GRID",t[t.HELP=6]="HELP",t[t.LAYOUT=7]="LAYOUT",t[t.CHELP=8]="CHELP",t[t.PROFILES_COLOR_SCHEME=9]="PROFILES_COLOR_SCHEME"}($e||($e={}));var za=function(t){function e(e){var i=t.call(this,e)||this;return Object.defineProperty(i,"MAX_ALLOWED_PROFILES_ENABLED",{enumerable:!0,configurable:!0,writable:!0,value:6}),Object.defineProperty(i,"selectedPathway",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"fileManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"editor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"pathwayActions",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"isModalShown",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"colorValueMap",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"portalAccessor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"alterationData",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"patientData",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(i,"pathwayGeneMap",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(i,"bestPathwaysAlgos",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(i,"oldName",{enumerable:!0,configurable:!0,writable:!0,value:""}),Object.defineProperty(i,"profiles",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(i,"setActiveEdge",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"viewOperationsManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(i,"gridOptionsManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object(r.makeObservable)(i),i.fileManager=new N,i.pathwayActions=new Wt(i.pathwayHandler,i.profiles,i.fileManager,i.handleOpen,i.props.isCBioPortal,i.props.isCollaborative),i.selectedPathway="",i.props.pathwayName&&i.pathwayActions.changePathway(i.props.pathwayName),i.isModalShown=[!1,!1,!1,!1,!1,!1,!1,!1,!1,!1],i.alterationData={},i.extractAllGenes(),i.colorValueMap={"-100":"#0000ff",0:"#ffffff",100:"#ff0000"},i.props.isCBioPortal&&(i.props.cBioAlterationData&&(i.props.patientView?(i.calculatePatientData(i.props.cBioAlterationData),i.addSampleIconData(i.props.sampleIconData)):i.calculateAlterationData(i.props.cBioAlterationData)),i.props.addGenomicDataHandler&&i.props.addGenomicDataHandler(i.addGenomicData),i.profiles.push({profileId:a.CBIO_PROFILE_NAME,enabled:!0}),i.getBestPathway(0),i.getBestPathway(1),i.getBestPathway(2),i.getBestPathway(3)),i}var a;return va(e,t),a=e,Object.defineProperty(e.prototype,"setColorMapping",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.colorValueMap=t,this.editor.updateGenomicDataColorScheme(this.colorValueMap)}}),Object.defineProperty(e.prototype,"setSelectedPathway",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.selectedPathway=t}}),Object.defineProperty(e.prototype,"setEditor",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.editor=t}}),Object.defineProperty(e.prototype,"addProfile",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.profiles.push(t)}}),Object.defineProperty(e.prototype,"toggleProfileEnabled",{enumerable:!1,configurable:!0,writable:!0,value:function(t){this.profiles[t].enabled=!this.profiles[t].enabled}}),Object.defineProperty(e.prototype,"calculateAlterationData",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this;this.alterationData[a.CBIO_PROFILE_NAME]={},t.forEach((function(t){var i=t.altered/t.sequenced*100;e.alterationData[a.CBIO_PROFILE_NAME][t.gene]=Object.is(i,NaN)?-101:i}))}}),Object.defineProperty(e.prototype,"calculatePatientData",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=this;this.alterationData[a.CBIO_PROFILE_NAME]={};var i=t.map((function(t){return t.gene})).filter((function(t,e,a){return a.indexOf(t)==e}));this.patientData.PatientView=1,i.forEach((function(t){e.patientData[t]={}})),t.forEach((function(t){var i=t.altered/t.sequenced*100;e.alterationData[a.CBIO_PROFILE_NAME][t.gene]=Object.is(i,NaN)?-101:i,e.patientData[t.gene][t.percentAltered]=Object.is(i,NaN)?-101:i,e.patientData[t.gene].geneticTrackData=t.geneticTrackData,e.patientData[t.gene].geneticTrackRuleSetParams=t.geneticTrackRuleSetParams}))}}),Object.defineProperty(e.prototype,"addSampleIconData",{enumerable:!1,configurable:!0,writable:!0,value:function(t){t&&(this.patientData.sampleColors=t.sampleColors,this.patientData.sampleIndex=t.sampleIndex)}}),Object.defineProperty(e.prototype,"getGeneStudyMap",{enumerable:!1,configurable:!0,writable:!0,value:function(t){for(var e={},a=0,i=Object.keys(t);a0;){var C=Pa.extractMax();n=C.getValue().pathwayName;o.push({score:C.getKey(),genesMatched:i[n],pathwayName:n})}0===this.bestPathwaysAlgos.length&&this.setSelectedPathway(o[0].pathwayName),this.bestPathwaysAlgos.push(o)}}),Object.defineProperty(e.prototype,"includePathway",{enumerable:!1,configurable:!0,writable:!0,value:function(t,e){for(var a={},i=0,o=t.nodes;i 4) ? lineData[4] : \"0\";\n var posY = (lineData.length > 5) ? lineData[5] : \"0\";\n var nodeW = (lineData.length > 7) ? lineData[6] : (nodeType === 'PROCESS') ? (nodeName.length * 6 + 24) : \"150\";\n var nodeH = (lineData.length > 7) ? lineData[7] : (nodeType === 'PROCESS') ? \"24\" : \"52\";\n\n if(nodeName === \" \" || nodeName === \"\"){\n //nodeName = \"No Name \" + (i + 1);\n }\n\n\n var newNode = {\n group: 'nodes',\n data:\n {\n id: nodeID,\n name: nodeName,\n type: nodeType,\n w: nodeW,\n h: nodeH,\n parent: -1\n },\n position:\n {\n x: parseInt(posX),\n y: parseInt(posY)\n }\n };\n\n if (parentID != '-1') {\n newNode.data.parent = parentID;\n }\n nodes.push(newNode);\n }\n //Read edges\n for (let i = edgesStartIndex; i < lines.length; i++) {\n //If we reach EOF we break loop\n if (lines[i].length == 0) {\n break;\n }\n\n var lineData = lines[i].split('\\t');\n var edgeID = lineData[0];\n var edgeSource = lineData[1];\n var edgeTarget = lineData[2];\n var edgeType = lineData[3];\n var pubmedIDs = (lineData.length > 4) ? lineData[4].split(';') : [];\n var label = (lineData.length > 5) ? lineData[5] : '';\n var anchorPoints = (lineData.length > 6) ? lineData[6] : '';\n var edgeCurveStyle = (lineData.length > 7) ? lineData[7] : '';\n\n var anchorPointPositions = [];\n if (anchorPoints) {\n var anchorPair = anchorPoints.split(')'); //The last element of anchorPair array is \"\"\n for (var j = 0; j < anchorPair.length - 1; j++) {\n var separatorIndex = anchorPair[j].indexOf(\";\");\n var x = anchorPair[j].substring(1, separatorIndex);\n var y = anchorPair[j].substring(separatorIndex + 1, anchorPair[j].length);\n anchorPointPositions.push({x: parseFloat(x), y: parseFloat(y)});\n }\n }\n\n var edgeData = {\n id: edgeID,//((isFound) ? edgeID : i - edgesStartIndex),\n type: edgeType,//((isFound) ? edgeType : edgeTarget),\n source: edgeSource,//((isFound) ? edgeSource : edgeID),\n target: edgeTarget,//((isFound) ? edgeTarget : edgeSource),\n pubmedIDs: pubmedIDs,\n name: label,\n }\n\n if (edgeCurveStyle === \"unbundled-bezier\") {\n edgeData['controlPointPositions'] = anchorPointPositions;\n }\n else {\n edgeData['bendPointPositions'] = anchorPointPositions;\n }\n\n const newEdge = {\n group: 'edges', \n data: edgeData\n };\n edges.push(newEdge);\n }\n return {title: title, description: description, nodes: nodes, edges: edges};\n }\n}\n","import { saveAs } from 'file-saver';\nimport { action, computed, makeObservable, observable } from 'mobx';\nimport SaveLoadUtility from '../utils/SaveLoadUtility';\nimport EditorActionsManager from './EditorActionsManager.js';\n\nexport interface IPathwayInfo{\n pathwayTitle: string;\n pathwayDetails: string;\n}\n\nexport default class FileOperationsManager{\n\n @observable\n pathwayInfo: IPathwayInfo;\n\n constructor(){\n makeObservable(this);\n this.pathwayInfo = {pathwayTitle: \"New Pathway\", pathwayDetails: \"\"};\n }\n\n\n @computed get\n getPathwayInfo(){\n return this.pathwayInfo;\n }\n\n @action\n setPathwayInfo(other: IPathwayInfo){\n this.pathwayInfo = other;\n }\n \n // see http://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript\n b64toBlob(b64Data, contentType, sliceSize = 512)\n {\n contentType = contentType || '';\n\n var byteCharacters = atob(b64Data);\n var byteArrays = [];\n\n for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {\n var slice = byteCharacters.slice(offset, offset + sliceSize);\n\n var byteNumbers = new Array(slice.length);\n for (var i = 0; i < slice.length; i++) {\n byteNumbers[i] = slice.charCodeAt(i);\n }\n\n var byteArray = new Uint8Array(byteNumbers);\n\n byteArrays.push(byteArray);\n }\n\n var blob = new Blob(byteArrays, {type: contentType});\n return blob;\n };\n\n saveAsJPEG(cy: any)\n {\n const graphData = cy.jpeg();\n // this is to remove the beginning of the pngContent: data:img/png;base64,\n const b64data = graphData.substr(graphData.indexOf(\",\") + 1);\n const imageData = this.b64toBlob(b64data, \"image/jpeg\");\n const blob = new Blob([imageData]);\n const fileName = this.pathwayInfo.pathwayTitle + \".jpg\"\n saveAs(blob, fileName);\n };\n\n saveAsSVG(editor: EditorActionsManager){\n const returnString: any = editor.exportSVG();\n const fileName = this.pathwayInfo.pathwayTitle + \".svg\"\n const blob = new Blob([returnString], {type: \"text/plain;charset=utf-8\"});\n saveAs(blob, fileName);\n }\n\n saveAsPNG(cy: any)\n {\n const graphData = cy.png();\n // this is to remove the beginning of the pngContent: data:img/png;base64,\n const b64data = graphData.substr(graphData.indexOf(\",\") + 1);\n const imageData = this.b64toBlob(b64data, \"image/png\");\n const blob = new Blob([imageData]);\n const fileName = this.pathwayInfo.pathwayTitle + \".png\"\n saveAs(blob, fileName);\n };\n \n\n saveGraph(isSIFNX: boolean, editor: EditorActionsManager)\n {\n const pathwayData = this.pathwayInfo;\n const returnString = (isSIFNX) ? SaveLoadUtility.exportAsSIFNX(editor.cy):\n SaveLoadUtility.exportGraph(pathwayData, editor.cy, editor.edgeEditing);\n const blob = new Blob([returnString], {type: \"text/plain;charset=utf-8\"});\n const fileName = pathwayData.pathwayTitle + \".txt\";\n saveAs(blob, fileName);\n };\n}","import _ from \"lodash\";\n\nexport default class GridOptionsManager\n{\n\n static defaultGridGuideOptions = \n {\n // On/Off Modules\n /* From the following four snap options, at most one should be true at a given time */\n snapToGridOnRelease: false, // Snap to grid on release\n snapToGridDuringDrag: false, // Snap to grid during drag\n snapToAlignmentLocationOnRelease: false, // Snap to alignment location on release\n snapToAlignmentLocationDuringDrag: false, // Snap to alignment location during drag\n distributionGuidelines: false, // Distribution guidelines\n geometricGuideline: false, // Geometric guidelines\n initPosAlignment: false, // Guideline to initial mouse position\n centerToEdgeAlignment: false, // Center to edge alignment\n resize: false, // Adjust node sizes to cell sizes\n parentPadding: false, // Adjust parent sizes to cell sizes by padding\n drawGrid: false, // Draw grid background\n\n // General\n gridSpacing: 20, // Distance between the lines of the grid.\n\n // Draw Grid\n zoomDash: true, // Determines whether the size of the dashes should change when the drawing is zoomed in and out if grid is drawn.\n panGrid: true, // Determines whether the grid should move then the user moves the graph if grid is drawn.\n gridStackOrder: -1, // Namely z-index\n gridColor: '#dedede', // Color of grid lines\n lineWidth: 1.0, // Width of grid lines\n\n // Guidelines\n guidelinesStackOrder: 4, // z-index of guidelines\n guidelinesTolerance: 5.00, // Tolerance distance for rendered positions of nodes' interaction.\n guidelinesStyle: { // Set ctx properties of line. Properties are here:\n strokeStyle: \"#4286f4\", // color of geometric guidelines\n geometricGuidelineRange: 750, // range of geometric guidelines\n range: 500, // max range of distribution guidelines\n minDistRange: 10, // min range for distribution guidelines\n distGuidelineOffset: 10, // shift amount of distribution guidelines\n horizontalDistColor: \"#4286f4\", // color of horizontal distribution alignment\n verticalDistColor: \"#4286f4\", // color of vertical distribution alignment\n initPosAlignmentColor: \"#34495E\", // color of alignment to initial mouse location\n lineDash: [6, 8], // line style of geometric guidelines\n horizontalDistLine: [0, 0], // line style of horizontal distribution guidelines\n verticalDistLine: [0, 0], // line style of vertical distribution guidelines\n initPosAlignmentLine: [0, 0], // line style of alignment to initial mouse position\n },\n\n // Parent Padding\n parentSpacing: -1 // -1 to set paddings of parents to gridSpacing\n };\n currentProperties: any;\n cy: any;\n constructor(cy: any)\n {\n this.cy = cy;\n\n this.currentProperties = {};\n this.changeParameters(GridOptionsManager.defaultGridGuideOptions);\n\n }\n\n changeParameters(params)\n {\n this.currentProperties = _.clone(params);\n this.refreshGridOptionsExtension();\n }\n\n getCurrentOptions()\n {\n return this.currentProperties;\n }\n\n getDefaultOptions()\n {\n return GridOptionsManager.defaultGridGuideOptions;\n }\n\n setSnapToGuidelines(state)\n {\n this.currentProperties.geometricGuideline = state;\n this.currentProperties.snapToAlignmentLocationDuringDrag = state;\n this.currentProperties.distributionGuidelines = state;\n this.refreshGridOptionsExtension();\n //this.appManager.gridOptionsView.changeParameters();\n }\n\n setShowGrid(state)\n {\n this.currentProperties.drawGrid = state;\n this.currentProperties.snapToGridDuringDrag = state;\n this.refreshGridOptionsExtension();\n }\n\n refreshGridOptionsExtension()\n {\n this.cy.gridGuide(this.currentProperties);\n }\n\n //TODO expose individual functions related for changing parameters from toolbar here\n\n}\n","import EditorActionsManager from \"./EditorActionsManager\";\n\nexport default class ViewOperationsManager{\n movedNodes: any[];\n editor: EditorActionsManager;\n cy: any;\n\n constructor(editor: EditorActionsManager,cy: any)\n {\n this.cy = cy;\n this.editor = editor;\n this.movedNodes = [];\n }\n\n //TODO use align function from cytoscape.js-grid-guide extension\n handleNodeAlignment(param)\n {\n var tmpNodes = this.editor.selectedNodeStack;\n var nodes = this.cy.collection();\n var nodeMap = {};\n this.movedNodes = [];\n\n for (const key in tmpNodes)\n {\n nodes = nodes.add(tmpNodes[key]);\n }\n\n nodes.forEach(function(node)\n {\n if (node.isParent())\n {\n nodeMap[node.id()] = node;\n }\n });\n\n\n if (nodes.length > 0)\n {\n var firstSelected = nodes[0];\n var firstBbox = firstSelected.boundingBox();\n //OuterHeight variable added due to miscalculation of boundingBox function in pathwaymapper\n var firstOuterHeight = firstSelected.outerHeight();\n var self = this;\n nodes.forEach(function(node,index)\n {\n if (index == 0)\n {\n return ;\n }\n\n //If parent of selected node is in selection do nothing !\n if (nodeMap[node.parent().id()] == null)\n {\n var newPosition = self.calculateNewPosition(param, node, firstBbox, firstOuterHeight);\n //Recursively traverse leaf nodes\n self.changePosition(node,0,0,newPosition);\n }\n });\n this.editor.handleChangePositionByAlignment(self.movedNodes);\n }\n }\n\n /*\n Determine new position according to the alignment\n node that node.position works on center positions thats why all calculations\n are performed accordingly\n */\n calculateNewPosition(param, node, referenceBbox, referenceOuterHeight)\n {\n var currentPos = node.position();\n var currentBbox = node.boundingBox();\n var newPosition;\n //This parameter is used to move the compounds less upwards when they contain label\n var moveParam = node.isParent() ? node.outerHeight() - ((currentBbox.h - node.outerHeight())/2) - ((node.outerHeight() - node.height())/2) : node.height();\n //This param is used only when the node is parent, for simple nodes is 0\n var labelHeight = node.isParent()? currentBbox.h - node.outerHeight(): 0;\n\n if (param === 'vLeft')\n {\n newPosition = {x: referenceBbox.x1+currentBbox.w/2, y: currentPos.y};\n }\n else if (param === 'vCen')\n {\n newPosition = {x: referenceBbox.x1+referenceBbox.w/2, y: currentPos.y};\n }\n else if (param === 'vRight')\n {\n newPosition = {x: referenceBbox.x2-currentBbox.w/2, y: currentPos.y};\n }\n else if (param === 'hTop')\n {\n newPosition = {x: currentPos.x, y: referenceBbox.y1 + currentBbox.h/2};\n }\n //Checks for the case where compounds don't have names (name isn't taken in consideration in that case)\n else if (param === 'hMid' && node.isParent() && node.data('name') == \"\")\n {\n newPosition = {x: currentPos.x, y: referenceBbox.y1 + referenceBbox.h/2};\n }\n else if (param === 'hMid' )\n {\n newPosition = {x: currentPos.x, y: referenceBbox.y1 + referenceOuterHeight/2 + labelHeight/2};\n }\n //Checks for the case where compounds don't have names (name isn't taken in consideration in that case)\n else if (param === 'hBot' && node.isParent() && node.data('name') == \"\")\n {\n newPosition = {x: currentPos.x, y: referenceBbox.y2 - currentBbox.h/2};\n }\n else if (param === 'hBot')\n {\n newPosition = {x: currentPos.x, y: referenceBbox.y1 + referenceOuterHeight - moveParam/2};\n }\n else {\n console.log('Error: wrong alignment name ' + param);\n return;\n }\n\n return newPosition;\n }\n\n //Recursively move leaf nodes\n changePosition(node, dx, dy, newPos)\n {\n if (node.isParent())\n {\n var childNodes = node.children();\n var parentBbox = node.boundingBox();\n var self = this;\n childNodes.forEach(function(childNode, index)\n {\n var childBbox = childNode.boundingBox();\n var _dx = -(parentBbox.x1 - childBbox.x1)-parentBbox.w/2+childBbox.w/2;\n var _dy = -(parentBbox.y1 - childBbox.y1)-parentBbox.h/2+childBbox.h/2;\n\n //If further compound node is found, set position accordingly\n if (childNode.isParent())\n {\n self.changePosition(childNode, 0, 0, {x: newPos.x+_dx, y:newPos.y+_dy});\n }\n else\n {\n self.changePosition(childNode, _dx, _dy, newPos);\n }\n\n });\n }\n else\n {\n //Move locally and let editor actions manager know a move happened\n //If in collaborative mode editor actions manager will update collaborative model\n var position =\n {\n x: newPos.x+dx,\n y: newPos.y+dy\n };\n\n this.movedNodes.push({node: node, nextPosition: position, oldPosition: null});\n }\n }\n\n}\n","import React from 'react';\nimport { Modal } from 'react-bootstrap';\nimport { EModalType } from '../ui/react-pathway-mapper';\ninterface IAboutModalProps{\n show: boolean;\n handleClose: Function;\n}\n\nexport default class AboutModal extends React.Component {\n\n constructor(props: IAboutModalProps){\n super(props);\n }\n\n render(){\n\n\n return(\n \n {this.props.handleClose(EModalType.ABOUT)}}\n >\n \n About\n \n \n

PathwayMapper 2.2

\n
\n \"\"\n
\n
\n \"\"\n
\n
\n

i-Vis information Visualization Lab

\n

Bilkent University, Ankara, Turkey

\n
\n
\n

Memorial Sloan-Kettering Cancer Center

\n

New York, USA

\n
\n
\n \n https://github.com/iVis-at-Bilkent/pathway-mapper\n \n \n\n )\n\n\n }\n\n}\n","import { RGBAColor, shapeToSvg } from 'oncoprintjs';\nimport React from 'react';\nimport { Modal } from 'react-bootstrap';\n// @ts-ignore\nimport openImage from \"../images/toolbar/edit.svg\";\n// @ts-ignore\nimport layoutImage from \"../images/toolbar/layout-cose.svg\";\n// @ts-ignore\nimport savePNGImage from \"../images/toolbar/save_png.svg\";\n// @ts-ignore\nimport saveSVGImage from \"../images/toolbar/save_svg.svg\";\nimport { EModalType } from '../ui/react-pathway-mapper';\n// @ts-ignore\nconst addSelImage = require(\"../images/toolbar/add-selected.svg\");\n// @ts-ignore\nconst addAllImage = require(\"../images/toolbar/add-all.svg\");\n\n\ninterface ICBioHelpModalProps{\n show: boolean;\n handleClose: (modalId: EModalType) => void;\n patientView ?: boolean;\n}\n\n// https://github.com/cBioPortal/cbioportal-frontend/blob/29a93c5e992ca1affd3d027355015164ae3602bd/src/shared/lib/Colors.ts\nconst CNA_COLOR_AMP = '#ff0000';\nconst CNA_COLOR_HOMDEL = '#0000ff';\nconst DEFAULT_GREY = '#bebebe';\nconst MUT_COLOR_MISSENSE = '#008000';\nconst MUT_COLOR_MISSENSE_PASSENGER = '#53D400';\nconst MUT_COLOR_INFRAME = '#993404';\nconst MUT_COLOR_INFRAME_PASSENGER = '#a68028';\nconst MUT_COLOR_TRUNC = '#000000';\nconst MUT_COLOR_TRUNC_PASSENGER = '#708090';\nconst MUT_COLOR_FUSION = '#8B00C9';\nconst MUT_COLOR_PROMOTER = '#00B7CE';\nconst MUT_COLOR_OTHER = '#cf58bc';\nconst MUT_COLOR_GERMLINE = '#FFFFFF';\n\nexport function hexToRGBA(str: string): [number, number, number, number] {\n const r = parseInt(str[1] + str[2], 16);\n const g = parseInt(str[3] + str[4], 16);\n const b = parseInt(str[5] + str[6], 16);\n return [r, g, b, 1];\n}\n\n// always used shape\nconst defaultShape = {\n type: 'rectangle',\n fill: hexToRGBA(DEFAULT_GREY),\n x: 0,\n y: 0,\n width: 6,\n height: 20,\n stroke: [0,0,0,0] as RGBAColor,\n 'stroke-width': 0\n};\n\nconst labels = [\n 'Amplification',\n 'Deep Deletion',\n 'Fusion',\n 'Germline Mutation',\n 'Missense Mutation (putative driver)',\n 'Missense Mutation (unknown significance)',\n 'Other Mutation',\n 'Promoter Mutation',\n 'Truncating Mutation (putative driver)',\n 'Truncating Mutation (unknown significance)',\n 'Inframe Mutation (putative driver)',\n 'Inframe Mutation (unknown significance)'\n];\n\n// conditional shapes\nconst shapeBank = [\n {\n type: 'rectangle',\n fill: hexToRGBA(CNA_COLOR_AMP),\n x: 0,\n y: 0,\n width: 6,\n height: 20\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(CNA_COLOR_HOMDEL),\n x: 0,\n y: 0,\n width: 6,\n height: 20\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_FUSION),\n x: 0,\n y: 4,\n width: 6,\n height: 12\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_GERMLINE),\n x: 0,\n y: 8.75,\n width: 6,\n height: 1.6\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_MISSENSE),\n x: 0,\n y: 6.66,\n width: 6,\n height: 6.66\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_MISSENSE_PASSENGER),\n x: 0,\n y: 6.66,\n width: 6,\n height: 6.66\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_OTHER),\n x: 0,\n y: 6.66,\n width: 6,\n height: 6.66\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_PROMOTER),\n x: 0,\n y: 6.66,\n width: 6,\n height: 6.66\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_TRUNC),\n x: 0,\n y: 6.66,\n width: 6,\n height: 6.66\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_TRUNC_PASSENGER),\n x: 0,\n y: 6.66,\n width: 6,\n height: 6.66\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_INFRAME),\n x: 0,\n y: 6.66,\n width: 6,\n height: 6.66\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_INFRAME_PASSENGER),\n x: 0,\n y: 6.66,\n width: 6,\n height: 6.66\n },\n];\n\nexport default class CBioHelpModal extends React.Component{\n\n\n constructor(props: ICBioHelpModalProps){\n super(props);\n }\n\n generateOncoprintLegend() {\n const svgNameSpace = 'http://www.w3.org/2000/svg'\n const svgElement = document.createElementNS(svgNameSpace, 'svg')\n\n const legendEleWidth = 280\n \n const cellWidth = 6\n const cellHeight = 23\n const cellVerticalPadding = 15\n const cellMarginRight = cellWidth + 3\n\n shapeBank.forEach((shape, index) => {\n const offsetX = (index % 3) * (legendEleWidth)\n const textOffsetX = offsetX + cellMarginRight\n const offsetY = Math.floor(index / 3) * (cellHeight + cellVerticalPadding)\n const textOffsetY = offsetY + 15\n const g = document.createElementNS(svgNameSpace, 'g')\n if (!shape[\"stroke\"]) {\n shape[\"stroke\"] = [0,0,0,0];\n shape[\"stroke-width\"] = 0;\n }\n g.appendChild(shapeToSvg(defaultShape, offsetX, offsetY))\n g.appendChild(shapeToSvg(shape, offsetX, offsetY))\n \n const text = document.createElementNS(svgNameSpace, 'text');\n text.setAttributeNS(null, 'x', textOffsetX.toString());\n text.setAttributeNS(null, 'y', textOffsetY.toString());\n text.setAttributeNS(null, 'font-size', '12');\n text.setAttributeNS(null, 'font-family', 'Arial');\n var textNode = document.createTextNode(labels[index]);\n text.appendChild(textNode)\n\n g.appendChild(text);\n svgElement.appendChild(g)\n });\n\n svgElement.setAttribute(\n 'width', '840')\n svgElement.setAttribute(\n 'height','175')\n svgElement.style.paddingTop = '20px'\n // This is important you need to include this to succesfully render in cytoscape.js!\n svgElement.setAttribute('xmlns', svgNameSpace)\n \n return svgElement\n }\n\n render(){\n\n const legendPadding = '45px';\n\n return( \n {this.props.handleClose(EModalType.CHELP)}}>\n \n PathwayMapper cBioPortal Edition 2.2\n \n {(!this.props.patientView &&\n \n

\n PathwayMapper shows you your genes of interest with the alteration frequencies of selected genetic profiles of the chosen study overlaid on a TCGA pathway using a white to red color scale (the more frequently altered a gene is, the more red it's shown). All available TCGA pathways are ranked with the aim to choose the pathway that matches your interest the most. By default we display the pathway with highest ranking with the default ranking options but you may look at your genes of interest in the context of other pathways as well by choosing from the pathway table. \n
\n
\n Refer to the documentation here for the notation used.\n
\n
\n To search for a particular pathway of your interest, use the search field on top of the pathway table. To switch to another pathway, click on the button in the associated row of the pathway table. Ranking criteria might be changed by changing the options at the bottom of the table. \n
\n
\n The buttons on top of the pathway are:\n

    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Save as PNG
    Save as SVG
    Perform layout: Layout is recalculated taking current node positions into account
    Add selected genes to query: You may select additional genes from the pathway by left clicking (Shift + left click to add more genes)
    Add all valid genes to query: All valid gene symbols will be added to the query; others will be ignored
    Edit pathway: Edit both the topology and the geometry of the current pathway with the full blown PathwayMapper editor
    \n
\n

\n
)\n },\n {(this.props.patientView &&\n \n

\n PathwayMapper shows you your genes of interest with the mutation types, copy number alterations and fusions of selected genetic profiles of the chosen study overlaid on a TCGA pathway using the OncoPrint color scheme. All available TCGA pathways are ranked with the aim to choose the pathway that matches your interest the most. By default we display the pathway with the highest number of genes of interest matching the ones in a pathway but you may look at your genes of interest in the context of other pathways as well by choosing from the pathway table. \n
\n
\n Refer to the documentation here for the notation used.\n
\n
\n Genetic alteration legend:\n
\n

\n
\n

Putative driver and unknown significance annotations are based on data from OncoKB and CancerHotspots.org.

\n
\n To search for a particular pathway of your interest, use the search field on top of the pathway table. To switch to another pathway, click on the button in the associated row of the pathway table.\n
\n
\n The buttons on top of the pathway are:\n
    \n \n \n \n \n \n \n \n \n \n \n
    Save as PNG
    Save as SVG
    Perform layout: Layout is recalculated taking current node positions into account
    \n
\n

\n
\n )}\n
\n\n );\n }\n\n}\n","import { makeObservable, observable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\nimport { Button, Checkbox, Col, ControlLabel, Form, FormControl, Row, Modal } from 'react-bootstrap';\nimport GridOptionsManager from '../managers/GridOptionsManager';\nimport { EModalType } from '../ui/react-pathway-mapper';\nimport PathwayActions from '../utils/PathwayActions';\ninterface IGridSettingsProps{\n show: boolean;\n handleClose: Function;\n pathwayActions: PathwayActions;\n}\n\nexport enum EGridType{\n GRID,\n GUIDE,\n NONE\n}\n\n@observer\nexport default class GridSettings extends React.Component{\n\n\n\n @observable\n private gridSize: number;\n \n @observable\n private guideColor: string;\n\n private defaultSettings = GridOptionsManager.defaultGridGuideOptions;\n\n @observable\n private enabledType: EGridType;\n constructor(props: IGridSettingsProps){\n super(props);\n makeObservable(this);\n \n this.gridSize = this.defaultSettings.gridSpacing;\n this.guideColor = this.defaultSettings.guidelinesStyle.strokeStyle;\n }\n\n setEnabledType(newType: EGridType){\n if(newType === this.enabledType){\n this.enabledType = EGridType.NONE;\n return;\n }\n\n this.enabledType = newType;\n }\n\n render(){\n\n return(\n {this.enabledType = this.props.pathwayActions.enabledType;}}\n onHide={() => {\n this.props.handleClose(EModalType.GRID);\n }}>\n \n \n Grid Settings\n \n \n \n
\n \n \n Enable Grids:\n \n\n \n {this.setEnabledType(EGridType.GRID);}}>\n \n \n \n \n Enable Guidelines:\n \n\n \n {this.setEnabledType(EGridType.GUIDE);}}>\n \n \n \n \n Grid Size:\n \n\n \n {this.gridSize = e.target.value;}}/>\n \n \n \n \n Guideline Color:\n \n\n \n {this.guideColor = e.target.value;}}/>\n \n \n
\n
\n\n \n \n \n
\n );\n\n\n } \n}","import React from 'react';\nimport {Modal, Button} from 'react-bootstrap';\nimport { EModalType } from '../ui/react-pathway-mapper';\n\ninterface IConfirmationModalProps{\n show: boolean;\n handleClose: (modalId: EModalType) => void;\n}\n\nexport default class ConfirmationModal extends React.Component{\n\n static pendingFunction: Function;\n\n constructor(props: IConfirmationModalProps){\n super(props);\n\n }\n\n render(){\n\n\n return(\n {this.props.handleClose(EModalType.CONFIRMATION);}}\n >\n \n Confirmation\n \n \n
\n All unsaved changes will be lost. Do you want to continue?\n
\n
\n \n \n \n\n \n \n );\n }\n}","import _ from \"lodash\";\nimport { IColorValueMap } from \"../ui/react-pathway-mapper\";\nimport GraphUtilities from \"../utils/GraphUtilities\";\nimport EditorActionsManager from \"./EditorActionsManager\";\n\nlet sharedb;\nlet socket;\nlet connection;\n\nexport default class ShareDBManager {\n\n readonly NODEMAP_NAME = 'nodes';\n readonly EDGEMAP_NAME = 'edges';\n readonly LAYOUT_PROPS_NAME = 'layoutProperties';\n readonly GLOBAL_OPTS_NAME = 'globalOptions';\n //For storing genomic data information per gene\n readonly GENOMIC_DATA_MAP_NAME = 'genomicDataMap';\n //For storing visibility information of genomic data according to the cancer type\n readonly VISIBLE_GENOMIC_DATA_MAP_NAME = 'visibleGenomicDataMapByType';\n readonly GENOMIC_DATA_GROUP_NAME = 'genomicDataGroupList';\n readonly GENOMIC_DATA_GROUP_COUNT = 'genomicDataGroupCount';\n readonly GENOMIC_DATA_COLOR_SCHEME_NAME = 'genomicDataColorScheme';\n \n doc: any;\n postFileLoad: any;\n editor: EditorActionsManager;\n constructor(postFileLoadCallback) {\n //Doc data maps names and keys\n this.postFileLoad = postFileLoadCallback;\n };\n\n\n\n getDoc(){\n return this.doc;\n }\n\n setEditor(editor: EditorActionsManager){\n this.editor = editor;\n }\n\n //Applies any given sharDB opeation to shared document and notifies other clients\n applyShareDBOperation(op) {\n this.doc.submitOp(op, this.shareDBError);\n };\n\n //Clears genomic data in shared document and notifies other clients\n clearShareDBGenomicData() {\n var ops = [];\n var genomicMap = this.doc.data[this.GENOMIC_DATA_MAP_NAME];\n var visMap = this.doc.data[this.VISIBLE_GENOMIC_DATA_MAP_NAME];\n var genomicDataGroupMap = this.doc.data[this.GENOMIC_DATA_GROUP_NAME];\n var genomicDataGroupCount = this.doc.data[this.GENOMIC_DATA_GROUP_COUNT];\n //Reset all genomic maps\n for (const key of Object.keys(genomicMap)) {\n ops.push({p: [this.GENOMIC_DATA_GROUP_NAME, key], od: genomicMap[key]});\n }\n for (const key of Object.keys(visMap)) {\n ops.push({p: [this.VISIBLE_GENOMIC_DATA_MAP_NAME, key], od: visMap[key]});\n }\n for (const key of Object.keys(genomicDataGroupMap)) {\n ops.push({p: [this.GENOMIC_DATA_GROUP_NAME, key], od: genomicDataGroupMap[key]});\n }\n //Reset genomic data group count to 0\n ops.push({p: [this.GENOMIC_DATA_GROUP_COUNT], na: -genomicDataGroupCount});\n this.doc.submitOp(ops, this.shareDBError);\n };\n\n /*\n * Updates shared document object\n * @param mapName: map name of the object\n * @param objectKey: key of the object\n * @param object: new object\n *\n */\n updateShareDBObject(mapName, objectKey, object) {\n this.doc.submitOp([{\n p: [mapName, objectKey],\n od: this.doc.data[mapName][objectKey],\n oi: object\n }], this.shareDBError);\n };\n\n /*\n * Inserts a new shared document object\n * @param mapName: map name of the object\n * @param objectKey: key of the object\n * @param object: new object\n *\n */\n insertShareDBObject(mapName, objectKey, object) {\n this.doc.submitOp([{p: [mapName, objectKey], oi: object}], this.shareDBError);\n };\n\n /*\n * Deletes a shared document object\n * @param mapName: map name of the object\n * @param objectKey: key of the object\n *\n */\n deleteShareDBObject(mapName, objectKey) {\n this.doc.submitOp([{p: [mapName, objectKey], od: this.doc.data[mapName][objectKey]}], this.shareDBError);\n };\n\n //Initializes layout properties of the shared document\n initializeShareDBLayoutProperties() {\n this.doc.submitOp([{\n p: [this.LAYOUT_PROPS_NAME, 0],\n li: [this.editor.layoutProperties]\n }], this.shareDBError);\n };\n\n //Initializes global options of the shared document\n initializeShareDBGlobalOptions() {\n this.doc.submitOp([{\n p: [this.GLOBAL_OPTS_NAME, 0],\n li: [this.editor.getGlobalOptions()]\n }], this.shareDBError);\n };\n\n /*\n * Updates layout properties of the shared document and notifies other clients\n * @param object: new layout properties object\n *\n */\n updateShareDBLayoutProperties(object) {\n this.doc.submitOp([{\n p: [this.LAYOUT_PROPS_NAME, 0],\n ld: this.doc.data[this.LAYOUT_PROPS_NAME][0],\n li: object\n }], this.shareDBError);\n };\n\n /*\n * Updates global options of the shared document and notifies other clients\n * @param object: new global options object\n *\n */\n updateShareDBGlobalOptions(object) {\n this.doc.submitOp([{\n p: [this.GLOBAL_OPTS_NAME, 0],\n ld: this.doc.data[this.GLOBAL_OPTS_NAME][0],\n li: object\n }], this.shareDBError);\n };\n\n updateShareDBGenomicDataOverlayColorScheme(object : IColorValueMap) {\n this.doc.submitOp([{\n p: [this.GENOMIC_DATA_COLOR_SCHEME_NAME, 0],\n ld: this.doc.data[this.GENOMIC_DATA_COLOR_SCHEME_NAME][0],\n li: object\n }], this.shareDBError);\n };\n\n //Increments shared data group count\n //Use this function to increment and keep the group count synchronized\n incrementShareDBGroupCount() {\n this.doc.submitOp([{p: [this.GENOMIC_DATA_GROUP_COUNT], na: 1}], this.shareDBError);\n };\n\n //Checks whether given operation is a replace or add/delete operation\n isShareDBReplaceEvent(op) {\n return (op.hasOwnProperty(\"oi\") && op.hasOwnProperty(\"od\"))\n || (op.hasOwnProperty(\"li\") && op.hasOwnProperty(\"ld\"));\n };\n\n /*\n * Gets the initial value of the shared document\n * without this function shared document values cannot be reached\n */\n initializeSharedDBDoc() {\n this.doc.subscribe();\n };\n\n shareDBError(err) {\n if (err) {\n console.error(err);\n }\n };\n\n initShareDB() {\n sharedb = require('sharedb/lib/client');\n socket = new WebSocket('ws://' + window.location.host);\n connection = new sharedb.Connection(socket);\n\n var self = this;\n\n var id = this.getParam('id');\n\n var loadFileCallback = function () {\n self.onFileLoaded();\n };\n\n //Creates new shared db document and initializes values\n var createNewDocument = () => {\n var new_id = self.getCustomObjId();\n var data = {\n nodes: {},\n edges: {},\n layoutProperties: [this.editor.layoutProperties],\n globalOptions: [this.editor.getGlobalOptions()],\n genomicDataMap: {},\n visibleGenomicDataMapByType: {},\n genomicDataGroupList: {},\n genomicDataGroupCount: 0,\n genomicDataColorScheme: [{\n '-100' : \"#0000ff\",\n '0' : \"#ffffff\",\n '100' : \"#ff0000\"\n }]\n };\n window.history.pushState(null, null, '?id=' + new_id);\n self.doc = connection.get('cy', new_id);\n self.doc.create(data, loadFileCallback);\n };\n\n //Check if id exists in parameters\n //If exists open the shared document\n if (id) {\n // Check any document exists with given id\n this.doc = connection.get('cy', id);\n this.doc.fetch(function (err) {\n if (err)\n throw err;\n\n if (self.doc.type === null) {\n createNewDocument();\n return;\n }\n self.doc.subscribe(loadFileCallback);\n });\n }\n else {\n //Create new shared document\n createNewDocument();\n }\n };\n\n /*\n * After a file has been initialized and loaded, we can access the\n * document. We will wire up the data in shared document to the UI.\n *\n */\n onFileLoaded() {\n this.initializeSharedDBDoc();\n this.syncInitialSharedDocData();\n this.initSharedDocEventHandlers();\n\n this.postFileLoad();\n };\n\n /*\n * Synchronizes initial data in the shared document to\n * client's application.\n */\n syncInitialSharedDocData() {\n var self = this;\n var nodeMap = self.doc.data[this.NODEMAP_NAME];\n var edgeMap = self.doc.data[this.EDGEMAP_NAME];\n var shareDBLayoutProperties = self.doc.data[this.LAYOUT_PROPS_NAME][0];\n var globalOptions = self.doc.data[this.GLOBAL_OPTS_NAME][0];\n var genomicDataMap = self.doc.data[this.GENOMIC_DATA_MAP_NAME];\n var visDataMap = self.doc.data[this.VISIBLE_GENOMIC_DATA_MAP_NAME];\n var groupedGenomicDataMap = self.doc.data[this.GENOMIC_DATA_GROUP_NAME];\n var groupedGenomicDataCount = self.doc.data[this.GENOMIC_DATA_GROUP_COUNT];\n let genomicDataColorScheme = self.doc.data[this.GENOMIC_DATA_COLOR_SCHEME_NAME][0];\n\n var invalidGenes = [];\n var highlightedGenes = [];\n var invalidHighlightedGenes = [];\n var hiddenGenes = [];\n for (const key of Object.keys(nodeMap)) {\n var tmpNode = nodeMap[key];\n var tmpNodeId = tmpNode.id;\n\n if (tmpNode.isInvalidGene && tmpNode.isHighlighted) {\n invalidHighlightedGenes.push(tmpNodeId);\n }\n else if (tmpNode.isInvalidGene) {\n invalidGenes.push(tmpNodeId);\n }\n else if (tmpNode.isHighlighted) {\n highlightedGenes.push(tmpNodeId);\n }\n if (tmpNode.isHidden) {\n hiddenGenes.push(tmpNodeId);\n }\n }\n var highlightedEdges = [];\n for (const key of Object.keys(edgeMap)) {\n var tmpEdge = edgeMap[key];\n var tmpEdgeId = tmpEdge.id;\n if (tmpEdge.isHighlighted) {\n highlightedEdges.push(tmpEdgeId);\n }\n }\n\n //TODO Workaround for legacy pathways\n\n // Workaround for backward compatibility of legacy pathways\n // Addition of pubmed id field on server if legacy collaborative\n // pathways does not have !\n for (const key of Object.keys(edgeMap)) {\n const tmpEdge = edgeMap[key];\n\n if (tmpEdge.pubmedIDs == undefined \n || tmpEdge.name == undefined \n || tmpEdge.bendPoint == undefined \n || tmpEdge.anchorPoints == undefined\n || tmpEdge.edgeCurveStyle == undefined) {\n const pubmedIDs = (tmpEdge.pubmedIDs == undefined) ? [] : tmpEdge.pubmedID;\n const edgeLabel = (tmpEdge.name == undefined) ? \"\" : tmpEdge.name;\n let anchorPoints = [];\n if (tmpEdge.bendPoint) {\n anchorPoints = tmpEdge.bendPoint;\n }\n else if (tmpEdge.anchorPoints) {\n anchorPoints = tmpEdge.anchorPoints;\n }\n const edgeCurveStyle = tmpEdge.edgeCurveStyle ? tmpEdge.edgeCurveStyle : \"bezier\";\n\n const param = {\n type: tmpEdge.type,\n source: tmpEdge.source,\n id: self.getCustomObjId(),\n target: tmpEdge.target,\n pubmedID: pubmedIDs,\n name: edgeLabel,\n anchorPoints: anchorPoints,\n edgeCurveStyle: edgeCurveStyle\n };\n\n const newEdge: any = self.edgeInitializer(param);\n\n\n const tmpEdgeID = tmpEdge.id;\n const newEdgeID = newEdge.id;\n\n const ops = [\n {p: [self.EDGEMAP_NAME, tmpEdgeID], od: tmpEdge},\n {p: [self.EDGEMAP_NAME, newEdgeID], oi: newEdge}\n ]\n self.applyShareDBOperation(ops);\n }\n\n }\n\n //Add real time nodes to local graph\n this.editor.addNewElementsLocally(nodeMap, edgeMap);\n //Adds different type of highlight to nodes and hides if their property is hidden\n this.editor.highlightElementsInitially(invalidHighlightedGenes, invalidGenes, highlightedGenes, highlightedEdges, hiddenGenes);\n\n //Update layout properties & global options!!\n if (shareDBLayoutProperties.name == \"cose-bilkent\") {\n shareDBLayoutProperties.name = \"fcose\";\n this.updateLayoutProperties(shareDBLayoutProperties);\n }\n this.editor.updateLayoutPropertiesCallback({li: shareDBLayoutProperties});\n this.editor.changeGlobalOptions({li: globalOptions});\n\n //Sync already available genomic data !\n\n if (!groupedGenomicDataMap) {\n\n self.insertShareDBObject(self.GENOMIC_DATA_MAP_NAME, '0', []);\n for (const key of Object.keys(visDataMap)) {\n var currentMap = _.clone(groupedGenomicDataMap['0']);\n // currentMap.push(visibilityMapKeys[key]);\n self.updateShareDBObject(self.GENOMIC_DATA_MAP_NAME, '0', currentMap);\n }\n }\n\n if (!groupedGenomicDataCount) {\n var count = self.doc.data[self.GENOMIC_DATA_GROUP_COUNT];\n var op = [{\n p: [self.GENOMIC_DATA_GROUP_COUNT],\n na: -count\n }];\n self.applyShareDBOperation(op);\n groupedGenomicDataCount = self.doc.data[self.GENOMIC_DATA_GROUP_COUNT];\n }\n\n if (!genomicDataColorScheme) {\n self.insertShareDBObject(self.GENOMIC_DATA_COLOR_SCHEME_NAME, '0', this.editor.getGenomicDataOverlayColorScheme());\n genomicDataColorScheme = self.doc.data[self.GENOMIC_DATA_COLOR_SCHEME_NAME]['0'];\n }\n\n this.editor.updateGenomicDataColorSchemeHandler({li: genomicDataColorScheme});\n\n for (const key_g of Object.keys(genomicDataMap)) {\n this.editor.genomicDataOverlayManager.genomicDataMap[key_g] =\n genomicDataMap[key_g];\n\n }\n\n for (const key_g of Object.keys(groupedGenomicDataMap)) {\n this.editor.genomicDataOverlayManager.groupedGenomicDataMap[key_g] =\n groupedGenomicDataMap[key_g];\n const data = groupedGenomicDataMap[key_g];\n if(data.length !== 1){\n console.log(\"Grouped genomic data expected to be of length 1 (from sync)\");\n }\n data.forEach((profileId: any) => {this.editor.addToProfiles(profileId)});\n }\n\n for (const key_g of Object.keys(visDataMap)) {\n this.editor.genomicDataOverlayManager.visibleGenomicDataMapByType[key_g] =\n visDataMap[key_g];\n this.editor.adjustVisibilityShareDB(key_g, visDataMap[key_g]);\n \n }\n\n //Does not seem necessary for not but just for sake of completeness\n this.editor.genomicDataOverlayManager.groupedGenomicDataCount = groupedGenomicDataCount;\n\n this.editor.genomicDataOverlayManager.showGenomicData();\n this.editor.genomicDataOverlayManager.notifyObservers();\n this.editor.cy.fit(50);\n };\n\n /*\n * Initialize event listeners for any operation coming from shareDB\n *\n */\n initSharedDocEventHandlers () {\n\n var self = this;\n\n //Setup event handlers for maps\n var nodeAddRemoveHandler = function (op) {\n self.editor.shareDBNodeAddRemoveEventCallBack(op);\n };\n\n var edgeAddRemoveHandler = function (op) {\n self.editor.shareDBEdgeAddRemoveEventCallBack(op);\n };\n\n var genomicDataAddRemoveHandler = function (op) {\n self.editor.shareDBGenomicDataHandler(op);\n };\n\n var genomicDataVisibilityChangeHandler = function (op) {\n self.editor.shareDBGenomicDataVisibilityHandler(op);\n self.checkShareDBGenomicData();\n };\n\n var genomicDataGroupChangeHandler = function (op) {\n self.editor.shareDBGenomicDataGroupChangeHandler(op);\n };\n\n var updateElementHandler = function (op) {\n self.editor.updateElementCallback(op);\n };\n\n var updateLayoutPropsHandler = function (op) {\n self.editor.updateLayoutPropertiesCallback(op);\n };\n\n var updateGlobalOptionsHandler = function (op) {\n self.editor.changeGlobalOptions(op);\n };\n\n var updateGenomicDataColorSchemeHandler = function (op) {\n self.editor.updateGenomicDataColorSchemeHandler(op);\n }\n\n\n //Event listeners for maps\n this.doc.on('op', function (op, source) {\n for (var i = 0; i < op.length; i++) {\n var handleOp = op[i];\n var path = handleOp.p[0];\n var isReplaceEvent = self.isShareDBReplaceEvent(handleOp);\n\n if (!isReplaceEvent) {\n if (path === self.NODEMAP_NAME) {\n nodeAddRemoveHandler(handleOp);\n }\n else if (path === self.EDGEMAP_NAME) {\n edgeAddRemoveHandler(handleOp);\n }\n else if (path === self.GENOMIC_DATA_MAP_NAME) {\n genomicDataAddRemoveHandler(handleOp);\n }\n else if (path === self.VISIBLE_GENOMIC_DATA_MAP_NAME) {\n genomicDataVisibilityChangeHandler(handleOp);\n }\n else if (path === self.GENOMIC_DATA_GROUP_NAME) {\n genomicDataGroupChangeHandler(handleOp);\n }\n }\n else { //Then it is update event\n if (path === self.NODEMAP_NAME) {\n updateElementHandler(handleOp);\n }\n else if (path === self.EDGEMAP_NAME) {\n updateElementHandler(handleOp);\n }\n else if (path === self.LAYOUT_PROPS_NAME) {\n updateLayoutPropsHandler(handleOp);\n }\n else if (path === self.GLOBAL_OPTS_NAME) {\n updateGlobalOptionsHandler(handleOp);\n }\n else if (path === self.GENOMIC_DATA_COLOR_SCHEME_NAME) {\n updateGenomicDataColorSchemeHandler(handleOp);\n }\n }\n }\n });\n };\n\n /*\n * Make sure that genomic cloud data is syncronized\n */\n checkShareDBGenomicData () {\n\n var self = this;\n var genomicDataMap = self.doc.data[this.GENOMIC_DATA_MAP_NAME];\n var visDataMap = self.doc.data[this.VISIBLE_GENOMIC_DATA_MAP_NAME];\n var groupedGenomicDataMap = self.doc.data[this.GENOMIC_DATA_GROUP_NAME];\n var groupedGenomicDataCount = self.doc.data[this.GENOMIC_DATA_GROUP_COUNT];\n\n for (var key in genomicDataMap) {\n this.editor.genomicDataOverlayManager.genomicDataMap[key] =\n genomicDataMap[key];\n }\n\n for (var key in visDataMap) {\n this.editor.genomicDataOverlayManager.visibleGenomicDataMapByType[key] =\n visDataMap[key];\n }\n\n for (var key in groupedGenomicDataMap) {\n this.editor.genomicDataOverlayManager.groupedGenomicDataMap[key] =\n groupedGenomicDataMap[key];\n }\n this.editor.genomicDataOverlayManager.groupedGenomicDataCount = groupedGenomicDataCount;\n this.editor.genomicDataOverlayManager.showGenomicData();\n this.editor.genomicDataOverlayManager.notifyObservers();\n };\n \n /*\n * Gets the first empty index from the shared document\n * genomic data group count and increments counter by 1\n *\n */\n\n getEmptyGroupID() {\n var returnCount = this.doc.data[this.GENOMIC_DATA_GROUP_COUNT];\n this.incrementShareDBGroupCount();\n return returnCount;\n };\n\n /*\n * Gets the first empty index from the shared document\n * Initializes & inserts a new genomic data\n * by group id or group name\n *\n */\n groupGenomicData(cancerNames, inGroupId) {\n var genomicGroupMap = this.doc.data[this.GENOMIC_DATA_GROUP_NAME];\n var genomicVisMap = this.doc.data[this.VISIBLE_GENOMIC_DATA_MAP_NAME];\n\n var groupID = \"\" + inGroupId;\n var currentGroup = [];\n\n if (genomicGroupMap.hasOwnProperty(groupID))\n currentGroup = _.clone(genomicGroupMap[groupID]);\n\n for (var i in cancerNames) {\n if (!genomicVisMap.hasOwnProperty(cancerNames[i]))\n currentGroup.push(cancerNames[i]);\n }\n\n // If group id already exists change existing object\n if (genomicGroupMap.hasOwnProperty(groupID)) {\n this.updateShareDBObject(this.GENOMIC_DATA_GROUP_NAME, groupID, currentGroup);\n }\n else {\n //Insert new group\n this.insertShareDBObject(this.GENOMIC_DATA_GROUP_NAME, groupID, currentGroup);\n }\n\n };\n\n //Clears genomic data on shared document\n clearGenomicData() {\n this.clearShareDBGenomicData();\n };\n\n addGenomicData(geneData) {\n var genomicMap = this.doc.data[this.GENOMIC_DATA_MAP_NAME];\n\n //Iterate over all genmoic data which is mapped by geneSymbol to list of alteration values\n //that are also mapped by cancer name and associated value\n var ops = [];\n for (var geneSymbol in geneData) {\n var genomicMapEntry = {};\n if (genomicMap.hasOwnProperty(geneSymbol))\n genomicMapEntry = _.clone(genomicMap[geneSymbol]);\n\n for (var cancerType in geneData[geneSymbol]) {\n if (!(cancerType in genomicMapEntry))\n genomicMapEntry[cancerType] = parseInt(geneData[geneSymbol][cancerType]).toFixed(2);\n }\n ops.push({\n p: [this.GENOMIC_DATA_MAP_NAME, geneSymbol],\n oi: genomicMapEntry\n });\n }\n this.applyShareDBOperation(ops);\n };\n\n addGenomicVisibilityData(visMap) {\n var ops = [];\n for (var cancerStudy in visMap) {\n ops.push({\n p: [this.VISIBLE_GENOMIC_DATA_MAP_NAME, cancerStudy],\n oi: visMap[cancerStudy]\n });\n }\n this.applyShareDBOperation(ops);\n };\n\n changeVisibility(nodesToHide, isHidden) {\n var self = this;\n var nodeMap = self.doc.data[this.NODEMAP_NAME];\n\n nodesToHide.forEach(function (ele) {\n var nodeID = ele.id();\n if (nodeMap.hasOwnProperty(nodeID)) {\n var realTimeNode = nodeMap[nodeID];\n realTimeNode.isHidden = isHidden;\n self.updateShareDBObject(self.NODEMAP_NAME, nodeID, realTimeNode);\n }\n });\n };\n\n changeHighlight(elementsToHighlight, isHighlighted) {\n var self = this;\n var nodeMap = self.doc.data[this.NODEMAP_NAME];\n var edgeMap = self.doc.data[this.EDGEMAP_NAME];\n\n elementsToHighlight.forEach(function (ele) {\n var elementID = ele.id();\n if (nodeMap.hasOwnProperty(elementID)) {\n var realTimeNode = nodeMap[elementID];\n realTimeNode.isHighlighted = isHighlighted;\n self.updateShareDBObject(self.NODEMAP_NAME, elementID, realTimeNode);\n }\n if (edgeMap.hasOwnProperty(elementID)) {\n var realTimeEdge = edgeMap[elementID];\n realTimeEdge.isHighlighted = isHighlighted;\n self.updateShareDBObject(self.EDGEMAP_NAME, elementID, realTimeEdge);\n }\n });\n };\n\n addNewNode(nodeData, posData) {\n var realTimeGeneratedID = this.getCustomObjId();\n var params = {\n name: nodeData.name,\n type: nodeData.type,\n id: realTimeGeneratedID,\n parent: nodeData.parent,\n w: nodeData.w,\n h: nodeData.h,\n minWidth: nodeData.minWidth,\n minWidthBiasLeft: nodeData.minWidthBiasLeft,\n minWidthBiasRight: nodeData.minWidthBiasRight,\n minHeight: nodeData.minHeight,\n minHeightBiasTop: nodeData.minHeightBiasTop,\n minHeightBiasBottom: nodeData.minHeightBiasBottom\n };\n\n //Ensures new node is compatible with the other nodes\n var newNode = this.nodeInitializer(params);\n if (posData) {\n newNode.x = posData.x;\n newNode.y = posData.y;\n }\n this.insertShareDBObject(this.NODEMAP_NAME, realTimeGeneratedID, newNode);\n };\n\n addNewEdge(edgeData) {\n var realTimeGeneratedID = this.getCustomObjId();\n var params = {\n type: edgeData.type,\n id: realTimeGeneratedID,\n source: edgeData.source,\n target: edgeData.target,\n pubmedIDs: edgeData.pubmedIDs,\n name: edgeData.name,\n anchorPoints: edgeData.anchorPoints\n };\n\n //Ensures new edge is compatible with the other edge\n var newEdge = this.edgeInitializer(params);\n this.insertShareDBObject(this.EDGEMAP_NAME, realTimeGeneratedID, newEdge);\n };\n\n reconnectEdge = function(sourceID, targetID, edgeData) {\n var edgeMap = this.doc.data[this.EDGEMAP_NAME];\n var edge = edgeMap[edgeData.id];\n var edgeID = edge.id;\n\n edge.source = sourceID;\n edge.target = targetID;\n\n if(edgeMap.hasOwnProperty(edgeID)) {\n this.updateShareDBObject(this.EDGEMAP_NAME, edgeID, edge);\n }\n else {\n throw new Error('Element does not exist in Real Time');\n }\n };\n\n\n removeElement (elementID) {\n var edgeMap = this.doc.data[this.EDGEMAP_NAME];\n var nodeMap = this.doc.data[this.NODEMAP_NAME];\n\n if (nodeMap.hasOwnProperty(elementID)) {\n this.deleteShareDBObject(this.NODEMAP_NAME, elementID);\n }\n else if (edgeMap.hasOwnProperty(elementID)) {\n this.deleteShareDBObject(this.EDGEMAP_NAME, elementID);\n }\n else {\n throw new Error('Element does not exist in Real Time');\n }\n };\n\n moveElement (ele) {\n var nodeMap = this.doc.data[this.NODEMAP_NAME];\n\n var elementID = ele.id();\n var newPos = ele.position();\n\n if (nodeMap.hasOwnProperty(elementID)) {\n var tmpNode = nodeMap[elementID];\n tmpNode.x = newPos.x;\n tmpNode.y = newPos.y;\n this.updateShareDBObject(this.NODEMAP_NAME, elementID, tmpNode);\n }\n else {\n throw new Error('Element does not exist in nodes !!! ');\n }\n };\n\n //This function is used for movements of all selected elements wrt alignment selected\n changeElementsPositionByAlignment (coll) {\n var self = this;\n var nodeMap = self.doc.data[this.NODEMAP_NAME];\n\n coll.forEach(function (ele) {\n var elementID = ele.node.id();\n if (nodeMap.hasOwnProperty(elementID)) {\n var tmpNode = nodeMap[elementID];\n tmpNode.x = ele.nextPosition.x;\n tmpNode.y = ele.nextPosition.y;\n self.updateShareDBObject(self.NODEMAP_NAME, elementID, tmpNode);\n }\n else {\n throw new Error('Element does not exist in nodes !!! ');\n }\n });\n };\n\n resizeElement (ele, previousWidth, previousHeight) {\n var nodeMap = this.doc.data[this.NODEMAP_NAME];\n\n var elementID = ele.id();\n var newWidth = ele.width();\n var newHeight = ele.height();\n var currentX = ele.position('x');\n var currentY = ele.position('y');\n\n if (nodeMap.hasOwnProperty(elementID)) {\n var tmpNode = nodeMap[elementID];\n tmpNode.x = currentX + newWidth - previousWidth;\n tmpNode.y = currentY + newHeight - previousHeight;\n tmpNode.w = newWidth;\n tmpNode.h = newHeight;\n this.updateShareDBObject(this.NODEMAP_NAME, elementID, tmpNode);\n }\n else {\n throw new Error('Element does not exist in nodes !!! ');\n }\n };\n\n setSizeOfElement (ele, newWidth, newHeight) {\n var nodeMap = this.doc.data[this.NODEMAP_NAME];\n\n var elementID = ele.id();\n\n if (nodeMap.hasOwnProperty(elementID)) {\n var tmpNode = nodeMap[elementID];\n tmpNode.w = newWidth;\n tmpNode.h = newHeight;\n this.updateShareDBObject(this.NODEMAP_NAME, elementID, tmpNode);\n }\n else {\n throw new Error('Element does not exist in nodes !!! ');\n }\n };\n\n resizeCompound (ele, minWidth, minWidthBiasLeft, minWidthBiasRight, minHeight, minHeightBiasTop, minHeightBiasBottom) {\n var nodeMap = this.doc.data[this.NODEMAP_NAME];\n\n var elementID = ele.id();\n var currentX = ele.position('x');\n var currentY = ele.position('y');\n\n if (nodeMap.hasOwnProperty(elementID)) {\n var tmpNode = nodeMap[elementID];\n tmpNode.x = currentX;\n tmpNode.y = currentY;\n tmpNode.minWidth = minWidth;\n tmpNode.minWidthBiasLeft = minWidthBiasLeft;\n tmpNode.minWidthBiasRight = minWidthBiasRight;\n tmpNode.minHeight = minHeight;\n tmpNode.minHeightBiasTop = minHeightBiasTop;\n tmpNode.minHeightBiasBottom = minHeightBiasBottom;\n this.updateShareDBObject(this.NODEMAP_NAME, elementID, tmpNode);\n }\n else {\n throw new Error('Element does not exist in nodes !!! ');\n }\n };\n\n changeNodePositionsShareDB (nodes) {\n var self = this;\n var nodeMap = self.doc.data[self.NODEMAP_NAME];\n\n nodes.forEach(function (ele) {\n var nodeID = ele.id();\n if (nodeMap.hasOwnProperty(nodeID)) {\n var realTimeNode = nodeMap[nodeID];\n realTimeNode.x = ele.position('x');\n realTimeNode.y = ele.position('y');\n self.updateShareDBObject(self\n .NODEMAP_NAME, nodeID, realTimeNode);\n }\n else {\n throw new Error('Element does not exist in nodes !!! ');\n }\n });\n };\n\n changeHighlightInvalidGenes (nodeIDs, isInvalid) {\n var nodeMap = this.doc.data[this.NODEMAP_NAME];\n\n //TODO check compound operation inside or outside of for ?\n for (var i in nodeIDs) {\n var nodeID = nodeIDs[i];\n if (nodeMap.hasOwnProperty(nodeID)) {\n var collaborativeNode = nodeMap[nodeID];\n collaborativeNode.isInvalidGene = isInvalid;\n this.updateShareDBObject(this.NODEMAP_NAME, nodeID, collaborativeNode);\n }\n }\n\n };\n\n addPubmedIDs (edgeID, pubmedIDs) {\n var edgeMap = this.doc.data[this.EDGEMAP_NAME];\n\n\n if (edgeMap.hasOwnProperty(edgeID)) {\n var tmpEdge = edgeMap[edgeID];\n var nonDuplicateArray = [];\n for (var i = 0; i < pubmedIDs.length; i++) {\n if (tmpEdge.pubmedIDs.indexOf(pubmedIDs[i]) < 0) {\n nonDuplicateArray.push(pubmedIDs[i]);\n }\n }\n tmpEdge.pubmedIDs = tmpEdge.pubmedIDs.concat(nonDuplicateArray);\n this.updateShareDBObject(this.EDGEMAP_NAME, edgeID, tmpEdge);\n }\n else {\n throw new Error('Edge does not exist in real time !!! ');\n }\n };\n\n removePubmedID(edgeID, pubmedIDs) {\n var edgeMap = this.doc.data[this.EDGEMAP_NAME];\n\n if (edgeMap.hasOwnProperty(edgeID)) {\n var tmpEdge = edgeMap[edgeID];\n var removedIndices = [];\n for (var i = 0; i < pubmedIDs.length; i++) {\n var tmpID = pubmedIDs[i];\n var index = tmpEdge.pubmedIDs.indexOf(tmpID);\n if (index >= 0) {\n removedIndices.push(index);\n }\n }\n for (var i = 0; i < removedIndices.length; i++) {\n tmpEdge.pubmedIDs.remove(removedIndices[i]);\n }\n this.updateShareDBObject(this.EDGEMAP_NAME, edgeID, tmpEdge);\n\n }\n else {\n throw new Error('Edge does not exist in real time !!! ');\n }\n };\n\n updateEdgeAnchorPoints(edgeID, anchorPointsArray, edgeCurveStyle) {\n\n var edgeMap = this.doc.data[this.EDGEMAP_NAME];\n \n if (edgeMap.hasOwnProperty(edgeID)) {\n var tmpEdge = edgeMap[edgeID];\n tmpEdge.anchorPoints = anchorPointsArray;\n tmpEdge.edgeCurveStyle = edgeCurveStyle;\n this.updateShareDBObject(this.EDGEMAP_NAME, edgeID, tmpEdge);\n }\n else {\n throw new Error('Edge does not exist in real time !!! ');\n }\n };\n\n changeName(ele, newName) {\n var nodeMap = this.doc.data[this.NODEMAP_NAME];\n var edgeMap = this.doc.data[this.EDGEMAP_NAME];\n\n var elementID = ele.id();\n\n if (ele.isNode()) {\n if (nodeMap.hasOwnProperty(elementID)) {\n var tmpNode = nodeMap[elementID];\n tmpNode.name = newName;\n this.updateShareDBObject(this.NODEMAP_NAME, elementID, tmpNode);\n }\n else {\n throw new Error('Element does not exist in nodes !!! ');\n }\n }\n else {\n if (edgeMap.hasOwnProperty(elementID)) {\n var tmpEdge = edgeMap[elementID];\n tmpEdge.name = newName;\n this.updateShareDBObject(this.EDGEMAP_NAME, elementID, tmpEdge);\n }\n else {\n throw new Error('Element does not exist in edges !!! ');\n }\n }\n };\n\n changeParent(rootNode, newParentId, connectedEdges) {\n var self = this;\n var nodeLookupTable = {};\n\n function traverseFromRoot(rootNode, parId) {\n /*\n remove outermost node,\n create new real time node with given parentId,\n pass id of this real time node to children,\n repeat in a recursive manner\n after that restore the edges that dissapear by removed nodes\n during change parent\n */\n\n var refNode = rootNode.nodeRef;\n var children = rootNode.children;\n var newParentId = parId;\n\n if (refNode) {\n var refNodeId = refNode.id();\n var nodeData = refNode.data();\n var posData = refNode.position();\n var currentWidth = refNode.data('w');\n var currentHeight = refNode.data('h');\n\n var newNodeData =\n {\n name: nodeData.name,\n type: nodeData.type,\n x: posData.x,\n y: posData.y,\n w: currentWidth,\n h: currentHeight,\n parent: -1\n };\n\n if (parId) {\n newNodeData.parent = parId;\n }\n\n self.removeElement(refNodeId);\n var newNode = self.nodeInitializer(newNodeData);\n var newNodeId = newNode.id;\n self.insertShareDBObject(self.NODEMAP_NAME, newNodeId, newNode);\n newParentId = newNodeId;\n nodeLookupTable[refNodeId] = newNodeId;\n }\n\n for (const childNode of children) {\n traverseFromRoot(childNode, newParentId);\n }\n }\n\n //Begin traversing from given root node\n traverseFromRoot(rootNode, newParentId);\n\n //Restore edges that dissapear by the change parent operation\n //TODO compound operations ?\n connectedEdges.forEach(function (edge, index) {\n var edgeData = edge.data();\n self.removeElement(edge.id());\n\n var newSource = nodeLookupTable[edgeData.source];\n var newTarget = nodeLookupTable[edgeData.target];\n\n if (newSource) {\n edgeData.source = newSource;\n }\n\n if (newTarget) {\n edgeData.target = newTarget;\n }\n\n self.addNewEdge(edgeData);\n });\n };\n\n removeAllElements() {\n var nodeMap = this.doc.data[this.NODEMAP_NAME];\n var edgeMap = this.doc.data[this.EDGEMAP_NAME];\n var ops = [];\n\n //Remove all real time nodes\n for (const key of Object.keys(nodeMap)) {\n ops.push({\n p: [this.NODEMAP_NAME, key],\n od: nodeMap[key]\n });\n }\n\n //Remove all real time edges\n for (const key of Object.keys(edgeMap)) {\n ops.push({\n p: [this.EDGEMAP_NAME, key],\n od: edgeMap[key]\n });\n }\n\n this.applyShareDBOperation(ops);\n };\n\n loadGraph(nodes, edges) {\n var self = this;\n this.removeAllElements();\n\n //Function that traverses graph tree recursively.\n var oldIdNewIdMap = {};\n\n function traverseTree(node, newParentId) {\n node.data.x = node.position.x;\n node.data.y = node.position.y;\n\n //Update parent !\n if (newParentId) {\n var parent = node.data.parent;\n if (parent) {\n node.data.parent = newParentId;\n }\n }\n\n //Create new real time node\n var newNodeId = self.getCustomObjId();\n var params = node.data;\n oldIdNewIdMap[params.id] = newNodeId;\n var newNode = self.nodeInitializer(params);\n newNode.id = newNodeId;\n\n self.insertShareDBObject(self.NODEMAP_NAME, newNodeId, newNode);\n\n //If node has children recursively traverse sub graphs and update parent field of child nodes\n if (node.children.length > 0) {\n for (const tmpNode of node.children) {\n traverseTree(tmpNode, newNodeId);\n }\n }\n }\n\n //Create graph hierarchy from given list of flat nodes\n var tree = GraphUtilities.createGraphHierarchyRealTime(nodes);\n //Traverse from root nodes of tree\n for (const rootLevelNode of tree) {\n traverseTree(rootLevelNode, undefined);\n }\n\n /*\n Create real time edges, update the source and target fields, since new ids will be generated for the nodes in\n real time\n */\n for (const edge of edges) {\n edge.data.source = oldIdNewIdMap[edge.data.source];\n edge.data.target = oldIdNewIdMap[edge.data.target];\n\n var edgeCurveStyle = \"bezier\";\n if (edge.data.bendPointPositions && edge.data.bendPointPositions.length > 0) {\n edge.data['anchorPoints'] = edge.data['bendPointPositions'];\n delete edge.data['bendPointPositions'];\n edgeCurveStyle = \"segments\";\n }\n else if (edge.data.controlPointPositions && edge.data.controlPointPositions.length > 0) {\n edge.data['anchorPoints'] = edge.data['controlPointPositions'];\n delete edge.data['controlPointPositions'];\n edgeCurveStyle = \"unbundled-bezier\";\n }\n\n var params = edge.data;\n params.edgeCurveStyle = edgeCurveStyle;\n var newEdgeID = self.getCustomObjId();\n params.id = newEdgeID;\n \n var newEdge = self.edgeInitializer(params);\n self.insertShareDBObject(self.EDGEMAP_NAME, newEdgeID, newEdge);\n }\n };\n\n mergeGraph (nodes, edges) {\n var self = this;\n var nodeMap = self.doc.data[this.NODEMAP_NAME];\n\n var realTimeNodeMap = nodeMap;\n var realTimeNodeLookupTable = {};\n var realTimeNodeNameLookupTable = {};\n var oldIdNewIdMap = {};\n\n //Create lookup table for real time nodes\n //items are stored in an array in the resulting array of nodeMap.items()\n // [0] - id, [1] - object\n for (var i in realTimeNodeMap) {\n var nodeMapItem = realTimeNodeMap[i];\n realTimeNodeLookupTable[nodeMapItem.id] = nodeMapItem;\n realTimeNodeNameLookupTable[nodeMapItem.name] = nodeMapItem;\n }\n\n //Recursive traverse definition\n function traverseTree(node, newParentId) {\n //Search by name !\n //We have not found a node that exist in the graph, add normally\n if (!(node.data.name in realTimeNodeNameLookupTable)) {\n node.data.x = node.position.x;\n node.data.y = node.position.y;\n\n //Update parent !\n if (newParentId) {\n var parent = node.data.parent;\n if (parent) {\n node.data.parent = newParentId;\n }\n }\n\n //Create new real time node\n var newNodeId = self.getCustomObjId();\n oldIdNewIdMap[node.data.id] = newNodeId;\n var newNode = self.nodeInitializer(node.data);\n newNode.id = newNodeId;\n self.insertShareDBObject(self.NODEMAP_NAME, newNodeId, newNode);\n\n //If node has children recursively traverse sub graphs and update parent field of child nodes\n if (node.children.length > 0) {\n for (const tmpNode of node.children) {\n traverseTree(tmpNode, newNodeId);\n }\n }\n }\n // At this point there exists another node in the graph with the same name as 'node'\n // we need to update parent field of children of this node if any\n else {\n var sameNameNode = realTimeNodeNameLookupTable[node.data.name];\n var sameNodeId = sameNameNode.id;\n oldIdNewIdMap[node.data.id] = sameNodeId;\n\n //If node has children recursively traverse sub graphs and update parent field of child nodes\n if (node.children.length > 0) {\n for (const tmpNode of node.children) {\n traverseTree(tmpNode, sameNodeId);\n }\n }\n }\n }\n\n //Traverse from root nodes of tree\n var tree = GraphUtilities.createGraphHierarchyRealTime(nodes);\n for (const rootLevelNode of tree) {\n traverseTree(rootLevelNode, rootLevelNode.data.id);\n }\n\n /*\n Create real time edges, update the source and target fields, since new ids will be generated for the nodes in\n real time\n */\n var ops = [];\n for (const edge of edges) {\n edge.data.source = oldIdNewIdMap[edge.data.source];\n edge.data.target = oldIdNewIdMap[edge.data.target];\n var newEdge = self.edgeInitializer(edge.data);\n var newEdgeID = this.getCustomObjId();\n newEdge.id = newEdgeID;\n ops.push({\n p: [self.EDGEMAP_NAME, newEdgeID],\n oi: newEdge\n });\n }\n self.applyShareDBOperation(ops);\n };\n\n updateLayoutProperties (newLayoutProperties) {\n this.updateShareDBLayoutProperties(newLayoutProperties);\n };\n\n updateGlobalOptions (newOptions) {\n this.updateShareDBGlobalOptions(newOptions);\n };\n\n updateGenomicDataOverlayColorScheme(newColorScheme: IColorValueMap) {\n this.updateShareDBGenomicDataOverlayColorScheme(newColorScheme);\n }\n\n /*\n * Creates graph hierarchy from given flat list of nodes list, nodes list is assumed to have parent-child\n * relationship by a field 'parent' which represents to the id of the parent node This function is specific\n * for the needs of TCGA Pathway Curation Tool 04/07/2016\n *\n * @param nodes {array}: flat list of nodes of a graph\n * @return {array}: Tree representation in array, entries are root level nodes. node.children gives children nodes\n * of each node in the returned array.\n * a node in corresponding level.\n *\n * */\n createGraphHierarchy (nodes) {\n //Some arrays and maps for creating graph hierarchy\n var tree = [];\n var mappedArr = {};\n\n // First map the nodes of the array to an object -> create a hash table.\n for (var i = 0, len = nodes.length; i < len; i++) {\n var arrElem = nodes[i];\n mappedArr[arrElem.data.id] = arrElem;\n mappedArr[arrElem.data.id].children = [];\n }\n\n for (const id of Object.keys(mappedArr)) {\n var mappedElem = mappedArr[id];\n\n // If the element is not at the root level, add it to its parent array of children.\n if (mappedElem.data.parent) {\n mappedArr[mappedElem.data.parent].children.push(mappedElem);\n }\n // If the element is at the root level, add it to first level elements array.\n else {\n tree.push(mappedElem);\n }\n }\n return tree;\n };\n\n //Makes sure that edge is compatible with edges in shared document\n edgeInitializer (params) {\n var edge: any = {};\n edge.id = params.id || this.getCustomObjId();\n edge.type = params.type || \"undefined\";\n edge.source = params.source || \"undefined\";\n edge.target = params.target || \"undefined\";\n edge.name = params.name || \"\";\n edge.isHighlighted = params.isHighlighted || false;\n edge.anchorPoints = params.anchorPoints || [];\n edge.edgeCurveStyle = params.edgeCurveStyle || \"bezier\"\n\n if (params.pubmedIDs) {\n if (edge.pubmedIDs == undefined) {\n edge.pubmedIDs = [];\n }\n if(params.pubmedIDs.length > 0)\n edge.pubmedIDs.push(params.pubmedIDs);\n }\n else {\n edge.pubmedIDs = [];\n }\n\n if (params.anchorPoints) {\n if (edge.anchorPoints == undefined) {\n edge.anchorPoints = [];\n }\n // legacy workaround\n if (Array.isArray(params.anchorPoints[0])) {\n edge.anchorPoints = params.anchorPoints[0];\n }\n else {\n edge.anchorPoints = params.anchorPoints;\n }\n }\n else {\n edge.anchorPoints = [];\n }\n return edge;\n };\n\n //Makes sure that node is compatible with nodes in shared document\n nodeInitializer(params) {\n var node: any = {};\n node.id = params.id || this.getCustomObjId();\n node.name = params.name || \"undefined\";\n node.type = params.type || \"undefined\";\n node.parent = params.parent || \"undefined\";\n node.x = params.x || \"undefined\";\n node.y = params.y || \"undefined\";\n node.w = params.w || \"undefined\";\n node.h = params.h || \"undefined\";\n node.minWidth = params.minWidth || 0;\n node.minWidthBiasLeft = params.minWidth || 0;\n node.minWidthBiasRight = params.minWidth || 0;\n node.minHeight = params.minWidth || 0;\n node.minHeightBiasTop = params.minWidth || 0;\n node.minHeightBiasBottom = params.minWidth || 0;\n node.isHidden = params.isHidden || false;\n node.isInvalidGene = params.isInvalidGene || false;\n node.isHighlighted = params.isHighlighted || false;\n return node;\n };\n\n //Makes sure that layout properties is compatible with layout properties in shared document\n layoutPropertiesInitializer (params) {\n var layoutProperties: any = {};\n layoutProperties.name = params.name || 'undefined';\n layoutProperties.nodeRepulsion = params.nodeRepulsion || 'undefined';\n // this.nodeOverlap = params.nodeOverlap || 'undefined';\n layoutProperties.idealEdgeLength = params.idealEdgeLength || 'undefined';\n layoutProperties.edgeElasticity = params.edgeElasticity || 'undefined';\n layoutProperties.nestingFactor = params.nestingFactor || 'undefined';\n layoutProperties.gravity = params.gravity || 'undefined';\n layoutProperties.numIter = params.numIter || 'undefined';\n layoutProperties.tile = params.tile || 'undefined';\n layoutProperties.animate = params.animate || 'undefined';\n layoutProperties.randomize = params.randomize || false;\n layoutProperties.gravityRangeCompound = params.gravityRangeCompound || 'undefined';\n layoutProperties.gravityCompound = params.gravityCompound || 'undefined';\n layoutProperties.gravityRange = params.gravityRange || 'undefined';\n layoutProperties.tilingPaddingVertical = params.tilingPaddingVertical || 'undefined';\n layoutProperties.tilingPaddingHorizontal = params.tilingPaddingHorizontal || 'undefined';\n layoutProperties.initialEnergyOnIncremental = params.initialEnergyOnIncremental || 'undefined';\n return layoutProperties;\n };\n\n //Makes sure that global options is compatible with global options in shared document\n globalOptionsInitializer (params) {\n var globalOptions: any = {};\n globalOptions.zoomLevel = params.zoomLevel || 'undefined';\n globalOptions.panLevel = params.panLevel || 'undefined';\n return globalOptions;\n };\n\n //Create unique ID for elements\n getCustomObjId () {\n // see http://stackoverflow.com/a/8809472\n // we need to take care of our own IDs because the ones automatically generated by cytoscape (also UUID)\n // don't comply with xsd:SID type that must not begin with a number\n // Public Domain/MIT\n var d = Date.now();\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n d += performance.now(); //use high-precision timer if available\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = (d + Math.random() * 16) % 16 | 0;\n d = Math.floor(d / 16);\n return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);\n });\n };\n\n getParam (urlParam) {\n const regExp = new RegExp(urlParam + '=(.*?)($|&)', 'g');\n let match: any = window.location.search.match(regExp);\n if (match && match.length) {\n match = match[0];\n match = match.replace(urlParam + '=', '').replace('&', '');\n } else {\n match = null;\n }\n return match;\n };\n\n}\n","/**\n * Created by istemi on 27.09.2016.\n */\n\nexport default class GraphUtilities {\n \n \n static createGraphHierarchy(nodes)\n {\n //Some arrays and maps for creating graph hierarchy\n var tree = [];\n var mappedArr = {};\n\n // First map the nodes of the array to an object -> create a hash table.\n for (var i = 0, len = nodes.length; i < len; i++)\n {\n var arrElem = nodes[i];\n mappedArr[arrElem.id()] = arrElem;\n mappedArr[arrElem.id()].childNodes = [];\n }\n\n for (var id in mappedArr)\n {\n var mappedElem = mappedArr[id];\n\n // If the element is not at the root level, add it to its parent array of children.\n if (mappedElem.parent().length > 0)\n {\n mappedArr[mappedElem.parent().id()].childNodes.push(mappedElem);\n }\n // If the element is at the root level, add it to first level elements array.\n else\n {\n tree.push(mappedElem);\n }\n }\n return tree;\n };\n\n /*\n * Creates graph hierarchy from given flat list of nodes list, nodes list is assumed to have parent-child\n * relationship by a field 'parent' which represents to the id of the parent node This function is specific\n * for the needs of TCGA Pathway Curation Tool 04/07/2016\n *\n * @param nodes {array}: flat list of nodes of a graph\n * @return {array}: Tree representation in array, entries are root level nodes. node.children gives children nodes\n * of each node in the returned array.\n * a node in corresponding level.\n *\n * */\n static createGraphHierarchyRealTime(nodes)\n {\n //Some arrays and maps for creating graph hierarchy\n var tree = [];\n var mappedArr = {};\n\n // First map the nodes of the array to an object -> create a hash table.\n for (var i = 0, len = nodes.length; i < len; i++)\n {\n var arrElem = nodes[i];\n mappedArr[arrElem.data.id] = arrElem;\n mappedArr[arrElem.data.id].children = [];\n }\n for (var id in mappedArr)\n {\n var mappedElem = mappedArr[id];\n\n // If the element is not at the root level, add it to its parent array of children.\n if (mappedElem.data.parent != -1)\n {\n mappedArr[mappedElem.data.parent].children.push(mappedElem);\n }\n // If the element is at the root level, add it to first level elements array.\n else\n {\n tree.push(mappedElem);\n }\n }\n return tree;\n };\n}","import EditorActionsManager from \"../managers/EditorActionsManager\";\nimport GraphUtilities from \"../utils/GraphUtilities\";\n\nexport default class SVGExporter {\n SVGNameSpace = \"http://www.w3.org/2000/svg\";\n svg = document.createElementNS(this.SVGNameSpace, \"svg\");\n NODE_FILL_COLOR = \"rgb(255,255,255)\";\n FAMILY_FILL_COLOR = \"rgb(255,255,255)\";\n FAMILY_STROKE_COLOR = \"rgb(204,204,204)\";\n NODE_STROKE_COLOR = \"rgb(0,0,0)\";\n COMPARTMENT_STROKE_WIDTH = 2;\n NODE_STROKE_WIDTH = 1;\n NODE_OPACITY = 0.5;\n ROUNDING_FACTOR = 6;\n GENOMICDATA_LABEL_Y_OFFSET = -15;\n EDGE_ARROW_SCALE = 1.7;\n EDGE_WIDTH = 1;\n T_ARROW_HEAD_WIDTH = 2 * this.EDGE_ARROW_SCALE;\n T_ARROW_HEAD_HEIGHT = 8 * this.EDGE_ARROW_SCALE;\n TRIANGLE_ARROW_HEAD_HEIGHT = 8 * this.EDGE_ARROW_SCALE;\n TRIANGLE_ARROW_HEAD_WIDTH = 8 * this.EDGE_ARROW_SCALE;\n DASH_PARAMETERS = \"5, 3\";\n COMPOUND_MARGIN = 8;\n NODE_FONT_SIZE = 14;\n\n edgeEditing: any;\n editor: EditorActionsManager;\n constructor(edgeEditing: any, editor: EditorActionsManager) {\n this.edgeEditing = edgeEditing;\n this.editor = editor;\n }\n\n resetSVG() {\n this.svg = document.createElementNS(this.SVGNameSpace, \"svg\");\n }\n\n exportGraph(nodes, edges) {\n //Reset SVG\n this.resetSVG();\n this.svg.setAttribute(\"version\", \"1.1\");\n this.svg.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n //Set viewport of output SVG\n var cyBounds = this.editor.cy.extent();\n this.svg.setAttribute(\n \"viewBox\",\n cyBounds.x1 + \" \" + cyBounds.y1 + \" \" + cyBounds.w + \" \" + cyBounds.h\n );\n\n var self = this;\n var nodeMap = {};\n\n var nodeTree = GraphUtilities.createGraphHierarchy(nodes);\n var traverseFunction = function(node) {\n //Create SVG for current node\n nodeMap[node.id()] = node;\n var genomicDataSVG = self.editor.getGenomicDataSVG(node).children;\n var oncoprintDataSVG = self.editor.getOncoprintDataSVG(node);\n self.svg.appendChild(self.createRect(node));\n var labelOffset =\n (genomicDataSVG && genomicDataSVG.length > 0) ||\n oncoprintDataSVG.outerHTML !== \"\"\n ? self.GENOMICDATA_LABEL_Y_OFFSET\n : 0;\n self.svg.appendChild(self.createNodeLabel(node, labelOffset));\n\n //Append Genomic Data SVG\n if (genomicDataSVG) {\n while (genomicDataSVG.length > 0) {\n var elemSVG = genomicDataSVG[0];\n var nodePosition = node.position();\n var svgX = elemSVG.getAttribute(\"x\");\n var svgY = elemSVG.getAttribute(\"y\");\n elemSVG.setAttribute(\n \"x\",\n nodePosition.x - node.width() / 2 + parseFloat(svgX)\n );\n elemSVG.setAttribute(\n \"y\",\n nodePosition.y - node.height() / 2 + parseFloat(svgY)\n );\n self.svg.appendChild(elemSVG);\n }\n }\n //Append Oncoprint Data SVG\n else if (oncoprintDataSVG.outerHTML !== \"\") {\n var nodePosition = node.position();\n\n const width = parseInt(oncoprintDataSVG.getAttribute(\"width\"));\n const height = parseInt(oncoprintDataSVG.getAttribute(\"height\"));\n const verticalPadding = 8;\n\n const y =\n nodePosition.y + node.height() / 2 - (height + verticalPadding);\n oncoprintDataSVG.setAttribute(\"x\", nodePosition.x - width / 2);\n oncoprintDataSVG.setAttribute(\"y\", y);\n self.svg.appendChild(oncoprintDataSVG);\n }\n\n //Traverse children\n if (node.childNodes) {\n for (var i in node.childNodes) {\n traverseFunction(node.childNodes[i]);\n }\n }\n };\n\n //Traverse node hierarchy\n for (var i in nodeTree) {\n var rootLevelNode = nodeTree[i];\n traverseFunction(rootLevelNode);\n }\n\n edges.forEach(function(edge) {\n self.drawEdge(edge);\n });\n\n return this.svg.outerHTML;\n }\n\n drawEdge(edge) {\n const sourceEndpoint = edge.sourceEndpoint();\n const targetEndpoint = edge.targetEndpoint();\n const targetArrowShape = edge.style(\"target-arrow-shape\");\n const lineStyle = edge.style(\"line-style\");\n const curveStyle = edge.style(\"curve-style\");\n const anchorPoints = curveStyle === \"segments\" ? \n edge.segmentPoints() : \n edge.controlPoints();\n\n const labelElement = this.createEdgeLabel(edge);\n if (labelElement) {\n this.svg.appendChild(labelElement);\n }\n\n let lastAnchor = {\n x: sourceEndpoint.x,\n y: sourceEndpoint.y\n }\n let edgeEndpoint = {\n x: targetEndpoint.x,\n y: targetEndpoint.y\n };\n\n if (anchorPoints && anchorPoints.length > 0) {\n lastAnchor = {\n x: anchorPoints[anchorPoints.length - 1].x,\n y: anchorPoints[anchorPoints.length - 1].y\n }\n }\n\n var unitV = this.unitVector({\n x: targetEndpoint.x - lastAnchor.x,\n y: targetEndpoint.y - lastAnchor.y,\n });\n var inverseUnitV = this.scale(unitV, -1);\n\n var targetX = targetEndpoint.x;\n var targetY = targetEndpoint.y;\n\n //Draw Triangle arrow head\n if (targetArrowShape === \"triangle\") {\n targetX =\n targetEndpoint.x +\n this.TRIANGLE_ARROW_HEAD_HEIGHT * inverseUnitV.x;\n targetY =\n targetEndpoint.y +\n this.TRIANGLE_ARROW_HEAD_HEIGHT * inverseUnitV.y;\n\n var point1Vector = this.rotateVector(unitV, Math.PI / 2);\n var point2Vector = this.rotateVector(unitV, -Math.PI / 2);\n\n point1Vector = this.scale(\n point1Vector,\n this.TRIANGLE_ARROW_HEAD_WIDTH / 2\n );\n point2Vector = this.scale(\n point2Vector,\n this.TRIANGLE_ARROW_HEAD_WIDTH / 2\n );\n\n var point1X = targetX + point1Vector.x;\n var point1Y = targetY + point1Vector.y;\n\n var point2X = targetX + point2Vector.x;\n var point2Y = targetY + point2Vector.y;\n\n edgeEndpoint = {\n x: (point1X + point2X) / 2,\n y: (point1Y + point2Y) / 2\n }\n\n var polySVG = document.createElementNS(this.SVGNameSpace, \"polygon\");\n polySVG.setAttribute(\n \"points\",\n point1X +\n \",\" +\n point1Y +\n \",\" +\n point2X +\n \",\" +\n point2Y +\n \",\" +\n targetEndpoint.x +\n \",\" +\n targetEndpoint.y\n );\n\n this.svg.appendChild(polySVG);\n }\n //Draw T type arrow head\n else if (targetArrowShape === \"tee\") {\n targetX =\n targetEndpoint.x \n targetY =\n targetEndpoint.y \n\n //Calculate T shape points\n var point1Vector = this.rotateVector(unitV, Math.PI / 2);\n var point2Vector = this.rotateVector(unitV, -Math.PI / 2);\n point1Vector = this.scale(point1Vector, this.T_ARROW_HEAD_HEIGHT / 2);\n point2Vector = this.scale(point2Vector, this.T_ARROW_HEAD_HEIGHT / 2);\n\n var point1X = targetX + point1Vector.x;\n var point1Y = targetY + point1Vector.y;\n var point2X = targetX + point2Vector.x;\n var point2Y = targetY + point2Vector.y;\n\n edgeEndpoint = {\n x: (point1X + point2X) / 2,\n y: (point1Y + point2Y) / 2\n }\n\n //Draw edge arrow line here !\n var lineSVG = document.createElementNS(this.SVGNameSpace, \"line\");\n lineSVG.setAttribute(\"x1\", point1X);\n lineSVG.setAttribute(\"y1\", point1Y);\n lineSVG.setAttribute(\"x2\", point2X);\n lineSVG.setAttribute(\"y2\", point2Y);\n lineSVG.setAttribute(\"stroke-width\", this.T_ARROW_HEAD_WIDTH.toString());\n lineSVG.setAttribute(\"stroke\", \"black\");\n this.svg.appendChild(lineSVG);\n }\n \n // no anchors means a single line connecting source and target end points\n if (!anchorPoints || anchorPoints.length < 1) {\n const lineSVG = document.createElementNS(this.SVGNameSpace, \"line\");\n lineSVG.setAttribute(\"x1\", sourceEndpoint.x);\n lineSVG.setAttribute(\"y1\", sourceEndpoint.y);\n lineSVG.setAttribute(\"x2\", edgeEndpoint.x);\n lineSVG.setAttribute(\"y2\", edgeEndpoint.y);\n lineSVG.setAttribute(\"stroke-width\", this.EDGE_WIDTH.toString());\n lineSVG.setAttribute(\"stroke\", \"black\");\n if (lineStyle === \"dashed\") {\n lineSVG.setAttribute(\"stroke-dasharray\", this.DASH_PARAMETERS);\n }\n this.svg.appendChild(lineSVG);\n }\n else if (curveStyle === \"unbundled-bezier\" || curveStyle === \"bezier\") {\n const pathSVG = document.createElementNS(this.SVGNameSpace, \"path\");\n let pathPoints: string[] = [];\n\n for (let i = 0; i < anchorPoints.length; i++) {\n if (i === 0) {\n pathPoints.push(\"M\" + sourceEndpoint.x + \",\" + sourceEndpoint.y);\n pathPoints.push(\"Q\" + anchorPoints[i].x + \",\" + anchorPoints[i].y);\n if (anchorPoints.length === 1) {\n pathPoints.push(edgeEndpoint.x + \",\" + edgeEndpoint.y);\n }\n else {\n const furtherEndPoint = {\n x: (anchorPoints[i].x + anchorPoints[i+1].x) / 2,\n y: (anchorPoints[i].y + anchorPoints[i+1].y) / 2 \n }\n pathPoints.push(furtherEndPoint.x + \",\" + furtherEndPoint.y);\n }\n }\n else {\n if (i < anchorPoints.length - 1) {\n const furtherEndPoint = {\n x: (anchorPoints[i].x + anchorPoints[i+1].x) / 2,\n y: (anchorPoints[i].y + anchorPoints[i+1].y) / 2 \n }\n pathPoints.push(\"T\" + furtherEndPoint.x + \",\" + furtherEndPoint.y);\n }\n else {\n pathPoints.push(\"T\" + edgeEndpoint.x + \",\" + edgeEndpoint.y);\n }\n }\n }\n pathSVG.setAttribute(\n 'd',\n pathPoints.join(\" \")\n );\n pathSVG.setAttribute('stroke-width', this.EDGE_WIDTH.toString());\n pathSVG.setAttribute('stroke', 'black');\n if (lineStyle === \"dashed\") {\n pathSVG.setAttribute(\"stroke-dasharray\", this.DASH_PARAMETERS);\n }\n pathSVG.setAttribute('fill', 'none');\n this.svg.appendChild(pathSVG);\n }\n // anchors means polyline\n else {\n const polylineSVG = document.createElementNS(this.SVGNameSpace, \"polyline\");\n let polylinePoints: string[] = [];\n\n for (let i = 0; i < anchorPoints.length; i++) {\n if (i === 0) {\n polylinePoints.push(sourceEndpoint.x + \",\" + sourceEndpoint.y);\n polylinePoints.push(anchorPoints[i].x + \",\" + anchorPoints[i].y);\n if (anchorPoints.length === 1) {\n polylinePoints.push(edgeEndpoint.x + \",\" + edgeEndpoint.y);\n }\n }\n else if (i === anchorPoints.length - 1) {\n polylinePoints.push(anchorPoints[i].x + \",\" + anchorPoints[i].y);\n polylinePoints.push(edgeEndpoint.x + \",\" + edgeEndpoint.y);\n }\n else {\n polylinePoints.push(anchorPoints[i].x + \",\" + anchorPoints[i].y);\n }\n }\n polylineSVG.setAttribute(\n 'points',\n polylinePoints.join(\" \")\n );\n polylineSVG.setAttribute('stroke-width', this.EDGE_WIDTH.toString());\n polylineSVG.setAttribute('stroke', 'black');\n if (lineStyle === \"dashed\") {\n lineSVG.setAttribute(\"stroke-dasharray\", this.DASH_PARAMETERS);\n }\n polylineSVG.setAttribute('fill', 'none');\n this.svg.appendChild(polylineSVG);\n }\n \n }\n\n createRect(node) {\n var nodeRectangle = document.createElementNS(this.SVGNameSpace, \"rect\");\n var nodePosition = node.position();\n if (node.isParent()) {\n nodeRectangle.setAttribute(\n \"x\",\n nodePosition.x - node.width() / 2 - this.COMPOUND_MARGIN / 2 + \"\"\n );\n nodeRectangle.setAttribute(\n \"y\",\n nodePosition.y - node.height() / 2 - this.COMPOUND_MARGIN / 2 + \"\"\n );\n nodeRectangle.setAttribute(\"width\", node.width() + this.COMPOUND_MARGIN);\n nodeRectangle.setAttribute(\n \"height\",\n node.height() + this.COMPOUND_MARGIN\n );\n } else {\n nodeRectangle.setAttribute(\"x\", nodePosition.x - node.width() / 2 + \"\");\n nodeRectangle.setAttribute(\"y\", nodePosition.y - node.height() / 2 + \"\");\n nodeRectangle.setAttribute(\"width\", node.width());\n nodeRectangle.setAttribute(\"height\", node.height());\n }\n\n nodeRectangle = this.createStyleForNodes(node, nodeRectangle);\n\n return nodeRectangle;\n }\n\n createNodeLabel(node, genomicDataOffset) {\n var verticalTextOffset = 5;\n var nodePosition = node.position();\n var svgText = document.createElementNS(this.SVGNameSpace, \"text\");\n\n if (node.isParent()) {\n verticalTextOffset = 20;\n svgText.setAttribute(\"x\", nodePosition.x);\n svgText.setAttribute(\n \"y\",\n nodePosition.y + node.height() / 2 + verticalTextOffset\n );\n } else {\n svgText.setAttribute(\"x\", nodePosition.x);\n svgText.setAttribute(\n \"y\",\n nodePosition.y + verticalTextOffset + genomicDataOffset\n );\n }\n\n svgText.setAttribute(\"font-family\", \"Arial\");\n svgText.setAttribute(\"text-anchor\", \"middle\");\n svgText.setAttribute(\"font-size\", this.NODE_FONT_SIZE.toString());\n svgText.innerHTML = node.data(\"name\");\n return svgText;\n }\n\n createStyleForNodes(node, nodeRectangle) {\n var nodeType = node.data().type;\n var strokeWidth = node.css(\"border-width\") || this.NODE_STROKE_WIDTH;\n var strokeColor = this.NODE_STROKE_COLOR;\n var fillColor = this.NODE_FILL_COLOR;\n var opacity = this.NODE_OPACITY;\n var strokeOpacity = 1;\n\n if (nodeType == \"GENE\" || nodeType == \"COMPARTMENT\") {\n nodeRectangle.setAttribute(\"rx\", this.ROUNDING_FACTOR);\n nodeRectangle.setAttribute(\"ry\", this.ROUNDING_FACTOR);\n\n if (nodeType == \"COMPARTMENT\")\n strokeWidth = this.COMPARTMENT_STROKE_WIDTH;\n }\n\n if (nodeType == \"PROCESS\") {\n opacity = 0;\n strokeOpacity = 0;\n }\n\n if (nodeType == \"FAMILY\") {\n fillColor = this.FAMILY_FILL_COLOR;\n strokeColor = this.FAMILY_STROKE_COLOR;\n }\n\n var styleString =\n \"stroke-width:\" +\n strokeWidth +\n \";\" +\n \"stroke:\" +\n strokeColor +\n \";\" +\n \"fill-opacity:\" +\n opacity +\n \";\" +\n \"fill:\" +\n fillColor +\n \";\" +\n \"stroke-opacity:\" +\n strokeOpacity +\n \";\";\n\n nodeRectangle.setAttribute(\"style\", styleString);\n\n return nodeRectangle;\n }\n\n createEdgeLabel(edge) {\n const labelText = edge.data(\"name\");\n \n if (labelText === \"\") {\n return undefined;\n }\n const svgTextElement = document.createElementNS(this.SVGNameSpace, \"text\");\n\n const fontSize = edge.style(\"font-size\");\n const fontFamily = edge.style(\"font-family\");\n\n // get rotation angle in degrees for transform: rotate()\n const labelRotationAngle = this.getEdgeLabelRotationAngle(edge);\n const lineHeight = edge._private.rscratch.labelLineHeight;\n\n // adjust margins to compensate for the label hack (see stylesheet)\n const dx = (lineHeight / 4) * Math.sin(edge._private.rscratch.labelAngle);\n const dy = (lineHeight / 4) * Math.cos(edge._private.rscratch.labelAngle);\n\n const labelPos = {\n x: edge._private.rscratch.labelX + dx,\n y: edge._private.rscratch.labelY - dy\n }\n\n svgTextElement.setAttribute('x', labelPos.x.toString());\n svgTextElement.setAttribute('y', labelPos.y.toString());\n svgTextElement.setAttribute(\"font-family\", fontFamily);\n svgTextElement.setAttribute(\"text-anchor\", \"middle\");\n svgTextElement.setAttribute(\"font-size\", fontSize);\n\n svgTextElement.innerHTML = labelText;\n\n // adjusting for autorotate option\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#rotate \n svgTextElement.setAttribute(\n \"transform\", \n \"rotate(\" + \n labelRotationAngle +\n \" \" +\n labelPos.x.toString() +\n \" \" +\n labelPos.y.toString()+\n \")\");\n\n return svgTextElement;\n }\n\n getEdgeLabelRotationAngle(edge) {\n const labelAngle = edge._private.rscratch.labelAngle;\n\n if (!labelAngle) {\n return 0;\n }\n\n return this.toDegrees(labelAngle);\n }\n\n toDegrees(radians) {\n const pi = Math.PI;\n return radians * (180/pi);\n }\n\n unitVector(v) {\n var inverseLength = 1 / Math.sqrt(v.x * v.x + v.y * v.y);\n\n return {\n x: v.x * inverseLength,\n y: v.y * inverseLength,\n };\n }\n\n rotateVector(v, radians) {\n var newX = v.x * Math.cos(radians) - v.y * Math.sin(radians);\n var newY = v.x * Math.sin(radians) + v.y * Math.cos(radians);\n\n return { x: newX, y: newY };\n }\n\n scale(v, scalar) {\n var newX = v.x * scalar;\n var newY = v.y * scalar;\n\n return { x: newX, y: newY };\n }\n}\n","import $ from \"jquery\";\nimport { GeneticAlterationRuleSet, shapeToSvg } from \"oncoprintjs\";\nimport tippy from \"tippy.js\";\nimport \"tippy.js/dist/tippy.css\"; // optional for styling\nimport { IColorValueMap } from \"../ui/react-pathway-mapper\";\n\ninterface Color {\n r: number;\n g: number;\n b: number;\n}\n\ninterface ValueColorPair {\n value: number;\n color: Color;\n}\nexport default class GenomicDataOverlayManager {\n public genomicDataMap: {};\n public visibleGenomicDataMapByType: {};\n public groupedGenomicDataCount: number;\n public groupedGenomicDataMap: {};\n public patientData: any;\n private DEFAULT_VISIBLE_GENOMIC_DATA_COUNT: number;\n private observers: any[];\n private cy: any;\n private colorScheme: IColorValueMap;\n\n constructor(cy: any) {\n this.cy = cy;\n this.genomicDataMap = {};\n this.patientData = {};\n this.visibleGenomicDataMapByType = {};\n this.groupedGenomicDataMap = {};\n this.groupedGenomicDataCount = 0;\n this.DEFAULT_VISIBLE_GENOMIC_DATA_COUNT = 6;\n this.colorScheme = {\n \"-100\": \"#0000ff\",\n \"0\": \"#ffffff\",\n \"100\": \"#ff0000\",\n };\n // Observer-observable pattern related stuff\n this.observers = [];\n }\n\n getEmptyGroupID() {\n const oldCount = this.groupedGenomicDataCount;\n this.groupedGenomicDataCount++;\n return oldCount;\n }\n\n addGenomicDataLocally(genomicData, groupID) {\n this.parseGenomicData(genomicData, groupID);\n this.showGenomicData();\n this.notifyObservers();\n }\n\n preparePortalGenomicDataShareDB(genomicData) {\n const geneMap = {};\n const visMap = {};\n\n for (const cancerKey in genomicData) {\n for (const geneSymbol in genomicData[cancerKey]) {\n geneMap[geneSymbol] = {};\n geneMap[geneSymbol][cancerKey] = genomicData[cancerKey][geneSymbol];\n }\n\n visMap[cancerKey] = true;\n }\n\n return {\n genomicDataMap: geneMap,\n visibilityMap: visMap,\n };\n }\n\n addGenomicData(data) {\n this.genomicDataMap = data;\n }\n\n removeGenomicVisData() {\n this.visibleGenomicDataMapByType = {};\n }\n\n addGenomicDataWithGeneSymbol(geneSymbol, data) {\n this.genomicDataMap[geneSymbol] = data;\n }\n\n addGenomicGroupData(groupID, data) {\n this.groupedGenomicDataMap[groupID] = data;\n }\n\n addPortalGenomicData(data, groupID) {\n for (const cancerStudy of Object.keys(data)) {\n this.visibleGenomicDataMapByType[cancerStudy] = true;\n // Group current cancer study according to the groupID\n if (this.groupedGenomicDataMap[groupID] === undefined) {\n this.groupedGenomicDataMap[groupID] = [];\n }\n\n this.groupedGenomicDataMap[groupID].push(cancerStudy);\n\n var cancerData = data[cancerStudy];\n\n for (const geneSymbol of Object.keys(cancerData)) {\n if (this.genomicDataMap[geneSymbol] === undefined)\n this.genomicDataMap[geneSymbol] = {};\n\n this.genomicDataMap[geneSymbol][cancerStudy] = data[cancerStudy][\n geneSymbol\n ].toFixed\n ? data[cancerStudy][geneSymbol].toFixed(2)\n : data[cancerStudy][geneSymbol];\n }\n }\n //This parameter is used as flag for PatientView PathwayMapper Functions\n if (data[\"PatientView\"] == 1) {\n this.patientData = data;\n this.showPatientData();\n } else {\n this.showGenomicData();\n }\n this.notifyObservers();\n }\n\n clearAllGenomicData = function() {\n this.genomicDataMap = {};\n this.visibleGenomicDataMapByType = {};\n this.groupedGenomicDataMap = {};\n this.groupedGenomicDataCount = 0;\n };\n\n removeGenomicData() {\n this.genomicDataMap = {};\n }\n\n removeGenomicDataWithGeneSymbol(geneSymbol) {\n this.genomicDataMap[geneSymbol] = {};\n }\n\n addGenomicVisData(key, data) {\n this.visibleGenomicDataMapByType[key] = data;\n }\n\n prepareGenomicDataShareDB = function(genomicData) {\n const genomicDataMap = {};\n const cancerTypes = [];\n const visibleGenomicDataMapByType = {};\n\n // By lines\n const lines = genomicData.split(\"\\n\");\n // First line is meta data !\n const metaLineColumns = lines[0].split(\"\\t\");\n\n // Parse cancer types\n for (let i = 1; i < metaLineColumns.length; i++) {\n cancerTypes.push(metaLineColumns[i]);\n // Update initially visible genomic data boxes !\n if (i - 1 < this.DEFAULT_VISIBLE_GENOMIC_DATA_COUNT) {\n visibleGenomicDataMapByType[cancerTypes[i - 1]] = true;\n } else {\n visibleGenomicDataMapByType[cancerTypes[i - 1]] = false;\n }\n }\n\n // parse genomic data\n for (let i = 1; i < lines.length; i++) {\n // EOF check\n if (lines[i].length === 0) {\n break;\n }\n\n // Split each line by tab and parse genomic data content\n const lineContent = lines[i].split(\"\\t\");\n const geneSymbol = lineContent[0];\n\n // If current gene entry is not in genomic data map create new hashmap entry\n if (!(geneSymbol in genomicDataMap)) {\n genomicDataMap[geneSymbol] = {};\n }\n\n // Add each entry of genomic data\n for (let j = 1; j < lineContent.length; j++) {\n genomicDataMap[geneSymbol][cancerTypes[j - 1]] = lineContent[j];\n }\n }\n\n const returnObj = {\n genomicDataMap: genomicDataMap,\n visibilityMap: visibleGenomicDataMapByType,\n };\n\n return returnObj;\n };\n\n updateGenomicDataVisibility = function(_key, isVisible) {\n if (_key in this.visibleGenomicDataMapByType) {\n this.visibleGenomicDataMapByType[_key] = isVisible;\n }\n };\n\n hideGenomicData = function() {\n this.cy\n .style()\n .selector('node[type=\"GENE\"]')\n .style(\"text-margin-y\", 0)\n .style(\"background-image\", function(ele) {\n const dataURI = \"data:image/svg+xml;utf8,\";\n return dataURI;\n })\n .update();\n };\n\n countVisibleGenomicDataByType() {\n // Count the genomic data that will be displayed on nodes' body\n let genomicDataBoxCount = 0;\n for (let cancerType in this.visibleGenomicDataMapByType) {\n if (this.visibleGenomicDataMapByType[cancerType]) {\n genomicDataBoxCount++;\n }\n }\n\n return genomicDataBoxCount;\n }\n\n generateSVGForNode(ele) {\n const genomicDataBoxCount = this.countVisibleGenomicDataByType();\n\n // Experimental data overlay part !\n const dataURI = \"data:image/svg+xml;utf8,\";\n const svgNameSpace = \"http://www.w3.org/2000/svg\";\n\n const nodeLabel = ele.data(\"name\");\n // If there is no genomic data for this node return !\n if (!(nodeLabel in this.genomicDataMap)) {\n return dataURI;\n }\n\n const eleBBox = ele.boundingBox();\n const reqWidth = this.getRequiredWidthForGenomicData(genomicDataBoxCount);\n const overlayRecBoxW = reqWidth - 10;\n const overlayRecBoxH = 25;\n const svg: any = document.createElementNS(svgNameSpace, \"svg\");\n // It seems this should be set according to the node size !\n svg.setAttribute(\"width\", reqWidth);\n svg.setAttribute(\"height\", eleBBox.h);\n // This is important you need to include this to succesfully render in cytoscape.js!\n svg.setAttribute(\"xmlns\", svgNameSpace);\n\n // Overlay Data Rect\n const overLayRectBBox = {\n w: overlayRecBoxW,\n h: overlayRecBoxH,\n x: reqWidth / 2 - overlayRecBoxW / 2,\n y: eleBBox.h / 2 + overlayRecBoxH / 2 - 18,\n };\n\n const genomicFrequencyData = this.genomicDataMap[nodeLabel];\n\n let maxGenomicDataBoxCount = /*(genomicDataBoxCount > 3) ? 3:*/ genomicDataBoxCount;\n let genomicBoxCounter = 0;\n\n for (let i in this.groupedGenomicDataMap) {\n for (let j in this.groupedGenomicDataMap[i]) {\n const cancerType = this.groupedGenomicDataMap[i][j];\n if (!this.visibleGenomicDataMapByType[cancerType]) {\n continue;\n }\n\n if (genomicFrequencyData[cancerType] !== undefined) {\n genomicDataRectangleGenerator(\n overLayRectBBox.x +\n (genomicBoxCounter * overLayRectBBox.w) / maxGenomicDataBoxCount,\n overLayRectBBox.y,\n overLayRectBBox.w / maxGenomicDataBoxCount,\n overLayRectBBox.h,\n genomicFrequencyData[cancerType],\n svg,\n this.colorScheme\n );\n } else {\n genomicDataRectangleGenerator(\n overLayRectBBox.x +\n (genomicBoxCounter * overLayRectBBox.w) / maxGenomicDataBoxCount,\n overLayRectBBox.y,\n overLayRectBBox.w / maxGenomicDataBoxCount,\n overLayRectBBox.h,\n null,\n svg,\n this.colorScheme\n );\n }\n\n genomicBoxCounter++;\n }\n }\n\n function hexToRGB(hex: string) {\n var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : null;\n }\n\n function swap(a, b) {\n let temp = a;\n a = b;\n b = temp;\n }\n\n function findValueColorInterval(\n colorScheme: IColorValueMap,\n value: number\n ): { lower: ValueColorPair; upper: ValueColorPair } {\n const pairs = Object.entries(colorScheme)\n .map(([value, color]) => {\n return {\n value: Number(value),\n color: hexToRGB(color),\n };\n })\n .sort((o1, o2) => {\n return o1.value - o2.value;\n });\n\n if (value < pairs[0].value) {\n return {\n lower: {\n value: -Infinity,\n color: pairs[0].color,\n },\n upper: {\n value: pairs[0].value,\n color: pairs[0].color,\n },\n };\n } else if (value > pairs[pairs.length - 1].value) {\n return {\n lower: {\n value: pairs[pairs.length - 1].value,\n color: pairs[pairs.length - 1].color,\n },\n upper: {\n value: Infinity,\n color: pairs[pairs.length - 1].color,\n },\n };\n } else {\n for (let i = 0; i < pairs.length - 1; i++) {\n if (value >= pairs[i].value && value < pairs[i + 1].value) {\n return {\n lower: {\n value: pairs[i].value,\n color: pairs[i].color,\n },\n upper: {\n value: pairs[i + 1].value,\n color: pairs[i + 1].color,\n },\n };\n }\n }\n\n return {\n lower: {\n value: -Infinity,\n color: pairs[0].color,\n },\n upper: {\n value: Infinity,\n color: pairs[pairs.length - 1].color,\n },\n };\n }\n }\n\n /**\n * Map the percentage value to r,g,b values using a log scale, i.e instead of taking the ratio linearly by taking differences\n * between the lower and upper color r,g,b values, take the differences between their Math.log values. This makes the color\n * scale up to the upper value much quicker, i.e in a 0-100 mapping a value of 20 doesn't map to 1/5 way between two colors\n * but closer to half way. This is done because high numbers in alteration values are extremely rare and even small numbers\n * are usually significant.\n */\n function getMappedColor(\n lowerColor: Color,\n upperColor: Color,\n lowerValue: number,\n upperValue: number,\n percent: number\n ): Color {\n const up = Math.log(1 + upperValue);\n const low = Math.log(1 + lowerValue);\n const p = Math.log(1 + (percent >= 0 ? percent : percent * -1));\n\n // arbitrary value used to slow down the scaling of log instead of getting too much into math\n const scalingFactor = percent >= 0 ? 0.8 : 1.2;\n\n const ratio = ((p - low) / (up - low)) * scalingFactor;\n\n return {\n r: lowerColor.r + ratio * (upperColor.r - lowerColor.r),\n g: lowerColor.g + ratio * (upperColor.g - lowerColor.g),\n b: lowerColor.b + ratio * (upperColor.b - lowerColor.b),\n };\n }\n\n function genomicDataRectangleGenerator(\n x,\n y,\n w,\n h,\n percent,\n parentSVG,\n colorScheme\n ) {\n const limits = findValueColorInterval(colorScheme, Number(percent));\n let color: Color = { r: 255, g: 255, b: 255 };\n if (limits.lower.value === -Infinity) {\n color = limits.upper.color;\n } else if (limits.upper.value === Infinity) {\n color = limits.lower.color;\n } else {\n let upperValue = limits.upper.value;\n let lowerValue = limits.lower.value;\n let upperColor = limits.upper.color;\n let lowerColor = limits.lower.color;\n\n if (lowerValue < 0 && upperValue <= 0) {\n lowerValue *= -1;\n upperValue *= -1;\n swap(lowerValue, upperValue);\n } else if (lowerValue < 0 && upperValue > 0) {\n upperValue += lowerValue * -1;\n lowerValue = 0;\n }\n\n color = getMappedColor(\n lowerColor,\n upperColor,\n lowerValue,\n upperValue,\n Number(percent)\n );\n }\n\n let colorString = \"\";\n if (percent) {\n colorString = `rgb(${Math.round(color.r)}, ${Math.round(\n color.g\n )}, ${Math.round(color.b)})`;\n // Rectangle Part\n const overlayRect = document.createElementNS(svgNameSpace, \"rect\");\n overlayRect.setAttribute(\"x\", x);\n overlayRect.setAttribute(\"y\", y);\n overlayRect.setAttribute(\"width\", w);\n overlayRect.setAttribute(\"height\", h);\n overlayRect.setAttribute(\n \"style\",\n \"stroke-width:1;stroke:rgb(0,0,0);opacity:1;fill:\" + colorString + \";\"\n );\n\n // Text Part\n if (percent[0] === \"-\") {\n percent = percent.substr(1);\n }\n const textPercent =\n percent < 0.5 && percent > 0 ? \"<0.5\" : Number(percent).toFixed(1);\n const text = percent == -101 ? \"N/P\" : textPercent + \"%\";\n const fontSize = 14;\n const textLength = text.length;\n const xOffset = w / 2 - textLength * 4;\n const yOffset = fontSize / 3;\n\n const svgText = document.createElementNS(svgNameSpace, \"text\");\n svgText.setAttribute(\"x\", x + xOffset);\n svgText.setAttribute(\"y\", y + h / 2 + yOffset);\n svgText.setAttribute(\"font-family\", \"Arial\");\n svgText.setAttribute(\"font-size\", fontSize + \"\");\n svgText.innerHTML = text;\n\n parentSVG.appendChild(overlayRect);\n parentSVG.appendChild(svgText);\n } else {\n colorString = \"rgb(210,210,210)\";\n\n // Rectangle Part\n const overlayRect = document.createElementNS(svgNameSpace, \"rect\");\n overlayRect.setAttribute(\"x\", x);\n overlayRect.setAttribute(\"y\", y);\n overlayRect.setAttribute(\"width\", w);\n overlayRect.setAttribute(\"height\", h);\n overlayRect.setAttribute(\n \"style\",\n \"stroke-width:1;stroke:rgb(0,0,0);opacity:1;fill:\" + colorString + \";\"\n );\n\n parentSVG.appendChild(overlayRect);\n }\n }\n\n return svg;\n }\n\n // Just an utility function to calculate required width for genes for genomic data !\n getRequiredWidthForGenomicData(genomicDataBoxCount) {\n const term = genomicDataBoxCount > 3 ? genomicDataBoxCount - 3 : 0;\n return 150 + term * 35;\n }\n\n updateColorScheme(colorValueMap: IColorValueMap) {\n this.colorScheme = colorValueMap;\n }\n\n showGenomicData() {\n const self = this;\n\n const genomicDataBoxCount = this.countVisibleGenomicDataByType();\n\n if (genomicDataBoxCount < 1) {\n // Hide all genomic data and return\n this.hideGenomicData();\n return;\n }\n\n this.cy.nodes('[type=\"GENE\"]').forEach(node => {\n node.data('w', this.getRequiredWidthForGenomicData(genomicDataBoxCount));\n })\n\n this.cy\n .style()\n .selector('node[type=\"GENE\"]')\n .style(\"text-margin-y\", function(ele) {\n const nodeLabel = ele.data(\"name\");\n // If there is no genomic data for this node return !\n if (!(nodeLabel in self.genomicDataMap)) {\n return 0;\n }\n\n // Else shift label in Y axis\n return -15;\n })\n .style(\"background-image\", function(ele) {\n const x = encodeURIComponent(self.generateSVGForNode(ele).outerHTML);\n if (x === \"undefined\") {\n return \"none\";\n }\n const dataURI = \"data:image/svg+xml;utf8,\" + x;\n return dataURI;\n })\n .update();\n }\n\n parseGenomicData(genomicData, groupID) {\n this.genomicDataMap = this.genomicDataMap || {};\n this.visibleGenomicDataMapByType = this.visibleGenomicDataMapByType || {};\n this.groupedGenomicDataMap = this.groupedGenomicDataMap || {};\n const cancerTypes = [];\n\n // By lines\n const lines = genomicData.split(\"\\n\");\n // First line is meta data !\n const metaLineColumns = lines[0].split(\"\\t\");\n\n // Parse cancer types\n for (let i = 1; i < metaLineColumns.length; i++) {\n cancerTypes.push(metaLineColumns[i]);\n // Update initially visible genomic data boxes !\n if (i - 1 < this.DEFAULT_VISIBLE_GENOMIC_DATA_COUNT) {\n this.visibleGenomicDataMapByType[cancerTypes[i - 1]] = true;\n } else {\n this.visibleGenomicDataMapByType[cancerTypes[i - 1]] = false;\n }\n\n if (this.groupedGenomicDataMap[groupID] === undefined) {\n this.groupedGenomicDataMap[groupID] = [];\n }\n this.groupedGenomicDataMap[groupID].push(cancerTypes[i - 1]);\n }\n\n // parse genomic data\n for (let i = 1; i < lines.length; i++) {\n // EOF check\n if (lines[i].length === 0) {\n break;\n }\n\n // Split each line by tab and parse genomic data content\n const lineContent = lines[i].split(\"\\t\");\n const geneSymbol = lineContent[0];\n\n // If current gene entry is not in genomic data map create new map\n if (!(geneSymbol in this.genomicDataMap)) {\n this.genomicDataMap[geneSymbol] = {};\n }\n\n // Add each entry of genomic data\n for (let j = 1; j < lineContent.length; j++) {\n this.genomicDataMap[geneSymbol][cancerTypes[j - 1]] = lineContent[j];\n }\n }\n }\n\n // Simple observer-observable pattern for views!!!!!\n registerObserver(observer) {\n this.observers.push(observer);\n }\n\n notifyObservers() {\n for (const observer of this.observers) {\n observer.notify();\n }\n }\n\n //This method is needed to calculate the alteration Types for each gene\n getAlterationCountForPatient(geneData) {\n let count = 0;\n for (let altType in geneData) {\n count++;\n }\n return count;\n }\n\n //These methods are created to be used in CbioPortal PatientView they are not used\n //in ResultView Page or PathwayMapper Editor\n\n showPatientData() {\n const self = this;\n\n const data = this.patientData;\n\n // const genomicDataBoxCount = 3 //this.countVisibleGenomicDataByType(); //CHANGE\n const genomicDataBoxCount = data.geneticTrackData\n ? data.geneticTrackData.length\n : 3;\n if (genomicDataBoxCount < 1) {\n // Hide all genomic data and return\n this.hideGenomicData();\n return;\n }\n\n this.cy\n .style()\n .selector('node[type=\"GENE\"]')\n // It used to change the width of nodes only locally\n .style(\"width\", (ele) => {\n return this.getRequiredWidthForGenomicData(genomicDataBoxCount);\n })\n .style(\"text-margin-y\", function(ele) {\n const nodeLabel = ele.data(\"name\");\n\n // If there is no genomic data for this node return !\n if (!(nodeLabel in data)) {\n return 0;\n }\n\n // Else shift label in Y axis\n return -15;\n })\n .style(\"background-image\", function(ele) {\n const x = encodeURIComponent(\n // self.generateSVGForPatientNode(ele, data).outerHTML\n self.generateOncoprintForPatientNode(ele).outerHTML\n );\n if (x === \"undefined\") {\n return \"none\";\n }\n const dataURI = \"data:image/svg+xml;utf8,\" + x;\n return dataURI;\n })\n .update();\n\n this.cy.on(\"mouseover\", 'node[type=\"GENE\"]', function(event) {\n const node = event.target || event.cyTarget;\n const nodeLabel = node.data(\"name\");\n if (!data[nodeLabel]) {\n return;\n }\n\n let ref = node.popperRef();\n let dummyDomEle = document.createElement(\"div\");\n document.body.appendChild(dummyDomEle);\n\n let tip = tippy(dummyDomEle, {\n // tippy props:\n getReferenceClientRect: ref.getBoundingClientRect, // https://atomiks.github.io/tippyjs/v6/all-props/#getreferenceclientrect\n trigger: \"manual\", // mandatory, we cause the tippy to show programmatically.\n placement: \"bottom\",\n interactive: true,\n theme: \"cbioportal\",\n // your own custom props\n // content prop can be used when the target is a single element https://atomiks.github.io/tippyjs/v6/constructor/#prop\n content: () => {\n let content = self\n .generateHTMLContentForNodeTooltip(node, data)\n .get(0);\n\n return content;\n },\n onHidden(instance) {\n instance.destroy();\n dummyDomEle.remove();\n },\n });\n\n node.one(\"showqtipevent\", function() {\n tip.show();\n });\n\n node.on(\"mouseout\", function() {\n if (dummyDomEle && dummyDomEle[\"_tippy\"]) {\n tip.hide();\n }\n });\n\n node.trigger(\"showqtipevent\");\n });\n }\n\n //Every mutation type has a unique color coded. This method is used to retrieve the colors\n getOncoprintColors(selectedGene) {\n const oncoprintColors = {\n Missense_Mutation: \"rgb(0,128,0)\",\n inframe: \"#993404\",\n truncating: \"#000000\",\n Fusion: \"rgb(139,0,201)\",\n AMP: \"rgb(255,0,0)\",\n gain: \"#ffb6c1\",\n heatloss: \"#8fd8d8\",\n homdel: \"rgb(0,0,255)\",\n DeepDel: \"rgb(0,0,255)\",\n \"5'Flank\": \"rgb(207,88,188)\",\n in_frame_del: \"rgb(166,128,40)\",\n };\n\n if (oncoprintColors[selectedGene] !== undefined) {\n return oncoprintColors[selectedGene];\n } else {\n //Types are not on the list corresponds to black\n return \"rgb(0,0,0)\";\n }\n }\n generateSVGForPatientNode(ele, patientData) {\n //Here we should use the parameter patientData when calculating the expressions\n const genomicDataBoxCount = this.countVisibleGenomicDataByType();\n // Experimental data overlay part !\n const dataURI = \"data:image/svg+xml;utf8,\";\n const svgNameSpace = \"http://www.w3.org/2000/svg\";\n //nodeLabel refers to the nodeLabels in the overlay data\n const nodeLabel = ele.data(\"name\");\n // If there is no genomic data for this node return !\n if (!(nodeLabel in patientData)) {\n return dataURI;\n }\n //this parameter refers to the count of alteration types for each gene\n const alterationBoxCount = this.getAlterationCountForPatient(\n patientData[nodeLabel]\n );\n\n const eleBBox = ele.boundingBox();\n const svg: any = document.createElementNS(svgNameSpace, \"svg\");\n //this parameter is set to 12 since there are 12 different possiblities for types\n const term = alterationBoxCount > 12 ? alterationBoxCount - 12 : 0;\n const reqWidth = 150 + term * 35;\n\n const overlayRecBoxW = reqWidth - 10;\n const overlayRecBoxH = 25;\n\n // It seems this should be set according to the node size !\n svg.setAttribute(\"width\", reqWidth);\n svg.setAttribute(\"height\", eleBBox.h);\n // This is important you need to include this to succesfully render in cytoscape.js!\n svg.setAttribute(\"xmlns\", svgNameSpace);\n\n // Overlay Data Rect\n const overLayRectBBox = {\n w: overlayRecBoxW,\n h: overlayRecBoxH,\n x: reqWidth / 2 - overlayRecBoxW / 2,\n y: eleBBox.h / 2 + overlayRecBoxH / 2 - 18,\n };\n let genomicBoxCounter = 0;\n //required width is calculated for each gene since box count is different for each gene\n for (let j in patientData[nodeLabel]) {\n const genomicAlterationData = patientData[nodeLabel];\n const alterationType = j;\n\n if (!this.visibleGenomicDataMapByType[nodeLabel]) {\n continue;\n }\n //get the color string corresponding to the alterationType\n let colorString = this.getOncoprintColors(alterationType);\n\n if (genomicAlterationData[alterationType] !== undefined) {\n genomicDataRectangleGeneratorPatient(\n overLayRectBBox.x +\n (genomicBoxCounter * overLayRectBBox.w) / alterationBoxCount,\n overLayRectBBox.y,\n overLayRectBBox.w / alterationBoxCount,\n overLayRectBBox.h,\n 100,\n svg,\n alterationType,\n colorString\n );\n } else {\n genomicDataRectangleGeneratorPatient(\n overLayRectBBox.x +\n (genomicBoxCounter * overLayRectBBox.w) / alterationBoxCount,\n overLayRectBBox.y,\n overLayRectBBox.w / alterationBoxCount,\n overLayRectBBox.h,\n null,\n svg,\n \"\",\n null\n );\n }\n\n genomicBoxCounter++;\n }\n //This function differs from genomicRectangleGenerator. genomicDataRectangleGeneratorPatient\n //has an extra parameter text. In patient view alterationTypes of genes are displayed instead of\n //alteration percentage. Hence a text is sent to this method which is alterationType\n function genomicDataRectangleGeneratorPatient(\n x,\n y,\n w,\n h,\n percent,\n parentSVG,\n text,\n colorString\n ) {\n if (percent) {\n const isNegativePercent = percent < 0;\n // Rectangle Part\n const overlayRect = document.createElementNS(svgNameSpace, \"rect\");\n overlayRect.setAttribute(\"x\", x);\n overlayRect.setAttribute(\"y\", y);\n overlayRect.setAttribute(\"width\", w);\n overlayRect.setAttribute(\"height\", h);\n overlayRect.setAttribute(\n \"style\",\n \"stroke-width:1;stroke:rgb(0,0,0);opacity:1;fill:\" + colorString + \";\"\n );\n\n // Text Part\n const fontSize = 14;\n const textLength = 4;\n const xOffset = w / 2 - textLength * 4;\n const yOffset = fontSize / 3;\n\n const svgText = document.createElementNS(svgNameSpace, \"text\");\n if (colorString === \"rgb(0,0,0)\") {\n svgText.setAttribute(\"fill\", \"white\");\n }\n svgText.setAttribute(\"x\", x + xOffset);\n svgText.setAttribute(\"y\", y + h / 2 + yOffset);\n\n svgText.setAttribute(\"font-family\", \"Arial\");\n svgText.setAttribute(\"font-size\", fontSize + \"\");\n\n //first 4 letters of the alterationTypes are used\n svgText.innerHTML = text.substring(0, 4);\n parentSVG.appendChild(overlayRect);\n parentSVG.appendChild(svgText);\n } else {\n //Normally\n colorString = \"rgb(210,210,210)\";\n }\n }\n\n return svg;\n }\n\n generateOncoprintForPatientNode(ele) {\n // const dataURI = 'data:image/svg+xml;utf8,'\n // nodeLabel refers to the nodeLabels in the overlay data\n const patientData = this.patientData;\n const nodeLabel = ele.data(\"name\");\n const genomicData = patientData[nodeLabel];\n\n const svgNameSpace = \"http://www.w3.org/2000/svg\";\n const svgElement: any = document.createElementNS(svgNameSpace, \"svg\");\n\n if (!genomicData) {\n return { outerHTML: \"\" };\n }\n\n const ruleset = new GeneticAlterationRuleSet(\n genomicData.geneticTrackRuleSetParams\n );\n const cellWidth = 6;\n const cellPadding = 3;\n const cellHeight = 23;\n const cellVerticalPadding = 8;\n\n const universalShapes = ruleset.getUniversalShapes(cellWidth, cellHeight);\n\n const specificShapesPerDatum = ruleset.getSpecificShapesForDatum(\n genomicData.geneticTrackData,\n cellWidth,\n cellHeight\n );\n\n const shapesPerDatum = specificShapesPerDatum.map((specificShapes) =>\n universalShapes.concat(specificShapes)\n );\n\n shapesPerDatum.forEach((shapes, index) => {\n const offsetX = index * (cellWidth + cellPadding); // width + padding\n const offsetY = cellVerticalPadding;\n const g = document.createElementNS(svgNameSpace, \"g\");\n shapes.forEach((shape) =>\n g.appendChild(shapeToSvg(shape, offsetX, offsetY))\n );\n svgElement.appendChild(g);\n });\n\n // It seems this should be set according to the node size !\n svgElement.setAttribute(\n \"width\",\n ((cellWidth + cellPadding) * shapesPerDatum.length).toString()\n );\n svgElement.setAttribute(\n \"height\",\n (cellHeight + cellVerticalPadding).toString()\n );\n // This is important you need to include this to succesfully render in cytoscape.js!\n svgElement.setAttribute(\"xmlns\", svgNameSpace);\n\n return svgElement;\n }\n\n // Mapping of alteration type keys to strings\n // See: https://github.com/cBioPortal/cbioportal-frontend/blob/442e108208846255feb1ed5b309218cd44927fb9/src/shared/components/oncoprint/TooltipUtils.ts#L599\n getCNADisplayString(alterationTypeKey: number) {\n const disp_cna: { [integerCN: string]: string } = {\n \"-2\": \"HOMODELETED\",\n \"-1\": \"HETLOSS\",\n \"1\": \"GAIN\",\n \"2\": \"AMPLIFIED\",\n };\n return disp_cna[alterationTypeKey];\n }\n\n generateSvgIconForSample(iconColor: string, iconText: string) {\n var html =\n '' +\n '' +\n '' +\n \"\" +\n '' +\n '' +\n iconText +\n \"\" +\n \"\" +\n \"\";\n\n return html;\n }\n\n generateHTMLContentForNodeTooltip(ele, patientData) {\n const tooltipMaxHeight = \"200px\";\n const tooltipMaxWidth = \"200px\";\n const marginBetweenSamples = \"10px\";\n const sampleIconColorMap = patientData.sampleColors;\n const sampleIndexMap = patientData.sampleIndex;\n\n const nodeLabel = ele.data(\"name\");\n const data = patientData[nodeLabel];\n\n // Outer wrapper for the entire tooltip\n var wrapper = $(\"
\");\n wrapper.css({\n \"max-width\": tooltipMaxWidth,\n \"max-height\": tooltipMaxHeight,\n \"word-wrap\": \"break-word\",\n \"overflow-y\": \"auto\",\n });\n\n data.geneticTrackData.forEach((sample, sampleIndex) => {\n const sampleId = sample.sample;\n const iconColor = sampleIconColorMap[sampleId];\n const iconText = (sampleIndexMap[sampleId] + 1).toString();\n const sampleIconSvgHTML = this.generateSvgIconForSample(\n iconColor,\n iconText\n );\n\n const margin = sampleIndex > 0 ? marginBetweenSamples : \"0px\";\n\n // Inner wrapper for a single sample\n var sampleWrapper = $(\"
\");\n sampleWrapper.css({\n \"margin-top\": margin,\n });\n\n const sampleData = sample.data;\n var mutationInfo = [];\n var cnaInfo = [];\n var fusionInfo = [];\n sampleData.forEach((data) => {\n const geneSymbol = data.gene.hugoGeneSymbol;\n\n if (\n sample.disp_mut &&\n data.proteinChange &&\n data.mutationType !== \"Fusion\"\n ) {\n const proteinChange = data.proteinChange;\n mutationInfo.push({\n gene: geneSymbol,\n proteinChange: proteinChange,\n });\n }\n\n if (sample.disp_cna && data.alteration) {\n const cnaLabelKey = data.alteration;\n const cnaLabel = this.getCNADisplayString(cnaLabelKey);\n cnaInfo.push({\n gene: geneSymbol,\n cnaLabel: cnaLabel,\n });\n }\n\n if (\n sample.disp_fusion &&\n data.proteinChange &&\n data.mutationType === \"Fusion\"\n ) {\n const proteinChange = data.proteinChange;\n fusionInfo.push({\n gene: geneSymbol,\n proteinChange: proteinChange,\n });\n }\n });\n // Prepare HTML for tooltip\n var mutationInfoHTML = mutationInfo.length > 0 ? \"Mutation: \" : \"\";\n var cnaInfoHTML = cnaInfo.length > 0 ? \"CNA: \" : \"\";\n var fusionInfoHTML = fusionInfo.length > 0 ? \"Fusion: \" : \"\";\n\n mutationInfo.forEach((mutation, index) => {\n mutationInfoHTML +=\n \"\" + mutation.gene + \" \" + mutation.proteinChange + \"\";\n if (index !== mutationInfo.length - 1) {\n mutationInfoHTML += \", \";\n } else {\n mutationInfoHTML += \"
\";\n }\n });\n\n cnaInfo.forEach((cna, index) => {\n cnaInfoHTML += \"\" + cna.gene + \" \" + cna.cnaLabel + \"\";\n if (index !== cnaInfo.length - 1) {\n cnaInfoHTML += \", \";\n } else {\n cnaInfoHTML += \"
\";\n }\n });\n\n fusionInfo.forEach((fusion, index) => {\n fusionInfoHTML +=\n \"\" + fusion.gene + \" \" + fusion.proteinChange + \"\";\n if (index !== fusionInfo.length - 1) {\n fusionInfoHTML += \", \";\n } else {\n fusionInfoHTML += \"
\";\n }\n });\n const sampleIdHTML = \" \" + sampleId + \"\" + \"
\";\n sampleWrapper.append(\n $(\n \"
\" +\n sampleIconSvgHTML +\n sampleIdHTML +\n mutationInfoHTML +\n cnaInfoHTML +\n fusionInfoHTML +\n +\"
\"\n )\n );\n wrapper.append(sampleWrapper);\n });\n\n return wrapper;\n }\n}\n","import autobind from \"autobind-decorator\";\nimport { action, makeObservable, observable } from \"mobx\";\nimport LayoutProperties, { ILayoutProperties } from \"../modals/LayoutProperties\";\nimport { IColorValueMap, IProfileMetaData } from \"../ui/react-pathway-mapper\";\nimport CBioPortalAccessor from \"../utils/CBioPortalAccessor\";\nimport SVGExporter from \"../utils/SVGExporter\";\nimport GenomicDataOverlayManager from \"./GenomicDataOverlayManager\";\nimport ShareDBManager from \"./ShareDBManager\";\n\nconst _ = require('lodash');\n\nexport default class EditorActionsManager{\n\n public static defaultLayoutProperties: ILayoutProperties =\n {\n name: 'fcose',\n nodeRepulsion: 4500,\n idealEdgeLength: 50,\n edgeElasticity: 0.45,\n nestingFactor: 0.1,\n gravity: 0.25,\n numIter: 2500,\n tile: true,\n animate: true,\n randomize: false,\n gravityRangeCompound: 1.5,\n // Gravity force (constant) for compounds\n gravityCompound: 1.0,\n // Gravity range (constant)\n gravityRange: 3.8,\n // Amount of vertical space to put between degree zero nodes during tiling (can also be a function)\n tilingPaddingVertical: 10,\n // Amount of horizontal space to put between degree zero nodes during tiling (can also be a function)\n tilingPaddingHorizontal: 10,\n // Initial cooling factor for incremental layout\n initialEnergyOnIncremental: 0.5,\n animationDuration: 2000,\n animationEasing: 'cubic-bezier(0.17,0.72,0.41,0.98)',\n };\n \n public cy: any;\n public genomicDataOverlayManager: GenomicDataOverlayManager;\n public edgeEditing: any;\n public selectedNodeStack: any;\n public layoutProperties: ILayoutProperties;\n \n private FIT_CONSTANT: number;\n private observers: any[];\n private svgExporter: SVGExporter;\n private undoRedoManager: any;\n private isCbioPortal: boolean;\n private isCollaborative: boolean;\n private shareDBManager: ShareDBManager;\n private portalAccessor: CBioPortalAccessor;\n private viewUtilities: any;\n\n @observable\n private profiles: IProfileMetaData[];\n\n @observable\n private genomicDataOverlayColorScheme: IColorValueMap;\n\n private colorSchemeChangeCallback: (IColorValueMap) => void;\n\n constructor(isCollaborative: boolean, shareDBManager: any, cyInst: any, isCBioPortal: boolean,\n undoRedoManager: any, portalAccessor: CBioPortalAccessor, profiles: IProfileMetaData[],\n genomicDataOverlayColorScheme: IColorValueMap, colorSchemeChangeCallback: (IColorValueMap) => void)\n {\n // Set cy instance and set real time manager reference if collaborative mode\n makeObservable(this);\n this.cy = cyInst;\n this.isCollaborative = isCollaborative;\n this.isCbioPortal = isCBioPortal;\n this.profiles = profiles;\n this.genomicDataOverlayColorScheme = genomicDataOverlayColorScheme;\n this.colorSchemeChangeCallback = colorSchemeChangeCallback;\n \n const edgeEditingOptions = {\n bendPositionsFunction: function(ele) {\n return ele.data('bendPointPositions');\n },\n // A function parameter to get control point positions, should return positions of control points\n controlPositionsFunction: function(ele) {\n return ele.data('controlPointPositions');\n },\n // whether the anchor editing operations are undoable (requires cytoscape-undo-redo.js)\n undoable: true,\n // the size of bend shape is obtained by multipling width of edge with this parameter\n anchorShapeSizeFactor: 6,\n // whether to start the plugin in the enabled state\n enabled: !this.isCbioPortal,\n \n handleReconnectEdge: this.isCollaborative ? \n this.reconnectEdge.bind(this) :\n undefined,\n\n enableMultipleAnchorRemovalOption: true\n };\n \n this.edgeEditing = this.cy.edgeEditing(edgeEditingOptions);\n this.portalAccessor = portalAccessor;\n if(this.isCollaborative) {\n this.shareDBManager = shareDBManager;\n }\n\n this.FIT_CONSTANT = 50;\n\n this.layoutProperties = _.clone(EditorActionsManager.defaultLayoutProperties);\n this.observers = [];\n this.genomicDataOverlayManager = new GenomicDataOverlayManager(this.cy);\n this.svgExporter = new SVGExporter(this.edgeEditing, this);\n\n this.selectedNodeStack = {};\n this.undoRedoManager = undoRedoManager;\n this.undoRedoManager.action(\"changePositions\", this.doChangePosition, this.undoChangePosition);\n this.undoRedoManager.action(\"changeNodeSize\", this.doChangeNodeSize, this.undoChangeNodeSize);\n this.undoRedoManager.action(\"changeCompoundSize\", this.doChangeCompoundSize, this.undoChangeCompoundSize);\n this.undoRedoManager.action(\"changeName\", this.doChangename, this.undoChangeName);\n this.undoRedoManager.action(\"hideNode\", this.doHide, this.undoHide);\n this.undoRedoManager.action(\"showAllNodes\", this.doShow, this.undoShow);\n // HighlightOthers is the type of highlight from the menu and by searching, while highlightInvalidGenes is for only invalid genes\n this.undoRedoManager.action(\"highlightInvalidGenes\", this.doHighlightInvalidGenes, this.undoHighlightInvalidGenes);\n this.undoRedoManager.action(\"removeHighlightInvalidGenes\", this.undoHighlightInvalidGenes, this.doHighlightInvalidGenes);\n this.undoRedoManager.action(\"highlightOthers\", this.doHighlight, this.undoHighlight);\n this.undoRedoManager.action(\"removeOtherHighlight\", this.undoHighlight, this.doHighlight);\n\n };\n\n @action.bound\n setProfile(index: number, profile: IProfileMetaData) {\n this.profiles[index] = profile;\n }\n\n @action.bound\n addProfile(profile: IProfileMetaData) {\n this.profiles.push(profile);\n }\n\n @action.bound\n removeProfiles() {\n this.profiles.length = 0;\n }\n\n @action.bound\n setGenomicDataOverlayColorScheme(scheme: IColorValueMap) {\n this.genomicDataOverlayColorScheme = scheme;\n }\n\n @autobind\n setViewUtilities(viewUtilitiesRef: any) {\n this.viewUtilities = viewUtilitiesRef;\n }\n\n getGenomicDataOverlayColorScheme() : IColorValueMap {\n return this.genomicDataOverlayColorScheme;\n }\n\n handleChangePositionByAlignment(movedNodeArr: any)\n {\n if (this.isCollaborative)\n this.shareDBManager.changeElementsPositionByAlignment(movedNodeArr);\n else\n this.undoRedoManager.do(\"changePositions\", movedNodeArr)\n };\n\n /*\n * Undo redo for changing positions of nodes via programatically (node.position)\n * **/\n doChangePosition(movedNodes: any)\n {\n const newMovedNodes = [];\n\n for(let i = 0; i < movedNodes.length; i++)\n {\n const currentNodePosition =\n {\n x: movedNodes[i].node.position().x,\n y: movedNodes[i].node.position().y\n };\n newMovedNodes.push({node: movedNodes[i].node, oldPosition: currentNodePosition, nextPosition: movedNodes[i].nextPosition});\n movedNodes[i].node.position(movedNodes[i].nextPosition);\n }\n\n return newMovedNodes;\n };\n\n undoChangePosition(movedNodes: any)\n {\n var newMovedNodes = [];\n\n for(var i = 0; i < movedNodes.length; i++)\n {\n var currentNodePosition =\n {\n x: movedNodes[i].node.position().x,\n y: movedNodes[i].node.position().y\n };\n newMovedNodes.push({node: movedNodes[i].node, oldPosition: movedNodes[i].oldPosition, nextPosition: currentNodePosition});\n movedNodes[i].node.position(movedNodes[i].oldPosition);\n }\n\n return newMovedNodes;\n };\n\n changeNodePositionsByArrows(selectedNodes: any)\n {\n if (this.isCollaborative)\n this.shareDBManager.changeNodePositionsShareDB(selectedNodes);\n //node-editing extension already deals for the movement in local mode\n };\n\n /*\n * Undo redo for changing size of nodes\n * **/\n doChangeNodeSize (args: any)\n {\n args.ele.data('w', args.newWidth);\n args.ele.data('h', args.newHeight);\n args.ele.style('width', args.newWidth);\n args.ele.style('height', args.newHeight);\n\n return args;\n };\n\n undoChangeNodeSize(args: any)\n {\n args.ele.data('w', args.oldWidth);\n args.ele.data('h', args.oldHeight);\n args.ele.style('width', args.oldWidth);\n args.ele.style('height', args.oldHeight);\n\n return args;\n };\n\n /*\n * Undo redo for changing size of compounds\n * **/\n doChangeCompoundSize(args: any)\n {\n args.ele.style('min-width', args.newMinWidth);\n args.ele.style('min-width-bias-left', args.newMinWidthBiasLeft);\n args.ele.style('min-width-bias-right', args.newMinWidthBiasRight);\n args.ele.style('min-height', args.newMinHeight);\n args.ele.style('min-height-bias-top', args.newMinHeightBiasTop);\n args.ele.style('min-height-bias-bottom', args.newMinHeightBiasBottom);\n\n return args;\n };\n\n undoChangeCompoundSize(args: any)\n {\n if (args.oldMinWidth == undefined)\n {\n args.ele.style('min-width', 0);\n args.ele.style('min-width-bias-left', 0);\n args.ele.style('min-width-bias-right', 0);\n\n }\n else {\n args.ele.style('min-width', args.oldMinWidth);\n args.ele.style('min-width-bias-left', args.oldMinWidthBiasLeft);\n args.ele.style('min-width-bias-right', args.oldMinWidthBiasRight);\n }\n if (args.oldMinHeight == undefined)\n {\n args.ele.style('min-height', 0);\n args.ele.style('min-height-bias-top', 0);\n args.ele.style('min-height-bias-bottom', 0);\n }\n else {\n args.ele.style('min-height', args.oldMinHeight);\n args.ele.style('min-height-bias-top', args.oldMinHeightBiasTop);\n args.ele.style('min-height-bias-bottom', args.oldMinHeightBiasBottom);\n }\n\n return args;\n };\n\n changeName(ele: any, newName: any)\n {\n if (this.isCollaborative)\n {\n this.shareDBManager.changeName(ele, newName);\n }\n else\n {\n this.changeNameCy(ele, newName);\n }\n };\n\n changeNameCy(ele: any, newName: any)\n {\n var currentName = ele.data('name');\n var args = {ele: ele, oldName: currentName, newName: newName};\n this.undoRedoManager.do('changeName', args);\n };\n\n /*\n * Undo redo for changing name of nodes\n * **/\n doChangename(args: any)\n {\n\n var currentName = args.ele.data('name');\n var newArgs = {ele: args.ele, newName: args.newName, oldName: currentName};\n args.ele.data('name', args.newName);\n\n return newArgs;\n };\n\n undoChangeName(args: any)\n {\n\n var currentName = args.ele.data('name');\n var newArgs = {ele: args.ele, newName: args.newName, oldName: currentName};\n args.ele.data('name', args.oldName);\n\n return newArgs;\n };\n\n hideSelectedNodes()\n {\n //Hides the selected elements\n var sel = this.cy.nodes(\":selected\");\n var nodesToHide = sel;\n var b = true;\n //Hides the parents if they have no children\n sel.parent().each((parent: any) =>\n {\n b=true;\n parent.children().each(function(ch: any)\n {\n if (!ch.selected())\n {\n if (ch.visible()) b=false;\n }\n }\n );\n if (b) nodesToHide = nodesToHide.add(parent);\n });\n this.cy.elements(\":selected\").unselect();\n if (this.isCollaborative)\n this.shareDBManager.changeVisibility(nodesToHide, true);\n else\n this.undoRedoManager.do('hideNode', nodesToHide);\n };\n\n /*\n * Undo redo for hiding nodes\n * **/\n @autobind\n doHide(args: any)\n {\n this.viewUtilities.hide(args);\n return args;\n };\n\n @autobind\n undoHide(args: any)\n {\n this.viewUtilities.show(args);\n return args;\n };\n\n showAllNodes()\n {\n var hid = this.cy.nodes(\":hidden\");\n if (this.isCollaborative)\n this.shareDBManager.changeVisibility(hid, false);\n else\n this.undoRedoManager.do('showAllNodes', hid);\n };\n\n /*\n * Undo redo for showing all nodes\n * **/\n @autobind\n doShow(args: any)\n {\n this.viewUtilities.show(args);\n return args;\n };\n\n @autobind\n undoShow(args: any)\n {\n this.viewUtilities.hide(args);\n return args;\n };\n\n highlightElementsInitially(invalidHighlightedGenesIDs: string[], invalidGenesIDs: string[],\n highlightedGenesIDs: string[], highlightedEdgesIDs: string[], hiddenGenesIDs: string[])\n {\n for (var i in invalidHighlightedGenesIDs)\n {\n this.cy.$('#'+invalidHighlightedGenesIDs[i]).addClass('invalidGeneHighlight');\n }\n for (var i in invalidGenesIDs)\n {\n this.cy.$('#'+invalidGenesIDs[i]).addClass('invalidGene');\n }\n for (var i in highlightedGenesIDs)\n {\n this.cy.$('#'+highlightedGenesIDs[i]).addClass('highlightedNode');\n }\n for (var i in highlightedEdgesIDs)\n {\n this.cy.$('#'+highlightedEdgesIDs[i]).addClass('highlightedEdge');\n }\n for (var i in hiddenGenesIDs)\n {\n this.viewUtilities.hide(this.cy.$('#'+hiddenGenesIDs[i]))\n }\n };\n\n validateGenes()\n {\n var geneSymbols = this.getGeneSymbols();\n this.portalAccessor.validateGenes(geneSymbols, this);\n }\n\n //Get all gene symbols\n getGeneSymbols()\n {\n var geneSymbols: any[] = [];\n this.cy.nodes().forEach( function (gene: any)\n {\n if(gene.data().type === \"GENE\")\n geneSymbols.push(gene.data().name);\n });\n return geneSymbols;\n }\n\n\n highlightInvalidGenes(validGeneSymbols: any)\n {\n if (this.isCollaborative)\n {\n var invalidGenes: any[] = [];\n this.cy.nodes().forEach( function (gene: any)\n {\n if(gene.data().type === \"GENE\")\n {\n var geneName = gene.data().name;\n if(validGeneSymbols.indexOf(geneName) < 0)\n invalidGenes.push(gene.id());\n }\n });\n this.shareDBManager.changeHighlightInvalidGenes(invalidGenes, true);\n // TODO: Amendment by Ziya\n /*\n if (invalidGenes.length > 0)\n this.notificationManager.createNotification(\"Invalid genes are highlighted\",\"fail\");\n else\n this.notificationManager.createNotification(\"All gene symbols are valid\",\"success\");*/\n }\n else\n {\n var highlightedGenes = this.cy.collection();\n this.cy.nodes().forEach( function (gene: any)\n {\n if(gene.data().type === \"GENE\")\n {\n var geneName = gene.data().name;\n if(validGeneSymbols.indexOf(geneName) < 0)\n highlightedGenes = highlightedGenes.add(gene);\n }\n });\n // TODO: Amendment by Ziya\n /*\n if (highlightedGenes.size() > 0)\n this.notificationManager.createNotification(\"Invalid genes are highlighted\",\"fail\");\n else\n this.notificationManager.createNotification(\"All gene symbols are valid\",\"success\");*/\n\n var nodesToAddInvalidHighlight = this.cy.collection();\n highlightedGenes.forEach(function(ele: any){\n if (!ele.hasClass('invalidGeneHighlight') && !ele.hasClass('invalidGene'))\n nodesToAddInvalidHighlight = nodesToAddInvalidHighlight.union(ele);\n });\n this.undoRedoManager.do('highlightInvalidGenes', nodesToAddInvalidHighlight);\n }\n }\n\n removeInvalidGeneHighlights(actions: any[])\n {\n if (this.isCollaborative)\n {\n var geneIDs: any[] = [];\n this.cy.nodes().forEach( function (gene: any)\n {\n if(gene.data().type === \"GENE\")\n {\n if(gene.hasClass('invalidGeneHighlight') || gene.hasClass('invalidGene'))\n geneIDs.push(gene.id());\n }\n });\n this.shareDBManager.changeHighlightInvalidGenes(geneIDs, false);\n }\n else\n {\n var nodesToRemoveInvalidHighlight = this.cy.collection();\n this.cy.nodes().forEach(function(ele: any){\n if (ele.hasClass('invalidGeneHighlight') || ele.hasClass('invalidGene'))\n nodesToRemoveInvalidHighlight = nodesToRemoveInvalidHighlight.union(ele);\n });\n actions.push({name: \"removeHighlightInvalidGenes\", param: nodesToRemoveInvalidHighlight});\n // this.undoRedoManager.do('removeHighlightInvalidGenes', nodesToRemoveInvalidHighlight);\n }\n }\n\n doHighlightInvalidGenes(args: any)\n {\n args.each(function(n: any)\n {\n if(n.hasClass('highlightedNode'))\n {\n n.removeClass('highlightedNode');\n n.addClass(\"invalidGeneHighlight\");\n }\n else\n n.addClass(\"invalidGene\");\n });\n return args;\n };\n\n undoHighlightInvalidGenes(args: any)\n {\n args.each(function(n: any)\n {\n if(n.hasClass('invalidGeneHighlight'))\n {\n n.removeClass('invalidGeneHighlight');\n n.addClass(\"highlightedNode\");\n }\n else\n n.removeClass(\"invalidGene\");\n });\n return args;\n }\n\n highlightSelected()\n {\n var sel = this.cy.elements(\":selected\");\n sel.unselect();\n var elementsToHighlight = this.cy.collection();\n sel.forEach(function(ele: any){\n if (!ele.hasClass('invalidGeneHighlight') && !ele.hasClass('highlightedNode') && !ele.hasClass('highlightedEdge'))\n elementsToHighlight = elementsToHighlight.union(ele);\n });\n if (this.isCollaborative)\n this.shareDBManager.changeHighlight(elementsToHighlight, true);\n else\n this.undoRedoManager.do('highlightOthers', elementsToHighlight);\n };\n\n highlightNeighbors()\n {\n var sel = this.cy.elements(\":selected\");\n var neighbors = sel.neighborhood();\n neighbors = neighbors.union(sel);\n neighbors.unselect();\n var elementsToHighlight = this.cy.collection();\n neighbors.forEach(function(ele: any){\n if (!ele.hasClass('invalidGeneHighlight') && !ele.hasClass('highlightedNode') && !ele.hasClass('highlightedEdge'))\n elementsToHighlight = elementsToHighlight.union(ele);\n });\n if (this.isCollaborative)\n this.shareDBManager.changeHighlight(elementsToHighlight, true);\n else\n this.undoRedoManager.do('highlightOthers', elementsToHighlight);\n };\n\n highlightBySearch(args: any[])\n {\n if (this.isCollaborative)\n this.shareDBManager.changeHighlight(args, true);\n else\n this.undoRedoManager.do('highlightOthers', args);\n };\n\n removeOtherHighlight(actions: any[])\n {\n var nodesToRemoveHighlight = this.cy.collection();\n //TODO cytoscape selectors may provide more handy functionality instead of iterating over !\n this.cy.elements().forEach(function(ele: any){\n if (ele.hasClass('highlightedNode') || ele.hasClass('highlightedEdge') || ele.hasClass('invalidGeneHighlight'))\n nodesToRemoveHighlight = nodesToRemoveHighlight.add(ele);\n });\n\n if (this.isCollaborative)\n this.shareDBManager.changeHighlight(nodesToRemoveHighlight, false);\n else\n actions.push({name: \"removeOtherHighlight\", param: nodesToRemoveHighlight});\n // this.undoRedoManager.do('removeOtherHighlight', nodesToRemoveHighlight);\n };\n\n /*\n * Undo redo for highlighting of nodes\n * **/\n doHighlight(args: any)\n {\n args.each(function(n: any)\n {\n if (n.isEdge())\n n.addClass(\"highlightedEdge\");\n else\n {\n if(n.hasClass('invalidGene'))\n {\n n.removeClass(\"invalidGene\");\n n.addClass(\"invalidGeneHighlight\");\n }\n else\n n.addClass(\"highlightedNode\");\n }\n });\n return args;\n };\n\n undoHighlight(args: any)\n {\n args.each(function(n: any)\n {\n if (n.isEdge())\n n.removeClass(\"highlightedEdge\");\n else\n {\n if(n.hasClass('invalidGeneHighlight'))\n {\n n.removeClass(\"invalidGeneHighlight\");\n n.addClass(\"invalidGene\");\n }\n else\n n.removeClass(\"highlightedNode\");\n }\n });\n return args;\n };\n\n removeAllHighlight()\n {\n let actions: any[] = [];\n this.removeInvalidGeneHighlights(actions);\n this.removeOtherHighlight(actions);\n this.cy.undoRedo().do(\"batch\", actions);\n };\n\n postLayout()\n {\n if (this.isCollaborative)\n {\n //Previously this.cy.nodes() was sent as an argument in moveElements function but it caused a problem when\n // the compound node was moved before the child nodes\n var movedNodes = this.cy.collection();\n var parentNodes = this.cy.collection();\n this.cy.nodes().forEach(function(node: any)\n {\n if (!node.isParent())\n movedNodes = movedNodes.add(node);\n else\n parentNodes = parentNodes.add(node);\n });\n this.moveElements(movedNodes);\n this.moveElements(parentNodes);\n\n var newState = {\n zoomLevel: this.cy.zoom(),\n panLevel: this.cy.pan()\n };\n this.updateGlobalOptions(newState);\n }\n };\n\n /*\n * Gets the first empty index from the list in cloud model\n * **/\n getEmptyGroupID()\n {\n if(this.isCollaborative)\n return this.shareDBManager.getEmptyGroupID();\n else\n return this.genomicDataOverlayManager.getEmptyGroupID();\n };\n\n /*\n * Gets the first empty index from the list in cloud model\n * **/\n groupGenomicData(cancerNames: any[], groupID: string)\n {\n return this.shareDBManager.groupGenomicData(cancerNames, groupID);\n };\n\n addPubmedIDs(edge: any, pubmedIDs: number[])\n {\n if (this.isCollaborative)\n {\n this.shareDBManager.addPubmedIDs(edge.id(), pubmedIDs);\n }\n else\n {\n var pubmedArray = edge.data('pubmedIDs');\n var validPubmedIDs = _.filter(pubmedIDs, function(id: number){\n return !isNaN(id);\n });\n pubmedArray.push.apply(pubmedArray,validPubmedIDs);\n edge.data('pubmedIDs', _.uniq(pubmedArray));\n }\n }\n\n removePubmedID(edge: any, pubmedIDs: number[])\n {\n if (this.isCollaborative)\n {\n this.shareDBManager.removePubmedID(edge.id(), pubmedIDs);\n }\n else\n {\n var pubmedArray = edge.data('pubmedIDs');\n edge.data('pubmedIDs', _.difference(pubmedArray, pubmedIDs));\n }\n }\n\n updateEdgeAnchorPoints(edge: any)\n {\n if (this.isCollaborative)\n {\n var edgeCurveStyle = edge.css('curve-style')\n var numberOfAnchorPoints = 0;\n var anchors = this.edgeEditing.getAnchorsAsArray(edge);\n if (anchors !== undefined)\n numberOfAnchorPoints = anchors.length / 2;\n var anchorPointsArray = [];\n for (var j = 0; j < numberOfAnchorPoints; j++)\n {\n anchorPointsArray.push(\n {\n x: anchors[2*j],\n y: anchors[2*j+1]\n }\n );\n } \n this.shareDBManager.updateEdgeAnchorPoints(edge.id(), anchorPointsArray, edgeCurveStyle);\n }\n }\n\n //Related to order the nodes according to the selection of user\n pushSelectedNodeStack(ele: any)\n {\n this.selectedNodeStack[ele.id()] = ele;\n }\n\n removeElementFromSelectedNodeStack(ele: any)\n {\n var nodeID = ele.id();\n if (nodeID in this.selectedNodeStack)\n delete this.selectedNodeStack[ele.id()];\n }\n\n clearSelectedNodeStack()\n {\n this.selectedNodeStack = {};\n }\n\n exportSVG()\n {\n return this.svgExporter.exportGraph(this.cy.nodes(), this.cy.edges());\n }\n\n //Simple observer-observable pattern for views!!!!!\n registerObserver(observer: any)\n {\n this.observers.push(observer);\n };\n\n notifyObservers()\n {\n for (var i in this.observers)\n {\n var observer = this.observers[i];\n observer.notify();\n }\n };\n\n registerGenomicDataObserver(observer: any)\n {\n this.genomicDataOverlayManager.registerObserver(observer);\n }\n\n updateGenomicDataVisibility(dataMap: any)\n {\n if(this.isCollaborative)\n {\n //TODO compound OP\n // this.shareDBManager.clearGenomicVisData();\n this.shareDBManager.addGenomicVisibilityData(dataMap);\n }\n else\n {\n for (var _key in dataMap)\n {\n this.genomicDataOverlayManager.updateGenomicDataVisibility(_key, dataMap[_key]);\n }\n this.genomicDataOverlayManager.showGenomicData();\n }\n }\n\n updateGenomicDataColorScheme(colorValueMap: IColorValueMap)\n {\n this.setGenomicDataOverlayColorScheme(colorValueMap);\n \n if(this.isCollaborative)\n {\n this.shareDBManager.updateGenomicDataOverlayColorScheme(colorValueMap);\n }\n else\n {\n this.genomicDataOverlayManager.updateColorScheme(colorValueMap);\n this.genomicDataOverlayManager.showGenomicData();\n }\n }\n\n //Global options related functions, zoom etc..\n getGlobalOptions()\n {\n return {\n zoomLevel: this.cy.zoom(),\n panLevel: this.cy.pan()\n };\n }\n\n changeGlobalOptions(op: any)\n {\n var globalOptions = op.li;\n this.cy.zoom(globalOptions.zoomLevel);\n this.cy.pan(globalOptions.panLevel);\n }\n\n updateGlobalOptions(newOptions: any)\n {\n if(this.isCollaborative)\n this.shareDBManager.updateGlobalOptions(newOptions);\n }\n\n //Layout properties related functions\n saveLayoutProperties(newLayoutProps: any)\n {\n if(this.isCollaborative)\n {\n // Call a real time function that updated real time object and\n // its callback (updateLayoutPropertiesCallback) will handle sync of this object\n // across collaborators\n this.shareDBManager.updateLayoutProperties(newLayoutProps);\n }\n else\n {\n this.layoutProperties = _.clone(newLayoutProps);\n }\n };\n\n updateLayoutPropertiesCallback(op: any)\n {\n var newLayoutProps = op.li;\n this.layoutProperties = _.clone(newLayoutProps);\n LayoutProperties.layoutProperties = _.clone(this.layoutProperties);\n //Notify observers to reflect changes on colalborative object to the views\n this.notifyObservers();\n };\n\n performLayout()\n {\n this.undoRedoManager.do(\"layout\", {options: this.layoutProperties, eles: null, zoom: this.cy.zoom(), pan: this.cy.pan()});\n };\n\n //Node Related Functions\n addNode(nodeData: any, posData: any)\n {\n if (this.isCollaborative)\n {\n this.addNewNodeToShareDB(nodeData, posData);\n }\n else\n {\n this.addNodetoCy(nodeData,posData);\n }\n };\n\n addNodes(nodes: any[])\n {\n for (var i in nodes)\n {\n this.addNode(nodes[i].data, nodes[i].position);\n }\n };\n\n addNodesCy(nodes: any[])\n {\n var nodeArr: any[] = [];\n for (var i in nodes)\n {\n var nodeData = nodes[i].data;\n var posData = nodes[i].position;\n\n var newNode =\n {\n group: \"nodes\",\n data: nodeData,\n position: {}\n };\n\n if (nodeData.parent === undefined )\n {\n delete newNode.data.parent;\n }\n\n if (posData)\n {\n newNode.position =\n {\n x: posData.x,\n y: posData.y\n }\n }\n nodeArr[i] = newNode;\n }\n\n this.cy.add(nodeArr);\n this.cy.nodes().updateCompoundBounds();\n\n };\n\n addNodetoCy(nodeData: any, posData: any)\n {\n var newNode =\n {\n group: \"nodes\",\n data: nodeData,\n position: {}\n };\n\n if (nodeData.parent === undefined )\n {\n delete newNode.data.parent;\n }\n\n if (posData)\n {\n newNode.position =\n {\n x: posData.x,\n y: posData.y\n }\n }\n\n //his.cy.add(newNode);\n this.cy.nodes().updateCompoundBounds();\n this.undoRedoManager.do(\"add\", newNode);\n //Width was not properly updated only by changing data property\n var thatEle = this.cy.getElementById(nodeData.id);\n thatEle.style('width', thatEle.data('w'));\n };\n\n shareDBNodeAddRemoveEventCallBack(op: any)\n {\n //Get real time node object and sync it to node addition or removal\n var isRemove = Object.keys(op)[1] === 'od';\n var node = op.oi || op.od;\n //Removal Operation\n if (isRemove)\n {\n var nodeID = op.p[1];\n //Remove element from existing graph\n var cyEle = this.cy.$(\"#\" + nodeID);\n this.removeElementCy(cyEle);\n this.cy.nodes().updateCompoundBounds();\n }\n //Addition Operation\n else\n {\n this.addNewNodeLocally(node);\n }\n };\n\n addNewNodeLocally(realtimeNode: any)\n {\n var nodeData =\n {\n id: realtimeNode.id,\n type: realtimeNode.type,\n name: realtimeNode.name,\n parent: realtimeNode.parent,\n w: realtimeNode.w,\n h: realtimeNode.h\n };\n\n if (realtimeNode.x != \"undefined\" && realtimeNode.y != \"undefined\")\n {\n this.addNodetoCy(nodeData, {x: realtimeNode.x, y: realtimeNode.y});\n }\n else\n {\n // TODO: Amendment by Ziya\n this.addNodetoCy(nodeData, null);\n }\n\n this.cy.nodes().updateCompoundBounds();\n };\n\n addNewNodeToShareDB(nodeData: any, posData: any)\n {\n this.shareDBManager.addNewNode(nodeData,posData);\n };\n\n //Edge related functions\n addEdge(edgeData: any)\n {\n if (this.isCollaborative)\n {\n this.addNewEdgeShareDB(edgeData);\n }\n else\n {\n this.addNewEdgetoCy(edgeData);\n }\n };\n\n addEdges(edges: any[])\n {\n for (var i in edges)\n {\n this.addEdge(edges[i].data);\n }\n };\n\n addEdgesCy(edges: any[])\n {\n const newEdges = [];\n\n\n for (var i in edges)\n {\n const newEdge =\n {\n group: \"edges\",\n data: edges[i].data\n };\n newEdges.push(newEdge);\n }\n this.cy.add(newEdges);\n };\n\n addNewEdgeShareDB(edgeData: any)\n {\n this.shareDBManager.addNewEdge(edgeData);\n };\n\n addNewEdgetoCy(edgeData: any)\n {\n var newEdge =\n {\n group: \"edges\",\n data: edgeData\n };\n this.undoRedoManager.do(\"add\", newEdge);\n };\n\n shareDBEdgeAddRemoveEventCallBack(op: any)\n {\n\n //Get real time node object and sync it to node addition or removal\n var isRemove = Object.keys(op)[1] === 'od';\n var edge = op.oi || op.od;\n\n //Removal Operation\n if (isRemove)\n {\n var edgeID = op.p[1];\n //Remove element from existing graph\n var cyEle = this.cy.$(\"#\" + edgeID);\n this.removeElementCy(cyEle);\n }\n //Addition Operation\n else\n {\n this.addNewEdgeLocally(edge);\n }\n };\n\n addNewElementsLocally(realTimeNodeArray: any[], realTimeEdgeArray: any[])\n {\n const nodeList: any[] = [];\n const nodeMap: any = {};\n\n for (var i in realTimeNodeArray)\n {\n var realTimeNode = realTimeNodeArray[i];\n\n var nodeID = realTimeNode.id;\n\n //Added for backward compatibility when width was not defined\n var nodeWidth = (realTimeNode.w == undefined) ? 150 : realTimeNode.w ;\n var nodeHeight = (realTimeNode.h == undefined) ? 52 : realTimeNode.h ;\n var compoundMinWidth = (realTimeNode.minWidth == undefined) ? 0 : realTimeNode.minWidth ;\n var compoundMinWidthBiasLeft = (realTimeNode.minWidthBiasLeft == undefined) ? 0 : realTimeNode.minWidthBiasLeft ;\n var compoundMinWidthBiasRight = (realTimeNode.minWidthBiasRight == undefined) ? 0 : realTimeNode.minWidthBiasRight ;\n var compoundMinHeight = (realTimeNode.minHeight == undefined) ? 0 : realTimeNode.minHeight ;\n var compoundMinHeightBiasTop = (realTimeNode.minHeightBiasTop == undefined) ? 0 : realTimeNode.minHeightBiasTop ;\n var compoundMinHeightBiasBottom = (realTimeNode.minHeightBiasBottom == undefined) ? 0 : realTimeNode.minHeightBiasBottom;\n\n const nodeData =\n {\n group: 'nodes',\n // TODO: Amendment by Ziya\n position: {},\n data:\n {\n id: nodeID,\n type: realTimeNode.type,\n name: realTimeNode.name,\n parent: realTimeNode.parent,\n w: nodeWidth,\n h: nodeHeight\n },\n style:\n {\n 'min-width': compoundMinWidth,\n 'min-width-bias-left': compoundMinWidthBiasLeft,\n 'min-width-bias-right': compoundMinWidthBiasRight,\n 'min-height': compoundMinHeight,\n 'min-height-bias-top': compoundMinHeightBiasTop,\n 'min-height-bias-bottom': compoundMinHeightBiasBottom\n }\n };\n\n if (nodeData.data.parent === undefined )\n {\n delete nodeData.data.parent;\n }\n\n if (realTimeNode.x && realTimeNode.y)\n {\n nodeData.position =\n {\n x: realTimeNode.x,\n y: realTimeNode.y\n }\n }\n\n nodeMap[nodeID] = nodeData;\n nodeList.push(nodeData);\n }\n\n var edgeList = [];\n for (var i in realTimeEdgeArray)\n {\n var edge = realTimeEdgeArray[i];\n var edgeID = edge.id;\n\n //If source and and target is somehow lost in remote model do not create this edge\n if(!(edge.source in nodeMap && edge.target in nodeMap))\n continue\n\n var tmpData = {\n id: edgeID,\n type: edge.type,\n source: edge.source,\n target: edge.target,\n pubmedIDs: edge.pubmedIDs,\n name: edge.name,\n }\n\n if (edge.edgeCurveStyle == \"unbundled-bezier\") {\n tmpData['controlPointPositions'] = edge.anchorPoints;\n }\n else {\n tmpData['bendPointPositions'] = edge.anchorPoints;\n }\n\n var edgeData =\n {\n group: 'edges',\n data: tmpData\n };\n\n edgeList.push(edgeData);\n }\n\n this.cy.add(nodeList);\n this.cy.add(edgeList);\n\n this.edgeEditing.initAnchorPoints(this.cy.edges());\n\n this.cy.nodes().updateCompoundBounds();\n }\n\n addNewEdgeLocally(edge: any)\n {\n var edgeData ={\n id: edge.id,\n type: edge.type,\n source: edge.source,\n target: edge.target,\n pubmedIDs: edge.pubmedIDs,\n name: edge.name\n };\n if (edge.edgeCurveStyle == \"unbundled-bezier\") {\n edgeData['controlPointPositions'] = edge.anchorPoints;\n }\n else {\n edgeData['bendPointPositions'] = edge.anchorPoints;\n }\n this.addNewEdgetoCy(edgeData);\n this.edgeEditing.initAnchorPoints(this.cy.getElementById( edge.id ));\n };\n\n reconnectEdge(sourceID: string, targetID: string, edgeData: any) {\n\n if(this.isCollaborative){\n var edge = this.cy.getElementById(edgeData.id);\n this.reconnectEdgeInShareDB(sourceID, targetID, edgeData);\n }\n else{\n var location = {\n source: sourceID,\n target: targetID\n };\n\n var edge = this.cy.getElementById(edgeData.id);\n edge.move(location);\n }\n\n return this.cy.getElementById(edgeData.id);\n };\n\n reconnectEdgeInShareDB(sourceID: string, targetID: string, edgeData: any) {\n this.shareDBManager.reconnectEdge(sourceID, targetID, edgeData);\n };\n\n //Removal functions\n removeElement(ele: any)\n {\n if (this.isCollaborative)\n {\n this.removeElementsFromShareDB(ele);\n }\n else\n {\n this.removeElementsCy(ele);\n }\n };\n\n removeElementCy(ele: any)\n {\n this.undoRedoManager.do(\"remove\", ele);\n };\n\n removeElementsCy(ele: any)\n {\n this.undoRedoManager.do(\"remove\", ele);\n };\n\n removeElementsFromShareDB(eles: any[])\n {\n var self = this;\n eles.forEach(function (ele)\n {\n self.shareDBManager.removeElement(ele.id());\n });\n };\n\n removeElementFromShareDB(ele: any)\n {\n this.shareDBManager.removeElement(ele.id());\n };\n\n changeParents(eles: any[], newParentId: string)\n {\n if(this.isCollaborative)\n {\n this.changeParentShareDB(eles, newParentId);\n }\n else\n {\n var parentData = newParentId ? newParentId : null;\n\n // Old manual way to change parents in local mode\n //this.changeParentCy(eles, newParentId);\n\n //Save element's previous width & height in dim array\n const dim : any[]= [];\n const id : any[]= [];\n eles.forEach(function (ele: any)\n {\n var parameters =\n {\n id: ele.id(),\n width: ele.data(\"w\"),\n height: ele.data(\"h\")\n };\n dim.push(parameters);\n id.push(ele.id());\n });\n\n const parentElem = this.cy.getElementById(parentData);\n var param = {\n firstTime: true,\n parentData: parentData, // It keeps the newParentId (Just an id for each nodes for the first time)\n nodes: eles,\n posDiffX: (!parentData) ? 0 : parentElem.position('x') - eles[0].position('x'),\n posDiffY: (!parentData) ? 0 : parentElem.position('y') - eles[0].position('y')\n };\n this.undoRedoManager.do('changeParent', param);\n\n //The elements after change parent operation are different so we find them by using the saved ids\n // and add them to the collection\n var collection = this.cy.collection();\n for (var i in id)\n {\n var elementById = this.cy.getElementById(id[i]);\n collection = collection.add(elementById);\n }\n //Set their previous size to the new elements in the collection\n collection.forEach(function (ele: any, i: number)\n {\n if (ele.id() == dim[i].id)\n ele.data(\"w\", dim[i].width);\n ele.data(\"h\", dim[i].height);\n });\n }\n };\n\n changeParentShareDB (eles: any, newParentId: string)\n {\n\n var classRef = this;\n function getTopLevelParents(eles: any[])\n {\n var tpMostNodes = classRef.cy.collection();\n const parentMap : any = {};\n\n //Get all parents\n eles.forEach(function (node)\n {\n if(node.isParent())\n parentMap[node.id()] = node;\n });\n\n //Get all parents\n eles.forEach(function (node)\n {\n var nodeParent = node.parent();\n\n if(parentMap[nodeParent.id()] === undefined)\n tpMostNodes = tpMostNodes.union(node);\n });\n\n return tpMostNodes;\n }\n\n\n class NodeObj{\n public nodeRef: any;\n public children: any;\n constructor(nodeObj: any){\n this.nodeRef = nodeObj;\n this.children = [];\n }\n }\n var connectedEdges = eles.connectedEdges();\n // Traverses given elements and constructs subgraph relations\n // creates a nested structure into rootnodeObj\n function traverseNodes(eles: any[], rootNodeObj: any)\n {\n eles.forEach(function (ele)\n {\n connectedEdges = connectedEdges.union(ele.connectedEdges());\n\n if(ele.isParent())\n {\n rootNodeObj.children.push(new NodeObj(ele));\n var lengthOfChildrenArray = rootNodeObj.children.length;\n traverseNodes(ele.children(), rootNodeObj.children[lengthOfChildrenArray-1]);\n }\n else\n {\n rootNodeObj.children.push(new NodeObj(ele));\n }\n });\n }\n\n //Create new collection\n var topMostNodes = getTopLevelParents(eles);\n\n var rootNodeR = new NodeObj(null);\n\n traverseNodes(topMostNodes, rootNodeR);\n this.shareDBManager.changeParent(rootNodeR, newParentId, connectedEdges);\n };\n\n changeParentCy(eles: any[], newParentId: string)\n {\n let lockedNodes: any = {};\n const self = this;\n\n function removeNodes(nodes: any)\n {\n //Get removed edges first\n let removedEles = nodes.connectedEdges().remove();\n const children = nodes.children();\n\n if (children != null && children.length > 0)\n {\n children.forEach(function(childNode: any)\n {\n lockedNodes[childNode.id()] = true;\n });\n\n removedEles = removedEles.union(removeNodes(children));\n }\n\n removedEles = removedEles.union(nodes.remove());\n self.cy.nodes().updateCompoundBounds();\n return removedEles;\n }\n\n\n var removedEles = removeNodes(eles);\n this.undoRedoManager.do(\"remove\", removedEles);\n\n for (var i = 0; i < removedEles.length; i++)\n {\n var removedNode = removedEles[i];\n\n //Just alter the parent id of corresponding nodes !\n if (removedNode.isEdge() || lockedNodes[removedNode.id()])\n {\n continue;\n }\n\n removedNode._private.data.parent = newParentId;\n if(removedNode._private.parent){\n delete removedNode._private.parent;\n }\n }\n\n self.cy.add(removedEles);\n this.undoRedoManager.do(\"add\", removedEles);\n self.cy.nodes().updateCompoundBounds();\n };\n\n moveElements(eles: any[])\n {\n var classRef = this;\n //Sync movement to real time api\n if(this.isCollaborative)\n {\n eles.forEach(function (ele: any)\n {\n classRef.shareDBManager.moveElement(ele);\n });\n }\n };\n\n resizeElements(ele: any)\n {\n if(this.isCollaborative) {\n if (!ele.isParent()) {\n var previousWidth = ele.width();\n var previousHeight = ele.height();\n //Sync movement to real time api\n this.shareDBManager.resizeElement(ele, previousWidth, previousHeight);\n }\n else {\n var minWidth = ele.style('min-width');\n var minWidthBiasLeft = ele.style('min-width-bias-left');\n var minWidthBiasRight = ele.style('min-width-bias-right');\n var minHeight = ele.style('min-height');\n var minHeightBiasTop = ele.style('min-height-bias-top');\n var minHeightBiasBottom = ele.style('min-height-bias-bottom');\n\n //Sync movement to real time api\n this.shareDBManager.resizeCompound(ele, minWidth, minWidthBiasLeft, minWidthBiasRight, minHeight, minHeightBiasTop, minHeightBiasBottom);\n }\n }\n };\n\n mergeGraph(nodes: any[], edges: any[])\n {\n if (this.isCollaborative)\n {\n //Collaborative usage\n this.shareDBManager.mergeGraph(nodes,edges);\n }\n else\n {\n //Local usage file load\n this.mergeGraphCy(nodes,edges);\n }\n this.fitGraph();\n };\n\n mergeGraphCy(nodes: any[], edges: any[])\n {\n //Define arrays and maps\n const nodesToBeAdded = [];\n const edgesToBeAdded = [];\n const nodeMap : any= {};\n\n //Iterate over nodes and find nodes that does not exist in current graph by looking their name\n for (var index in nodes)\n {\n var ele = nodes[index];\n nodeMap[ele.data.id] = ele;\n\n if (this.cy.filter('node[name = \"'+ele.data.name+'\"]').length <= 0)\n {\n nodesToBeAdded.push(ele);\n }\n }\n\n this.cy.add(nodesToBeAdded);\n\n //Iterate over all edges\n for (var index in edges)\n {\n //Get corresponding source and target node in merge file\n var ele = edges[index];\n var sourceNode = nodeMap[ele.data.source];\n var targetNode = nodeMap[ele.data.target];\n\n //Check if there are nodes with same name in current graph\n var cySourceNode = this.cy.nodes('[name=\"'+sourceNode.data.name+'\"]');\n var targetNode = this.cy.nodes('[name=\"'+targetNode.data.name+'\"]');\n\n if (cySourceNode.length > 0)\n {\n ele.data.source = cySourceNode.id();\n }\n\n if (targetNode.length > 0)\n {\n ele.data.target = targetNode.id();\n }\n\n if (targetNode.length < 0 && cySourceNode.length < 0 ) {\n continue;\n }\n\n var edgesBtw = this.cy.filter('edge[source = \"'+cySourceNode.id()+'\"][target = \"'+targetNode.id()+'\"]');\n\n //We assume there could be one edge between source and target node with same type\n var isFound = false;\n edgesBtw.forEach(function(edge: any)\n {\n if (edge.data().type == ele.data.type)\n {\n isFound = true;\n return false;\n }\n //TODO: AMENDMENT by Ziya\n return true;\n });\n\n if (!isFound)\n {\n delete ele.data.id;\n edgesToBeAdded.push(ele);\n }\n }\n\n this.cy.add(edgesToBeAdded);\n };\n\n fitGraph()\n {\n if(this.isCollaborative)\n {\n this.cy.fit(this.FIT_CONSTANT);\n var newState =\n {\n zoomLevel: this.cy.zoom(),\n panLevel: this.cy.pan()\n };\n this.updateGlobalOptions(newState);\n }\n else\n {\n this.cy.fit(this.FIT_CONSTANT);\n }\n }\n\n loadFile(nodes: any[], edges: any[])\n {\n if (this.isCollaborative)\n {\n //Real time load graph\n this.loadfileShareDB(nodes, edges);\n }\n else\n {\n //Local usage file load\n this.loadFileCy(nodes,edges);\n }\n \n this.edgeEditing.initAnchorPoints(this.cy.edges());\n \n this.fitGraph();\n };\n\n loadFileCy(nodes: any[], edges: any[])\n {\n //Remove all elements\n this.removeElementCy(this.cy.elements());\n\n this.addNodesCy(nodes);\n this.addEdgesCy(edges);\n };\n\n loadfileShareDB(nodes: any[], edges: any[])\n {\n this.shareDBManager.loadGraph(nodes,edges);\n };\n\n removeAllElements()\n {\n if (this.isCollaborative)\n {\n this.shareDBManager.removeAllElements();\n }\n else\n {\n this.cy.remove(this.cy.elements());\n }\n };\n\n updateHighlight(ele: any, isHighlighted: boolean)\n {\n if (isHighlighted)\n this.undoRedoManager.do('highlightOthers', ele);\n else\n this.undoRedoManager.do('removeOtherHighlight', ele);\n };\n\n\n @autobind\n updateVisibility(ele: any, isHidden: boolean)\n {\n if (isHidden)\n this.viewUtilities.hide(ele);\n else\n this.viewUtilities.show(ele);\n };\n\n updateElementCallback(op: any)\n {\n var ele = op.oi;\n var eleID = ele.id;\n var cyEle = this.cy.$(\"#\" + eleID);\n this.changeNameCy(cyEle, ele.name);\n\n if (cyEle.isNode())\n {\n //Width and height of simple nodes and compounds is changed differently\n if (cyEle.isParent())\n {\n cyEle.style(\"min-width\", ele.minWidth);\n cyEle.style(\"min-width-bias-left\", ele.minWidthBiasLeft);\n cyEle.style(\"min-width-bias-right\", ele.minWidthBiasRight);\n cyEle.style(\"min-height\", ele.minHeight);\n cyEle.style(\"min-height-bias-top\", ele.minHeightBiasTop);\n cyEle.style(\"min-height-bias-bottom\", ele.minHeightBiasBottom);\n }\n else\n {\n cyEle.data('w', ele.w);\n cyEle.data('h', ele.h);\n //Position is changed only for simple nodes because the\n //position of compounds is defined by simple nodes' position\n cyEle.position({x: ele.x, y: ele.y});\n }\n\n this.updateVisibility(cyEle, ele.isHidden);\n this.updateHighlight(cyEle, ele.isHighlighted);\n\n if(ele.isInvalidGene)\n {\n this.doHighlightInvalidGenes(cyEle);\n }\n else\n {\n this.undoHighlightInvalidGenes(cyEle);\n }\n }\n else if(cyEle.isEdge())\n {\n var pubmedArray = ele.pubmedIDs;\n cyEle.data('pubmedIDs', pubmedArray);\n this.updateHighlight(cyEle, ele.isHighlighted);\n\n var anchorPoints = ele.anchorPoints;\n\n //If edge is reconnected\n if ( ele.source !== cyEle.source().id() || ele.target !== cyEle.target().id()){\n var location = {\n source: ele.source,\n target: ele.target\n };\n cyEle.move(location);\n //make sure that bend points are same\n this.edgeEditing.initAnchorPoints(cyEle);\n }\n else {\n if (ele.edgeCurveStyle === \"bezier\") {\n const anchors = this.edgeEditing.getAnchorsAsArray(cyEle);\n if (anchors && anchors.length > 0) {\n for (let i = 0; i < anchors.length / 2; i++) {\n this.edgeEditing.deleteSelectedAnchor(cyEle, 0);\n }\n }\n }\n else if (ele.edgeCurveStyle === \"unbundled-bezier\") {\n cyEle.data('controlPointPositions', anchorPoints);\n }\n else {\n cyEle.data('bendPointPositions', anchorPoints);\n }\n \n this.edgeEditing.initAnchorPoints(cyEle);\n }\n }\n };\n\n getGenomicDataSVG(node: any)\n {\n // @ts-ignore\n return this.genomicDataOverlayManager.generateSVGForNode(node);\n }\n\n getOncoprintDataSVG(node: any) \n {\n return this.genomicDataOverlayManager.generateOncoprintForPatientNode(node);\n }\n\n removeGenomicData()\n {\n if(this.isCollaborative)\n {\n this.shareDBManager.clearGenomicData();\n }\n else\n {\n // TODO wrap this in afunction in genomic data overlay manager\n this.genomicDataOverlayManager.clearAllGenomicData();\n this.genomicDataOverlayManager.hideGenomicData();\n this.genomicDataOverlayManager.notifyObservers();\n }\n\n }\n\n addGenomicData(genomicData: any)\n {\n const groupID = this.getEmptyGroupID();\n\n if(this.isCollaborative)\n {\n var parsedGenomicData = this.genomicDataOverlayManager.prepareGenomicDataShareDB(genomicData);\n this.shareDBManager.addGenomicData(parsedGenomicData.genomicDataMap);\n this.shareDBManager.groupGenomicData(Object.keys(parsedGenomicData.visibilityMap),\n groupID);\n this.shareDBManager.addGenomicVisibilityData(parsedGenomicData.visibilityMap);\n }\n else\n {\n this.genomicDataOverlayManager.addGenomicDataLocally(genomicData, groupID);\n }\n }\n\n adjustVisibilityShareDB(profileId: string, isEnabled: boolean){\n const targetProfileIndex = this.profiles.map(profile => profile.profileId).indexOf(profileId);\n this.setProfile(targetProfileIndex, {\n ...this.profiles[targetProfileIndex],\n enabled: isEnabled\n }); \n }\n\n addToProfiles(profileId: string){\n // Check if this profile already exists\n if(this.profiles.map(profile => profile.profileId).includes(profileId)){\n return;\n }\n\n this.addProfile({\n profileId: profileId, \n enabled: true\n });\n }\n\n addPortalGenomicData(genomicData: any, groupID: any)\n {\n \n if(this.isCollaborative)\n {\n var parsedGenomicData = this.genomicDataOverlayManager.preparePortalGenomicDataShareDB(genomicData);\n this.shareDBManager.addGenomicData(parsedGenomicData.genomicDataMap);\n this.shareDBManager.groupGenomicData(Object.keys(parsedGenomicData.visibilityMap),\n groupID);\n this.shareDBManager.addGenomicVisibilityData(parsedGenomicData.visibilityMap);\n }\n else\n {\n this.genomicDataOverlayManager.addPortalGenomicData(genomicData, groupID);\n }\n }\n\n shareDBGenomicDataHandler(op: any)\n {\n var isRemove = Object.keys(op)[1] === 'od';\n var newData = op.oi;\n var geneSymbol = op.p[1];\n\n\n if(!isRemove)\n {\n this.genomicDataOverlayManager.addGenomicDataWithGeneSymbol(geneSymbol, newData);\n\n }\n // Removal\n else\n {\n this.genomicDataOverlayManager.removeGenomicDataWithGeneSymbol(geneSymbol);\n }\n }\n\n\n shareDBGenomicDataGroupChangeHandler(op: any)\n {\n\n var isRemove = Object.keys(op)[1] === 'od';\n var data = op.oi;\n var key = op.p[1];\n\n // Addition\n if(!isRemove)\n {\n this.genomicDataOverlayManager.addGenomicGroupData(key, data);\n if(data.length !== 1){\n console.log(\"Grouped genomic data expected to be of length 1\");\n }\n data.forEach((profileId: any) => {this.addToProfiles(profileId)});\n }\n // //Removal\n // else\n // {\n //\n // }\n this.genomicDataOverlayManager.showGenomicData();\n this.genomicDataOverlayManager.notifyObservers();\n }\n\n shareDBGenomicDataVisibilityHandler(op: any)\n {\n var data = op.oi;\n var key = op.p[1];\n var isRemove = Object.keys(op)[1] === 'od';\n // Addition\n if(!isRemove)\n {\n this.genomicDataOverlayManager.addGenomicVisData(key, data);\n\n this.adjustVisibilityShareDB(key, data);\n }\n // Removal\n else\n {\n this.genomicDataOverlayManager.removeGenomicVisData();\n this.removeProfiles();\n }\n\n this.genomicDataOverlayManager.showGenomicData();\n this.genomicDataOverlayManager.notifyObservers();\n }\n\n updateGenomicDataColorSchemeHandler(op: any)\n {\n let colorScheme = op.li;\n \n this.setGenomicDataOverlayColorScheme(colorScheme);\n\n this.colorSchemeChangeCallback(colorScheme);\n \n this.genomicDataOverlayManager.updateColorScheme(colorScheme);\n this.genomicDataOverlayManager.showGenomicData();\n this.genomicDataOverlayManager.notifyObservers();\n }\n\n resizeNodesToContent(nodes: any[])\n {\n if(this.isCollaborative)\n {\n const visibleNumberOfData = this.genomicDataOverlayManager.countVisibleGenomicDataByType();\n const labelWithData = 148 + (visibleNumberOfData-3) * 36;\n const rt = this.shareDBManager;\n nodes.forEach(function( ele ){\n if (!ele.isParent())\n {\n var newWidth = 150;\n var newHeight = 52;\n if (ele.data('name') != \"\")\n {\n var labelLength = ele.style('label').length*10 + 6;\n newWidth = labelLength;\n newHeight = 24;\n }\n if (ele.data('type') !== \"PROCESS\" && visibleNumberOfData > 0)\n {\n newHeight = 52;\n if (visibleNumberOfData < 4)\n {\n if (150 > newWidth)\n newWidth = 150;\n }\n else\n {\n if (labelWithData > newWidth)\n newWidth = labelWithData;\n }\n }\n rt.setSizeOfElement(ele, newWidth, newHeight);\n }\n else\n {\n //Set the minWidth, minHeight and other properties of compound to 0\n rt.resizeCompound(ele, 0, 0, 0, 0, 0, 0);\n }\n });\n }\n else\n {\n const ur = this.cy.undoRedo();\n const actions: any[] = [];\n\n const visibleNumberOfData = this.genomicDataOverlayManager.countVisibleGenomicDataByType();\n const labelWithData = 150 + (visibleNumberOfData-3) * 36;\n nodes.forEach(function( ele: any){\n if (!ele.isParent())\n {\n let newWidth = 150;\n let newHeight = 52;\n if (ele.data('name') != \"\") {\n var labelLength = ele.style('label').length * 6 + 24;\n newWidth = labelLength;\n newHeight = 24;\n }\n if (ele.data('type') !== \"PROCESS\" && \n visibleNumberOfData > 0) {\n \n newHeight = 52;\n if (visibleNumberOfData < 4) {\n if (150 > newWidth)\n newWidth = 150;\n }\n else {\n if (labelWithData > newWidth)\n newWidth = labelWithData;\n }\n }\n const args = {\n ele: ele,\n oldWidth: ele.width(),\n newWidth: newWidth,\n oldHeight: ele.height(),\n newHeight: newHeight\n };\n actions.push({name: \"changeNodeSize\", param: args});\n }\n else\n {\n const args = {\n ele: ele,\n oldMinWidth: ele.style(\"min-width\"),\n newMinWidth: 0,\n oldMinWidthBiasLeft: ele.style(\"min-width-bias-left\"),\n newMinWidthBiasLeft: 0,\n oldMinWidthBiasRight: ele.style(\"min-width-bias-right\"),\n newMinWidthBiasRight: 0,\n oldMinHeight: ele.style(\"min-height\"),\n newMinHeight: 0,\n oldMinHeightBiasTop: ele.style(\"min-height-bias-top\"),\n newMinHeightBiasTop: 0,\n oldMinHeightBiasBottom: ele.style(\"min-height-bias-bottom\"),\n newMinHeightBiasBottom: 0\n };\n actions.push({name: \"changeCompoundSize\", param: args});\n }\n });\n\n ur.do(\"batch\", actions);\n }\n this.cy.nodeEditing('get').refreshGrapples();\n };\n\n\n\n}\n","import _ from \"lodash\";\nimport { action, makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React from \"react\";\nimport {\n Button,\n Checkbox,\n Col,\n ControlLabel,\n Form,\n FormControl,\n InputGroup,\n Modal\n} from \"react-bootstrap\";\nimport EditorActionsManager from \"../managers/EditorActionsManager\";\nimport { EModalType } from \"../ui/react-pathway-mapper\";\nimport PathwayActions from \"../utils/PathwayActions\";\n\ninterface ILayoutPropertiesProps {\n show: boolean;\n handleClose: (modelId: EModalType) => void;\n pathwayActions: PathwayActions;\n}\n\nexport interface ILayoutProperties {\n name: string;\n animationDuration: number;\n animationEasing: string;\n nodeRepulsion: number;\n idealEdgeLength: number;\n edgeElasticity: number;\n nestingFactor: number;\n gravity: number;\n numIter: number;\n gravityRangeCompound: number;\n gravityCompound: number;\n gravityRange: number;\n tilingPaddingVertical: number;\n tilingPaddingHorizontal: number;\n initialEnergyOnIncremental: number;\n tile: boolean;\n animate: boolean;\n randomize: boolean;\n}\n\n@observer\nexport default class LayoutProperties extends React.Component<\n ILayoutPropertiesProps\n> {\n static layoutProperties: ILayoutProperties;\n\n @observable\n internalLayoutProperties: ILayoutProperties;\n\n constructor(props: ILayoutPropertiesProps) {\n super(props);\n makeObservable(this);\n this.internalLayoutProperties = _.clone(\n EditorActionsManager.defaultLayoutProperties\n );\n LayoutProperties.layoutProperties = _.clone(EditorActionsManager.defaultLayoutProperties);\n }\n\n @action.bound\n updateInternalLayoutProperty(property: string, val: boolean | number) {\n this.internalLayoutProperties[property] = val;\n }\n\n render() {\n\n return (\n {\n this.internalLayoutProperties = _.clone(LayoutProperties.layoutProperties);\n }}\n onHide={() => {\n this.internalLayoutProperties = _.clone(LayoutProperties.layoutProperties);\n this.props.handleClose(EModalType.LAYOUT);\n }}\n >\n \n \n Layout Properties\n \n \n \n
\n \n \n Node Repulsion:\n \n\n \n {\n this.updateInternalLayoutProperty(\"nodeRepulsion\", Number(e.target.value));\n }}\n />\n \n \n \n \n Ideal Edge Length:\n \n\n \n {\n this.updateInternalLayoutProperty(\"idealEdgeLength\", Number(e.target.value));\n }}\n />\n \n \n \n \n Edge Elasticity:\n \n\n \n {\n this.updateInternalLayoutProperty(\"edgeElasticity\", Number(e.target.value));\n }}\n />\n \n \n \n \n Nesting Factor:\n \n\n \n {\n this.updateInternalLayoutProperty(\"nestingFactor\", Number(e.target.value));\n }}\n />\n \n \n \n \n Gravity:\n \n\n \n {\n this.updateInternalLayoutProperty(\"gravity\", Number(e.target.value));\n }}\n />\n \n \n \n \n Gravity Range:\n \n\n \n {\n this.updateInternalLayoutProperty(\"gravityRange\", Number(e.target.value));\n }}\n />\n \n \n \n \n Compound Gravity:\n \n\n \n {\n this.updateInternalLayoutProperty(\"gravityCompound\", Number(e.target.value));\n }}\n />\n \n \n \n \n Compound Gravity Range:\n \n\n \n {\n this.updateInternalLayoutProperty(\"gravityRangeCompound\", Number(e.target.value));\n }}\n />\n \n \n \n \n Number of Iterations:\n \n\n \n {\n this.updateInternalLayoutProperty(\"numIter\", Number(e.target.value));\n }}\n />\n \n \n \n \n Tiling Vertical Padding:\n \n\n \n {\n this.updateInternalLayoutProperty(\"tilingPaddingVertical\", Number(e.target.value));\n }}\n />\n \n \n \n \n Tiling Horizontal Padding:\n \n\n \n {\n this.updateInternalLayoutProperty(\"tilingPaddingHorizontal\", Number(e.target.value));\n }}\n />\n \n \n \n \n Tile Disconnected:\n \n\n \n {\n this.updateInternalLayoutProperty(\"tile\", !this.internalLayoutProperties.tile);\n }}\n >\n \n \n \n \n Animate:\n \n\n \n {\n this.updateInternalLayoutProperty(\"animate\",!this.internalLayoutProperties.animate);\n }}\n >\n \n \n \n \n Incremental:\n \n\n \n {\n this.updateInternalLayoutProperty(\"randomize\", !this.internalLayoutProperties.randomize);\n }}\n >\n \n \n \n \n Incremental Cooling Factor:\n \n\n \n {\n this.updateInternalLayoutProperty(\"initialEnergyOnIncremental\", Number(e.target.value));\n }}\n />\n \n \n
\n
\n\n \n {\n LayoutProperties.layoutProperties = _.clone(this.internalLayoutProperties);\n this.props.pathwayActions.setLayoutProperties(\n LayoutProperties.layoutProperties\n );\n this.props.handleClose(EModalType.LAYOUT);\n }}\n >\n Save\n \n\n {\n this.internalLayoutProperties = _.clone(\n EditorActionsManager.defaultLayoutProperties\n );\n LayoutProperties.layoutProperties = _.clone(this.internalLayoutProperties);\n this.props.pathwayActions.setLayoutProperties(\n this.internalLayoutProperties\n );\n }}\n >\n Default\n \n \n \n );\n }\n}\n","import { observer } from 'mobx-react';\nimport React from 'react';\nimport { Button, Col, ControlLabel, Form, FormControl, InputGroup, Modal } from 'react-bootstrap';\nimport { IPathwayInfo } from '../managers/FileOperationsManager';\nimport { EModalType } from '../ui/react-pathway-mapper';\nimport PathwayActions from '../utils/PathwayActions';\n\ninterface IPathwayDetailsModalProps{\n show: boolean;\n handleClose: Function;\n pathwayActions: PathwayActions;\n}\n\n@observer\nexport default class PathwayDetailsModal extends React.Component{\n\n pathwayInfo: IPathwayInfo;\n\n constructor(props: IPathwayDetailsModalProps){\n super(props);\n }\n\n render(){\n\n this.pathwayInfo = this.props.pathwayActions.getPathwayInfo;\n\n return(\n\n {this.props.handleClose(4)}}>\n \n Pathway Properties\n \n \n
\n\n \n \n Pathway Title:\n \n \n {this.pathwayInfo.pathwayTitle = e.target.value;}}value={this.pathwayInfo.pathwayTitle}/>\n \n \n\n \n \n Pathway Description:\n \n \n \n \n \n\n
\n
\n\n \n \n \n
\n\n )\n\n }\n}","import autobind from \"autobind-decorator\";\nimport { action, makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React from \"react\";\nimport { Button, Col, Modal, Row } from \"react-bootstrap\";\nimport { EModalType, IColorValueMap } from \"../ui/react-pathway-mapper\";\n\nconst addButtonImg = require(\"../images/add.svg\");\nconst deleteButtonImg = require(\"../images/delete-simple.svg\");\n\ninterface IValueColorObj {\n value: string;\n color: string;\n}\n\ninterface IProfilesColorSchemeModalProps {\n show: boolean;\n handleClose: (modalId: EModalType) => void;\n colorValueMapping: IColorValueMap;\n handleColorMappingChange: (colorMapping: IColorValueMap) => void;\n}\n\n@observer\nexport default class ProfilesColorSchemeModal extends React.Component<\n IProfilesColorSchemeModalProps,\n {}\n> {\n @observable\n colorMappings: IValueColorObj[];\n\n @observable\n showUniqueValuesWarningModal: boolean;\n\n constructor(props: IProfilesColorSchemeModalProps) {\n super(props);\n makeObservable(this);\n this.initColorMappings();\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.show === false && this.props.show === true) {\n this.initColorMappings();\n }\n }\n\n initColorMappings() {\n this.colorMappings = Object.entries(this.props.colorValueMapping)\n .map(([value, color]) => {\n return {\n value: value,\n color: color,\n };\n })\n .sort((o1, o2) => {\n return Number(o1.value) - Number(o2.value);\n });\n }\n\n @action.bound\n handleColorChange(index: number, color: string) {\n this.colorMappings[index].color = color;\n }\n\n @action.bound\n handleValueChange(index: number, value: string) {\n this.colorMappings[index].value = value;\n }\n\n @action.bound\n addDefaultColorMapping() {\n this.colorMappings.push({ value: \"0\", color: \"#ffffff\" });\n }\n\n @action.bound\n removeColorMapping(index: number) {\n this.colorMappings.splice(index, 1);\n }\n\n @action.bound\n setDefaultColorMapping() {\n this.colorMappings = [\n { value: \"-100\", color: \"#0000ff\" },\n { value: \"0\", color: \"#ffffff\" },\n { value: \"100\", color: \"#ff0000\" },\n ];\n }\n\n @action.bound\n setShowUniqueValuesWarningModal(val: boolean) {\n this.showUniqueValuesWarningModal = val;\n }\n\n @autobind\n handleSaveColorScheme(): boolean {\n const mapping = {};\n this.colorMappings.forEach((pair) => {\n mapping[pair.value] = pair.color;\n });\n\n if (Object.keys(mapping).length < 2) {\n this.setShowUniqueValuesWarningModal(true);\n return false;\n } else {\n this.props.handleColorMappingChange(mapping);\n return true;\n }\n }\n\n @autobind\n close() {\n this.props.handleClose(EModalType.PROFILES_COLOR_SCHEME);\n }\n\n render() {\n const mappingElements = this.colorMappings.map((mapping, index) => (\n \n \n \n {\n const value = event.target.value;\n this.handleValueChange(index, value);\n }}\n >\n \n \n {\n const color = event.target.value;\n this.handleColorChange(index, color);\n }}\n />\n \n \n 2 ? \"icon-enabled\" : \"icon-disabled\")\n }\n title={\"Remove\"}\n onClick={() => {\n this.removeColorMapping(index);\n }}\n >\n \n \n \n ));\n\n return (\n {\n this.close();\n }}\n bsSize=\"small\"\n >\n \n Study Data Overlay Color Scheme\n \n\n \n \n \n \n \n \n \n \n \n \n \n
\n {mappingElements}\n \n\n this.setShowUniqueValuesWarningModal(false)}\n bsSize=\"small\"\n >\n \n \n Warning \n \n \n \n

Please set at least two unique value-color mappings.

\n
\n \n {\n this.setShowUniqueValuesWarningModal(false);\n }}\n >\n OK\n \n \n \n
\n\n \n {\n this.close();\n }}\n >\n Cancel\n \n {\n this.setDefaultColorMapping();\n }}\n >\n Default\n \n {\n const close = this.handleSaveColorScheme();\n if (close) {\n this.close();\n }\n }}\n >\n Save\n \n \n \n );\n }\n}\n","import { action, computed, makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React from \"react\";\nimport { Button, Modal } from \"react-bootstrap\";\nimport EditorActionsManager from \"../managers/EditorActionsManager\";\nimport { EModalType, IProfileMetaData } from \"../ui/react-pathway-mapper\";\ninterface IProfilesModalProps {\n profiles: IProfileMetaData[];\n editor: EditorActionsManager;\n show: boolean;\n handleClose: Function;\n handleProfileLabelClicked: (index: number) => void;\n enabledProfileCountLimit: number;\n}\n\n@observer\nexport default class ProfilesModal extends React.Component<\n IProfilesModalProps,\n {}\n> {\n\n\n @observable\n showEnabledProfileWarningModal: boolean = false;\n\n constructor(props: IProfilesModalProps) {\n super(props);\n\n makeObservable(this);\n }\n\n @action\n setShowEnabledProfileWarningModal(val: boolean) {\n this.showEnabledProfileWarningModal = val;\n }\n\n @computed get profileEnabledMap() {\n\n const enabledProfiles: IProfileMetaData[] = [];\n this.props.profiles.forEach(profile => {\n if (profile.enabled && enabledProfiles.length < this.props.enabledProfileCountLimit) {\n enabledProfiles.push(profile);\n }\n });\n\n const profileEnabledMap = {};\n this.props.profiles.forEach((profile: IProfileMetaData) => {\n const enabled = enabledProfiles.indexOf(profile) > -1;\n profileEnabledMap[profile.profileId] = enabled;\n });\n return profileEnabledMap;\n }\n\n handleProfileLabelClicked(index: number) {\n this.props.handleProfileLabelClicked(index);\n }\n\n render() {\n const profileLabels = this.props.profiles.map(\n (profile: IProfileMetaData, i: number) => (\n \n {\n const enabledProfileCount = this.props.profiles.filter(profile => profile.enabled).length;\n if (this.props.profiles[i].enabled || enabledProfileCount < this.props.enabledProfileCountLimit) {\n this.handleProfileLabelClicked(i);\n this.props.editor.updateGenomicDataVisibility(\n this.profileEnabledMap\n );\n }\n else {\n this.setShowEnabledProfileWarningModal(true);\n }\n }}\n style={{\n cursor: \"pointer\",\n margin: \"10px\"\n }}\n bsStyle={this.props.profiles[i].enabled ? \"primary\" : \"default\"}\n >\n {profile.profileId}\n \n \n )\n );\n\n return (\n {\n this.props.handleClose(EModalType.PROFILES);\n }}\n >\n \n Genomic Data Set(s) to Show\n \n \n {profileLabels.length > 0 ? (\n profileLabels\n ) : (\n

There is currently no data to show

\n )}\n this.setShowEnabledProfileWarningModal(false)}>\n \n \n Warning\n \n \n \n

At most 6 data sets can be displayed at the same time, please disable some other data set before enabling this.

\n
\n \n {\n this.setShowEnabledProfileWarningModal(false);\n }}>\n OK\n \n \n \n
\n \n );\n }\n}\n","import React from 'react';\nimport { EModalType } from '../ui/react-pathway-mapper';\nimport {Modal} from 'react-bootstrap';\ninterface IQuickHelpModalProps{\n show: boolean;\n handleClose: (modalId: EModalType) => void;\n}\n\nexport default class QuickHelpModal extends React.Component{\n\n constructor(props: IQuickHelpModalProps){\n super(props);\n }\n\n render(){\n\n\n return(\n {this.props.handleClose(EModalType.HELP)}}>\n \n Quick Help\n \n \n
    \n
  • To add a node: Drag and drop from node palette
  • \n
  • To add an interaction: Click on interaction type; then click on small circle on source node and release on target node
  • \n
  • To add a node into a container (family, complex, compartment or process): Drag the node into its container node or select nodes to be contained and right click on container node and choose \"Add Selected Into This\"
  • \n
  • To delete nodes/interactions: Select and perform Edit > Delete Selected
  • \n
  • To overlay experiment data: Select Alteration % > Load From cBioPortal...
  • \n
\n
\n\n
\n\n );\n }\n\n\n}","import _ from \"lodash\";\nimport { toast } from 'react-toastify';\nimport EditorActionsManager from \"../managers/EditorActionsManager\";\n\n\nexport default class CBioPortalAccessor{\n static readonly CNA_GAIN = 2;\n\n static readonly GET_ALL_CANCER_STUDIES_URL = \"https://www.cbioportal.org/webservice.do?cmd=getCancerStudies\";\n static readonly GET_GENETIC_PROFILES_URL = \"https://www.cbioportal.org/webservice.do?cmd=getGeneticProfiles&cancer_study_id=\";\n static readonly GET_PROFILE_DATA_URL = \"https://www.cbioportal.org/webservice.do?cmd=getProfileData\";\n static readonly MRNA_EXP_STUDY_NAME = \"_mrna_median_Zscores\";\n static readonly CNA_EXP_STUDY_NAME = \"_gistic\";\n static readonly VALIDATE_GENES_URL = 'https://www.cbioportal.org/api/genes/fetch?geneIdType=HUGO_GENE_SYMBOL&projection=ID'\n static readonly MUTATION_EXP_STUDY_NAME = \"_mutations\";\n\n static readonly CNA_DELETION = -2;\n static readonly Z_SCORE_UPPER_THRESHOLD = 2;\n static readonly Z_SCORE_LOWER_THRESHOLD = -2;\n \n static readonly MUTATION = \"Mutation\";\n static readonly GENE_EXPRESSION = \"Gene Expression\";\n static readonly CNA = \"Copy Number Alteration\";\n\n getDataTypes(){\n return [CBioPortalAccessor.MUTATION, CBioPortalAccessor.GENE_EXPRESSION, CBioPortalAccessor.CNA];\n }\n\n /*\n * Retrieves all cancer studies from cBioPortal\n * **/\n fetchCancerStudies(callbackFunction)\n {\n var cancerStudies = {};\n var request = new XMLHttpRequest();\n request.onreadystatechange = function ()\n {\n if(request.readyState === XMLHttpRequest.DONE && request.status === 200)\n {\n // By lines\n // Match all new line character representations\n var seperator = /\\r?\\n|\\r/;\n var lines = request.responseText.split(seperator);\n\n // start from first line skip node meta data\n for(var i = 1; i < lines.length; i++)\n {\n if (lines[i].length <= 0)\n continue;\n\n var lineData = lines[i].split('\\t');\n cancerStudies[lineData[0]] = lineData;\n }\n callbackFunction(cancerStudies);\n }\n else if (request.readyState === XMLHttpRequest.DONE && request.status !== 200)\n {\n toast.error(\"Could not retrieve studies!\");\n }\n };\n request.open(\"GET\", CBioPortalAccessor.GET_ALL_CANCER_STUDIES_URL);\n request.send();\n };\n\n /**\n * Retrieves all genetic profiles for given cancerStudy from cBioPortal\n */\n getSupportedGeneticProfiles(cancerStudy, callbackFunction)\n {\n var outData = {};\n var request = new XMLHttpRequest();\n var self = this;\n request.onreadystatechange = function ()\n {\n if(request.readyState === XMLHttpRequest.DONE && request.status === 200)\n {\n // By lines\n // Match all new line character representations\n var seperator = /\\r?\\n|\\r/;\n var lines = request.responseText.split(seperator);\n\n // start from first line skip node meta data\n for(var i = 1; i < lines.length; i++)\n {\n if (lines[i].length <= 0)\n continue;\n\n var lineData = lines[i].split('\\t');\n var cancerProfileName = lineData[0];\n if(self.isSupportedCancerProfile(cancerProfileName))\n {\n outData[cancerProfileName] = lineData;\n }\n }\n\n callbackFunction(outData);\n }\n else if (request.readyState === XMLHttpRequest.DONE && request.status !== 200)\n {\n console.error(\"Error retrieving studies\");\n }\n };\n request.open(\"GET\", CBioPortalAccessor.GET_GENETIC_PROFILES_URL + cancerStudy);\n request.send();\n };\n\n isSupportedCancerProfile(cancerProfileName: string)\n {\n return (cancerProfileName.endsWith(CBioPortalAccessor.MRNA_EXP_STUDY_NAME) ||\n cancerProfileName.endsWith(CBioPortalAccessor.CNA_EXP_STUDY_NAME) ||\n cancerProfileName.endsWith(CBioPortalAccessor.MUTATION_EXP_STUDY_NAME));\n };\n\n static getDataType(cancerProfileName: string)\n {\n if ( cancerProfileName.endsWith(this.MRNA_EXP_STUDY_NAME))\n {\n return this.GENE_EXPRESSION;\n }\n else if ( cancerProfileName.endsWith(this.CNA_EXP_STUDY_NAME))\n {\n return this.CNA;\n }\n else if ( cancerProfileName.endsWith(this.MUTATION_EXP_STUDY_NAME))\n {\n return this.MUTATION;\n }\n\n return \"\";\n }\n \n\n calcAlterationPercentages(paramLines, geneticProfileId, callbackFunction)\n {\n // By lines\n // Match all new line character representations\n const seperator = /\\r?\\n|\\r/;\n const lines = paramLines.split(seperator);\n let startIndex = 0;\n\n //Find starting index of actual data skip commented lines\n for (const i in lines)\n {\n if(!lines[i].startsWith('#'))\n {\n startIndex = parseInt(i);\n break;\n }\n }\n\n //Total number of tumor samples in the response\n const tumorSamples = lines[startIndex].split('\\t');\n const numOfTumorSamples = tumorSamples.length - 2;\n const outData: {} = {};\n outData[geneticProfileId] = {};\n\n const geneticProfileType = CBioPortalAccessor.getDataType(geneticProfileId);\n // skip meta line and iterate over tumor sample data\n for(let i = startIndex + 1; i < lines.length; i++)\n {\n if (lines[i].length <= 0)\n continue;\n\n //Iterate over samples for each gene to calculate profile data\n const lineData: string[] = lines[i].split('\\t');\n let profileDataAlteration = 0;\n for(let j = 2; j < lineData.length; j++)\n {\n if(lineData[j] !== 'NaN')\n {\n if( geneticProfileType === CBioPortalAccessor.MUTATION )\n profileDataAlteration++;\n else if ( (geneticProfileType === CBioPortalAccessor.CNA) \n && ( parseInt(lineData[j]) === CBioPortalAccessor.CNA_GAIN || parseInt(lineData[j]) === CBioPortalAccessor.CNA_DELETION ) ){\n profileDataAlteration++;\n }\n else if ( (geneticProfileType === CBioPortalAccessor.GENE_EXPRESSION) \n && (parseFloat(lineData[j]) >= CBioPortalAccessor.Z_SCORE_UPPER_THRESHOLD \n || parseFloat(lineData[j]) <= CBioPortalAccessor.Z_SCORE_LOWER_THRESHOLD)){\n profileDataAlteration++;\n }\n }\n }\n\n //\n outData[geneticProfileId][lineData[1]] = ( profileDataAlteration / numOfTumorSamples ) * 100;\n }\n\n callbackFunction(outData);\n }\n\n\n /*\n *\n * Retrieves profile data associated with the parameters below from cBioPortal\n * @params\n {\n caseSetId: \"gbm_tcga\",\n geneticProfileId: \"gbm_tcga_mutations\",\n genes: [\"BRCA1\", \"BRCA2\", \"TP53\"]\n }\n * */\n getProfileData(params, callbackFunction)\n {\n //params\n //caseSetId, geneticProfileId, genes\n\n const outData = {};\n const request = new XMLHttpRequest();\n const self = this;\n request.onreadystatechange = function ()\n {\n if(request.readyState === XMLHttpRequest.DONE && request.status === 200)\n {\n self.calcAlterationPercentages(request.responseText, params.geneticProfileId, callbackFunction);\n toast.success(params.geneticProfileId + \" has been succesfully loaded from cBioPortal.\");\n }\n };\n\n //Create query URL\n let queryURL = CBioPortalAccessor.GET_PROFILE_DATA_URL;\n //Fetch sequenced case list !!\n queryURL += \"&case_set_id=\" + params.caseSetId + \"_sequenced\";\n queryURL += \"&genetic_profile_id=\" + params.geneticProfileId;\n queryURL += \"&gene_list=\";\n let isFirst = true;\n for(const gene of params.genes)\n {\n if(!isFirst){\n queryURL += \"+\";\n } else {\n isFirst = false;\n }\n queryURL += gene;\n \n }\n request.open(\"GET\", queryURL);\n request.send();\n };\n\n validateGenes(nodeSymbols, editor: EditorActionsManager)\n {\n const request = new XMLHttpRequest();\n const self = this;\n\n request.onreadystatechange = function ()\n {\n if(request.readyState === XMLHttpRequest.DONE && request.status === 200)\n {\n const validGeneSymbols = JSON.parse(request.responseText);\n const validGeneArray = _.map(validGeneSymbols, function(object)\n {\n return object.hugoGeneSymbol;\n });\n editor.highlightInvalidGenes(validGeneArray);\n }\n };\n const queryURL = CBioPortalAccessor.VALIDATE_GENES_URL;\n request.open(\"POST\", queryURL);\n request.setRequestHeader(\"Content-type\", \"application/json\");\n request.send(JSON.stringify(nodeSymbols));\n }\n}\n","import autobind from \"autobind-decorator\";\nimport { action, computed, makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React from \"react\";\nimport {\n Button,\n Checkbox,\n FormControl,\n ListGroup,\n ListGroupItem,\n Modal,\n} from \"react-bootstrap\";\nimport { EModalType, IDataTypeMetaData } from \"../ui/react-pathway-mapper\";\nimport CBioPortalAccessor from \"../utils/CBioPortalAccessor\";\n\ninterface IStudyModalProps {\n show: boolean;\n loadFromCBio: Function;\n handleClose: Function;\n}\n\n@observer\nexport default class StudyModal extends React.Component {\n @observable\n dataTypes: { [dataType: string]: IDataTypeMetaData } = {};\n\n @observable\n dataTypeFetchResultsReady: boolean = false;\n\n currentlySelectedItemIndex = -1;\n\n @observable\n selectedStudies: {\n data: any[];\n dataTypes: { [dataType: string]: IDataTypeMetaData };\n }[] = [];\n\n checkboxModalPosition: {\n bottom: number;\n } = {\n bottom: 0,\n };\n\n @observable\n selectedDataTypesPerStudy: string[] = [];\n\n @observable\n itemArray: any[] = [];\n\n @observable\n searchQuery: string = \"\";\n\n @observable\n showDataTypeSelectionModal = false;\n\n @observable\n studyListItemCheckboxChecked: boolean[] = [];\n\n @observable\n selectedStudyData: any[];\n\n @observable\n portalAccessor: CBioPortalAccessor;\n\n constructor(props: IStudyModalProps) {\n super(props);\n makeObservable(this);\n this.selectedStudyData = [];\n this.portalAccessor = new CBioPortalAccessor();\n this.fetchStudy();\n }\n\n @action.bound\n setDataTypeFetchResultsReady(ready: boolean) {\n this.dataTypeFetchResultsReady = ready;\n }\n\n @action.bound\n setItemArray(itemArray: any[]) {\n this.itemArray = itemArray;\n }\n\n @action.bound\n setSearchQuery(query: string) {\n this.searchQuery = query;\n }\n\n @action.bound\n setSelectedStudyData(data: any[]) {\n this.selectedStudyData = data;\n }\n\n @action.bound\n setDataTypeProperties(dataType: string, properties: IDataTypeMetaData) {\n this.dataTypes[dataType] = properties;\n }\n\n @action.bound\n initStudyListItemCheckboxChecked(studyCount: number) {\n this.studyListItemCheckboxChecked = Array(studyCount).fill(false);\n }\n\n @action.bound\n initSelectedDataTypesPerStudy(studyCount: number) {\n this.selectedDataTypesPerStudy = Array(studyCount).fill(\"\");\n }\n\n @action.bound\n toggleStudyListItemCheckboxChecked(studyIndex: number) {\n this.studyListItemCheckboxChecked[studyIndex] = !this\n .studyListItemCheckboxChecked[studyIndex];\n }\n\n @action.bound\n addSelectedStudy(selectedStudy: {\n data: any[];\n dataTypes: { [dataType: string]: IDataTypeMetaData };\n }) {\n this.selectedStudies.push(selectedStudy);\n }\n\n @action.bound\n removeSelectedStudy(selectedStudyData: any[]) {\n this.selectedStudies = this.selectedStudies.filter(\n (study) => study.data[0] != selectedStudyData[0]\n );\n }\n\n @action.bound\n clearSelectedStudies() {\n this.selectedStudies = [];\n }\n\n @action.bound\n setShowDataTypeSelectionModal(show: boolean) {\n this.showDataTypeSelectionModal = show;\n }\n\n @action.bound\n clearStudyCheckboxesChecked() {\n const length = this.studyListItemCheckboxChecked.length;\n this.studyListItemCheckboxChecked = Array(length).fill(false);\n }\n\n @action.bound\n clearSelectedDataTypesPerStudy() {\n const length = this.studyListItemCheckboxChecked.length;\n this.selectedDataTypesPerStudy = Array(length).fill(\"\");\n }\n\n @action.bound\n unselectDataTypesForStudy(index: number) {\n this.selectedDataTypesPerStudy[index] = \"\";\n }\n\n preparePortalAccess(studyId: string) {\n this.setDataTypeFetchResultsReady(false);\n this.portalAccessor.getSupportedGeneticProfiles(studyId, (data) => {\n this.disableAllDataTypes();\n // Iterate through profiles\n for (const profile of Object.keys(data)) {\n const type = CBioPortalAccessor.getDataType(profile);\n if (type !== \"\") {\n this.setDataTypeProperties(type, {\n ...this.dataTypes[type],\n enabled: true,\n profile: profile,\n });\n setTimeout(() => this.setDataTypeFetchResultsReady(true), 500);\n }\n }\n });\n }\n\n disableAllDataTypes() {\n for (const dataType of Object.keys(this.dataTypes)) {\n this.setDataTypeProperties(dataType, {\n enabled: false,\n checked: false,\n profile: undefined,\n });\n }\n }\n\n fetchStudy() {\n this.portalAccessor.getDataTypes().forEach((dataType) => {\n this.setDataTypeProperties(dataType, {\n enabled: false,\n checked: false,\n profile: undefined,\n });\n });\n\n this.portalAccessor.fetchCancerStudies((cancerStudies: any) => {\n let temp = [];\n for (const studyTitle in cancerStudies) {\n if (!cancerStudies.hasOwnProperty(studyTitle)) {\n continue;\n }\n const studyData = cancerStudies[studyTitle];\n temp.push(studyData);\n }\n const numOfStudies = temp.length;\n this.initStudyListItemCheckboxChecked(numOfStudies);\n this.initSelectedDataTypesPerStudy(numOfStudies);\n\n this.setItemArray(temp);\n });\n }\n\n @autobind\n resetModal() {\n this.disableAllDataTypes();\n this.setSelectedStudyData([]);\n this.clearSelectedStudies();\n this.clearStudyCheckboxesChecked();\n this.clearSelectedDataTypesPerStudy();\n this.currentlySelectedItemIndex = -1;\n this.searchQuery = \"\";\n }\n\n @autobind\n handleCheckboxClick(dataType) {\n this.setDataTypeProperties(dataType, {\n ...this.dataTypes[dataType],\n checked: !this.dataTypes[dataType].checked,\n });\n }\n\n @computed\n get selectedStudyDataTitle() {\n if (this.selectedStudyData.length > 1) {\n return this.selectedStudyData[1] || \"Choose study\";\n } else {\n return \"Choose study\";\n }\n }\n\n render() {\n\n return (\n {\n this.props.handleClose(EModalType.STUDY);\n this.resetModal();\n }}\n >\n \n Profile Data from cBioPortal\n \n \n \n

Select Cancer Study

\n
\n this.setSearchQuery(event.target.value)}\n />\n \n \n {this.itemArray.length < 1 ? (\n Fetching studies from cBioPortal...\n ) : (\n this.itemArray\n .map((item, index) => {\n return { item: item, index: index };\n })\n .filter((obj) =>\n obj.item[1]\n .toLowerCase()\n .includes(this.searchQuery.toLowerCase())\n )\n .map((obj) => {\n const item = obj.item;\n const index = obj.index;\n\n const studyTitle = item[1];\n const studyId = item[0];\n return (\n \n {\n const boundingRect = document\n .getElementById(\"listgroupitem\" + index)\n .getBoundingClientRect();\n const modalMargin = 30;\n this.checkboxModalPosition = {\n bottom: boundingRect.bottom - modalMargin,\n };\n this.setSelectedStudyData(item);\n this.preparePortalAccess(studyId);\n this.toggleStudyListItemCheckboxChecked(index);\n this.currentlySelectedItemIndex = index;\n\n if (this.studyListItemCheckboxChecked[index]) {\n this.setShowDataTypeSelectionModal(true);\n } else {\n this.removeSelectedStudy(item);\n this.unselectDataTypesForStudy(index);\n }\n }}\n >\n {studyTitle}\n \n {this.selectedDataTypesPerStudy[index] != \"\" && (\n \n {this.selectedDataTypesPerStudy[index]}\n \n )}\n \n );\n })\n )}\n \n \n
\n

\n Warning: At most six different data sets will be overlayed on the genes. You can toggle which ones are to be displayed via \"Alteration %\" {\">\"} \"View Settings\" menu.\n

\n
\n {\n this.setShowDataTypeSelectionModal(false);\n }}\n >\n \n {this.dataTypeFetchResultsReady === false ? (\n Fetching data types from cBioPortal...\n ) : (\n Object.keys(this.dataTypes).map((dataType: string) => {\n return (\n {\n this.handleCheckboxClick(dataType);\n }}\n checked={this.dataTypes[dataType].checked}\n >\n {dataType}\n \n );\n })\n )}\n \n \n {\n const currentDataTypes = { ...this.dataTypes };\n const selectedCount = Object.keys(currentDataTypes).filter(\n (dataType) => {\n return currentDataTypes[dataType].checked;\n }\n ).length;\n if (selectedCount == 0) {\n this.studyListItemCheckboxChecked[\n this.currentlySelectedItemIndex\n ] = false;\n }\n this.setShowDataTypeSelectionModal(false);\n }}\n >\n Cancel\n \n {\n const currentDataTypes = { ...this.dataTypes };\n this.addSelectedStudy({\n data: this.selectedStudyData,\n dataTypes: currentDataTypes,\n });\n this.selectedDataTypesPerStudy[\n this.currentlySelectedItemIndex\n ] = Object.keys(currentDataTypes)\n .filter((dataType) => {\n return currentDataTypes[dataType].checked;\n })\n .join(\", \");\n this.setShowDataTypeSelectionModal(false);\n }}\n >\n Add\n \n \n \n
\n\n \n {\n this.selectedStudies.forEach((study) => {\n this.props.loadFromCBio(study.dataTypes, study.data);\n });\n this.props.handleClose(EModalType.STUDY);\n this.resetModal();\n }}\n >\n Load Data\n \n \n \n );\n }\n}\n","import autobind from \"autobind-decorator\";\nimport { action, makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React from 'react';\nimport { Checkbox, DropdownButton, MenuItem } from \"react-bootstrap\";\nimport PathwayActions from '../utils/PathwayActions.js';\nimport { IPathwayMapperTable } from \"./react-pathway-mapper\";\n\ninterface IRankingProps{\n pathwayActions: PathwayActions;\n bestPathwaysAlgos: any[][];\n tableComponent: (data: IPathwayMapperTable[], selectedPathway: string, onPathwaySelect: (pathway: string) => void) => JSX.Element;\n patientView ?: boolean;\n}\n\nconst TCGA_PANCAN_PATHWAY_NAMES = [\n \"Cell Cycle\", \n \"HIPPO\", \n \"MYC\",\n \"NOTCH\",\n \"NRF2\",\n \"PI3K\",\n \"RTK-RAS\",\n \"TGF-Beta\",\n \"TP53\",\n \"WNT\"\n];\n\n\n@observer\nexport default class Ranking extends React.Component{\n @observable\n bestPathways: any[];\n\n @observable\n shownPathways: any[];\n\n @observable\n dropDownTitle: string;\n\n @observable\n selectedPathway: string;\n isPercentageMatch: number;\n isAlterationEnabled: number;\n\n @observable\n considerOnlyTCGAPanPathways: boolean;\n\n @observable\n isExpanded: boolean;\n\n readonly COUNT_PERC_EXPLANATION = \"Whether we should favor the number of genes of interest matching the ones in a pathway or the percentage of such genes in that pathway. For instance, suppose genes of interest are A, B, and C, and the pathway contains genes B, C, D, and E. When we consider count, the score is 2 (for the two genes that match). However, when we consider percentage the score will be 50% as 2 of the 4 genes in the pathway are among genes of interest.\";\n readonly ALTERATION_EXPLANATION = \"When this is checked, each matching gene will not directly contribute to the score as 1 unit but with the alteration frequency percentage of that gene. For instance, suppose genes of interest are A, B, and C with alteration frequencies of 0.5, 0.2, and 0.3, respectively, and the pathway contains genes B, C, D, and E. When this is option isn't checked, the score will be 2 for match count and 50% for the match percentage. However, when this option is checked, the scores will be 0.2+0.3=0.5 and (0.2+0.3)/4=12.5% for match count and percentage, respectively.\";\n readonly TCGA_PANCAN_EXPLANATION = \"The pathways listed above were retrieved from PathwayMapper. When this option is checked, only the pathways under TCGA > PanCanAtlas will be shown. Uncheck to show all.\";\n\n constructor(props: IRankingProps){\n super(props);\n makeObservable(this);\n \n this.isPercentageMatch = 0;\n this.isAlterationEnabled = 0;\n this.considerOnlyTCGAPanPathways = true;\n this.dropDownTitle = \"Match count\";\n this.isExpanded = false;\n this.setBestPathwayMethod(0);\n this.selectedPathway = this.shownPathways[0].pathwayName;\n }\n\n @autobind\n setBestPathwayMethod(i: number){\n this.bestPathways = this.props.bestPathwaysAlgos[i];\n this.filterBestPathwaysByTCGAPanPathways();\n }\n\n @autobind\n onPathwayClick(pathway: string){\n this.selectedPathway = pathway;\n this.props.pathwayActions.changePathway(this.selectedPathway);\n }\n\n @autobind\n onApplyClick(){\n // Mapping from dropdown + checkbox selection to pathway method.\n this.setBestPathwayMethod(2 * this.isAlterationEnabled + this.isPercentageMatch);\n }\n\n @action.bound \n filterBestPathwaysByTCGAPanPathways() {\n this.shownPathways = this.bestPathways.filter((data: any) => {\n if (this.considerOnlyTCGAPanPathways) {\n return TCGA_PANCAN_PATHWAY_NAMES.indexOf(data.pathwayName) > -1;\n }\n return true;\n });\n // change selected pathway if we are filtered and doesn't exist\n if (this.considerOnlyTCGAPanPathways \n && TCGA_PANCAN_PATHWAY_NAMES.indexOf(this.selectedPathway) < 0) {\n this.selectedPathway = this.shownPathways[0].pathwayName;\n this.props.pathwayActions.changePathway(this.selectedPathway);\n }\n }\n\n @action.bound\n toggleConsiderOnlyTCGAPanPathways() {\n this.considerOnlyTCGAPanPathways = !this.considerOnlyTCGAPanPathways;\n this.filterBestPathwaysByTCGAPanPathways();\n }\n\n\n componentDidMount(): void {\n this.props.pathwayActions.changePathway(this.selectedPathway);\n }\n\n render(){\n const lengthThreshold = 13;\n \n return (\n
\n\n {/*\n
\n  Pathways\n
*/}\n\n { this.props.tableComponent &&\n this.props.tableComponent(\n this.shownPathways.map((data: any) => ({\n name: data.pathwayName, score: data.score, genes: data.genesMatched\n })),\n this.selectedPathway,\n this.onPathwayClick)\n }\n {\n
\n \n Show TCGA PanCancer Atlas pathways only  \n \n \n \n
\n }\n {(!this.props.patientView &&\n
\n {\n
\n \n  Ranking options\n \n
\n }\n
\n \n {this.isPercentageMatch = 0; this.dropDownTitle = \"Match count\"; this.onApplyClick();} }>Match count\n {this.isPercentageMatch = 1; this.dropDownTitle = \"Match percentage\"; this.onApplyClick();}}>Match percentage\n \n   \n
\n\n {this.isAlterationEnabled = (this.isAlterationEnabled === 1) ? 0 : 1; this.onApplyClick();}}\n style={{fontSize: \"13px\", marginTop: \"18px\", bottom: \"4px\"}}>\n Consider alteration frequency  \n \n \n
\n
\n )}\n
\n \n );\n \n }\n\n \n}\n","import { makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React from 'react';\n// @ts-ignore\nimport openImage from \"../images/toolbar/edit.svg\";\n// @ts-ignore\nimport layoutImage from \"../images/toolbar/layout-cose.svg\";\n// @ts-ignore\nimport savePNGImage from \"../images/toolbar/save_png.svg\";\n// @ts-ignore\nimport saveSVGImage from \"../images/toolbar/save_svg.svg\";\nimport EditorActionsManager from \"../managers/EditorActionsManager\";\nimport { EModalType, IAlterationData } from '../ui/react-pathway-mapper';\nimport PathwayActions from '../utils/PathwayActions';\n// @ts-ignore\nconst addSelImage = require(\"../images/toolbar/add-selected.svg\");\n// @ts-ignore\nconst addAllImage = require(\"../images/toolbar/add-all.svg\");\n// @ts-ignore\nconst aboutImage = require(\"../images/toolbar/about.svg\");\n\n\ninterface IToolbarProps {\n pathwayActions: PathwayActions;\n selectedPathway: string;\n alterationData: IAlterationData;\n handleOpen: (modalId: number) => void;\n genes: any[];\n validGenes: any;\n showMessage: (message: string) => void;\n pathwayGenes: string[];\n onAddGenes: (selectedGenes: string[]) => void;\n patientView ?: boolean;\n}\n\n@observer\nexport default class Toolbar extends React.Component{\n\n\n @observable\n selectedGenes: string[];\n\n @observable\n private editor: EditorActionsManager;\n constructor(props: IToolbarProps){\n super(props);\n makeObservable(this);\n\n this.selectedGenes = [];\n }\n\n \n render(){\n\n\n const studyQuery = \"q=\" + JSON.stringify(this.props.alterationData) + \"&g=\" + this.props.genes.map(gene => gene.hugoGeneSymbol).join(\"+\");\n return (\n
\n {this.props.pathwayActions.saveAs(\"PNG\");}}/>\n\n {this.props.pathwayActions.saveAs(\"SVG\");}}/>\n\n \n {(!this.props.patientView && [\n {\n this.selectedGenes = this.props.pathwayActions.getSelectedNodes()\n .filter((node: any) => node.data().type === \"GENE\")\n .map((node: any) => node.data().name as string);\n\t const noneGeneList = this.props.pathwayActions.getSelectedNodes()\n .filter((node: any) => node.data().type !== \"GENE\")\n .map((node: any) => node.data().name as string);\n const invalidGenes: string[] = [];\n\t let message = \"\";\n if(noneGeneList.length > 0){\n message += \"Selection contains nodes that are not genes: \" + noneGeneList.join(', ') + \". \";\n }\n\n this.selectedGenes.forEach((gene: string) => {\n if(!this.props.validGenes.hasOwnProperty(gene)){\n invalidGenes.push(gene);\n }\n });\n\n if(invalidGenes.length === 0){\n\n if(this.selectedGenes.length > 0 && noneGeneList.length === 0){\n this.props.onAddGenes(this.selectedGenes);\n }\n } else {\n\t message += \"Following gene symbols are invalid or already in gene list: \" + invalidGenes.join(\", \") + \".\";\n }\n\n\t if(message.length > 0) {\n\t this.props.showMessage(message);\n\t }\n }}/>\n ,\n \n {\n\n this.selectedGenes = this.props.pathwayGenes.filter((gene: string) => {\n return this.props.validGenes.hasOwnProperty(gene);\n });\n \n if(this.selectedGenes.length > 0){\n this.props.onAddGenes(this.selectedGenes);\n }\n }}/>,\n \n\n {{window.open(\"http://pathwaymapper.org/?pathwayName=\" + this.props.selectedPathway +\"&\"+ studyQuery )}}}/>\n ])}\n {this.props.handleOpen(EModalType.CHELP); }}/>\n \n
);\n }\n}\n","import autobind from \"autobind-decorator\";\nimport { action, computed, makeObservable, observable } from \"mobx\";\nimport EditorActionsManager from \"../managers/EditorActionsManager\";\nimport FileOperationsManager, {\n IPathwayInfo\n} from \"../managers/FileOperationsManager\";\nimport GridOptionsManager from \"../managers/GridOptionsManager\";\nimport ViewOperationsManager from \"../managers/ViewOperationsManager\";\nimport ConfirmationModal from \"../modals/ConfirmationModal\";\nimport { EGridType } from \"../modals/GridSettings\";\nimport { ILayoutProperties } from \"../modals/LayoutProperties\";\nimport {\n EModalType, IPathwayData, IProfileMetaData\n} from \"../ui/react-pathway-mapper\";\nimport SaveLoadUtility from \"./SaveLoadUtility\";\n\nexport default class PathwayActions {\n @observable\n selectedPathway: string;\n fileManager: FileOperationsManager;\n editor: EditorActionsManager;\n undoRedoManager: any;\n pathwayHandler: (pathwayName: string) => void;\n handleOpen: (modalId: EModalType) => void;\n eh: any;\n profiles: IProfileMetaData[];\n gridOptionsManager: GridOptionsManager;\n\n uploader: any;\n merger: any;\n isCBioPortal: boolean;\n isCollaborative: boolean;\n viewOperationsManager: ViewOperationsManager;\n overlayUploader: any;\n\n @observable\n enabledType: EGridType;\n\n constructor(\n pathwayHandler: (pathwayName: string) => void,\n profiles: IProfileMetaData[],\n fileManager: FileOperationsManager,\n handleOpen: (modalId: EModalType) => void,\n isCBioPortal: boolean,\n isCollaborative: boolean\n ) {\n makeObservable(this);\n this.pathwayHandler = pathwayHandler;\n this.profiles = profiles;\n this.fileManager = fileManager;\n this.handleOpen = handleOpen;\n this.isCBioPortal = isCBioPortal;\n this.isCollaborative = isCollaborative;\n this.enabledType = EGridType.NONE;\n }\n\n @action.bound\n addProfile(profile: IProfileMetaData) {\n this.profiles.push(profile);\n }\n\n @action.bound\n clearProfiles() {\n this.profiles.length = 0;\n }\n\n emphasizeQueryGenes(queryGenes: string[]) {\n if (this.editor)\n this.editor.cy.nodes().forEach((node: any) => {\n const nodeName = node.data().name;\n const nodeType = node.data().type;\n if (queryGenes.includes(nodeName) && nodeType === \"GENE\") {\n node.style({ \"border-width\": \"4px\", \"font-weight\": \"bold\" });\n }\n });\n }\n\n getSelectedNodes() {\n return this.editor.cy.nodes(\":selected\");\n }\n\n setLayoutProperties(layoutProperties: ILayoutProperties) {\n this.editor.saveLayoutProperties(layoutProperties);\n }\n\n doesCyHaveElements() {\n return this.editor.cy.elements().length > 0;\n }\n\n @autobind\n toggleGrid(isEnabled: boolean) {\n this.gridOptionsManager.setSnapToGuidelines(false);\n this.gridOptionsManager.setShowGrid(isEnabled);\n }\n\n @autobind\n toggleGuide(isEnabled: boolean) {\n this.gridOptionsManager.setSnapToGuidelines(isEnabled);\n this.gridOptionsManager.setShowGrid(false);\n }\n\n adjustGridSettings(gridSize: number, color: string) {\n this.gridOptionsManager.currentProperties.gridSpacing = gridSize;\n this.gridOptionsManager.currentProperties.guidelinesStyle.strokeStyle = color;\n this.gridOptionsManager.currentProperties.guidelinesStyle.horizontalDistColor = color;\n this.gridOptionsManager.currentProperties.guidelinesStyle.verticalDistColor = color;\n }\n\n @autobind\n resizeToContent() {\n this.editor.resizeNodesToContent(this.editor.cy.nodes());\n }\n\n @autobind\n align(param: string) {\n this.viewOperationsManager.handleNodeAlignment(param);\n }\n\n @autobind\n onChangeFile(e: any, isMerge: boolean) {\n const file = e.target.files[0] as File;\n this.processFile(file, isMerge);\n //Can't load the same file twice in a row without this\n e.target.value = \"\";\n }\n\n uploadOverlay() {\n this.overlayUploader.click();\n }\n\n overlayFromText(file: File) {\n // Create a new FormData object.\n const formData = new FormData();\n formData.append(\"graphFile\", file);\n const request = new XMLHttpRequest();\n request.onreadystatechange = () => {\n if (\n request.readyState === XMLHttpRequest.DONE &&\n request.status === 200\n ) {\n const linesOfData = request.responseText.split(\"\\n\");\n if (linesOfData.length > 0) {\n const profileIdsFromFile = linesOfData[0].split(\"\\t\").slice(1);\n profileIdsFromFile.forEach(id =>\n this.addProfile({ profileId: id, enabled: true })\n );\n } else {\n console.log(\"Error: No valid data\");\n }\n this.editor.addGenomicData(request.responseText);\n }\n };\n request.open(\"POST\", \"/loadGraph\");\n request.send(formData);\n }\n\n @autobind\n upload() {\n if (this.editor.cy.elements().length > 0) {\n this.handleOpen(EModalType.CONFIRMATION);\n ConfirmationModal.pendingFunction = () => {\n this.uploader.click();\n };\n } else {\n this.uploader.click();\n }\n }\n\n @autobind\n merge() {\n this.merger.click();\n }\n\n setOverlayUploader(inputRef: any) {\n this.overlayUploader = inputRef;\n }\n\n @autobind\n setUploaders(inputRef: any, isMerge: boolean) {\n if (isMerge) this.merger = inputRef;\n else this.uploader = inputRef;\n }\n\n @computed\n get getPathwayInfo() {\n return this.fileManager.getPathwayInfo;\n }\n\n @autobind\n setPathwayInfo(other: IPathwayInfo) {\n this.fileManager.setPathwayInfo(other);\n }\n\n @autobind\n undo() {\n this.undoRedoManager.undo();\n }\n\n @autobind\n redo() {\n this.undoRedoManager.redo();\n }\n\n @autobind\n export(isSIFNX: boolean) {\n //this.editor.cy.remove('.eh-handle');\n this.eh.hide();\n this.fileManager.saveGraph(isSIFNX, this.editor);\n }\n\n @autobind\n resetUndoStack() {\n this.undoRedoManager.reset();\n }\n\n @autobind\n newPathway() {\n const commitNewPathway = () => {\n this.editor.removeAllElements();\n this.fileManager.setPathwayInfo({\n pathwayTitle: \"New Pathway\",\n pathwayDetails: \"\"\n });\n //this.removeAllData()\n this.resetUndoStack();\n this.pathwayHandler(\"Dummy\");\n };\n\n if (this.editor.cy.elements().length > 0) {\n this.handleOpen(EModalType.CONFIRMATION);\n ConfirmationModal.pendingFunction = commitNewPathway;\n } else {\n commitNewPathway();\n }\n }\n\n @autobind\n changePathway(pathwayName: string) {\n this.pathwayHandler(pathwayName);\n\n if (!this.isCBioPortal) {\n this.fileManager.setPathwayInfo({\n pathwayTitle: pathwayName,\n pathwayDetails: \"\",\n });\n // At the beginning changePathway is called editor is not ready hence removeData shall not be called\n if (this.editor) {\n //this.removeAllData()\n this.resetUndoStack();\n }\n }\n }\n\n @autobind\n highlightNeighbours() {\n this.editor.highlightNeighbors();\n }\n\n @autobind\n highlightSelected() {\n this.editor.highlightSelected();\n }\n\n @autobind\n validateGenes() {\n this.editor.validateGenes();\n }\n\n @autobind\n showAll() {\n this.editor.showAllNodes();\n }\n\n @autobind\n hideSelected() {\n this.editor.hideSelectedNodes();\n }\n\n @autobind\n deleteSelected() {\n const selectedEles = this.editor.cy.elements(\":selected\");\n this.editor.removeElement(selectedEles);\n }\n\n @autobind\n addEdge(edgeTypeIndex: number) {\n // @ts-ignore\n window.edgeAddingMode = edgeTypeIndex + 1;\n if (edgeTypeIndex === -1) {\n this.eh.disable();\n this.eh.hide();\n return;\n } else {\n // @ts-ignore\n this.eh.enable();\n }\n }\n\n @autobind\n changeNodeName(oldName: string, newName: string) {\n const cyNode = this.editor.cy.$('[name=\"' + oldName + '\"]')[0];\n this.editor.changeName(cyNode, newName);\n }\n\n @autobind\n addNode(nodeType) {\n const nodeData = {\n type: nodeType.toUpperCase(),\n name: \"New \" + nodeType,\n w: \"150\",\n h: \"52\"\n };\n const extent = this.editor.cy.extent();\n const posData = {\n x: (extent.x1 + extent.x2) / 2,\n y: (extent.y1 + extent.y2) / 2\n };\n\n this.editor.addNode(nodeData, posData);\n this.pathwayHandler(\"Additional Pathway\");\n }\n\n @autobind\n searchGene(geneName: string) {\n const selector = \"node[name @*= '\" + geneName + \"']\";\n const nodesContainingSearchedGene = this.editor.cy.filter(selector);\n let nodesToSelect = this.editor.cy.collection();\n nodesContainingSearchedGene.forEach(function(ele, index) {\n if (\n !ele.hasClass(\"highlightedNode\") &&\n !ele.hasClass(\"invalidGeneHighlight\")\n )\n nodesToSelect = nodesToSelect.union(ele);\n });\n this.editor.highlightBySearch(nodesToSelect);\n }\n\n @autobind\n removeAllData() {\n this.editor.removeGenomicData();\n this.clearProfiles();\n }\n\n @autobind\n removeAllHighlight() {\n this.editor.removeAllHighlight();\n }\n\n @autobind\n processFile(file: File, isMerge: boolean) {\n // Create a new FormData object.\n const formData = new FormData();\n formData.append(\"graphFile\", file);\n const request = new XMLHttpRequest();\n request.onreadystatechange = () => {\n if (request.readyState === XMLHttpRequest.DONE) {\n if (request.status === 200) {\n const pathwayData: IPathwayData = SaveLoadUtility.parseGraph(\n request.responseText,\n false\n );\n\n if (isMerge) {\n this.editor.mergeGraph(pathwayData.nodes, pathwayData.edges);\n const graphJSON = this.editor.cy.json();\n\n //TODO change file name maybe, probabyly not necessary ?\n // Pathway nodes and edges are now combination of both previous and new pathway.\n pathwayData.nodes = graphJSON.elements.nodes; //this.editor.cy.nodes().map((node) => ({data: node.data()}));\n pathwayData.edges = graphJSON.elements.edges; //this.editor.cy.edges().map((edge) => ({data: edge.data()}));\n pathwayData.title = \"Additional Pathway\";\n } else {\n this.editor.loadFile(pathwayData.nodes, pathwayData.edges);\n this.fileManager.setPathwayInfo({\n pathwayTitle: pathwayData.title,\n pathwayDetails: pathwayData.description\n });\n }\n\n this.pathwayHandler(pathwayData.title + \"_imported\");\n this.resetUndoStack();\n } else {\n console.error(\n \"Error processing file: \" +\n request.readyState +\n request.responseText\n );\n }\n }\n };\n request.open(\"POST\", \"/loadGraph\");\n request.send(formData);\n }\n\n @autobind\n saveAs(type: string) {\n if (type === \"SVG\") {\n this.fileManager.saveAsSVG(this.editor);\n } else if (type === \"PNG\") {\n this.fileManager.saveAsPNG(this.editor.cy);\n } else if (type === \"JPEG\") {\n this.fileManager.saveAsJPEG(this.editor.cy);\n }\n }\n\n @autobind\n editorHandler(\n editor,\n eh,\n undoRedoManager,\n viewOperationsManager: ViewOperationsManager,\n gridOptionsManager: GridOptionsManager\n ) {\n this.editor = editor;\n this.eh = eh;\n this.undoRedoManager = undoRedoManager;\n this.viewOperationsManager = viewOperationsManager;\n this.gridOptionsManager = gridOptionsManager;\n }\n\n @autobind\n loadSampleData() {\n const data =\n \"gene\\tlung\\tovarian\\tbreast\\ty\\n\" +\n \"PTEN\\t-7\\t-20\\t10\\t20\\n\" +\n \"NF1\\t-12\\t-4\\t30\\t20\\n\" +\n \"PIK3CA\\t18\\t40\\t-50\\t20\\n\" +\n \"KRAS\\t11\\t-5\\t0\\t20\\n\" +\n \"ZIYA\\t0\\t-2\\t0\\t20\\n\" +\n \"AKT1\\t3\\t30\\t-10\\t20\\n\" +\n \"AKT2\\t6\\t-3\\t20\\t20\\n\" +\n \"AKT3\\t6\\t-3\\t20\\t20\\n\" +\n \"\\n\";\n this.editor.addGenomicData(data);\n\n this.addProfile({ profileId: \"lung\", enabled: true });\n this.addProfile({ profileId: \"ovarian\", enabled: true });\n this.addProfile({ profileId: \"breast\", enabled: true });\n }\n\n @autobind\n performLayout() {\n this.editor.performLayout();\n }\n}\n","import { makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React from \"react\";\nimport { Button, ButtonGroup, ButtonToolbar, FormControl, FormGroup, Glyphicon, InputGroup, Navbar } from \"react-bootstrap\";\n// @ts-ignore\nimport aboutSvg from '../images/toolbar/about.svg';\n// @ts-ignore\nimport ahbSvg from '../images/toolbar/align/align-horizontal-bottom.svg';\n// @ts-ignore\nimport ahmSvg from '../images/toolbar/align/align-horizontal-middle.svg';\n// @ts-ignore\nimport ahtSvg from '../images/toolbar/align/align-horizontal-top.svg';\n// @ts-ignore\nimport avcSvg from '../images/toolbar/align/align-vertical-center.svg';\n// @ts-ignore\nimport avlSvg from '../images/toolbar/align/align-vertical-left.svg';\n// @ts-ignore\nimport avrSvg from '../images/toolbar/align/align-vertical-right.svg';\n// @ts-ignore\nimport deleteSvg from '../images/toolbar/delete-simple.svg';\n// @ts-ignore\nimport gridSvg from '../images/toolbar/grid.svg';\n// @ts-ignore\nimport guideSvg from '../images/toolbar/guidelines.svg';\n// @ts-ignore\nimport hideSvg from '../images/toolbar/hide-selected.svg';\n// @ts-ignore\nimport layoutSvg from '../images/toolbar/layout-cose.svg';\n// @ts-ignore\nimport layoutPropSvg from '../images/toolbar/layout-properties.svg';\n// @ts-ignore\nimport loadSvg from '../images/toolbar/load.svg';\n// @ts-ignore\nimport newSvg from '../images/toolbar/new.svg';\n// @ts-ignore\nimport portalSvg from '../images/toolbar/portal.svg';\n// @ts-ignore\nimport helpSvg from '../images/toolbar/quick-help.svg';\n// @ts-ignore\nimport redoSvg from '../images/toolbar/redo.svg';\n// @ts-ignore\nimport saveSvg from '../images/toolbar/save.svg';\n// @ts-ignore\nimport setingsSvg from '../images/toolbar/settings.svg';\n// @ts-ignore\nimport showSvg from '../images/toolbar/show-all.svg';\n// @ts-ignore\nimport undoSvg from '../images/toolbar/undo.svg';\nimport { EGridType } from \"../modals/GridSettings\";\nimport PathwayActions from \"../utils/PathwayActions\";\nimport { EModalType } from \"./react-pathway-mapper\";\n\n\ninterface IButtonbarProps {\n pathwayActions: PathwayActions;\n handleOpen: (modelId: EModalType) => void;\n}\n\ninterface ISVGFunction{\n svg: any;\n function: () => void;\n tooltip: string; \n isFocused?: boolean;\n}\n\n\n@observer\nexport default class Buttonbar extends React.Component{\n\n\n @observable\n private searchedGene: string;\n\n\n constructor(props: IButtonbarProps) {\n super(props);\n makeObservable(this);\n \n this.searchedGene = \"\";\n this.props.pathwayActions.enabledType = EGridType.NONE;\n }\n\n setEnabledType(newType: EGridType){\n if(newType === this.props.pathwayActions.enabledType){\n this.props.pathwayActions.enabledType = EGridType.NONE;\n } else {\n this.props.pathwayActions.enabledType = newType;\n }\n\n // Enabled type calculated\n\n if(this.props.pathwayActions.enabledType === EGridType.GRID){\n this.props.pathwayActions.toggleGrid(true);\n }\n else if(this.props.pathwayActions.enabledType === EGridType.GUIDE){\n this.props.pathwayActions.toggleGuide(true);\n } else {\n this.props.pathwayActions.toggleGrid(false); // This will disable both.\n }\n }\n render() {\n \n const fileFunctions: ISVGFunction[] = [\n {svg: newSvg, function: this.props.pathwayActions.newPathway, tooltip: \"New Pathway\"},\n {svg: loadSvg, function: this.props.pathwayActions.upload, tooltip: \"Import Pathway\" },\n {svg: saveSvg, function: () => {this.props.pathwayActions.export(false)}, tooltip: \"Export Pathway\"}];\n \n const modFunctions: ISVGFunction[] = [\n {svg: deleteSvg, function: this.props.pathwayActions.deleteSelected, tooltip: \"Delete Selected\"}];\n\n if(!this.props.pathwayActions.isCollaborative){\n modFunctions.push({svg: undoSvg, function: () => {this.props.pathwayActions.undo();}, tooltip: \"Undo\"},\n {svg: redoSvg, function: () => {this.props.pathwayActions.redo();}, tooltip: \"Redo\"});\n }\n const alignFunctions: ISVGFunction[] = [\n {svg: ahtSvg, function: () => {this.props.pathwayActions.align(\"hTop\");}, tooltip: \"Align Horizontal Top\"},\n {svg: ahmSvg, function: () => {this.props.pathwayActions.align(\"hMid\");}, tooltip: \"Align Horizontal Middle\"},\n {svg: ahbSvg, function: () => {this.props.pathwayActions.align(\"hBot\");}, tooltip: \"Align Horizontal Bottom\"},\n {svg: avlSvg, function: () => {this.props.pathwayActions.align(\"vLeft\");}, tooltip: \"Align Vertical Left\"},\n {svg: avcSvg, function: () => {this.props.pathwayActions.align(\"vCen\");}, tooltip: \"Align Vertical Center\"},\n {svg: avrSvg, function: () => {this.props.pathwayActions.align(\"vRight\");}, tooltip: \"Align Vertical Right\"}];\n \n const utilFunctions: ISVGFunction[] = [\n {isFocused: this.props.pathwayActions.enabledType === EGridType.GRID, svg: gridSvg, function: () => {this.setEnabledType(EGridType.GRID);}, tooltip: \"Enable Grid: Show and snap to grid\"},\n {isFocused: this.props.pathwayActions.enabledType === EGridType.GUIDE, svg: guideSvg, function: () => {this.setEnabledType(EGridType.GUIDE);}, tooltip: \"Enable Guidelines: Enable and snap to alignment guidelines\"}];\n\n const visibilityFunctions: ISVGFunction[] = [\n {svg: hideSvg, function: () => {this.props.pathwayActions.hideSelected();}, tooltip: \"Hide Selected\"},\n {svg: showSvg, function: () => {this.props.pathwayActions.showAll();}, tooltip: \"Show All\"}];\n\n const layoutFunctions: ISVGFunction[] = [\n {svg: layoutSvg, function: () => {this.props.pathwayActions.performLayout();}, tooltip: \"Perform Layout\"},\n {svg: layoutPropSvg, function: () => {this.props.handleOpen(EModalType.LAYOUT);}, tooltip: \"Layout Properties\"}];\n\n const portalFunctions: ISVGFunction[] = [\n {svg: portalSvg, function: () => {this.props.handleOpen(EModalType.STUDY);}, tooltip: \"Fetch Genomic Data From cBioPortal\"},\n {svg: setingsSvg, function: () => {this.props.handleOpen(EModalType.PROFILES);}, tooltip: \"Genomic Data Visibility Settings\"}];\n\n const infoFunctions: ISVGFunction[] = [\n {svg: helpSvg, function: () => {this.props.handleOpen(EModalType.HELP);}, tooltip: \"Quick Help\"},\n {svg: aboutSvg, function: () => {this.props.handleOpen(EModalType.ABOUT);}, tooltip: \"About\"}];\n \n const allFunctions = [fileFunctions, modFunctions, alignFunctions, utilFunctions, visibilityFunctions, portalFunctions, layoutFunctions, infoFunctions];\n\n \n return (\n \n \n { allFunctions.map((functions, index) =>\n \n { functions.map((svg: ISVGFunction, index) => \n (\n )\n )\n }\n )\n }\n \n \n \n { this.searchedGene = e.target.value;}}\n placeholder=\"Search Genes...\"\n onKeyPress={(e: any) => { if (e.key !== \"Enter\") return; this.props.pathwayActions.searchGene(this.searchedGene) }} />\n {this.props.pathwayActions.searchGene(this.searchedGene)}}\n style={{cursor: 'pointer'}}\n >\n \n \n \n \n \n \n \n )\n }\n\n}\n","import { EModalType } from \"../ui/react-pathway-mapper\";\nimport EditorActionsManager from \"./EditorActionsManager\";\n\nexport default class ContextMenuManager {\n private cy: any;\n private editor: EditorActionsManager;\n private handleOpen: (modalId: EModalType) => void;\n private undoRedoManager: any;\n private isCollaborative: any;\n constructor(cy: any, editor: EditorActionsManager,\n handleOpen: (modalId: EModalType) => void, undoRedoManager: any,\n isCollaborative: boolean){\n this.cy = cy;\n this.editor = editor;\n this.handleOpen = handleOpen;\n this.undoRedoManager = undoRedoManager;\n this.isCollaborative = isCollaborative;\n this.init();\n }\n\n init() {\n const classRef = this;\n\n const ctxMenus = this.cy.scratch('cycontextmenus') ? \n this.cy.contextMenus('get') :\n this.cy.contextMenus();\n\n let menuItems = [\n {\n id: 'deleteSelected',\n content: 'Delete Selected',\n coreAsWell: true,\n onClickFunction: () => {\n const selectedEles = this.cy.elements(':selected');\n classRef.editor.removeElement(selectedEles);\n },\n disabled: false, \n hasTrailingDivider: false,\n },\n {\n id: 'hideSelected',\n content: 'Hide Selected',\n coreAsWell: true,\n onClickFunction: function () {\n classRef.editor.hideSelectedNodes();\n },\n disabled: false,\n hasTrailingDivider: false, \n },\n {\n id: 'loadFromCBioPortal',\n content: 'Load From cBioPortal...', \n coreAsWell: true,\n onClickFunction: () => {\n this.handleOpen(EModalType.STUDY);\n },\n disabled: false,\n hasTrailingDivider: false,\n },\n //Context menu items when clicking on nodes/compounds\n {\n id: 'remove', \n content: 'Delete', \n selector: 'node, edge',\n onClickFunction: function (event) {\n var ele = event.target;\n // The function to be executed on click\n var selectedElements = classRef.cy.nodes(':selected').union(ele);\n classRef.editor.removeElement(selectedElements);\n },\n disabled: false,\n hasTrailingDivider: false, \n coreAsWell: false \n },\n {\n id: 'addSelected',\n content: 'Add Selected Into This', \n selector: 'node',\n onClickFunction: function (event)\n {\n var ele = event.target;\n var selectedNodes = classRef.cy.nodes(':selected');\n var containerType = ele.data('type');\n var validNodes = classRef.cy.collection();\n\n //Do nothing if node is GENE\n if (ele._private.data['type'] === 'GENE' || selectedNodes.size() < 1) {\n return;\n }\n //Prevent actions like adding root node to children & addition to itself\n else\n {\n var notValid = false;\n selectedNodes.forEach(function (tmpNode, i)\n {\n if (ele.id() == tmpNode.id()) {\n notValid = true;\n return false;\n }\n\n if (tmpNode.isParent()) {\n notValid = classRef.isChildren(tmpNode, ele);\n if (notValid) {\n return false;\n }\n }\n\n return true;\n });\n\n if (notValid) {\n return;\n }\n }\n\n\n selectedNodes.forEach(function (tmpNode, i)\n {\n\n if(containerType == \"FAMILY\" || containerType == \"COMPLEX\")\n {\n if(tmpNode.data('type') != \"COMPARTMENT\" && tmpNode.data('type') != \"PROCESS\")\n {\n validNodes = validNodes.add(tmpNode);\n }\n }\n else\n {\n validNodes = validNodes.add(tmpNode);\n }\n\n });\n\n var compId = ele.id();\n classRef.editor.changeParents(validNodes, compId);\n //Unselecting nodes to remove them from selectedNodeStack\n selectedNodes.unselect();\n\n },\n disabled: false,\n hasTrailingDivider: false, \n coreAsWell: false \n },\n {\n id: 'removeSelected',\n content: 'Remove Selected From Parent', \n selector: 'node',\n onClickFunction: function (event) {\n const ele = event.target;\n const selectedNodes = classRef.cy.nodes(':selected');\n\n let notValid = false;\n selectedNodes.forEach(function (tmpNode, i) {\n\n if (tmpNode.isParent()) {\n notValid = classRef.isChildren(tmpNode, ele);\n if (notValid) {\n return false;\n }\n }\n\n return true;\n });\n\n if (notValid) {\n return;\n }\n\n classRef.editor.changeParents(selectedNodes, null);\n //Unselecting nodes to remove them from selectedNodeStack\n selectedNodes.unselect();\n },\n disabled: false, \n hasTrailingDivider: false,\n coreAsWell: false \n },\n {\n id: 'performLayout', \n content: 'Perform Layout', \n coreAsWell: true,\n onClickFunction: () => {\n this.editor.performLayout();\n },\n disabled: false, \n hasTrailingDivider: false, \n }\n\n ];\n let nonCollabItems = [ \n //Context menu items when clicking on blank space\n {\n id: 'undoAction', \n content: 'Undo', \n coreAsWell: true,\n onClickFunction: () => {\n this.undoRedoManager.undo();\n },\n disabled: false, \n hasTrailingDivider: false, \n },\n {\n id: 'redoAction',\n content: 'Redo',\n coreAsWell: true,\n onClickFunction: () => {\n this.undoRedoManager.redo();\n },\n disabled: false,\n hasTrailingDivider: false,\n }\n ];\n\n if(!this.isCollaborative){\n menuItems = menuItems.concat(nonCollabItems);\n }\n ctxMenus.appendMenuItems(menuItems);\n }\n\n //TODO better move this to another class\n //Utility function to check whether query node is children of given node\n isChildren(node, queryNode)\n {\n var parent = queryNode.parent()[0];\n while(parent)\n {\n if (parent.id() == node.id()) {\n return true;\n }\n parent = parent.parent()[0];\n }\n return false;\n }\n}\n","import tippy from 'tippy.js';\nimport 'tippy.js/dist/tippy.css'; // optional for styling\nimport EditorActionsManager from \"./EditorActionsManager\";\nexport default class QtipManager{\n private cy: any;\n private editor: any;\n constructor(cy: any, editor: EditorActionsManager)\n {\n this.cy = cy;\n this.editor = editor;\n }\n\n generateEdgeQtip(edge) {\n const self = this;\n const pubmedURL = 'https://www.ncbi.nlm.nih.gov/pubmed/';\n const pubmedData = edge.data('pubmedIDs');\n\n const wrapper = document.createElement('div');\n\n // header\n const header = document.createElement('div');\n header.classList.add('row', 'node-tooltip-header');\n header.innerHTML = \"INTERACTION DETAILS\";\n\n wrapper.append(header);\n\n // edge label input\n const textInputWrapper = document.createElement('div');\n textInputWrapper.classList.add('col-xs-6', 'inputCol');\n\n const inputElement = document.createElement('input');\n inputElement.type = 'text';\n inputElement.value = edge.data('name');\n inputElement.classList.add('form-control');\n\n inputElement.addEventListener(\"change\", function(event) {\n // @ts-ignore\n const value = event.target.value;\n self.editor.changeName(edge, value);\n });\n\n textInputWrapper.appendChild(inputElement);\n\n const edgeLabelRowElement = document.createElement('div');\n edgeLabelRowElement.classList.add('row', 'geneDetails');\n const colElement = document.createElement('div');\n colElement.classList.add('col-xs-6', 'qtipLabel');\n colElement.innerHTML = \"Label:\";\n\n edgeLabelRowElement.appendChild(colElement);\n edgeLabelRowElement.appendChild(textInputWrapper);\n\n wrapper.appendChild(edgeLabelRowElement);\n \n wrapper.appendChild(document.createElement('hr'));\n\n // pubmed id input\n const pubmedTextInputWrapper = document.createElement('div');\n pubmedTextInputWrapper.classList.add('col-xs-6', 'inputCol');\n\n const pubmedIdInputElement = document.createElement('input');\n pubmedIdInputElement.type = 'text';\n pubmedIdInputElement.classList.add('form-control');\n\n pubmedIdInputElement.addEventListener(\"change\", function(event) {\n // @ts-ignore\n const value = event.target.value;\n const pubmedIdsToAdd = value.split(';');\n \n // @ts-ignore\n event.target.value = \"\";\n\n self.editor.addPubmedIDs(edge, pubmedIdsToAdd);\n\n const pubmedIds = edge.data(\"pubmedIDs\")\n generatePubmedLinks(pubmedIds);\n });\n\n pubmedTextInputWrapper.appendChild(pubmedIdInputElement);\n\n const pubmedIdRowElement = document.createElement('div');\n pubmedIdRowElement.classList.add('row', 'geneDetails');\n const pubmedIdColElement = document.createElement('div');\n pubmedIdColElement.classList.add('col-xs-6', 'qtipLabel');\n pubmedIdColElement.innerHTML = \"Add Pubmed ID(s):\";\n\n pubmedIdRowElement.appendChild(pubmedIdColElement);\n pubmedIdRowElement.appendChild(pubmedTextInputWrapper);\n\n wrapper.appendChild(pubmedIdRowElement);\n\n if (pubmedData.length > 0) {\n generatePubmedLinks(pubmedData);\n }\n\n function generatePubmedLinks(argData) {\n if (document.getElementsByClassName(\"pubmedIDList\").length > 0) {\n document.getElementsByClassName(\"pubmedIDList\").item(0).remove();\n }\n const pubmedIdListWrapper = document.createElement('div');\n pubmedIdListWrapper.classList.add(\"pubmedIDList\");\n\n pubmedIdListWrapper.appendChild(document.createElement('hr'));\n\n const pubmedIdLabel = document.createElement('label');\n pubmedIdLabel.classList.add(\"col-xs-12\", \"pubmedIDLabel\");\n pubmedIdLabel.innerHTML = \"Pubmed IDs\";\n\n pubmedIdListWrapper.appendChild(pubmedIdLabel);\n\n for (var key in argData)\n {\n if(!argData.hasOwnProperty(key)){\n continue;\n }\n const pubmedId = argData[key];\n\n if (isNaN(pubmedId))\n continue;\n\n const pubmedIdListElement = document.createElement('div');\n\n const pubmedIdRemoveButton = document.createElement('i');\n pubmedIdRemoveButton.classList.add('fa', 'fa-times', 'qtipRemovePmedID');\n pubmedIdRemoveButton.setAttribute('aria-hidden', 'true');\n pubmedIdRemoveButton.setAttribute('pubmedId', pubmedId);\n\n pubmedIdRemoveButton.addEventListener(\"click\", function(event) {\n (event.target as HTMLElement).parentElement.remove();\n const pubmedId = (event.target as HTMLElement).getAttribute('pubmedId');\n self.editor.removePubmedID(edge, [pubmedId]);\n const pubmedIds = edge.data('pubmedIDs');\n if (pubmedIds.length === 0) {\n document.getElementsByClassName(\"pubmedIDList\").item(0).remove();\n }\n });\n \n const pubmedContent = document.createElement('div');\n const pubmedIdLabel = document.createElement('label');\n const pubmedIdLink = document.createElement('a');\n pubmedIdLink.setAttribute('target', '_blank');\n const pubmedLink = pubmedURL + pubmedId;\n pubmedIdLink.setAttribute('href', pubmedLink);\n pubmedIdLink.innerHTML = pubmedId.toString();\n\n pubmedIdLabel.appendChild(pubmedIdLink);\n pubmedContent.appendChild(pubmedIdLabel);\n pubmedContent.appendChild(pubmedIdRemoveButton);\n pubmedIdListElement.appendChild(pubmedContent);\n\n pubmedIdListWrapper.appendChild(pubmedIdListElement);\n }\n if (edge.data('pubmedIDs').length > 0) {\n wrapper.appendChild(pubmedIdListWrapper);\n }\n }\n\n wrapper.classList.add(\"tooltip-text-style\");\n return wrapper;\n }\n\n generateNodeQtip(node) {\n const self = this;\n\n const header = document.createElement('div');\n header.classList.add('row', 'node-tooltip-header');\n header.innerHTML = node.data('type').toUpperCase() + \" DETAILS\";\n\n const textInputWrapper = document.createElement('div');\n textInputWrapper.classList.add('col-xs-8', 'inputCol');\n\n const inputElement = document.createElement('input');\n inputElement.type = 'text';\n inputElement.value = node.data('name');\n inputElement.classList.add('form-control');\n\n inputElement.addEventListener(\"change\", function(event) {\n // @ts-ignore\n const value = event.target.value;\n self.editor.changeName(node, value);\n });\n\n textInputWrapper.appendChild(inputElement);\n\n const wrapper = document.createElement('div');\n const rowElement = document.createElement('div');\n rowElement.classList.add('row', 'geneDetails');\n const colElement = document.createElement('div');\n colElement.classList.add('col-xs-4', 'qtipLabel');\n colElement.innerHTML = \"Name:\";\n\n rowElement.appendChild(colElement);\n rowElement.appendChild(textInputWrapper);\n\n wrapper.append(header);\n wrapper.append(rowElement);\n\n if (node.data('type') === \"GENE\") {\n const buttonWrapper = document.createElement('div');\n buttonWrapper.classList.add('row', 'centerText', 'geneDetails');\n \n const button = document.createElement('button');\n button.type = 'button';\n button.classList.add('btn', 'btn-default');\n button.innerHTML = \"My Cancer Genome\";\n button.addEventListener(\"click\", function (event) {\n event.preventDefault();\n const name = node.data('name');\n window.open(\"https://www.mycancergenome.org/content/gene/\" + name);\n })\n\n buttonWrapper.append(button);\n wrapper.append(buttonWrapper)\n }\n\n wrapper.classList.add(\"tooltip-text-style\");\n return wrapper;\n }\n\n addQtipToElements(eles)\n {\n const self = this;\n eles.forEach(function(ele)\n {\n let ref = ele.popperRef();\n let dummyDomEle = document.createElement('div');\n document.body.appendChild(dummyDomEle);\n let tip = tippy(dummyDomEle, { // tippy props:\n getReferenceClientRect: ref.getBoundingClientRect, // https://atomiks.github.io/tippyjs/v6/all-props/#getreferenceclientrect\n trigger: 'manual', // mandatory, we cause the tippy to show programmatically.\n placement: 'bottom',\n interactive: true,\n theme: 'pathwaymapper',\n // your own custom props\n // content prop can be used when the target is a single element https://atomiks.github.io/tippyjs/v6/constructor/#prop\n content: () => {\n let content = ele.isNode() ? \n self.generateNodeQtip(ele) :\n self.generateEdgeQtip(ele);\n \n return content;\n },\n onHidden(instance) {\n instance.destroy();\n dummyDomEle.remove();\n }\n });\n \n self.cy.one(\"pan zoom\", function() {\n if (dummyDomEle && dummyDomEle[\"_tippy\"]) {\n tip.hide();\n }\n });\n\n ele.one(\"showqtipevent\", function() {\n tip.show();\n });\n });\n }\n\n\n //Utility Functions\n capitalizeFirstLetter(string)\n {\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n\n}\n","import cytoscape from 'cytoscape';\nimport $ from \"jquery\";\nimport 'jquery-ui-dist/jquery-ui';\nimport EditorActionsManager from \"../managers/EditorActionsManager\";\n\n\nexport default class DragDropNodeAddPlugin {\n\n\n\n pathwayHandler: (pathwayName: string) => void;\n\n private cy: any;\n private editor: EditorActionsManager;\n\n constructor(editor: EditorActionsManager, cy: any, pathwayHandler: (pathwayName: string) => void)\n {\n this.editor = editor;\n this.cy = cy;\n this.pathwayHandler = pathwayHandler;\n this.initNodeAdd();\n }\n\n //TODO JQUERY IS IGNORED\n initNodeAdd()\n {\n var nodeAddClass = this;\n var defaults = {\n height: 30, //height of the icon container\n width: 30, //width of the icon container\n padding: 5, //padding of the icon container(from right & top)\n backgroundColorDiv: '#fbfbfb', //background color of the icon container\n borderColorDiv: '#fff', //border color of the icon container\n borderWidthDiv: '0px', //border width of the icon container\n borderRadiusDiv: '5px', //border radius of the icon container\n\n icon: '', //icon class name\n\n nodeParams: function(){\n // return element object to be passed to cy.add() for adding node\n return {};\n }\n };\n\n const self = this;\n\n // @ts-ignore\n $.fn.cytoscapeNodeadd = function(params: any) {\n var options = $.extend(true, {}, defaults, params);\n var fn = params;\n\n var functions = {\n destroy: function() {\n var $this = $(this);\n\n $this.find(\".ui-cytoscape-nodeadd\").remove();\n },\n init: function()\n {\n return $(this).each(function()\n {\n var components = options.components;\n for (const component of components)\n {\n var dragContainer = component.container;\n //var explanationText = component.explanationText;\n\n var $nodeadd = $('
');\n dragContainer.append($nodeadd);\n var $nodeDragHandle = $('
\\\n \\\n \\\n \\\n
');\n $nodeadd.append($nodeDragHandle);\n\n $nodeDragHandle.bind(\"mousedown\", function(e: any)\n {\n e.stopPropagation(); // don't trigger dragging of nodeadd\n e.preventDefault(); // don't cause text selection\n });\n\n //Setup UI\n dragContainer.find(\".ui-cytoscape-nodeadd-nodediv\").css({\n background: options.backgroundColorDiv,\n border: options.borderWidthDiv + ' solid ' + options.borderColorDiv,\n 'border-radius': options.borderRadiusDiv\n });\n\n //Init Draggable\n dragContainer.find(\"#ui-cytoscape-nodeadd-icon\").draggable({\n helper: \"clone\",\n cursor: \"pointer\"\n });\n }\n\n // @ts-ignore TODO: AMENDMENT ATTENTION\n var $container = $(this);\n //Init Droppable\n // @ts-ignore TODO: Droppable is ignored\n $container.droppable({\n activeClass: \"ui-state-highlight\",\n // accept: \"#ui-cytoscape-nodeadd-icon\",\n drop: function(event: any, ui: any) {\n $container.removeClass(\"ui-state-highlight\");\n\n var currentOffset = $container.offset();\n var relX = event.pageX - currentOffset.left;\n var relY = event.pageY - currentOffset.top;\n\n var nodeType = $(ui.helper).attr('nodeType').toUpperCase();\n\n var cy = nodeAddClass.cy;\n\n //Hold a map for parents and candidate parent nodes for this addition\n var nodeMap = {};\n var parentMap = {};\n //Loop through nodes for hit testing about drag position on canvas\n cy.nodes().forEach(function(node: any)\n {\n var nodeBbox = node.renderedBoundingBox();\n //Rectangle point test\n if ( (relX <= nodeBbox.x2 && relX >= nodeBbox.x1) && (relY <= nodeBbox.y2 && relY >= nodeBbox.y1) && node.data().type != 'GENE' )\n {\n //If node has a children put an entry to the parentMap\n if (node.children().length > 0)\n {\n parentMap[node.id()] = true;\n }\n\n //If parent of this node is already added to the node map remove it, since our candidate is in deeper level !\n if (parentMap[node._private.data.parent])\n {\n delete nodeMap[node._private.data.parent];\n }\n\n //Add an entry to node map\n nodeMap[node.id()] = node;\n }\n });\n\n //Check if any parent found, if so set parent field\n var parent = nodeMap[Object.keys(nodeMap)[0]];\n var nodeData = {w: \"0\", h: \"100\", parent: 0, type: nodeType, name:'New '+ $(ui.helper).attr('nodeType')};\n if (parent)\n {\n if(parent.data().type == \"FAMILY\" || parent.data().type == \"COMPLEX\")\n {\n if(nodeType != \"COMPARTMENT\" && nodeType != \"PROCESS\")\n {\n nodeData.parent = parent.id();\n }\n }\n else\n {\n nodeData.parent = parent.id();\n }\n }\n if (nodeType === \"PROCESS\") {\n nodeData.w = \"100\";\n nodeData.h = \"35\";\n }\n else {\n nodeData.w = \"150\";\n nodeData.h = \"52\";\n }\n\n //Adjust position according to the zoom level and pan !\n //To set rendered position !!!\n //TODO refactor this !\n relX = relX / cy.zoom() + cy.extent().x1;\n relY = relY / cy.zoom() + cy.extent().y1;\n nodeAddClass.editor.addNode(nodeData,{x: relX,y: relY});\n self.pathwayHandler(\"Additional Pathway\");\n\n }\n });\n\n });\n }\n };\n\n if (functions[fn]) {\n return functions[fn].apply(this, Array.prototype.slice.call(arguments, 1));\n } else if (typeof fn == 'object' || !fn) {\n return functions.init.apply(this, arguments);\n } else {\n $.error(\"No such function `\" + fn + \"` for jquery.cytoscapenodeadd\");\n }\n\n return $(this);\n };\n\n // @ts-ignore\n $.fn.cynodeadd = $.fn.cytoscapeNodeadd;\n try{\n /* Adding as an extension to the core functionality of cytoscape.js*/\n cytoscape('core', 'nodeadd', function(options: any) {\n\n // @ts-ignore\n $(this.container()).cytoscapeNodeadd(options);\n });\n } catch(err){\n console.log(err);\n }\n }\n\n\n\n\n}\n","import autobind from \"autobind-decorator\";\nimport cytoscape from 'cytoscape';\nimport $ from \"jquery\";\nimport { observer } from \"mobx-react\";\nimport React from 'react';\nimport pathways from \"../data/pathways.json\";\n// @ts-ignore\nimport compartmentImg from \"../images/nodes/compartment.svg\";\n// @ts-ignore\nimport complexImg from \"../images/nodes/complex.svg\";\n// @ts-ignore\nimport familyImg from \"../images/nodes/family.svg\";\n// @ts-ignore\nimport geneImg from \"../images/nodes/gene.svg\";\n// @ts-ignore\nimport processImg from \"../images/nodes/process.svg\";\n// @ts-ignore\nimport resizeCue from '../images/resizeCue.svg';\nimport ContextMenuManager from \"../managers/ContextMenuManager\";\nimport EditorActionsManager from \"../managers/EditorActionsManager\";\nimport QtipManager from \"../managers/QtipManager\";\nimport ShareDBManager from \"../managers/ShareDBManager\";\nimport ViewOperationsManager from \"../managers/ViewOperationsManager\";\nimport CBioPortalAccessor from \"../utils/CBioPortalAccessor\";\nimport DragDropNodeAddPlugin from \"../utils/DragDropNodeAddPlugin\";\nimport SaveLoadUtility from \"../utils/SaveLoadUtility\";\nimport { EModalType, IColorValueMap, IProfileMetaData } from './react-pathway-mapper';\n\n// @ts-ignore\nwindow.$ = $;\n\nconst edgeHandles = require('cytoscape-edgehandles');\nconst edgeEditing = require('cytoscape-edge-editing');\nconst fcose = require('cytoscape-fcose');\nconst nodeEditing = require('cytoscape-node-editing');\nconst undoRedo = require('cytoscape-undo-redo');\nconst panzoom = require('cytoscape-panzoom');\nconst styleSheet = require('../utils/GraphStyleSheet.tsx');\nconst panzoomOpts = require('../utils/PanzoomOptions.tsx');\nconst navigator = require('cytoscape-navigator');\nconst contextMenus = require('cytoscape-context-menus');\nconst konva = require('konva');\nconst viewUtilities = require('cytoscape-view-utilities');\nconst gridGuide = require('cytoscape-grid-guide');\nconst popper = require('cytoscape-popper');\nconst layoutUtilities = require('cytoscape-layout-utilities');\n\ntype PathwayMapperType = {\n isCollaborative: boolean;\n isCbioPortal: boolean;\n editorHandler: Function;\n selectedPathway: string;\n setActiveEdge: Function;\n profiles: IProfileMetaData[];\n pathwayHandler: (pathwayName: string) => void;\n handleOpen: (modalId: EModalType) => void;\n onPathwayChangeCompleted: () => void;\n genomicDataOverlayColorScheme: IColorValueMap;\n colorSchemeChangeCallback: (IColorValueMap) => void;\n};\n@observer\nexport default class CytoscapeArea extends React.Component{\n private cy:any;\n private cyDiv: HTMLDivElement | undefined;\n private editor: EditorActionsManager;\n private edgeAddingMode: any;\n private viewOperationsManager: ViewOperationsManager;\n private qtipManager: QtipManager;\n private genomicDataExplorerView: any;\n private pathwayDetailsView: any;\n private viewUtilities: any;\n private isCollaborative: boolean;\n private isCbioPortal: boolean;\n private shareDBManager: ShareDBManager;\n private cxtMenuManager: ContextMenuManager;\n private dragDropNodeAddManager: DragDropNodeAddPlugin;\n private undoRedoManager: any;\n private portalAccessor: CBioPortalAccessor;\n private isMountedFirst = true;\n private eh: any;\n private lastSelectedEdge: any;\n\n\n constructor (props: PathwayMapperType) {\n super(props);\n this.isCollaborative = props.isCollaborative;\n this.edgeAddingMode = 0;\n this.isCbioPortal = props.isCbioPortal;\n }\n\n componentWillUpdate(nextProps: PathwayMapperType) {\n\n if (this.props.selectedPathway !== nextProps.selectedPathway) {\n this.getPathway(nextProps.selectedPathway);\n }\n \n }\n\n componentDidUpdate(prevProps: PathwayMapperType) {\n if (this.isCbioPortal && \n prevProps.selectedPathway !== this.props.selectedPathway) {\n this.props.onPathwayChangeCompleted();\n }\n }\n\n // This method only opens pathways that are available in pathway.json. Namely, imported or merged pathways are not opened via this method.\n // Yet, they individually call parsing method.\n getPathway(selectedPathway: string){\n\n if(!selectedPathway || selectedPathway === '') return;\n\n const data = pathways[selectedPathway];\n\n // It might be non-existent due to pathway being created using collaborative mode, or pathway loaded elsewhere (import vs.)\n if(!data){ \n return;\n }\n // TODO Problematic const data = pathways[\"../samples/BLCA-2014-RTK-RAS-PI(3)K-pathway.txt\"];\n\n const parsedGraph = SaveLoadUtility.parseGraph(data, true);\n\n\n const allEles = parsedGraph;\n this.editor.loadFile(allEles.nodes, allEles.edges);\n }\n\n render(){\n return (
\n
\n
\n
);\n }\n\n componentDidMount(): void {\n if(this.isMountedFirst){\n this.init();\n this.isMountedFirst = false;\n }\n this.getPathway(this.props.selectedPathway);\n }\n\n @autobind\n cyDivHandler(div:HTMLDivElement){\n this.cyDiv = div;\n }\n\n init(){\n\n // Create portal accessor\n this.portalAccessor = new CBioPortalAccessor();\n\n // Initializes cytoscape\n this.initCyJS();\n // Initialize cytoscape based handlers here\n this.initCyHandlers();\n this.initKeyboardHandlers();\n this.initUndoRedoFunctionality();\n this.initCBioPortalFunctionalities();\n this.placePanzoomAndOverlay();\n\n //this.appManager = this;\n }\n\n placePanzoomAndOverlay(){\n //TODO place navigator !!!\n var offset = 5;\n // @ts-ignore\n var topCy = $(this.cyDiv).offset().top;\n //var bottomCy = $('.cyContainer').offset().bottom;\n // @ts-ignore\n var leftCy = $(this.cyDiv).offset().left;\n //var rightCy = $('.cyContainer').offset().right;\n // @ts-ignore\n var heightCy = $(this.cyDiv).outerHeight();\n // @ts-ignore\n var widthCy = $(this.cyDiv).outerWidth();\n var heightNavigator = $('.cytoscape-navigator-wrapper').outerHeight();\n var widthNavigator = $('.cytoscape-navigator-wrapper').outerWidth();\n\n if(!this.isCbioPortal) {\n \n $('.cytoscape-navigator-wrapper').css('top', heightCy + topCy - heightNavigator - offset + 16);\n $('.cytoscape-navigator-wrapper').css('left', widthCy + leftCy - widthNavigator - offset + 24 - 0.5 + 0.35);\n }\n else {\n $('.cytoscape-navigator-wrapper').css('bottom', 10.5);\n $('.cytoscape-navigator-wrapper').css('right', 0);\n }\n $('.cytoscape-navigator-wrapper').css('z-index', 1039);\n\n //Relative is used so that its position depends on the below properties\n $('.cy-panzoom').css('position', 'relative');\n $('.cy-panzoom').css('top', 2);\n $('.cy-panzoom').css('left', widthCy - 51);\n $('.cy-panzoom').css('z-index', 1039);\n //Makes the width of panzoom container to 0\n $('.cy-panzoom').css('width', 200);\n }\n\n getPathwayData() {\n return this.pathwayDetailsView.getPathwayData();\n }\n\n initCyJS() {\n \n try {\n panzoom(cytoscape, $); // register extension\n } catch(err){\n console.log(err);\n }\n try { \n navigator(cytoscape); // register extension\n } catch(err){\n console.log(err);\n }\n try { \n gridGuide(cytoscape, $); // register extension\n } catch(err){\n console.log(err);\n }\n try { \n undoRedo(cytoscape); // register extension\n } catch(err){\n console.log(err);\n }\n try { \n contextMenus(cytoscape, $); // register extension\n } catch(err){\n console.log(err);\n }\n try { \n nodeEditing(cytoscape, $, konva); // register extension\n } catch(err){\n console.log(err);\n }\n try { \n edgeEditing(cytoscape, $, konva); // register extension\n } catch(err){\n console.log(err);\n }\n try { \n viewUtilities(cytoscape, $); // register extension\n } catch(err){\n console.log(err);\n }\n try { \n edgeHandles(cytoscape, $);\n } catch(err){\n console.log(err);\n }\n try {\n popper(cytoscape);\n } catch (err) {\n console.log(err);\n }\n try {\n fcose(cytoscape);\n } catch (err) {\n console.log(err);\n }\n try {\n layoutUtilities(cytoscape);\n } catch (err) {\n console.log(err);\n }\n\n this.cy = cytoscape({\n container: this.cyDiv,\n boxSelectionEnabled: true,\n autounselectify: false,\n wheelSensitivity: 0.1,\n style: styleSheet,\n textureOnViewport: false,\n motionBlur: true,\n layout: {name: 'preset'}\n });\n\n this.edgeAddingMode = 0;\n // var allEles = SaveLoadUtilities.parseGraph(sampleGraph);\n\n this.undoRedoManager = this.cy.undoRedo();\n // Create Manager Classes\n this.shareDBManager = new ShareDBManager(() => {\n const dbDoc = this.shareDBManager.getDoc();\n });\n this.editor = new EditorActionsManager(this.isCollaborative,\n this.shareDBManager,\n this.cy,\n this.isCbioPortal,\n this.undoRedoManager,\n this.portalAccessor,\n this.props.profiles,\n this.props.genomicDataOverlayColorScheme,\n this.props.colorSchemeChangeCallback);\n this.shareDBManager.setEditor(this.editor);\n if(this.isCollaborative){\n this.shareDBManager.initShareDB();\n }\n\n this.qtipManager = new QtipManager(this.cy, this.editor);\n \n this.cxtMenuManager = new ContextMenuManager(this.cy, \n this.editor,\n this.props.handleOpen, \n this.undoRedoManager, \n this.props.isCollaborative);\n \n this.dragDropNodeAddManager = new DragDropNodeAddPlugin(this.editor, this.cy, this.props.pathwayHandler);\n\n // Initialize panzoom\n this.cy.panzoom(panzoomOpts);\n\n this.cy.layoutUtilities({\n desiredAspectRatio: this.cy.width() / this.cy.height()\n });\n\n // Node Add initialization\n this.cy.nodeadd(\n {\n // Once the explanationText is cast to uppercase they will be node types\n components:\n [\n {\n container: $('#simpleNodeDiv'),\n nodeType: 'Gene',\n icon: geneImg\n },\n {\n container: $('#familyNodeDiv'),\n nodeType: 'Family',\n icon: familyImg\n },\n {\n container: $('#complexNodeDiv'),\n nodeType: 'Complex',\n icon: complexImg\n },\n {\n container: $('#compartmentNodeDiv'),\n nodeType: 'Compartment',\n icon: compartmentImg\n },\n {\n container: $('#processNodeDiv'),\n nodeType: 'Process',\n icon: processImg\n }\n ]\n\n });\n const self = this;\n const edgeHandleDefaults ={\n preview: true, // whether to show added edges preview before releasing selection\n stackOrder: 4, // Controls stack order of edgehandles canvas element by setting it's z-index\n handleSize: 10, // the size of the edge handle put on nodes\n handleColor: '#1abc9c', // the colour of the handle and the line drawn from it\n handleLineType: 'ghost', // can be 'ghost' for real edge, 'straight' for a straight line, or 'draw' for a draw-as-you-go line\n handleLineWidth: 1, // width of handle line in pixels\n handleNodes: 'node', // selector/filter function for whether edges can be made from a given node\n hoverDelay: 1, // time spend over a target node before it is considered a target selection\n cxt: false, // whether cxt events trigger edgehandles (useful on touch)\n enabled: false, // whether to start the extension in the enabled state\n toggleOffOnLeave: true, // whether an edge is cancelled by leaving a node (true), or whether you need to go over again to cancel (false; allows multiple edges in one pass)\n edgeType: function( sourceNode, targetNode ) {\n // can return 'flat' for flat edges between nodes or 'node' for intermediate node between them\n // returning null/undefined means an edge can't be added between the two nodes\n return 'flat';\n },\n handlePosition: function( node ){\n return 'middle top'; // sets the position of the handle in the format of \"X-AXIS Y-AXIS\" such as \"left top\", \"middle top\"\n },\n loopAllowed: function( node ) {\n // for the specified node, return whether edges from itself to itself are allowed\n return false;\n },\n nodeLoopOffset: -50, // offset for edgeType: 'node' loops\n nodeParams: function( sourceNode, targetNode ) {\n // for edges between the specified source and target\n // return element object to be passed to cy.add() for intermediary node\n return {};\n },\n edgeParams: function( sourceNode, targetNode, i ) {\n // for edges between the specified source and target\n // return element object to be passed to cy.add() for edge\n // NB: i indicates edge index in case of edgeType: 'node'\n return {};\n },\n start: function( sourceNode )\n {\n // fired when edgehandles interaction starts (drag on handle)\n var type = self.getGlobalEdgeType();\n //self.cy.edgehandles('option', 'ghostEdgeType', type);\n },\n complete: function( sourceNode, targetNodes, addedEntities )\n {\n // // Remove recently added edge !\n // // FBI takes this case from now on :O\n // // We will take care of addition in our manager :)\n self.cy.remove(addedEntities);\n self.editor.addEdge({\n source: sourceNode.id(),\n target: targetNodes[0].id(),\n // @ts-ignore\n type: self.getGlobalEdgeType(window.edgeAddingMode),\n pubmedIDs: [],\n name: \"\"\n });\n },\n stop: function( sourceNode )\n {\n // fired when edgehandles interaction is stopped (either complete with added edges or incomplete)\n //TODO refactor this, so terrible for now\n //$('.edge-palette a').blur().removeClass('active');\n self.edgeAddingMode = -1;\n self.eh.disable();\n self.eh.hide();\n self.props.setActiveEdge(-1);\n },\n };\n //Edge Handles initialization\n this.eh = this.cy.edgehandles(edgeHandleDefaults);\n this.eh.disable();\n this.props.editorHandler(this.editor, this.eh, this.undoRedoManager);\n\n if(!this.isCbioPortal) {\n this.cy.nodeEditing({\n padding: 5, // spacing between node and grapples/rectangle\n undoable: true, // and if cy.undoRedo exists\n\n grappleSize: 8, // size of square dots\n grappleColor: \"#ffc90e\", // color of grapples\n inactiveGrappleStroke: \"inside 1px blue\",\n boundingRectangle: true, // enable/disable bounding rectangle\n boundingRectangleLineDash: [4, 8], // line dash of bounding rectangle\n boundingRectangleLineColor: \"ffc90e\",\n boundingRectangleLineWidth: 1.5,\n zIndex: 999,\n\n moveSelectedNodesOnKeyEvents: function () {\n return true;\n },\n\n minWidth: function (node) {\n var data = node.data(\"resizeMinWidth\");\n return data ? data : 15;\n }, // a function returns min width of node\n minHeight: function (node) {\n var data = node.data(\"resizeMinHeight\");\n return data ? data : 15;\n }, // a function returns min height of node\n\n // Getters for some style properties the defaults returns ele.css('property-name')\n // you are encouraged to override these getters\n getCompoundMinWidth: function (node) {\n return node.style('min-width');\n },\n getCompoundMinHeight: function (node) {\n return node.style('min-height');\n },\n getCompoundMinWidthBiasRight: function (node) {\n return node.style('min-width-bias-right');\n },\n getCompoundMinWidthBiasLeft: function (node) {\n return node.style('min-width-bias-left');\n },\n getCompoundMinHeightBiasTop: function (node) {\n return node.style('min-height-bias-top');\n },\n getCompoundMinHeightBiasBottom: function (node) {\n return node.style('min-height-bias-bottom');\n },\n\n\n isFixedAspectRatioResizeMode: function (node) {\n return node.is(\".fixedAspectRatioResizeMode\")\n },// with only 4 active grapples (at corners)\n isNoResizeMode: function (node) {\n return undefined;\n }, // no active grapples\n\n // These optional function will be executed to set the width/height of a node in this extension\n // Using node.css() is not a recommended way (http://js.cytoscape.org/#eles.style) to do this. Therefore, overriding these defaults\n // so that a data field or something like that will be used to set node dimentions instead of directly calling node.css()\n // is highly recommended (Of course this will require a proper setting in the stylesheet).\n setWidth: function (node, width) {\n node.style('width', width);\n },\n setHeight: function (node, height) {\n node.style('height', height);\n },\n setCompoundMinWidth: function (node, minWidth) {\n node.style('min-width', minWidth);\n },\n setCompoundMinHeight: function (node, minHeight) {\n node.style('min-height', minHeight);\n },\n setCompoundMinWidthBiasLeft: function (node, minWidthBiasLeft) {\n node.style('min-width-bias-left', minWidthBiasLeft);\n },\n setCompoundMinWidthBiasRight: function (node, minHeightBiasRight) {\n node.style('min-width-bias-right', minHeightBiasRight);\n },\n setCompoundMinHeightBiasTop: function (node, minHeightBiasTop) {\n node.style('min-height-bias-top', minHeightBiasTop);\n },\n setCompoundMinHeightBiasBottom: function (node, minHeightBiasBottom) {\n node.style('min-height-bias-bottom', minHeightBiasBottom);\n },\n\n cursors: { // See http://www.w3schools.com/cssref/tryit.asp?filename=trycss_cursor\n // May take any \"cursor\" css property\n default: \"default\", // to be set after resizing finished or mouseleave\n inactive: \"not-allowed\",\n nw: \"nw-resize\",\n n: \"n-resize\",\n ne: \"ne-resize\",\n e: \"e-resize\",\n se: \"se-resize\",\n s: \"s-resize\",\n sw: \"sw-resize\",\n w: \"w-resize\"\n },\n resizeToContentCueImage: resizeCue,\n resizeToContentFunction: this.editor.resizeNodesToContent.bind(this.editor),\n });\n }\n //Navigator for cytoscape js\n var navDefaults = {\n container: '.cytoscape-navigator-wrapper' // can be a HTML or jQuery element or jQuery selector\n , viewLiveFramerate: 0 // set false to update graph pan only on drag end; set 0 to do it instantly; set a number (frames per second) to update not more than N times per second\n , thumbnailEventFramerate: 10 // max thumbnail's updates per second triggered by graph updates\n , thumbnailLiveFramerate: false // max thumbnail's updates per second. Set false to disable\n , dblClickDelay: 200 // milliseconds\n , removeCustomContainer: true // destroy the container specified by user on plugin destroy\n , rerenderDelay: 100 // ms to throttle rerender updates to the panzoom for performance\n };\n\n //TODO: AMENDMENT declaration removed\n this.cy.navigator(navDefaults); // get navigator instance, nav\n\n const viewUtilitiesOpts = {\n node: {\n highlighted: {\n 'border-width': 2,\n 'border-color': '#bc1142'\n }, // styles for when nodes are highlighted.\n unhighlighted: {\n 'opacity': function (ele: any) {\n // We return the same opacity because to override the unhibhlighted ele opacity in view-utilities\n return ele.css('opacity');\n }\n }// styles for when nodes are unhighlighted.}\n },\n edge: {\n highlighted: {}, // styles for when edges are highlighted.\n unhighlighted: {\n 'opacity': function (ele: any) {\n // We return the same opacity because to override the unhibhlighted ele opacity in view-utilities\n return ele.css('opacity');\n }\n } // styles for when edges are unhighlighted.\n },\n setVisibilityOnHide: false, // whether to set visibility on hide/show\n setDisplayOnHide: true, // whether to set display on hide/show\n neighbor: () => { // return desired neighbors of tapheld node\n return false;\n },\n neighborSelectTime: 500 //ms, time to taphold to select desired neighbors\n };\n\n this.viewUtilities = this.cy.viewUtilities(viewUtilitiesOpts);\n\n this.editor.setViewUtilities(this.viewUtilities);\n\n this.placePanzoomAndOverlay();\n }\n\n getGlobalEdgeType()\n {\n var type = \"NONE\";\n // @ts-ignore\n if (window.edgeAddingMode === 1)\n {\n type = 'ACTIVATES';\n }\n // @ts-ignore\n else if (window.edgeAddingMode === 2)\n {\n type = 'INHIBITS';\n }\n // @ts-ignore\n else if (window.edgeAddingMode === 3)\n {\n type = 'INDUCES';\n }\n // @ts-ignore\n else if (window.edgeAddingMode === 4)\n {\n type = 'REPRESSES';\n }\n // @ts-ignore\n else if (window.edgeAddingMode === 5)\n {\n type = 'BINDS';\n }\n return type;\n }\n\n initCyHandlers(){\n var that = this;\n\n var tappedBefore: any;\n var tappedTimeout: number;\n this.cy.on('tap', function (event: any) {\n var tappedNow = event.target;\n if (tappedTimeout !== -1 && tappedBefore !== -1) {\n clearTimeout(tappedTimeout);\n }\n if (tappedBefore === tappedNow) {\n tappedNow.trigger('doubleTap');\n tappedBefore = -1;\n } else {\n // @ts-ignore TODO AMENDMENTsa\n tappedTimeout = setTimeout(function () {\n tappedBefore = -1;\n }, 300);\n tappedBefore = tappedNow;\n }\n });\n\n this.cy.on('doubleTap', 'node', function (e: any) {\n\n // if cBioPortal ignore\n if(that.props.isCbioPortal) return;\n\n const eventIsDirect = (e.target === this);\n \n if (eventIsDirect) { \n that.qtipManager.addQtipToElements(e.target); \n e.target.trigger(\"showqtipevent\");\n }\n });\n \n this.cy.on('doubleTap', 'edge', function (e: any) {\n \n // if cBioPortal ignore\n if(that.props.isCbioPortal) return;\n \n const eventIsDirect = (e.target === this);\n \n if (eventIsDirect) {\n that.qtipManager.addQtipToElements(e.target); \n e.target.trigger(\"showqtipevent\");\n }\n });\n\n this.cy.on('select', 'node', (e: any) => {\n this.editor.pushSelectedNodeStack(e.target);\n });\n\n // this.cy.on('select', 'edge', function( e )\n // {\n // var eventIsDirect = (e.target === this);\n // $(\".qtip\").remove();\n //\n // if( eventIsDirect ) {\n // that.qtipManager.addQtipToElements(e.target);\n // }\n // });\n\n this.cy.on('unselect', 'node', (e: any) => {\n this.editor.removeElementFromSelectedNodeStack(e.target);\n });\n\n this.cy.on('free', 'node', (e: any) => {\n //Collect all nodes with descendants in case of compounds\n var selectedNodes = this.cy.nodes(':selected');\n var nodes = e.target;\n nodes = nodes.union(nodes.descendants());\n nodes = nodes.union(selectedNodes);\n this.editor.moveElements(nodes);\n });\n\n this.cy.on('layoutstop', () => {\n this.editor.postLayout();\n });\n\n // //TODO fix this when cytoscape is updated !!!\n // //Due to cytoscape.js bug, only workaround that worked :(\n // this.cy.on('add', 'node', function(event)\n // {\n // // event.target.select();\n // this.cy.style().update();\n // this.cy.forceRender();\n // });\n\n this.cy.on(\"nodeediting.resizeend\", (_e: any, _type: any, node: any) => {\n \n //Updates 'data' properties from 'style'\n node.data('w', node.width());\n node.data('h', node.height());\n //Used for collaborative mode\n this.editor.resizeElements(node);\n });\n\n this.cy.on('select', 'edge', (e: any) => {\n this.lastSelectedEdge = e.target;\n });\n\n this.cy.on('bendPointMovement', () => {\n this.editor.updateEdgeAnchorPoints(this.lastSelectedEdge);\n });\n\n this.cy.on('nodeediting.moveend', () => {\n this.editor.changeNodePositionsByArrows(this.cy.nodes(\":selected\"));\n });\n\n }\n\n initKeyboardHandlers() {\n if (!this.isCollaborative && !this.isCbioPortal) {\n $(document).keydown((e: any) => {\n if (e.which === 89 && (e.ctrlKey || e.metaKey)) {\n this.undoRedoManager.redo();\n }\n else if (e.which === 90 && (e.ctrlKey || e.metaKey)) {\n this.undoRedoManager.undo();\n }\n });\n }\n else {\n $('a[role=\"redo\"]').hide();\n $('a[role=\"undo\"]').hide();\n }\n $(document).keydown((e: any) => {\n if (e.which === 65 && (e.ctrlKey || e.metaKey)) {\n // @ts-ignore\n var tn = document.activeElement.tagName;\n if (tn != \"TEXTAREA\" && tn != \"INPUT\") {\n e.preventDefault();\n this.cy.elements().select();\n }\n }\n else if (e.which === 8 || e.which === 46) {\n // @ts-ignore\n var tn = document.activeElement.tagName;\n if (tn != \"TEXTAREA\" && tn != \"INPUT\") {\n var selectedElements = this.cy.$(':selected');\n this.editor.removeElement(selectedElements);\n }\n }\n });\n }\n\n initUndoRedoFunctionality() {\n if (this.isCollaborative || this.isCbioPortal) {\n $('[role=\"undo\"]').hide();\n $('[role=\"redo\"]').hide();\n /* TODO: AMENDMENT\n document.getElementById(\"localOrCollaborativeToolbar\").style.display = \"none\";\n */\n }\n }\n\n\n initCBioPortalFunctionalities() {\n if (this.isCbioPortal) {\n const contextMenu = this.cy.contextMenus('get');\n\n contextMenu.destroy();\n }\n }\n\n\n}","import autobind from \"autobind-decorator\";\nimport { action, computed, makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport { IGeneticAlterationRuleSetParams } from 'oncoprintjs';\nimport React from 'react';\nimport { Col, Row } from \"react-bootstrap\";\nimport { toast, ToastContainer } from 'react-toastify';\nimport 'react-toastify/dist/ReactToastify.min.css';\nimport ReactTooltip from 'react-tooltip';\nimport \"../css/pmv1.css\";\nimport \"../css/pmv2.css\";\nimport '../css/qtip.css';\nimport \"../css/supp.css\";\nimport pathways from \"../data/pathways.json\";\nimport EditorActionsManager from \"../managers/EditorActionsManager\";\nimport FileOperationsManager from '../managers/FileOperationsManager';\nimport GridOptionsManager from '../managers/GridOptionsManager';\nimport ViewOperationsManager from '../managers/ViewOperationsManager';\nimport AboutModal from '../modals/AboutModal';\nimport CBioHelpModal from '../modals/CBioHelpModal';\nimport ConfirmationModal from '../modals/ConfirmationModal';\nimport GridSettings from '../modals/GridSettings';\nimport LayoutProperties from '../modals/LayoutProperties';\nimport PathwayDetailsModal from '../modals/PathwayDetailsModal';\nimport ProfilesColorSchemeModal from \"../modals/ProfilesColorSchemeModal\";\nimport ProfilesModal from '../modals/ProfilesModal';\nimport QuickHelpModal from '../modals/QuickHelpModal';\nimport StudyModal from '../modals/StudyModal';\nimport Ranking from \"../ui/Ranking\";\nimport Toolbar from \"../ui/Toolbar\";\nimport CBioPortalAccessor from '../utils/CBioPortalAccessor';\nimport PathwayActions from '../utils/PathwayActions';\nimport SaveLoadUtility from '../utils/SaveLoadUtility';\nimport Buttonbar from \"./Buttonbar\";\nimport CytoscapeArea from \"./CytoscapeArea\";\nimport Menubar from './Menubar';\nimport Sidebar from './Sidebar';\n\nconst maxHeapFn = require('@datastructures-js/max-heap');\nlet maxHeap = maxHeapFn();\n\ninterface IPathwayMapperProps{\n isCBioPortal: boolean;\n genes: any[];\n isCollaborative?: boolean;\n cBioAlterationData?: ICBioData[];\n sampleIconData?: ISampleIconData,\n pathwayName? : string;\n alterationData?: IAlterationData;\n onAddGenes?: (selectedGenes: string[]) => void;\n changePathwayHandler?: (pathwayGenes: string[]) => void;\n addGenomicDataHandler?: (addGenomicData: (alterationData: ICBioData[]) => void) => void;\n tableComponent?: (data: IPathwayMapperTable[], selectedPathway: string, onPathwaySelect: (pathway: string) => void) => JSX.Element;\n validGenes?: any;\n toast: any;\n showMessage: (message: string) => void;\n //PatientView variable\n patientView ?: boolean;\n messageBanner? : () => JSX.Element;\n}\n\nexport interface ICBioData{\n altered: number;\n gene: string;\n percentAltered: string​;\n sequenced: number;\n geneticTrackData?: any[]; // TODO GeneticTrackDatum[]: this is currently a private type within cbioportal repo\n geneticTrackRuleSetParams?: IGeneticAlterationRuleSetParams;\n}\n\nexport interface ISampleIconData {\n sampleIndex: { [s: string]: number },\n sampleColors: { [s: string]: string }\n}\n\n/**\n * Maps integer values to color code strings\n */\nexport interface IColorValueMap {\n [value: string]: string\n}\n\nexport enum EModalType{\n STUDY,\n CONFIRMATION,\n PROFILES,\n ABOUT,\n PW_DETAILS,\n GRID,\n HELP,\n LAYOUT,\n CHELP,\n PROFILES_COLOR_SCHEME\n}\n\nexport interface IPathwayData{\n title: string;\n description: string;\n nodes: any[];\n edges: any[];\n}\n\nexport interface IAlterationData{\n [key: string]: {[key: string]: number};\n}\n\nexport interface IProfileMetaData{\n profileId: string;\n studyId?: string;\n enabled: boolean;\n}\n\nexport interface IDataTypeMetaData{\n enabled: boolean;\n checked: boolean;\n profile: string;\n}\n\nexport interface IPathwayMapperTable{\n name: string;\n score: number;\n genes: string[];\n}\n\n@observer\nexport class PathwayMapper extends React.Component {\n static readonly CBIO_PROFILE_NAME = \"cBioPortal_data\";\n\n\n readonly MAX_ALLOWED_PROFILES_ENABLED = 6;\n \n @observable\n selectedPathway: string;\n\n fileManager: FileOperationsManager;\n\n @observable\n editor: EditorActionsManager;\n\n pathwayActions: PathwayActions;\n\n @observable\n isModalShown: boolean[];\n\n @observable\n colorValueMap: IColorValueMap;\n\n portalAccessor: CBioPortalAccessor;\n\n @observable\n alterationData: IAlterationData;\n\n @observable\n patientData: any [][] = [];\n\n @observable\n pathwayGeneMap: {[key: string]: {[key: string]: string}} = {};\n\n bestPathwaysAlgos: any[][] = [];\n\n @observable\n oldName = \"\";\n \n @observable\n profiles: IProfileMetaData[] = [];\n\n setActiveEdge: (edgeId: number) => void;\n viewOperationsManager: ViewOperationsManager;\n gridOptionsManager: GridOptionsManager;\n\n\n\n constructor(props: IPathwayMapperProps){\n super(props);\n makeObservable(this);\n \n this.fileManager = new FileOperationsManager();\n this.pathwayActions = new PathwayActions(this.pathwayHandler, this.profiles, this.fileManager, \n this.handleOpen, this.props.isCBioPortal, this.props.isCollaborative);\n this.selectedPathway = \"\";\n if(this.props.pathwayName){\n this.pathwayActions.changePathway(this.props.pathwayName);\n }\n this.isModalShown = [false, false, false, false, false, false, false, false, false, false];\n // TODO: Change below\n this.alterationData = {}; //{\"study1_gistic\" : {\"CDK4\": 11, \"MDM2\": 19, \"TP53\": 29}, \"study2_gistic\" : {\"MDM2\": 99, \"TP53\": 98}, \"study3_mutations\": {\"MDM2\": 1, \"TP53\": 2}};\n this.extractAllGenes();\n\n this.colorValueMap = {\n '-100' : \"#0000ff\",\n '0' : \"#ffffff\",\n '100' : \"#ff0000\"\n }\n\n if(this.props.isCBioPortal){\n //this.overlayPortalData();\n \n // If cBioPortal mode is 'on' it is very likely to have cBioALterationData\n // but to be on the safe side below assertion is made.\n if(this.props.cBioAlterationData ){\n if( this.props.patientView){\n //PatientView PathwayMapper has a different functionality\n //Alteration types are overlayed instead of alterationpercentage\n this.calculatePatientData(this.props.cBioAlterationData);\n this.addSampleIconData(this.props.sampleIconData);\n }\n else{\n this.calculateAlterationData(this.props.cBioAlterationData);\n\n }\n }\n\n if(this.props.addGenomicDataHandler){\n this.props.addGenomicDataHandler(this.addGenomicData);\n }\n\n this.profiles.push({profileId: PathwayMapper.CBIO_PROFILE_NAME, enabled: true});\n this.getBestPathway(0);\n this.getBestPathway(1);\n this.getBestPathway(2);\n this.getBestPathway(3);\n }\n /*\n const profile1 = {profileId: \"study1_gistic\", studyId: \"study1\", enabled: true};\n const profile2 = {profileId: \"study2_gistic\", studyId: \"study2\", enabled: true};\n const profile3 = {profileId: \"study3_mutations\", studyId: \"study3\", enabled: true};\n const profile4 = {profileId: \"study3_mutations\", studyId: \"study3\", enabled: true};\n const profile5 = {profileId: \"study3_mutations\", studyId: \"study3\", enabled: true};\n const profile6 = {profileId: \"study3_mutations\", studyId: \"study3\", enabled: true};\n this.profiles.push(profile1, profile2, profile3, profile4, profile5, profile6);\n */\n\n }\n\n @action.bound\n setColorMapping(colorValueMap: IColorValueMap) {\n this.colorValueMap = colorValueMap;\n this.editor.updateGenomicDataColorScheme(this.colorValueMap);\n }\n\n @action\n setSelectedPathway(pathway: string) {\n this.selectedPathway = pathway;\n }\n\n @action\n setEditor(editor: EditorActionsManager) {\n this.editor = editor;\n }\n\n @action\n addProfile(profile: IProfileMetaData) {\n this.profiles.push(profile);\n }\n\n @action\n toggleProfileEnabled(index: number) {\n this.profiles[index].enabled = !this.profiles[index].enabled;\n }\n\n calculateAlterationData(cBioAlterationData: ICBioData[]){\n // Transform cBioDataAlteration into AlterationData\n this.alterationData[PathwayMapper.CBIO_PROFILE_NAME] = {};\n cBioAlterationData.forEach((geneAltData: ICBioData) => {\n const perc = (geneAltData.altered / geneAltData.sequenced) * 100;\n \n // NaN value is replaced with -101 since NaN value leads to some runtime exceptions (such as with toFixed() function),\n // hence it is represented as -101. It will be recognized in the genomic data svg creation to show N/P instead of\n // a percentage. -101 is chosen because this percentage is impossible to get.\n this.alterationData[PathwayMapper.CBIO_PROFILE_NAME][geneAltData.gene] = ((Object.is(perc, NaN) ? -101 : perc));\n \n\n });\n }\n \n calculatePatientData(cBioAlterationData: ICBioData[]){\n // Transform cBioDataAlteration into Patient Data every alteration is accepted 100% altered\n\n this.alterationData[PathwayMapper.CBIO_PROFILE_NAME] = {};\n \n const allTypes = cBioAlterationData.map(x => x.gene); \n //const allTypes = cBioAlterationData.map(x => x.percentAltered);\n const uniqueTypes = allTypes.filter((x, i, a) => a.indexOf(x) == i)\n //This is a flag for GenomicDataOverlayManager showPatientData\n this.patientData[\"PatientView\"] = 1;\n\n uniqueTypes.forEach(x => {\n this.patientData[x]= {};\n });\n\n cBioAlterationData.forEach((geneAltData: ICBioData) => {\n const perc = (geneAltData.altered / geneAltData.sequenced) * 100;\n\n this.alterationData[PathwayMapper.CBIO_PROFILE_NAME][geneAltData.gene] = ((Object.is(perc, NaN) ? -101 : perc));\n\n this.patientData[geneAltData.gene][geneAltData.percentAltered] = ((Object.is(perc, NaN) ? -101 : perc));\n this.patientData[geneAltData.gene][\"geneticTrackData\"] = geneAltData.geneticTrackData;\n this.patientData[geneAltData.gene][\"geneticTrackRuleSetParams\"] = geneAltData.geneticTrackRuleSetParams;\n });\n\n }\n\n addSampleIconData(sampleIconData: any) {\n if (sampleIconData) {\n this.patientData[\"sampleColors\"] = sampleIconData.sampleColors;\n this.patientData[\"sampleIndex\"] = sampleIconData.sampleIndex;\n }\n }\n\n getGeneStudyMap(studyGeneMap: any){\n \n const genomicDataMap: any = {};\n for (const cancerStudy of Object.keys(studyGeneMap)) {\n\n const cancerData = studyGeneMap[cancerStudy];\n\n for (const geneSymbol of Object.keys(cancerData)) {\n if (genomicDataMap[geneSymbol] === undefined) genomicDataMap[geneSymbol] = {};\n\n genomicDataMap[geneSymbol][cancerStudy] = studyGeneMap[cancerStudy][geneSymbol].toFixed(2);\n }\n }\n return genomicDataMap;\n }\n\n getAlterationAveragePerGene(genomicDataMap: any){\n\n const geneAlterationMap: any = {};\n for(const gene of Object.keys(genomicDataMap)){\n let sum = 0, count = 0;\n\n for(const alteration of Object.values(genomicDataMap[gene])){\n sum += parseFloat(alteration as string);\n count++;\n }\n if(count === 0){\n geneAlterationMap[gene] = 0;\n } else {\n geneAlterationMap[gene] = sum / count;\n }\n }\n\n return geneAlterationMap;\n }\n\n\n /**\n * \n * @param rankingMode: number => 0 = Count, 1 = Percentage, 2 = Count with Alteration, 3 = Percentage with Alteration\n * \n */\n getBestPathway(rankingMode: number) {\n \n const genomicDataMap = this.getGeneStudyMap(this.alterationData);\n const alterationPerGene = this.getAlterationAveragePerGene(genomicDataMap);\n maxHeap = maxHeapFn();\n\n const matchedGenesMap: any = {};\n const bestPathways: any[] = [];\n for(const pathwayName in this.pathwayGeneMap){\n if(this.pathwayGeneMap.hasOwnProperty(pathwayName)){\n \n const genesMatching = [];\n // Calculate sum of all alterations\n let sumOfAlterations = 0;\n for(const gene of this.props.genes){\n \n if(this.pathwayGeneMap[pathwayName].hasOwnProperty(gene.hugoGeneSymbol) \n && this.pathwayGeneMap[pathwayName][gene.hugoGeneSymbol] === \"GENE\"){\n genesMatching.push(gene.hugoGeneSymbol);\n sumOfAlterations += alterationPerGene[gene.hugoGeneSymbol];\n }\n }\n matchedGenesMap[pathwayName] = genesMatching;\n let geneCount = 0;\n // Count number of genes *not processess* in a pathway\n for(const geneType of Object.values(this.pathwayGeneMap[pathwayName])){\n if(geneType === \"GENE\"){\n geneCount++;\n }\n }\n\n if(rankingMode === 0){\n maxHeap.insert(genesMatching.length, {pathwayName: pathwayName});\n } else if(rankingMode === 1){\n maxHeap.insert(genesMatching.length / geneCount * 100, {pathwayName: pathwayName}); \n } else if(rankingMode === 2){\n maxHeap.insert(sumOfAlterations, {pathwayName: pathwayName}); \n } else if(rankingMode === 3){\n maxHeap.insert(genesMatching.length * sumOfAlterations / geneCount, {pathwayName: pathwayName});\n }\n\n }\n }\n while(maxHeap.size() > 0){\n const top = maxHeap.extractMax();\n const pathwayName = top.getValue().pathwayName;\n bestPathways.push({score: top.getKey(), genesMatched: matchedGenesMap[pathwayName], pathwayName: pathwayName});\n }\n if(this.bestPathwaysAlgos.length === 0) // First pathway of the first method is shown as the default pathway.\n this.setSelectedPathway(bestPathways[0].pathwayName);\n this.bestPathwaysAlgos.push(bestPathways);\n }\n \n // This method extracts all genes of a pathway and adds it to the pathwayGeneMap\n // so that it can be used by percentage calculation and genomic data \n // Note: Pathway title\n @autobind\n includePathway(pathwayData?: IPathwayData, pathwayName?: string){\n const genes = pathwayData.nodes;\n const geneHash: any = {};\n\n for(const gene of genes){\n\n if(gene.data.type === \"GENE\")\n geneHash[gene.data.name] = gene.data.type;\n }\n\n this.pathwayGeneMap[pathwayData.title] = geneHash;\n\n }\n\n extractAllGenes(){\n for(const pathwayName in pathways){\n if(pathways.hasOwnProperty(pathwayName)){\n\n const pathwayData: IPathwayData = SaveLoadUtility.parseGraph(pathways[pathwayName], true);\n this.includePathway(pathwayData);\n }\n }\n \n }\n\n\n loadRedirectedPortalData(){\n\n if(!this.props.alterationData){ // If size 0 that means it is not redirected.\n return;\n }\n \n const redirectedProfiles = Object.keys(this.props.alterationData).map((data: string) : IProfileMetaData => ({profileId: data, enabled: true}));\n redirectedProfiles.forEach((redirectedProfile) => {\n this.addProfile(redirectedProfile);\n });\n this.editor.addPortalGenomicData(this.props.alterationData, this.editor.getEmptyGroupID());\n }\n\n exists(profileId: string){\n\n let exists = false;\n this.profiles.forEach((profile: IProfileMetaData) => {\n if(profile.profileId === profileId){\n exists = true;\n }\n });\n\n return exists;\n }\n\n @autobind\n loadFromCBio(dataTypes: {[dataType: string]: IDataTypeMetaData}, studyData: any[]){\n if(!this.pathwayActions.doesCyHaveElements()){\n toast.warn('Your pathway is empty!');\n return;\n }\n\n for (const metadata of Object.values(dataTypes))\n {\n if(!metadata.checked) {\n continue;\n } \n if(this.exists(metadata.profile)){\n toast.warn(metadata.profile + \" already exists.\");\n continue;\n }\n\n const studyId = studyData[0];\n const profileId = metadata.profile;\n\n const enableNewProfile = this.profiles.length < this.MAX_ALLOWED_PROFILES_ENABLED;\n\n const newProfile = {\n studyId: studyId,\n profileId: profileId,\n enabled: enableNewProfile\n }\n\n this.addProfile(newProfile);\n\n const genes = this.editor.cy.nodes()\n .filter(node => node.data(\"type\") === \"GENE\")\n .map(node => node.data(\"name\"));\n\n \n this.portalAccessor.getProfileData({\n caseSetId: studyId,\n geneticProfileId: profileId,\n genes: genes\n },\n (data: any) => {\n this.editor.addPortalGenomicData(data, this.editor.getEmptyGroupID());\n let visibilityObject = {};\n visibilityObject[newProfile.profileId] = newProfile.enabled;\n this.editor.updateGenomicDataVisibility(visibilityObject);\n });\n \n }\n }\n\n @autobind\n setActiveEdgeHandler(setActiveEdge: (edgeId: number) => void){\n this.setActiveEdge = setActiveEdge;\n }\n\n @autobind\n colorSchemeChangeCallback(colorScheme: IColorValueMap) {\n this.colorValueMap = colorScheme;\n }\n\n @autobind\n addGenomicData(cBioAlterationData: ICBioData[]){\n\n this.calculateAlterationData(cBioAlterationData);\n this.editor.removeGenomicData();\n this.editor.addPortalGenomicData(this.alterationData, this.editor.getEmptyGroupID());\n }\n\n @autobind\n emphasizeQueryGenes() {\n this.pathwayActions.emphasizeQueryGenes(this.props.genes.map((gene: any) => gene.hugoGeneSymbol));\n }\n\n render() {\n const isCBioPortal = this.props.isCBioPortal; \n\n const cytoComp = ;\n\n return (\n\n
\n
\n {!isCBioPortal && \n \n
\n \n
\n
\n \n
\n
\n }\n { isCBioPortal &&\n \n \n \n \n {this.props.messageBanner ?\n {this.props.messageBanner()}\n :\n \n }\n \n {this.selectedPathway}\n \n \n }\n \n
\n {\n (!isCBioPortal && \n
\n \n
)\n }\n\n { isCBioPortal ?\n (\n {cytoComp}\n
Powered by PathwayMapper
\n )\n : (cytoComp)\n }\n {\n (isCBioPortal &&\n \n \n )\n }\n
\n\n {/* isCBioPortal &&\n \n Powered by PathwayMapper\n */\n }\n\n { (
\n\n {\n (
\n \n \n \n \n \n \n \n \n \n \n
)\n }\n { !this.props.isCBioPortal &&\n \n \n \n \n }\n \n\n {this.pathwayActions.setUploaders(ref, false);}}\n style={{display: 'none'}}\n onChange={(e) => {this.pathwayActions.onChangeFile(e, false);}}\n />\n {this.pathwayActions.setUploaders(ref, true);}}\n style={{display: 'none'}}\n onChange={(e) => {this.pathwayActions.onChangeFile(e, true);}}\n />\n {this.pathwayActions.setOverlayUploader(ref);}}\n style={{display: 'none'}}\n onChange={(e) => {this.pathwayActions.overlayFromText(e.target.files[0]);}}\n />\n
)\n }\n
\n
\n );\n }\n\n componentDidMount(){\n if(!this.props.isCBioPortal){\n $(\".container\").css('width', \"auto\");\n $(\".container\").css('paddingLeft', 0);\n $(\".container\").css('marginLeft', 5);\n } else {\n this.pathwayActions.emphasizeQueryGenes(this.props.genes.map((gene: any) => gene.hugoGeneSymbol));\n }\n }\n\n componentDidUpdate(){\n if(this.props.isCBioPortal){\n this.pathwayActions.emphasizeQueryGenes(this.props.genes.map((gene: any) => gene.hugoGeneSymbol));\n }\n }\n\n @action.bound\n handleOpen(modalId: EModalType){\n this.isModalShown[modalId] = true;\n }\n\n\n @action.bound\n handleClose(modalId: EModalType){\n this.isModalShown[modalId] = false;\n }\n\n @autobind\n editorHandler(editor, eh, undoRedoManager){\n\n this.setEditor(editor);\n this.gridOptionsManager = new GridOptionsManager(this.editor.cy);\n this.viewOperationsManager = new ViewOperationsManager(this.editor, this.editor.cy);\n this.pathwayActions.editorHandler(editor, eh, undoRedoManager, this.viewOperationsManager, this.gridOptionsManager);\n \n if(this.props.isCBioPortal){\n if(this.props.patientView){\n this.editor.addPortalGenomicData(this.patientData, this.editor.getEmptyGroupID());\n }\n else{\n this.editor.addPortalGenomicData(this.alterationData, this.editor.getEmptyGroupID());\n }\n } else {\n this.portalAccessor = new CBioPortalAccessor();\n this.loadRedirectedPortalData();\n }\n\n }\n\n @autobind\n pathwayHandler(pathway: string){\n this.setSelectedPathway(pathway);\n if(this.pathwayGeneMap[pathway] && this.props.changePathwayHandler)\n this.props.changePathwayHandler(\n Object.keys(this.pathwayGeneMap[pathway])\n .filter(gene => (!this.alterationData[PathwayMapper.CBIO_PROFILE_NAME].hasOwnProperty(gene)))\n );\n }\n}\n\nexport default PathwayMapper;","import React from 'react';\nimport { MenuItem, Nav, Navbar, NavDropdown } from 'react-bootstrap';\nimport pathways from \"../data/pathways.json\";\nimport ConfirmationModal from '../modals/ConfirmationModal';\nimport PathwayActions from '../utils/PathwayActions';\nimport { EModalType } from './react-pathway-mapper';\n\ninterface IMenubarProps{\n pathwayActions: PathwayActions;\n handleOpen: (modalId: EModalType) => void;\n setActiveEdge: Function;\n}\n\n\nexport default class Menubar extends React.Component{\n\n\n constructor(props: IMenubarProps){\n super(props);\n }\n\n render(){\n const nodeTypes = [\"Gene\", \"Family\", \"Complex\", \"Compartment\", \"Process\"];\n const edgeTypes = [\"Activates\", \"Inhibits\", \"Induces\", \"Represses\", \"Binds\"];\n\n const pathwayDropdownData: {[pwHead: string]: string[]} = {};\n for(const pwName of Object.keys(pathways)){\n // If a pathway name ain't include 'pathway' word then it is under pancanatlas.\n const isPancanatlas = !pwName.includes('pathway');\n const dashPos = pwName.indexOf('-');\n const pwHead = (isPancanatlas) ? 'PanCanAtlas' : pwName.substring(0, dashPos);\n if(pwHead in pathwayDropdownData){\n pathwayDropdownData[pwHead].push(pwName);\n } else {\n pathwayDropdownData[pwHead] = [pwName];\n }\n }\n\n return(\n \n \n \n \n );\n }\n}","import { action, makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React from \"react\";\nimport { Button, Panel } from \"react-bootstrap\";\nimport \"../css/supp.css\";\n// @ts-ignore\nimport acImg from \"../images/edges/activates.svg\";\n// @ts-ignore\nimport bindImg from \"../images/edges/binds.svg\";\n// @ts-ignore\nimport indImg from \"../images/edges/induces.svg\";\n// @ts-ignore\nimport inhImg from \"../images/edges/inhibits.svg\";\n// @ts-ignore\nimport repImg from \"../images/edges/represses.svg\";\nimport PathwayActions from \"../utils/PathwayActions\";\nimport { EModalType } from \"./react-pathway-mapper\";\n\n\n\ninterface ISideBarProps{\n pathwayActions: PathwayActions;\n setActiveEdgeHandler: Function;\n handleOpen: Function;\n}\n\n@observer\nexport default class Sidebar extends React.Component{\n\n @observable\n activeEdge: number = -1;\n\n constructor(props: ISideBarProps){\n super(props);\n makeObservable(this);\n props.setActiveEdgeHandler(this.setActiveEdge);\n }\n\n addEdge(edgeIndex: number){\n if(edgeIndex === this.activeEdge){\n this.setActiveEdge(-1);\n this.props.pathwayActions.addEdge(-1);\n return;\n }\n this.setActiveEdge(edgeIndex);\n this.props.pathwayActions.addEdge(edgeIndex);\n }\n\n @action.bound\n setActiveEdge(edgeIndex: number){\n this.activeEdge = edgeIndex;\n }\n\n render(){\n\n const edgeTypes = [\"Activates\", \"Inhibits\", \"Induces\", \"Represses\", \"Binds\"];\n\n const edgeImgs = [acImg, inhImg, indImg, repImg, bindImg];\n\n const nodeIds = [\"simpleNodeDiv\", \"familyNodeDiv\", \"complexNodeDiv\", \"compartmentNodeDiv\", \"processNodeDiv\"];\n\n return(\n
\n \n \n Network\n \n \n \n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n\n \n \n Node Palette\n \n \n \n {\n nodeIds.map((id) => {\n return (\n
\n
);\n })\n }\n
\n
\n\n \n \n Interaction Palette\n \n \n
\n {\n edgeTypes.map((edgeType: string, i: number) => {\n return ();\n })\n }\n
\n
\n
\n
\n );\n }\n}"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://pathway-mapper/webpack/bootstrap","webpack://pathway-mapper/external \"react\"","webpack://pathway-mapper/external \"react-bootstrap\"","webpack://pathway-mapper/external \"mobx\"","webpack://pathway-mapper/external \"autobind-decorator\"","webpack://pathway-mapper/external \"jquery\"","webpack://pathway-mapper/external \"mobx-react\"","webpack://pathway-mapper/external \"lodash\"","webpack://pathway-mapper/external \"cytoscape\"","webpack://pathway-mapper/./src/images/toolbar/layout-cose.svg","webpack://pathway-mapper/external \"react-toastify\"","webpack://pathway-mapper/external \"oncoprintjs\"","webpack://pathway-mapper/./src/images/toolbar/save_png.svg","webpack://pathway-mapper/./src/images/toolbar/save_svg.svg","webpack://pathway-mapper/external \"file-saver\"","webpack://pathway-mapper/./src/images/toolbar/edit.svg","webpack://pathway-mapper/external \"tippy.js\"","webpack://pathway-mapper/./src/images/toolbar/about.svg","webpack://pathway-mapper/./src/images/toolbar/add-selected.svg","webpack://pathway-mapper/./src/images/toolbar/add-all.svg","webpack://pathway-mapper/external \"tippy.js/dist/tippy.css\"","webpack://pathway-mapper/external \"react-tooltip\"","webpack://pathway-mapper/./src/images/toolbar/align/align-horizontal-bottom.svg","webpack://pathway-mapper/./src/images/toolbar/align/align-horizontal-middle.svg","webpack://pathway-mapper/./src/images/toolbar/align/align-horizontal-top.svg","webpack://pathway-mapper/./src/images/toolbar/align/align-vertical-center.svg","webpack://pathway-mapper/./src/images/toolbar/align/align-vertical-left.svg","webpack://pathway-mapper/./src/images/toolbar/align/align-vertical-right.svg","webpack://pathway-mapper/./src/images/toolbar/delete-simple.svg","webpack://pathway-mapper/./src/images/toolbar/grid.svg","webpack://pathway-mapper/./src/images/toolbar/guidelines.svg","webpack://pathway-mapper/./src/images/toolbar/hide-selected.svg","webpack://pathway-mapper/./src/images/toolbar/layout-properties.svg","webpack://pathway-mapper/./src/images/toolbar/load.svg","webpack://pathway-mapper/./src/images/toolbar/new.svg","webpack://pathway-mapper/./src/images/toolbar/portal.svg","webpack://pathway-mapper/./src/images/toolbar/quick-help.svg","webpack://pathway-mapper/./src/images/toolbar/redo.svg","webpack://pathway-mapper/./src/images/toolbar/save.svg","webpack://pathway-mapper/./src/images/toolbar/settings.svg","webpack://pathway-mapper/./src/images/toolbar/show-all.svg","webpack://pathway-mapper/./src/images/toolbar/undo.svg","webpack://pathway-mapper/./src/images/nodes/compartment.svg","webpack://pathway-mapper/./src/images/nodes/complex.svg","webpack://pathway-mapper/./src/images/nodes/family.svg","webpack://pathway-mapper/./src/images/nodes/gene.svg","webpack://pathway-mapper/./src/images/nodes/process.svg","webpack://pathway-mapper/./src/images/resizeCue.svg","webpack://pathway-mapper/./src/images/edges/activates.svg","webpack://pathway-mapper/./src/images/edges/binds.svg","webpack://pathway-mapper/./src/images/edges/induces.svg","webpack://pathway-mapper/./src/images/edges/inhibits.svg","webpack://pathway-mapper/./src/images/edges/represses.svg","webpack://pathway-mapper/external \"react-toastify/dist/ReactToastify.min.css\"","webpack://pathway-mapper/./src/images/about/i-vis.png","webpack://pathway-mapper/./src/images/about/mskcc.png","webpack://pathway-mapper/./src/images/add.svg","webpack://pathway-mapper/./src/images/delete-simple.svg","webpack://pathway-mapper/external \"sharedb/lib/client\"","webpack://pathway-mapper/external \"jquery-ui-dist/jquery-ui\"","webpack://pathway-mapper/external \"cytoscape-edgehandles\"","webpack://pathway-mapper/external \"cytoscape-edge-editing\"","webpack://pathway-mapper/external \"cytoscape-fcose\"","webpack://pathway-mapper/external \"cytoscape-node-editing\"","webpack://pathway-mapper/external \"cytoscape-undo-redo\"","webpack://pathway-mapper/external \"cytoscape-panzoom\"","webpack://pathway-mapper/./src/utils/GraphStyleSheet.tsx","webpack://pathway-mapper/./src/utils/PanzoomOptions.tsx","webpack://pathway-mapper/external \"cytoscape-navigator\"","webpack://pathway-mapper/external \"cytoscape-context-menus\"","webpack://pathway-mapper/external \"konva\"","webpack://pathway-mapper/external \"cytoscape-view-utilities\"","webpack://pathway-mapper/external \"cytoscape-grid-guide\"","webpack://pathway-mapper/external \"cytoscape-popper\"","webpack://pathway-mapper/external \"cytoscape-layout-utilities\"","webpack://pathway-mapper/external \"@datastructures-js/max-heap\"","webpack://pathway-mapper/./src/utils/SaveLoadUtility.tsx","webpack://pathway-mapper/./src/managers/FileOperationsManager.tsx","webpack://pathway-mapper/./src/managers/GridOptionsManager.tsx","webpack://pathway-mapper/./src/managers/ViewOperationsManager.tsx","webpack://pathway-mapper/./src/modals/AboutModal.tsx","webpack://pathway-mapper/./src/modals/CBioHelpModal.tsx","webpack://pathway-mapper/./src/modals/GridSettings.tsx","webpack://pathway-mapper/./src/modals/ConfirmationModal.tsx","webpack://pathway-mapper/./src/managers/ShareDBManager.tsx","webpack://pathway-mapper/./src/utils/GraphUtilities.tsx","webpack://pathway-mapper/./src/utils/SVGExporter.ts","webpack://pathway-mapper/./src/managers/GenomicDataOverlayManager.ts","webpack://pathway-mapper/./src/managers/EditorActionsManager.tsx","webpack://pathway-mapper/./src/modals/LayoutProperties.tsx","webpack://pathway-mapper/./src/modals/PathwayDetailsModal.tsx","webpack://pathway-mapper/./src/modals/ProfilesColorSchemeModal.tsx","webpack://pathway-mapper/./src/modals/ProfilesModal.tsx","webpack://pathway-mapper/./src/modals/QuickHelpModal.tsx","webpack://pathway-mapper/./src/utils/CBioPortalAccessor.tsx","webpack://pathway-mapper/./src/modals/StudyModal.tsx","webpack://pathway-mapper/./src/ui/Ranking.tsx","webpack://pathway-mapper/./src/ui/Toolbar.tsx","webpack://pathway-mapper/./src/utils/PathwayActions.ts","webpack://pathway-mapper/./src/ui/Buttonbar.tsx","webpack://pathway-mapper/./src/managers/ContextMenuManager.tsx","webpack://pathway-mapper/./src/managers/QtipManager.tsx","webpack://pathway-mapper/./src/utils/DragDropNodeAddPlugin.tsx","webpack://pathway-mapper/./src/ui/CytoscapeArea.tsx","webpack://pathway-mapper/./src/ui/react-pathway-mapper.tsx","webpack://pathway-mapper/./src/ui/Menubar.tsx","webpack://pathway-mapper/./src/ui/Sidebar.tsx"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","require","styleSheet","compoundPaddingFunction","borderWidthFunction","parentBorderWidthFunction","highlightedBorderWidthFunction","selectedBorderWidthFunction","selectedHighlightedBorderWidthFunction","parentNodeShapeFunc","nodeBackgroundColorFunction","nodeBorderColorFunction","edgeColorHandler","edgeTargetArrowTypeHandler","edgeLineTypeHandler","selector","style","ele","data","edge","label","css","_private","panzoomOptions","zoomFactor","zoomDelay","minZoom","maxZoom","fitPadding","panSpeed","panDistance","panDragAreaSize","panMinPercentSpeed","panInactiveArea","panIndicatorMinOpacity","zoomOnly","fitSelector","undefined","animateOnFit","fitAnimationDuration","sliderHandleIcon","zoomInIcon","zoomOutIcon","resetIcon","pathwayDetails","cy","edgeEditing","returnString","pathwayTitle","nodes","edges","length","this","exportNode","edgeID","edgeType","source","target","pubmedIDs","pubmedString","edgeName","edgeCurveStyle","numberOfAnchorPoints","anchors","getAnchorsAsArray","anchorPointPositions","j","nodeMap","id","node","nodeName","nodeID","pos","position","nodeType","nodeW","nodeH","parseInt","x","y","graph","isArray","lines","split","edgesStartIndex","title","description","graphDataIndex","isFound","includes","lineData","parentID","posX","posY","newNode","group","type","w","h","parent","push","edgeSource","edgeTarget","anchorPoints","anchorPair","separatorIndex","indexOf","substring","parseFloat","edgeData","newEdge","pathwayInfo","other","b64Data","contentType","sliceSize","byteCharacters","atob","byteArrays","offset","slice","byteNumbers","Array","charCodeAt","byteArray","Uint8Array","Blob","graphData","jpeg","b64data","substr","imageData","b64toBlob","blob","fileName","editor","exportSVG","png","isSIFNX","pathwayData","exportAsSIFNX","exportGraph","currentProperties","changeParameters","GridOptionsManager","defaultGridGuideOptions","params","clone","refreshGridOptionsExtension","state","geometricGuideline","snapToAlignmentLocationDuringDrag","distributionGuidelines","drawGrid","snapToGridDuringDrag","gridGuide","snapToGridOnRelease","snapToAlignmentLocationOnRelease","initPosAlignment","centerToEdgeAlignment","resize","parentPadding","gridSpacing","zoomDash","panGrid","gridStackOrder","gridColor","lineWidth","guidelinesStackOrder","guidelinesTolerance","guidelinesStyle","strokeStyle","geometricGuidelineRange","range","minDistRange","distGuidelineOffset","horizontalDistColor","verticalDistColor","initPosAlignmentColor","lineDash","horizontalDistLine","verticalDistLine","initPosAlignmentLine","parentSpacing","movedNodes","param","tmpNodes","selectedNodeStack","collection","add","forEach","isParent","firstSelected","firstBbox","boundingBox","firstOuterHeight","outerHeight","self","index","newPosition","calculateNewPosition","changePosition","handleChangePositionByAlignment","referenceBbox","referenceOuterHeight","currentPos","currentBbox","moveParam","height","labelHeight","x1","x2","y1","y2","console","log","dx","dy","newPos","childNodes","children","parentBbox","childNode","childBbox","_dx","_dy","nextPosition","oldPosition","props","show","onHide","handleClose","EModalType","ABOUT","Header","closeButton","Title","Body","className","src","alt","Footer","href","Component","addSelImage","addAllImage","hexToRGBA","str","EGridType","defaultShape","fill","width","stroke","labels","shapeBank","svgNameSpace","svgElement","document","createElementNS","shape","offsetX","textOffsetX","cellWidth","offsetY","Math","floor","textOffsetY","g","appendChild","text","setAttributeNS","toString","textNode","createTextNode","setAttribute","paddingTop","bsSize","CHELP","patientView","cellPadding","paddingLeft","dangerouslySetInnerHTML","__html","generateOncoprintLegend","outerHTML","CONFIRMATION","onClick","ConfirmationModal","pendingFunction","sharedb","socket","connection","gridSize","defaultSettings","guideColor","newType","enabledType","NONE","dialogClassName","onShow","pathwayActions","GRID","sm","checked","onChange","setEnabledType","GUIDE","e","marginTop","adjustGridSettings","toggleGrid","toggleGuide","GridSettings","tree","mappedArr","len","arrElem","mappedElem","SVGNameSpace","EDGE_ARROW_SCALE","svg","resetSVG","cyBounds","extent","nodeTree","createGraphHierarchy","traverseFunction","genomicDataSVG","getGenomicDataSVG","oncoprintDataSVG","getOncoprintDataSVG","createRect","labelOffset","GENOMICDATA_LABEL_Y_OFFSET","createNodeLabel","elemSVG","nodePosition","svgX","getAttribute","svgY","rootLevelNode","drawEdge","sourceEndpoint","targetEndpoint","targetArrowShape","lineStyle","curveStyle","segmentPoints","controlPoints","labelElement","createEdgeLabel","lastAnchor","edgeEndpoint","unitV","unitVector","inverseUnitV","scale","targetX","targetY","TRIANGLE_ARROW_HEAD_HEIGHT","point1Vector","rotateVector","PI","point2Vector","TRIANGLE_ARROW_HEAD_WIDTH","point1X","point1Y","point2X","point2Y","polySVG","T_ARROW_HEAD_HEIGHT","lineSVG","T_ARROW_HEAD_WIDTH","EDGE_WIDTH","DASH_PARAMETERS","pathSVG","pathPoints","furtherEndPoint","join","polylineSVG","polylinePoints","nodeRectangle","COMPOUND_MARGIN","createStyleForNodes","genomicDataOffset","verticalTextOffset","svgText","NODE_FONT_SIZE","innerHTML","strokeWidth","NODE_STROKE_WIDTH","strokeColor","NODE_STROKE_COLOR","fillColor","NODE_FILL_COLOR","opacity","NODE_OPACITY","strokeOpacity","ROUNDING_FACTOR","COMPARTMENT_STROKE_WIDTH","FAMILY_FILL_COLOR","FAMILY_STROKE_COLOR","styleString","labelText","svgTextElement","fontSize","fontFamily","labelRotationAngle","getEdgeLabelRotationAngle","lineHeight","rscratch","labelLineHeight","sin","labelAngle","cos","labelPos","labelX","labelY","toDegrees","radians","v","inverseLength","sqrt","scalar","genomicDataMap","visibleGenomicDataMapByType","groupedGenomicDataMap","groupedGenomicDataCount","genomicData","cancerTypes","metaLineColumns","DEFAULT_VISIBLE_GENOMIC_DATA_COUNT","lineContent","geneSymbol","visibilityMap","_key","isVisible","getRequiredWidthForGenomicData","update","patientData","colorScheme","observers","oldCount","groupID","parseGenomicData","showGenomicData","notifyObservers","geneMap","visMap","cancerKey","keys","cancerStudy","cancerData","toFixed","showPatientData","genomicDataBoxCount","cancerType","countVisibleGenomicDataByType","nodeLabel","eleBBox","reqWidth","overlayRecBoxW","overLayRectBBox","overlayRecBoxH","genomicFrequencyData","maxGenomicDataBoxCount","genomicBoxCounter","genomicDataRectangleGenerator","percent","parentSVG","temp","limits","pairs","entries","map","hex","result","color","Number","exec","b","sort","o1","o2","lower","Infinity","upper","findValueColorInterval","upperValue","lowerValue","upperColor","lowerColor","up","low","ratio","getMappedColor","colorString","round","overlayRect","textPercent","xOffset","colorValueMap","hideGenomicData","encodeURIComponent","generateSVGForNode","observer","notify","geneData","count","altType","geneticTrackData","generateOncoprintForPatientNode","on","event","cyTarget","ref","popperRef","dummyDomEle","createElement","body","tip","getReferenceClientRect","getBoundingClientRect","trigger","placement","interactive","theme","content","generateHTMLContentForNodeTooltip","onHidden","instance","destroy","remove","one","hide","selectedGene","oncoprintColors","Missense_Mutation","inframe","truncating","Fusion","AMP","gain","heatloss","homdel","DeepDel","in_frame_del","alterationBoxCount","getAlterationCountForPatient","genomicAlterationData","alterationType","getOncoprintColors","genomicDataRectangleGeneratorPatient","textLength","ruleset","geneticTrackRuleSetParams","universalShapes","getUniversalShapes","shapesPerDatum","getSpecificShapesForDatum","specificShapes","concat","shapes","alterationTypeKey","iconColor","iconText","sampleIconColorMap","sampleColors","sampleIndexMap","sampleIndex","wrapper","sample","sampleId","sampleIconSvgHTML","generateSvgIconForSample","margin","sampleWrapper","sampleData","mutationInfo","cnaInfo","fusionInfo","gene","hugoGeneSymbol","disp_mut","proteinChange","mutationType","disp_cna","alteration","cnaLabelKey","cnaLabel","getCNADisplayString","disp_fusion","mutationInfoHTML","cnaInfoHTML","fusionInfoHTML","mutation","cna","fusion","sampleIdHTML","append","_","isCollaborative","shareDBManager","cyInst","isCBioPortal","undoRedoManager","portalAccessor","profiles","genomicDataOverlayColorScheme","colorSchemeChangeCallback","isCbioPortal","edgeEditingOptions","bendPositionsFunction","controlPositionsFunction","undoable","anchorShapeSizeFactor","enabled","handleReconnectEdge","reconnectEdge","enableMultipleAnchorRemovalOption","FIT_CONSTANT","layoutProperties","EditorActionsManager","defaultLayoutProperties","genomicDataOverlayManager","svgExporter","action","doChangePosition","undoChangePosition","doChangeNodeSize","undoChangeNodeSize","doChangeCompoundSize","undoChangeCompoundSize","doChangename","undoChangeName","doHide","undoHide","doShow","undoShow","doHighlightInvalidGenes","undoHighlightInvalidGenes","doHighlight","undoHighlight","profile","scheme","viewUtilitiesRef","viewUtilities","movedNodeArr","changeElementsPositionByAlignment","do","newMovedNodes","currentNodePosition","selectedNodes","changeNodePositionsShareDB","args","newWidth","newHeight","oldWidth","oldHeight","newMinWidth","newMinWidthBiasLeft","newMinWidthBiasRight","newMinHeight","newMinHeightBiasTop","newMinHeightBiasBottom","oldMinWidth","oldMinWidthBiasLeft","oldMinWidthBiasRight","oldMinHeight","oldMinHeightBiasTop","oldMinHeightBiasBottom","newName","changeName","changeNameCy","currentName","oldName","newArgs","sel","nodesToHide","each","ch","selected","visible","elements","unselect","changeVisibility","hid","invalidHighlightedGenesIDs","invalidGenesIDs","highlightedGenesIDs","highlightedEdgesIDs","hiddenGenesIDs","$","addClass","geneSymbols","getGeneSymbols","validateGenes","validGeneSymbols","invalidGenes","geneName","changeHighlightInvalidGenes","highlightedGenes","nodesToAddInvalidHighlight","hasClass","union","actions","geneIDs","nodesToRemoveInvalidHighlight","removeClass","elementsToHighlight","changeHighlight","neighbors","neighborhood","nodesToRemoveHighlight","isEdge","removeInvalidGeneHighlights","removeOtherHighlight","undoRedo","parentNodes","moveElements","newState","zoomLevel","zoom","panLevel","pan","updateGlobalOptions","getEmptyGroupID","cancerNames","groupGenomicData","addPubmedIDs","pubmedArray","validPubmedIDs","filter","isNaN","apply","uniq","removePubmedID","difference","anchorPointsArray","updateEdgeAnchorPoints","registerObserver","dataMap","addGenomicVisibilityData","updateGenomicDataVisibility","setGenomicDataOverlayColorScheme","updateGenomicDataOverlayColorScheme","updateColorScheme","op","globalOptions","li","newOptions","newLayoutProps","updateLayoutProperties","options","eles","nodeData","posData","addNewNodeToShareDB","addNodetoCy","addNode","nodeArr","updateCompoundBounds","isRemove","oi","od","cyEle","removeElementCy","addNewNodeLocally","realtimeNode","addNewNode","addNewEdgeShareDB","addNewEdgetoCy","addEdge","newEdges","addNewEdge","addNewEdgeLocally","realTimeNodeArray","realTimeEdgeArray","nodeList","realTimeNode","nodeWidth","nodeHeight","compoundMinWidth","minWidth","compoundMinWidthBiasLeft","minWidthBiasLeft","compoundMinWidthBiasRight","minWidthBiasRight","compoundMinHeight","minHeight","compoundMinHeightBiasTop","minHeightBiasTop","compoundMinHeightBiasBottom","minHeightBiasBottom","edgeList","tmpData","initAnchorPoints","getElementById","sourceID","targetID","reconnectEdgeInShareDB","location","move","removeElementsFromShareDB","removeElementsCy","removeElement","newParentId","changeParentShareDB","parentData","parameters","parentElem","firstTime","posDiffX","posDiffY","elementById","classRef","nodeObj","nodeRef","connectedEdges","topMostNodes","tpMostNodes","parentMap","nodeParent","getTopLevelParents","rootNodeR","NodeObj","traverseNodes","rootNodeObj","lengthOfChildrenArray","changeParent","lockedNodes","removedEles","removeNodes","removedNode","moveElement","resizeCompound","previousWidth","previousHeight","resizeElement","mergeGraph","mergeGraphCy","fitGraph","nodesToBeAdded","edgesToBeAdded","sourceNode","targetNode","cySourceNode","edgesBtw","fit","loadfileShareDB","loadFileCy","addNodesCy","addEdgesCy","loadGraph","removeAllElements","isHighlighted","isHidden","eleID","isNode","updateVisibility","updateHighlight","isInvalidGene","deleteSelectedAnchor","clearGenomicData","clearAllGenomicData","parsedGenomicData","prepareGenomicDataShareDB","addGenomicData","study","addGenomicDataLocally","profileId","isEnabled","targetProfileIndex","setProfile","addProfile","preparePortalGenomicDataShareDB","addPortalGenomicData","newData","removeGenomicDataWithGeneSymbol","addGenomicDataWithGeneSymbol","addGenomicGroupData","addToProfiles","removeGenomicVisData","removeProfiles","addGenomicVisData","adjustVisibilityShareDB","setSizeOfElement","ur","nodeEditing","refreshGrapples","nodeRepulsion","idealEdgeLength","edgeElasticity","nestingFactor","gravity","numIter","tile","animate","randomize","gravityRangeCompound","gravityCompound","gravityRange","tilingPaddingVertical","tilingPaddingHorizontal","initialEnergyOnIncremental","animationDuration","animationEasing","bound","a","internalLayoutProperties","LayoutProperties","val","onEnter","LAYOUT","updateInternalLayoutProperty","setLayoutProperties","getPathwayInfo","textAlign","rows","setPathwayInfo","PW_DETAILS","PathwayDetailsModal","addButtonImg","deleteButtonImg","initColorMappings","prevProps","colorMappings","colorValueMapping","splice","showUniqueValuesWarningModal","mapping","pair","setShowUniqueValuesWarningModal","handleColorMappingChange","PROFILES_COLOR_SCHEME","mappingElements","padding","md","handleValueChange","handleColorChange","removeColorMapping","close","paddingRight","addDefaultColorMapping","setDefaultColorMapping","handleSaveColorScheme","ProfilesColorSchemeModal","showEnabledProfileWarningModal","enabledProfiles","enabledProfileCountLimit","profileEnabledMap","handleProfileLabelClicked","profileLabels","Fragment","enabledProfileCount","setShowEnabledProfileWarningModal","cursor","bsStyle","PROFILES","ProfilesModal","HELP","CBioPortalAccessor","MUTATION","GENE_EXPRESSION","CNA","callbackFunction","cancerStudies","request","XMLHttpRequest","onreadystatechange","readyState","DONE","status","responseText","error","open","GET_ALL_CANCER_STUDIES_URL","send","outData","cancerProfileName","isSupportedCancerProfile","GET_GENETIC_PROFILES_URL","endsWith","MRNA_EXP_STUDY_NAME","CNA_EXP_STUDY_NAME","MUTATION_EXP_STUDY_NAME","paramLines","geneticProfileId","startIndex","startsWith","numOfTumorSamples","geneticProfileType","getDataType","profileDataAlteration","CNA_GAIN","CNA_DELETION","Z_SCORE_UPPER_THRESHOLD","Z_SCORE_LOWER_THRESHOLD","calcAlterationPercentages","success","queryURL","GET_PROFILE_DATA_URL","caseSetId","isFirst","genes","nodeSymbols","JSON","parse","validGeneArray","highlightInvalidGenes","VALIDATE_GENES_URL","setRequestHeader","stringify","bottom","selectedStudyData","fetchStudy","ready","dataTypeFetchResultsReady","itemArray","query","searchQuery","dataType","properties","dataTypes","studyCount","studyListItemCheckboxChecked","selectedDataTypesPerStudy","studyIndex","selectedStudy","selectedStudies","showDataTypeSelectionModal","studyId","setDataTypeFetchResultsReady","getSupportedGeneticProfiles","disableAllDataTypes","setDataTypeProperties","setTimeout","getDataTypes","fetchCancerStudies","studyTitle","studyData","numOfStudies","initStudyListItemCheckboxChecked","initSelectedDataTypesPerStudy","setItemArray","setSelectedStudyData","clearSelectedStudies","clearStudyCheckboxesChecked","clearSelectedDataTypesPerStudy","currentlySelectedItemIndex","STUDY","resetModal","placeholder","setSearchQuery","maxHeight","overflow","border","borderRadius","item","obj","toLowerCase","marginBottom","boundingRect","checkboxModalPosition","preparePortalAccess","toggleStudyListItemCheckboxChecked","setShowDataTypeSelectionModal","removeSelectedStudy","unselectDataTypesForStudy","marginLeft","top","inline","disabled","handleCheckboxClick","currentDataTypes","addSelectedStudy","bsClass","loadFromCBio","StudyModal","TCGA_PANCAN_PATHWAY_NAMES","isPercentageMatch","isAlterationEnabled","considerOnlyTCGAPanPathways","dropDownTitle","isExpanded","setBestPathwayMethod","selectedPathway","shownPathways","pathwayName","bestPathways","bestPathwaysAlgos","filterBestPathwaysByTCGAPanPathways","pathway","changePathway","tableComponent","score","genesMatched","onPathwayClick","toggleConsiderOnlyTCGAPanPathways","TCGA_PANCAN_EXPLANATION","display","onApplyClick","COUNT_PERC_EXPLANATION","ALTERATION_EXPLANATION","Ranking","aboutImage","selectedGenes","studyQuery","alterationData","saveAs","performLayout","getSelectedNodes","noneGeneList","message","validGenes","onAddGenes","showMessage","pathwayGenes","window","handleOpen","Toolbar","pathwayHandler","fileManager","queryGenes","saveLayoutProperties","gridOptionsManager","setSnapToGuidelines","setShowGrid","resizeNodesToContent","viewOperationsManager","handleNodeAlignment","isMerge","file","files","processFile","overlayUploader","click","formData","FormData","linesOfData","uploader","merger","inputRef","undo","redo","eh","saveGraph","reset","commitNewPathway","resetUndoStack","highlightNeighbors","highlightSelected","showAllNodes","hideSelectedNodes","selectedEles","edgeTypeIndex","edgeAddingMode","disable","enable","cyNode","toUpperCase","nodesContainingSearchedGene","nodesToSelect","highlightBySearch","removeGenomicData","clearProfiles","removeAllHighlight","parseGraph","graphJSON","json","loadFile","saveAsSVG","saveAsPNG","saveAsJPEG","exists","searchedGene","fileFunctions","function","newPathway","tooltip","upload","export","modFunctions","deleteSelected","alignFunctions","align","utilFunctions","isFocused","visibilityFunctions","hideSelected","showAll","layoutFunctions","allFunctions","fluid","backgroundColor","paddingBottom","functions","borderTopRightRadius","borderBottomRightRadius","onKeyPress","searchGene","Addon","glyph","Buttonbar","init","ctxMenus","scratch","contextMenus","menuItems","coreAsWell","onClickFunction","hasTrailingDivider","selectedElements","containerType","validNodes","size","notValid","tmpNode","isChildren","compId","changeParents","nonCollabItems","appendMenuItems","queryNode","pubmedData","header","classList","textInputWrapper","inputElement","addEventListener","edgeLabelRowElement","colElement","pubmedTextInputWrapper","pubmedIdInputElement","pubmedIdsToAdd","generatePubmedLinks","pubmedIdRowElement","pubmedIdColElement","argData","getElementsByClassName","pubmedIdListWrapper","pubmedIdLabel","pubmedId","pubmedIdListElement","pubmedIdRemoveButton","parentElement","pubmedContent","pubmedIdLink","pubmedLink","rowElement","buttonWrapper","button","preventDefault","generateNodeQtip","generateEdgeQtip","string","charAt","postFileLoadCallback","edgeMap","doc","EDGEMAP_NAME","Error","updateShareDBObject","postFileLoad","submitOp","shareDBError","ops","genomicMap","GENOMIC_DATA_MAP_NAME","VISIBLE_GENOMIC_DATA_MAP_NAME","genomicDataGroupMap","GENOMIC_DATA_GROUP_NAME","genomicDataGroupCount","GENOMIC_DATA_GROUP_COUNT","na","mapName","objectKey","LAYOUT_PROPS_NAME","GLOBAL_OPTS_NAME","getGlobalOptions","ld","GENOMIC_DATA_COLOR_SCHEME_NAME","subscribe","err","WebSocket","host","Connection","getParam","loadFileCallback","onFileLoaded","createNewDocument","new_id","getCustomObjId","genomicDataGroupList","genomicDataColorScheme","history","pushState","fetch","initializeSharedDBDoc","syncInitialSharedDocData","initSharedDocEventHandlers","NODEMAP_NAME","shareDBLayoutProperties","visDataMap","invalidHighlightedGenes","hiddenGenes","tmpNodeId","highlightedEdges","tmpEdge","tmpEdgeId","bendPoint","pubmedID","edgeLabel","edgeInitializer","tmpEdgeID","newEdgeID","applyShareDBOperation","addNewElementsLocally","highlightElementsInitially","updateLayoutPropertiesCallback","changeGlobalOptions","insertShareDBObject","currentMap","getGenomicDataOverlayColorScheme","updateGenomicDataColorSchemeHandler","key_g","nodeAddRemoveHandler","shareDBNodeAddRemoveEventCallBack","edgeAddRemoveHandler","shareDBEdgeAddRemoveEventCallBack","genomicDataAddRemoveHandler","shareDBGenomicDataHandler","genomicDataVisibilityChangeHandler","shareDBGenomicDataVisibilityHandler","checkShareDBGenomicData","genomicDataGroupChangeHandler","shareDBGenomicDataGroupChangeHandler","updateElementHandler","updateElementCallback","updateLayoutPropsHandler","updateGlobalOptionsHandler","handleOp","path","isShareDBReplaceEvent","returnCount","incrementShareDBGroupCount","inGroupId","genomicGroupMap","genomicVisMap","currentGroup","clearShareDBGenomicData","genomicMapEntry","elementID","realTimeEdge","realTimeGeneratedID","nodeInitializer","deleteShareDBObject","coll","currentX","currentY","nodeIDs","isInvalid","collaborativeNode","nonDuplicateArray","removedIndices","tmpID","rootNode","nodeLookupTable","traverseFromRoot","parId","refNode","refNodeId","currentWidth","currentHeight","newNodeData","newNodeId","newSource","newTarget","oldIdNewIdMap","traverseTree","createGraphHierarchyRealTime","bendPointPositions","controlPointPositions","realTimeNodeMap","realTimeNodeLookupTable","realTimeNodeNameLookupTable","nodeMapItem","sameNodeId","newLayoutProperties","updateShareDBLayoutProperties","updateShareDBGlobalOptions","newColorScheme","updateShareDBGenomicDataOverlayColorScheme","Date","now","performance","replace","random","urlParam","regExp","RegExp","match","search","initNodeAdd","nodeAddClass","defaults","backgroundColorDiv","borderColorDiv","borderWidthDiv","borderRadiusDiv","icon","nodeParams","fn","cytoscapeNodeadd","extend","find","components","component","dragContainer","container","$nodeadd","$nodeDragHandle","stopPropagation","background","draggable","helper","$container","droppable","activeClass","drop","ui","currentOffset","relX","pageX","left","relY","pageY","attr","nodeBbox","renderedBoundingBox","arguments","cynodeadd","edgeHandles","fcose","panzoom","panzoomOpts","konva","popper","layoutUtilities","nextProps","getPathway","onPathwayChangeCompleted","pathways","allEles","cyDivHandler","isMountedFirst","div","cyDiv","initCyJS","initCyHandlers","initKeyboardHandlers","initUndoRedoFunctionality","initCBioPortalFunctionalities","placePanzoomAndOverlay","topCy","leftCy","heightCy","widthCy","outerWidth","heightNavigator","widthNavigator","pathwayDetailsView","getPathwayData","boxSelectionEnabled","autounselectify","wheelSensitivity","textureOnViewport","motionBlur","layout","getDoc","setEditor","initShareDB","qtipManager","cxtMenuManager","dragDropNodeAddManager","desiredAspectRatio","nodeadd","edgeHandleDefaults","preview","stackOrder","handleSize","handleColor","handleLineType","handleLineWidth","handleNodes","hoverDelay","cxt","toggleOffOnLeave","handlePosition","loopAllowed","nodeLoopOffset","edgeParams","start","getGlobalEdgeType","complete","targetNodes","addedEntities","stop","setActiveEdge","edgehandles","editorHandler","grappleSize","grappleColor","inactiveGrappleStroke","boundingRectangle","boundingRectangleLineDash","boundingRectangleLineColor","boundingRectangleLineWidth","zIndex","moveSelectedNodesOnKeyEvents","getCompoundMinWidth","getCompoundMinHeight","getCompoundMinWidthBiasRight","getCompoundMinWidthBiasLeft","getCompoundMinHeightBiasTop","getCompoundMinHeightBiasBottom","isFixedAspectRatioResizeMode","is","isNoResizeMode","setWidth","setHeight","setCompoundMinWidth","setCompoundMinHeight","setCompoundMinWidthBiasLeft","setCompoundMinWidthBiasRight","minHeightBiasRight","setCompoundMinHeightBiasTop","setCompoundMinHeightBiasBottom","cursors","default","inactive","nw","ne","se","sw","resizeToContentCueImage","resizeToContentFunction","navigator","viewLiveFramerate","thumbnailEventFramerate","thumbnailLiveFramerate","dblClickDelay","removeCustomContainer","rerenderDelay","highlighted","unhighlighted","setVisibilityOnHide","setDisplayOnHide","neighbor","neighborSelectTime","setViewUtilities","tappedBefore","tappedTimeout","that","tappedNow","clearTimeout","addQtipToElements","pushSelectedNodeStack","removeElementFromSelectedNodeStack","descendants","postLayout","_e","_type","resizeElements","lastSelectedEdge","changeNodePositionsByArrows","keydown","which","ctrlKey","metaKey","tn","activeElement","tagName","select","CytoscapeArea","pathwayDropdownData","pwName","isPancanatlas","dashPos","pwHead","eventKey","doesCyHaveElements","merge","resizeToContent","highlightNeighbours","loadSampleData","uploadOverlay","removeAllData","pullRight","Brand","setActiveEdgeHandler","edgeIndex","activeEdge","edgeImgs","Heading","Sidebar","maxHeapFn","maxHeap","isModalShown","extractAllGenes","cBioAlterationData","calculatePatientData","addSampleIconData","sampleIconData","calculateAlterationData","addGenomicDataHandler","CBIO_PROFILE_NAME","getBestPathway","PathwayMapper","updateGenomicDataColorScheme","geneAltData","perc","altered","sequenced","NaN","uniqueTypes","percentAltered","studyGeneMap","geneAlterationMap","sum","values","rankingMode","getGeneStudyMap","alterationPerGene","getAlterationAveragePerGene","matchedGenesMap","pathwayGeneMap","genesMatching","sumOfAlterations","geneCount","insert","extractMax","getValue","getKey","setSelectedPathway","geneHash","includePathway","redirectedProfile","metadata","warn","newProfile","MAX_ALLOWED_PROFILES_ENABLED","getProfileData","visibilityObject","emphasizeQueryGenes","cytoComp","innerWidth","xs","messageBanner","toggleProfileEnabled","setColorMapping","autoClose","hideProgressBar","newestOnTop","closeOnClick","rtl","pauseOnFocusLoss","pauseOnHover","clickable","maxWidth","setUploaders","onChangeFile","setOverlayUploader","overlayFromText","modalId","loadRedirectedPortalData","changePathwayHandler"],"mappings":"2BACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QA0Df,OArDAF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,I,gBClFrDhC,EAAOD,QAAUkC,QAAQ,U,cCAzBjC,EAAOD,QAAUkC,QAAQ,oB,cCAzBjC,EAAOD,QAAUkC,QAAQ,S,cCAzBjC,EAAOD,QAAUkC,QAAQ,uB,cCAzBjC,EAAOD,QAAUkC,QAAQ,W,cCAzBjC,EAAOD,QAAUkC,QAAQ,e,cCAzBjC,EAAOD,QAAUkC,QAAQ,W,cCAzBjC,EAAOD,QAAUkC,QAAQ,c,+1oFCAzBjC,EAAOD,QAAU,kqF,cCAjBC,EAAOD,QAAUkC,QAAQ,mB,cCAzBjC,EAAOD,QAAUkC,QAAQ,gB,cCAzBjC,EAAOD,QAAU,sgH,cCAjBC,EAAOD,QAAU,s7G,cCAjBC,EAAOD,QAAUkC,QAAQ,e,cCAzBjC,EAAOD,QAAU,sgB,cCAjBC,EAAOD,QAAUkC,QAAQ,a,cCAzBjC,EAAOD,QAAU,0hF,gCCAjBC,EAAOD,QAAU,kpG,cCAjBC,EAAOD,QAAU,8lD,cCAjBC,EAAOD,QAAUkC,QAAQ,4B,cCAzBjC,EAAOD,QAAUkC,QAAQ,kB,cCAzBjC,EAAOD,QAAU,0sC,cCAjBC,EAAOD,QAAU,8wC,cCAjBC,EAAOD,QAAU,0tC,cCAjBC,EAAOD,QAAU,swC,cCAjBC,EAAOD,QAAU,8uC,cCAjBC,EAAOD,QAAU,0uC,cCAjBC,EAAOD,QAAU,85J,cCAjBC,EAAOD,QAAU,s8E,cCAjBC,EAAOD,QAAU,8/E,cCAjBC,EAAOD,QAAU,kuD,cCAjBC,EAAOD,QAAU,0oR,cCAjBC,EAAOD,QAAU,0tE,cCAjBC,EAAOD,QAAU,0vG,cCAjBC,EAAOD,QAAU,k5S,cCAjBC,EAAOD,QAAU,0gE,cCAjBC,EAAOD,QAAU,s4I,cCAjBC,EAAOD,QAAU,89E,cCAjBC,EAAOD,QAAU,spY,cCAjBC,EAAOD,QAAU,0/C,cCAjBC,EAAOD,QAAU,8yI,cCAjBC,EAAOD,QAAU,0pH,cCAjBC,EAAOD,QAAU,0oH,cCAjBC,EAAOD,QAAU,kpH,cCAjBC,EAAOD,QAAU,0oH,cCAjBC,EAAOD,QAAU,kjG,cCAjBC,EAAOD,QAAU,8jC,cCAjBC,EAAOD,QAAU,k1K,cCAjBC,EAAOD,QAAU,ssI,cCAjBC,EAAOD,QAAU,k3K,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","file":"index.es5.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 80);\n","module.exports = require(\"react\");","module.exports = require(\"react-bootstrap\");","module.exports = require(\"mobx\");","module.exports = require(\"autobind-decorator\");","module.exports = require(\"jquery\");","module.exports = require(\"mobx-react\");","module.exports = require(\"lodash\");","module.exports = require(\"cytoscape\");","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNDdweCIgaGVpZ2h0PSI0N3B4IiB2aWV3Qm94PSIwIDAgNDcgNDciIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ3IDQ3OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxnPgoJPGcgaWQ9IkxheWVyXzFfMTEwXyI+CgkJPGc+CgkJCTxwYXRoIGQ9Ik0xNy41NjcsMTUuOTM4bC0yLjg1OS0yLjcwMmMwLjMzMy0wLjYwNSwwLjUzOS0xLjI5LDAuNTM5LTIuMDI5YzAtMi4zNDItMS44OTctNC4yMzktNC4yNC00LjIzOQoJCQkJYy0yLjM0MywwLTQuMjQzLDEuODk2LTQuMjQzLDQuMjM5YzAsMi4zNDMsMS45LDQuMjQxLDQuMjQzLDQuMjQxYzAuODI2LDAsMS41OS0wLjI0NiwyLjI0Mi0wLjY1NGwyLjg1NSwyLjY5OQoJCQkJQzE2LjUzNiwxNi45MjIsMTcuMDIzLDE2LjM5OSwxNy41NjcsMTUuOTM4eiIvPgoJCQk8cGF0aCBkPSJNMjkuNjYsMTUuNmwzLjc5OS02LjM5M2MwLjM3NCwwLjEwNywwLjc2MiwwLjE4NCwxLjE2OSwwLjE4NGMyLjM0NywwLDQuMjQ0LTEuODk4LDQuMjQ0LTQuMjQxCgkJCQljMC0yLjM0Mi0xLjg5Ny00LjIzOS00LjI0NC00LjIzOWMtMi4zNDMsMC00LjIzOSwxLjg5Ni00LjIzOSw0LjIzOWMwLDEuMTYzLDAuNDY5LDIuMjE0LDEuMjI3LDIuOTgxbC0zLjc4Nyw2LjM3NQoJCQkJQzI4LjQ4LDE0LjgwMSwyOS4wOTQsMTUuMTY5LDI5LjY2LDE1LjZ6Ii8+CgkJCTxwYXRoIGQ9Ik00Mi43NjIsMjAuOTUyYy0xLjgyNCwwLTMuMzY5LDEuMTU5LTMuOTY4LDIuNzc1bC01LjI3OC0wLjUyMWMwLDAuMDQsMC4wMDYsMC4wNzgsMC4wMDYsMC4xMTcKCQkJCWMwLDAuNjg4LTAuMDc2LDEuMzYtMC4yMTMsMi4wMDlsNS4yNzYsMC41MjFjMC4zMTksMi4wMjQsMi4wNjIsMy41NzYsNC4xNzcsMy41NzZjMi4zNDIsMCw0LjIzOC0xLjg5Niw0LjIzOC00LjIzOAoJCQkJQzQ3LDIyLjg1LDQ1LjEwNCwyMC45NTIsNDIuNzYyLDIwLjk1MnoiLz4KCQkJPHBhdGggZD0iTTI4LjE5NywzNy42MjRsLTEuMTgtNS4xNTZjLTAuNjY2LDAuMjMyLTEuMzU5LDAuMzk4LTIuMDgyLDAuNDgxbDEuMTgyLDUuMTU3Yy0xLjM1NSwwLjcwOS0yLjI5LDIuMTEtMi4yOSwzLjc0NgoJCQkJYzAsMi4zNDIsMS44OTYsNC4yMzcsNC4yNDMsNC4yMzdjMi4zNDIsMCw0LjIzOC0xLjg5Niw0LjIzOC00LjIzN0MzMi4zMTEsMzkuNTUzLDMwLjQ3OSwzNy42OTIsMjguMTk3LDM3LjYyNHoiLz4KCQkJPHBhdGggZD0iTTE0LjM1NywyNS4zN2wtNi41NywyLjIwMWMtMC43NTgtMS4xNTgtMi4wNjMtMS45MjYtMy41NDgtMS45MjZDMS44OTYsMjUuNjQ1LDAsMjcuNTQyLDAsMjkuODg0CgkJCQljMCwyLjM0NSwxLjg5Niw0LjI0Miw0LjIzOSw0LjI0MmMyLjM0MSwwLDQuMjQyLTEuODk3LDQuMjQyLTQuMjQyYzAtMC4wOTgtMC4wMjEtMC4xODgtMC4wMjktMC4yODRsNi41OTEtMi4yMDcKCQkJCUMxNC43NDYsMjYuNzUyLDE0LjUxLDI2LjA3NywxNC4zNTcsMjUuMzd6Ii8+CgkJCTxjaXJjbGUgY3g9IjIzLjgzIiBjeT0iMjMuMzIzIiByPSI3LjI3MSIvPgoJCTwvZz4KCTwvZz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K\"","module.exports = require(\"react-toastify\");","module.exports = require(\"oncoprintjs\");","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNTUwLjgwMXB4IiBoZWlnaHQ9IjU1MC44MDFweCIgdmlld0JveD0iMCAwIDU1MC44MDEgNTUwLjgwMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUwLjgwMSA1NTAuODAxOyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNMTQ2Ljc0NywyNzYuNzA4YzAtMTMuOTk4LTkuNzExLTIyLjM1Mi0yNi44ODctMjIuMzUyYy02Ljk5LDAtMTEuNzI2LDAuNjc1LTE0LjIwNCwxLjM1NXY0NC45MjcKCQljMi45MzIsMC42NzYsNi41MzksMC44OTYsMTEuNTIsMC44OTZDMTM1LjQ0OSwzMDEuNTQ2LDE0Ni43NDcsMjkyLjI4LDE0Ni43NDcsMjc2LjcwOHoiLz4KCTxwYXRoIGQ9Ik00ODguNDI2LDE5Ny4wMTlINDc1LjJ2LTYzLjgxNmMwLTAuMzk4LTAuMDYzLTAuNzk5LTAuMTE2LTEuMjAyYy0wLjAyMS0yLjUzNC0wLjgyNy01LjAyMy0yLjU2Mi02Ljk5NUwzNjYuMzI1LDMuNjk0CgkJYy0wLjAzMi0wLjAzMS0wLjA2My0wLjA0Mi0wLjA4NS0wLjA3NmMtMC42MzMtMC43MDctMS4zNzEtMS4yOTUtMi4xNTEtMS44MDRjLTAuMjMxLTAuMTU1LTAuNDY0LTAuMjg1LTAuNzA2LTAuNDE5CgkJYy0wLjY3Ni0wLjM2OS0xLjM5My0wLjY3NS0yLjEzMS0wLjg5NmMtMC4yLTAuMDU2LTAuMzgtMC4xMzgtMC41OC0wLjE5QzM1OS44NywwLjExOSwzNTkuMDM3LDAsMzU4LjE5MywwSDk3LjIKCQljLTExLjkxOCwwLTIxLjYsOS42OTMtMjEuNiwyMS42MDF2MTc1LjQxM0g2Mi4zNzdjLTE3LjA0OSwwLTMwLjg3MywxMy44MTgtMzAuODczLDMwLjg3M3YxNjAuNTQ1CgkJYzAsMTcuMDQzLDEzLjgyNCwzMC44NywzMC44NzMsMzAuODdoMTMuMjI0VjUyOS4yYzAsMTEuOTA3LDkuNjgyLDIxLjYwMSwyMS42LDIxLjYwMWgzNTYuNGMxMS45MDcsMCwyMS42LTkuNjkzLDIxLjYtMjEuNjAxCgkJVjQxOS4zMDJoMTMuMjI2YzE3LjA0NCwwLDMwLjg3MS0xMy44MjcsMzAuODcxLTMwLjg3di0xNjAuNTRDNTE5LjI5NywyMTAuODM4LDUwNS40NywxOTcuMDE5LDQ4OC40MjYsMTk3LjAxOXogTTk3LjIsMjEuNjA1CgkJaDI1MC4xOTN2MTEwLjUxM2MwLDUuOTY3LDQuODQxLDEwLjgsMTAuOCwxMC44aDk1LjQwN3Y1NC4xMDhIOTcuMlYyMS42MDV6IE0yMzQuMzQ0LDMzNS44NnY0NS44MzFoLTMxLjYwMVYyMjkuNTI0aDQwLjE4NAoJCWwzMS42MTEsNTUuNzU5YzkuMDI1LDE2LjAzMSwxOC4wNjQsMzQuOTgzLDI0LjgyNSw1Mi4xNTRoMC42NzVjLTIuMjU3LTIwLjEwMy0yLjkzMy00MC42NDMtMi45MzMtNjMuNDR2LTQ0LjQ3M2gzMS42MTR2MTUyLjE2NwoJCWgtMzYuMTE3bC0zMi41MTYtNTguNzAzYy05LjA0OS0xNi4yNTMtMTguOTcxLTM1Ljg5Mi0yNi40MzgtNTMuNzI3bC0wLjY2NSwwLjIyMkMyMzMuOTA2LDI4OS41OCwyMzQuMzQ0LDMxMS4wMjcsMjM0LjM0NCwzMzUuODZ6CgkJIE03MS41NTYsMzgxLjY5MVYyMzEuNTZjMTAuNjEzLTEuODA0LDI1LjUxNi0zLjE1OSw0Ni41MDYtMy4xNTljMjEuMjE1LDAsMzYuMzUzLDQuMDYxLDQ2LjUwOSwxMi4xOTIKCQljOS42OTgsNy42NzMsMTYuMjU1LDIwLjMxMywxNi4yNTUsMzUuMjE5YzAsMTQuODk3LTQuOTU5LDI3LjU0OS0xMy45OTksMzYuMTIzYy0xMS43MzgsMTEuMDYzLTI5LjEyMywxNi4wMzEtNDkuNDQxLDE2LjAzMQoJCWMtNC41MjIsMC04LjU5My0wLjIzMS0xMS43MzYtMC42NzV2NTQuNDExSDcxLjU1NlYzODEuNjkxeiBNNDUzLjYwMSw1MjMuMzUzSDk3LjJWNDE5LjMwMmgzNTYuNFY1MjMuMzUzeiBNNDg1LjY1MiwzNzQuNjg4CgkJYy0xMC42MSwzLjYwNy0zMC43MTMsOC41ODUtNTAuODA1LDguNTg1Yy0yNy43NTksMC00Ny44NzItNy4wMDMtNjEuODU3LTIwLjU0NWMtMTMuOTk1LTEzLjEtMjEuNjg0LTMyLjk3LTIxLjQ1Mi01NS4zMTgKCQljMC4yMjItNTAuNTY5LDM3LjAzLTc5LjQ2Myw4Ni45MTctNzkuNDYzYzE5LjY0NCwwLDM0Ljc4MywzLjgyOSw0Mi4yMTksNy40NDZsLTcuMjE0LDI3LjU0M2MtOC4zNjktMy42MTctMTguNzUyLTYuNTUtMzUuNDU4LTYuNTUKCQljLTI4LjY1NiwwLTUwLjM0MSwxNi4yNTYtNTAuMzQxLDQ5LjIyYzAsMzEuMzgyLDE5LjY0OSw0OS44OTIsNDcuODcyLDQ5Ljg5MmM3Ljg5NSwwLDE0LjIxOC0wLjkwMSwxNi45MzQtMi4yNTd2LTMxLjgzNWgtMjMuNDkzCgkJdi0yNi44NjloNTYuNjc5VjM3NC42ODh6Ii8+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+Cg==\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNTUwLjgwMXB4IiBoZWlnaHQ9IjU1MC44MDFweCIgdmlld0JveD0iMCAwIDU1MC44MDEgNTUwLjgwMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUwLjgwMSA1NTAuODAxOyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNNDg4LjQyNiwxOTcuMDE5SDQ3NS4ydi02My44MTZjMC0wLjM5OC0wLjA2My0wLjc5OS0wLjExNi0xLjIwMmMtMC4wMjEtMi41MzQtMC44MjctNS4wMjMtMi41NjItNi45OTVMMzY2LjMyNSwzLjY5NAoJCWMtMC4wMzItMC4wMzEtMC4wNjMtMC4wNDItMC4wODUtMC4wNzZjLTAuNjMzLTAuNzA3LTEuMzcxLTEuMjk1LTIuMTUxLTEuODA0Yy0wLjIzMS0wLjE1NS0wLjQ2NC0wLjI4NS0wLjcwNi0wLjQxOQoJCWMtMC42NzYtMC4zNjktMS4zOTMtMC42NzUtMi4xMzEtMC44OTZjLTAuMi0wLjA1Ni0wLjM4LTAuMTM4LTAuNTgtMC4xOUMzNTkuODcsMC4xMTksMzU5LjAzNywwLDM1OC4xOTMsMEg5Ny4yCgkJYy0xMS45MTgsMC0yMS42LDkuNjkzLTIxLjYsMjEuNjAxdjE3NS40MTNINjIuMzc3Yy0xNy4wNDksMC0zMC44NzMsMTMuODE4LTMwLjg3MywzMC44NzN2MTYwLjU0NQoJCWMwLDE3LjA0MywxMy44MjQsMzAuODcsMzAuODczLDMwLjg3aDEzLjIyNFY1MjkuMmMwLDExLjkwNyw5LjY4MiwyMS42MDEsMjEuNiwyMS42MDFoMzU2LjRjMTEuOTA3LDAsMjEuNi05LjY5MywyMS42LTIxLjYwMQoJCVY0MTkuMzAyaDEzLjIyNmMxNy4wNDQsMCwzMC44NzEtMTMuODI3LDMwLjg3MS0zMC44N3YtMTYwLjU0QzUxOS4yOTcsMjEwLjgzOCw1MDUuNDcsMTk3LjAxOSw0ODguNDI2LDE5Ny4wMTl6IE05Ny4yLDIxLjYwNQoJCWgyNTAuMTkzdjExMC41MTNjMCw1Ljk2Nyw0Ljg0MSwxMC44LDEwLjgsMTAuOGg5NS40MDd2NTQuMTA4SDk3LjJWMjEuNjA1eiBNMzM4Ljg3MSwyMjUuNjcyTDI4NC41NDUsMzg2Ljk2aC00Mi41OTEKCQlsLTUxLjY5LTE2MS4yODhoMzkuOTY3bDE5LjYxNyw2OC4xOTZjNS41MDgsMTkuMTQzLDEwLjUzMSwzNy41NjcsMTQuMzYsNTcuNjdoMC43MTdjNC4wNjEtMTkuMzg1LDkuMDg5LTM4LjUyNywxNC41OTItNTYuOTUzCgkJbDIwLjU4NS02OC45MThoMzguNzdWMjI1LjY3MnogTTY4LjQ1OCwzNzkuNTRsNy40MTUtMzAuMTUzYzkuODExLDUuMDIxLDI0Ljg4OCwxMC4wNTEsNDAuNDM5LDEwLjA1MQoJCWMxNi43NTEsMCwyNS42MDctNi45MzUsMjUuNjA3LTE3LjQ2NWMwLTEwLjA1Mi03LjY2Mi0xNS43OTUtMjcuMDUtMjIuNzM0Yy0yNi44LTkuMzI4LTQ0LjI2My0yNC4xNjgtNDQuMjYzLTQ3LjYxMQoJCWMwLTI3LjUyNCwyMi45NzEtNDguNTc5LDYxLjAxNC00OC41NzljMTguMTg4LDAsMzEuNTkxLDMuODIzLDQxLjE1OSw4LjEzMWwtOC4xMjYsMjkuNDM3Yy02LjQ2NS0zLjExNi0xNy45NDUtNy42NTctMzMuNzQ1LTcuNjU3CgkJYy0xNS43OTEsMC0yMy40NTQsNy4xODMtMjMuNDU0LDE1LjU1MmMwLDEwLjI5Niw5LjA4OSwxNC44NDIsMjkuOTE3LDIyLjczMWMyOC40NjgsMTAuNTM2LDQxLjg3MSwyNS4zNjUsNDEuODcxLDQ4LjA5NAoJCWMwLDI3LjA0Mi0yMC44MTIsNTAuMDEzLTY1LjA5LDUwLjAxM0M5NS43MzEsMzg5LjM0OSw3Ny41MzgsMzg0LjU3MSw2OC40NTgsMzc5LjU0eiBNNDUzLjYwMSw1MjMuMzUzSDk3LjJWNDE5LjMwMmgzNTYuNFY1MjMuMzUzegoJCSBNNDg4LjkxMSwzNzkuNTRjLTExLjI0MywzLjgyMy0zMi41MzcsOS4xMDMtNTMuODMxLDkuMTAzYy0yOS40MzcsMC01MC43My03LjQyNi02NS41Ny0yMS43NzkKCQljLTE0LjgzOS0xMy44NzUtMjIuOTcxLTM0Ljk0Mi0yMi43MzgtNTguNjI1YzAuMjUzLTUzLjYwNCwzOS4yNTUtODQuMjM1LDkyLjEzNy04NC4yMzVjMjAuODEsMCwzNi44NTIsNC4wNzMsNDQuNzQsNy44OTYKCQlsLTcuNjU3LDI5LjIwMmMtOC44NTktMy44MjktMTkuODQ5LTYuOTUtMzcuNTY3LTYuOTVjLTMwLjM5NiwwLTUzLjM1NywxNy4yMzMtNTMuMzU3LDUyLjE3M2MwLDMzLjI2NSwyMC44MSw1Mi44ODIsNTAuNzMsNTIuODgyCgkJYzguMzc1LDAsMTUuMDcyLTAuOTYsMTcuOTQtMi4zOTV2LTMzLjc0NWgtMjQuODc1di0yOC40NzFoNjAuMDQ5VjM3OS41NEw0ODguOTExLDM3OS41NHoiLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K\"","module.exports = require(\"file-saver\");","module.exports = \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItZWRpdCI+PHBhdGggZD0iTTExIDRINGEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoMTRhMiAyIDAgMCAwIDItMnYtNyI+PC9wYXRoPjxwYXRoIGQ9Ik0xOC41IDIuNWEyLjEyMSAyLjEyMSAwIDAgMSAzIDNMMTIgMTVsLTQgMSAxLTQgOS41LTkuNXoiPjwvcGF0aD48L3N2Zz4=\"","module.exports = require(\"tippy.js\");","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE4LjEuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMjMuNjI1IDIzLjYyNSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjMuNjI1IDIzLjYyNTsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggc3R5bGU9ImZpbGw6IzAzMDEwNDsiIGQ9Ik0xMS44MTIsMEM1LjI4OSwwLDAsNS4yODksMCwxMS44MTJzNS4yODksMTEuODEzLDExLjgxMiwxMS44MTNzMTEuODEzLTUuMjksMTEuODEzLTExLjgxMw0KCQlTMTguMzM1LDAsMTEuODEyLDB6IE0xNC4yNzEsMTguMzA3Yy0wLjYwOCwwLjI0LTEuMDkyLDAuNDIyLTEuNDU1LDAuNTQ4Yy0wLjM2MiwwLjEyNi0wLjc4MywwLjE4OS0xLjI2MiwwLjE4OQ0KCQljLTAuNzM2LDAtMS4zMDktMC4xOC0xLjcxNy0wLjUzOXMtMC42MTEtMC44MTQtMC42MTEtMS4zNjdjMC0wLjIxNSwwLjAxNS0wLjQzNSwwLjA0NS0wLjY1OWMwLjAzMS0wLjIyNCwwLjA4LTAuNDc2LDAuMTQ3LTAuNzU5DQoJCWwwLjc2MS0yLjY4OGMwLjA2Ny0wLjI1OCwwLjEyNS0wLjUwMywwLjE3MS0wLjczMWMwLjA0Ni0wLjIzLDAuMDY4LTAuNDQxLDAuMDY4LTAuNjMzYzAtMC4zNDItMC4wNzEtMC41ODItMC4yMTItMC43MTcNCgkJYy0wLjE0My0wLjEzNS0wLjQxMi0wLjIwMS0wLjgxMy0wLjIwMWMtMC4xOTYsMC0wLjM5OCwwLjAyOS0wLjYwNSwwLjA5Yy0wLjIwNSwwLjA2My0wLjM4MywwLjEyLTAuNTI5LDAuMTc2bDAuMjAxLTAuODI4DQoJCWMwLjQ5OC0wLjIwMywwLjk3NS0wLjM3NywxLjQzLTAuNTIxYzAuNDU1LTAuMTQ2LDAuODg1LTAuMjE4LDEuMjktMC4yMThjMC43MzEsMCwxLjI5NSwwLjE3OCwxLjY5MiwwLjUzDQoJCWMwLjM5NSwwLjM1MywwLjU5NCwwLjgxMiwwLjU5NCwxLjM3NmMwLDAuMTE3LTAuMDE0LDAuMzIzLTAuMDQxLDAuNjE3Yy0wLjAyNywwLjI5NS0wLjA3OCwwLjU2NC0wLjE1MiwwLjgxMWwtMC43NTcsMi42OA0KCQljLTAuMDYyLDAuMjE1LTAuMTE3LDAuNDYxLTAuMTY3LDAuNzM2Yy0wLjA0OSwwLjI3NS0wLjA3MywwLjQ4NS0wLjA3MywwLjYyNmMwLDAuMzU2LDAuMDc5LDAuNTk5LDAuMjM5LDAuNzI4DQoJCWMwLjE1OCwwLjEyOSwwLjQzNSwwLjE5NCwwLjgyNywwLjE5NGMwLjE4NSwwLDAuMzkyLTAuMDMzLDAuNjI2LTAuMDk3YzAuMjMyLTAuMDY0LDAuNC0wLjEyMSwwLjUwNi0wLjE3TDE0LjI3MSwxOC4zMDd6DQoJCSBNMTQuMTM3LDcuNDI5Yy0wLjM1MywwLjMyOC0wLjc3OCwwLjQ5Mi0xLjI3NSwwLjQ5MmMtMC40OTYsMC0wLjkyNC0wLjE2NC0xLjI4LTAuNDkyYy0wLjM1NC0wLjMyOC0wLjUzMy0wLjcyNy0wLjUzMy0xLjE5Mw0KCQljMC0wLjQ2NSwwLjE4LTAuODY1LDAuNTMzLTEuMTk2YzAuMzU2LTAuMzMyLDAuNzg0LTAuNDk3LDEuMjgtMC40OTdjMC40OTcsMCwwLjkyMywwLjE2NSwxLjI3NSwwLjQ5Nw0KCQljMC4zNTMsMC4zMzEsMC41MywwLjczMSwwLjUzLDEuMTk2QzE0LjY2Nyw2LjcwMywxNC40OSw3LjEwMSwxNC4xMzcsNy40Mjl6Ii8+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg==\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iQ2FwYV8xIgogICB4PSIwcHgiCiAgIHk9IjBweCIKICAgdmlld0JveD0iMCAwIDU3IDU3IgogICBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1NyA1NzsiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImFkZC1zZWxlY3RlZC1uZXcuc3ZnIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjQgKDVkYTY4OWMzMTMsIDIwMTktMDEtMTQpIj48bWV0YWRhdGEKICAgaWQ9Im1ldGFkYXRhNDciPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGU+PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgaWQ9ImRlZnM0NSI+CgkKCQoJCgkKPC9kZWZzPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTA5NyIKICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNzE5IgogICBpZD0ibmFtZWR2aWV3NDMiCiAgIHNob3dncmlkPSJmYWxzZSIKICAgaW5rc2NhcGU6em9vbT0iNC4xNDAzNTA5IgogICBpbmtzY2FwZTpjeD0iLTEwLjc0Nzg4MSIKICAgaW5rc2NhcGU6Y3k9IjI4LjUiCiAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIKICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iQ2FwYV8xIiAvPgo8cGF0aAogICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICBpZD0icGF0aDIiCiAgIGQ9Ik0gMjguNjYsNiBIIDkuMzQgQyA3LjQ5OCw2IDYsNy40OTggNiw5LjM0IFYgMjguNjYgQyA2LDMwLjUwMiA3LjQ5OCwzMiA5LjM0LDMyIEggMjguNjYgQyAzMC41MDIsMzIgMzIsMzAuNTAyIDMyLDI4LjY2IFYgOS4zNCBDIDMyLDcuNDk4IDMwLjUwMiw2IDI4LjY2LDYgWiIgLz48cGF0aAogICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICBpZD0icGF0aDgiCiAgIGQ9Ik0gNTEsMzcgSCA0MSBWIDI3IGMgMCwtMS4xMDQgLTAuODk2LC0yIC0yLC0yIC0xLjEwNCwwIC0yLDAuODk2IC0yLDIgViAzNyBIIDI3IGMgLTEuMTA0LDAgLTIsMC44OTYgLTIsMiAwLDEuMTA0IDAuODk2LDIgMiwyIGggMTAgdiAxMCBjIDAsMS4xMDQgMC44OTYsMiAyLDIgMS4xMDQsMCAyLC0wLjg5NiAyLC0yIFYgNDEgaCAxMCBjIDEuMTA0LDAgMiwtMC44OTYgMiwtMiAwLC0xLjEwNCAtMC44OTYsLTIgLTIsLTIgeiIgLz4KPGcKICAgaWQ9ImcxMiI+CjwvZz4KPGcKICAgaWQ9ImcxNCI+CjwvZz4KPGcKICAgaWQ9ImcxNiI+CjwvZz4KPGcKICAgaWQ9ImcxOCI+CjwvZz4KPGcKICAgaWQ9ImcyMCI+CjwvZz4KPGcKICAgaWQ9ImcyMiI+CjwvZz4KPGcKICAgaWQ9ImcyNCI+CjwvZz4KPGcKICAgaWQ9ImcyNiI+CjwvZz4KPGcKICAgaWQ9ImcyOCI+CjwvZz4KPGcKICAgaWQ9ImczMCI+CjwvZz4KPGcKICAgaWQ9ImczMiI+CjwvZz4KPGcKICAgaWQ9ImczNCI+CjwvZz4KPGcKICAgaWQ9ImczNiI+CjwvZz4KPGcKICAgaWQ9ImczOCI+CjwvZz4KPGcKICAgaWQ9Imc0MCI+CjwvZz4KPC9zdmc+\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTcgNTciIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDU3IDU3OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Zz4NCgk8cGF0aCBkPSJNMjIuNjYsMEgzLjM0QzEuNDk4LDAsMCwxLjQ5OCwwLDMuMzR2MTkuMzJDMCwyNC41MDIsMS40OTgsMjYsMy4zNCwyNmgxOS4zMmMxLjg0MiwwLDMuMzQtMS40OTgsMy4zNC0zLjM0VjMuMzQNCgkJQzI2LDEuNDk4LDI0LjUwMiwwLDIyLjY2LDB6Ii8+DQoJPHBhdGggZD0iTTMzLjM0LDI2aDE5LjMyYzEuODQyLDAsMy4zNC0xLjQ5OCwzLjM0LTMuMzRWMy4zNEM1NiwxLjQ5OCw1NC41MDIsMCw1Mi42NiwwSDMzLjM0QzMxLjQ5OCwwLDMwLDEuNDk4LDMwLDMuMzR2MTkuMzINCgkJQzMwLDI0LjUwMiwzMS40OTgsMjYsMzMuMzQsMjZ6Ii8+DQoJPHBhdGggZD0iTTIyLjY2LDMwSDMuMzRDMS40OTgsMzAsMCwzMS40OTgsMCwzMy4zNHYxOS4zMkMwLDU0LjUwMiwxLjQ5OCw1NiwzLjM0LDU2aDE5LjMyYzEuODQyLDAsMy4zNC0xLjQ5OCwzLjM0LTMuMzRWMzMuMzQNCgkJQzI2LDMxLjQ5OCwyNC41MDIsMzAsMjIuNjYsMzB6Ii8+DQoJPHBhdGggZD0iTTU1LDQxSDQ1VjMxYzAtMS4xMDQtMC44OTYtMi0yLTJzLTIsMC44OTYtMiwydjEwSDMxYy0xLjEwNCwwLTIsMC44OTYtMiwyczAuODk2LDIsMiwyaDEwdjEwYzAsMS4xMDQsMC44OTYsMiwyLDINCgkJczItMC44OTYsMi0yVjQ1aDEwYzEuMTA0LDAsMi0wLjg5NiwyLTJTNTYuMTA0LDQxLDU1LDQxeiIvPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPC9zdmc+DQo=\"","module.exports = require(\"tippy.js/dist/tippy.css\");","module.exports = require(\"react-tooltip\");","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNzUuNDA2cHgiIGhlaWdodD0iNzUuNDA2cHgiIHZpZXdCb3g9IjAgMCA3NS40MDYgNzUuNDA2IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA3NS40MDYgNzUuNDA2OyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNMzUuNDM2LDBINy43NTV2NjMuOTUyaDI3LjY4MkwzNS40MzYsMEwzNS40MzYsMHogTTMyLjU3Myw2MS4wODlIMTAuNjE4VjIuODYzaDIxLjk1NVY2MS4wODl6IE03MC4yNzQsMjYuNDg4aC0yNy42OAoJCXYzNy40NjRoMjcuNjgyVjI2LjQ4OEg3MC4yNzR6IE02Ny40MTIsNjEuMDg5SDQ1LjQ1N1YyOS4zNTFoMjEuOTU1VjYxLjA4OXogTTc0LjU3MSw3MC4zOTV2NS4wMTJIMC44MzV2LTUuMDEySDc0LjU3MXoiLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iOTAuOTU2cHgiIGhlaWdodD0iOTAuOTU3cHgiIHZpZXdCb3g9IjAgMCA5MC45NTYgOTAuOTU3IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA5MC45NTYgOTAuOTU3OyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNNDEuNjYxLDEzLjUwMUgxMy45Nzl2NjMuOTUzaDI3LjY4MlYxMy41MDF6IE0zOC43OTcsNzQuNTkxSDE2Ljg0MlYxNi4zNjZoMjEuOTU1Vjc0LjU5MXogTTc2LjQ5OSwyNi43NDdINDguODE4djM3LjQ2NQoJCUg3Ni41TDc2LjQ5OSwyNi43NDdMNzYuNDk5LDI2Ljc0N3ogTTczLjYzNyw2MS4zNDdINTEuNjgyVjI5LjYwOWgyMS45NTVWNjEuMzQ3eiBNMTAuOTc4LDQyLjk3M3Y1LjAxMUgwdi01LjAxMUgxMC45Nzh6CgkJIE05MC45NTYsNDIuOTczdjUuMDExSDc5Ljk3OXYtNS4wMTFIOTAuOTU2eiIvPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+Cjwvc3ZnPgo=\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNzUuNDA2cHgiIGhlaWdodD0iNzUuNDA2cHgiIHZpZXdCb3g9IjAgMCA3NS40MDYgNzUuNDA2IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA3NS40MDYgNzUuNDA2OyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNMzUuNDM2LDExLjQ1NEg3Ljc1NXY2My45NTJoMjcuNjgyTDM1LjQzNiwxMS40NTRMMzUuNDM2LDExLjQ1NHogTTMyLjU3Myw3Mi41NDNIMTAuNjE4VjE0LjMxN2gyMS45NTVWNzIuNTQzegoJCSBNNzAuMjc0LDExLjQ1NGgtMjcuNjh2MzcuNDY0aDI3LjY4MlYxMS40NTRINzAuMjc0eiBNNjcuNDEyLDQ2LjA1NUg0NS40NTdWMTQuMzE3aDIxLjk1NVY0Ni4wNTV6IE0wLjgzNSw1LjAxMVYwaDczLjczNnY1LjAxMQoJCUgwLjgzNXoiLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iOTAuOTU2cHgiIGhlaWdodD0iOTAuOTU2cHgiIHZpZXdCb3g9IjAgMCA5MC45NTYgOTAuOTU2IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA5MC45NTYgOTAuOTU2OyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNNzcuNDU0LDQxLjY2MVYxMy45NzlIMTMuNTAydjI3LjY4Mkg3Ny40NTR6IE0xNi4zNjUsMzguNzk3VjE2Ljg0Mmg1OC4yMjZ2MjEuOTU1SDE2LjM2NXogTTY0LjIxLDc2LjQ5OVY0OC44MThIMjYuNzQ2CgkJVjc2LjVMNjQuMjEsNzYuNDk5TDY0LjIxLDc2LjQ5OXogTTI5LjYwOSw3My42MzdWNTEuNjgyaDMxLjczN3YyMS45NTVIMjkuNjA5eiBNNDcuOTgyLDEwLjk3OGgtNS4wMVYwaDUuMDFWMTAuOTc4egoJCSBNNDcuOTgyLDkwLjk1NmgtNS4wMVY3OS45NzloNS4wMVY5MC45NTZ6Ii8+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+Cg==\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNzUuNDA2cHgiIGhlaWdodD0iNzUuNDA2cHgiIHZpZXdCb3g9IjAgMCA3NS40MDYgNzUuNDA2IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA3NS40MDYgNzUuNDA2OyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNNzUuNDA2LDM1LjQzNlY3Ljc1NUgxMS40NTR2MjcuNjgyTDc1LjQwNiwzNS40MzZMNzUuNDA2LDM1LjQzNnogTTE0LjMxNywzMi41NzNWMTAuNjE4aDU4LjIyNnYyMS45NTVIMTQuMzE3egoJCSBNNDguOTE4LDcwLjI3NVY0Mi41OTVIMTEuNDU0djI3LjY4Mkw0OC45MTgsNzAuMjc1TDQ4LjkxOCw3MC4yNzV6IE0xNC4zMTcsNjcuNDEyVjQ1LjQ1N2gzMS43Mzh2MjEuOTU1SDE0LjMxN3ogTTUuMDExLDc0LjU3MUgwCgkJVjAuODM1aDUuMDExVjc0LjU3MXoiLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNzUuNDA2cHgiIGhlaWdodD0iNzUuNDA2cHgiIHZpZXdCb3g9IjAgMCA3NS40MDYgNzUuNDA2IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA3NS40MDYgNzUuNDA2OyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNNjMuOTUyLDM1LjQzNlY3Ljc1NUgwdjI3LjY4Mkw2My45NTIsMzUuNDM2TDYzLjk1MiwzNS40MzZ6IE0yLjg2MywzMi41NzNWMTAuNjE4SDYxLjA5djIxLjk1NUgyLjg2M3ogTTYzLjk1Miw3MC4yNzUKCQlWNDIuNTk1SDI2LjQ4OHYyNy42ODJMNjMuOTUyLDcwLjI3NUw2My45NTIsNzAuMjc1eiBNMjkuMzUxLDY3LjQxMlY0NS40NTdoMzEuNzM3djIxLjk1NUgyOS4zNTF6IE03MC4zOTUsMC44MzVoNS4wMTJ2NzMuNzM2CgkJaC01LjAxMlYwLjgzNXoiLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOC4xLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iQ2FwYV8xIgogICB4PSIwcHgiCiAgIHk9IjBweCIKICAgdmlld0JveD0iMCAwIDYxMiA2MTIiCiAgIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDYxMiA2MTI7IgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkxIHIxMzcyNSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZGVsZXRlLXNpbXBsZS5zdmciPjxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQzIj48cmRmOlJERj48Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPjwvY2M6V29yaz48L3JkZjpSREY+PC9tZXRhZGF0YT48ZGVmcwogICAgIGlkPSJkZWZzNDEiIC8+PHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaWQ9Im5hbWVkdmlldzM5IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIxLjA5MDcwMDciCiAgICAgaW5rc2NhcGU6Y3g9IjI5NS4wMzQwOCIKICAgICBpbmtzY2FwZTpjeT0iMzMwLjg1NDQ4IgogICAgIGlua3NjYXBlOndpbmRvdy14PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJDYXBhXzEiIC8+PGcKICAgICBpZD0iZzUiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45OTc4ODEzNSwwLDAsMC45OTc4ODEzNSwxLjczMDQwMTIsMC45MjM3Mjg0NykiPjxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InBhdGg3IgogICAgICAgZD0iTSA1ODcuODI2LDE4Ni45NjYgQyA1NzEuNzEsMTQ5LjYzNCA1NDkuODgyLDExNy4xOTggNTIyLjM0Miw4OS42NTggNDk0LjgwMiw2Mi4xMTggNDYyLjM2Niw0MC4yOSA0MjUuMDM0LDI0LjE3NCAzODcuNzAyLDguMDU4IDM0OC4wMjQsMCAzMDYsMCAyNzcuODQ4LDAgMjUwLjcxNiwzLjY3MiAyMjQuNjA0LDExLjAxNiAxOTguNDkyLDE4LjM2IDE3NC4xMTQsMjguNjYyIDE1MS40Nyw0MS45MjIgMTI4LjgyNiw1NS4xODIgMTA4LjIyMiw3MS4wOTQgODkuNjU4LDg5LjY1OCA3MS4wOTQsMTA4LjIyMiA1NS4xODIsMTI4LjgyNiA0MS45MjIsMTUxLjQ3IDI4LjY2MiwxNzQuMTE2IDE4LjM2LDE5OC40OTIgMTEuMDE2LDIyNC42MDQgMy42NzIsMjUwLjcxNiAwLDI3Ny44NDggMCwzMDYgYyAwLDI4LjE1MiAzLjY3Miw1NS4yODQgMTEuMDE2LDgxLjM5NiA3LjM0NCwyNi4xMSAxNy42NDYsNTAuNDg3IDMwLjkwNiw3My4xMzQgMTMuMjYsMjIuNjQ0IDI5LjE3Miw0My4yNDkgNDcuNzM2LDYxLjgxMiAxOC41NjQsMTguNTY0IDM5LjE2OCwzNC40NzggNjEuODEyLDQ3LjczNiAyMi42NDQsMTMuMjYgNDcuMDIyLDIzLjU2MSA3My4xMzQsMzAuOTA2IEMgMjUwLjcxNiw2MDguMzI4IDI3Ny44NDgsNjEyIDMwNiw2MTIgYyAyOC4xNTIsMCA1NS4yODQsLTMuNjcyIDgxLjM5NiwtMTEuMDE2IDI2LjExMSwtNy4zNDYgNTAuNDg4LC0xNy42NDYgNzMuMTM1LC0zMC45MDYgMjIuNjQ0LC0xMy4yNTkgNDMuMjQ5LC0yOS4xNzIgNjEuODEyLC00Ny43MzYgMTguNTY0LC0xOC41NjMgMzQuNDc4LC0zOS4xNjggNDcuNzM2LC02MS44MTIgMTMuMjYsLTIyLjY0NiAyMy41NjEsLTQ3LjAyMyAzMC45MDYsLTczLjEzNSBDIDYwOC4zMjgsMzYxLjI4NCA2MTIsMzM0LjE1MiA2MTIsMzA2IDYxMiwyNjMuOTc2IDYwMy45NDIsMjI0LjI5OCA1ODcuODI2LDE4Ni45NjYgWiBNIDQ2OC4xOCwzOTEuNjggYyAyLjA0LDIuMDQgMy4wNjMsNC4yODQgMy4wNjMsNi43MzIgMCwyLjQ0OCAtMS4wMjEsNC40ODggLTMuMDYzLDYuMTIgbCAtNTkuOTc2LDYwLjU4OCBjIC0xLjYzMSwxLjYzMiAtMy44NzYsMi40NDggLTYuNzMyLDIuNDQ4IC0yLjg1NCwwIC00Ljg5NSwtMC44MTYgLTYuMTIsLTIuNDQ4IEwgMzA5LjA2LDM3OC44MjggMjIzLjM4LDQ2NS4xMiBjIC0yLjQ0OCwxLjYzMiAtNC42OTIsMi40NDggLTYuNzMyLDIuNDQ4IC0xLjYzMiwwIC0zLjY3MiwtMC44MTYgLTYuMTIsLTIuNDQ4IGwgLTU5Ljk3NiwtNjAuNTg4IGMgLTIuMDQsLTEuMjI2IC0zLjA2LC0zLjI2NyAtMy4wNiwtNi4xMiAwLC0yLjQ0OCAxLjAyLC00LjY5MiAzLjA2LC02LjczMiBsIDg1LjY4LC04NS42OCAtODUuNjgsLTg1LjY4IGMgLTIuMDQsLTIuMDQgLTMuMDYsLTQuMjg0IC0zLjA2LC02LjczMiAwLC0yLjg1NiAxLjAyLC00Ljg5NiAzLjA2LC02LjEyIGwgNTkuOTc2LC02MC41ODggYyAxLjYzMiwtMS42MzIgMy42NzIsLTIuNDQ4IDYuMTIsLTIuNDQ4IDIuNDQ4LDAgNC42OTIsMC44MTYgNi43MzIsMi40NDggbCA4NS42OCw4Ni4yOTIgODYuMjkyLC04Ni4yOTIgYyAxLjYzNSwtMS42MzIgMy42NzUsLTIuNDQ4IDYuMTIsLTIuNDQ4IDIuNDQ4LDAgNC42OTIsMC44MTYgNi43MzIsMi40NDggbCA1OS45NzYsNjAuNTg4IGMgMi4wNCwxLjYzMiAzLjA2MywzLjY3MiAzLjA2Myw2LjEyIDAsMi40NDggLTEuMDIxLDQuNjkyIC0zLjA2Myw2LjczMiBMIDM4Mi41LDMwNiBsIDg1LjY4LDg1LjY4IHoiCiAgICAgICBzdHlsZT0iZmlsbDojMDEwMDAyIiAvPjwvZz48ZwogICAgIGlkPSJnOSIgLz48ZwogICAgIGlkPSJnMTEiIC8+PGcKICAgICBpZD0iZzEzIiAvPjxnCiAgICAgaWQ9ImcxNSIgLz48ZwogICAgIGlkPSJnMTciIC8+PGcKICAgICBpZD0iZzE5IiAvPjxnCiAgICAgaWQ9ImcyMSIgLz48ZwogICAgIGlkPSJnMjMiIC8+PGcKICAgICBpZD0iZzI1IiAvPjxnCiAgICAgaWQ9ImcyNyIgLz48ZwogICAgIGlkPSJnMjkiIC8+PGcKICAgICBpZD0iZzMxIiAvPjxnCiAgICAgaWQ9ImczMyIgLz48ZwogICAgIGlkPSJnMzUiIC8+PGcKICAgICBpZD0iZzM3IiAvPjwvc3ZnPg==\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNTQxLjkxMXB4IiBoZWlnaHQ9IjU0MS45MTFweCIgdmlld0JveD0iMCAwIDU0MS45MTEgNTQxLjkxMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTQxLjkxMSA1NDEuOTExOyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNNDY3LjgyNiw4Ljc4MXY0Ny40NTFINzQuMDkxVjguNzgxYzAtNC42MDgtMy43MjktOC4zMzQtOC4zMzQtOC4zMzRjLTQuNjA3LDAtOC4zMzQsMy43MjctOC4zMzQsOC4zMzR2NDkuMDY4SDguMzM0CgkJQzMuNzMsNTcuODQ5LDAsNjEuNTg0LDAsNjYuMTgzYzAsNC42MDcsMy43Myw4LjMzNCw4LjMzNCw4LjMzNGg0OS4wODN2MzkyLjg2OEg4LjMzNGMtNC42MDQsMC04LjMzNCwzLjcyOS04LjMzNCw4LjMzNAoJCWMwLDQuNjEsMy43Myw4LjMzNCw4LjMzNCw4LjMzNGg0OS4wODN2NDkuMDc3YzAsNC42MDQsMy43MjcsOC4zMzQsOC4zMzQsOC4zMzRjNC42MDQsMCw4LjMzNC0zLjcyOSw4LjMzNC04LjMzNHYtNDkuMDc3aDM5My43NAoJCXY0OS4wNzdjMCw0LjYwNCwzLjcyOSw4LjMzNCw4LjMzNCw4LjMzNGM0LjYxLDAsOC4zMzQtMy43MjksOC4zMzQtOC4zMzR2LTQ5LjA3N2g0OS4wODNjNC42MDQsMCw4LjMzNC0zLjcyNCw4LjMzNC04LjMzNAoJCWMwLTQuNjA0LTMuNzI5LTguMzM0LTguMzM0LTguMzM0aC00OC4zMzJWNzQuNTE3aDQ4LjMzMmM0LjYwNCwwLDguMzM0LTMuNzI3LDguMzM0LTguMzM0YzAtNC41OTktMy43MjktOC4zMzQtOC4zMzQtOC4zMzRoLTQ5LjA4MwoJCVY4Ljc4MWMwLTQuNjA4LTMuNzI0LTguMzM0LTguMzM0LTguMzM0QzQ3MS41NTUsMC40NDYsNDY3LjgyNiw0LjE3Myw0NjcuODI2LDguNzgxeiBNNDY4LjIwNCwzNDAuNTI4djEyNi44NTdIMzQwLjQxM1YzNDAuNTI4CgkJSDQ2OC4yMDR6IE0zMzQuODU3LDM0MC41Mjh2MTI2Ljg1N0gyMDcuNDM2VjM0MC41MjhIMzM0Ljg1N3ogTTIwMS41MDQsMzQwLjUyOHYxMjYuODU3SDc0LjA5MVYzNDAuNTI4SDIwMS41MDR6IE00NjguMjA0LDIwNy4xNzIKCQl2MTI3LjhIMzQwLjQxM3YtMTI3LjhINDY4LjIwNHogTTMzNC44NTcsMjA3LjE3MnYxMjcuOEgyMDcuNDM2di0xMjcuOEgzMzQuODU3eiBNMjAxLjUwNCwyMDcuMTcydjEyNy44SDc0LjA5MXYtMTI3LjhIMjAxLjUwNHoKCQkgTTQ2OC4yMDQsNzMuODI5djEyNy43ODhIMzQwLjQxM1Y3My44MjlINDY4LjIwNHogTTMzNC44NTcsNzMuODI5djEyNy43ODhIMjA3LjQzNlY3My44MjlIMzM0Ljg1N3ogTTIwMS41MDQsNzMuODI5djEyNy43ODgKCQlINzQuMDkxVjczLjgyOUgyMDEuNTA0eiBNMzIzLjQxNCw4My44ODVWMTg4Ljc5SDIxOC41MDZWODMuODg1SDMyMy40MTR6Ii8+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+Cg==\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNDE4cHgiIGhlaWdodD0iNDE4cHgiIHZpZXdCb3g9IjAgMCA0MTggNDE4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0MTggNDE4OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxnPgoJPGc+CgkJPGc+CgkJCTxwYXRoIGQ9Ik05MS42MDYsMTQzLjcwM2MtMy4xNDYtMy4xNDYtNy44NzctNC4wODctMTEuOTg4LTIuMzg1Yy00LjExLDEuNzAzLTYuNzksNS43MTQtNi43OSwxMC4xNjN2MTE1LjAzNwoJCQkJYzAsNC40NDksMi42OCw4LjQ2MSw2Ljc5LDEwLjE2NGMxLjM2MSwwLjU2MywyLjc5LDAuODM2LDQuMjA4LDAuODM2YzIuODYyLDAsNS42NzYtMS4xMTYsNy43OC0zLjIyMmw1Ny41Mi01Ny41MTkKCQkJCWMyLjA2My0yLjA2MywzLjIyMi00Ljg2MSwzLjIyMi03Ljc3OHMtMS4xNTktNS43MTYtMy4yMjItNy43NzhMOTEuNjA2LDE0My43MDN6Ii8+CgkJCTxwYXRoIGQ9Ik0zMzguMzgyLDE0MS4zMThjLTQuMTA3LTEuNy04Ljg0MS0wLjc2My0xMS45ODcsMi4zODVsLTU3LjUyMSw1Ny41MTljLTIuMDYyLDIuMDYzLTMuMjIyLDQuODYxLTMuMjIyLDcuNzc4CgkJCQlzMS4xNTgsNS43MTYsMy4yMjIsNy43NzdsNTcuNTIxLDU3LjUyYzIuMTA0LDIuMTA0LDQuOTE4LDMuMjIzLDcuNzc5LDMuMjIzYzEuNDE3LDAsMi44NDgtMC4yNzIsNC4yMDgtMC44MzgKCQkJCWM0LjExLTEuNzAzLDYuNzktNS43MTQsNi43OS0xMC4xNjJWMTUxLjQ4MUMzNDUuMTcyLDE0Ny4wMzIsMzQyLjQ5MiwxNDMuMDIxLDMzOC4zODIsMTQxLjMxOHoiLz4KCQkJPHBhdGggZD0iTTIxMiwwaC02Yy02LjA3NSwwLTExLDQuOTI1LTExLDExdjM1YzAsNi4wNzUsNC45MjUsMTEsMTEsMTFoNmM2LjA3NSwwLDExLTQuOTI1LDExLTExVjExQzIyMyw0LjkyNSwyMTguMDc1LDAsMjEyLDB6IgoJCQkJLz4KCQkJPHBhdGggZD0iTTIxMiw5NS4zNTJoLTZjLTYuMDc1LDAtMTEsNC45MjUtMTEsMTF2NzIuNDczYzAsNi4wNzUsNC45MjUsMTEsMTEsMTFoNmM2LjA3NSwwLDExLTQuOTI1LDExLTExdi03Mi40NzMKCQkJCUMyMjMsMTAwLjI3NiwyMTguMDc1LDk1LjM1MiwyMTIsOTUuMzUyeiIvPgoJCQk8cGF0aCBkPSJNMjEyLDIyOC4xNzZoLTZjLTYuMDc1LDAtMTEsNC45MjYtMTEsMTF2NzIuNDc0YzAsNi4wNzUsNC45MjUsMTEsMTEsMTFoNmM2LjA3NSwwLDExLTQuOTI1LDExLTExdi03Mi40NzQKCQkJCUMyMjMsMjMzLjEwMiwyMTguMDc1LDIyOC4xNzYsMjEyLDIyOC4xNzZ6Ii8+CgkJCTxwYXRoIGQ9Ik0yMTIsMzYxaC02Yy02LjA3NSwwLTExLDQuOTI1LTExLDExdjM1YzAsNi4wNzUsNC45MjUsMTEsMTEsMTFoNmM2LjA3NSwwLDExLTQuOTI1LDExLTExdi0zNQoJCQkJQzIyMywzNjUuOTI1LDIxOC4wNzUsMzYxLDIxMiwzNjF6Ii8+CgkJPC9nPgoJPC9nPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+Cjwvc3ZnPgo=\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNDk3LjE5OXB4IiBoZWlnaHQ9IjQ5Ny4xOTlweCIgdmlld0JveD0iMCAwIDQ5Ny4xOTkgNDk3LjE5OSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDk3LjE5OSA0OTcuMTk5OyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNMTkxLjIsMjQ4LjZjMC0xNS4zLDUuNy0yOC43LDE3LjItNDAuMnMyNC45LTE3LjIsNDAuMi0xNy4yTDE5MS4yLDI0OC42eiBNMTc0LDI2NS44Yy0xLjktNS43LTEuOS0xMS41LTEuOS0xNy4yCgkJYzAtNDIuMSwzNC40LTc2LjUsNzYuNS03Ni41YzUuNzAxLDAsMTEuNSwwLDE3LjIwMSwxLjlsNTEuNi01MS42Yy0yMS01LjctNDQtNy43LTY4LjktNy43Qzc2LjUsMTE0LjcsMCwyNDguNiwwLDI0OC42CgkJczMwLjYsNTMuNSw5Ny41LDkzLjdMMTc0LDI2NS44eiBNMzA2LDI0OC42TDI0OC42LDMwNmMxNS4zLDAsMjguNzAxLTUuNyw0MC4yMDEtMTcuMkMzMDAuMTk5LDI3Ny4zLDMwNiwyNjMuODk5LDMwNiwyNDguNnoKCQkgTTM5OS42OTksMTU0Ljg5OWwtNzYuNSw3Ni41YzEuOSw1LjcsMS45LDExLjUsMS45LDE3LjJjMCw0Mi4xLTM0LjQsNzYuNS03Ni41LDc2LjVjLTUuNywwLTExLjUsMC0xNy4yLTEuOUwxNzkuOCwzNzQuOAoJCWMyMSw1LjcsNDQsNy42LDY4LjgsNy42YzE3Mi4wOTksMCwyNDguNTk5LTEzMy45LDI0OC41OTktMTMzLjlTNDY2LjYsMTk1LjEsMzk5LjY5OSwxNTQuODk5eiBNNDAxLjQsNzYuODk5bC0zMjQuNSwzMjQuNQoJCWwxOC45LDE4LjlMNDIwLjQsOTUuN0w0MDEuNCw3Ni44OTl6Ii8+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+Cg==\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iQ2FwYV8xIgogICB4PSIwcHgiCiAgIHk9IjBweCIKICAgd2lkdGg9IjQ4NS4yMTVweCIKICAgaGVpZ2h0PSI0ODUuMjE1cHgiCiAgIHZpZXdCb3g9IjAgMCA0ODUuMjE1IDQ4NS4yMTUiCiAgIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ4NS4yMTUgNDg1LjIxNTsiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJfbGF5b3V0LXByb3BlcnRpZXMuc3ZnIj48bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0MSI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGUgLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczM5IiAvPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTA4OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI2NjYiCiAgICAgaWQ9Im5hbWVkdmlldzM3IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIwLjQ4NjM4MjMzIgogICAgIGlua3NjYXBlOmN4PSItNzYuMzQ1OTcyIgogICAgIGlua3NjYXBlOmN5PSI0MDcuMDg3MTYiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjY0OSIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iNTAiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJDYXBhXzEiIC8+PGcKICAgICBpZD0iZzEwMzQ5IgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNTU1NjUxLDAsMCw5LjU1NTY1MSwzMy42MTk5MTksMjAuMDQ5NjkzKSI+PGcKICAgICAgIGlkPSJMYXllcl8xXzExMF8iPjxnCiAgICAgICAgIGlkPSJnMTAzNTIiPjxwYXRoCiAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICBkPSJtIDE3LjU2NywxNS45MzggLTIuODU5LC0yLjcwMiBjIDAuMzMzLC0wLjYwNSAwLjUzOSwtMS4yOSAwLjUzOSwtMi4wMjkgMCwtMi4zNDIgLTEuODk3LC00LjIzOSAtNC4yNCwtNC4yMzkgLTIuMzQzLDAgLTQuMjQzLDEuODk2IC00LjI0Myw0LjIzOSAwLDIuMzQzIDEuOSw0LjI0MSA0LjI0Myw0LjI0MSAwLjgyNiwwIDEuNTksLTAuMjQ2IDIuMjQyLC0wLjY1NCBsIDIuODU1LDIuNjk5IGMgMC40MzIsLTAuNTcxIDAuOTE5LC0xLjA5NCAxLjQ2MywtMS41NTUgeiIKICAgICAgICAgICBpZD0icGF0aDEwMzU0IiAvPjxwYXRoCiAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICBkPSJtIDI5LjY2LDE1LjYgMy43OTksLTYuMzkzIGMgMC4zNzQsMC4xMDcgMC43NjIsMC4xODQgMS4xNjksMC4xODQgMi4zNDcsMCA0LjI0NCwtMS44OTggNC4yNDQsLTQuMjQxIDAsLTIuMzQyIC0xLjg5NywtNC4yMzkgLTQuMjQ0LC00LjIzOSAtMi4zNDMsMCAtNC4yMzksMS44OTYgLTQuMjM5LDQuMjM5IDAsMS4xNjMgMC40NjksMi4yMTQgMS4yMjcsMi45ODEgbCAtMy43ODcsNi4zNzUgYyAwLjY1MSwwLjI5NSAxLjI2NSwwLjY2MyAxLjgzMSwxLjA5NCB6IgogICAgICAgICAgIGlkPSJwYXRoMTAzNTYiIC8+PHBhdGgKICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgIGQ9Im0gNDIuNzYyLDIwLjk1MiBjIC0xLjgyNCwwIC0zLjM2OSwxLjE1OSAtMy45NjgsMi43NzUgbCAtNS4yNzgsLTAuNTIxIGMgMCwwLjA0IDAuMDA2LDAuMDc4IDAuMDA2LDAuMTE3IDAsMC42ODggLTAuMDc2LDEuMzYgLTAuMjEzLDIuMDA5IGwgNS4yNzYsMC41MjEgYyAwLjMxOSwyLjAyNCAyLjA2MiwzLjU3NiA0LjE3NywzLjU3NiAyLjM0MiwwIDQuMjM4LC0xLjg5NiA0LjIzOCwtNC4yMzggMCwtMi4zNDEgLTEuODk2LC00LjIzOSAtNC4yMzgsLTQuMjM5IHoiCiAgICAgICAgICAgaWQ9InBhdGgxMDM1OCIgLz48cGF0aAogICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgZD0ibSAyOC4xOTcsMzcuNjI0IC0xLjE4LC01LjE1NiBjIC0wLjY2NiwwLjIzMiAtMS4zNTksMC4zOTggLTIuMDgyLDAuNDgxIGwgMS4xODIsNS4xNTcgYyAtMS4zNTUsMC43MDkgLTIuMjksMi4xMSAtMi4yOSwzLjc0NiAwLDIuMzQyIDEuODk2LDQuMjM3IDQuMjQzLDQuMjM3IDIuMzQyLDAgNC4yMzgsLTEuODk2IDQuMjM4LC00LjIzNyAwLjAwMywtMi4yOTkgLTEuODI5LC00LjE2IC00LjExMSwtNC4yMjggeiIKICAgICAgICAgICBpZD0icGF0aDEwMzYwIiAvPjxjaXJjbGUKICAgICAgICAgICBjeD0iMjMuODMiCiAgICAgICAgICAgY3k9IjIzLjMyMyIKICAgICAgICAgICByPSI3LjI3MDk5OTkiCiAgICAgICAgICAgaWQ9ImNpcmNsZTEwMzY0IiAvPjwvZz48L2c+PC9nPjxnCiAgICAgaWQ9ImcxMDM2NiIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCg5LjU1NTY1MSwwLDAsOS41NTU2NTEsMTcuNjE5OTE5LDE4LjA0OTY5MykiIC8+PGcKICAgICBpZD0iZzEwMzY4IgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNTU1NjUxLDAsMCw5LjU1NTY1MSwxNy42MTk5MTksMTguMDQ5NjkzKSIgLz48ZwogICAgIGlkPSJnMTAzNzAiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOS41NTU2NTEsMCwwLDkuNTU1NjUxLDE3LjYxOTkxOSwxOC4wNDk2OTMpIiAvPjxnCiAgICAgaWQ9ImcxMDM3MiIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCg5LjU1NTY1MSwwLDAsOS41NTU2NTEsMTcuNjE5OTE5LDE4LjA0OTY5MykiIC8+PGcKICAgICBpZD0iZzEwMzc0IgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNTU1NjUxLDAsMCw5LjU1NTY1MSwxNy42MTk5MTksMTguMDQ5NjkzKSIgLz48ZwogICAgIGlkPSJnMTAzNzYiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOS41NTU2NTEsMCwwLDkuNTU1NjUxLDE3LjYxOTkxOSwxOC4wNDk2OTMpIiAvPjxnCiAgICAgaWQ9ImcxMDM3OCIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCg5LjU1NTY1MSwwLDAsOS41NTU2NTEsMTcuNjE5OTE5LDE4LjA0OTY5MykiIC8+PGcKICAgICBpZD0iZzEwMzgwIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNTU1NjUxLDAsMCw5LjU1NTY1MSwxNy42MTk5MTksMTguMDQ5NjkzKSIgLz48ZwogICAgIGlkPSJnMTAzODIiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOS41NTU2NTEsMCwwLDkuNTU1NjUxLDE3LjYxOTkxOSwxOC4wNDk2OTMpIiAvPjxnCiAgICAgaWQ9ImcxMDM4NCIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCg5LjU1NTY1MSwwLDAsOS41NTU2NTEsMTcuNjE5OTE5LDE4LjA0OTY5MykiIC8+PGcKICAgICBpZD0iZzEwMzg2IgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNTU1NjUxLDAsMCw5LjU1NTY1MSwxNy42MTk5MTksMTguMDQ5NjkzKSIgLz48ZwogICAgIGlkPSJnMTAzODgiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOS41NTU2NTEsMCwwLDkuNTU1NjUxLDE3LjYxOTkxOSwxOC4wNDk2OTMpIiAvPjxnCiAgICAgaWQ9ImcxMDM5MCIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCg5LjU1NTY1MSwwLDAsOS41NTU2NTEsMTcuNjE5OTE5LDE4LjA0OTY5MykiIC8+PGcKICAgICBpZD0iZzEwMzkyIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDkuNTU1NjUxLDAsMCw5LjU1NTY1MSwxNy42MTk5MTksMTguMDQ5NjkzKSIgLz48ZwogICAgIGlkPSJnMTAzOTQiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOS41NTU2NTEsMCwwLDkuNTU1NjUxLDE3LjYxOTkxOSwxOC4wNDk2OTMpIiAvPjxnCiAgICAgaWQ9Imc0MzIwIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDQuNzU0NDI3MSwwLDAsNC43NTQ0MjcxLDcuODM5OTM2MSwyNjAuNzI3NDEpIj48ZwogICAgICAgaWQ9Imc0MjgwIj48cGF0aAogICAgICAgICBpZD0icGF0aDQyODIiCiAgICAgICAgIGQ9Im0gNDEuNTM0LDI4LjY2IDEuOTU3LDAgQyA0NC44NzcsMjguNjYgNDYsMjcuNTM2IDQ2LDI2LjE1IGwgMCwtNi4zIGMgMCwtMS4zODUgLTEuMTI0LC0yLjUwOSAtMi41MDksLTIuNTA5IGwgLTEuOTUxLDAgMCwwLjAwNiBDIDQxLjE0OCwxNi4xNCA0MC42ODcsMTQuOTgzIDQwLjEwMywxMy44ODkgbCAxLjM4MSwtMS4zODEgYyAwLjk3OSwtMC45OCAwLjk3OSwtMi41NjkgMCwtMy41NDkgTCAzNy4wNCw0LjUxNyBjIC0wLjk3OSwtMC45NzkgLTIuNTY3LC0wLjk3OSAtMy41NDcsMCBsIC0xLjM4MiwxLjM4IEMgMzEuMDE3LDUuMzEzIDI5Ljg2MSw0Ljg1MiAyOC42NTQsNC40NjEgbCAwLjAwNiwwIDAsLTEuOTUxIEMgMjguNjYsMS4xMjQgMjcuNTM3LDAgMjYuMTUsMCBsIC02LjMsMCBjIC0xLjM4NiwwIC0yLjUwOSwxLjEyNCAtMi41MDksMi41MSBsIDAsMS45NTUgMC4wMTQsLTEwZS00IGMgLTEuMjA3LDAuMzY3IC0yLjM2MywwLjg1IC0zLjQ1OCwxLjQzNSBMIDEyLjUxNiw0LjUxOCBjIC0wLjk4LC0wLjk3OSAtMi41NjgsLTAuOTc5IC0zLjU0OCwwIEwgNC41MjUsOC45NjEgQyAzLjU0Niw5Ljk0IDMuNTQ1LDExLjUyNyA0LjUyMywxMi41MDcgTCA1LjksMTMuODg5IEMgNS4zMTYsMTQuOTgzIDQuODUxLDE2LjE0IDQuNDYsMTcuMzQ2IGwgMCwtMC4wMDUgLTEuOTUxLDAgQyAxLjEyNCwxNy4zNDEgMCwxOC40NjUgMCwxOS44NSBsIDAsNi4zMDEgYyAwLDEuMzg3IDEuMTI0LDIuNTExIDIuNTA5LDIuNTExIGwgMS45NjQsMCAtMC4wMDYsLTAuMDE1IGMgMC4zNjcsMS4yMDcgMC44NTMsMi4zNjIgMS40MzYsMy40NTcgbCAtMS4zOCwxLjM4MSBjIC0wLjk4LDAuOTc5IC0wLjk3OSwyLjU2NyAwLDMuNTQ3IGwgNC40NDMsNC40NDIgYyAwLjk3OSwwLjk3OSAyLjU2OCwwLjk3OSAzLjU0OCwwIGwgMS4zODEsLTEuMzgxIGMgMS4wOTQsMC41ODQgMi4yNTEsMS4wNzIgMy40NTgsMS40MzggbCAtMC4wMTQsLTAuMDA2IDAsMS45NjUgYyAwLDEuMzg3IDEuMTIzLDIuNTEgMi41MDksMi41MSBsIDYuMywwIGMgMS4zODcsMCAyLjUxLC0xLjEyMyAyLjUxLC0yLjUxIGwgMCwtMS45NSAtMC4wMDYsMCBjIDEuMjA3LC0wLjM5MiAyLjM2MywtMC44NTYgMy40NTcsLTEuNDQgbCAxLjM4MSwxLjM3OSBjIDAuOTgsMC45NzkgMi41NjgsMC45NzkgMy41NDcsMCBsIDQuNDQzLC00LjQ0NSBjIDAuOTc5LC0wLjk3OSAwLjk3OSwtMi41NjYgMCwtMy41NDcgbCAtMS4zODMsLTEuMzgzIGMgMC41ODQsLTEuMDk0IDEuMDY4LC0yLjI1IDEuNDM2LC0zLjQ1NyBsIDEwZS00LDAuMDEzIHogTSAyMy4wMjEsMzYuNzE0IEMgMTUuNDQ0LDM2LjcyMyA5LjI3OCwzMC41NTcgOS4yODcsMjIuOTggOS4yOTYsMTUuNDQxIDE1LjQ1LDkuMjg3IDIyLjk4OSw5LjI3OCBjIDcuNTc4LC0wLjAwOSAxMy43NDQsNi4xNTcgMTMuNzM0LDEzLjczNCAtMC4wMSw3LjUzOSAtNi4xNjIsMTMuNjkzIC0xMy43MDIsMTMuNzAyIHoiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+PC9nPjxnCiAgICAgICBpZD0iZzQyODQiIC8+PGcKICAgICAgIGlkPSJnNDI4NiIgLz48ZwogICAgICAgaWQ9Imc0Mjg4IiAvPjxnCiAgICAgICBpZD0iZzQyOTAiIC8+PGcKICAgICAgIGlkPSJnNDI5MiIgLz48ZwogICAgICAgaWQ9Imc0Mjk0IiAvPjxnCiAgICAgICBpZD0iZzQyOTYiIC8+PGcKICAgICAgIGlkPSJnNDI5OCIgLz48ZwogICAgICAgaWQ9Imc0MzAwIiAvPjxnCiAgICAgICBpZD0iZzQzMDIiIC8+PGcKICAgICAgIGlkPSJnNDMwNCIgLz48ZwogICAgICAgaWQ9Imc0MzA2IiAvPjxnCiAgICAgICBpZD0iZzQzMDgiIC8+PGcKICAgICAgIGlkPSJnNDMxMCIgLz48ZwogICAgICAgaWQ9Imc0MzEyIiAvPjwvZz48L3N2Zz4=\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE2LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgd2lkdGg9IjQ4OC43OHB4IiBoZWlnaHQ9IjQ4OC43OHB4IiB2aWV3Qm94PSIwIDAgNDg4Ljc4IDQ4OC43OCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDg4Ljc4IDQ4OC43ODsiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPGc+DQoJCTxwYXRoIGQ9Ik0xNDEuNDA4LDExOS44NzJjMTIuMjkzLTEzLjExMiwyOS42NTMtMjAuNzcsNDcuNjI0LTIwLjc3aDI0Ny40MDVWNDcuODI4YzAtMTIuNTY5LTEwLjQ2OC0yMi42NTItMjMuMDM2LTIyLjY1Mkg3NS4zOTcNCgkJCWMtMTIuNTc1LDAtMjIuNDkxLDEwLjA4My0yMi40OTEsMjIuNjUydjEwMS4wNDZoNjEuNDQ1TDE0MS40MDgsMTE5Ljg3MnoiLz4NCgkJPHBhdGggZD0iTTQ4My4wMTksMTQ5LjI1M2MtMS43MDktMS45MjQtMy43MTctMy41NS01LjkyMy00Ljc4Yy0zLjM1Mi0xLjg2MS03LjE1MS0yLjkyLTExLjA3MS0yLjkySDE4OS4wMzJsMCwwDQoJCQljLTYsMC0xMS43MzUsMi40MDktMTUuOTgzLDYuNjAxYy0wLjIxNCwwLjIwOC0wLjQyMywwLjQzOC0wLjYyNiwwLjY1MWwtOS4yNzUsOS45MTFsLTIzLjYyMiwyNS4yMDcNCgkJCWMtMC41NDIsMC41NzMtMS4xMDUsMS4yMTktMS42OTQsMS43MzZjLTQuMTEzLDMuNTcyLTkuNDEsNS42NjctMTQuOTE1LDUuNjY3aC0wLjAwNUgyMi43NjhsMCwwDQoJCQljLTUuNjg0LDAtMTEuMTExLDIuMDIyLTE1LjI3MSw1Ljc5MWMtMC42NjcsMC41ODktMS4yOTMsMS4xNzktMS44ODgsMS44NTdjLTAuNDE3LDAuNDc5LTAuODAzLDAuOTQ4LTEuMTgzLDEuNDU5DQoJCQljLTMuNDgyLDQuNzQ0LTUuMDIsMTAuNjYxLTQuMjE3LDE2LjU0MmwyNi40NzksMTk0LjE4MmMzLjU2NSwyNi4xNCwyMy41NTMsNDYuNjEyLDQ4LjY5Miw1MS4yODQNCgkJCWMzLjU5MiwwLjY2Nyw3LjI4OCwxLjE2MywxMS4wNTgsMS4xNjNoMzE0LjI2MWMyNy43NjEsMCw1MS41MjItMTkuMDAzLDU4LjM1NC00NS4xOTRjMC43MDQtMi43MDYsMS4yMjYtNS41NjcsMS41NTUtOC40Mg0KCQkJbDE1LjI2NS0xMzIuMjg5bDEyLjc3Mi0xMTAuNjc0YzAuMDY3LTAuNjQ3LDAuMTA4LTEuMjkzLDAuMTI1LTEuOTI5QzQ4OC45NDcsMTU5LjI5OSw0ODYuOTA5LDE1My42MjMsNDgzLjAxOSwxNDkuMjUzeiIvPg0KCTwvZz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg0K\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iQ2FwYV8xIgogICB4PSIwcHgiCiAgIHk9IjBweCIKICAgd2lkdGg9IjQ4OXB4IgogICBoZWlnaHQ9IjQ4OS4wMDFweCIKICAgdmlld0JveD0iMCAwIDQ4OSA0ODkuMDAxIgogICBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0ODkgNDg5LjAwMTsiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJuZXcuc3ZnIj48bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0MSI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczM5IiAvPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iNjkwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjQ4MCIKICAgICBpZD0ibmFtZWR2aWV3MzciCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuNDgyNjE2NTkiCiAgICAgaW5rc2NhcGU6Y3g9IjI0NC41IgogICAgIGlua3NjYXBlOmN5PSIyNDQuNTAwNSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9IkNhcGFfMSIgLz48ZwogICAgIGlkPSJnMyIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjk2MTk2NzY5LDAsMCwwLjk2MTk2NzY5LDkuMDEwNzg0OCwxMCkiPjxwYXRoCiAgICAgICBkPSJNIDM1NS43NjgsMCA4Ni4yMTgsMCBDIDUzLjMzLDAgMjYuNTc3LDI2Ljc1MyAyNi41NzcsNTkuNjM2IGwgMCwzNjkuNzI5IGMgMCwzMi44ODMgMjYuNzUyLDU5LjYzNiA1OS42NDEsNTkuNjM2IGwgMzE2LjU2NiwwIGMgMzIuODg5LC0xMGUtNCA1OS42NDEsLTI2Ljc1NCA1OS42NDEsLTU5LjYzNyBsIDAsLTMyMC4yMDQgTCAzNTUuNzY4LDAgWiBtIDQ3LjAxNiw0NDYuNDc5IC0zMTYuNTY2LDAgYyAtOS40MzcsMCAtMTcuMTE5LC03LjY3OCAtMTcuMTE5LC0xNy4xMTMgbCAwLC0zNjkuNzMgYyAwLC05LjQzNyA3LjY4MywtMTcuMTE0IDE3LjExOSwtMTcuMTE0IGwgMjQ4LjY0MiwwIDAsNDcuNjA0IGMgMCwyMS4wNDMgMTcuMTA5LDM4LjE2MiAzOC4xNTIsMzguMzc1IGwgNDYuODkxLDAuNDc3IDAsMzAwLjM4OCBjIDAsOS40MzUgLTcuNjg0LDE3LjExMyAtMTcuMTE5LDE3LjExMyB6IgogICAgICAgaWQ9InBhdGg1IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz48L2c+PGcKICAgICBpZD0iZzciIC8+PGcKICAgICBpZD0iZzkiIC8+PGcKICAgICBpZD0iZzExIiAvPjxnCiAgICAgaWQ9ImcxMyIgLz48ZwogICAgIGlkPSJnMTUiIC8+PGcKICAgICBpZD0iZzE3IiAvPjxnCiAgICAgaWQ9ImcxOSIgLz48ZwogICAgIGlkPSJnMjEiIC8+PGcKICAgICBpZD0iZzIzIiAvPjxnCiAgICAgaWQ9ImcyNSIgLz48ZwogICAgIGlkPSJnMjciIC8+PGcKICAgICBpZD0iZzI5IiAvPjxnCiAgICAgaWQ9ImczMSIgLz48ZwogICAgIGlkPSJnMzMiIC8+PGcKICAgICBpZD0iZzM1IiAvPjwvc3ZnPg==\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMjYuNjMzOTQybW0iCiAgIGhlaWdodD0iMjYuNjIyNzY1bW0iCiAgIHZpZXdCb3g9IjAgMCAyNi42MzM5NDIgMjYuNjIyNzY1IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmc4IgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJwb3J0YWwuc3ZnIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzMiI+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDUwMDgiCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIGlkPSJwYXRoNTAwNiIKICAgICAgICAgZD0iTSAwLDAgSCAzMTIuMDQzIFYgNzQuNDQ4MiBIIDAgWiIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDUwMTYiCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIGlkPSJwYXRoNTAxNCIKICAgICAgICAgZD0iTSAwLDc0LjQ0OCBIIDMxMi4wNDMgViAwIEggMCBaIiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoNTExMiIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGgKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGg1MTEwIgogICAgICAgICBkPSJNIDAsMCBIIDMxMi4wNDMgViA3NC40NDgyIEggMCBaIiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoNTEyMCIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGgKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGg1MTE4IgogICAgICAgICBkPSJNIDAsNzQuNDQ4IEggMzEyLjA0MyBWIDAgSCAwIFoiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBpZD0iY2xpcFBhdGg1MzMyIgogICAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBpZD0icGF0aDUzMzAiCiAgICAgICAgIGQ9Ik0gMCw3NC40NDggSCAzMTIuMDQzIFYgMCBIIDAgWiIgLz4KICAgIDwvY2xpcFBhdGg+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIxLjk3OTg5OSIKICAgICBpbmtzY2FwZTpjeD0iNTUuNTM1Njg4IgogICAgIGlua3NjYXBlOmN5PSItNTEuMDYwODE5IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJtbSIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDE3IgogICAgIGlua3NjYXBlOndpbmRvdy14PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBmaXQtbWFyZ2luLXRvcD0iMCIKICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAiCiAgICAgZml0LW1hcmdpbi1yaWdodD0iMCIKICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE1Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDcuNDExNjExLC04OS4yODgwNCkiPgogICAgPHJlY3QKICAgICAgIHJ5PSIwIgogICAgICAgeT0iOTYuMTU3Mzc5IgogICAgICAgeD0iNjEuMTYxNDcyIgogICAgICAgaGVpZ2h0PSI1Ljk5OTk5OTUiCiAgICAgICB3aWR0aD0iNS45OTk5OTk1IgogICAgICAgaWQ9InJlY3Q1NTA0IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC45ODk5OTk5OTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNzQ1MDk4MDU7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuNTU0MDg2MzM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MCIgLz4KICAgIDxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHk9IjEwMy4wMjY3MyIKICAgICAgIHg9IjU0LjI5MjEyMiIKICAgICAgIGhlaWdodD0iNS45OTk5OTk1IgogICAgICAgd2lkdGg9IjUuOTk5OTk5NSIKICAgICAgIGlkPSJyZWN0NTUwNC0zIgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC45ODk5OTk5OTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNzQ1MDk4MDU7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuNTU0MDg2MzM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MCIgLz4KICAgIDxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHk9Ijg5LjI4ODA0IgogICAgICAgeD0iNjguMDMwODIzIgogICAgICAgaGVpZ2h0PSI1Ljk5OTk5OTUiCiAgICAgICB3aWR0aD0iNS45OTk5OTk1IgogICAgICAgaWQ9InJlY3Q1NTA0LTMtNSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuOTg5OTk5OTk7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjU4ODIzNTMyO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU1NDA4NjMzO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjAiIC8+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSIxMDkuODk2MDciCiAgICAgICB4PSI0Ny40MjI3NzkiCiAgICAgICBoZWlnaHQ9IjUuOTk5OTk5NSIKICAgICAgIHdpZHRoPSI1Ljk5OTk5OTUiCiAgICAgICBpZD0icmVjdDU1MDQtMy01LTkiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk4OTk5OTk5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC41ODgyMzUzMjtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41NTQwODYzMztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowIiAvPgogICAgPHBhdGgKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDU1NTEtNyIKICAgICAgIGQ9Im0gNjguMzg0OTY3LDEwMi4xMjA4OSBhIDUuNjA5MDczNCw1LjcyMTk1ODQgMCAwIDAgNS42MDkzNTQsLTUuNzIxOTI4IDUuNjA5MDczNCw1LjcyMTk1ODQgMCAwIDAgLTAuMDA5OSwtMC4yMDUwODcgaCAtNS45MTcwNTMgdiA1LjkxMDcwNSBhIDUuNjA5MDczNCw1LjcyMTk1ODQgMCAwIDAgMC4zMTc2MzQsMC4wMTYzIHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk4OTk5OTk5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC41ODgyMzUzMjtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC44MDg2MTU1NztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowIiAvPgogICAgPHBhdGgKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDU2NjMiCiAgICAgICBkPSJtIDQ4LjI3MzAxMSwxMDEuMTk2NDggdiAtNy41ODIwNTMgYyAwLC0xLjkxNDE0NCAxLjQxOTUxMSwtMy40NTUxMzQgMy4xODI3NjEsLTMuNDU1MTM0IHYgMCBoIDE0Ljc2NzI3MSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojOTg5NDk0O3N0cm9rZS13aWR0aDoxLjcyMjc5OTY2O3N0cm9rZS1saW5lY2FwOnNxdWFyZTtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3BhaW50LW9yZGVyOmZpbGwgbWFya2VycyBzdHJva2UiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJyZWN0NTYxNyIKICAgICAgIGQ9Im0gNzMuMjM3ODEzLDEwMi44MzA0MyA0ZS02LDkuMTU0OTggYyAwLDEuNzI3MTggLTEuMzgzMjYzLDMuMTE3NjYgLTMuMTAxNDg1LDMuMTE3NjYgSCA1NS44NDYwNzciCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6Izk4OTQ5NDtzdHJva2Utd2lkdGg6MS42MTU0NzExMjtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtwYWludC1vcmRlcjpmaWxsIG1hcmtlcnMgc3Ryb2tlIiAvPgogICAgPHBhdGgKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDU1NTEtNy00IgogICAgICAgZD0ibSA2MS41MTU2MTgsMTA4Ljk5MDIzIGEgNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCA1LjYwOTM1NCwtNS43MjE5MiA1LjYwOTA3MzQsNS43MjE5NTg0IDAgMCAwIC0wLjAwOTksLTAuMjA1MDkgSCA2MS4xOTc5NyB2IDUuOTEwNzEgYSA1LjYwOTA3MzQsNS43MjE5NTg0IDAgMCAwIDAuMzE3NjM0LDAuMDE2MyB6IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC45ODk5OTk5OTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNzQ1MDk4MDU7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuODA4NjE1NTc7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MCIgLz4KICAgIDxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InBhdGg1NTUxLTctNC0zIgogICAgICAgZD0ibSA1OS45Mzc5NzUsOTYuMTkzODc0IGEgNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCAtNS42MDkzNTQsNS43MjE5MjYgNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCAwLjAwOTksMC4yMDUwOSBoIDUuOTE3MDUzIHYgLTUuOTEwNzExIGEgNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCAtMC4zMTc2MzQsLTAuMDE2MyB6IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC45ODk5OTk5OTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuODA4NjE1NTc7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MCIgLz4KICAgIDxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InBhdGg1NTUxLTctNC0zLTAiCiAgICAgICBkPSJtIDUzLjA2ODYzMywxMDMuMDYzMjIgYSA1LjYwOTA3MzQsNS43MjE5NTg0IDAgMCAwIC01LjYwOTM1Myw1LjcyMTkzIDUuNjA5MDczNCw1LjcyMTk1ODQgMCAwIDAgMC4wMDk5LDAuMjA1MDggaCA1LjkxNzA1MyB2IC01LjkxMDcxIGEgNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCAtMC4zMTc2MzQsLTAuMDE2MyB6IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC45ODk5OTk5OTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNTg4MjM1MzI7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuODA4NjE1NTc7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MCIgLz4KICA8L2c+Cjwvc3ZnPgo=\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE2LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgd2lkdGg9IjQ1LjY3OHB4IiBoZWlnaHQ9IjQ1LjY3OHB4IiB2aWV3Qm94PSIwIDAgNDUuNjc4IDQ1LjY3OCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDUuNjc4IDQ1LjY3ODsiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPGc+DQoJCTxwYXRoIGQ9Ik0zOC45ODgsNi42ODljLTguOTE5LTguOTE4LTIzLjM4LTguOTE5LTMyLjMsMGMtOC45MTgsOC45MTktOC45MTcsMjMuMzgsMCwzMi4yOTljOC45Miw4LjkxOSwyMy4zODEsOC45MTksMzIuMywwDQoJCQlDNDcuOTA4LDMwLjA2OSw0Ny45MDYsMTUuNjA4LDM4Ljk4OCw2LjY4OXogTTIxLjg5MywzNi4wMTZjLTEuNzMsMC0yLjkwNi0xLjI3Mi0yLjkwNi0yLjk3MWMwLTEuNzMsMS4yMDktMi45NzIsMi45MDYtMi45NzINCgkJCWMxLjc2NCwwLDIuOTA2LDEuMjQxLDIuOTM4LDIuOTcyQzI0LjgzMSwzNC43NDIsMjMuNjU2LDM2LjAxNiwyMS44OTMsMzYuMDE2eiBNMjYuMjE1LDIxLjk4MWMtMS4zMiwxLjQ2Ni0xLjg1NiwyLjg2MS0xLjgyLDQuNDY4DQoJCQljMCwxLjE5My0wLjk2OSwyLjE2Mi0yLjE2MywyLjE2MkgyMS43N2MtMS4xODIsMC0yLjE0NS0wLjk0OS0yLjE2MS0yLjEzMWwtMC4wMDUtMC4zMTdjLTAuMTA3LTEuODIzLDAuNTAxLTMuNjgxLDIuMTA5LTUuNjExDQoJCQljMS4xNDUtMS4zNTksMi4wNzItMi41MDIsMi4wNzItMy43MThjMC0xLjI1LTAuODIyLTIuMDczLTIuNjA3LTIuMTQ2Yy0wLjU0OSwwLTEuMTUsMC4wOTMtMS43MzEsMC4yNTYNCgkJCWMtMS4wNTYsMC4yOTctMi4xNTYtMC4yOTgtMi40ODItMS4zNDVsLTAuMDA2LTAuMDJjLTAuMzI5LTEuMDU0LDAuMjQ3LTIuMTc1LDEuMjk0LTIuNTIzYzEuMTU3LTAuMzg1LDIuNTc0LTAuNjU3LDQuMTQtMC42NTcNCgkJCWM0LjcyLDAsNi44NjQsMi42MDksNi44NjQsNS41NzZDMjkuMjU2LDE4LjY5MiwyNy41NzUsMjAuNDc5LDI2LjIxNSwyMS45ODF6Ii8+DQoJPC9nPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPC9zdmc+DQo=\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iQ2FwYV8xIgogICB4PSIwcHgiCiAgIHk9IjBweCIKICAgd2lkdGg9IjQ3MS42MDhweCIKICAgaGVpZ2h0PSI0NzEuNjA4cHgiCiAgIHZpZXdCb3g9IjAgMCA0NzEuNjA4IDQ3MS42MDgiCiAgIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ3MS42MDggNDcxLjYwODsiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJyZWRvLnN2ZyI+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDEiPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+PGRjOnRpdGxlPjwvZGM6dGl0bGU+PC9jYzpXb3JrPjwvcmRmOlJERj48L21ldGFkYXRhPjxkZWZzCiAgICAgaWQ9ImRlZnMzOSIgLz48c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEyMjkiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODE2IgogICAgIGlkPSJuYW1lZHZpZXczNyIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iMC41MDA0MTU2IgogICAgIGlua3NjYXBlOmN4PSIyMzUuODA0IgogICAgIGlua3NjYXBlOmN5PSIyMzUuODA0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjAiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iQ2FwYV8xIiAvPjxnCiAgICAgaWQ9ImczIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KC0xLDAsMCwxLDQ3My42MDYyMSwwKSI+PHBhdGgKICAgICAgIGQ9Im0gMzg0LjUzNTE5LDkxLjA2Nzc0NCBjIC04MS40NTk1NCwtODEuNDU2ODc5MSAtMjE0LjAwODA3LC04MS40NTY4NzkxIC0yOTUuNDY1ODI4LDAgLTgxLjQ1Nzc2NDEsODEuNDU2ODc2IC04MS40NTY4NzgxLDIxNC4wMTE2MDYgMCwyOTUuNDY1ODI2IDgxLjQ1Njg2OCw4MS40NTk1MyAyMTQuMDA1NDA4LDgxLjQ1OTUzIDI5NS40NjU4MjgsMCA4MS40NTk1MywtODEuNDUzMzQgODEuNDU5NTMsLTIxNC4wMDI3NSAwLC0yOTUuNDY1ODI2IHogTSAzNjguMzI4ODMsMzcwLjMzODcyIGMgLTcyLjUxODU5LDcyLjUxODU5IC0xOTAuNTM2Myw3Mi41MTg1OSAtMjYzLjA2NjM5LDAgLTcyLjUxNjgxNywtNzIuNTMwMDkgLTcyLjUxNjgxNywtMTkwLjU0MjUgMCwtMjYzLjA2NzI3IDcyLjUyOTIsLTcyLjUyNjU1OSAxOTAuNTM2MjksLTcyLjUyNjU1OSAyNjMuMDY2MzksMCA3Mi41MjU2Nyw3Mi41MjQ3NyA3Mi41MjU2NywxOTAuNTM3MTggMCwyNjMuMDY3MjcgeiBtIDEyLjQ0MzQ3LC0xOTguMTI3NiAtMTEuNjIwNzYsNTIuMzI5NzEgYyAtMC4zMTM1LDEuNDQ3MDYgLTEuNzQzNzMsMi4zNDY4MiAtMy4xODI4MiwyLjAzNTk4IC0wLjQ0MDE0LC0wLjA5MzkgLTEwLjk1MDM2LC0yLjM1ODM0IC0yNi4yOTg1OCwtMi4zNTgzNCAtMjUuODg5NDQsMCAtNzEuNjI0MTMsNi44NTE4NCAtMTAxLjgzMTcyLDQ5LjU1MzM4IGwgNi4yOTY1Niw2LjI5NjU3IDcwLjUwMzg2LDMwLjU1OTE3IGMgMi4zNjU0MiwxLjAzNzAzIDMuNzU3NTgsMy41MDY5NSAzLjM5MTgzLDYuMDY3MiAtMC4zNTA3LDIuNTQ5NjIgLTIuMzYxLDQuNTU0NjEgLTQuOTMwOTksNC44NzM0MiBsIC0xNzUuNjA1MTksMjIuOTU5MDEgYyAtMS43NTg3OSwwLjIzMDI1IC0zLjUzODgzLC0wLjM3NzI2IC00Ljc5NzI2LC0xLjYyNzcyIC0xLjI2NjQsLTEuMjYxOTcgLTEuODU1MzIsLTMuMDM2NyAtMS42MzU2OSwtNC44MDYxMiBsIDIyLjk1OSwtMTc1LjYwNzg1IGMgMC4xNjQ3MywtMS4yODUgMC43NTM2NCwtMi40MzYyNyAxLjYyMzMsLTMuMzA1MDMgMC44NTgxNCwtMC44NTkwMyAxLjk4OTA0LC0xLjQ0Nzk1IDMuMjYzNDEsLTEuNjMxMjcgMi41NDY5NywtMC4zNTc3OCA1LjAxNzc3LDEuMDM3MDMgNi4wNTM5MiwzLjM5NDQ4IGwgMzAuNTY3MTQsNzAuNTA2NTIgMC4xNTc2MywwLjE1NzYzIGMgNDcuMTQxOTEsLTU5LjQwMTE3IDExNS40MTU4NCwtNjYuNDg5NDYgMTQ1LjAyODMxLC02Ni40ODk0NiAxMy41NDY5MywwIDI2LjY5NjIyLDEuMzQ1MjIgMzguMDIzODQsMy44ODY4NyAxLjQ1MzI2LDAuMzMyMSAyLjM2MzY1LDEuNzYzMjIgMi4wMzQyMSwzLjIwNTg1IHoiCiAgICAgICBpZD0icGF0aDUiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPjwvZz48ZwogICAgIGlkPSJnNyIgLz48ZwogICAgIGlkPSJnOSIgLz48ZwogICAgIGlkPSJnMTEiIC8+PGcKICAgICBpZD0iZzEzIiAvPjxnCiAgICAgaWQ9ImcxNSIgLz48ZwogICAgIGlkPSJnMTciIC8+PGcKICAgICBpZD0iZzE5IiAvPjxnCiAgICAgaWQ9ImcyMSIgLz48ZwogICAgIGlkPSJnMjMiIC8+PGcKICAgICBpZD0iZzI1IiAvPjxnCiAgICAgaWQ9ImcyNyIgLz48ZwogICAgIGlkPSJnMjkiIC8+PGcKICAgICBpZD0iZzMxIiAvPjxnCiAgICAgaWQ9ImczMyIgLz48ZwogICAgIGlkPSJnMzUiIC8+PC9zdmc+\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE4LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDM5Mi42MiAzOTIuNjIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDM5Mi42MiAzOTIuNjI7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxyZWN0IHg9IjE0NC44NjYiIHk9IjMyMC44OTciIHdpZHRoPSIyMy41MDUiIGhlaWdodD0iMjUiLz4NCgk8cGF0aCBkPSJNMzA5Ljc5NSwwSDI2Ni40OUgxMjYuMTMxSDgyLjgyNUMzNy42NjcsMCwwLjkyOSwzNi43MzgsMC45MjksODEuODk2djIyOC44MjhjMCw0NS4xNTgsMzYuNzM4LDgxLjg5Niw4MS44OTYsODEuODk2aDU4LjMyDQoJCWgxMTMuNDQzaDU1LjIwNmM0NS4xNTcsMCw4MS44OTYtMzYuNzM4LDgxLjg5Ni04MS44OTZWODEuODk2QzM5MS42OTEsMzYuNzM4LDM1NC45NTIsMCwzMDkuNzk1LDB6IE0yNjYuNDksMzANCgkJYzE0LjM1NCwwLDI2LjAzLDkuNTQyLDI2LjAzLDIxLjI3VjE3NC4zM2MwLDExLjcyOS0xMS42NzcsMjEuMjcxLTI2LjAzLDIxLjI3MUgxMjYuMTMxYy0xNC4zNTQsMC0yNi4wMzEtOS41NDItMjYuMDMxLTIxLjI3MQ0KCQlWNTEuMjdjMC0xMS43MjgsMTEuNjc4LTIxLjI3LDI2LjAzMS0yMS4yN0gyNjYuNDl6IE0xNDEuMTQ2LDM2Mi42MmMtNi4yNTksMC0xMS4zNTItNS4wOTItMTEuMzUyLTExLjM1MXYtMzAuMDY2DQoJCWMwLTYuMjU5LDUuMDkzLTExLjM1MSwxMS4zNTItMTEuMzUxaDExMy40NDNjNi4yNTksMCwxMS4zNTEsNS4wOTIsMTEuMzUxLDExLjM1MXYzMC4wNjZjMCw2LjI1OS01LjA5MiwxMS4zNTEtMTEuMzUxLDExLjM1MQ0KCQlIMTQxLjE0NnogTTM2MS42OTEsMzEwLjcyNGMwLDI4LjYxNi0yMy4yOCw1MS44OTYtNTEuODk2LDUxLjg5NmgtMTUuNDUyYzEuMDMyLTMuNjEsMS41OTctNy40MTQsMS41OTctMTEuMzUxdi0zMC4wNjYNCgkJYzAtMjIuODAxLTE4LjU1LTQxLjM1MS00MS4zNTEtNDEuMzUxSDE0MS4xNDZjLTIyLjgwMiwwLTQxLjM1MiwxOC41NS00MS4zNTIsNDEuMzUxdjMwLjA2NmMwLDMuOTM3LDAuNTY1LDcuNzQyLDEuNTk3LDExLjM1MQ0KCQlIODIuODI1Yy0yOC42MTYsMC01MS44OTYtMjMuMjgtNTEuODk2LTUxLjg5NlY4MS44OTZjMC0yNS45MSwxOS4wODctNDcuNDQ0LDQzLjkzOC01MS4yODVDNzEuODExLDM2LjkzNSw3MC4xLDQzLjkyMSw3MC4xLDUxLjI3DQoJCVYxNzQuMzNjMCwyOC4yNzEsMjUuMTM2LDUxLjI3MSw1Ni4wMzEsNTEuMjcxSDI2Ni40OWMzMC44OTYsMCw1Ni4wMy0yMyw1Ni4wMy01MS4yNzFWNTEuMjdjMC03LjM0OC0xLjcxMS0xNC4zMzQtNC43NjctMjAuNjU5DQoJCWMyNC44NTEsMy44NDEsNDMuOTM4LDI1LjM3NSw0My45MzgsNTEuMjg1VjMxMC43MjR6Ii8+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8L3N2Zz4NCg==\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMjYuNjMzOTQybW0iCiAgIGhlaWdodD0iMjYuNjIyNzY1bW0iCiAgIHZpZXdCb3g9IjAgMCAyNi42MzM5NDIgMjYuNjIyNzY1IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmc4IgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJzZXR0aW5ncy5zdmciPgogIDxkZWZzCiAgICAgaWQ9ImRlZnMyIj4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoNTAwOCIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGgKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGg1MDA2IgogICAgICAgICBkPSJNIDAsMCBIIDMxMi4wNDMgViA3NC40NDgyIEggMCBaIiAvPgogICAgPC9jbGlwUGF0aD4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoNTAxNiIKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGgKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGg1MDE0IgogICAgICAgICBkPSJNIDAsNzQuNDQ4IEggMzEyLjA0MyBWIDAgSCAwIFoiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBpZD0iY2xpcFBhdGg1MTEyIgogICAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBpZD0icGF0aDUxMTAiCiAgICAgICAgIGQ9Ik0gMCwwIEggMzEyLjA0MyBWIDc0LjQ0ODIgSCAwIFoiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBpZD0iY2xpcFBhdGg1MTIwIgogICAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8cGF0aAogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICBpZD0icGF0aDUxMTgiCiAgICAgICAgIGQ9Ik0gMCw3NC40NDggSCAzMTIuMDQzIFYgMCBIIDAgWiIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8Y2xpcFBhdGgKICAgICAgIGlkPSJjbGlwUGF0aDUzMzIiCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgIGlkPSJwYXRoNTMzMCIKICAgICAgICAgZD0iTSAwLDc0LjQ0OCBIIDMxMi4wNDMgViAwIEggMCBaIiAvPgogICAgPC9jbGlwUGF0aD4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjEuOTc5ODk5IgogICAgIGlua3NjYXBlOmN4PSI1NS41MzU2ODgiCiAgICAgaW5rc2NhcGU6Y3k9Ii01MS4wNjA4MTkiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9Im1tIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGZpdC1tYXJnaW4tdG9wPSIwIgogICAgIGZpdC1tYXJnaW4tbGVmdD0iMCIKICAgICBmaXQtbWFyZ2luLXJpZ2h0PSIwIgogICAgIGZpdC1tYXJnaW4tYm90dG9tPSIwIiAvPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTUiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIgogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00Ny40MTE2MTEsLTg5LjI4ODA0KSI+CiAgICA8cmVjdAogICAgICAgcnk9IjAiCiAgICAgICB5PSI5Ni4xNTczNzkiCiAgICAgICB4PSI2MS4xNjE0NzIiCiAgICAgICBoZWlnaHQ9IjUuOTk5OTk5NSIKICAgICAgIHdpZHRoPSI1Ljk5OTk5OTUiCiAgICAgICBpZD0icmVjdDU1MDQiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk4OTk5OTk5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC43NDUwOTgwNTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41NTQwODYzMztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowIiAvPgogICAgPHJlY3QKICAgICAgIHJ5PSIwIgogICAgICAgeT0iMTAzLjAyNjczIgogICAgICAgeD0iNTQuMjkyMTIyIgogICAgICAgaGVpZ2h0PSI1Ljk5OTk5OTUiCiAgICAgICB3aWR0aD0iNS45OTk5OTk1IgogICAgICAgaWQ9InJlY3Q1NTA0LTMiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk4OTk5OTk5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC43NDUwOTgwNTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41NTQwODYzMztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowIiAvPgogICAgPHJlY3QKICAgICAgIHJ5PSIwIgogICAgICAgeT0iODkuMjg4MDQiCiAgICAgICB4PSI2OC4wMzA4MjMiCiAgICAgICBoZWlnaHQ9IjUuOTk5OTk5NSIKICAgICAgIHdpZHRoPSI1Ljk5OTk5OTUiCiAgICAgICBpZD0icmVjdDU1MDQtMy01IgogICAgICAgc3R5bGU9Im9wYWNpdHk6MC45ODk5OTk5OTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNTg4MjM1MzI7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuNTU0MDg2MzM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MCIgLz4KICAgIDxyZWN0CiAgICAgICByeT0iMCIKICAgICAgIHk9IjEwOS44OTYwNyIKICAgICAgIHg9IjQ3LjQyMjc3OSIKICAgICAgIGhlaWdodD0iNS45OTk5OTk1IgogICAgICAgd2lkdGg9IjUuOTk5OTk5NSIKICAgICAgIGlkPSJyZWN0NTUwNC0zLTUtOSIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuOTg5OTk5OTk7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjU4ODIzNTMyO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU1NDA4NjMzO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjAiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNTU1MS03IgogICAgICAgZD0ibSA2OC4zODQ5NjcsMTAyLjEyMDg5IGEgNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCA1LjYwOTM1NCwtNS43MjE5MjggNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCAtMC4wMDk5LC0wLjIwNTA4NyBoIC01LjkxNzA1MyB2IDUuOTEwNzA1IGEgNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCAwLjMxNzYzNCwwLjAxNjMgeiIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuOTg5OTk5OTk7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjU4ODIzNTMyO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjgwODYxNTU3O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjAiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNTY2MyIKICAgICAgIGQ9Im0gNDguMjczMDExLDEwMS4xOTY0OCB2IC03LjU4MjA1MyBjIDAsLTEuOTE0MTQ0IDEuNDE5NTExLC0zLjQ1NTEzNCAzLjE4Mjc2MSwtMy40NTUxMzQgdiAwIGggMTQuNzY3MjcxIgogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiM5ODk0OTQ7c3Ryb2tlLXdpZHRoOjEuNzIyNzk5NjY7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7cGFpbnQtb3JkZXI6ZmlsbCBtYXJrZXJzIHN0cm9rZSIgLz4KICAgIDxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InJlY3Q1NjE3IgogICAgICAgZD0ibSA3My4yMzc4MTMsMTAyLjgzMDQzIDRlLTYsOS4xNTQ5OCBjIDAsMS43MjcxOCAtMS4zODMyNjMsMy4xMTc2NiAtMy4xMDE0ODUsMy4xMTc2NiBIIDU1Ljg0NjA3NyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojOTg5NDk0O3N0cm9rZS13aWR0aDoxLjYxNTQ3MTEyO3N0cm9rZS1saW5lY2FwOnNxdWFyZTtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3BhaW50LW9yZGVyOmZpbGwgbWFya2VycyBzdHJva2UiIC8+CiAgICA8cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoNTU1MS03LTQiCiAgICAgICBkPSJtIDYxLjUxNTYxOCwxMDguOTkwMjMgYSA1LjYwOTA3MzQsNS43MjE5NTg0IDAgMCAwIDUuNjA5MzU0LC01LjcyMTkyIDUuNjA5MDczNCw1LjcyMTk1ODQgMCAwIDAgLTAuMDA5OSwtMC4yMDUwOSBIIDYxLjE5Nzk3IHYgNS45MTA3MSBhIDUuNjA5MDczNCw1LjcyMTk1ODQgMCAwIDAgMC4zMTc2MzQsMC4wMTYzIHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk4OTk5OTk5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC43NDUwOTgwNTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC44MDg2MTU1NztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowIiAvPgogICAgPHBhdGgKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDU1NTEtNy00LTMiCiAgICAgICBkPSJtIDU5LjkzNzk3NSw5Ni4xOTM4NzQgYSA1LjYwOTA3MzQsNS43MjE5NTg0IDAgMCAwIC01LjYwOTM1NCw1LjcyMTkyNiA1LjYwOTA3MzQsNS43MjE5NTg0IDAgMCAwIDAuMDA5OSwwLjIwNTA5IGggNS45MTcwNTMgdiAtNS45MTA3MTEgYSA1LjYwOTA3MzQsNS43MjE5NTg0IDAgMCAwIC0wLjMxNzYzNCwtMC4wMTYzIHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk4OTk5OTk5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC44MDg2MTU1NztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowIiAvPgogICAgPHBhdGgKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDU1NTEtNy00LTMtMCIKICAgICAgIGQ9Im0gNTMuMDY4NjMzLDEwMy4wNjMyMiBhIDUuNjA5MDczNCw1LjcyMTk1ODQgMCAwIDAgLTUuNjA5MzUzLDUuNzIxOTMgNS42MDkwNzM0LDUuNzIxOTU4NCAwIDAgMCAwLjAwOTksMC4yMDUwOCBoIDUuOTE3MDUzIHYgLTUuOTEwNzEgYSA1LjYwOTA3MzQsNS43MjE5NTg0IDAgMCAwIC0wLjMxNzYzNCwtMC4wMTYzIHoiCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjk4OTk5OTk5O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC41ODgyMzUzMjtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC44MDg2MTU1NztzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eTowIiAvPgogICAgPGcKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMjkzMzQyMzksMCwwLDAuMjkzMzQyMzksNjAuNTUxODAzLDEwMi40MTcwNSkiCiAgICAgICBpZD0iZzU0ODYiPgogICAgICA8ZwogICAgICAgICBpZD0iZzMiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICBkPSJtIDQxLjUzNCwyOC42NiBoIDEuOTU3IEMgNDQuODc3LDI4LjY2IDQ2LDI3LjUzNiA0NiwyNi4xNSB2IC02LjMgYyAwLC0xLjM4NSAtMS4xMjQsLTIuNTA5IC0yLjUwOSwtMi41MDkgSCA0MS41NCB2IDAuMDA2IEMgNDEuMTQ4LDE2LjE0IDQwLjY4NywxNC45ODMgNDAuMTAzLDEzLjg4OSBsIDEuMzgxLC0xLjM4MSBjIDAuOTc5LC0wLjk4IDAuOTc5LC0yLjU2OSAwLC0zLjU0OSBMIDM3LjA0LDQuNTE3IGMgLTAuOTc5LC0wLjk3OSAtMi41NjcsLTAuOTc5IC0zLjU0NywwIGwgLTEuMzgyLDEuMzggQyAzMS4wMTcsNS4zMTMgMjkuODYxLDQuODUyIDI4LjY1NCw0LjQ2MSBIIDI4LjY2IFYgMi41MSBDIDI4LjY2LDEuMTI0IDI3LjUzNywwIDI2LjE1LDAgaCAtNi4zIGMgLTEuMzg2LDAgLTIuNTA5LDEuMTI0IC0yLjUwOSwyLjUxIHYgMS45NTUgbCAwLjAxNCwtMTBlLTQgYyAtMS4yMDcsMC4zNjcgLTIuMzYzLDAuODUgLTMuNDU4LDEuNDM1IEwgMTIuNTE2LDQuNTE4IGMgLTAuOTgsLTAuOTc5IC0yLjU2OCwtMC45NzkgLTMuNTQ4LDAgTCA0LjUyNSw4Ljk2MSBDIDMuNTQ2LDkuOTQgMy41NDUsMTEuNTI3IDQuNTIzLDEyLjUwNyBMIDUuOSwxMy44ODkgQyA1LjMxNiwxNC45ODMgNC44NTEsMTYuMTQgNC40NiwxNy4zNDYgViAxNy4zNDEgSCAyLjUwOSBDIDEuMTI0LDE3LjM0MSAwLDE4LjQ2NSAwLDE5Ljg1IHYgNi4zMDEgYyAwLDEuMzg3IDEuMTI0LDIuNTExIDIuNTA5LDIuNTExIEggNC40NzMgTCA0LjQ2NywyOC42NDcgYyAwLjM2NywxLjIwNyAwLjg1MywyLjM2MiAxLjQzNiwzLjQ1NyBsIC0xLjM4LDEuMzgxIGMgLTAuOTgsMC45NzkgLTAuOTc5LDIuNTY3IDAsMy41NDcgbCA0LjQ0Myw0LjQ0MiBjIDAuOTc5LDAuOTc5IDIuNTY4LDAuOTc5IDMuNTQ4LDAgbCAxLjM4MSwtMS4zODEgYyAxLjA5NCwwLjU4NCAyLjI1MSwxLjA3MiAzLjQ1OCwxLjQzOCBsIC0wLjAxNCwtMC4wMDYgdiAxLjk2NSBjIDAsMS4zODcgMS4xMjMsMi41MSAyLjUwOSwyLjUxIGggNi4zIGMgMS4zODcsMCAyLjUxLC0xLjEyMyAyLjUxLC0yLjUxIHYgLTEuOTUgaCAtMC4wMDYgYyAxLjIwNywtMC4zOTIgMi4zNjMsLTAuODU2IDMuNDU3LC0xLjQ0IGwgMS4zODEsMS4zNzkgYyAwLjk4LDAuOTc5IDIuNTY4LDAuOTc5IDMuNTQ3LDAgbCA0LjQ0MywtNC40NDUgYyAwLjk3OSwtMC45NzkgMC45NzksLTIuNTY2IDAsLTMuNTQ3IGwgLTEuMzgzLC0xLjM4MyBjIDAuNTg0LC0xLjA5NCAxLjA2OCwtMi4yNSAxLjQzNiwtMy40NTcgeiBNIDIzLjAyMSwzNi43MTQgQyAxNS40NDQsMzYuNzIzIDkuMjc4LDMwLjU1NyA5LjI4NywyMi45OCA5LjI5NiwxNS40NDEgMTUuNDUsOS4yODcgMjIuOTg5LDkuMjc4IGMgNy41NzgsLTAuMDA5IDEzLjc0NCw2LjE1NyAxMy43MzQsMTMuNzM0IC0wLjAxLDcuNTM5IC02LjE2MiwxMy42OTMgLTEzLjcwMiwxMy43MDIgeiIKICAgICAgICAgICBpZD0icGF0aDUiIC8+CiAgICAgIDwvZz4KICAgICAgPGcKICAgICAgICAgaWQ9Imc3IiAvPgogICAgICA8ZwogICAgICAgICBpZD0iZzkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMTEiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMTMiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMTUiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMTciIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMTkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMjEiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMjMiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMjUiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMjciIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMjkiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMzEiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMzMiIC8+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMzUiIC8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNzMuMDU4cHgiIGhlaWdodD0iNzMuMDU4cHgiIHZpZXdCb3g9IjAgMCA3My4wNTggNzMuMDU4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA3My4wNTggNzMuMDU4OyIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8ZyBpZD0iRXllIj4KCQk8Zz4KCQkJPHBhdGggZD0iTTcyLjg5MywzNS45NjVjLTAuNTgtMC45MjUtMTQuNDMyLTIyLjU0MS0zNS4xNi0yMi41NDFoLTIuNDA2Yy0yMC43MjksMC0zNC41OCwyMS42MTYtMzUuMTU5LDIyLjU0MQoJCQkJYy0wLjIyMywwLjM0Ny0wLjIyMywwLjc5LDAsMS4xMzdjMC41NzksMC45MTcsMTQuNDMyLDIyLjUzMiwzNS4xNTksMjIuNTMyaDIuNDA2YzIwLjcyOSwwLDM0LjU4LTIxLjYxNSwzNS4xNTktMjIuNTMyCgkJCQlDNzMuMTEzLDM2Ljc1NSw3My4xMTMsMzYuMzEyLDcyLjg5MywzNS45NjV6IE00NS4yNjcsMzYuNTI5YzAsNC42OS0zLjkyLDguNTA2LTguNzM2LDguNTA2Yy00LjgxNywwLTguNzM1LTMuODEyLTguNzM1LTguNTA2CgkJCQljMC00LjY4NywzLjkxOC04LjUwOCw4LjczNS04LjUwOEM0MS4zNDcsMjguMDIyLDQ1LjI2NywzMS44NDQsNDUuMjY3LDM2LjUyOXoiLz4KCQk8L2c+Cgk8L2c+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+Cg==\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iQ2FwYV8xIgogICB4PSIwcHgiCiAgIHk9IjBweCIKICAgd2lkdGg9IjQ3MS42MDhweCIKICAgaGVpZ2h0PSI0NzEuNjA4cHgiCiAgIHZpZXdCb3g9IjAgMCA0NzEuNjA4IDQ3MS42MDgiCiAgIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ3MS42MDggNDcxLjYwODsiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJ1bmRvLnN2ZyI+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDEiPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+PC9jYzpXb3JrPjwvcmRmOlJERj48L21ldGFkYXRhPjxkZWZzCiAgICAgaWQ9ImRlZnMzOSIgLz48c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEyMjkiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODE2IgogICAgIGlkPSJuYW1lZHZpZXczNyIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iMC41MDA0MTU2IgogICAgIGlua3NjYXBlOmN4PSIyMzUuODA0IgogICAgIGlua3NjYXBlOmN5PSIyMzUuODA0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjAiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iQ2FwYV8xIiAvPjxnCiAgICAgaWQ9ImczIj48cGF0aAogICAgICAgZD0ibSAzODQuNTM1MTksOTEuMDY3NzQ0IGMgLTgxLjQ1OTU0LC04MS40NTY4NzkxIC0yMTQuMDA4MDcsLTgxLjQ1Njg3OTEgLTI5NS40NjU4MjgsMCAtODEuNDU3NzY0MSw4MS40NTY4NzYgLTgxLjQ1Njg3ODEsMjE0LjAxMTYwNiAwLDI5NS40NjU4MjYgODEuNDU2ODY4LDgxLjQ1OTUzIDIxNC4wMDU0MDgsODEuNDU5NTMgMjk1LjQ2NTgyOCwwIDgxLjQ1OTUzLC04MS40NTMzNCA4MS40NTk1MywtMjE0LjAwMjc1IDAsLTI5NS40NjU4MjYgeiBNIDM2OC4zMjg4MywzNzAuMzM4NzIgYyAtNzIuNTE4NTksNzIuNTE4NTkgLTE5MC41MzYzLDcyLjUxODU5IC0yNjMuMDY2MzksMCAtNzIuNTE2ODE3LC03Mi41MzAwOSAtNzIuNTE2ODE3LC0xOTAuNTQyNSAwLC0yNjMuMDY3MjcgNzIuNTI5MiwtNzIuNTI2NTU5IDE5MC41MzYyOSwtNzIuNTI2NTU5IDI2My4wNjYzOSwwIDcyLjUyNTY3LDcyLjUyNDc3IDcyLjUyNTY3LDE5MC41MzcxOCAwLDI2My4wNjcyNyB6IG0gMTIuNDQzNDcsLTE5OC4xMjc2IC0xMS42MjA3Niw1Mi4zMjk3MSBjIC0wLjMxMzUsMS40NDcwNiAtMS43NDM3MywyLjM0NjgyIC0zLjE4MjgyLDIuMDM1OTggLTAuNDQwMTQsLTAuMDkzOSAtMTAuOTUwMzYsLTIuMzU4MzQgLTI2LjI5ODU4LC0yLjM1ODM0IC0yNS44ODk0NCwwIC03MS42MjQxMyw2Ljg1MTg0IC0xMDEuODMxNzIsNDkuNTUzMzggbCA2LjI5NjU2LDYuMjk2NTcgNzAuNTAzODYsMzAuNTU5MTcgYyAyLjM2NTQyLDEuMDM3MDMgMy43NTc1OCwzLjUwNjk1IDMuMzkxODMsNi4wNjcyIC0wLjM1MDcsMi41NDk2MiAtMi4zNjEsNC41NTQ2MSAtNC45MzA5OSw0Ljg3MzQyIGwgLTE3NS42MDUxOSwyMi45NTkwMSBjIC0xLjc1ODc5LDAuMjMwMjUgLTMuNTM4ODMsLTAuMzc3MjYgLTQuNzk3MjYsLTEuNjI3NzIgLTEuMjY2NCwtMS4yNjE5NyAtMS44NTUzMiwtMy4wMzY3IC0xLjYzNTY5LC00LjgwNjEyIGwgMjIuOTU5LC0xNzUuNjA3ODUgYyAwLjE2NDczLC0xLjI4NSAwLjc1MzY0LC0yLjQzNjI3IDEuNjIzMywtMy4zMDUwMyAwLjg1ODE0LC0wLjg1OTAzIDEuOTg5MDQsLTEuNDQ3OTUgMy4yNjM0MSwtMS42MzEyNyAyLjU0Njk3LC0wLjM1Nzc4IDUuMDE3NzcsMS4wMzcwMyA2LjA1MzkyLDMuMzk0NDggbCAzMC41NjcxNCw3MC41MDY1MiAwLjE1NzYzLDAuMTU3NjMgYyA0Ny4xNDE5MSwtNTkuNDAxMTcgMTE1LjQxNTg0LC02Ni40ODk0NiAxNDUuMDI4MzEsLTY2LjQ4OTQ2IDEzLjU0NjkzLDAgMjYuNjk2MjIsMS4zNDUyMiAzOC4wMjM4NCwzLjg4Njg3IDEuNDUzMjYsMC4zMzIxIDIuMzYzNjUsMS43NjMyMiAyLjAzNDIxLDMuMjA1ODUgeiIKICAgICAgIGlkPSJwYXRoNSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+PC9nPjxnCiAgICAgaWQ9Imc3IiAvPjxnCiAgICAgaWQ9Imc5IiAvPjxnCiAgICAgaWQ9ImcxMSIgLz48ZwogICAgIGlkPSJnMTMiIC8+PGcKICAgICBpZD0iZzE1IiAvPjxnCiAgICAgaWQ9ImcxNyIgLz48ZwogICAgIGlkPSJnMTkiIC8+PGcKICAgICBpZD0iZzIxIiAvPjxnCiAgICAgaWQ9ImcyMyIgLz48ZwogICAgIGlkPSJnMjUiIC8+PGcKICAgICBpZD0iZzI3IiAvPjxnCiAgICAgaWQ9ImcyOSIgLz48ZwogICAgIGlkPSJnMzEiIC8+PGcKICAgICBpZD0iZzMzIiAvPjxnCiAgICAgaWQ9ImczNSIgLz48L3N2Zz4=\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMTc0IgogICBoZWlnaHQ9IjQ3Ljg4NzMxIgogICB2aWV3Qm94PSIwIDAgMTYzLjEyNSA0NC44OTQzNTQiCiAgIGlkPSJzdmc0Mzk5IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTIuMSByMTUzNzEiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImNvbXBhcnRtZW50LnN2ZyI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQ0MDEiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjEuNCIKICAgICBpbmtzY2FwZTpjeD0iNTcuNTQ1NjA4IgogICAgIGlua3NjYXBlOmN5PSI5NS4yMzMzOTkiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgZml0LW1hcmdpbi10b3A9IjAiCiAgICAgZml0LW1hcmdpbi1sZWZ0PSIwIgogICAgIGZpdC1tYXJnaW4tcmlnaHQ9IjAiCiAgICAgZml0LW1hcmdpbi1ib3R0b209IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIHVuaXRzPSJweCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NDA0Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjc0LjQ1MDM1LC0zMTYuMDU0MzYpIj4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDo2LjgyOTY5OTA0O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0Mjk4NSIKICAgICAgIHdpZHRoPSIxNTYuMjk1MyIKICAgICAgIGhlaWdodD0iMzguMDY0NjU1IgogICAgICAgeD0iMjc3Ljg2NTIiCiAgICAgICB5PSIzMTkuNDY5MjEiCiAgICAgICByeT0iOS44MjMxMjExIgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjUzLjk1OTk5OSIKICAgICAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSI1My45NTk5OTkiCiAgICAgICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9IkM6XFVzZXJzXHVndXJcR29vZ2xlIERyaXZlXHRvb2xiYXJcbWFjcm9tb2xlY3VsZS5wbmciIC8+CiAgICA8dGV4dAogICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjI4LjEyNXB4O2xpbmUtaGVpZ2h0OjEyNSU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuOTM3NXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB4PSIzMDMuODM1MTEiCiAgICAgICB5PSIzNDIuNTQ0NDkiCiAgICAgICBpZD0idGV4dDgxOCI+PHRzcGFuCiAgICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCiAgICAgICAgIGlkPSJ0c3BhbjgxNiIKICAgICAgICAgeD0iMzAzLjgzNTExIgogICAgICAgICB5PSIzNDIuNTQ0NDkiCiAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTVweDtzdHJva2Utd2lkdGg6MC45Mzc1cHgiPkNvbXBhcnRtZW50PC90c3Bhbj48L3RleHQ+CiAgPC9nPgo8L3N2Zz4K\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMTc0IgogICBoZWlnaHQ9IjQ0LjQ0MjgyMiIKICAgdmlld0JveD0iMCAwIDE2My4xMjUgNDEuNjY1MTQ2IgogICBpZD0ic3ZnNDM5OSIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJjb21wbGV4LnN2ZyI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQ0MDEiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjEuNCIKICAgICBpbmtzY2FwZTpjeD0iNTUuODIzMzUzIgogICAgIGlua3NjYXBlOmN5PSI5My41MTExNjYiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgZml0LW1hcmdpbi10b3A9IjAiCiAgICAgZml0LW1hcmdpbi1sZWZ0PSIwIgogICAgIGZpdC1tYXJnaW4tcmlnaHQ9IjAiCiAgICAgZml0LW1hcmdpbi1ib3R0b209IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIHVuaXRzPSJweCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NDA0Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjc2LjA2NDk3LC0zMTcuNjY4OTcpIj4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozLjIzMTI2OTg0O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0Mjk4NSIKICAgICAgIHdpZHRoPSIxNTkuODkzNzQiCiAgICAgICBoZWlnaHQ9IjM4LjQzMzg3NiIKICAgICAgIHg9IjI3Ny42ODA2IgogICAgICAgeT0iMzE5LjI4NDYxIgogICAgICAgcnk9IjAiCiAgICAgICBpbmtzY2FwZTpleHBvcnQteGRwaT0iNTMuOTU5OTk5IgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjUzLjk1OTk5OSIKICAgICAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iQzpcVXNlcnNcdWd1clxHb29nbGUgRHJpdmVcdG9vbGJhclxtYWNyb21vbGVjdWxlLnBuZyIgLz4KICAgIDx0ZXh0CiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXNpemU6MjguMTI1cHg7bGluZS1oZWlnaHQ6MTI1JTtmb250LWZhbWlseTpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC45Mzc1cHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIHg9IjMyNC43MTYwOSIKICAgICAgIHk9IjM0Mi42OTEwMSIKICAgICAgIGlkPSJ0ZXh0ODE4Ij48dHNwYW4KICAgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKICAgICAgICAgaWQ9InRzcGFuODE2IgogICAgICAgICB4PSIzMjQuNzE2MDkiCiAgICAgICAgIHk9IjM0Mi42OTEwMSIKICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxNXB4O3N0cm9rZS13aWR0aDowLjkzNzVweCI+Q29tcGxleDwvdHNwYW4+PC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMTczLjk5OTM3IgogICBoZWlnaHQ9IjQ1LjA4MjAwMSIKICAgdmlld0JveD0iMCAwIDE2My4xMjQ0MiA0Mi4yNjQzNzYiCiAgIGlkPSJzdmc0Mzk5IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTIuMSByMTUzNzEiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImZhbWlseS5zdmciPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0NDAxIiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIxLjQiCiAgICAgaW5rc2NhcGU6Y3g9IjE3MS44OTQ3NyIKICAgICBpbmtzY2FwZTpjeT0iOTMuNTExMTkyIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGZpdC1tYXJnaW4tdG9wPSIwIgogICAgIGZpdC1tYXJnaW4tbGVmdD0iMCIKICAgICBmaXQtbWFyZ2luLXJpZ2h0PSIwIgogICAgIGZpdC1tYXJnaW4tYm90dG9tPSIwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDE3IgogICAgIGlua3NjYXBlOndpbmRvdy14PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICB1bml0cz0icHgiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDQwNCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI3Ni4wNjQ5OCwtMzE3LjA2OTc3KSI+CiAgICA8cmVjdAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzkzOTM5MztzdHJva2Utd2lkdGg6My4yNTUxMTgzNztzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBpZD0icmVjdDI5ODUiCiAgICAgICB3aWR0aD0iMTU5Ljg2OTI5IgogICAgICAgaGVpZ2h0PSIzOS4wMDkyNTgiCiAgICAgICB4PSIyNzcuNjkyNTQiCiAgICAgICB5PSIzMTguNjk3MzMiCiAgICAgICByeT0iMCIKICAgICAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSI1My45NTk5OTkiCiAgICAgICBpbmtzY2FwZTpleHBvcnQteWRwaT0iNTMuOTU5OTk5IgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSJDOlxVc2Vyc1x1Z3VyXEdvb2dsZSBEcml2ZVx0b29sYmFyXG1hY3JvbW9sZWN1bGUucG5nIiAvPgogICAgPHRleHQKICAgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToyOC4xMjVweDtsaW5lLWhlaWdodDoxMjUlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjkzNzVweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgeD0iMzMyLjg2MDMyIgogICAgICAgeT0iMzQyLjM5MTQyIgogICAgICAgaWQ9InRleHQ4MTgiPjx0c3BhbgogICAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgogICAgICAgICBpZD0idHNwYW44MTYiCiAgICAgICAgIHg9IjMzMi44NjAzMiIKICAgICAgICAgeT0iMzQyLjM5MTQyIgogICAgICAgICBzdHlsZT0iZm9udC1zaXplOjE1cHg7c3Ryb2tlLXdpZHRoOjAuOTM3NXB4Ij5GYW1pbHk8L3RzcGFuPjwvdGV4dD4KICA8L2c+Cjwvc3ZnPgo=\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMTc0IgogICBoZWlnaHQ9IjQ0LjQ0MjgyMiIKICAgdmlld0JveD0iMCAwIDE2My4xMjUgNDEuNjY1MTQ2IgogICBpZD0ic3ZnNDM5OSIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJnZW5lLnN2ZyI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQ0MDEiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjEuNCIKICAgICBpbmtzY2FwZTpjeD0iNTUuODIzMzUzIgogICAgIGlua3NjYXBlOmN5PSI5My41MTExNjYiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgZml0LW1hcmdpbi10b3A9IjAiCiAgICAgZml0LW1hcmdpbi1sZWZ0PSIwIgogICAgIGZpdC1tYXJnaW4tcmlnaHQ9IjAiCiAgICAgZml0LW1hcmdpbi1ib3R0b209IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIHVuaXRzPSJweCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NDA0Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjc2LjA2NDk3LC0zMTcuNjY4OTcpIj4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozLjIzMTI2OTg0O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJyZWN0Mjk4NSIKICAgICAgIHdpZHRoPSIxNTkuODkzNzQiCiAgICAgICBoZWlnaHQ9IjM4LjQzMzg3NiIKICAgICAgIHg9IjI3Ny42ODA2IgogICAgICAgeT0iMzE5LjI4NDYxIgogICAgICAgcnk9IjkuOTE4NDAzNiIKICAgICAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSI1My45NTk5OTkiCiAgICAgICBpbmtzY2FwZTpleHBvcnQteWRwaT0iNTMuOTU5OTk5IgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSJDOlxVc2Vyc1x1Z3VyXEdvb2dsZSBEcml2ZVx0b29sYmFyXG1hY3JvbW9sZWN1bGUucG5nIiAvPgogICAgPHRleHQKICAgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToyOC4xMjVweDtsaW5lLWhlaWdodDoxMjUlO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjkzNzVweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgeD0iMzM4LjA3NTQ3IgogICAgICAgeT0iMzQzLjk0NzExIgogICAgICAgaWQ9InRleHQ4MTgiPjx0c3BhbgogICAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgogICAgICAgICBpZD0idHNwYW44MTYiCiAgICAgICAgIHg9IjMzOC4wNzU0NyIKICAgICAgICAgeT0iMzQzLjk0NzExIgogICAgICAgICBzdHlsZT0iZm9udC1zaXplOjE1cHg7c3Ryb2tlLXdpZHRoOjAuOTM3NXB4Ij5HZW5lPC90c3Bhbj48L3RleHQ+CiAgPC9nPgo8L3N2Zz4K\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMTc0IgogICBoZWlnaHQ9IjQ0LjQ0MjgyMiIKICAgdmlld0JveD0iMCAwIDE2My4xMjUgNDEuNjY1MTQ2IgogICBpZD0ic3ZnNDM5OSIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJwcm9jZXNzLnN2ZyI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQ0MDEiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjEuNCIKICAgICBpbmtzY2FwZTpjeD0iLTYwLjI0ODA3NiIKICAgICBpbmtzY2FwZTpjeT0iOTMuNTExMTY2IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGZpdC1tYXJnaW4tdG9wPSIwIgogICAgIGZpdC1tYXJnaW4tbGVmdD0iMCIKICAgICBmaXQtbWFyZ2luLXJpZ2h0PSIwIgogICAgIGZpdC1tYXJnaW4tYm90dG9tPSIwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDE3IgogICAgIGlua3NjYXBlOndpbmRvdy14PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICB1bml0cz0icHgiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNDQwNCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI3Ni4wNjQ5NywtMzE3LjY2ODk3KSI+CiAgICA8dGV4dAogICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjI4LjEyNXB4O2xpbmUtaGVpZ2h0OjEyNSU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuOTM3NXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB4PSIzMjguNzE1MTIiCiAgICAgICB5PSIzNDMuODQwOTEiCiAgICAgICBpZD0idGV4dDgxOCI+PHRzcGFuCiAgICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCiAgICAgICAgIGlkPSJ0c3BhbjgxNiIKICAgICAgICAgeD0iMzI4LjcxNTEyIgogICAgICAgICB5PSIzNDMuODQwOTEiCiAgICAgICAgIHN0eWxlPSJmb250LXNpemU6MTVweDtzdHJva2Utd2lkdGg6MC45Mzc1cHgiPlByb2Nlc3M8L3RzcGFuPjwvdGV4dD4KICA8L2c+Cjwvc3ZnPgo=\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/Pgo8c3ZnIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0gIjQ0IiBoZWlnaHQ9ICI0NCIgdmlld0JveD0iMCAwIDQ0IDQ0IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNDQgNDQiPgogIDxjaXJjbGUgY3g9IjIyIiBjeT0iMjIiIHI9IjIyIiBmaWxsPSIjZmZmIi8+CiAgPHBhdGggZD0ibTIyLDBjLTEyLjIsMC0yMiw5LjgtMjIsMjJzOS44LDIyIDIyLDIyIDIyLTkuOCAyMi0yMi05LjgtMjItMjItMjJ6bS0xLjMsMTkuM2wtMS40LDEuNGMtMC40LDAuNC0xLDAuNC0xLjQsMGwtNC00Yy0wLjMtMC4zLTAuOS0wLjEtMC45LDAuNHYxYzAsMC42LTAuNCwxLTEsMWgtMmMtMC42LDAtMS0wLjQtMS0xdi04YzAtMC42IDAuNC0xIDEtMWg4YzAuNiwwIDEsMC40IDEsMXYyYzAsMC42LTAuNCwxLTEsMWgtMWMtMC40LDAtMC43LDAuNS0wLjQsMC45bDQsNGMwLjUsMC4zIDAuNSwwLjkgMC4xLDEuM3ptMTQuMywxNC43YzAsMC42LTAuNCwxLTEsMWgtOGMtMC42LDAtMS0wLjQtMS0xdi0yYzAtMC42IDAuNC0xIDEtMWgxYzAuNCwwIDAuNy0wLjUgMC40LTAuOWwtNC00Yy0wLjQtMC40LTAuNC0xIDAtMS40bDEuNC0xLjRjMC40LTAuNCAxLTAuNCAxLjQsMGw0LDRjMC4zLDAuMyAwLjksMC4xIDAuOS0wLjR2LTFjMC0wLjYgMC40LTEgMS0xaDJjMC42LDAgMSwwLjQgMSwxdjguMWgtMC4xeiIvPgo8L3N2Zz4K\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNjUiCiAgIGhlaWdodD0iMTkuNzg3MjE4IgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJhY3RpdmF0ZXMuc3ZnIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9IkM6XFVzZXJzXHVndXJcRGVza3RvcFxpbnRlcmFjdGlvbi1sZWdlbmQuMjAxNi4wNC4wMS5wbmciCiAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIzMDAiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSIzMDAiCiAgIHZpZXdCb3g9IjAgMCA2MC45Mzc1MDEgMTguNTUwNTE2Ij4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8bWFya2VyCiAgICAgICBpbmtzY2FwZTpzdG9ja2lkPSJUcmlhbmdsZU91dEwiCiAgICAgICBvcmllbnQ9ImF1dG8iCiAgICAgICByZWZZPSIwIgogICAgICAgcmVmWD0iMCIKICAgICAgIGlkPSJtYXJrZXIxMjAyIgogICAgICAgc3R5bGU9Im92ZXJmbG93OnZpc2libGUiCiAgICAgICBpbmtzY2FwZTppc3N0b2NrPSJ0cnVlIj4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgxMjAwIgogICAgICAgICBkPSJNIDUuNzcsMCAtMi44OCw1IFYgLTUgWiIKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwM3B0O3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC44KSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDwvbWFya2VyPgogICAgPG1hcmtlcgogICAgICAgaW5rc2NhcGU6c3RvY2tpZD0iVHJpYW5nbGVPdXRMIgogICAgICAgb3JpZW50PSJhdXRvIgogICAgICAgcmVmWT0iMCIKICAgICAgIHJlZlg9IjAiCiAgICAgICBpZD0iVHJpYW5nbGVPdXRMIgogICAgICAgc3R5bGU9Im92ZXJmbG93OnZpc2libGUiCiAgICAgICBpbmtzY2FwZTppc3N0b2NrPSJ0cnVlIj4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGg5NTkiCiAgICAgICAgIGQ9Ik0gNS43NywwIC0yLjg4LDUgViAtNSBaIgogICAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDAzcHQ7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjgpIgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPC9tYXJrZXI+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI3LjkxOTU5NTkiCiAgICAgaW5rc2NhcGU6Y3g9Ii00LjgxMTAzNTciCiAgICAgaW5rc2NhcGU6Y3k9IjE4LjQ2ODYyMSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTAxNyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgZml0LW1hcmdpbi10b3A9IjAiCiAgICAgZml0LW1hcmdpbi1sZWZ0PSIwIgogICAgIGZpdC1tYXJnaW4tcmlnaHQ9IjAiCiAgICAgZml0LW1hcmdpbi1ib3R0b209IjAiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGUgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI3NS42NDI0NywtMjgxLjI5NjQ5KSI+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6My43NDk5OTk5MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJtIDI3NS42NDI0NywyOTAuNTcxNzUgaCA0Ny4zNTA4OSIKICAgICAgIGlkPSJwYXRoNDk0OSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOnR5cGU9InN0YXIiCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6My43NTtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtwYWludC1vcmRlcjpmaWxsIG1hcmtlcnMgc3Ryb2tlIgogICAgICAgaWQ9InBhdGg0OTUzIgogICAgICAgc29kaXBvZGk6c2lkZXM9IjMiCiAgICAgICBzb2RpcG9kaTpjeD0iMjEyLjQyOTAyIgogICAgICAgc29kaXBvZGk6Y3k9IjI1My43OTgyNiIKICAgICAgIHNvZGlwb2RpOnIxPSIxMS4wNTczNDciCiAgICAgICBzb2RpcG9kaTpyMj0iNS41Mjg2NzM2IgogICAgICAgc29kaXBvZGk6YXJnMT0iMC45MTQ0NDc5NiIKICAgICAgIHNvZGlwb2RpOmFyZzI9IjEuOTYxNjQ1NSIKICAgICAgIGlua3NjYXBlOmZsYXRzaWRlZD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJvdW5kZWQ9IjAiCiAgICAgICBpbmtzY2FwZTpyYW5kb21pemVkPSIwIgogICAgICAgZD0ibSAyMTkuMTc2NTIsMjYyLjU1ODE4IC0xNy43MDc1NywtNy4yOTYzNyAxNS4xNzI2MiwtMTEuNjg3MDEgeiIKICAgICAgIGlua3NjYXBlOnRyYW5zZm9ybS1jZW50ZXIteD0iLTIuNjk0NjIxOSIKICAgICAgIGlua3NjYXBlOnRyYW5zZm9ybS1jZW50ZXIteT0iMC4wNzg0ODk2NTMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjM5NDM0MDk4LDAuODk5Nzc1MDQsLTAuOTE4OTY0MTksMC4zODYxMDY2Myw0NzQuOTg1ODMsMS4zNjE3MzI5KSIgLz4KICA8L2c+Cjwvc3ZnPgo=\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNjUiCiAgIGhlaWdodD0iMTkuNzg3MjE4IgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJiaW5kcy5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iQzpcVXNlcnNcdWd1clxEZXNrdG9wXGludGVyYWN0aW9uLWxlZ2VuZC4yMDE2LjA0LjAxLnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjMwMCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjMwMCIKICAgdmlld0JveD0iMCAwIDYwLjkzNzUwMSAxOC41NTA1MTYiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxtYXJrZXIKICAgICAgIGlua3NjYXBlOnN0b2NraWQ9IlRyaWFuZ2xlT3V0TCIKICAgICAgIG9yaWVudD0iYXV0byIKICAgICAgIHJlZlk9IjAiCiAgICAgICByZWZYPSIwIgogICAgICAgaWQ9Im1hcmtlcjEyMDIiCiAgICAgICBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGlua3NjYXBlOmlzc3RvY2s9InRydWUiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDEyMDAiCiAgICAgICAgIGQ9Ik0gNS43NywwIC0yLjg4LDUgViAtNSBaIgogICAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDAzcHQ7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjgpIgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPC9tYXJrZXI+CiAgICA8bWFya2VyCiAgICAgICBpbmtzY2FwZTpzdG9ja2lkPSJUcmlhbmdsZU91dEwiCiAgICAgICBvcmllbnQ9ImF1dG8iCiAgICAgICByZWZZPSIwIgogICAgICAgcmVmWD0iMCIKICAgICAgIGlkPSJUcmlhbmdsZU91dEwiCiAgICAgICBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGlua3NjYXBlOmlzc3RvY2s9InRydWUiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDk1OSIKICAgICAgICAgZD0iTSA1Ljc3LDAgLTIuODgsNSBWIC01IFoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMDNwdDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuOCkiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L21hcmtlcj4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjcuOTE5NTk1OSIKICAgICBpbmtzY2FwZTpjeD0iLTQuODExMDM1NyIKICAgICBpbmtzY2FwZTpjeT0iMTguNDY4NjIxIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDE3IgogICAgIGlua3NjYXBlOndpbmRvdy14PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBmaXQtbWFyZ2luLXRvcD0iMCIKICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAiCiAgICAgZml0LW1hcmdpbi1yaWdodD0iMCIKICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjc1LjY0MjQ3LC0yODEuMjk2NDkpIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozLjc1O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Im0gMjc1LjY0MjQ3LDI5MC41NzE3NSBoIDYwLjkzNzUiCiAgICAgICBpZD0icGF0aDQ5NDkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICA8L2c+Cjwvc3ZnPgo=\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNjUiCiAgIGhlaWdodD0iMTkuNzg3MjE4IgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJpbmR1Y2VzLnN2ZyIKICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSJDOlxVc2Vyc1x1Z3VyXERlc2t0b3BcaW50ZXJhY3Rpb24tbGVnZW5kLjIwMTYuMDQuMDEucG5nIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iMzAwIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iMzAwIgogICB2aWV3Qm94PSIwIDAgNjAuOTM3NTAxIDE4LjU1MDUxNiI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPG1hcmtlcgogICAgICAgaW5rc2NhcGU6c3RvY2tpZD0iVHJpYW5nbGVPdXRMIgogICAgICAgb3JpZW50PSJhdXRvIgogICAgICAgcmVmWT0iMCIKICAgICAgIHJlZlg9IjAiCiAgICAgICBpZD0ibWFya2VyMTIwMiIKICAgICAgIHN0eWxlPSJvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgaW5rc2NhcGU6aXNzdG9jaz0idHJ1ZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTIwMCIKICAgICAgICAgZD0iTSA1Ljc3LDAgLTIuODgsNSBWIC01IFoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMDNwdDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuOCkiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L21hcmtlcj4KICAgIDxtYXJrZXIKICAgICAgIGlua3NjYXBlOnN0b2NraWQ9IlRyaWFuZ2xlT3V0TCIKICAgICAgIG9yaWVudD0iYXV0byIKICAgICAgIHJlZlk9IjAiCiAgICAgICByZWZYPSIwIgogICAgICAgaWQ9IlRyaWFuZ2xlT3V0TCIKICAgICAgIHN0eWxlPSJvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgaW5rc2NhcGU6aXNzdG9jaz0idHJ1ZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoOTU5IgogICAgICAgICBkPSJNIDUuNzcsMCAtMi44OCw1IFYgLTUgWiIKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwM3B0O3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC44KSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDwvbWFya2VyPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iNy45MTk1OTU5IgogICAgIGlua3NjYXBlOmN4PSItNC44MTEwMzU3IgogICAgIGlua3NjYXBlOmN5PSIxOC40Njg2MjEiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGZpdC1tYXJnaW4tdG9wPSIwIgogICAgIGZpdC1tYXJnaW4tbGVmdD0iMCIKICAgICBmaXQtbWFyZ2luLXJpZ2h0PSIwIgogICAgIGZpdC1tYXJnaW4tYm90dG9tPSIwIiAvPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIgogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNzUuNjQyNDcsLTI4MS4yOTY0OSkiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjMuNzQ5OTk5OTM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5OjcuNDk5OTk5ODcsNy40OTk5OTk4NztzdHJva2Utb3BhY2l0eToxO3N0cm9rZS1kYXNob2Zmc2V0OjAiCiAgICAgICBkPSJtIDI3NS42NDI0NywyOTAuNTcxNzUgaCA0Ny4zNTA4OSIKICAgICAgIGlkPSJwYXRoNDk0OSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgPHBhdGgKICAgICAgIHNvZGlwb2RpOnR5cGU9InN0YXIiCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6My43NTtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtwYWludC1vcmRlcjpmaWxsIG1hcmtlcnMgc3Ryb2tlIgogICAgICAgaWQ9InBhdGg0OTUzIgogICAgICAgc29kaXBvZGk6c2lkZXM9IjMiCiAgICAgICBzb2RpcG9kaTpjeD0iMjEyLjQyOTAyIgogICAgICAgc29kaXBvZGk6Y3k9IjI1My43OTgyNiIKICAgICAgIHNvZGlwb2RpOnIxPSIxMS4wNTczNDciCiAgICAgICBzb2RpcG9kaTpyMj0iNS41Mjg2NzM2IgogICAgICAgc29kaXBvZGk6YXJnMT0iMC45MTQ0NDc5NiIKICAgICAgIHNvZGlwb2RpOmFyZzI9IjEuOTYxNjQ1NSIKICAgICAgIGlua3NjYXBlOmZsYXRzaWRlZD0idHJ1ZSIKICAgICAgIGlua3NjYXBlOnJvdW5kZWQ9IjAiCiAgICAgICBpbmtzY2FwZTpyYW5kb21pemVkPSIwIgogICAgICAgZD0ibSAyMTkuMTc2NTIsMjYyLjU1ODE4IC0xNy43MDc1NywtNy4yOTYzNyAxNS4xNzI2MiwtMTEuNjg3MDEgeiIKICAgICAgIGlua3NjYXBlOnRyYW5zZm9ybS1jZW50ZXIteD0iLTIuNjk0NjIxOSIKICAgICAgIGlua3NjYXBlOnRyYW5zZm9ybS1jZW50ZXIteT0iMC4wNzg0ODk2NTMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjM5NDM0MDk4LDAuODk5Nzc1MDQsLTAuOTE4OTY0MTksMC4zODYxMDY2Myw0NzQuOTg1ODMsMS4zNjE3MzI5KSIgLz4KICA8L2c+Cjwvc3ZnPgo=\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNjUiCiAgIGhlaWdodD0iMTkuNzg3MjE4IgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJpbmhpYml0cy5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iQzpcVXNlcnNcdWd1clxEZXNrdG9wXGludGVyYWN0aW9uLWxlZ2VuZC4yMDE2LjA0LjAxLnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjMwMCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjMwMCIKICAgdmlld0JveD0iMCAwIDYwLjkzNzUwMSAxOC41NTA1MTYiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxtYXJrZXIKICAgICAgIGlua3NjYXBlOnN0b2NraWQ9IlN0b3BMIgogICAgICAgb3JpZW50PSJhdXRvIgogICAgICAgcmVmWT0iMC4wIgogICAgICAgcmVmWD0iMC4wIgogICAgICAgaWQ9IlN0b3BMIgogICAgICAgc3R5bGU9Im92ZXJmbG93OnZpc2libGUiCiAgICAgICBpbmtzY2FwZTppc3N0b2NrPSJ0cnVlIj4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGg5ODYiCiAgICAgICAgIGQ9Ik0gMC4wLDUuNjUgTCAwLjAsLTUuNjUiCiAgICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjFwdDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuOCkiIC8+CiAgICA8L21hcmtlcj4KICAgIDxtYXJrZXIKICAgICAgIGlua3NjYXBlOnN0b2NraWQ9IlRyaWFuZ2xlT3V0TCIKICAgICAgIG9yaWVudD0iYXV0byIKICAgICAgIHJlZlk9IjAiCiAgICAgICByZWZYPSIwIgogICAgICAgaWQ9Im1hcmtlcjEyMDIiCiAgICAgICBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGlua3NjYXBlOmlzc3RvY2s9InRydWUiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDEyMDAiCiAgICAgICAgIGQ9Ik0gNS43NywwIC0yLjg4LDUgViAtNSBaIgogICAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDAzcHQ7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjgpIgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPC9tYXJrZXI+CiAgICA8bWFya2VyCiAgICAgICBpbmtzY2FwZTpzdG9ja2lkPSJUcmlhbmdsZU91dEwiCiAgICAgICBvcmllbnQ9ImF1dG8iCiAgICAgICByZWZZPSIwIgogICAgICAgcmVmWD0iMCIKICAgICAgIGlkPSJUcmlhbmdsZU91dEwiCiAgICAgICBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZSIKICAgICAgIGlua3NjYXBlOmlzc3RvY2s9InRydWUiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDk1OSIKICAgICAgICAgZD0iTSA1Ljc3LDAgLTIuODgsNSBWIC01IFoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMDNwdDtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuOCkiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L21hcmtlcj4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjcuOTE5NTk1OSIKICAgICBpbmtzY2FwZTpjeD0iLTQuODExMDM1NyIKICAgICBpbmtzY2FwZTpjeT0iMTMuOTIyOTM0IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDE3IgogICAgIGlua3NjYXBlOndpbmRvdy14PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBmaXQtbWFyZ2luLXRvcD0iMCIKICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAiCiAgICAgZml0LW1hcmdpbi1yaWdodD0iMCIKICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE3Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZSAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjc1LjY0MjQ3LC0yODEuMjk2NDkpIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozLjc0OTk5OTkzO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Im0gMjc1LjY0MjQ3LDI5MC41NzE3NSBoIDU5Ljc4MDUiCiAgICAgICBpZD0icGF0aDQ5NDkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgIDxyZWN0CiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MC43NDUwOTgwNDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi43NzU5Mzc1NjtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTo4LjMyNzgxMjQ2LCAyLjc3NTkzNzQ5O3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTtwYWludC1vcmRlcjpmaWxsIG1hcmtlcnMgc3Ryb2tlIgogICAgICAgaWQ9InJlY3Q0OTgxIgogICAgICAgd2lkdGg9IjAuOTc0MTY5NTUiCiAgICAgICBoZWlnaHQ9IjE1Ljg4OTcwMyIKICAgICAgIHg9IjMzNC4yMTc4MyIKICAgICAgIHk9IjI4Mi42MjY4OSIgLz4KICA8L2c+Cjwvc3ZnPgo=\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNjUiCiAgIGhlaWdodD0iMTkuNzg3MjE4IgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgcjE1MzcxIgogICBzb2RpcG9kaTpkb2NuYW1lPSJyZXByZXNzZXMuc3ZnIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9IkM6XFVzZXJzXHVndXJcRGVza3RvcFxpbnRlcmFjdGlvbi1sZWdlbmQuMjAxNi4wNC4wMS5wbmciCiAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIzMDAiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSIzMDAiCiAgIHZpZXdCb3g9IjAgMCA2MC45Mzc1MDEgMTguNTUwNTE2Ij4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8bWFya2VyCiAgICAgICBpbmtzY2FwZTpzdG9ja2lkPSJTdG9wTCIKICAgICAgIG9yaWVudD0iYXV0byIKICAgICAgIHJlZlk9IjAuMCIKICAgICAgIHJlZlg9IjAuMCIKICAgICAgIGlkPSJTdG9wTCIKICAgICAgIHN0eWxlPSJvdmVyZmxvdzp2aXNpYmxlIgogICAgICAgaW5rc2NhcGU6aXNzdG9jaz0idHJ1ZSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoOTg2IgogICAgICAgICBkPSJNIDAuMCw1LjY1IEwgMC4wLC01LjY1IgogICAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxcHQ7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjgpIiAvPgogICAgPC9tYXJrZXI+CiAgICA8bWFya2VyCiAgICAgICBpbmtzY2FwZTpzdG9ja2lkPSJUcmlhbmdsZU91dEwiCiAgICAgICBvcmllbnQ9ImF1dG8iCiAgICAgICByZWZZPSIwIgogICAgICAgcmVmWD0iMCIKICAgICAgIGlkPSJtYXJrZXIxMjAyIgogICAgICAgc3R5bGU9Im92ZXJmbG93OnZpc2libGUiCiAgICAgICBpbmtzY2FwZTppc3N0b2NrPSJ0cnVlIj4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgxMjAwIgogICAgICAgICBkPSJNIDUuNzcsMCAtMi44OCw1IFYgLTUgWiIKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwM3B0O3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC44KSIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDwvbWFya2VyPgogICAgPG1hcmtlcgogICAgICAgaW5rc2NhcGU6c3RvY2tpZD0iVHJpYW5nbGVPdXRMIgogICAgICAgb3JpZW50PSJhdXRvIgogICAgICAgcmVmWT0iMCIKICAgICAgIHJlZlg9IjAiCiAgICAgICBpZD0iVHJpYW5nbGVPdXRMIgogICAgICAgc3R5bGU9Im92ZXJmbG93OnZpc2libGUiCiAgICAgICBpbmtzY2FwZTppc3N0b2NrPSJ0cnVlIj4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGg5NTkiCiAgICAgICAgIGQ9Ik0gNS43NywwIC0yLjg4LDUgViAtNSBaIgogICAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDAzcHQ7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgdHJhbnNmb3JtPSJzY2FsZSgwLjgpIgogICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPC9tYXJrZXI+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI3LjkxOTU5NTkiCiAgICAgaW5rc2NhcGU6Y3g9Ii0yNS4zMjk3NTkiCiAgICAgaW5rc2NhcGU6Y3k9IjEzLjkyMjkzNCIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTAxNyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgZml0LW1hcmdpbi10b3A9IjAiCiAgICAgZml0LW1hcmdpbi1sZWZ0PSIwIgogICAgIGZpdC1tYXJnaW4tcmlnaHQ9IjAiCiAgICAgZml0LW1hcmdpbi1ib3R0b209IjAiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGUgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI3NS42NDI0NywtMjgxLjI5NjQ5KSI+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6My43NTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6Ny40OTk5OTk4NywgNy40OTk5OTk4NztzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJtIDI3NS42NDI0NywyOTAuNTcxNzUgaCA1OS43ODA1IgogICAgICAgaWQ9InBhdGg0OTQ5IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cmVjdAogICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjAuNzQ1MDk4MDQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuNzc1OTM3NTY7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6OC4zMjc4MTIzNSwgMi43NzU5Mzc0NTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7cGFpbnQtb3JkZXI6ZmlsbCBtYXJrZXJzIHN0cm9rZSIKICAgICAgIGlkPSJyZWN0NDk4MSIKICAgICAgIHdpZHRoPSIwLjk3NDE2OTU1IgogICAgICAgaGVpZ2h0PSIxNS44ODk3MDMiCiAgICAgICB4PSIzMzIuMzQyODMiCiAgICAgICB5PSIyODIuNjI2ODkiIC8+CiAgPC9nPgo8L3N2Zz4K\"","module.exports = require(\"react-toastify/dist/ReactToastify.min.css\");","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAh0AAABxCAYAAABxyRHvAAAABGdBTUEAALGPC/xhBQAAQABJREFUeAHt3QeYLEdxAOBBPBtjbIxlA8YEP4GMyME2CAS2HgIEmCSRjEWQSCKDyAgEepgghIgig0GPnDMyGR6YnHMGCRBRIGOwwXlcf0Mtc3Oze7t3t3v33nV93+7szvR0V1dXV1VXV3efrQ1oNin88Ic/bPLzpS99qfnyl7/cfOtb32rOOOOM5sc//nHz05/+tPnlL3/ZZBXOdrazNec85zmb85znPM15z3ve5k//9E+b7du3NwcccEBzyUtesjn/+c/fnO985yvXffbZZ5PWuqJVKVApUClQKVApsFdSYOfZNovR8ZOf/KT5+te/3nz6059uPvKRjxQD4wc/+EExOn7xi1+sC/UZJIyOP/mTP2kufvGLN1e+8pWbK17xis3+++9fDJF1KaRmUilQKVApUClQKVApMESBjTU6vvrVrzbvf//7m7e97W3F2GB0/N///d8QonO9d9GLXrS57GUv2xx66KHNjh07mktd6lJzLa9mXilQKVApUClQKbAFKbB4o+P73/9+8/a3v7155Stf2Xz4wx9uzjrrrE1Fd1MzV7rSlZrDDz+8ud71rlemZzYVghWZSoFKgUqBSoFKgT2TAoszOr7whS80u3btal796lc3p59++qYnl/iQC17wgs0NbnCD5sgjj2yucpWrbHqcK4KVApUClQKVApUCm5gC8zc6Pve5zzUnn3xyMTYEfq4FxGSc+9znbn73d3+3+Z3f+Z3mt37rt5pt27Y1DATwv//7v83//M//NP/xH/9RAkx//vOfNz/72c/WUmR5V3m8Hve4xz3K9MuaM6wZVApUClQKVApUCmw9CszP6Pje977XPOEJT2ie//znl1Ums9D2j//4j5s/+7M/a8RaXPrSl24udrGLNRe5yEWaP/iDPxgZHec4xzma3/7t315idDA40uhgeKTR8aMf/ag57bTTGitgvvKVrzTf+c53yioYaWcBRs/Nbnaz5gEPeECJAZnl3Zq2UqBSoFKgUqBSYItTYP2NDt6GF77whc0//MM/TD2N8nu/93vN5S53ueav//qvm4MPPrisJrHUlSdjHsAIsfT2U5/6VPOud72r+cQnPtF84xvfmKooXhXLce95z3uWD0OoQqVApUClQKVApUClwIoUWF+j49vf/nbzoAc9qHn5y1++Ysm8FAceeGDxHBxyyCFlxchG7Z1x5plnNp/85Ceb17/+9c1b3vKWYpCsVIGzn/3szdWudrXmhBNOaA466KCVktfnlQKVApUClQKVAludAutndFj2KubBstdJwEtgiuI2t7lNMTo2ytAYh+N3v/vd5tRTT21e9KIXNR/4wAdGG4+NS68+xx9/fHOXu9ylYYhUqBSoFKgUqBSoFKgUGKTA+hgdT33qU5tjjz22+fd///fBUtwUp3G7292uufOd71xiNMYm3CQPxIS89a1vbdTt3e9+90SsTAPd8Y53bB772MeWmJOJievDSoFKgUqBSoFKga1JgbUZHQIxH/rQhzYnnXTSWI+A1SVHHHFE8+AHP7hsRb6n0Znx8ZrXvKY58cQTGytxxoF6Xv/612+e8YxnlO3Xx6Wr9ysFKgUqBSoFKgW2KAVWb3T853/+Z3PMMcc0z3rWs8bS7hKXuESJeTjssMPGptkTHjjbRfDpk570pObpT39682//9m+DaJteEQz7ghe8oKy2GUxUb1YKVApUClQKVApsTQqszuj47//+7+Ze97rXRIPjtre9bfEOOOdkbwErc+ym+sAHPrD5/Oc/P1itNDys4LnwhS88mKberBSoFKgUqBSoFNiCFNg581GrPBz3v//9Bw0Oy0n33XffEgdxyimnlIPV9iaiMiiue93rNm9+85vLlJG9QvrAMPnnf/7nEr9iP5AKlQKVApUClQKVApUCv6LATEaHGI4nP/nJzdOe9rRl9GNwOEqesWEVy2ZblbIM4VXeUE8bl4ndsFeHnVH7wPB473vf29zvfvdr/vVf/7X/uP6vFKgUqBSoFKgU2JIUOPvOgGlq7vTXN73pTUXRml7pAkVsKsGUAk/AVgDGxt/8zd8U4+pjH/tY06cJelk+/F//9V9l6/S6nHYrcEWtY6VApUClQKXABArsntro+PKXv9yI0/jxj3+8LD8eDvtaXOMa11j2bG++YcVKHgTnxNz+tuo8Hla8bI/dVS9zmcuMzojZm2lS61YpUClQKVApUCkwhgK7p5pesf+G80ZOHzgd9g//8A+b5zznORt6EBr8NmoaQ1yHGJe73/3ug9u2W+nyiEc8onHKboVKgUqBSoFKgUqBrUyBFY0O0wTPfe5zyy6dfUJRuI9+9KPL/hT9Z4v6z+Cw9fod7nCHQS/MIvBwCu1xxx3X3OQmN1kWy2K5LWPNWTSTNk9bBJ61jEqBSoFKgUqBSoGNpMCKRodplcc97nHLcBQoStHbYXSjgBK3OZm9M2zgZSvyoemfReDn4LfHPOYxzV/8xV8sK860yz/90z81r3jFK8ZuorbspXqjUqBSoFKgUqBSYC+jwNliJN6OqxNledRRRzUveclLliW58pWvXLwftjffCEiD4ylPecqS4m9605uW5bwbgZcYDlum/93f/V3zL//yL0vwEmx7qUtdqtDM6pcKlQLzogA+FMCM58Qd+cwDyAflgL4YEWi9qOBp3lh19fHbsn749HFyXIGDJitUCuypFMDT+p2PgT+e3sNWik7eHMxGWDe84Q1HgiUbylH0b3zjGzcscHScwZH4baThQeA96lGPKjuxEv5dMB113/vetzzfCEYhkH0mAcG9WmWhvn1B3y9LvTei7n089tb/+M9BhXnSs8MVr3nNa666TcfRibFhWbjl89rcfx+ruHj9HvnIRzZXvOIVx70+1X154SkCVr38Puc5z1mMKDzKmHJMwWmnnVb2Bzrf+c7XfOUrXylnIP30pz8dved9RtCtb33rctDkVIVvoUTTyIUkB/mg/7omoO8kyLSrlSuT8t5qz+z9ZBXpRz/60caO34cffnhz8YtffEl7bHKa7Bw7BNKZH//4xy8zODDQ0UcfvWkNDgQ31UIQPvvZzy4HzS2yERgWpnkYbBijC4Tyi1/84uZWt7pVc+lLX7r7aO6/CexPfOITzZlnnjm2LG0rMNiKnBQUYxP3HhA8VvBMCuiVpx1qh6agetnVv6uggDb+0pe+VPjva1/7WmlDnrdXvepVazYA+ugo6wc/+EExPPA1oyANWsqf0l8tyM806fve977iOfziF7/Y/OxnPyvZnetc52r222+/5qCDDmouf/nLFwPr+c9/ftkhWb+TjtEFN/mkQjz3uc/dHHzwwatFaa9975e//GWDV6bdyBD9KTv9GA98//vfLyv0su3HEeo85zlPaS8D1gqrowDe3rVrV9kr66yzzmroGvR3rtkFLnCB1WW6EW+Fch6E8GS0MZIw9bLks//++7dnnHHG4DvzvhkrQdp73/veS/Dp49f9Hx6PNpTsvNFaln+M0NpXv/rVbYyuluEa7t32Pve5Txsddtl787yBdte5znXaYNTSrmEALMPNvYte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\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE2LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgd2lkdGg9IjQ1Ljk1OHB4IiBoZWlnaHQ9IjQ1Ljk1OHB4IiB2aWV3Qm94PSIwIDAgNDUuOTU4IDQ1Ljk1OCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDUuOTU4IDQ1Ljk1ODsiDQoJIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggZD0iTTIyLjk3OSwwQzEwLjI4OCwwLDAsMTAuMjg5LDAsMjIuOTc5czEwLjI4OCwyMi45NzksMjIuOTc5LDIyLjk3OWMxMi42OSwwLDIyLjk3OS0xMC4yODksMjIuOTc5LTIyLjk3OVMzNS42NywwLDIyLjk3OSwweg0KCQkgTTMyLjI1MywyNi45NzdoLTUuMzAxdjUuMjg5YzAsMi4yMDctMS43NjUsMy45OTYtMy45NzIsMy45OTZjLTIuMjA2LDAtMy45NzEtMS43ODktMy45NzEtMy45OTZ2LTUuMjkxSDEzLjcxDQoJCWMtMi4yMDcsMC00LjAwNi0xLjc4OS00LjAwNi0zLjk5N2MwLTIuMjA3LDEuNzk2LTMuOTk2LDQuMDAzLTMuOTk2aDUuMzAydi01LjI4OWMwLTIuMjA4LDEuNzY1LTMuOTk3LDMuOTcxLTMuOTk3DQoJCWMyLjIwOCwwLDMuOTcyLDEuNzg5LDMuOTcyLDMuOTk3djUuMjloNS4zMDFjMi4yMDcsMCwzLjk5NywxLjc5LDMuOTk3LDMuOTk3QzM2LjI1LDI1LjE4OCwzNC40NiwyNi45NzcsMzIuMjUzLDI2Ljk3N3oiLz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg0K\"","module.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOC4xLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iQ2FwYV8xIgogICB4PSIwcHgiCiAgIHk9IjBweCIKICAgdmlld0JveD0iMCAwIDYxMiA2MTIiCiAgIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDYxMiA2MTI7IgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkxIHIxMzcyNSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZGVsZXRlLXNpbXBsZS5zdmciPjxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQzIj48cmRmOlJERj48Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPjwvY2M6V29yaz48L3JkZjpSREY+PC9tZXRhZGF0YT48ZGVmcwogICAgIGlkPSJkZWZzNDEiIC8+PHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaWQ9Im5hbWVkdmlldzM5IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIxLjA5MDcwMDciCiAgICAgaW5rc2NhcGU6Y3g9IjI5NS4wMzQwOCIKICAgICBpbmtzY2FwZTpjeT0iMzMwLjg1NDQ4IgogICAgIGlua3NjYXBlOndpbmRvdy14PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJDYXBhXzEiIC8+PGcKICAgICBpZD0iZzUiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45OTc4ODEzNSwwLDAsMC45OTc4ODEzNSwxLjczMDQwMTIsMC45MjM3Mjg0NykiPjxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InBhdGg3IgogICAgICAgZD0iTSA1ODcuODI2LDE4Ni45NjYgQyA1NzEuNzEsMTQ5LjYzNCA1NDkuODgyLDExNy4xOTggNTIyLjM0Miw4OS42NTggNDk0LjgwMiw2Mi4xMTggNDYyLjM2Niw0MC4yOSA0MjUuMDM0LDI0LjE3NCAzODcuNzAyLDguMDU4IDM0OC4wMjQsMCAzMDYsMCAyNzcuODQ4LDAgMjUwLjcxNiwzLjY3MiAyMjQuNjA0LDExLjAxNiAxOTguNDkyLDE4LjM2IDE3NC4xMTQsMjguNjYyIDE1MS40Nyw0MS45MjIgMTI4LjgyNiw1NS4xODIgMTA4LjIyMiw3MS4wOTQgODkuNjU4LDg5LjY1OCA3MS4wOTQsMTA4LjIyMiA1NS4xODIsMTI4LjgyNiA0MS45MjIsMTUxLjQ3IDI4LjY2MiwxNzQuMTE2IDE4LjM2LDE5OC40OTIgMTEuMDE2LDIyNC42MDQgMy42NzIsMjUwLjcxNiAwLDI3Ny44NDggMCwzMDYgYyAwLDI4LjE1MiAzLjY3Miw1NS4yODQgMTEuMDE2LDgxLjM5NiA3LjM0NCwyNi4xMSAxNy42NDYsNTAuNDg3IDMwLjkwNiw3My4xMzQgMTMuMjYsMjIuNjQ0IDI5LjE3Miw0My4yNDkgNDcuNzM2LDYxLjgxMiAxOC41NjQsMTguNTY0IDM5LjE2OCwzNC40NzggNjEuODEyLDQ3LjczNiAyMi42NDQsMTMuMjYgNDcuMDIyLDIzLjU2MSA3My4xMzQsMzAuOTA2IEMgMjUwLjcxNiw2MDguMzI4IDI3Ny44NDgsNjEyIDMwNiw2MTIgYyAyOC4xNTIsMCA1NS4yODQsLTMuNjcyIDgxLjM5NiwtMTEuMDE2IDI2LjExMSwtNy4zNDYgNTAuNDg4LC0xNy42NDYgNzMuMTM1LC0zMC45MDYgMjIuNjQ0LC0xMy4yNTkgNDMuMjQ5LC0yOS4xNzIgNjEuODEyLC00Ny43MzYgMTguNTY0LC0xOC41NjMgMzQuNDc4LC0zOS4xNjggNDcuNzM2LC02MS44MTIgMTMuMjYsLTIyLjY0NiAyMy41NjEsLTQ3LjAyMyAzMC45MDYsLTczLjEzNSBDIDYwOC4zMjgsMzYxLjI4NCA2MTIsMzM0LjE1MiA2MTIsMzA2IDYxMiwyNjMuOTc2IDYwMy45NDIsMjI0LjI5OCA1ODcuODI2LDE4Ni45NjYgWiBNIDQ2OC4xOCwzOTEuNjggYyAyLjA0LDIuMDQgMy4wNjMsNC4yODQgMy4wNjMsNi43MzIgMCwyLjQ0OCAtMS4wMjEsNC40ODggLTMuMDYzLDYuMTIgbCAtNTkuOTc2LDYwLjU4OCBjIC0xLjYzMSwxLjYzMiAtMy44NzYsMi40NDggLTYuNzMyLDIuNDQ4IC0yLjg1NCwwIC00Ljg5NSwtMC44MTYgLTYuMTIsLTIuNDQ4IEwgMzA5LjA2LDM3OC44MjggMjIzLjM4LDQ2NS4xMiBjIC0yLjQ0OCwxLjYzMiAtNC42OTIsMi40NDggLTYuNzMyLDIuNDQ4IC0xLjYzMiwwIC0zLjY3MiwtMC44MTYgLTYuMTIsLTIuNDQ4IGwgLTU5Ljk3NiwtNjAuNTg4IGMgLTIuMDQsLTEuMjI2IC0zLjA2LC0zLjI2NyAtMy4wNiwtNi4xMiAwLC0yLjQ0OCAxLjAyLC00LjY5MiAzLjA2LC02LjczMiBsIDg1LjY4LC04NS42OCAtODUuNjgsLTg1LjY4IGMgLTIuMDQsLTIuMDQgLTMuMDYsLTQuMjg0IC0zLjA2LC02LjczMiAwLC0yLjg1NiAxLjAyLC00Ljg5NiAzLjA2LC02LjEyIGwgNTkuOTc2LC02MC41ODggYyAxLjYzMiwtMS42MzIgMy42NzIsLTIuNDQ4IDYuMTIsLTIuNDQ4IDIuNDQ4LDAgNC42OTIsMC44MTYgNi43MzIsMi40NDggbCA4NS42OCw4Ni4yOTIgODYuMjkyLC04Ni4yOTIgYyAxLjYzNSwtMS42MzIgMy42NzUsLTIuNDQ4IDYuMTIsLTIuNDQ4IDIuNDQ4LDAgNC42OTIsMC44MTYgNi43MzIsMi40NDggbCA1OS45NzYsNjAuNTg4IGMgMi4wNCwxLjYzMiAzLjA2MywzLjY3MiAzLjA2Myw2LjEyIDAsMi40NDggLTEuMDIxLDQuNjkyIC0zLjA2Myw2LjczMiBMIDM4Mi41LDMwNiBsIDg1LjY4LDg1LjY4IHoiCiAgICAgICBzdHlsZT0iZmlsbDojMDEwMDAyIiAvPjwvZz48ZwogICAgIGlkPSJnOSIgLz48ZwogICAgIGlkPSJnMTEiIC8+PGcKICAgICBpZD0iZzEzIiAvPjxnCiAgICAgaWQ9ImcxNSIgLz48ZwogICAgIGlkPSJnMTciIC8+PGcKICAgICBpZD0iZzE5IiAvPjxnCiAgICAgaWQ9ImcyMSIgLz48ZwogICAgIGlkPSJnMjMiIC8+PGcKICAgICBpZD0iZzI1IiAvPjxnCiAgICAgaWQ9ImcyNyIgLz48ZwogICAgIGlkPSJnMjkiIC8+PGcKICAgICBpZD0iZzMxIiAvPjxnCiAgICAgaWQ9ImczMyIgLz48ZwogICAgIGlkPSJnMzUiIC8+PGcKICAgICBpZD0iZzM3IiAvPjwvc3ZnPg==\"","module.exports = require(\"sharedb/lib/client\");","module.exports = require(\"jquery-ui-dist/jquery-ui\");","module.exports = require(\"cytoscape-edgehandles\");","module.exports = require(\"cytoscape-edge-editing\");","module.exports = require(\"cytoscape-fcose\");","module.exports = require(\"cytoscape-node-editing\");","module.exports = require(\"cytoscape-undo-redo\");","module.exports = require(\"cytoscape-panzoom\");","module.exports = (function()\n{\n var styleSheet = [\n {\n selector: 'node',\n style:\n {\n 'text-valign': 'center',\n 'text-halign': 'center',\n 'color': '#1e2829',\n 'width': function (ele)\n {\n return ele.data('w') || 0;\n },\n 'height': function (ele)\n {\n return ele.data('h') || 0;\n },\n 'background-color': 'white',\n 'shape': function(ele)\n {\n return parentNodeShapeFunc( ele );\n },\n 'border-width': function(ele)\n {\n return borderWidthFunction( ele );\n },\n 'border-color': function(ele)\n {\n return nodeBorderColorFunction(ele);\n },\n 'font-size': 14\n }\n },\n {\n selector: 'node[name]',\n style: {\n 'label': 'data(name)'\n }\n },\n {\n selector: 'node:parent',\n style:\n {\n 'shape': function(ele)\n {\n return parentNodeShapeFunc( ele );\n },\n 'text-valign': function(ele)\n {\n return 'bottom';\n },\n 'text-margin-y' : 2,\n 'padding-left': function(ele){ return compoundPaddingFunction(ele); },\n 'padding-right': function(ele){ return compoundPaddingFunction(ele); },\n 'padding-bottom': function(ele){ return compoundPaddingFunction(ele); },\n 'padding-top': function(ele){ return compoundPaddingFunction(ele); },\n 'background-opacity': 0.5,\n 'border-width': function(ele)\n {\n return parentBorderWidthFunction( ele );\n },\n 'border-color': function(ele)\n {\n return nodeBorderColorFunction(ele);\n },\n 'background-color': function(ele){\n return nodeBackgroundColorFunction(ele);\n }\n }\n },\n {\n selector: 'edge',\n style:\n {\n 'arrow-scale': 1.7,\n 'curve-style': 'bezier',\n 'text-background-color': '#EEEEEE',\n 'text-background-opacity': 0,\n 'target-arrow-shape': function( ele )\n {\n return edgeTargetArrowTypeHandler(ele);\n },\n 'width': 1,\n 'line-color': function( ele )\n {\n return edgeColorHandler(ele);\n },\n 'target-arrow-color': function( ele )\n {\n return edgeColorHandler(ele);\n },\n 'line-style': function(ele)\n {\n return edgeLineTypeHandler(ele);\n },\n 'opacity': 1,\n\n }\n },\n {\n selector: 'edge[name]',\n style: {\n 'label': function(edge) {\n const label = edge.data('name');\n if (label === \"\") {\n return label;\n }\n //https://github.com/cytoscape/cytoscape.js/issues/2329\n return (label + \"\\n \\u2060\"); \n },\n 'text-wrap': 'wrap',\n 'edge-text-rotation': 'autorotate',\n 'text-background-opacity': '0'\n }\n },\n\n // some style for the Edge Handles !!!\n\n {\n selector: '.eh-handle',\n style: {\n 'background-color': '#1abc9c',\n 'width': 12,\n 'height': 12,\n 'shape': 'ellipse',\n 'overlay-opacity': 0,\n 'border-width': 12, // makes the handle easier to hit\n 'border-opacity': 0\n }\n },\n\n {\n selector: '.eh-hover',\n css: {\n 'background-color': '#1abc9c'\n }\n },\n\n {\n selector: '.eh-source',\n css: {\n 'border-width': 2,\n 'border-color': '#1abc9c'\n }\n },\n\n {\n selector: '.eh-target',\n css: {\n 'border-width': 2,\n 'background-color': '#1abc9c',\n 'border-color': '#1abc9c'\n }\n },\n\n {\n selector: '.eh-preview, .eh-ghost-edge',\n css: {\n 'line-color': '#1abc9c',\n 'target-arrow-color': '#1abc9c',\n 'source-arrow-color': '#1abc9c'\n }\n },\n\n {\n selector: '.highlightedEdge',\n style:\n {\n 'width': 3.5,\n 'border-width':4,\n 'line-color' : '#1abc9c' ,\n 'target-arrow-color': '#1abc9c',\n 'arrow-scale': 2\n }\n },\n {\n selector: '.highlightedNode',\n style:\n {\n 'border-width': function(ele)\n {\n return highlightedBorderWidthFunction( ele );\n },\n 'border-color': '#1abc9c',\n 'background-color': '#fff',\n }\n },\n {\n selector: '.invalidGene',\n style:\n {\n 'border-width': 2,\n 'border-color': '#e94332',\n 'color': '#e94332'\n }\n },\n {\n // The css properties when a node is highlighted and an invalid gene\n selector: '.invalidGeneHighlight',\n style:\n {\n 'border-width': 3,\n 'font-weight' : 'bold',\n 'border-color': '#e94332',\n 'color': '#e94332',\n }\n },\n {\n selector: 'node:selected',\n style:\n {\n 'border-width': function(ele)\n {\n return selectedBorderWidthFunction( ele );\n },\n 'border-color' : '#ffc90e', /*#f1c40f'*/\n }\n },\n {\n selector: '.highlightedNode:selected, .invalidGeneHighlight:selected',\n style:\n {\n 'border-width': function(ele)\n {\n return selectedHighlightedBorderWidthFunction( ele );\n },\n }\n },\n {\n selector: 'edge:selected',\n style:\n {\n 'width' : 3,\n 'line-color' : '#ffc90e',\n 'target-arrow-color': '#ffc90e'\n }\n },\n ];\n\n\n\n var compoundPaddingFunction = function( ele )\n {\n switch (ele._private.data['type'])\n {\n case \"FAMILY\": return 5;\n case \"COMPLEX\": return '5'; \n case \"COMPARTMENT\": return 10;\n case \"PROCESS\": return 10;\n default: return 5;\n }\n };\n\n var contentFunction = function( ele )\n {\n if (ele._private.data.name) {\n return ele._private.data.name;\n }\n return 'newNode';\n };\n\n var vTextPositionFunction = function( ele )\n {\n switch (ele._private.data['type'])\n {\n case \"GENE\": return 'center';\n case \"FAMILY\": return 'top';\n case \"COMPLEX\": return 'top';\n case \"COMPARTMENT\": return 'top';\n default: return 'center';\n }\n };\n\n var borderWidthFunction = function( ele )\n {\n switch (ele._private.data['type'])\n {\n case \"GENE\": return 1;\n case \"PROCESS\": return 0;\n case \"FAMILY\": return 2;\n case \"COMPARTMENT\": return 4;\n default: return 1;\n }\n };\n\n var parentBorderWidthFunction = function( ele )\n {\n switch (ele._private.data['type'])\n {\n case \"GENE\": return 1;\n case \"PROCESS\": return 0;\n case \"FAMILY\": return 2;\n case \"COMPLEX\": return 1;\n case \"COMPARTMENT\": return 4;\n default: return 1;\n }\n };\n\n var highlightedBorderWidthFunction = function( ele )\n {\n switch (ele._private.data['type'])\n {\n case \"GENE\": return 3;\n case \"PROCESS\": return 1;\n case \"FAMILY\": return 4;\n case \"COMPARTMENT\": return 6;\n default: return 3;\n }\n };\n\n var selectedBorderWidthFunction = function( ele )\n {\n switch (ele._private.data['type'])\n {\n case \"GENE\": return 2;\n case \"PROCESS\": return 1;\n case \"FAMILY\": return 3;\n case \"COMPARTMENT\": return 5;\n default: return 2;\n }\n };\n var selectedHighlightedBorderWidthFunction = function( ele )\n {\n switch (ele._private.data['type'])\n {\n case \"GENE\": return 3;\n case \"PROCESS\": return 1;\n case \"FAMILY\": return 4;\n case \"COMPARTMENT\": return 6;\n default: return 3;\n }\n };\n\n\n var parentNodeShapeFunc = function( ele )\n {\n switch (ele._private.data['type'])\n {\n case \"GENE\": return \"roundrectangle\";\n case \"PROCESS\": return \"roundrectangle\";\n case \"FAMILY\": return \"rectangle\";\n case \"COMPARTMENT\": return \"roundrectangle\";\n case \"COMPLEX\": return \"rectangle\";\n default: return \"roundrectangle\";\n }\n };\n\n var nodeBackgroundColorFunction = function( ele )\n {\n return \"#fff\";\n };\n\n var nodeBorderColorFunction = function( ele )\n {\n switch (ele._private.data['type'])\n {\n case \"GENE\": return \"#00000a\";\n case \"FAMILY\": return \"#a3a3a3\";\n case \"COMPLEX\": return \"#000000\";\n case \"COMPARTMENT\": return \"#000000\";\n default: return \"#000000\";\n }\n };\n\n var edgeColorHandler = function( ele )\n {\n return \"#1b1b1b\";\n };\n\n var edgeTargetArrowTypeHandler = function( ele )\n {\n switch (ele._private.data['type']){\n case \"ACTIVATES\": return \"triangle\";\n case \"INHIBITS\": return \"tee\";\n case \"INDUCES\": return \"triangle\";\n case \"REPRESSES\": return \"tee\";\n case \"BINDS\": return \"none\";\n default: return \"none\";\n }\n };\n\n var edgeLineTypeHandler = function( ele )\n {\n switch (ele._private.data['type']){\n case \"ACTIVATES\": return \"solid\";\n case \"INHIBITS\": return \"solid\";\n case \"INDUCES\": return \"dashed\";\n case \"REPRESSES\": return \"dashed\";\n case \"BINDS\": return \"solid\";\n default: return \"solid\";\n }\n };\n\n return styleSheet;\n})();\n","var panzoomOptions =\n{\n zoomFactor: 0.05, // zoom factor per zoom tick\n zoomDelay: 45, // how many ms between zoom ticks\n minZoom: 0.1, // min zoom level\n maxZoom: 10, // max zoom level\n fitPadding: 50, // padding when fitting\n panSpeed: 10, // how many ms in between pan ticks\n panDistance: 10, // max pan distance per tick\n panDragAreaSize: 75, // the length of the pan drag box in which the vector for panning is calculated (bigger = finer control of pan speed and direction)\n panMinPercentSpeed: 0.25, // the slowest speed we can pan by (as a percent of panSpeed)\n panInactiveArea: 8, // radius of inactive area in pan drag box\n panIndicatorMinOpacity: 0.5, // min opacity of pan indicator (the draggable nib); scales from this to 1.0\n zoomOnly: false, // a minimal version of the ui only with zooming (useful on systems with bad mousewheel resolution)\n fitSelector: undefined, // selector of elements to fit\n animateOnFit: function(){ // whether to animate on fit\n return false;\n },\n fitAnimationDuration: 1000, // duration of animation on fit\n\n // icon class names\n sliderHandleIcon: 'fa fa-minus',\n zoomInIcon: 'fa fa-plus',\n zoomOutIcon: 'fa fa-minus',\n resetIcon: 'fa fa-expand'\n};\n\nmodule.exports = panzoomOptions;\n","module.exports = require(\"cytoscape-navigator\");","module.exports = require(\"cytoscape-context-menus\");","module.exports = require(\"konva\");","module.exports = require(\"cytoscape-view-utilities\");","module.exports = require(\"cytoscape-grid-guide\");","module.exports = require(\"cytoscape-popper\");","module.exports = require(\"cytoscape-layout-utilities\");","module.exports = require(\"@datastructures-js/max-heap\");","import { IPathwayInfo } from \"../managers/FileOperationsManager\";\n\nexport default class SaveLoadUtility{\n //Exports given json graph(based on cy.export()) into a string\n static exportGraph(pathwayDetails: IPathwayInfo, cy, edgeEditing)\n {\n var returnString = pathwayDetails.pathwayTitle + '\\n\\n';\n returnString += pathwayDetails.pathwayDetails +'\\n\\n';\n\n //Get nodes and edges\n var nodes = cy.nodes();\n var edges = cy.edges();\n\n //Prepare Meta Line\n returnString += '--NODE_NAME\\tNODE_ID\\tNODE_TYPE\\tPARENT_ID\\tPOSX\\tPOSY\\tWIDTH\\tHEIGHT--'+'\\n';\n\n if (nodes)\n {\n for (let i = 0; i < nodes.length; i++)\n {\n returnString += this.exportNode(nodes[i]);\n }\n }\n\n //Put a blank line between nodes and edges\n returnString += '\\n';\n returnString += '--EDGE_ID\\tSOURCE\\tTARGET\\tEDGE_TYPE\\tINTERACTION_PUBMED_ID\\tEDGE_NAME\\tEDGE_BENDS\\tEDGE_CURVE_STYLE\\n';\n\n if (edges) {\n //Write edges\n for (let i = 0; i < edges.length; i++)\n {\n var edgeID = edges[i].data('id');\n var edgeType = edges[i].data('type');\n var source = edges[i].data('source');\n var target = edges[i].data('target');\n var pubmedIDs = edges[i].data('pubmedIDs');\n var pubmedString = \"\";\n var edgeName = (edges[i].data('name')) ? edges[i].data('name') : \"\";\n var edgeCurveStyle = edges[i].css('curve-style');\n\n var numberOfAnchorPoints = 0;\n var anchors = edgeEditing.getAnchorsAsArray(edges[i])\n if (anchors !== undefined)\n numberOfAnchorPoints = anchors.length/2;\n var anchorPointPositions = \"\";\n for (var j = 0; j < numberOfAnchorPoints; j++)\n {\n anchorPointPositions += \"(\" + anchors[2*j] + \";\" +\n anchors[2*j+1] + \")\";\n }\n\n if (pubmedIDs != undefined) {\n for (var j = 0; j < pubmedIDs.length; j++)\n {\n pubmedString += pubmedIDs[j];\n if (j != pubmedIDs.length - 1)\n pubmedString += \";\"\n }\n }\n\n returnString += edgeID + '\\t' +\n source + '\\t' +\n target + '\\t' +\n edgeType + '\\t' +\n pubmedString + '\\t' +\n edgeName + '\\t' +\n anchorPointPositions + '\\t' + \n edgeCurveStyle + '\\n';\n }\n }\n\n //Finally return a string that includes whole graph lovely and peacefully :)\n return returnString;\n }\n static exportAsSIFNX(cy: any)\n {\n let returnString = \"\";\n\n //Get nodes and edges\n const nodes = cy.nodes();\n const edges = cy.edges();\n const nodeMap = {};\n //Put a blank line between nodes and edges\n returnString += '\\n';\n returnString += 'PARTICIPANT\\tPARTICIPANT_TYPE\\tPARENT_ID\\tPOSX\\tPOSY\\tWIDTH\\tHEIGHT'+'\\n';\n\n if (nodes)\n {\n for (var i = 0; i < nodes.length; i++)\n {\n returnString += this.exportNode(nodes[i]);\n\n nodeMap[nodes[i].id()] = nodes[i];\n }\n }\n\n //Put a blank line between nodes and edges\n returnString += '\\n';\n returnString += 'PARTICIPANT_A\\tPARTICIPANT_B\\tTYPE\\tPUBMED_IDS\\n';\n\n \n if (edges) {\n //Write edges\n for (var i = 0; i < edges.length; i++)\n {\n var edgeType = edges[i].data(\"type\");\n var source = edges[i].data(\"source\");\n var target = edges[i].data(\"target\");\n var edgeName = edges[i].data(\"name\");\n var pubmedIDs = edges[i].data(\"pubmedIDs\");\n var pubmedString = \"\";\n\n if (pubmedIDs != undefined) {\n for (var j = 0; j < pubmedIDs.length; j++)\n {\n pubmedString += pubmedIDs[j];\n if (j != pubmedIDs.length - 1)\n pubmedString += \";\"\n }\n }\n\n returnString += nodeMap[source].data(\"name\") + '\\t' +\n nodeMap[target].data(\"name\") + '\\t' +\n edgeType + '\\t' +\n pubmedString + '\\t' +\n edgeName + '\\n';\n }\n }\n\n //Finally return a string that includes whole graph lovely and peacefully :)\n return returnString;\n }\n static exportNode(node)\n {\n //Node specific data fields\n var nodeName = node.data(\"name\");\n var parentID = node.data(\"parent\");\n var nodeID = node.data(\"id\");\n var pos = node.position();\n var nodeType = node.data(\"type\");\n var nodeW = node.data(\"w\");\n var nodeH = node.data(\"h\");\n\n //Check if node has a parent, if not set parent id -1\n if (node.data(\"parent\"))\n {\n parentID = node.data(\"parent\");\n }\n else\n {\n parentID = -1;\n }\n\n // Write a line for a node\n return nodeName + '\\t' +\n nodeID + '\\t' +\n nodeType + '\\t' +\n parentID + '\\t' +\n parseInt(pos.x) + '\\t' +\n parseInt(pos.y) + '\\t' +\n nodeW + '\\t' +\n nodeH + '\\n';\n }\n static parseGraph(graph, isArray) {\n\n const allEles = [];\n const nodes = [];\n const edges = [];\n\n // By lines\n // Match all new line character representations\n var seperator = /\\r?\\n|\\r/;\n var lines = (isArray) ? graph : graph.split(seperator);\n var edgesStartIndex = -1;\n var title = lines[0];\n var description = lines[2];\n\n // In old version description used to expand in multiple lines\n // graphDataIndex holds the line index where the first --NODE_NAME occurs and is used later to load nodes\n let graphDataIndex = 3;\n let isFound = false;\n while (graphDataIndex < lines.length) {\n if (lines[graphDataIndex].includes(\"--NODE_NAME\")) {\n isFound = true;\n break;\n }\n description += \"\\n\" + lines[graphDataIndex];\n graphDataIndex++;\n }\n graphDataIndex++;\n // TODO AMENDMENT\n if(!isFound){\n graphDataIndex = 2;\n }\n //TODO Legacy pathways workaround\n if (lines[0].includes(\"--NODE_NAME\")) {\n graphDataIndex = 1;\n title = \"New Pathway\";\n description = \"\";\n }\n\n // start from first line skip node meta data\n for (var i = graphDataIndex; i < lines.length; i++) {\n // If we encounter a blank line, that means we need to parse edges from now on !\n // so skip blank line and edge meta line\n if (lines[i].length == 0 || lines[i] === \"\") {\n edgesStartIndex = i + 2;\n break;\n }\n\n //Fetch a line for nodes\n var lineData = lines[i].split('\\t');\n var nodeName = lineData[0];\n var nodeID = lineData[1];\n var nodeType = lineData[2];\n var parentID = lineData[3];\n var posX = (lineData.length > 4) ? lineData[4] : \"0\";\n var posY = (lineData.length > 5) ? lineData[5] : \"0\";\n var nodeW = (lineData.length > 7) ? lineData[6] : (nodeType === 'PROCESS') ? (nodeName.length * 6 + 24) : \"150\";\n var nodeH = (lineData.length > 7) ? lineData[7] : (nodeType === 'PROCESS') ? \"24\" : \"52\";\n\n if(nodeName === \" \" || nodeName === \"\"){\n //nodeName = \"No Name \" + (i + 1);\n }\n\n\n var newNode = {\n group: 'nodes',\n data:\n {\n id: nodeID,\n name: nodeName,\n type: nodeType,\n w: nodeW,\n h: nodeH,\n parent: -1\n },\n position:\n {\n x: parseInt(posX),\n y: parseInt(posY)\n }\n };\n\n if (parentID != '-1') {\n newNode.data.parent = parentID;\n }\n nodes.push(newNode);\n }\n //Read edges\n for (let i = edgesStartIndex; i < lines.length; i++) {\n //If we reach EOF we break loop\n if (lines[i].length == 0) {\n break;\n }\n\n var lineData = lines[i].split('\\t');\n var edgeID = lineData[0];\n var edgeSource = lineData[1];\n var edgeTarget = lineData[2];\n var edgeType = lineData[3];\n var pubmedIDs = (lineData.length > 4) ? lineData[4].split(';') : [];\n var label = (lineData.length > 5) ? lineData[5] : '';\n var anchorPoints = (lineData.length > 6) ? lineData[6] : '';\n var edgeCurveStyle = (lineData.length > 7) ? lineData[7] : '';\n\n var anchorPointPositions = [];\n if (anchorPoints) {\n var anchorPair = anchorPoints.split(')'); //The last element of anchorPair array is \"\"\n for (var j = 0; j < anchorPair.length - 1; j++) {\n var separatorIndex = anchorPair[j].indexOf(\";\");\n var x = anchorPair[j].substring(1, separatorIndex);\n var y = anchorPair[j].substring(separatorIndex + 1, anchorPair[j].length);\n anchorPointPositions.push({x: parseFloat(x), y: parseFloat(y)});\n }\n }\n\n var edgeData = {\n id: edgeID,//((isFound) ? edgeID : i - edgesStartIndex),\n type: edgeType,//((isFound) ? edgeType : edgeTarget),\n source: edgeSource,//((isFound) ? edgeSource : edgeID),\n target: edgeTarget,//((isFound) ? edgeTarget : edgeSource),\n pubmedIDs: pubmedIDs,\n name: label,\n }\n\n if (edgeCurveStyle === \"unbundled-bezier\") {\n edgeData['controlPointPositions'] = anchorPointPositions;\n }\n else {\n edgeData['bendPointPositions'] = anchorPointPositions;\n }\n\n const newEdge = {\n group: 'edges', \n data: edgeData\n };\n edges.push(newEdge);\n }\n return {title: title, description: description, nodes: nodes, edges: edges};\n }\n}\n","import { saveAs } from 'file-saver';\nimport { action, computed, makeObservable, observable } from 'mobx';\nimport SaveLoadUtility from '../utils/SaveLoadUtility';\nimport EditorActionsManager from './EditorActionsManager.js';\n\nexport interface IPathwayInfo{\n pathwayTitle: string;\n pathwayDetails: string;\n}\n\nexport default class FileOperationsManager{\n\n @observable\n pathwayInfo: IPathwayInfo;\n\n constructor(){\n makeObservable(this);\n this.pathwayInfo = {pathwayTitle: \"New Pathway\", pathwayDetails: \"\"};\n }\n\n\n @computed get\n getPathwayInfo(){\n return this.pathwayInfo;\n }\n\n @action\n setPathwayInfo(other: IPathwayInfo){\n this.pathwayInfo = other;\n }\n \n // see http://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript\n b64toBlob(b64Data, contentType, sliceSize = 512)\n {\n contentType = contentType || '';\n\n var byteCharacters = atob(b64Data);\n var byteArrays = [];\n\n for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {\n var slice = byteCharacters.slice(offset, offset + sliceSize);\n\n var byteNumbers = new Array(slice.length);\n for (var i = 0; i < slice.length; i++) {\n byteNumbers[i] = slice.charCodeAt(i);\n }\n\n var byteArray = new Uint8Array(byteNumbers);\n\n byteArrays.push(byteArray);\n }\n\n var blob = new Blob(byteArrays, {type: contentType});\n return blob;\n };\n\n saveAsJPEG(cy: any)\n {\n const graphData = cy.jpeg();\n // this is to remove the beginning of the pngContent: data:img/png;base64,\n const b64data = graphData.substr(graphData.indexOf(\",\") + 1);\n const imageData = this.b64toBlob(b64data, \"image/jpeg\");\n const blob = new Blob([imageData]);\n const fileName = this.pathwayInfo.pathwayTitle + \".jpg\"\n saveAs(blob, fileName);\n };\n\n saveAsSVG(editor: EditorActionsManager){\n const returnString: any = editor.exportSVG();\n const fileName = this.pathwayInfo.pathwayTitle + \".svg\"\n const blob = new Blob([returnString], {type: \"text/plain;charset=utf-8\"});\n saveAs(blob, fileName);\n }\n\n saveAsPNG(cy: any)\n {\n const graphData = cy.png();\n // this is to remove the beginning of the pngContent: data:img/png;base64,\n const b64data = graphData.substr(graphData.indexOf(\",\") + 1);\n const imageData = this.b64toBlob(b64data, \"image/png\");\n const blob = new Blob([imageData]);\n const fileName = this.pathwayInfo.pathwayTitle + \".png\"\n saveAs(blob, fileName);\n };\n \n\n saveGraph(isSIFNX: boolean, editor: EditorActionsManager)\n {\n const pathwayData = this.pathwayInfo;\n const returnString = (isSIFNX) ? SaveLoadUtility.exportAsSIFNX(editor.cy):\n SaveLoadUtility.exportGraph(pathwayData, editor.cy, editor.edgeEditing);\n const blob = new Blob([returnString], {type: \"text/plain;charset=utf-8\"});\n const fileName = pathwayData.pathwayTitle + \".txt\";\n saveAs(blob, fileName);\n };\n}","import _ from \"lodash\";\n\nexport default class GridOptionsManager\n{\n\n static defaultGridGuideOptions = \n {\n // On/Off Modules\n /* From the following four snap options, at most one should be true at a given time */\n snapToGridOnRelease: false, // Snap to grid on release\n snapToGridDuringDrag: false, // Snap to grid during drag\n snapToAlignmentLocationOnRelease: false, // Snap to alignment location on release\n snapToAlignmentLocationDuringDrag: false, // Snap to alignment location during drag\n distributionGuidelines: false, // Distribution guidelines\n geometricGuideline: false, // Geometric guidelines\n initPosAlignment: false, // Guideline to initial mouse position\n centerToEdgeAlignment: false, // Center to edge alignment\n resize: false, // Adjust node sizes to cell sizes\n parentPadding: false, // Adjust parent sizes to cell sizes by padding\n drawGrid: false, // Draw grid background\n\n // General\n gridSpacing: 20, // Distance between the lines of the grid.\n\n // Draw Grid\n zoomDash: true, // Determines whether the size of the dashes should change when the drawing is zoomed in and out if grid is drawn.\n panGrid: true, // Determines whether the grid should move then the user moves the graph if grid is drawn.\n gridStackOrder: -1, // Namely z-index\n gridColor: '#dedede', // Color of grid lines\n lineWidth: 1.0, // Width of grid lines\n\n // Guidelines\n guidelinesStackOrder: 4, // z-index of guidelines\n guidelinesTolerance: 5.00, // Tolerance distance for rendered positions of nodes' interaction.\n guidelinesStyle: { // Set ctx properties of line. Properties are here:\n strokeStyle: \"#4286f4\", // color of geometric guidelines\n geometricGuidelineRange: 750, // range of geometric guidelines\n range: 500, // max range of distribution guidelines\n minDistRange: 10, // min range for distribution guidelines\n distGuidelineOffset: 10, // shift amount of distribution guidelines\n horizontalDistColor: \"#4286f4\", // color of horizontal distribution alignment\n verticalDistColor: \"#4286f4\", // color of vertical distribution alignment\n initPosAlignmentColor: \"#34495E\", // color of alignment to initial mouse location\n lineDash: [6, 8], // line style of geometric guidelines\n horizontalDistLine: [0, 0], // line style of horizontal distribution guidelines\n verticalDistLine: [0, 0], // line style of vertical distribution guidelines\n initPosAlignmentLine: [0, 0], // line style of alignment to initial mouse position\n },\n\n // Parent Padding\n parentSpacing: -1 // -1 to set paddings of parents to gridSpacing\n };\n currentProperties: any;\n cy: any;\n constructor(cy: any)\n {\n this.cy = cy;\n\n this.currentProperties = {};\n this.changeParameters(GridOptionsManager.defaultGridGuideOptions);\n\n }\n\n changeParameters(params)\n {\n this.currentProperties = _.clone(params);\n this.refreshGridOptionsExtension();\n }\n\n getCurrentOptions()\n {\n return this.currentProperties;\n }\n\n getDefaultOptions()\n {\n return GridOptionsManager.defaultGridGuideOptions;\n }\n\n setSnapToGuidelines(state)\n {\n this.currentProperties.geometricGuideline = state;\n this.currentProperties.snapToAlignmentLocationDuringDrag = state;\n this.currentProperties.distributionGuidelines = state;\n this.refreshGridOptionsExtension();\n //this.appManager.gridOptionsView.changeParameters();\n }\n\n setShowGrid(state)\n {\n this.currentProperties.drawGrid = state;\n this.currentProperties.snapToGridDuringDrag = state;\n this.refreshGridOptionsExtension();\n }\n\n refreshGridOptionsExtension()\n {\n this.cy.gridGuide(this.currentProperties);\n }\n\n //TODO expose individual functions related for changing parameters from toolbar here\n\n}\n","import EditorActionsManager from \"./EditorActionsManager\";\n\nexport default class ViewOperationsManager{\n movedNodes: any[];\n editor: EditorActionsManager;\n cy: any;\n\n constructor(editor: EditorActionsManager,cy: any)\n {\n this.cy = cy;\n this.editor = editor;\n this.movedNodes = [];\n }\n\n //TODO use align function from cytoscape.js-grid-guide extension\n handleNodeAlignment(param)\n {\n var tmpNodes = this.editor.selectedNodeStack;\n var nodes = this.cy.collection();\n var nodeMap = {};\n this.movedNodes = [];\n\n for (const key in tmpNodes)\n {\n nodes = nodes.add(tmpNodes[key]);\n }\n\n nodes.forEach(function(node)\n {\n if (node.isParent())\n {\n nodeMap[node.id()] = node;\n }\n });\n\n\n if (nodes.length > 0)\n {\n var firstSelected = nodes[0];\n var firstBbox = firstSelected.boundingBox();\n //OuterHeight variable added due to miscalculation of boundingBox function in pathwaymapper\n var firstOuterHeight = firstSelected.outerHeight();\n var self = this;\n nodes.forEach(function(node,index)\n {\n if (index == 0)\n {\n return ;\n }\n\n //If parent of selected node is in selection do nothing !\n if (nodeMap[node.parent().id()] == null)\n {\n var newPosition = self.calculateNewPosition(param, node, firstBbox, firstOuterHeight);\n //Recursively traverse leaf nodes\n self.changePosition(node,0,0,newPosition);\n }\n });\n this.editor.handleChangePositionByAlignment(self.movedNodes);\n }\n }\n\n /*\n Determine new position according to the alignment\n node that node.position works on center positions thats why all calculations\n are performed accordingly\n */\n calculateNewPosition(param, node, referenceBbox, referenceOuterHeight)\n {\n var currentPos = node.position();\n var currentBbox = node.boundingBox();\n var newPosition;\n //This parameter is used to move the compounds less upwards when they contain label\n var moveParam = node.isParent() ? node.outerHeight() - ((currentBbox.h - node.outerHeight())/2) - ((node.outerHeight() - node.height())/2) : node.height();\n //This param is used only when the node is parent, for simple nodes is 0\n var labelHeight = node.isParent()? currentBbox.h - node.outerHeight(): 0;\n\n if (param === 'vLeft')\n {\n newPosition = {x: referenceBbox.x1+currentBbox.w/2, y: currentPos.y};\n }\n else if (param === 'vCen')\n {\n newPosition = {x: referenceBbox.x1+referenceBbox.w/2, y: currentPos.y};\n }\n else if (param === 'vRight')\n {\n newPosition = {x: referenceBbox.x2-currentBbox.w/2, y: currentPos.y};\n }\n else if (param === 'hTop')\n {\n newPosition = {x: currentPos.x, y: referenceBbox.y1 + currentBbox.h/2};\n }\n //Checks for the case where compounds don't have names (name isn't taken in consideration in that case)\n else if (param === 'hMid' && node.isParent() && node.data('name') == \"\")\n {\n newPosition = {x: currentPos.x, y: referenceBbox.y1 + referenceBbox.h/2};\n }\n else if (param === 'hMid' )\n {\n newPosition = {x: currentPos.x, y: referenceBbox.y1 + referenceOuterHeight/2 + labelHeight/2};\n }\n //Checks for the case where compounds don't have names (name isn't taken in consideration in that case)\n else if (param === 'hBot' && node.isParent() && node.data('name') == \"\")\n {\n newPosition = {x: currentPos.x, y: referenceBbox.y2 - currentBbox.h/2};\n }\n else if (param === 'hBot')\n {\n newPosition = {x: currentPos.x, y: referenceBbox.y1 + referenceOuterHeight - moveParam/2};\n }\n else {\n console.log('Error: wrong alignment name ' + param);\n return;\n }\n\n return newPosition;\n }\n\n //Recursively move leaf nodes\n changePosition(node, dx, dy, newPos)\n {\n if (node.isParent())\n {\n var childNodes = node.children();\n var parentBbox = node.boundingBox();\n var self = this;\n childNodes.forEach(function(childNode, index)\n {\n var childBbox = childNode.boundingBox();\n var _dx = -(parentBbox.x1 - childBbox.x1)-parentBbox.w/2+childBbox.w/2;\n var _dy = -(parentBbox.y1 - childBbox.y1)-parentBbox.h/2+childBbox.h/2;\n\n //If further compound node is found, set position accordingly\n if (childNode.isParent())\n {\n self.changePosition(childNode, 0, 0, {x: newPos.x+_dx, y:newPos.y+_dy});\n }\n else\n {\n self.changePosition(childNode, _dx, _dy, newPos);\n }\n\n });\n }\n else\n {\n //Move locally and let editor actions manager know a move happened\n //If in collaborative mode editor actions manager will update collaborative model\n var position =\n {\n x: newPos.x+dx,\n y: newPos.y+dy\n };\n\n this.movedNodes.push({node: node, nextPosition: position, oldPosition: null});\n }\n }\n\n}\n","import React from 'react';\nimport { Modal } from 'react-bootstrap';\nimport { EModalType } from '../ui/react-pathway-mapper';\ninterface IAboutModalProps{\n show: boolean;\n handleClose: Function;\n}\n\nexport default class AboutModal extends React.Component {\n\n constructor(props: IAboutModalProps){\n super(props);\n }\n\n render(){\n\n\n return(\n \n {this.props.handleClose(EModalType.ABOUT)}}\n >\n \n About\n \n \n

PathwayMapper 2.2

\n
\n \"\"\n
\n
\n \"\"\n
\n
\n

i-Vis information Visualization Lab

\n

Bilkent University, Ankara, Turkey

\n
\n
\n

Memorial Sloan-Kettering Cancer Center

\n

New York, USA

\n
\n
\n \n https://github.com/iVis-at-Bilkent/pathway-mapper\n \n \n\n )\n\n\n }\n\n}\n","import { RGBAColor, shapeToSvg } from 'oncoprintjs';\nimport React from 'react';\nimport { Modal } from 'react-bootstrap';\n// @ts-ignore\nimport openImage from \"../images/toolbar/edit.svg\";\n// @ts-ignore\nimport layoutImage from \"../images/toolbar/layout-cose.svg\";\n// @ts-ignore\nimport savePNGImage from \"../images/toolbar/save_png.svg\";\n// @ts-ignore\nimport saveSVGImage from \"../images/toolbar/save_svg.svg\";\nimport { EModalType } from '../ui/react-pathway-mapper';\n// @ts-ignore\nconst addSelImage = require(\"../images/toolbar/add-selected.svg\");\n// @ts-ignore\nconst addAllImage = require(\"../images/toolbar/add-all.svg\");\n\n\ninterface ICBioHelpModalProps{\n show: boolean;\n handleClose: (modalId: EModalType) => void;\n patientView ?: boolean;\n}\n\n// https://github.com/cBioPortal/cbioportal-frontend/blob/29a93c5e992ca1affd3d027355015164ae3602bd/src/shared/lib/Colors.ts\nconst CNA_COLOR_AMP = '#ff0000';\nconst CNA_COLOR_HOMDEL = '#0000ff';\nconst DEFAULT_GREY = '#bebebe';\nconst MUT_COLOR_MISSENSE = '#008000';\nconst MUT_COLOR_MISSENSE_PASSENGER = '#53D400';\nconst MUT_COLOR_INFRAME = '#993404';\nconst MUT_COLOR_INFRAME_PASSENGER = '#a68028';\nconst MUT_COLOR_TRUNC = '#000000';\nconst MUT_COLOR_TRUNC_PASSENGER = '#708090';\nconst MUT_COLOR_FUSION = '#8B00C9';\nconst MUT_COLOR_PROMOTER = '#00B7CE';\nconst MUT_COLOR_OTHER = '#cf58bc';\nconst MUT_COLOR_GERMLINE = '#FFFFFF';\n\nexport function hexToRGBA(str: string): [number, number, number, number] {\n const r = parseInt(str[1] + str[2], 16);\n const g = parseInt(str[3] + str[4], 16);\n const b = parseInt(str[5] + str[6], 16);\n return [r, g, b, 1];\n}\n\n// always used shape\nconst defaultShape = {\n type: 'rectangle',\n fill: hexToRGBA(DEFAULT_GREY),\n x: 0,\n y: 0,\n width: 6,\n height: 20,\n stroke: [0,0,0,0] as RGBAColor,\n 'stroke-width': 0\n};\n\nconst labels = [\n 'Amplification',\n 'Deep Deletion',\n 'Fusion',\n 'Germline Mutation',\n 'Missense Mutation (putative driver)',\n 'Missense Mutation (unknown significance)',\n 'Other Mutation',\n 'Promoter Mutation',\n 'Truncating Mutation (putative driver)',\n 'Truncating Mutation (unknown significance)',\n 'Inframe Mutation (putative driver)',\n 'Inframe Mutation (unknown significance)'\n];\n\n// conditional shapes\nconst shapeBank = [\n {\n type: 'rectangle',\n fill: hexToRGBA(CNA_COLOR_AMP),\n x: 0,\n y: 0,\n width: 6,\n height: 20\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(CNA_COLOR_HOMDEL),\n x: 0,\n y: 0,\n width: 6,\n height: 20\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_FUSION),\n x: 0,\n y: 4,\n width: 6,\n height: 12\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_GERMLINE),\n x: 0,\n y: 8.75,\n width: 6,\n height: 1.6\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_MISSENSE),\n x: 0,\n y: 6.66,\n width: 6,\n height: 6.66\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_MISSENSE_PASSENGER),\n x: 0,\n y: 6.66,\n width: 6,\n height: 6.66\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_OTHER),\n x: 0,\n y: 6.66,\n width: 6,\n height: 6.66\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_PROMOTER),\n x: 0,\n y: 6.66,\n width: 6,\n height: 6.66\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_TRUNC),\n x: 0,\n y: 6.66,\n width: 6,\n height: 6.66\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_TRUNC_PASSENGER),\n x: 0,\n y: 6.66,\n width: 6,\n height: 6.66\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_INFRAME),\n x: 0,\n y: 6.66,\n width: 6,\n height: 6.66\n },\n {\n type: 'rectangle',\n fill: hexToRGBA(MUT_COLOR_INFRAME_PASSENGER),\n x: 0,\n y: 6.66,\n width: 6,\n height: 6.66\n },\n];\n\nexport default class CBioHelpModal extends React.Component{\n\n\n constructor(props: ICBioHelpModalProps){\n super(props);\n }\n\n generateOncoprintLegend() {\n const svgNameSpace = 'http://www.w3.org/2000/svg'\n const svgElement = document.createElementNS(svgNameSpace, 'svg')\n\n const legendEleWidth = 280\n \n const cellWidth = 6\n const cellHeight = 23\n const cellVerticalPadding = 15\n const cellMarginRight = cellWidth + 3\n\n shapeBank.forEach((shape, index) => {\n const offsetX = (index % 3) * (legendEleWidth)\n const textOffsetX = offsetX + cellMarginRight\n const offsetY = Math.floor(index / 3) * (cellHeight + cellVerticalPadding)\n const textOffsetY = offsetY + 15\n const g = document.createElementNS(svgNameSpace, 'g')\n if (!shape[\"stroke\"]) {\n shape[\"stroke\"] = [0,0,0,0];\n shape[\"stroke-width\"] = 0;\n }\n g.appendChild(shapeToSvg(defaultShape, offsetX, offsetY))\n g.appendChild(shapeToSvg(shape, offsetX, offsetY))\n \n const text = document.createElementNS(svgNameSpace, 'text');\n text.setAttributeNS(null, 'x', textOffsetX.toString());\n text.setAttributeNS(null, 'y', textOffsetY.toString());\n text.setAttributeNS(null, 'font-size', '12');\n text.setAttributeNS(null, 'font-family', 'Arial');\n var textNode = document.createTextNode(labels[index]);\n text.appendChild(textNode)\n\n g.appendChild(text);\n svgElement.appendChild(g)\n });\n\n svgElement.setAttribute(\n 'width', '840')\n svgElement.setAttribute(\n 'height','175')\n svgElement.style.paddingTop = '20px'\n // This is important you need to include this to succesfully render in cytoscape.js!\n svgElement.setAttribute('xmlns', svgNameSpace)\n \n return svgElement\n }\n\n render(){\n\n const legendPadding = '45px';\n\n return( \n {this.props.handleClose(EModalType.CHELP)}}>\n \n PathwayMapper cBioPortal Edition 2.2\n \n {(!this.props.patientView &&\n \n

\n PathwayMapper shows you your genes of interest with the alteration frequencies of selected genetic profiles of the chosen study overlaid on a TCGA pathway using a white to red color scale (the more frequently altered a gene is, the more red it's shown). All available TCGA pathways are ranked with the aim to choose the pathway that matches your interest the most. By default we display the pathway with highest ranking with the default ranking options but you may look at your genes of interest in the context of other pathways as well by choosing from the pathway table. \n
\n
\n Refer to the documentation here for the notation used.\n
\n
\n To search for a particular pathway of your interest, use the search field on top of the pathway table. To switch to another pathway, click on the button in the associated row of the pathway table. Ranking criteria might be changed by changing the options at the bottom of the table. \n
\n
\n The buttons on top of the pathway are:\n

    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Save as PNG
    Save as SVG
    Perform layout: Layout is recalculated taking current node positions into account
    Add selected genes to query: You may select additional genes from the pathway by left clicking (Shift + left click to add more genes)
    Add all valid genes to query: All valid gene symbols will be added to the query; others will be ignored
    Edit pathway: Edit both the topology and the geometry of the current pathway with the full blown PathwayMapper editor
    \n
\n

\n
)\n },\n {(this.props.patientView &&\n \n

\n PathwayMapper shows you your genes of interest with the mutation types, copy number alterations and fusions of selected genetic profiles of the chosen study overlaid on a TCGA pathway using the OncoPrint color scheme. All available TCGA pathways are ranked with the aim to choose the pathway that matches your interest the most. By default we display the pathway with the highest number of genes of interest matching the ones in a pathway but you may look at your genes of interest in the context of other pathways as well by choosing from the pathway table. \n
\n
\n Refer to the documentation here for the notation used.\n
\n
\n Genetic alteration legend:\n
\n

\n
\n

Putative driver and unknown significance annotations are based on data from OncoKB and CancerHotspots.org.

\n
\n To search for a particular pathway of your interest, use the search field on top of the pathway table. To switch to another pathway, click on the button in the associated row of the pathway table.\n
\n
\n The buttons on top of the pathway are:\n
    \n \n \n \n \n \n \n \n \n \n \n
    Save as PNG
    Save as SVG
    Perform layout: Layout is recalculated taking current node positions into account
    \n
\n

\n
\n )}\n
\n\n );\n }\n\n}\n","import { makeObservable, observable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\nimport { Button, Checkbox, Col, ControlLabel, Form, FormControl, Row, Modal } from 'react-bootstrap';\nimport GridOptionsManager from '../managers/GridOptionsManager';\nimport { EModalType } from '../ui/react-pathway-mapper';\nimport PathwayActions from '../utils/PathwayActions';\ninterface IGridSettingsProps{\n show: boolean;\n handleClose: Function;\n pathwayActions: PathwayActions;\n}\n\nexport enum EGridType{\n GRID,\n GUIDE,\n NONE\n}\n\n@observer\nexport default class GridSettings extends React.Component{\n\n\n\n @observable\n private gridSize: number;\n \n @observable\n private guideColor: string;\n\n private defaultSettings = GridOptionsManager.defaultGridGuideOptions;\n\n @observable\n private enabledType: EGridType;\n constructor(props: IGridSettingsProps){\n super(props);\n makeObservable(this);\n \n this.gridSize = this.defaultSettings.gridSpacing;\n this.guideColor = this.defaultSettings.guidelinesStyle.strokeStyle;\n }\n\n setEnabledType(newType: EGridType){\n if(newType === this.enabledType){\n this.enabledType = EGridType.NONE;\n return;\n }\n\n this.enabledType = newType;\n }\n\n render(){\n\n return(\n {this.enabledType = this.props.pathwayActions.enabledType;}}\n onHide={() => {\n this.props.handleClose(EModalType.GRID);\n }}>\n \n \n Grid Settings\n \n \n \n
\n \n \n Enable Grids:\n \n\n \n {this.setEnabledType(EGridType.GRID);}}>\n \n \n \n \n Enable Guidelines:\n \n\n \n {this.setEnabledType(EGridType.GUIDE);}}>\n \n \n \n \n Grid Size:\n \n\n \n {this.gridSize = e.target.value;}}/>\n \n \n \n \n Guideline Color:\n \n\n \n {this.guideColor = e.target.value;}}/>\n \n \n
\n
\n\n \n \n \n
\n );\n\n\n } \n}","import React from 'react';\nimport {Modal, Button} from 'react-bootstrap';\nimport { EModalType } from '../ui/react-pathway-mapper';\n\ninterface IConfirmationModalProps{\n show: boolean;\n handleClose: (modalId: EModalType) => void;\n}\n\nexport default class ConfirmationModal extends React.Component{\n\n static pendingFunction: Function;\n\n constructor(props: IConfirmationModalProps){\n super(props);\n\n }\n\n render(){\n\n\n return(\n {this.props.handleClose(EModalType.CONFIRMATION);}}\n >\n \n Confirmation\n \n \n
\n All unsaved changes will be lost. Do you want to continue?\n
\n
\n \n \n \n\n \n \n );\n }\n}","import _ from \"lodash\";\nimport { IColorValueMap } from \"../ui/react-pathway-mapper\";\nimport GraphUtilities from \"../utils/GraphUtilities\";\nimport EditorActionsManager from \"./EditorActionsManager\";\n\nlet sharedb;\nlet socket;\nlet connection;\n\nexport default class ShareDBManager {\n\n readonly NODEMAP_NAME = 'nodes';\n readonly EDGEMAP_NAME = 'edges';\n readonly LAYOUT_PROPS_NAME = 'layoutProperties';\n readonly GLOBAL_OPTS_NAME = 'globalOptions';\n //For storing genomic data information per gene\n readonly GENOMIC_DATA_MAP_NAME = 'genomicDataMap';\n //For storing visibility information of genomic data according to the cancer type\n readonly VISIBLE_GENOMIC_DATA_MAP_NAME = 'visibleGenomicDataMapByType';\n readonly GENOMIC_DATA_GROUP_NAME = 'genomicDataGroupList';\n readonly GENOMIC_DATA_GROUP_COUNT = 'genomicDataGroupCount';\n readonly GENOMIC_DATA_COLOR_SCHEME_NAME = 'genomicDataColorScheme';\n \n doc: any;\n postFileLoad: any;\n editor: EditorActionsManager;\n constructor(postFileLoadCallback) {\n //Doc data maps names and keys\n this.postFileLoad = postFileLoadCallback;\n };\n\n\n\n getDoc(){\n return this.doc;\n }\n\n setEditor(editor: EditorActionsManager){\n this.editor = editor;\n }\n\n //Applies any given sharDB opeation to shared document and notifies other clients\n applyShareDBOperation(op) {\n this.doc.submitOp(op, this.shareDBError);\n };\n\n //Clears genomic data in shared document and notifies other clients\n clearShareDBGenomicData() {\n var ops = [];\n var genomicMap = this.doc.data[this.GENOMIC_DATA_MAP_NAME];\n var visMap = this.doc.data[this.VISIBLE_GENOMIC_DATA_MAP_NAME];\n var genomicDataGroupMap = this.doc.data[this.GENOMIC_DATA_GROUP_NAME];\n var genomicDataGroupCount = this.doc.data[this.GENOMIC_DATA_GROUP_COUNT];\n //Reset all genomic maps\n for (const key of Object.keys(genomicMap)) {\n ops.push({p: [this.GENOMIC_DATA_MAP_NAME, key], od: genomicMap[key]});\n }\n for (const key of Object.keys(visMap)) {\n ops.push({p: [this.VISIBLE_GENOMIC_DATA_MAP_NAME, key], od: visMap[key]});\n }\n for (const key of Object.keys(genomicDataGroupMap)) {\n ops.push({p: [this.GENOMIC_DATA_GROUP_NAME, key], od: genomicDataGroupMap[key]});\n }\n //Reset genomic data group count to 0\n ops.push({p: [this.GENOMIC_DATA_GROUP_COUNT], na: -genomicDataGroupCount});\n this.doc.submitOp(ops, this.shareDBError);\n };\n\n /*\n * Updates shared document object\n * @param mapName: map name of the object\n * @param objectKey: key of the object\n * @param object: new object\n *\n */\n updateShareDBObject(mapName, objectKey, object) {\n this.doc.submitOp([{\n p: [mapName, objectKey],\n od: this.doc.data[mapName][objectKey],\n oi: object\n }], this.shareDBError);\n };\n\n /*\n * Inserts a new shared document object\n * @param mapName: map name of the object\n * @param objectKey: key of the object\n * @param object: new object\n *\n */\n insertShareDBObject(mapName, objectKey, object) {\n this.doc.submitOp([{p: [mapName, objectKey], oi: object}], this.shareDBError);\n };\n\n /*\n * Deletes a shared document object\n * @param mapName: map name of the object\n * @param objectKey: key of the object\n *\n */\n deleteShareDBObject(mapName, objectKey) {\n this.doc.submitOp([{p: [mapName, objectKey], od: this.doc.data[mapName][objectKey]}], this.shareDBError);\n };\n\n //Initializes layout properties of the shared document\n initializeShareDBLayoutProperties() {\n this.doc.submitOp([{\n p: [this.LAYOUT_PROPS_NAME, 0],\n li: [this.editor.layoutProperties]\n }], this.shareDBError);\n };\n\n //Initializes global options of the shared document\n initializeShareDBGlobalOptions() {\n this.doc.submitOp([{\n p: [this.GLOBAL_OPTS_NAME, 0],\n li: [this.editor.getGlobalOptions()]\n }], this.shareDBError);\n };\n\n /*\n * Updates layout properties of the shared document and notifies other clients\n * @param object: new layout properties object\n *\n */\n updateShareDBLayoutProperties(object) {\n this.doc.submitOp([{\n p: [this.LAYOUT_PROPS_NAME, 0],\n ld: this.doc.data[this.LAYOUT_PROPS_NAME][0],\n li: object\n }], this.shareDBError);\n };\n\n /*\n * Updates global options of the shared document and notifies other clients\n * @param object: new global options object\n *\n */\n updateShareDBGlobalOptions(object) {\n this.doc.submitOp([{\n p: [this.GLOBAL_OPTS_NAME, 0],\n ld: this.doc.data[this.GLOBAL_OPTS_NAME][0],\n li: object\n }], this.shareDBError);\n };\n\n updateShareDBGenomicDataOverlayColorScheme(object : IColorValueMap) {\n this.doc.submitOp([{\n p: [this.GENOMIC_DATA_COLOR_SCHEME_NAME, 0],\n ld: this.doc.data[this.GENOMIC_DATA_COLOR_SCHEME_NAME][0],\n li: object\n }], this.shareDBError);\n };\n\n //Increments shared data group count\n //Use this function to increment and keep the group count synchronized\n incrementShareDBGroupCount() {\n this.doc.submitOp([{p: [this.GENOMIC_DATA_GROUP_COUNT], na: 1}], this.shareDBError);\n };\n\n //Checks whether given operation is a replace or add/delete operation\n isShareDBReplaceEvent(op) {\n return (op.hasOwnProperty(\"oi\") && op.hasOwnProperty(\"od\"))\n || (op.hasOwnProperty(\"li\") && op.hasOwnProperty(\"ld\"));\n };\n\n /*\n * Gets the initial value of the shared document\n * without this function shared document values cannot be reached\n */\n initializeSharedDBDoc() {\n this.doc.subscribe();\n };\n\n shareDBError(err) {\n if (err) {\n console.error(err);\n }\n };\n\n initShareDB() {\n sharedb = require('sharedb/lib/client');\n socket = new WebSocket('ws://' + window.location.host);\n connection = new sharedb.Connection(socket);\n\n var self = this;\n\n var id = this.getParam('id');\n\n var loadFileCallback = function () {\n self.onFileLoaded();\n };\n\n //Creates new shared db document and initializes values\n var createNewDocument = () => {\n var new_id = self.getCustomObjId();\n var data = {\n nodes: {},\n edges: {},\n layoutProperties: [this.editor.layoutProperties],\n globalOptions: [this.editor.getGlobalOptions()],\n genomicDataMap: {},\n visibleGenomicDataMapByType: {},\n genomicDataGroupList: {},\n genomicDataGroupCount: 0,\n genomicDataColorScheme: [{\n '-100' : \"#0000ff\",\n '0' : \"#ffffff\",\n '100' : \"#ff0000\"\n }]\n };\n window.history.pushState(null, null, '?id=' + new_id);\n self.doc = connection.get('cy', new_id);\n self.doc.create(data, loadFileCallback);\n };\n\n //Check if id exists in parameters\n //If exists open the shared document\n if (id) {\n // Check any document exists with given id\n this.doc = connection.get('cy', id);\n this.doc.fetch(function (err) {\n if (err)\n throw err;\n\n if (self.doc.type === null) {\n createNewDocument();\n return;\n }\n self.doc.subscribe(loadFileCallback);\n });\n }\n else {\n //Create new shared document\n createNewDocument();\n }\n };\n\n /*\n * After a file has been initialized and loaded, we can access the\n * document. We will wire up the data in shared document to the UI.\n *\n */\n onFileLoaded() {\n this.initializeSharedDBDoc();\n this.syncInitialSharedDocData();\n this.initSharedDocEventHandlers();\n\n this.postFileLoad();\n };\n\n /*\n * Synchronizes initial data in the shared document to\n * client's application.\n */\n syncInitialSharedDocData() {\n var self = this;\n var nodeMap = self.doc.data[this.NODEMAP_NAME];\n var edgeMap = self.doc.data[this.EDGEMAP_NAME];\n var shareDBLayoutProperties = self.doc.data[this.LAYOUT_PROPS_NAME][0];\n var globalOptions = self.doc.data[this.GLOBAL_OPTS_NAME][0];\n var genomicDataMap = self.doc.data[this.GENOMIC_DATA_MAP_NAME];\n var visDataMap = self.doc.data[this.VISIBLE_GENOMIC_DATA_MAP_NAME];\n var groupedGenomicDataMap = self.doc.data[this.GENOMIC_DATA_GROUP_NAME];\n var groupedGenomicDataCount = self.doc.data[this.GENOMIC_DATA_GROUP_COUNT];\n let genomicDataColorScheme = self.doc.data[this.GENOMIC_DATA_COLOR_SCHEME_NAME][0];\n\n var invalidGenes = [];\n var highlightedGenes = [];\n var invalidHighlightedGenes = [];\n var hiddenGenes = [];\n for (const key of Object.keys(nodeMap)) {\n var tmpNode = nodeMap[key];\n var tmpNodeId = tmpNode.id;\n\n if (tmpNode.isInvalidGene && tmpNode.isHighlighted) {\n invalidHighlightedGenes.push(tmpNodeId);\n }\n else if (tmpNode.isInvalidGene) {\n invalidGenes.push(tmpNodeId);\n }\n else if (tmpNode.isHighlighted) {\n highlightedGenes.push(tmpNodeId);\n }\n if (tmpNode.isHidden) {\n hiddenGenes.push(tmpNodeId);\n }\n }\n var highlightedEdges = [];\n for (const key of Object.keys(edgeMap)) {\n var tmpEdge = edgeMap[key];\n var tmpEdgeId = tmpEdge.id;\n if (tmpEdge.isHighlighted) {\n highlightedEdges.push(tmpEdgeId);\n }\n }\n\n //TODO Workaround for legacy pathways\n\n // Workaround for backward compatibility of legacy pathways\n // Addition of pubmed id field on server if legacy collaborative\n // pathways does not have !\n for (const key of Object.keys(edgeMap)) {\n const tmpEdge = edgeMap[key];\n\n if (tmpEdge.pubmedIDs == undefined \n || tmpEdge.name == undefined \n || tmpEdge.bendPoint == undefined \n || tmpEdge.anchorPoints == undefined\n || tmpEdge.edgeCurveStyle == undefined) {\n const pubmedIDs = (tmpEdge.pubmedIDs == undefined) ? [] : tmpEdge.pubmedID;\n const edgeLabel = (tmpEdge.name == undefined) ? \"\" : tmpEdge.name;\n let anchorPoints = [];\n if (tmpEdge.bendPoint) {\n anchorPoints = tmpEdge.bendPoint;\n }\n else if (tmpEdge.anchorPoints) {\n anchorPoints = tmpEdge.anchorPoints;\n }\n const edgeCurveStyle = tmpEdge.edgeCurveStyle ? tmpEdge.edgeCurveStyle : \"bezier\";\n\n const param = {\n type: tmpEdge.type,\n source: tmpEdge.source,\n id: self.getCustomObjId(),\n target: tmpEdge.target,\n pubmedID: pubmedIDs,\n name: edgeLabel,\n anchorPoints: anchorPoints,\n edgeCurveStyle: edgeCurveStyle\n };\n\n const newEdge: any = self.edgeInitializer(param);\n\n\n const tmpEdgeID = tmpEdge.id;\n const newEdgeID = newEdge.id;\n\n const ops = [\n {p: [self.EDGEMAP_NAME, tmpEdgeID], od: tmpEdge},\n {p: [self.EDGEMAP_NAME, newEdgeID], oi: newEdge}\n ]\n self.applyShareDBOperation(ops);\n }\n\n }\n\n //Add real time nodes to local graph\n this.editor.addNewElementsLocally(nodeMap, edgeMap);\n //Adds different type of highlight to nodes and hides if their property is hidden\n this.editor.highlightElementsInitially(invalidHighlightedGenes, invalidGenes, highlightedGenes, highlightedEdges, hiddenGenes);\n\n //Update layout properties & global options!!\n if (shareDBLayoutProperties.name == \"cose-bilkent\") {\n shareDBLayoutProperties.name = \"fcose\";\n this.updateLayoutProperties(shareDBLayoutProperties);\n }\n this.editor.updateLayoutPropertiesCallback({li: shareDBLayoutProperties});\n this.editor.changeGlobalOptions({li: globalOptions});\n\n //Sync already available genomic data !\n\n if (!groupedGenomicDataMap) {\n\n self.insertShareDBObject(self.GENOMIC_DATA_MAP_NAME, '0', []);\n for (const key of Object.keys(visDataMap)) {\n var currentMap = _.clone(groupedGenomicDataMap['0']);\n // currentMap.push(visibilityMapKeys[key]);\n self.updateShareDBObject(self.GENOMIC_DATA_MAP_NAME, '0', currentMap);\n }\n }\n\n if (!groupedGenomicDataCount) {\n var count = self.doc.data[self.GENOMIC_DATA_GROUP_COUNT];\n var op = [{\n p: [self.GENOMIC_DATA_GROUP_COUNT],\n na: -count\n }];\n self.applyShareDBOperation(op);\n groupedGenomicDataCount = self.doc.data[self.GENOMIC_DATA_GROUP_COUNT];\n }\n\n if (!genomicDataColorScheme) {\n self.insertShareDBObject(self.GENOMIC_DATA_COLOR_SCHEME_NAME, '0', this.editor.getGenomicDataOverlayColorScheme());\n genomicDataColorScheme = self.doc.data[self.GENOMIC_DATA_COLOR_SCHEME_NAME]['0'];\n }\n\n this.editor.updateGenomicDataColorSchemeHandler({li: genomicDataColorScheme});\n\n for (const key_g of Object.keys(genomicDataMap)) {\n this.editor.genomicDataOverlayManager.genomicDataMap[key_g] =\n genomicDataMap[key_g];\n\n }\n\n for (const key_g of Object.keys(groupedGenomicDataMap)) {\n this.editor.genomicDataOverlayManager.groupedGenomicDataMap[key_g] =\n groupedGenomicDataMap[key_g];\n const data = groupedGenomicDataMap[key_g];\n if(data.length !== 1){\n console.log(\"Grouped genomic data expected to be of length 1 (from sync)\");\n }\n data.forEach((profileId: any) => {this.editor.addToProfiles(profileId)});\n }\n\n for (const key_g of Object.keys(visDataMap)) {\n this.editor.genomicDataOverlayManager.visibleGenomicDataMapByType[key_g] =\n visDataMap[key_g];\n this.editor.adjustVisibilityShareDB(key_g, visDataMap[key_g]);\n \n }\n\n //Does not seem necessary for not but just for sake of completeness\n this.editor.genomicDataOverlayManager.groupedGenomicDataCount = groupedGenomicDataCount;\n\n this.editor.genomicDataOverlayManager.showGenomicData();\n this.editor.genomicDataOverlayManager.notifyObservers();\n this.editor.cy.style().update();\n this.editor.cy.fit(50);\n };\n\n /*\n * Initialize event listeners for any operation coming from shareDB\n *\n */\n initSharedDocEventHandlers () {\n\n var self = this;\n\n //Setup event handlers for maps\n var nodeAddRemoveHandler = function (op) {\n self.editor.shareDBNodeAddRemoveEventCallBack(op);\n };\n\n var edgeAddRemoveHandler = function (op) {\n self.editor.shareDBEdgeAddRemoveEventCallBack(op);\n };\n\n var genomicDataAddRemoveHandler = function (op) {\n self.editor.shareDBGenomicDataHandler(op);\n };\n\n var genomicDataVisibilityChangeHandler = function (op) {\n self.editor.shareDBGenomicDataVisibilityHandler(op);\n self.checkShareDBGenomicData();\n };\n\n var genomicDataGroupChangeHandler = function (op) {\n self.editor.shareDBGenomicDataGroupChangeHandler(op);\n };\n\n var updateElementHandler = function (op) {\n self.editor.updateElementCallback(op);\n };\n\n var updateLayoutPropsHandler = function (op) {\n self.editor.updateLayoutPropertiesCallback(op);\n };\n\n var updateGlobalOptionsHandler = function (op) {\n self.editor.changeGlobalOptions(op);\n };\n\n var updateGenomicDataColorSchemeHandler = function (op) {\n self.editor.updateGenomicDataColorSchemeHandler(op);\n }\n\n\n //Event listeners for maps\n this.doc.on('op', function (op, source) {\n for (var i = 0; i < op.length; i++) {\n var handleOp = op[i];\n var path = handleOp.p[0];\n var isReplaceEvent = self.isShareDBReplaceEvent(handleOp);\n\n if (!isReplaceEvent) {\n if (path === self.NODEMAP_NAME) {\n nodeAddRemoveHandler(handleOp);\n }\n else if (path === self.EDGEMAP_NAME) {\n edgeAddRemoveHandler(handleOp);\n }\n else if (path === self.GENOMIC_DATA_MAP_NAME) {\n genomicDataAddRemoveHandler(handleOp);\n }\n else if (path === self.VISIBLE_GENOMIC_DATA_MAP_NAME) {\n genomicDataVisibilityChangeHandler(handleOp);\n }\n else if (path === self.GENOMIC_DATA_GROUP_NAME) {\n genomicDataGroupChangeHandler(handleOp);\n }\n }\n else { //Then it is update event\n if (path === self.NODEMAP_NAME) {\n updateElementHandler(handleOp);\n }\n else if (path === self.EDGEMAP_NAME) {\n updateElementHandler(handleOp);\n }\n else if (path === self.LAYOUT_PROPS_NAME) {\n updateLayoutPropsHandler(handleOp);\n }\n else if (path === self.GLOBAL_OPTS_NAME) {\n updateGlobalOptionsHandler(handleOp);\n }\n else if (path === self.GENOMIC_DATA_COLOR_SCHEME_NAME) {\n updateGenomicDataColorSchemeHandler(handleOp);\n }\n }\n }\n });\n };\n\n /*\n * Make sure that genomic cloud data is syncronized\n */\n checkShareDBGenomicData () {\n\n var self = this;\n var genomicDataMap = self.doc.data[this.GENOMIC_DATA_MAP_NAME];\n var visDataMap = self.doc.data[this.VISIBLE_GENOMIC_DATA_MAP_NAME];\n var groupedGenomicDataMap = self.doc.data[this.GENOMIC_DATA_GROUP_NAME];\n var groupedGenomicDataCount = self.doc.data[this.GENOMIC_DATA_GROUP_COUNT];\n\n for (var key in genomicDataMap) {\n this.editor.genomicDataOverlayManager.genomicDataMap[key] =\n genomicDataMap[key];\n }\n\n for (var key in visDataMap) {\n this.editor.genomicDataOverlayManager.visibleGenomicDataMapByType[key] =\n visDataMap[key];\n }\n\n for (var key in groupedGenomicDataMap) {\n this.editor.genomicDataOverlayManager.groupedGenomicDataMap[key] =\n groupedGenomicDataMap[key];\n }\n this.editor.genomicDataOverlayManager.groupedGenomicDataCount = groupedGenomicDataCount;\n this.editor.genomicDataOverlayManager.showGenomicData();\n this.editor.genomicDataOverlayManager.notifyObservers();\n };\n \n /*\n * Gets the first empty index from the shared document\n * genomic data group count and increments counter by 1\n *\n */\n\n getEmptyGroupID() {\n var returnCount = this.doc.data[this.GENOMIC_DATA_GROUP_COUNT];\n this.incrementShareDBGroupCount();\n return returnCount;\n };\n\n /*\n * Gets the first empty index from the shared document\n * Initializes & inserts a new genomic data\n * by group id or group name\n *\n */\n groupGenomicData(cancerNames, inGroupId) {\n var genomicGroupMap = this.doc.data[this.GENOMIC_DATA_GROUP_NAME];\n var genomicVisMap = this.doc.data[this.VISIBLE_GENOMIC_DATA_MAP_NAME];\n\n var groupID = \"\" + inGroupId;\n var currentGroup = [];\n\n if (genomicGroupMap.hasOwnProperty(groupID))\n currentGroup = _.clone(genomicGroupMap[groupID]);\n\n for (var i in cancerNames) {\n if (!genomicVisMap.hasOwnProperty(cancerNames[i]))\n currentGroup.push(cancerNames[i]);\n }\n\n // If group id already exists change existing object\n if (genomicGroupMap.hasOwnProperty(groupID)) {\n this.updateShareDBObject(this.GENOMIC_DATA_GROUP_NAME, groupID, currentGroup);\n }\n else {\n //Insert new group\n this.insertShareDBObject(this.GENOMIC_DATA_GROUP_NAME, groupID, currentGroup);\n }\n\n };\n\n //Clears genomic data on shared document\n clearGenomicData() {\n this.clearShareDBGenomicData();\n };\n\n addGenomicData(geneData) {\n var genomicMap = this.doc.data[this.GENOMIC_DATA_MAP_NAME];\n\n //Iterate over all genmoic data which is mapped by geneSymbol to list of alteration values\n //that are also mapped by cancer name and associated value\n var ops = [];\n for (var geneSymbol in geneData) {\n var genomicMapEntry = {};\n if (genomicMap.hasOwnProperty(geneSymbol))\n genomicMapEntry = _.clone(genomicMap[geneSymbol]);\n\n for (var cancerType in geneData[geneSymbol]) {\n if (!(cancerType in genomicMapEntry))\n genomicMapEntry[cancerType] = parseInt(geneData[geneSymbol][cancerType]).toFixed(2);\n }\n ops.push({\n p: [this.GENOMIC_DATA_MAP_NAME, geneSymbol],\n oi: genomicMapEntry\n });\n }\n this.applyShareDBOperation(ops);\n };\n\n addGenomicVisibilityData(visMap) {\n var ops = [];\n for (var cancerStudy in visMap) {\n ops.push({\n p: [this.VISIBLE_GENOMIC_DATA_MAP_NAME, cancerStudy],\n oi: visMap[cancerStudy]\n });\n }\n this.applyShareDBOperation(ops);\n };\n\n changeVisibility(nodesToHide, isHidden) {\n var self = this;\n var nodeMap = self.doc.data[this.NODEMAP_NAME];\n\n nodesToHide.forEach(function (ele) {\n var nodeID = ele.id();\n if (nodeMap.hasOwnProperty(nodeID)) {\n var realTimeNode = nodeMap[nodeID];\n realTimeNode.isHidden = isHidden;\n self.updateShareDBObject(self.NODEMAP_NAME, nodeID, realTimeNode);\n }\n });\n };\n\n changeHighlight(elementsToHighlight, isHighlighted) {\n var self = this;\n var nodeMap = self.doc.data[this.NODEMAP_NAME];\n var edgeMap = self.doc.data[this.EDGEMAP_NAME];\n\n elementsToHighlight.forEach(function (ele) {\n var elementID = ele.id();\n if (nodeMap.hasOwnProperty(elementID)) {\n var realTimeNode = nodeMap[elementID];\n realTimeNode.isHighlighted = isHighlighted;\n self.updateShareDBObject(self.NODEMAP_NAME, elementID, realTimeNode);\n }\n if (edgeMap.hasOwnProperty(elementID)) {\n var realTimeEdge = edgeMap[elementID];\n realTimeEdge.isHighlighted = isHighlighted;\n self.updateShareDBObject(self.EDGEMAP_NAME, elementID, realTimeEdge);\n }\n });\n };\n\n addNewNode(nodeData, posData) {\n var realTimeGeneratedID = this.getCustomObjId();\n var params = {\n name: nodeData.name,\n type: nodeData.type,\n id: realTimeGeneratedID,\n parent: nodeData.parent,\n w: nodeData.w,\n h: nodeData.h,\n minWidth: nodeData.minWidth,\n minWidthBiasLeft: nodeData.minWidthBiasLeft,\n minWidthBiasRight: nodeData.minWidthBiasRight,\n minHeight: nodeData.minHeight,\n minHeightBiasTop: nodeData.minHeightBiasTop,\n minHeightBiasBottom: nodeData.minHeightBiasBottom\n };\n\n //Ensures new node is compatible with the other nodes\n var newNode = this.nodeInitializer(params);\n if (posData) {\n newNode.x = posData.x;\n newNode.y = posData.y;\n }\n this.insertShareDBObject(this.NODEMAP_NAME, realTimeGeneratedID, newNode);\n };\n\n addNewEdge(edgeData) {\n var realTimeGeneratedID = this.getCustomObjId();\n var params = {\n type: edgeData.type,\n id: realTimeGeneratedID,\n source: edgeData.source,\n target: edgeData.target,\n pubmedIDs: edgeData.pubmedIDs,\n name: edgeData.name,\n anchorPoints: edgeData.anchorPoints\n };\n\n //Ensures new edge is compatible with the other edge\n var newEdge = this.edgeInitializer(params);\n this.insertShareDBObject(this.EDGEMAP_NAME, realTimeGeneratedID, newEdge);\n };\n\n reconnectEdge = function(sourceID, targetID, edgeData) {\n var edgeMap = this.doc.data[this.EDGEMAP_NAME];\n var edge = edgeMap[edgeData.id];\n var edgeID = edge.id;\n\n edge.source = sourceID;\n edge.target = targetID;\n\n if(edgeMap.hasOwnProperty(edgeID)) {\n this.updateShareDBObject(this.EDGEMAP_NAME, edgeID, edge);\n }\n else {\n throw new Error('Element does not exist in Real Time');\n }\n };\n\n\n removeElement (elementID) {\n var edgeMap = this.doc.data[this.EDGEMAP_NAME];\n var nodeMap = this.doc.data[this.NODEMAP_NAME];\n\n if (nodeMap.hasOwnProperty(elementID)) {\n this.deleteShareDBObject(this.NODEMAP_NAME, elementID);\n }\n else if (edgeMap.hasOwnProperty(elementID)) {\n this.deleteShareDBObject(this.EDGEMAP_NAME, elementID);\n }\n else {\n throw new Error('Element does not exist in Real Time');\n }\n };\n\n moveElement (ele) {\n var nodeMap = this.doc.data[this.NODEMAP_NAME];\n\n var elementID = ele.id();\n var newPos = ele.position();\n\n if (nodeMap.hasOwnProperty(elementID)) {\n var tmpNode = nodeMap[elementID];\n tmpNode.x = newPos.x;\n tmpNode.y = newPos.y;\n this.updateShareDBObject(this.NODEMAP_NAME, elementID, tmpNode);\n }\n else {\n throw new Error('Element does not exist in nodes !!! ');\n }\n };\n\n //This function is used for movements of all selected elements wrt alignment selected\n changeElementsPositionByAlignment (coll) {\n var self = this;\n var nodeMap = self.doc.data[this.NODEMAP_NAME];\n\n coll.forEach(function (ele) {\n var elementID = ele.node.id();\n if (nodeMap.hasOwnProperty(elementID)) {\n var tmpNode = nodeMap[elementID];\n tmpNode.x = ele.nextPosition.x;\n tmpNode.y = ele.nextPosition.y;\n self.updateShareDBObject(self.NODEMAP_NAME, elementID, tmpNode);\n }\n else {\n throw new Error('Element does not exist in nodes !!! ');\n }\n });\n };\n\n resizeElement (ele, previousWidth, previousHeight) {\n var nodeMap = this.doc.data[this.NODEMAP_NAME];\n\n var elementID = ele.id();\n var newWidth = ele.width();\n var newHeight = ele.height();\n var currentX = ele.position('x');\n var currentY = ele.position('y');\n\n if (nodeMap.hasOwnProperty(elementID)) {\n var tmpNode = nodeMap[elementID];\n tmpNode.x = currentX + newWidth - previousWidth;\n tmpNode.y = currentY + newHeight - previousHeight;\n tmpNode.w = newWidth;\n tmpNode.h = newHeight;\n this.updateShareDBObject(this.NODEMAP_NAME, elementID, tmpNode);\n }\n else {\n throw new Error('Element does not exist in nodes !!! ');\n }\n };\n\n setSizeOfElement (ele, newWidth, newHeight) {\n var nodeMap = this.doc.data[this.NODEMAP_NAME];\n\n var elementID = ele.id();\n\n if (nodeMap.hasOwnProperty(elementID)) {\n var tmpNode = nodeMap[elementID];\n tmpNode.w = newWidth;\n tmpNode.h = newHeight;\n this.updateShareDBObject(this.NODEMAP_NAME, elementID, tmpNode);\n }\n else {\n throw new Error('Element does not exist in nodes !!! ');\n }\n };\n\n resizeCompound (ele, minWidth, minWidthBiasLeft, minWidthBiasRight, minHeight, minHeightBiasTop, minHeightBiasBottom) {\n var nodeMap = this.doc.data[this.NODEMAP_NAME];\n\n var elementID = ele.id();\n var currentX = ele.position('x');\n var currentY = ele.position('y');\n\n if (nodeMap.hasOwnProperty(elementID)) {\n var tmpNode = nodeMap[elementID];\n tmpNode.x = currentX;\n tmpNode.y = currentY;\n tmpNode.minWidth = minWidth;\n tmpNode.minWidthBiasLeft = minWidthBiasLeft;\n tmpNode.minWidthBiasRight = minWidthBiasRight;\n tmpNode.minHeight = minHeight;\n tmpNode.minHeightBiasTop = minHeightBiasTop;\n tmpNode.minHeightBiasBottom = minHeightBiasBottom;\n this.updateShareDBObject(this.NODEMAP_NAME, elementID, tmpNode);\n }\n else {\n throw new Error('Element does not exist in nodes !!! ');\n }\n };\n\n changeNodePositionsShareDB (nodes) {\n var self = this;\n var nodeMap = self.doc.data[self.NODEMAP_NAME];\n\n nodes.forEach(function (ele) {\n var nodeID = ele.id();\n if (nodeMap.hasOwnProperty(nodeID)) {\n var realTimeNode = nodeMap[nodeID];\n realTimeNode.x = ele.position('x');\n realTimeNode.y = ele.position('y');\n self.updateShareDBObject(self\n .NODEMAP_NAME, nodeID, realTimeNode);\n }\n else {\n throw new Error('Element does not exist in nodes !!! ');\n }\n });\n };\n\n changeHighlightInvalidGenes (nodeIDs, isInvalid) {\n var nodeMap = this.doc.data[this.NODEMAP_NAME];\n\n //TODO check compound operation inside or outside of for ?\n for (var i in nodeIDs) {\n var nodeID = nodeIDs[i];\n if (nodeMap.hasOwnProperty(nodeID)) {\n var collaborativeNode = nodeMap[nodeID];\n collaborativeNode.isInvalidGene = isInvalid;\n this.updateShareDBObject(this.NODEMAP_NAME, nodeID, collaborativeNode);\n }\n }\n\n };\n\n addPubmedIDs (edgeID, pubmedIDs) {\n var edgeMap = this.doc.data[this.EDGEMAP_NAME];\n\n\n if (edgeMap.hasOwnProperty(edgeID)) {\n var tmpEdge = edgeMap[edgeID];\n var nonDuplicateArray = [];\n for (var i = 0; i < pubmedIDs.length; i++) {\n if (tmpEdge.pubmedIDs.indexOf(pubmedIDs[i]) < 0) {\n nonDuplicateArray.push(pubmedIDs[i]);\n }\n }\n tmpEdge.pubmedIDs = tmpEdge.pubmedIDs.concat(nonDuplicateArray);\n this.updateShareDBObject(this.EDGEMAP_NAME, edgeID, tmpEdge);\n }\n else {\n throw new Error('Edge does not exist in real time !!! ');\n }\n };\n\n removePubmedID(edgeID, pubmedIDs) {\n var edgeMap = this.doc.data[this.EDGEMAP_NAME];\n\n if (edgeMap.hasOwnProperty(edgeID)) {\n var tmpEdge = edgeMap[edgeID];\n var removedIndices = [];\n for (var i = 0; i < pubmedIDs.length; i++) {\n var tmpID = pubmedIDs[i];\n var index = tmpEdge.pubmedIDs.indexOf(tmpID);\n if (index >= 0) {\n removedIndices.push(index);\n }\n }\n for (var i = 0; i < removedIndices.length; i++) {\n tmpEdge.pubmedIDs.remove(removedIndices[i]);\n }\n this.updateShareDBObject(this.EDGEMAP_NAME, edgeID, tmpEdge);\n\n }\n else {\n throw new Error('Edge does not exist in real time !!! ');\n }\n };\n\n updateEdgeAnchorPoints(edgeID, anchorPointsArray, edgeCurveStyle) {\n\n var edgeMap = this.doc.data[this.EDGEMAP_NAME];\n \n if (edgeMap.hasOwnProperty(edgeID)) {\n var tmpEdge = edgeMap[edgeID];\n tmpEdge.anchorPoints = anchorPointsArray;\n tmpEdge.edgeCurveStyle = edgeCurveStyle;\n this.updateShareDBObject(this.EDGEMAP_NAME, edgeID, tmpEdge);\n }\n else {\n throw new Error('Edge does not exist in real time !!! ');\n }\n };\n\n changeName(ele, newName) {\n var nodeMap = this.doc.data[this.NODEMAP_NAME];\n var edgeMap = this.doc.data[this.EDGEMAP_NAME];\n\n var elementID = ele.id();\n\n if (ele.isNode()) {\n if (nodeMap.hasOwnProperty(elementID)) {\n var tmpNode = nodeMap[elementID];\n tmpNode.name = newName;\n this.updateShareDBObject(this.NODEMAP_NAME, elementID, tmpNode);\n }\n else {\n throw new Error('Element does not exist in nodes !!! ');\n }\n }\n else {\n if (edgeMap.hasOwnProperty(elementID)) {\n var tmpEdge = edgeMap[elementID];\n tmpEdge.name = newName;\n this.updateShareDBObject(this.EDGEMAP_NAME, elementID, tmpEdge);\n }\n else {\n throw new Error('Element does not exist in edges !!! ');\n }\n }\n };\n\n changeParent(rootNode, newParentId, connectedEdges) {\n var self = this;\n var nodeLookupTable = {};\n\n function traverseFromRoot(rootNode, parId) {\n /*\n remove outermost node,\n create new real time node with given parentId,\n pass id of this real time node to children,\n repeat in a recursive manner\n after that restore the edges that dissapear by removed nodes\n during change parent\n */\n\n var refNode = rootNode.nodeRef;\n var children = rootNode.children;\n var newParentId = parId;\n\n if (refNode) {\n var refNodeId = refNode.id();\n var nodeData = refNode.data();\n var posData = refNode.position();\n var currentWidth = refNode.data('w');\n var currentHeight = refNode.data('h');\n\n var newNodeData =\n {\n name: nodeData.name,\n type: nodeData.type,\n x: posData.x,\n y: posData.y,\n w: currentWidth,\n h: currentHeight,\n parent: -1\n };\n\n if (parId) {\n newNodeData.parent = parId;\n }\n\n self.removeElement(refNodeId);\n var newNode = self.nodeInitializer(newNodeData);\n var newNodeId = newNode.id;\n self.insertShareDBObject(self.NODEMAP_NAME, newNodeId, newNode);\n newParentId = newNodeId;\n nodeLookupTable[refNodeId] = newNodeId;\n }\n\n for (const childNode of children) {\n traverseFromRoot(childNode, newParentId);\n }\n }\n\n //Begin traversing from given root node\n traverseFromRoot(rootNode, newParentId);\n\n //Restore edges that dissapear by the change parent operation\n //TODO compound operations ?\n connectedEdges.forEach(function (edge, index) {\n var edgeData = edge.data();\n self.removeElement(edge.id());\n\n var newSource = nodeLookupTable[edgeData.source];\n var newTarget = nodeLookupTable[edgeData.target];\n\n if (newSource) {\n edgeData.source = newSource;\n }\n\n if (newTarget) {\n edgeData.target = newTarget;\n }\n\n self.addNewEdge(edgeData);\n });\n };\n\n removeAllElements() {\n var nodeMap = this.doc.data[this.NODEMAP_NAME];\n var edgeMap = this.doc.data[this.EDGEMAP_NAME];\n var ops = [];\n\n //Remove all real time nodes\n for (const key of Object.keys(nodeMap)) {\n ops.push({\n p: [this.NODEMAP_NAME, key],\n od: nodeMap[key]\n });\n }\n\n //Remove all real time edges\n for (const key of Object.keys(edgeMap)) {\n ops.push({\n p: [this.EDGEMAP_NAME, key],\n od: edgeMap[key]\n });\n }\n\n this.applyShareDBOperation(ops);\n };\n\n loadGraph(nodes, edges) {\n var self = this;\n this.removeAllElements();\n\n //Function that traverses graph tree recursively.\n var oldIdNewIdMap = {};\n\n function traverseTree(node, newParentId) {\n node.data.x = node.position.x;\n node.data.y = node.position.y;\n\n //Update parent !\n if (newParentId) {\n var parent = node.data.parent;\n if (parent) {\n node.data.parent = newParentId;\n }\n }\n\n //Create new real time node\n var newNodeId = self.getCustomObjId();\n var params = node.data;\n oldIdNewIdMap[params.id] = newNodeId;\n var newNode = self.nodeInitializer(params);\n newNode.id = newNodeId;\n\n self.insertShareDBObject(self.NODEMAP_NAME, newNodeId, newNode);\n\n //If node has children recursively traverse sub graphs and update parent field of child nodes\n if (node.children.length > 0) {\n for (const tmpNode of node.children) {\n traverseTree(tmpNode, newNodeId);\n }\n }\n }\n\n //Create graph hierarchy from given list of flat nodes\n var tree = GraphUtilities.createGraphHierarchyRealTime(nodes);\n //Traverse from root nodes of tree\n for (const rootLevelNode of tree) {\n traverseTree(rootLevelNode, undefined);\n }\n\n /*\n Create real time edges, update the source and target fields, since new ids will be generated for the nodes in\n real time\n */\n for (const edge of edges) {\n edge.data.source = oldIdNewIdMap[edge.data.source];\n edge.data.target = oldIdNewIdMap[edge.data.target];\n\n var edgeCurveStyle = \"bezier\";\n if (edge.data.bendPointPositions && edge.data.bendPointPositions.length > 0) {\n edge.data['anchorPoints'] = edge.data['bendPointPositions'];\n delete edge.data['bendPointPositions'];\n edgeCurveStyle = \"segments\";\n }\n else if (edge.data.controlPointPositions && edge.data.controlPointPositions.length > 0) {\n edge.data['anchorPoints'] = edge.data['controlPointPositions'];\n delete edge.data['controlPointPositions'];\n edgeCurveStyle = \"unbundled-bezier\";\n }\n\n var params = edge.data;\n params.edgeCurveStyle = edgeCurveStyle;\n var newEdgeID = self.getCustomObjId();\n params.id = newEdgeID;\n \n var newEdge = self.edgeInitializer(params);\n self.insertShareDBObject(self.EDGEMAP_NAME, newEdgeID, newEdge);\n }\n };\n\n mergeGraph (nodes, edges) {\n var self = this;\n var nodeMap = self.doc.data[this.NODEMAP_NAME];\n\n var realTimeNodeMap = nodeMap;\n var realTimeNodeLookupTable = {};\n var realTimeNodeNameLookupTable = {};\n var oldIdNewIdMap = {};\n\n //Create lookup table for real time nodes\n //items are stored in an array in the resulting array of nodeMap.items()\n // [0] - id, [1] - object\n for (var i in realTimeNodeMap) {\n var nodeMapItem = realTimeNodeMap[i];\n realTimeNodeLookupTable[nodeMapItem.id] = nodeMapItem;\n realTimeNodeNameLookupTable[nodeMapItem.name] = nodeMapItem;\n }\n\n //Recursive traverse definition\n function traverseTree(node, newParentId) {\n //Search by name !\n //We have not found a node that exist in the graph, add normally\n if (!(node.data.name in realTimeNodeNameLookupTable)) {\n node.data.x = node.position.x;\n node.data.y = node.position.y;\n\n //Update parent !\n if (newParentId) {\n var parent = node.data.parent;\n if (parent) {\n node.data.parent = newParentId;\n }\n }\n\n //Create new real time node\n var newNodeId = self.getCustomObjId();\n oldIdNewIdMap[node.data.id] = newNodeId;\n var newNode = self.nodeInitializer(node.data);\n newNode.id = newNodeId;\n self.insertShareDBObject(self.NODEMAP_NAME, newNodeId, newNode);\n\n //If node has children recursively traverse sub graphs and update parent field of child nodes\n if (node.children.length > 0) {\n for (const tmpNode of node.children) {\n traverseTree(tmpNode, newNodeId);\n }\n }\n }\n // At this point there exists another node in the graph with the same name as 'node'\n // we need to update parent field of children of this node if any\n else {\n var sameNameNode = realTimeNodeNameLookupTable[node.data.name];\n var sameNodeId = sameNameNode.id;\n oldIdNewIdMap[node.data.id] = sameNodeId;\n\n //If node has children recursively traverse sub graphs and update parent field of child nodes\n if (node.children.length > 0) {\n for (const tmpNode of node.children) {\n traverseTree(tmpNode, sameNodeId);\n }\n }\n }\n }\n\n //Traverse from root nodes of tree\n var tree = GraphUtilities.createGraphHierarchyRealTime(nodes);\n for (const rootLevelNode of tree) {\n traverseTree(rootLevelNode, rootLevelNode.data.id);\n }\n\n /*\n Create real time edges, update the source and target fields, since new ids will be generated for the nodes in\n real time\n */\n var ops = [];\n for (const edge of edges) {\n edge.data.source = oldIdNewIdMap[edge.data.source];\n edge.data.target = oldIdNewIdMap[edge.data.target];\n var newEdge = self.edgeInitializer(edge.data);\n var newEdgeID = this.getCustomObjId();\n newEdge.id = newEdgeID;\n ops.push({\n p: [self.EDGEMAP_NAME, newEdgeID],\n oi: newEdge\n });\n }\n self.applyShareDBOperation(ops);\n };\n\n updateLayoutProperties (newLayoutProperties) {\n this.updateShareDBLayoutProperties(newLayoutProperties);\n };\n\n updateGlobalOptions (newOptions) {\n this.updateShareDBGlobalOptions(newOptions);\n };\n\n updateGenomicDataOverlayColorScheme(newColorScheme: IColorValueMap) {\n this.updateShareDBGenomicDataOverlayColorScheme(newColorScheme);\n }\n\n /*\n * Creates graph hierarchy from given flat list of nodes list, nodes list is assumed to have parent-child\n * relationship by a field 'parent' which represents to the id of the parent node This function is specific\n * for the needs of TCGA Pathway Curation Tool 04/07/2016\n *\n * @param nodes {array}: flat list of nodes of a graph\n * @return {array}: Tree representation in array, entries are root level nodes. node.children gives children nodes\n * of each node in the returned array.\n * a node in corresponding level.\n *\n * */\n createGraphHierarchy (nodes) {\n //Some arrays and maps for creating graph hierarchy\n var tree = [];\n var mappedArr = {};\n\n // First map the nodes of the array to an object -> create a hash table.\n for (var i = 0, len = nodes.length; i < len; i++) {\n var arrElem = nodes[i];\n mappedArr[arrElem.data.id] = arrElem;\n mappedArr[arrElem.data.id].children = [];\n }\n\n for (const id of Object.keys(mappedArr)) {\n var mappedElem = mappedArr[id];\n\n // If the element is not at the root level, add it to its parent array of children.\n if (mappedElem.data.parent) {\n mappedArr[mappedElem.data.parent].children.push(mappedElem);\n }\n // If the element is at the root level, add it to first level elements array.\n else {\n tree.push(mappedElem);\n }\n }\n return tree;\n };\n\n //Makes sure that edge is compatible with edges in shared document\n edgeInitializer (params) {\n var edge: any = {};\n edge.id = params.id || this.getCustomObjId();\n edge.type = params.type || \"undefined\";\n edge.source = params.source || \"undefined\";\n edge.target = params.target || \"undefined\";\n edge.name = params.name || \"\";\n edge.isHighlighted = params.isHighlighted || false;\n edge.anchorPoints = params.anchorPoints || [];\n edge.edgeCurveStyle = params.edgeCurveStyle || \"bezier\"\n\n if (params.pubmedIDs) {\n if (edge.pubmedIDs == undefined) {\n edge.pubmedIDs = [];\n }\n if(params.pubmedIDs.length > 0)\n edge.pubmedIDs.push(params.pubmedIDs);\n }\n else {\n edge.pubmedIDs = [];\n }\n\n if (params.anchorPoints) {\n if (edge.anchorPoints == undefined) {\n edge.anchorPoints = [];\n }\n // legacy workaround\n if (Array.isArray(params.anchorPoints[0])) {\n edge.anchorPoints = params.anchorPoints[0];\n }\n else {\n edge.anchorPoints = params.anchorPoints;\n }\n }\n else {\n edge.anchorPoints = [];\n }\n return edge;\n };\n\n //Makes sure that node is compatible with nodes in shared document\n nodeInitializer(params) {\n var node: any = {};\n node.id = params.id || this.getCustomObjId();\n node.name = params.name || \"undefined\";\n node.type = params.type || \"undefined\";\n node.parent = params.parent || \"undefined\";\n node.x = params.x || \"undefined\";\n node.y = params.y || \"undefined\";\n node.w = params.w || \"undefined\";\n node.h = params.h || \"undefined\";\n node.minWidth = params.minWidth || 0;\n node.minWidthBiasLeft = params.minWidth || 0;\n node.minWidthBiasRight = params.minWidth || 0;\n node.minHeight = params.minWidth || 0;\n node.minHeightBiasTop = params.minWidth || 0;\n node.minHeightBiasBottom = params.minWidth || 0;\n node.isHidden = params.isHidden || false;\n node.isInvalidGene = params.isInvalidGene || false;\n node.isHighlighted = params.isHighlighted || false;\n return node;\n };\n\n //Makes sure that layout properties is compatible with layout properties in shared document\n layoutPropertiesInitializer (params) {\n var layoutProperties: any = {};\n layoutProperties.name = params.name || 'undefined';\n layoutProperties.nodeRepulsion = params.nodeRepulsion || 'undefined';\n // this.nodeOverlap = params.nodeOverlap || 'undefined';\n layoutProperties.idealEdgeLength = params.idealEdgeLength || 'undefined';\n layoutProperties.edgeElasticity = params.edgeElasticity || 'undefined';\n layoutProperties.nestingFactor = params.nestingFactor || 'undefined';\n layoutProperties.gravity = params.gravity || 'undefined';\n layoutProperties.numIter = params.numIter || 'undefined';\n layoutProperties.tile = params.tile || 'undefined';\n layoutProperties.animate = params.animate || 'undefined';\n layoutProperties.randomize = params.randomize || false;\n layoutProperties.gravityRangeCompound = params.gravityRangeCompound || 'undefined';\n layoutProperties.gravityCompound = params.gravityCompound || 'undefined';\n layoutProperties.gravityRange = params.gravityRange || 'undefined';\n layoutProperties.tilingPaddingVertical = params.tilingPaddingVertical || 'undefined';\n layoutProperties.tilingPaddingHorizontal = params.tilingPaddingHorizontal || 'undefined';\n layoutProperties.initialEnergyOnIncremental = params.initialEnergyOnIncremental || 'undefined';\n return layoutProperties;\n };\n\n //Makes sure that global options is compatible with global options in shared document\n globalOptionsInitializer (params) {\n var globalOptions: any = {};\n globalOptions.zoomLevel = params.zoomLevel || 'undefined';\n globalOptions.panLevel = params.panLevel || 'undefined';\n return globalOptions;\n };\n\n //Create unique ID for elements\n getCustomObjId () {\n // see http://stackoverflow.com/a/8809472\n // we need to take care of our own IDs because the ones automatically generated by cytoscape (also UUID)\n // don't comply with xsd:SID type that must not begin with a number\n // Public Domain/MIT\n var d = Date.now();\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n d += performance.now(); //use high-precision timer if available\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = (d + Math.random() * 16) % 16 | 0;\n d = Math.floor(d / 16);\n return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);\n });\n };\n\n getParam (urlParam) {\n const regExp = new RegExp(urlParam + '=(.*?)($|&)', 'g');\n let match: any = window.location.search.match(regExp);\n if (match && match.length) {\n match = match[0];\n match = match.replace(urlParam + '=', '').replace('&', '');\n } else {\n match = null;\n }\n return match;\n };\n\n}\n","/**\n * Created by istemi on 27.09.2016.\n */\n\nexport default class GraphUtilities {\n \n \n static createGraphHierarchy(nodes)\n {\n //Some arrays and maps for creating graph hierarchy\n var tree = [];\n var mappedArr = {};\n\n // First map the nodes of the array to an object -> create a hash table.\n for (var i = 0, len = nodes.length; i < len; i++)\n {\n var arrElem = nodes[i];\n mappedArr[arrElem.id()] = arrElem;\n mappedArr[arrElem.id()].childNodes = [];\n }\n\n for (var id in mappedArr)\n {\n var mappedElem = mappedArr[id];\n\n // If the element is not at the root level, add it to its parent array of children.\n if (mappedElem.parent().length > 0)\n {\n mappedArr[mappedElem.parent().id()].childNodes.push(mappedElem);\n }\n // If the element is at the root level, add it to first level elements array.\n else\n {\n tree.push(mappedElem);\n }\n }\n return tree;\n };\n\n /*\n * Creates graph hierarchy from given flat list of nodes list, nodes list is assumed to have parent-child\n * relationship by a field 'parent' which represents to the id of the parent node This function is specific\n * for the needs of TCGA Pathway Curation Tool 04/07/2016\n *\n * @param nodes {array}: flat list of nodes of a graph\n * @return {array}: Tree representation in array, entries are root level nodes. node.children gives children nodes\n * of each node in the returned array.\n * a node in corresponding level.\n *\n * */\n static createGraphHierarchyRealTime(nodes)\n {\n //Some arrays and maps for creating graph hierarchy\n var tree = [];\n var mappedArr = {};\n\n // First map the nodes of the array to an object -> create a hash table.\n for (var i = 0, len = nodes.length; i < len; i++)\n {\n var arrElem = nodes[i];\n mappedArr[arrElem.data.id] = arrElem;\n mappedArr[arrElem.data.id].children = [];\n }\n for (var id in mappedArr)\n {\n var mappedElem = mappedArr[id];\n\n // If the element is not at the root level, add it to its parent array of children.\n if (mappedElem.data.parent != -1)\n {\n mappedArr[mappedElem.data.parent].children.push(mappedElem);\n }\n // If the element is at the root level, add it to first level elements array.\n else\n {\n tree.push(mappedElem);\n }\n }\n return tree;\n };\n}","import EditorActionsManager from \"../managers/EditorActionsManager\";\nimport GraphUtilities from \"../utils/GraphUtilities\";\n\nexport default class SVGExporter {\n SVGNameSpace = \"http://www.w3.org/2000/svg\";\n svg = document.createElementNS(this.SVGNameSpace, \"svg\");\n NODE_FILL_COLOR = \"rgb(255,255,255)\";\n FAMILY_FILL_COLOR = \"rgb(255,255,255)\";\n FAMILY_STROKE_COLOR = \"rgb(204,204,204)\";\n NODE_STROKE_COLOR = \"rgb(0,0,0)\";\n COMPARTMENT_STROKE_WIDTH = 2;\n NODE_STROKE_WIDTH = 1;\n NODE_OPACITY = 0.5;\n ROUNDING_FACTOR = 6;\n GENOMICDATA_LABEL_Y_OFFSET = -15;\n EDGE_ARROW_SCALE = 1.7;\n EDGE_WIDTH = 1;\n T_ARROW_HEAD_WIDTH = 2 * this.EDGE_ARROW_SCALE;\n T_ARROW_HEAD_HEIGHT = 8 * this.EDGE_ARROW_SCALE;\n TRIANGLE_ARROW_HEAD_HEIGHT = 8 * this.EDGE_ARROW_SCALE;\n TRIANGLE_ARROW_HEAD_WIDTH = 8 * this.EDGE_ARROW_SCALE;\n DASH_PARAMETERS = \"5, 3\";\n COMPOUND_MARGIN = 8;\n NODE_FONT_SIZE = 14;\n\n edgeEditing: any;\n editor: EditorActionsManager;\n constructor(edgeEditing: any, editor: EditorActionsManager) {\n this.edgeEditing = edgeEditing;\n this.editor = editor;\n }\n\n resetSVG() {\n this.svg = document.createElementNS(this.SVGNameSpace, \"svg\");\n }\n\n exportGraph(nodes, edges) {\n //Reset SVG\n this.resetSVG();\n this.svg.setAttribute(\"version\", \"1.1\");\n this.svg.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n //Set viewport of output SVG\n var cyBounds = this.editor.cy.extent();\n this.svg.setAttribute(\n \"viewBox\",\n cyBounds.x1 + \" \" + cyBounds.y1 + \" \" + cyBounds.w + \" \" + cyBounds.h\n );\n\n var self = this;\n var nodeMap = {};\n\n var nodeTree = GraphUtilities.createGraphHierarchy(nodes);\n var traverseFunction = function(node) {\n //Create SVG for current node\n nodeMap[node.id()] = node;\n var genomicDataSVG = self.editor.getGenomicDataSVG(node).children;\n var oncoprintDataSVG = self.editor.getOncoprintDataSVG(node);\n self.svg.appendChild(self.createRect(node));\n var labelOffset =\n (genomicDataSVG && genomicDataSVG.length > 0) ||\n oncoprintDataSVG.outerHTML !== \"\"\n ? self.GENOMICDATA_LABEL_Y_OFFSET\n : 0;\n self.svg.appendChild(self.createNodeLabel(node, labelOffset));\n\n //Append Genomic Data SVG\n if (genomicDataSVG) {\n while (genomicDataSVG.length > 0) {\n var elemSVG = genomicDataSVG[0];\n var nodePosition = node.position();\n var svgX = elemSVG.getAttribute(\"x\");\n var svgY = elemSVG.getAttribute(\"y\");\n elemSVG.setAttribute(\n \"x\",\n nodePosition.x - node.width() / 2 + parseFloat(svgX)\n );\n elemSVG.setAttribute(\n \"y\",\n nodePosition.y - node.height() / 2 + parseFloat(svgY)\n );\n self.svg.appendChild(elemSVG);\n }\n }\n //Append Oncoprint Data SVG\n else if (oncoprintDataSVG.outerHTML !== \"\") {\n var nodePosition = node.position();\n\n const width = parseInt(oncoprintDataSVG.getAttribute(\"width\"));\n const height = parseInt(oncoprintDataSVG.getAttribute(\"height\"));\n const verticalPadding = 8;\n\n const y =\n nodePosition.y + node.height() / 2 - (height + verticalPadding);\n oncoprintDataSVG.setAttribute(\"x\", nodePosition.x - width / 2);\n oncoprintDataSVG.setAttribute(\"y\", y);\n self.svg.appendChild(oncoprintDataSVG);\n }\n\n //Traverse children\n if (node.childNodes) {\n for (var i in node.childNodes) {\n traverseFunction(node.childNodes[i]);\n }\n }\n };\n\n //Traverse node hierarchy\n for (var i in nodeTree) {\n var rootLevelNode = nodeTree[i];\n traverseFunction(rootLevelNode);\n }\n\n edges.forEach(function(edge) {\n self.drawEdge(edge);\n });\n\n return this.svg.outerHTML;\n }\n\n drawEdge(edge) {\n const sourceEndpoint = edge.sourceEndpoint();\n const targetEndpoint = edge.targetEndpoint();\n const targetArrowShape = edge.style(\"target-arrow-shape\");\n const lineStyle = edge.style(\"line-style\");\n const curveStyle = edge.style(\"curve-style\");\n const anchorPoints = curveStyle === \"segments\" ? \n edge.segmentPoints() : \n edge.controlPoints();\n\n const labelElement = this.createEdgeLabel(edge);\n if (labelElement) {\n this.svg.appendChild(labelElement);\n }\n\n let lastAnchor = {\n x: sourceEndpoint.x,\n y: sourceEndpoint.y\n }\n let edgeEndpoint = {\n x: targetEndpoint.x,\n y: targetEndpoint.y\n };\n\n if (anchorPoints && anchorPoints.length > 0) {\n lastAnchor = {\n x: anchorPoints[anchorPoints.length - 1].x,\n y: anchorPoints[anchorPoints.length - 1].y\n }\n }\n\n var unitV = this.unitVector({\n x: targetEndpoint.x - lastAnchor.x,\n y: targetEndpoint.y - lastAnchor.y,\n });\n var inverseUnitV = this.scale(unitV, -1);\n\n var targetX = targetEndpoint.x;\n var targetY = targetEndpoint.y;\n\n //Draw Triangle arrow head\n if (targetArrowShape === \"triangle\") {\n targetX =\n targetEndpoint.x +\n this.TRIANGLE_ARROW_HEAD_HEIGHT * inverseUnitV.x;\n targetY =\n targetEndpoint.y +\n this.TRIANGLE_ARROW_HEAD_HEIGHT * inverseUnitV.y;\n\n var point1Vector = this.rotateVector(unitV, Math.PI / 2);\n var point2Vector = this.rotateVector(unitV, -Math.PI / 2);\n\n point1Vector = this.scale(\n point1Vector,\n this.TRIANGLE_ARROW_HEAD_WIDTH / 2\n );\n point2Vector = this.scale(\n point2Vector,\n this.TRIANGLE_ARROW_HEAD_WIDTH / 2\n );\n\n var point1X = targetX + point1Vector.x;\n var point1Y = targetY + point1Vector.y;\n\n var point2X = targetX + point2Vector.x;\n var point2Y = targetY + point2Vector.y;\n\n edgeEndpoint = {\n x: (point1X + point2X) / 2,\n y: (point1Y + point2Y) / 2\n }\n\n var polySVG = document.createElementNS(this.SVGNameSpace, \"polygon\");\n polySVG.setAttribute(\n \"points\",\n point1X +\n \",\" +\n point1Y +\n \",\" +\n point2X +\n \",\" +\n point2Y +\n \",\" +\n targetEndpoint.x +\n \",\" +\n targetEndpoint.y\n );\n\n this.svg.appendChild(polySVG);\n }\n //Draw T type arrow head\n else if (targetArrowShape === \"tee\") {\n targetX =\n targetEndpoint.x \n targetY =\n targetEndpoint.y \n\n //Calculate T shape points\n var point1Vector = this.rotateVector(unitV, Math.PI / 2);\n var point2Vector = this.rotateVector(unitV, -Math.PI / 2);\n point1Vector = this.scale(point1Vector, this.T_ARROW_HEAD_HEIGHT / 2);\n point2Vector = this.scale(point2Vector, this.T_ARROW_HEAD_HEIGHT / 2);\n\n var point1X = targetX + point1Vector.x;\n var point1Y = targetY + point1Vector.y;\n var point2X = targetX + point2Vector.x;\n var point2Y = targetY + point2Vector.y;\n\n edgeEndpoint = {\n x: (point1X + point2X) / 2,\n y: (point1Y + point2Y) / 2\n }\n\n //Draw edge arrow line here !\n var lineSVG = document.createElementNS(this.SVGNameSpace, \"line\");\n lineSVG.setAttribute(\"x1\", point1X);\n lineSVG.setAttribute(\"y1\", point1Y);\n lineSVG.setAttribute(\"x2\", point2X);\n lineSVG.setAttribute(\"y2\", point2Y);\n lineSVG.setAttribute(\"stroke-width\", this.T_ARROW_HEAD_WIDTH.toString());\n lineSVG.setAttribute(\"stroke\", \"black\");\n this.svg.appendChild(lineSVG);\n }\n \n // no anchors means a single line connecting source and target end points\n if (!anchorPoints || anchorPoints.length < 1) {\n const lineSVG = document.createElementNS(this.SVGNameSpace, \"line\");\n lineSVG.setAttribute(\"x1\", sourceEndpoint.x);\n lineSVG.setAttribute(\"y1\", sourceEndpoint.y);\n lineSVG.setAttribute(\"x2\", edgeEndpoint.x);\n lineSVG.setAttribute(\"y2\", edgeEndpoint.y);\n lineSVG.setAttribute(\"stroke-width\", this.EDGE_WIDTH.toString());\n lineSVG.setAttribute(\"stroke\", \"black\");\n if (lineStyle === \"dashed\") {\n lineSVG.setAttribute(\"stroke-dasharray\", this.DASH_PARAMETERS);\n }\n this.svg.appendChild(lineSVG);\n }\n else if (curveStyle === \"unbundled-bezier\" || curveStyle === \"bezier\") {\n const pathSVG = document.createElementNS(this.SVGNameSpace, \"path\");\n let pathPoints: string[] = [];\n\n for (let i = 0; i < anchorPoints.length; i++) {\n if (i === 0) {\n pathPoints.push(\"M\" + sourceEndpoint.x + \",\" + sourceEndpoint.y);\n pathPoints.push(\"Q\" + anchorPoints[i].x + \",\" + anchorPoints[i].y);\n if (anchorPoints.length === 1) {\n pathPoints.push(edgeEndpoint.x + \",\" + edgeEndpoint.y);\n }\n else {\n const furtherEndPoint = {\n x: (anchorPoints[i].x + anchorPoints[i+1].x) / 2,\n y: (anchorPoints[i].y + anchorPoints[i+1].y) / 2 \n }\n pathPoints.push(furtherEndPoint.x + \",\" + furtherEndPoint.y);\n }\n }\n else {\n if (i < anchorPoints.length - 1) {\n const furtherEndPoint = {\n x: (anchorPoints[i].x + anchorPoints[i+1].x) / 2,\n y: (anchorPoints[i].y + anchorPoints[i+1].y) / 2 \n }\n pathPoints.push(\"T\" + furtherEndPoint.x + \",\" + furtherEndPoint.y);\n }\n else {\n pathPoints.push(\"T\" + edgeEndpoint.x + \",\" + edgeEndpoint.y);\n }\n }\n }\n pathSVG.setAttribute(\n 'd',\n pathPoints.join(\" \")\n );\n pathSVG.setAttribute('stroke-width', this.EDGE_WIDTH.toString());\n pathSVG.setAttribute('stroke', 'black');\n if (lineStyle === \"dashed\") {\n pathSVG.setAttribute(\"stroke-dasharray\", this.DASH_PARAMETERS);\n }\n pathSVG.setAttribute('fill', 'none');\n this.svg.appendChild(pathSVG);\n }\n // anchors means polyline\n else {\n const polylineSVG = document.createElementNS(this.SVGNameSpace, \"polyline\");\n let polylinePoints: string[] = [];\n\n for (let i = 0; i < anchorPoints.length; i++) {\n if (i === 0) {\n polylinePoints.push(sourceEndpoint.x + \",\" + sourceEndpoint.y);\n polylinePoints.push(anchorPoints[i].x + \",\" + anchorPoints[i].y);\n if (anchorPoints.length === 1) {\n polylinePoints.push(edgeEndpoint.x + \",\" + edgeEndpoint.y);\n }\n }\n else if (i === anchorPoints.length - 1) {\n polylinePoints.push(anchorPoints[i].x + \",\" + anchorPoints[i].y);\n polylinePoints.push(edgeEndpoint.x + \",\" + edgeEndpoint.y);\n }\n else {\n polylinePoints.push(anchorPoints[i].x + \",\" + anchorPoints[i].y);\n }\n }\n polylineSVG.setAttribute(\n 'points',\n polylinePoints.join(\" \")\n );\n polylineSVG.setAttribute('stroke-width', this.EDGE_WIDTH.toString());\n polylineSVG.setAttribute('stroke', 'black');\n if (lineStyle === \"dashed\") {\n lineSVG.setAttribute(\"stroke-dasharray\", this.DASH_PARAMETERS);\n }\n polylineSVG.setAttribute('fill', 'none');\n this.svg.appendChild(polylineSVG);\n }\n \n }\n\n createRect(node) {\n var nodeRectangle = document.createElementNS(this.SVGNameSpace, \"rect\");\n var nodePosition = node.position();\n if (node.isParent()) {\n nodeRectangle.setAttribute(\n \"x\",\n nodePosition.x - node.width() / 2 - this.COMPOUND_MARGIN / 2 + \"\"\n );\n nodeRectangle.setAttribute(\n \"y\",\n nodePosition.y - node.height() / 2 - this.COMPOUND_MARGIN / 2 + \"\"\n );\n nodeRectangle.setAttribute(\"width\", node.width() + this.COMPOUND_MARGIN);\n nodeRectangle.setAttribute(\n \"height\",\n node.height() + this.COMPOUND_MARGIN\n );\n } else {\n nodeRectangle.setAttribute(\"x\", nodePosition.x - node.width() / 2 + \"\");\n nodeRectangle.setAttribute(\"y\", nodePosition.y - node.height() / 2 + \"\");\n nodeRectangle.setAttribute(\"width\", node.width());\n nodeRectangle.setAttribute(\"height\", node.height());\n }\n\n nodeRectangle = this.createStyleForNodes(node, nodeRectangle);\n\n return nodeRectangle;\n }\n\n createNodeLabel(node, genomicDataOffset) {\n var verticalTextOffset = 5;\n var nodePosition = node.position();\n var svgText = document.createElementNS(this.SVGNameSpace, \"text\");\n\n if (node.isParent()) {\n verticalTextOffset = 20;\n svgText.setAttribute(\"x\", nodePosition.x);\n svgText.setAttribute(\n \"y\",\n nodePosition.y + node.height() / 2 + verticalTextOffset\n );\n } else {\n svgText.setAttribute(\"x\", nodePosition.x);\n svgText.setAttribute(\n \"y\",\n nodePosition.y + verticalTextOffset + genomicDataOffset\n );\n }\n\n svgText.setAttribute(\"font-family\", \"Arial\");\n svgText.setAttribute(\"text-anchor\", \"middle\");\n svgText.setAttribute(\"font-size\", this.NODE_FONT_SIZE.toString());\n svgText.innerHTML = node.data(\"name\");\n return svgText;\n }\n\n createStyleForNodes(node, nodeRectangle) {\n var nodeType = node.data().type;\n var strokeWidth = node.css(\"border-width\") || this.NODE_STROKE_WIDTH;\n var strokeColor = this.NODE_STROKE_COLOR;\n var fillColor = this.NODE_FILL_COLOR;\n var opacity = this.NODE_OPACITY;\n var strokeOpacity = 1;\n\n if (nodeType == \"GENE\" || nodeType == \"COMPARTMENT\") {\n nodeRectangle.setAttribute(\"rx\", this.ROUNDING_FACTOR);\n nodeRectangle.setAttribute(\"ry\", this.ROUNDING_FACTOR);\n\n if (nodeType == \"COMPARTMENT\")\n strokeWidth = this.COMPARTMENT_STROKE_WIDTH;\n }\n\n if (nodeType == \"PROCESS\") {\n opacity = 0;\n strokeOpacity = 0;\n }\n\n if (nodeType == \"FAMILY\") {\n fillColor = this.FAMILY_FILL_COLOR;\n strokeColor = this.FAMILY_STROKE_COLOR;\n }\n\n var styleString =\n \"stroke-width:\" +\n strokeWidth +\n \";\" +\n \"stroke:\" +\n strokeColor +\n \";\" +\n \"fill-opacity:\" +\n opacity +\n \";\" +\n \"fill:\" +\n fillColor +\n \";\" +\n \"stroke-opacity:\" +\n strokeOpacity +\n \";\";\n\n nodeRectangle.setAttribute(\"style\", styleString);\n\n return nodeRectangle;\n }\n\n createEdgeLabel(edge) {\n const labelText = edge.data(\"name\");\n \n if (labelText === \"\") {\n return undefined;\n }\n const svgTextElement = document.createElementNS(this.SVGNameSpace, \"text\");\n\n const fontSize = edge.style(\"font-size\");\n const fontFamily = edge.style(\"font-family\");\n\n // get rotation angle in degrees for transform: rotate()\n const labelRotationAngle = this.getEdgeLabelRotationAngle(edge);\n const lineHeight = edge._private.rscratch.labelLineHeight;\n\n // adjust margins to compensate for the label hack (see stylesheet)\n const dx = (lineHeight / 4) * Math.sin(edge._private.rscratch.labelAngle);\n const dy = (lineHeight / 4) * Math.cos(edge._private.rscratch.labelAngle);\n\n const labelPos = {\n x: edge._private.rscratch.labelX + dx,\n y: edge._private.rscratch.labelY - dy\n }\n\n svgTextElement.setAttribute('x', labelPos.x.toString());\n svgTextElement.setAttribute('y', labelPos.y.toString());\n svgTextElement.setAttribute(\"font-family\", fontFamily);\n svgTextElement.setAttribute(\"text-anchor\", \"middle\");\n svgTextElement.setAttribute(\"font-size\", fontSize);\n\n svgTextElement.innerHTML = labelText;\n\n // adjusting for autorotate option\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#rotate \n svgTextElement.setAttribute(\n \"transform\", \n \"rotate(\" + \n labelRotationAngle +\n \" \" +\n labelPos.x.toString() +\n \" \" +\n labelPos.y.toString()+\n \")\");\n\n return svgTextElement;\n }\n\n getEdgeLabelRotationAngle(edge) {\n const labelAngle = edge._private.rscratch.labelAngle;\n\n if (!labelAngle) {\n return 0;\n }\n\n return this.toDegrees(labelAngle);\n }\n\n toDegrees(radians) {\n const pi = Math.PI;\n return radians * (180/pi);\n }\n\n unitVector(v) {\n var inverseLength = 1 / Math.sqrt(v.x * v.x + v.y * v.y);\n\n return {\n x: v.x * inverseLength,\n y: v.y * inverseLength,\n };\n }\n\n rotateVector(v, radians) {\n var newX = v.x * Math.cos(radians) - v.y * Math.sin(radians);\n var newY = v.x * Math.sin(radians) + v.y * Math.cos(radians);\n\n return { x: newX, y: newY };\n }\n\n scale(v, scalar) {\n var newX = v.x * scalar;\n var newY = v.y * scalar;\n\n return { x: newX, y: newY };\n }\n}\n","import $ from \"jquery\";\nimport { GeneticAlterationRuleSet, shapeToSvg } from \"oncoprintjs\";\nimport tippy from \"tippy.js\";\nimport \"tippy.js/dist/tippy.css\"; // optional for styling\nimport { IColorValueMap } from \"../ui/react-pathway-mapper\";\n\ninterface Color {\n r: number;\n g: number;\n b: number;\n}\n\ninterface ValueColorPair {\n value: number;\n color: Color;\n}\nexport default class GenomicDataOverlayManager {\n public genomicDataMap: {};\n public visibleGenomicDataMapByType: {};\n public groupedGenomicDataCount: number;\n public groupedGenomicDataMap: {};\n public patientData: any;\n private DEFAULT_VISIBLE_GENOMIC_DATA_COUNT: number;\n private observers: any[];\n private cy: any;\n private colorScheme: IColorValueMap;\n\n constructor(cy: any) {\n this.cy = cy;\n this.genomicDataMap = {};\n this.patientData = {};\n this.visibleGenomicDataMapByType = {};\n this.groupedGenomicDataMap = {};\n this.groupedGenomicDataCount = 0;\n this.DEFAULT_VISIBLE_GENOMIC_DATA_COUNT = 6;\n this.colorScheme = {\n \"-100\": \"#0000ff\",\n \"0\": \"#ffffff\",\n \"100\": \"#ff0000\",\n };\n // Observer-observable pattern related stuff\n this.observers = [];\n }\n\n getEmptyGroupID() {\n const oldCount = this.groupedGenomicDataCount;\n this.groupedGenomicDataCount++;\n return oldCount;\n }\n\n addGenomicDataLocally(genomicData, groupID) {\n this.parseGenomicData(genomicData, groupID);\n this.showGenomicData();\n this.notifyObservers();\n }\n\n preparePortalGenomicDataShareDB(genomicData) {\n const geneMap = {};\n const visMap = {};\n\n for (const cancerKey in genomicData) {\n for (const geneSymbol in genomicData[cancerKey]) {\n geneMap[geneSymbol] = {};\n geneMap[geneSymbol][cancerKey] = genomicData[cancerKey][geneSymbol];\n }\n\n visMap[cancerKey] = true;\n }\n\n return {\n genomicDataMap: geneMap,\n visibilityMap: visMap,\n };\n }\n\n addGenomicData(data) {\n this.genomicDataMap = data;\n }\n\n removeGenomicVisData() {\n this.visibleGenomicDataMapByType = {};\n }\n\n addGenomicDataWithGeneSymbol(geneSymbol, data) {\n this.genomicDataMap[geneSymbol] = data;\n }\n\n addGenomicGroupData(groupID, data) {\n this.groupedGenomicDataMap[groupID] = data;\n }\n\n addPortalGenomicData(data, groupID) {\n for (const cancerStudy of Object.keys(data)) {\n this.visibleGenomicDataMapByType[cancerStudy] = true;\n // Group current cancer study according to the groupID\n if (this.groupedGenomicDataMap[groupID] === undefined) {\n this.groupedGenomicDataMap[groupID] = [];\n }\n\n this.groupedGenomicDataMap[groupID].push(cancerStudy);\n\n var cancerData = data[cancerStudy];\n\n for (const geneSymbol of Object.keys(cancerData)) {\n if (this.genomicDataMap[geneSymbol] === undefined)\n this.genomicDataMap[geneSymbol] = {};\n\n this.genomicDataMap[geneSymbol][cancerStudy] = data[cancerStudy][\n geneSymbol\n ].toFixed\n ? data[cancerStudy][geneSymbol].toFixed(2)\n : data[cancerStudy][geneSymbol];\n }\n }\n //This parameter is used as flag for PatientView PathwayMapper Functions\n if (data[\"PatientView\"] == 1) {\n this.patientData = data;\n this.showPatientData();\n } else {\n this.showGenomicData();\n }\n this.notifyObservers();\n }\n\n clearAllGenomicData = function() {\n this.genomicDataMap = {};\n this.visibleGenomicDataMapByType = {};\n this.groupedGenomicDataMap = {};\n this.groupedGenomicDataCount = 0;\n };\n\n removeGenomicData() {\n this.genomicDataMap = {};\n }\n\n removeGenomicDataWithGeneSymbol(geneSymbol) {\n this.genomicDataMap[geneSymbol] = {};\n }\n\n addGenomicVisData(key, data) {\n this.visibleGenomicDataMapByType[key] = data;\n }\n\n prepareGenomicDataShareDB = function(genomicData) {\n const genomicDataMap = {};\n const cancerTypes = [];\n const visibleGenomicDataMapByType = {};\n\n // By lines\n const lines = genomicData.split(\"\\n\");\n // First line is meta data !\n const metaLineColumns = lines[0].split(\"\\t\");\n\n // Parse cancer types\n for (let i = 1; i < metaLineColumns.length; i++) {\n cancerTypes.push(metaLineColumns[i]);\n // Update initially visible genomic data boxes !\n if (i - 1 < this.DEFAULT_VISIBLE_GENOMIC_DATA_COUNT) {\n visibleGenomicDataMapByType[cancerTypes[i - 1]] = true;\n } else {\n visibleGenomicDataMapByType[cancerTypes[i - 1]] = false;\n }\n }\n\n // parse genomic data\n for (let i = 1; i < lines.length; i++) {\n // EOF check\n if (lines[i].length === 0) {\n break;\n }\n\n // Split each line by tab and parse genomic data content\n const lineContent = lines[i].split(\"\\t\");\n const geneSymbol = lineContent[0];\n\n // If current gene entry is not in genomic data map create new hashmap entry\n if (!(geneSymbol in genomicDataMap)) {\n genomicDataMap[geneSymbol] = {};\n }\n\n // Add each entry of genomic data\n for (let j = 1; j < lineContent.length; j++) {\n genomicDataMap[geneSymbol][cancerTypes[j - 1]] = lineContent[j];\n }\n }\n\n const returnObj = {\n genomicDataMap: genomicDataMap,\n visibilityMap: visibleGenomicDataMapByType,\n };\n\n return returnObj;\n };\n\n updateGenomicDataVisibility = function(_key, isVisible) {\n if (_key in this.visibleGenomicDataMapByType) {\n this.visibleGenomicDataMapByType[_key] = isVisible;\n }\n };\n\n hideGenomicData = function() {\n\n this.cy.nodes('[type=\"GENE\"]').forEach(node => {\n node.data('w', this.getRequiredWidthForGenomicData(0));\n })\n\n this.cy\n .style()\n .selector('node[type=\"GENE\"]')\n .style(\"text-margin-y\", 0)\n .style(\"background-image\", function(ele) {\n const dataURI = \"data:image/svg+xml;utf8,\";\n return dataURI;\n })\n .update();\n };\n\n countVisibleGenomicDataByType() {\n // Count the genomic data that will be displayed on nodes' body\n let genomicDataBoxCount = 0;\n for (let cancerType in this.visibleGenomicDataMapByType) {\n if (this.visibleGenomicDataMapByType[cancerType]) {\n genomicDataBoxCount++;\n }\n }\n\n return genomicDataBoxCount;\n }\n\n generateSVGForNode(ele) {\n const genomicDataBoxCount = this.countVisibleGenomicDataByType();\n\n // Experimental data overlay part !\n const dataURI = \"data:image/svg+xml;utf8,\";\n const svgNameSpace = \"http://www.w3.org/2000/svg\";\n\n const nodeLabel = ele.data(\"name\");\n // If there is no genomic data for this node return !\n if (!(nodeLabel in this.genomicDataMap)) {\n return dataURI;\n }\n\n const eleBBox = ele.boundingBox();\n const reqWidth = this.getRequiredWidthForGenomicData(genomicDataBoxCount);\n const overlayRecBoxW = reqWidth - 10;\n const overlayRecBoxH = 25;\n const svg: any = document.createElementNS(svgNameSpace, \"svg\");\n // It seems this should be set according to the node size !\n svg.setAttribute(\"width\", reqWidth);\n svg.setAttribute(\"height\", eleBBox.h);\n // This is important you need to include this to succesfully render in cytoscape.js!\n svg.setAttribute(\"xmlns\", svgNameSpace);\n\n // Overlay Data Rect\n const overLayRectBBox = {\n w: overlayRecBoxW,\n h: overlayRecBoxH,\n x: reqWidth / 2 - overlayRecBoxW / 2,\n y: eleBBox.h / 2 + overlayRecBoxH / 2 - 18,\n };\n\n const genomicFrequencyData = this.genomicDataMap[nodeLabel];\n\n let maxGenomicDataBoxCount = /*(genomicDataBoxCount > 3) ? 3:*/ genomicDataBoxCount;\n let genomicBoxCounter = 0;\n\n for (let i in this.groupedGenomicDataMap) {\n for (let j in this.groupedGenomicDataMap[i]) {\n const cancerType = this.groupedGenomicDataMap[i][j];\n if (!this.visibleGenomicDataMapByType[cancerType]) {\n continue;\n }\n\n if (genomicFrequencyData[cancerType] !== undefined) {\n genomicDataRectangleGenerator(\n overLayRectBBox.x +\n (genomicBoxCounter * overLayRectBBox.w) / maxGenomicDataBoxCount,\n overLayRectBBox.y,\n overLayRectBBox.w / maxGenomicDataBoxCount,\n overLayRectBBox.h,\n genomicFrequencyData[cancerType],\n svg,\n this.colorScheme\n );\n } else {\n genomicDataRectangleGenerator(\n overLayRectBBox.x +\n (genomicBoxCounter * overLayRectBBox.w) / maxGenomicDataBoxCount,\n overLayRectBBox.y,\n overLayRectBBox.w / maxGenomicDataBoxCount,\n overLayRectBBox.h,\n null,\n svg,\n this.colorScheme\n );\n }\n\n genomicBoxCounter++;\n }\n }\n\n function hexToRGB(hex: string) {\n var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : null;\n }\n\n function swap(a, b) {\n let temp = a;\n a = b;\n b = temp;\n }\n\n function findValueColorInterval(\n colorScheme: IColorValueMap,\n value: number\n ): { lower: ValueColorPair; upper: ValueColorPair } {\n const pairs = Object.entries(colorScheme)\n .map(([value, color]) => {\n return {\n value: Number(value),\n color: hexToRGB(color),\n };\n })\n .sort((o1, o2) => {\n return o1.value - o2.value;\n });\n\n if (value < pairs[0].value) {\n return {\n lower: {\n value: -Infinity,\n color: pairs[0].color,\n },\n upper: {\n value: pairs[0].value,\n color: pairs[0].color,\n },\n };\n } else if (value > pairs[pairs.length - 1].value) {\n return {\n lower: {\n value: pairs[pairs.length - 1].value,\n color: pairs[pairs.length - 1].color,\n },\n upper: {\n value: Infinity,\n color: pairs[pairs.length - 1].color,\n },\n };\n } else {\n for (let i = 0; i < pairs.length - 1; i++) {\n if (value >= pairs[i].value && value < pairs[i + 1].value) {\n return {\n lower: {\n value: pairs[i].value,\n color: pairs[i].color,\n },\n upper: {\n value: pairs[i + 1].value,\n color: pairs[i + 1].color,\n },\n };\n }\n }\n\n return {\n lower: {\n value: -Infinity,\n color: pairs[0].color,\n },\n upper: {\n value: Infinity,\n color: pairs[pairs.length - 1].color,\n },\n };\n }\n }\n\n /**\n * Map the percentage value to r,g,b values using a log scale, i.e instead of taking the ratio linearly by taking differences\n * between the lower and upper color r,g,b values, take the differences between their Math.log values. This makes the color\n * scale up to the upper value much quicker, i.e in a 0-100 mapping a value of 20 doesn't map to 1/5 way between two colors\n * but closer to half way. This is done because high numbers in alteration values are extremely rare and even small numbers\n * are usually significant.\n */\n function getMappedColor(\n lowerColor: Color,\n upperColor: Color,\n lowerValue: number,\n upperValue: number,\n percent: number\n ): Color {\n const up = Math.log(1 + upperValue);\n const low = Math.log(1 + lowerValue);\n const p = Math.log(1 + (percent >= 0 ? percent : percent * -1));\n\n // arbitrary value used to slow down the scaling of log instead of getting too much into math\n const scalingFactor = percent >= 0 ? 0.8 : 1.2;\n\n const ratio = ((p - low) / (up - low)) * scalingFactor;\n\n return {\n r: lowerColor.r + ratio * (upperColor.r - lowerColor.r),\n g: lowerColor.g + ratio * (upperColor.g - lowerColor.g),\n b: lowerColor.b + ratio * (upperColor.b - lowerColor.b),\n };\n }\n\n function genomicDataRectangleGenerator(\n x,\n y,\n w,\n h,\n percent,\n parentSVG,\n colorScheme\n ) {\n const limits = findValueColorInterval(colorScheme, Number(percent));\n let color: Color = { r: 255, g: 255, b: 255 };\n if (limits.lower.value === -Infinity) {\n color = limits.upper.color;\n } else if (limits.upper.value === Infinity) {\n color = limits.lower.color;\n } else {\n let upperValue = limits.upper.value;\n let lowerValue = limits.lower.value;\n let upperColor = limits.upper.color;\n let lowerColor = limits.lower.color;\n\n if (lowerValue < 0 && upperValue <= 0) {\n lowerValue *= -1;\n upperValue *= -1;\n swap(lowerValue, upperValue);\n } else if (lowerValue < 0 && upperValue > 0) {\n upperValue += lowerValue * -1;\n lowerValue = 0;\n }\n\n color = getMappedColor(\n lowerColor,\n upperColor,\n lowerValue,\n upperValue,\n Number(percent)\n );\n }\n\n let colorString = \"\";\n if (percent) {\n colorString = `rgb(${Math.round(color.r)}, ${Math.round(\n color.g\n )}, ${Math.round(color.b)})`;\n // Rectangle Part\n const overlayRect = document.createElementNS(svgNameSpace, \"rect\");\n overlayRect.setAttribute(\"x\", x);\n overlayRect.setAttribute(\"y\", y);\n overlayRect.setAttribute(\"width\", w);\n overlayRect.setAttribute(\"height\", h);\n overlayRect.setAttribute(\n \"style\",\n \"stroke-width:1;stroke:rgb(0,0,0);opacity:1;fill:\" + colorString + \";\"\n );\n\n // Text Part\n if (percent[0] === \"-\") {\n percent = percent.substr(1);\n }\n const textPercent =\n percent < 0.5 && percent > 0 ? \"<0.5\" : Number(percent).toFixed(1);\n const text = percent == -101 ? \"N/P\" : textPercent + \"%\";\n const fontSize = 14;\n const textLength = text.length;\n const xOffset = w / 2 - textLength * 4;\n const yOffset = fontSize / 3;\n\n const svgText = document.createElementNS(svgNameSpace, \"text\");\n svgText.setAttribute(\"x\", x + xOffset);\n svgText.setAttribute(\"y\", y + h / 2 + yOffset);\n svgText.setAttribute(\"font-family\", \"Arial\");\n svgText.setAttribute(\"font-size\", fontSize + \"\");\n svgText.innerHTML = text;\n\n parentSVG.appendChild(overlayRect);\n parentSVG.appendChild(svgText);\n } else {\n colorString = \"rgb(210,210,210)\";\n\n // Rectangle Part\n const overlayRect = document.createElementNS(svgNameSpace, \"rect\");\n overlayRect.setAttribute(\"x\", x);\n overlayRect.setAttribute(\"y\", y);\n overlayRect.setAttribute(\"width\", w);\n overlayRect.setAttribute(\"height\", h);\n overlayRect.setAttribute(\n \"style\",\n \"stroke-width:1;stroke:rgb(0,0,0);opacity:1;fill:\" + colorString + \";\"\n );\n\n parentSVG.appendChild(overlayRect);\n }\n }\n\n return svg;\n }\n\n // Just an utility function to calculate required width for genes for genomic data !\n getRequiredWidthForGenomicData(genomicDataBoxCount) {\n const term = genomicDataBoxCount > 3 ? genomicDataBoxCount - 3 : 0;\n return 150 + term * 35;\n }\n\n updateColorScheme(colorValueMap: IColorValueMap) {\n this.colorScheme = colorValueMap;\n }\n\n showGenomicData() {\n const self = this;\n\n const genomicDataBoxCount = this.countVisibleGenomicDataByType();\n\n if (genomicDataBoxCount < 1) {\n // Hide all genomic data and return\n this.hideGenomicData();\n return;\n }\n\n this.cy.nodes('[type=\"GENE\"]').forEach(node => {\n node.data('w', this.getRequiredWidthForGenomicData(genomicDataBoxCount));\n });\n\n this.cy\n .style()\n .selector('node[type=\"GENE\"]')\n .style(\"text-margin-y\", function(ele) {\n const nodeLabel = ele.data(\"name\");\n // If there is no genomic data for this node return !\n if (!(nodeLabel in self.genomicDataMap)) {\n return 0;\n }\n\n // Else shift label in Y axis\n return -15;\n })\n .style(\"background-image\", function(ele) {\n const x = encodeURIComponent(self.generateSVGForNode(ele).outerHTML);\n if (x === \"undefined\") {\n return \"none\";\n }\n const dataURI = \"data:image/svg+xml;utf8,\" + x;\n return dataURI;\n })\n .update();\n }\n\n parseGenomicData(genomicData, groupID) {\n this.genomicDataMap = this.genomicDataMap || {};\n this.visibleGenomicDataMapByType = this.visibleGenomicDataMapByType || {};\n this.groupedGenomicDataMap = this.groupedGenomicDataMap || {};\n const cancerTypes = [];\n\n // By lines\n const lines = genomicData.split(\"\\n\");\n // First line is meta data !\n const metaLineColumns = lines[0].split(\"\\t\");\n\n // Parse cancer types\n for (let i = 1; i < metaLineColumns.length; i++) {\n cancerTypes.push(metaLineColumns[i]);\n const visibleGenomicDataCount = Object.keys(this.visibleGenomicDataMapByType).length;\n // Update initially visible genomic data boxes !\n if (visibleGenomicDataCount < this.DEFAULT_VISIBLE_GENOMIC_DATA_COUNT) {\n this.visibleGenomicDataMapByType[cancerTypes[i - 1]] = true;\n } else {\n this.visibleGenomicDataMapByType[cancerTypes[i - 1]] = false;\n }\n\n if (this.groupedGenomicDataMap[groupID] === undefined) {\n this.groupedGenomicDataMap[groupID] = [];\n }\n this.groupedGenomicDataMap[groupID].push(cancerTypes[i - 1]);\n }\n\n // parse genomic data\n for (let i = 1; i < lines.length; i++) {\n // EOF check\n if (lines[i].length === 0) {\n break;\n }\n\n // Split each line by tab and parse genomic data content\n const lineContent = lines[i].split(\"\\t\");\n const geneSymbol = lineContent[0];\n\n // If current gene entry is not in genomic data map create new map\n if (!(geneSymbol in this.genomicDataMap)) {\n this.genomicDataMap[geneSymbol] = {};\n }\n\n // Add each entry of genomic data\n for (let j = 1; j < lineContent.length; j++) {\n this.genomicDataMap[geneSymbol][cancerTypes[j - 1]] = lineContent[j];\n }\n }\n }\n\n // Simple observer-observable pattern for views!!!!!\n registerObserver(observer) {\n this.observers.push(observer);\n }\n\n notifyObservers() {\n for (const observer of this.observers) {\n observer.notify();\n }\n }\n\n //This method is needed to calculate the alteration Types for each gene\n getAlterationCountForPatient(geneData) {\n let count = 0;\n for (let altType in geneData) {\n count++;\n }\n return count;\n }\n\n //These methods are created to be used in CbioPortal PatientView they are not used\n //in ResultView Page or PathwayMapper Editor\n\n showPatientData() {\n const self = this;\n\n const data = this.patientData;\n\n // const genomicDataBoxCount = 3 //this.countVisibleGenomicDataByType(); //CHANGE\n const genomicDataBoxCount = data.geneticTrackData\n ? data.geneticTrackData.length\n : 3;\n if (genomicDataBoxCount < 1) {\n // Hide all genomic data and return\n this.hideGenomicData();\n return;\n }\n\n this.cy\n .style()\n .selector('node[type=\"GENE\"]')\n // It used to change the width of nodes only locally\n .style(\"width\", (ele) => {\n return this.getRequiredWidthForGenomicData(genomicDataBoxCount);\n })\n .style(\"text-margin-y\", function(ele) {\n const nodeLabel = ele.data(\"name\");\n\n // If there is no genomic data for this node return !\n if (!(nodeLabel in data)) {\n return 0;\n }\n\n // Else shift label in Y axis\n return -15;\n })\n .style(\"background-image\", function(ele) {\n const x = encodeURIComponent(\n // self.generateSVGForPatientNode(ele, data).outerHTML\n self.generateOncoprintForPatientNode(ele).outerHTML\n );\n if (x === \"undefined\") {\n return \"none\";\n }\n const dataURI = \"data:image/svg+xml;utf8,\" + x;\n return dataURI;\n })\n .update();\n\n this.cy.on(\"mouseover\", 'node[type=\"GENE\"]', function(event) {\n const node = event.target || event.cyTarget;\n const nodeLabel = node.data(\"name\");\n if (!data[nodeLabel]) {\n return;\n }\n\n let ref = node.popperRef();\n let dummyDomEle = document.createElement(\"div\");\n document.body.appendChild(dummyDomEle);\n\n let tip = tippy(dummyDomEle, {\n // tippy props:\n getReferenceClientRect: ref.getBoundingClientRect, // https://atomiks.github.io/tippyjs/v6/all-props/#getreferenceclientrect\n trigger: \"manual\", // mandatory, we cause the tippy to show programmatically.\n placement: \"bottom\",\n interactive: true,\n theme: \"cbioportal\",\n // your own custom props\n // content prop can be used when the target is a single element https://atomiks.github.io/tippyjs/v6/constructor/#prop\n content: () => {\n let content = self\n .generateHTMLContentForNodeTooltip(node, data)\n .get(0);\n\n return content;\n },\n onHidden(instance) {\n instance.destroy();\n dummyDomEle.remove();\n },\n });\n\n node.one(\"showqtipevent\", function() {\n tip.show();\n });\n\n node.on(\"mouseout\", function() {\n if (dummyDomEle && dummyDomEle[\"_tippy\"]) {\n tip.hide();\n }\n });\n\n node.trigger(\"showqtipevent\");\n });\n }\n\n //Every mutation type has a unique color coded. This method is used to retrieve the colors\n getOncoprintColors(selectedGene) {\n const oncoprintColors = {\n Missense_Mutation: \"rgb(0,128,0)\",\n inframe: \"#993404\",\n truncating: \"#000000\",\n Fusion: \"rgb(139,0,201)\",\n AMP: \"rgb(255,0,0)\",\n gain: \"#ffb6c1\",\n heatloss: \"#8fd8d8\",\n homdel: \"rgb(0,0,255)\",\n DeepDel: \"rgb(0,0,255)\",\n \"5'Flank\": \"rgb(207,88,188)\",\n in_frame_del: \"rgb(166,128,40)\",\n };\n\n if (oncoprintColors[selectedGene] !== undefined) {\n return oncoprintColors[selectedGene];\n } else {\n //Types are not on the list corresponds to black\n return \"rgb(0,0,0)\";\n }\n }\n generateSVGForPatientNode(ele, patientData) {\n //Here we should use the parameter patientData when calculating the expressions\n const genomicDataBoxCount = this.countVisibleGenomicDataByType();\n // Experimental data overlay part !\n const dataURI = \"data:image/svg+xml;utf8,\";\n const svgNameSpace = \"http://www.w3.org/2000/svg\";\n //nodeLabel refers to the nodeLabels in the overlay data\n const nodeLabel = ele.data(\"name\");\n // If there is no genomic data for this node return !\n if (!(nodeLabel in patientData)) {\n return dataURI;\n }\n //this parameter refers to the count of alteration types for each gene\n const alterationBoxCount = this.getAlterationCountForPatient(\n patientData[nodeLabel]\n );\n\n const eleBBox = ele.boundingBox();\n const svg: any = document.createElementNS(svgNameSpace, \"svg\");\n //this parameter is set to 12 since there are 12 different possiblities for types\n const term = alterationBoxCount > 12 ? alterationBoxCount - 12 : 0;\n const reqWidth = 150 + term * 35;\n\n const overlayRecBoxW = reqWidth - 10;\n const overlayRecBoxH = 25;\n\n // It seems this should be set according to the node size !\n svg.setAttribute(\"width\", reqWidth);\n svg.setAttribute(\"height\", eleBBox.h);\n // This is important you need to include this to succesfully render in cytoscape.js!\n svg.setAttribute(\"xmlns\", svgNameSpace);\n\n // Overlay Data Rect\n const overLayRectBBox = {\n w: overlayRecBoxW,\n h: overlayRecBoxH,\n x: reqWidth / 2 - overlayRecBoxW / 2,\n y: eleBBox.h / 2 + overlayRecBoxH / 2 - 18,\n };\n let genomicBoxCounter = 0;\n //required width is calculated for each gene since box count is different for each gene\n for (let j in patientData[nodeLabel]) {\n const genomicAlterationData = patientData[nodeLabel];\n const alterationType = j;\n\n if (!this.visibleGenomicDataMapByType[nodeLabel]) {\n continue;\n }\n //get the color string corresponding to the alterationType\n let colorString = this.getOncoprintColors(alterationType);\n\n if (genomicAlterationData[alterationType] !== undefined) {\n genomicDataRectangleGeneratorPatient(\n overLayRectBBox.x +\n (genomicBoxCounter * overLayRectBBox.w) / alterationBoxCount,\n overLayRectBBox.y,\n overLayRectBBox.w / alterationBoxCount,\n overLayRectBBox.h,\n 100,\n svg,\n alterationType,\n colorString\n );\n } else {\n genomicDataRectangleGeneratorPatient(\n overLayRectBBox.x +\n (genomicBoxCounter * overLayRectBBox.w) / alterationBoxCount,\n overLayRectBBox.y,\n overLayRectBBox.w / alterationBoxCount,\n overLayRectBBox.h,\n null,\n svg,\n \"\",\n null\n );\n }\n\n genomicBoxCounter++;\n }\n //This function differs from genomicRectangleGenerator. genomicDataRectangleGeneratorPatient\n //has an extra parameter text. In patient view alterationTypes of genes are displayed instead of\n //alteration percentage. Hence a text is sent to this method which is alterationType\n function genomicDataRectangleGeneratorPatient(\n x,\n y,\n w,\n h,\n percent,\n parentSVG,\n text,\n colorString\n ) {\n if (percent) {\n const isNegativePercent = percent < 0;\n // Rectangle Part\n const overlayRect = document.createElementNS(svgNameSpace, \"rect\");\n overlayRect.setAttribute(\"x\", x);\n overlayRect.setAttribute(\"y\", y);\n overlayRect.setAttribute(\"width\", w);\n overlayRect.setAttribute(\"height\", h);\n overlayRect.setAttribute(\n \"style\",\n \"stroke-width:1;stroke:rgb(0,0,0);opacity:1;fill:\" + colorString + \";\"\n );\n\n // Text Part\n const fontSize = 14;\n const textLength = 4;\n const xOffset = w / 2 - textLength * 4;\n const yOffset = fontSize / 3;\n\n const svgText = document.createElementNS(svgNameSpace, \"text\");\n if (colorString === \"rgb(0,0,0)\") {\n svgText.setAttribute(\"fill\", \"white\");\n }\n svgText.setAttribute(\"x\", x + xOffset);\n svgText.setAttribute(\"y\", y + h / 2 + yOffset);\n\n svgText.setAttribute(\"font-family\", \"Arial\");\n svgText.setAttribute(\"font-size\", fontSize + \"\");\n\n //first 4 letters of the alterationTypes are used\n svgText.innerHTML = text.substring(0, 4);\n parentSVG.appendChild(overlayRect);\n parentSVG.appendChild(svgText);\n } else {\n //Normally\n colorString = \"rgb(210,210,210)\";\n }\n }\n\n return svg;\n }\n\n generateOncoprintForPatientNode(ele) {\n // const dataURI = 'data:image/svg+xml;utf8,'\n // nodeLabel refers to the nodeLabels in the overlay data\n const patientData = this.patientData;\n const nodeLabel = ele.data(\"name\");\n const genomicData = patientData[nodeLabel];\n\n const svgNameSpace = \"http://www.w3.org/2000/svg\";\n const svgElement: any = document.createElementNS(svgNameSpace, \"svg\");\n\n if (!genomicData) {\n return { outerHTML: \"\" };\n }\n\n const ruleset = new GeneticAlterationRuleSet(\n genomicData.geneticTrackRuleSetParams\n );\n const cellWidth = 6;\n const cellPadding = 3;\n const cellHeight = 23;\n const cellVerticalPadding = 8;\n\n const universalShapes = ruleset.getUniversalShapes(cellWidth, cellHeight);\n\n const specificShapesPerDatum = ruleset.getSpecificShapesForDatum(\n genomicData.geneticTrackData,\n cellWidth,\n cellHeight\n );\n\n const shapesPerDatum = specificShapesPerDatum.map((specificShapes) =>\n universalShapes.concat(specificShapes)\n );\n\n shapesPerDatum.forEach((shapes, index) => {\n const offsetX = index * (cellWidth + cellPadding); // width + padding\n const offsetY = cellVerticalPadding;\n const g = document.createElementNS(svgNameSpace, \"g\");\n shapes.forEach((shape) =>\n g.appendChild(shapeToSvg(shape, offsetX, offsetY))\n );\n svgElement.appendChild(g);\n });\n\n // It seems this should be set according to the node size !\n svgElement.setAttribute(\n \"width\",\n ((cellWidth + cellPadding) * shapesPerDatum.length).toString()\n );\n svgElement.setAttribute(\n \"height\",\n (cellHeight + cellVerticalPadding).toString()\n );\n // This is important you need to include this to succesfully render in cytoscape.js!\n svgElement.setAttribute(\"xmlns\", svgNameSpace);\n\n return svgElement;\n }\n\n // Mapping of alteration type keys to strings\n // See: https://github.com/cBioPortal/cbioportal-frontend/blob/442e108208846255feb1ed5b309218cd44927fb9/src/shared/components/oncoprint/TooltipUtils.ts#L599\n getCNADisplayString(alterationTypeKey: number) {\n const disp_cna: { [integerCN: string]: string } = {\n \"-2\": \"HOMODELETED\",\n \"-1\": \"HETLOSS\",\n \"1\": \"GAIN\",\n \"2\": \"AMPLIFIED\",\n };\n return disp_cna[alterationTypeKey];\n }\n\n generateSvgIconForSample(iconColor: string, iconText: string) {\n var html =\n '' +\n '' +\n '' +\n \"\" +\n '' +\n '' +\n iconText +\n \"\" +\n \"\" +\n \"\";\n\n return html;\n }\n\n generateHTMLContentForNodeTooltip(ele, patientData) {\n const tooltipMaxHeight = \"200px\";\n const tooltipMaxWidth = \"200px\";\n const marginBetweenSamples = \"10px\";\n const sampleIconColorMap = patientData.sampleColors;\n const sampleIndexMap = patientData.sampleIndex;\n\n const nodeLabel = ele.data(\"name\");\n const data = patientData[nodeLabel];\n\n // Outer wrapper for the entire tooltip\n var wrapper = $(\"
\");\n wrapper.css({\n \"max-width\": tooltipMaxWidth,\n \"max-height\": tooltipMaxHeight,\n \"word-wrap\": \"break-word\",\n \"overflow-y\": \"auto\",\n });\n\n data.geneticTrackData.forEach((sample, sampleIndex) => {\n const sampleId = sample.sample;\n const iconColor = sampleIconColorMap[sampleId];\n const iconText = (sampleIndexMap[sampleId] + 1).toString();\n const sampleIconSvgHTML = this.generateSvgIconForSample(\n iconColor,\n iconText\n );\n\n const margin = sampleIndex > 0 ? marginBetweenSamples : \"0px\";\n\n // Inner wrapper for a single sample\n var sampleWrapper = $(\"
\");\n sampleWrapper.css({\n \"margin-top\": margin,\n });\n\n const sampleData = sample.data;\n var mutationInfo = [];\n var cnaInfo = [];\n var fusionInfo = [];\n sampleData.forEach((data) => {\n const geneSymbol = data.gene.hugoGeneSymbol;\n\n if (\n sample.disp_mut &&\n data.proteinChange &&\n data.mutationType !== \"Fusion\"\n ) {\n const proteinChange = data.proteinChange;\n mutationInfo.push({\n gene: geneSymbol,\n proteinChange: proteinChange,\n });\n }\n\n if (sample.disp_cna && data.alteration) {\n const cnaLabelKey = data.alteration;\n const cnaLabel = this.getCNADisplayString(cnaLabelKey);\n cnaInfo.push({\n gene: geneSymbol,\n cnaLabel: cnaLabel,\n });\n }\n\n if (\n sample.disp_fusion &&\n data.proteinChange &&\n data.mutationType === \"Fusion\"\n ) {\n const proteinChange = data.proteinChange;\n fusionInfo.push({\n gene: geneSymbol,\n proteinChange: proteinChange,\n });\n }\n });\n // Prepare HTML for tooltip\n var mutationInfoHTML = mutationInfo.length > 0 ? \"Mutation: \" : \"\";\n var cnaInfoHTML = cnaInfo.length > 0 ? \"CNA: \" : \"\";\n var fusionInfoHTML = fusionInfo.length > 0 ? \"Fusion: \" : \"\";\n\n mutationInfo.forEach((mutation, index) => {\n mutationInfoHTML +=\n \"\" + mutation.gene + \" \" + mutation.proteinChange + \"\";\n if (index !== mutationInfo.length - 1) {\n mutationInfoHTML += \", \";\n } else {\n mutationInfoHTML += \"
\";\n }\n });\n\n cnaInfo.forEach((cna, index) => {\n cnaInfoHTML += \"\" + cna.gene + \" \" + cna.cnaLabel + \"\";\n if (index !== cnaInfo.length - 1) {\n cnaInfoHTML += \", \";\n } else {\n cnaInfoHTML += \"
\";\n }\n });\n\n fusionInfo.forEach((fusion, index) => {\n fusionInfoHTML +=\n \"\" + fusion.gene + \" \" + fusion.proteinChange + \"\";\n if (index !== fusionInfo.length - 1) {\n fusionInfoHTML += \", \";\n } else {\n fusionInfoHTML += \"
\";\n }\n });\n const sampleIdHTML = \" \" + sampleId + \"\" + \"
\";\n sampleWrapper.append(\n $(\n \"
\" +\n sampleIconSvgHTML +\n sampleIdHTML +\n mutationInfoHTML +\n cnaInfoHTML +\n fusionInfoHTML +\n +\"
\"\n )\n );\n wrapper.append(sampleWrapper);\n });\n\n return wrapper;\n }\n}\n","import autobind from \"autobind-decorator\";\nimport { action, makeObservable, observable } from \"mobx\";\nimport LayoutProperties, { ILayoutProperties } from \"../modals/LayoutProperties\";\nimport { IColorValueMap, IProfileMetaData } from \"../ui/react-pathway-mapper\";\nimport CBioPortalAccessor from \"../utils/CBioPortalAccessor\";\nimport SVGExporter from \"../utils/SVGExporter\";\nimport GenomicDataOverlayManager from \"./GenomicDataOverlayManager\";\nimport ShareDBManager from \"./ShareDBManager\";\n\nconst _ = require('lodash');\n\nexport default class EditorActionsManager{\n\n public static defaultLayoutProperties: ILayoutProperties =\n {\n name: 'fcose',\n nodeRepulsion: 4500,\n idealEdgeLength: 50,\n edgeElasticity: 0.45,\n nestingFactor: 0.1,\n gravity: 0.25,\n numIter: 2500,\n tile: true,\n animate: true,\n randomize: false,\n gravityRangeCompound: 1.5,\n // Gravity force (constant) for compounds\n gravityCompound: 1.0,\n // Gravity range (constant)\n gravityRange: 3.8,\n // Amount of vertical space to put between degree zero nodes during tiling (can also be a function)\n tilingPaddingVertical: 10,\n // Amount of horizontal space to put between degree zero nodes during tiling (can also be a function)\n tilingPaddingHorizontal: 10,\n // Initial cooling factor for incremental layout\n initialEnergyOnIncremental: 0.5,\n animationDuration: 2000,\n animationEasing: 'cubic-bezier(0.17,0.72,0.41,0.98)',\n };\n \n public cy: any;\n public genomicDataOverlayManager: GenomicDataOverlayManager;\n public edgeEditing: any;\n public selectedNodeStack: any;\n public layoutProperties: ILayoutProperties;\n \n private FIT_CONSTANT: number;\n private observers: any[];\n private svgExporter: SVGExporter;\n private undoRedoManager: any;\n private isCbioPortal: boolean;\n private isCollaborative: boolean;\n private shareDBManager: ShareDBManager;\n private portalAccessor: CBioPortalAccessor;\n private viewUtilities: any;\n\n @observable\n private profiles: IProfileMetaData[];\n\n @observable\n private genomicDataOverlayColorScheme: IColorValueMap;\n\n private colorSchemeChangeCallback: (IColorValueMap) => void;\n\n constructor(isCollaborative: boolean, shareDBManager: any, cyInst: any, isCBioPortal: boolean,\n undoRedoManager: any, portalAccessor: CBioPortalAccessor, profiles: IProfileMetaData[],\n genomicDataOverlayColorScheme: IColorValueMap, colorSchemeChangeCallback: (IColorValueMap) => void)\n {\n // Set cy instance and set real time manager reference if collaborative mode\n makeObservable(this);\n this.cy = cyInst;\n this.isCollaborative = isCollaborative;\n this.isCbioPortal = isCBioPortal;\n this.profiles = profiles;\n this.genomicDataOverlayColorScheme = genomicDataOverlayColorScheme;\n this.colorSchemeChangeCallback = colorSchemeChangeCallback;\n \n const edgeEditingOptions = {\n bendPositionsFunction: function(ele) {\n return ele.data('bendPointPositions');\n },\n // A function parameter to get control point positions, should return positions of control points\n controlPositionsFunction: function(ele) {\n return ele.data('controlPointPositions');\n },\n // whether the anchor editing operations are undoable (requires cytoscape-undo-redo.js)\n undoable: true,\n // the size of bend shape is obtained by multipling width of edge with this parameter\n anchorShapeSizeFactor: 6,\n // whether to start the plugin in the enabled state\n enabled: !this.isCbioPortal,\n \n handleReconnectEdge: this.isCollaborative ? \n this.reconnectEdge.bind(this) :\n undefined,\n\n enableMultipleAnchorRemovalOption: true\n };\n \n this.edgeEditing = this.cy.edgeEditing(edgeEditingOptions);\n this.portalAccessor = portalAccessor;\n if(this.isCollaborative) {\n this.shareDBManager = shareDBManager;\n }\n\n this.FIT_CONSTANT = 50;\n\n this.layoutProperties = _.clone(EditorActionsManager.defaultLayoutProperties);\n this.observers = [];\n this.genomicDataOverlayManager = new GenomicDataOverlayManager(this.cy);\n this.svgExporter = new SVGExporter(this.edgeEditing, this);\n\n this.selectedNodeStack = {};\n this.undoRedoManager = undoRedoManager;\n this.undoRedoManager.action(\"changePositions\", this.doChangePosition, this.undoChangePosition);\n this.undoRedoManager.action(\"changeNodeSize\", this.doChangeNodeSize, this.undoChangeNodeSize);\n this.undoRedoManager.action(\"changeCompoundSize\", this.doChangeCompoundSize, this.undoChangeCompoundSize);\n this.undoRedoManager.action(\"changeName\", this.doChangename, this.undoChangeName);\n this.undoRedoManager.action(\"hideNode\", this.doHide, this.undoHide);\n this.undoRedoManager.action(\"showAllNodes\", this.doShow, this.undoShow);\n // HighlightOthers is the type of highlight from the menu and by searching, while highlightInvalidGenes is for only invalid genes\n this.undoRedoManager.action(\"highlightInvalidGenes\", this.doHighlightInvalidGenes, this.undoHighlightInvalidGenes);\n this.undoRedoManager.action(\"removeHighlightInvalidGenes\", this.undoHighlightInvalidGenes, this.doHighlightInvalidGenes);\n this.undoRedoManager.action(\"highlightOthers\", this.doHighlight, this.undoHighlight);\n this.undoRedoManager.action(\"removeOtherHighlight\", this.undoHighlight, this.doHighlight);\n\n };\n\n @action.bound\n setProfile(index: number, profile: IProfileMetaData) {\n this.profiles[index] = profile;\n }\n\n @action.bound\n addProfile(profile: IProfileMetaData) {\n this.profiles.push(profile);\n }\n\n @action.bound\n removeProfiles() {\n this.profiles.length = 0;\n }\n\n @action.bound\n setGenomicDataOverlayColorScheme(scheme: IColorValueMap) {\n this.genomicDataOverlayColorScheme = scheme;\n }\n\n @autobind\n setViewUtilities(viewUtilitiesRef: any) {\n this.viewUtilities = viewUtilitiesRef;\n }\n\n getGenomicDataOverlayColorScheme() : IColorValueMap {\n return this.genomicDataOverlayColorScheme;\n }\n\n handleChangePositionByAlignment(movedNodeArr: any)\n {\n if (this.isCollaborative)\n this.shareDBManager.changeElementsPositionByAlignment(movedNodeArr);\n else\n this.undoRedoManager.do(\"changePositions\", movedNodeArr)\n };\n\n /*\n * Undo redo for changing positions of nodes via programatically (node.position)\n * **/\n doChangePosition(movedNodes: any)\n {\n const newMovedNodes = [];\n\n for(let i = 0; i < movedNodes.length; i++)\n {\n const currentNodePosition =\n {\n x: movedNodes[i].node.position().x,\n y: movedNodes[i].node.position().y\n };\n newMovedNodes.push({node: movedNodes[i].node, oldPosition: currentNodePosition, nextPosition: movedNodes[i].nextPosition});\n movedNodes[i].node.position(movedNodes[i].nextPosition);\n }\n\n return newMovedNodes;\n };\n\n undoChangePosition(movedNodes: any)\n {\n var newMovedNodes = [];\n\n for(var i = 0; i < movedNodes.length; i++)\n {\n var currentNodePosition =\n {\n x: movedNodes[i].node.position().x,\n y: movedNodes[i].node.position().y\n };\n newMovedNodes.push({node: movedNodes[i].node, oldPosition: movedNodes[i].oldPosition, nextPosition: currentNodePosition});\n movedNodes[i].node.position(movedNodes[i].oldPosition);\n }\n\n return newMovedNodes;\n };\n\n changeNodePositionsByArrows(selectedNodes: any)\n {\n if (this.isCollaborative)\n this.shareDBManager.changeNodePositionsShareDB(selectedNodes);\n //node-editing extension already deals for the movement in local mode\n };\n\n /*\n * Undo redo for changing size of nodes\n * **/\n doChangeNodeSize (args: any)\n {\n args.ele.data('w', args.newWidth);\n args.ele.data('h', args.newHeight);\n\n return args;\n };\n\n undoChangeNodeSize(args: any)\n {\n args.ele.data('w', args.oldWidth);\n args.ele.data('h', args.oldHeight);\n return args;\n };\n\n /*\n * Undo redo for changing size of compounds\n * **/\n doChangeCompoundSize(args: any)\n {\n args.ele.style('min-width', args.newMinWidth);\n args.ele.style('min-width-bias-left', args.newMinWidthBiasLeft);\n args.ele.style('min-width-bias-right', args.newMinWidthBiasRight);\n args.ele.style('min-height', args.newMinHeight);\n args.ele.style('min-height-bias-top', args.newMinHeightBiasTop);\n args.ele.style('min-height-bias-bottom', args.newMinHeightBiasBottom);\n\n return args;\n };\n\n undoChangeCompoundSize(args: any)\n {\n if (args.oldMinWidth == undefined)\n {\n args.ele.style('min-width', 0);\n args.ele.style('min-width-bias-left', 0);\n args.ele.style('min-width-bias-right', 0);\n\n }\n else {\n args.ele.style('min-width', args.oldMinWidth);\n args.ele.style('min-width-bias-left', args.oldMinWidthBiasLeft);\n args.ele.style('min-width-bias-right', args.oldMinWidthBiasRight);\n }\n if (args.oldMinHeight == undefined)\n {\n args.ele.style('min-height', 0);\n args.ele.style('min-height-bias-top', 0);\n args.ele.style('min-height-bias-bottom', 0);\n }\n else {\n args.ele.style('min-height', args.oldMinHeight);\n args.ele.style('min-height-bias-top', args.oldMinHeightBiasTop);\n args.ele.style('min-height-bias-bottom', args.oldMinHeightBiasBottom);\n }\n\n return args;\n };\n\n changeName(ele: any, newName: any)\n {\n if (this.isCollaborative)\n {\n this.shareDBManager.changeName(ele, newName);\n }\n else\n {\n this.changeNameCy(ele, newName);\n }\n };\n\n changeNameCy(ele: any, newName: any)\n {\n var currentName = ele.data('name');\n var args = {ele: ele, oldName: currentName, newName: newName};\n this.undoRedoManager.do('changeName', args);\n };\n\n /*\n * Undo redo for changing name of nodes\n * **/\n doChangename(args: any)\n {\n\n var currentName = args.ele.data('name');\n var newArgs = {ele: args.ele, newName: args.newName, oldName: currentName};\n args.ele.data('name', args.newName);\n\n return newArgs;\n };\n\n undoChangeName(args: any)\n {\n\n var currentName = args.ele.data('name');\n var newArgs = {ele: args.ele, newName: args.newName, oldName: currentName};\n args.ele.data('name', args.oldName);\n\n return newArgs;\n };\n\n hideSelectedNodes()\n {\n //Hides the selected elements\n var sel = this.cy.nodes(\":selected\");\n var nodesToHide = sel;\n var b = true;\n //Hides the parents if they have no children\n sel.parent().each((parent: any) =>\n {\n b=true;\n parent.children().each(function(ch: any)\n {\n if (!ch.selected())\n {\n if (ch.visible()) b=false;\n }\n }\n );\n if (b) nodesToHide = nodesToHide.add(parent);\n });\n this.cy.elements(\":selected\").unselect();\n if (this.isCollaborative)\n this.shareDBManager.changeVisibility(nodesToHide, true);\n else\n this.undoRedoManager.do('hideNode', nodesToHide);\n };\n\n /*\n * Undo redo for hiding nodes\n * **/\n @autobind\n doHide(args: any)\n {\n this.viewUtilities.hide(args);\n return args;\n };\n\n @autobind\n undoHide(args: any)\n {\n this.viewUtilities.show(args);\n return args;\n };\n\n showAllNodes()\n {\n var hid = this.cy.nodes(\":hidden\");\n if (this.isCollaborative)\n this.shareDBManager.changeVisibility(hid, false);\n else\n this.undoRedoManager.do('showAllNodes', hid);\n };\n\n /*\n * Undo redo for showing all nodes\n * **/\n @autobind\n doShow(args: any)\n {\n this.viewUtilities.show(args);\n return args;\n };\n\n @autobind\n undoShow(args: any)\n {\n this.viewUtilities.hide(args);\n return args;\n };\n\n highlightElementsInitially(invalidHighlightedGenesIDs: string[], invalidGenesIDs: string[],\n highlightedGenesIDs: string[], highlightedEdgesIDs: string[], hiddenGenesIDs: string[])\n {\n for (var i in invalidHighlightedGenesIDs)\n {\n this.cy.$('#'+invalidHighlightedGenesIDs[i]).addClass('invalidGeneHighlight');\n }\n for (var i in invalidGenesIDs)\n {\n this.cy.$('#'+invalidGenesIDs[i]).addClass('invalidGene');\n }\n for (var i in highlightedGenesIDs)\n {\n this.cy.$('#'+highlightedGenesIDs[i]).addClass('highlightedNode');\n }\n for (var i in highlightedEdgesIDs)\n {\n this.cy.$('#'+highlightedEdgesIDs[i]).addClass('highlightedEdge');\n }\n for (var i in hiddenGenesIDs)\n {\n this.viewUtilities.hide(this.cy.$('#'+hiddenGenesIDs[i]))\n }\n };\n\n validateGenes()\n {\n var geneSymbols = this.getGeneSymbols();\n this.portalAccessor.validateGenes(geneSymbols, this);\n }\n\n //Get all gene symbols\n getGeneSymbols()\n {\n var geneSymbols: any[] = [];\n this.cy.nodes().forEach( function (gene: any)\n {\n if(gene.data().type === \"GENE\")\n geneSymbols.push(gene.data().name);\n });\n return geneSymbols;\n }\n\n\n highlightInvalidGenes(validGeneSymbols: any)\n {\n if (this.isCollaborative)\n {\n var invalidGenes: any[] = [];\n this.cy.nodes().forEach( function (gene: any)\n {\n if(gene.data().type === \"GENE\")\n {\n var geneName = gene.data().name;\n if(validGeneSymbols.indexOf(geneName) < 0)\n invalidGenes.push(gene.id());\n }\n });\n this.shareDBManager.changeHighlightInvalidGenes(invalidGenes, true);\n // TODO: Amendment by Ziya\n /*\n if (invalidGenes.length > 0)\n this.notificationManager.createNotification(\"Invalid genes are highlighted\",\"fail\");\n else\n this.notificationManager.createNotification(\"All gene symbols are valid\",\"success\");*/\n }\n else\n {\n var highlightedGenes = this.cy.collection();\n this.cy.nodes().forEach( function (gene: any)\n {\n if(gene.data().type === \"GENE\")\n {\n var geneName = gene.data().name;\n if(validGeneSymbols.indexOf(geneName) < 0)\n highlightedGenes = highlightedGenes.add(gene);\n }\n });\n // TODO: Amendment by Ziya\n /*\n if (highlightedGenes.size() > 0)\n this.notificationManager.createNotification(\"Invalid genes are highlighted\",\"fail\");\n else\n this.notificationManager.createNotification(\"All gene symbols are valid\",\"success\");*/\n\n var nodesToAddInvalidHighlight = this.cy.collection();\n highlightedGenes.forEach(function(ele: any){\n if (!ele.hasClass('invalidGeneHighlight') && !ele.hasClass('invalidGene'))\n nodesToAddInvalidHighlight = nodesToAddInvalidHighlight.union(ele);\n });\n this.undoRedoManager.do('highlightInvalidGenes', nodesToAddInvalidHighlight);\n }\n }\n\n removeInvalidGeneHighlights(actions: any[])\n {\n if (this.isCollaborative)\n {\n var geneIDs: any[] = [];\n this.cy.nodes().forEach( function (gene: any)\n {\n if(gene.data().type === \"GENE\")\n {\n if(gene.hasClass('invalidGeneHighlight') || gene.hasClass('invalidGene'))\n geneIDs.push(gene.id());\n }\n });\n this.shareDBManager.changeHighlightInvalidGenes(geneIDs, false);\n }\n else\n {\n var nodesToRemoveInvalidHighlight = this.cy.collection();\n this.cy.nodes().forEach(function(ele: any){\n if (ele.hasClass('invalidGeneHighlight') || ele.hasClass('invalidGene'))\n nodesToRemoveInvalidHighlight = nodesToRemoveInvalidHighlight.union(ele);\n });\n actions.push({name: \"removeHighlightInvalidGenes\", param: nodesToRemoveInvalidHighlight});\n // this.undoRedoManager.do('removeHighlightInvalidGenes', nodesToRemoveInvalidHighlight);\n }\n }\n\n doHighlightInvalidGenes(args: any)\n {\n args.each(function(n: any)\n {\n if(n.hasClass('highlightedNode'))\n {\n n.removeClass('highlightedNode');\n n.addClass(\"invalidGeneHighlight\");\n }\n else\n n.addClass(\"invalidGene\");\n });\n return args;\n };\n\n undoHighlightInvalidGenes(args: any)\n {\n args.each(function(n: any)\n {\n if(n.hasClass('invalidGeneHighlight'))\n {\n n.removeClass('invalidGeneHighlight');\n n.addClass(\"highlightedNode\");\n }\n else\n n.removeClass(\"invalidGene\");\n });\n return args;\n }\n\n highlightSelected()\n {\n var sel = this.cy.elements(\":selected\");\n sel.unselect();\n var elementsToHighlight = this.cy.collection();\n sel.forEach(function(ele: any){\n if (!ele.hasClass('invalidGeneHighlight') && !ele.hasClass('highlightedNode') && !ele.hasClass('highlightedEdge'))\n elementsToHighlight = elementsToHighlight.union(ele);\n });\n if (this.isCollaborative)\n this.shareDBManager.changeHighlight(elementsToHighlight, true);\n else\n this.undoRedoManager.do('highlightOthers', elementsToHighlight);\n };\n\n highlightNeighbors()\n {\n var sel = this.cy.elements(\":selected\");\n var neighbors = sel.neighborhood();\n neighbors = neighbors.union(sel);\n neighbors.unselect();\n var elementsToHighlight = this.cy.collection();\n neighbors.forEach(function(ele: any){\n if (!ele.hasClass('invalidGeneHighlight') && !ele.hasClass('highlightedNode') && !ele.hasClass('highlightedEdge'))\n elementsToHighlight = elementsToHighlight.union(ele);\n });\n if (this.isCollaborative)\n this.shareDBManager.changeHighlight(elementsToHighlight, true);\n else\n this.undoRedoManager.do('highlightOthers', elementsToHighlight);\n };\n\n highlightBySearch(args: any[])\n {\n if (this.isCollaborative)\n this.shareDBManager.changeHighlight(args, true);\n else\n this.undoRedoManager.do('highlightOthers', args);\n };\n\n removeOtherHighlight(actions: any[])\n {\n var nodesToRemoveHighlight = this.cy.collection();\n //TODO cytoscape selectors may provide more handy functionality instead of iterating over !\n this.cy.elements().forEach(function(ele: any){\n if (ele.hasClass('highlightedNode') || ele.hasClass('highlightedEdge') || ele.hasClass('invalidGeneHighlight'))\n nodesToRemoveHighlight = nodesToRemoveHighlight.add(ele);\n });\n\n if (this.isCollaborative)\n this.shareDBManager.changeHighlight(nodesToRemoveHighlight, false);\n else\n actions.push({name: \"removeOtherHighlight\", param: nodesToRemoveHighlight});\n // this.undoRedoManager.do('removeOtherHighlight', nodesToRemoveHighlight);\n };\n\n /*\n * Undo redo for highlighting of nodes\n * **/\n doHighlight(args: any)\n {\n args.each(function(n: any)\n {\n if (n.isEdge())\n n.addClass(\"highlightedEdge\");\n else\n {\n if(n.hasClass('invalidGene'))\n {\n n.removeClass(\"invalidGene\");\n n.addClass(\"invalidGeneHighlight\");\n }\n else\n n.addClass(\"highlightedNode\");\n }\n });\n return args;\n };\n\n undoHighlight(args: any)\n {\n args.each(function(n: any)\n {\n if (n.isEdge())\n n.removeClass(\"highlightedEdge\");\n else\n {\n if(n.hasClass('invalidGeneHighlight'))\n {\n n.removeClass(\"invalidGeneHighlight\");\n n.addClass(\"invalidGene\");\n }\n else\n n.removeClass(\"highlightedNode\");\n }\n });\n return args;\n };\n\n removeAllHighlight()\n {\n let actions: any[] = [];\n this.removeInvalidGeneHighlights(actions);\n this.removeOtherHighlight(actions);\n this.cy.undoRedo().do(\"batch\", actions);\n };\n\n postLayout()\n {\n if (this.isCollaborative)\n {\n //Previously this.cy.nodes() was sent as an argument in moveElements function but it caused a problem when\n // the compound node was moved before the child nodes\n var movedNodes = this.cy.collection();\n var parentNodes = this.cy.collection();\n this.cy.nodes().forEach(function(node: any)\n {\n if (!node.isParent())\n movedNodes = movedNodes.add(node);\n else\n parentNodes = parentNodes.add(node);\n });\n this.moveElements(movedNodes);\n this.moveElements(parentNodes);\n\n var newState = {\n zoomLevel: this.cy.zoom(),\n panLevel: this.cy.pan()\n };\n this.updateGlobalOptions(newState);\n }\n };\n\n /*\n * Gets the first empty index from the list in cloud model\n * **/\n getEmptyGroupID()\n {\n if(this.isCollaborative)\n return this.shareDBManager.getEmptyGroupID();\n else\n return this.genomicDataOverlayManager.getEmptyGroupID();\n };\n\n /*\n * Gets the first empty index from the list in cloud model\n * **/\n groupGenomicData(cancerNames: any[], groupID: string)\n {\n return this.shareDBManager.groupGenomicData(cancerNames, groupID);\n };\n\n addPubmedIDs(edge: any, pubmedIDs: number[])\n {\n if (this.isCollaborative)\n {\n this.shareDBManager.addPubmedIDs(edge.id(), pubmedIDs);\n }\n else\n {\n var pubmedArray = edge.data('pubmedIDs');\n var validPubmedIDs = _.filter(pubmedIDs, function(id: number){\n return !isNaN(id);\n });\n pubmedArray.push.apply(pubmedArray,validPubmedIDs);\n edge.data('pubmedIDs', _.uniq(pubmedArray));\n }\n }\n\n removePubmedID(edge: any, pubmedIDs: number[])\n {\n if (this.isCollaborative)\n {\n this.shareDBManager.removePubmedID(edge.id(), pubmedIDs);\n }\n else\n {\n var pubmedArray = edge.data('pubmedIDs');\n edge.data('pubmedIDs', _.difference(pubmedArray, pubmedIDs));\n }\n }\n\n updateEdgeAnchorPoints(edge: any)\n {\n if (this.isCollaborative)\n {\n var edgeCurveStyle = edge.css('curve-style')\n var numberOfAnchorPoints = 0;\n var anchors = this.edgeEditing.getAnchorsAsArray(edge);\n if (anchors !== undefined)\n numberOfAnchorPoints = anchors.length / 2;\n var anchorPointsArray = [];\n for (var j = 0; j < numberOfAnchorPoints; j++)\n {\n anchorPointsArray.push(\n {\n x: anchors[2*j],\n y: anchors[2*j+1]\n }\n );\n } \n this.shareDBManager.updateEdgeAnchorPoints(edge.id(), anchorPointsArray, edgeCurveStyle);\n }\n }\n\n //Related to order the nodes according to the selection of user\n pushSelectedNodeStack(ele: any)\n {\n this.selectedNodeStack[ele.id()] = ele;\n }\n\n removeElementFromSelectedNodeStack(ele: any)\n {\n var nodeID = ele.id();\n if (nodeID in this.selectedNodeStack)\n delete this.selectedNodeStack[ele.id()];\n }\n\n clearSelectedNodeStack()\n {\n this.selectedNodeStack = {};\n }\n\n exportSVG()\n {\n return this.svgExporter.exportGraph(this.cy.nodes(), this.cy.edges());\n }\n\n //Simple observer-observable pattern for views!!!!!\n registerObserver(observer: any)\n {\n this.observers.push(observer);\n };\n\n notifyObservers()\n {\n for (var i in this.observers)\n {\n var observer = this.observers[i];\n observer.notify();\n }\n };\n\n registerGenomicDataObserver(observer: any)\n {\n this.genomicDataOverlayManager.registerObserver(observer);\n }\n\n updateGenomicDataVisibility(dataMap: any)\n {\n if(this.isCollaborative)\n {\n //TODO compound OP\n // this.shareDBManager.clearGenomicVisData();\n this.shareDBManager.addGenomicVisibilityData(dataMap);\n }\n else\n {\n for (var _key in dataMap)\n {\n this.genomicDataOverlayManager.updateGenomicDataVisibility(_key, dataMap[_key]);\n }\n this.genomicDataOverlayManager.showGenomicData();\n }\n }\n\n updateGenomicDataColorScheme(colorValueMap: IColorValueMap)\n {\n this.setGenomicDataOverlayColorScheme(colorValueMap);\n \n if(this.isCollaborative)\n {\n this.shareDBManager.updateGenomicDataOverlayColorScheme(colorValueMap);\n }\n else\n {\n this.genomicDataOverlayManager.updateColorScheme(colorValueMap);\n this.genomicDataOverlayManager.showGenomicData();\n }\n }\n\n //Global options related functions, zoom etc..\n getGlobalOptions()\n {\n return {\n zoomLevel: this.cy.zoom(),\n panLevel: this.cy.pan()\n };\n }\n\n changeGlobalOptions(op: any)\n {\n var globalOptions = op.li;\n this.cy.zoom(globalOptions.zoomLevel);\n this.cy.pan(globalOptions.panLevel);\n }\n\n updateGlobalOptions(newOptions: any)\n {\n if(this.isCollaborative)\n this.shareDBManager.updateGlobalOptions(newOptions);\n }\n\n //Layout properties related functions\n saveLayoutProperties(newLayoutProps: any)\n {\n if(this.isCollaborative)\n {\n // Call a real time function that updated real time object and\n // its callback (updateLayoutPropertiesCallback) will handle sync of this object\n // across collaborators\n this.shareDBManager.updateLayoutProperties(newLayoutProps);\n }\n else\n {\n this.layoutProperties = _.clone(newLayoutProps);\n }\n };\n\n updateLayoutPropertiesCallback(op: any)\n {\n var newLayoutProps = op.li;\n this.layoutProperties = _.clone(newLayoutProps);\n LayoutProperties.layoutProperties = _.clone(this.layoutProperties);\n //Notify observers to reflect changes on colalborative object to the views\n this.notifyObservers();\n };\n\n performLayout()\n {\n this.undoRedoManager.do(\"layout\", {options: this.layoutProperties, eles: null, zoom: this.cy.zoom(), pan: this.cy.pan()});\n };\n\n //Node Related Functions\n addNode(nodeData: any, posData: any)\n {\n if (this.isCollaborative)\n {\n this.addNewNodeToShareDB(nodeData, posData);\n }\n else\n {\n this.addNodetoCy(nodeData,posData);\n }\n };\n\n addNodes(nodes: any[])\n {\n for (var i in nodes)\n {\n this.addNode(nodes[i].data, nodes[i].position);\n }\n };\n\n addNodesCy(nodes: any[])\n {\n var nodeArr: any[] = [];\n for (var i in nodes)\n {\n var nodeData = nodes[i].data;\n var posData = nodes[i].position;\n\n var newNode =\n {\n group: \"nodes\",\n data: nodeData,\n position: {}\n };\n\n if (nodeData.parent === undefined )\n {\n delete newNode.data.parent;\n }\n\n if (posData)\n {\n newNode.position =\n {\n x: posData.x,\n y: posData.y\n }\n }\n nodeArr[i] = newNode;\n }\n\n this.cy.add(nodeArr);\n this.cy.nodes().updateCompoundBounds();\n\n };\n\n addNodetoCy(nodeData: any, posData: any)\n {\n var newNode =\n {\n group: \"nodes\",\n data: nodeData,\n position: {}\n };\n\n if (nodeData.parent === undefined )\n {\n delete newNode.data.parent;\n }\n\n if (posData)\n {\n newNode.position =\n {\n x: posData.x,\n y: posData.y\n }\n }\n\n //his.cy.add(newNode);\n this.cy.nodes().updateCompoundBounds();\n this.undoRedoManager.do(\"add\", newNode);\n };\n\n shareDBNodeAddRemoveEventCallBack(op: any)\n {\n //Get real time node object and sync it to node addition or removal\n var isRemove = Object.keys(op)[1] === 'od';\n var node = op.oi || op.od;\n //Removal Operation\n if (isRemove)\n {\n var nodeID = op.p[1];\n //Remove element from existing graph\n var cyEle = this.cy.$(\"#\" + nodeID);\n this.removeElementCy(cyEle);\n this.cy.nodes().updateCompoundBounds();\n }\n //Addition Operation\n else\n {\n this.addNewNodeLocally(node);\n }\n };\n\n addNewNodeLocally(realtimeNode: any)\n {\n var nodeData =\n {\n id: realtimeNode.id,\n type: realtimeNode.type,\n name: realtimeNode.name,\n parent: realtimeNode.parent,\n w: realtimeNode.w,\n h: realtimeNode.h\n };\n\n if (realtimeNode.x != \"undefined\" && realtimeNode.y != \"undefined\")\n {\n this.addNodetoCy(nodeData, {x: realtimeNode.x, y: realtimeNode.y});\n }\n else\n {\n // TODO: Amendment by Ziya\n this.addNodetoCy(nodeData, null);\n }\n\n this.cy.nodes().updateCompoundBounds();\n };\n\n addNewNodeToShareDB(nodeData: any, posData: any)\n {\n this.shareDBManager.addNewNode(nodeData,posData);\n };\n\n //Edge related functions\n addEdge(edgeData: any)\n {\n if (this.isCollaborative)\n {\n this.addNewEdgeShareDB(edgeData);\n }\n else\n {\n this.addNewEdgetoCy(edgeData);\n }\n };\n\n addEdges(edges: any[])\n {\n for (var i in edges)\n {\n this.addEdge(edges[i].data);\n }\n };\n\n addEdgesCy(edges: any[])\n {\n const newEdges = [];\n\n\n for (var i in edges)\n {\n const newEdge =\n {\n group: \"edges\",\n data: edges[i].data\n };\n newEdges.push(newEdge);\n }\n this.cy.add(newEdges);\n };\n\n addNewEdgeShareDB(edgeData: any)\n {\n this.shareDBManager.addNewEdge(edgeData);\n };\n\n addNewEdgetoCy(edgeData: any)\n {\n var newEdge =\n {\n group: \"edges\",\n data: edgeData\n };\n this.undoRedoManager.do(\"add\", newEdge);\n };\n\n shareDBEdgeAddRemoveEventCallBack(op: any)\n {\n\n //Get real time node object and sync it to node addition or removal\n var isRemove = Object.keys(op)[1] === 'od';\n var edge = op.oi || op.od;\n\n //Removal Operation\n if (isRemove)\n {\n var edgeID = op.p[1];\n //Remove element from existing graph\n var cyEle = this.cy.$(\"#\" + edgeID);\n this.removeElementCy(cyEle);\n }\n //Addition Operation\n else\n {\n this.addNewEdgeLocally(edge);\n }\n };\n\n addNewElementsLocally(realTimeNodeArray: any[], realTimeEdgeArray: any[])\n {\n const nodeList: any[] = [];\n const nodeMap: any = {};\n\n for (var i in realTimeNodeArray)\n {\n var realTimeNode = realTimeNodeArray[i];\n\n var nodeID = realTimeNode.id;\n\n //Added for backward compatibility when width was not defined\n var nodeWidth = (realTimeNode.w == undefined) ? 150 : realTimeNode.w ;\n var nodeHeight = (realTimeNode.h == undefined) ? 52 : realTimeNode.h ;\n var compoundMinWidth = (realTimeNode.minWidth == undefined) ? 0 : realTimeNode.minWidth ;\n var compoundMinWidthBiasLeft = (realTimeNode.minWidthBiasLeft == undefined) ? 0 : realTimeNode.minWidthBiasLeft ;\n var compoundMinWidthBiasRight = (realTimeNode.minWidthBiasRight == undefined) ? 0 : realTimeNode.minWidthBiasRight ;\n var compoundMinHeight = (realTimeNode.minHeight == undefined) ? 0 : realTimeNode.minHeight ;\n var compoundMinHeightBiasTop = (realTimeNode.minHeightBiasTop == undefined) ? 0 : realTimeNode.minHeightBiasTop ;\n var compoundMinHeightBiasBottom = (realTimeNode.minHeightBiasBottom == undefined) ? 0 : realTimeNode.minHeightBiasBottom;\n\n const nodeData =\n {\n group: 'nodes',\n // TODO: Amendment by Ziya\n position: {},\n data:\n {\n id: nodeID,\n type: realTimeNode.type,\n name: realTimeNode.name,\n parent: realTimeNode.parent,\n w: nodeWidth,\n h: nodeHeight\n },\n style:\n {\n 'min-width': compoundMinWidth,\n 'min-width-bias-left': compoundMinWidthBiasLeft,\n 'min-width-bias-right': compoundMinWidthBiasRight,\n 'min-height': compoundMinHeight,\n 'min-height-bias-top': compoundMinHeightBiasTop,\n 'min-height-bias-bottom': compoundMinHeightBiasBottom\n }\n };\n\n if (nodeData.data.parent === undefined )\n {\n delete nodeData.data.parent;\n }\n\n if (realTimeNode.x && realTimeNode.y)\n {\n nodeData.position =\n {\n x: realTimeNode.x,\n y: realTimeNode.y\n }\n }\n\n nodeMap[nodeID] = nodeData;\n nodeList.push(nodeData);\n }\n\n var edgeList = [];\n for (var i in realTimeEdgeArray)\n {\n var edge = realTimeEdgeArray[i];\n var edgeID = edge.id;\n\n //If source and and target is somehow lost in remote model do not create this edge\n if(!(edge.source in nodeMap && edge.target in nodeMap))\n continue\n\n var tmpData = {\n id: edgeID,\n type: edge.type,\n source: edge.source,\n target: edge.target,\n pubmedIDs: edge.pubmedIDs,\n name: edge.name,\n }\n\n if (edge.edgeCurveStyle == \"unbundled-bezier\") {\n tmpData['controlPointPositions'] = edge.anchorPoints;\n }\n else {\n tmpData['bendPointPositions'] = edge.anchorPoints;\n }\n\n var edgeData =\n {\n group: 'edges',\n data: tmpData\n };\n\n edgeList.push(edgeData);\n }\n\n this.cy.add(nodeList);\n this.cy.add(edgeList);\n\n this.edgeEditing.initAnchorPoints(this.cy.edges());\n\n this.cy.nodes().updateCompoundBounds();\n }\n\n addNewEdgeLocally(edge: any)\n {\n var edgeData ={\n id: edge.id,\n type: edge.type,\n source: edge.source,\n target: edge.target,\n pubmedIDs: edge.pubmedIDs,\n name: edge.name\n };\n if (edge.edgeCurveStyle == \"unbundled-bezier\") {\n edgeData['controlPointPositions'] = edge.anchorPoints;\n }\n else {\n edgeData['bendPointPositions'] = edge.anchorPoints;\n }\n this.addNewEdgetoCy(edgeData);\n this.edgeEditing.initAnchorPoints(this.cy.getElementById( edge.id ));\n };\n\n reconnectEdge(sourceID: string, targetID: string, edgeData: any) {\n\n if(this.isCollaborative){\n var edge = this.cy.getElementById(edgeData.id);\n this.reconnectEdgeInShareDB(sourceID, targetID, edgeData);\n }\n else{\n var location = {\n source: sourceID,\n target: targetID\n };\n\n var edge = this.cy.getElementById(edgeData.id);\n edge.move(location);\n }\n\n return this.cy.getElementById(edgeData.id);\n };\n\n reconnectEdgeInShareDB(sourceID: string, targetID: string, edgeData: any) {\n this.shareDBManager.reconnectEdge(sourceID, targetID, edgeData);\n };\n\n //Removal functions\n removeElement(ele: any)\n {\n if (this.isCollaborative)\n {\n this.removeElementsFromShareDB(ele);\n }\n else\n {\n this.removeElementsCy(ele);\n }\n };\n\n removeElementCy(ele: any)\n {\n this.undoRedoManager.do(\"remove\", ele);\n };\n\n removeElementsCy(ele: any)\n {\n this.undoRedoManager.do(\"remove\", ele);\n };\n\n removeElementsFromShareDB(eles: any[])\n {\n var self = this;\n eles.forEach(function (ele)\n {\n self.shareDBManager.removeElement(ele.id());\n });\n };\n\n removeElementFromShareDB(ele: any)\n {\n this.shareDBManager.removeElement(ele.id());\n };\n\n changeParents(eles: any[], newParentId: string)\n {\n if(this.isCollaborative)\n {\n this.changeParentShareDB(eles, newParentId);\n }\n else\n {\n var parentData = newParentId ? newParentId : null;\n\n // Old manual way to change parents in local mode\n //this.changeParentCy(eles, newParentId);\n\n //Save element's previous width & height in dim array\n const dim : any[]= [];\n const id : any[]= [];\n eles.forEach(function (ele: any)\n {\n var parameters =\n {\n id: ele.id(),\n width: ele.data(\"w\"),\n height: ele.data(\"h\")\n };\n dim.push(parameters);\n id.push(ele.id());\n });\n\n const parentElem = this.cy.getElementById(parentData);\n var param = {\n firstTime: true,\n parentData: parentData, // It keeps the newParentId (Just an id for each nodes for the first time)\n nodes: eles,\n posDiffX: (!parentData) ? 0 : parentElem.position('x') - eles[0].position('x'),\n posDiffY: (!parentData) ? 0 : parentElem.position('y') - eles[0].position('y')\n };\n this.undoRedoManager.do('changeParent', param);\n\n //The elements after change parent operation are different so we find them by using the saved ids\n // and add them to the collection\n var collection = this.cy.collection();\n for (var i in id)\n {\n var elementById = this.cy.getElementById(id[i]);\n collection = collection.add(elementById);\n }\n //Set their previous size to the new elements in the collection\n collection.forEach(function (ele: any, i: number)\n {\n if (ele.id() == dim[i].id)\n ele.data(\"w\", dim[i].width);\n ele.data(\"h\", dim[i].height);\n });\n }\n };\n\n changeParentShareDB (eles: any, newParentId: string)\n {\n\n var classRef = this;\n function getTopLevelParents(eles: any[])\n {\n var tpMostNodes = classRef.cy.collection();\n const parentMap : any = {};\n\n //Get all parents\n eles.forEach(function (node)\n {\n if(node.isParent())\n parentMap[node.id()] = node;\n });\n\n //Get all parents\n eles.forEach(function (node)\n {\n var nodeParent = node.parent();\n\n if(parentMap[nodeParent.id()] === undefined)\n tpMostNodes = tpMostNodes.union(node);\n });\n\n return tpMostNodes;\n }\n\n\n class NodeObj{\n public nodeRef: any;\n public children: any;\n constructor(nodeObj: any){\n this.nodeRef = nodeObj;\n this.children = [];\n }\n }\n var connectedEdges = eles.connectedEdges();\n // Traverses given elements and constructs subgraph relations\n // creates a nested structure into rootnodeObj\n function traverseNodes(eles: any[], rootNodeObj: any)\n {\n eles.forEach(function (ele)\n {\n connectedEdges = connectedEdges.union(ele.connectedEdges());\n\n if(ele.isParent())\n {\n rootNodeObj.children.push(new NodeObj(ele));\n var lengthOfChildrenArray = rootNodeObj.children.length;\n traverseNodes(ele.children(), rootNodeObj.children[lengthOfChildrenArray-1]);\n }\n else\n {\n rootNodeObj.children.push(new NodeObj(ele));\n }\n });\n }\n\n //Create new collection\n var topMostNodes = getTopLevelParents(eles);\n\n var rootNodeR = new NodeObj(null);\n\n traverseNodes(topMostNodes, rootNodeR);\n this.shareDBManager.changeParent(rootNodeR, newParentId, connectedEdges);\n };\n\n changeParentCy(eles: any[], newParentId: string)\n {\n let lockedNodes: any = {};\n const self = this;\n\n function removeNodes(nodes: any)\n {\n //Get removed edges first\n let removedEles = nodes.connectedEdges().remove();\n const children = nodes.children();\n\n if (children != null && children.length > 0)\n {\n children.forEach(function(childNode: any)\n {\n lockedNodes[childNode.id()] = true;\n });\n\n removedEles = removedEles.union(removeNodes(children));\n }\n\n removedEles = removedEles.union(nodes.remove());\n self.cy.nodes().updateCompoundBounds();\n return removedEles;\n }\n\n\n var removedEles = removeNodes(eles);\n this.undoRedoManager.do(\"remove\", removedEles);\n\n for (var i = 0; i < removedEles.length; i++)\n {\n var removedNode = removedEles[i];\n\n //Just alter the parent id of corresponding nodes !\n if (removedNode.isEdge() || lockedNodes[removedNode.id()])\n {\n continue;\n }\n\n removedNode._private.data.parent = newParentId;\n if(removedNode._private.parent){\n delete removedNode._private.parent;\n }\n }\n\n self.cy.add(removedEles);\n this.undoRedoManager.do(\"add\", removedEles);\n self.cy.nodes().updateCompoundBounds();\n };\n\n moveElements(eles: any[])\n {\n var classRef = this;\n //Sync movement to real time api\n if(this.isCollaborative)\n {\n eles.forEach(function (ele: any)\n {\n classRef.shareDBManager.moveElement(ele);\n });\n }\n };\n\n resizeElements(ele: any)\n {\n if(this.isCollaborative) {\n if (!ele.isParent()) {\n var previousWidth = ele.width();\n var previousHeight = ele.height();\n //Sync movement to real time api\n this.shareDBManager.resizeElement(ele, previousWidth, previousHeight);\n }\n else {\n var minWidth = ele.style('min-width');\n var minWidthBiasLeft = ele.style('min-width-bias-left');\n var minWidthBiasRight = ele.style('min-width-bias-right');\n var minHeight = ele.style('min-height');\n var minHeightBiasTop = ele.style('min-height-bias-top');\n var minHeightBiasBottom = ele.style('min-height-bias-bottom');\n\n //Sync movement to real time api\n this.shareDBManager.resizeCompound(ele, minWidth, minWidthBiasLeft, minWidthBiasRight, minHeight, minHeightBiasTop, minHeightBiasBottom);\n }\n }\n };\n\n mergeGraph(nodes: any[], edges: any[])\n {\n if (this.isCollaborative)\n {\n //Collaborative usage\n this.shareDBManager.mergeGraph(nodes,edges);\n }\n else\n {\n //Local usage file load\n this.mergeGraphCy(nodes,edges);\n }\n this.fitGraph();\n };\n\n mergeGraphCy(nodes: any[], edges: any[])\n {\n //Define arrays and maps\n const nodesToBeAdded = [];\n const edgesToBeAdded = [];\n const nodeMap : any= {};\n\n //Iterate over nodes and find nodes that does not exist in current graph by looking their name\n for (var index in nodes)\n {\n var ele = nodes[index];\n nodeMap[ele.data.id] = ele;\n\n if (this.cy.filter('node[name = \"'+ele.data.name+'\"]').length <= 0)\n {\n nodesToBeAdded.push(ele);\n }\n }\n\n this.cy.add(nodesToBeAdded);\n\n //Iterate over all edges\n for (var index in edges)\n {\n //Get corresponding source and target node in merge file\n var ele = edges[index];\n var sourceNode = nodeMap[ele.data.source];\n var targetNode = nodeMap[ele.data.target];\n\n //Check if there are nodes with same name in current graph\n var cySourceNode = this.cy.nodes('[name=\"'+sourceNode.data.name+'\"]');\n var targetNode = this.cy.nodes('[name=\"'+targetNode.data.name+'\"]');\n\n if (cySourceNode.length > 0)\n {\n ele.data.source = cySourceNode.id();\n }\n\n if (targetNode.length > 0)\n {\n ele.data.target = targetNode.id();\n }\n\n if (targetNode.length < 0 && cySourceNode.length < 0 ) {\n continue;\n }\n\n var edgesBtw = this.cy.filter('edge[source = \"'+cySourceNode.id()+'\"][target = \"'+targetNode.id()+'\"]');\n\n //We assume there could be one edge between source and target node with same type\n var isFound = false;\n edgesBtw.forEach(function(edge: any)\n {\n if (edge.data().type == ele.data.type)\n {\n isFound = true;\n return false;\n }\n //TODO: AMENDMENT by Ziya\n return true;\n });\n\n if (!isFound)\n {\n delete ele.data.id;\n edgesToBeAdded.push(ele);\n }\n }\n\n this.cy.add(edgesToBeAdded);\n };\n\n fitGraph()\n {\n if(this.isCollaborative)\n {\n this.cy.fit(this.FIT_CONSTANT);\n var newState =\n {\n zoomLevel: this.cy.zoom(),\n panLevel: this.cy.pan()\n };\n this.updateGlobalOptions(newState);\n }\n else\n {\n this.cy.fit(this.FIT_CONSTANT);\n }\n }\n\n loadFile(nodes: any[], edges: any[])\n {\n if (this.isCollaborative)\n {\n //Real time load graph\n this.loadfileShareDB(nodes, edges);\n }\n else\n {\n //Local usage file load\n this.loadFileCy(nodes,edges);\n }\n \n this.edgeEditing.initAnchorPoints(this.cy.edges());\n \n this.fitGraph();\n };\n\n loadFileCy(nodes: any[], edges: any[])\n {\n //Remove all elements\n this.removeElementCy(this.cy.elements());\n\n this.addNodesCy(nodes);\n this.addEdgesCy(edges);\n };\n\n loadfileShareDB(nodes: any[], edges: any[])\n {\n this.shareDBManager.loadGraph(nodes,edges);\n };\n\n removeAllElements()\n {\n if (this.isCollaborative)\n {\n this.shareDBManager.removeAllElements();\n }\n else\n {\n this.cy.remove(this.cy.elements());\n }\n };\n\n updateHighlight(ele: any, isHighlighted: boolean)\n {\n if (isHighlighted)\n this.undoRedoManager.do('highlightOthers', ele);\n else\n this.undoRedoManager.do('removeOtherHighlight', ele);\n };\n\n\n @autobind\n updateVisibility(ele: any, isHidden: boolean)\n {\n if (isHidden)\n this.viewUtilities.hide(ele);\n else\n this.viewUtilities.show(ele);\n };\n\n updateElementCallback(op: any)\n {\n var ele = op.oi;\n var eleID = ele.id;\n var cyEle = this.cy.$(\"#\" + eleID);\n this.changeNameCy(cyEle, ele.name);\n\n if (cyEle.isNode())\n {\n //Width and height of simple nodes and compounds is changed differently\n if (cyEle.isParent())\n {\n cyEle.style(\"min-width\", ele.minWidth);\n cyEle.style(\"min-width-bias-left\", ele.minWidthBiasLeft);\n cyEle.style(\"min-width-bias-right\", ele.minWidthBiasRight);\n cyEle.style(\"min-height\", ele.minHeight);\n cyEle.style(\"min-height-bias-top\", ele.minHeightBiasTop);\n cyEle.style(\"min-height-bias-bottom\", ele.minHeightBiasBottom);\n }\n else\n {\n cyEle.data('w', ele.w);\n cyEle.data('h', ele.h);\n //Position is changed only for simple nodes because the\n //position of compounds is defined by simple nodes' position\n cyEle.position({x: ele.x, y: ele.y});\n }\n\n this.updateVisibility(cyEle, ele.isHidden);\n this.updateHighlight(cyEle, ele.isHighlighted);\n\n if(ele.isInvalidGene)\n {\n this.doHighlightInvalidGenes(cyEle);\n }\n else\n {\n this.undoHighlightInvalidGenes(cyEle);\n }\n }\n else if(cyEle.isEdge())\n {\n var pubmedArray = ele.pubmedIDs;\n cyEle.data('pubmedIDs', pubmedArray);\n this.updateHighlight(cyEle, ele.isHighlighted);\n\n var anchorPoints = ele.anchorPoints;\n\n //If edge is reconnected\n if ( ele.source !== cyEle.source().id() || ele.target !== cyEle.target().id()){\n var location = {\n source: ele.source,\n target: ele.target\n };\n cyEle.move(location);\n //make sure that bend points are same\n this.edgeEditing.initAnchorPoints(cyEle);\n }\n else {\n if (ele.edgeCurveStyle === \"bezier\") {\n const anchors = this.edgeEditing.getAnchorsAsArray(cyEle);\n if (anchors && anchors.length > 0) {\n for (let i = 0; i < anchors.length / 2; i++) {\n this.edgeEditing.deleteSelectedAnchor(cyEle, 0);\n }\n }\n }\n else if (ele.edgeCurveStyle === \"unbundled-bezier\") {\n cyEle.data('controlPointPositions', anchorPoints);\n }\n else {\n cyEle.data('bendPointPositions', anchorPoints);\n }\n \n this.edgeEditing.initAnchorPoints(cyEle);\n }\n }\n };\n\n getGenomicDataSVG(node: any)\n {\n // @ts-ignore\n return this.genomicDataOverlayManager.generateSVGForNode(node);\n }\n\n getOncoprintDataSVG(node: any) \n {\n return this.genomicDataOverlayManager.generateOncoprintForPatientNode(node);\n }\n\n removeGenomicData()\n {\n if(this.isCollaborative)\n {\n this.shareDBManager.clearGenomicData();\n }\n else\n {\n // TODO wrap this in afunction in genomic data overlay manager\n this.genomicDataOverlayManager.clearAllGenomicData();\n this.genomicDataOverlayManager.hideGenomicData();\n this.genomicDataOverlayManager.notifyObservers();\n }\n\n }\n\n addGenomicData(genomicData: any)\n {\n const groupID = this.getEmptyGroupID();\n\n if(this.isCollaborative)\n {\n var parsedGenomicData = this.genomicDataOverlayManager.prepareGenomicDataShareDB(genomicData);\n this.shareDBManager.addGenomicData(parsedGenomicData.genomicDataMap);\n this.shareDBManager.groupGenomicData(Object.keys(parsedGenomicData.visibilityMap),\n groupID);\n \n let currentVisibleGenomicDataCount = this.genomicDataOverlayManager.countVisibleGenomicDataByType();\n Object.keys(parsedGenomicData.visibilityMap).forEach(study => {\n if (parsedGenomicData.visibilityMap[study] && (currentVisibleGenomicDataCount >= 6)) {\n parsedGenomicData.visibilityMap[study] = false;\n }\n else if(parsedGenomicData.visibilityMap[study]) {\n currentVisibleGenomicDataCount++;\n }\n });\n\n this.shareDBManager.addGenomicVisibilityData(parsedGenomicData.visibilityMap);\n }\n else\n {\n this.genomicDataOverlayManager.addGenomicDataLocally(genomicData, groupID);\n }\n }\n\n adjustVisibilityShareDB(profileId: string, isEnabled: boolean){\n const targetProfileIndex = this.profiles.map(profile => profile.profileId).indexOf(profileId);\n this.setProfile(targetProfileIndex, {\n ...this.profiles[targetProfileIndex],\n enabled: isEnabled\n }); \n }\n\n addToProfiles(profileId: string){\n // Check if this profile already exists\n if(this.profiles.map(profile => profile.profileId).includes(profileId)){\n return;\n }\n\n this.addProfile({\n profileId: profileId, \n enabled: true\n });\n }\n\n addPortalGenomicData(genomicData: any, groupID: any)\n {\n \n if(this.isCollaborative)\n {\n var parsedGenomicData = this.genomicDataOverlayManager.preparePortalGenomicDataShareDB(genomicData);\n this.shareDBManager.addGenomicData(parsedGenomicData.genomicDataMap);\n this.shareDBManager.groupGenomicData(Object.keys(parsedGenomicData.visibilityMap),\n groupID);\n this.shareDBManager.addGenomicVisibilityData(parsedGenomicData.visibilityMap);\n }\n else\n {\n this.genomicDataOverlayManager.addPortalGenomicData(genomicData, groupID);\n }\n }\n\n shareDBGenomicDataHandler(op: any)\n {\n var isRemove = Object.keys(op)[1] === 'od';\n var newData = op.oi;\n var geneSymbol = op.p[1];\n\n\n if(!isRemove)\n {\n this.genomicDataOverlayManager.addGenomicDataWithGeneSymbol(geneSymbol, newData);\n\n }\n // Removal\n else\n {\n this.genomicDataOverlayManager.removeGenomicDataWithGeneSymbol(geneSymbol);\n }\n }\n\n\n shareDBGenomicDataGroupChangeHandler(op: any)\n {\n\n var isRemove = Object.keys(op)[1] === 'od';\n var data = op.oi;\n var key = op.p[1];\n\n // Addition\n if(!isRemove)\n {\n this.genomicDataOverlayManager.addGenomicGroupData(key, data);\n if(data.length !== 1){\n console.log(\"Grouped genomic data expected to be of length 1\");\n }\n data.forEach((profileId: any) => {this.addToProfiles(profileId)});\n }\n // //Removal\n // else\n // {\n //\n // }\n this.genomicDataOverlayManager.showGenomicData();\n this.genomicDataOverlayManager.notifyObservers();\n }\n\n shareDBGenomicDataVisibilityHandler(op: any)\n {\n var data = op.oi;\n var key = op.p[1];\n var isRemove = Object.keys(op)[1] === 'od';\n // Addition\n if(!isRemove)\n {\n this.genomicDataOverlayManager.addGenomicVisData(key, data);\n\n this.adjustVisibilityShareDB(key, data);\n }\n // Removal\n else\n {\n this.genomicDataOverlayManager.removeGenomicVisData();\n this.removeProfiles();\n }\n\n this.genomicDataOverlayManager.showGenomicData();\n this.genomicDataOverlayManager.notifyObservers();\n }\n\n updateGenomicDataColorSchemeHandler(op: any)\n {\n let colorScheme = op.li;\n \n this.setGenomicDataOverlayColorScheme(colorScheme);\n\n this.colorSchemeChangeCallback(colorScheme);\n \n this.genomicDataOverlayManager.updateColorScheme(colorScheme);\n this.genomicDataOverlayManager.showGenomicData();\n this.genomicDataOverlayManager.notifyObservers();\n }\n\n resizeNodesToContent(nodes: any[])\n {\n if(this.isCollaborative)\n {\n const visibleNumberOfData = this.genomicDataOverlayManager.countVisibleGenomicDataByType();\n const labelWithData = 148 + (visibleNumberOfData-3) * 36;\n const rt = this.shareDBManager;\n nodes.forEach(function( ele ){\n if (!ele.isParent())\n {\n var newWidth = 150;\n var newHeight = 52;\n if (ele.data('name') != \"\")\n {\n var labelLength = ele.style('label').length*10 + 6;\n newWidth = labelLength;\n newHeight = 24;\n }\n if (ele.data('type') !== \"PROCESS\" && visibleNumberOfData > 0)\n {\n newHeight = 52;\n if (visibleNumberOfData < 4)\n {\n if (150 > newWidth)\n newWidth = 150;\n }\n else\n {\n if (labelWithData > newWidth)\n newWidth = labelWithData;\n }\n }\n rt.setSizeOfElement(ele, newWidth, newHeight);\n }\n else\n {\n //Set the minWidth, minHeight and other properties of compound to 0\n rt.resizeCompound(ele, 0, 0, 0, 0, 0, 0);\n }\n });\n }\n else\n {\n const ur = this.cy.undoRedo();\n const actions: any[] = [];\n\n const visibleNumberOfData = this.genomicDataOverlayManager.countVisibleGenomicDataByType();\n const labelWithData = 150 + (visibleNumberOfData-3) * 36;\n nodes.forEach(function( ele: any){\n if (!ele.isParent())\n {\n let newWidth = 150;\n let newHeight = 52;\n if (ele.data('name') != \"\") {\n var labelLength = ele.style('label').length * 6 + 24;\n newWidth = labelLength;\n newHeight = 24;\n }\n if (ele.data('type') !== \"PROCESS\" && \n visibleNumberOfData > 0) {\n \n newHeight = 52;\n if (visibleNumberOfData < 4) {\n if (150 > newWidth)\n newWidth = 150;\n }\n else {\n if (labelWithData > newWidth)\n newWidth = labelWithData;\n }\n }\n const args = {\n ele: ele,\n oldWidth: ele.width(),\n newWidth: newWidth,\n oldHeight: ele.height(),\n newHeight: newHeight\n };\n actions.push({name: \"changeNodeSize\", param: args});\n }\n else\n {\n const args = {\n ele: ele,\n oldMinWidth: ele.style(\"min-width\"),\n newMinWidth: 0,\n oldMinWidthBiasLeft: ele.style(\"min-width-bias-left\"),\n newMinWidthBiasLeft: 0,\n oldMinWidthBiasRight: ele.style(\"min-width-bias-right\"),\n newMinWidthBiasRight: 0,\n oldMinHeight: ele.style(\"min-height\"),\n newMinHeight: 0,\n oldMinHeightBiasTop: ele.style(\"min-height-bias-top\"),\n newMinHeightBiasTop: 0,\n oldMinHeightBiasBottom: ele.style(\"min-height-bias-bottom\"),\n newMinHeightBiasBottom: 0\n };\n actions.push({name: \"changeCompoundSize\", param: args});\n }\n });\n\n ur.do(\"batch\", actions);\n }\n this.cy.nodeEditing('get').refreshGrapples();\n };\n\n\n\n}\n","import _ from \"lodash\";\nimport { action, makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React from \"react\";\nimport {\n Button,\n Checkbox,\n Col,\n ControlLabel,\n Form,\n FormControl,\n InputGroup,\n Modal\n} from \"react-bootstrap\";\nimport EditorActionsManager from \"../managers/EditorActionsManager\";\nimport { EModalType } from \"../ui/react-pathway-mapper\";\nimport PathwayActions from \"../utils/PathwayActions\";\n\ninterface ILayoutPropertiesProps {\n show: boolean;\n handleClose: (modelId: EModalType) => void;\n pathwayActions: PathwayActions;\n}\n\nexport interface ILayoutProperties {\n name: string;\n animationDuration: number;\n animationEasing: string;\n nodeRepulsion: number;\n idealEdgeLength: number;\n edgeElasticity: number;\n nestingFactor: number;\n gravity: number;\n numIter: number;\n gravityRangeCompound: number;\n gravityCompound: number;\n gravityRange: number;\n tilingPaddingVertical: number;\n tilingPaddingHorizontal: number;\n initialEnergyOnIncremental: number;\n tile: boolean;\n animate: boolean;\n randomize: boolean;\n}\n\n@observer\nexport default class LayoutProperties extends React.Component<\n ILayoutPropertiesProps\n> {\n static layoutProperties: ILayoutProperties;\n\n @observable\n internalLayoutProperties: ILayoutProperties;\n\n constructor(props: ILayoutPropertiesProps) {\n super(props);\n makeObservable(this);\n this.internalLayoutProperties = _.clone(\n EditorActionsManager.defaultLayoutProperties\n );\n LayoutProperties.layoutProperties = _.clone(EditorActionsManager.defaultLayoutProperties);\n }\n\n @action.bound\n updateInternalLayoutProperty(property: string, val: boolean | number) {\n this.internalLayoutProperties[property] = val;\n }\n\n render() {\n\n return (\n {\n this.internalLayoutProperties = _.clone(LayoutProperties.layoutProperties);\n }}\n onHide={() => {\n this.internalLayoutProperties = _.clone(LayoutProperties.layoutProperties);\n this.props.handleClose(EModalType.LAYOUT);\n }}\n >\n \n \n Layout Properties\n \n \n \n
\n \n \n Node Repulsion:\n \n\n \n {\n this.updateInternalLayoutProperty(\"nodeRepulsion\", Number(e.target.value));\n }}\n />\n \n \n \n \n Ideal Edge Length:\n \n\n \n {\n this.updateInternalLayoutProperty(\"idealEdgeLength\", Number(e.target.value));\n }}\n />\n \n \n \n \n Edge Elasticity:\n \n\n \n {\n this.updateInternalLayoutProperty(\"edgeElasticity\", Number(e.target.value));\n }}\n />\n \n \n \n \n Nesting Factor:\n \n\n \n {\n this.updateInternalLayoutProperty(\"nestingFactor\", Number(e.target.value));\n }}\n />\n \n \n \n \n Gravity:\n \n\n \n {\n this.updateInternalLayoutProperty(\"gravity\", Number(e.target.value));\n }}\n />\n \n \n \n \n Gravity Range:\n \n\n \n {\n this.updateInternalLayoutProperty(\"gravityRange\", Number(e.target.value));\n }}\n />\n \n \n \n \n Compound Gravity:\n \n\n \n {\n this.updateInternalLayoutProperty(\"gravityCompound\", Number(e.target.value));\n }}\n />\n \n \n \n \n Compound Gravity Range:\n \n\n \n {\n this.updateInternalLayoutProperty(\"gravityRangeCompound\", Number(e.target.value));\n }}\n />\n \n \n \n \n Number of Iterations:\n \n\n \n {\n this.updateInternalLayoutProperty(\"numIter\", Number(e.target.value));\n }}\n />\n \n \n \n \n Tiling Vertical Padding:\n \n\n \n {\n this.updateInternalLayoutProperty(\"tilingPaddingVertical\", Number(e.target.value));\n }}\n />\n \n \n \n \n Tiling Horizontal Padding:\n \n\n \n {\n this.updateInternalLayoutProperty(\"tilingPaddingHorizontal\", Number(e.target.value));\n }}\n />\n \n \n \n \n Tile Disconnected:\n \n\n \n {\n this.updateInternalLayoutProperty(\"tile\", !this.internalLayoutProperties.tile);\n }}\n >\n \n \n \n \n Animate:\n \n\n \n {\n this.updateInternalLayoutProperty(\"animate\",!this.internalLayoutProperties.animate);\n }}\n >\n \n \n \n \n Incremental:\n \n\n \n {\n this.updateInternalLayoutProperty(\"randomize\", !this.internalLayoutProperties.randomize);\n }}\n >\n \n \n \n \n Incremental Cooling Factor:\n \n\n \n {\n this.updateInternalLayoutProperty(\"initialEnergyOnIncremental\", Number(e.target.value));\n }}\n />\n \n \n
\n
\n\n \n {\n LayoutProperties.layoutProperties = _.clone(this.internalLayoutProperties);\n this.props.pathwayActions.setLayoutProperties(\n LayoutProperties.layoutProperties\n );\n this.props.handleClose(EModalType.LAYOUT);\n }}\n >\n Save\n \n\n {\n this.internalLayoutProperties = _.clone(\n EditorActionsManager.defaultLayoutProperties\n );\n LayoutProperties.layoutProperties = _.clone(this.internalLayoutProperties);\n this.props.pathwayActions.setLayoutProperties(\n this.internalLayoutProperties\n );\n }}\n >\n Default\n \n \n \n );\n }\n}\n","import { observer } from 'mobx-react';\nimport React from 'react';\nimport { Button, Col, ControlLabel, Form, FormControl, InputGroup, Modal } from 'react-bootstrap';\nimport { IPathwayInfo } from '../managers/FileOperationsManager';\nimport { EModalType } from '../ui/react-pathway-mapper';\nimport PathwayActions from '../utils/PathwayActions';\n\ninterface IPathwayDetailsModalProps{\n show: boolean;\n handleClose: Function;\n pathwayActions: PathwayActions;\n}\n\n@observer\nexport default class PathwayDetailsModal extends React.Component{\n\n pathwayInfo: IPathwayInfo;\n\n constructor(props: IPathwayDetailsModalProps){\n super(props);\n }\n\n render(){\n\n this.pathwayInfo = this.props.pathwayActions.getPathwayInfo;\n\n return(\n\n {this.props.handleClose(4)}}>\n \n Pathway Properties\n \n \n
\n\n \n \n Pathway Title:\n \n \n {this.pathwayInfo.pathwayTitle = e.target.value;}}value={this.pathwayInfo.pathwayTitle}/>\n \n \n\n \n \n Pathway Description:\n \n \n \n \n \n\n
\n
\n\n \n \n \n
\n\n )\n\n }\n}","import autobind from \"autobind-decorator\";\nimport { action, makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React from \"react\";\nimport { Button, Col, Modal, Row } from \"react-bootstrap\";\nimport { EModalType, IColorValueMap } from \"../ui/react-pathway-mapper\";\n\nconst addButtonImg = require(\"../images/add.svg\");\nconst deleteButtonImg = require(\"../images/delete-simple.svg\");\n\ninterface IValueColorObj {\n value: string;\n color: string;\n}\n\ninterface IProfilesColorSchemeModalProps {\n show: boolean;\n handleClose: (modalId: EModalType) => void;\n colorValueMapping: IColorValueMap;\n handleColorMappingChange: (colorMapping: IColorValueMap) => void;\n}\n\n@observer\nexport default class ProfilesColorSchemeModal extends React.Component<\n IProfilesColorSchemeModalProps,\n {}\n> {\n @observable\n colorMappings: IValueColorObj[];\n\n @observable\n showUniqueValuesWarningModal: boolean;\n\n constructor(props: IProfilesColorSchemeModalProps) {\n super(props);\n makeObservable(this);\n this.initColorMappings();\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.show === false && this.props.show === true) {\n this.initColorMappings();\n }\n }\n\n initColorMappings() {\n this.colorMappings = Object.entries(this.props.colorValueMapping)\n .map(([value, color]) => {\n return {\n value: value,\n color: color,\n };\n })\n .sort((o1, o2) => {\n return Number(o1.value) - Number(o2.value);\n });\n }\n\n @action.bound\n handleColorChange(index: number, color: string) {\n this.colorMappings[index].color = color;\n }\n\n @action.bound\n handleValueChange(index: number, value: string) {\n this.colorMappings[index].value = value;\n }\n\n @action.bound\n addDefaultColorMapping() {\n this.colorMappings.push({ value: \"0\", color: \"#ffffff\" });\n }\n\n @action.bound\n removeColorMapping(index: number) {\n this.colorMappings.splice(index, 1);\n }\n\n @action.bound\n setDefaultColorMapping() {\n this.colorMappings = [\n { value: \"-100\", color: \"#0000ff\" },\n { value: \"0\", color: \"#ffffff\" },\n { value: \"100\", color: \"#ff0000\" },\n ];\n }\n\n @action.bound\n setShowUniqueValuesWarningModal(val: boolean) {\n this.showUniqueValuesWarningModal = val;\n }\n\n @autobind\n handleSaveColorScheme(): boolean {\n const mapping = {};\n this.colorMappings.forEach((pair) => {\n mapping[pair.value] = pair.color;\n });\n\n if (Object.keys(mapping).length < 2) {\n this.setShowUniqueValuesWarningModal(true);\n return false;\n } else {\n this.props.handleColorMappingChange(mapping);\n return true;\n }\n }\n\n @autobind\n close() {\n this.props.handleClose(EModalType.PROFILES_COLOR_SCHEME);\n }\n\n render() {\n const mappingElements = this.colorMappings.map((mapping, index) => (\n \n \n \n {\n const value = event.target.value;\n this.handleValueChange(index, value);\n }}\n >\n \n \n {\n const color = event.target.value;\n this.handleColorChange(index, color);\n }}\n />\n \n \n 2 ? \"icon-enabled\" : \"icon-disabled\")\n }\n title={\"Remove\"}\n onClick={() => {\n this.removeColorMapping(index);\n }}\n >\n \n \n \n ));\n\n return (\n {\n this.close();\n }}\n bsSize=\"small\"\n >\n \n Study Data Overlay Color Scheme\n \n\n \n \n \n \n \n \n \n \n \n \n \n
\n {mappingElements}\n \n\n this.setShowUniqueValuesWarningModal(false)}\n bsSize=\"small\"\n >\n \n \n Warning \n \n \n \n

Please set at least two unique value-color mappings.

\n
\n \n {\n this.setShowUniqueValuesWarningModal(false);\n }}\n >\n OK\n \n \n \n
\n\n \n {\n this.close();\n }}\n >\n Cancel\n \n {\n this.setDefaultColorMapping();\n }}\n >\n Default\n \n {\n const close = this.handleSaveColorScheme();\n if (close) {\n this.close();\n }\n }}\n >\n Save\n \n \n \n );\n }\n}\n","import { action, computed, makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React from \"react\";\nimport { Button, Modal } from \"react-bootstrap\";\nimport EditorActionsManager from \"../managers/EditorActionsManager\";\nimport { EModalType, IProfileMetaData } from \"../ui/react-pathway-mapper\";\ninterface IProfilesModalProps {\n profiles: IProfileMetaData[];\n editor: EditorActionsManager;\n show: boolean;\n handleClose: Function;\n handleProfileLabelClicked: (index: number) => void;\n enabledProfileCountLimit: number;\n}\n\n@observer\nexport default class ProfilesModal extends React.Component<\n IProfilesModalProps,\n {}\n> {\n\n\n @observable\n showEnabledProfileWarningModal: boolean = false;\n\n constructor(props: IProfilesModalProps) {\n super(props);\n\n makeObservable(this);\n }\n\n @action\n setShowEnabledProfileWarningModal(val: boolean) {\n this.showEnabledProfileWarningModal = val;\n }\n\n @computed get profileEnabledMap() {\n\n const enabledProfiles: IProfileMetaData[] = [];\n this.props.profiles.forEach(profile => {\n if (profile.enabled && enabledProfiles.length < this.props.enabledProfileCountLimit) {\n enabledProfiles.push(profile);\n }\n });\n\n const profileEnabledMap = {};\n this.props.profiles.forEach((profile: IProfileMetaData) => {\n const enabled = enabledProfiles.indexOf(profile) > -1;\n profileEnabledMap[profile.profileId] = enabled;\n });\n return profileEnabledMap;\n }\n\n handleProfileLabelClicked(index: number) {\n this.props.handleProfileLabelClicked(index);\n }\n\n render() {\n const profileLabels = this.props.profiles.map(\n (profile: IProfileMetaData, i: number) => (\n \n {\n const enabledProfileCount = this.props.profiles.filter(profile => profile.enabled).length;\n if (this.props.profiles[i].enabled || enabledProfileCount < this.props.enabledProfileCountLimit) {\n this.handleProfileLabelClicked(i);\n this.props.editor.updateGenomicDataVisibility(\n this.profileEnabledMap\n );\n }\n else {\n this.setShowEnabledProfileWarningModal(true);\n }\n }}\n style={{\n cursor: \"pointer\",\n margin: \"10px\"\n }}\n bsStyle={this.props.profiles[i].enabled ? \"primary\" : \"default\"}\n >\n {profile.profileId}\n \n \n )\n );\n\n return (\n {\n this.props.handleClose(EModalType.PROFILES);\n }}\n >\n \n Genomic Data Set(s) to Show\n \n \n {profileLabels.length > 0 ? (\n profileLabels\n ) : (\n

There is currently no data to show

\n )}\n this.setShowEnabledProfileWarningModal(false)}>\n \n \n Warning\n \n \n \n

At most 6 data sets can be displayed at the same time, please disable some other data set before enabling this.

\n
\n \n {\n this.setShowEnabledProfileWarningModal(false);\n }}>\n OK\n \n \n \n
\n \n );\n }\n}\n","import React from 'react';\nimport { EModalType } from '../ui/react-pathway-mapper';\nimport {Modal} from 'react-bootstrap';\ninterface IQuickHelpModalProps{\n show: boolean;\n handleClose: (modalId: EModalType) => void;\n}\n\nexport default class QuickHelpModal extends React.Component{\n\n constructor(props: IQuickHelpModalProps){\n super(props);\n }\n\n render(){\n\n\n return(\n {this.props.handleClose(EModalType.HELP)}}>\n \n Quick Help\n \n \n
    \n
  • To add a node: Drag and drop from node palette
  • \n
  • To add an interaction: Click on interaction type; then click on small circle on source node and release on target node
  • \n
  • To add a node into a container (family, complex, compartment or process): Drag the node into its container node or select nodes to be contained and right click on container node and choose \"Add Selected Into This\"
  • \n
  • To delete nodes/interactions: Select and perform Edit > Delete Selected
  • \n
  • To overlay experiment data: Select Alteration % > Load From cBioPortal...
  • \n
\n
\n\n
\n\n );\n }\n\n\n}","import _ from \"lodash\";\nimport { toast } from 'react-toastify';\nimport EditorActionsManager from \"../managers/EditorActionsManager\";\n\n\nexport default class CBioPortalAccessor{\n static readonly CNA_GAIN = 2;\n\n static readonly GET_ALL_CANCER_STUDIES_URL = \"https://www.cbioportal.org/webservice.do?cmd=getCancerStudies\";\n static readonly GET_GENETIC_PROFILES_URL = \"https://www.cbioportal.org/webservice.do?cmd=getGeneticProfiles&cancer_study_id=\";\n static readonly GET_PROFILE_DATA_URL = \"https://www.cbioportal.org/webservice.do?cmd=getProfileData\";\n static readonly MRNA_EXP_STUDY_NAME = \"_mrna_median_Zscores\";\n static readonly CNA_EXP_STUDY_NAME = \"_gistic\";\n static readonly VALIDATE_GENES_URL = 'https://www.cbioportal.org/api/genes/fetch?geneIdType=HUGO_GENE_SYMBOL&projection=ID'\n static readonly MUTATION_EXP_STUDY_NAME = \"_mutations\";\n\n static readonly CNA_DELETION = -2;\n static readonly Z_SCORE_UPPER_THRESHOLD = 2;\n static readonly Z_SCORE_LOWER_THRESHOLD = -2;\n \n static readonly MUTATION = \"Mutation\";\n static readonly GENE_EXPRESSION = \"Gene Expression\";\n static readonly CNA = \"Copy Number Alteration\";\n\n getDataTypes(){\n return [CBioPortalAccessor.MUTATION, CBioPortalAccessor.GENE_EXPRESSION, CBioPortalAccessor.CNA];\n }\n\n /*\n * Retrieves all cancer studies from cBioPortal\n * **/\n fetchCancerStudies(callbackFunction)\n {\n var cancerStudies = {};\n var request = new XMLHttpRequest();\n request.onreadystatechange = function ()\n {\n if(request.readyState === XMLHttpRequest.DONE && request.status === 200)\n {\n // By lines\n // Match all new line character representations\n var seperator = /\\r?\\n|\\r/;\n var lines = request.responseText.split(seperator);\n\n // start from first line skip node meta data\n for(var i = 1; i < lines.length; i++)\n {\n if (lines[i].length <= 0)\n continue;\n\n var lineData = lines[i].split('\\t');\n cancerStudies[lineData[0]] = lineData;\n }\n callbackFunction(cancerStudies);\n }\n else if (request.readyState === XMLHttpRequest.DONE && request.status !== 200)\n {\n toast.error(\"Could not retrieve studies!\");\n }\n };\n request.open(\"GET\", CBioPortalAccessor.GET_ALL_CANCER_STUDIES_URL);\n request.send();\n };\n\n /**\n * Retrieves all genetic profiles for given cancerStudy from cBioPortal\n */\n getSupportedGeneticProfiles(cancerStudy, callbackFunction)\n {\n var outData = {};\n var request = new XMLHttpRequest();\n var self = this;\n request.onreadystatechange = function ()\n {\n if(request.readyState === XMLHttpRequest.DONE && request.status === 200)\n {\n // By lines\n // Match all new line character representations\n var seperator = /\\r?\\n|\\r/;\n var lines = request.responseText.split(seperator);\n\n // start from first line skip node meta data\n for(var i = 1; i < lines.length; i++)\n {\n if (lines[i].length <= 0)\n continue;\n\n var lineData = lines[i].split('\\t');\n var cancerProfileName = lineData[0];\n if(self.isSupportedCancerProfile(cancerProfileName))\n {\n outData[cancerProfileName] = lineData;\n }\n }\n\n callbackFunction(outData);\n }\n else if (request.readyState === XMLHttpRequest.DONE && request.status !== 200)\n {\n console.error(\"Error retrieving studies\");\n }\n };\n request.open(\"GET\", CBioPortalAccessor.GET_GENETIC_PROFILES_URL + cancerStudy);\n request.send();\n };\n\n isSupportedCancerProfile(cancerProfileName: string)\n {\n return (cancerProfileName.endsWith(CBioPortalAccessor.MRNA_EXP_STUDY_NAME) ||\n cancerProfileName.endsWith(CBioPortalAccessor.CNA_EXP_STUDY_NAME) ||\n cancerProfileName.endsWith(CBioPortalAccessor.MUTATION_EXP_STUDY_NAME));\n };\n\n static getDataType(cancerProfileName: string)\n {\n if ( cancerProfileName.endsWith(this.MRNA_EXP_STUDY_NAME))\n {\n return this.GENE_EXPRESSION;\n }\n else if ( cancerProfileName.endsWith(this.CNA_EXP_STUDY_NAME))\n {\n return this.CNA;\n }\n else if ( cancerProfileName.endsWith(this.MUTATION_EXP_STUDY_NAME))\n {\n return this.MUTATION;\n }\n\n return \"\";\n }\n \n\n calcAlterationPercentages(paramLines, geneticProfileId, callbackFunction)\n {\n // By lines\n // Match all new line character representations\n const seperator = /\\r?\\n|\\r/;\n const lines = paramLines.split(seperator);\n let startIndex = 0;\n\n //Find starting index of actual data skip commented lines\n for (const i in lines)\n {\n if(!lines[i].startsWith('#'))\n {\n startIndex = parseInt(i);\n break;\n }\n }\n\n //Total number of tumor samples in the response\n const tumorSamples = lines[startIndex].split('\\t');\n const numOfTumorSamples = tumorSamples.length - 2;\n const outData: {} = {};\n outData[geneticProfileId] = {};\n\n const geneticProfileType = CBioPortalAccessor.getDataType(geneticProfileId);\n // skip meta line and iterate over tumor sample data\n for(let i = startIndex + 1; i < lines.length; i++)\n {\n if (lines[i].length <= 0)\n continue;\n\n //Iterate over samples for each gene to calculate profile data\n const lineData: string[] = lines[i].split('\\t');\n let profileDataAlteration = 0;\n for(let j = 2; j < lineData.length; j++)\n {\n if(lineData[j] !== 'NaN')\n {\n if( geneticProfileType === CBioPortalAccessor.MUTATION )\n profileDataAlteration++;\n else if ( (geneticProfileType === CBioPortalAccessor.CNA) \n && ( parseInt(lineData[j]) === CBioPortalAccessor.CNA_GAIN || parseInt(lineData[j]) === CBioPortalAccessor.CNA_DELETION ) ){\n profileDataAlteration++;\n }\n else if ( (geneticProfileType === CBioPortalAccessor.GENE_EXPRESSION) \n && (parseFloat(lineData[j]) >= CBioPortalAccessor.Z_SCORE_UPPER_THRESHOLD \n || parseFloat(lineData[j]) <= CBioPortalAccessor.Z_SCORE_LOWER_THRESHOLD)){\n profileDataAlteration++;\n }\n }\n }\n\n //\n outData[geneticProfileId][lineData[1]] = ( profileDataAlteration / numOfTumorSamples ) * 100;\n }\n\n callbackFunction(outData);\n }\n\n\n /*\n *\n * Retrieves profile data associated with the parameters below from cBioPortal\n * @params\n {\n caseSetId: \"gbm_tcga\",\n geneticProfileId: \"gbm_tcga_mutations\",\n genes: [\"BRCA1\", \"BRCA2\", \"TP53\"]\n }\n * */\n getProfileData(params, callbackFunction)\n {\n //params\n //caseSetId, geneticProfileId, genes\n\n const outData = {};\n const request = new XMLHttpRequest();\n const self = this;\n request.onreadystatechange = function ()\n {\n if(request.readyState === XMLHttpRequest.DONE && request.status === 200)\n {\n self.calcAlterationPercentages(request.responseText, params.geneticProfileId, callbackFunction);\n toast.success(params.geneticProfileId + \" has been succesfully loaded from cBioPortal.\");\n }\n };\n\n //Create query URL\n let queryURL = CBioPortalAccessor.GET_PROFILE_DATA_URL;\n //Fetch sequenced case list !!\n queryURL += \"&case_set_id=\" + params.caseSetId + \"_sequenced\";\n queryURL += \"&genetic_profile_id=\" + params.geneticProfileId;\n queryURL += \"&gene_list=\";\n let isFirst = true;\n for(const gene of params.genes)\n {\n if(!isFirst){\n queryURL += \"+\";\n } else {\n isFirst = false;\n }\n queryURL += gene;\n \n }\n request.open(\"GET\", queryURL);\n request.send();\n };\n\n validateGenes(nodeSymbols, editor: EditorActionsManager)\n {\n const request = new XMLHttpRequest();\n const self = this;\n\n request.onreadystatechange = function ()\n {\n if(request.readyState === XMLHttpRequest.DONE && request.status === 200)\n {\n const validGeneSymbols = JSON.parse(request.responseText);\n const validGeneArray = _.map(validGeneSymbols, function(object)\n {\n return object.hugoGeneSymbol;\n });\n editor.highlightInvalidGenes(validGeneArray);\n }\n };\n const queryURL = CBioPortalAccessor.VALIDATE_GENES_URL;\n request.open(\"POST\", queryURL);\n request.setRequestHeader(\"Content-type\", \"application/json\");\n request.send(JSON.stringify(nodeSymbols));\n }\n}\n","import autobind from \"autobind-decorator\";\nimport { action, computed, makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React from \"react\";\nimport {\n Button,\n Checkbox,\n FormControl,\n ListGroup,\n ListGroupItem,\n Modal,\n} from \"react-bootstrap\";\nimport { EModalType, IDataTypeMetaData } from \"../ui/react-pathway-mapper\";\nimport CBioPortalAccessor from \"../utils/CBioPortalAccessor\";\n\ninterface IStudyModalProps {\n show: boolean;\n loadFromCBio: Function;\n handleClose: Function;\n}\n\n@observer\nexport default class StudyModal extends React.Component {\n @observable\n dataTypes: { [dataType: string]: IDataTypeMetaData } = {};\n\n @observable\n dataTypeFetchResultsReady: boolean = false;\n\n currentlySelectedItemIndex = -1;\n\n @observable\n selectedStudies: {\n data: any[];\n dataTypes: { [dataType: string]: IDataTypeMetaData };\n }[] = [];\n\n checkboxModalPosition: {\n bottom: number;\n } = {\n bottom: 0,\n };\n\n @observable\n selectedDataTypesPerStudy: string[] = [];\n\n @observable\n itemArray: any[] = [];\n\n @observable\n searchQuery: string = \"\";\n\n @observable\n showDataTypeSelectionModal = false;\n\n @observable\n studyListItemCheckboxChecked: boolean[] = [];\n\n @observable\n selectedStudyData: any[];\n\n @observable\n portalAccessor: CBioPortalAccessor;\n\n constructor(props: IStudyModalProps) {\n super(props);\n makeObservable(this);\n this.selectedStudyData = [];\n this.portalAccessor = new CBioPortalAccessor();\n this.fetchStudy();\n }\n\n @action.bound\n setDataTypeFetchResultsReady(ready: boolean) {\n this.dataTypeFetchResultsReady = ready;\n }\n\n @action.bound\n setItemArray(itemArray: any[]) {\n this.itemArray = itemArray;\n }\n\n @action.bound\n setSearchQuery(query: string) {\n this.searchQuery = query;\n }\n\n @action.bound\n setSelectedStudyData(data: any[]) {\n this.selectedStudyData = data;\n }\n\n @action.bound\n setDataTypeProperties(dataType: string, properties: IDataTypeMetaData) {\n this.dataTypes[dataType] = properties;\n }\n\n @action.bound\n initStudyListItemCheckboxChecked(studyCount: number) {\n this.studyListItemCheckboxChecked = Array(studyCount).fill(false);\n }\n\n @action.bound\n initSelectedDataTypesPerStudy(studyCount: number) {\n this.selectedDataTypesPerStudy = Array(studyCount).fill(\"\");\n }\n\n @action.bound\n toggleStudyListItemCheckboxChecked(studyIndex: number) {\n this.studyListItemCheckboxChecked[studyIndex] = !this\n .studyListItemCheckboxChecked[studyIndex];\n }\n\n @action.bound\n addSelectedStudy(selectedStudy: {\n data: any[];\n dataTypes: { [dataType: string]: IDataTypeMetaData };\n }) {\n this.selectedStudies.push(selectedStudy);\n }\n\n @action.bound\n removeSelectedStudy(selectedStudyData: any[]) {\n this.selectedStudies = this.selectedStudies.filter(\n (study) => study.data[0] != selectedStudyData[0]\n );\n }\n\n @action.bound\n clearSelectedStudies() {\n this.selectedStudies = [];\n }\n\n @action.bound\n setShowDataTypeSelectionModal(show: boolean) {\n this.showDataTypeSelectionModal = show;\n }\n\n @action.bound\n clearStudyCheckboxesChecked() {\n const length = this.studyListItemCheckboxChecked.length;\n this.studyListItemCheckboxChecked = Array(length).fill(false);\n }\n\n @action.bound\n clearSelectedDataTypesPerStudy() {\n const length = this.studyListItemCheckboxChecked.length;\n this.selectedDataTypesPerStudy = Array(length).fill(\"\");\n }\n\n @action.bound\n unselectDataTypesForStudy(index: number) {\n this.selectedDataTypesPerStudy[index] = \"\";\n }\n\n preparePortalAccess(studyId: string) {\n this.setDataTypeFetchResultsReady(false);\n this.portalAccessor.getSupportedGeneticProfiles(studyId, (data) => {\n this.disableAllDataTypes();\n // Iterate through profiles\n for (const profile of Object.keys(data)) {\n const type = CBioPortalAccessor.getDataType(profile);\n if (type !== \"\") {\n this.setDataTypeProperties(type, {\n ...this.dataTypes[type],\n enabled: true,\n profile: profile,\n });\n setTimeout(() => this.setDataTypeFetchResultsReady(true), 500);\n }\n }\n });\n }\n\n disableAllDataTypes() {\n for (const dataType of Object.keys(this.dataTypes)) {\n this.setDataTypeProperties(dataType, {\n enabled: false,\n checked: false,\n profile: undefined,\n });\n }\n }\n\n fetchStudy() {\n this.portalAccessor.getDataTypes().forEach((dataType) => {\n this.setDataTypeProperties(dataType, {\n enabled: false,\n checked: false,\n profile: undefined,\n });\n });\n\n this.portalAccessor.fetchCancerStudies((cancerStudies: any) => {\n let temp = [];\n for (const studyTitle in cancerStudies) {\n if (!cancerStudies.hasOwnProperty(studyTitle)) {\n continue;\n }\n const studyData = cancerStudies[studyTitle];\n temp.push(studyData);\n }\n const numOfStudies = temp.length;\n this.initStudyListItemCheckboxChecked(numOfStudies);\n this.initSelectedDataTypesPerStudy(numOfStudies);\n\n this.setItemArray(temp);\n });\n }\n\n @autobind\n resetModal() {\n this.disableAllDataTypes();\n this.setSelectedStudyData([]);\n this.clearSelectedStudies();\n this.clearStudyCheckboxesChecked();\n this.clearSelectedDataTypesPerStudy();\n this.currentlySelectedItemIndex = -1;\n this.searchQuery = \"\";\n }\n\n @autobind\n handleCheckboxClick(dataType) {\n this.setDataTypeProperties(dataType, {\n ...this.dataTypes[dataType],\n checked: !this.dataTypes[dataType].checked,\n });\n }\n\n @computed\n get selectedStudyDataTitle() {\n if (this.selectedStudyData.length > 1) {\n return this.selectedStudyData[1] || \"Choose study\";\n } else {\n return \"Choose study\";\n }\n }\n\n render() {\n\n return (\n {\n this.props.handleClose(EModalType.STUDY);\n this.resetModal();\n }}\n >\n \n Profile Data from cBioPortal\n \n \n \n

Select Cancer Study

\n
\n this.setSearchQuery(event.target.value)}\n />\n \n \n {this.itemArray.length < 1 ? (\n Fetching studies from cBioPortal...\n ) : (\n this.itemArray\n .map((item, index) => {\n return { item: item, index: index };\n })\n .filter((obj) =>\n obj.item[1]\n .toLowerCase()\n .includes(this.searchQuery.toLowerCase())\n )\n .map((obj) => {\n const item = obj.item;\n const index = obj.index;\n\n const studyTitle = item[1];\n const studyId = item[0];\n return (\n \n {\n const boundingRect = document\n .getElementById(\"listgroupitem\" + index)\n .getBoundingClientRect();\n const modalMargin = 30;\n this.checkboxModalPosition = {\n bottom: boundingRect.bottom - modalMargin,\n };\n this.setSelectedStudyData(item);\n this.preparePortalAccess(studyId);\n this.toggleStudyListItemCheckboxChecked(index);\n this.currentlySelectedItemIndex = index;\n\n if (this.studyListItemCheckboxChecked[index]) {\n this.setShowDataTypeSelectionModal(true);\n } else {\n this.removeSelectedStudy(item);\n this.unselectDataTypesForStudy(index);\n }\n }}\n >\n {studyTitle}\n \n {this.selectedDataTypesPerStudy[index] != \"\" && (\n \n {this.selectedDataTypesPerStudy[index]}\n \n )}\n \n );\n })\n )}\n \n
\n
\n

\n Warning: At most six different data sets will be overlayed on the genes. You can toggle which ones are to be displayed via \"Alteration %\" {\">\"} \"View Settings\" menu.\n

\n
\n {\n this.setShowDataTypeSelectionModal(false);\n }}\n >\n \n {this.dataTypeFetchResultsReady === false ? (\n Fetching data types from cBioPortal...\n ) : (\n Object.keys(this.dataTypes).map((dataType: string) => {\n return (\n {\n this.handleCheckboxClick(dataType);\n }}\n checked={this.dataTypes[dataType].checked}\n >\n {dataType}\n \n );\n })\n )}\n \n \n {\n const currentDataTypes = { ...this.dataTypes };\n const selectedCount = Object.keys(currentDataTypes).filter(\n (dataType) => {\n return currentDataTypes[dataType].checked;\n }\n ).length;\n if (selectedCount == 0) {\n this.studyListItemCheckboxChecked[\n this.currentlySelectedItemIndex\n ] = false;\n }\n this.setShowDataTypeSelectionModal(false);\n }}\n >\n Cancel\n \n {\n const currentDataTypes = { ...this.dataTypes };\n this.addSelectedStudy({\n data: this.selectedStudyData,\n dataTypes: currentDataTypes,\n });\n this.selectedDataTypesPerStudy[\n this.currentlySelectedItemIndex\n ] = Object.keys(currentDataTypes)\n .filter((dataType) => {\n return currentDataTypes[dataType].checked;\n })\n .join(\", \");\n this.setShowDataTypeSelectionModal(false);\n }}\n >\n Add\n \n \n \n \n\n \n {\n this.selectedStudies.forEach((study) => {\n this.props.loadFromCBio(study.dataTypes, study.data);\n });\n this.props.handleClose(EModalType.STUDY);\n this.resetModal();\n }}\n >\n Load Data\n \n \n \n );\n }\n}\n","import autobind from \"autobind-decorator\";\nimport { action, makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React from 'react';\nimport { Checkbox, DropdownButton, MenuItem } from \"react-bootstrap\";\nimport PathwayActions from '../utils/PathwayActions.js';\nimport { IPathwayMapperTable } from \"./react-pathway-mapper\";\n\ninterface IRankingProps{\n pathwayActions: PathwayActions;\n bestPathwaysAlgos: any[][];\n tableComponent: (data: IPathwayMapperTable[], selectedPathway: string, onPathwaySelect: (pathway: string) => void) => JSX.Element;\n patientView ?: boolean;\n}\n\nconst TCGA_PANCAN_PATHWAY_NAMES = [\n \"Cell Cycle\", \n \"HIPPO\", \n \"MYC\",\n \"NOTCH\",\n \"NRF2\",\n \"PI3K\",\n \"RTK-RAS\",\n \"TGF-Beta\",\n \"TP53\",\n \"WNT\"\n];\n\n\n@observer\nexport default class Ranking extends React.Component{\n @observable\n bestPathways: any[];\n\n @observable\n shownPathways: any[];\n\n @observable\n dropDownTitle: string;\n\n @observable\n selectedPathway: string;\n isPercentageMatch: number;\n isAlterationEnabled: number;\n\n @observable\n considerOnlyTCGAPanPathways: boolean;\n\n @observable\n isExpanded: boolean;\n\n readonly COUNT_PERC_EXPLANATION = \"Whether we should favor the number of genes of interest matching the ones in a pathway or the percentage of such genes in that pathway. For instance, suppose genes of interest are A, B, and C, and the pathway contains genes B, C, D, and E. When we consider count, the score is 2 (for the two genes that match). However, when we consider percentage the score will be 50% as 2 of the 4 genes in the pathway are among genes of interest.\";\n readonly ALTERATION_EXPLANATION = \"When this is checked, each matching gene will not directly contribute to the score as 1 unit but with the alteration frequency percentage of that gene. For instance, suppose genes of interest are A, B, and C with alteration frequencies of 0.5, 0.2, and 0.3, respectively, and the pathway contains genes B, C, D, and E. When this is option isn't checked, the score will be 2 for match count and 50% for the match percentage. However, when this option is checked, the scores will be 0.2+0.3=0.5 and (0.2+0.3)/4=12.5% for match count and percentage, respectively.\";\n readonly TCGA_PANCAN_EXPLANATION = \"The pathways listed above were retrieved from PathwayMapper. When this option is checked, only the pathways under TCGA > PanCanAtlas will be shown. Uncheck to show all.\";\n\n constructor(props: IRankingProps){\n super(props);\n makeObservable(this);\n \n this.isPercentageMatch = 0;\n this.isAlterationEnabled = 0;\n this.considerOnlyTCGAPanPathways = true;\n this.dropDownTitle = \"Match count\";\n this.isExpanded = false;\n this.setBestPathwayMethod(0);\n this.selectedPathway = this.shownPathways[0].pathwayName;\n }\n\n @autobind\n setBestPathwayMethod(i: number){\n this.bestPathways = this.props.bestPathwaysAlgos[i];\n this.filterBestPathwaysByTCGAPanPathways();\n }\n\n @autobind\n onPathwayClick(pathway: string){\n this.selectedPathway = pathway;\n this.props.pathwayActions.changePathway(this.selectedPathway);\n }\n\n @autobind\n onApplyClick(){\n // Mapping from dropdown + checkbox selection to pathway method.\n this.setBestPathwayMethod(2 * this.isAlterationEnabled + this.isPercentageMatch);\n }\n\n @action.bound \n filterBestPathwaysByTCGAPanPathways() {\n this.shownPathways = this.bestPathways.filter((data: any) => {\n if (this.considerOnlyTCGAPanPathways) {\n return TCGA_PANCAN_PATHWAY_NAMES.indexOf(data.pathwayName) > -1;\n }\n return true;\n });\n // change selected pathway if we are filtered and doesn't exist\n if (this.considerOnlyTCGAPanPathways \n && TCGA_PANCAN_PATHWAY_NAMES.indexOf(this.selectedPathway) < 0) {\n this.selectedPathway = this.shownPathways[0].pathwayName;\n this.props.pathwayActions.changePathway(this.selectedPathway);\n }\n }\n\n @action.bound\n toggleConsiderOnlyTCGAPanPathways() {\n this.considerOnlyTCGAPanPathways = !this.considerOnlyTCGAPanPathways;\n this.filterBestPathwaysByTCGAPanPathways();\n }\n\n\n componentDidMount(): void {\n this.props.pathwayActions.changePathway(this.selectedPathway);\n }\n\n render(){\n const lengthThreshold = 13;\n \n return (\n
\n\n {/*\n
\n  Pathways\n
*/}\n\n { this.props.tableComponent &&\n this.props.tableComponent(\n this.shownPathways.map((data: any) => ({\n name: data.pathwayName, score: data.score, genes: data.genesMatched\n })),\n this.selectedPathway,\n this.onPathwayClick)\n }\n {\n
\n \n Show TCGA PanCancer Atlas pathways only  \n \n \n \n
\n }\n {(!this.props.patientView &&\n
\n {\n
\n \n  Ranking options\n \n
\n }\n
\n \n {this.isPercentageMatch = 0; this.dropDownTitle = \"Match count\"; this.onApplyClick();} }>Match count\n {this.isPercentageMatch = 1; this.dropDownTitle = \"Match percentage\"; this.onApplyClick();}}>Match percentage\n \n   \n
\n\n {this.isAlterationEnabled = (this.isAlterationEnabled === 1) ? 0 : 1; this.onApplyClick();}}\n style={{fontSize: \"13px\", marginTop: \"18px\", bottom: \"4px\"}}>\n Consider alteration frequency  \n \n \n
\n
\n )}\n
\n \n );\n \n }\n\n \n}\n","import { makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React from 'react';\n// @ts-ignore\nimport openImage from \"../images/toolbar/edit.svg\";\n// @ts-ignore\nimport layoutImage from \"../images/toolbar/layout-cose.svg\";\n// @ts-ignore\nimport savePNGImage from \"../images/toolbar/save_png.svg\";\n// @ts-ignore\nimport saveSVGImage from \"../images/toolbar/save_svg.svg\";\nimport EditorActionsManager from \"../managers/EditorActionsManager\";\nimport { EModalType, IAlterationData } from '../ui/react-pathway-mapper';\nimport PathwayActions from '../utils/PathwayActions';\n// @ts-ignore\nconst addSelImage = require(\"../images/toolbar/add-selected.svg\");\n// @ts-ignore\nconst addAllImage = require(\"../images/toolbar/add-all.svg\");\n// @ts-ignore\nconst aboutImage = require(\"../images/toolbar/about.svg\");\n\n\ninterface IToolbarProps {\n pathwayActions: PathwayActions;\n selectedPathway: string;\n alterationData: IAlterationData;\n handleOpen: (modalId: number) => void;\n genes: any[];\n validGenes: any;\n showMessage: (message: string) => void;\n pathwayGenes: string[];\n onAddGenes: (selectedGenes: string[]) => void;\n patientView ?: boolean;\n}\n\n@observer\nexport default class Toolbar extends React.Component{\n\n\n @observable\n selectedGenes: string[];\n\n @observable\n private editor: EditorActionsManager;\n constructor(props: IToolbarProps){\n super(props);\n makeObservable(this);\n\n this.selectedGenes = [];\n }\n\n \n render(){\n\n\n const studyQuery = \"q=\" + JSON.stringify(this.props.alterationData) + \"&g=\" + this.props.genes.map(gene => gene.hugoGeneSymbol).join(\"+\");\n return (\n
\n {this.props.pathwayActions.saveAs(\"PNG\");}}/>\n\n {this.props.pathwayActions.saveAs(\"SVG\");}}/>\n\n \n {(!this.props.patientView && [\n {\n this.selectedGenes = this.props.pathwayActions.getSelectedNodes()\n .filter((node: any) => node.data().type === \"GENE\")\n .map((node: any) => node.data().name as string);\n\t const noneGeneList = this.props.pathwayActions.getSelectedNodes()\n .filter((node: any) => node.data().type !== \"GENE\")\n .map((node: any) => node.data().name as string);\n const invalidGenes: string[] = [];\n\t let message = \"\";\n if(noneGeneList.length > 0){\n message += \"Selection contains nodes that are not genes: \" + noneGeneList.join(', ') + \". \";\n }\n\n this.selectedGenes.forEach((gene: string) => {\n if(!this.props.validGenes.hasOwnProperty(gene)){\n invalidGenes.push(gene);\n }\n });\n\n if(invalidGenes.length === 0){\n\n if(this.selectedGenes.length > 0 && noneGeneList.length === 0){\n this.props.onAddGenes(this.selectedGenes);\n }\n } else {\n\t message += \"Following gene symbols are invalid or already in gene list: \" + invalidGenes.join(\", \") + \".\";\n }\n\n\t if(message.length > 0) {\n\t this.props.showMessage(message);\n\t }\n }}/>\n ,\n \n {\n\n this.selectedGenes = this.props.pathwayGenes.filter((gene: string) => {\n return this.props.validGenes.hasOwnProperty(gene);\n });\n \n if(this.selectedGenes.length > 0){\n this.props.onAddGenes(this.selectedGenes);\n }\n }}/>,\n \n\n {{window.open(\"http://pathwaymapper.org/?pathwayName=\" + this.props.selectedPathway +\"&\"+ studyQuery )}}}/>\n ])}\n {this.props.handleOpen(EModalType.CHELP); }}/>\n \n
);\n }\n}\n","import autobind from \"autobind-decorator\";\nimport { action, computed, makeObservable, observable } from \"mobx\";\nimport EditorActionsManager from \"../managers/EditorActionsManager\";\nimport FileOperationsManager, {\n IPathwayInfo\n} from \"../managers/FileOperationsManager\";\nimport GridOptionsManager from \"../managers/GridOptionsManager\";\nimport ViewOperationsManager from \"../managers/ViewOperationsManager\";\nimport ConfirmationModal from \"../modals/ConfirmationModal\";\nimport { EGridType } from \"../modals/GridSettings\";\nimport { ILayoutProperties } from \"../modals/LayoutProperties\";\nimport {\n EModalType, IPathwayData, IProfileMetaData\n} from \"../ui/react-pathway-mapper\";\nimport SaveLoadUtility from \"./SaveLoadUtility\";\n\nexport default class PathwayActions {\n @observable\n selectedPathway: string;\n fileManager: FileOperationsManager;\n editor: EditorActionsManager;\n undoRedoManager: any;\n pathwayHandler: (pathwayName: string) => void;\n handleOpen: (modalId: EModalType) => void;\n eh: any;\n profiles: IProfileMetaData[];\n gridOptionsManager: GridOptionsManager;\n\n uploader: any;\n merger: any;\n isCBioPortal: boolean;\n isCollaborative: boolean;\n viewOperationsManager: ViewOperationsManager;\n overlayUploader: any;\n\n @observable\n enabledType: EGridType;\n\n constructor(\n pathwayHandler: (pathwayName: string) => void,\n profiles: IProfileMetaData[],\n fileManager: FileOperationsManager,\n handleOpen: (modalId: EModalType) => void,\n isCBioPortal: boolean,\n isCollaborative: boolean\n ) {\n makeObservable(this);\n this.pathwayHandler = pathwayHandler;\n this.profiles = profiles;\n this.fileManager = fileManager;\n this.handleOpen = handleOpen;\n this.isCBioPortal = isCBioPortal;\n this.isCollaborative = isCollaborative;\n this.enabledType = EGridType.NONE;\n }\n\n @action.bound\n addProfile(profile: IProfileMetaData) {\n this.profiles.push(profile);\n }\n\n @action.bound\n clearProfiles() {\n this.profiles.length = 0;\n }\n\n emphasizeQueryGenes(queryGenes: string[]) {\n if (this.editor)\n this.editor.cy.nodes().forEach((node: any) => {\n const nodeName = node.data().name;\n const nodeType = node.data().type;\n if (queryGenes.includes(nodeName) && nodeType === \"GENE\") {\n node.style({ \"border-width\": \"4px\", \"font-weight\": \"bold\" });\n }\n });\n }\n\n getSelectedNodes() {\n return this.editor.cy.nodes(\":selected\");\n }\n\n setLayoutProperties(layoutProperties: ILayoutProperties) {\n this.editor.saveLayoutProperties(layoutProperties);\n }\n\n doesCyHaveElements() {\n return this.editor.cy.elements().length > 0;\n }\n\n @autobind\n toggleGrid(isEnabled: boolean) {\n this.gridOptionsManager.setSnapToGuidelines(false);\n this.gridOptionsManager.setShowGrid(isEnabled);\n }\n\n @autobind\n toggleGuide(isEnabled: boolean) {\n this.gridOptionsManager.setSnapToGuidelines(isEnabled);\n this.gridOptionsManager.setShowGrid(false);\n }\n\n adjustGridSettings(gridSize: number, color: string) {\n this.gridOptionsManager.currentProperties.gridSpacing = gridSize;\n this.gridOptionsManager.currentProperties.guidelinesStyle.strokeStyle = color;\n this.gridOptionsManager.currentProperties.guidelinesStyle.horizontalDistColor = color;\n this.gridOptionsManager.currentProperties.guidelinesStyle.verticalDistColor = color;\n }\n\n @autobind\n resizeToContent() {\n this.editor.resizeNodesToContent(this.editor.cy.nodes());\n }\n\n @autobind\n align(param: string) {\n this.viewOperationsManager.handleNodeAlignment(param);\n }\n\n @autobind\n onChangeFile(e: any, isMerge: boolean) {\n const file = e.target.files[0] as File;\n this.processFile(file, isMerge);\n //Can't load the same file twice in a row without this\n e.target.value = \"\";\n }\n\n uploadOverlay() {\n this.overlayUploader.click();\n }\n\n overlayFromText(file: File) {\n // Create a new FormData object.\n const formData = new FormData();\n formData.append(\"graphFile\", file);\n const request = new XMLHttpRequest();\n request.onreadystatechange = () => {\n if (\n request.readyState === XMLHttpRequest.DONE &&\n request.status === 200\n ) {\n const linesOfData = request.responseText.split(\"\\n\");\n if (linesOfData.length > 0) {\n const profileIdsFromFile = linesOfData[0].split(\"\\t\").slice(1);\n profileIdsFromFile.forEach(id =>\n this.addProfile({ profileId: id, enabled: true })\n );\n } else {\n console.log(\"Error: No valid data\");\n }\n this.editor.addGenomicData(request.responseText);\n }\n };\n request.open(\"POST\", \"/loadGraph\");\n request.send(formData);\n }\n\n @autobind\n upload() {\n if (this.editor.cy.elements().length > 0) {\n this.handleOpen(EModalType.CONFIRMATION);\n ConfirmationModal.pendingFunction = () => {\n this.uploader.click();\n };\n } else {\n this.uploader.click();\n }\n }\n\n @autobind\n merge() {\n this.merger.click();\n }\n\n setOverlayUploader(inputRef: any) {\n this.overlayUploader = inputRef;\n }\n\n @autobind\n setUploaders(inputRef: any, isMerge: boolean) {\n if (isMerge) this.merger = inputRef;\n else this.uploader = inputRef;\n }\n\n @computed\n get getPathwayInfo() {\n return this.fileManager.getPathwayInfo;\n }\n\n @autobind\n setPathwayInfo(other: IPathwayInfo) {\n this.fileManager.setPathwayInfo(other);\n }\n\n @autobind\n undo() {\n this.undoRedoManager.undo();\n }\n\n @autobind\n redo() {\n this.undoRedoManager.redo();\n }\n\n @autobind\n export(isSIFNX: boolean) {\n //this.editor.cy.remove('.eh-handle');\n this.eh.hide();\n this.fileManager.saveGraph(isSIFNX, this.editor);\n }\n\n @autobind\n resetUndoStack() {\n this.undoRedoManager.reset();\n }\n\n @autobind\n newPathway() {\n const commitNewPathway = () => {\n this.editor.removeAllElements();\n this.fileManager.setPathwayInfo({\n pathwayTitle: \"New Pathway\",\n pathwayDetails: \"\"\n });\n //this.removeAllData()\n this.resetUndoStack();\n this.pathwayHandler(\"Dummy\");\n };\n\n if (this.editor.cy.elements().length > 0) {\n this.handleOpen(EModalType.CONFIRMATION);\n ConfirmationModal.pendingFunction = commitNewPathway;\n } else {\n commitNewPathway();\n }\n }\n\n @autobind\n changePathway(pathwayName: string) {\n this.pathwayHandler(pathwayName);\n\n if (!this.isCBioPortal) {\n this.fileManager.setPathwayInfo({\n pathwayTitle: pathwayName,\n pathwayDetails: \"\",\n });\n // At the beginning changePathway is called editor is not ready hence removeData shall not be called\n if (this.editor) {\n //this.removeAllData()\n this.resetUndoStack();\n }\n }\n }\n\n @autobind\n highlightNeighbours() {\n this.editor.highlightNeighbors();\n }\n\n @autobind\n highlightSelected() {\n this.editor.highlightSelected();\n }\n\n @autobind\n validateGenes() {\n this.editor.validateGenes();\n }\n\n @autobind\n showAll() {\n this.editor.showAllNodes();\n }\n\n @autobind\n hideSelected() {\n this.editor.hideSelectedNodes();\n }\n\n @autobind\n deleteSelected() {\n const selectedEles = this.editor.cy.elements(\":selected\");\n this.editor.removeElement(selectedEles);\n }\n\n @autobind\n addEdge(edgeTypeIndex: number) {\n // @ts-ignore\n window.edgeAddingMode = edgeTypeIndex + 1;\n if (edgeTypeIndex === -1) {\n this.eh.disable();\n this.eh.hide();\n return;\n } else {\n // @ts-ignore\n this.eh.enable();\n }\n }\n\n @autobind\n changeNodeName(oldName: string, newName: string) {\n const cyNode = this.editor.cy.$('[name=\"' + oldName + '\"]')[0];\n this.editor.changeName(cyNode, newName);\n }\n\n @autobind\n addNode(nodeType) {\n const nodeData = {\n type: nodeType.toUpperCase(),\n name: \"New \" + nodeType,\n w: \"150\",\n h: \"52\"\n };\n const extent = this.editor.cy.extent();\n const posData = {\n x: (extent.x1 + extent.x2) / 2,\n y: (extent.y1 + extent.y2) / 2\n };\n\n this.editor.addNode(nodeData, posData);\n this.pathwayHandler(\"Additional Pathway\");\n }\n\n @autobind\n searchGene(geneName: string) {\n const selector = \"node[name @*= '\" + geneName + \"']\";\n const nodesContainingSearchedGene = this.editor.cy.filter(selector);\n let nodesToSelect = this.editor.cy.collection();\n nodesContainingSearchedGene.forEach(function(ele, index) {\n if (\n !ele.hasClass(\"highlightedNode\") &&\n !ele.hasClass(\"invalidGeneHighlight\")\n )\n nodesToSelect = nodesToSelect.union(ele);\n });\n this.editor.highlightBySearch(nodesToSelect);\n }\n\n @autobind\n removeAllData() {\n this.editor.removeGenomicData();\n this.clearProfiles();\n }\n\n @autobind\n removeAllHighlight() {\n this.editor.removeAllHighlight();\n }\n\n @autobind\n processFile(file: File, isMerge: boolean) {\n // Create a new FormData object.\n const formData = new FormData();\n formData.append(\"graphFile\", file);\n const request = new XMLHttpRequest();\n request.onreadystatechange = () => {\n if (request.readyState === XMLHttpRequest.DONE) {\n if (request.status === 200) {\n const pathwayData: IPathwayData = SaveLoadUtility.parseGraph(\n request.responseText,\n false\n );\n\n if (isMerge) {\n this.editor.mergeGraph(pathwayData.nodes, pathwayData.edges);\n const graphJSON = this.editor.cy.json();\n\n //TODO change file name maybe, probabyly not necessary ?\n // Pathway nodes and edges are now combination of both previous and new pathway.\n pathwayData.nodes = graphJSON.elements.nodes; //this.editor.cy.nodes().map((node) => ({data: node.data()}));\n pathwayData.edges = graphJSON.elements.edges; //this.editor.cy.edges().map((edge) => ({data: edge.data()}));\n pathwayData.title = \"Additional Pathway\";\n } else {\n this.editor.loadFile(pathwayData.nodes, pathwayData.edges);\n this.fileManager.setPathwayInfo({\n pathwayTitle: pathwayData.title,\n pathwayDetails: pathwayData.description\n });\n }\n\n this.pathwayHandler(pathwayData.title + \"_imported\");\n this.resetUndoStack();\n } else {\n console.error(\n \"Error processing file: \" +\n request.readyState +\n request.responseText\n );\n }\n }\n };\n request.open(\"POST\", \"/loadGraph\");\n request.send(formData);\n }\n\n @autobind\n saveAs(type: string) {\n if (type === \"SVG\") {\n this.fileManager.saveAsSVG(this.editor);\n } else if (type === \"PNG\") {\n this.fileManager.saveAsPNG(this.editor.cy);\n } else if (type === \"JPEG\") {\n this.fileManager.saveAsJPEG(this.editor.cy);\n }\n }\n\n @autobind\n editorHandler(\n editor,\n eh,\n undoRedoManager,\n viewOperationsManager: ViewOperationsManager,\n gridOptionsManager: GridOptionsManager\n ) {\n this.editor = editor;\n this.eh = eh;\n this.undoRedoManager = undoRedoManager;\n this.viewOperationsManager = viewOperationsManager;\n this.gridOptionsManager = gridOptionsManager;\n }\n\n @autobind\n exists(profileId: string){\n\n let exists = false;\n this.profiles.forEach((profile: IProfileMetaData) => {\n if(profile.profileId === profileId){\n exists = true;\n }\n });\n\n return exists;\n }\n\n @autobind\n loadSampleData() {\n const data =\n \"gene\\tlung\\tovarian\\tbreast\\n\" +\n \"PTEN\\t-7\\t-20\\t10\\n\" +\n \"NF1\\t-12\\t-4\\t30\\n\" +\n \"PIK3CA\\t18\\t40\\t-50\\n\" +\n \"KRAS\\t11\\t-5\\t0\\n\" +\n \"ZIYA\\t0\\t-2\\t0\\n\" +\n \"AKT1\\t3\\t30\\t-10\\n\" +\n \"AKT2\\t6\\t-3\\t20\\n\" +\n \"AKT3\\t6\\t-3\\t20\\n\" +\n \"\\n\";\n\n if (this.exists(\"lung\") || this.exists(\"ovarian\") || this.exists(\"breast\")) {\n return;\n } \n\n this.editor.addGenomicData(data);\n\n if (!this.isCollaborative) {\n this.addProfile({ profileId: \"lung\", enabled: this.profiles.length < 6 ? true : false });\n this.addProfile({ profileId: \"ovarian\", enabled: this.profiles.length < 6 ? true : false });\n this.addProfile({ profileId: \"breast\", enabled: this.profiles.length < 6 ? true : false });\n }\n \n }\n\n @autobind\n performLayout() {\n this.editor.performLayout();\n }\n}\n","import { makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React from \"react\";\nimport { Button, ButtonGroup, ButtonToolbar, FormControl, FormGroup, Glyphicon, InputGroup, Navbar } from \"react-bootstrap\";\n// @ts-ignore\nimport aboutSvg from '../images/toolbar/about.svg';\n// @ts-ignore\nimport ahbSvg from '../images/toolbar/align/align-horizontal-bottom.svg';\n// @ts-ignore\nimport ahmSvg from '../images/toolbar/align/align-horizontal-middle.svg';\n// @ts-ignore\nimport ahtSvg from '../images/toolbar/align/align-horizontal-top.svg';\n// @ts-ignore\nimport avcSvg from '../images/toolbar/align/align-vertical-center.svg';\n// @ts-ignore\nimport avlSvg from '../images/toolbar/align/align-vertical-left.svg';\n// @ts-ignore\nimport avrSvg from '../images/toolbar/align/align-vertical-right.svg';\n// @ts-ignore\nimport deleteSvg from '../images/toolbar/delete-simple.svg';\n// @ts-ignore\nimport gridSvg from '../images/toolbar/grid.svg';\n// @ts-ignore\nimport guideSvg from '../images/toolbar/guidelines.svg';\n// @ts-ignore\nimport hideSvg from '../images/toolbar/hide-selected.svg';\n// @ts-ignore\nimport layoutSvg from '../images/toolbar/layout-cose.svg';\n// @ts-ignore\nimport layoutPropSvg from '../images/toolbar/layout-properties.svg';\n// @ts-ignore\nimport loadSvg from '../images/toolbar/load.svg';\n// @ts-ignore\nimport newSvg from '../images/toolbar/new.svg';\n// @ts-ignore\nimport portalSvg from '../images/toolbar/portal.svg';\n// @ts-ignore\nimport helpSvg from '../images/toolbar/quick-help.svg';\n// @ts-ignore\nimport redoSvg from '../images/toolbar/redo.svg';\n// @ts-ignore\nimport saveSvg from '../images/toolbar/save.svg';\n// @ts-ignore\nimport setingsSvg from '../images/toolbar/settings.svg';\n// @ts-ignore\nimport showSvg from '../images/toolbar/show-all.svg';\n// @ts-ignore\nimport undoSvg from '../images/toolbar/undo.svg';\nimport { EGridType } from \"../modals/GridSettings\";\nimport PathwayActions from \"../utils/PathwayActions\";\nimport { EModalType } from \"./react-pathway-mapper\";\n\n\ninterface IButtonbarProps {\n pathwayActions: PathwayActions;\n handleOpen: (modelId: EModalType) => void;\n}\n\ninterface ISVGFunction{\n svg: any;\n function: () => void;\n tooltip: string; \n isFocused?: boolean;\n}\n\n\n@observer\nexport default class Buttonbar extends React.Component{\n\n\n @observable\n private searchedGene: string;\n\n\n constructor(props: IButtonbarProps) {\n super(props);\n makeObservable(this);\n \n this.searchedGene = \"\";\n this.props.pathwayActions.enabledType = EGridType.NONE;\n }\n\n setEnabledType(newType: EGridType){\n if(newType === this.props.pathwayActions.enabledType){\n this.props.pathwayActions.enabledType = EGridType.NONE;\n } else {\n this.props.pathwayActions.enabledType = newType;\n }\n\n // Enabled type calculated\n\n if(this.props.pathwayActions.enabledType === EGridType.GRID){\n this.props.pathwayActions.toggleGrid(true);\n }\n else if(this.props.pathwayActions.enabledType === EGridType.GUIDE){\n this.props.pathwayActions.toggleGuide(true);\n } else {\n this.props.pathwayActions.toggleGrid(false); // This will disable both.\n }\n }\n render() {\n \n const fileFunctions: ISVGFunction[] = [\n {svg: newSvg, function: this.props.pathwayActions.newPathway, tooltip: \"New Pathway\"},\n {svg: loadSvg, function: this.props.pathwayActions.upload, tooltip: \"Import Pathway\" },\n {svg: saveSvg, function: () => {this.props.pathwayActions.export(false)}, tooltip: \"Export Pathway\"}];\n \n const modFunctions: ISVGFunction[] = [\n {svg: deleteSvg, function: this.props.pathwayActions.deleteSelected, tooltip: \"Delete Selected\"}];\n\n if(!this.props.pathwayActions.isCollaborative){\n modFunctions.push({svg: undoSvg, function: () => {this.props.pathwayActions.undo();}, tooltip: \"Undo\"},\n {svg: redoSvg, function: () => {this.props.pathwayActions.redo();}, tooltip: \"Redo\"});\n }\n const alignFunctions: ISVGFunction[] = [\n {svg: ahtSvg, function: () => {this.props.pathwayActions.align(\"hTop\");}, tooltip: \"Align Horizontal Top\"},\n {svg: ahmSvg, function: () => {this.props.pathwayActions.align(\"hMid\");}, tooltip: \"Align Horizontal Middle\"},\n {svg: ahbSvg, function: () => {this.props.pathwayActions.align(\"hBot\");}, tooltip: \"Align Horizontal Bottom\"},\n {svg: avlSvg, function: () => {this.props.pathwayActions.align(\"vLeft\");}, tooltip: \"Align Vertical Left\"},\n {svg: avcSvg, function: () => {this.props.pathwayActions.align(\"vCen\");}, tooltip: \"Align Vertical Center\"},\n {svg: avrSvg, function: () => {this.props.pathwayActions.align(\"vRight\");}, tooltip: \"Align Vertical Right\"}];\n \n const utilFunctions: ISVGFunction[] = [\n {isFocused: this.props.pathwayActions.enabledType === EGridType.GRID, svg: gridSvg, function: () => {this.setEnabledType(EGridType.GRID);}, tooltip: \"Enable Grid: Show and snap to grid\"},\n {isFocused: this.props.pathwayActions.enabledType === EGridType.GUIDE, svg: guideSvg, function: () => {this.setEnabledType(EGridType.GUIDE);}, tooltip: \"Enable Guidelines: Enable and snap to alignment guidelines\"}];\n\n const visibilityFunctions: ISVGFunction[] = [\n {svg: hideSvg, function: () => {this.props.pathwayActions.hideSelected();}, tooltip: \"Hide Selected\"},\n {svg: showSvg, function: () => {this.props.pathwayActions.showAll();}, tooltip: \"Show All\"}];\n\n const layoutFunctions: ISVGFunction[] = [\n {svg: layoutSvg, function: () => {this.props.pathwayActions.performLayout();}, tooltip: \"Perform Layout\"},\n {svg: layoutPropSvg, function: () => {this.props.handleOpen(EModalType.LAYOUT);}, tooltip: \"Layout Properties\"}];\n\n const portalFunctions: ISVGFunction[] = [\n {svg: portalSvg, function: () => {this.props.handleOpen(EModalType.STUDY);}, tooltip: \"Fetch Genomic Data From cBioPortal\"},\n {svg: setingsSvg, function: () => {this.props.handleOpen(EModalType.PROFILES);}, tooltip: \"Genomic Data Visibility Settings\"}];\n\n const infoFunctions: ISVGFunction[] = [\n {svg: helpSvg, function: () => {this.props.handleOpen(EModalType.HELP);}, tooltip: \"Quick Help\"},\n {svg: aboutSvg, function: () => {this.props.handleOpen(EModalType.ABOUT);}, tooltip: \"About\"}];\n \n const allFunctions = [fileFunctions, modFunctions, alignFunctions, utilFunctions, visibilityFunctions, portalFunctions, layoutFunctions, infoFunctions];\n\n \n return (\n \n \n { allFunctions.map((functions, index) =>\n \n { functions.map((svg: ISVGFunction, index) => \n (\n )\n )\n }\n )\n }\n \n \n \n { this.searchedGene = e.target.value;}}\n placeholder=\"Search Genes...\"\n onKeyPress={(e: any) => { if (e.key !== \"Enter\") return; this.props.pathwayActions.searchGene(this.searchedGene) }} />\n {this.props.pathwayActions.searchGene(this.searchedGene)}}\n style={{cursor: 'pointer'}}\n >\n \n \n \n \n \n \n \n )\n }\n\n}\n","import { EModalType } from \"../ui/react-pathway-mapper\";\nimport EditorActionsManager from \"./EditorActionsManager\";\n\nexport default class ContextMenuManager {\n private cy: any;\n private editor: EditorActionsManager;\n private handleOpen: (modalId: EModalType) => void;\n private undoRedoManager: any;\n private isCollaborative: any;\n constructor(cy: any, editor: EditorActionsManager,\n handleOpen: (modalId: EModalType) => void, undoRedoManager: any,\n isCollaborative: boolean){\n this.cy = cy;\n this.editor = editor;\n this.handleOpen = handleOpen;\n this.undoRedoManager = undoRedoManager;\n this.isCollaborative = isCollaborative;\n this.init();\n }\n\n init() {\n const classRef = this;\n\n const ctxMenus = this.cy.scratch('cycontextmenus') ? \n this.cy.contextMenus('get') :\n this.cy.contextMenus();\n\n let menuItems = [\n {\n id: 'deleteSelected',\n content: 'Delete Selected',\n coreAsWell: true,\n onClickFunction: () => {\n const selectedEles = this.cy.elements(':selected');\n classRef.editor.removeElement(selectedEles);\n },\n disabled: false, \n hasTrailingDivider: false,\n },\n {\n id: 'hideSelected',\n content: 'Hide Selected',\n coreAsWell: true,\n onClickFunction: function () {\n classRef.editor.hideSelectedNodes();\n },\n disabled: false,\n hasTrailingDivider: false, \n },\n {\n id: 'loadFromCBioPortal',\n content: 'Load From cBioPortal...', \n coreAsWell: true,\n onClickFunction: () => {\n this.handleOpen(EModalType.STUDY);\n },\n disabled: false,\n hasTrailingDivider: false,\n },\n //Context menu items when clicking on nodes/compounds\n {\n id: 'remove', \n content: 'Delete', \n selector: 'node, edge',\n onClickFunction: function (event) {\n var ele = event.target;\n // The function to be executed on click\n var selectedElements = classRef.cy.nodes(':selected').union(ele);\n classRef.editor.removeElement(selectedElements);\n },\n disabled: false,\n hasTrailingDivider: false, \n coreAsWell: false \n },\n {\n id: 'addSelected',\n content: 'Add Selected Into This', \n selector: 'node',\n onClickFunction: function (event)\n {\n var ele = event.target;\n var selectedNodes = classRef.cy.nodes(':selected');\n var containerType = ele.data('type');\n var validNodes = classRef.cy.collection();\n\n //Do nothing if node is GENE\n if (ele._private.data['type'] === 'GENE' || selectedNodes.size() < 1) {\n return;\n }\n //Prevent actions like adding root node to children & addition to itself\n else\n {\n var notValid = false;\n selectedNodes.forEach(function (tmpNode, i)\n {\n if (ele.id() == tmpNode.id()) {\n notValid = true;\n return false;\n }\n\n if (tmpNode.isParent()) {\n notValid = classRef.isChildren(tmpNode, ele);\n if (notValid) {\n return false;\n }\n }\n\n return true;\n });\n\n if (notValid) {\n return;\n }\n }\n\n\n selectedNodes.forEach(function (tmpNode, i)\n {\n\n if(containerType == \"FAMILY\" || containerType == \"COMPLEX\")\n {\n if(tmpNode.data('type') != \"COMPARTMENT\" && tmpNode.data('type') != \"PROCESS\")\n {\n validNodes = validNodes.add(tmpNode);\n }\n }\n else\n {\n validNodes = validNodes.add(tmpNode);\n }\n\n });\n\n var compId = ele.id();\n classRef.editor.changeParents(validNodes, compId);\n //Unselecting nodes to remove them from selectedNodeStack\n selectedNodes.unselect();\n\n },\n disabled: false,\n hasTrailingDivider: false, \n coreAsWell: false \n },\n {\n id: 'removeSelected',\n content: 'Remove Selected From Parent', \n selector: 'node',\n onClickFunction: function (event) {\n const ele = event.target;\n const selectedNodes = classRef.cy.nodes(':selected');\n\n let notValid = false;\n selectedNodes.forEach(function (tmpNode, i) {\n\n if (tmpNode.isParent()) {\n notValid = classRef.isChildren(tmpNode, ele);\n if (notValid) {\n return false;\n }\n }\n\n return true;\n });\n\n if (notValid) {\n return;\n }\n\n classRef.editor.changeParents(selectedNodes, null);\n //Unselecting nodes to remove them from selectedNodeStack\n selectedNodes.unselect();\n },\n disabled: false, \n hasTrailingDivider: false,\n coreAsWell: false \n },\n {\n id: 'performLayout', \n content: 'Perform Layout', \n coreAsWell: true,\n onClickFunction: () => {\n this.editor.performLayout();\n },\n disabled: false, \n hasTrailingDivider: false, \n }\n\n ];\n let nonCollabItems = [ \n //Context menu items when clicking on blank space\n {\n id: 'undoAction', \n content: 'Undo', \n coreAsWell: true,\n onClickFunction: () => {\n this.undoRedoManager.undo();\n },\n disabled: false, \n hasTrailingDivider: false, \n },\n {\n id: 'redoAction',\n content: 'Redo',\n coreAsWell: true,\n onClickFunction: () => {\n this.undoRedoManager.redo();\n },\n disabled: false,\n hasTrailingDivider: false,\n }\n ];\n\n if(!this.isCollaborative){\n menuItems = menuItems.concat(nonCollabItems);\n }\n ctxMenus.appendMenuItems(menuItems);\n }\n\n //TODO better move this to another class\n //Utility function to check whether query node is children of given node\n isChildren(node, queryNode)\n {\n var parent = queryNode.parent()[0];\n while(parent)\n {\n if (parent.id() == node.id()) {\n return true;\n }\n parent = parent.parent()[0];\n }\n return false;\n }\n}\n","import tippy from 'tippy.js';\nimport 'tippy.js/dist/tippy.css'; // optional for styling\nimport EditorActionsManager from \"./EditorActionsManager\";\nexport default class QtipManager{\n private cy: any;\n private editor: any;\n constructor(cy: any, editor: EditorActionsManager)\n {\n this.cy = cy;\n this.editor = editor;\n }\n\n generateEdgeQtip(edge) {\n const self = this;\n const pubmedURL = 'https://www.ncbi.nlm.nih.gov/pubmed/';\n const pubmedData = edge.data('pubmedIDs');\n\n const wrapper = document.createElement('div');\n\n // header\n const header = document.createElement('div');\n header.classList.add('row', 'node-tooltip-header');\n header.innerHTML = \"INTERACTION DETAILS\";\n\n wrapper.append(header);\n\n // edge label input\n const textInputWrapper = document.createElement('div');\n textInputWrapper.classList.add('col-xs-6', 'inputCol');\n\n const inputElement = document.createElement('input');\n inputElement.type = 'text';\n inputElement.value = edge.data('name');\n inputElement.classList.add('form-control');\n\n inputElement.addEventListener(\"change\", function(event) {\n // @ts-ignore\n const value = event.target.value;\n self.editor.changeName(edge, value);\n });\n\n textInputWrapper.appendChild(inputElement);\n\n const edgeLabelRowElement = document.createElement('div');\n edgeLabelRowElement.classList.add('row', 'geneDetails');\n const colElement = document.createElement('div');\n colElement.classList.add('col-xs-6', 'qtipLabel');\n colElement.innerHTML = \"Label:\";\n\n edgeLabelRowElement.appendChild(colElement);\n edgeLabelRowElement.appendChild(textInputWrapper);\n\n wrapper.appendChild(edgeLabelRowElement);\n \n wrapper.appendChild(document.createElement('hr'));\n\n // pubmed id input\n const pubmedTextInputWrapper = document.createElement('div');\n pubmedTextInputWrapper.classList.add('col-xs-6', 'inputCol');\n\n const pubmedIdInputElement = document.createElement('input');\n pubmedIdInputElement.type = 'text';\n pubmedIdInputElement.classList.add('form-control');\n\n pubmedIdInputElement.addEventListener(\"change\", function(event) {\n // @ts-ignore\n const value = event.target.value;\n const pubmedIdsToAdd = value.split(';');\n \n // @ts-ignore\n event.target.value = \"\";\n\n self.editor.addPubmedIDs(edge, pubmedIdsToAdd);\n\n const pubmedIds = edge.data(\"pubmedIDs\")\n generatePubmedLinks(pubmedIds);\n });\n\n pubmedTextInputWrapper.appendChild(pubmedIdInputElement);\n\n const pubmedIdRowElement = document.createElement('div');\n pubmedIdRowElement.classList.add('row', 'geneDetails');\n const pubmedIdColElement = document.createElement('div');\n pubmedIdColElement.classList.add('col-xs-6', 'qtipLabel');\n pubmedIdColElement.innerHTML = \"Add Pubmed ID(s):\";\n\n pubmedIdRowElement.appendChild(pubmedIdColElement);\n pubmedIdRowElement.appendChild(pubmedTextInputWrapper);\n\n wrapper.appendChild(pubmedIdRowElement);\n\n if (pubmedData.length > 0) {\n generatePubmedLinks(pubmedData);\n }\n\n function generatePubmedLinks(argData) {\n if (document.getElementsByClassName(\"pubmedIDList\").length > 0) {\n document.getElementsByClassName(\"pubmedIDList\").item(0).remove();\n }\n const pubmedIdListWrapper = document.createElement('div');\n pubmedIdListWrapper.classList.add(\"pubmedIDList\");\n\n pubmedIdListWrapper.appendChild(document.createElement('hr'));\n\n const pubmedIdLabel = document.createElement('label');\n pubmedIdLabel.classList.add(\"col-xs-12\", \"pubmedIDLabel\");\n pubmedIdLabel.innerHTML = \"Pubmed IDs\";\n\n pubmedIdListWrapper.appendChild(pubmedIdLabel);\n\n for (var key in argData)\n {\n if(!argData.hasOwnProperty(key)){\n continue;\n }\n const pubmedId = argData[key];\n\n if (isNaN(pubmedId))\n continue;\n\n const pubmedIdListElement = document.createElement('div');\n\n const pubmedIdRemoveButton = document.createElement('i');\n pubmedIdRemoveButton.classList.add('fa', 'fa-times', 'qtipRemovePmedID');\n pubmedIdRemoveButton.setAttribute('aria-hidden', 'true');\n pubmedIdRemoveButton.setAttribute('pubmedId', pubmedId);\n\n pubmedIdRemoveButton.addEventListener(\"click\", function(event) {\n (event.target as HTMLElement).parentElement.remove();\n const pubmedId = (event.target as HTMLElement).getAttribute('pubmedId');\n self.editor.removePubmedID(edge, [pubmedId]);\n const pubmedIds = edge.data('pubmedIDs');\n if (pubmedIds.length === 0) {\n document.getElementsByClassName(\"pubmedIDList\").item(0).remove();\n }\n });\n \n const pubmedContent = document.createElement('div');\n const pubmedIdLabel = document.createElement('label');\n const pubmedIdLink = document.createElement('a');\n pubmedIdLink.setAttribute('target', '_blank');\n const pubmedLink = pubmedURL + pubmedId;\n pubmedIdLink.setAttribute('href', pubmedLink);\n pubmedIdLink.innerHTML = pubmedId.toString();\n\n pubmedIdLabel.appendChild(pubmedIdLink);\n pubmedContent.appendChild(pubmedIdLabel);\n pubmedContent.appendChild(pubmedIdRemoveButton);\n pubmedIdListElement.appendChild(pubmedContent);\n\n pubmedIdListWrapper.appendChild(pubmedIdListElement);\n }\n if (edge.data('pubmedIDs').length > 0) {\n wrapper.appendChild(pubmedIdListWrapper);\n }\n }\n\n wrapper.classList.add(\"tooltip-text-style\");\n return wrapper;\n }\n\n generateNodeQtip(node) {\n const self = this;\n\n const header = document.createElement('div');\n header.classList.add('row', 'node-tooltip-header');\n header.innerHTML = node.data('type').toUpperCase() + \" DETAILS\";\n\n const textInputWrapper = document.createElement('div');\n textInputWrapper.classList.add('col-xs-8', 'inputCol');\n\n const inputElement = document.createElement('input');\n inputElement.type = 'text';\n inputElement.value = node.data('name');\n inputElement.classList.add('form-control');\n\n inputElement.addEventListener(\"change\", function(event) {\n // @ts-ignore\n const value = event.target.value;\n self.editor.changeName(node, value);\n });\n\n textInputWrapper.appendChild(inputElement);\n\n const wrapper = document.createElement('div');\n const rowElement = document.createElement('div');\n rowElement.classList.add('row', 'geneDetails');\n const colElement = document.createElement('div');\n colElement.classList.add('col-xs-4', 'qtipLabel');\n colElement.innerHTML = \"Name:\";\n\n rowElement.appendChild(colElement);\n rowElement.appendChild(textInputWrapper);\n\n wrapper.append(header);\n wrapper.append(rowElement);\n\n if (node.data('type') === \"GENE\") {\n const buttonWrapper = document.createElement('div');\n buttonWrapper.classList.add('row', 'centerText', 'geneDetails');\n \n const button = document.createElement('button');\n button.type = 'button';\n button.classList.add('btn', 'btn-default');\n button.innerHTML = \"My Cancer Genome\";\n button.addEventListener(\"click\", function (event) {\n event.preventDefault();\n const name = node.data('name');\n window.open(\"https://www.mycancergenome.org/content/gene/\" + name);\n })\n\n buttonWrapper.append(button);\n wrapper.append(buttonWrapper)\n }\n\n wrapper.classList.add(\"tooltip-text-style\");\n return wrapper;\n }\n\n addQtipToElements(eles)\n {\n const self = this;\n eles.forEach(function(ele)\n {\n let ref = ele.popperRef();\n let dummyDomEle = document.createElement('div');\n document.body.appendChild(dummyDomEle);\n let tip = tippy(dummyDomEle, { // tippy props:\n getReferenceClientRect: ref.getBoundingClientRect, // https://atomiks.github.io/tippyjs/v6/all-props/#getreferenceclientrect\n trigger: 'manual', // mandatory, we cause the tippy to show programmatically.\n placement: 'bottom',\n interactive: true,\n theme: 'pathwaymapper',\n // your own custom props\n // content prop can be used when the target is a single element https://atomiks.github.io/tippyjs/v6/constructor/#prop\n content: () => {\n let content = ele.isNode() ? \n self.generateNodeQtip(ele) :\n self.generateEdgeQtip(ele);\n \n return content;\n },\n onHidden(instance) {\n instance.destroy();\n dummyDomEle.remove();\n }\n });\n \n self.cy.one(\"pan zoom\", function() {\n if (dummyDomEle && dummyDomEle[\"_tippy\"]) {\n tip.hide();\n }\n });\n\n ele.one(\"showqtipevent\", function() {\n tip.show();\n });\n });\n }\n\n\n //Utility Functions\n capitalizeFirstLetter(string)\n {\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n\n}\n","import cytoscape from 'cytoscape';\nimport $ from \"jquery\";\nimport 'jquery-ui-dist/jquery-ui';\nimport EditorActionsManager from \"../managers/EditorActionsManager\";\n\n\nexport default class DragDropNodeAddPlugin {\n\n\n\n pathwayHandler: (pathwayName: string) => void;\n\n private cy: any;\n private editor: EditorActionsManager;\n\n constructor(editor: EditorActionsManager, cy: any, pathwayHandler: (pathwayName: string) => void)\n {\n this.editor = editor;\n this.cy = cy;\n this.pathwayHandler = pathwayHandler;\n this.initNodeAdd();\n }\n\n //TODO JQUERY IS IGNORED\n initNodeAdd()\n {\n var nodeAddClass = this;\n var defaults = {\n height: 30, //height of the icon container\n width: 30, //width of the icon container\n padding: 5, //padding of the icon container(from right & top)\n backgroundColorDiv: '#fbfbfb', //background color of the icon container\n borderColorDiv: '#fff', //border color of the icon container\n borderWidthDiv: '0px', //border width of the icon container\n borderRadiusDiv: '5px', //border radius of the icon container\n\n icon: '', //icon class name\n\n nodeParams: function(){\n // return element object to be passed to cy.add() for adding node\n return {};\n }\n };\n\n const self = this;\n\n // @ts-ignore\n $.fn.cytoscapeNodeadd = function(params: any) {\n var options = $.extend(true, {}, defaults, params);\n var fn = params;\n\n var functions = {\n destroy: function() {\n var $this = $(this);\n\n $this.find(\".ui-cytoscape-nodeadd\").remove();\n },\n init: function()\n {\n return $(this).each(function()\n {\n var components = options.components;\n for (const component of components)\n {\n var dragContainer = component.container;\n //var explanationText = component.explanationText;\n\n var $nodeadd = $('
');\n dragContainer.append($nodeadd);\n var $nodeDragHandle = $('
\\\n \\\n \\\n \\\n
');\n $nodeadd.append($nodeDragHandle);\n\n $nodeDragHandle.bind(\"mousedown\", function(e: any)\n {\n e.stopPropagation(); // don't trigger dragging of nodeadd\n e.preventDefault(); // don't cause text selection\n });\n\n //Setup UI\n dragContainer.find(\".ui-cytoscape-nodeadd-nodediv\").css({\n background: options.backgroundColorDiv,\n border: options.borderWidthDiv + ' solid ' + options.borderColorDiv,\n 'border-radius': options.borderRadiusDiv\n });\n\n //Init Draggable\n dragContainer.find(\"#ui-cytoscape-nodeadd-icon\").draggable({\n helper: \"clone\",\n cursor: \"pointer\"\n });\n }\n\n // @ts-ignore TODO: AMENDMENT ATTENTION\n var $container = $(this);\n //Init Droppable\n // @ts-ignore TODO: Droppable is ignored\n $container.droppable({\n activeClass: \"ui-state-highlight\",\n // accept: \"#ui-cytoscape-nodeadd-icon\",\n drop: function(event: any, ui: any) {\n $container.removeClass(\"ui-state-highlight\");\n\n var currentOffset = $container.offset();\n var relX = event.pageX - currentOffset.left;\n var relY = event.pageY - currentOffset.top;\n\n var nodeType = $(ui.helper).attr('nodeType').toUpperCase();\n\n var cy = nodeAddClass.cy;\n\n //Hold a map for parents and candidate parent nodes for this addition\n var nodeMap = {};\n var parentMap = {};\n //Loop through nodes for hit testing about drag position on canvas\n cy.nodes().forEach(function(node: any)\n {\n var nodeBbox = node.renderedBoundingBox();\n //Rectangle point test\n if ( (relX <= nodeBbox.x2 && relX >= nodeBbox.x1) && (relY <= nodeBbox.y2 && relY >= nodeBbox.y1) && node.data().type != 'GENE' )\n {\n //If node has a children put an entry to the parentMap\n if (node.children().length > 0)\n {\n parentMap[node.id()] = true;\n }\n\n //If parent of this node is already added to the node map remove it, since our candidate is in deeper level !\n if (parentMap[node._private.data.parent])\n {\n delete nodeMap[node._private.data.parent];\n }\n\n //Add an entry to node map\n nodeMap[node.id()] = node;\n }\n });\n\n //Check if any parent found, if so set parent field\n var parent = nodeMap[Object.keys(nodeMap)[0]];\n var nodeData = {w: \"0\", h: \"100\", parent: 0, type: nodeType, name:'New '+ $(ui.helper).attr('nodeType')};\n if (parent)\n {\n if(parent.data().type == \"FAMILY\" || parent.data().type == \"COMPLEX\")\n {\n if(nodeType != \"COMPARTMENT\" && nodeType != \"PROCESS\")\n {\n nodeData.parent = parent.id();\n }\n }\n else\n {\n nodeData.parent = parent.id();\n }\n }\n if (nodeType === \"PROCESS\") {\n nodeData.w = \"100\";\n nodeData.h = \"35\";\n }\n else {\n nodeData.w = \"150\";\n nodeData.h = \"52\";\n }\n\n //Adjust position according to the zoom level and pan !\n //To set rendered position !!!\n //TODO refactor this !\n relX = relX / cy.zoom() + cy.extent().x1;\n relY = relY / cy.zoom() + cy.extent().y1;\n nodeAddClass.editor.addNode(nodeData,{x: relX,y: relY});\n self.pathwayHandler(\"Additional Pathway\");\n\n }\n });\n\n });\n }\n };\n\n if (functions[fn]) {\n return functions[fn].apply(this, Array.prototype.slice.call(arguments, 1));\n } else if (typeof fn == 'object' || !fn) {\n return functions.init.apply(this, arguments);\n } else {\n $.error(\"No such function `\" + fn + \"` for jquery.cytoscapenodeadd\");\n }\n\n return $(this);\n };\n\n // @ts-ignore\n $.fn.cynodeadd = $.fn.cytoscapeNodeadd;\n try{\n /* Adding as an extension to the core functionality of cytoscape.js*/\n cytoscape('core', 'nodeadd', function(options: any) {\n\n // @ts-ignore\n $(this.container()).cytoscapeNodeadd(options);\n });\n } catch(err){\n console.log(err);\n }\n }\n\n\n\n\n}\n","import autobind from \"autobind-decorator\";\nimport cytoscape from 'cytoscape';\nimport $ from \"jquery\";\nimport { observer } from \"mobx-react\";\nimport React from 'react';\nimport pathways from \"../data/pathways.json\";\n// @ts-ignore\nimport compartmentImg from \"../images/nodes/compartment.svg\";\n// @ts-ignore\nimport complexImg from \"../images/nodes/complex.svg\";\n// @ts-ignore\nimport familyImg from \"../images/nodes/family.svg\";\n// @ts-ignore\nimport geneImg from \"../images/nodes/gene.svg\";\n// @ts-ignore\nimport processImg from \"../images/nodes/process.svg\";\n// @ts-ignore\nimport resizeCue from '../images/resizeCue.svg';\nimport ContextMenuManager from \"../managers/ContextMenuManager\";\nimport EditorActionsManager from \"../managers/EditorActionsManager\";\nimport QtipManager from \"../managers/QtipManager\";\nimport ShareDBManager from \"../managers/ShareDBManager\";\nimport ViewOperationsManager from \"../managers/ViewOperationsManager\";\nimport CBioPortalAccessor from \"../utils/CBioPortalAccessor\";\nimport DragDropNodeAddPlugin from \"../utils/DragDropNodeAddPlugin\";\nimport SaveLoadUtility from \"../utils/SaveLoadUtility\";\nimport { EModalType, IColorValueMap, IProfileMetaData } from './react-pathway-mapper';\n\n// @ts-ignore\nwindow.$ = $;\n\nconst edgeHandles = require('cytoscape-edgehandles');\nconst edgeEditing = require('cytoscape-edge-editing');\nconst fcose = require('cytoscape-fcose');\nconst nodeEditing = require('cytoscape-node-editing');\nconst undoRedo = require('cytoscape-undo-redo');\nconst panzoom = require('cytoscape-panzoom');\nconst styleSheet = require('../utils/GraphStyleSheet.tsx');\nconst panzoomOpts = require('../utils/PanzoomOptions.tsx');\nconst navigator = require('cytoscape-navigator');\nconst contextMenus = require('cytoscape-context-menus');\nconst konva = require('konva');\nconst viewUtilities = require('cytoscape-view-utilities');\nconst gridGuide = require('cytoscape-grid-guide');\nconst popper = require('cytoscape-popper');\nconst layoutUtilities = require('cytoscape-layout-utilities');\n\ntype PathwayMapperType = {\n isCollaborative: boolean;\n isCbioPortal: boolean;\n editorHandler: Function;\n selectedPathway: string;\n setActiveEdge: Function;\n profiles: IProfileMetaData[];\n pathwayHandler: (pathwayName: string) => void;\n handleOpen: (modalId: EModalType) => void;\n onPathwayChangeCompleted: () => void;\n genomicDataOverlayColorScheme: IColorValueMap;\n colorSchemeChangeCallback: (IColorValueMap) => void;\n};\n@observer\nexport default class CytoscapeArea extends React.Component{\n private cy:any;\n private cyDiv: HTMLDivElement | undefined;\n private editor: EditorActionsManager;\n private edgeAddingMode: any;\n private viewOperationsManager: ViewOperationsManager;\n private qtipManager: QtipManager;\n private genomicDataExplorerView: any;\n private pathwayDetailsView: any;\n private viewUtilities: any;\n private isCollaborative: boolean;\n private isCbioPortal: boolean;\n private shareDBManager: ShareDBManager;\n private cxtMenuManager: ContextMenuManager;\n private dragDropNodeAddManager: DragDropNodeAddPlugin;\n private undoRedoManager: any;\n private portalAccessor: CBioPortalAccessor;\n private isMountedFirst = true;\n private eh: any;\n private lastSelectedEdge: any;\n\n\n constructor (props: PathwayMapperType) {\n super(props);\n this.isCollaborative = props.isCollaborative;\n this.edgeAddingMode = 0;\n this.isCbioPortal = props.isCbioPortal;\n }\n\n componentWillUpdate(nextProps: PathwayMapperType) {\n\n if (this.props.selectedPathway !== nextProps.selectedPathway) {\n this.getPathway(nextProps.selectedPathway);\n }\n \n }\n\n componentDidUpdate(prevProps: PathwayMapperType) {\n if (this.isCbioPortal && \n prevProps.selectedPathway !== this.props.selectedPathway) {\n this.props.onPathwayChangeCompleted();\n }\n }\n\n // This method only opens pathways that are available in pathway.json. Namely, imported or merged pathways are not opened via this method.\n // Yet, they individually call parsing method.\n getPathway(selectedPathway: string){\n\n if(!selectedPathway || selectedPathway === '') return;\n\n const data = pathways[selectedPathway];\n\n // It might be non-existent due to pathway being created using collaborative mode, or pathway loaded elsewhere (import vs.)\n if(!data){ \n return;\n }\n // TODO Problematic const data = pathways[\"../samples/BLCA-2014-RTK-RAS-PI(3)K-pathway.txt\"];\n\n const parsedGraph = SaveLoadUtility.parseGraph(data, true);\n\n\n const allEles = parsedGraph;\n this.editor.loadFile(allEles.nodes, allEles.edges);\n }\n\n render(){\n return (
\n
\n
\n
);\n }\n\n componentDidMount(): void {\n if(this.isMountedFirst){\n this.init();\n this.isMountedFirst = false;\n }\n this.getPathway(this.props.selectedPathway);\n }\n\n @autobind\n cyDivHandler(div:HTMLDivElement){\n this.cyDiv = div;\n }\n\n init(){\n\n // Create portal accessor\n this.portalAccessor = new CBioPortalAccessor();\n\n // Initializes cytoscape\n this.initCyJS();\n // Initialize cytoscape based handlers here\n this.initCyHandlers();\n this.initKeyboardHandlers();\n this.initUndoRedoFunctionality();\n this.initCBioPortalFunctionalities();\n this.placePanzoomAndOverlay();\n\n //this.appManager = this;\n }\n\n placePanzoomAndOverlay(){\n //TODO place navigator !!!\n var offset = 5;\n // @ts-ignore\n var topCy = $(this.cyDiv).offset().top;\n //var bottomCy = $('.cyContainer').offset().bottom;\n // @ts-ignore\n var leftCy = $(this.cyDiv).offset().left;\n //var rightCy = $('.cyContainer').offset().right;\n // @ts-ignore\n var heightCy = $(this.cyDiv).outerHeight();\n // @ts-ignore\n var widthCy = $(this.cyDiv).outerWidth();\n var heightNavigator = $('.cytoscape-navigator-wrapper').outerHeight();\n var widthNavigator = $('.cytoscape-navigator-wrapper').outerWidth();\n\n if(!this.isCbioPortal) {\n \n $('.cytoscape-navigator-wrapper').css('top', heightCy + topCy - heightNavigator - offset + 16);\n $('.cytoscape-navigator-wrapper').css('left', widthCy + leftCy - widthNavigator - offset + 24 - 0.5 + 0.35);\n }\n else {\n $('.cytoscape-navigator-wrapper').css('bottom', 10.5);\n $('.cytoscape-navigator-wrapper').css('right', 0);\n }\n $('.cytoscape-navigator-wrapper').css('z-index', 1039);\n\n //Relative is used so that its position depends on the below properties\n $('.cy-panzoom').css('position', 'relative');\n $('.cy-panzoom').css('top', 2);\n $('.cy-panzoom').css('left', widthCy - 51);\n $('.cy-panzoom').css('z-index', 1039);\n //Makes the width of panzoom container to 0\n $('.cy-panzoom').css('width', 200);\n }\n\n getPathwayData() {\n return this.pathwayDetailsView.getPathwayData();\n }\n\n initCyJS() {\n \n try {\n panzoom(cytoscape, $); // register extension\n } catch(err){\n console.log(err);\n }\n try { \n navigator(cytoscape); // register extension\n } catch(err){\n console.log(err);\n }\n try { \n gridGuide(cytoscape, $); // register extension\n } catch(err){\n console.log(err);\n }\n try { \n undoRedo(cytoscape); // register extension\n } catch(err){\n console.log(err);\n }\n try { \n contextMenus(cytoscape, $); // register extension\n } catch(err){\n console.log(err);\n }\n try { \n nodeEditing(cytoscape, $, konva); // register extension\n } catch(err){\n console.log(err);\n }\n try { \n edgeEditing(cytoscape, $, konva); // register extension\n } catch(err){\n console.log(err);\n }\n try { \n viewUtilities(cytoscape, $); // register extension\n } catch(err){\n console.log(err);\n }\n try { \n edgeHandles(cytoscape, $);\n } catch(err){\n console.log(err);\n }\n try {\n popper(cytoscape);\n } catch (err) {\n console.log(err);\n }\n try {\n fcose(cytoscape);\n } catch (err) {\n console.log(err);\n }\n try {\n layoutUtilities(cytoscape);\n } catch (err) {\n console.log(err);\n }\n\n this.cy = cytoscape({\n container: this.cyDiv,\n boxSelectionEnabled: true,\n autounselectify: false,\n wheelSensitivity: 0.1,\n style: styleSheet,\n textureOnViewport: false,\n motionBlur: true,\n layout: {name: 'preset'}\n });\n\n this.edgeAddingMode = 0;\n // var allEles = SaveLoadUtilities.parseGraph(sampleGraph);\n\n this.undoRedoManager = this.cy.undoRedo();\n // Create Manager Classes\n this.shareDBManager = new ShareDBManager(() => {\n const dbDoc = this.shareDBManager.getDoc();\n });\n this.editor = new EditorActionsManager(this.isCollaborative,\n this.shareDBManager,\n this.cy,\n this.isCbioPortal,\n this.undoRedoManager,\n this.portalAccessor,\n this.props.profiles,\n this.props.genomicDataOverlayColorScheme,\n this.props.colorSchemeChangeCallback);\n this.shareDBManager.setEditor(this.editor);\n if(this.isCollaborative){\n this.shareDBManager.initShareDB();\n }\n\n this.qtipManager = new QtipManager(this.cy, this.editor);\n \n this.cxtMenuManager = new ContextMenuManager(this.cy, \n this.editor,\n this.props.handleOpen, \n this.undoRedoManager, \n this.props.isCollaborative);\n \n this.dragDropNodeAddManager = new DragDropNodeAddPlugin(this.editor, this.cy, this.props.pathwayHandler);\n\n // Initialize panzoom\n this.cy.panzoom(panzoomOpts);\n\n this.cy.layoutUtilities({\n desiredAspectRatio: this.cy.width() / this.cy.height()\n });\n\n // Node Add initialization\n this.cy.nodeadd(\n {\n // Once the explanationText is cast to uppercase they will be node types\n components:\n [\n {\n container: $('#simpleNodeDiv'),\n nodeType: 'Gene',\n icon: geneImg\n },\n {\n container: $('#familyNodeDiv'),\n nodeType: 'Family',\n icon: familyImg\n },\n {\n container: $('#complexNodeDiv'),\n nodeType: 'Complex',\n icon: complexImg\n },\n {\n container: $('#compartmentNodeDiv'),\n nodeType: 'Compartment',\n icon: compartmentImg\n },\n {\n container: $('#processNodeDiv'),\n nodeType: 'Process',\n icon: processImg\n }\n ]\n\n });\n const self = this;\n const edgeHandleDefaults ={\n preview: true, // whether to show added edges preview before releasing selection\n stackOrder: 4, // Controls stack order of edgehandles canvas element by setting it's z-index\n handleSize: 10, // the size of the edge handle put on nodes\n handleColor: '#1abc9c', // the colour of the handle and the line drawn from it\n handleLineType: 'ghost', // can be 'ghost' for real edge, 'straight' for a straight line, or 'draw' for a draw-as-you-go line\n handleLineWidth: 1, // width of handle line in pixels\n handleNodes: 'node', // selector/filter function for whether edges can be made from a given node\n hoverDelay: 1, // time spend over a target node before it is considered a target selection\n cxt: false, // whether cxt events trigger edgehandles (useful on touch)\n enabled: false, // whether to start the extension in the enabled state\n toggleOffOnLeave: true, // whether an edge is cancelled by leaving a node (true), or whether you need to go over again to cancel (false; allows multiple edges in one pass)\n edgeType: function( sourceNode, targetNode ) {\n // can return 'flat' for flat edges between nodes or 'node' for intermediate node between them\n // returning null/undefined means an edge can't be added between the two nodes\n return 'flat';\n },\n handlePosition: function( node ){\n return 'middle top'; // sets the position of the handle in the format of \"X-AXIS Y-AXIS\" such as \"left top\", \"middle top\"\n },\n loopAllowed: function( node ) {\n // for the specified node, return whether edges from itself to itself are allowed\n return false;\n },\n nodeLoopOffset: -50, // offset for edgeType: 'node' loops\n nodeParams: function( sourceNode, targetNode ) {\n // for edges between the specified source and target\n // return element object to be passed to cy.add() for intermediary node\n return {};\n },\n edgeParams: function( sourceNode, targetNode, i ) {\n // for edges between the specified source and target\n // return element object to be passed to cy.add() for edge\n // NB: i indicates edge index in case of edgeType: 'node'\n return {};\n },\n start: function( sourceNode )\n {\n // fired when edgehandles interaction starts (drag on handle)\n var type = self.getGlobalEdgeType();\n //self.cy.edgehandles('option', 'ghostEdgeType', type);\n },\n complete: function( sourceNode, targetNodes, addedEntities )\n {\n // // Remove recently added edge !\n // // FBI takes this case from now on :O\n // // We will take care of addition in our manager :)\n self.cy.remove(addedEntities);\n self.editor.addEdge({\n source: sourceNode.id(),\n target: targetNodes[0].id(),\n // @ts-ignore\n type: self.getGlobalEdgeType(window.edgeAddingMode),\n pubmedIDs: [],\n name: \"\"\n });\n },\n stop: function( sourceNode )\n {\n // fired when edgehandles interaction is stopped (either complete with added edges or incomplete)\n //TODO refactor this, so terrible for now\n //$('.edge-palette a').blur().removeClass('active');\n self.edgeAddingMode = -1;\n self.eh.disable();\n self.eh.hide();\n self.props.setActiveEdge(-1);\n },\n };\n //Edge Handles initialization\n this.eh = this.cy.edgehandles(edgeHandleDefaults);\n this.eh.disable();\n this.props.editorHandler(this.editor, this.eh, this.undoRedoManager);\n\n if(!this.isCbioPortal) {\n this.cy.nodeEditing({\n padding: 5, // spacing between node and grapples/rectangle\n undoable: true, // and if cy.undoRedo exists\n\n grappleSize: 8, // size of square dots\n grappleColor: \"#ffc90e\", // color of grapples\n inactiveGrappleStroke: \"inside 1px blue\",\n boundingRectangle: true, // enable/disable bounding rectangle\n boundingRectangleLineDash: [4, 8], // line dash of bounding rectangle\n boundingRectangleLineColor: \"ffc90e\",\n boundingRectangleLineWidth: 1.5,\n zIndex: 999,\n\n moveSelectedNodesOnKeyEvents: function () {\n return true;\n },\n\n minWidth: function (node) {\n var data = node.data(\"resizeMinWidth\");\n return data ? data : 15;\n }, // a function returns min width of node\n minHeight: function (node) {\n var data = node.data(\"resizeMinHeight\");\n return data ? data : 15;\n }, // a function returns min height of node\n\n // Getters for some style properties the defaults returns ele.css('property-name')\n // you are encouraged to override these getters\n getCompoundMinWidth: function (node) {\n return node.style('min-width');\n },\n getCompoundMinHeight: function (node) {\n return node.style('min-height');\n },\n getCompoundMinWidthBiasRight: function (node) {\n return node.style('min-width-bias-right');\n },\n getCompoundMinWidthBiasLeft: function (node) {\n return node.style('min-width-bias-left');\n },\n getCompoundMinHeightBiasTop: function (node) {\n return node.style('min-height-bias-top');\n },\n getCompoundMinHeightBiasBottom: function (node) {\n return node.style('min-height-bias-bottom');\n },\n\n\n isFixedAspectRatioResizeMode: function (node) {\n return node.is(\".fixedAspectRatioResizeMode\")\n },// with only 4 active grapples (at corners)\n isNoResizeMode: function (node) {\n return undefined;\n }, // no active grapples\n\n // These optional function will be executed to set the width/height of a node in this extension\n // Using node.css() is not a recommended way (http://js.cytoscape.org/#eles.style) to do this. Therefore, overriding these defaults\n // so that a data field or something like that will be used to set node dimentions instead of directly calling node.css()\n // is highly recommended (Of course this will require a proper setting in the stylesheet).\n setWidth: function (node, width) {\n node.data('w', width)\n },\n setHeight: function (node, height) {\n node.data('h', height);\n },\n setCompoundMinWidth: function (node, minWidth) {\n node.style('min-width', minWidth);\n },\n setCompoundMinHeight: function (node, minHeight) {\n node.style('min-height', minHeight);\n },\n setCompoundMinWidthBiasLeft: function (node, minWidthBiasLeft) {\n node.style('min-width-bias-left', minWidthBiasLeft);\n },\n setCompoundMinWidthBiasRight: function (node, minHeightBiasRight) {\n node.style('min-width-bias-right', minHeightBiasRight);\n },\n setCompoundMinHeightBiasTop: function (node, minHeightBiasTop) {\n node.style('min-height-bias-top', minHeightBiasTop);\n },\n setCompoundMinHeightBiasBottom: function (node, minHeightBiasBottom) {\n node.style('min-height-bias-bottom', minHeightBiasBottom);\n },\n\n cursors: { // See http://www.w3schools.com/cssref/tryit.asp?filename=trycss_cursor\n // May take any \"cursor\" css property\n default: \"default\", // to be set after resizing finished or mouseleave\n inactive: \"not-allowed\",\n nw: \"nw-resize\",\n n: \"n-resize\",\n ne: \"ne-resize\",\n e: \"e-resize\",\n se: \"se-resize\",\n s: \"s-resize\",\n sw: \"sw-resize\",\n w: \"w-resize\"\n },\n resizeToContentCueImage: resizeCue,\n resizeToContentFunction: this.editor.resizeNodesToContent.bind(this.editor),\n });\n }\n //Navigator for cytoscape js\n var navDefaults = {\n container: '.cytoscape-navigator-wrapper' // can be a HTML or jQuery element or jQuery selector\n , viewLiveFramerate: 0 // set false to update graph pan only on drag end; set 0 to do it instantly; set a number (frames per second) to update not more than N times per second\n , thumbnailEventFramerate: 10 // max thumbnail's updates per second triggered by graph updates\n , thumbnailLiveFramerate: false // max thumbnail's updates per second. Set false to disable\n , dblClickDelay: 200 // milliseconds\n , removeCustomContainer: true // destroy the container specified by user on plugin destroy\n , rerenderDelay: 100 // ms to throttle rerender updates to the panzoom for performance\n };\n\n //TODO: AMENDMENT declaration removed\n this.cy.navigator(navDefaults); // get navigator instance, nav\n\n const viewUtilitiesOpts = {\n node: {\n highlighted: {\n 'border-width': 2,\n 'border-color': '#bc1142'\n }, // styles for when nodes are highlighted.\n unhighlighted: {\n 'opacity': function (ele: any) {\n // We return the same opacity because to override the unhibhlighted ele opacity in view-utilities\n return ele.css('opacity');\n }\n }// styles for when nodes are unhighlighted.}\n },\n edge: {\n highlighted: {}, // styles for when edges are highlighted.\n unhighlighted: {\n 'opacity': function (ele: any) {\n // We return the same opacity because to override the unhibhlighted ele opacity in view-utilities\n return ele.css('opacity');\n }\n } // styles for when edges are unhighlighted.\n },\n setVisibilityOnHide: false, // whether to set visibility on hide/show\n setDisplayOnHide: true, // whether to set display on hide/show\n neighbor: () => { // return desired neighbors of tapheld node\n return false;\n },\n neighborSelectTime: 500 //ms, time to taphold to select desired neighbors\n };\n\n this.viewUtilities = this.cy.viewUtilities(viewUtilitiesOpts);\n\n this.editor.setViewUtilities(this.viewUtilities);\n\n this.placePanzoomAndOverlay();\n }\n\n getGlobalEdgeType()\n {\n var type = \"NONE\";\n // @ts-ignore\n if (window.edgeAddingMode === 1)\n {\n type = 'ACTIVATES';\n }\n // @ts-ignore\n else if (window.edgeAddingMode === 2)\n {\n type = 'INHIBITS';\n }\n // @ts-ignore\n else if (window.edgeAddingMode === 3)\n {\n type = 'INDUCES';\n }\n // @ts-ignore\n else if (window.edgeAddingMode === 4)\n {\n type = 'REPRESSES';\n }\n // @ts-ignore\n else if (window.edgeAddingMode === 5)\n {\n type = 'BINDS';\n }\n return type;\n }\n\n initCyHandlers(){\n var that = this;\n\n var tappedBefore: any;\n var tappedTimeout: number;\n this.cy.on('tap', function (event: any) {\n var tappedNow = event.target;\n if (tappedTimeout !== -1 && tappedBefore !== -1) {\n clearTimeout(tappedTimeout);\n }\n if (tappedBefore === tappedNow) {\n tappedNow.trigger('doubleTap');\n tappedBefore = -1;\n } else {\n // @ts-ignore TODO AMENDMENTsa\n tappedTimeout = setTimeout(function () {\n tappedBefore = -1;\n }, 300);\n tappedBefore = tappedNow;\n }\n });\n\n this.cy.on('doubleTap', 'node', function (e: any) {\n\n // if cBioPortal ignore\n if(that.props.isCbioPortal) return;\n\n const eventIsDirect = (e.target === this);\n \n if (eventIsDirect) { \n that.qtipManager.addQtipToElements(e.target); \n e.target.trigger(\"showqtipevent\");\n }\n });\n \n this.cy.on('doubleTap', 'edge', function (e: any) {\n \n // if cBioPortal ignore\n if(that.props.isCbioPortal) return;\n \n const eventIsDirect = (e.target === this);\n \n if (eventIsDirect) {\n that.qtipManager.addQtipToElements(e.target); \n e.target.trigger(\"showqtipevent\");\n }\n });\n\n this.cy.on('select', 'node', (e: any) => {\n this.editor.pushSelectedNodeStack(e.target);\n });\n\n // this.cy.on('select', 'edge', function( e )\n // {\n // var eventIsDirect = (e.target === this);\n // $(\".qtip\").remove();\n //\n // if( eventIsDirect ) {\n // that.qtipManager.addQtipToElements(e.target);\n // }\n // });\n\n this.cy.on('unselect', 'node', (e: any) => {\n this.editor.removeElementFromSelectedNodeStack(e.target);\n });\n\n this.cy.on('free', 'node', (e: any) => {\n //Collect all nodes with descendants in case of compounds\n var selectedNodes = this.cy.nodes(':selected');\n var nodes = e.target;\n nodes = nodes.union(nodes.descendants());\n nodes = nodes.union(selectedNodes);\n this.editor.moveElements(nodes);\n });\n\n this.cy.on('layoutstop', () => {\n this.editor.postLayout();\n });\n\n this.cy.on(\"nodeediting.resizeend\", (_e: any, _type: any, node: any) => {\n \n //Updates 'data' properties from 'style'\n node.data('w', node.width());\n node.data('h', node.height());\n //Used for collaborative mode\n this.editor.resizeElements(node);\n });\n\n this.cy.on('select', 'edge', (e: any) => {\n this.lastSelectedEdge = e.target;\n });\n\n this.cy.on('bendPointMovement', () => {\n this.editor.updateEdgeAnchorPoints(this.lastSelectedEdge);\n });\n\n this.cy.on('nodeediting.moveend', () => {\n this.editor.changeNodePositionsByArrows(this.cy.nodes(\":selected\"));\n });\n\n }\n\n initKeyboardHandlers() {\n if (!this.isCollaborative && !this.isCbioPortal) {\n $(document).keydown((e: any) => {\n if (e.which === 89 && (e.ctrlKey || e.metaKey)) {\n this.undoRedoManager.redo();\n }\n else if (e.which === 90 && (e.ctrlKey || e.metaKey)) {\n this.undoRedoManager.undo();\n }\n });\n }\n else {\n $('a[role=\"redo\"]').hide();\n $('a[role=\"undo\"]').hide();\n }\n $(document).keydown((e: any) => {\n if (e.which === 65 && (e.ctrlKey || e.metaKey)) {\n // @ts-ignore\n var tn = document.activeElement.tagName;\n if (tn != \"TEXTAREA\" && tn != \"INPUT\") {\n e.preventDefault();\n this.cy.elements().select();\n }\n }\n else if (e.which === 8 || e.which === 46) {\n // @ts-ignore\n var tn = document.activeElement.tagName;\n if (tn != \"TEXTAREA\" && tn != \"INPUT\") {\n var selectedElements = this.cy.$(':selected');\n this.editor.removeElement(selectedElements);\n }\n }\n });\n }\n\n initUndoRedoFunctionality() {\n if (this.isCollaborative || this.isCbioPortal) {\n $('[role=\"undo\"]').hide();\n $('[role=\"redo\"]').hide();\n /* TODO: AMENDMENT\n document.getElementById(\"localOrCollaborativeToolbar\").style.display = \"none\";\n */\n }\n }\n\n\n initCBioPortalFunctionalities() {\n if (this.isCbioPortal) {\n const contextMenu = this.cy.contextMenus('get');\n\n contextMenu.destroy();\n }\n }\n\n\n}","import autobind from \"autobind-decorator\";\nimport { action, computed, makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport { IGeneticAlterationRuleSetParams } from 'oncoprintjs';\nimport React from 'react';\nimport { Col, Row } from \"react-bootstrap\";\nimport { toast, ToastContainer } from 'react-toastify';\nimport 'react-toastify/dist/ReactToastify.min.css';\nimport ReactTooltip from 'react-tooltip';\nimport \"../css/pmv1.css\";\nimport \"../css/pmv2.css\";\nimport '../css/qtip.css';\nimport \"../css/supp.css\";\nimport pathways from \"../data/pathways.json\";\nimport EditorActionsManager from \"../managers/EditorActionsManager\";\nimport FileOperationsManager from '../managers/FileOperationsManager';\nimport GridOptionsManager from '../managers/GridOptionsManager';\nimport ViewOperationsManager from '../managers/ViewOperationsManager';\nimport AboutModal from '../modals/AboutModal';\nimport CBioHelpModal from '../modals/CBioHelpModal';\nimport ConfirmationModal from '../modals/ConfirmationModal';\nimport GridSettings from '../modals/GridSettings';\nimport LayoutProperties from '../modals/LayoutProperties';\nimport PathwayDetailsModal from '../modals/PathwayDetailsModal';\nimport ProfilesColorSchemeModal from \"../modals/ProfilesColorSchemeModal\";\nimport ProfilesModal from '../modals/ProfilesModal';\nimport QuickHelpModal from '../modals/QuickHelpModal';\nimport StudyModal from '../modals/StudyModal';\nimport Ranking from \"../ui/Ranking\";\nimport Toolbar from \"../ui/Toolbar\";\nimport CBioPortalAccessor from '../utils/CBioPortalAccessor';\nimport PathwayActions from '../utils/PathwayActions';\nimport SaveLoadUtility from '../utils/SaveLoadUtility';\nimport Buttonbar from \"./Buttonbar\";\nimport CytoscapeArea from \"./CytoscapeArea\";\nimport Menubar from './Menubar';\nimport Sidebar from './Sidebar';\n\nconst maxHeapFn = require('@datastructures-js/max-heap');\nlet maxHeap = maxHeapFn();\n\ninterface IPathwayMapperProps{\n isCBioPortal: boolean;\n genes: any[];\n isCollaborative?: boolean;\n cBioAlterationData?: ICBioData[];\n sampleIconData?: ISampleIconData,\n pathwayName? : string;\n alterationData?: IAlterationData;\n onAddGenes?: (selectedGenes: string[]) => void;\n changePathwayHandler?: (pathwayGenes: string[]) => void;\n addGenomicDataHandler?: (addGenomicData: (alterationData: ICBioData[]) => void) => void;\n tableComponent?: (data: IPathwayMapperTable[], selectedPathway: string, onPathwaySelect: (pathway: string) => void) => JSX.Element;\n validGenes?: any;\n toast: any;\n showMessage: (message: string) => void;\n //PatientView variable\n patientView ?: boolean;\n messageBanner? : () => JSX.Element;\n}\n\nexport interface ICBioData{\n altered: number;\n gene: string;\n percentAltered: string​;\n sequenced: number;\n geneticTrackData?: any[]; // TODO GeneticTrackDatum[]: this is currently a private type within cbioportal repo\n geneticTrackRuleSetParams?: IGeneticAlterationRuleSetParams;\n}\n\nexport interface ISampleIconData {\n sampleIndex: { [s: string]: number },\n sampleColors: { [s: string]: string }\n}\n\n/**\n * Maps integer values to color code strings\n */\nexport interface IColorValueMap {\n [value: string]: string\n}\n\nexport enum EModalType{\n STUDY,\n CONFIRMATION,\n PROFILES,\n ABOUT,\n PW_DETAILS,\n GRID,\n HELP,\n LAYOUT,\n CHELP,\n PROFILES_COLOR_SCHEME\n}\n\nexport interface IPathwayData{\n title: string;\n description: string;\n nodes: any[];\n edges: any[];\n}\n\nexport interface IAlterationData{\n [key: string]: {[key: string]: number};\n}\n\nexport interface IProfileMetaData{\n profileId: string;\n studyId?: string;\n enabled: boolean;\n}\n\nexport interface IDataTypeMetaData{\n enabled: boolean;\n checked: boolean;\n profile: string;\n}\n\nexport interface IPathwayMapperTable{\n name: string;\n score: number;\n genes: string[];\n}\n\n@observer\nexport class PathwayMapper extends React.Component {\n static readonly CBIO_PROFILE_NAME = \"cBioPortal_data\";\n\n\n readonly MAX_ALLOWED_PROFILES_ENABLED = 6;\n \n @observable\n selectedPathway: string;\n\n fileManager: FileOperationsManager;\n\n @observable\n editor: EditorActionsManager;\n\n pathwayActions: PathwayActions;\n\n @observable\n isModalShown: boolean[];\n\n @observable\n colorValueMap: IColorValueMap;\n\n portalAccessor: CBioPortalAccessor;\n\n @observable\n alterationData: IAlterationData;\n\n @observable\n patientData: any [][] = [];\n\n @observable\n pathwayGeneMap: {[key: string]: {[key: string]: string}} = {};\n\n bestPathwaysAlgos: any[][] = [];\n\n @observable\n oldName = \"\";\n \n @observable\n profiles: IProfileMetaData[] = [];\n\n setActiveEdge: (edgeId: number) => void;\n viewOperationsManager: ViewOperationsManager;\n gridOptionsManager: GridOptionsManager;\n\n\n\n constructor(props: IPathwayMapperProps){\n super(props);\n makeObservable(this);\n \n this.fileManager = new FileOperationsManager();\n this.pathwayActions = new PathwayActions(this.pathwayHandler, this.profiles, this.fileManager, \n this.handleOpen, this.props.isCBioPortal, this.props.isCollaborative);\n this.selectedPathway = \"\";\n if(this.props.pathwayName){\n this.pathwayActions.changePathway(this.props.pathwayName);\n }\n this.isModalShown = [false, false, false, false, false, false, false, false, false, false];\n // TODO: Change below\n this.alterationData = {}; //{\"study1_gistic\" : {\"CDK4\": 11, \"MDM2\": 19, \"TP53\": 29}, \"study2_gistic\" : {\"MDM2\": 99, \"TP53\": 98}, \"study3_mutations\": {\"MDM2\": 1, \"TP53\": 2}};\n this.extractAllGenes();\n\n this.colorValueMap = {\n '-100' : \"#0000ff\",\n '0' : \"#ffffff\",\n '100' : \"#ff0000\"\n }\n\n if(this.props.isCBioPortal){\n //this.overlayPortalData();\n \n // If cBioPortal mode is 'on' it is very likely to have cBioALterationData\n // but to be on the safe side below assertion is made.\n if(this.props.cBioAlterationData ){\n if( this.props.patientView){\n //PatientView PathwayMapper has a different functionality\n //Alteration types are overlayed instead of alterationpercentage\n this.calculatePatientData(this.props.cBioAlterationData);\n this.addSampleIconData(this.props.sampleIconData);\n }\n else{\n this.calculateAlterationData(this.props.cBioAlterationData);\n\n }\n }\n\n if(this.props.addGenomicDataHandler){\n this.props.addGenomicDataHandler(this.addGenomicData);\n }\n\n this.profiles.push({profileId: PathwayMapper.CBIO_PROFILE_NAME, enabled: true});\n this.getBestPathway(0);\n this.getBestPathway(1);\n this.getBestPathway(2);\n this.getBestPathway(3);\n }\n /*\n const profile1 = {profileId: \"study1_gistic\", studyId: \"study1\", enabled: true};\n const profile2 = {profileId: \"study2_gistic\", studyId: \"study2\", enabled: true};\n const profile3 = {profileId: \"study3_mutations\", studyId: \"study3\", enabled: true};\n const profile4 = {profileId: \"study3_mutations\", studyId: \"study3\", enabled: true};\n const profile5 = {profileId: \"study3_mutations\", studyId: \"study3\", enabled: true};\n const profile6 = {profileId: \"study3_mutations\", studyId: \"study3\", enabled: true};\n this.profiles.push(profile1, profile2, profile3, profile4, profile5, profile6);\n */\n\n }\n\n @action.bound\n setColorMapping(colorValueMap: IColorValueMap) {\n this.colorValueMap = colorValueMap;\n this.editor.updateGenomicDataColorScheme(this.colorValueMap);\n }\n\n @action\n setSelectedPathway(pathway: string) {\n this.selectedPathway = pathway;\n }\n\n @action\n setEditor(editor: EditorActionsManager) {\n this.editor = editor;\n }\n\n @action\n addProfile(profile: IProfileMetaData) {\n this.profiles.push(profile);\n }\n\n @action\n toggleProfileEnabled(index: number) {\n this.profiles[index].enabled = !this.profiles[index].enabled;\n }\n\n calculateAlterationData(cBioAlterationData: ICBioData[]){\n // Transform cBioDataAlteration into AlterationData\n this.alterationData[PathwayMapper.CBIO_PROFILE_NAME] = {};\n cBioAlterationData.forEach((geneAltData: ICBioData) => {\n const perc = (geneAltData.altered / geneAltData.sequenced) * 100;\n \n // NaN value is replaced with -101 since NaN value leads to some runtime exceptions (such as with toFixed() function),\n // hence it is represented as -101. It will be recognized in the genomic data svg creation to show N/P instead of\n // a percentage. -101 is chosen because this percentage is impossible to get.\n this.alterationData[PathwayMapper.CBIO_PROFILE_NAME][geneAltData.gene] = ((Object.is(perc, NaN) ? -101 : perc));\n \n\n });\n }\n \n calculatePatientData(cBioAlterationData: ICBioData[]){\n // Transform cBioDataAlteration into Patient Data every alteration is accepted 100% altered\n\n this.alterationData[PathwayMapper.CBIO_PROFILE_NAME] = {};\n \n const allTypes = cBioAlterationData.map(x => x.gene); \n //const allTypes = cBioAlterationData.map(x => x.percentAltered);\n const uniqueTypes = allTypes.filter((x, i, a) => a.indexOf(x) == i)\n //This is a flag for GenomicDataOverlayManager showPatientData\n this.patientData[\"PatientView\"] = 1;\n\n uniqueTypes.forEach(x => {\n this.patientData[x]= {};\n });\n\n cBioAlterationData.forEach((geneAltData: ICBioData) => {\n const perc = (geneAltData.altered / geneAltData.sequenced) * 100;\n\n this.alterationData[PathwayMapper.CBIO_PROFILE_NAME][geneAltData.gene] = ((Object.is(perc, NaN) ? -101 : perc));\n\n this.patientData[geneAltData.gene][geneAltData.percentAltered] = ((Object.is(perc, NaN) ? -101 : perc));\n this.patientData[geneAltData.gene][\"geneticTrackData\"] = geneAltData.geneticTrackData;\n this.patientData[geneAltData.gene][\"geneticTrackRuleSetParams\"] = geneAltData.geneticTrackRuleSetParams;\n });\n\n }\n\n addSampleIconData(sampleIconData: any) {\n if (sampleIconData) {\n this.patientData[\"sampleColors\"] = sampleIconData.sampleColors;\n this.patientData[\"sampleIndex\"] = sampleIconData.sampleIndex;\n }\n }\n\n getGeneStudyMap(studyGeneMap: any){\n \n const genomicDataMap: any = {};\n for (const cancerStudy of Object.keys(studyGeneMap)) {\n\n const cancerData = studyGeneMap[cancerStudy];\n\n for (const geneSymbol of Object.keys(cancerData)) {\n if (genomicDataMap[geneSymbol] === undefined) genomicDataMap[geneSymbol] = {};\n\n genomicDataMap[geneSymbol][cancerStudy] = studyGeneMap[cancerStudy][geneSymbol].toFixed(2);\n }\n }\n return genomicDataMap;\n }\n\n getAlterationAveragePerGene(genomicDataMap: any){\n\n const geneAlterationMap: any = {};\n for(const gene of Object.keys(genomicDataMap)){\n let sum = 0, count = 0;\n\n for(const alteration of Object.values(genomicDataMap[gene])){\n sum += parseFloat(alteration as string);\n count++;\n }\n if(count === 0){\n geneAlterationMap[gene] = 0;\n } else {\n geneAlterationMap[gene] = sum / count;\n }\n }\n\n return geneAlterationMap;\n }\n\n\n /**\n * \n * @param rankingMode: number => 0 = Count, 1 = Percentage, 2 = Count with Alteration, 3 = Percentage with Alteration\n * \n */\n getBestPathway(rankingMode: number) {\n \n const genomicDataMap = this.getGeneStudyMap(this.alterationData);\n const alterationPerGene = this.getAlterationAveragePerGene(genomicDataMap);\n maxHeap = maxHeapFn();\n\n const matchedGenesMap: any = {};\n const bestPathways: any[] = [];\n for(const pathwayName in this.pathwayGeneMap){\n if(this.pathwayGeneMap.hasOwnProperty(pathwayName)){\n \n const genesMatching = [];\n // Calculate sum of all alterations\n let sumOfAlterations = 0;\n for(const gene of this.props.genes){\n \n if(this.pathwayGeneMap[pathwayName].hasOwnProperty(gene.hugoGeneSymbol) \n && this.pathwayGeneMap[pathwayName][gene.hugoGeneSymbol] === \"GENE\"){\n genesMatching.push(gene.hugoGeneSymbol);\n sumOfAlterations += alterationPerGene[gene.hugoGeneSymbol];\n }\n }\n matchedGenesMap[pathwayName] = genesMatching;\n let geneCount = 0;\n // Count number of genes *not processess* in a pathway\n for(const geneType of Object.values(this.pathwayGeneMap[pathwayName])){\n if(geneType === \"GENE\"){\n geneCount++;\n }\n }\n\n if(rankingMode === 0){\n maxHeap.insert(genesMatching.length, {pathwayName: pathwayName});\n } else if(rankingMode === 1){\n maxHeap.insert(genesMatching.length / geneCount * 100, {pathwayName: pathwayName}); \n } else if(rankingMode === 2){\n maxHeap.insert(sumOfAlterations, {pathwayName: pathwayName}); \n } else if(rankingMode === 3){\n maxHeap.insert(genesMatching.length * sumOfAlterations / geneCount, {pathwayName: pathwayName});\n }\n\n }\n }\n while(maxHeap.size() > 0){\n const top = maxHeap.extractMax();\n const pathwayName = top.getValue().pathwayName;\n bestPathways.push({score: top.getKey(), genesMatched: matchedGenesMap[pathwayName], pathwayName: pathwayName});\n }\n if(this.bestPathwaysAlgos.length === 0) // First pathway of the first method is shown as the default pathway.\n this.setSelectedPathway(bestPathways[0].pathwayName);\n this.bestPathwaysAlgos.push(bestPathways);\n }\n \n // This method extracts all genes of a pathway and adds it to the pathwayGeneMap\n // so that it can be used by percentage calculation and genomic data \n // Note: Pathway title\n @autobind\n includePathway(pathwayData?: IPathwayData, pathwayName?: string){\n const genes = pathwayData.nodes;\n const geneHash: any = {};\n\n for(const gene of genes){\n\n if(gene.data.type === \"GENE\")\n geneHash[gene.data.name] = gene.data.type;\n }\n\n this.pathwayGeneMap[pathwayData.title] = geneHash;\n\n }\n\n extractAllGenes(){\n for(const pathwayName in pathways){\n if(pathways.hasOwnProperty(pathwayName)){\n\n const pathwayData: IPathwayData = SaveLoadUtility.parseGraph(pathways[pathwayName], true);\n this.includePathway(pathwayData);\n }\n }\n \n }\n\n\n loadRedirectedPortalData(){\n\n if(!this.props.alterationData){ // If size 0 that means it is not redirected.\n return;\n }\n \n const redirectedProfiles = Object.keys(this.props.alterationData).map((data: string) : IProfileMetaData => ({profileId: data, enabled: true}));\n redirectedProfiles.forEach((redirectedProfile) => {\n this.addProfile(redirectedProfile);\n });\n this.editor.addPortalGenomicData(this.props.alterationData, this.editor.getEmptyGroupID());\n }\n\n exists(profileId: string){\n\n let exists = false;\n this.profiles.forEach((profile: IProfileMetaData) => {\n if(profile.profileId === profileId){\n exists = true;\n }\n });\n\n return exists;\n }\n\n @autobind\n loadFromCBio(dataTypes: {[dataType: string]: IDataTypeMetaData}, studyData: any[]){\n if(!this.pathwayActions.doesCyHaveElements()){\n toast.warn('Your pathway is empty!');\n return;\n }\n\n for (const metadata of Object.values(dataTypes))\n {\n if(!metadata.checked) {\n continue;\n } \n if(this.exists(metadata.profile)){\n toast.warn(metadata.profile + \" already exists.\");\n continue;\n }\n\n const studyId = studyData[0];\n const profileId = metadata.profile;\n\n const enableNewProfile = this.profiles.length < this.MAX_ALLOWED_PROFILES_ENABLED;\n\n const newProfile = {\n studyId: studyId,\n profileId: profileId,\n enabled: enableNewProfile\n }\n\n this.addProfile(newProfile);\n\n const genes = this.editor.cy.nodes()\n .filter(node => node.data(\"type\") === \"GENE\")\n .map(node => node.data(\"name\"));\n\n \n this.portalAccessor.getProfileData({\n caseSetId: studyId,\n geneticProfileId: profileId,\n genes: genes\n },\n (data: any) => {\n this.editor.addPortalGenomicData(data, this.editor.getEmptyGroupID());\n let visibilityObject = {};\n visibilityObject[newProfile.profileId] = newProfile.enabled;\n this.editor.updateGenomicDataVisibility(visibilityObject);\n });\n \n }\n }\n\n @autobind\n setActiveEdgeHandler(setActiveEdge: (edgeId: number) => void){\n this.setActiveEdge = setActiveEdge;\n }\n\n @autobind\n colorSchemeChangeCallback(colorScheme: IColorValueMap) {\n this.colorValueMap = colorScheme;\n }\n\n @autobind\n addGenomicData(cBioAlterationData: ICBioData[]){\n\n this.calculateAlterationData(cBioAlterationData);\n this.editor.removeGenomicData();\n this.editor.addPortalGenomicData(this.alterationData, this.editor.getEmptyGroupID());\n }\n\n @autobind\n emphasizeQueryGenes() {\n this.pathwayActions.emphasizeQueryGenes(this.props.genes.map((gene: any) => gene.hugoGeneSymbol));\n }\n\n render() {\n const isCBioPortal = this.props.isCBioPortal; \n\n const cytoComp = ;\n\n return (\n\n
\n
\n {!isCBioPortal && \n \n
\n \n
\n
\n \n
\n
\n }\n { isCBioPortal &&\n \n \n \n \n {this.props.messageBanner ?\n {this.props.messageBanner()}\n :\n \n }\n \n {this.selectedPathway}\n \n \n }\n \n
\n {\n (!isCBioPortal && \n
\n \n
)\n }\n\n { isCBioPortal ?\n (\n {cytoComp}\n
Powered by PathwayMapper
\n )\n : (cytoComp)\n }\n {\n (isCBioPortal &&\n \n \n )\n }\n
\n\n {/* isCBioPortal &&\n \n Powered by PathwayMapper\n */\n }\n\n { (
\n\n {\n (
\n \n \n \n \n \n \n \n \n \n \n
)\n }\n { !this.props.isCBioPortal &&\n \n \n \n \n }\n \n\n {this.pathwayActions.setUploaders(ref, false);}}\n style={{display: 'none'}}\n onChange={(e) => {this.pathwayActions.onChangeFile(e, false);}}\n />\n {this.pathwayActions.setUploaders(ref, true);}}\n style={{display: 'none'}}\n onChange={(e) => {this.pathwayActions.onChangeFile(e, true);}}\n />\n {this.pathwayActions.setOverlayUploader(ref);}}\n style={{display: 'none'}}\n onChange={(e) => {this.pathwayActions.overlayFromText(e.target.files[0]);}}\n />\n
)\n }\n
\n
\n );\n }\n\n componentDidMount(){\n if(!this.props.isCBioPortal){\n $(\".container\").css('width', \"auto\");\n $(\".container\").css('paddingLeft', 0);\n $(\".container\").css('marginLeft', 5);\n } else {\n this.pathwayActions.emphasizeQueryGenes(this.props.genes.map((gene: any) => gene.hugoGeneSymbol));\n }\n }\n\n componentDidUpdate(){\n if(this.props.isCBioPortal){\n this.pathwayActions.emphasizeQueryGenes(this.props.genes.map((gene: any) => gene.hugoGeneSymbol));\n }\n }\n\n @action.bound\n handleOpen(modalId: EModalType){\n this.isModalShown[modalId] = true;\n }\n\n\n @action.bound\n handleClose(modalId: EModalType){\n this.isModalShown[modalId] = false;\n }\n\n @autobind\n editorHandler(editor, eh, undoRedoManager){\n\n this.setEditor(editor);\n this.gridOptionsManager = new GridOptionsManager(this.editor.cy);\n this.viewOperationsManager = new ViewOperationsManager(this.editor, this.editor.cy);\n this.pathwayActions.editorHandler(editor, eh, undoRedoManager, this.viewOperationsManager, this.gridOptionsManager);\n \n if(this.props.isCBioPortal){\n if(this.props.patientView){\n this.editor.addPortalGenomicData(this.patientData, this.editor.getEmptyGroupID());\n }\n else{\n this.editor.addPortalGenomicData(this.alterationData, this.editor.getEmptyGroupID());\n }\n } else {\n this.portalAccessor = new CBioPortalAccessor();\n this.loadRedirectedPortalData();\n }\n\n }\n\n @autobind\n pathwayHandler(pathway: string){\n this.setSelectedPathway(pathway);\n if(this.pathwayGeneMap[pathway] && this.props.changePathwayHandler)\n this.props.changePathwayHandler(\n Object.keys(this.pathwayGeneMap[pathway])\n .filter(gene => (!this.alterationData[PathwayMapper.CBIO_PROFILE_NAME].hasOwnProperty(gene)))\n );\n }\n}\n\nexport default PathwayMapper;","import React from 'react';\nimport { MenuItem, Nav, Navbar, NavDropdown } from 'react-bootstrap';\nimport pathways from \"../data/pathways.json\";\nimport ConfirmationModal from '../modals/ConfirmationModal';\nimport PathwayActions from '../utils/PathwayActions';\nimport { EModalType } from './react-pathway-mapper';\n\ninterface IMenubarProps{\n pathwayActions: PathwayActions;\n handleOpen: (modalId: EModalType) => void;\n setActiveEdge: Function;\n}\n\n\nexport default class Menubar extends React.Component{\n\n\n constructor(props: IMenubarProps){\n super(props);\n }\n\n render(){\n const nodeTypes = [\"Gene\", \"Family\", \"Complex\", \"Compartment\", \"Process\"];\n const edgeTypes = [\"Activates\", \"Inhibits\", \"Induces\", \"Represses\", \"Binds\"];\n\n const pathwayDropdownData: {[pwHead: string]: string[]} = {};\n for(const pwName of Object.keys(pathways)){\n // If a pathway name ain't include 'pathway' word then it is under pancanatlas.\n const isPancanatlas = !pwName.includes('pathway');\n const dashPos = pwName.indexOf('-');\n const pwHead = (isPancanatlas) ? 'PanCanAtlas' : pwName.substring(0, dashPos);\n if(pwHead in pathwayDropdownData){\n pathwayDropdownData[pwHead].push(pwName);\n } else {\n pathwayDropdownData[pwHead] = [pwName];\n }\n }\n\n return(\n \n \n \n \n );\n }\n}","import { action, makeObservable, observable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React from \"react\";\nimport { Button, Panel } from \"react-bootstrap\";\nimport \"../css/supp.css\";\n// @ts-ignore\nimport acImg from \"../images/edges/activates.svg\";\n// @ts-ignore\nimport bindImg from \"../images/edges/binds.svg\";\n// @ts-ignore\nimport indImg from \"../images/edges/induces.svg\";\n// @ts-ignore\nimport inhImg from \"../images/edges/inhibits.svg\";\n// @ts-ignore\nimport repImg from \"../images/edges/represses.svg\";\nimport PathwayActions from \"../utils/PathwayActions\";\nimport { EModalType } from \"./react-pathway-mapper\";\n\n\n\ninterface ISideBarProps{\n pathwayActions: PathwayActions;\n setActiveEdgeHandler: Function;\n handleOpen: Function;\n}\n\n@observer\nexport default class Sidebar extends React.Component{\n\n @observable\n activeEdge: number = -1;\n\n constructor(props: ISideBarProps){\n super(props);\n makeObservable(this);\n props.setActiveEdgeHandler(this.setActiveEdge);\n }\n\n addEdge(edgeIndex: number){\n if(edgeIndex === this.activeEdge){\n this.setActiveEdge(-1);\n this.props.pathwayActions.addEdge(-1);\n return;\n }\n this.setActiveEdge(edgeIndex);\n this.props.pathwayActions.addEdge(edgeIndex);\n }\n\n @action.bound\n setActiveEdge(edgeIndex: number){\n this.activeEdge = edgeIndex;\n }\n\n render(){\n\n const edgeTypes = [\"Activates\", \"Inhibits\", \"Induces\", \"Represses\", \"Binds\"];\n\n const edgeImgs = [acImg, inhImg, indImg, repImg, bindImg];\n\n const nodeIds = [\"simpleNodeDiv\", \"familyNodeDiv\", \"complexNodeDiv\", \"compartmentNodeDiv\", \"processNodeDiv\"];\n\n return(\n
\n \n \n Network\n \n \n \n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n\n \n \n Node Palette\n \n \n \n {\n nodeIds.map((id) => {\n return (\n
\n
);\n })\n }\n
\n
\n\n \n \n Interaction Palette\n \n \n
\n {\n edgeTypes.map((edgeType: string, i: number) => {\n return ();\n })\n }\n
\n
\n
\n
\n );\n }\n}"],"sourceRoot":""} \ No newline at end of file diff --git a/packages/pathway-mapper/dist/utils/PathwayActions.d.ts b/packages/pathway-mapper/dist/utils/PathwayActions.d.ts index 84498f66..2aae40f9 100644 --- a/packages/pathway-mapper/dist/utils/PathwayActions.d.ts +++ b/packages/pathway-mapper/dist/utils/PathwayActions.d.ts @@ -64,6 +64,7 @@ export default class PathwayActions { processFile(file: File, isMerge: boolean): void; saveAs(type: string): void; editorHandler(editor: any, eh: any, undoRedoManager: any, viewOperationsManager: ViewOperationsManager, gridOptionsManager: GridOptionsManager): void; + exists(profileId: string): boolean; loadSampleData(): void; performLayout(): void; } diff --git a/packages/pathway-mapper/src/managers/EditorActionsManager.tsx b/packages/pathway-mapper/src/managers/EditorActionsManager.tsx index 2f13c614..cedaa05b 100644 --- a/packages/pathway-mapper/src/managers/EditorActionsManager.tsx +++ b/packages/pathway-mapper/src/managers/EditorActionsManager.tsx @@ -216,8 +216,6 @@ export default class EditorActionsManager{ { args.ele.data('w', args.newWidth); args.ele.data('h', args.newHeight); - args.ele.style('width', args.newWidth); - args.ele.style('height', args.newHeight); return args; }; @@ -226,9 +224,6 @@ export default class EditorActionsManager{ { args.ele.data('w', args.oldWidth); args.ele.data('h', args.oldHeight); - args.ele.style('width', args.oldWidth); - args.ele.style('height', args.oldHeight); - return args; }; @@ -955,9 +950,6 @@ export default class EditorActionsManager{ //his.cy.add(newNode); this.cy.nodes().updateCompoundBounds(); this.undoRedoManager.do("add", newNode); - //Width was not properly updated only by changing data property - var thatEle = this.cy.getElementById(nodeData.id); - thatEle.style('width', thatEle.data('w')); }; shareDBNodeAddRemoveEventCallBack(op: any) @@ -1767,6 +1759,17 @@ export default class EditorActionsManager{ this.shareDBManager.addGenomicData(parsedGenomicData.genomicDataMap); this.shareDBManager.groupGenomicData(Object.keys(parsedGenomicData.visibilityMap), groupID); + + let currentVisibleGenomicDataCount = this.genomicDataOverlayManager.countVisibleGenomicDataByType(); + Object.keys(parsedGenomicData.visibilityMap).forEach(study => { + if (parsedGenomicData.visibilityMap[study] && (currentVisibleGenomicDataCount >= 6)) { + parsedGenomicData.visibilityMap[study] = false; + } + else if(parsedGenomicData.visibilityMap[study]) { + currentVisibleGenomicDataCount++; + } + }); + this.shareDBManager.addGenomicVisibilityData(parsedGenomicData.visibilityMap); } else diff --git a/packages/pathway-mapper/src/managers/GenomicDataOverlayManager.ts b/packages/pathway-mapper/src/managers/GenomicDataOverlayManager.ts index 55d456f8..09245d1a 100644 --- a/packages/pathway-mapper/src/managers/GenomicDataOverlayManager.ts +++ b/packages/pathway-mapper/src/managers/GenomicDataOverlayManager.ts @@ -199,6 +199,11 @@ export default class GenomicDataOverlayManager { }; hideGenomicData = function() { + + this.cy.nodes('[type="GENE"]').forEach(node => { + node.data('w', this.getRequiredWidthForGenomicData(0)); + }) + this.cy .style() .selector('node[type="GENE"]') @@ -528,7 +533,7 @@ export default class GenomicDataOverlayManager { this.cy.nodes('[type="GENE"]').forEach(node => { node.data('w', this.getRequiredWidthForGenomicData(genomicDataBoxCount)); - }) + }); this.cy .style() @@ -568,8 +573,9 @@ export default class GenomicDataOverlayManager { // Parse cancer types for (let i = 1; i < metaLineColumns.length; i++) { cancerTypes.push(metaLineColumns[i]); + const visibleGenomicDataCount = Object.keys(this.visibleGenomicDataMapByType).length; // Update initially visible genomic data boxes ! - if (i - 1 < this.DEFAULT_VISIBLE_GENOMIC_DATA_COUNT) { + if (visibleGenomicDataCount < this.DEFAULT_VISIBLE_GENOMIC_DATA_COUNT) { this.visibleGenomicDataMapByType[cancerTypes[i - 1]] = true; } else { this.visibleGenomicDataMapByType[cancerTypes[i - 1]] = false; diff --git a/packages/pathway-mapper/src/managers/ShareDBManager.tsx b/packages/pathway-mapper/src/managers/ShareDBManager.tsx index 8e237403..003244b0 100644 --- a/packages/pathway-mapper/src/managers/ShareDBManager.tsx +++ b/packages/pathway-mapper/src/managers/ShareDBManager.tsx @@ -53,7 +53,7 @@ export default class ShareDBManager { var genomicDataGroupCount = this.doc.data[this.GENOMIC_DATA_GROUP_COUNT]; //Reset all genomic maps for (const key of Object.keys(genomicMap)) { - ops.push({p: [this.GENOMIC_DATA_GROUP_NAME, key], od: genomicMap[key]}); + ops.push({p: [this.GENOMIC_DATA_MAP_NAME, key], od: genomicMap[key]}); } for (const key of Object.keys(visMap)) { ops.push({p: [this.VISIBLE_GENOMIC_DATA_MAP_NAME, key], od: visMap[key]}); @@ -415,6 +415,7 @@ export default class ShareDBManager { this.editor.genomicDataOverlayManager.showGenomicData(); this.editor.genomicDataOverlayManager.notifyObservers(); + this.editor.cy.style().update(); this.editor.cy.fit(50); }; diff --git a/packages/pathway-mapper/src/ui/CytoscapeArea.tsx b/packages/pathway-mapper/src/ui/CytoscapeArea.tsx index 1ab0ee38..0374d817 100644 --- a/packages/pathway-mapper/src/ui/CytoscapeArea.tsx +++ b/packages/pathway-mapper/src/ui/CytoscapeArea.tsx @@ -485,10 +485,10 @@ export default class CytoscapeArea extends React.Component { //Updates 'data' properties from 'style' diff --git a/packages/pathway-mapper/src/utils/PathwayActions.ts b/packages/pathway-mapper/src/utils/PathwayActions.ts index dc15cdfd..f7c562ab 100644 --- a/packages/pathway-mapper/src/utils/PathwayActions.ts +++ b/packages/pathway-mapper/src/utils/PathwayActions.ts @@ -418,24 +418,45 @@ export default class PathwayActions { this.gridOptionsManager = gridOptionsManager; } + @autobind + exists(profileId: string){ + + let exists = false; + this.profiles.forEach((profile: IProfileMetaData) => { + if(profile.profileId === profileId){ + exists = true; + } + }); + + return exists; + } + @autobind loadSampleData() { const data = - "gene\tlung\tovarian\tbreast\ty\n" + - "PTEN\t-7\t-20\t10\t20\n" + - "NF1\t-12\t-4\t30\t20\n" + - "PIK3CA\t18\t40\t-50\t20\n" + - "KRAS\t11\t-5\t0\t20\n" + - "ZIYA\t0\t-2\t0\t20\n" + - "AKT1\t3\t30\t-10\t20\n" + - "AKT2\t6\t-3\t20\t20\n" + - "AKT3\t6\t-3\t20\t20\n" + + "gene\tlung\tovarian\tbreast\n" + + "PTEN\t-7\t-20\t10\n" + + "NF1\t-12\t-4\t30\n" + + "PIK3CA\t18\t40\t-50\n" + + "KRAS\t11\t-5\t0\n" + + "ZIYA\t0\t-2\t0\n" + + "AKT1\t3\t30\t-10\n" + + "AKT2\t6\t-3\t20\n" + + "AKT3\t6\t-3\t20\n" + "\n"; + + if (this.exists("lung") || this.exists("ovarian") || this.exists("breast")) { + return; + } + this.editor.addGenomicData(data); - this.addProfile({ profileId: "lung", enabled: true }); - this.addProfile({ profileId: "ovarian", enabled: true }); - this.addProfile({ profileId: "breast", enabled: true }); + if (!this.isCollaborative) { + this.addProfile({ profileId: "lung", enabled: this.profiles.length < 6 ? true : false }); + this.addProfile({ profileId: "ovarian", enabled: this.profiles.length < 6 ? true : false }); + this.addProfile({ profileId: "breast", enabled: this.profiles.length < 6 ? true : false }); + } + } @autobind