diff options
Diffstat (limited to 'browser/base/content/newtab')
19 files changed, 0 insertions, 6694 deletions
diff --git a/browser/base/content/newtab/alternativeDefaultSites.json b/browser/base/content/newtab/alternativeDefaultSites.json deleted file mode 100644 index 018d3edcc..000000000 --- a/browser/base/content/newtab/alternativeDefaultSites.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "directory": [ - { - "bgColor": "#ffffff", - "directoryId": 10000000, - "imageURI": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAIX0lEQVR4nO1afXDbZh1+sxbWsbGvsrLbuBt36766sR3sOEgiuU4kx2vTpFGKm0SKsyyOlI8laUZTulLojQEHx4CyAaNnt72yrivklo1YSpxcW7YVbKXHgCvduCvroDt6o6OtLSWN1MRWX/5I4imyJMu2bPNHnrvfSZbf6P09z+/jfV+3ACxhCUsoAEouNWGlMRLri5GuZwUSe1Ug8bcFEjsjUPgHAoX/UyCxkyKJjQoU/iOhCd8WJSvW/8vpXFFsx7PGeaJsVaytul+g8KMiic+IFA7NTNB/rggk/jeRcu26RGFris3JEqIUtkFsdo2KFK6kI52pCSR2UmirZgY9YFmxeaYg1uyqFSj8lMXI5mofRb3rOwEAJcXmDS72ex8QvO43skjv3MeT2DtRX2150cgLzVUDIonF8xBh64KQ2FWRwncPejyFK4tYq/Nmoa1mPE/pnZ1ILe4TFxpdd+SdvOhxrhabXaeLTVjfsHfzSj5K4V8QKfyjnGs3P2UiCt/v/1LeyAsNlXebkbeRSOZ/Q+JCrBH/Yt7IX+qlbhS96dM+Y+dJLC6S+BWRwmazFizf5AEAQPRtHLEhukqMwo8KTfg2oamy8t+e0uvUczwDwDWxhopHBBLvElrc+wUSm/r/IN9a3ZtrbYqUe9eHTc7PZDLvoAcsi/lq2wQSO1M88k93r7ayjzdI76sxEv/5hdryT+foRknM696q9qMg5AEAQHx83WhWtU5i56PtG1E7fYkO+B4SKNd7AoWLBSEv9G3Asol8zOs+ddFTeWc+fDrXgq2MNmEP5+PdKZB/XR4RvRnWe8tjJ8+1ECsL4mA+EQ+vcCg8gHHuPjjZvc5S6guU6/3/POG5rdi+24IEv+KwEgFQ4QFU/rAKTu90pal5fCY60PlQsf22BefHwfUKD2YVfl6ACIAKfx2UX0QNBYj6arqL7bdtSIQBnYy+2iIAzg49Cid9bm3qv11sn21FggeHUwSILGQCgIljd8Kpreq+4Koqts+2QuGBmBL9FLsFSj+sgAKFnyq2v7ZCDoO7dKOvvc7fS3vcW4rts61I8OBxXdI6/UCJADgVvmGVHfMSAelgfUA6VBeQDqmv2nuzZ3rf6Y2r3SM7DB1RwmCnOsLaiGuenbWD/JwAcqI+IEPCL8H6gAwX7omADIn5z/Wqe0Iz1sgI3edSv6EjcR78OEk4jQiJCNhnlwD1ATlBmDqdCUHzcYRf3mXoSCIMXjdK95SeEAbfslUAk4iaEc1EsLnx0vNmAhw3q3mNAFvtFCBd2i8i4bdWAgYCDBkLwIMJw8antTDos12ARSTNM8JK5Amd8URAPmosQAS8Zdr41N/lIQOS0Z2/pkZe0iWoS35+rIY8rPfLvzcWgAdDljMgAr5tlwCEWgArjUxnnJXSmX8eMnQkPrH8OasCJMJgfyEE0KZxMrJ+i2WgyZq6gHTQ0BGFv+abujs//ab4gV0CqEvAar1n0gQXizj9PUNHEmHgTSFt1At4O3eCH+8D0tW2YUmoMkKvfyQzwC/vMHREegN8Tpe4zjIY55fD14+X9tgiwC8mV2ZrHS/LGOGXRd3y8aeKVee/3GrqjBIGMcMsmL/GJu6AW4+1QZRl/mKHADmipD4gz1jJHCIgw9oXJ+8zfVsi/ImXU7bDquvfI2ugZ7wHoiwDUY6BTrbTWRie+ti0d7rGrHTU5UD45StpX5iILPMZrQTD4Q0QG+2GKMckzcF28AXgaYiv7ZNesdokCb90PO0LP2TBpxQezKpFkPmb4Q/ebFlEHOWYZBY8FtriKwDXFDAHhLvr/bJi9TzQtPeycQNUI3HihkML5M9NfB4+caRTl/jHRsvtb333gTzzTUHDPonNZFkkfjVl7Zfr+MRtiMID+McICqtDvfrE2cWfHRxz2j321K155pxE84HLLWb7BK0odX75TEYTBI43hB1ch0HE554h7GJhKrkn/4wPMjfliXMSO4alcsIvx/UanZE17pcGMppkU2iL2zDt9QSZtwqu66/Okdbb88Qd7PydVFYfkGVthLWHHk1JyOteuHRjxpNh3JNjRtE3EgDlGIiwzLlqrq/MbvKtLwkewi/PalPc8PyQPDdIP8lqQvdw92qEZWbNyBqJgnD0VTTI7H74Je/1uRL/8mDr7VWjfYeJkecgdfC/6c8JavPL0+6fitn3JtdIzxbdqLPqiNMmwtAxR7BzZ+mgL2MnHGzHPQhL/wzlmCsLc64PbYPU4Xd1zwN6WdCwT/p61uQXsH6sL5TS/dOUgY4QCZRlxsuD9EDZsM/x4KDnk5ppSsqGfHehw3QjytHfQVj6HaP+U8F1wZbhMf1Dkerzpr3Sn4Ad/5/Yc2T7TQ6OOW2YBWZimAsVRzlaRoL0DMLRV/WW19SVh05+v5nbAxsPCPpZ4Jclwj95b87kF+BgO+5Bg8yFFHKZZkO68XqimoyvGd0FqUNnU/pA1yvTdbaRXwDCtj2CsszFjFLfSjZoRbEiqEqoqtE+6H2VT5LfvPfydtvJJ0V4jb537QhzxjLRdMSsimIhq5q538DNgSnbfqs0FoHrusUd6j2ScdTNyGZTNovfHa8Z6/fmnbwaTq5r+1wj0ziZrjlmvIKYP3ew9Hvk+NOPFpT8AjxHd6ypGOl607Z+YDUL5s4iChpkdq8b7b22KOTVQIPtGxet3bmQtVA6eKhnyBP6hvnPW8UAwvpq1nIdoeS6bpWY0fK3aMfJTCMc/csqtuf+YvNMi68Mt38WDTJPoSx9DGHpmaxLI8hcqBzpCiDB9ibnM87lxeaVLUrKg+1fRVimby3LPItw9G9Rlj6Bssw/EI4+i3DM+0iQPomy9JiD69hdztI7SoPtTWWvddry7w5LWIIx/gdCuvcjoZqlLQAAAABJRU5ErkJggg==", - "type": "affiliate", - "title": "Google", - "url": "https://www.google.com/" - }, - { - "bgColor": "#E62117", - "directoryId": 10000001, - "imageURI": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACd0lEQVR4nO3av0tVYRzH8WOIBEVDUUIGCa32FwQ5OrS42NKeRUOTdGmoqUGiLVBqa5UG+7WUREGiEqhTDkVJEA2iYZBkxKvhHumo96o3uM9z0ucNZ7zn834+XO59znm+WZZIJBKJRCKRSGwCx3AWfbiIaxjEPYzgOd7gLWbwIb8WsFjjWrU9q3U+u1C4/0yeOZ47jOROg6jkrn25e3uji27NbzC9A9n/hWnVNbVut/hOTMZ1bSqT6Ky3+A58jOsXhE/o2Lj4FryILBaSF2gpFtAT2ygCPcUCHse2icDTtcW3YSW2TQRW0JahK7ZJRLoy9Ma2iEhvhoHYFhEZyDAU2yIiwxkeBgj6FSDjXxjN8CpA0A1cxucAWY0wkeFdgKBK/pe7H1fxNUDmTpjLMB8gqLJh631A9dF6IUD2Vsxn+BYgaF0BhSIO4WYgh1osZVgOEFSzgEIRh3EL3wO4FFnOAgVtWUChiKO4gx+BvJSqgEIRx3EXP5stVsoCCkWcxH1N3EeUuoBCEafwshlipS8AJzTxW1DaAnAEtzX5B7F0BeAgrmMphFhpClB9M3UFXwI5oQQFYB8u4H0gl3VE3QninOoxVyyWozwL4AxeB8jdjqWgT4M4jUcB8nbKfKj3AUN4gN8BshphLtQbobIyEeqdYFkZzTAc2yIiw+lcQDoZSmeDe/t0ON+gPIltE4Fnxa3pnp8QacFYbKOAjCnOCOUldKhOUO12Nk+JFUroxFRkwWYypd6cYKGEVvTbfZOil2w3KVqjjHZ047xqKRWbZ4XHVed2Z/2d5a0167vYgHC9z6/df9bWs8L9uXO3RmeFE4lEIpFIJPYKfwAcall+TY3q/wAAAABJRU5ErkJggg==", - "type": "affiliate", - "title": "YouTube", - "url": "https://www.youtube.com/" - }, - { - "directoryId": 10000002, - "imageURI": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACT0lEQVR4nO3bzWsTQRgG8PlPHMVLqRVMoQiFehJyUBAFtRCFHspExaaSoFg8CMGPSg+R3kQhh3osIbOlMVrbGKtrsbYESTbB0gqNVGu1WCkWutnXg+ihQjqxi7Oz8w481533+V32iyGEEEIZ76Rho0SZ4ewOG+D3UMatXSx9nPwqb5ySPZC0dPMzhDJelD6IrDCjQijjtvRBJIWGeY3IHkJ2EED2ALKDALIHkB2lAJoujkIwnoNQwoQL96aha3AKQgkTTtyZhKM383D4+gQEoll/AQRiWbg1XILZ+VWwaw6IrE3bgZbejNoAe8+PwEC6DOsbm0Klt679lxQGCESzMD335Z+KKw+wrzcDpcVvOyqvNMCwubjj8soCnBx44Up5ZQGeFZf1BWi7/BhqjthtzpcAseRsQwVrjgNzS9/hZWUFJq3Pf6U5MqoWQHJ8Qbh8aqoKB688cWVfzwBMvP0kVN6srMCec+7t6xmAmfmvQgCRBzOu7usZgHJ1TQjgyI283gCHrj3VG6C9bwwBEAABEEAtgAPRR9A3VKibpdUfQgD9KWvba529+8pbAMF4TqicW+th/r3eAP0pS2+Anvtv9AY4dvu53gCtMfGfI74DWN+wG5rNdwDl6preAGOFj3oDJMcXvAfQHMlAKGHWTeWD2KPw1aFC3et0NPi9wDPvAq/fif0LDMZzru6LALKLIwACIAACIAACIAACIAACIAACIAACIAACIMD/BvDKwUkZAJRx2zNHZyUBFAntTp+WXV4iQCf5c3yecUsXAMq49bv8Txsl6ZCTabOAAAAAAElFTkSuQmCC", - "title": "Facebook", - "type": "affiliate", - "url": "https://www.facebook.com/" - }, - { - "bgColor": "#ffffff", - "directoryId": 10000003, - "imageURI": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAA/CAYAAABQHc7KAAAEyUlEQVRoge2abYhVRRjHf7veVqSFhIQwa7E3ojXNpSiNgl0S+tAHKUjohbQohUgqKKwMSXpbsATdqOgFU4zKpAzMioploxI/WFBZmhRlL/S2lbpsudvd24dzjve5c58558ycey9B84MB95x5/vM/d+bMzDNHCAQCgUAgEAgE/rf0AOd6lJmKVrdDfI8SfxawIKNcEscfa8TOzBFrlj6Aimd5XnmAbx01TD5xiL3IiH3Y8zm4DXgaGALGMip/DDwHDACXKQ9wA/AiMJyi8T3wAnCvEr841t9tiR2JY/uB443YC4BHgA3ApyntTxD90FuAlaaBU4EfLIHvKIZtnAT8ZtE5O6fGCiNuFJiTM7YNWKe0PQScmRV8ncX4+zkbT1hq0bkyZ/wyI+5ux/bPM+I/ACbnCSyhv8tloMvBQAnYr+h8mDP+PRHzGXCMQ9sA14j4ceAMl+A70HtvjaMJ22jqy4i70Kh/sWO7AO+K+Jdcg6cCh6k3/gfQ6aBTAr5UdN7OiHtL1H3NxXhMN9Fkl2jM89BgPXrv3eKoc71Fx2ZqvqhTJv+kKRkQGjs94gE4PTZgGt9DNMvmpQR8pehst9R/Q9TZ5OG7EzgkNK720DjKNvTeu9RRZ4miMUH9bnCeuH8EOMXD881C40egw0PjKL3oP8Cbjjq2FWGrUW+HuDfg6XmP0NA2W060GYKy97odtbQVoQzMiu+fL66PACd4+O0VGqPANA+NOm5CHwVPOeqUgH2Kzub4/uvi2gOeXrcU8GdlCtG7ZBr/C5juqHWtojMOXCX+HgaO8/B5YqyV6GjZpjf3oI+C+x11JgF7FZ1/xL/v9PS4WmgMempYsW2MfsdtYwTRsqT9mBXgANGIc6WD2lG60EMjk0fRTS931GkHPrdo3ejpbZHQ2B+30XC6iNZm0/Q3RBOcC7Yc4WRPb0NC43ZPjVxsRDe+yFHHHLJJWevhabaIP0z0ujaNWdQmGUn5yEPrPkVnBPe1+0kRv97DhzPb0UdBr6OObZv9kIOGnJzLRPlL0+lFN+6yPe5BH0kV4E/yD+PlIm6bQ/uF2Um98Qlgbs74V5V4WVbl0GgDvsB/BBbiCnTj2lG5yVyqvX+QaOSYOsNk7y8WiPo+c1Ah2tFPesbJTmFfEfX7qU2BZVmRoSPnkMU+D1EUW5L0WErMHKq9P0o149NeqZ+w7wq7qO77f02p11Qmo6/laWnoVlFvnbh+uaJTAW616Dwo6rjmIw3lLnTjminZ+38DM8Q92yv1HfUnOh3AL/H9I7hnpA1lKrXnb0nRkqSXxf0nFC3bK7XMqCdT6o2NeIiirEE3Lvfks6kesI6hf1m2nTt8TW2uIeeLhub8vsxAT5IOUB2+8qTm2RStlYqOnOV7xLXBRj5EUWxJ0hKic/2k98dJ367azh32Es0Tz4hrTcn5fZE9I8s+ajc6m20CgrUWrdVEK0yFJub8RRhEN56UMjk+TVO7xtuK6yFMS1hIuuk82+SETSk6h3A/hmsJ7egfPypEh555ej/hHOzZYktyfl9keiqLzzc+LUlqWc7vSyfRJ3Rpegw4zUOrj/ofoKU5vy/91Jp+vIDWLkPL/J9h/0mmAT9TXa58vvIkzKe6ydpQ3FogEAgEAoFAIBCI+Rf5q90lTPZHIwAAAABJRU5ErkJggg==", - "title": "Wikipedia", - "type": "affiliate", - "url": "https://www.wikipedia.org/" - }, - { - "bgColor": "#400090", - "directoryId": 10000004, - "imageURI": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAD3ElEQVR4nO3bS4xecxjH8WmLBVVEx63JBIkEISkhJqURpAsZQioWqpeNSxraYlKpSwiDIRY0aSakqgS9qHRBIhKxYdFFFxWXIGkilYZEUCKj4zLzsfi/LN55zpiZc/lr+/6Ss3nfc57ze77n9r88/y7swxaswgLM7jpMhTlYiNWtnPd1Ga9RfIVtuB+L0J3b/FSFeejDQ9iBvRhrTzYCUKTv8RFewlrcgAtxQsYk5+Ii3IQHsBm78ONkk5oKgIn0Mz7BO3gBA7gHS3EtLsXZre1UnITj2pI5vvV7D85BL67DCvRjEJvwHj7HcBXGqwJwyKoDILeB3OoAyG0gt8oAGMYj0qdnJ17DY3i2vK1CPYmn8Cq2YwgP4rfpBix7BwwE3+aZ2F0ybqQPMSM439NlgpYFMILzAlO9glZXCf2F+cF5LsafZQJX8Q4oujKbK4j9j4aC+EdhT9nAVb0Ebw8MduNABbF/wMlB/LUVxK4MwE84JTC5uoLYK4O48/BrBbEr/Qy+XnCbfloi5h7MCuJurcSxagGMYWFg9qr/SbxQVTeEiq7Ym9OI9UYQ52ipJ1iZ6mgJ3h0Y7zG17usvOC2I01+12ToAHBCMIGHdFGKsCo4/QwJTqerqC2wMEjgGX0zi2KLH6JU6jNYFYBSXBElc/R/HjaE3OO4y1bYs/1WdvcFd4hbilgmOie6cGa1Ytaju7vDSIKHTxc9yUYtvWZ0G6wawH8cGSa0J9r0t2G92K0ZtamJA5PEgsfaOTNHjMlC3uSYADKMnSG6B9GIr6uqehYN1m2tqSGxre4KtJDdhfcF/O5ow1hSAMVweJNmNOcHvlbb3J1KTg6K7MTO62m3Jz1LBQMdk1fSo8IpJALizSUNNA/jWBNPvOFGahG1MOeYFnpgAwHNNm8kB4CDODJI/F380bSbXzNAzAYD1OYzkAjAYABjKYaQDIMdJxQDqnFMsVC4A6wIAgzmMdADkOKkYwKM5jOQCcFcAYCqjxpUpF4Bovu+IB3BfDiO5AIzrFWJlDiO5ACzpABgP4I4cRnIBWBwAWJLDSC4AfR0A4wHcksNILgCLAgB9OYzkAnDFkQ5gDZbj3ta2XCp5bVydYuncBnKrAyC3gdzqAMhtILfqBDCCb6SZ3velatGXsUFa5NC+vdjatrf2/QAfSyUyv9dlsgyAEXyGt/G8VBl+PS7A3PaGTllJCy7n40Zp8GQD3sWXSgCaDIBRqcBxGx7GYmll57hixlySaojPx83SuqW3pLXC0wKwX7oF+3GloILjUJE03X6NtAh8J76LAOzFRtwqKGY63CStX14mLen5+m9Vgqdbrd+9cgAAAABJRU5ErkJggg==", - "title": "Yahoo!", - "type": "affiliate", - "url": "https://www.yahoo.com/" - }, - { - "directoryId": 10000005, - "imageURI": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAJdklEQVR4nO1ba1QTZwL9iCY8hCDxDUpYOIUDBOVZAlJ5NQXRFlEQ8YGiRaqESlhxeRQ3FAWURRC6FYglqBHTEaI8Eg+CRMRatfKwLNL6oqer1h57XEWYbwJK9sdKixiSmRCCbrnn3D8w351770wy3zd8ADCJSUxiPMHhcPS3bdv2/tq1a9MWL16MODs7t5iamt4zMjLq0dfX76VSqU8sLCzueHt7S+3t7QtjYmLWJyYmzp1o32NGSUmJd0BAQLmRkVEPAEBOhCQS6bm3t7c0MjIyHACgMyEB1AGCILTY2NgUOzu7fwGCoUfj/Pnz/x0XF/fXgoICXW3nIYTs7Owlpqam94CGgo+ktbX1j4mJiY7azIQbMTExu3V0dF6AcQo/RF1dXYggSIj2kuFAfHx8Lhjn4ODVElCxWOygpXjKkZWVxQZaDD9EOp3eXV9fb6yVkKOho6Njgb6+fp8ig9pgfHx8gjZyjgYdX1/fhtHMqSKJRHpOJpNl6o4HAMidnJxatJJUEWpraz3xmBxOExOT30JDQ/+elpZmD14+26uqqubExcVFzJs3T53H5uCJEydMtZN4BKKiovKJmA0KChLu3bt3zmh6Bw4c0F+3bl0BEU0AgLygoCByXAKqgq2tbSdek0FBQTV4dZlM5kW8ugAAOZPJ/IeGIuHH9evXp+no6DzHa7K+vt4Lr3ZiYuIOvLoAALmnp6dQQ7HwIzc31xqvQRsbmy5AYC6fnJzsjlcbACD38/M7p5lUBBEeHp5lbm7+E4lEUnonREdHpxPRLSwsNFWmN5Kurq5XNZNITfj4+EwtLCw0dXFxcebz+UFhYWFbmExm6qZNm/IjIiKyampqDIjonTp1ajp4mwrQNP70BfD5/D9PAcXFxQZcLteOwWCw9u/f/3FwcHC6paVlOfg/K4CUlpbmEB0dvSEkJCTLxsamwtnZuXXmzJmPAACDgEBYRXxjC8jJyfFYtmzZYWNj48dgjCGV8Y0qICsryyQiIiKVTqf/BMYxNHgTC8jPz/+ISqU+AVoKDt6kAnbs2MGeMmXKANByePAmFBAbG5utyJi2OKEFJCcnx+MxqYizZs361d/fvyw9PX0bg8FgZWRk2FZVVc1pampaQERnwgoQi8VLVK0DRpJMJstWrlx5hMPhvMflckmKdN+amSDRdbuenl5fRkaGnyrdt6KAsrKyD4iYpFKpTy9cuPAuHu23ogAmk9lIxGRCQsLneLVLS0tnEdHWegFisXgu0b8ANTc3W+LVT0pKsiSirfUCDh06tJyIQSsrq5tE9PPy8jyI6Gu9gMDAQA5Bg9VE9Hfu3BlFRJ/BYHSMPRUBsNnsfUQMksnkciL6q1ev5hHRNzQ07AHa3D9A9N19QEAA7lfiAAAdOp3eTUQfACBHEMR87MlwgmgBZmZm9wHOK1RUVLSFiPYQd+/eHaOheKrB4XCyiBrk8XguqnTb29vNDAwMeolqAwDkCxcuvKbBiMoREhLyKVGDy5cvr1Cm2d3dPd3Ly+sCUd3h3LNnT7xGg46GoqKiQHUMbt68uZjL5VJG6qWkpPjS6fS76miO4Ivm5maVd9qYUV5ePlPdtb+FhUV3cHBwkbm5efrGjRvz7O3tr2og+O90dHRslUqlUxX5lkq5U7HmJEtUsnTxwG0kEJ7b4Cer32ArlXIVHq8ULBarVpPGNcng4GDP4V6xloxArNq3oq+M9hTlUeSvsfwvPxMuoKGhwWO8N0RRKBSM6Bg6nf4jgiC0zk6Egl3czsYQhxsKQ48g4QIAAMDf3//0eIWn0WiPjh075jx79uyHeMfY2dl1IAgyFwAAZA1rjqE8ihw9rPscrXRp7xO5lckaN6X0t+dt7m/LiYanPI+iPPLgmApoa2t75+W7fY2GX7RoUcvx48fpAAAgEom88NwJLBbr65ycnGlD3gZuli15VhfC6JZy9Ubzj1W6to6pAAAAEAgEDsbGxv/RVHh3d/ezEomEOvwcqamp6crGsNns/NHeLg0HPPOhV98Pf2ynQRHG+ZcFDKpdAAAAFBcX+6qzF3gkly5dqjCIVCrVs7e3v6RozKpVqw6q8idrybCFonfrUB5FDqsWfzv0c1jh2IHyKHIotL0J+lsyY7CqJXmyO4hamw/Ly8vnhIeH51Op1KdEQtNotN9WrFjxpVAodFOmv337dkMmk1k9NI5CoWCZmZk7EQSZouj4bilfT/ZtUjhW4yNCDxv0ozyKHJaZ9Mq+S1sDAACdnQgF8o1RlEeRy5picsDA3dPv9QnMHqI88iAUudYNdJV4q1NEXFyc7q5duzZ4eXmdtLKyukUikV6ZL1Cp1CeOjo6tHh4eRVwudwWfzx/1MzoSXC53alRUVCaLxapjs9kBio55fC3bGPvm0wRUQL/3yjc9n9Yz0HX090zolTSP//2OPIjdEVkDAAB42nmYJjsbWjo0CEMcfoCNkXvR5lh3BAlT2LQqhIWFTZFIJFSJRELdunUrWR0NVXhc/zdj9MxHa6B4qRAemfHasx6rYUnQjn8uGD5G9k3CHpRHkcvqQk+8Joh1lX2AHl9wf+RkAWtYvx9eSvaWSn2Iz5w0jId1O6fJLn8Wila6iVCe/oCiZ3sff8YT7CLnE6BgJQoRhxtoqcmz3l8vK9629+xW6Sx4dnUmLJv55DXxo3MeQ8ThDKxlfS77Pm8F1pxkqegkmsItSZxu75nAhf1NMZFY47ov4MlFzejLz69ClhrB/vObc3uuZM5QpIf9fM4K5VHk/W25sSpP3tdaaArPrBSgJbovlM6m+LQeWO13HqtwO4i1Zn0CRZ5+2Hf7bB5cK8a9P6hbytfDOgqsMJErC7vyWRw87VUERR5X0VJDiGc2h/IocljL+rr3Klfpv9pg9xttsLOrVIcfDtltEQOtcP0CFZg/wGvmjysyvQ8VmP8ChTa3McThBiZya8NEbm3YSUYXFNrcRgXmv8Ay2jOUp0tMd9gdidWHFsiuH2QQCqUOuFwuSXY5ZT1a6dyullkNEiKMLky6NaYTeX2JrRXILqcslIkDk2GFYyP6lSE27oGPzHiKVTiJZdV+qf2dh50mJPRo6Jby9bBLycvRSpcCeNLpe7SEovw7Aw+/MpDBUx5XsNqAbHgp2buzc4KutDp4dHGXEVq3xh02fbwFq2Htg5WuQljlcwFWLOqAJ97p7hOYPewTmD2EQuu76Emn67DauxmtdEawap8ceH5TNFofznxQs5XQBstJTGISk1AX/wUPVWOeSpK50AAAAABJRU5ErkJggg==", - "title": "Amazon", - "type": "affiliate", - "url": "https://www.amazon.com/" - } - ] -} diff --git a/browser/base/content/newtab/cells.js b/browser/base/content/newtab/cells.js deleted file mode 100644 index 47d4ef52d..000000000 --- a/browser/base/content/newtab/cells.js +++ /dev/null @@ -1,126 +0,0 @@ -#ifdef 0 -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ -#endif - -/** - * This class manages a cell's DOM node (not the actually cell content, a site). - * It's mostly read-only, i.e. all manipulation of both position and content - * aren't handled here. - */ -function Cell(aGrid, aNode) { - this._grid = aGrid; - this._node = aNode; - this._node._newtabCell = this; - - // Register drag-and-drop event handlers. - ["dragenter", "dragover", "dragexit", "drop"].forEach(function (aType) { - this._node.addEventListener(aType, this, false); - }, this); -} - -Cell.prototype = { - /** - * The grid. - */ - _grid: null, - - /** - * The cell's DOM node. - */ - get node() { return this._node; }, - - /** - * The cell's offset in the grid. - */ - get index() { - let index = this._grid.cells.indexOf(this); - - // Cache this value, overwrite the getter. - Object.defineProperty(this, "index", {value: index, enumerable: true}); - - return index; - }, - - /** - * The previous cell in the grid. - */ - get previousSibling() { - let prev = this.node.previousElementSibling; - prev = prev && prev._newtabCell; - - // Cache this value, overwrite the getter. - Object.defineProperty(this, "previousSibling", {value: prev, enumerable: true}); - - return prev; - }, - - /** - * The next cell in the grid. - */ - get nextSibling() { - let next = this.node.nextElementSibling; - next = next && next._newtabCell; - - // Cache this value, overwrite the getter. - Object.defineProperty(this, "nextSibling", {value: next, enumerable: true}); - - return next; - }, - - /** - * The site contained in the cell, if any. - */ - get site() { - let firstChild = this.node.firstElementChild; - return firstChild && firstChild._newtabSite; - }, - - /** - * Checks whether the cell contains a pinned site. - * @return Whether the cell contains a pinned site. - */ - containsPinnedSite: function Cell_containsPinnedSite() { - let site = this.site; - return site && site.isPinned(); - }, - - /** - * Checks whether the cell contains a site (is empty). - * @return Whether the cell is empty. - */ - isEmpty: function Cell_isEmpty() { - return !this.site; - }, - - /** - * Handles all cell events. - */ - handleEvent: function Cell_handleEvent(aEvent) { - // We're not responding to external drag/drop events - // when our parent window is in private browsing mode. - if (inPrivateBrowsingMode() && !gDrag.draggedSite) - return; - - if (aEvent.type != "dragexit" && !gDrag.isValid(aEvent)) - return; - - switch (aEvent.type) { - case "dragenter": - aEvent.preventDefault(); - gDrop.enter(this, aEvent); - break; - case "dragover": - aEvent.preventDefault(); - break; - case "dragexit": - gDrop.exit(this, aEvent); - break; - case "drop": - aEvent.preventDefault(); - gDrop.drop(this, aEvent); - break; - } - } -}; diff --git a/browser/base/content/newtab/customize.js b/browser/base/content/newtab/customize.js deleted file mode 100644 index 39724fa91..000000000 --- a/browser/base/content/newtab/customize.js +++ /dev/null @@ -1,124 +0,0 @@ -#ifdef 0 -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ -#endif - -var gCustomize = { - _nodeIDSuffixes: [ - "blank", - "button", - "classic", - "enhanced", - "panel", - "overlay", - "learn" - ], - - _nodes: {}, - - init: function() { - for (let idSuffix of this._nodeIDSuffixes) { - this._nodes[idSuffix] = document.getElementById("newtab-customize-" + idSuffix); - } - - this._nodes.button.addEventListener("click", e => this.showPanel(e)); - this._nodes.blank.addEventListener("click", this); - this._nodes.classic.addEventListener("click", this); - this._nodes.learn.addEventListener("click", this); - - this.updateSelected(); - }, - - hidePanel: function() { - this._nodes.overlay.addEventListener("transitionend", function onTransitionEnd() { - gCustomize._nodes.overlay.removeEventListener("transitionend", onTransitionEnd); - gCustomize._nodes.overlay.style.display = "none"; - }); - this._nodes.overlay.style.opacity = 0; - this._nodes.button.removeAttribute("active"); - this._nodes.panel.removeAttribute("open"); - document.removeEventListener("click", this); - document.removeEventListener("keydown", this); - }, - - showPanel: function(event) { - if (this._nodes.panel.getAttribute("open") == "true") { - return; - } - - let {panel, button, overlay} = this._nodes; - overlay.style.display = "block"; - panel.setAttribute("open", "true"); - button.setAttribute("active", "true"); - setTimeout(() => { - // Wait for display update to take place, then animate. - overlay.style.opacity = 0.8; - }, 0); - - document.addEventListener("click", this); - document.addEventListener("keydown", this); - - // Stop the event propogation to prevent panel from immediately closing - // via the document click event that we just added. - event.stopPropagation(); - }, - - handleEvent: function(event) { - switch (event.type) { - case "click": - this.onClick(event); - break; - case "keydown": - this.onKeyDown(event); - break; - } - }, - - onClick: function(event) { - if (event.currentTarget == document) { - if (!this._nodes.panel.contains(event.target)) { - this.hidePanel(); - } - } - switch (event.currentTarget.id) { - case "newtab-customize-blank": - sendAsyncMessage("NewTab:Customize", {enabled: false, enhanced: false}); - break; - case "newtab-customize-classic": - sendAsyncMessage("NewTab:Customize", {enabled: true, enhanced: false}); - break; - case "newtab-customize-enhanced": - sendAsyncMessage("NewTab:Customize", {enabled: true, enhanced: !gAllPages.enhanced}); - break; - case "newtab-customize-learn": - this.showLearn(); - break; - } - }, - - onKeyDown: function(event) { - if (event.keyCode == event.DOM_VK_ESCAPE) { - this.hidePanel(); - } - }, - - showLearn: function() { - window.open(TILES_INTRO_LINK, 'new_window'); - this.hidePanel(); - }, - - updateSelected: function() { - let {enabled} = gAllPages; - let selected = enabled ? "classic" : "blank"; - ["classic", "blank"].forEach(id => { - let node = this._nodes[id]; - if (id == selected) { - node.setAttribute("selected", true); - } - else { - node.removeAttribute("selected"); - } - }); - }, -}; diff --git a/browser/base/content/newtab/drag.js b/browser/base/content/newtab/drag.js deleted file mode 100644 index e3928ebd0..000000000 --- a/browser/base/content/newtab/drag.js +++ /dev/null @@ -1,151 +0,0 @@ -#ifdef 0 -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ -#endif - -/** - * This singleton implements site dragging functionality. - */ -var gDrag = { - /** - * The site offset to the drag start point. - */ - _offsetX: null, - _offsetY: null, - - /** - * The site that is dragged. - */ - _draggedSite: null, - get draggedSite() { return this._draggedSite; }, - - /** - * The cell width/height at the point the drag started. - */ - _cellWidth: null, - _cellHeight: null, - get cellWidth() { return this._cellWidth; }, - get cellHeight() { return this._cellHeight; }, - - /** - * Start a new drag operation. - * @param aSite The site that's being dragged. - * @param aEvent The 'dragstart' event. - */ - start: function Drag_start(aSite, aEvent) { - this._draggedSite = aSite; - - // Mark nodes as being dragged. - let selector = ".newtab-site, .newtab-control, .newtab-thumbnail"; - let parentCell = aSite.node.parentNode; - let nodes = parentCell.querySelectorAll(selector); - for (let i = 0; i < nodes.length; i++) - nodes[i].setAttribute("dragged", "true"); - - parentCell.setAttribute("dragged", "true"); - - this._setDragData(aSite, aEvent); - - // Store the cursor offset. - let node = aSite.node; - let rect = node.getBoundingClientRect(); - this._offsetX = aEvent.clientX - rect.left; - this._offsetY = aEvent.clientY - rect.top; - - // Store the cell dimensions. - let cellNode = aSite.cell.node; - this._cellWidth = cellNode.offsetWidth; - this._cellHeight = cellNode.offsetHeight; - - gTransformation.freezeSitePosition(aSite); - }, - - /** - * Handles the 'drag' event. - * @param aSite The site that's being dragged. - * @param aEvent The 'drag' event. - */ - drag: function Drag_drag(aSite, aEvent) { - // Get the viewport size. - let {clientWidth, clientHeight} = document.documentElement; - - // We'll want a padding of 5px. - let border = 5; - - // Enforce minimum constraints to keep the drag image inside the window. - let left = Math.max(scrollX + aEvent.clientX - this._offsetX, border); - let top = Math.max(scrollY + aEvent.clientY - this._offsetY, border); - - // Enforce maximum constraints to keep the drag image inside the window. - left = Math.min(left, scrollX + clientWidth - this.cellWidth - border); - top = Math.min(top, scrollY + clientHeight - this.cellHeight - border); - - // Update the drag image's position. - gTransformation.setSitePosition(aSite, {left: left, top: top}); - }, - - /** - * Ends the current drag operation. - * @param aSite The site that's being dragged. - * @param aEvent The 'dragend' event. - */ - end: function Drag_end(aSite, aEvent) { - let nodes = gGrid.node.querySelectorAll("[dragged]") - for (let i = 0; i < nodes.length; i++) - nodes[i].removeAttribute("dragged"); - - // Slide the dragged site back into its cell (may be the old or the new cell). - gTransformation.slideSiteTo(aSite, aSite.cell, {unfreeze: true}); - - this._draggedSite = null; - }, - - /** - * Checks whether we're responsible for a given drag event. - * @param aEvent The drag event to check. - * @return Whether we should handle this drag and drop operation. - */ - isValid: function Drag_isValid(aEvent) { - let link = gDragDataHelper.getLinkFromDragEvent(aEvent); - - // Check that the drag data is non-empty. - // Can happen when dragging places folders. - if (!link || !link.url) { - return false; - } - - // Check that we're not accepting URLs which would inherit the caller's - // principal (such as javascript: or data:). - return gLinkChecker.checkLoadURI(link.url); - }, - - /** - * Initializes the drag data for the current drag operation. - * @param aSite The site that's being dragged. - * @param aEvent The 'dragstart' event. - */ - _setDragData: function Drag_setDragData(aSite, aEvent) { - let {url, title} = aSite; - - let dt = aEvent.dataTransfer; - dt.mozCursor = "default"; - dt.effectAllowed = "move"; - dt.setData("text/plain", url); - dt.setData("text/uri-list", url); - dt.setData("text/x-moz-url", url + "\n" + title); - dt.setData("text/html", "<a href=\"" + url + "\">" + url + "</a>"); - - // Create and use an empty drag element. We don't want to use the default - // drag image with its default opacity. - let dragElement = document.createElementNS(HTML_NAMESPACE, "div"); - dragElement.classList.add("newtab-drag"); - let scrollbox = document.getElementById("newtab-vertical-margin"); - scrollbox.appendChild(dragElement); - dt.setDragImage(dragElement, 0, 0); - - // After the 'dragstart' event has been processed we can remove the - // temporary drag element from the DOM. - setTimeout(() => scrollbox.removeChild(dragElement), 0); - } -}; diff --git a/browser/base/content/newtab/dragDataHelper.js b/browser/base/content/newtab/dragDataHelper.js deleted file mode 100644 index 675ff2671..000000000 --- a/browser/base/content/newtab/dragDataHelper.js +++ /dev/null @@ -1,22 +0,0 @@ -#ifdef 0 -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ -#endif - -var gDragDataHelper = { - get mimeType() { - return "text/x-moz-url"; - }, - - getLinkFromDragEvent: function DragDataHelper_getLinkFromDragEvent(aEvent) { - let dt = aEvent.dataTransfer; - if (!dt || !dt.types.includes(this.mimeType)) { - return null; - } - - let data = dt.getData(this.mimeType) || ""; - let [url, title] = data.split(/[\r\n]+/); - return {url: url, title: title}; - } -}; diff --git a/browser/base/content/newtab/drop.js b/browser/base/content/newtab/drop.js deleted file mode 100644 index 748652455..000000000 --- a/browser/base/content/newtab/drop.js +++ /dev/null @@ -1,150 +0,0 @@ -#ifdef 0 -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ -#endif - -// A little delay that prevents the grid from being too sensitive when dragging -// sites around. -const DELAY_REARRANGE_MS = 100; - -/** - * This singleton implements site dropping functionality. - */ -var gDrop = { - /** - * The last drop target. - */ - _lastDropTarget: null, - - /** - * Handles the 'dragenter' event. - * @param aCell The drop target cell. - */ - enter: function Drop_enter(aCell) { - this._delayedRearrange(aCell); - }, - - /** - * Handles the 'dragexit' event. - * @param aCell The drop target cell. - * @param aEvent The 'dragexit' event. - */ - exit: function Drop_exit(aCell, aEvent) { - if (aEvent.dataTransfer && !aEvent.dataTransfer.mozUserCancelled) { - this._delayedRearrange(); - } else { - // The drag operation has been cancelled. - this._cancelDelayedArrange(); - this._rearrange(); - } - }, - - /** - * Handles the 'drop' event. - * @param aCell The drop target cell. - * @param aEvent The 'dragexit' event. - */ - drop: function Drop_drop(aCell, aEvent) { - // The cell that is the drop target could contain a pinned site. We need - // to find out where that site has gone and re-pin it there. - if (aCell.containsPinnedSite()) - this._repinSitesAfterDrop(aCell); - - // Pin the dragged or insert the new site. - this._pinDraggedSite(aCell, aEvent); - - this._cancelDelayedArrange(); - - // Update the grid and move all sites to their new places. - gUpdater.updateGrid(); - }, - - /** - * Re-pins all pinned sites in their (new) positions. - * @param aCell The drop target cell. - */ - _repinSitesAfterDrop: function Drop_repinSitesAfterDrop(aCell) { - let sites = gDropPreview.rearrange(aCell); - - // Filter out pinned sites. - let pinnedSites = sites.filter(function (aSite) { - return aSite && aSite.isPinned(); - }); - - // Re-pin all shifted pinned cells. - pinnedSites.forEach(aSite => aSite.pin(sites.indexOf(aSite))); - }, - - /** - * Pins the dragged site in its new place. - * @param aCell The drop target cell. - * @param aEvent The 'dragexit' event. - */ - _pinDraggedSite: function Drop_pinDraggedSite(aCell, aEvent) { - let index = aCell.index; - let draggedSite = gDrag.draggedSite; - - if (draggedSite) { - // Pin the dragged site at its new place. - if (aCell != draggedSite.cell) - draggedSite.pin(index); - } else { - let link = gDragDataHelper.getLinkFromDragEvent(aEvent); - if (link) { - // A new link was dragged onto the grid. Create it by pinning its URL. - gPinnedLinks.pin(link, index); - - // Make sure the newly added link is not blocked. - gBlockedLinks.unblock(link); - } - } - }, - - /** - * Time a rearrange with a little delay. - * @param aCell The drop target cell. - */ - _delayedRearrange: function Drop_delayedRearrange(aCell) { - // The last drop target didn't change so there's no need to re-arrange. - if (this._lastDropTarget == aCell) - return; - - let self = this; - - function callback() { - self._rearrangeTimeout = null; - self._rearrange(aCell); - } - - this._cancelDelayedArrange(); - this._rearrangeTimeout = setTimeout(callback, DELAY_REARRANGE_MS); - - // Store the last drop target. - this._lastDropTarget = aCell; - }, - - /** - * Cancels a timed rearrange, if any. - */ - _cancelDelayedArrange: function Drop_cancelDelayedArrange() { - if (this._rearrangeTimeout) { - clearTimeout(this._rearrangeTimeout); - this._rearrangeTimeout = null; - } - }, - - /** - * Rearrange all sites in the grid depending on the current drop target. - * @param aCell The drop target cell. - */ - _rearrange: function Drop_rearrange(aCell) { - let sites = gGrid.sites; - - // We need to rearrange the grid only if there's a current drop target. - if (aCell) - sites = gDropPreview.rearrange(aCell); - - gTransformation.rearrangeSites(sites, {unfreeze: !aCell}); - } -}; diff --git a/browser/base/content/newtab/dropPreview.js b/browser/base/content/newtab/dropPreview.js deleted file mode 100644 index fd7587a35..000000000 --- a/browser/base/content/newtab/dropPreview.js +++ /dev/null @@ -1,222 +0,0 @@ -#ifdef 0 -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ -#endif - -/** - * This singleton provides the ability to re-arrange the current grid to - * indicate the transformation that results from dropping a cell at a certain - * position. - */ -var gDropPreview = { - /** - * Rearranges the sites currently contained in the grid when a site would be - * dropped onto the given cell. - * @param aCell The drop target cell. - * @return The re-arranged array of sites. - */ - rearrange: function DropPreview_rearrange(aCell) { - let sites = gGrid.sites; - - // Insert the dragged site into the current grid. - this._insertDraggedSite(sites, aCell); - - // After the new site has been inserted we need to correct the positions - // of all pinned tabs that have been moved around. - this._repositionPinnedSites(sites, aCell); - - return sites; - }, - - /** - * Inserts the currently dragged site into the given array of sites. - * @param aSites The array of sites to insert into. - * @param aCell The drop target cell. - */ - _insertDraggedSite: function DropPreview_insertDraggedSite(aSites, aCell) { - let dropIndex = aCell.index; - let draggedSite = gDrag.draggedSite; - - // We're currently dragging a site. - if (draggedSite) { - let dragCell = draggedSite.cell; - let dragIndex = dragCell.index; - - // Move the dragged site into its new position. - if (dragIndex != dropIndex) { - aSites.splice(dragIndex, 1); - aSites.splice(dropIndex, 0, draggedSite); - } - // We're handling an external drag item. - } else { - aSites.splice(dropIndex, 0, null); - } - }, - - /** - * Correct the position of all pinned sites that might have been moved to - * different positions after the dragged site has been inserted. - * @param aSites The array of sites containing the dragged site. - * @param aCell The drop target cell. - */ - _repositionPinnedSites: - function DropPreview_repositionPinnedSites(aSites, aCell) { - - // Collect all pinned sites. - let pinnedSites = this._filterPinnedSites(aSites, aCell); - - // Correct pinned site positions. - pinnedSites.forEach(function (aSite) { - aSites[aSites.indexOf(aSite)] = aSites[aSite.cell.index]; - aSites[aSite.cell.index] = aSite; - }, this); - - // There might be a pinned cell that got pushed out of the grid, try to - // sneak it in by removing a lower-priority cell. - if (this._hasOverflowedPinnedSite(aSites, aCell)) - this._repositionOverflowedPinnedSite(aSites, aCell); - }, - - /** - * Filter pinned sites out of the grid that are still on their old positions - * and have not moved. - * @param aSites The array of sites to filter. - * @param aCell The drop target cell. - * @return The filtered array of sites. - */ - _filterPinnedSites: function DropPreview_filterPinnedSites(aSites, aCell) { - let draggedSite = gDrag.draggedSite; - - // When dropping on a cell that contains a pinned site make sure that all - // pinned cells surrounding the drop target are moved as well. - let range = this._getPinnedRange(aCell); - - return aSites.filter(function (aSite, aIndex) { - // The site must be valid, pinned and not the dragged site. - if (!aSite || aSite == draggedSite || !aSite.isPinned()) - return false; - - let index = aSite.cell.index; - - // If it's not in the 'pinned range' it's a valid pinned site. - return (index > range.end || index < range.start); - }); - }, - - /** - * Determines the range of pinned sites surrounding the drop target cell. - * @param aCell The drop target cell. - * @return The range of pinned cells. - */ - _getPinnedRange: function DropPreview_getPinnedRange(aCell) { - let dropIndex = aCell.index; - let range = {start: dropIndex, end: dropIndex}; - - // We need a pinned range only when dropping on a pinned site. - if (aCell.containsPinnedSite()) { - let links = gPinnedLinks.links; - - // Find all previous siblings of the drop target that are pinned as well. - while (range.start && links[range.start - 1]) - range.start--; - - let maxEnd = links.length - 1; - - // Find all next siblings of the drop target that are pinned as well. - while (range.end < maxEnd && links[range.end + 1]) - range.end++; - } - - return range; - }, - - /** - * Checks if the given array of sites contains a pinned site that has - * been pushed out of the grid. - * @param aSites The array of sites to check. - * @param aCell The drop target cell. - * @return Whether there is an overflowed pinned cell. - */ - _hasOverflowedPinnedSite: - function DropPreview_hasOverflowedPinnedSite(aSites, aCell) { - - // If the drop target isn't pinned there's no way a pinned site has been - // pushed out of the grid so we can just exit here. - if (!aCell.containsPinnedSite()) - return false; - - let cells = gGrid.cells; - - // No cells have been pushed out of the grid, nothing to do here. - if (aSites.length <= cells.length) - return false; - - let overflowedSite = aSites[cells.length]; - - // Nothing to do if the site that got pushed out of the grid is not pinned. - return (overflowedSite && overflowedSite.isPinned()); - }, - - /** - * We have a overflowed pinned site that we need to re-position so that it's - * visible again. We try to find a lower-priority cell (empty or containing - * an unpinned site) that we can move it to. - * @param aSites The array of sites. - * @param aCell The drop target cell. - */ - _repositionOverflowedPinnedSite: - function DropPreview_repositionOverflowedPinnedSite(aSites, aCell) { - - // Try to find a lower-priority cell (empty or containing an unpinned site). - let index = this._indexOfLowerPrioritySite(aSites, aCell); - - if (index > -1) { - let cells = gGrid.cells; - let dropIndex = aCell.index; - - // Move all pinned cells to their new positions to let the overflowed - // site fit into the grid. - for (let i = index + 1, lastPosition = index; i < aSites.length; i++) { - if (i != dropIndex) { - aSites[lastPosition] = aSites[i]; - lastPosition = i; - } - } - - // Finally, remove the overflowed site from its previous position. - aSites.splice(cells.length, 1); - } - }, - - /** - * Finds the index of the last cell that is empty or contains an unpinned - * site. These are considered to be of a lower priority. - * @param aSites The array of sites. - * @param aCell The drop target cell. - * @return The cell's index. - */ - _indexOfLowerPrioritySite: - function DropPreview_indexOfLowerPrioritySite(aSites, aCell) { - - let cells = gGrid.cells; - let dropIndex = aCell.index; - - // Search (beginning with the last site in the grid) for a site that is - // empty or unpinned (an thus lower-priority) and can be pushed out of the - // grid instead of the pinned site. - for (let i = cells.length - 1; i >= 0; i--) { - // The cell that is our drop target is not a good choice. - if (i == dropIndex) - continue; - - let site = aSites[i]; - - // We can use the cell only if it's empty or the site is un-pinned. - if (!site || !site.isPinned()) - return i; - } - - return -1; - } -}; diff --git a/browser/base/content/newtab/dropTargetShim.js b/browser/base/content/newtab/dropTargetShim.js deleted file mode 100644 index 57a97fa00..000000000 --- a/browser/base/content/newtab/dropTargetShim.js +++ /dev/null @@ -1,232 +0,0 @@ -#ifdef 0 -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ -#endif - -/** - * This singleton provides a custom drop target detection. We need this because - * the default DnD target detection relies on the cursor's position. We want - * to pick a drop target based on the dragged site's position. - */ -var gDropTargetShim = { - /** - * Cache for the position of all cells, cleaned after drag finished. - */ - _cellPositions: null, - - /** - * The last drop target that was hovered. - */ - _lastDropTarget: null, - - /** - * Initializes the drop target shim. - */ - init: function () { - gGrid.node.addEventListener("dragstart", this, true); - }, - - /** - * Add all event listeners needed during a drag operation. - */ - _addEventListeners: function () { - gGrid.node.addEventListener("dragend", this); - - let docElement = document.documentElement; - docElement.addEventListener("dragover", this); - docElement.addEventListener("dragenter", this); - docElement.addEventListener("drop", this); - }, - - /** - * Remove all event listeners that were needed during a drag operation. - */ - _removeEventListeners: function () { - gGrid.node.removeEventListener("dragend", this); - - let docElement = document.documentElement; - docElement.removeEventListener("dragover", this); - docElement.removeEventListener("dragenter", this); - docElement.removeEventListener("drop", this); - }, - - /** - * Handles all shim events. - */ - handleEvent: function (aEvent) { - switch (aEvent.type) { - case "dragstart": - this._dragstart(aEvent); - break; - case "dragenter": - aEvent.preventDefault(); - break; - case "dragover": - this._dragover(aEvent); - break; - case "drop": - this._drop(aEvent); - break; - case "dragend": - this._dragend(aEvent); - break; - } - }, - - /** - * Handles the 'dragstart' event. - * @param aEvent The 'dragstart' event. - */ - _dragstart: function (aEvent) { - if (aEvent.target.classList.contains("newtab-link")) { - gGrid.lock(); - this._addEventListeners(); - } - }, - - /** - * Handles the 'dragover' event. - * @param aEvent The 'dragover' event. - */ - _dragover: function (aEvent) { - // XXX bug 505521 - Use the dragover event to retrieve the - // current mouse coordinates while dragging. - let sourceNode = aEvent.dataTransfer.mozSourceNode.parentNode; - gDrag.drag(sourceNode._newtabSite, aEvent); - - // Find the current drop target, if there's one. - this._updateDropTarget(aEvent); - - // If we have a valid drop target, - // let the drag-and-drop service know. - if (this._lastDropTarget) { - aEvent.preventDefault(); - } - }, - - /** - * Handles the 'drop' event. - * @param aEvent The 'drop' event. - */ - _drop: function (aEvent) { - // We're accepting all drops. - aEvent.preventDefault(); - - // remember that drop event was seen, this explicitly - // assumes that drop event preceeds dragend event - this._dropSeen = true; - - // Make sure to determine the current drop target - // in case the dragover event hasn't been fired. - this._updateDropTarget(aEvent); - - // A site was successfully dropped. - this._dispatchEvent(aEvent, "drop", this._lastDropTarget); - }, - - /** - * Handles the 'dragend' event. - * @param aEvent The 'dragend' event. - */ - _dragend: function (aEvent) { - if (this._lastDropTarget) { - if (aEvent.dataTransfer.mozUserCancelled || !this._dropSeen) { - // The drag operation was cancelled or no drop event was generated - this._dispatchEvent(aEvent, "dragexit", this._lastDropTarget); - this._dispatchEvent(aEvent, "dragleave", this._lastDropTarget); - } - - // Clean up. - this._lastDropTarget = null; - this._cellPositions = null; - } - - this._dropSeen = false; - gGrid.unlock(); - this._removeEventListeners(); - }, - - /** - * Tries to find the current drop target and will fire - * appropriate dragenter, dragexit, and dragleave events. - * @param aEvent The current drag event. - */ - _updateDropTarget: function (aEvent) { - // Let's see if we find a drop target. - let target = this._findDropTarget(aEvent); - - if (target != this._lastDropTarget) { - if (this._lastDropTarget) - // We left the last drop target. - this._dispatchEvent(aEvent, "dragexit", this._lastDropTarget); - - if (target) - // We're now hovering a (new) drop target. - this._dispatchEvent(aEvent, "dragenter", target); - - if (this._lastDropTarget) - // We left the last drop target. - this._dispatchEvent(aEvent, "dragleave", this._lastDropTarget); - - this._lastDropTarget = target; - } - }, - - /** - * Determines the current drop target by matching the dragged site's position - * against all cells in the grid. - * @return The currently hovered drop target or null. - */ - _findDropTarget: function () { - // These are the minimum intersection values - we want to use the cell if - // the site is >= 50% hovering its position. - let minWidth = gDrag.cellWidth / 2; - let minHeight = gDrag.cellHeight / 2; - - let cellPositions = this._getCellPositions(); - let rect = gTransformation.getNodePosition(gDrag.draggedSite.node); - - // Compare each cell's position to the dragged site's position. - for (let i = 0; i < cellPositions.length; i++) { - let inter = rect.intersect(cellPositions[i].rect); - - // If the intersection is big enough we found a drop target. - if (inter.width >= minWidth && inter.height >= minHeight) - return cellPositions[i].cell; - } - - // No drop target found. - return null; - }, - - /** - * Gets the positions of all cell nodes. - * @return The (cached) cell positions. - */ - _getCellPositions: function DropTargetShim_getCellPositions() { - if (this._cellPositions) - return this._cellPositions; - - return this._cellPositions = gGrid.cells.map(function (cell) { - return {cell: cell, rect: gTransformation.getNodePosition(cell.node)}; - }); - }, - - /** - * Dispatches a custom DragEvent on the given target node. - * @param aEvent The source event. - * @param aType The event type. - * @param aTarget The target node that receives the event. - */ - _dispatchEvent: function (aEvent, aType, aTarget) { - let node = aTarget.node; - let event = document.createEvent("DragEvent"); - - // The event should not bubble to prevent recursion. - event.initDragEvent(aType, false, true, window, 0, 0, 0, 0, 0, false, false, - false, false, 0, node, aEvent.dataTransfer); - - node.dispatchEvent(event); - } -}; diff --git a/browser/base/content/newtab/grid.js b/browser/base/content/newtab/grid.js deleted file mode 100644 index b6f98fa17..000000000 --- a/browser/base/content/newtab/grid.js +++ /dev/null @@ -1,279 +0,0 @@ -#ifdef 0 -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ -#endif - -/** - * Define various fixed dimensions - */ -const GRID_BOTTOM_EXTRA = 7; // title's line-height extends 7px past the margin -const GRID_WIDTH_EXTRA = 1; // provide 1px buffer to allow for rounding error -const SPONSORED_TAG_BUFFER = 2; // 2px buffer to clip off top of sponsored tag - -/** - * This singleton represents the grid that contains all sites. - */ -var gGrid = { - /** - * The DOM node of the grid. - */ - _node: null, - _gridDefaultContent: null, - get node() { return this._node; }, - - /** - * The cached DOM fragment for sites. - */ - _siteFragment: null, - - /** - * All cells contained in the grid. - */ - _cells: [], - get cells() { return this._cells; }, - - /** - * All sites contained in the grid's cells. Sites may be empty. - */ - get sites() { return [for (cell of this.cells) cell.site]; }, - - // Tells whether the grid has already been initialized. - get ready() { return !!this._ready; }, - - // Returns whether the page has finished loading yet. - get isDocumentLoaded() { return document.readyState == "complete"; }, - - /** - * Initializes the grid. - * @param aSelector The query selector of the grid. - */ - init: function Grid_init() { - this._node = document.getElementById("newtab-grid"); - this._gridDefaultContent = this._node.lastChild; - this._createSiteFragment(); - - gLinks.populateCache(() => { - this._refreshGrid(); - this._ready = true; - - // If fetching links took longer than loading the page itself then - // we need to resize the grid as that was blocked until now. - // We also want to resize now if the page was already loaded when - // initializing the grid (the user toggled the page). - this._resizeGrid(); - - addEventListener("resize", this); - }); - - // Resize the grid as soon as the page loads. - if (!this.isDocumentLoaded) { - addEventListener("load", this); - } - }, - - /** - * Creates a new site in the grid. - * @param aLink The new site's link. - * @param aCell The cell that will contain the new site. - * @return The newly created site. - */ - createSite: function Grid_createSite(aLink, aCell) { - let node = aCell.node; - node.appendChild(this._siteFragment.cloneNode(true)); - return new Site(node.firstElementChild, aLink); - }, - - /** - * Handles all grid events. - */ - handleEvent: function Grid_handleEvent(aEvent) { - switch (aEvent.type) { - case "load": - case "resize": - this._resizeGrid(); - break; - } - }, - - /** - * Locks the grid to block all pointer events. - */ - lock: function Grid_lock() { - this.node.setAttribute("locked", "true"); - }, - - /** - * Unlocks the grid to allow all pointer events. - */ - unlock: function Grid_unlock() { - this.node.removeAttribute("locked"); - }, - - /** - * Renders and resizes the gird. _resizeGrid() call is needed to ensure - * that scrollbar disappears when the bottom row becomes empty following - * the block action, or tile display is turmed off via cog menu - */ - - refresh() { - this._refreshGrid(); - this._resizeGrid(); - }, - - /** - * Renders the grid, including cells and sites. - */ - _refreshGrid() { - let cell = document.createElementNS(HTML_NAMESPACE, "div"); - cell.classList.add("newtab-cell"); - - // Creates all the cells up to the maximum - let fragment = document.createDocumentFragment(); - for (let i = 0; i < gGridPrefs.gridColumns * gGridPrefs.gridRows; i++) { - fragment.appendChild(cell.cloneNode(true)); - } - - // Create cells. - let cells = Array.from(fragment.childNodes, (cell) => new Cell(this, cell)); - - // Fetch links. - let links = gLinks.getLinks(); - - // Create sites. - let numLinks = Math.min(links.length, cells.length); - let hasHistoryTiles = false; - for (let i = 0; i < numLinks; i++) { - if (links[i]) { - this.createSite(links[i], cells[i]); - if (links[i].type == "history") { - hasHistoryTiles = true; - } - } - } - - this._cells = cells; - while (this._gridDefaultContent.nextSibling) { - this._gridDefaultContent.nextSibling.remove(); - } - this._node.appendChild(fragment); - - document.getElementById("topsites-heading").textContent = - hasHistoryTiles ? "Your Top Sites" : "Top Sites"; - }, - - /** - * Calculate the height for a number of rows up to the maximum rows - * @param rows Number of rows defaulting to the max - */ - _computeHeight: function Grid_computeHeight(aRows) { - let {gridRows} = gGridPrefs; - aRows = aRows === undefined ? gridRows : Math.min(gridRows, aRows); - return aRows * this._cellHeight + GRID_BOTTOM_EXTRA; - }, - - /** - * Creates the DOM fragment that is re-used when creating sites. - */ - _createSiteFragment: function Grid_createSiteFragment() { - let site = document.createElementNS(HTML_NAMESPACE, "div"); - site.classList.add("newtab-site"); - site.setAttribute("draggable", "true"); - - // Create the site's inner HTML code. - site.innerHTML = - '<span class="newtab-sponsored">' + newTabString("sponsored.button") + '</span>' + - '<a class="newtab-link">' + - ' <span class="newtab-thumbnail placeholder"/>' + - ' <span class="newtab-thumbnail thumbnail"/>' + - ' <span class="newtab-thumbnail enhanced-content"/>' + - ' <span class="newtab-title"/>' + - '</a>' + - '<input type="button" title="' + newTabString("pin") + '"' + - ' class="newtab-control newtab-control-pin"/>' + - '<input type="button" title="' + newTabString("block") + '"' + - ' class="newtab-control newtab-control-block"/>' + - '<span class="newtab-suggested"/>'; - - this._siteFragment = document.createDocumentFragment(); - this._siteFragment.appendChild(site); - }, - - /** - * Test a tile at a given position for being pinned or history - * @param position Position in sites array - */ - _isHistoricalTile: function Grid_isHistoricalTile(aPos) { - let site = this.sites[aPos]; - return site && (site.isPinned() || site.link && site.link.type == "history"); - }, - - /** - * Make sure the correct number of rows and columns are visible - */ - _resizeGrid: function Grid_resizeGrid() { - // If we're somehow called before the page has finished loading, - // let's bail out to avoid caching zero heights and widths. - // We'll be called again when DOMContentLoaded fires. - // Same goes for the grid if that's not ready yet. - if (!this.isDocumentLoaded || !this._ready) { - return; - } - - // Save the cell's computed height/width including margin and border - if (this._cellHeight === undefined) { - let refCell = document.querySelector(".newtab-cell"); - let style = getComputedStyle(refCell); - this._cellHeight = refCell.offsetHeight + - parseFloat(style.marginTop) + parseFloat(style.marginBottom); - this._cellWidth = refCell.offsetWidth + - parseFloat(style.marginLeft) + parseFloat(style.marginRight); - } - - let searchContainer = document.querySelector("#newtab-search-container"); - // Save search-container margin height - if (this._searchContainerMargin === undefined) { - let style = getComputedStyle(searchContainer); - this._searchContainerMargin = parseFloat(style.marginBottom) + - parseFloat(style.marginTop); - } - - // Find the number of rows we can place into view port - let availHeight = document.documentElement.clientHeight - - searchContainer.offsetHeight - this._searchContainerMargin; - let visibleRows = Math.floor(availHeight / this._cellHeight); - - // Find the number of columns that fit into view port - let maxGridWidth = gGridPrefs.gridColumns * this._cellWidth + GRID_WIDTH_EXTRA; - // available width is current grid width, but no greater than maxGridWidth - let availWidth = Math.min(document.querySelector("#newtab-grid").clientWidth, - maxGridWidth); - // finally get the number of columns we can fit into view port - let gridColumns = Math.floor(availWidth / this._cellWidth); - // walk sites backwords until a pinned or history tile is found or visibleRows reached - let tileIndex = Math.min(gGridPrefs.gridRows * gridColumns, this.sites.length) - 1; - while (tileIndex >= visibleRows * gridColumns) { - if (this._isHistoricalTile(tileIndex)) { - break; - } - tileIndex--; - } - - // Compute the actual number of grid rows we will display (potentially - // with a scroll bar). tileIndex now points to a historical tile with - // heighest index or to the last index of the visible row, if none found - // Dividing tileIndex by number of tiles in a column gives the rows - let gridRows = Math.floor(tileIndex / gridColumns) + 1; - - // we need to set grid width, for otherwise the scrollbar may shrink - // the grid when shown and cause grid layout to be different from - // what being computed above. This, in turn, may cause scrollbar shown - // for directory tiles, and introduce jitter when grid width is aligned - // exactly on the column boundary - this._node.style.width = gridColumns * this._cellWidth + "px"; - this._node.style.maxWidth = gGridPrefs.gridColumns * this._cellWidth + - GRID_WIDTH_EXTRA + "px"; - this._node.style.height = this._computeHeight() + "px"; - this._node.style.maxHeight = this._computeHeight(gridRows) - SPONSORED_TAG_BUFFER + "px"; - } -}; diff --git a/browser/base/content/newtab/newTab.css b/browser/base/content/newtab/newTab.css deleted file mode 100644 index 658ad2ed3..000000000 --- a/browser/base/content/newtab/newTab.css +++ /dev/null @@ -1,654 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -html { - width: 100%; - height: 100%; -} - -body { - font: message-box; - width: 100%; - height: 100%; - padding: 0; - margin: 0; - background-color: #F9F9F9; - display: -moz-box; - position: relative; - -moz-box-flex: 1; - -moz-user-focus: normal; - -moz-box-orient: vertical; -} - -input { - font: message-box; - font-size: 16px; -} - -input[type=button] { - cursor: pointer; -} - -/* UNDO */ -#newtab-undo-container { - transition: opacity 100ms ease-out; - -moz-box-align: center; - -moz-box-pack: center; -} - -#newtab-undo-container[undo-disabled] { - opacity: 0; - pointer-events: none; -} - -/* CUSTOMIZE */ -#newtab-customize-button { - position: absolute; - top: 10px; - right: 20px; - z-index: 101; -} - -#newtab-customize-button:dir(rtl) { - left: 20px; - right: auto; -} - -/* MARGINS */ -#newtab-vertical-margin { - display: -moz-box; - position: relative; - -moz-box-flex: 1; - -moz-box-orient: vertical; -} - -#newtab-margin-undo-container { - display: -moz-box; - left: 6px; - position: absolute; - top: 6px; - z-index: 1; -} - -#newtab-margin-undo-container:dir(rtl) { - left: auto; - right: 6px; -} - -#newtab-undo-close-button:dir(rtl) { - float:left; -} - -#newtab-horizontal-margin { - display: -moz-box; - -moz-box-flex: 1; -} - -#newtab-margin-top, -#newtab-margin-bottom { - display: -moz-box; - position: relative; -} - -#newtab-margin-top { - -moz-box-flex: 1; -} - -#newtab-margin-bottom { - -moz-box-flex: 2; -} - -.newtab-side-margin { - min-width: 10px; - -moz-box-flex: 1; -} - -/* GRID */ -#newtab-grid { - -moz-box-flex: 5; - overflow: hidden; - text-align: center; - transition: 100ms ease-out; - transition-property: opacity; -} - -#newtab-grid[page-disabled] { - opacity: 0; -} - -#newtab-grid[locked], -#newtab-grid[page-disabled] { - pointer-events: none; -} - -body:not(.compact) #topsites-heading { - display: none; -} - -/* - * If you change the sizes here, make sure you - * change the preferences: - * toolkit.pageThumbs.minWidth - * toolkit.pageThumbs.minHeight - */ -/* CELLS */ -.newtab-cell { - display: -moz-box; - height: 210px; - margin: 20px 10px 35px; - width: 290px; -} - -body.compact .newtab-cell { - width: 110px; - height: 110px; - margin: 12px; -} - -/* SITES */ -.newtab-site { - position: relative; - -moz-box-flex: 1; - transition: 100ms ease-out; - transition-property: top, left, opacity; -} - -.newtab-site[frozen] { - position: absolute; - pointer-events: none; -} - -.newtab-site[dragged] { - transition-property: none; - z-index: 10; -} - -/* LINK + THUMBNAILS */ -.newtab-link, -.newtab-thumbnail { - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; -} - -/* TITLES */ -.newtab-sponsored, -.newtab-title, -.newtab-suggested { - overflow: hidden; - position: absolute; - right: 0; - text-align: center; -} - -.newtab-sponsored, -.newtab-title { - bottom: 0; - white-space: nowrap; - text-overflow: ellipsis; - vertical-align: middle; -} - -.newtab-suggested { - border: 1px solid transparent; - border-radius: 2px; - font-size: 12px; - height: 17px; - line-height: 17px; - margin-bottom: -1px; - padding: 2px 8px; - display: none; - margin-left: auto; - margin-right: auto; - left: 0; - top: 215px; - -moz-user-select: none; -} - -.newtab-suggested-bounds { - max-height: 34px; /* 34 / 17 = 2 lines maximum */ -} - -.newtab-title { - left: 0; - padding: 0 4px; -} - -.newtab-sponsored { - background-color: #FFFFFF; - border: 1px solid #E2E2E2; - border-radius: 3px; - color: #4A4A4A; - cursor: pointer; - display: none; - font-family: Arial; - font-size: 9px; - height: 17px; - left: 0; - line-height: 6px; - padding: 4px; - right: auto; - top: -15px; -} - -.newtab-site[suggested=true] > .newtab-sponsored { - background-color: #E2E2E2; - border: none; -} - -.newtab-site > .newtab-sponsored:-moz-any(:hover, [active]) { - background-color: #4A90E2; - border: 0; - color: white; -} - -.newtab-site > .newtab-sponsored[active] { - background-color: #000000; -} - -.newtab-sponsored:dir(rtl) { - right: 0; - left: auto; -} - -.newtab-site:-moz-any([type=enhanced], [type=sponsored], [suggested]) .newtab-sponsored { - display: block; -} - -.newtab-site[suggested] .newtab-suggested { - display: table; -} - -.sponsored-explain, -.sponsored-explain a, -.suggested-explain, -.suggested-explain a { - color: white; -} - -.sponsored-explain, -.suggested-explain { - background-color: rgba(51, 51, 51, 0.95); - bottom: 30px; - line-height: 20px; - padding: 15px 10px; - position: absolute; - text-align: start; -} - -.sponsored-explain input, -.suggested-explain input { - background-size: 18px; - height: 18px; - opacity: 1; - pointer-events: none; - position: static; - width: 18px; -} - -/* CONTROLS */ -.newtab-control { - position: absolute; - opacity: 0; - transition: opacity 100ms ease-out; -} - -.newtab-control:-moz-focusring, -.newtab-cell:not([ignorehover]) > .newtab-site:hover > .newtab-control { - opacity: 1; -} - -.newtab-control[dragged] { - opacity: 0 !important; -} - -@media (-moz-touch-enabled) { - .newtab-control { - opacity: 1; - } -} - -/* DRAG & DROP */ - -/* - * This is just a temporary drag element used for dataTransfer.setDragImage() - * so that we can use custom drag images and elements. It needs an opacity of - * 0.01 so that the core code detects that it's in fact a visible element. - */ -.newtab-drag { - width: 1px; - height: 1px; - background-color: #fff; - opacity: 0.01; -} - -/* SEARCH */ -#newtab-search-container { - display: -moz-box; - position: relative; - -moz-box-pack: center; - margin: 40px 0 15px; -} - -body.compact #newtab-search-container { - margin-top: 0; - margin-bottom: 80px; -} - -#newtab-search-container[page-disabled] { - opacity: 0; - pointer-events: none; -} - -#newtab-search-form { - display: -moz-box; - position: relative; - height: 36px; - -moz-box-flex: 1; - max-width: 600px; /* 2 * (290 cell width + 10 cell margin) */ -} - -#newtab-search-icon { - border: 1px transparent; - padding: 0; - margin: 0; - width: 36px; - height: 36px; - background: url("chrome://browser/skin/search-indicator-magnifying-glass.svg") center center no-repeat; - position: absolute; -} - -#newtab-search-text { - -moz-box-flex: 1; - padding-top: 6px; - padding-bottom: 6px; - padding-inline-start: 34px; - padding-inline-end: 8px; - background: hsla(0,0%,100%,.9) padding-box; - border: 1px solid; - border-spacing: 0; - border-radius: 2px 0 0 2px; - border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2); - box-shadow: 0 1px 0 hsla(210,65%,9%,.02) inset, - 0 0 2px hsla(210,65%,9%,.1) inset, - 0 1px 0 hsla(0,0%,100%,.2); - color: inherit; - unicode-bidi: plaintext; -} - -#newtab-search-text:dir(rtl) { - border-radius: 0 2px 2px 0; -} - -#newtab-search-text[aria-expanded="true"] { - border-radius: 2px 0 0 0; -} - -#newtab-search-text[aria-expanded="true"]:dir(rtl) { - border-radius: 0 2px 0 0; -} - -#newtab-search-text[keepfocus], -#newtab-search-text:focus, -#newtab-search-text[autofocus] { - border-color: hsla(206,100%,60%,.6) hsla(206,76%,52%,.6) hsla(204,100%,40%,.6); -} - -#newtab-search-submit { - margin-inline-start: -1px; - color: transparent; - background: url("chrome://browser/skin/search-arrow-go.svg#search-arrow-go") center center no-repeat, linear-gradient(hsla(0,0%,100%,.8), hsla(0,0%,100%,.1)) padding-box; - padding: 0; - border: 1px solid; - border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2); - border-radius: 0 2px 2px 0; - border-inline-start: 1px solid transparent; - box-shadow: 0 0 2px hsla(0,0%,100%,.5) inset, - 0 1px 0 hsla(0,0%,100%,.2); - cursor: pointer; - transition-property: background-color, border-color, box-shadow; - transition-duration: 150ms; - width: 50px; -} - -#newtab-search-submit:dir(rtl) { - border-radius: 2px 0 0 2px; - background-image: url("chrome://browser/skin/search-arrow-go.svg#search-arrow-go-rtl"), linear-gradient(hsla(0,0%,100%,.8), hsla(0,0%,100%,.1)); -} - -#newtab-search-text:focus + #newtab-search-submit, -#newtab-search-text + #newtab-search-submit:hover, -#newtab-search-text[autofocus] + #newtab-search-submit { - border-color: #59b5fc #45a3e7 #3294d5; -} - -#newtab-search-text:focus + #newtab-search-submit, -#newtab-search-text[keepfocus] + #newtab-search-submit, -#newtab-search-text[autofocus] + #newtab-search-submit { - background-image: url("chrome://browser/skin/search-arrow-go.svg#search-arrow-go-inverted"), linear-gradient(#4cb1ff, #1793e5); - box-shadow: 0 1px 0 hsla(0,0%,100%,.2) inset, - 0 0 0 1px hsla(0,0%,100%,.1) inset, - 0 1px 0 hsla(210,54%,20%,.03); -} - -#newtab-search-text + #newtab-search-submit:hover { - background-image: url("chrome://browser/skin/search-arrow-go.svg#search-arrow-go-inverted"), linear-gradient(#4cb1ff, #1793e5); - box-shadow: 0 1px 0 hsla(0,0%,100%,.2) inset, - 0 0 0 1px hsla(0,0%,100%,.1) inset, - 0 1px 0 hsla(210,54%,20%,.03), - 0 0 4px hsla(206,100%,20%,.2); -} - -#newtab-search-text + #newtab-search-submit:hover:active { - box-shadow: 0 1px 1px hsla(211,79%,6%,.1) inset, - 0 0 1px hsla(211,79%,6%,.2) inset; - transition-duration: 0ms; -} - -#newtab-search-text:focus + #newtab-search-submit:dir(rtl), -#newtab-search-text[keepfocus] + #newtab-search-submit:dir(rtl), -#newtab-search-text[autofocus] + #newtab-search-submit:dir(rtl), -#newtab-search-text + #newtab-search-submit:dir(rtl):hover { - background-image: url("chrome://browser/skin/search-arrow-go.svg#search-arrow-go-rtl-inverted"), linear-gradient(#4cb1ff, #1793e5); -} - -/* CUSTOMIZE */ -#newtab-customize-overlay { - opacity: 0; - display: none; - width: 100%; - height: 100%; - background: #F9F9F9; - z-index: 100; - position: fixed; - transition: opacity .07s linear; -} - -.newtab-customize-panel-container { - position: absolute; - margin-right: 40px; - right: 0; -} - -.newtab-customize-panel-container:dir(rtl) { - right: auto; - left: 0; -} - -#newtab-customize-panel { - z-index: 999; - margin-top: 55px; - min-width: 270px; - position: absolute; - top: 100%; - right: -25px; - filter: drop-shadow(0 0 1px rgba(0,0,0,0.4)) drop-shadow(0 3px 4px rgba(0,0,0,0.4)); - transition: all 200ms ease-in-out; - transform-origin: top right; - transform: translate(-30px, -20px) scale(0) translate(30px, 20px); -} - -#newtab-customize-panel:dir(rtl) { - transform-origin: 40px top 20px; -} - -#newtab-customize-panel:dir(rtl), -#newtab-customize-panel-anchor:dir(rtl) { - left: 15px; - right: auto; -} - -#newtab-customize-panel[open="true"] { - transform: translate(-30px, -20px) scale(1) translate(30px, 20px); -} - -#newtab-customize-panel-anchor { - width: 18px; - height: 18px; - background-color: white; - transform: rotate(45deg); - position: absolute; - top: -6px; - right: 15px; -} - -#newtab-customize-title { - color: #7A7A7A; - font-size: 14px; - background-color: #FFFFFF; - line-height: 25px; - padding: 15px; - font-weight: 600; - cursor: default; - border-radius: 5px 5px 0px 0px; - max-width: 300px; - overflow: hidden; - display: table-cell; - border-top: none; -} - -#newtab-customize-panel-inner-wrapper { - background-color: #FFFFFF; - border-radius: 6px; - overflow: hidden; -} - -#newtab-customize-title > label { - cursor: default; -} - -#newtab-customize-panel > .panel-arrowcontainer > .panel-arrowcontent { - padding: 0; -} - -.newtab-customize-panel-item { - line-height: 25px; - padding: 15px; - padding-inline-start: 40px; - font-size: 14px; - cursor: pointer; - max-width: 300px; -} - -.newtab-customize-panel-item:not(:first-child) { - border-top: 1px solid threedshadow; -} - -.newtab-customize-panel-subitem > label, -.newtab-customize-panel-item > label, -.newtab-customize-complex-option { - padding: 0; - margin: 0; - cursor: pointer; -} - -.newtab-customize-panel-item, -.newtab-customize-complex-option { - display: block; - text-align: start; - background-color: #F9F9F9; -} - -.newtab-customize-panel-item[selected]:-moz-locale-dir(rtl) { - background-position: right 15px center; -} - -.newtab-customize-complex-option:hover > .selectable:not([selected]):-moz-locale-dir(rtl), -.selectable:not([selected]):hover:-moz-locale-dir(rtl) { - background-position: right 15px center; -} - -.newtab-customize-panel-item:not([selected]), -.newtab-customize-panel-subitem:not([selected]){ - color: #7A7A7A; -} - -.newtab-customize-panel-item:not([selected]):hover { - color: #FFFFFF; - background-color: #4A90E2 -} - -.newtab-customize-complex-option:hover > .selectable:not([selected]), -.selectable:not([selected]):hover { - background: url("chrome://global/skin/menu/shared-menu-check-hover.svg") no-repeat #FFFFFF; - background-size: 16px 16px; - background-position: 15px 15px; - color: #171F26; -} - -.newtab-customize-complex-option:hover > .selectable:not([selected]) + .newtab-customize-panel-subitem { - background-color: #FFFFFF; -} - -.newtab-customize-panel-item[selected] { - background: url("chrome://global/skin/menu/shared-menu-check-active.svg") no-repeat transparent; - background-size: 16px 16px; - background-position: 15px 15px; - color: black; - font-weight: 600; -} - -.newtab-customize-panel-subitem > .checkbox { - width: 18px; - height: 18px; - background-color: #FFFFFF; - border: solid 1px threedshadow; -} - -.newtab-customize-panel-subitem[selected] > .checkbox { - background: url("chrome://global/skin/menu/shared-menu-check-black.svg") no-repeat #FFFFFF; - background-size: 9px 9px; - background-position: center; - color: #333333; -} - -.newtab-customize-panel-subitem { - font-size: 12px; - padding: 0px 15px 15px 15px; - padding-inline-start: 40px; - display: block; - max-width: 300px; -} - -.newtab-customize-panel-subitem > label { - padding: 0px 10px; - line-height: 20px; - vertical-align: middle; - max-width: 225px; -} - -.newtab-customize-panel-superitem { - line-height: 20px; - border-bottom: medium none !important; - padding: 15px 15px 10px 15px; - padding-inline-start: 40px; - border-top: 1px solid threedshadow; -} - -.contentSearchSuggestionTable { - font: message-box; - font-size: 16px; -} diff --git a/browser/base/content/newtab/newTab.inadjacent.json b/browser/base/content/newtab/newTab.inadjacent.json deleted file mode 100644 index 53fb542af..000000000 --- a/browser/base/content/newtab/newTab.inadjacent.json +++ /dev/null @@ -1,3209 +0,0 @@ -{ - "domains": [ - "rp5slFCxq/e7hYhXJCd0vQ==", - "2rEimAJDNX5g8HPZehOrGg==", - "nvLEpj6ZZF3LWH3wUB6lKg==", - "9Cqd4Lm3VvXuJxz79Bbqyg==", - "vNRy4LR+7TOKTixqsr5ybw==", - "N4zSgsZCo6Z4XRwZ4fu8WQ==", - "jsDtRfVbMsFg3KkEl2UiZQ==", - "TckkKpiq0a6J6NTw7uOZqw==", - "9Or7IAYuuIgZA370w9rNIg==", - "ul8WvOjCkxTz9LjT4RqTHg==", - "ZGJrbwb5878Nsqm0z+A7nQ==", - "5iT64HTeeG5SIFXG7A9o3w==", - "YSeSEghPe1kV6g8ghFcNAA==", - "0jIUl1NDmJZQkDY12VDeIQ==", - "aos6UyDyIw0R1nTK5wTawA==", - "G1xxubsq65ugK06UT2DO5A==", - "lbhavoDrDPP/8m0onwo63w==", - "ObcLsjW0SkdvY0nkZmiTGQ==", - "FHZ5084LC0nTAzZlnSKN3Q==", - "cdEr+0Fv5iaVZzalZToseg==", - "Co8WbNYbCPTFPcHpeK3hRQ==", - "qXSzhCEhByLQq9N84tqV+Q==", - "h3ufhRk5IEFaNH11rIACtQ==", - "fQ1PJ/JwazIaYoy/zy49QQ==", - "zAJqfbn54Nsm2ddGtkb59A==", - "ixPM9T8ik/gWGZ7BRIcaig==", - "/E9pwA3E3hVAZoYq3FmCyw==", - "U6ygonI8CxpruhpGB2+Q6A==", - "Igi4voB8oVMVw6WUeDSjZg==", - "jtuHIJhwoTGzavFpM7ilNw==", - "eBvTV27n6Gs+ZsBkpVynvw==", - "sFbzw0AUOGG0NEzkaSxVDg==", - "yAkIS+Ezj6woEff9YvdO7Q==", - "IP1+BwG6q60QzDADi8j7oA==", - "Q/teQEBFepHtwZ7UHa2TEA==", - "B1vDep5a1Gok5Gnth39+LA==", - "cyEIyQ2MZaPGf+K1x9Bbkg==", - "aaM+oEJnF4/nwMWyXJU8rA==", - "qpDNIpxah8FUiqXm5IRaUg==", - "ZTeJ35gMPqIv2WWbeNyIEg==", - "nzoAGQAnC/Xgg5PmOgXqkA==", - "J5pJDuNi3cqQiyaRJAJk4g==", - "2vqN53BXhXzPrKYsh6QH1A==", - "QlrzHNYxCwCBMVENvbXjQA==", - "Ou2HGn43nmsL3RWSNvMdXw==", - "3qk9lsvGTMqVMAZW+xihfw==", - "RncMe42RB2bhmUbYtGVnKQ==", - "hzNXR6dqPq1+vf4Qh5ByWA==", - "sRq3S2ZRs3H39cEQHv4Vig==", - "B4ThUBTVJOUPyOsHxikHXA==", - "A2lU9GkAdSibLO1JJfFnIA==", - "ef3HNkSvuWQrAzkuty2iqg==", - "yKDiRM6bf2xc0QXIwHYuaA==", - "AdCk4ccJuhA0bIT/61J+RQ==", - "UXvAZ7ULCVz2f505K0Wkvg==", - "ueKWblrOwVJNgiOvkXKLBQ==", - "s8u/jPuBAxu1d18HfV5Z0g==", - "hUT0Uc5YMUdNZQEGLz4hJw==", - "6jo/phmMTrEXKrNRsionGQ==", - "s/Ea/3fkyJ9honzPJkgEQQ==", - "hgu2/Jf+WrQAHfO+asW2zw==", - "kiVuTNwZ1r2lqYEZxIHyiQ==", - "24T5KVrVE2mYwJ5Goj3xJw==", - "fiWBVlfj97GGjEvf/Q9Spg==", - "5VWdlvJe7eoXMGkTtHzCUg==", - "+cFQxKa5RWVtc1z00Jujew==", - "nVa+rLH5p+yXBksLwQsjRQ==", - "5tyI6bMdb3tMIi4ewvr/SQ==", - "S6Roj31yS5bZbSFcd3f4Hg==", - "uW1Zl8iuEF8ZT/gwCBEqwA==", - "YwL+FJgxlZ8JVig+9iP5Cw==", - "ThIYK/mQsp9cMf8+rws/4Q==", - "w0oSxOhRG6kE9B868aoYVQ==", - "DJUDGQ0J32dF1kfItyxALg==", - "34/ab69lPkuAKt6WBxJPpA==", - "25jH4C9apgqWZGZP15lM6Q==", - "GxvwleSaSwILD1pG9k9buA==", - "YRAMt2ArEINo83ms6AqJ0A==", - "15HyTJNoMYzi3XCkeU5Z7A==", - "/SqjXGD+TKC90uz1vsjqUw==", - "karhKOknkhtg/LSFo9BGRA==", - "+tD1d0t3vfJvc1hUAvTT4Q==", - "rkaKbtlnyVr53D0rexLqdQ==", - "fAugw4rtnXzzRXfC1wRgOQ==", - "RgxoepF/XOwIsGat5r5HpQ==", - "Y49/EnzVz3ugXCYxFjFN7g==", - "tHMyzBm/2wNDw7TeNeujbg==", - "LlqzYV4uZpiJy4ORWPSekA==", - "M3Huar7/ded9OGgDwJhZgw==", - "QkNNATSx/PJ1XjgZyTtkUQ==", - "skVw0v6Wx00sfHAScPK1Bw==", - "v1gsIvg+C68T9wixMzL2sQ==", - "hDL75EXhl7BaYnAxkoGwbw==", - "tReG97snx2ESpXbfllCL7Q==", - "EiZBXR15dT1TMrkgkzmkvw==", - "5hRHirfD90/sdp0ILJQU8A==", - "rabElvtYtG0jW6dxAOHofg==", - "JpxoTRKWN+SEeBQ453R1YQ==", - "Faz4Lm0cpjvF0IjVkHiZMg==", - "jGErFAIoXx+50KFpVIGZiA==", - "5GzBkduKpUX7u1uwtYIFug==", - "cRBe0J9/KWRX19N2vPkCiw==", - "t/7g8t4Kr3/+SCnOn3XFWQ==", - "sd08c6jUXs5/hxND0fBkPA==", - "nTxKpqIdnHNdpDk7Dx3TEg==", - "5l+RALcce+lTDnmXI+Wqqg==", - "pzJ4QmEBGRNiiX6z0xHh8g==", - "Vfl3YbqR6JRR7SIdsUA/vA==", - "cgfhOdB376a4GAcuACADvA==", - "inAefsQM6tiIhQCMtcPcyA==", - "FTSULGL8CMhmcc7Cyf/X8A==", - "9XSWpaZyHEy7V/tuw5uZEw==", - "+VtM1opKlgb/jrCwc4YjFA==", - "oF46xheuI/NUxUOnOttzvA==", - "Qy+lvhDbJCumr6kiPLd1oA==", - "swps7UEKpIbVBJ9SnPK3zQ==", - "b7wyIiJvJs+29QePxsdWtQ==", - "x3iDZxYyuHtG/9rNW5HMYg==", - "r1dx1g5UOksywvOaQTamfA==", - "KvVF3Si/fr4JQtr7jCJiog==", - "spvZ7hhtG5QY7JXs96lBUg==", - "ECL8mA5B6CswyDH6yJ4hVw==", - "7Uu+YsdS69dMSDYUr6vTag==", - "Rnm9pSvQRRbkHpOijraLZw==", - "aQJqpnXdzqNSFhMn3EJA2Q==", - "TctnXpd7Wd5ZXKMnOFHAQA==", - "+lPqG8l6mf2FWVGWflyF/g==", - "mPmnmL2oRRJmKYjQ6TfN3g==", - "fyXFcT5ZCawDBg74n1WSpg==", - "uq5Zrxq10pO1HoPxReT5og==", - "3eoCsOKXY8RDrHSdlXqmrA==", - "9nQv2BFG56xsHViN5UpHYw==", - "RtP/nJgy/ItyuDrpBbAotg==", - "5E/drRptfHmBhJ7qplujGg==", - "cUxyZvoqXbQ0a/0I9s6Zbg==", - "womzqSigwEF30V422YmxKw==", - "FPvZqDfN8dTFHLVOuYEbUA==", - "YZMXx+scKXp/v9GaJjb1bA==", - "bjURu5MRsNIZavG5HV0eZw==", - "iY0C9uSMEOn8ikT+J7+/Eg==", - "aXkD6BzsdkMEv7A+eYqQQQ==", - "dOcOfEDGHYG2kgmrglDkPw==", - "c7GjtY05Mh+cp6SNuWY3Ig==", - "lM1uY1oVncHXNzKs/cCEtQ==", - "7jXnQJkutLsi+r9aYmrMxw==", - "NgrugWWduj2qdWnEQf9dLA==", - "faYjmy/yn5iXdS28QCIdWw==", - "68XbaOvIZpCGb4G1gaKErA==", - "Yi67HkOLtGYXeL7WD4GPrA==", - "Puo8gXuUkwcoQViaXwkdSQ==", - "L202Et5aZh60Vl20LTKNFg==", - "4agAzQ5+dnTmLZEjsZs26g==", - "LegGM1ft8Y7Ka3CUxpObvg==", - "KRdILc1QDOpow5im/qY+Kw==", - "peMW+rpwmXrSwplVuB/gTA==", - "Pic1ncr+Zn6wv75zjAdzQA==", - "ilSPlWYbiPzIC13vQUBlOw==", - "GUlDufLoTalBqrG/h3mZ6w==", - "5twANNlT57T9BG4r2D9+Hw==", - "ENrnM8HlMi+5y8Hsu4Pn4A==", - "K/DzpLEbz1MpRjA6qyYn4Q==", - "yN1cHJRHDXoFxFZacL6wsw==", - "Rc6r+KqIePH+dnj1aNYCsQ==", - "8u/z5htgqXVU5Dqwd9whJQ==", - "jV575O42EYoqDNxCm9643Q==", - "xCxGo0h3lS8N6X+ivKfpjA==", - "us+2nfpj2gjI7s14Hw0gmA==", - "bp90A/rbESwVU7eh9xRTfQ==", - "5QtMXzbTafvKDQOWZP7M8w==", - "1gFCxPLjQlQGKmSGmHwmJQ==", - "m+/dnOIe6SaIFhfvg+ybDg==", - "9Dcg87+RPq9U+swRg4dH3Q==", - "mnjbL7WFmrWp0RUqS8AMGA==", - "/0e0E+NFmq8GeE5+y2Gekw==", - "y11mbpHHtka9Ep8cr2nEvQ==", - "GdmjRyliw+W21Q+dHO4CWA==", - "X65wWQTpkg756V/Nfn92kQ==", - "xj06KvacQOxRSofbhzBNgA==", - "nVDxVhaa2o38gd1XJgE3aw==", - "4IV+JOGXrltpkQamBRXMgA==", - "jIfp8LqaYXT88r/K3a8gNw==", - "vhT4dDtbMFVyevS6yCGy0g==", - "zMs7/x8hDt8xj2FFc5+6vA==", - "1J7u2N62JGb2VrnCRlJIrw==", - "3hJs9P/RRxB0CO4q0Icb+g==", - "ZpuVY1ZyoKD3hqosdsfT6Q==", - "6KIM7C7eWgxZtqZboiJvZQ==", - "vtb6fdqirkuUkqITAmXTlw==", - "C/rEVr22mw2u/1dwUx9VTg==", - "NrY4Q5C67haCWLK8HXHq9g==", - "X9qvEftCEFWX3gBU5hXy+Q==", - "0zgw7xNB3xVGaH48TyxaNQ==", - "g7J9Jy/PJrAGRgVdvA+bEg==", - "9zb+anAyZVBzuU9rW4cJtg==", - "6Zc5FzT/m0YIjxEPYA6zDQ==", - "R2YPNlvCbVK0EodTR7czIw==", - "gsI6EGgXMtDu+1u364A8mw==", - "Bg2wBFb1/xaxeEiHfBHX+A==", - "64aapfVI6dV3LpTK56KZlg==", - "HdgcJU0W3yVnH69VYStmug==", - "qTDCcv+LK3JPFB/++t66IQ==", - "P0HEIXMnAmbvq+QYREwFzw==", - "aaU7CAmtyE35jNKTkyXOkg==", - "r9G97WKDiQ48qJHP9LBRNg==", - "8mPgQhYVDn8KshDDvvf5SA==", - "GCQiiOLDguXLiYwuLcFPsA==", - "R2Use39If2C0FVBP7KDerA==", - "23C4eh3yBb5n/RNZeTyJkA==", - "2QQtKtBAm2AjJ5c0WQ6BQA==", - "Qc+XYy2qyWJ5VVwd2PExbw==", - "zJ7ScHNxr2leCDNNcuDApA==", - "vFtC0B2oe1gck28JOM1dyg==", - "bLEntCrCHFy9pg3T3gbBzg==", - "G3PmmPGHaWHpPW30xQgm3Q==", - "me61ST+JrXM5k3/a11gRAA==", - "+LJYVZl1iPrdMU3L5+nxZw==", - "CLPzjXKGGpJ0VrkSJp7wPQ==", - "Pc+u0MAzp4lndTz4m6oQ5w==", - "cwBNvZc0u4bGABo88YUsVQ==", - "q7m/EtZySBjZNBjQ5m1hKw==", - "8ZBiwr842ZMKphlqmNngHw==", - "LMCZqd3UoF/kHHwzTdj7Tw==", - "0ODJyWKJSfObo+FNdRQkkA==", - "ViweSJuNWbx5Lc49ETEs/A==", - "x+8rwkqKCv0juoT5m1A4eg==", - "pxuSWn1u+bHtRjyh2Z8veA==", - "GKzs8mlnQQc58CyOBTlfIg==", - "Owg8qCpjZa+PmbhZew6/sw==", - "YLz+HA6qIneP+4naavq44Q==", - "9ajIS45NTicqRANzRhDWFA==", - "DjeSrUoWW2QAZOAybeLGJg==", - "qxALQrqHoDq9d91nU0DckA==", - "yPIeWcW8+3HjDagegrN8bw==", - "ocpLRASvTgqfkY20YlVFHQ==", - "RuLeQHP1wHsxhdmYMcgtrQ==", - "3WwITQML938W9+MUM56a3A==", - "ZbLVNTQSVZQWTNgC4ZGfQg==", - "X6Ln4si8G5aKar52ZH/FEQ==", - "+gbitI/gpxebN/rK7qj8Fw==", - "7cnUHeaPO8txZGGWHL9tKg==", - "epY+dsm5EMoXnZCnO4WSHw==", - "nf8x+F03kOpMhsCSUWEhVg==", - "VE4sLM5bKlLdk85sslxiLQ==", - "Hs3vUOOs2TWQdQZHs+FaQQ==", - "hkOBNoHbno2iNR7t3/d4vg==", - "Ar9N1VYgE7riwmcrM3bA2Q==", - "SbMjjI8/P8B9a9H2G0wHEQ==", - "tU31r8zla146sqczdKXufg==", - "tFmWYH82I3zb+ymk5dhepA==", - "XHjrTLXkm/bBY/BewmJcCQ==", - "FV/D5uSco+Iz8L+5t7E8SA==", - "yKLLiqzxfrCsr6+Rm6kx1Q==", - "B6reUwMkQFaCHb9BYZExpw==", - "5jyuDp82Fux+B0+zlx8EXw==", - "WGKFTWJac8uehn3N59yHJw==", - "JQf9UmutPh3tAnu7FDk3nA==", - "hv5GrLEIjPb4bGOi8RSO0w==", - "p3V7NfveB6cNxFW7+XQNeQ==", - "DinJuuBX9OKsK5fUtcaTcQ==", - "UEMwF4kwgIGxGT4jrBhMPQ==", - "Y78dviyBS3Jq9zoRD5sZtQ==", - "zbjXhZaeyMfdTb2zxvmRMg==", - "kydoXVaNcx1peR5g6i588g==", - "M2suCoFHJ5fh9oKEpUG3xA==", - "/VnKh/NDv7y/bfO6CWsLaQ==", - "S+b37XhKRm8cDwRb1gSsKQ==", - "jz7QlwxCIzysP39Cgro8jg==", - "IjmLaf3stWDAwvjzNbJpQA==", - "cHSj5dpQ04h/WyefjABfmQ==", - "+gO0bg8LY+py2dLM1sM7Ag==", - "fSANOaHD0Koaqg7AoieY9A==", - "vqYHQ3MnHrAIAr1QHwfIag==", - "Uh1mvZNGehK1AaI4a1auKQ==", - "HCbHUfsTDl6+bxPjT57lrA==", - "S7Vjy/gOWp0HozPP1RUOZw==", - "KPh6TwYpspne4KZA6NyMbw==", - "cfh5VZFmIqJH/bKboDvtlA==", - "H1zH9I8RwfEy5DGz3z+dHw==", - "2ksediOVrh4asSBxKcudTg==", - "+jVN/3ASc2O44sX6ab8/cg==", - "uvKYnKE01D5r7kR9UQyo5A==", - "BB9PTlwKAWkExt3kKC/Wog==", - "yqQPU4jT9XvRABZgNQXjgg==", - "6v3eTZtPYBfKFSjfOo2UaA==", - "49z/15Nx9Og7dN9ebVqIzg==", - "VjclDY8HN4fSpB263jsEiQ==", - "vSKsa0JhLCe9QFZKkcj58Q==", - "PolhKCedOsplEcaX4hQ0YQ==", - "D0Qt9sRlMaPnOv1xaq+XUg==", - "gBgJF0PiGEfcUnXF0RO7/w==", - "sC11Rf/mau3FG5SnON4+vQ==", - "rKb3TBM4EPx/RErFOFVCnQ==", - "+n0K7OB2ItzhySZ4rhUrMg==", - "Epm0d/DvXkOFeM4hoPCBrg==", - "K8PVQhEJCEH1ghwOdztjRw==", - "xjA21QjNdThLW3VV7SCnrg==", - "nE72uQToQFVLOzcu/nMjww==", - "2Hc5oyl0AYRy2VzcDKy+VA==", - "Y7XpxIwsGK3Lm/7jX/rRmg==", - "MK7AqlJIGqK2+K5mCvMXRQ==", - "mXycPfF5zOvcj1p4hnikWw==", - "V1fvtnJ0L3sluj9nI5KzRw==", - "TahqPgS7kEg+y6Df0HBASw==", - "EKU3OVlT4b/8j3MTBqpMNg==", - "EdvIAKdRAXj7e42mMlFOGQ==", - "uPm+cF4Jq08S5pQhYFjU8A==", - "CnIwpRVC2URVfoiymnsdYQ==", - "wyx5mnUMgP5wjykjAfTO7w==", - "OwIGvTh8FPFqa4ijNkguAw==", - "4ID0PHTzIMZz2rQqDGBVfA==", - "rlXt6zKE7DswUl0oWGOQUQ==", - "4NP8EFFJyPcuQKnBSxzKgQ==", - "bJgsuw29cO2WozqsGZxl7w==", - "b3q8kjHJPj9DWrz3yNgwjQ==", - "QGYFMpkv37CS2wmyp42ppg==", - "Kzs+/IZJO8v4uIv9mlyJ2Q==", - "ZJY+hujfd58mTKTdsmHoQQ==", - "R8FxgXWKBpEVbnl41+tWEw==", - "+CvLiih/gf2ugXAF+LgWqw==", - "BDbfe/xa9Mz1lVD82ZYRGA==", - "Dz90OhYEjpaJ/pxwg1Qxhg==", - "MLHt6Ak288G0RGhCVaOeqA==", - "r0QffVKB9OD9yGsOtqzlhA==", - "hK8KhTFcR06onlIJjTji/Q==", - "wMum67lfk5E1ohUObJgrOg==", - "JKmZqz9cUnj6eTsWnFaB0A==", - "rtJdfki8fG6CB36CADp0QA==", - "cUyqCa7Oue934riyC17F8g==", - "y4Y4mSSTw/WrIdRpktc5Hw==", - "r36kVMpF+9J+sfI3GeGqow==", - "ydVj2odhergi+2zGUwK4/A==", - "J2NFyb8cXEpZyxWDthYQiA==", - "qYuo5vY8V3tZx41Kh9/4Dw==", - "jrfRznO0nAz6tZM1mHOKIA==", - "JSr/lqDej81xqUvd/O2s7w==", - "vHGjRRSlZHJIliCwIkCAmQ==", - "sQAxqWXeiu/Su0pnnXgI9A==", - "xPe76nHyHmald6kmMQsKdg==", - "50jASqzGm4VyHJbFv8qVRA==", - "uuiJ+yB7JLDh2ulthM0mjg==", - "TI90EuS/bHq/CAlX32UFXg==", - "JgxNrUlL8wutG04ogKFPvw==", - "aMa1yVA71/w6Uf1Szc9rMA==", - "k/Aou2Jmyh8Bu3k8/+ndsQ==", - "iANKiuMqWzrHSk9nbPe3bQ==", - "7GgNLBppgAKcgJCDSsRqOQ==", - "bzVeU2qM9zHuzf7cVIsSZw==", - "rkeLYwMZ1/pW2EmIibALfA==", - "91+Yms6Oy/rP0rVjha5z9w==", - "JgXSPXDqaS1G9NqmJXZG0A==", - "ZzduJxTnXLD9EPKMn1LI4Q==", - "6W79FmpUN1ByNtv5IEXY4w==", - "Y1Nm3omeWX2MXaCjDDYnWQ==", - "ejfikwrSPMqEHjZAk3DMkA==", - "WNfDNaWUOqABQ6c6kR+eyw==", - "4BkqgraeXY7yaI1FE07Evw==", - "AjHz9GkRTFPjrqBokCDzFw==", - "T/6gSz2HwWJDFIVrmcm8Ug==", - "VWy9lB5t4fNCp4O/4n8S4w==", - "/FdZzSprPnNDPwbhV1C0Cg==", - "LUWxfy4lfgB5wUrqCOUisw==", - "r1VGXWeqGeGbfKjigaAS+Q==", - "ztULoqHvCOE6qV7ocqa4/w==", - "QCpzCTReHxGm5lcLsgwPCA==", - "Hst3yfyTB7yBUinvVzYROQ==", - "gf1Ypna/Tt+TZ08Y+GcvGg==", - "3rbml1D0gfXnwOs5jRZ3gA==", - "2vm7g3rk1ACJOTCXkLB3zA==", - "11FE2kknwYi2Qu0JUKMn3A==", - "1b2uf+CdVjufqiVpUShvHw==", - "0a4SafpDIe8V4FlFWYkMHw==", - "7btpMFgeGkUsiTtsmNxGQA==", - "dUx1REyXKiDFAABooqrKEA==", - "knYKU74onR6NkGVjQLezZg==", - "Scto+9TWxj1eZgvNKo+a9A==", - "cvZT1pvNbIL8TWg+SoTZdA==", - "1nXByug2eKq0kR3H3VjnWQ==", - "tG+rpfJBXlyGXxTmkceiKA==", - "7W9aF7dxnL+E8lbS/F7brg==", - "8vr+ERVrM99dp+IGnCWDGQ==", - "oFNMOKbQXcydxnp8fUNOHw==", - "uJZGw3IY2nCcdVeWW1geNQ==", - "q6LG0VzO1oxiogAAU63hyg==", - "f0H/AFSx2KLZi9kVx5BAZg==", - "1RQZ2pWSxT+RKyhBigtSFg==", - "scCQPl0em2Zmv/RQYar60g==", - "A2ODff+ImIkreJtDPUVrlg==", - "vRgkZZGVN7YZrlml0vxrKA==", - "68jPYo3znYoU4uWI7FH3/g==", - "iJ2nT8w8LuK11IXYqBK+YA==", - "54XELlPm8gBvx8D5bN3aUg==", - "PTAm/jGkie7OlgVOvPKpaA==", - "v7BrkRmK0FfWSHunTRHQFQ==", - "dVh/XMTUIx1nYN4q1iH1bA==", - "TSGL3iQYUgVg/O9SBKP9EA==", - "wTO49YX/ePHMWtcoxUAHpw==", - "bMb1ia0rElr2ZpZVhva0Jw==", - "sNmW2b2Ud7dZi3qOF8O8EQ==", - "3djRJvkZk9O2bZeUTe+7xQ==", - "I9KNZC1tijiG1T72C4cVqQ==", - "sQzCwNDlRsSH7iB9cTbBcg==", - "mk1CKDah7EzDJEdhL22B7w==", - "lON3WM0uMJ30F8poBMvAjQ==", - "88PNi9+yn3Bp4/upgxtWGA==", - "C+Ssp+v1r+00+qiTy2d7kA==", - "11U5XEwfMI7avx014LfC8g==", - "xsf0m31Am0W9eLhopAkfnA==", - "d13Rj3NJdcat0K/kxlHLFw==", - "UP7NXAE0uxHRXUAWPhto0w==", - "ZKXxq9yr7NGBOHidht34uQ==", - "Fd2fYFs8vtjws2kx1gf6Rw==", - "ojf6uL85EuEYgLvHoGhUrw==", - "KjnL3x+56r3M2pDj1pPihA==", - "WdCWezJU4JK43EOZ9YHVdg==", - "/jH6imhTPZ/tHI4gYz2+HA==", - "+OLntmlsMBBYPREPnS6iVw==", - "5lfLJAk1L3QzGMML3fOuSw==", - "AZs3v4KJYxdi8T1gjVjI2Q==", - "7pkUY2UzSbGnwLvyRrbxfA==", - "BjfOelfc1IBgmUxMJFjlbQ==", - "TcGhAJHRr7eMwGeFgpFBhg==", - "Y7iDCWYrO1coopM3RZWIPg==", - "mnalaO6xJucSiZ0+99r3Cg==", - "plXHHzA8X9QGwWzlJxhLRw==", - "Zqd6+81TwYuiIgLrToFOTQ==", - "1Pmnur6TbZ9cmemvu0+dSA==", - "OaNpzwshdHUZMphQXa6i8w==", - "WKehT4nGF2T7aKuzABDMlA==", - "4LvQSicqsgxQFWauqlcEjw==", - "BMZB1FwvAuEqyrd0rZrEzw==", - "YfbfE3WyYOW7083Y8sGfwQ==", - "46FCwqh+eMkf+czjhjworw==", - "734u4Y1R3u7UNUnD+wWUoA==", - "yf06Slv9l3IZEjVqvxP2aA==", - "bIk7Fa6SW7X18hfDjTKowg==", - "DnF6TYSJxlc+cwdfevLYng==", - "ionqS0piAOY2LeSReAz4zg==", - "hlMumZ7RJFpILuKs09ABtw==", - "NjeDgQ1nzH1XGRnLNqCmSg==", - "o7y4zQXQAryST2cak4gVbw==", - "29EybnMEO95Ng4l/qK4NWQ==", - "udU65VtsvJspYmamiOsgXw==", - "v1AWe5qb5y3vSKFb7ADeEw==", - "wK6Srd83eLigZ11Q20XGrg==", - "GmC+0rNDMIR+YbUudoNUXw==", - "W4utAK3ws0zjiba/3i91YA==", - "MlKWxeEh8404vXenBLq4bw==", - "Gdf4VEDLBrKJNQ8qzDsIyw==", - "Z9bDWIgcq6XwMoU2ECDR5Q==", - "VIkS30v268x+M1GCcq/A8A==", - "iPwX3SbbG9ez9HoHsrHbKw==", - "yKrsKX4/1B1C0TyvciNz5w==", - "BophnnMszW5o+ywgb+3Qbw==", - "eJLrGwPRa6NgWiOrw1pA7w==", - "eV+RwWPiGEB+76bqvw+hbA==", - "oad5SwflzN0vfNcyEyF4EA==", - "Uw6Iw+TP9ZdZGm2b/DAmkg==", - "9qWLbRLXWIBJUXYjYhY2pg==", - "dxWv00FN/2Cgmgq9U3NVDQ==", - "AX1HxQKXD12Yv5HWi39aPQ==", - "J0NauydfKsACUUEpMhQg8A==", - "mxug34EekabLz0JynutfBg==", - "bNq/hj0Cjt4lkLQeVxDVdQ==", - "nW3zZshjZEoM8KVJoVfnuQ==", - "ghp8sWGKWw20S/z1tbTxFg==", - "S4rFuiKLFKZ+cL7ldiTwpg==", - "8ZqmPJDnQSOFXvNMRQYG2Q==", - "6XYqR2WvDzx4fWO7BIOTjA==", - "Uo+FIhw1mfjF6/M8cE1c/Q==", - "bsHIShcLS134C+dTxFQHyA==", - "19yQHaBemtlgo2QkU5M6jQ==", - "sWLcS+m4aWk31BiBF+vfJQ==", - "BlCgDd7EYDIqnoAiKOXX6Q==", - "MrxR3cJaDHp0t3jQNThEyg==", - "cMo6l1EQESx1rIo+R4Vogg==", - "VOvrzqiZ1EHw+ZzzTWtpsw==", - "1/ZheMsbojazxt31j/l3iA==", - "0QxPAqRF8inBuFEEzNmLjA==", - "UXUNYEOffgW3AdBs7zTMFA==", - "lOPJhHqCtMRFZfWMX/vFZQ==", - "rXSbbRABEf4Ymtda45w8Fw==", - "jfegbZSZWkDoPulFomVntA==", - "hfcH5Az2M7rp+EjtVpPwsg==", - "VsXEBIaMkVftkxt1kIh7TA==", - "M20iX2sUfw5SXaZLZYlTaA==", - "VUDsc9RMS1fSM43c+Jo9dQ==", - "itPtn+JaO4i7wz2wOPOmDQ==", - "rCxoo4TP/+fupXMuIM0sDA==", - "cSHSg9xJz/3F6kc+hKXkwg==", - "b4BoZmzVErvuynxirLxn0w==", - "e4B3HmWjW+6hQzcOLru6Xg==", - "lTE6u9G/RzvmbuAzq2J2/Q==", - "897ptlztTjr7yk+pk8MT0Q==", - "jd6IpPJwOJW1otHKtKZ5Gw==", - "b4aFwwcWMXsSdgS1AdFOXA==", - "FltEN+7NKvzt+XAktHpfHA==", - "ZyDh3vCQWzS5DI1zSasXWA==", - "kcJ1acgBv6FtUhV8KuWoow==", - "zgEyxj/sCs63O98sZS94Yw==", - "/kGxvyEokQsVz0xlKzCn2A==", - "cxqHS4UbPolcYUwMMzgoOA==", - "62RHCbpGU8Hb+Ubn+SCTBg==", - "ePlsM/iOMme2jEUYwi15ng==", - "0fN+eHlbRS6mVZBbH/B9FQ==", - "k0XIjxp2vFG7sTrKcfAihA==", - "0rfG4gRugAwVP0i3AGVxxg==", - "M98hjSxCwvZ27aBaJTGozQ==", - "kzGNkWh3fz27cZer4BspUQ==", - "3CJbrUdW68E3Drhe4ahUnQ==", - "NGApiVkDSwzO45GT57GDQw==", - "lMjip5hbCjkD9JQjuhewDg==", - "GrSbnecYAC3j5gtoKntL0A==", - "9dbn0Kzwr9adCEfBJh78uQ==", - "64QzHOYX0A9++FqRzZRHlQ==", - "YZt6HwCvdI5DRQqndA/hBQ==", - "6GXHGF62/+jZ7PfIBlMxZw==", - "PBULPuFXb6V3Di713n3Gug==", - "8Cm19vJW8ivhFPy0oQXVNA==", - "zDSQ3NJuUGkVOlvVCATRwA==", - "6QAtjOK9enNLRhcVa2iaTg==", - "v/PshI6JjkL9nojLlMNfhg==", - "yTgN5xFIdz1MzFS6xMl5uQ==", - "SCO9nQncEcyVXGCtx30Jdg==", - "7b0oo4+qphu6HRvJq6qkHQ==", - "ol9xhVTG9e1wNo50JdZbOA==", - "hIABph+vhtSF5kkZQtOCTA==", - "k+IBS52XdOe5/hLp28ufnA==", - "6HnWgYNKohqhoa1tnjjU3A==", - "HDxGhvdQwGh0aLRYEGFqnw==", - "LDuBcL5r3PUuzKKZ9x6Kfw==", - "HPvYV94ufwiNHEImu4OYvQ==", - "h2cnQQF2/R3Mq2hWdDdrTg==", - "nqpKfidczdgrNaAyPi7BOQ==", - "2ywo4t5PPSVUCWDwUlOVwQ==", - "jZMDIu95ITTjaUX0pk4V5g==", - "bA2kaTpeXflTElTnQRp6GQ==", - "lwYQm2ynA3ik2gE1m11IEg==", - "5ugVOraop5P5z5XLlYPJyQ==", - "l2NppPcweAtmA1V2CNdk2Q==", - "DbWQI3H2tcJsVJThszfHGA==", - "H6HPFAcdHFbQUNrYnB74dA==", - "H1NJEI+fvOQbI51kaNQQjQ==", - "53UccFNzMi9mKmdeD82vAw==", - "lffapwUUgaQOIqLz2QPbAg==", - "rSvhrHyIlnIBlfNJqemEbw==", - "BLJk9wA88z6e0IQNrWJIVw==", - "5m1ijXEW+4RTNGZsDA/rxQ==", - "GG8a3BlwGrYIwZH9j3cnPA==", - "HhBHt5lQauNl7EZXpsDHJA==", - "/XjB6c5fxFGcKVAQ4o+OMw==", - "+tuUmnRDRWVLA+1k0dcUvg==", - "SM7E98MyViSSS9G0Pwzwyw==", - "c5q/8n7Oeffv3B1snHM/lA==", - "kwlAQhR2jPMmfLTAwcmoxw==", - "0b/xj6fd0x+aB8EB0LC4SA==", - "S8jlvuYuankCnvIvMVMzmg==", - "kZkmDatUOdIqs7GzH3nI1A==", - "obW3kzv2KBvuckU7F+tfjA==", - "pa8nkpAAzDKUldWjIvYMYg==", - "m+eh+ZqS74w2q0vejBkjaw==", - "LcoJBEPTlSsQwfuoKQUxEw==", - "KO2XVYyNZadcQv8aCNn5JA==", - "uvzmRcvgepW6mZbMfYgcNw==", - "KhUT2buOXavGCpcDOcbOYg==", - "fo3JL+2kPgDWfP+CCrFlFw==", - "wIfvvLKC61gOpsddUFjVog==", - "SPHU6ES1WVm0Mu2LB+YjrA==", - "LWWfRqgtph1XrpxF4N64TA==", - "LCvz/h9hbouXCmdWDPGWqg==", - "PXC6ZpdMH0ATis/jGW12iA==", - "z920R8eahJPiTsifrPYdxA==", - "GIHKW6plyLra0BmMOurFgA==", - "k6OmSlaSZ5CB0i7SD9LczQ==", - "YZ39RIXpeLAhyMgmW2vfkQ==", - "bs2QG8yYWxPzhtyMqO6u3A==", - "pKaTI+TfcV3p/sxbd2e7YQ==", - "xWYecfzAtXT9WyQ8NYY/hw==", - "Fz8EI+ZpYlbcttSHs5PfpA==", - "wfwuxn+Vja1DNwiDwL2pcQ==", - "wux5Y8AipBnc5tJapTzgEQ==", - "U+oTpcjhc0E+6UjP11OE/Q==", - "yTVJKBn72RjakMBXDoBKHg==", - "0TxcYwG72dT7Tg+eG8pP1w==", - "imZ+mwiT22sW2M9alcUFfg==", - "CkDIoAFLlIRXra78bxT/ZA==", - "4qMSNAxichi3ori/pR+o0w==", - "zNLlWGW/aKBhUwQZ4DZWoQ==", - "D31ZticrjGWAO45l5hFh7A==", - "HdXg64DBy5WcL5fRRiUVOg==", - "yhI5jHlfFJxu4eV5VJO2zQ==", - "e9GqAEnk8XI5ix6kJuieNQ==", - "EC0+iUdSZvmIEzipXgj7Gg==", - "chwv4+xbEAa93PHg8q9zgQ==", - "B1VVUbl8pU0Phyl1RYrmBg==", - "A+DLpIlYyCb9DaarpLN76g==", - "wHA+D5cObfV3kGORCdEknw==", - "+Mp+JIyO0XC5urvMyi3wvQ==", - "vUE8Iw3NyWXURpXyoNJdaw==", - "ParhxI6RtLETBSwB0vwChQ==", - "NxSdT2+MUkQN49pyNO2bJw==", - "JSyhTcHLTfzHsPrxJyiVrA==", - "PAlx9+U+yQCAc5Fi0BOG0w==", - "W/0s1x3Qm+wN8DhROk6FrQ==", - "L3Jt5dHQpWQk74IAuDOL8g==", - "VWb8U4jF/Ic0+wpoXi/y/g==", - "1wBuHqS1ciup31WTfm3NPg==", - "BDNM1u/9mefjuW1YM2DuBg==", - "SDi5+FoP9bMyKYp+vVv1XA==", - "23d9B9Gz5kUOi1I//EYsSQ==", - "/a9O7kWeXa0le45ab3+nVw==", - "PcoVtZrS1x1Q+6nfm4f80w==", - "A6TLWhipfymkjPYq8kaoDQ==", - "lzUQ1o7JAbdJYpmEqi6KnQ==", - "/2jGyMekNu7U136K+2N3Jg==", - "ZItMIn1vhGqAlpDHclg0Ig==", - "Ee4A3lTMLQ7iDQ7b8QP8Qg==", - "bO55S58bqDiRWXSAIUGJKw==", - "zeHF6fdeqcOId3fRUGscRw==", - "BxsDnI8jXr4lBwDbyHaYXw==", - "ylA6sU7Kaf9fMNIx1+sIlw==", - "ZWXfE3uGU91WpPMGyknmqw==", - "f1+fHgR5rDPsCZOzqrHM7Q==", - "8VqeoQELbCs232+Mu+HblA==", - "beSrliUu0BOadCWmx+yZyA==", - "NQVQfN3nIg9ipHiFh4BvfQ==", - "4wnUAbPT3AHRJrPwTTEjyw==", - "/cdR1i5TuQvO+u3Ov3b0KQ==", - "wtyAZIfhomcHe9dLbYoSvA==", - "ulpDxLeQnIRPnq6oaah2AA==", - "pdPwUHauXOowaq9hpL2yFw==", - "1+A9FCGP3bZhk6gU3LQtNg==", - "raYifKqev8pASjjuV+UTKQ==", - "+OERSmo7OQUUjudkccSMOA==", - "FeRovookFQIsXmHXUJhGOw==", - "USCvrMEm/Wqeu9oX6FrgcQ==", - "kly/2kE4/7ffbO34WTgoGg==", - "IindlAnepkazs5DssBCPhA==", - "Bq82MoMcDjIo/exqd/6UoA==", - "ocvA1/NbyxM0hanwwY6EiA==", - "rtd6mqFgGe98mqO0pFGbSw==", - "nvLEpj6ZZF3LWH3wUB6lKg==", - "AGd0rcLnQ0n+meYyJur1Pw==", - "wI7JrSPQwYHpv2lRsQu9nQ==", - "OnmvXbyT2BYsSDJYZhLScA==", - "CmBf5qchS1V3C2mS6Rl4bw==", - "TafM7nTE5d+tBpRCsb8TjQ==", - "wxkb8evGEaGf/rg/1XUWiA==", - "y1J+o6DC2sETFsySgpDZyA==", - "SVLHWPCCH7GPVCF7QApPbw==", - "HMWOlMmzocOIiJ7yG1YaDQ==", - "DJmrmNRKARzsTCKSMLmcNA==", - "/XC/FmMIOdhMTPqmy4DfUA==", - "63OTPaKM0xCfJOy9EDto+Q==", - "PxReytUUn/BbxYTFMu1r2Q==", - "WjDqf1LyFyhdd8qkwWk+MA==", - "/DiUApY7cVp5W9o24rkgRA==", - "alJtvTAD7dH/zss/Ek1DMQ==", - "xLm/bJBonpTs0PwsF0DvRg==", - "eAOEgF5N80A/oDVnlZYRAw==", - "LqgzKxbI6WTMz0AMIDJR5w==", - "MJ1FuK8PXcmnBAG9meU84A==", - "JLq/DrW2f26NaRwfpDXIEA==", - "fsrX00onlGvfsuiCc35pGg==", - "tXVb5f90k9l3e1oK2NGXog==", - "1JRgSHnfAQFQtSkFTttkqQ==", - "B0TaUQ6dKhPfSc5V/MjLEQ==", - "nkbLVLvh3ClKED97+nH+7Q==", - "avFTp3rS6z5zxQUZQuaBHQ==", - "lNF8PvUIN02NattcGi5u4g==", - "bBEndaOStXBpAK79FrgHaw==", - "dM9up4vKQV5LeX82j//1jQ==", - "4WO6eT0Rh6sokb29zSJQnQ==", - "RHKCMAqrPjvUYt13BVcmvw==", - "Ju4YwtPw+MKzpbC0wJsZow==", - "tzV7ixFH37ze4zuLILTlfA==", - "oPlhC4ebXdkIDazeMSn1fQ==", - "5pje7qyz8BRsa8U4a4rmoA==", - "7E6V6/zSjbtqraG7Umj+Jw==", - "8QK7emHS6rAcAF5QQemW/A==", - "LhqRc9oewY4XaaXTcnXIHQ==", - "p/7qM5+Lwzw1/lIPY91YxQ==", - "fy54Milpa7KZH/zgrDmMXQ==", - "LyPXOoOPMieqINtX8C9Zag==", - "aD4QvtMlr8Lk/zZgZ6zIMg==", - "dsueq9eygFXILDC7ZpamuA==", - "+mJLK+6qq8xFv7O/mbILTw==", - "nHUpYmfV59fe3RWaXhPs3Q==", - "VbCoGr8apEcN7xfdaVwVXw==", - "/2Chaw2M9DzsadFFkCu6WQ==", - "rKAQxu80Q8g1EEhW5Wh8tg==", - "RJJqFMeiCZHdsqs72J17MQ==", - "GF2yvI9UWf1WY7V7HXmKPA==", - "JyIDGL1m/w+pQDOyyeYupA==", - "wR2Gxb07nkaPcZHlEjr8iA==", - "PbDVq2Iw1eeM8c2o/XYdTA==", - "BL3buzSCV78rCXNEhUhuKQ==", - "i42XumprV/aDT5R0HcmfIQ==", - "DuEKxykezAvyaFO2/5ZmKQ==", - "6ACvJNfryPSjGOK39ov8Qg==", - "YaUKOTyByjUvp1XaoLiW5Q==", - "jNcMS2zX1iSZN9uYnb2EIg==", - "VRnx+kd6VdxChwsfbo1oeQ==", - "4Qinl7cWmVeLJgah8bcNkw==", - "Fiy3hkcGZQjNKSQP9vRqyA==", - "HaSc7MZphCMysTy2JbTJkw==", - "VhYGC8KYe5Up+UJ2OTLKUw==", - "K2gk9zWGd0lJFRMQ1AjQ/Q==", - "NfxVYc3RNWZwzh2RmfXpiA==", - "JGeqHRQpf4No74aCs+YTfA==", - "7VHlLw20dWck+I8tCEZilA==", - "V5HKdaTHjA8IzvHNd9C51g==", - "9TalxEyFgy6hFCM73hgb7Q==", - "R/y6+JJP8rzz1KITJ4qWBw==", - "7bM/pn4G7g7Zl6Xf1r62Lg==", - "CHsFJfsvZkPWDXkA6ZMsDQ==", - "uXuPA/2KJbb7ZX+NymN3dw==", - "o+nYS4TqJc6XOiuUzEpC3A==", - "8N3mhHt29FZDHn1P2WH1wQ==", - "uZ2gUA74/7Q33tI2TcGQlg==", - "8B12CamjOGzJDnQ+RkUf4w==", - "9FdpxlIFu11qIPdO7WC5nw==", - "G+sGF13VXPH4Ih6XgFEXxg==", - "y+1I05LDAYJ09tKMs3zW6g==", - "gnkadeCgjdmLdlu/AjBZJg==", - "1I+UVx3krrD4NhzO7dgfHQ==", - "8LNNoHe6rEQyJ0ebl151Mw==", - "yOE90OHQdyOfrAgwDvn2gA==", - "ayBGGPEy++biljvGcwIjXA==", - "o/Y4U6rWfsUCXJ72p5CUGw==", - "5kvyy902llnYGQdn2Py04w==", - "6k2cuk0McTThSMW/QRHfjA==", - "2XrR2hjDEvx8MQpHk9dnjw==", - "fv/PW8oexJYWf5De30fdLQ==", - "861mBNvjIkVgkBiocCUj/Q==", - "NKGY0ANVZ0gnUtzVx1pKSw==", - "4DIPP/yWRgRuFqVeqIyxMQ==", - "cgSEbLqqvDsNUyeA3ryJ6Q==", - "xbBxUP9JyY0wDgHDipBHeg==", - "c3WVxyC5ZFtzGeQlH5Gw+w==", - "ZKeTDCboOgCptrjSfgu0xw==", - "DjHszpS8Dgocv3oQkW/VZQ==", - "Iqszlv4R49UevjGxIPMhIA==", - "uChFnF0oCwARhAOz/d47eA==", - "0egBaMnAf0CQEXf1pCIKnA==", - "FnVNxl5AFH1AieYru2ZG+A==", - "2Ct+pLXrK6Ku1f4qehjurQ==", - "x2nSgcTjA3oGgI8mMgiqjw==", - "AUGmvZkpkKBry5bHZn4DJA==", - "x8kRVzohTdhkryvYeMvkMw==", - "rXfWkabSPN+23Ei1bdxfmQ==", - "ElTNyMR4Rg8ApKrPw88WPg==", - "9jxA/t3TQx8dQ+FBsn/YCg==", - "I07W2eDQwe6DVsm1zHKM8A==", - "0p1jMr06OyBoXQuSLYN4aQ==", - "odGhKtO4bDW5R8SYiI5yCg==", - "5Q/Y2V0iSVTK8HE8JerEig==", - "Ily2MKoFI1zr5LxBy93EmQ==", - "8dUcSkd2qnX5lD9B+fUe+Q==", - "80UE+Ivby3nwplO/HA7cPw==", - "sS6QcitMPdvUBLiMXkWQkw==", - "5VY++KiWgo7jXSdFJsPN3A==", - "aY6B28XdPnuYnbOy9uSP8A==", - "ZfRlID+pC1Rr4IY14jolMw==", - "/YuQw7oAF08KDptxJEBS9g==", - "16d+fhFlgayu3ttKVV/pbg==", - "8dBIsHMEAk7aoArLZKDZtg==", - "wRqaDZVHHurp5whOQ1kDbQ==", - "lFUq6PGk9dBRtUuiEW7Cug==", - "FoJZ61VrU8i084pAuoWhDQ==", - "4mig4AMLUw+T/ect9p4CfA==", - "Po0lhBfiMaXhl+vYh1D8gA==", - "z9cd+Qj+ueX34Zf3997MNQ==", - "1dsKN1nG6upj7kKTKuJWsQ==", - "UtLYUlQJ02oKcjNR3l+ktg==", - "O538ibsrI4gkE5tfwjxjmg==", - "G736AX070whraDxChqUrqw==", - "THs1r8ZEPChSGrrhrNTlsA==", - "pVG1hL96/+hQ+58rJJy6/A==", - "1BjsijOzgHt/0i36ZGffoQ==", - "6rIWazDEWU5WPZHLkqznuQ==", - "cdWUm6uLNzR/knuj2x75eA==", - "nsnX3tKkN1elr18E31tXDw==", - "0fnruVOCxEczscBuv4yL9A==", - "SVuEYfQ9FGyVMo1672n0Yg==", - "ZRWyfXyXqAaOEjkzWl949Q==", - "S2MAIYeDQeJ1pl9vhtYtUg==", - "vsRNZx4thFFFPneubKq1Fw==", - "kuWGANwzNRpG4XmY7KjjNg==", - "i6r+mZfyhZyqlYv56o0H+w==", - "wqWqe0KRjZlUIrGgEOG9Mg==", - "t5wh9JGSkQO78QoQoEqvXA==", - "AGoVLd0QPcXnTedT5T95JQ==", - "aRrcmH+Ud3mF1vEXcpEm4w==", - "C65PZm8rZxJ6tTEb6d08Eg==", - "oAHVGBSJ2cf4dVnb/KEYmw==", - "BuDVDLl0OGdomEcr+73XhQ==", - "bLsStF0DDebpO+xulqGNtg==", - "xukOAM0QVsA72qEy0yku9A==", - "LpoayYsTO8WLFLCSh2kf2w==", - "LEVYAE54618FrlXkDN01Kw==", - "Jm862vBTCYbv/V4T1t46+Q==", - "X4kdXUuhcUqMSduqhfLpxA==", - "cLR0Ry4/N5swqga1R6QDMw==", - "0klouNfZRHFFpdHi4ZR2hA==", - "JGx8sTyvr4bLREIhSqpFkw==", - "ZiJ/kJ9GneF3TIEm08lfvQ==", - "hP7dSa8lLn9KTE/Z0s4GVQ==", - "600bwlyhcy754W1E6tuyYg==", - "U49SfOBeqQV9wzsNkboi8Q==", - "5DDb7fFJQEb3XTc3YyOTjg==", - "6uT7LZiWjLnnqnnSEW4e/Q==", - "tq5xUJt8GtjDIh1b48SthQ==", - "eJFIQh/TR7JriMzYiTw4Sg==", - "jdRzkUJrWxrqoyNH9paHfQ==", - "RKVDdE1AkILTFndYWi9wFg==", - "AEpTVUQhIEJGlXJB6rS26A==", - "PD+yHtJxZJ2XEvjIPIJHsQ==", - "dOS+mVCy3rFX9FvpkTxGXA==", - "lz+SeifYXxamOLs1FsFmSQ==", - "QTz21WkhpPjfK8YoBrpo+w==", - "9wUIeSgNN36SFxy8v2unVg==", - "ash1r2J6B0PUxJe8P0otVQ==", - "y7yS9x3yshVhMpDbQtfYOQ==", - "f07bdNVAe9x+cAMdF1bByQ==", - "N2KovXW14hN/6+iWa1Yv3g==", - "2DNbXVgesUa7PgYQ4zX5Lw==", - "WQznrwqvMhUlM3CzmbhAOQ==", - "FpWDTLTDmkUhH/Sgo+g1Gg==", - "OVHqwV8oQMC5KSMzd5VemA==", - "Bv4mNIC72KppYw/nHQxfpQ==", - "MI+HSMRh8KTW+Afiaxd/Fw==", - "10OltdxPXOvfatJuwPVKbQ==", - "y4/HohCJxtt+cT7nLJB08w==", - "RhcqXY4OsZlVVF7ZlkTeRw==", - "/mrqas0eDX+sFUNJvCQY8g==", - "ZIZx4MehWTVXPN9cVQBmyA==", - "z20AAnvj7WsfJeOu3vemlA==", - "dL6n/JsK+Iq6UTbQuo/GOw==", - "rMm9bHK69h0fcMkMdGgeeA==", - "ftsf2qztw3NC78ep/CZXWQ==", - "/n1RLTTVpygre1dl36PDwQ==", - "/FsJYFNe+7UvsSkiotNJEQ==", - "Yy2pPhITTmkEwoudXizHqQ==", - "lizovLQxu6L9sbafNQuShQ==", - "XV5MYe0Q7YMtoBD6/iMdSw==", - "5jHgQF4SfO/zy9xy9t+9dw==", - "16iT/jCcPDrJEfi2bE5F+Q==", - "syeBfQBUmkXNWCZ1GV8xSA==", - "sr3UXbMg5zzkRduFx/as7g==", - "xUXEE7OBBCudsQnuj5ycOA==", - "ojZY7Gi2QJXE/fp6Wy31iA==", - "RlNPyhgYOIn28R4vKCVtYA==", - "KOm8PTa+ICgDrgK9QxCJZw==", - "DJoy1NSZZw87oxWGlNHhfg==", - "jEdanvXKyZdZJG6mj/3FWw==", - "Omr+zPWVucPCSfkgOzLmSQ==", - "71w3aSvuh2mBLtdqJCN3wA==", - "xjTMO2mvtpvwQrounD4e8g==", - "Zz/5VMbw1TqwazReplvsEg==", - "hIjgi20+km+Ks23NJ4VQ6Q==", - "00TVKawojyqrJkC7YqT41Q==", - "YgVpC5d5V6K/BpOD663yQA==", - "wX70jKLKJApHnhyK0r6t3A==", - "lacCCRiWdquNm4YRO7FoKA==", - "cWdlhVZD7NWHUGte24tMjg==", - "t5U+VMsTtlWAAWSW+00SfQ==", - "AMfL0rH+g8c0VqOUSgNzQw==", - "0G93AxGPVwmr66ZOleM90A==", - "9tiibT8V9VwnPOErWGNT3w==", - "+dBv88reDrjEz6a2xX3Hzw==", - "xX6atcCApI08oVLjjLteLg==", - "+YrqTEJlJCv0A2RHQ8tr1A==", - "aqcOby9QyEbizPsgO3g0yw==", - "s/BZAhh1cTV3JCDUQsV8mA==", - "x9VwDdFPp/rJ+SF16ooWYg==", - "k/OVIllJvW6BefaLEPq7DA==", - "rIMXaCaozDvrdpvpWvyZOQ==", - "qQQwJ/aF87BbnLu3okXxaw==", - "TIWSM78m0RprwgPGK/e0JA==", - "r/b5px/UImGNjT/X5sYjuA==", - "7K8l6KoP0BH82/WMLntfrg==", - "gEHGeR2F82OgBeAlnYhRSw==", - "1/SGIab+NnizimUmNDC4wA==", - "WADmxH7R6B4LR+W6HqQQ6A==", - "pcoBh5ic7baSD4TZWb3BSw==", - "es/L9iW8wsyLeC5S4Q8t+g==", - "D175i+2bZ7aWa4quSSkQpA==", - "WQMffxULFKJ+bun6NrCURA==", - "82hTTe1Nr4N2g7zwgGjxkw==", - "oyYtf08AkWLR52bXm5+sKw==", - "8uP4HUnSodw88yoiWXOIcw==", - "x2NpqNnqRihktNzpxmepkQ==", - "x5zMDuW66467ofgL3spLUQ==", - "OMO4pqzfcbQ11YO4nkTXfg==", - "N4/mQFyhDpPzmihjFJJn6w==", - "NN/ymVQNa17JOTGr6ki3eQ==", - "htDbVu1xGhCRd8qoMlBoMg==", - "S47hklz3Ow+n5aY6+qsCoA==", - "ji+1YHlRvzevs3q5Uw1gfA==", - "3Y4w0nETru3SiSVUMcWXqw==", - "XfBOCJwi2dezYzLe316ivw==", - "kMUdiwM7WR8KGOucLK4Brw==", - "V/xG5QFyx1pihimKmAo8ZA==", - "sQskMBELEq86o1SJGQqfzg==", - "6+jhreeBLfw64tJ+Nhyipw==", - "8iYdEleTXGM+Wc85/7vU9w==", - "D7piVoB2NJlBxK5owyo4+g==", - "hDGa2yLwNvgBd/v6mxmQaQ==", - "WLsh3UF4WXdHwgnbKEwRlQ==", - "D5jaV+HtXkSpSxJPmaBDXg==", - "jCgdKXsBCgf7giUKnr6paQ==", - "XqW7UBTobbV4lt1yfh0LZw==", - "EbGG4X18upaiVQmPfwKytg==", - "dXDPnL1ggEoBqR13aaW9HA==", - "Vik8tGNxO0xfdV0pFmmFDw==", - "Swjn3YkWgj0uxbZ1Idtk+A==", - "JPxEncA4IkfBDvpjHsQzig==", - "F5FcNti7lUa9DyF2iEpBug==", - "HJYgUxFZ66fRT8Ka73RaUg==", - "Jbxl8Nw1vlHO9rtu0q/Fpg==", - "fmC+85h5WBuk8fDEUWPjtQ==", - "dZgMquvZmfLqP4EcFaWCiA==", - "XF/yncdoT4ruPeXCxEhl9Q==", - "QJEbr3+42P9yiAfrekKdRQ==", - "Sr9c0ReRpkDYGAiqSy683g==", - "Nr4zGo5VUrjXbI8Lr4YVWQ==", - "NDZWIhhixq7NT8baJUR4VQ==", - "GFRJoPcXlkKSvJRuBOAYHQ==", - "WHutPin+uUEqtrA7L8878A==", - "2rhjiY0O0Lo36wTHjmlNyw==", - "XsF7R12agx/KkRWl0TyXRA==", - "R6cO8GzYfOGTIi773jtkXw==", - "zrZWcqQsUE3ocWE0fG+SOA==", - "uNzpptKjihEfKRo5A1nWmw==", - "gICaI06E9scnisonpvqCsA==", - "TA9WjiLAFgJubLN4StPwLw==", - "sBpytpE38xz0zYeT+0qc2A==", - "Ej7W3+67kCIng3yulXGpRQ==", - "nR3ACzeVF5YcLX6Gj6AGyQ==", - "b0vZfEyuTja2JYMa20Rtbg==", - "f1h+Vp+xmdZsZIziHrB2+g==", - "WzjvUJ4jZAEK7sBqw+m07A==", - "OzMR5D2LriC5yrVd5hchnA==", - "cw1gBLtxH/m4H7dSM7yvFg==", - "CZbd+UoTz0Qu1kkCS3k8Xg==", - "WtT0QAERZSiIt2SFDiAizg==", - "QsquNcCZL9wv7oZFqm64vQ==", - "FXzaxi3nAXBc8WZfFElQeA==", - "Ml3mi1lGS1IspHp3dYYClg==", - "XGAXhUFjORwKmAq9gGEcRg==", - "wOhbpTzmFla8R0kI9OiHaA==", - "qoK2keBg3hdbn7Q24kkVXg==", - "ZAQHWU6RMg4IadOxuaukyw==", - "RiahBXX2JbPzt8baPiP/8g==", - "Qx6rVv9Xj8CBjqikWI9KFA==", - "ZRnR6i+5WKMRfs3BDRBCJg==", - "91LQuW6bMSxl10J/UDX23A==", - "0dIeIM5Zvm5nSVWLy94LWg==", - "Ja3ECL7ClwDrWMTdcSQ6Ug==", - "f6iLrMpxKhFxIlfRsFAuew==", - "iSeH0JFSGK73F470Rhtesw==", - "DwOTyyCoUfaSShHZx9u6xg==", - "rdeftHE7gwAT67wwhCmkYQ==", - "kUhyc3G8Zvx8+q5q5nVEhw==", - "W8bATujVUT80v2XGJTKXDg==", - "dMRx4Mf6LrN64tiJuyWmDw==", - "9cvHJmim9e0pOaoUEtiM6A==", - "RHToSGASrwEmvzjX6VPvNQ==", - "V7eji28JSg3vTi30BCS7gw==", - "4+htiqjEz9oq0YcI/ErBVg==", - "jKJn4czwUl/6wtZklcMsSg==", - "bvyB6OEwhwCIfJ6KRhjnRw==", - "59ipbMH7cKBsF9bNf4PLeQ==", - "M/cQja3uIk1im9++brbBOA==", - "AChOz8avRYsvxlbWcorQ3w==", - "FcKjlHKfQAGoovtpf+DxWQ==", - "y+cl1/Knb9MZPz8nBB0M+w==", - "b8BZV1NfBdLi70ir4vYvZg==", - "aFJuE/s+Kbge4ppn+wulkA==", - "CWBGcRFYwZ0va6115vV/oQ==", - "glnqaRfwm6NxivtB2nySzw==", - "mPk1IsU5DmDFA/Ym5+1ojw==", - "LGwcvetzQ3QqKjNh5vA8vw==", - "yctId8ltkl3+xqi9bj+RqA==", - "spJI3xFUlpCDqzg0XCxopA==", - "V8m51xgUgywRoV6BGKUrgg==", - "rgcXxjx3pDLotH7TTfAoZw==", - "/TSsi/AwKHtP6kQaeReI3w==", - "8dbyfox/isKLsnVjQNsEXg==", - "MOrAbuJTyGKPC6MgYJlx5Q==", - "uNWFZlP7DA96sf+LWiAhtQ==", - "hNHqznsrIVRSQdII6crkww==", - "GT6WUDXiheKAM7tPg3he9A==", - "JC8Q+8yOJ52NvtVeyHo68w==", - "HMQarkPWOUDIg5+5ja2dBQ==", - "nknBKPgb7US42v8A0fTl/w==", - "fDOUzPTU2ndpbH0vgkgrJQ==", - "GTNttXfMniNhrbhn92Aykg==", - "D2JcY4zWwqaCKebLM8lPiQ==", - "/c34NtdUZAHWIwGl3JM8Tw==", - "/G26n5Xoviqldr5sg/Jl3w==", - "GF0lY77rx1NQzAsZpFtXIQ==", - "BMOi5JmFUg5sCkbTTffXHw==", - "R+beucURp/H5jLs4kW6wmg==", - "xfYZ6qhWNBqqJ0PdWRjOwA==", - "Ahpi9+nl13kPTdzL+jgqMw==", - "oIU19xAvLJwQSZzIH577aA==", - "50xwiYvGQytEDyVgeeOnMg==", - "M0ESOGwJ4WZ4Ons1ljP0bQ==", - "fS471/rN4K2m10mUwGFuLg==", - "RrE3B3X/SJi3CqCUlTYwaw==", - "oDca3JEdRb4vONT9GUUsaQ==", - "pHo1O5zrCHCiLvopP2xaWw==", - "7sCJ4RxbxRqVnF4MBoKfuQ==", - "7R5rFaXCxM3moIUtoCfM2g==", - "4rrSL6N0wyucuxeRELfAmw==", - "9Gkw+hvsR/tFY1cO89topg==", - "aw4CzX8pYbPVMuNrGCEcWg==", - "KyLQxi5UP+qOiyZl0PoHNQ==", - "T1pMWdoNDpIsHF8nKuOn2A==", - "Qv6wWP4PpycDGxe7EZNSCw==", - "ZJc7GV0Yb6MrXkpDVIuc8g==", - "aXrbsro7KLV8s4I4NMi4Eg==", - "7k5rBuh8FbTTI4TP87wBPQ==", - "NRyFx6jqO/oo9ojvbYzsAg==", - "P7eMlOz9YUcJO+pJy0Kpkw==", - "jpjpNjL1IKzJdGqWujhxCw==", - "9k1u/5TgPmXrsx3/NsYUhg==", - "c1wbFbN7AdUERO/xVPJlgw==", - "Yw4ztKv6yqxK9U1L0noFXg==", - "GnJKlRzmgKN9vWyGfMq3aA==", - "91VcAVv7YDzkC1XtluPigw==", - "h1NNwMy0RjQmLloSw1hvdg==", - "pzC8Y0Vj9MPBy3YXR32z6w==", - "UTmTgvl+vGiCDQpLXyVgOg==", - "CzWhuxwYbNB/Ffj/uSCtbw==", - "VOB+9Bcfu8aHKGdNO0iMRw==", - "X2Tawm2Cra6H7WtXi1Z4Qw==", - "6cTETZ9iebhWl+4W5CB+YQ==", - "X4hrgqMIcApsjA9qOWBoCw==", - "1buQEv2YlH/ljTgH0uJEtw==", - "FH5Z60RXXUiDk+dSZBxD3g==", - "FI2WhaSMb3guFLe3e9il8Q==", - "O/EizzJSuFY8MpusBRn7Tg==", - "b6rrRA0W247O+FfvDHbVCQ==", - "ng1Q0A7ljho3TUWWYl46sw==", - "1Ym0lyBJ9aFjhJb/GdUPvQ==", - "+OXdvbTxHtSoLg7bZMho4w==", - "cuQslgfqD2VOMhAdnApHrA==", - "pCQmlnn3BxhsV2GwqjRhXg==", - "6PzjncEw2wHZg7SP7SQk9w==", - "nqtQI1bSM7DCO9P1jGV97Q==", - "O1ckWUwuhD44MswpaD6/rw==", - "RUmhye56tQu9xXs4SRJpOQ==", - "llujnWE17U8MIHmx4SbrSA==", - "UwqBVd4Wfias4ElOjk2BzQ==", - "kBAB2PSjXwqoQOXNrv80AA==", - "w1zN28mSrI/gqHsgs4ME3A==", - "301utVPZ93AnPLYbsiJggw==", - "qIFpKKwUmztsBpJgMaVvSg==", - "QmcURiMzmVeUNaYPSOtTTg==", - "x/MpsQvziUpW40nNUHDS5Q==", - "t1O9jSNjg4DTIv/Za4NbtA==", - "1B5gxGQSGzVKoNd5Ol4N7g==", - "81iQLU+YwxNwq4of6e9z7A==", - "x0eIHCvQLd2jdDaXwSWTYQ==", - "96ORaz1JRHY1Gk8H74+C2g==", - "bNDKcFu8T5Y6OoLSV+o/Sw==", - "WrJMOuXSLKKzgmIDALkyNw==", - "+gpHnUj2GWocP74t5XWz4w==", - "z5DveTu377UW8IHnsiUGZg==", - "irnD9K8bsT+up/JUrxPw6A==", - "ginkFyNVMwkZLE49AbfqfA==", - "2hEzujfG3mR5uQJXbvOPTQ==", - "E9yeifEZtpqlD0N3pomnGw==", - "OpC/sL320wl5anx6AVEL+A==", - "D7wN7b5u5PKkMaLJBP9Ksw==", - "83WGpQGWyt6mCV+emaomog==", - "X6ulLp4noBgefQTsbuIbYQ==", - "BH+rkZWQjTp7au6vtll/CQ==", - "Ex3x5HeDPhgO2S9jjCFy4g==", - "YNqIHCmBp/EbCgaPKJ7phw==", - "312g8iTB9oJgk/OqcgR7Cw==", - "LcF0OqPWrcpHby8RwXz1Yg==", - "gaEtlJtD6ZjF5Ftx0IFt0A==", - "bvbMJZMHScwjJALxEyGIyg==", - "StoXC7TBzyRViPzytAlzyQ==", - "XqFSbgvgZn0CpaZoZiRauQ==", - "AqHVaj3JcR44hnMzUPvVYg==", - "jTg9Y6EfpON4CRFOq0QovA==", - "q/siBRjx6wNu+OTvpFKDwA==", - "goSgZ8N5UbT5NMnW3PjIlQ==", - "9onh6QKp70glZk9cX3s34A==", - "o5XVEpdP4OXH0NEO4Yfc/A==", - "a5gZ5uuRrXEAjgaoh7PXAg==", - "PaROi5U16Tk35p0EKX5JpA==", - "dtnE401dC0zRWU0S/QOTAg==", - "7J3FoFGuTIW36q0PZkgBiw==", - "hiYg+aVzdBUDCG0CXz9kCw==", - "vhdFtKVH4bVatb4n8KzeXw==", - "DWKsPfKDAtfuwgmc2dKUNg==", - "M2JMnViESVHTZaru6LDM6w==", - "G/PA+kt0N+jXDVKjR/054A==", - "6rqK8sjLPJUIp7ohkEwfZg==", - "wajwXfWz2J+O+NVaj6j2UQ==", - "C4QEzQKGxyRi2rjwioHttA==", - "N/HgDydvaXuJvTCBhG/KtA==", - "6erpZS36qZRXeZ9RN9L+kw==", - "bbBsi6tXMVWyq3SDVTIXUg==", - "aySnrShOW4/xRSzl/dtSKQ==", - "rxfACPLtKXbYua18l3WlUw==", - "L4+C6I7ausPl6JbIbmozAg==", - "R3ijnutzvK6IKV3AKHQZSA==", - "leDlMcM+B1mDE8k5SWtUeg==", - "KGI/cXVz6v6CfL8H6akcUQ==", - "NtwqUO3SKZE/9MXLbTJo/g==", - "dJHKDkfMFJeoULg7U4wwDQ==", - "IEz72W2/W8xBx5aCobUFOQ==", - "wUYhs4j3W9nIywu1HIv2JA==", - "GzbeM7snhe+M+J7X+gAsQw==", - "3/1puZTGSrD9qNKPGaUZww==", - "eKQCVzLuzoCLcB4im8147A==", - "CCK+6Dr72G3WlNCzV7nmqw==", - "CJoZn5wdTXbhrWO5LkiW0g==", - "bJ1cZW7KsXmoLw0BcoppJg==", - "OlpA9HsF8MBh7b45WZSSlg==", - "JZRjdJLgZ+S0ieWVDj8IJg==", - "uhT12XY79CtbwhcSfAmAXQ==", - "isep9d+Q7DEUf0W7CJJYzw==", - "K9A87aMlJC8XB9LuFM913g==", - "uqe3rFveJ2JIkcZQ3ZMXHQ==", - "0e8hM3E5tnABRyy29A8yFw==", - "4iiCq+HhC+hPMldNQMt0NA==", - "X4o0OkTz0ec70mzgwRfltA==", - "1E3pMgAHOnHx3ALdNoHr8Q==", - "xNilc7UOu1kyP0+nK5MrLw==", - "DQlZWBgdTCoYB1tJrNS5YQ==", - "iruDC5MeywV4yA8o1tw/KQ==", - "z+1oDVy8GJ5u/UDF+bIQdA==", - "uExgqZkkJnZj252l5dKAGg==", - "ZgdpqFrVGiaHkh9o3rDszg==", - "5N2oi2pB69NxeNt08yPLhw==", - "G37U8XTFyshfCs7qzFxATg==", - "0ZEC3hy411LkOhKblvTcqg==", - "ITZ3P47ALS0JguFms6/cDA==", - "WWN44lbUnEdHmxSfMCZc6w==", - "r2f2MyT+ww1g9uEBzdYI1w==", - "ZvvxwDd0I6MsYd7aobjLUA==", - "uQs79rbD/wEakMUxqMI48A==", - "022B0oiRMx8Xb4Af98mTvQ==", - "afMd/Hr3rYz/l7a3CfdDjg==", - "xmsYnsJq78/f9xuKuQ2pBQ==", - "dFetwmFw+D6bPMAZodUMZQ==", - "TBQpcKq2huNC5OmI2wzRQw==", - "skrQRB9xbOsiSA19YgAdIQ==", - "anyANMnNkUqr3JuPJz5Qzw==", - "6QUGE2S8oFYx4T4nW56cCw==", - "rwtF86ZAbWyKI6kLn4+KBw==", - "6txm8z4/LGCH0cpaet/Hsg==", - "wdRyYjaM11VmqkkxV/5bsA==", - "+k5lDb+QdNc9iZ01hL5yBg==", - "k/pBSWE2BvUsvJhA9Zl5uw==", - "jQjyjWCEo9nWFjP4O8lehw==", - "R6Me6sSGP5xpNI8R0xGOWw==", - "9+hjTVMQUsvVKs7Tmp52tg==", - "VQIpquUqmeyt/q6OgxzduQ==", - "KXvdjZ3rRKn60djPTCENGA==", - "5HovoyHtul8lXh+z8ywq9A==", - "1+XWdu4qCqLLVjqkKz3nmA==", - "LCj4hI520tA685Sscq6uLw==", - "b53qqLnrTBthRXmmnuXWvw==", - "WTr3q/gDkmB4Zyj7Ly20+w==", - "FbxScyuRacAQkdQ034ShTA==", - "qaTdVEeZ6S8NMOxfm+wOMA==", - "ZNrjP1fLdQpGykFXoLBNPw==", - "/Bwpt5fllzDHq2Ul6v86fA==", - "/mFp3GFkGNLhx2CiDvJv4A==", - "RppDe/WGt1Ed6Vqg1+cCkQ==", - "6M6QapJ5xtMXfiD3bMaiLA==", - "Ghuj9hAyfehmYgebBktfgA==", - "GncGQgmWpI/fZyb/6zaFCg==", - "R1TCCfgltnXBvt5AiUnCtQ==", - "5NEP7Xt7ynj6xCzWzt21hQ==", - "4yEkKp2FYZ09mAhw2IcrrA==", - "y2Tn2gmhKs5WKc01ce74rg==", - "wnfYUctNK+UPwefX5y4/Rw==", - "BV1moliPL15M14xkL+H1zw==", - "80C9TB9/XT1gGFfQDJxRoA==", - "yL1DwlIIREPuyuCFULi0uw==", - "D09afzGpwCEH0EgZUSmIZA==", - "eCy/T+a8kXggn1L8SQwgvA==", - "+dIEf5FBrHpkjmwUmGS6eg==", - "kzXsrxWRnWhkA82LsLRYog==", - "Nf9fbRHm844KZ2sqUjNgkA==", - "XAq/C+XyR6m3uzzLlMWO5Q==", - "jiV+b/1EFMnHG6J0hHpzBg==", - "HK0yf7F97bkf1VYCrEFoWA==", - "Cz1G77hsDtAjpe0WzEgQog==", - "xdCCdP8SNBOK3IsX6PiPQA==", - "8snljTGo/uICl9q0Hxy7/A==", - "sLdxIKap0ZfC3GpUk3gjog==", - "IA1jmtfpYkz/E2wD0+27WA==", - "PPa7BDMpRdxJdBxkuWCxKA==", - "CuGIxWhRLN7AalafBZLCKQ==", - "MWcV03ULc0vSt/pFPYPvFA==", - "QVwuN66yPajcjiRnVk/V8g==", - "aLY2pCT0WfFO5EJyinLpPg==", - "dGrf9SWJ13+eWS6BtmKCNw==", - "YtZ8CYfnIpMd2FFA5fJ+1Q==", - "Umd+5fTcxa3mzRFDL9Z8Ww==", - "Al8+d/dlOA5BXsUc5GL8Tg==", - "/KYZdUWrkfxSsIrp46xxow==", - "kr8tw1+3NxoPExnAtTmfxg==", - "PwvPBc+4L73xK22S9kTrdA==", - "VWNDBOtjiiI4uVNntOlu/A==", - "lJFPmPWcDzDp5B2S8Ad8AA==", - "Mofqu40zMRrlcGRLS42eBw==", - "BuENxPg7JNrWXcCxBltOPg==", - "nmD7fEU4u7/4+W/pkC4/0Q==", - "axEl7xXt/bwlvxKhI7hx4g==", - "W04GeDh+Tk/I1S85KlozRA==", - "tVw8U1AsslIFmQs4H1xshg==", - "TSPFvkgw6uLsJh66Ou0H9w==", - "IYIbEaErHoFBn8sTT9ICIQ==", - "WBu0gJmmjVdVbjDmQOkU6w==", - "ZgjifTVKmxOieco81gnccQ==", - "ZrCnZB/U/vcqEtI1cSvnww==", - "2D6yhuABiaFFoXz0Lh0C+w==", - "SfwnYZCKP1iUJyU1yq4eKg==", - "tsiqwelcBAMU/HpLGBtMGw==", - "S9L29U2P5K8wNW+sWbiH7w==", - "sGLPmr568+SalaQr8SE/PA==", - "Hm6MG6BXbAGURVJKWRM6ZA==", - "euxzbIq4vfGYoY3s1QmLcw==", - "/FchS2nPezycB8Bcqc2dbg==", - "ZKvox7BaQg4/p5jIX69Umw==", - "HkbdaMuDTPBDnt3wAn5RpQ==", - "eddhS+FkXxiUnbPoCd5JJw==", - "Muf2Eafcf9G3U2ZvQ9OgtQ==", - "a7Pv1SOWYnkhIUC22dhdDA==", - "O839JUrR+JS30/nOp428QA==", - "2qK2ZEY9LgdKSTaLf6VnLA==", - "BTiGLT6XdZIpFBc91IJY6g==", - "EqYq2aVOrdX5r7hBqUJP7g==", - "SIuKH/Qediq0TyvqUF93HQ==", - "c5ymZKqx/td1MiS2ERiz9A==", - "rqucO37p86LpzehR/asCSQ==", - "1tpM0qgdo7JDFwvT0TD78g==", - "Ar1Eb/f/LtuIjXnnVPYQlA==", - "V8q+xz4ljszLZMrOMOngug==", - "P5WPQc5NOaK7WQiRtFabkw==", - "Xo8ZjXOIoXlBjFCGdlPuZw==", - "jTmPbq+wh30+yJ/dRXk1cA==", - "KSumhnbKxMXQDkZIpDSWmQ==", - "Kh/J1NpDBGoyDU+Mrnnxkg==", - "3BjLFon1Il0SsjxHE2A1LQ==", - "dml2gqLPsKpbIZ93zTXwCQ==", - "ZyoaR1cMiKAsElmYZqKjLA==", - "vnOJ3e9Zd4wPx8PX7QgZzQ==", - "2melaInV0wnhBpiI3da6/A==", - "mUek9NkXm8HiVhQ6YXiyzA==", - "RZTpYKxOAH9JgF1QFGN+hw==", - "a/Y6IAVFv0ykRs9WD+ming==", - "yhRi5M9Etuu9HSu4d24i3w==", - "+1gcqAqaRZwCj5BGiZp3CA==", - "o1zeXHJEKevURAAbUE/Vog==", - "cvOg7N4DmTM+ok1NBLyBiQ==", - "uPdjKJIGzN7pbGZDZdCGaA==", - "REnDNe9mGfqVGZt+GdsmjQ==", - "XqTK/2QuGWj50tGmiDxysA==", - "bL2FuwsPT7a7oserJQnPcw==", - "uO+uK1DntCxVRr1KttfUIw==", - "Xconi1dtldH90Wou9swggw==", - "HRF3WL/ue3/QlYyu7NUTrA==", - "5LuFDNKzMd2BzpWEIYO2Ww==", - "dNTU+/2DdZyGGTdc+3KMhQ==", - "H+NHjk/GJDh/GaNzMQSzjg==", - "/Ph/6l/lFNVqxAje1+PgFA==", - "4WRdAjiUmOQg2MahsunjAg==", - "j+lDhAnWAyso+1N8cm85hQ==", - "nFBXCPeiwxK9mLXPScXzTA==", - "vGKknndb4j6VTV8DxeT4fQ==", - "fdqt93OrpG13KAJ5cASvkg==", - "1MIn73MLroxXirrb+vyg2Q==", - "Q7teXmTHAC5qBy+t7ugf0w==", - "bWwtTFlhO3xEh/pdw0uWaQ==", - "Omi2ZB9kdR1HrVP2nueQkA==", - "+ZozWaPWw8ws1cE5DJACeg==", - "3FH4D31nKV13sC9RpRZFIg==", - "4kXlJNuT79XXf1HuuFOlHw==", - "36XDmX6j542q+Oei1/x0gw==", - "MqqDg9Iyt4k3vYVW5F+LDw==", - "cvrGmub2LoJ+FaM5HTPt9A==", - "uC2lzm7HaMAoczJO6Z/IhQ==", - "MnStiFQAr3QlaRZ02SYGaQ==", - "ZuayB6IpbeITokKGVi9R5w==", - "FtxpWdhEmC6MT61qQv4DGA==", - "KujFdhhgB9q4oJfjYMSsLg==", - "ZV8mEgJweIYk0/l0BFKetA==", - "gDLjxT7vm07arF4SRX5/Vg==", - "/MEOgAhwb7F0nBnV4tIRZA==", - "k2KP9oPMnHmFlZO6u6tgyw==", - "fbTm027Ms0/tEzbGnKZMDA==", - "HOi+vsGAae4vhr+lJ5ATnQ==", - "9Bet5waJF5/ZvsYaHUVEjQ==", - "Wd0dOs7eIMqW5wnILTQBtg==", - "z/e5M2lE9qh3bzB97jZCKA==", - "b16O4LF7sVqB7aLU2f3F1A==", - "lsBTMnse2BgPS6wvPbe7JA==", - "0nOg18ZJ/NicqVUz5Jr0Hg==", - "MFeXfNZy6Q9wBfZmPQy3xg==", - "ksOFI9C7IrDNk4OP6SpPgw==", - "NquRbPn8fFQhBrUCQeRRoQ==", - "ccmy4GVuX967KaQyycmO0w==", - "DY0IolKTYlW+jbKLPAlYjQ==", - "aJFbBhYtMbTyMFBFIz/dTA==", - "9pdeedz1UZUlv8jPfPeZ1g==", - "qZ2q5j2gH3O56xqxkNhlIA==", - "N7fHwb397tuQHtBz1P80ZQ==", - "uOkMpYy/7DYYoethJdixfQ==", - "E9ajQQMe02gyUiW3YLjO/A==", - "dFSavcNwGd8OaLUdWq3sng==", - "TAD0Lk95CD86vbwrcRogaQ==", - "jLI3XpVfjJ6IzrwOc4g9Pw==", - "CzP13PM/mNpJcJg8JD3s6w==", - "GSWncBq4nwomZCBoxCULww==", - "9k17UqdR1HzlF7OBAjpREA==", - "TrWS+reCJ0vbrDNT5HDR9w==", - "CXMKIdGvm60bgfsNc+Imvg==", - "6NP81geiL14BeQW6TpLnUA==", - "hW9DJA1YCxHmVUAF7rhSmQ==", - "8M0kSvjn5KN8bjsMdUqKZQ==", - "eS/vTdSlMUnpmnl1PbHjyw==", - "h2B0ty0GobQhDnFqmKOpKQ==", - "n7KL1Kv027TSxBVwzt9qeA==", - "yYmnM/WOgi+48Rw7foGyXA==", - "FhthAO5IkMyW4dFwpFS7RA==", - "81ZH3SO0NrOO+xoR/Ngw1g==", - "t7HaNlXL16fVwjgSXmeOAQ==", - "N+K1ibXAOyMWdfYctNDSZQ==", - "yQCLV9IoPyXEOaj3IdFMWw==", - "3+zsjCi7TnJhti//YXK35w==", - "600mjiWke4u0CDaSQKLOOg==", - "K4VS+DDkTdBblG93l2eNkA==", - "5KOgetfZR+O2wHQSKt41BQ==", - "kj5WqpRCjWAfjM7ULMcuPQ==", - "AxEjImKz4tMFieSo7m60Sg==", - "jp5Em/0Ml4Txr1ptTUQjpg==", - "jQVlDU+HjZ2OHSDBidxX5A==", - "4NHQwbb3zWq2klqbT/pG6g==", - "PeJS+mXnAA6jQ0WxybRQ8w==", - "l6Ssc04/CnsqUua9ELu2iQ==", - "nFPDZGZowr3XXLmDVpo7hg==", - "yYBIS9PZbKo7Gram7IXWPA==", - "/HU2+fBqfWTEuqINc0UZSA==", - "adT+OjEB2kqpeYi4kQ6FPg==", - "GW1Uaq622QamiiF24QUA0g==", - "rTwJggSxTbwIYdp07ly0LA==", - "4yrFNgqWq17zVCyffULocA==", - "vvh9vAIrXjIwLVkuJb5oDQ==", - "C7UaoIEXsVRxjeA0u99Qmw==", - "x1A74vg/hwwjAx6GrkU8zw==", - "7XRiYvytcwscemlxd9iXIQ==", - "64AA4jLHXc1Dp15aMaGVcA==", - "u/QxrP1NOM/bOJlJlsi/jQ==", - "5M3dFrAOemzQ0MAbA8bI5w==", - "wyqmQGB6vgRVrYtmB2vB7w==", - "8vLA9MOdmLTo3Qg+/2GzLA==", - "/u5W2Gab4GgCMIc4KTp2mg==", - "lhAOM81Ej6YZYBu45pQYgg==", - "MArbGuIAGnw4+fw6mZIxaw==", - "ZZImGypBWwYOAW43xDRWCQ==", - "L2IeUnATZHqOPcrnW2APbA==", - "bQKkL+/KUCsAXlwwIH0N3w==", - "f09F7+1LRolRL5nZTcfKGA==", - "hPnPQOhz4QKhZi02KD6C+A==", - "78b8sDBp28zUlYPV5UTnYw==", - "iVDd2Zk7vwmEh97LkOONpQ==", - "LHQETSI5zsejvDaPpsO29g==", - "Yjm5tSq1ejZn3aWqqysNvA==", - "gkrg0NR0iCaL7edq0vtewA==", - "Lo1xTCEWSxVuIGEbBEkVxA==", - "8GyPup4QAiolFJ9v80/Nkw==", - "3L3KEBHhgDwH615w4OvgZA==", - "hJSP7CostefBkJrwVEjKHA==", - "9oQ/SVNJ4Ye9lq8AaguGAQ==", - "n7Bns42aTungqxKkRfQ5OQ==", - "K5lhaAIZkGeP5rH2ebSJFw==", - "ZaPsR9X77SNt7dLjMJUh8A==", - "18ndtDM9UaNfBR1cr3SHdA==", - "0QbH4oI8IjZ9BRcqRyvvDQ==", - "J/eAtAPswMELIj8K2ai+Xg==", - "qenHZKKlTUiEFv6goKM/Mw==", - "vjrSYGUpeKOtJ2cNgLFg2g==", - "DA+3fjr7mgpwf6BZcExj0w==", - "rh7bzsTQ1UZjG7amysr0Gg==", - "tFMJRXfWE9g78O1uBUxeqQ==", - "e/nWuo5YalCAFKsoJmFyFA==", - "gqehq46BhFX2YLknuMv02w==", - "Uudn69Kcv2CGz2FbfJSSEA==", - "Otz/PgYOEZ1CQDW54FWJIQ==", - "IwfeA6d0cT4nDTCCRhK+pA==", - "jgNijyoj2JrQNSlUv4gk4A==", - "KzWdWPP2gH0DoMYV4ndJRg==", - "pv/m2mA/RJiEQu2Qyfv9RA==", - "ATmMzriwGLl+M3ppkfcZNA==", - "tVvWdA+JqH0HR2OlNVRoag==", - "n6QVaozMGniCO0PCwGQZ6w==", - "gU3gu8Y5CYVPqHrZmLYHbQ==", - "cBBOQn7ZjxDku0CUrxq2ng==", - "w+jzM0I5DRzoUiLS/9QIMQ==", - "MLlVniZ08FHAS5xe+ZKRaA==", - "wMyJLQJdmrC2TSeFkIuSvQ==", - "dG98w8MynOoX7aWmkvt+jg==", - "zm+z+OOyHhljV2TjA3U9zw==", - "Tk5MAqd1gyHpkYi8ErlbWg==", - "g6zSo8BvLuKqdmBFM1ejLA==", - "d0VAZLbLcDUgLgIfT1GmVQ==", - "SNPYH4r/J9vpciGN2ybP5Q==", - "XA2hUgq3GVPpxtRYiqnclg==", - "fVCRaPsTCKEVLkoF4y3zEw==", - "FpgdsQ2OG+bVEy3AeuLXFQ==", - "JquDByOmaQEpFb47ZJ4+JA==", - "e369ZIQjxMZJtopA//G55Q==", - "Nsd+DfRX6L54xs+iWeMjCQ==", - "+/UCpAhZhz368iGioEO8aQ==", - "e5l9ZiNWXglpw6nVCtO8JQ==", - "Cl1u5nGyXaoGyDmNdt38Bw==", - "6sNP0rzCCm3w976I2q2s/w==", - "qcpeZWUlPllQYZU6mHVwUw==", - "kzYddqiMsY3EYrpxve2/CQ==", - "3iC21ByW/YVL+pSyppanWw==", - "3HPOzIZxoaQAmWRy9OkoSg==", - "xsCZVhCk2qJmOqvUjK3Y8Q==", - "i2sSvrTh/RdLJX0uKhbrew==", - "7Y87wVJok20UfuwkGbXxLg==", - "ibsb1ncaLZXAYgGkMO7tjQ==", - "+VfRcTBQ80KSeJRdg0cDfw==", - "kgKWQJJQKLUuD2VYKIKvxA==", - "ARKIvf4+zRF8eCvUITWPng==", - "1fztTtQWNMIMSAc5Hr6jMQ==", - "md6zNd7ZBn3qArYqQz7/fw==", - "kvAaIJb+aRAfKK104dxFAA==", - "UIXytIHyVODxlrg+eQoARA==", - "Dk0L/lQizPEb3Qud6VHb1Q==", - "64YsV2qeDxk2Q6WK/h7OqA==", - "90dtIMq0ozJXezT2r79vMQ==", - "wy/Z8505o4sVovk4UuBp1A==", - "ytDXLDBqWiU1w3sTurYmaw==", - "9pk75mBzhmcdT+koHvgDlw==", - "DQeib845UqBMEl96sqsaSg==", - "UPYR575ASaBSZIR3aX1IgQ==", - "swsVVsPi/5aPFBGP+jmPIw==", - "1cj1Fpd3+UiBAOahEhsluA==", - "ifuJCv9ZA84Vz1FYAPsyEA==", - "uu+ncs63SdQIvG6z4r7Q3Q==", - "UvC1WADanMrhT+gPp/yVqA==", - "llOvGOUDVfX68jKnAlvVRA==", - "SusSOsWNoAerAIMBVWHtfA==", - "VznvTPAAwAev+yhl9oZT0w==", - "luR/kvHLwA6tSdLeTM4TzA==", - "PcdBtV8pfKU0YbDpsjPgwg==", - "5l6kDfjtZjkTZPJvNNOVFw==", - "4FBBtWPvqJ3dv4w25tRHiQ==", - "JJbzQ/trOeqQomsKXKwUpQ==", - "0bj069wXgEJbw7dpiPr8Tg==", - "tejpAZp7y32SO2+o4OGvwQ==", - "kq26VyDyJTH/eM6QvS2cMw==", - "+zBkeHF4P8vLzk1iO1Zn3Q==", - "BzkNYH03gF/mQY71RwO3VA==", - "RnxOYPSQdHS6fw4KkDJtrA==", - "65KhGKUBFQubRRIEdh9SwQ==", - "k1DPiH6NkOFXP/r3N12GyA==", - "DqzWt1gfyu/e7RQl5zWnuQ==", - "gnez1VrH+UHT8C/SB9qGdA==", - "vZtL0yWpSIA+9v8i23bZSg==", - "FNvQqYoe0s/SogpAB7Hr1Q==", - "6nwR+e9Qw0qp8qIwH9S/Mg==", - "BPT4PQxeQcsZsUQl33VGmg==", - "rOYeIcB+Rg5V6JG2k4zS2w==", - "Je1UESovkBa9T6wS0hevLw==", - "HFHMGgfOeO0UPrray1G+Zw==", - "NBmB/cQfS+ipERd7j9+oVg==", - "iIm8c9uDotr87Aij+4vnMw==", - "S3VQa6DH+BdlSrxT/g6B5g==", - "BwRA+tMtwEvth28IwpZx+w==", - "vg3jozLXEmAnmJwdfcEN0g==", - "gW0oKhtQQ7BxozxUWw5XvQ==", - "Q6vGRQiNwoyz7bDETGvi5g==", - "Ak3rlzEOds6ykivfg39xmw==", - "G4qzBI1sFP2faN+tlRL/Bw==", - "ND9l4JWcncRaSLATsq0LVw==", - "yQmNZnp/JZywbBiZs3gecA==", - "ZoNSxARrRiKZF5Wvpg7bew==", - "GhpJfRSWZigLg/azTssyVA==", - "QyyiJ5I/OZC50o89fa5EmQ==", - "4kj0S8XlmhHXoUP7dQItUw==", - "Dt8Q5ORzTmpPR2Wdk0k+Aw==", - "/hFhjFGJx2wRfz6hyrIpvA==", - "eFimq+LuHi42byKnBeqnZQ==", - "JrKGKAKdjfAaYeQH8Y2ZRQ==", - "JFFeXsFsMA59iNtZey7LAA==", - "91SdBFJEZ65M+ixGaprY/A==", - "+S+WXgVDSU1oGmCzGwuT3g==", - "1X14kHeKwGmLeYqpe60XEA==", - "4xojeUxTFmMLGm6jiMYh/Q==", - "+1e7jvUo8f2/2l0TFrQqfA==", - "8WU1vLKV1GhrL7oS9PpABg==", - "DYWCPUq/hpjr6puBE7KBHg==", - "birqO8GOwGEI97zYaHyAuw==", - "6e8boFcyc8iF0/tHVje4eQ==", - "FLvED9nB9FEl9LqPn7OOrA==", - "ji306HRiq965zb8EZD2uig==", - "AklOdt9/2//3ylUhWebHRw==", - "VGRCSrgGTkBNb8sve0fYnQ==", - "oqlkgrYe9aCOwHXddxuyag==", - "KXuFON8tMBizNkCC48ICLA==", - "9aKH1u5+4lgYhhLztQ4KWA==", - "3hVslsq98QCDIiO40JNOuA==", - "OOS6wQCJsXH8CsWEidB35A==", - "YXHQ3JI9+oca8pc/jMH6mA==", - "V9vkAanK+Pkc4FGAokJsTA==", - "OFLn4wun6lq484I7f6yEwg==", - "3WVBP9fyAiBPZAq3DpMwOQ==", - "5gGoDPTc/sOIDLngmlEq4A==", - "E2lvMXqHdTw0x+KCKVnblg==", - "f1Gs++Iilgq9GHukcnBG3w==", - "uIkVijg7RPi/1j7c18G1qA==", - "9T7gB0ZkdWB0VpbKIXiujQ==", - "KCJJfgLe00+tjSfP6EBcUg==", - "WbAdlac/PhYUq7J2+n5f+w==", - "GLnS9wDCje7TOMvBX9jJVA==", - "VAg/aU5nl72O+cdNuPRO4g==", - "kzTl7WH/JXsX1fqgnuTOgw==", - "1HDgfU7xU7LWO/BXsODZAQ==", - "D0W5F7gKMljoG5rlue1jrg==", - "9reBKZ1Rp6xcdH1pFQacjw==", - "SSKhl2L3Mvy93DcZulADtA==", - "hlu7os0KtAkpBTBV6D2jyQ==", - "sfte/o9vVNyida/yLvqADA==", - "gYGQBLo5TdMyXks0LsZhsQ==", - "dNq2InSVDGnYXjkxPNPRxA==", - "fiv0DJivQeqUkrzDNlluRw==", - "msstzxq++XO0AqNTmA7Bmg==", - "DCjgaGV5hgSVtFY5tcwkuA==", - "aMmrAzoRWLOMPHhBuxczKg==", - "qNOSm15bdkIDSc/iUr+UTQ==", - "2nSTEYzLK77h5Rgyti+ULQ==", - "BhKO1s1O693Fjy1LItR/Jw==", - "kRnBEH6ILR5GNSmjHYOclw==", - "R97chlspND/sE9/HMScXjQ==", - "1Oykse0jQVbuR3MvW5ot4A==", - "Dmyb+a7/QFsU4d2cVQsxDw==", - "W5now3RWSzzMDAxsHSl++Q==", - "IrDuBrVu1HWm0BthAHyOLQ==", - "V6zyoX6MERIybGhhULnZiw==", - "ZQSDYgpsimK+lYGdXBWE/w==", - "lV70RNlE++04G1KFB3BMXA==", - "QmSBVvdk0tqH9RAicXq2zA==", - "qNyy6Fc0b8oOMWqqaliZ/w==", - "xvipmmwKdYt4eoKvvRnjEg==", - "Q7Df6zGwvb4rC+EtIKfaSw==", - "n1M2dgFPpmaICP+JwxHUug==", - "1k8tL2xmGFVYMgKUcmDcEw==", - "fFvXa1dbMoOOoWZdHxPGjw==", - "UP9mmAKzeQqGhod7NCqzhg==", - "PMCWKgog/G+GFZcIruSONw==", - "dnvatwSEcl73ROwcZ4bbIQ==", - "hY82j+sUQQRpCi6CCGea5A==", - "QoUC9nyK1BAzoUVnBLV2zw==", - "+aF4ilbjQbLpAuFXQEYMWQ==", - "XTCcsVfEvqxnjc0K5PLcyw==", - "ML7ipnY/g8mA1PUIju1j8Q==", - "tOkYq1BZY152/7IJ6ZYKUg==", - "2bsIpvnGcFhTCSrK9EW1FQ==", - "Af9j1naGtnZf0u1LyYmK1w==", - "ZmblZauRqO5tGysY3/0kDw==", - "PF0lpolQQXlpc3qTLMBk8w==", - "emVLJVzha7ui5OFHPJzeRQ==", - "gR0sgItXIH8hE4FVs9Q07w==", - "PTW+fhZq/ErxHqpM0DZwHQ==", - "g0kHTNRI7x/lAsr92EEppw==", - "24H9q+E8pgCEdFS7JO5kzQ==", - "HtDXgMuF8PJ1haWk88S0Ew==", - "pulldyBt2sw6QDvTrCh6zw==", - "ehwc2vvwNUAI7MxU4MWQZw==", - "enj9VEzLbmeOyYugTmdGfQ==", - "auvG6kWMnhCMi7c7e9eHrw==", - "R36O31Pj8jn0AWSuqI7X2Q==", - "3AVYtcIv7A5mVbVnQMaCeA==", - "T9WoUJNwp8h4Yydixbx6nA==", - "t0WN8TwMLgi8UVEImoFXKg==", - "mS99D+CXhwyfVt8xJ+dJZA==", - "AFdelaqvxRj6T3YdLgCFyg==", - "Lu02ic/E94s42A14m7NGCA==", - "7w3b73nN/fIBvuLuGZDCYQ==", - "O209ftgvu0vSr0UZywRFXA==", - "MQvAr+OOfnYnr/Il/2Ubkg==", - "e5txnNRcGs2a9+mBFcF1Qg==", - "YA0kMTJ82PYuLA4pkn4rfw==", - "QIKjir/ppRyS63BwUcHWmw==", - "P3y5MoXrkRTSLhCdLlnc4A==", - "WY7mCUGvpXrC8gkBB46euw==", - "g0GbRp2hFVIdc7ct7Ky7ag==", - "Cv079ZF55RnbsDT27MOQIA==", - "cvMJ714elj/HUh89a9lzOQ==", - "9inw7xzbqAnZDKOl/MfCqA==", - "F58ktE4O0f7C9HdsXYm+lw==", - "CsPkyTZADMnKcgSuNu1qxg==", - "mAzsVkijuqihhmhNTTz65g==", - "FxnbKnuDct4OWcnFMT/a5w==", - "P5wS+xB8srW4a5KDp/JVkA==", - "ctJYJegZhG42i+vnPFWAWw==", - "OrqJKjRndcZ8OjE3cSQv7g==", - "aXqiibI6BpW3qilV6izHaQ==", - "BA18GEAOOyVXO2yZt2U35w==", - "saEpnDGBSZWqeXSJm34eOA==", - "CUEueo8QXRxkfVdfNIk/gg==", - "H0UMAUfHFQH92A2AXRCBKA==", - "CT9g8mKsIN/VeHLSTFJcNQ==", - "E4NtzxQruLcetC23zKVIng==", - "203EqmJI9Q4tWxTJaBdSzA==", - "Do3aqbRKtmlQI2fXtSZfxQ==", - "JaYQXntiyznQzrTlEeZMIw==", - "VK95g27ws2C6J2h/7rC2qA==", - "CQ0PPwgdG3N6Ohfwx1C8xA==", - "/MeHciFhvFzQsCIw39xIZA==", - "u5cUPxM6/spLIV8VidPrAA==", - "OwArFF1hpdBupCkanpwT+Q==", - "PdBgXFq5mBqNxgCiqaRnkw==", - "lC5EumoIcctvxYqwELqIqw==", - "xoPSM86Se+1hHX0y3hhdkw==", - "F5bs0GGWBx9eBwcJJpXbqg==", - "1mw6LfTiirFyfjejf8QNGA==", - "daBhAvmE9shDgmciDAC5eg==", - "AvdeYb9XNOUFWiiz+XGfng==", - "JJJkp1TpuDx5wrua2Wml7g==", - "3y5Xk65ShGvWFbQxcZaQAQ==", - "l6QHU5JsJExNoOnqxBPVbw==", - "X2YfnPXgF2VHVX95ZcBaxQ==", - "g6udffWh7qUnSIo1Ldn3eA==", - "V2P75JFB4Se9h7TCUMfeNA==", - "IUZ5aGpkJ9rLgSg6oAmMlw==", - "pyrUqiZ98gVXxlXQNXv5fA==", - "83ERX2XJV3ST4XwvN7YWCg==", - "eJDUejE/Ez/7kV+S74PDYg==", - "M9oqlPb63e0kZE0zWOm+JQ==", - "0rTYcuVYdilO7zEfKrxY3A==", - "rfPTskbnoh3hRJH6ZAzQRg==", - "QtD35QhE8sAccPrDnhtQmQ==", - "jpNUgFnanr9Sxvj2xbBXZw==", - "nykEOLL/o7h0cs0yvdeT2g==", - "wX2URK6eDDHeEOF3cgPgHA==", - "jqPQ0aOuvOJte/ghI1RVng==", - "nHTsDl0xeQPC5zNRnoa0Rw==", - "mNv2Q67zePjk/jbQuvkAFA==", - "HjlPM2FQWdILUXHalIhQ5w==", - "cHkOsVd80Rgwepeweq4S1g==", - "kTCHqcb3Cos51o8cL+MXcg==", - "nvmBgp0YlUrdZ05INsEE8Q==", - "kFrRjz7Cf2KvLtz9X6oD+w==", - "Tmx0suRHzlUK4FdBivwOwA==", - "bG+P+p34t/IJ1ubRiWg6IA==", - "uESeJe/nYrHCq4RQbrNpGA==", - "ehfPlu6YctzzpQmFiQDxGA==", - "ZH5Es/4lJ+D5KEkF1BVSGg==", - "HHxn4iIQ7m0tF1rSd+BZBg==", - "DQJRsUwO1fOuGlkgJavcwQ==", - "HITIVoFoWNg04NExe13dNA==", - "MeKXnEfxeuQu9t3r/qWvcw==", - "Y7OofF9eUvp7qlpgdrzvkg==", - "XSb71ae0v+yDxNF5HJXGbQ==", - "p8W1LgFuW6JSOKjHkx3+aA==", - "y2JOIoIiT9cV1VxplZPraQ==", - "MN94B0r5CNAF9sl3Kccdbw==", - "Q1pdQadt12anX1QRmU2Y/A==", - "JIC8R48jGVqro6wmG2KXIw==", - "eWgLAqJOU+fdn8raHb9HCw==", - "5CMadLqS2KWwwMCpzlDmLw==", - "H1y2iXVaQYwP0SakN6sa+Q==", - "CUCjG2UaEBmiYWQc6+AS1Q==", - "yV3IbbTWAbHMhMGVvgb/ZQ==", - "80PCwYh4llIKAplcDvMj4g==", - "fgdUFvQPb5h+Rqz8pzLsmw==", - "2SI4F7Vvde2yjzMLAwxOog==", - "kJdY3XEdJS/hyHdR+IN0GA==", - "IKgNa2oPaFVGYnOsL+GC5Q==", - "eXFOya6x5inTdGwJx/xtUQ==", - "uTA0XbiH3fTeVV7u5z0b3w==", - "onFcHOO1c3pDdfCb5N4WkQ==", - "Slu3z535ijcs5kzDnR7kfA==", - "SElc2+YVi3afE1eG1MI7dQ==", - "ND2hYtAIQGMxBF7o7+u7nQ==", - "Pv9FWQEDLKnG/9K9EIz4Gw==", - "6CjtF1S2Y6RCbhl7hMsD+g==", - "rs2QrN4qzAHCHhkcrAvIfA==", - "eTMPXa60OTGjSPmvR4IgGw==", - "pvXHwJ3dwf9GDzfDD9JI3g==", - "CRmAj3JcasAb4iZ9ZbNIbw==", - "rcY4Ot40678ByCfqvGOGdg==", - "l4ddTxbTCW5UmZW+KRmx6A==", - "NKRzJndo2uXNiNppVnqy1g==", - "0NrvBuyjcJ2q6yaHpz/FOA==", - "3YXp1PmMldUjBz3hC6ItbA==", - "CmVD6nh8b/04/6JV9SovlA==", - "HjyxyL0db2hGDq2ZjwOOhg==", - "4PBaoeEwUj79njftnYYqLg==", - "vFFzkWgGyw6OPADONtEojQ==", - "czBWiYsQtNFrksWwoQxlOw==", - "9iB7+VwXRbi6HLkWyh9/kg==", - "zwY6tCjjya/bgrYaCncaag==", - "mW6TCje9Zg2Ep7nzmDjSYQ==", - "5LJqHFRyIwQKA4HbtqAYQQ==", - "INNBBin5ePwTyhPIyndHHg==", - "dChBe9QR29ObPFu/9PusLg==", - "1dhq3ozNCx0o4dV1syLVDA==", - "nyaekSYTKzfSeSfPrB114Q==", - "TfNHjSTV8w6Pg6+FaGlxvA==", - "m/Lp4U75AQyk9c8cX14HJg==", - "uU1TX5DoDg6EcFKgFcn0GA==", - "B+TsxQZf0IiQrU8X9S4dsQ==", - "6b7ue29cBDsvmj1VSa5njw==", - "RvXWAFwM+mUAPW1MjPBaHA==", - "pdaY6kZ8+QqkMOInvvACNA==", - "7nr3zyWL+HHtJhRrCPhYZA==", - "BXGlq54wIH6R3OdYfSSDRw==", - "b06KGv5zDYsTxyTbQ9/eyA==", - "8ylI1AS3QJpAi3I/NLMYdg==", - "0fpe9E6m3eLp/5j5rLrz2Q==", - "Qrh7OEHjp80IW+YzQwzlJg==", - "lqhgbgEqROAdfzEnJ17eXA==", - "Dulw855DfgIwiK7hr3X8vg==", - "wsp+vmW8sEqXYVURd/gjHA==", - "VoPth5hDHhkQcrQTxHXbuw==", - "TgWe70YalDPyyUz6n88ujg==", - "9lLhHcrPWI4EsA4fHIIXuw==", - "UymZUnEEQWVnLDdRemv+Tw==", - "qnkFUlJ8QT322JuCI3LQgg==", - "/p/aCTIhi1bU0/liuO/a2Q==", - "hWoxz5HhE50oYBNRoPp1JQ==", - "88tB/HgUIUnqWXEX++b5Aw==", - "Z8T1b9RsUWf59D06MUrXCQ==", - "BZTzHJGhzhs3mCXHDqMjnQ==", - "XfY+QUriCAA1+3QAsswdgg==", - "TZ3ATPOFjNqFGSKY3vP2Hw==", - "cl4t9FXabQg7tbh1g7a0OA==", - "9SgfpAY0UhNC6sYGus9GgQ==", - "d/Wd3Ma1xYyoMByPQnA9Cw==", - "DDitrRSvovaiXe2nfAtp4g==", - "s+eHg5K9zZ2Jozu5Oya9ZQ==", - "z3L2BNjQOMOfTVBUxcpnRA==", - "v4xIYrfPGILEbD/LwVDDzA==", - "HoaBBw2aPCyhh0f5GxF+/Q==", - "i9IRqAqKjBTppsxtPB7rdw==", - "cWUg7AfqhiiEmBIu+ryImA==", - "E+02smwQGBIxv42LIF2Y4Q==", - "W4CfeVp9mXgk04flryL7iA==", - "9SUOfKtfKmkGICJnvbIDMg==", - "xweGAZf+Yb3TtwR/sGmGIA==", - "EJgedRYsZPc4cT9rlwaZhg==", - "wv4NC9CIpwuGf/nOQYe/oA==", - "ZXeMG5eqQpZO/SGKC4WQkA==", - "bzXXzQGZs8ustv0K4leklA==", - "RkQK9S1ezo+dFYHQP57qrw==", - "mrinv7KooPQPrLCNTRWCFg==", - "qIUJPanWmGzTD1XxvHp+6w==", - "Js7g8Dr6XsnGURA4UNF0Ug==", - "dpSTNOCPFHN5yGoMpl1EUA==", - "ugY8rTtJkN4CXWMVcRZiZw==", - "rqHKB91H3qVuQAm+Ym5cUA==", - "UjmDFO7uzjl4RZDPeMeNyg==", - "cu4ZluwohhfIYLkWp72pqA==", - "ZydKlOpn2ySBW0G3uAqwuw==", - "LWd0+N3M94n81qd346LfJQ==", - "VbHoWmtiiPdABvkbt+3XKQ==", - "J4MC9He6oqjOWsYQh9nl3Q==", - "ahAbmGJZvUOXrcK6OydNGQ==", - "Byhi4ymFqqH8uIeoMRvPug==", - "LSN9GmT6LUHlCAMFqpuPIA==", - "IAMInfSYb76GxDlAr1dsTg==", - "qYHdgFAXhF/XcW4lxqfvWQ==", - "26+yXbqI+fmIZsYl4UhUzw==", - "AwPTZpC28NJQhf5fNiJuLA==", - "SESKbGF35rjO64gktmLTWA==", - "YVlRQHQglkbj3J2nHiP/Hw==", - "DdaT4JLC7U0EkF50LzIj9w==", - "G0LChrb0OE5YFqsfTpIL1Q==", - "5Yrj6uevT8wHRyqqgnSfeg==", - "NmWmDxwK5FpKlZbo0Rt8RA==", - "iUsUCB0mfRsE9KPEQctIzw==", - "Tm4zk2Lmg8w4ITMI31NfTA==", - "Vu0E+IJXBnc25x4n41kQig==", - "6wkfN8hyKmKU6tG3YetCmw==", - "trjM81KANPZrg9iSThWx6Q==", - "iGuY4VxcotHvMFXuXum7KA==", - "ICPdBCdONUqPwD5BXU5lrw==", - "alqHQBz8V446EdzuVfeY5Q==", - "74FW/QYTzr/P1k6QwVHMcw==", - "avZp5K7zJvRvJvpLSldNAw==", - "TIKadc6FAaRWSQUg5OATgg==", - "PfkWkSbAxIt1Iso0znW0+Q==", - "Z+bsbVP91KrJvxrujBLrrQ==", - "mrxlFD3FBqpSZr1kuuwxGg==", - "nUgYO7/oVNSX8fJqP2dbdg==", - "tVhXk9Ff3wAg56FbdNtcFg==", - "DdiNGiOSoIZxrMrGNvqkXw==", - "CDsanJz7e3r/eQe+ZYFeVQ==", - "wVfSZYjMjbTsD2gaSbwuqQ==", - "6c0iuya20Ys8BsvoI4iQaQ==", - "qCPfJTR8ecTw6u6b1yHibA==", - "fZrj3wGQSt8RXv0ykJROcQ==", - "gR3B8usSEb0NLos51BmJQg==", - "vTAmgfq3GxL4+ubXpzwk5w==", - "jLkmUZ6fV56GfhC0nkh4GA==", - "3v09RHCPTLUztqapThYaHg==", - "nULSbtw2dXbfVjZh33pDiA==", - "IHhyR6+5sZXTH+/NrghIPg==", - "tnUtJ/DQX9WaVJyTgemsUA==", - "7xTKFcog69nTmMfr5qFUTA==", - "IshzWega6zr3979khNVFQQ==", - "Ng5v/B9Z10TTfsDFQ/XrXQ==", - "hnCUnoxofUiqQvrxl73M8w==", - "VPa7DG6v7KnzMvtJPb88LQ==", - "4LtQrahKXVtsbXrEzYU1zQ==", - "Ev/xjTi7akYBI7IeZJ4Igw==", - "41WEjhYUlG6jp2UPGj11eQ==", - "JvXTdChcE3AqMbFYTT3/wg==", - "2rOkEVl90EPqfHOF5q2FYw==", - "mjFBVRJ7TgnJx+Q74xllPg==", - "Uy4QI8D2y1bq/HDNItCtAw==", - "wMOE/pEKVIklE75xjt6b6w==", - "ZcuIvc8fDI+2uF0I0uLiVA==", - "CX/N/lHckmAtHKysYtGdZA==", - "j8to4gtSIRYpCogv2TESuQ==", - "iS9wumBV5ktCTefFzKYfkA==", - "ewPT4dM12nDWEDoRfiZZnA==", - "vWn9OPnrJgfPavg4D6T/HQ==", - "J/PNYu4y6ZMWFFXsAhaoow==", - "catI+QUNk3uJ+mUBY3bY8Q==", - "F8tEIT5EhcvLNRU5f0zlXQ==", - "zyA9f5J7mw5InjhcfeumAQ==", - "MlOOZOwcRGIkifaktEq0aQ==", - "Pt3i49uweYVgWze3OjkjJA==", - "sfIClgTMtZo9CM9MHaoqhQ==", - "HeQbUuBM9sqfXFXRBDISSw==", - "SFn78uklZfMtKoz2N0xDaQ==", - "H6j2nPbBaxHecXruxiWYkA==", - "fU32wmMeD44UsFSqFY0wBA==", - "hDILjSpTLqJpiSSSGu445A==", - "ieEAgvK9LsWh2t6DsQOpWA==", - "xfjBQk3CrNjhufdPIhr91A==", - "j+8/VARfbQSYhHzj0KPurQ==", - "/zFLRvi75UL8qvg+a6zqGg==", - "U0KmEI6e5zJkaI4YJyA5Ew==", - "uXvr6vi5kazZ9BCg2PWPJA==", - "jEqP0dyHKHiUjZ9dNNGTlQ==", - "1xWx5V3G9murZP7srljFmA==", - "OIwtfdq37eQ0qoXuB2j7Hw==", - "fUAy3f9bAglLvZWvkO2Lug==", - "duRFqmvqF93uf/vWn8aOmg==", - "ysRQ+7Aq7eVLOp88KnFVMA==", - "CkZUmKBAGu0FLpgPDrybpw==", - "TrLmfgwaNATh24eSrOT+pw==", - "83wtvSoSP9FVBsdWaiWfpA==", - "pUfWmRXo70yGkUD/x5oIvA==", - "PybPZhJErbRTuAafrrkb3g==", - "8hsfXqi4uiuL+bV1VrHqCw==", - "TVlHoi8J7sOZ2Ti7Dm92cQ==", - "za4rzveYVMFe3Gw531DQJQ==", - "JKphO0UYjFqcbPr6EeBuqg==", - "hqeSvwu8eqA072iidlJBAw==", - "bUF0JIfS4uKd3JZj2xotLQ==", - "hKOsXOBoFTl/K4xE+RNHDA==", - "JHBjKpCgSgrNNACZW1W+1w==", - "Rrq0ak9YexLqqbSD4SSXlw==", - "+NmjwjsPhGJh9bM10SFkLw==", - "xMIHeno2qj3V8q9H1xezeg==", - "TcFinyBrUoAEcLzWdFymow==", - "Rvchz/xjcY9uKiDAkRBMmA==", - "TYlnrwgyeZoRgOpBYneRAg==", - "PbnxuVerGwHyshkumqAARg==", - "iFtadcw8v6betKka9yaJfg==", - "7wgT9WIiMVcrj48PVAMIgw==", - "2HHqeGRMfzf3RXwVybx+ZQ==", - "tdgI9v7cqJsgCAeW1Fii1A==", - "4ZFYKa7ZgvHyZLS6WpM8gA==", - "gB8wkuIzvuDAIhDtNT1gyA==", - "g1ELwsk6hQ+RAY1BH640Pg==", - "UZoibx+y1YJy/uRSa9Oa2w==", - "yS/yMnJDHW0iaOsbj4oPTg==", - "JzW+yhrjXW1ivKu3mUXPXg==", - "/wIZAye9h1TUiZmDW0ZmYA==", - "YK+q7uJObkQZvOwQ9hplMg==", - "Rs8deApkoosIJSfX7NXtAA==", - "MsCloSmTFoBpm7XWYb+ueQ==", - "3ltw31yJuAl4VT6MieEXXw==", - "1+qmrbC8c7MJ6pxmDMcKuA==", - "AYxGETZs477n2sa1Ulu/RQ==", - "Q0TJZxpn3jk67L7N+YDaNA==", - "OGpsXRHlaN8BvZftxh1e7A==", - "UbABE6ECnjB+9YvblE9CYw==", - "kZ0D191c/uv4YMG15yVLDw==", - "QWURrsEgxbJ8MWcaRmOWqw==", - "xiFlcSfa/gnPiO+LwbixcQ==", - "Szko0IPE7RX2+mfsWczrMg==", - "Ugt8HVC/aUzyWpiHd0gCOQ==", - "8j9GVPiFdfIRm/+ho7hpoA==", - "KR401XBdgCrtVDSaXqPEiA==", - "d0NBFiwGlQNclKObRtGVMQ==", - "XEwOJG24eaEtAuBWtMxhwg==", - "0Y6iiZjCwPDwD/CwJzfioQ==", - "MvMbvZNKbXFe2XdN+HtnpQ==", - "fsoXIbq0T0nmSpW8b+bj+g==", - "Uje3Ild84sN41JEg3PEHDg==", - "i6ZYpFwsyWyMJNgqUMSV1A==", - "+P5q4YD1Rr5SX26Xr+tzlw==", - "z4oKy2wKH+sbNSgGjbdHGw==", - "XwKWd03sAz8MmvJEuN08xA==", - "Xv0mNYedaBc57RrcbHr9OA==", - "9oUawSwUGOmb0sDn3XS6og==", - "9RGIQ2qyevNbSSEF36xk/A==", - "q8YF9G2jqydAxSqwyyys5Q==", - "m5JIUETVXcRza4VL4xlJbg==", - "aRpdnrOyu5mWB1P5YMbvOA==", - "rM/BOovNgnvebKMxZQdk7g==", - "fQS0jnQMnHBn7+JZWkiE/g==", - "gAoV4BZYdW1Wm712YXOhWQ==", - "hCzsi1yDv9ja5/o7t94j9Q==", - "CoLvjQDQGldGDqRxfQo+WQ==", - "pfGcaa49SM3S6yJIPk/EJQ==", - "yYp4iuI5f/y/l1AEJxYolQ==", - "Jj4IrSVpqQnhFrzNvylSzA==", - "4jeOFKuKpCmMXUVJSh9y0g==", - "+NMUaQ7XPsAi0rk7tTT9wQ==", - "Jt4Eg6MJn8O4Ph/K2LeSUA==", - "CiiUeJ0LeWfm7+gmEmYXtg==", - "c5Tc7rTFXNJqYyc0ppW+Iw==", - "4KJZPCE9NKTfzFxl76GWjg==", - "aXs9qTEXLTkN956ch3pnOA==", - "f5Xo7F1uaiM760Qbt978iw==", - "wpZqFkKafFpLcykN2IISqg==", - "vIORTYSHFIXk5E2NyIvWcQ==", - "prOsOG0adI4o+oz50moipw==", - "blygTgAHZJ3NzyAT33Bfww==", - "rBt6L/KLT7eybxKt5wtFdg==", - "vMuaLvAntJB5o7lmt/kVXA==", - "iujlt9fXcUXEYc+T2s5UjA==", - "LyYPOZKm8bBegMr5NTSBfg==", - "ZtWvgitOSRDWq7LAKYYd4Q==", - "kh51WUI5TRnKhur6ZEpRTQ==", - "VzQ1NwNv9btxUzxwVqvHQg==", - "8fJLQeIHaTnJ8wGqUiKU6g==", - "vvEH5A39TTe1AOC11rRCLA==", - "dihDsG7+6aocG6M9BWrCzQ==", - "3jqsY8/xTWELmu/az3Daug==", - "mpOtwBvle+nyY6lUBwTemw==", - "E1CvxFbuu9AYW604mnpGTw==", - "1LPC0BzhJbepHTSAiZ3QTw==", - "XpGXh76RDgXC4qnTCsnNHA==", - "3Gg9N7vjAfQEYOtQKuF/Eg==", - "+WpF8+poKmHPUBB4UYh/ig==", - "UNt7CNMtltJWq8giDciGyA==", - "RIZYDgXqsIdTf9o2Tp/S7g==", - "0QCQORCYfLuSbq94Sbt0bQ==", - "hvsZ5JmVevK1zclFYmxHaw==", - "3+9nURtBK3FKn0J9DQDa3g==", - "jdVMQqApseHH3fd91NFhxg==", - "VX+cVXV8p9i5EBTMoiQOQQ==", - "I5qDndyelK4Njv4YrX7S6w==", - "rWliqgfZ3/uCRBOZ9sMmdA==", - "vwno3vugCvt6ooT3CD4qIQ==", - "cffrYrBX3UQhfX1TbAF+GQ==", - "nOiwBFnXxCBfPCHYITgqNg==", - "LQttmX92SI94+hDNVd8Gtw==", - "iCF+GWw9/YGQXsOOPAnPHQ==", - "nwtCsN1xEYaHvEOPzBv+qQ==", - "CQpJFrpOvcQhsTXIlJli+Q==", - "tYeIZjIm0tVEsYxH1iIiUQ==", - "iCnm5fPmSmxsIzuRK6osrA==", - "tX8X8KoxUQ8atFSCxgwE1Q==", - "hZlX6qOfwxW5SPfqtRqaMw==", - "2aIx9UdMxxZWvrfeJ+DcTw==", - "TlJizlASbPtShZhkPww4UA==", - "p+bx+/WQWALXEBCTnIMr4w==", - "4VR5LiXLew6Nyn91zH9L4w==", - "bfUD03N2PRDT+MZ+WFVtow==", - "cTvDd8okNUx0RCMer6O8sw==", - "49jZr/mEW6fvnyzskyN40w==", - "vHmQUl4WHXs1E/Shh+TeyA==", - "fgXfRuqFfAu8qxbTi4bmhA==", - "Wn+Vj4eiWx0WPUHr3nFbyA==", - "2SwIiUwT4vRZPrg7+vZqDA==", - "nkedTagkmf6YE4tEY+0fKw==", - "8nOTDhFyZ8YUA4b6M5p84w==", - "qnzWszsyJhYtx8wkMN6b1g==", - "ka7pMp8eSiv92WgAsz2vdA==", - "pGQEWJ38hb/ZYy2P1+FIuw==", - "cVhdRFuZaW/09CYPmtNv5g==", - "prCOYlboBnzmLEBG/OeVrQ==", - "oIWwTbkVS5DDL47mY9/1KQ==", - "PKtXc4x4DEjM45dnmPWzyg==", - "f9ywiGXsz+PuEsLTV3zIbQ==", - "6G2bD3Y7qbGmfPqH9TqLFA==", - "DMHmyn2U2n+UXxkqdvKpnA==", - "XOG1PYgqoG8gVLIbVLTQgg==", - "1FSrgkUXgZot2CsmbAtkPw==", - "BxFP+4o6PSlGN78eSVT1pA==", - "EZVQGsXTZvht1qedRLF8bQ==", - "eYAQWuWZX2346VMCD6s7/A==", - "jkUpkLoIXuu7aSH8ZghIAQ==", - "mXPtbPaoNAAlGmUMmJEWBQ==", - "HLesnV3DL+FhWF3h6RXe8g==", - "nDAsSla+9XfAlQSPsXtzPA==", - "RAECgYZmcF4WxcFcZ4A0Ww==", - "W+M4BcYNmjj7xAximDGWsA==", - "ueODvMv/f9ZD8O0aIHn4sg==", - "cszpMdGbsbe6BygqMlnC9Q==", - "siHwJx6EgeB1gBT9z/vTyw==", - "FN7oLGBQGHXXn5dLnr/ElA==", - "Tud+AMyuFkWYYZ73yoJGpQ==", - "TuaG3wRdM9BWKAxh2UmAsg==", - "8CjmgWQSAAGcXX9kz3kssw==", - "ays5/F7JANIgPHN0vp2dqQ==", - "PCOGl7GIqbizAKj/sZmlwQ==", - "rZKD8oJnIj5fSNGiccfcvA==", - "gFEnTI8os2BfRGqx9p5x8w==", - "5r1ZsGkrzNQEpgt/gENibw==", - "1YO9G8qAhLIu2rShvekedw==", - "6ZKmm7IW7IdWuVytLr68CQ==", - "mMfn8OaKBxtetweulho+xQ==", - "GQJxu1SoMBH14KPV/G/KrQ==", - "IYIP2UBRyWetVfYLRsi1SQ==", - "Jit0X0srSNFnn8Ymi1EY+g==", - "ARCWkHAnVgBOIkCDQ19ZuA==", - "qA0sTaeNPNIiQbjIe1bOgQ==", - "iGI9uqMoBBAjPszpxjZBWQ==", - "+L1FDsr5VQtuYc2Is5QGjw==", - "4XNUmgwxsqDYsNmPkgNQYQ==", - "Yig+Wh18VIqdsmwtwfoUQw==", - "uqp92lAqjec8UQYfyjaEZw==", - "QiozlNcQCbqXtwItWExqJQ==", - "JFHutgSe1/SlcYKIbNNYwQ==", - "Y26jxXvl79RcffH8O8b9Ew==", - "bQ7J5mebp38rfP/fuqQOsg==", - "HI4ZIE5s8ez8Rb+Mv39FxA==", - "OzH7jTcyeM7RPVFtBdakpQ==", - "HLxROy6fx/mLXFTDSX4eLA==", - "s5RUHVRNAoKMuPR/Jkfc2Q==", - "X9QAaNjgiOeAWSphrGtyVw==", - "ALJWKUImVE40MbEooqsrng==", - "9MDG0WeBPpjGJLEmUJgBWg==", - "9RXymE9kCkDvBzWGyMgIWA==", - "vFox1d3llOeBeCUZGvTy0A==", - "r3lQAYOYhwlLnDWQIunKqg==", - "2os5s7j7Tl46ZmoZJH8FjA==", - "O5N2yd+QQggPBinQ+zIhtQ==", - "ZygAjaN62XhW5smlLkks+Q==", - "AgDJsaW0LkpGE65Kxk5+IA==", - "omAjyj1l6gyQAlBGfdxJTw==", - "fY9VATklOvceDfHZDDk57A==", - "StpQm/cQF8cT0LFzKUhC5w==", - "CYJB3qy5GalPLAv1KGFEZA==", - "coGEgMVs2b314qrXMjNumQ==", - "DQQB/l55iPN9XcySieNX3A==", - "6dshA8knH5qqD+KmR/kdSQ==", - "qyRmvxh8p4j4f+61c10ZFQ==", - "apWEPWUvMC24Y+2vTSLXoA==", - "RzX2OfSFEd//LhZwRwzBVw==", - "NdULoUDGhIolzw1PyYKV0A==", - "5w/c9WkI/FA+4lOtdPxoww==", - "bV9r7j2kNJpDCEM5E2339Q==", - "vbyiKeDCQ4q9dDRI1Q0Ong==", - "9xIgKpZGqq0/OU6wM5ZSHw==", - "RYkDwwng6eeffPHxt8iD9A==", - "w5N/aHbtOIKzcvG3GlMjGA==", - "3P2aJxV8Trll2GH9ptElYA==", - "yteeQr3ub2lDXgLziZV+DQ==", - "yqtj8GfLaUHYv/BsdjxIVw==", - "NyF+4VRog7etp90B9FuEjA==", - "uwA6N5LptSXqIBkTO0Jd7Q==", - "6lVSzYUQ/r0ep4W2eCzFpg==", - "1d7RPHdZ9qzAbG3Vi9BdFA==", - "7br49X11xc2GxQLSpZWjKQ==", - "peMW+rpwmXrSwplVuB/gTA==", - "RqYpA5AY7mKPaSxoQfI1CA==", - "dqVw2q2nhCvTcW82MT7z0g==", - "5S5/asYfWjOwnzYpbK6JDw==", - "NvkR0inSzAdetpI4SOXGhw==", - "tIqwBotg052wGBL65DZ+yA==", - "S4RvORcJ3m6WhnAgV4YfYA==", - "UAqf4owQ+EmrE45hBcUMEw==", - "4aPU6053cfMLHgLwAZJRNg==", - "3Y6/HqS1trYc9Dh778sefg==", - "ck86G8HsbXflyrK7MBntLg==", - "GLmWLXURlUOJ+PMjpWEXVA==", - "jNJQ6otieHBYIXA9LjXprg==", - "AsAHrIkMgc3RRWnklY9lJw==", - "FCLQocqxxhJeleARZ6kSPg==", - "3Leu2Sc+YOntJFlrvhaXeg==", - "hSkY45CeB6Ilvh0Io4W6cg==", - "DwrNdmU5VFFf3TwCCcptPA==", - "u2WQlcMxOACy6VbJXK4FwA==", - "E9IlDyULLdeaVUzN6eky8g==", - "EXveRXjzsjh8zbbQY2pM9g==", - "5VO1inwXMvLDBQSOahT6rg==", - "HaHTsLzx7V3G1SFknXpGxA==", - "MMaegl2Md9s/wOx5o9564w==", - "mpWNaUH9kn4WY26DWNAh3Q==", - "w3G+qXXqqKi8F5s+qvkBUg==", - "wM8tnXO4PDlLVHspZFcjYw==", - "LFcpCtnSnsCPD2gT/RA+Zg==", - "bhVbgJ4Do4v56D9mBuR/EA==", - "yU3N0HMSP5etuHPNrVkZtg==", - "FzqIpOcTsckSNHExrl+9jg==", - "BYz52gYI/Z6AbYbjWefcEA==", - "h3vYYI9yhpSZV2MQMJtwFQ==", - "adJAjAFyR2ne1puEgRiH+g==", - "eDcyiPaB954q5cPXcuxAQw==", - "40gCrW4YWi+2lkqMSPKBPg==", - "ulLuTZqhEDkX0EJ3xwRP9A==", - "y4iBxAMn/KzMmaWShdYiIw==", - "ilBBNK/IV69xKTShvI94fQ==", - "0HN6MIGtkdzNPsrGs611xA==", - "twPn6wTGqI0aR//0wP3xtA==", - "3UNJ37f+gnNyYk9yLFeoYA==", - "4SdHWowXgCpCDL28jEFpAw==", - "Mr5mCtC53+wwmwujOU/fWw==", - "81pAhreEPxcKse+++h1qBg==", - "KmcGEE0pacQ/HDUgjlt7Pg==", - "Gt4/MMrLBErhbFjGbiNqQQ==", - "lf1fwA0YoWUZaEybE+LyMQ==", - "RIVYGO2smx9rmRoDVYMPXw==", - "rJ9qVn8/2nOxexWzqIHlcQ==", - "lfOLLyZNbsWQgHRhicr4ag==", - "wgH1GlUxWi6/yLLFzE76uQ==", - "Qg1ubGl+orphvT990e5ZPA==", - "Z5B+uOmPZbpbFWHpI9WhPw==", - "snGTzo540cCqgBjxrfNpKw==", - "ZqkmoGB0p5uT5J6XBGh7Tw==", - "uPi8TsGY3vQsMVo/nsbgVQ==", - "Y5XR8Igvau/h+c1pRgKayg==", - "ZmVpw1TUVuT13Zw/MNI5hQ==", - "60suecbWRfexSh7C67RENA==", - "kZ/mZZg9YSDmk2rCGChYAg==", - "OpL+vHwPasW30s2E1TYgpA==", - "ZVnErH1Si4u51QoT0OT7pA==", - "3pi3aNVq1QNJmu1j0iyL0g==", - "tb5+2dmYALJibez1W4zXgA==", - "jOPdd330tB6+7C29a9wn0Q==", - "5oD/aGqoakxaezq43x0Tvw==", - "HdB7Se47cWjPgpJN0pZuiA==", - "6WhHPWlqEUqXC52rHGRHjA==", - "WLwpjgr9KzevuogoHZaVUw==", - "E8yMPK7W0SIGTK6gIqhxiQ==", - "1/Hxu8M9N/oNwk8bCj4FNQ==", - "Uo1ebgsOxc3eDRds1ah3ag==", - "5pqqzC/YmRIMA9tMFPi7rg==", - "ri4AOITPdB1YHyXV+5S51g==", - "HfvsiCQN/3mT0FabCU5ygQ==", - "UQTQk5rrs6lEb1a+nkLwfg==", - "VH70dN82yPCRctmAHMfCig==", - "yD3Dd4ToRrl53k/2NSCJiw==", - "fO0+6TsjL+45p9mSsMRiIg==", - "fM5uYpkvJFArnYiQ3MrQnA==", - "V+QzdKh5gxTPp2yPC9ZNEg==", - "XHHEg/8KZioW/4/wgSEkbQ==", - "2abfl3N46tznOpr+94VONQ==", - "gxwbqZDHLbQVqXjaq42BCg==", - "WnHK5ZQDR6Da5cGODXeo0A==", - "SChDh/Np1HyTPWfICfE1uA==", - "yhexr/OFKfZl0o3lS70e4w==", - "N65PqIWiQeS082D6qpfrAg==", - "RM5CpIiB94Sqxi462G7caA==", - "CBAGa5l95f3hVzNi6MPWeQ==", - "OHJBT2SEv5b5NxBpiAf7oQ==", - "p48i7AfSSAyTdJSyHvOONw==", - "/SP6pOdYFzcAl2OL05z4uQ==", - "N8dXCawxSBX40fgRRSDqlQ==", - "bMWFvjM8eVezU1ZXKmdgqw==", - "Um1ftRBycvb+363a90Osog==", - "QAz7FA+jpz9GgLvwdoNTEQ==", - "qO4HlyHMK5ygX+6HbwQe8w==", - "UgvtdE2eBZBUCAJG/6c0og==", - "q5g3c8tnQTW2EjNfb2sukw==", - "gsC/mWD8KFblxB0JxNuqJw==", - "SVFbcjXbV7HRg+7jUrzpwg==", - "bz294kSG4egZnH2dJ8HwEg==", - "ybpTgPr3SjJ12Rj5lC/IMA==", - "yDrAd1ot38soBk7zKdnT8A==", - "BB/R8oQOcoE4j63Hrh8ifg==", - "GNrMvNXQkW7PydlyJa+f1w==", - "w0PKdssv+Zc5J/BbphoxpA==", - "D5ibbo8UJMfFZ48RffuhgQ==", - "MdvhC1cuXqni/0mtQlSOCw==", - "wQKL8Ga6JQkpZ7yymDkC3w==", - "o1uhaQg5/zfne84BFAINUQ==", - "Ft2wXUokFdUf6d2Y/lwriw==", - "sLJrshdEANp0qk2xOUtTnQ==", - "jx7rpxbm1NaUMcE2ktg5sA==", - "ZQ0ZnTsZKWxbRj7Tilh24Q==", - "KhrIIHfqXl9zGE9aGrkRVg==", - "jS0JuioLGAVaHdo/96JFoQ==", - "tr+U/vt+MIGXPRQYYWJfRg==", - "TXab/hqNGWaSK+fXAoB2bg==", - "0K4NBxqEa3RYpnrkrD/XjQ==", - "3oMTbWf7Bv83KRlfjNWQZA==", - "yLAhLNezvqVHmN1SfMRrPw==", - "ZYW30FfgwHmW6nAbUGmwzA==", - "CZNoTy26VUQirvYxSPc/5A==", - "CF1sAlhjDQY/KWOBnSSveA==", - "+CLf5witKkuOvPCulTlkqw==", - "1m1yD4L9A7Q1Ot+wCsrxJQ==", - "2E41e0MgM3WhFx2oasIQeA==", - "mDXHuOmI4ayjy2kLSHku1Q==", - "sCLMrLjEUQ6P1L8tz90Kxg==", - "zDUZCzQesFjO1JI3PwDjfg==", - "x/BIDm6TKMhqu/gtb3kGyw==", - "DEaZD/8aWV6+zkiLSVN/gA==", - "7dz+W494zwU5sg63v5flCg==", - "Y5iDQySR2c3MK7RPMCgSrw==", - "GglPoW5fvr4JSM3Zv99oiA==", - "myzvc+2MfxGD9uuvZYdnqQ==", - "V9G1we3DOIQGKXjjPqIppQ==", - "gYvdNJCDDQmNhtJ6NKSuTA==", - "rXtGpN17Onx8LnccJnXwJQ==", - "/a+bLXOq02sa/s8h7PhUTg==", - "htNVAogFakQkTX6GHoCVXg==", - "eshD40tvOA6bXb0Fs/cH3A==", - "K1CGbMfhlhIuS0YHLG30PQ==", - "aOeJZUIZM9YWjIEokFPnzQ==", - "r0hAwlS0mPZVfCSB+2G6uQ==", - "0q+erphtrB+6HBnnYg7O6w==", - "bkRdUHAksJZGzE1gugizYQ==", - "J8v2f6hWFu8oLuwhOeoQjA==", - "qkvEep4vvXhc2ZJ6R449Mg==", - "6HGeEPyTAu9oiKhNVLjQnA==", - "JoATsk/aJH0UcDchFMksWA==", - "QozQL0DTtr+PXNKifv6l6g==", - "HiAgt86AyznvbI2pnLalVQ==", - "lY+tivtsfvU0LJzBQ6itYQ==", - "EfXDc6h69aBPE6qsB+6+Ig==", - "gnAIpoCyl3mQytLFgBEgGA==", - "p2JPOX8yDQ0agG+tUyyT/g==", - "zeELfk015D5krExLKRUYtg==", - "wDiGoFEfIVEDyyc4VpwhWQ==", - "7Ephy+mklG2Y3MFdqmXqlA==", - "8ZFPMJJYVJHsfRpU4DigSg==", - "ocRh5LR1ZIN9Johnht8fhQ==", - "l5f3I6osM9oxLRAwnUnc5A==", - "yxCyBXqGWA735JEyljDP7Q==", - "qE/h/Z+6buZWf+cmPdhxog==", - "HCu4ZMrcLMZbPXbTlWuvvQ==", - "TDrq23VUdzEU/8L5i8jRJQ==", - "L+N/6geuokiLPPSDXM9Qkg==", - "v6jZicMNM3ysm3U5xu0HoQ==", - "b85nxzs8xiHxaqezuDVWvg==", - "ca+kx+kf7JuZ3pfYKDwFlg==", - "KlY5TGg0pR/57TVX+ik1KQ==", - "3jmCreW5ytSuGfmeLv7NfQ==", - "ucLMWnNDSqE4NOCGWvcGWw==", - "NSrzwNlB0bde3ph8k6ZQcQ==", - "nL4iEd3b5v4Y9fHWDs+Lrw==", - "W2x0SBzSIsTRgyWUCOZ/lg==", - "ifZM0gBm9g9L09YlL+vXBg==", - "4WcFEswYU/HHQPw77DYnyA==", - "TLJbasOoVO435E5NE5JDcA==", - "WyCFB4+6lVtlzu3ExHAGbQ==", - "BW0A06zoQw7S+YMGaegT7g==", - "qP1cCE4zsKGTPhjbcpczMw==", - "UVEZPoH9cysC+17MKHFraw==", - "eQ45Mvf5in9xKrP6/qjYbg==", - "fOARCnIg/foF/6tm7m9+3w==", - "lK2xe+OuPutp4os0ZAZx5w==", - "Tug3eh+28ttyf+U7jfpg5w==", - "ENFfP93LA257G6pXQkmIdg==", - "FuWspiqu5g8Eeli5Az+BkA==", - "kIGxCUxSlNgsKZ45Al1lWw==", - "RzeH+G3gvuK1z+nJGYqARQ==", - "0ofMbUCA3/v5L8lHnX4S5w==", - "VI8pgqBZeGWNaxkuqQVe7g==", - "x6lNRGgJcRxgKTlzhc1WPg==", - "La0gzdbDyXUq6YAXeKPuJA==", - "dAq8/1JSQf1f4QPLUitp0g==", - "WN7lFJfw4lSnTCcbmt5nsg==", - "2aDK0tGNgMLyxT+BQPDE8Q==", - "9W57pTzc572EvSURqwrRhw==", - "37Nkh06O979nt7xzspOFyQ==", - "4TQkMnRsXBobbtnBmfPKnA==", - "f/BjtP5fmFw2dRHgocbFlg==", - "9vEgJVJLEfed6wJ7hBUGgQ==", - "HRWYX2XOdsOqYzCcqkwIyw==", - "StDtLMlCI75g4XC59mESEQ==", - "99+SBN45LwKCPfrjUKRPmw==", - "HbT6W1Ssd3W7ApKzrmsbcg==", - "l8/KMItWaW3n4g1Yot/rcQ==", - "s7iW1M6gkAMp+D/3jHY58w==", - "GWwJ32SZqD5wldrXUdNTLA==", - "YhLEPsi/TNyeUJw69SPYzQ==", - "g0aTR8aJ0uVy3YvGYu5xrw==", - "m6get5wjq5j1i5abnpXuZQ==", - "ymtA8EMPMgmMcimWZZ0A1Q==", - "HEcOaEd9zCoOVbEmroSvJg==", - "F8l+Qd9TZgzV+r8G584lKA==", - "3yDD+xT8iRfUVdxcc7RxKw==", - "1eRUCdIJe3YGD5jOMbkkOg==", - "DO1/jfP/xBI9N0RJNqB2Rw==", - "SiSlasZ+6U2IZYogqr2UPg==", - "tBQDfy48FnIOZI04rxfdcA==", - "HEghmKg3GN60K7otpeNhaA==", - "mTLBkP+yGHsdk5g7zLjVUw==", - "RgtwfY5pTolKrUGT+6Pp6g==", - "EyIsYQxgFa4huyo/Lomv7g==", - "HwLSUie8bzH+pOJT3XQFyg==", - "7Tauesu7bgs5lJmQROVFiQ==", - "ojugpLIfzflgU2lonfdGxA==", - "ZqjnqxZE/BjOUY0CMdVl0g==", - "oQjugfjraFziga1BcwRLRA==", - "JXCYeWjFqcdSf6QwB54G+A==", - "TeBGJCqSqbzvljIh9viAqA==", - "1Gpj4TPXhdPEI4zfQFsOCg==", - "asouSfUjJa8yfMG7BBe+fA==", - "ccy3Ke2k4+evIw0agHlh3w==", - "CzSumIcYrZlxOUwUnLR2Zw==", - "9QFYrCXsGsInUb4SClS3cQ==", - "3RTtSaMp1TZegJo5gFtwwA==", - "aTWiWjyeSDVY/q8y9xc2zg==", - "UK+R+hAoVeZ4xvsoZjdWpw==", - "rHagXw+CkF3uEWPWDKXvog==", - "MfkyURTBfkNZwB+wZKjP4g==", - "Qf7JFJJuuacSzl6djUT2EQ==", - "K1RL+tLjICBvMupe7QppIQ==", - "R2OOV18CV/YpWL1xzr/VQg==", - "o+areESiXgSO0Lby56cBeg==", - "VPqyIomYm7HbK5biVDvlpw==", - "pw1jplCdTC+b0ThX0FXOjw==", - "gTnsH3IzALFscTZ1JkA9pw==", - "JYJvOZ4CHktLrYJyAbdOnA==", - "P8lUiLFoL100c9YSQWYqDA==", - "LATQEY7f47i77M6p11wjWA==", - "U9kE50Wq5/EHO03c5hE4Ug==", - "pFKzcRHSUBqSMtkEJvrR1Q==", - "vHVXsAMQqc0qp7HA5Q+YkA==", - "3XyoREdvhmSbyvAbgw2y/A==", - "qOEIUWtGm5vx/+fg4tuazg==", - "a6IszND1m+6w+W+CvseC7g==", - "KuNY8qAJBce+yUIluW8AYw==", - "5Wcq+6hgnWsQZ/bojERpUw==", - "l2ZB9TvT68rn8AAN4MdxWw==", - "h5HsEsObPuPFqREfynVblw==", - "fvm0IQfnbfZFETg9v3z/Fg==", - "QV0OG5bpjrjku4AzDvp9yw==", - "nMuMtK/Zkb3Xr34oFuX/Lg==", - "jMZKSMP2THqwpWqJNJRWdw==", - "fX4G68hFL7DmEmjbWlCBJQ==", - "ZlBNHAiYsfaEEiPQ1z+rCA==", - "ckugAisBNX18eQz+EnEjjw==", - "Dt6hvhPJu94CJpiyJ5uUkg==", - "eYE9No9sN5kUZ5ePEyS3+Q==", - "Tp52d1NndiC9w3crFqFm9g==", - "MBjMU/17AXBK0tqyARZP5w==", - "1EI9aa955ejNo1dJepcZJw==", - "FqWLkhWl0iiD/u2cp+XK9A==", - "j8nMH8mK/0Aae7ZkqyPgdg==", - "ZtmnX24AwYAXHb2ZDC6MeQ==", - "who8uUamlHWHXnBf7dwy4A==", - "CmkmWcMK4eqPBcRbdnQvhw==", - "61V74uIjaSfZM8au1dxr1A==", - "778O1hdVKHLG2q9dycUS0Q==", - "IdadoCPmSgHDHzn1zyf8Jw==", - "Z2rwGmVEMCY6nCfHO3qOzw==", - "Q3TpCE+wnmH/1h/EPWsBtQ==", - "HnVfyqgJ+1xSsN4deTXcIA==", - "XgPHx2+ULpm14IOZU2lrDg==", - "IbN736G1Px5bsYqE5gW1JQ==", - "nY/H7vThZ+dDxoPRyql+Cg==", - "wlWxtQDJ+siGhN2fJn3qtw==", - "MrbEUlTagbesBNg0OemHpw==", - "LJtRcR70ug6UHiuqbT6NGw==", - "hSNZWNKUtDtMo6otkXA/DA==", - "LawT9ZygiVtBk0XJ+KkQgQ==", - "DLzHkTjjuH6LpWHo2ITD0Q==", - "i8XXN7jcrmhnrOVDV8a2Hw==", - "ogcuGHUZJkmv+vCz567a2g==", - "rUp5Mfc57+A8Q29SPcvH/Q==", - "6706ncrH1OANFnaK6DUMqQ==", - "gK7dhke5ChQzlYc/bcIkcg==", - "t3Txxjq43e/CtQmfQTKwWg==", - "6ZMs9vCzK9lsbS6eyzZlIA==", - "uTHBqApdKOAgdwX3cjrCYQ==", - "zirOtGUXeRL22ezfotZfQg==", - "iK0dWKHjVVexuXvMWJV9pg==", - "uzEgwx1iAXAvWPKSVwYSeQ==", - "FHvI0IVNvih8tC7JgzvCOw==", - "jjNMPXbmpFNsCpWY0cv3eg==", - "/cJ0Nn5YbXeUpOHMfWXNHQ==", - "WkSJpxBa45XJRWWZFee7hw==", - "edlXkskLx287vOBZ9+gVYg==", - "+Pl0bSMBAdXpRIA+zE02JA==", - "3xw8+0/WU51Yz4TWIMK8mw==", - "GdTanUprpE3X/YjJDPpkhQ==", - "qnsBdl050y9cUaWxbCczRw==", - "pnJnBzAJlO4j3IRqcfmhkQ==", - "USq1iF90eUv41QBebs3bhw==", - "QH3lAwOYBAJ0Fd5pULAZqw==", - "gvvyX5ATi4q9NhnwxRxC8w==", - "7xDIG/80SnhgxAYPL9YJtg==", - "WVhfn2yJZ43qCTu0TVWJwA==", - "twjiDKJM7528oIu/el4Zbg==", - "6sBemZt4qY/TBwqk3YcLOQ==", - "m3XYojKO+I6PXlVRUQBC3w==", - "gUNP5w7ANJm257qjFxSJrA==", - "mMLhjdWNnZ8zts9q+a2v3g==", - "kjWYVC7Eok2w2YT4rrI+IA==", - "ZzT5b0dYQXkQHTXySpWEaA==", - "YzTV0esAxBFVls3e0qRsnA==", - "9xmtuClkFlpz/X5E9JBWBA==", - "nhAnHuCGXcYlqzOxrrEe1g==", - "cbBXgB1WQ/i8Xul0bYY2fg==", - "AkAes5oErTaJiGD2I4A1Pw==", - "Wx9jh/teM0LJHrvTScssyQ==", - "fU5ZZ1bIVsV+eXxOpGWo/Q==", - "k8eZxqwxiN/ievXdLSEL/w==", - "E2LR1aZ3DcdCBuVT7BhReA==", - "1eCHcz4swFH+uRhiilOinQ==", - "JipruVZx4ban3Zo5nNM37g==", - "IPLD9nT5EEYG9ioaSIYuuA==", - "pHozgRyMiEmyzThtJnY4MQ==", - "p0eNK7zJd7D/HEGaVOrtrQ==", - "dGjcKAOGBd4gIjJq7fL+qQ==", - "uMq8cDVWFD+tpn8aeP8Pqg==", - "gC7gUwGumN7GNlWwfIOjJQ==", - "It+K/RCYMOfNrDZxo7lbcA==", - "4CfEP8TeMKX33ktwgifGgA==", - "nxDGRpePV3H4NChn4eLwag==", - "300hoYyMR/mk1mfWJxS8/w==", - "DmxgZsQg+Qy1GP0fPkW3VA==", - "1vqRt79ukuvdJNyIlIag8Q==", - "RWI0HfpP7643OSEZR8kxzw==", - "zZtYkKU50PPEj6qSbO5/Sw==", - "UNRlg6+CYVOt68NwgufGNA==", - "kkbX+a00dfiTgbMI+aJpMg==", - "VIC7inSiqzM6v9VqtXDyCw==", - "l+x2QhxG8wb5AQbcRxXlmA==", - "GUiinC3vgBjbQC2ybMrMNQ==", - "6uMF5i0b/xsk55DlPumT7A==", - "aK9nybtiIBUvxgs1iQFgsw==", - "BLbTFLSb4mkxMaq4/B2khg==", - "mTAqtg6oi0iytHQCaSVUsA==", - "eBapvE+hdyFTsZ0y5yrahg==", - "lHN2dn2cUKJ8ocVL3vEhUQ==", - "Mj87ajJ/yR41XwAbFzJbcA==", - "FA+nK6mpFWdD0kLFcEdhxA==", - "FrTgaF5YZCNkyfR1kVzTLQ==", - "5eHStFN7wEmIE+uuRwIlPQ==", - "AyWlT+EGzIXc395zTlEU5Q==", - "I+wVQA+jpPTJ6xEsAlYucg==", - "Y1flEyZZAYxauMo4cmtJ1w==", - "1AeReq55UQotRQVKJ66pmg==", - "xzGzN5Hhbh0m/KezjNvXbQ==", - "meHzY9dIF7llDpFQo1gyMg==", - "RnOXOygwJFqrD+DlM3R5Ew==", - "JKg64m6mU7C/CkTwVn4ASg==", - "gGLz3Ss+amU7y6JF09jq7A==", - "Pu9pEf+Tek3J+3jmQNqrKw==", - "EATnlYm0p3h04cLAL95JgA==", - "o64LDtKq/Fulf1PkVfFcyg==", - "hUWqqG1QwYgGC5uXJpCvJw==", - "RfSwpO/ywQx4lfgeYlBr2w==", - "VaJc9vtYlqJbRPGb5Tf0ow==", - "9JKIJrlQjhNSC46H3Cstcw==", - "6Z9myGCF5ylWljgIYAmhqw==", - "9bAWYElyRN1oJ6eJwPtCtQ==", - "ohK6EftXOqBzIMI+5XnESw==", - "AVjwqrTBQH1VREuBlOyUOg==", - "G2UponGde3/Z+9b2m9abpQ==", - "DoiItHSms0B9gYmunVbRkQ==", - "vUC0HlTTHj6qNHwfviDtAw==", - "hq35Fjgvrcx6I9e6egWS4w==", - "sw+bmpzqsM4gEQtnqocQLQ==", - "ApiuEPWr8UjuRyJjsYZQBw==", - "VXu4ARjq7DS2IR/gT24Pfw==", - "3TbRZtFtsh9ez8hqZuTDeA==", - "CazLJMJjQMeHhYLwXW7YNg==", - "ROSt+NlEoiPFtpRqKtDUrQ==", - "IUwVHH6+8/0c+nOrjclOWA==", - "lkzFdvtBx5bV6xZO0cxK7g==", - "4ekt4m38G9m599xJCmhlug==", - "fzkmVWKhJsxyCwiqB/ULnQ==", - "LZAKplVoNjeQgfaHqkyEJA==", - "91vfsZ7Lx9x5gqWTOdM4sg==", - "MVoxyIA+emaulH8Oks8Weg==", - "oGH7SMLI2/qjd9Vnhi3s0A==", - "vmqfGJE6r4yDahtU/HLrxw==", - "Y5KKN7t/v9JSxG/m1GMPSA==", - "gXlb7bbRqHXusTE5deolGA==", - "/2c4oNniwhL3z5IOngfggg==", - "HgIFX42oUdRPu7sKAXhNWg==", - "A3dX2ShyL9+WOi6MNJBoYQ==", - "hN9bmMHfmnVBVr+7Ibd2Ng==", - "DB706G73NpBSRS8TKQOVZw==", - "JSyq2MIuObPnEgEUDyALjQ==", - "kSUectNPXpXNg+tIveTFRw==", - "XVVy3e6dTnO3HpgD6BtwQw==", - "td7nDgTDmKPSODRusMcupw==", - "Lt/pVD4TFRoiikmgAxEWEw==", - "mmRob7iyTkTLDu8ObmTPow==", - "Fd0c8f2eykUp9GYhqOcKoA==", - "18RKixTv12q3xoBLz6eKiA==", - "RClzwwKh51rbB4ekl99EZA==", - "oONlXCW4aAqGczQ/bUllBw==", - "foPAmiABJ3IXBoed2EgQXA==", - "wEJDulZafLuXCvcqBYioFQ==", - "K1RgR6HR5uDEQgZ32TAFgA==", - "SEIZhyguLoyH7So0p1KY0A==", - "ggIfX1J4dX3xQoHnHUI7VA==", - "HBRzLacCVYfwUVGzrefZYg==", - "aWZRql2IUPVe9hS3dxgVfQ==", - "Err1mbWJud80JNsDEmXcYg==", - "Z2MkqmpQXdlctCTCUDPyzw==", - "JnE6BK0vpWIhNkaeaYNUzw==", - "5dUry23poD+0wxZ3hH6WmA==", - "DwP0MQf71VsqvAbAMtC3QQ==", - "kHcBZXoxnFJ+GMwBZ/xhfQ==", - "SUAwMWLMml8uGqagz5oqhQ==", - "79uTykH43voFC3XhHHUzKg==", - "P5fucOJhtcRIoElFJS4ffg==", - "s8NpalwgPdHPla7Zi9FJ3w==", - "8cXqZub6rjgJXmh1CYJBOg==", - "tY916jrSySzrL+YTcVmYKQ==", - "DRiFNojs7wM8sfkWcmLnhQ==", - "wqUJ1Gq1Yz2cXFkbcCmzHQ==", - "0u+0WHr7WI6IlVBBgiRi6w==", - "GCYI9Dn1h3gOuueKc7pdKA==", - "nVDxVhaa2o38gd1XJgE3aw==", - "5I/heFSQG/UpWGx0uhAqGQ==", - "1PvTn90xwZJPoVfyT5/uIQ==", - "jHOoSl3ldFYr9YErEBnD3w==", - "swJhrPwllq5JORWiP5EkDA==", - "tj2rWvF2Fl+XIccctj8Mhw==", - "QvYZxsLdu+3nV/WhY1DsYg==", - "fKalNdhsyxTt1w08bv9fJA==", - "CHLHizLruvCrVi9chj9sXA==", - "sa2DECaqYH1z1/AFhpHi+g==", - "LbPp1oL0t3K2BAlIN+l8DA==", - "5SbwLDNT6sBOy6nONtUcTg==", - "AfVPdxD3FyfwwNrQnVNQ7A==", - "jt9Ocr9D8EwGRgrXVz//aQ==", - "KkwQL0DeUM3nPFfHb2ej+A==", - "WwraoO97OTalvavjUsqhxQ==", - "fAKFfwlCOyhtdBK6yNnsNg==", - "EqMlrz1to7HG4GIFTPaehQ==", - "YmjZJyNfHN5FaTL/HAm8ww==", - "L2D7G0btrwxl9V4dP3XM5Q==", - "oUqO4HrBvkpSL781qAC9+w==", - "c6Yhwy/q3j7skXq52l36Ww==", - "FWphIPZMumqnXr1glnbK4w==", - "AcKwfS8FRVqb72uSkDNY/Q==", - "uSIiF1r9F18avZczmlEuMQ==", - "XrFDomoH2qFjQ2jJ2yp9lA==", - "N2X7KWekNN+fMmwyXgKD5w==", - "IdmcpJXyVDajzeiGZixhSA==", - "Wf2olJCYZRGTTZxZoBePuQ==", - "oVlG+0rjrg2tdFImxIeVBA==", - "7w4PDRJxptG8HMe/ijL6cQ==", - "rueNryrchijjmWaA3kljYg==", - "ZybIEGf1Rn/26vlHmuMxhw==", - "yYVW07lOZHdgtX42xJONIA==", - "4ifNsmjYf1iOn2YpMfzihg==", - "KTjwL+qswa+Bid8xLdjMTg==", - "THfzE2G2NVKKfO+A2TjeFw==", - "QoqHzpHDHTwQD5UF30NruQ==", - "dTMoNd6DDr1Tu8tuZWLudw==", - "wOc4TbwQGUwOC1B3BEZ4OQ==", - "gfhkPuMvjoC3CGcnOvki3Q==", - "vljJciS+uuIvL7XXm5688g==", - "EGLOaMe6Nvzs/cmb7pNpbg==", - "oLWWIn/2AbKRHnddr2og9g==", - "7l0RMKbONGS/goW/M+gnMQ==", - "eFkXKRd2dwu/KWI5ZFpEzw==", - "jWsC7kdp2YmIZpfXGUimiA==", - "Jcxjli2tcIAjCe+5LyvqdQ==", - "MUkRa/PjeWMhbCTq43g6Aw==", - "g2nh2xENCFOpHZfdEXnoQA==", - "x6M66krXSi0EhppwmDmsxA==", - "26Wmdp6SkKN74W0/XPcnmA==", - "ycjv4XkS5O7zcF3sqq9MwQ==", - "gfnbviaVhKvv1UvlRGznww==", - "aIPde9CtyZrhbHLK740bfw==", - "0p8YbEMxeb73HbAfvPLQRw==", - "Is3uxoSNqoIo5I15z6Z2UQ==", - "NZtcY8fIpSKPso/KA6ZfzA==", - "iQ304I1hmLZktA1d1cuOJA==", - "0QB0OUW5x2JLHfrtmpZQ+w==", - "kgyUtd8MFe0tuuxDEUZA9w==", - "AcbG0e6xN8pZfYAv7QJe1Q==", - "bb/U8UynPHwczew/hxLQxw==", - "NuBYjwlxadAH+vLWYRZ3bg==", - "Ao1Zc0h5AdSHtYt1caWZnQ==", - "FL/j3GJBuXdAo54JYiWklQ==", - "E2v8Kk60qVpQ232YzjS2ow==", - "zVupSPz7cD0v/mD/eUIIjg==", - "sEeblUmISi1HK4omrWuPTA==", - "xQpYjaAmrQudWgsdu24J0A==", - "vCekQ2nOQKiN/q8Be/qwZg==", - "8g08gjG/QtvAYer32xgNAg==", - "miiOqnhtef1ODjFzMHnxjA==", - "sXlFMSTBFnq0STHj6cS/8w==", - "+SclwwY8R2RPrnX54Z+A6w==", - "g8TcogVxHpw7uhgNFt5VCQ==", - "9viAzLFGYYudBYFu7kFamg==", - "BAJ+/jbk2HyobezZyB9LiQ==", - "/DJgKE9ouibewuZ2QEnk6w==", - "fxg/vQq9WPpmQsqQ4RFYaA==", - "lM/EhwTsbivA7MDecaVTPw==", - "pVgjGg4TeTNhKimyOu3AAw==", - "gYnznEt9r97haD/j2Cko7g==", - "/ngbFuKIAVpdSwsA3VxvNw==", - "VCL3xfPVCL5RjihQM59fgg==", - "eDWsx4isnr2xPveBOGc7Hw==", - "FIOCTEbzb2+KMCnEdJ7jZw==", - "40HzgVKYnqIb6NJhpSIF0A==", - "ccK42Lm8Tsv73YMVZRwL6A==", - "MpAwWMt7bcs4eL7hCSLudQ==", - "zxsSqovedB3HT99jVblCnQ==", - "4erEA42TqGA9K4iFKkxMMA==", - "BaRwTrc5ulyKbW4+QqD0dw==", - "CT3ldhWpS1SEEmPtjejR/Q==", - "lkl6XkrTMUpXi46dPxTPxg==", - "3EhLkC9NqD3A6ApV6idmgg==", - "fsW2DaKYTCC7gswCT+ByQQ==", - "pW4gDKtVLj48gNz6V17QdA==", - "KjfL7YyVqmCJGBGDFdJ0gw==", - "bGGUhiG9SqJMHQWitXTcYQ==", - "8RtLlzkGEiisy1v9Xo0sbw==", - "R81DX/5a7DYKkS4CU+TL+w==", - "Tu6w6DtX2RJJ3Ym3o3QAWw==", - "nx/U4Tode5ILux4DSR+QMg==", - "mjQS8CpyGnsZIDOIEdYUxg==", - "wJpepvmtQQ3sz3tVFDnFqw==", - "a4rPqbDWiMivVzaRxvAj7g==", - "6o5g9JfKLKQ2vBPqKs6kjg==", - "UzPPFSXgeV7KW4CN5GIQXA==", - "NdVyHoTbBhX6Umz/9vbi0g==", - "Fzuq+Wg7clo6DTujNrxsSA==", - "XXFr0WUuGsH5nXPas7hR3Q==", - "JVSLiwurnCelNBiG2nflpQ==", - "NiawWuMBDo0Q3P2xK/vnLQ==", - "nNaGqigseHw30DaAhjBU3g==", - "+edqJYGvcy1AH2mEjJtSIg==", - "1WIi4I62GqkjDXOYqHWJfQ==", - "rwplpbNJz0ADUHTmzAj15Q==", - "iWNlSnwrtCmVF89B+DZqOQ==", - "tHDbi43e6k6uBgO0hA+Uiw==", - "fHNpW230mNib08aB7IM3XQ==", - "OChiB4BzcRE8Qxilu6TgJg==", - "d+ctfXU0j07rpRRzb5/HDA==", - "GDMqfhPQN0PxfJPnK1Bb9A==", - "bLd38ZNkVeuhf0joEAxnBQ==", - "nvUKoKfC6j8fz3gEDQrc/w==", - "fhcbn9xE/6zobqQ2niSBgA==", - "HGxe+5/kkh6R9GXzEOOFHA==", - "mPwCyD0yrIDonVi+fhXyEQ==", - "5PfGtbH9fmVuNnq83xIIgQ==", - "XePy/hhnQwHXFeXUQQ55Vg==", - "yfAaL0MMtSXPQ37pBdmHxQ==", - "NiQ/m4DZXUbpca9aZdzWAw==", - "uT6WRh5UpVdeABssoP2VTg==", - "oxoZP897lgMg/KLcZAtkAg==", - "oKt57TPe4PogmsGssc3Cbg==", - "RxmdoO8ak8y/HzMSIm+yBQ==", - "6leyDVmC5jglAa98NQ3+Hg==", - "+QosBAnSM2h4lsKuBlqEZw==", - "hy303iin+Wm7JA6MeelwiQ==", - "m9iuy4UtsjmyPzy6FTTZvw==", - "f6Ye5F0Lkn34uLVDCzogFQ==", - "iGykaF+h4p46HhrWqL8Ffg==", - "LPYFDbTEp5nGtG6uO8epSw==", - "t2vWMIh2BvfDSQaz5T1TZw==", - "OONAvFS/kmH7+vPhAGTNSg==", - "g/z9yk94XaeBRFj4hqPzdw==", - "2wesXiib76wM9sqRZ7JYwQ==", - "n7h9v2N1gOcvMuBEf8uThw==", - "ITYL3tDwddEdWSD6J6ULaA==", - "inrUwXyKikpOW0y2Kl1wGw==", - "iwKBOGDTFzV4aXgDGfyUkw==", - "+fcjH2kZKNj8quOytUk4nQ==", - "Srl4HivgHMxMOUHyM3jvNw==", - "qngzBJbiTB4fivrdnE5gOg==", - "G0MlFNCbRjXk4ekcPO/chQ==", - "t+bYn9UqrzKiuxAYGF7RLA==", - "RVD3Ij6sRwwxTUDAxwELtA==", - "RNdyt6ZRGvwYG5Ws3QTuEA==", - "9DRHdyX8ECKHUoEsGuqR4Q==", - "oMJLQTH1wW7LvOV0KRx/dw==", - "bjLZ7ot/X/vWSVx4EYwMCg==", - "+p8pofUlwn8vV6Rp6+sz9g==", - "cchuqe+CWCJpoakjHLvUfA==", - "NvurnIHin4O+wNP7MnrZ1w==", - "RBMv0IxXEO3o7MnV47Bzow==", - "xTizUioizbMQxD0T6fy/EQ==", - "ZCdad3AwhVArttapWFwT/Q==", - "Hy1nqC40l5ItxumkIC2LAA==", - "W/5ThNLu43uT1O+fg0Fzwg==", - "b3BQG9/9qDNC/bNSTBY/sQ==", - "neQoa8pvETr07blVMN3pgA==", - "oR8rvIZoeoaZ/ufpo0htfQ==", - "zEzWZ6l7EKoVUxvk/l78Mw==", - "IHyIeMad23fSDisblwyfpA==", - "m6srF+pMehggHB1tdoxlPg==", - "kggaIvN2tlbZdZRI8S5Apw==", - "2RFaMPlSbVuoEqKXgkIa5A==", - "//eHwmDOQRSrv+k9C/k3ZQ==", - "X/Gha4Ajjm/GStp/tv+Jvw==", - "+H0Rglt/HnhZwdty2hsDHg==", - "a1aL8zQ+ie3YPogE3hyFFg==", - "HxEU37uBMeiR5y8q/pM42g==", - "68nqDtXOuxF7DSw6muEZvg==", - "s5+78jS4hQYrFtxqTW3g1Q==", - "drfODfDI6GyMW7hzkmzQvA==", - "pT1raq2fChffFSIBX3fRiA==", - "sfowXUMdN2mCoBVrUzulZg==", - "AV/YJfdoDUdRcrXVwinhQg==", - "3AKEYQqpkfW7CZMFQZoxOw==", - "PHwJ5ZAqqftZ4ypr8H1qiQ==", - "AoN/pnK4KEUaGw4V9SFjpg==", - "soBA65OmZdfBGJkBmY/4Iw==", - "mSstwJq7IkJ0JBJ5T8xDKg==", - "h13Xuonj+0dD1xH86IhSyQ==", - "HK9xG03FjgCy8vSR+hx8+Q==", - "oFanDWdePmmZN0xqwpUukA==", - "zCRZgVsHbQZcVMHd9pGD3A==", - "EvSB+rCggob2RBeXyDQRvQ==", - "tXuu7YpZOuMLTv87NjKerA==", - "DJ+a37tCaGF5OgUhG+T0NA==", - "KkXlgPJPen6HLxbNn5llBw==", - "2W6lz1Z7PhkvObEAg2XKJw==", - "n+xYzfKmMoB3lWkdZ+D3rg==", - "CPDs+We/1wvsGdaiqxzeCQ==", - "2Wvk/kouEEOY0evUkQLhOQ==", - "ezsm4aFd6+DO9FUxz0A8Pg==", - "9sYLg75/hudZaBA3FrzKHw==", - "Pp1ZMxJ8yajdbfKM4HAQxA==", - "xiyRfVG0EfBA+rCk+tgWRQ==", - "/IarsLzJB8bf0AupJJ+/Eg==", - "LJeLdqmriyAQp+QjZGFkdQ==", - "IhHyHbHGyQS+VawxteLP0w==", - "nGzPc0kI/EduVjiK7bzM6Q==", - "m06wctjNc3o7iyBHDMZs2w==", - "mSJF9dJnxZ15lTC6ilbJ2A==", - "xdmY+qyoxxuRZa9kuNpDEg==", - "oNOI17POQCAkDwj6lJsYOA==", - "p73gSu4d+4T/ZNNkIv9Nlw==", - "vOJ55zFdgPPauPyFYBf01w==", - "4A+RHIw+aDzw0rSRYfbc7g==", - "/gi3UZmunVOIXhZSktZ8zQ==", - "a6vem8n6WmRZAalDrHNP0g==", - "kGeXrHEN6o7h5qJYcThCPw==", - "wrewZ0hoHODf7qmoGcOd7g==", - "Z0sjccxzKylgEiPCFBqPSA==", - "LKyOFgUKKGUU/PxpFYMILw==", - "L2RofFWDO0fVgSz4D2mtdw==", - "KI7tQFYW38zYHOzkKp9/lQ==", - "ewe/P3pJLYu/kMb5tpvVog==", - "IADk81pIu8NIL/+9Fi94pA==", - "0L0FVcH5Dlj3oL8+e9Na7g==", - "tdiTXKrkqxstDasT0D5BPA==", - "R906Kxp2VFVR3VD+o6Vxcw==", - "wc+8ohFWgOF4VlSYiZIGwQ==", - "wJKFMqh6MGctWfasjHrPEg==", - "UHpge5Bldt9oPGo2oxnYvQ==", - "vX7RIhatQeXAMr1+OjzhZw==", - "s2AKVTwrY65/SWqQxDGJQg==", - "Q4bfQslDSqU64MOQbBQEUw==", - "mVT74Eht+gAowINoMKV7IQ==", - "EuGWtIbyKToOe6DN3NkVpQ==", - "ALlGgVDO8So71ccX0D6u2g==", - "Rww3qkF3kWSd+AaMT0kfdw==", - "hlvtFGW8r0PkbUAYXEM+Hw==", - "Oc3BqTF3ZBW3xE0QsnFn/A==", - "3j0kFUZ6g+yeeEljx+WXGg==", - "8BLkvEkfnOizJq0OTCYGzw==", - "Lqel4GdU0ZkfoJVXI5WC/Q==", - "rvE64KQGkVkbl07y7JwBqw==", - "HbXv8InyZqFT7i3VrllBgg==", - "zwQ/3MzTJ9rfBmrANIh14w==", - "gglLMohmJDPRGMY1XKndjQ==", - "lyfqic/AbEJbCiw+wA01FA==", - "XqUO7ULEYhDOuT/I2J8BOA==", - "wPhJcp7U7IVX83szbIOOxQ==", - "1gA65t5FiBTEgMELTQFUPQ==", - "ll2M0QQzBsj5OFi02fv3Yg==", - "wt+qDLU38kzNU75ZYi3Hbw==", - "a4EYNljinYTx9vb1VvUA6A==", - "T6LA+daQqRI38iDKZTdg1A==", - "gwyVIrTk5o0YMKQq4lpJ+Q==", - "bPRX2zl+K1S0iWAWUn1DZw==", - "KQw25X4LnQ9is+qdqfxo0w==", - "6tfM6dx3R5TiVKaqYQjnCg==", - "OlwHO6Sg2zIwsCOCRu0HiQ==", - "mr1qjhliRfl87wPOrJbFQg==", - "8c+lvG5sZNimvx9NKNH3ug==", - "5Nk2Z94DhlIdfG5HNgvBbQ==", - "F50iXjRo1aSTr37GQQXuJA==", - "tfgO55QqUyayjDfQh+Zo1Q==", - "h7Fc+eT/GuC8iWI+YTD0UQ==", - "3TjntNWtpG7VqBt3729L6Q==", - "+DWs0vvFGt6d3mzdcsdsyA==", - "VJt2kPVBLEBpGpgvuv1oUw==", - "XLq/nWX8lQqjxsK9jlCqUg==", - "9s3ar9q32Y5A3tla5GW/2Q==", - "51yLpfEdvqXmtB6+q27/AQ==", - "AiMtfedwGcddA+XYNc+21g==", - "p/48hurJ1kh2FFPpyChzJg==", - "CRiL6zpjfznhGXhCIbz8pQ==", - "/jDVt9dRIn+o4IQ1DPwbsg==", - "UNdKik7Vy23LjjPzEdzNsg==", - "Koiog/hpN7ew5kgJbty34A==", - "4itEKfbRCJvqlgKnyEdIOQ==", - "zi04Yc01ZheuFAQc59E45A==", - "etRjRvfL/IwceY/IJ1tgzQ==", - "3sNJJIx1NnjYcgJhjOLJOg==", - "4yVqq66iHYQjiTSxGgX2oA==", - "Q8RVI/kRbKuXa8HAQD7zUA==", - "OERGn45uzfDfglzFFn6JAg==", - "JGEy6VP3sz3LHiyT2UwNHQ==", - "1zDfWw5LdG20ClNP1HYxgw==", - "TGB+FIzzKnouLh5bAiVOQg==", - "n5GA+pA9mO/f4RN9NL9lNg==", - "bUxQBaqKyvlSHcuRL9whjg==", - "tOdlnsE3L3XCBDJRmb/OqA==", - "XdkxmYYooeDKzy7PXVigBQ==", - "PMvG4NqJP76kMRAup6TSZA==", - "qpFJZqzkklby+u1UT3c1iA==", - "fW3QZyq5UixIA1mP6eWgqQ==", - "9nMltdrrBmM5ESBY2FRjGA==", - "1Vtrv6QUAfiYQjlLTpNovg==", - "ur9JDCVNwzSH4q4ngDlHNQ==", - "4u3eyKc+y3uRnkASrgBVUw==", - "XddlSluOH6VkR7spFIFmdQ==", - "NOmu8oZc6CcKLu+Wfz2YOQ==", - "3Ejtsqw3Iep/UQd0tXnSlg==", - "y/e3HSdg7T19FanRpJ7+7Q==", - "YodhkayN5wsgPZEYN7/KNA==", - "pZfn6IiG+V28fN8E2hawDQ==", - "jGHMJqbj6X1NdTDyWmXYAQ==", - "olTSlmirL9MFhKORiOKYkQ==", - "CrJDgdfzOea2M2hVedTrIg==", - "fpXijBOM3Ai1RkmHven5Ww==", - "eLYKLr4labZeLiRrDJ9mnA==", - "9vmJUS7WIVOlhMqwipAknQ==", - "G7J/za99BFbAZH+Q+/B8WA==", - "Hb+pdSavvJ9lUXkSVZW8Og==", - "gTB2zM3RPm27mUQRXc/YRg==", - "e5KCqQ/1GAyVMRNgQpYf6g==", - "1ApqwW7pE+XUB2Cs2M6y7g==", - "/wiA2ltAuWyBhIvQAYBTQw==", - "HFCQEiZf7/SNc+oNSkkwlA==", - "JFi6N1PlrpKaYECOnI7GFg==", - "E4ojRDwGsIiyuxBuXHsKBA==", - "+25t/2lo0FUEtWYK8LdQZQ==", - "up2MVDi9ve+s83/nwNtZ7Q==", - "cXpfd6Io6Glj2/QzrDMCvA==", - "DCvI9byhw0wOFwF1uP6xIQ==", - "PibGJQNw7VHPTgqeCzGUGA==", - "0ZRGz+oj2infCAkuKKuHiQ==", - "2QS/6OBA1T01NlIbfkTYJg==", - "P14k+fyz0TG9yIPdojp52w==", - "g5EzTJ0KA4sO3+Opss3LMg==", - "R5oOM58zdbVxFSDQnNWqeA==", - "Vg2E5qEDfC+QxZTZDCu9yQ==", - "YPgMthbpcBN2CMkugV60hQ==", - "gZWTFt5CuLqMz6OhWL+hqQ==", - "YrEP9z2WPQ8l7TY1qWncDA==", - "7p4NpnoNSQR7ISg+w+4yFg==", - "9L6yLO93sRN70+3qq3ObfA==", - "QH36wzyIhh6I56Vnx79hRA==", - "9DtM1vls4rFTdrSnQ7uWXw==", - "ZlOAnCLV1PkR0kb3E+Nfuw==", - "9UhKmKtr4vMzXTEn74BEhg==", - "Ndx5LDiVyyTz/Fh3oBTgvA==", - "mXZ4JeBwT2WJQL4a/Tm4jQ==", - "N9nD7BGEM7LDwWIMDB+rEQ==", - "dmAfbd9F0OJHRAhNMEkRsA==", - "jV/D2B11NLXZRH77sG9lBw==", - "1C50kisi9nvyVJNfq2hOEQ==", - "NMbAjbnuK7EkVeY3CQI5VA==", - "J1nYqJ7tIQK1+a/3sMXI/Q==", - "m416yrrAlv+YPClGvGh+qQ==", - "rLZII1R6EGus+tYCiUtm6g==", - "xktOghh1S9nIX6fXWnT+Ug==", - "FcFcn4qmPse5mJCX5yNlsA==", - "xAAipGfHTGTjp9Qk1MR8RQ==", - "RQOlmzHwQKFpafKPJj0D8w==", - "WRjYdKdtnd1G9e/vFXCt0g==", - "z0BU//aSjYHAkGGk3ZSGNg==", - "M55eersiJuN9v61r8DoAjQ==", - "l2mAbuFF3QBIUILDODiUHQ==", - "IhpXs1TK7itQ3uTzZPRP5Q==", - "t2EkpUsLOEOsrnep0nZSmA==", - "lMaO8Yf+6YNowGyhDkPhQA==", - "UbSFw5jtyLk5MealqJw++A==", - "5u2PdDcIY3RQgtchSGDCGg==", - "MQYM3BT77i35LG9HcqxY2Q==", - "8AfCSZC0uasVON9Y/0P2Pw==", - "evaWFoxZNQcRszIRnxqB+A==", - "+8PiQt6O7pJI/nIvQpDaAg==", - "eRwaYiog2DdlGQyaltCMJg==", - "JyUJEnU6hJu8x2NCnGrYFw==", - "l0E0U/CJsyCVSTsXW4Fp+w==", - "XV13yK0QypJXmgI+dj4KYw==", - "jrRH0aTUYCOpPLZwzwPRfQ==", - "N3YDSkBUqSmrmNvZZx4a1Q==", - "0yJ7TQYzcp3DXVSvwavr+w==", - "rhgtLQh0F9bRA6IllM7AGw==", - "IWZnTJ3Hb9qw9HAK/M9gTw==", - "izeyFvXOumNgVyLrbKW45g==", - "xYD8jrCDmuQna+p1ebnKDQ==", - "SOdpdrk2ayeyv0xWdNuy9g==", - "HYylUirJRqLm+dkp39fSOQ==", - "q4z6A4l3nhX3smTmXr+Sig==", - "Zyo0fzewcqXiKe2mAwKx5g==", - "LMEtzh0+J27+4zORfcjITw==", - "LoUv/f2lcWpjftzpdivMww==", - "mXBfDUt/sBW5OUZs2sihvw==", - "PggVPQL5YKqSU/1asihcrg==", - "mI0eT4Rlr7QerMIngcu/ng==", - "NmQrsmb8PVP05qnSulPe5Q==", - "TcyyXrSsQsnz0gJ36w4Dxw==", - "y4mfEDerrhaqApDdhP5vjA==", - "ynaj4XjU27b7XbqPyxI8Ig==", - "Ua6aO6HwM+rY4sPR19CNFA==", - "3go7bJ9WqH/PPUTjNP3q/Q==", - "n1ixvP7SfwYT3L2iWpJg6A==", - "W8y32OLHihfeV0XFw7LmOg==", - "uzkNhmo2d08tv5AmnyqkoQ==", - "hJ8leLNuJ6DK5V8scnDaZQ==", - "KodYHHN62zESrXUye7M01g==", - "H+yPRiooEh5J7lAJB4RZ7Q==", - "dZg5w8rFETMp9SgW7m0gfg==", - "LsmsPokAwWNCuC74MaqFCQ==", - "1QGhj9NONF2rC44UdO+Izw==", - "uwGivY3/C9WK+dirRPJZ4A==", - "rXGWY/Gq+ZEsmvBHUfFMmQ==", - "j4FBMnNfdBwx0VsDeTvhFg==", - "81nkjWtpBhqhvOp6K8dcWg==", - "dCDaYYrgASXPMGFRV0RCGg==", - "Kj1QI+s9261S3lTtPKd9eg==", - "LblwOqNiciHmt2NXjd89tg==", - "46piyANQVvvLqcoMq5G8tQ==", - "XJihma9zSRrXLC+T+VcFDA==", - "K3NBEG8jJTJbSrYSOC3FKw==", - "cT3PwwS6ALZA/na9NjtdzA==", - "wJ4uCrl4DPg70ltw1dZO3w==", - "JATLdpQm//SQnkyCfI5x7Q==", - "X1PaCfEDScclLtOTiF5JUw==", - "444F9T6Y7J67Y9sULG81qg==", - "8JVHFRwAd/SCLU0CRJYofg==", - "aLh1XEUrfR9W82gzusKcOg==", - "U+bB5NjFIuQr/Y5UpXHwxA==", - "Egs14xVbRWjfBBX7X5Z60g==", - "KSorNz/PLR/YYkxaj1fuqw==", - "RDgGGxTtcPvRg/5KRRlz4w==", - "5T39s5CtSrK5awMPUcEWJg==", - "+PUVXkoTqHxJHO18z4KMfw==", - "Bvk8NX4l6WktLcRDRKsK/A==", - "kNGIV3+jQmJlZDTXy1pnyA==", - "E3jMjAgXwvwR8PA53g4+PQ==", - "MbI04HlTGCoc/6WDejwtaQ==", - "aEnHUfn7UE/Euh6jsMuZ7g==", - "z4Bft++f72QeDh4PWGr/sw==", - "1lCcQWGDePPYco4vYrA5vw==", - "iu5csar0IQQBOTgw5OvJwQ==", - "raKMXnnX6PFFsbloDqyVzQ==", - "uPnL9tboMZo0Kl2fe24CmA==", - "8OFxXwnPmrogpNoueZlC4Q==", - "V6CRKrKezPwsRdbm0DJ2Yg==", - "xmGgK3W5y+oCd0K2u8XjZQ==", - "Ry3zgZ6KHrpNyb7+Tt2Pkw==", - "IwLbkL33z+LdTjaFYh93kg==", - "caepyBOAFu0MxbcXrGf6TA==", - "iIWxFdolLcnXqIjPMg+5kQ==", - "P430CeF2MDkuq11YdjvV8A==", - "yCu+DVU/ceMTOZ5h/7wQTg==", - "4mQVNv7FHj+/O6XFqWFt/Q==", - "OEJ40VmMDYzc2ESEMontRA==", - "D66Suu3tWBD+eurBpPXfjA==", - "RNK9G1hfuz3ETY/RmA9+aA==", - "BYpHADmEnzBsegdYTv8B5Q==", - "DBKrdpCE0awppxST4o/zzg==", - "KOmdvm+wJuZ/nT/o1+xOuw==", - "gDxqUdxxeXDYhJk9zcrNyA==", - "UPzS4LR3p/h0u69+7YemrQ==", - "hf9HFxWRNX2ucH8FLS7ytA==", - "ozVqYsmUueKifb4lDyVyrg==", - "TfHvdbl2M4deg65QKBTPng==", - "SzCGM8ypE58FLaR1+1ccxQ==", - "3nthUmLZ30HxQrzr2d7xFA==", - "1jBaRO8Bg5l6TH7qJ8EPiw==", - "eJlcN+gJnqAnctbWSIO9uA==", - "G8LFBop8u6IIng+gQuVg3w==", - "3JhnM6G4L06NHt31lR0zXA==", - "342VOUOxoLHUqtHANt83Hw==", - "hRxbdeniAVFgKUgB9Q3Y+g==", - "cFFE2R4GztNoftYkqalqUQ==", - "YmaksRzoU+OwlpiEaBDYaQ==", - "jon1y9yMEGfiIBjsDeeJdA==", - "oSnrpW4UmmVXtUGWqLq+tQ==", - "zaqyy3GaJ7cp8qDoLJWcTw==", - "luO1R8dUM9gy1E2lojRQoA==", - "YHM6NNHjmodv+G0mRLK7kw==", - "ZSmN8mmI9lDEHkJqBBg0Nw==", - "520wTzrysiRi2Td92Zq0HQ==", - "RAAw14BA1ws5Wu/rU7oegw==", - "vb6Agwzk4JG0Nn7qRPPFMQ==", - "joDXdLpXvRjOqkRiYaD/Sw==", - "dK2DU3t1ns+DWDwfBvH3SQ==", - "gZNJ1Qq6OcnwXqc+jXzMLQ==", - "R8ULpSNu9FcCwXZM0QedSg==", - "mc45FSMtzdw2PTcEBwHWPw==", - "d0qvm3bl38rRCpYdWqolCQ==", - "o9tdzmIu+3J/EYU4YWyTkA==", - "5eXpiczlRdmqMYSaodOUiQ==", - "KYuUNrkTvjUWQovw9dNakA==", - "02im2RooJQ/9UfUrh5LO+A==", - "kWPUUi7x9kKKa6nJ+FDR5Q==", - "6z8CRivao3IMyV4p4gMh7g==", - "SmRWEzqddY9ucGAP5jXjAg==", - "DJscTYNFPyPmTb57g/1w+Q==", - "uOHrw37yF9oLLVd16nUpeg==", - "HaIRV9SNPRTPDOSX9sK/bg==", - "K4yZNVoqHjXNhrZzz2gTew==", - "bTNRjJm+FfSQVfd56nNNqQ==", - "x5lyMArsv1MuJmEFlWCnNw==", - "cxpZ4bloGv734LBf4NpVhA==", - "kUudvRfA33uJDzHIShQd3Q==", - "3Wfj05vCLFAB9vII5AU9tw==", - "FUQySDFodnRhr+NUsWt0KA==", - "eC/RcoCVQBlXdE9WtcgXIw==", - "NoX8lkY+kd2GPuGjp+s0tQ==", - "EzjbinBHx3Wr08eXpH3HXA==", - "0VsaJHR0Ms8zegsCpAKoyg==", - "e2xLFVavnZIUUtxJx+qa1g==", - "Kt6BTG1zdeBZ3nlVk+BZKQ==", - "EUXQZwLgnDG+C8qxVoBNdw==", - "0SkC/4PtnX1bMYgD6r6CLA==", - "rzj6mjHCcMEouL66083BAg==", - "V5HEaY3v9agOhsbYOAZgJA==", - "tJt6VDdAPEemBUvnoc4viA==", - "g0lWrzEYMntVIahC7i0O2g==", - "zCpibjrZOA3FQ4lYt0WoVA==", - "4Xh/B3C16rrjbES+FM1W8g==", - "GHEdXgGWOeOa6RuPMF0xXg==", - "3kREs/qaMX0AwFXN0LO5ow==", - "GLDNTSwygNBmuFwCIm7HtA==", - "JBkbaBiorCtFq9M9lSUdMg==", - "rJCuanCy51ydVD4nInf9IQ==", - "OzFRv+PzPqTNmOnvZGoo5g==", - "7mxU5fJl/c6dXss9H3vGcQ==", - "9J53kk+InE3CKa7cPyCXMw==", - "x9TIZ9Ua++3BX+MpjgTuWA==", - "h0MH5NGFfChgmRJ3E/R3HQ==", - "25w3ZRUzCvJwAVHYCIO5uw==", - "1Wc8jQlDSB4Dp32wkL2odw==", - "ipPPjxpXHS1tcykXmrHPMQ==", - "r95wJtP5rsTExKMS7QhHcw==", - "TZT86wXfzFffjt0f95UF5w==", - "VpmBstwR7qPVqPgKYQTA3g==", - "3++dZXzZ6AFEz7hK+i5hww==", - "mAiD16zf+rCc7Qzxjd5buA==", - "1JI9bT92UzxI8txjhst9LQ==", - "TNyvLixb03aP2f8cDozzfA==", - "spHVvA/pc7nF9Q4ON020+w==", - "GA8k6GQ20DGduVoC+gieRA==", - "T7waQc3PvTFr0yWGKmFQdQ==", - "P0Pc8owrqt6spdf7FgBFSw==", - "DKApp/alXiaPSRNm3MfSuA==", - "UreSZCIdDgloih8KLeX7gg==", - "xJi0T+psHOXMivSOVpMWeQ==", - "cNsC9bH30eM1EZS6IdEdtQ==", - "XjjrIpsmATV/lyln4tPb+g==", - "qt5CsMts2aD4lw/4Q6bHYQ==", - "h+KRDKIvyVUBmRjv1LcCyg==", - "2j83jrPwPfYlpJJ2clEBYQ==", - "ZrCezGLz38xKmzAom6yCTQ==", - "SEGu+cSbeeeZg4xWwsSErQ==", - "Duz/8Ebbd0w6oHwOs0Wnwg==", - "Ci7sS7Yi1+IwAM3VMAB4ew==", - "DG2Qe2DqPs5MkZPOqX363Q==", - "v0Bvws1WYVoEgDt8xmVKew==", - "CtDj/h2Q/lRey20G8dzSgA==", - "WRoJMO0BCJyn5V6qnpUi4Q==", - "RQywrOLZEKw9+kG6qTzr3g==", - "mU4CqbAwpwqegxJaOz9ofQ==", - "aN5x46Gw1VihRalwCt1CGg==", - "U6VQghxOXsydh3Naa5Nz4A==", - "YA+zdEC+yEgFWRIgS1Eiqw==", - "oPcxgoismve6+jXyIKK6AQ==", - "PqLCd/pwc+q5GkL6MB0jTg==", - "fHL+fHtDxhALZFb9W/uHuw==", - "dhTevyxTYAuKbdLWhG47Kw==", - "VllbOAjeW3Dpbj5lp2OSmA==", - "3itfXtlLPRmPCSYaSvc39Q==", - "GNak/LFeoHWlTdLW1iU4eg==", - "HuDuxs2KiGqmeyY1s1PjpQ==", - "xs8J3cesq7lDhP/dNltqOw==", - "foXSDEUwMhfHWJSmSejsQg==", - "6fWom3YoKvW6NIg6y9o9CQ==", - "NhZbSq0CjDNOAIvBHBM9zA==", - "5w4FbRhWACP7k2WnNitiHg==", - "0UeRwDID2RBIikInqFI7uw==", - "/y/jHHEpUu5TR+R2o96kXA==", - "voO3krg4sdy4Iu+MZEr8+g==", - "hdzol5dk//Q6tCm4+OndIA==", - "Nc5kiwXCAyjpzt43G5RF1A==", - "3UBYBMejKInSbCHRoJJ7dg==", - "dRFCIbVu0Y8XbjG5i+UFCQ==", - "t8pjhdyNJirkvYgWIO/eKg==", - "FAXzjjIr8l1nsQFPpgxM/g==", - "SPGpjEJrpflv1hF0qsFlPw==", - "9Y1ZmfiHJd9vCiZ6KfO1xQ==", - "7Eqzyb+Kep+dIahYJWNNxQ==", - "9rL8nC/VbSqrvnUtH9WsxQ==", - "H4FZ5Wcnb40hQM1DMGGe8A==", - "AjoXWGb/l9xH/hscgEc6kQ==", - "6nzFl41uutgDdC30oOeCqg==", - "3jo1jRy3MybXtoLR+JIbJw==", - "mXdE08dv+OlIhlcqMBH2Gg==", - "Ifd7DI6o8N5gnyAKqZTlRw==", - "JNUvg/kxL3rdcZnD4IqUxw==", - "ry8B+sAHNeFIZHCCDynFyw==", - "TXaEd5lIKhzjcncfNcBgSg==", - "Mr3ehuDMUimOSn+FlkchdA==", - "cwiGhjmX9v8I7E/ekQ0h+g==", - "I/r5+1jnqumCPprKC/2BqA==", - "S4V3MfGYk8I4fd3WH09yYw==", - "A+crVyUeynAkEMYKbnFjZw==", - "vtyHcNQPcUTRuZcQvRUX4Q==", - "UNKx1ZVv3HNp21zrUSm6ew==", - "rsAlvGLv2D0swd6ol3WlvA==", - "2qwqb8ENAR2fpQnw55sPDw==", - "xBJJuYYnsTJOeFggZSKC4Q==", - "omvtZZKruPiEt6fV0YXTdg==", - "JZEgKUhUN+USJsvtF4HZOg==", - "euG/kpJ5elSDOGNbWWDfNQ==", - "DiiVmM6/WNcp0MUjSaFq6w==", - "QCNS8gAml1M2pJ+MxZsueg==", - "M6+pggFsHfM3alFxcMOFNQ==", - "YLoWpDTwXnszEQm8FA164Q==", - "N08oUZtlXbQvO9t3vXnGog==", - "jkjuJowWuOa4CLY+RZiErQ==", - "mPf+S+6oAoVIYEVveaiNFA==", - "R0iVyo5qreP/68uZlZphDA==", - "GYlqhQgp03B0mXpUhQ+ZCA==", - "lQNbmWD7PhwNGye+zbc3GQ==", - "cNeaOJEOzUSDdRmenPQyuw==", - "Gp66/Txv6ebv5bn85TuQtA==", - "xAda6DVkcvvqhI8vWZeGyA==", - "Ggk1Qa0lEdAgCXG6SmCkBA==", - "MYuO7ZURXtyaf56q7hH4Zw==", - "RUIdZRTgJBudWUZQFgiFaQ==", - "bgFJxLirUom2zT0h7LdOpw==", - "A2gaOpIlrS7TKVQgy9XMSw==", - "zevXp0lqqnXv9X6Bgmjtqg==", - "a5iuFqWAdFFsRgp7SFYwNg==", - "TxTy0TaDsWTcRH3wdBEQLQ==", - "jephVdKDeJIhXPrdMOJ4qA==", - "C4KdamfqUPuJ3RGFdpIEdw==", - "zl6l2Ioz1qovRUIWrSyxVA==", - "+gGaDxUe0UnNrf3PPg1qQQ==", - "1HgbrlaLMHS6Qj/0kkaJxg==", - "eGxTly6Pnu7eV/MKYMmuYw==", - "RAMKfnlrzNjpyh2BWt6JHg==", - "4pZQm9ogCZ/EAR9pjJm1eA==", - "l1zv3erwXIegQFd02NlCag==", - "uHGyRZchuA4ulmuD5LqquQ==", - "/vFu89tsV+lbcoiqM/XWog==", - "63SUgqfQimrmjvy/bEDQ0w==", - "JLHuf+FlChFDa9LYfTQ4Eg==", - "I+ZnPePTFX8ZODe14bxgyA==", - "CtoK1k3U82BkvzuPfQ4pjQ==", - "6nqQm4C7y+wZ+qX0kVjwmA==", - "+C3kBxRXIjqBk0EJxe3Xfg==", - "qVu748pIxEZtiywg4/4qhw==", - "07o+sKjjRCYkwy/ACyoYhg==", - "CiLF4dkbLURekBcQbwPUVA==", - "W/N5/nkp4iQIPYfAagVV7A==", - "3PJOphhEjw0E4arTfVVwdg==", - "YdMbARHwB+bSOd0PlTlXiA==", - "41hbx5Yr7UWxsV6+bWUYUA==", - "SqJHXD0MorNwHtHL9TbWLg==", - "pWKGUzm/muwOiBtzkRMnRg==", - "az9zZ7HTa4FJGRQMcamvEw==", - "zavAAN8C9Wo8oBLyztp63Q==", - "yBAnPmwrMJ8kpPP292S/Lw==", - "E6szQhjuUAz2e0h9ffQfEQ==", - "Fs3cQxQyS9kM4T8j5R7rWw==", - "GB5fRLZxnjRUfEe0SwcePQ==", - "+9OY8xkT9dM/rb2T6ACtOQ==", - "If2xFBD1p91iDD7ZrsfgjA==", - "QCFfoMhy8EleZAOpfRY88w==", - "NobWPk1Z6bHt5s9NHXt/pg==", - "nK6T4vV4384OIcqO5tQMhA==", - "Zov1EzK+VomiuwT1+ulQ8g==", - "pF98OKDvLUlnTzo7wmlpOw==", - "Wrq9YDsieAMC3Y2DSY5Rcg==" - ] -} diff --git a/browser/base/content/newtab/newTab.js b/browser/base/content/newtab/newTab.js deleted file mode 100644 index bbd2ef39d..000000000 --- a/browser/base/content/newtab/newTab.js +++ /dev/null @@ -1,71 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -"use strict"; - -var Cu = Components.utils; -var Ci = Components.interfaces; - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import("resource://gre/modules/Services.jsm"); -Cu.import("resource://gre/modules/PageThumbs.jsm"); -Cu.import("resource://gre/modules/BackgroundPageThumbs.jsm"); -Cu.import("resource:///modules/DirectoryLinksProvider.jsm"); -Cu.import("resource://gre/modules/NewTabUtils.jsm"); - -XPCOMUtils.defineLazyModuleGetter(this, "Rect", - "resource://gre/modules/Geometry.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils", - "resource://gre/modules/PrivateBrowsingUtils.jsm"); - -var { - links: gLinks, - allPages: gAllPages, - linkChecker: gLinkChecker, - pinnedLinks: gPinnedLinks, - blockedLinks: gBlockedLinks, - gridPrefs: gGridPrefs -} = NewTabUtils; - -XPCOMUtils.defineLazyGetter(this, "gStringBundle", function() { - return Services.strings. - createBundle("chrome://browser/locale/newTab.properties"); -}); - -function newTabString(name, args) { - let stringName = "newtab." + name; - if (!args) { - return gStringBundle.GetStringFromName(stringName); - } - return gStringBundle.formatStringFromName(stringName, args, args.length); -} - -function inPrivateBrowsingMode() { - return PrivateBrowsingUtils.isContentWindowPrivate(window); -} - -const HTML_NAMESPACE = "http://www.w3.org/1999/xhtml"; -const XUL_NAMESPACE = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; - -const TILES_EXPLAIN_LINK = "https://support.mozilla.org/kb/how-do-tiles-work-firefox"; -const TILES_INTRO_LINK = "https://www.mozilla.org/firefox/tiles/"; -const TILES_PRIVACY_LINK = "https://www.mozilla.org/privacy/"; - -#include transformations.js -#include page.js -#include grid.js -#include cells.js -#include sites.js -#include drag.js -#include dragDataHelper.js -#include drop.js -#include dropTargetShim.js -#include dropPreview.js -#include updater.js -#include undo.js -#include search.js -#include customize.js - -// Everything is loaded. Initialize the New Tab Page. -gPage.init(); diff --git a/browser/base/content/newtab/newTab.xhtml b/browser/base/content/newtab/newTab.xhtml deleted file mode 100644 index eef51b4b2..000000000 --- a/browser/base/content/newtab/newTab.xhtml +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - -<!DOCTYPE html [ - <!ENTITY % newTabDTD SYSTEM "chrome://browser/locale/newTab.dtd"> - %newTabDTD; - <!ENTITY % browserDTD SYSTEM "chrome://browser/locale/browser.dtd"> - %browserDTD; - <!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd"> - %globalDTD; -]> - -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>&newtab.pageTitle;</title> - - <link rel="stylesheet" type="text/css" media="all" href="chrome://global/skin/" /> - <link rel="stylesheet" type="text/css" media="all" href="chrome://browser/content/contentSearchUI.css" /> - <link rel="stylesheet" type="text/css" media="all" href="chrome://browser/content/newtab/newTab.css" /> - <link rel="stylesheet" type="text/css" media="all" href="chrome://browser/skin/newtab/newTab.css" /> -</head> - -<body dir="&locale.dir;"> - <div id="newtab-customize-overlay"></div> - - <div class="newtab-customize-panel-container"> - <div id="newtab-customize-panel" orient="vertical"> - <div id="newtab-customize-panel-anchor"></div> - <div id="newtab-customize-panel-inner-wrapper"> - <div id="newtab-customize-title" class="newtab-customize-panel-item"> - <label>&newtab.customize.cog.title2;</label> - </div> - <div id="newtab-customize-classic" class="newtab-customize-panel-item selectable"> - <label>&newtab.customize.classic;</label> - </div> - <div id="newtab-customize-blank" class="newtab-customize-panel-item selectable"> - <label>&newtab.customize.blank2;</label> - </div> - <div id="newtab-customize-learn" class="newtab-customize-panel-item"> - <label>&newtab.customize.cog.learn;</label> - </div> - </div> - </div> - </div> - - <div id="newtab-vertical-margin"> - <div id="newtab-margin-top"/> - - <div id="newtab-margin-undo-container"> - <div id="newtab-undo-container" undo-disabled="true"> - <label id="newtab-undo-label">&newtab.undo.removedLabel;</label> - <button id="newtab-undo-button" tabindex="-1" - class="newtab-undo-button">&newtab.undo.undoButton;</button> - <button id="newtab-undo-restore-button" tabindex="-1" - class="newtab-undo-button">&newtab.undo.restoreButton;</button> - <button id="newtab-undo-close-button" tabindex="-1" title="&newtab.undo.closeTooltip;"/> - </div> - </div> - - <div id="newtab-search-container"> - <div id="newtab-search-form"> - <div id="newtab-search-icon"/> - <input type="text" name="q" value="" id="newtab-search-text" - aria-label="&contentSearchInput.label;" maxlength="256"/> - <input id="newtab-search-submit" type="button" - title="&contentSearchSubmit.tooltip;"/> - </div> - </div> - - <div id="newtab-horizontal-margin"> - <div class="newtab-side-margin"/> - <div id="newtab-grid"> - <h1 id="topsites-heading"/> - </div> - <div class="newtab-side-margin"/> - </div> - - <div id="newtab-margin-bottom"/> - </div> - <input id="newtab-customize-button" type="button" dir="&locale.dir;" - value="⚙" - title="&newtab.customize.title;"/> -</body> -<script type="text/javascript;version=1.8" src="chrome://browser/content/contentSearchUI.js"/> -<script type="text/javascript;version=1.8" src="chrome://browser/content/newtab/newTab.js"/> -</html> diff --git a/browser/base/content/newtab/page.js b/browser/base/content/newtab/page.js deleted file mode 100644 index f7626ced2..000000000 --- a/browser/base/content/newtab/page.js +++ /dev/null @@ -1,297 +0,0 @@ -#ifdef 0 -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ -#endif - -// The amount of time we wait while coalescing updates for hidden pages. -const SCHEDULE_UPDATE_TIMEOUT_MS = 1000; - -/** - * This singleton represents the whole 'New Tab Page' and takes care of - * initializing all its components. - */ -var gPage = { - /** - * Initializes the page. - */ - init: function Page_init() { - // Add ourselves to the list of pages to receive notifications. - gAllPages.register(this); - - // Listen for 'unload' to unregister this page. - addEventListener("unload", this, false); - - // XXX bug 991111 - Not all click events are correctly triggered when - // listening from xhtml nodes -- in particular middle clicks on sites, so - // listen from the xul window and filter then delegate - addEventListener("click", this, false); - - // Check if the new tab feature is enabled. - let enabled = gAllPages.enabled; - if (enabled) - this._init(); - - this._updateAttributes(enabled); - - // Initialize customize controls. - gCustomize.init(); - }, - - /** - * Listens for notifications specific to this page. - */ - observe: function Page_observe(aSubject, aTopic, aData) { - if (aTopic == "nsPref:changed") { - gCustomize.updateSelected(); - - let enabled = gAllPages.enabled; - this._updateAttributes(enabled); - - // Update thumbnails to the new enhanced setting - if (aData == "browser.newtabpage.enhanced") { - this.update(); - } - - // Initialize the whole page if we haven't done that, yet. - if (enabled) { - this._init(); - } else { - gUndoDialog.hide(); - } - } else if (aTopic == "page-thumbnail:create" && gGrid.ready) { - for (let site of gGrid.sites) { - if (site && site.url === aData) { - site.refreshThumbnail(); - } - } - } - }, - - /** - * Updates the page's grid right away for visible pages. If the page is - * currently hidden, i.e. in a background tab or in the preloader, then we - * batch multiple update requests and refresh the grid once after a short - * delay. Accepts a single parameter the specifies the reason for requesting - * a page update. The page may decide to delay or prevent a requested updated - * based on the given reason. - */ - update(reason = "") { - // Update immediately if we're visible. - if (!document.hidden) { - // Ignore updates where reason=links-changed as those signal that the - // provider's set of links changed. We don't want to update visible pages - // in that case, it is ok to wait until the user opens the next tab. - if (reason != "links-changed" && gGrid.ready) { - gGrid.refresh(); - } - - return; - } - - // Bail out if we scheduled before. - if (this._scheduleUpdateTimeout) { - return; - } - - this._scheduleUpdateTimeout = setTimeout(() => { - // Refresh if the grid is ready. - if (gGrid.ready) { - gGrid.refresh(); - } - - this._scheduleUpdateTimeout = null; - }, SCHEDULE_UPDATE_TIMEOUT_MS); - }, - - /** - * Internally initializes the page. This runs only when/if the feature - * is/gets enabled. - */ - _init: function Page_init() { - if (this._initialized) - return; - - this._initialized = true; - - // Set submit button label for when CSS background are disabled (e.g. - // high contrast mode). - document.getElementById("newtab-search-submit").value = - document.body.getAttribute("dir") == "ltr" ? "\u25B6" : "\u25C0"; - - if (Services.prefs.getBoolPref("browser.newtabpage.compact")) { - document.body.classList.add("compact"); - } - - // Initialize search. - gSearch.init(); - - if (document.hidden) { - addEventListener("visibilitychange", this); - } else { - setTimeout(() => this.onPageFirstVisible()); - } - - // Initialize and render the grid. - gGrid.init(); - - // Initialize the drop target shim. - gDropTargetShim.init(); - -#ifdef XP_MACOSX - // Workaround to prevent a delay on MacOSX due to a slow drop animation. - document.addEventListener("dragover", this, false); - document.addEventListener("drop", this, false); -#endif - }, - - /** - * Updates the 'page-disabled' attributes of the respective DOM nodes. - * @param aValue Whether the New Tab Page is enabled or not. - */ - _updateAttributes: function Page_updateAttributes(aValue) { - // Set the nodes' states. - let nodeSelector = "#newtab-grid, #newtab-search-container"; - for (let node of document.querySelectorAll(nodeSelector)) { - if (aValue) - node.removeAttribute("page-disabled"); - else - node.setAttribute("page-disabled", "true"); - } - - // Enables/disables the control and link elements. - let inputSelector = ".newtab-control, .newtab-link"; - for (let input of document.querySelectorAll(inputSelector)) { - if (aValue) - input.removeAttribute("tabindex"); - else - input.setAttribute("tabindex", "-1"); - } - }, - - /** - * Handles unload event - */ - _handleUnloadEvent: function Page_handleUnloadEvent() { - gAllPages.unregister(this); - // compute page life-span and send telemetry probe: using milli-seconds will leave - // many low buckets empty. Instead we use half-second precision to make low end - // of histogram linear and not lose the change in user attention - let delta = Math.round((Date.now() - this._firstVisibleTime) / 500); - if (this._suggestedTilePresent) { - Services.telemetry.getHistogramById("NEWTAB_PAGE_LIFE_SPAN_SUGGESTED").add(delta); - } - else { - Services.telemetry.getHistogramById("NEWTAB_PAGE_LIFE_SPAN").add(delta); - } - }, - - /** - * Handles all page events. - */ - handleEvent: function Page_handleEvent(aEvent) { - switch (aEvent.type) { - case "load": - this.onPageVisibleAndLoaded(); - break; - case "unload": - this._handleUnloadEvent(); - break; - case "click": - let {button, target} = aEvent; - // Go up ancestors until we find a Site or not - while (target) { - if (target.hasOwnProperty("_newtabSite")) { - target._newtabSite.onClick(aEvent); - break; - } - target = target.parentNode; - } - break; - case "dragover": - if (gDrag.isValid(aEvent) && gDrag.draggedSite) - aEvent.preventDefault(); - break; - case "drop": - if (gDrag.isValid(aEvent) && gDrag.draggedSite) { - aEvent.preventDefault(); - aEvent.stopPropagation(); - } - break; - case "visibilitychange": - // Cancel any delayed updates for hidden pages now that we're visible. - if (this._scheduleUpdateTimeout) { - clearTimeout(this._scheduleUpdateTimeout); - this._scheduleUpdateTimeout = null; - - // An update was pending so force an update now. - this.update(); - } - - setTimeout(() => this.onPageFirstVisible()); - removeEventListener("visibilitychange", this); - break; - } - }, - - onPageFirstVisible: function () { - // Record another page impression. - Services.telemetry.getHistogramById("NEWTAB_PAGE_SHOWN").add(true); - - for (let site of gGrid.sites) { - if (site) { - // The site may need to modify and/or re-render itself if - // something changed after newtab was created by preloader. - // For example, the suggested tile endTime may have passed. - site.onFirstVisible(); - } - } - - // save timestamp to compute page life-span delta - this._firstVisibleTime = Date.now(); - - if (document.readyState == "complete") { - this.onPageVisibleAndLoaded(); - } else { - addEventListener("load", this); - } - }, - - onPageVisibleAndLoaded() { - // Send the index of the last visible tile. - this.reportLastVisibleTileIndex(); - // Maybe tell the user they can undo an initial automigration - this.maybeShowAutoMigrationUndoNotification(); - }, - - reportLastVisibleTileIndex() { - let cwu = window.QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIDOMWindowUtils); - - let rect = cwu.getBoundsWithoutFlushing(gGrid.node); - let nodes = cwu.nodesFromRect(rect.left, rect.top, 0, rect.width, - rect.height, 0, true, false); - - let i = -1; - let lastIndex = -1; - let sites = gGrid.sites; - - for (let node of nodes) { - if (node.classList && node.classList.contains("newtab-cell")) { - if (sites[++i]) { - lastIndex = i; - if (sites[i].link.targetedSite) { - // record that suggested tile is shown to use suggested-tiles-histogram - this._suggestedTilePresent = true; - } - } - } - } - - DirectoryLinksProvider.reportSitesAction(sites, "view", lastIndex); - }, - - maybeShowAutoMigrationUndoNotification() { - sendAsyncMessage("NewTab:MaybeShowAutoMigrationUndoNotification"); - }, -}; diff --git a/browser/base/content/newtab/search.js b/browser/base/content/newtab/search.js deleted file mode 100644 index cbbb6e243..000000000 --- a/browser/base/content/newtab/search.js +++ /dev/null @@ -1,15 +0,0 @@ -#ifdef 0 -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ -#endif - -var gSearch = { - init: function () { - document.getElementById("newtab-search-submit") - .addEventListener("click", e => this._contentSearchController.search(e)); - let textbox = document.getElementById("newtab-search-text"); - this._contentSearchController = - new ContentSearchUIController(textbox, textbox.parentNode, "newtab", "newtab"); - }, -}; diff --git a/browser/base/content/newtab/sites.js b/browser/base/content/newtab/sites.js deleted file mode 100644 index 9d103ce9b..000000000 --- a/browser/base/content/newtab/sites.js +++ /dev/null @@ -1,440 +0,0 @@ -#ifdef 0 -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ -#endif - -const THUMBNAIL_PLACEHOLDER_ENABLED = - Services.prefs.getBoolPref("browser.newtabpage.thumbnailPlaceholder"); - -/** - * This class represents a site that is contained in a cell and can be pinned, - * moved around or deleted. - */ -function Site(aNode, aLink) { - this._node = aNode; - this._node._newtabSite = this; - - this._link = aLink; - - this._render(); - this._addEventHandlers(); -} - -Site.prototype = { - /** - * The site's DOM node. - */ - get node() { return this._node; }, - - /** - * The site's link. - */ - get link() { return this._link; }, - - /** - * The url of the site's link. - */ - get url() { return this.link.url; }, - - /** - * The title of the site's link. - */ - get title() { return this.link.title || this.link.url; }, - - /** - * The site's parent cell. - */ - get cell() { - let parentNode = this.node.parentNode; - return parentNode && parentNode._newtabCell; - }, - - /** - * Pins the site on its current or a given index. - * @param aIndex The pinned index (optional). - * @return true if link changed type after pin - */ - pin: function Site_pin(aIndex) { - if (typeof aIndex == "undefined") - aIndex = this.cell.index; - - this._updateAttributes(true); - let changed = gPinnedLinks.pin(this._link, aIndex); - if (changed) { - // render site again to remove suggested/sponsored tags - this._render(); - } - return changed; - }, - - /** - * Unpins the site and calls the given callback when done. - */ - unpin: function Site_unpin() { - if (this.isPinned()) { - this._updateAttributes(false); - gPinnedLinks.unpin(this._link); - gUpdater.updateGrid(); - } - }, - - /** - * Checks whether this site is pinned. - * @return Whether this site is pinned. - */ - isPinned: function Site_isPinned() { - return gPinnedLinks.isPinned(this._link); - }, - - /** - * Blocks the site (removes it from the grid) and calls the given callback - * when done. - */ - block: function Site_block() { - if (!gBlockedLinks.isBlocked(this._link)) { - gUndoDialog.show(this); - gBlockedLinks.block(this._link); - gUpdater.updateGrid(); - } - }, - - /** - * Gets the DOM node specified by the given query selector. - * @param aSelector The query selector. - * @return The DOM node we found. - */ - _querySelector: function Site_querySelector(aSelector) { - return this.node.querySelector(aSelector); - }, - - /** - * Updates attributes for all nodes which status depends on this site being - * pinned or unpinned. - * @param aPinned Whether this site is now pinned or unpinned. - */ - _updateAttributes: function (aPinned) { - let control = this._querySelector(".newtab-control-pin"); - - if (aPinned) { - this.node.setAttribute("pinned", true); - control.setAttribute("title", newTabString("unpin")); - } else { - this.node.removeAttribute("pinned"); - control.setAttribute("title", newTabString("pin")); - } - }, - - _newTabString: function(str, substrArr) { - let regExp = /%[0-9]\$S/g; - let matches; - while ((matches = regExp.exec(str))) { - let match = matches[0]; - let index = match.charAt(1); // Get the digit in the regExp. - str = str.replace(match, substrArr[index - 1]); - } - return str; - }, - - _getSuggestedTileExplanation: function() { - let targetedName = `<strong> ${this.link.targetedName} </strong>`; - let targetedSite = `<strong> ${this.link.targetedSite} </strong>`; - if (this.link.explanation) { - return this._newTabString(this.link.explanation, [targetedName, targetedSite]); - } - return newTabString("suggested.button", [targetedName]); - }, - - /** - * Checks for and modifies link at campaign end time - */ - _checkLinkEndTime: function Site_checkLinkEndTime() { - if (this.link.endTime && this.link.endTime < Date.now()) { - let oldUrl = this.url; - // chop off the path part from url - this.link.url = Services.io.newURI(this.url, null, null).resolve("/"); - // clear supplied images - this triggers thumbnail download for new url - delete this.link.imageURI; - delete this.link.enhancedImageURI; - // remove endTime to avoid further time checks - delete this.link.endTime; - // clear enhanced-content image that may still exist in preloaded page - this._querySelector(".enhanced-content").style.backgroundImage = ""; - gPinnedLinks.replace(oldUrl, this.link); - } - }, - - /** - * Renders the site's data (fills the HTML fragment). - */ - _render: function Site_render() { - // first check for end time, as it may modify the link - this._checkLinkEndTime(); - // setup display variables - let enhanced = gAllPages.enhanced && DirectoryLinksProvider.getEnhancedLink(this.link); - let url = this.url; - let title = enhanced && enhanced.title ? enhanced.title : - this.link.type == "history" ? this.link.baseDomain : - this.title; - let tooltip = (this.title == url ? this.title : this.title + "\n" + url); - - let link = this._querySelector(".newtab-link"); - link.setAttribute("title", tooltip); - link.setAttribute("href", url); - this.node.setAttribute("type", this.link.type); - - let titleNode = this._querySelector(".newtab-title"); - titleNode.textContent = title; - if (this.link.titleBgColor) { - titleNode.style.backgroundColor = this.link.titleBgColor; - } - - // remove "suggested" attribute to avoid showing "suggested" tag - // after site was pinned or dropped - this.node.removeAttribute("suggested"); - - if (this.link.targetedSite) { - if (this.node.getAttribute("type") != "sponsored") { - this._querySelector(".newtab-sponsored").textContent = - newTabString("suggested.tag"); - } - - this.node.setAttribute("suggested", true); - let explanation = this._getSuggestedTileExplanation(); - this._querySelector(".newtab-suggested").innerHTML = - `<div class='newtab-suggested-bounds'> ${explanation} </div>`; - } - - if (this.isPinned()) - this._updateAttributes(true); - // Capture the page if the thumbnail is missing, which will cause page.js - // to be notified and call our refreshThumbnail() method. - this.captureIfMissing(); - // but still display whatever thumbnail might be available now. - this.refreshThumbnail(); - }, - - /** - * Called when the site's tab becomes visible for the first time. - * Since the newtab may be preloaded long before it's displayed, - * check for changed conditions and re-render if needed - */ - onFirstVisible: function Site_onFirstVisible() { - if (this.link.endTime && this.link.endTime < Date.now()) { - // site needs to change landing url and background image - this._render(); - } - else { - this.captureIfMissing(); - } - }, - - /** - * Captures the site's thumbnail in the background, but only if there's no - * existing thumbnail and the page allows background captures. - */ - captureIfMissing: function Site_captureIfMissing() { - if (!document.hidden && !this.link.imageURI) { - BackgroundPageThumbs.captureIfMissing(this.url); - } - }, - - /** - * Refreshes the thumbnail for the site. - */ - refreshThumbnail: function Site_refreshThumbnail() { - // Only enhance tiles if that feature is turned on - let link = gAllPages.enhanced && DirectoryLinksProvider.getEnhancedLink(this.link) || - this.link; - - let thumbnail = this._querySelector(".newtab-thumbnail.thumbnail"); - if (link.bgColor) { - thumbnail.style.backgroundColor = link.bgColor; - } - let uri = link.imageURI || PageThumbs.getThumbnailURL(this.url); - thumbnail.style.backgroundImage = 'url("' + uri + '")'; - - if (THUMBNAIL_PLACEHOLDER_ENABLED && - link.type == "history" && - link.baseDomain) { - let placeholder = this._querySelector(".newtab-thumbnail.placeholder"); - let charCodeSum = 0; - for (let c of link.baseDomain) { - charCodeSum += c.charCodeAt(0); - } - const COLORS = 16; - let hue = Math.round((charCodeSum % COLORS) / COLORS * 360); - placeholder.style.backgroundColor = "hsl(" + hue + ",80%,40%)"; - placeholder.textContent = link.baseDomain.substr(0,1).toUpperCase(); - } - - if (link.enhancedImageURI) { - let enhanced = this._querySelector(".enhanced-content"); - enhanced.style.backgroundImage = 'url("' + link.enhancedImageURI + '")'; - - if (this.link.type != link.type) { - this.node.setAttribute("type", "enhanced"); - this.enhancedId = link.directoryId; - } - } - }, - - _ignoreHoverEvents: function(element) { - element.addEventListener("mouseover", () => { - this.cell.node.setAttribute("ignorehover", "true"); - }); - element.addEventListener("mouseout", () => { - this.cell.node.removeAttribute("ignorehover"); - }); - }, - - /** - * Adds event handlers for the site and its buttons. - */ - _addEventHandlers: function Site_addEventHandlers() { - // Register drag-and-drop event handlers. - this._node.addEventListener("dragstart", this, false); - this._node.addEventListener("dragend", this, false); - this._node.addEventListener("mouseover", this, false); - - // Specially treat the sponsored icon & suggested explanation - // text to prevent regular hover effects - let sponsored = this._querySelector(".newtab-sponsored"); - let suggested = this._querySelector(".newtab-suggested"); - this._ignoreHoverEvents(sponsored); - this._ignoreHoverEvents(suggested); - }, - - /** - * Speculatively opens a connection to the current site. - */ - _speculativeConnect: function Site_speculativeConnect() { - let sc = Services.io.QueryInterface(Ci.nsISpeculativeConnect); - let uri = Services.io.newURI(this.url, null, null); - try { - // This can throw for certain internal URLs, when they wind up in - // about:newtab. Be sure not to propagate the error. - sc.speculativeConnect(uri, null); - } catch (e) {} - }, - - /** - * Record interaction with site using telemetry. - */ - _recordSiteClicked: function Site_recordSiteClicked(aIndex) { - if (Services.prefs.prefHasUserValue("browser.newtabpage.rows") || - Services.prefs.prefHasUserValue("browser.newtabpage.columns") || - aIndex > 8) { - // We only want to get indices for the default configuration, everything - // else goes in the same bucket. - aIndex = 9; - } - Services.telemetry.getHistogramById("NEWTAB_PAGE_SITE_CLICKED") - .add(aIndex); - }, - - _toggleLegalText: function(buttonClass, explanationTextClass) { - let button = this._querySelector(buttonClass); - if (button.hasAttribute("active")) { - let explain = this._querySelector(explanationTextClass); - explain.parentNode.removeChild(explain); - - button.removeAttribute("active"); - } - else { - let explain = document.createElementNS(HTML_NAMESPACE, "div"); - explain.className = explanationTextClass.slice(1); // Slice off the first character, '.' - this.node.appendChild(explain); - - let link = '<a href="' + TILES_EXPLAIN_LINK + '">' + - newTabString("learn.link") + "</a>"; - let type = (this.node.getAttribute("suggested") && this.node.getAttribute("type") == "affiliate") ? - "suggested" : this.node.getAttribute("type"); - let icon = '<input type="button" class="newtab-control newtab-' + - (type == "enhanced" ? "customize" : "control-block") + '"/>'; - explain.innerHTML = newTabString(type + (type == "sponsored" ? ".explain2" : ".explain"), [icon, link]); - - button.setAttribute("active", "true"); - } - }, - - /** - * Handles site click events. - */ - onClick: function Site_onClick(aEvent) { - let action; - let pinned = this.isPinned(); - let tileIndex = this.cell.index; - let {button, target} = aEvent; - - // Handle tile/thumbnail link click - if (target.classList.contains("newtab-link") || - target.parentElement.classList.contains("newtab-link")) { - // Record for primary and middle clicks - if (button == 0 || button == 1) { - this._recordSiteClicked(tileIndex); - action = "click"; - } - } - // Handle sponsored explanation link click - else if (target.parentElement.classList.contains("sponsored-explain")) { - action = "sponsored_link"; - } - else if (target.parentElement.classList.contains("suggested-explain")) { - action = "suggested_link"; - } - // Only handle primary clicks for the remaining targets - else if (button == 0) { - aEvent.preventDefault(); - if (target.classList.contains("newtab-control-block")) { - // Notify DirectoryLinksProvider of suggested tile block, this may - // affect if and how suggested tiles are recommended and needs to - // be reported before pages are updated inside block() call - if (this.link.targetedSite) { - DirectoryLinksProvider.handleSuggestedTileBlock(); - } - this.block(); - action = "block"; - } - else if (target.classList.contains("sponsored-explain") || - target.classList.contains("newtab-sponsored")) { - this._toggleLegalText(".newtab-sponsored", ".sponsored-explain"); - action = "sponsored"; - } - else if (pinned && target.classList.contains("newtab-control-pin")) { - this.unpin(); - action = "unpin"; - } - else if (!pinned && target.classList.contains("newtab-control-pin")) { - if (this.pin()) { - // suggested link has changed - update rest of the pages - gAllPages.update(gPage); - } - action = "pin"; - } - } - - // Report all link click actions - if (action) { - DirectoryLinksProvider.reportSitesAction(gGrid.sites, action, tileIndex); - } - }, - - /** - * Handles all site events. - */ - handleEvent: function Site_handleEvent(aEvent) { - switch (aEvent.type) { - case "mouseover": - this._node.removeEventListener("mouseover", this, false); - this._speculativeConnect(); - break; - case "dragstart": - gDrag.start(this, aEvent); - break; - case "dragend": - gDrag.end(this, aEvent); - break; - } - } -}; diff --git a/browser/base/content/newtab/transformations.js b/browser/base/content/newtab/transformations.js deleted file mode 100644 index f7db0ad84..000000000 --- a/browser/base/content/newtab/transformations.js +++ /dev/null @@ -1,270 +0,0 @@ -#ifdef 0 -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ -#endif - -/** - * This singleton allows to transform the grid by repositioning a site's node - * in the DOM and by showing or hiding the node. It additionally provides - * convenience methods to work with a site's DOM node. - */ -var gTransformation = { - /** - * Returns the width of the left and top border of a cell. We need to take it - * into account when measuring and comparing site and cell positions. - */ - get _cellBorderWidths() { - let cstyle = window.getComputedStyle(gGrid.cells[0].node, null); - let widths = { - left: parseInt(cstyle.getPropertyValue("border-left-width")), - top: parseInt(cstyle.getPropertyValue("border-top-width")) - }; - - // Cache this value, overwrite the getter. - Object.defineProperty(this, "_cellBorderWidths", - {value: widths, enumerable: true}); - - return widths; - }, - - /** - * Gets a DOM node's position. - * @param aNode The DOM node. - * @return A Rect instance with the position. - */ - getNodePosition: function Transformation_getNodePosition(aNode) { - let {left, top, width, height} = aNode.getBoundingClientRect(); - return new Rect(left + scrollX, top + scrollY, width, height); - }, - - /** - * Fades a given node from zero to full opacity. - * @param aNode The node to fade. - * @param aCallback The callback to call when finished. - */ - fadeNodeIn: function Transformation_fadeNodeIn(aNode, aCallback) { - this._setNodeOpacity(aNode, 1, function () { - // Clear the style property. - aNode.style.opacity = ""; - - if (aCallback) - aCallback(); - }); - }, - - /** - * Fades a given node from full to zero opacity. - * @param aNode The node to fade. - * @param aCallback The callback to call when finished. - */ - fadeNodeOut: function Transformation_fadeNodeOut(aNode, aCallback) { - this._setNodeOpacity(aNode, 0, aCallback); - }, - - /** - * Fades a given site from zero to full opacity. - * @param aSite The site to fade. - * @param aCallback The callback to call when finished. - */ - showSite: function Transformation_showSite(aSite, aCallback) { - this.fadeNodeIn(aSite.node, aCallback); - }, - - /** - * Fades a given site from full to zero opacity. - * @param aSite The site to fade. - * @param aCallback The callback to call when finished. - */ - hideSite: function Transformation_hideSite(aSite, aCallback) { - this.fadeNodeOut(aSite.node, aCallback); - }, - - /** - * Allows to set a site's position. - * @param aSite The site to re-position. - * @param aPosition The desired position for the given site. - */ - setSitePosition: function Transformation_setSitePosition(aSite, aPosition) { - let style = aSite.node.style; - let {top, left} = aPosition; - - style.top = top + "px"; - style.left = left + "px"; - }, - - /** - * Freezes a site in its current position by positioning it absolute. - * @param aSite The site to freeze. - */ - freezeSitePosition: function Transformation_freezeSitePosition(aSite) { - if (this._isFrozen(aSite)) - return; - - let style = aSite.node.style; - let comp = getComputedStyle(aSite.node, null); - style.width = comp.getPropertyValue("width"); - style.height = comp.getPropertyValue("height"); - - aSite.node.setAttribute("frozen", "true"); - this.setSitePosition(aSite, this.getNodePosition(aSite.node)); - }, - - /** - * Unfreezes a site by removing its absolute positioning. - * @param aSite The site to unfreeze. - */ - unfreezeSitePosition: function Transformation_unfreezeSitePosition(aSite) { - if (!this._isFrozen(aSite)) - return; - - let style = aSite.node.style; - style.left = style.top = style.width = style.height = ""; - aSite.node.removeAttribute("frozen"); - }, - - /** - * Slides the given site to the target node's position. - * @param aSite The site to move. - * @param aTarget The slide target. - * @param aOptions Set of options (see below). - * unfreeze - unfreeze the site after sliding - * callback - the callback to call when finished - */ - slideSiteTo: function Transformation_slideSiteTo(aSite, aTarget, aOptions) { - let currentPosition = this.getNodePosition(aSite.node); - let targetPosition = this.getNodePosition(aTarget.node) - let callback = aOptions && aOptions.callback; - - let self = this; - - function finish() { - if (aOptions && aOptions.unfreeze) - self.unfreezeSitePosition(aSite); - - if (callback) - callback(); - } - - // We need to take the width of a cell's border into account. - targetPosition.left += this._cellBorderWidths.left; - targetPosition.top += this._cellBorderWidths.top; - - // Nothing to do here if the positions already match. - if (currentPosition.left == targetPosition.left && - currentPosition.top == targetPosition.top) { - finish(); - } else { - this.setSitePosition(aSite, targetPosition); - this._whenTransitionEnded(aSite.node, ["left", "top"], finish); - } - }, - - /** - * Rearranges a given array of sites and moves them to their new positions or - * fades in/out new/removed sites. - * @param aSites An array of sites to rearrange. - * @param aOptions Set of options (see below). - * unfreeze - unfreeze the site after rearranging - * callback - the callback to call when finished - */ - rearrangeSites: function Transformation_rearrangeSites(aSites, aOptions) { - let batch = []; - let cells = gGrid.cells; - let callback = aOptions && aOptions.callback; - let unfreeze = aOptions && aOptions.unfreeze; - - aSites.forEach(function (aSite, aIndex) { - // Do not re-arrange empty cells or the dragged site. - if (!aSite || aSite == gDrag.draggedSite) - return; - - batch.push(new Promise(resolve => { - if (!cells[aIndex]) { - // The site disappeared from the grid, hide it. - this.hideSite(aSite, resolve); - } else if (this._getNodeOpacity(aSite.node) != 1) { - // The site disappeared before but is now back, show it. - this.showSite(aSite, resolve); - } else { - // The site's position has changed, move it around. - this._moveSite(aSite, aIndex, {unfreeze: unfreeze, callback: resolve}); - } - })); - }, this); - - if (callback) { - Promise.all(batch).then(callback); - } - }, - - /** - * Listens for the 'transitionend' event on a given node and calls the given - * callback. - * @param aNode The node that is transitioned. - * @param aProperties The properties we'll wait to be transitioned. - * @param aCallback The callback to call when finished. - */ - _whenTransitionEnded: - function Transformation_whenTransitionEnded(aNode, aProperties, aCallback) { - - let props = new Set(aProperties); - aNode.addEventListener("transitionend", function onEnd(e) { - if (props.has(e.propertyName)) { - aNode.removeEventListener("transitionend", onEnd); - aCallback(); - } - }); - }, - - /** - * Gets a given node's opacity value. - * @param aNode The node to get the opacity value from. - * @return The node's opacity value. - */ - _getNodeOpacity: function Transformation_getNodeOpacity(aNode) { - let cstyle = window.getComputedStyle(aNode, null); - return cstyle.getPropertyValue("opacity"); - }, - - /** - * Sets a given node's opacity. - * @param aNode The node to set the opacity value for. - * @param aOpacity The opacity value to set. - * @param aCallback The callback to call when finished. - */ - _setNodeOpacity: - function Transformation_setNodeOpacity(aNode, aOpacity, aCallback) { - - if (this._getNodeOpacity(aNode) == aOpacity) { - if (aCallback) - aCallback(); - } else { - if (aCallback) { - this._whenTransitionEnded(aNode, ["opacity"], aCallback); - } - - aNode.style.opacity = aOpacity; - } - }, - - /** - * Moves a site to the cell with the given index. - * @param aSite The site to move. - * @param aIndex The target cell's index. - * @param aOptions Options that are directly passed to slideSiteTo(). - */ - _moveSite: function Transformation_moveSite(aSite, aIndex, aOptions) { - this.freezeSitePosition(aSite); - this.slideSiteTo(aSite, gGrid.cells[aIndex], aOptions); - }, - - /** - * Checks whether a site is currently frozen. - * @param aSite The site to check. - * @return Whether the given site is frozen. - */ - _isFrozen: function Transformation_isFrozen(aSite) { - return aSite.node.hasAttribute("frozen"); - } -}; diff --git a/browser/base/content/newtab/undo.js b/browser/base/content/newtab/undo.js deleted file mode 100644 index b856914d2..000000000 --- a/browser/base/content/newtab/undo.js +++ /dev/null @@ -1,116 +0,0 @@ -#ifdef 0 -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ -#endif - -/** - * Dialog allowing to undo the removal of single site or to completely restore - * the grid's original state. - */ -var gUndoDialog = { - /** - * The undo dialog's timeout in miliseconds. - */ - HIDE_TIMEOUT_MS: 15000, - - /** - * Contains undo information. - */ - _undoData: null, - - /** - * Initializes the undo dialog. - */ - init: function UndoDialog_init() { - this._undoContainer = document.getElementById("newtab-undo-container"); - this._undoContainer.addEventListener("click", this, false); - this._undoButton = document.getElementById("newtab-undo-button"); - this._undoCloseButton = document.getElementById("newtab-undo-close-button"); - this._undoRestoreButton = document.getElementById("newtab-undo-restore-button"); - }, - - /** - * Shows the undo dialog. - * @param aSite The site that just got removed. - */ - show: function UndoDialog_show(aSite) { - if (this._undoData) - clearTimeout(this._undoData.timeout); - - this._undoData = { - index: aSite.cell.index, - wasPinned: aSite.isPinned(), - blockedLink: aSite.link, - timeout: setTimeout(this.hide.bind(this), this.HIDE_TIMEOUT_MS) - }; - - this._undoContainer.removeAttribute("undo-disabled"); - this._undoButton.removeAttribute("tabindex"); - this._undoCloseButton.removeAttribute("tabindex"); - this._undoRestoreButton.removeAttribute("tabindex"); - }, - - /** - * Hides the undo dialog. - */ - hide: function UndoDialog_hide() { - if (!this._undoData) - return; - - clearTimeout(this._undoData.timeout); - this._undoData = null; - this._undoContainer.setAttribute("undo-disabled", "true"); - this._undoButton.setAttribute("tabindex", "-1"); - this._undoCloseButton.setAttribute("tabindex", "-1"); - this._undoRestoreButton.setAttribute("tabindex", "-1"); - }, - - /** - * The undo dialog event handler. - * @param aEvent The event to handle. - */ - handleEvent: function UndoDialog_handleEvent(aEvent) { - switch (aEvent.target.id) { - case "newtab-undo-button": - this._undo(); - break; - case "newtab-undo-restore-button": - this._undoAll(); - break; - case "newtab-undo-close-button": - this.hide(); - break; - } - }, - - /** - * Undo the last blocked site. - */ - _undo: function UndoDialog_undo() { - if (!this._undoData) - return; - - let {index, wasPinned, blockedLink} = this._undoData; - gBlockedLinks.unblock(blockedLink); - - if (wasPinned) { - gPinnedLinks.pin(blockedLink, index); - } - - gUpdater.updateGrid(); - this.hide(); - }, - - /** - * Undo all blocked sites. - */ - _undoAll: function UndoDialog_undoAll() { - NewTabUtils.undoAll(function() { - gUpdater.updateGrid(); - this.hide(); - }.bind(this)); - } -}; - -gUndoDialog.init(); diff --git a/browser/base/content/newtab/updater.js b/browser/base/content/newtab/updater.js deleted file mode 100644 index 2bab74d70..000000000 --- a/browser/base/content/newtab/updater.js +++ /dev/null @@ -1,177 +0,0 @@ -#ifdef 0 -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ -#endif - -/** - * This singleton provides functionality to update the current grid to a new - * set of pinned and blocked sites. It adds, moves and removes sites. - */ -var gUpdater = { - /** - * Updates the current grid according to its pinned and blocked sites. - * This removes old, moves existing and creates new sites to fill gaps. - * @param aCallback The callback to call when finished. - */ - updateGrid: function Updater_updateGrid(aCallback) { - let links = gLinks.getLinks().slice(0, gGrid.cells.length); - - // Find all sites that remain in the grid. - let sites = this._findRemainingSites(links); - - // Remove sites that are no longer in the grid. - this._removeLegacySites(sites, () => { - // Freeze all site positions so that we can move their DOM nodes around - // without any visual impact. - this._freezeSitePositions(sites); - - // Move the sites' DOM nodes to their new position in the DOM. This will - // have no visual effect as all the sites have been frozen and will - // remain in their current position. - this._moveSiteNodes(sites); - - // Now it's time to animate the sites actually moving to their new - // positions. - this._rearrangeSites(sites, () => { - // Try to fill empty cells and finish. - this._fillEmptyCells(links, aCallback); - - // Update other pages that might be open to keep them synced. - gAllPages.update(gPage); - }); - }); - }, - - /** - * Takes an array of links and tries to correlate them to sites contained in - * the current grid. If no corresponding site can be found (i.e. the link is - * new and a site will be created) then just set it to null. - * @param aLinks The array of links to find sites for. - * @return Array of sites mapped to the given links (can contain null values). - */ - _findRemainingSites: function Updater_findRemainingSites(aLinks) { - let map = {}; - - // Create a map to easily retrieve the site for a given URL. - gGrid.sites.forEach(function (aSite) { - if (aSite) - map[aSite.url] = aSite; - }); - - // Map each link to its corresponding site, if any. - return aLinks.map(function (aLink) { - return aLink && (aLink.url in map) && map[aLink.url]; - }); - }, - - /** - * Freezes the given sites' positions. - * @param aSites The array of sites to freeze. - */ - _freezeSitePositions: function Updater_freezeSitePositions(aSites) { - aSites.forEach(function (aSite) { - if (aSite) - gTransformation.freezeSitePosition(aSite); - }); - }, - - /** - * Moves the given sites' DOM nodes to their new positions. - * @param aSites The array of sites to move. - */ - _moveSiteNodes: function Updater_moveSiteNodes(aSites) { - let cells = gGrid.cells; - - // Truncate the given array of sites to not have more sites than cells. - // This can happen when the user drags a bookmark (or any other new kind - // of link) onto the grid. - let sites = aSites.slice(0, cells.length); - - sites.forEach(function (aSite, aIndex) { - let cell = cells[aIndex]; - let cellSite = cell.site; - - // The site's position didn't change. - if (!aSite || cellSite != aSite) { - let cellNode = cell.node; - - // Empty the cell if necessary. - if (cellSite) - cellNode.removeChild(cellSite.node); - - // Put the new site in place, if any. - if (aSite) - cellNode.appendChild(aSite.node); - } - }, this); - }, - - /** - * Rearranges the given sites and slides them to their new positions. - * @param aSites The array of sites to re-arrange. - * @param aCallback The callback to call when finished. - */ - _rearrangeSites: function Updater_rearrangeSites(aSites, aCallback) { - let options = {callback: aCallback, unfreeze: true}; - gTransformation.rearrangeSites(aSites, options); - }, - - /** - * Removes all sites from the grid that are not in the given links array or - * exceed the grid. - * @param aSites The array of sites remaining in the grid. - * @param aCallback The callback to call when finished. - */ - _removeLegacySites: function Updater_removeLegacySites(aSites, aCallback) { - let batch = []; - - // Delete sites that were removed from the grid. - gGrid.sites.forEach(function (aSite) { - // The site must be valid and not in the current grid. - if (!aSite || aSites.indexOf(aSite) != -1) - return; - - batch.push(new Promise(resolve => { - // Fade out the to-be-removed site. - gTransformation.hideSite(aSite, function () { - let node = aSite.node; - - // Remove the site from the DOM. - node.parentNode.removeChild(node); - resolve(); - }); - })); - }); - - Promise.all(batch).then(aCallback); - }, - - /** - * Tries to fill empty cells with new links if available. - * @param aLinks The array of links. - * @param aCallback The callback to call when finished. - */ - _fillEmptyCells: function Updater_fillEmptyCells(aLinks, aCallback) { - let {cells, sites} = gGrid; - - // Find empty cells and fill them. - Promise.all(sites.map((aSite, aIndex) => { - if (aSite || !aLinks[aIndex]) - return null; - - return new Promise(resolve => { - // Create the new site and fade it in. - let site = gGrid.createSite(aLinks[aIndex], cells[aIndex]); - - // Set the site's initial opacity to zero. - site.node.style.opacity = 0; - - // Flush all style changes for the dynamically inserted site to make - // the fade-in transition work. - window.getComputedStyle(site.node).opacity; - gTransformation.showSite(site, resolve); - }); - })).then(aCallback).catch(console.exception); - } -}; |