{"id":18022,"date":"2026-09-20T03:38:19","date_gmt":"2026-09-20T03:38:19","guid":{"rendered":"https:\/\/aswal.ca\/?page_id=18022"},"modified":"2026-10-27T04:06:38","modified_gmt":"2026-10-27T04:06:38","slug":"creer-mon-gobelet","status":"publish","type":"page","link":"https:\/\/aswal.ca\/en\/creer-mon-gobelet\/","title":{"rendered":"Design My Cup"},"content":{"rendered":"<!-- ASWAL Cup Configurator 3D v0.2 \u2014 source 12 oz prototype, quote popup Elementor 1206 -->\n<div id=\"aswal-cup-configurator-shell\" style=\"width:100%;max-width:1320px;margin:0 auto 48px;overflow:hidden;\">\n  <iframe\n    id=\"aswal-cup-configurator-frame\"\n    title=\"Configurateur 3D de gobelets ASWAL\"\n    data-no-translation=\"\" translate=\"no\" loading=\"eager\"\n    referrerpolicy=\"strict-origin-when-cross-origin\"\n    allow=\"fullscreen; xr-spatial-tracking\"\n    style=\"display:block;width:100%;height:1500px;border:0;background:#fff;\"\n  ><\/iframe><script data-no-optimize=\"1\" data-cfasync=\"false\">(function(){var f=document.getElementById(\"aswal-cup-configurator-frame\");var en=document.documentElement.lang.toLowerCase().indexOf(\"en\")===0||location.pathname.indexOf(\"\/en\/\")===0;var data=en?\"PCFkb2N0eXBlIGh0bWw+PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD11dGY4PjxtZXRhIG5hbWU9dmlld3BvcnQgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSx2aWV3cG9ydC1maXQ9Y292ZXIiPjxzdHlsZT46cm9vdHtjb2xvci1zY2hlbWU6bGlnaHQ7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmctdG9wOmVudihzYWZlLWFyZWEtaW5zZXQtdG9wLDBweCk7cGFkZGluZy1ib3R0b206ZW52KHNhZmUtYXJlYS1pbnNldC1ib3R0b20sMHB4KX1odG1se3Njcm9sbC1wYWRkaW5nLXRvcDplbnYoc2FmZS1hcmVhLWluc2V0LXRvcCwwcHgpfWJvZHl7bWFyZ2luOjA7cGFkZGluZzowO2ZvbnQ6MTRweCAtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCxzYW5zLXNlcmlmO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMDAwfWltZ3ttYXgtd2lkdGg6MTAwJX1baGlkZGVuXTpub3QoW2hpZGRlbj11bnRpbC1mb3VuZCBpXSl7ZGlzcGxheTpub25lIWltcG9ydGFudH08L3N0eWxlPjwvaGVhZD48Ym9keT4KPHRpdGxlPkN1cCBjb25maWd1cmF0b3I8L3RpdGxlPgo8bWV0YSBuYW1lPSJjbGF1ZGU6dmlld3BvcnQtZml0LXNpZGVzIiBjb250ZW50PSJjb3ZlciI+CjxsaW5rIHJlbD0icHJlY29ubmVjdCIgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbSI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1JbnRlcjp3Z2h0QDUwMDs2MDA7NzAwOzgwMCZmYW1pbHk9TGF0bzp3Z2h0QDQwMDs1MDA7NjAwOzcwMCZkaXNwbGF5PXN3YXAiPgo8c3R5bGU+Ci8qIExheW91dCA6IGNvbG9ubmUgZCfDqXRhcGVzIMOgIGdhdWNoZSAocGFyY291cnMgY2xpZW50KSwgYXRlbGllciB2aXN1ZWwgw6AgZHJvaXRlICgzRCArIMOpdmVudGFpbCBkJ2ltcHJlc3Npb24pICovCjpyb290IHsKICBjb2xvci1zY2hlbWU6IGxpZ2h0OwogIC0tYmc6ICNGRkZGRkY7CiAgLS1zdXJmYWNlOiAjRkZGRkZGOwogIC0tc3VuazogI0Y4RjhGODsKICAtLWluazogIzU3NTc1NzsKICAtLWhlYWRpbmc6ICMwRjM2OUE7CiAgLS1tdXRlZDogIzc2NzY3NjsKICAtLWxpbmU6ICNFMkUyRTI7CiAgLS1hY2NlbnQ6ICMwRjM2OUE7CiAgLS1hY2NlbnQtaW5rOiAjRkZGRkZGOwogIC0tY3RhOiAjRTkzMjIzOwogIC0td2FybjogI0I5NDgzNTsKICAtLXdhcm4tYmc6ICNGRkYzRjA7CiAgLS1vazogIzJCN0E0NzsKICAtLW9rLWJnOiAjRUVGOEYxOwogIC0tZ3VpZGU6ICNFOTMyMjM7CiAgLS1zdGFnZTogcmFkaWFsLWdyYWRpZW50KDEyMCUgOTAlIGF0IDUwJSAzMCUsICNGRkZGRkYgMCUsICNGMkY0RjggNzIlKTsKICAtLWYtZGlzcGxheTogIkludGVyIiwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgLS1mLWJvZHk6ICJMYXRvIiwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgLS1mLW1vbm86ICJMYXRvIiwgQXJpYWwsIHNhbnMtc2VyaWY7Cn0KKiB7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH0KYm9keSB7CiAgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0taW5rKTsgZm9udC1mYW1pbHk6IHZhcigtLWYtYm9keSk7IGZvbnQtc2l6ZTogMTVweDsgbGluZS1oZWlnaHQ6IDEuNTsKICBwYWRkaW5nLWxlZnQ6IG1heCgxNnB4LCBlbnYoc2FmZS1hcmVhLWluc2V0LWxlZnQsIDBweCkpOyBwYWRkaW5nLXJpZ2h0OiBtYXgoMTZweCwgZW52KHNhZmUtYXJlYS1pbnNldC1yaWdodCwgMHB4KSk7CiAgcGFkZGluZy1ibG9jazogMjBweCA0MHB4Owp9Ci53cmFwIHsgbWF4LXdpZHRoOiAxMzIwcHg7IG1hcmdpbjogMCBhdXRvOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDE4cHg7IH0KaGVhZGVyLnRvcCB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgYWxpZ24taXRlbXM6IGJhc2VsaW5lOyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGdhcDogOHB4IDIwcHg7IH0KaGVhZGVyLnRvcCBoMSB7IGZvbnQtZmFtaWx5OiB2YXIoLS1mLWRpc3BsYXkpOyBmb250LXdlaWdodDogODAwOyBmb250LXNpemU6IGNsYW1wKDI0cHgsIDN2dywgMzJweCk7IGxldHRlci1zcGFjaW5nOiAtMC4wMmVtOyBtYXJnaW46IDA7IHRleHQtd3JhcDogYmFsYW5jZTsgY29sb3I6IHZhcigtLWhlYWRpbmcpOyB9CmhlYWRlci50b3AgLnRhZyB7IGZvbnQtZmFtaWx5OiB2YXIoLS1mLW1vbm8pOyBmb250LXNpemU6IDEycHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGxldHRlci1zcGFjaW5nOiAwLjA0ZW07IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IH0KLmFwcCB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDM2MHB4KSBtaW5tYXgoMCwgMWZyKTsgZ2FwOiAxOHB4OyBhbGlnbi1pdGVtczogc3RhcnQ7IH0KQG1lZGlhIChtYXgtd2lkdGg6IDkwMHB4KSB7CiAgLmFwcCB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDFmcik7IH0KICAuc3RlcHMgeyBvcmRlcjogLTE7IH0KICAuc3R1ZGlvIHsgb3JkZXI6IDA7IH0KfQoKLnN0ZXBzIHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxMnB4OyB9Ci5zdGVwIHsgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOyBib3JkZXItcmFkaXVzOiAxMHB4OyBwYWRkaW5nOiAxNnB4OyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEycHg7IG1pbi13aWR0aDogMDsgfQouc3RlcCBoMiB7IG1hcmdpbjogMDsgZm9udC1mYW1pbHk6IHZhcigtLWYtZGlzcGxheSk7IGZvbnQtd2VpZ2h0OiA3MDA7IGZvbnQtc2l6ZTogMTdweDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyBjb2xvcjogdmFyKC0taGVhZGluZyk7IH0KLnN0ZXAgaDIgLm4geyBmb250LWZhbWlseTogdmFyKC0tZi1kaXNwbGF5KTsgZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNzAwOyB3aWR0aDogMjRweDsgaGVpZ2h0OiAyNHB4OyBib3JkZXItcmFkaXVzOiA1MCU7IGRpc3BsYXk6IGlubGluZS1ncmlkOyBwbGFjZS1pdGVtczogY2VudGVyOyBiYWNrZ3JvdW5kOiAjRjJGNUZDOyBib3JkZXI6IDFweCBzb2xpZCAjQ0ZEOUYzOyBjb2xvcjogdmFyKC0taGVhZGluZyk7IGZsZXg6IG5vbmU7IH0KLnN0ZXAgcC5oaW50IHsgbWFyZ2luOiAwOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDEzLjVweDsgfQpsYWJlbC5sYmwgeyBmb250LXNpemU6IDEycHg7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGxldHRlci1zcGFjaW5nOiAwLjA2ZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtd2VpZ2h0OiA2MDA7IH0Kc2VsZWN0LCBpbnB1dFt0eXBlPSJ0ZXh0Il0gewogIGZvbnQ6IGluaGVyaXQ7IGNvbG9yOiB2YXIoLS1pbmspOyBiYWNrZ3JvdW5kOiB2YXIoLS1zdW5rKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7IGJvcmRlci1yYWRpdXM6IDdweDsgcGFkZGluZzogOHB4IDEwcHg7IHdpZHRoOiAxMDAlOwp9CnNlbGVjdDpmb2N1cy12aXNpYmxlLCBpbnB1dDpmb2N1cy12aXNpYmxlLCBidXR0b246Zm9jdXMtdmlzaWJsZSwgLmRyb3A6Zm9jdXMtdmlzaWJsZSB7IG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1hY2NlbnQpOyBvdXRsaW5lLW9mZnNldDogMnB4OyB9Ci5zcGVjcyB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDMsIG1pbm1heCgwLCAxZnIpKTsgZ2FwOiA2cHg7IH0KLnNwZWNzIGRpdiB7IGJhY2tncm91bmQ6IHZhcigtLXN1bmspOyBib3JkZXItcmFkaXVzOiA3cHg7IHBhZGRpbmc6IDdweCA4cHg7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMXB4OyB9Ci5zcGVjcyBiIHsgZm9udC1mYW1pbHk6IHZhcigtLWYtbW9ubyk7IGZvbnQtd2VpZ2h0OiA1MDA7IGZvbnQtc2l6ZTogMTRweDsgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsgfQouc3BlY3Mgc3BhbiB7IGZvbnQtc2l6ZTogMTFweDsgY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsgfQoKLmJ0biB7IGZvbnQ6IGluaGVyaXQ7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMTRweDsgYm9yZGVyLXJhZGl1czogOHB4OyBwYWRkaW5nOiA5cHggMTRweDsgY3Vyc29yOiBwb2ludGVyOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZSk7IGNvbG9yOiB2YXIoLS1pbmspOyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogOHB4OyB9Ci5idG46aG92ZXIgeyBib3JkZXItY29sb3I6IHZhcigtLW11dGVkKTsgfQouYnRuLnByaW1hcnkgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1hY2NlbnQtaW5rKTsgfQojb3JkZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1jdGEpOyBib3JkZXItY29sb3I6IHZhcigtLWN0YSk7IGNvbG9yOiAjRkZGRkZGOyB9CiNvcmRlcjpob3ZlciB7IGZpbHRlcjogYnJpZ2h0bmVzcyguOTYpOyB9Ci5idG4ucHJpbWFyeTpob3ZlciB7IGZpbHRlcjogYnJpZ2h0bmVzcygxLjA4KTsgfQouYnRuOmRpc2FibGVkIHsgb3BhY2l0eTogMC40NTsgY3Vyc29yOiBub3QtYWxsb3dlZDsgZmlsdGVyOiBub25lOyB9Ci5idG4uc20geyBmb250LXNpemU6IDEzcHg7IHBhZGRpbmc6IDZweCAxMHB4OyB9Ci5yb3cgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogOHB4OyB9CgouZHJvcCB7IGJvcmRlcjogMS41cHggZGFzaGVkIHZhcigtLWxpbmUpOyBib3JkZXItcmFkaXVzOiA5cHg7IHBhZGRpbmc6IDE4cHggMTRweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjdXJzb3I6IHBvaW50ZXI7IGJhY2tncm91bmQ6IHZhcigtLXN1bmspOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDRweDsgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIC4xNXMsIGJhY2tncm91bmQgLjE1czsgfQouZHJvcDpob3ZlciwgLmRyb3Aub3ZlciB7IGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsgfQouZHJvcCBzdHJvbmcgeyBmb250LXdlaWdodDogNjAwOyB9Ci5kcm9wIHNtYWxsIHsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAxMi41cHg7IH0KLmZpbGUtbmF0aXZlIHsgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7IHdpZHRoOiAxcHggIWltcG9ydGFudDsgaGVpZ2h0OiAxcHggIWltcG9ydGFudDsgb3BhY2l0eTogMCAhaW1wb3J0YW50OyBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7IHBvaW50ZXItZXZlbnRzOiBub25lICFpbXBvcnRhbnQ7IH0KLnBvc2VzIHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA4cHg7IHBhZGRpbmctdG9wOiA0cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgcGFkZGluZy10b3A6IDEycHg7IH0KLnBvc2UtZ3JpZCB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTsgZ2FwOiA4cHg7IH0KLnN1YmxibCB7IGRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDEyLjVweDsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogM3B4OyB9Ci5maWxlbWV0YSB7IGZvbnQtZmFtaWx5OiB2YXIoLS1mLW1vbm8pOyBmb250LXNpemU6IDEycHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgfQoudGVjaC1oaWRkZW4geyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KCi5ub3RlcyB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyB9Ci5ub3RlIHsgZm9udC1zaXplOiAxM3B4OyBib3JkZXItcmFkaXVzOiA3cHg7IHBhZGRpbmc6IDdweCAxMHB4OyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IH0KLm5vdGU6OmJlZm9yZSB7IGNvbnRlbnQ6ICIiOyB3aWR0aDogN3B4OyBoZWlnaHQ6IDdweDsgYm9yZGVyLXJhZGl1czogNTAlOyBtYXJnaW4tdG9wOiA2cHg7IGZsZXg6IG5vbmU7IGJhY2tncm91bmQ6IGN1cnJlbnRDb2xvcjsgfQoubm90ZS5vayB7IGJhY2tncm91bmQ6IHZhcigtLW9rLWJnKTsgY29sb3I6IHZhcigtLW9rKTsgfQoubm90ZS53YXJuIHsgYmFja2dyb3VuZDogdmFyKC0td2Fybi1iZyk7IGNvbG9yOiB2YXIoLS13YXJuKTsgfQoKLmlua3MgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDsgfQouaW5rIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAzNHB4IG1pbm1heCgwLCAxZnIpOyBnYXA6IDEwcHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IH0KLmluayAuc3cgeyB3aWR0aDogMzRweDsgaGVpZ2h0OiAzNHB4OyBib3JkZXItcmFkaXVzOiA3cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOyB9Ci5pbmsgLm1ldGEgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDRweDsgbWluLXdpZHRoOiAwOyB9Ci5pbmsgLm1ldGEgLmwxIHsgZm9udC1mYW1pbHk6IHZhcigtLWYtbW9ubyk7IGZvbnQtc2l6ZTogMTEuNXB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGdhcDogNnB4OyB9Ci5pbmsgaW5wdXQgeyBwYWRkaW5nOiA1cHggOHB4OyBmb250LXNpemU6IDEzLjVweDsgfQouY291bnQgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGdhcDogMTBweDsgfQouY291bnQgLmJpZyB7IGZvbnQtZmFtaWx5OiB2YXIoLS1mLWRpc3BsYXkpOyBmb250LXNpemU6IDMwcHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGxpbmUtaGVpZ2h0OiAxOyBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOyB9Ci5jb3VudCAuYmlnIHNtYWxsIHsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXdlaWdodDogNTAwOyB9Ci5waWxsIHsgZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBwYWRkaW5nOiAzcHggOXB4OyBib3JkZXItcmFkaXVzOiA5OXB4OyB9Ci5waWxsLm9rIHsgYmFja2dyb3VuZDogdmFyKC0tb2stYmcpOyBjb2xvcjogdmFyKC0tb2spOyB9Ci5waWxsLndhcm4geyBiYWNrZ3JvdW5kOiB2YXIoLS13YXJuLWJnKTsgY29sb3I6IHZhcigtLXdhcm4pOyB9Ci5zZWcgeyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgb3ZlcmZsb3c6IGhpZGRlbjsgfQouc2VnIGJ1dHRvbiB7IGZvbnQ6IGluaGVyaXQ7IGZvbnQtZmFtaWx5OiB2YXIoLS1mLW1vbm8pOyBmb250LXNpemU6IDEzcHg7IGJvcmRlcjogMDsgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZSk7IGNvbG9yOiB2YXIoLS1pbmspOyBwYWRkaW5nOiA2cHggMTFweDsgY3Vyc29yOiBwb2ludGVyOyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgfQouc2VnIGJ1dHRvbjpsYXN0LWNoaWxkIHsgYm9yZGVyLXJpZ2h0OiAwOyB9Ci5zZWcgYnV0dG9uW2FyaWEtcHJlc3NlZD0idHJ1ZSJdIHsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWFjY2VudC1pbmspOyB9CgouY2hlY2sgeyBkaXNwbGF5OiBmbGV4OyBnYXA6IDEwcHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBmb250LXNpemU6IDE0cHg7IGN1cnNvcjogcG9pbnRlcjsgfQouY2hlY2sgaW5wdXQgeyB3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4OyBtYXJnaW4tdG9wOiAycHg7IGFjY2VudC1jb2xvcjogdmFyKC0tYWNjZW50KTsgZmxleDogbm9uZTsgfQouZmluZSB7IGZvbnQtc2l6ZTogMTIuNXB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDA7IH0KCi5zdHVkaW8geyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDE4cHg7IG1pbi13aWR0aDogMDsgfQoucGFuZWwgeyBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7IGJvcmRlci1yYWRpdXM6IDEwcHg7IG92ZXJmbG93OiBoaWRkZW47IG1pbi13aWR0aDogMDsgfQoucGFuZWwtaGVhZCB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBnYXA6IDhweCAxNHB4OyBwYWRkaW5nOiAxMnB4IDE2cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgfQoucGFuZWwtaGVhZCBoMyB7IG1hcmdpbjogMDsgZm9udC1mYW1pbHk6IHZhcigtLWYtZGlzcGxheSk7IGZvbnQtd2VpZ2h0OiA3MDA7IGZvbnQtc2l6ZTogMTZweDsgY29sb3I6IHZhcigtLWhlYWRpbmcpOyB9Ci5wYW5lbC1oZWFkIC5zdWIgeyBmb250LXNpemU6IDEyLjVweDsgY29sb3I6IHZhcigtLW11dGVkKTsgfQojdmlld2VyIHsgcG9zaXRpb246IHJlbGF0aXZlOyBoZWlnaHQ6IGNsYW1wKDM2MHB4LCA1OHZoLCA1NjBweCk7IGJhY2tncm91bmQ6IHZhcigtLXN0YWdlKTsgdG91Y2gtYWN0aW9uOiBub25lOyB9CiN2aWV3ZXIgY2FudmFzIHsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IGN1cnNvcjogZ3JhYjsgfQojdmlld2VyIGNhbnZhczphY3RpdmUgeyBjdXJzb3I6IGdyYWJiaW5nOyB9Ci5tb2JpbGUtM2QtdG9nZ2xlIHsgZGlzcGxheTogbm9uZTsgfQpAbWVkaWEgKG1heC13aWR0aDogOTAwcHgpIHsKICAjdmlld2VyUGFuZWwgewogICAgd2lkdGg6IGNhbGMoMTAwJSAtIDQ4cHgpOwogICAgbWFyZ2luOiAxNHB4IDI0cHggNHB4OwogIH0KICAjdmlld2VyIHsKICAgIGhlaWdodDogY2xhbXAoMzMwcHgsIDUwdmgsIDQ3MHB4KTsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKICB9CiAgI3ZpZXdlciBjYW52YXMgewogICAgdG91Y2gtYWN0aW9uOiBub25lOwogICAgY3Vyc29yOiBncmFiOwogIH0KICAjc3BpbiwKICAubW9iaWxlLTNkLXRvZ2dsZSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgfQogIC52aWV3ZXItaGludCB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgfQp9Ci52aWV3ZXItaGludCB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMTRweDsgYm90dG9tOiAxMnB4OyBmb250LXNpemU6IDEycHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgcGFkZGluZzogNHB4IDlweDsgYm9yZGVyLXJhZGl1czogOTlweDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IH0KLmZhbi1ib3ggeyBwYWRkaW5nOiAxNHB4IDE2cHggMTZweDsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxMnB4OyB9Ci5mYW4tc2Nyb2xsIHsgb3ZlcmZsb3cteDogYXV0bzsgYmFja2dyb3VuZDogdmFyKC0tc3Vuayk7IGJvcmRlci1yYWRpdXM6IDhweDsgcGFkZGluZzogMTBweDsgfQojZmFuIHsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyBtaW4td2lkdGg6IDUyMHB4OyBoZWlnaHQ6IGF1dG87IH0KLmRpbXMgeyBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDEzMHB4LCAxZnIpKTsgZ2FwOiA4cHg7IH0KLmRpbXMgZGl2IHsgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCB2YXIoLS1saW5lKTsgcGFkZGluZy1sZWZ0OiAxMHB4OyB9Ci5kaW1zIGIgeyBkaXNwbGF5OiBibG9jazsgZm9udC1mYW1pbHk6IHZhcigtLWYtbW9ubyk7IGZvbnQtd2VpZ2h0OiA1MDA7IGZvbnQtc2l6ZTogMTVweDsgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsgfQouZGltcyBzcGFuIHsgZm9udC1zaXplOiAxMnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9Ci5sZWdlbmQgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogNnB4IDE2cHg7IGZvbnQtc2l6ZTogMTIuNXB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9Ci5sZWdlbmQgaSB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IDE4cHg7IGJvcmRlci10b3A6IDJweCBzb2xpZCB2YXIoLS1tdXRlZCk7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IG1hcmdpbi1yaWdodDogNnB4OyB9Ci5sZWdlbmQgaS5zYWZlIHsgYm9yZGVyLXRvcDogMnB4IGRhc2hlZCB2YXIoLS1ndWlkZSk7IH0KLmxlZ2VuZCBpLmJsZWVkIHsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLW11dGVkKTsgfQoKI3JlY2FwIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOyB9Ci5yZWNhcC1ib2R5IHsgcGFkZGluZzogMTZweDsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxOHB4OyB9Ci52aWV3cyB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDQsIG1pbm1heCgwLCAxZnIpKTsgZ2FwOiAxMHB4OyBtYXJnaW46IDA7IH0KQG1lZGlhIChtYXgtd2lkdGg6IDY0MHB4KSB7IC52aWV3cyB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTsgfSB9Ci52aWV3cyBmaWd1cmUgeyBtYXJnaW46IDA7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyB9Ci52aWV3cyBpbWcgeyB3aWR0aDogMTAwJTsgYXNwZWN0LXJhdGlvOiA1IC8gNjsgb2JqZWN0LWZpdDogY29udGFpbjsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgYmFja2dyb3VuZDogdmFyKC0tc3RhZ2UpOyB9Ci52aWV3cyBmaWdjYXB0aW9uIHsgZm9udC1zaXplOiAxMi41cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgZ2FwOiA2cHg7IH0KLnZpZXdzIGZpZ2NhcHRpb24gYiB7IGNvbG9yOiB2YXIoLS1pbmspOyBmb250LXdlaWdodDogNjAwOyB9Ci5kZWFkbGluZSB7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOyBib3JkZXItcmFkaXVzOiA5cHg7IHBhZGRpbmc6IDE0cHg7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tc3Vuayk7IH0KLmRlYWRsaW5lIGg0IHsgbWFyZ2luOiAwOyBmb250LWZhbWlseTogdmFyKC0tZi1kaXNwbGF5KTsgZm9udC1zaXplOiAxNXB4OyBmb250LXdlaWdodDogNjAwOyBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgZ2FwOiA2cHg7IH0KLmRlYWRsaW5lIGg0IHNwYW4geyBmb250LWZhbWlseTogdmFyKC0tZi1tb25vKTsgZm9udC13ZWlnaHQ6IDUwMDsgZm9udC1zaXplOiAxM3B4OyBjb2xvcjogdmFyKC0tYWNjZW50KTsgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsgfQouZGVhZGxpbmUgcCB7IG1hcmdpbjogMDsgZm9udC1zaXplOiAxMy41cHg7IH0KLmZlZSB7IGJhY2tncm91bmQ6IHZhcigtLXdhcm4tYmcpOyBjb2xvcjogdmFyKC0td2Fybik7IGJvcmRlci1yYWRpdXM6IDdweDsgcGFkZGluZzogOHB4IDEwcHg7IGZvbnQtc2l6ZTogMTNweDsgfQouY29uZmlybSB7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgcGFkZGluZy10b3A6IDEwcHg7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogOHB4OyB9Ci5jb25maXJtIHRleHRhcmVhIHsgZm9udDogaW5oZXJpdDsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogdmFyKC0taW5rKTsgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOyBib3JkZXItcmFkaXVzOiA3cHg7IHBhZGRpbmc6IDhweCAxMHB4OyB3aWR0aDogMTAwJTsgbWluLWhlaWdodDogNzBweDsgcmVzaXplOiB2ZXJ0aWNhbDsgfQouYnRuLmRhbmdlciB7IGNvbG9yOiB2YXIoLS13YXJuKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS13YXJuKTsgfQoucmVjYXAtYm9keSBkbCB7IG1hcmdpbjogMDsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtYXgtY29udGVudCBtaW5tYXgoMCwgMWZyKTsgZ2FwOiA2cHggMTRweDsgZm9udC1zaXplOiAxNHB4OyB9Ci5yZWNhcC1ib2R5IGR0IHsgY29sb3I6IHZhcigtLW11dGVkKTsgfQoucmVjYXAtYm9keSBkZCB7IG1hcmdpbjogMDsgZm9udC1mYW1pbHk6IHZhcigtLWYtbW9ubyk7IGZvbnQtc2l6ZTogMTNweDsgd29yZC1icmVhazogYnJlYWstd29yZDsgfQouYnVzeSB7IG9wYWNpdHk6IC41NTsgdHJhbnNpdGlvbjogb3BhY2l0eSAuMnM7IH0KQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsgKiB7IHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDsgfSB9Ci5hci1vdiB7IHBvc2l0aW9uOiBmaXhlZDsgaW5zZXQ6IDA7IHotaW5kZXg6IDUwOyBiYWNrZ3JvdW5kOiByZ2JhKDEwLCAxOCwgMjQsIDAuNTUpOyBkaXNwbGF5OiBncmlkOyBwbGFjZS1pdGVtczogY2VudGVyOwogIHBhZGRpbmc6IG1heCgxNnB4LCBlbnYoc2FmZS1hcmVhLWluc2V0LXRvcCwgMHB4KSkgbWF4KDE2cHgsIGVudihzYWZlLWFyZWEtaW5zZXQtcmlnaHQsIDBweCkpIG1heCgxNnB4LCBlbnYoc2FmZS1hcmVhLWluc2V0LWJvdHRvbSwgMHB4KSkgbWF4KDE2cHgsIGVudihzYWZlLWFyZWEtaW5zZXQtbGVmdCwgMHB4KSk7IH0KLmFyLWJveCB7IGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgYm9yZGVyLXJhZGl1czogMTRweDsgd2lkdGg6IG1pbig2MjBweCwgMTAwJSk7IG1heC1oZWlnaHQ6IDEwMCU7IG92ZXJmbG93OiBhdXRvOyB9Ci5hci1ib2R5IHsgcGFkZGluZzogMTRweCAxNnB4IDE2cHg7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMTJweDsgfQouYXItc3RhZ2UgeyBoZWlnaHQ6IGNsYW1wKDI2MHB4LCA1MHZoLCA0NDBweCk7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLXN0YWdlKTsgb3ZlcmZsb3c6IGhpZGRlbjsgfQouYXItc3RhZ2UgbW9kZWwtdmlld2VyIHsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgfQouYXItb3ZbaGlkZGVuXSB7IGRpc3BsYXk6IG5vbmU7IH0KLmFyLW1zZyB7IGZvbnQtc2l6ZTogMTNweDsgY29sb3I6IHZhcigtLXdhcm4pOyBtYXJnaW46IDA7IH0KPC9zdHlsZT4KCjxkaXYgY2xhc3M9IndyYXAiPgogIDxoZWFkZXIgY2xhc3M9InRvcCI+CiAgICA8aDE+Q3VwIGNvbmZpZ3VyYXRvcjwvaDE+CiAgICAKICA8L2hlYWRlcj4KCiAgPGRpdiBjbGFzcz0iYXBwIj4KICAgIDxhc2lkZSBjbGFzcz0ic3RlcHMiPgogICAgICA8c2VjdGlvbiBjbGFzcz0ic3RlcCI+CiAgICAgICAgPGgyPjxzcGFuIGNsYXNzPSJuIj4xPC9zcGFuPkZvcm1hdDwvaDI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibGJsIiBmb3I9ImZvcm1hdCI+Q3VwPC9sYWJlbD4gICAgICAgICAgPHNlbGVjdCBpZD0iZm9ybWF0Ij48b3B0aW9uIHZhbHVlPSI1b3oiPjUgb3o8L29wdGlvbj48b3B0aW9uIHZhbHVlPSI3b3oiPjcgb3o8L29wdGlvbj48b3B0aW9uIHZhbHVlPSI4b3oiPjggb3o8L29wdGlvbj48b3B0aW9uIHZhbHVlPSIxMG96Ij4xMCBvejwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjEyb3oiIHNlbGVjdGVkPjEyIG96PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iMTZveiI+MTYgb3o8L29wdGlvbj48b3B0aW9uIHZhbHVlPSIyMG96Ij4yMCBvejwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjIyb3oiPjIyIG96PC9vcHRpb24+PC9zZWxlY3Q+PHAgY2xhc3M9ImhpbnQiPlRlbXBvcmFyeSBwcmV2aWV3OiBhbGwgc2l6ZXMgdXNlIHRoZSAxMiBveiBjdXAgbW9kZWwuIFlvdXIgc2VsZWN0ZWQgc2l6ZSB3aWxsIGJlIGluY2x1ZGVkIGluIHlvdXIgcXVvdGUuPC9wPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNwZWNzIHRlY2gtaGlkZGVuIiBpZD0ic3BlY3MiPjwvZGl2PgogICAgICA8L3NlY3Rpb24+CgogICAgICA8c2VjdGlvbiBjbGFzcz0ic3RlcCB0ZWNoLWhpZGRlbiI+CiAgICAgICAgPGgyPjxzcGFuIGNsYXNzPSJuIj4yPC9zcGFuPlJlY3Rhbmd1bGFyIHRlbXBsYXRlPC9oMj4KICAgICAgICA8cCBjbGFzcz0iaGludCI+Q3LDqWV6IHZvdHJlIG1hcXVldHRlIMOgIHBsYXQgZGFucyBjZSByZWN0YW5nbGUuIExlIHN5c3TDqG1lIHNlIGNoYXJnZSBkZSBsYSBkw6lmb3JtZXIgZW4gw6l2ZW50YWlsLjwvcD4KICAgICAgICA8ZGl2PgogICAgICAgICAgPGxhYmVsIGNsYXNzPSJsYmwiPldhcnBpbmc8L2xhYmVsPgogICAgICAgICAgPGRpdiBjbGFzcz0icm93IiBzdHlsZT0ibWFyZ2luLXRvcDo2cHgiPjxkaXYgY2xhc3M9InNlZyIgaWQ9IndhcnBTZWciIHJvbGU9Imdyb3VwIiBhcmlhLWxhYmVsPSJNb2RlIGRlIGTDqWZvcm1hdGlvbiI+CiAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLXc9InN0YW5kYXJkIiBhcmlhLXByZXNzZWQ9InRydWUiPlN0YW5kYXJkPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLXc9ImNvbmZvcm1lIiBhcmlhLXByZXNzZWQ9ImZhbHNlIj5QcmVzZXJ2ZSBzaGFwZXM8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PjwvZGl2PgogICAgICAgICAgPHAgY2xhc3M9ImZpbmUiIGlkPSJ3YXJwSGludCIgc3R5bGU9Im1hcmdpbi10b3A6NnB4Ij48L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iZGltcyIgaWQ9InJlY3REaW1zIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPjxidXR0b24gY2xhc3M9ImJ0biBzbSIgaWQ9ImRsVGVtcGxhdGUiIHR5cGU9ImJ1dHRvbiI+VMOpbMOpY2hhcmdlciBsZSBnYWJhcml0IChTVkcpPC9idXR0b24+PC9kaXY+CiAgICAgIDwvc2VjdGlvbj4KCiAgICAgIDxzZWN0aW9uIGNsYXNzPSJzdGVwIiBpZD0idXBsb2FkU3RlcCI+CiAgICAgICAgPGgyPjxzcGFuIGNsYXNzPSJuIj4yPC9zcGFuPllvdXIgYXJ0d29yazwvaDI+CiAgICAgICAgPGxhYmVsIGNsYXNzPSJkcm9wIiBpZD0iZHJvcCIgZm9yPSJmaWxlIiB0YWJpbmRleD0iMCIgcm9sZT0iYnV0dG9uIiBhcmlhLWxhYmVsPSJVcGxvYWQgYXJ0d29yayI+CiAgICAgICAgICA8c3Ryb25nPkRyb3AgeW91ciBmaWxlIGhlcmU8L3N0cm9uZz4KICAgICAgICAgIDxzbWFsbD5QTkcsIEpQRyBvciBTVkcgwrcgb3IgY2xpY2sgdG8gYnJvd3NlPC9zbWFsbD4KICAgICAgICA8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBpZD0iZmlsZSIgY2xhc3M9ImZpbGUtbmF0aXZlIiBhY2NlcHQ9ImltYWdlL3BuZyxpbWFnZS9qcGVnLGltYWdlL3N2Zyt4bWwiPgogICAgICAgIDxkaXYgY2xhc3M9ImZpbGVtZXRhIHRlY2gtaGlkZGVuIiBpZD0iZmlsZW1ldGEiPkJsYW5rIHdoaXRlIGN1cC4gVXBsb2FkIHlvdXIgYXJ0d29yayB0byBzZWUgdGhlIDNEIHByZXZpZXcuPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0icG9zZXMgdGVjaC1oaWRkZW4iPgogICAgICAgICAgPGxhYmVsIGNsYXNzPSJsYmwiPlLDqXDDqXRpdGlvbiAocG9zZXMpPC9sYWJlbD4KICAgICAgICAgIDxkaXYgY2xhc3M9InBvc2UtZ3JpZCI+CiAgICAgICAgICAgIDxkaXY+PGxhYmVsIGNsYXNzPSJzdWJsYmwiIGZvcj0icG9zZXNYIj5FbiBsYXJnZXVyPC9sYWJlbD4KICAgICAgICAgICAgICA8c2VsZWN0IGlkPSJwb3Nlc1giPjxvcHRpb24gc2VsZWN0ZWQ+MTwvb3B0aW9uPjxvcHRpb24+Mjwvb3B0aW9uPjxvcHRpb24+Mzwvb3B0aW9uPjxvcHRpb24+NDwvb3B0aW9uPjxvcHRpb24+NTwvb3B0aW9uPjxvcHRpb24+Njwvb3B0aW9uPjxvcHRpb24+ODwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PgogICAgICAgICAgICA8ZGl2PjxsYWJlbCBjbGFzcz0ic3VibGJsIiBmb3I9InBvc2VzWSI+RW4gaGF1dGV1cjwvbGFiZWw+CiAgICAgICAgICAgICAgPHNlbGVjdCBpZD0icG9zZXNZIj48b3B0aW9uIHNlbGVjdGVkPjE8L29wdGlvbj48b3B0aW9uPjI8L29wdGlvbj48b3B0aW9uPjM8L29wdGlvbj48b3B0aW9uPjQ8L29wdGlvbj48L3NlbGVjdD48L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGxhYmVsIGNsYXNzPSJjaGVjayI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icG9zZXNLZWVwIiBjaGVja2VkPiA8c3Bhbj5HYXJkZXIgbGVzIHByb3BvcnRpb25zIGRlIGNoYXF1ZSBwb3NlPC9zcGFuPjwvbGFiZWw+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJmaWxlbWV0YSIgaWQ9InBvc2VJbmZvIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJub3RlcyB0ZWNoLWhpZGRlbiIgaWQ9ImNoZWNrcyI+PC9kaXY+CgogICAgICA8L3NlY3Rpb24+CgogICAgICA8c2VjdGlvbiBjbGFzcz0ic3RlcCI+CiAgICAgICAgPGgyPjxzcGFuIGNsYXNzPSJuIj4zPC9zcGFuPlByaW50IGNvbG91cnM8L2gyPgogICAgICAgIDxkaXYgY2xhc3M9ImNvdW50Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImJpZyIgaWQ9Imlua0NvdW50Ij4wIDxzbWFsbD5jb2xvdXJzPC9zbWFsbD48L2Rpdj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJwaWxsIG9rIiBpZD0iaW5rUGlsbCI+T0s8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibGJsIj5MaW1pdCB0bzwvbGFiZWw+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciIHN0eWxlPSJhbGlnbi1pdGVtczpjZW50ZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWciIGlkPSJsaW1pdFNlZyIgcm9sZT0iZ3JvdXAiIGFyaWEtbGFiZWw9Ik1heGltdW0gbnVtYmVyIG9mIGNvbG91cnMiPgogICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLW49IjAiIGFyaWEtcHJlc3NlZD0idHJ1ZSI+T3JpZ2luYWw8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1uPSIxIiBhcmlhLXByZXNzZWQ9ImZhbHNlIj4xPC9idXR0b24+CiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtbj0iMiIgYXJpYS1wcmVzc2VkPSJmYWxzZSI+MjwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLW49IjMiIGFyaWEtcHJlc3NlZD0iZmFsc2UiPjM8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1uPSI0IiBhcmlhLXByZXNzZWQ9ImZhbHNlIj40PC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iaW5rcyIgaWQ9Imlua3MiPjwvZGl2PgogICAgICAgIDxwIGNsYXNzPSJmaW5lIj5TdWdnZXN0ZWQgUGFudG9uZSBjb2xvdXJzIGFyZSBhcHByb3hpbWF0ZSBzY3JlZW4gbWF0Y2hlcy4gWW91IG1heSBlbnRlciB5b3VyIG93biByZWZlcmVuY2VzLiBXaGl0ZSBpcyB0aGUgcGFwZXIgYW5kIGRvZXMgbm90IGNvdW50IGFzIGFuIGluay48L3A+CiAgICAgIDwvc2VjdGlvbj4KCiAgICAgIDxzZWN0aW9uIGNsYXNzPSJzdGVwIj4KICAgICAgICA8aDI+PHNwYW4gY2xhc3M9Im4iPjQ8L3NwYW4+UmV2aWV3IGFuZCByZXF1ZXN0IGEgcXVvdGU8L2gyPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8bGFiZWwgY2xhc3M9ImxibCIgZm9yPSJxdHkiPlF1YW50aXR5PC9sYWJlbD4KICAgICAgICAgIDxzZWxlY3QgaWQ9InF0eSI+CiAgICAgICAgICAgIDxvcHRpb24+MSAwMDA8L29wdGlvbj48b3B0aW9uIHNlbGVjdGVkPjIgNTAwPC9vcHRpb24+PG9wdGlvbj41IDAwMDwvb3B0aW9uPjxvcHRpb24+MTAgMDAwPC9vcHRpb24+PG9wdGlvbj4yNSAwMDA8L29wdGlvbj4KICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgIDwvZGl2PgogICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2siPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImFwcHJvdmUiPiA8c3Bhbj5JIGNvbmZpcm0gdGhhdCB0aGlzIDNEIHByZXZpZXcgbWF0Y2hlcyBteSBpbnRlbmRlZCBkZXNpZ24uPC9zcGFuPjwvbGFiZWw+CiAgICAgICAgPHAgY2xhc3M9ImZpbmUiPk9uLXNjcmVlbiBjb2xvdXJzIGFyZSBpbmRpY2F0aXZlLiBPdXIgcHJlcHJlc3MgdGVhbSB3aWxsIGNoZWNrIGFuZCBhZGp1c3QgeW91ciBmaWxlIGFzIG5lZWRlZCBiZWZvcmUgcHJpbnRpbmcuPC9wPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBwcmltYXJ5IiBpZD0ib3JkZXIiIHR5cGU9ImJ1dHRvbiIgZGlzYWJsZWQ+Q29udGludWUgdG8gcXVvdGU8L2J1dHRvbj4KICAgICAgPC9zZWN0aW9uPgogICAgPC9hc2lkZT4KCiAgICA8bWFpbiBjbGFzcz0ic3R1ZGlvIj4KICAgICAgPHNlY3Rpb24gY2xhc3M9InBhbmVsIiBpZD0idmlld2VyUGFuZWwiPgogICAgICAgIDxkaXYgY2xhc3M9InBhbmVsLWhlYWQiPgogICAgICAgICAgPGgzPjNEIHByZXZpZXc8L2gzPgogICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHNtIiBpZD0ic3BpbiIgdHlwZT0iYnV0dG9uIiBhcmlhLXByZXNzZWQ9InRydWUiPlBhdXNlIHJvdGF0aW9uPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBzbSBwcmltYXJ5IiBpZD0iYXJCdG4iIHR5cGU9ImJ1dHRvbiI+VmlldyBpbiBBUjwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0idmlld2VyIj48c3BhbiBjbGFzcz0idmlld2VyLWhpbnQiIGlkPSJ2aWV3ZXJIaW50Ij5EcmFnIHRoZSBjdXAgdG8gcm90YXRlIMK3IHVzZSB0aGUgc2lkZXMgdG8gc2Nyb2xsPC9zcGFuPjwvZGl2PgogICAgICA8L3NlY3Rpb24+CgogICAgICA8c2VjdGlvbiBjbGFzcz0icGFuZWwiPgogICAgICAgIDxkaXYgY2xhc3M9InBhbmVsLWhlYWQiPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGgzPlByaW50IGxheW91dDwvaDM+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1YiI+QXJ0d29yayBhdXRvbWF0aWNhbGx5IGZpdHRlZCB0byB0aGUgMTIgb3ogdGVtcGxhdGU8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHNtIiBpZD0iZGxGYW5QbmciIHR5cGU9ImJ1dHRvbiI+UE5HIDMwMCBkcGk8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHNtIiBpZD0iZGxGYW5TdmciIHR5cGU9ImJ1dHRvbiI+U1ZHIHdpdGggY3V0IGxpbmU8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImZhbi1ib3giPgogICAgICAgICAgPGRpdiBjbGFzcz0iZmFuLXNjcm9sbCI+PGNhbnZhcyBpZD0iZmFuIiB3aWR0aD0iMTQwMCIgaGVpZ2h0PSI3MDAiPjwvY2FudmFzPjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kIj48c3Bhbj48aT48L2k+Q3V0IGxpbmU8L3NwYW4+PHNwYW4+PGkgY2xhc3M9ImJsZWVkIj48L2k+MyBtbSBibGVlZDwvc3Bhbj48c3Bhbj48aSBjbGFzcz0ic2FmZSI+PC9pPjQgbW0gc2FmZSBhcmVhPC9zcGFuPjxzcGFuPkhhdGNoaW5nOiBnbHVlIG92ZXJsYXA8L3NwYW4+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaW1zIiBpZD0iZmFuRGltcyI+PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvc2VjdGlvbj4KCiAgICAgIDxzZWN0aW9uIGNsYXNzPSJwYW5lbCIgaWQ9InJlY2FwIiBoaWRkZW4+CiAgICAgICAgPGRpdiBjbGFzcz0icGFuZWwtaGVhZCI+PGRpdj48aDM+QWNjdXPDqSBkZSBjb21tYW5kZSAoc2ltdWxhdGlvbik8L2gzPjxkaXYgY2xhc3M9InN1YiIgaWQ9Im9yZGVyTm8iPjwvZGl2PjwvZGl2PjxzcGFuIGNsYXNzPSJwaWxsIG9rIiBpZD0ib3JkZXJQaWxsIj5FbnZvecOpZSBhdSBwcsOpcHJlc3NlPC9zcGFuPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InJlY2FwLWJvZHkiPgogICAgICAgICAgPGZpZ3VyZSBjbGFzcz0idmlld3MiIGlkPSJyZWNhcFZpZXdzIiBhcmlhLWxhYmVsPSJMZXMgNCBjw7R0w6lzIGR1IGdvYmVsZXQgYXBwcm91dsOpIj48L2ZpZ3VyZT4KICAgICAgICAgIDxkbCBpZD0icmVjYXBMaXN0Ij48L2RsPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVhZGxpbmUiIGlkPSJkZWFkbGluZSI+CiAgICAgICAgICAgIDxoND5Bbm51bGF0aW9uIG91IHJlY3RpZmljYXRpb24gPHNwYW4gaWQ9ImNvdW50ZG93biI+PC9zcGFuPjwvaDQ+CiAgICAgICAgICAgIDxwIGlkPSJkZWFkbGluZVRleHQiPjwvcD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVlIj5Ub3V0ZSBhbm51bGF0aW9uIG91IHJlY3RpZmljYXRpb24gZW50cmHDrm5lIHVuZSByZXRlbnVlIGRlIDEwICUgZHUgbW9udGFudCBkZSBsYSBjb21tYW5kZSBwb3VyIGZyYWlzIGRlIHRyYWl0ZW1lbnQuPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyIgaWQ9ImRlYWRsaW5lQWN0aW9ucyI+CiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHNtIiBpZD0iYXNrRml4IiB0eXBlPSJidXR0b24iPkRlbWFuZGVyIHVuZSByZWN0aWZpY2F0aW9uPC9idXR0b24+CiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHNtIGRhbmdlciIgaWQ9ImFza0NhbmNlbCIgdHlwZT0iYnV0dG9uIj5Bbm51bGVyIGxhIGNvbW1hbmRlPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb25maXJtIiBpZD0iY29uZmlybUJveCIgaGlkZGVuPgogICAgICAgICAgICAgIDxwIGlkPSJjb25maXJtVGV4dCI+PC9wPgogICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iZml4Tm90ZSIgcGxhY2Vob2xkZXI9IkTDqWNyaXZleiBsYSBtb2RpZmljYXRpb24gc291aGFpdMOpZSAodGV4dGUsIGNvdWxldXIsIHBvc2l0aW9u4oCmKSIgaGlkZGVuPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBzbSBwcmltYXJ5IiBpZD0iY29uZmlybVllcyIgdHlwZT0iYnV0dG9uIj5Db25maXJtZXI8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBzbSIgaWQ9ImNvbmZpcm1ObyIgdHlwZT0iYnV0dG9uIj5SZXRvdXI8L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9zZWN0aW9uPgogICAgPC9tYWluPgogIDwvZGl2Pgo8L2Rpdj4KCjxkaXYgY2xhc3M9ImFyLW92IiBpZD0iYXJPdiIgaGlkZGVuIHJvbGU9ImRpYWxvZyIgYXJpYS1tb2RhbD0idHJ1ZSIgYXJpYS1sYWJlbGxlZGJ5PSJhclRpdGxlIj4KICA8ZGl2IGNsYXNzPSJhci1ib3giPgogICAgPGRpdiBjbGFzcz0icGFuZWwtaGVhZCI+CiAgICAgIDxkaXY+PGgzIGlkPSJhclRpdGxlIj5BdWdtZW50ZWQgcmVhbGl0eSBjdXA8L2gzPjxkaXYgY2xhc3M9InN1YiIgaWQ9ImFyU3ViIj5QcmVwYXJpbmcgbW9kZWzigKY8L2Rpdj48L2Rpdj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHNtIiBpZD0iYXJDbG9zZSIgdHlwZT0iYnV0dG9uIj5DbG9zZTwvYnV0dG9uPgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJhci1ib2R5Ij4KICAgICAgPHAgY2xhc3M9ImZpbmUiPlRoZSBjdXAgYXBwZWFycyBhdCBhY3R1YWwgc2l6ZSB3aXRoIHlvdXIgYXJ0d29yay4gUGxhY2UgaXQgb24gYSB0YWJsZSB0byBjaGVjayBsb2dvIHNpemUgYW5kIHJlYWRhYmlsaXR5LjwvcD4KICAgICAgPGRpdiBjbGFzcz0iYXItc3RhZ2UiIGlkPSJhclN0YWdlIj48L2Rpdj4KICAgICAgPHAgY2xhc3M9ImFyLW1zZyIgaWQ9ImFyTXNnIiBoaWRkZW4+PC9wPgogICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBwcmltYXJ5IiBpZD0iYXJMYXVuY2giIHR5cGU9ImJ1dHRvbiIgZGlzYWJsZWQ+T3BlbiBBUiBjYW1lcmE8L2J1dHRvbj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gc20iIGlkPSJhclppcCIgdHlwZT0iYnV0dG9uIiBkaXNhYmxlZD5Eb3dubG9hZCBBUiBmaWxlczwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgICAgPHAgY2xhc3M9ImZpbmUiPmlQaG9uZSBhbmQgaVBhZDogQVIgUXVpY2sgTG9vay4gQW5kcm9pZDogQ2hyb21lIHdpdGggQVJDb3JlLjwvcD4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KCjxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy90aHJlZS5qcy9yMTI4L3RocmVlLm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3RocmVlQDAuMTI4LjAvZXhhbXBsZXMvanMvY29udHJvbHMvT3JiaXRDb250cm9scy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3RocmVlQDAuMTI4LjAvZXhhbXBsZXMvanMvbGlicy9mZmxhdGUubWluLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vdGhyZWVAMC4xMjguMC9leGFtcGxlcy9qcy9leHBvcnRlcnMvR0xURkV4cG9ydGVyLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vdGhyZWVAMC4xMjguMC9leGFtcGxlcy9qcy9leHBvcnRlcnMvVVNEWkV4cG9ydGVyLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQGdvb2dsZS9tb2RlbC12aWV3ZXJAMy41LjAvZGlzdC9tb2RlbC12aWV3ZXItdW1kLm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQ+CihmdW5jdGlvbiAoKSB7CiAgInVzZSBzdHJpY3QiOwoKICAvKiAtLS0tLS0tLS0tIEZvcm1hdHMgKHVuZSBsaWduZSBwYXIgZm9ybWF0KSAtLS0tLS0tLS0tICovCiAgY29uc3QgRk9STUFUUyA9IHsKICAgICIxMm96IjogeyBsYWJlbDogIjEyIG96IiwgbWw6IDM1NSwgRDogOTAsIGQ6IDYwLCBoOiAxMTAsIGJsZWVkOiAzLCBzYWZlOiA0LCBnbHVlOiA2IH0KICB9OwogIGxldCBjdXAgPSBGT1JNQVRTWyIxMm96Il07CgogIGZ1bmN0aW9uIGdlb20oYykgewogICAgY29uc3QgcjEgPSBjLkQgLyAyLCByMiA9IGMuZCAvIDIsIGRyID0gcjEgLSByMjsKICAgIGNvbnN0IHMgPSBNYXRoLmh5cG90KGMuaCwgZHIpOyAgICAgICAgICAgLy8gZ8OpbsOpcmF0cmljZSAoaGF1dGV1ciBpbXByaW3DqWUgcsOpZWxsZSkKICAgIGNvbnN0IFJvID0gcyAqIHIxIC8gZHI7ICAgICAgICAgICAgICAgICAgLy8gcmF5b24gZXh0w6lyaWV1ciBkZSBsJ8OpdmVudGFpbAogICAgY29uc3QgUmkgPSBSbyAtIHM7ICAgICAgICAgICAgICAgICAgICAgICAvLyByYXlvbiBpbnTDqXJpZXVyCiAgICBjb25zdCB0aCA9IDIgKiBNYXRoLlBJICogcjEgLyBSbzsgICAgICAgIC8vIGFuZ2xlIGQnb3V2ZXJ0dXJlIChyYWQpCiAgICBjb25zdCBXID0gMiAqIE1hdGguUEkgKiByMTsgICAgICAgICAgICAgIC8vIGxhcmdldXIgZHUgcmVjdGFuZ2xlIChjaXJjb25mw6lyZW5jZSBkdSBoYXV0KQogICAgcmV0dXJuIHsgcjEsIHIyLCBzLCBSbywgUmksIHRoLCBXLCBIOiBzIH07CiAgfQogIGxldCBHID0gZ2VvbShjdXApOwoKICAvKiBXYXJwaW5nIDogInN0YW5kYXJkIiAocmVjdGFuZ2xlIMOpdGlyw6kgZG93bikgb3UgImNvbmZvcm1lIiAobGVzIGZvcm1lcyBzb250IHByw6lzZXJ2w6llcyA6CiAgICAgYW5nbGUgPSBYIC8gcm0sIHJheW9uID0gUm8gwrcgZXhwKC1ZIC8gcm0pLCDDqWNoZWxsZSAxOjEgw6AgbWktaGF1dGV1ciwgcm0gPSBtb3llbm5lIGfDqW9tw6l0cmlxdWUgZGVzIHJheW9ucykgKi8KICBsZXQgd2FycE1vZGUgPSAic3RhbmRhcmQiOwogIGZ1bmN0aW9uIHRwbCgpIHsKICAgIGlmICh3YXJwTW9kZSA9PT0gInN0YW5kYXJkIikgcmV0dXJuIHsgVzogRy5XLCBIOiBHLkggfTsKICAgIGNvbnN0IHJtID0gTWF0aC5zcXJ0KEcuUm8gKiBHLlJpKTsKICAgIHJldHVybiB7IFc6IEcudGggKiBybSwgSDogcm0gKiBNYXRoLmxvZyhHLlJvIC8gRy5SaSksIHJtIH07CiAgfQogIC8vIHBvc2l0aW9uIHZlcnRpY2FsZSBkYW5zIGxhIG1hcXVldHRlICgwID0gaGF1dCwgMSA9IGJhcykgcG91ciB1biByYXlvbiBkb25uw6kgZGUgbCfDqXZlbnRhaWwKICBmdW5jdGlvbiB2T2ZSYWRpdXMocikgeyByZXR1cm4gd2FycE1vZGUgPT09ICJzdGFuZGFyZCIgPyAoRy5SbyAtIHIpIC8gRy5zIDogTWF0aC5sb2coRy5SbyAvIHIpIC8gTWF0aC5sb2coRy5SbyAvIEcuUmkpOyB9CgogIGNvbnN0IGZtdCA9ICh2LCBuID0gMSkgPT4gdi50b0xvY2FsZVN0cmluZygiZW4tQ0EiLCB7IG1pbmltdW1GcmFjdGlvbkRpZ2l0czogbiwgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBuIH0pOwoKICAvKiAtLS0tLS0tLS0tIFBhbnRvbmUgKGFwcHJveGltYXRpb25zIMOpY3JhbiwgY29hdGVkKSAtLS0tLS0tLS0tICovCiAgY29uc3QgUEFOVE9ORSA9IFsKICAgIFsiQmxhY2sgQyIsICIjMkQyOTI2Il0sIFsiQ29vbCBHcmF5IDExIEMiLCAiIzUzNTY1QSJdLCBbIkNvb2wgR3JheSA3IEMiLCAiIzk3OTk5QiJdLAogICAgWyIxODYgQyIsICIjQzgxMDJFIl0sIFsiMTg1IEMiLCAiI0U0MDAyQiJdLCBbIjAzMiBDIiwgIiNFRjMzNDAiXSwgWyI3NjIxIEMiLCAiI0FCMjMyOCJdLCBbIjE3OTUgQyIsICIjRDIyNjMwIl0sCiAgICBbIjAyMSBDIiwgIiNGRTUwMDAiXSwgWyIxNTEgQyIsICIjRkY4MjAwIl0sIFsiMTIzNSBDIiwgIiNGRkI4MUMiXSwgWyIxMTYgQyIsICIjRkZDRDAwIl0sIFsiWWVsbG93IEMiLCAiI0ZFREQwMCJdLAogICAgWyIzNzYgQyIsICIjODRCRDAwIl0sIFsiMzU1IEMiLCAiIzAwOTYzOSJdLCBbIjM0OCBDIiwgIiMwMDg0M0QiXSwgWyI3NzQxIEMiLCAiIzQ0ODgzRSJdLCBbIjM0MjUgQyIsICIjMDA2MzQxIl0sIFsiNTUzNSBDIiwgIiMxODMwMjgiXSwKICAgIFsiMzExIEMiLCAiIzA1QzNERSJdLCBbIlByb2Nlc3MgQmx1ZSBDIiwgIiMwMDg1Q0EiXSwgWyIzMDA1IEMiLCAiIzAwNzdDOCJdLCBbIjMwMCBDIiwgIiMwMDVFQjgiXSwgWyIyOTQ1IEMiLCAiIzAwNEM5NyJdLAogICAgWyIyODYgQyIsICIjMDAzM0EwIl0sIFsiNzQ2OSBDIiwgIiMwMDVGODYiXSwgWyIyODIgQyIsICIjMDQxRTQyIl0sIFsiMjY2IEMiLCAiIzc1M0JCRCJdLCBbIjI2ODUgQyIsICIjMzMwMDcyIl0sCiAgICBbIjIxOSBDIiwgIiNEQTE4ODQiXSwgWyJSaG9kYW1pbmUgUmVkIEMiLCAiI0UxMDA5OCJdLCBbIjQ2NSBDIiwgIiNCOTk3NUIiXSwgWyI3NTAzIEMiLCAiI0E4OTk2OCJdLAogICAgWyI0NjkgQyIsICIjNjkzRjIzIl0sIFsiNDYyNSBDIiwgIiM0RjJDMUQiXSwgWyI3NTE2IEMiLCAiIzlBMzMyNCJdCiAgXTsKICBmdW5jdGlvbiBoZXhUb1JnYihoKSB7IGNvbnN0IG4gPSBwYXJzZUludChoLnNsaWNlKDEpLCAxNik7IHJldHVybiBbbiA+PiAxNiAmIDI1NSwgbiA+PiA4ICYgMjU1LCBuICYgMjU1XTsgfQogIGZ1bmN0aW9uIHJnYlRvSGV4KGMpIHsgcmV0dXJuICIjIiArIGMubWFwKHYgPT4gTWF0aC5yb3VuZCh2KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgIjAiKSkuam9pbigiIikudG9VcHBlckNhc2UoKTsgfQogIGZ1bmN0aW9uIHRvTGFiKFtyLCBnLCBiXSkgewogICAgY29uc3QgZiA9IHYgPT4geyB2IC89IDI1NTsgcmV0dXJuIHYgPD0gMC4wNDA0NSA\/IHYgLyAxMi45MiA6IE1hdGgucG93KCh2ICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7IH07CiAgICBjb25zdCBSID0gZihyKSwgR2MgPSBmKGcpLCBCID0gZihiKTsKICAgIGxldCB4ID0gKFIgKiAwLjQxMjQgKyBHYyAqIDAuMzU3NiArIEIgKiAwLjE4MDUpIC8gMC45NTA0NywgeSA9IFIgKiAwLjIxMjYgKyBHYyAqIDAuNzE1MiArIEIgKiAwLjA3MjIsIHogPSAoUiAqIDAuMDE5MyArIEdjICogMC4xMTkyICsgQiAqIDAuOTUwNSkgLyAxLjA4ODgzOwogICAgY29uc3QgdCA9IHYgPT4gdiA+IDAuMDA4ODU2ID8gTWF0aC5jYnJ0KHYpIDogNy43ODcgKiB2ICsgMTYgLyAxMTY7CiAgICB4ID0gdCh4KTsgeSA9IHQoeSk7IHogPSB0KHopOwogICAgcmV0dXJuIFsxMTYgKiB5IC0gMTYsIDUwMCAqICh4IC0geSksIDIwMCAqICh5IC0geildOwogIH0KICBjb25zdCBQQU5UT05FX0xBQiA9IFBBTlRPTkUubWFwKChbbiwgaF0pID0+ICh7IG4sIGgsIGxhYjogdG9MYWIoaGV4VG9SZ2IoaCkpIH0pKTsKICBmdW5jdGlvbiBuZWFyZXN0UGFudG9uZShyZ2IpIHsKICAgIGNvbnN0IEwgPSB0b0xhYihyZ2IpOyBsZXQgYmVzdCA9IG51bGwsIGJkID0gSW5maW5pdHk7CiAgICBmb3IgKGNvbnN0IHAgb2YgUEFOVE9ORV9MQUIpIHsgY29uc3QgZCA9IE1hdGguaHlwb3QoTFswXSAtIHAubGFiWzBdLCBMWzFdIC0gcC5sYWJbMV0sIExbMl0gLSBwLmxhYlsyXSk7IGlmIChkIDwgYmQpIHsgYmQgPSBkOyBiZXN0ID0gcDsgfSB9CiAgICByZXR1cm4geyBuYW1lOiAiUEFOVE9ORSAiICsgYmVzdC5uLCBoZXg6IGJlc3QuaCwgZEU6IGJkIH07CiAgfQoKICAvKiAtLS0tLS0tLS0tIE1hcXVldHRlIChjYW52YXMgcmVjdGFuZ3VsYWlyZSBkZSByw6lmw6lyZW5jZSkgLS0tLS0tLS0tLSAqLwogIGNvbnN0IEFXID0gMjQwMDsKICBsZXQgQUggPSBNYXRoLnJvdW5kKEFXICogdHBsKCkuSCAvIHRwbCgpLlcpOwogIGNvbnN0IG9yaWdpbmFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CiAgY29uc3QgYXJ0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CiAgb3JpZ2luYWwud2lkdGggPSBhcnQud2lkdGggPSBBVzsgb3JpZ2luYWwuaGVpZ2h0ID0gYXJ0LmhlaWdodCA9IEFIOwogIGxldCBzb3VyY2VJbmZvID0geyBuYW1lOiAiQmxhbmsgd2hpdGUgY3VwIiwgcHhXOiBudWxsLCB2ZWN0b3I6IHRydWUsIHJhdGlvOiAoQVcgLyAyKSAvIEFIIH07CiAgbGV0IHVwbG9hZGVkRmlsZSA9IG51bGw7CiAgbGV0IGFuYWx5c2lzID0gbnVsbDsgbGV0IGxpbWl0ID0gMDsgbGV0IHBvc3RlclBhbGV0dGUgPSBudWxsOwoKICAvKiBGb25kIGJsYW5jIHBhciBkw6lmYXV0IGF1IGNoYXJnZW1lbnQgKi8KICBjb25zdCBzYW1wbGVDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICBmdW5jdGlvbiBkcmF3U2FtcGxlKCkgewogICAgY29uc3QgVyA9IHNhbXBsZUNhbnZhcy53aWR0aCA9IEFXLCBIID0gc2FtcGxlQ2FudmFzLmhlaWdodCA9IEFIOwogICAgY29uc3QgYyA9IHNhbXBsZUNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgYy5jbGVhclJlY3QoMCwgMCwgVywgSCk7CiAgICBjLmZpbGxTdHlsZSA9ICIjRkZGRkZGIjsKICAgIGMuZmlsbFJlY3QoMCwgMCwgVywgSCk7CiAgfQoKICAvKiAtLS0tLS0tLS0tIFBvc2VzIDogcsOpcMOpdGl0aW9uIGRlIGxhIG1hcXVldHRlIHN1ciBsZSBnYWJhcml0IC0tLS0tLS0tLS0gKi8KICBsZXQgc3JjSW1nID0gc2FtcGxlQ2FudmFzLCBzcmNXID0gQVcsIHNyY0ggPSBBSDsKICBsZXQgcG9zZXMgPSB7IG54OiAxLCBueTogMSwga2VlcDogdHJ1ZSB9OwogIGZ1bmN0aW9uIGNvbXBvc2UoKSB7CiAgICBjb25zdCBjID0gb3JpZ2luYWwuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGMuZmlsbFN0eWxlID0gIiNGRkZGRkYiOyBjLmZpbGxSZWN0KDAsIDAsIEFXLCBBSCk7CiAgICBjb25zdCBjdyA9IEFXIC8gcG9zZXMubngsIGNoID0gQUggLyBwb3Nlcy5ueTsKICAgIGZvciAobGV0IGogPSAwOyBqIDwgcG9zZXMubnk7IGorKykgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3Nlcy5ueDsgaSsrKSB7CiAgICAgIGlmIChwb3Nlcy5rZWVwKSB7CiAgICAgICAgY29uc3Qgc2MgPSBNYXRoLm1pbihjdyAvIHNyY1csIGNoIC8gc3JjSCksIHcgPSBzcmNXICogc2MsIGggPSBzcmNIICogc2M7CiAgICAgICAgYy5kcmF3SW1hZ2Uoc3JjSW1nLCBpICogY3cgKyAoY3cgLSB3KSAvIDIsIGogKiBjaCArIChjaCAtIGgpIC8gMiwgdywgaCk7CiAgICAgIH0gZWxzZSBjLmRyYXdJbWFnZShzcmNJbWcsIGkgKiBjdywgaiAqIGNoLCBjdywgY2gpOwogICAgfQogIH0KICBmdW5jdGlvbiBjZWxsTW0oKSB7IGNvbnN0IFQgPSB0cGwoKTsgcmV0dXJuIHsgdzogVC5XIC8gcG9zZXMubngsIGg6IFQuSCAvIHBvc2VzLm55IH07IH0KICBmdW5jdGlvbiByZW5kZXJQb3NlSW5mbygpIHsKICAgIGNvbnN0IG0gPSBjZWxsTW0oKTsKICAgICQoInBvc2VJbmZvIikudGV4dENvbnRlbnQgPSBgQ2hhcXVlIHBvc2UgOiAke2ZtdChtLncpfSDDlyAke2ZtdChtLmgpfSBtbSDCtyAke3Bvc2VzLm54ICogcG9zZXMubnl9IHBvc2Uke3Bvc2VzLm54ICogcG9zZXMubnkgPiAxID8gInMiIDogIiJ9IGF1IHRvdGFsYDsKICB9CiAgZnVuY3Rpb24gc2V0UG9zZXMobngsIG55KSB7IHBvc2VzLm54ID0gbng7IHBvc2VzLm55ID0gbnk7ICQoInBvc2VzWCIpLnZhbHVlID0gbng7ICQoInBvc2VzWSIpLnZhbHVlID0gbnk7IH0KCiAgZnVuY3Rpb24gbG9hZEltYWdlVG9PcmlnaW5hbChpbWcsIGluZm8pIHsKICAgIHNyY0ltZyA9IGltZzsgc3JjVyA9IGluZm8ucHhXOyBzcmNIID0gaW5mby5weFcgLyBpbmZvLnJhdGlvOwogICAgc2V0UG9zZXMoMSwgMSk7CiAgICBzb3VyY2VJbmZvID0gaW5mbzsKICAgIGxpbWl0ID0gMDsgc2V0U2VnKDApOwogICAgcmVmcmVzaEFsbCgpOwogIH0KCiAgLyogLS0tLS0tLS0tLSBBbmFseXNlIGRlcyBjb2xvdXJzIChrLW1lYW5zIHN1ciDDqWNoYW50aWxsb24pIC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBhbmFseXplKGNhbnZhcykgewogICAgY29uc3Qgc3cgPSAyNDAsIHNoID0gTWF0aC5yb3VuZChzdyAqIGNhbnZhcy5oZWlnaHQgLyBjYW52YXMud2lkdGgpOwogICAgY29uc3QgdG1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7IHRtcC53aWR0aCA9IHN3OyB0bXAuaGVpZ2h0ID0gc2g7CiAgICBjb25zdCB0ID0gdG1wLmdldENvbnRleHQoIjJkIik7IHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7IHQuZHJhd0ltYWdlKGNhbnZhcywgMCwgMCwgc3csIHNoKTsKICAgIGNvbnN0IGQgPSB0LmdldEltYWdlRGF0YSgwLCAwLCBzdywgc2gpLmRhdGE7CiAgICBjb25zdCBwdHMgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZC5sZW5ndGg7IGkgKz0gNCkgcHRzLnB1c2goZFtpICsgM10gPCAxMjggPyBbMjU1LCAyNTUsIDI1NV0gOiBbZFtpXSwgZFtpICsgMV0sIGRbaSArIDJdXSk7CiAgICBjb25zdCBrID0gMTA7IGxldCBjZW50cyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrOyBpKyspIGNlbnRzLnB1c2gocHRzW01hdGguZmxvb3IoKGkgKyAwLjUpICogcHRzLmxlbmd0aCAvIGspXS5zbGljZSgpKTsKICAgIC8vIGluaXQgcGx1cyByb2J1c3RlIDogbWF4LWRpc3RhbmNlCiAgICBjZW50cyA9IFtwdHNbMF0uc2xpY2UoKV07CiAgICB3aGlsZSAoY2VudHMubGVuZ3RoIDwgaykgewogICAgICBsZXQgYmkgPSAwLCBiZCA9IC0xOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHB0cy5sZW5ndGg7IGkgKz0gNykgeyBsZXQgbSA9IEluZmluaXR5OyBmb3IgKGNvbnN0IGMgb2YgY2VudHMpIHsgY29uc3QgZGQgPSAocHRzW2ldWzBdIC0gY1swXSkgKiogMiArIChwdHNbaV1bMV0gLSBjWzFdKSAqKiAyICsgKHB0c1tpXVsyXSAtIGNbMl0pICoqIDI7IGlmIChkZCA8IG0pIG0gPSBkZDsgfSBpZiAobSA+IGJkKSB7IGJkID0gbTsgYmkgPSBpOyB9IH0KICAgICAgY2VudHMucHVzaChwdHNbYmldLnNsaWNlKCkpOwogICAgfQogICAgbGV0IGFzc2lnbiA9IG5ldyBBcnJheShwdHMubGVuZ3RoKS5maWxsKDApOwogICAgZm9yIChsZXQgaXQgPSAwOyBpdCA8IDEyOyBpdCsrKSB7CiAgICAgIGNvbnN0IHN1bSA9IGNlbnRzLm1hcCgoKSA9PiBbMCwgMCwgMCwgMF0pOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHB0cy5sZW5ndGg7IGkrKykgewogICAgICAgIGxldCBtID0gSW5maW5pdHksIG1pID0gMDsgY29uc3QgcCA9IHB0c1tpXTsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNlbnRzLmxlbmd0aDsgaisrKSB7IGNvbnN0IGMgPSBjZW50c1tqXTsgY29uc3QgZGQgPSAocFswXSAtIGNbMF0pICoqIDIgKyAocFsxXSAtIGNbMV0pICoqIDIgKyAocFsyXSAtIGNbMl0pICoqIDI7IGlmIChkZCA8IG0pIHsgbSA9IGRkOyBtaSA9IGo7IH0gfQogICAgICAgIGFzc2lnbltpXSA9IG1pOyBjb25zdCBzID0gc3VtW21pXTsgc1swXSArPSBwWzBdOyBzWzFdICs9IHBbMV07IHNbMl0gKz0gcFsyXTsgc1szXSsrOwogICAgICB9CiAgICAgIGNlbnRzID0gY2VudHMubWFwKChjLCBqKSA9PiBzdW1bal1bM10gPyBbc3VtW2pdWzBdIC8gc3VtW2pdWzNdLCBzdW1bal1bMV0gLyBzdW1bal1bM10sIHN1bVtqXVsyXSAvIHN1bVtqXVszXV0gOiBjKTsKICAgIH0KICAgIGxldCBjbHVzdGVycyA9IGNlbnRzLm1hcCgoYywgaikgPT4gKHsgcmdiOiBjLCBuOiAwIH0pKTsKICAgIGZvciAoY29uc3QgYSBvZiBhc3NpZ24pIGNsdXN0ZXJzW2FdLm4rKzsKICAgIGNsdXN0ZXJzID0gY2x1c3RlcnMuZmlsdGVyKGMgPT4gYy5uID4gMCk7CiAgICAvLyBmdXNpb24gZGVzIHRlaW50ZXMgcHJvY2hlcyAoYW50aWNyw6luZWxhZ2UsIGTDqWdyYWTDqXMgbMOpZ2VycykKICAgIGNsdXN0ZXJzLnNvcnQoKGEsIGIpID0+IGIubiAtIGEubik7CiAgICBjb25zdCBtZXJnZWQgPSBbXTsKICAgIGZvciAoY29uc3QgYyBvZiBjbHVzdGVycykgewogICAgICBjb25zdCBMID0gdG9MYWIoYy5yZ2IpOwogICAgICBjb25zdCBoaXQgPSBtZXJnZWQuZmluZChtID0+IHsgY29uc3QgTSA9IHRvTGFiKG0ucmdiKTsgcmV0dXJuIE1hdGguaHlwb3QoTFswXSAtIE1bMF0sIExbMV0gLSBNWzFdLCBMWzJdIC0gTVsyXSkgPCAxODsgfSk7CiAgICAgIGlmIChoaXQpIGhpdC5uICs9IGMubjsgZWxzZSBtZXJnZWQucHVzaCh7IHJnYjogYy5yZ2IsIG46IGMubiB9KTsKICAgIH0KICAgIGNvbnN0IHRvdGFsID0gcHRzLmxlbmd0aDsKICAgIGNvbnN0IGlzUGFwZXIgPSByZ2IgPT4gcmdiWzBdID4gMjMyICYmIHJnYlsxXSA+IDIzMiAmJiByZ2JbMl0gPiAyMzI7CiAgICBjb25zdCBhbGwgPSBtZXJnZWQubWFwKGMgPT4gKHsgLi4uYywgc2hhcmU6IGMubiAvIHRvdGFsLCBwYXBlcjogaXNQYXBlcihjLnJnYikgfSkpOwogICAgY29uc3QgaW5rcyA9IGFsbC5maWx0ZXIoYyA9PiAhYy5wYXBlciAmJiBjLnNoYXJlID49IDAuMDEyKS5zb3J0KChhLCBiKSA9PiBiLnNoYXJlIC0gYS5zaGFyZSk7CiAgICBjb25zdCBwYXBlciA9IGFsbC5zb21lKGMgPT4gYy5wYXBlciAmJiBjLnNoYXJlID4gMC4wMSk7CiAgICByZXR1cm4geyBpbmtzLCBwYXBlciB9OwogIH0KCiAgZnVuY3Rpb24gcG9zdGVyaXplKG4pIHsKICAgIGNvbnN0IHNyYyA9IG9yaWdpbmFsLmdldENvbnRleHQoIjJkIikuZ2V0SW1hZ2VEYXRhKDAsIDAsIEFXLCBBSCk7CiAgICBjb25zdCBiYXNlID0gYW5hbHlzaXMwLmlua3Muc2xpY2UoMCwgbikubWFwKGMgPT4gYy5yZ2IpOwogICAgY29uc3QgcGFsID0gYW5hbHlzaXMwLnBhcGVyID8gYmFzZS5jb25jYXQoW1syNTUsIDI1NSwgMjU1XV0pIDogYmFzZTsKICAgIGlmICghcGFsLmxlbmd0aCkgcmV0dXJuOwogICAgY29uc3QgZCA9IHNyYy5kYXRhOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkLmxlbmd0aDsgaSArPSA0KSB7CiAgICAgIGxldCBtID0gSW5maW5pdHksIGJlc3QgPSBwYWxbMF07CiAgICAgIGZvciAoY29uc3QgcCBvZiBwYWwpIHsgY29uc3QgZGQgPSAoZFtpXSAtIHBbMF0pICoqIDIgKyAoZFtpICsgMV0gLSBwWzFdKSAqKiAyICsgKGRbaSArIDJdIC0gcFsyXSkgKiogMjsgaWYgKGRkIDwgbSkgeyBtID0gZGQ7IGJlc3QgPSBwOyB9IH0KICAgICAgZFtpXSA9IGJlc3RbMF07IGRbaSArIDFdID0gYmVzdFsxXTsgZFtpICsgMl0gPSBiZXN0WzJdOyBkW2kgKyAzXSA9IDI1NTsKICAgIH0KICAgIGFydC5nZXRDb250ZXh0KCIyZCIpLnB1dEltYWdlRGF0YShzcmMsIDAsIDApOwogIH0KCiAgbGV0IGFuYWx5c2lzMCA9IG51bGw7CiAgZnVuY3Rpb24gcmVmcmVzaEFsbCgpIHsKICAgIGNvbXBvc2UoKTsgcmVuZGVyUG9zZUluZm8oKTsKICAgIGFuYWx5c2lzMCA9IGFuYWx5emUob3JpZ2luYWwpOwogICAgaWYgKGxpbWl0ID4gMCAmJiBhbmFseXNpczAuaW5rcy5sZW5ndGggPiBsaW1pdCkgeyBwb3N0ZXJpemUobGltaXQpOyBhbmFseXNpcyA9IGFuYWx5emUoYXJ0KTsgfQogICAgZWxzZSB7IGNvbnN0IGMgPSBhcnQuZ2V0Q29udGV4dCgiMmQiKTsgYy5jbGVhclJlY3QoMCwgMCwgQVcsIEFIKTsgYy5kcmF3SW1hZ2Uob3JpZ2luYWwsIDAsIDApOyBhbmFseXNpcyA9IGFuYWx5c2lzMDsgfQogICAgcmVuZGVyQ2hlY2tzKCk7IHJlbmRlcklua3MoKTsgdXBkYXRlVGV4dHVyZSgpOyByZW5kZXJGYW4oZmFuQ2FudmFzLCBudWxsLCB0cnVlKTsKICB9CgogIC8qIC0tLS0tLS0tLS0gVUkgOiDDqXRhcGVzIC0tLS0tLS0tLS0gKi8KICBjb25zdCAkID0gaWQgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOyAgZnVuY3Rpb24gcmVuZGVyU3BlY3MoKSB7CiAgICBjb25zdCBUID0gdHBsKCk7CiAgICAkKCJzcGVjcyIpLmlubmVySFRNTCA9IGA8ZGl2PjxzcGFuPsOYIGhhdXQ8L3NwYW4+PGI+JHtjdXAuRH0gbW08L2I+PC9kaXY+PGRpdj48c3Bhbj7DmCBiYXM8L3NwYW4+PGI+JHtjdXAuZH0gbW08L2I+PC9kaXY+PGRpdj48c3Bhbj5IYXV0ZXVyPC9zcGFuPjxiPiR7Y3VwLmh9IG1tPC9iPjwvZGl2PmA7CiAgICAkKCJyZWN0RGltcyIpLmlubmVySFRNTCA9IGAKICAgICAgPGRpdj48Yj4ke2ZtdChULlcpfSDDlyAke2ZtdChULkgpfSBtbTwvYj48c3Bhbj5ab25lIHV0aWxlPC9zcGFuPjwvZGl2PgogICAgICA8ZGl2PjxiPiR7Zm10KFQuVyArIDIgKiBjdXAuYmxlZWQpfSDDlyAke2ZtdChULkggKyAyICogY3VwLmJsZWVkKX0gbW08L2I+PHNwYW4+QXZlYyBmb25kIHBlcmR1ICR7Y3VwLmJsZWVkfSBtbTwvc3Bhbj48L2Rpdj4KICAgICAgPGRpdj48Yj4ke01hdGgucm91bmQoVC5XIC8gMjUuNCAqIDMwMCl9IMOXICR7TWF0aC5yb3VuZChULkggLyAyNS40ICogMzAwKX0gcHg8L2I+PHNwYW4+SW1hZ2Ugw6AgMzAwIGRwaTwvc3Bhbj48L2Rpdj5gOwogICAgJCgid2FycEhpbnQiKS50ZXh0Q29udGVudCA9IHdhcnBNb2RlID09PSAic3RhbmRhcmQiCiAgICAgID8gYExhIG1hcXVldHRlIGNvdXZyZSB0b3V0ZSBsYSBoYXV0ZXVyIGR1IGdvYmVsZXQuIFZlcnMgbGUgYmFzLCBsZXMgw6lsw6ltZW50cyBzZSByZXNzZXJyZW50IGFjcm9zcyAoanVzcXUnw6AgJHtmbXQoRy5SaSAvIEcuUm8gKiAxMDAsIDApfSAlKSA6IHVuIGNlcmNsZSBkZXZpZW50IG92YWxlLmAKICAgICAgOiBgVW4gY2VyY2xlIHJlc3RlIHVuIGNlcmNsZS4gTGVzIMOpbMOpbWVudHMgZ2FyZGVudCBsZXVyIGZvcm1lIG1haXMgY2hhbmdlbnQgZGUgdGFpbGxlIDogJHtmbXQoRy5SbyAvIFQucm0gKiAxMDAsIDApfSAlIGVuIGhhdXQsIDEwMCAlIMOgIG1pLWhhdXRldXIsICR7Zm10KEcuUmkgLyBULnJtICogMTAwLCAwKX0gJSBlbiBiYXMuYDsKICAgICQoImZhbkRpbXMiKS5pbm5lckhUTUwgPSBgCiAgICAgIDxkaXY+PGI+JHtmbXQoRy5Sbyl9IG1tPC9iPjxzcGFuPk91dGVyIHJhZGl1czwvc3Bhbj48L2Rpdj4KICAgICAgPGRpdj48Yj4ke2ZtdChHLlJpKX0gbW08L2I+PHNwYW4+SW5uZXIgcmFkaXVzPC9zcGFuPjwvZGl2PgogICAgICA8ZGl2PjxiPiR7Zm10KEcudGggKiAxODAgLyBNYXRoLlBJLCAyKX3CsDwvYj48c3Bhbj5PcGVuaW5nIGFuZ2xlPC9zcGFuPjwvZGl2PgogICAgICA8ZGl2PjxiPiR7Zm10KEcucyl9IG1tPC9iPjxzcGFuPkRldmVsb3BlZCBoZWlnaHQ8L3NwYW4+PC9kaXY+CiAgICAgIDxkaXY+PGI+JHtjdXAuZ2x1ZX0gbW08L2I+PHNwYW4+R2x1ZSBvdmVybGFwPC9zcGFuPjwvZGl2PmA7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJDaGVja3MoKSB7CiAgICBjb25zdCBvdXQgPSBbXTsKICAgIGNvbnN0IGNtID0gY2VsbE1tKCk7CiAgICBjb25zdCByID0gc291cmNlSW5mby5yYXRpbywgdGFyZ2V0ID0gY20udyAvIGNtLmgsIGRldiA9IE1hdGguYWJzKHIgLyB0YXJnZXQgLSAxKTsKICAgIGlmIChkZXYgPiAwLjAzKSBvdXQucHVzaChbIndhcm4iLCBwb3Nlcy5rZWVwCiAgICAgID8gYFByb3BvcnRpb25zICR7Zm10KHIsIDIpfToxIGF1IGxpZXUgZGUgJHtmbXQodGFyZ2V0LCAyKX06MSBwYXIgcG9zZS4gRGVzIG1hcmdlcyBibGFuY2hlcyBjb21wbMOodGVudCBjaGFxdWUgcG9zZS5gCiAgICAgIDogYFByb3BvcnRpb25zICR7Zm10KHIsIDIpfToxIGF1IGxpZXUgZGUgJHtmbXQodGFyZ2V0LCAyKX06MSBwYXIgcG9zZS4gTGEgbWFxdWV0dGUgZXN0IHN0cmV0Y2hlZC5gXSk7CiAgICBlbHNlIG91dC5wdXNoKFsib2siLCAiUHJvcG9ydGlvbnMgY29uZm9ybWVzIMOgIGxhIHBvc2UuIl0pOwogICAgaWYgKHNvdXJjZUluZm8udmVjdG9yKSBvdXQucHVzaChbIm9rIiwgIkZpY2hpZXIgdmVjdG9yIG91IGV4ZW1wbGUgOiByw6lzb2x1dGlvbiBub24gbGltaXRhbnRlLiJdKTsKICAgIGVsc2UgewogICAgICBjb25zdCBkcGkgPSBNYXRoLnJvdW5kKHNvdXJjZUluZm8ucHhXIC8gKGNtLncgLyAyNS40KSk7CiAgICAgIG91dC5wdXNoKGRwaSA+PSAzMDAgPyBbIm9rIiwgYFLDqXNvbHV0aW9uICR7ZHBpfSBkcGkgw6AgdGFpbGxlIHLDqWVsbGUuYF0gOiBbIndhcm4iLCBgUsOpc29sdXRpb24gJHtkcGl9IGRwaSDDoCB0YWlsbGUgcsOpZWxsZS4gMzAwIGRwaSByZWNvbW1hbmTDqXMuYF0pOwogICAgfQogICAgY29uc3QgbiA9IGFuYWx5c2lzLmlua3MubGVuZ3RoOwogICAgb3V0LnB1c2gobiA8PSA0ID8gWyJvayIsIGAke259IGNvbG91ciR7biA+IDEgPyAicyIgOiAiIn0gZCdlbmNyZSBkw6l0ZWN0w6llJHtuID4gMSA\/ICJzIiA6ICIifS5gXSA6IFsid2FybiIsIGAke259IGNvbG91cnMgZMOpdGVjdMOpZXMgOiBtYXhpbXVtIDQuIFV0aWxpc2V6IMKrIExpbWl0IHRvIMK7IG91IGxlIHByw6lwcmVzc2Ugc2ltcGxpZmllcmEuYF0pOwogICAgJCgiY2hlY2tzIikuaW5uZXJIVE1MID0gb3V0Lm1hcCgoW2ssIHRdKSA9PiBgPGRpdiBjbGFzcz0ibm90ZSAke2t9Ij4ke3R9PC9kaXY+YCkuam9pbigiIik7CiAgfQoKICBjb25zdCBwYW50b25lT3ZlcnJpZGVzID0ge307CiAgZnVuY3Rpb24gcmVuZGVySW5rcygpIHsKICAgIGNvbnN0IG4gPSBhbmFseXNpcy5pbmtzLmxlbmd0aDsKICAgICQoImlua0NvdW50IikuaW5uZXJIVE1MID0gYCR7bn0gPHNtYWxsPmNvbG91ciR7biA+IDEgPyAicyIgOiAiIn08L3NtYWxsPmA7CiAgICBjb25zdCBwaWxsID0gJCgiaW5rUGlsbCIpOwogICAgcGlsbC5jbGFzc05hbWUgPSAicGlsbCAiICsgKG4gPD0gNCA\/ICJvayIgOiAid2FybiIpOwogICAgcGlsbC50ZXh0Q29udGVudCA9IG4gPD0gNCA\/IChuIDw9IDIgPyAiRWNvbm9taWNhbCIgOiAiV2l0aGluIGxpbWl0IikgOiAiVG9vIG1hbnkgY29sb3VycyI7CiAgICAkKCJpbmtzIikuaW5uZXJIVE1MID0gYW5hbHlzaXMuaW5rcy5zbGljZSgwLCA4KS5tYXAoKGMsIGkpID0+IHsKICAgICAgY29uc3QgaGV4ID0gcmdiVG9IZXgoYy5yZ2IpLCBwID0gbmVhcmVzdFBhbnRvbmUoYy5yZ2IpOwogICAgICBjb25zdCB2YWwgPSBwYW50b25lT3ZlcnJpZGVzW2ldID8\/IHAubmFtZTsKICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPSJpbmsiPgogICAgICAgIDxkaXYgY2xhc3M9InN3IiBzdHlsZT0iYmFja2dyb3VuZDoke2hleH0iPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im1ldGEiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibDEiPjxzcGFuPiR7aGV4fSDCtyAke2ZtdChjLnNoYXJlICogMTAwLCAwKX0gJTwvc3Bhbj48c3BhbiB0aXRsZT0iU3VnZ2VzdGVkIFBhbnRvbmUgc3dhdGNoIiBzdHlsZT0iZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjVweCI+PGkgc3R5bGU9IndpZHRoOjExcHg7aGVpZ2h0OjExcHg7Ym9yZGVyLXJhZGl1czozcHg7YmFja2dyb3VuZDoke3AuaGV4fTtkaXNwbGF5OmlubGluZS1ibG9jayI+PC9pPs6URSAke2ZtdChwLmRFLCAwKX08L3NwYW4+PC9kaXY+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InBtcy0ke2l9IiBkYXRhLWk9IiR7aX0iIHZhbHVlPSIke3ZhbH0iIGFyaWEtbGFiZWw9IlBhbnRvbmUgY29sb3VyIHJlZmVyZW5jZSAke2kgKyAxfSI+CiAgICAgICAgPC9kaXY+PC9kaXY+YDsKICAgIH0pLmpvaW4oIiIpOwogICAgJCgiaW5rcyIpLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0IikuZm9yRWFjaChpbnAgPT4gaW5wLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgZSA9PiB7IHBhbnRvbmVPdmVycmlkZXNbZS50YXJnZXQuZGF0YXNldC5pXSA9IGUudGFyZ2V0LnZhbHVlOyB9KSk7CiAgfQoKICBmdW5jdGlvbiBzZXRTZWcobikgeyAkKCJsaW1pdFNlZyIpLnF1ZXJ5U2VsZWN0b3JBbGwoImJ1dHRvbiIpLmZvckVhY2goYiA9PiBiLnNldEF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIiwgU3RyaW5nKCtiLmRhdGFzZXQubiA9PT0gbikpKTsgfQogICQoImxpbWl0U2VnIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBlID0+IHsKICAgIGNvbnN0IGIgPSBlLnRhcmdldC5jbG9zZXN0KCJidXR0b24iKTsgaWYgKCFiKSByZXR1cm47CiAgICBsaW1pdCA9ICtiLmRhdGFzZXQubjsgc2V0U2VnKGxpbWl0KTsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5zdHVkaW8iKS5jbGFzc0xpc3QuYWRkKCJidXN5Iik7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsgcmVmcmVzaEFsbCgpOyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuc3R1ZGlvIikuY2xhc3NMaXN0LnJlbW92ZSgiYnVzeSIpOyB9LCAyMCk7CiAgfSk7CgogIGZ1bmN0aW9uIG9uUG9zZXNDaGFuZ2UoKSB7CiAgICBwb3Nlcy5ueCA9ICskKCJwb3Nlc1giKS52YWx1ZTsgcG9zZXMubnkgPSArJCgicG9zZXNZIikudmFsdWU7IHBvc2VzLmtlZXAgPSAkKCJwb3Nlc0tlZXAiKS5jaGVja2VkOwogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnN0dWRpbyIpLmNsYXNzTGlzdC5hZGQoImJ1c3kiKTsKICAgIHNldFRpbWVvdXQoKCkgPT4geyByZWZyZXNoQWxsKCk7IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5zdHVkaW8iKS5jbGFzc0xpc3QucmVtb3ZlKCJidXN5Iik7IH0sIDIwKTsKICB9CiAgWyJwb3Nlc1giLCAicG9zZXNZIiwgInBvc2VzS2VlcCJdLmZvckVhY2goaWQgPT4gJChpZCkuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgb25Qb3Nlc0NoYW5nZSkpOwoKICAkKCJ3YXJwU2VnIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBlID0+IHsKICAgIGNvbnN0IGIgPSBlLnRhcmdldC5jbG9zZXN0KCJbZGF0YS13XSIpOyBpZiAoIWIgfHwgYi5kYXRhc2V0LncgPT09IHdhcnBNb2RlKSByZXR1cm47CiAgICB3YXJwTW9kZSA9IGIuZGF0YXNldC53OwogICAgJCgid2FycFNlZyIpLnF1ZXJ5U2VsZWN0b3JBbGwoImJ1dHRvbiIpLmZvckVhY2goeCA9PiB4LnNldEF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIiwgU3RyaW5nKHggPT09IGIpKSk7CiAgICBBSCA9IE1hdGgucm91bmQoQVcgKiB0cGwoKS5IIC8gdHBsKCkuVyk7CiAgICBvcmlnaW5hbC53aWR0aCA9IGFydC53aWR0aCA9IEFXOyBvcmlnaW5hbC5oZWlnaHQgPSBhcnQuaGVpZ2h0ID0gQUg7CiAgICBpZiAoc3JjSW1nID09PSBzYW1wbGVDYW52YXMpIHsgZHJhd1NhbXBsZSgpOyBzcmNXID0gc2FtcGxlQ2FudmFzLndpZHRoOyBzcmNIID0gc2FtcGxlQ2FudmFzLmhlaWdodDsgc291cmNlSW5mby5yYXRpbyA9IHNyY1cgLyBzcmNIOyB9CiAgICB0ZXh0dXJlLmRpc3Bvc2UoKTsgcmVuZGVyU3BlY3MoKTsgYnVpbGRDdXAoKTsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5zdHVkaW8iKS5jbGFzc0xpc3QuYWRkKCJidXN5Iik7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsgcmVmcmVzaEFsbCgpOyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuc3R1ZGlvIikuY2xhc3NMaXN0LnJlbW92ZSgiYnVzeSIpOyB9LCAyMCk7CiAgfSk7CgogIC8qIC0tLS0tLS0tLS0gRMOpcMO0dCBkZSBmaWNoaWVyIC0tLS0tLS0tLS0gKi8KICBjb25zdCBkcm9wID0gJCgiZHJvcCIpLCBmaWxlSW5wdXQgPSAkKCJmaWxlIik7CiAgZHJvcC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICBpZiAoZS5rZXkgPT09ICJFbnRlciIgfHwgZS5rZXkgPT09ICIgIikgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGZpbGVJbnB1dC5jbGljaygpOwogICAgfQogIH0pOwogIFsiZHJhZ2VudGVyIiwgImRyYWdvdmVyIl0uZm9yRWFjaChldiA9PiBkcm9wLmFkZEV2ZW50TGlzdGVuZXIoZXYsIGUgPT4gewogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgZHJvcC5jbGFzc0xpc3QuYWRkKCJvdmVyIik7CiAgfSkpOwogIFsiZHJhZ2xlYXZlIiwgImRyb3AiXS5mb3JFYWNoKGV2ID0+IGRyb3AuYWRkRXZlbnRMaXN0ZW5lcihldiwgZSA9PiB7CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICBkcm9wLmNsYXNzTGlzdC5yZW1vdmUoIm92ZXIiKTsKICB9KSk7CiAgZHJvcC5hZGRFdmVudExpc3RlbmVyKCJkcm9wIiwgZSA9PiB7CiAgICBjb25zdCBmID0gZS5kYXRhVHJhbnNmZXIgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXMgPyBlLmRhdGFUcmFuc2Zlci5maWxlc1swXSA6IG51bGw7CiAgICBpZiAoIWYpIHJldHVybjsKICAgICQoImZpbGVtZXRhIikudGV4dENvbnRlbnQgPSAiRmlsZSByZWNlaXZlZDogIiArIGYubmFtZSArICIgwrcgcmVhZGluZ+KApiI7CiAgICBoYW5kbGVGaWxlKGYpOwogIH0pOwogIGZpbGVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBlID0+IHsKICAgIGNvbnN0IGYgPSBlLnRhcmdldC5maWxlcyAmJiBlLnRhcmdldC5maWxlc1swXSA\/IGUudGFyZ2V0LmZpbGVzWzBdIDogbnVsbDsKICAgIGlmICghZikgewogICAgICAkKCJmaWxlbWV0YSIpLnRleHRDb250ZW50ID0gIk5vIGZpbGUgc2VsZWN0ZWQuIjsKICAgICAgcmV0dXJuOwogICAgfQogICAgJCgiZmlsZW1ldGEiKS50ZXh0Q29udGVudCA9ICJGaWxlIHJlY2VpdmVkOiAiICsgZi5uYW1lICsgIiDCtyByZWFkaW5n4oCmIjsKICAgIGhhbmRsZUZpbGUoZik7CiAgfSk7CgogIGZ1bmN0aW9uIGhhbmRsZUZpbGUoZikgewogICAgY29uc3QgbmFtZSA9IFN0cmluZyhmLm5hbWUgfHwgIiIpLnRvTG93ZXJDYXNlKCk7CiAgICBjb25zdCBpc1N2ZyA9IGYudHlwZSA9PT0gImltYWdlL3N2Zyt4bWwiIHx8IG5hbWUuZW5kc1dpdGgoIi5zdmciKTsKICAgIGNvbnN0IGFsbG93ZWRUeXBlcyA9IFsiaW1hZ2UvcG5nIiwgImltYWdlL2pwZWciLCAiaW1hZ2Uvc3ZnK3htbCJdOwoKICAgIGlmIChhbGxvd2VkVHlwZXMuaW5kZXhPZihmLnR5cGUpID09PSAtMSAmJiAhaXNTdmcpIHsKICAgICAgJCgiZmlsZW1ldGEiKS50ZXh0Q29udGVudCA9IGDCqyAke2YubmFtZX0gwrsgaXMgbm90IHN1cHBvcnRlZC4gVXBsb2FkIGEgUE5HLCBKUEcgb3IgU1ZHLmA7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB1cGxvYWRlZEZpbGUgPSBmOwoKICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICByZWFkZXIub25lcnJvciA9ICgpID0+IHsKICAgICAgJCgiZmlsZW1ldGEiKS50ZXh0Q29udGVudCA9IGBVbmFibGUgdG8gcmVhZCDCqyAke2YubmFtZX0gwrsgZnJvbSB5b3VyIGRldmljZS5gOwogICAgfTsKCiAgICByZWFkZXIub25sb2FkID0gKCkgPT4gewogICAgICAkKCJmaWxlbWV0YSIpLnRleHRDb250ZW50ID0gYEZpbGUgcmVhZDogJHtmLm5hbWV9IMK3IHByZXBhcmluZyAzRCBwcmV2aWV34oCmYDsKCiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpOwoKICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiB7CiAgICAgICAgJCgiZmlsZW1ldGEiKS50ZXh0Q29udGVudCA9IGBVbmFibGUgdG8gZGlzcGxheSDCqyAke2YubmFtZX0gwrsuIFRyeSBhbm90aGVyIFBORywgSlBHIG9yIFNWRy5gOwogICAgICB9OwoKICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHsKICAgICAgICBjb25zdCB3ID0gaW1nLm5hdHVyYWxXaWR0aCB8fCAyNDAwOwogICAgICAgIGNvbnN0IGggPSBpbWcubmF0dXJhbEhlaWdodCB8fCA5NDA7CgogICAgICAgIE9iamVjdC5rZXlzKHBhbnRvbmVPdmVycmlkZXMpLmZvckVhY2goayA9PiBkZWxldGUgcGFudG9uZU92ZXJyaWRlc1trXSk7CgogICAgICAgIHRyeSB7CiAgICAgICAgICBsb2FkSW1hZ2VUb09yaWdpbmFsKGltZywgewogICAgICAgICAgICBuYW1lOiBmLm5hbWUsCiAgICAgICAgICAgIHB4VzogdywKICAgICAgICAgICAgdmVjdG9yOiBpc1N2ZywKICAgICAgICAgICAgcmF0aW86IHcgLyBoCiAgICAgICAgICB9KTsKCiAgICAgICAgICAkKCJmaWxlbWV0YSIpLnRleHRDb250ZW50ID0KICAgICAgICAgICAgYDNEIHByZXZpZXcgdXBkYXRlZCA6ICR7Zi5uYW1lfSDCtyAke2lzU3ZnID8gInZlY3RvciIgOiB3ICsgIiDDlyAiICsgaCArICIgcHgifSDCtyAke2ZtdChmLnNpemUgLyAxMDI0LCAwKX0gS29gOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgY29uc29sZS5lcnJvcigiQVNXQUwgY29uZmlndXJhdGV1ciDigJQgZXJyZXVyIHRyYWl0ZW1lbnQgZmljaGllciIsIGVycik7CiAgICAgICAgICAkKCJmaWxlbWV0YSIpLnRleHRDb250ZW50ID0KICAgICAgICAgICAgYFRoZSBmaWxlICR7Zi5uYW1lfSBsb2FkZWQsIGJ1dCB0aGUgM0QgcHJldmlldyBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkLiBUcnkgYSBQTkcgb3IgSlBHLmA7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgaW1nLnNyYyA9IHJlYWRlci5yZXN1bHQ7CiAgICB9OwoKICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGYpOwogIH0KICAvKiAtLS0tLS0tLS0tIFNjw6huZSAzRCAtLS0tLS0tLS0tICovCiAgY29uc3Qgdmlld2VyID0gJCgidmlld2VyIik7CiAgY29uc3QgcmVuZGVyZXIgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7IGFudGlhbGlhczogdHJ1ZSwgYWxwaGE6IHRydWUsIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdHJ1ZSB9KTsKICByZW5kZXJlci5zZXRQaXhlbFJhdGlvKE1hdGgubWluKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLCAyKSk7CiAgcmVuZGVyZXIub3V0cHV0RW5jb2RpbmcgPSBUSFJFRS5zUkdCRW5jb2Rpbmc7CiAgcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgPSB0cnVlOyByZW5kZXJlci5zaGFkb3dNYXAudHlwZSA9IFRIUkVFLlBDRlNvZnRTaGFkb3dNYXA7CiAgdmlld2VyLnByZXBlbmQocmVuZGVyZXIuZG9tRWxlbWVudCk7CiAgY29uc3Qgc2NlbmUgPSBuZXcgVEhSRUUuU2NlbmUoKTsKICBjb25zdCBjYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoMzIsIDEsIDEsIDIwMDApOwogIGNhbWVyYS5wb3NpdGlvbi5zZXQoMCwgNzAsIDMzMCk7CiAgY29uc3QgY29udHJvbHMgPSBuZXcgVEhSRUUuT3JiaXRDb250cm9scyhjYW1lcmEsIHJlbmRlcmVyLmRvbUVsZW1lbnQpOwogIGNvbnRyb2xzLnRhcmdldC5zZXQoMCwgMCwgMCk7IGNvbnRyb2xzLmVuYWJsZURhbXBpbmcgPSB0cnVlOyBjb250cm9scy5kYW1waW5nRmFjdG9yID0gMC4wODsKICBjb250cm9scy5taW5EaXN0YW5jZSA9IDE2MDsgY29udHJvbHMubWF4RGlzdGFuY2UgPSA2MDA7IGNvbnRyb2xzLmVuYWJsZVBhbiA9IGZhbHNlOwogIGNvbnRyb2xzLmF1dG9Sb3RhdGUgPSB0cnVlOyBjb250cm9scy5hdXRvUm90YXRlU3BlZWQgPSAxLjY7CgogIGNvbnN0IG1vYmlsZTNkUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgiKG1heC13aWR0aDogOTAwcHgpIik7CiAgY29uc3Qgdmlld2VyUGFuZWwgPSAkKCJ2aWV3ZXJQYW5lbCIpOwogIGNvbnN0IHVwbG9hZFN0ZXAgPSAkKCJ1cGxvYWRTdGVwIik7CiAgY29uc3Qgc3R1ZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnN0dWRpbyIpOwogIGNvbnN0IHZpZXdlckFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIkFTV0FMIHZpZXdlciBkZXNrdG9wIHBvc2l0aW9uIik7CgogIGlmIChzdHVkaW8gJiYgdmlld2VyUGFuZWwpIHsKICAgIHN0dWRpby5pbnNlcnRCZWZvcmUodmlld2VyQW5jaG9yLCB2aWV3ZXJQYW5lbCk7CiAgfQoKICBjb250cm9scy5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsICgpID0+IHsKICAgIGlmICghbW9iaWxlM2RRdWVyeS5tYXRjaGVzKSBzZXRTcGluKGZhbHNlKTsKICB9KTsKCiAgZnVuY3Rpb24gcGxhY2VWaWV3ZXIoKSB7CiAgICBjb25zdCBtb2JpbGUgPSBtb2JpbGUzZFF1ZXJ5Lm1hdGNoZXM7CiAgICBjb25zdCBoaW50ID0gJCgidmlld2VySGludCIpOwoKICAgIGNvbnRyb2xzLmVuYWJsZWQgPSB0cnVlOwogICAgY29udHJvbHMuZW5hYmxlUm90YXRlID0gdHJ1ZTsKICAgIGNvbnRyb2xzLmVuYWJsZVpvb20gPSB0cnVlOwogICAgY29udHJvbHMuYXV0b1JvdGF0ZSA9IHRydWU7CiAgICByZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLnRvdWNoQWN0aW9uID0gIm5vbmUiOwoKICAgIGlmIChtb2JpbGUpIHsKICAgICAgaWYgKHVwbG9hZFN0ZXAgJiYgdmlld2VyUGFuZWwgJiYgdmlld2VyUGFuZWwucHJldmlvdXNFbGVtZW50U2libGluZyAhPT0gdXBsb2FkU3RlcCkgewogICAgICAgIHVwbG9hZFN0ZXAuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJhZnRlcmVuZCIsIHZpZXdlclBhbmVsKTsKICAgICAgfQogICAgICBpZiAoaGludCkgewogICAgICAgIGhpbnQudGV4dENvbnRlbnQgPSAiRHJhZyB0aGUgY3VwIHRvIHJvdGF0ZSDCtyB1c2UgdGhlIHNpZGVzIHRvIHNjcm9sbCI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmICh2aWV3ZXJBbmNob3IucGFyZW50Tm9kZSAmJiB2aWV3ZXJQYW5lbCkgewogICAgICAgIHZpZXdlckFuY2hvci5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh2aWV3ZXJQYW5lbCwgdmlld2VyQW5jaG9yLm5leHRTaWJsaW5nKTsKICAgICAgfQogICAgICBpZiAoaGludCkgewogICAgICAgIGhpbnQudGV4dENvbnRlbnQgPSAiRHJhZyB0byByb3RhdGUgwrcgc2Nyb2xsIHRvIHpvb20iOwogICAgICB9CiAgICB9CgogICAgc2V0VGltZW91dChyZXNpemUsIDApOwogIH0KCiAgaWYgKHR5cGVvZiBtb2JpbGUzZFF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgIG1vYmlsZTNkUXVlcnkuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgcGxhY2VWaWV3ZXIpOwogIH0KCiAgcGxhY2VWaWV3ZXIoKTsKCiAgc2NlbmUuYWRkKG5ldyBUSFJFRS5IZW1pc3BoZXJlTGlnaHQoMHhmZmZmZmYsIDB4OGE5NmEwLCAwLjc1KSk7CiAgY29uc3Qga2V5ID0gbmV3IFRIUkVFLkRpcmVjdGlvbmFsTGlnaHQoMHhmZmZmZmYsIDAuNzUpOyBrZXkucG9zaXRpb24uc2V0KDEyMCwgMjIwLCAxNjApOyBrZXkuY2FzdFNoYWRvdyA9IHRydWU7CiAga2V5LnNoYWRvdy5tYXBTaXplLnNldCgxMDI0LCAxMDI0KTsgT2JqZWN0LmFzc2lnbihrZXkuc2hhZG93LmNhbWVyYSwgeyBsZWZ0OiAtMTIwLCByaWdodDogMTIwLCB0b3A6IDEyMCwgYm90dG9tOiAtMTIwIH0pOwogIHNjZW5lLmFkZChrZXkpOwogIGNvbnN0IHJpbUwgPSBuZXcgVEhSRUUuRGlyZWN0aW9uYWxMaWdodCgweGZmZmZmZiwgMC4yNSk7IHJpbUwucG9zaXRpb24uc2V0KC0xNjAsIDYwLCAtMTIwKTsgc2NlbmUuYWRkKHJpbUwpOwoKICBjb25zdCB0ZXh0dXJlID0gbmV3IFRIUkVFLkNhbnZhc1RleHR1cmUoYXJ0KTsKICB0ZXh0dXJlLmVuY29kaW5nID0gVEhSRUUuc1JHQkVuY29kaW5nOyB0ZXh0dXJlLmFuaXNvdHJvcHkgPSByZW5kZXJlci5jYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpOwogIHRleHR1cmUud3JhcFMgPSBUSFJFRS5SZXBlYXRXcmFwcGluZzsgdGV4dHVyZS5vZmZzZXQueCA9IDAuMjU7IC8vIGNlbnRyZSBkZSBsYSBtYXF1ZXR0ZSBmYWNlIMOgIGxhIGNhbcOpcmEKCiAgLy8gUGFyb2kgZHUgZ29iZWxldCA6IFVWIHJlY2FsY3Vsw6llcyBwb3VyIHN1aXZyZSBleGFjdGVtZW50IGxhIG3Dqm1lIGTDqWZvcm1hdGlvbiBxdWUgbCfDqXZlbnRhaWwgZCdpbXByZXNzaW9uCiAgZnVuY3Rpb24gY3VwV2FsbEdlbyhyVCwgckIsIEgsIHJhZGlhbCkgewogICAgY29uc3QgZyA9IG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KHJULCByQiwgSCwgcmFkaWFsLCA0OCwgdHJ1ZSksIHV2ID0gZy5hdHRyaWJ1dGVzLnV2LCBwb3MgPSBnLmF0dHJpYnV0ZXMucG9zaXRpb247CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHV2LmNvdW50OyBpKyspIHsKICAgICAgY29uc3QgdCA9IChIIC8gMiAtIHBvcy5nZXRZKGkpKSAvIEg7ICAgICAgICAgIC8vIDAgPSBib3JkLCAxID0gZm9uZAogICAgICBjb25zdCByID0gRy5SbyAtIHQgKiBHLnM7ICAgICAgICAgICAgICAgICAgICAgICAvLyByYXlvbiBjb3JyZXNwb25kYW50IGRhbnMgbCfDqXZlbnRhaWwKICAgICAgdXYuc2V0WShpLCAxIC0gdk9mUmFkaXVzKHIpKTsKICAgIH0KICAgIHV2Lm5lZWRzVXBkYXRlID0gdHJ1ZTsgcmV0dXJuIGc7CiAgfQogIGNvbnN0IGN1cEdyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7IHNjZW5lLmFkZChjdXBHcm91cCk7CiAgbGV0IHdhbGwsIGlubmVyLCByaW0sIGJvdHRvbTsKICBmdW5jdGlvbiBidWlsZEN1cCgpIHsKICAgIGN1cEdyb3VwLmNsZWFyKCk7CiAgICBjb25zdCBIID0gY3VwLmgsIHJUID0gY3VwLkQgLyAyLCByQiA9IGN1cC5kIC8gMjsKICAgIGNvbnN0IGdlbyA9IGN1cFdhbGxHZW8oclQsIHJCLCBILCAxNjApOwogICAgd2FsbCA9IG5ldyBUSFJFRS5NZXNoKGdlbywgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbWFwOiB0ZXh0dXJlLCByb3VnaG5lc3M6IDAuNjIsIG1ldGFsbmVzczogMCwgc2lkZTogVEhSRUUuRnJvbnRTaWRlIH0pKTsKICAgIHdhbGwuY2FzdFNoYWRvdyA9IHRydWU7IGN1cEdyb3VwLmFkZCh3YWxsKTsKICAgIGlubmVyID0gbmV3IFRIUkVFLk1lc2goZ2VvLCBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBjb2xvcjogMHhmNGYyZWUsIHJvdWdobmVzczogMC44LCBzaWRlOiBUSFJFRS5CYWNrU2lkZSB9KSk7CiAgICBjdXBHcm91cC5hZGQoaW5uZXIpOwogICAgcmltID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLlRvcnVzR2VvbWV0cnkoclQgKyAwLjQsIDEuNSwgMTYsIDE2MCksIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IGNvbG9yOiAweGY3ZjZmMywgcm91Z2huZXNzOiAwLjU1IH0pKTsKICAgIHJpbS5yb3RhdGlvbi54ID0gTWF0aC5QSSAvIDI7IHJpbS5wb3NpdGlvbi55ID0gSCAvIDI7IGN1cEdyb3VwLmFkZChyaW0pOwogICAgY29uc3QgYkluc2V0ID0gNjsKICAgIGNvbnN0IHJBdEluc2V0ID0gckIgKyAoclQgLSByQikgKiAoYkluc2V0IC8gSCk7CiAgICBib3R0b20gPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ2lyY2xlR2VvbWV0cnkockF0SW5zZXQsIDk2KSwgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgY29sb3I6IDB4ZWJlOGUyLCByb3VnaG5lc3M6IDAuODUsIHNpZGU6IFRIUkVFLkRvdWJsZVNpZGUgfSkpOwogICAgYm90dG9tLnJvdGF0aW9uLnggPSAtTWF0aC5QSSAvIDI7IGJvdHRvbS5wb3NpdGlvbi55ID0gLUggLyAyICsgYkluc2V0OyBjdXBHcm91cC5hZGQoYm90dG9tKTsKICAgIGNvbnN0IGdyb3VuZCA9IG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5QbGFuZUdlb21ldHJ5KDYwMCwgNjAwKSwgbmV3IFRIUkVFLlNoYWRvd01hdGVyaWFsKHsgb3BhY2l0eTogMC4xNiB9KSk7CiAgICBncm91bmQucm90YXRpb24ueCA9IC1NYXRoLlBJIC8gMjsgZ3JvdW5kLnBvc2l0aW9uLnkgPSAtSCAvIDIgLSAwLjU7IGdyb3VuZC5yZWNlaXZlU2hhZG93ID0gdHJ1ZTsgY3VwR3JvdXAuYWRkKGdyb3VuZCk7CiAgICBjdXBHcm91cC5wb3NpdGlvbi55ID0gNDsKICB9CiAgYnVpbGRDdXAoKTsKICBmdW5jdGlvbiB1cGRhdGVUZXh0dXJlKCkgeyB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsgfQoKICBmdW5jdGlvbiByZXNpemUoKSB7CiAgICBjb25zdCB3ID0gdmlld2VyLmNsaWVudFdpZHRoLCBoID0gdmlld2VyLmNsaWVudEhlaWdodDsKICAgIHJlbmRlcmVyLnNldFNpemUodywgaCwgZmFsc2UpOyBjYW1lcmEuYXNwZWN0ID0gdyAvIGg7CiAgICBjYW1lcmEucG9zaXRpb24uc2V0TGVuZ3RoKHcgPCA1MjAgPyAzOTAgOiAzMzApOyAgICBjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwogIH0KICBuZXcgUmVzaXplT2JzZXJ2ZXIocmVzaXplKS5vYnNlcnZlKHZpZXdlcik7IHJlc2l6ZSgpOwogIChmdW5jdGlvbiBsb29wKCkgeyBjb250cm9scy51cGRhdGUoKTsgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEpOyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7IH0pKCk7CgogIGZ1bmN0aW9uIHNldFNwaW4ob24pIHsgY29udHJvbHMuYXV0b1JvdGF0ZSA9IG9uOyBjb25zdCBiID0gJCgic3BpbiIpOyBiLnNldEF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIiwgU3RyaW5nKG9uKSk7IGIudGV4dENvbnRlbnQgPSBvbiA\/ICJQYXVzZSByb3RhdGlvbiIgOiAiUmVzdW1lIHJvdGF0aW9uIjsgfQogICQoInNwaW4iKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHNldFNwaW4oIWNvbnRyb2xzLmF1dG9Sb3RhdGUpKTsKCiAgLyogLS0tLS0tLS0tLSDDiXZlbnRhaWwgKGTDqWZvcm1hdGlvbiByZWN0YW5nbGUg4oaSIGFyYykgLS0tLS0tLS0tLSAqLwogIGNvbnN0IGZhbkNhbnZhcyA9ICQoImZhbiIpOwogIGZ1bmN0aW9uIGZhbkxheW91dChweFBlck1tLCBtYXJnaW4pIHsKICAgIGNvbnN0IGhhbGYgPSBHLnRoIC8gMjsKICAgIGNvbnN0IGV4dCA9IEcuUm8gKyBjdXAuYmxlZWQ7CiAgICBjb25zdCB3bW0gPSAyICogZXh0ICogTWF0aC5zaW4oaGFsZiArIChjdXAuZ2x1ZSArIGN1cC5ibGVlZCkgLyBHLlJpKSA7CiAgICBjb25zdCB0b3AgPSBleHQsIGJvdHRvbVkgPSAoRy5SaSAtIGN1cC5ibGVlZCkgKiBNYXRoLmNvcyhoYWxmICsgKGN1cC5nbHVlICsgY3VwLmJsZWVkKSAvIEcuUmkpOwogICAgY29uc3QgaG1tID0gdG9wIC0gYm90dG9tWTsKICAgIGNvbnN0IFcgPSBNYXRoLmNlaWwoKHdtbSArIDIgKiBtYXJnaW4pICogcHhQZXJNbSksIEggPSBNYXRoLmNlaWwoKGhtbSArIDIgKiBtYXJnaW4pICogcHhQZXJNbSk7CiAgICBjb25zdCBjeCA9IFcgLyAyLCBjeSA9IChtYXJnaW4gKyB0b3ApICogcHhQZXJNbTsgLy8gY2VudHJlIGR1IGNlcmNsZSAoc291cyBsJ8OpdmVudGFpbCkKICAgIHJldHVybiB7IFcsIEgsIGN4LCBjeSwgazogcHhQZXJNbSB9OwogIH0KCiAgZnVuY3Rpb24gd2FycEludG8oY3R4LCBMLCBvcHRzKSB7CiAgICBjb25zdCB7IFcsIEgsIGN4LCBjeSwgayB9ID0gTDsKICAgIGNvbnN0IHNyYyA9IGFydC5nZXRDb250ZXh0KCIyZCIpLmdldEltYWdlRGF0YSgwLCAwLCBBVywgQUgpLmRhdGE7CiAgICBjb25zdCBvdXQgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKFcsIEgpOyBjb25zdCBvID0gb3V0LmRhdGE7CiAgICBjb25zdCBoYWxmID0gRy50aCAvIDI7CiAgICBjb25zdCBSb3V0ID0gRy5SbyArIGN1cC5ibGVlZCwgUmluID0gRy5SaSAtIGN1cC5ibGVlZDsKICAgIGZvciAobGV0IHB5ID0gMDsgcHkgPCBIOyBweSsrKSB7CiAgICAgIGNvbnN0IHkgPSAoY3kgLSBweSAtIDAuNSkgLyBrOwogICAgICBmb3IgKGxldCBweCA9IDA7IHB4IDwgVzsgcHgrKykgewogICAgICAgIGNvbnN0IHggPSAocHggKyAwLjUgLSBjeCkgLyBrOwogICAgICAgIGNvbnN0IHIgPSBNYXRoLmh5cG90KHgsIHkpOwogICAgICAgIGlmIChyID4gUm91dCB8fCByIDwgUmluKSBjb250aW51ZTsKICAgICAgICBjb25zdCBwaGkgPSBNYXRoLmF0YW4yKHgsIHkpOwogICAgICAgIGNvbnN0IGJsZWVkQW5nID0gY3VwLmJsZWVkIC8gcjsKICAgICAgICBpZiAoTWF0aC5hYnMocGhpKSA+IGhhbGYgKyBibGVlZEFuZykgY29udGludWU7CiAgICAgICAgLy8gdSA6IHBvc2l0aW9uIGhvcml6b250YWxlIGRhbnMgbGEgbWFxdWV0dGUsIHYgOiB2ZXJ0aWNhbGUgKGhhdXQgPSByYXlvbiBleHTDqXJpZXVyKQogICAgICAgIGxldCB1ID0gKHBoaSArIGhhbGYpIC8gRy50aDsgbGV0IHYgPSB2T2ZSYWRpdXMocik7CiAgICAgICAgdSA9IE1hdGgubWluKE1hdGgubWF4KHUsIDApLCAxKTsgdiA9IE1hdGgubWluKE1hdGgubWF4KHYsIDApLCAxKTsKICAgICAgICBjb25zdCBzeCA9IE1hdGgubWluKEFXIC0gMSwgTWF0aC5mbG9vcih1ICogQVcpKSwgc3kgPSBNYXRoLm1pbihBSCAtIDEsIE1hdGguZmxvb3IodiAqIEFIKSk7CiAgICAgICAgY29uc3Qgc2kgPSAoc3kgKiBBVyArIHN4KSAqIDQsIG9pID0gKHB5ICogVyArIHB4KSAqIDQ7CiAgICAgICAgb1tvaV0gPSBzcmNbc2ldOyBvW29pICsgMV0gPSBzcmNbc2kgKyAxXTsgb1tvaSArIDJdID0gc3JjW3NpICsgMl07IG9bb2kgKyAzXSA9IDI1NTsKICAgICAgfQogICAgfQogICAgY3R4LnB1dEltYWdlRGF0YShvdXQsIDAsIDApOwogIH0KCiAgZnVuY3Rpb24gYXJjUGF0aChjdHgsIEwsIFJpbiwgUm91dCwgYTAsIGExKSB7CiAgICBjb25zdCB7IGN4LCBjeSwgayB9ID0gTDsKICAgIGN0eC5iZWdpblBhdGgoKTsKICAgIGN0eC5hcmMoY3gsIGN5LCBSb3V0ICogaywgLU1hdGguUEkgLyAyICsgYTAsIC1NYXRoLlBJIC8gMiArIGExKTsKICAgIGN0eC5hcmMoY3gsIGN5LCBSaW4gKiBrLCAtTWF0aC5QSSAvIDIgKyBhMSwgLU1hdGguUEkgLyAyICsgYTAsIHRydWUpOwogICAgY3R4LmNsb3NlUGF0aCgpOwogIH0KCiAgZnVuY3Rpb24gY3NzVmFyKG4pIHsgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKG4pLnRyaW0oKTsgfQoKICBmdW5jdGlvbiByZW5kZXJGYW4oY2FudmFzLCBweFBlck1tLCBndWlkZXMpIHsKICAgIGNvbnN0IGsgPSBweFBlck1tIHx8ICgxNDAwIC8gMzAwKTsKICAgIGNvbnN0IEwgPSBmYW5MYXlvdXQoaywgcHhQZXJNbSA\/IDIgOiA2KTsKICAgIGNhbnZhcy53aWR0aCA9IEwuVzsgY2FudmFzLmhlaWdodCA9IEwuSDsKICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgd2FycEludG8oY3R4LCBMKTsKICAgIGlmICghZ3VpZGVzKSByZXR1cm4gTDsKICAgIGNvbnN0IGhhbGYgPSBHLnRoIC8gMiwgbHcgPSBNYXRoLm1heCgxLCBrICogMC4yNSk7CiAgICAvLyByZWNvdXZyZW1lbnQgZGUgY29sbGFnZSAoY8O0dMOpIGRyb2l0KQogICAgY29uc3QgZ2x1ZUEgPSBjdXAuZ2x1ZSAvICgoRy5SbyArIEcuUmkpIC8gMik7CiAgICBjdHguc2F2ZSgpOwogICAgYXJjUGF0aChjdHgsIEwsIEcuUmksIEcuUm8sIGhhbGYsIGhhbGYgKyBnbHVlQSk7IGN0eC5jbGlwKCk7CiAgICBjdHguc3Ryb2tlU3R5bGUgPSBjc3NWYXIoIi0tbXV0ZWQiKTsgY3R4LmxpbmVXaWR0aCA9IGx3OwogICAgZm9yIChsZXQgaSA9IC1MLkg7IGkgPCBMLlcgKyBMLkg7IGkgKz0gayAqIDIuMikgeyBjdHguYmVnaW5QYXRoKCk7IGN0eC5tb3ZlVG8oaSwgMCk7IGN0eC5saW5lVG8oaSAtIEwuSCwgTC5IKTsgY3R4LnN0cm9rZSgpOyB9CiAgICBjdHgucmVzdG9yZSgpOwogICAgLy8gZm9uZCBwZXJkdQogICAgY3R4LnN0cm9rZVN0eWxlID0gY3NzVmFyKCItLW11dGVkIik7IGN0eC5saW5lV2lkdGggPSBsdyAqIDAuNjsgY3R4LnNldExpbmVEYXNoKFtdKTsKICAgIGFyY1BhdGgoY3R4LCBMLCBHLlJpIC0gY3VwLmJsZWVkLCBHLlJvICsgY3VwLmJsZWVkLCAtaGFsZiAtIGN1cC5ibGVlZCAvIEcuUm8sIGhhbGYgKyBjdXAuYmxlZWQgLyBHLlJvKTsgY3R4Lmdsb2JhbEFscGhhID0gMC42OyBjdHguc3Ryb2tlKCk7IGN0eC5nbG9iYWxBbHBoYSA9IDE7CiAgICAvLyB0cmFjw6kgZGUgY291cGUKICAgIGN0eC5zdHJva2VTdHlsZSA9IGNzc1ZhcigiLS1pbmsiKTsgY3R4LmxpbmVXaWR0aCA9IGx3ICogMS40OwogICAgYXJjUGF0aChjdHgsIEwsIEcuUmksIEcuUm8gKyAwLCAtaGFsZiwgaGFsZiArIGdsdWVBKTsgY3R4LnN0cm9rZSgpOwogICAgLy8gem9uZSBkZSBzw6ljdXJpdMOpCiAgICBjdHguc3Ryb2tlU3R5bGUgPSBjc3NWYXIoIi0tZ3VpZGUiKTsgY3R4LmxpbmVXaWR0aCA9IGx3OyBjdHguc2V0TGluZURhc2goW2sgKiAyLCBrICogMS40XSk7CiAgICBhcmNQYXRoKGN0eCwgTCwgRy5SaSArIGN1cC5zYWZlLCBHLlJvIC0gY3VwLnNhZmUsIC1oYWxmICsgY3VwLnNhZmUgLyBHLlJpLCBoYWxmIC0gY3VwLnNhZmUgLyBHLlJpKTsgY3R4LnN0cm9rZSgpOwogICAgY3R4LnNldExpbmVEYXNoKFtdKTsKICAgIHJldHVybiBMOwogIH0KCiAgLyogLS0tLS0tLS0tLSBFeHBvcnRzIC0tLS0tLS0tLS0gKi8KICBsZXQgZGxDYXAgPSBudWxsOwogIGlmICh3aW5kb3cuY2xhdWRlICYmIHR5cGVvZiB3aW5kb3cuY2xhdWRlLnVzZSA9PT0gImZ1bmN0aW9uIikgd2luZG93LmNsYXVkZS51c2UoImRvd25sb2FkcyIpLnRoZW4oZCA9PiB7IGRsQ2FwID0gZDsgfSkuY2F0Y2goKCkgPT4ge30pOwogIGZ1bmN0aW9uIGRvd25sb2FkKG5hbWUsIGJsb2IpIHsKICAgIGlmIChkbENhcCkgeyBkbENhcC5zYXZlKHsgZmlsZW5hbWU6IG5hbWUsIGRhdGE6IGJsb2IgfSkuY2F0Y2goKCkgPT4ge30pOyByZXR1cm47IH0KICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7IGEuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7IGEuZG93bmxvYWQgPSBuYW1lOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsgYS5jbGljaygpOyBzZXRUaW1lb3V0KCgpID0+IHsgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpOyBhLnJlbW92ZSgpOyB9LCAxMDAwKTsKICB9CiAgJCgiZGxGYW5QbmciKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgIHJlbmRlckZhbihjLCAzMDAgLyAyNS40LCBmYWxzZSk7CiAgICBjLnRvQmxvYihiID0+IGRvd25sb2FkKGBldmVudGFpbC0ke2N1cC5sYWJlbC5yZXBsYWNlKCIgIiwgIiIpfS0zMDBkcGkucG5nYCwgYiksICJpbWFnZS9wbmciKTsKICB9KTsKICAkKCJkbEZhblN2ZyIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgY29uc3QgayA9IDE1MCAvIDI1LjQ7IGNvbnN0IEwgPSByZW5kZXJGYW4oYywgaywgZmFsc2UpOwogICAgY29uc3Qgd21tID0gTC5XIC8gaywgaG1tID0gTC5IIC8gaywgY3ggPSBMLmN4IC8gaywgY3kgPSBMLmN5IC8gaywgaGFsZiA9IEcudGggLyAyOwogICAgY29uc3QgcHQgPSAoUiwgYSkgPT4gW2N4ICsgUiAqIE1hdGguc2luKGEpLCBjeSAtIFIgKiBNYXRoLmNvcyhhKV0ubWFwKHYgPT4gdi50b0ZpeGVkKDMpKS5qb2luKCIgIik7CiAgICBjb25zdCBnbHVlQSA9IGN1cC5nbHVlIC8gKChHLlJvICsgRy5SaSkgLyAyKTsKICAgIGNvbnN0IGN1dCA9IGBNICR7cHQoRy5SbywgLWhhbGYpfSBBICR7Ry5Sby50b0ZpeGVkKDMpfSAke0cuUm8udG9GaXhlZCgzKX0gMCAwIDEgJHtwdChHLlJvLCBoYWxmICsgZ2x1ZUEpfSBMICR7cHQoRy5SaSwgaGFsZiArIGdsdWVBKX0gQSAke0cuUmkudG9GaXhlZCgzKX0gJHtHLlJpLnRvRml4ZWQoMyl9IDAgMCAwICR7cHQoRy5SaSwgLWhhbGYpfSBaYDsKICAgIGNvbnN0IHN2ZyA9IGA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI\/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIke3dtbS50b0ZpeGVkKDIpfW1tIiBoZWlnaHQ9IiR7aG1tLnRvRml4ZWQoMil9bW0iIHZpZXdCb3g9IjAgMCAke3dtbS50b0ZpeGVkKDMpfSAke2htbS50b0ZpeGVkKDMpfSI+CiAgPHRpdGxlPsOJdmVudGFpbCAke2N1cC5sYWJlbH0g4oCUIFJvICR7Zm10KEcuUm8pfSBtbSwgUmkgJHtmbXQoRy5SaSl9IG1tLCBhbmdsZSAke2ZtdChHLnRoICogMTgwIC8gTWF0aC5QSSwgMil9wrA8L3RpdGxlPgogIDxnIGlkPSJWaXN1ZWwiPjxpbWFnZSB4PSIwIiB5PSIwIiB3aWR0aD0iJHt3bW0udG9GaXhlZCgzKX0iIGhlaWdodD0iJHtobW0udG9GaXhlZCgzKX0iIHhsaW5rOmhyZWY9IiR7Yy50b0RhdGFVUkwoImltYWdlL3BuZyIpfSIvPjwvZz4KICA8ZyBpZD0iRGVjb3VwZSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjRkYwMEZGIiBzdHJva2Utd2lkdGg9IjAuMjUiPjxwYXRoIGQ9IiR7Y3V0fSIvPjwvZz4KPC9zdmc+YDsKICAgIGRvd25sb2FkKGBldmVudGFpbC0ke2N1cC5sYWJlbC5yZXBsYWNlKCIgIiwgIiIpfS5zdmdgLCBuZXcgQmxvYihbc3ZnXSwgeyB0eXBlOiAiaW1hZ2Uvc3ZnK3htbCIgfSkpOwogIH0pOwogICQoImRsVGVtcGxhdGUiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgIGNvbnN0IFQgPSB0cGwoKSwgYiA9IGN1cC5ibGVlZCwgcyA9IGN1cC5zYWZlLCBXID0gVC5XICsgMiAqIGIsIEggPSBULkggKyAyICogYjsKICAgIGNvbnN0IHN2ZyA9IGA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI\/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IiR7Vy50b0ZpeGVkKDIpfW1tIiBoZWlnaHQ9IiR7SC50b0ZpeGVkKDIpfW1tIiB2aWV3Qm94PSIwIDAgJHtXLnRvRml4ZWQoMyl9ICR7SC50b0ZpeGVkKDMpfSI+CiAgPHRpdGxlPlJlY3Rhbmd1bGFyIHRlbXBsYXRlICR7Y3VwLmxhYmVsfSDigJQgem9uZSB1dGlsZSAke2ZtdChULlcpfSDDlyAke2ZtdChULkgpfSBtbTwvdGl0bGU+CiAgPGcgaWQ9IkZvbmQtcGVyZHUiPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIke1cudG9GaXhlZCgzKX0iIGhlaWdodD0iJHtILnRvRml4ZWQoMyl9IiBmaWxsPSIjRkZGRkZGIiBzdHJva2U9IiM5OTk5OTkiIHN0cm9rZS13aWR0aD0iMC4yIi8+PC9nPgogIDxnIGlkPSJDb3VwZSI+PHJlY3QgeD0iJHtifSIgeT0iJHtifSIgd2lkdGg9IiR7VC5XLnRvRml4ZWQoMyl9IiBoZWlnaHQ9IiR7VC5ILnRvRml4ZWQoMyl9IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMC4zIi8+PC9nPgogIDxnIGlkPSJTZWN1cml0ZSI+PHJlY3QgeD0iJHtiICsgc30iIHk9IiR7YiArIHN9IiB3aWR0aD0iJHsoVC5XIC0gMiAqIHMpLnRvRml4ZWQoMyl9IiBoZWlnaHQ9IiR7KFQuSCAtIDIgKiBzKS50b0ZpeGVkKDMpfSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjRDIzMzdBIiBzdHJva2Utd2lkdGg9IjAuMjUiIHN0cm9rZS1kYXNoYXJyYXk9IjIgMS40Ii8+PC9nPgogIDxnIGlkPSJJbmZvcyIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjMuMiIgZmlsbD0iIzY2NjY2NiI+CiAgICA8dGV4dCB4PSIke2IgKyBzICsgMn0iIHk9IiR7YiArIHMgKyA1fSI+R29iZWxldCAke2N1cC5sYWJlbH0gwrcgem9uZSB1dGlsZSAke2ZtdChULlcpfSDDlyAke2ZtdChULkgpfSBtbSDCtyBmb25kIHBlcmR1ICR7Yn0gbW0gwrcgc8OpY3VyaXTDqSAke3N9IG1tPC90ZXh0PgogICAgPHRleHQgeD0iJHtiICsgcyArIDJ9IiB5PSIke2IgKyBzICsgMTB9Ij5IYXV0IGRlIGxhIG1hcXVldHRlID0gYm9yZCBkdSBnb2JlbGV0LiBDb3VsZXVycyBlbiB0b25zIGRpcmVjdHMgUGFudG9uZSwgNCBtYXhpbXVtLiBXYXJwaW5nIDogJHt3YXJwTW9kZSA9PT0gInN0YW5kYXJkIiA\/ICJzdGFuZGFyZCIgOiAiZm9ybWVzIHByw6lzZXJ2w6llcyJ9LjwvdGV4dD4KICA8L2c+Cjwvc3ZnPmA7CiAgICBkb3dubG9hZChgZ2FiYXJpdC1yZWN0YW5ndWxhaXJlLSR7Y3VwLmxhYmVsLnJlcGxhY2UoIiAiLCAiIil9LnN2Z2AsIG5ldyBCbG9iKFtzdmddLCB7IHR5cGU6ICJpbWFnZS9zdmcreG1sIiB9KSk7CiAgfSk7CgogIC8qIC0tLS0tLS0tLS0gVmFsaWRhdGlvbiAtLS0tLS0tLS0tICovCiAgJCgiYXBwcm92ZSIpLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGUgPT4geyAkKCJvcmRlciIpLmRpc2FibGVkID0gIWUudGFyZ2V0LmNoZWNrZWQ7IH0pOwogIC8qIENhcHR1cmUgZGVzIDQgY8O0dMOpcyBhdmVjIHVuIHJlbmR1IHPDqXBhcsOpLCBzYW5zIHRvdWNoZXIgw6AgbGEgdnVlIGR1IGNsaWVudCAqLwogIGxldCBzaG90UmVuZGVyZXIgPSBudWxsOwogIGZ1bmN0aW9uIGNhcHR1cmVWaWV3cygpIHsKICAgIGNvbnN0IHcgPSA1MDAsIGggPSA2MDA7CiAgICBpZiAoIXNob3RSZW5kZXJlcikgewogICAgICBzaG90UmVuZGVyZXIgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7IGFudGlhbGlhczogdHJ1ZSwgYWxwaGE6IHRydWUsIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdHJ1ZSB9KTsKICAgICAgc2hvdFJlbmRlcmVyLm91dHB1dEVuY29kaW5nID0gVEhSRUUuc1JHQkVuY29kaW5nOwogICAgICBzaG90UmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgPSB0cnVlOyBzaG90UmVuZGVyZXIuc2hhZG93TWFwLnR5cGUgPSBUSFJFRS5QQ0ZTb2Z0U2hhZG93TWFwOwogICAgICBzaG90UmVuZGVyZXIuc2V0U2l6ZSh3LCBoLCBmYWxzZSk7CiAgICB9CiAgICBjb25zdCBjYW0gPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoMzAsIHcgLyBoLCAxLCAyMDAwKTsKICAgIGNhbS5wb3NpdGlvbi5zZXQoMCwgNDUsIDMzNSk7IGNhbS5sb29rQXQoMCwgLTIsIDApOwogICAgY29uc3Qga2VlcCA9IGN1cEdyb3VwLnJvdGF0aW9uLnk7CiAgICBjb25zdCBuYW1lcyA9IFtbIkZhY2UiLCAwXSwgWyJSaWdodCBzaWRlIiwgOTBdLCBbIkJhY2siLCAxODBdLCBbIkxlZnQgc2lkZSIsIDI3MF1dOwogICAgY29uc3Qgb3V0ID0gbmFtZXMubWFwKChbbGFiZWwsIGRlZ10pID0+IHsKICAgICAgY3VwR3JvdXAucm90YXRpb24ueSA9IC1kZWcgKiBNYXRoLlBJIC8gMTgwOwogICAgICBzaG90UmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW0pOwogICAgICByZXR1cm4geyBsYWJlbCwgZGVnLCBzcmM6IHNob3RSZW5kZXJlci5kb21FbGVtZW50LnRvRGF0YVVSTCgiaW1hZ2UvcG5nIikgfTsKICAgIH0pOwogICAgY3VwR3JvdXAucm90YXRpb24ueSA9IGtlZXA7CiAgICByZXR1cm4gb3V0OwogIH0KCiAgbGV0IGRlYWRsaW5lQXQgPSBudWxsLCBvcmRlclN0YXRlID0gIm9wZW4iLCBwZW5kaW5nQWN0aW9uID0gbnVsbCwgY2RUaW1lciA9IG51bGw7CiAgY29uc3QgZm10RGF0ZSA9IGQgPT4gYCR7ZC50b0xvY2FsZURhdGVTdHJpbmcoImVuLUNBIiwgeyB3ZWVrZGF5OiAibG9uZyIsIGRheTogIm51bWVyaWMiLCBtb250aDogImxvbmciIH0pfSDDoCAke2QudG9Mb2NhbGVUaW1lU3RyaW5nKCJlbi1DQSIsIHsgaG91cjogIjItZGlnaXQiLCBtaW51dGU6ICIyLWRpZ2l0IiB9KX1gOwogIGZ1bmN0aW9uIHRpY2soKSB7CiAgICBpZiAoIWRlYWRsaW5lQXQgfHwgb3JkZXJTdGF0ZSAhPT0gIm9wZW4iKSByZXR1cm47CiAgICBjb25zdCBtcyA9IGRlYWRsaW5lQXQgLSBEYXRlLm5vdygpOwogICAgaWYgKG1zIDw9IDApIHsKICAgICAgb3JkZXJTdGF0ZSA9ICJsb2NrZWQiOyAkKCJjb3VudGRvd24iKS50ZXh0Q29udGVudCA9ICJkw6lsYWkgZXhwaXLDqSI7CiAgICAgICQoImRlYWRsaW5lQWN0aW9ucyIpLmhpZGRlbiA9IHRydWU7ICQoImNvbmZpcm1Cb3giKS5oaWRkZW4gPSB0cnVlOwogICAgICAkKCJkZWFkbGluZVRleHQiKS50ZXh0Q29udGVudCA9ICJMZSBkw6lsYWkgZGUgMjQgaCBlc3Qgw6ljb3Vsw6kgOiBsYSBjb21tYW5kZSBwYXJ0IGVuIHByb2R1Y3Rpb24gdGVsbGUgcXUnYXBwcm91dsOpZS4iOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBoaCA9IE1hdGguZmxvb3IobXMgLyAzNjAwMDAwKSwgbW0gPSBNYXRoLmZsb29yKG1zICUgMzYwMDAwMCAvIDYwMDAwKTsKICAgICQoImNvdW50ZG93biIpLnRleHRDb250ZW50ID0gYCR7aGh9IGggJHtTdHJpbmcobW0pLnBhZFN0YXJ0KDIsICIwIil9IG1pbiByZXN0YW50ZXNgOwogIH0KICBmdW5jdGlvbiBvcGVuQ29uZmlybShraW5kKSB7CiAgICBwZW5kaW5nQWN0aW9uID0ga2luZDsKICAgICQoImNvbmZpcm1Cb3giKS5oaWRkZW4gPSBmYWxzZTsgJCgiZml4Tm90ZSIpLmhpZGRlbiA9IGtpbmQgIT09ICJmaXgiOwogICAgJCgiY29uZmlybVRleHQiKS50ZXh0Q29udGVudCA9IGtpbmQgPT09ICJjYW5jZWwiCiAgICAgID8gIkNvbmZpcm1lei12b3VzIGwnYW5udWxhdGlvbiA\/IDEwICUgZHUgbW9udGFudCBkZSBsYSBjb21tYW5kZSBzZXJvbnQgcmV0ZW51cyBwb3VyIGZyYWlzIGRlIHRyYWl0ZW1lbnQsIGxlIHJlc3RlIHZvdXMgc2VyYSByZW1ib3Vyc8OpLiIKICAgICAgOiAiVm90cmUgZGVtYW5kZSBkZSByZWN0aWZpY2F0aW9uIHNlcmEgdHJhbnNtaXNlIGF1IHByw6lwcmVzc2UuIDEwICUgZHUgbW9udGFudCBkZSBsYSBjb21tYW5kZSBzZXJvbnQgZmFjdHVyw6lzIHBvdXIgZnJhaXMgZGUgdHJhaXRlbWVudCwgZXQgdW5lIG5vdXZlbGxlIMOpcHJldXZlIHZvdXMgc2VyYSBlbnZvecOpZS4iOwogIH0KICAkKCJhc2tDYW5jZWwiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IG9wZW5Db25maXJtKCJjYW5jZWwiKSk7CiAgJCgiYXNrRml4IikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBvcGVuQ29uZmlybSgiZml4IikpOwogICQoImNvbmZpcm1ObyIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4geyAkKCJjb25maXJtQm94IikuaGlkZGVuID0gdHJ1ZTsgcGVuZGluZ0FjdGlvbiA9IG51bGw7IH0pOwogICQoImNvbmZpcm1ZZXMiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgIGlmIChwZW5kaW5nQWN0aW9uID09PSAiZml4IiAmJiAhJCgiZml4Tm90ZSIpLnZhbHVlLnRyaW0oKSkgeyAkKCJmaXhOb3RlIikuZm9jdXMoKTsgJCgiZml4Tm90ZSIpLnBsYWNlaG9sZGVyID0gIkluZGlxdWV6IGxhIG1vZGlmaWNhdGlvbiBzb3VoYWl0w6llIGF2YW50IGRlIGNvbmZpcm1lci4iOyByZXR1cm47IH0gICAgb3JkZXJTdGF0ZSA9IHBlbmRpbmdBY3Rpb24gPT09ICJjYW5jZWwiID8gImNhbmNlbGxlZCIgOiAiZml4IjsKICAgICQoImNvbmZpcm1Cb3giKS5oaWRkZW4gPSB0cnVlOyAkKCJkZWFkbGluZUFjdGlvbnMiKS5oaWRkZW4gPSB0cnVlOwogICAgY29uc3QgcGlsbCA9ICQoIm9yZGVyUGlsbCIpOwogICAgaWYgKG9yZGVyU3RhdGUgPT09ICJjYW5jZWxsZWQiKSB7CiAgICAgIHBpbGwuY2xhc3NOYW1lID0gInBpbGwgd2FybiI7IHBpbGwudGV4dENvbnRlbnQgPSAiQW5udWzDqWUiOwogICAgICAkKCJjb3VudGRvd24iKS50ZXh0Q29udGVudCA9ICIiOyAkKCJkZWFkbGluZVRleHQiKS50ZXh0Q29udGVudCA9ICJDb21tYW5kZSBhbm51bMOpZS4gUmV0ZW51ZSBkZSAxMCAlIHBvdXIgZnJhaXMgZGUgdHJhaXRlbWVudCBhcHBsaXF1w6llLiI7CiAgICB9IGVsc2UgewogICAgICBwaWxsLmNsYXNzTmFtZSA9ICJwaWxsIHdhcm4iOyBwaWxsLnRleHRDb250ZW50ID0gIlJlY3RpZmljYXRpb24gZGVtYW5kw6llIjsKICAgICAgJCgiY291bnRkb3duIikudGV4dENvbnRlbnQgPSAiIjsgJCgiZGVhZGxpbmVUZXh0IikudGV4dENvbnRlbnQgPSBgUmVjdGlmaWNhdGlvbiB0cmFuc21pc2UgYXUgcHLDqXByZXNzZSA6IMKrICR7JCgiZml4Tm90ZSIpLnZhbHVlLnRyaW0oKX0gwrsuIEZyYWlzIGRlIHRyYWl0ZW1lbnQgZGUgMTAgJSBhcHBsaXF1w6lzLiBVbmUgbm91dmVsbGUgw6lwcmV1dmUgM0Qgdm91cyBzZXJhIHNvdW1pc2UuYDsKICAgIH0KICB9KTsKCiAgJCgib3JkZXIiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgIGNvbnN0IHZpZXdzID0gY2FwdHVyZVZpZXdzKCk7CiAgICBjb25zdCBpbmtzID0gYW5hbHlzaXMuaW5rcy5zbGljZSgwLCA0KS5tYXAoKGMsIGkpID0+IGAke3BhbnRvbmVPdmVycmlkZXNbaV0gPz8gbmVhcmVzdFBhbnRvbmUoYy5yZ2IpLm5hbWV9YCk7CiAgICBjb25zdCBzdW1tYXJ5ID0gWwogICAgICAiQVNXQUwgM0QgY29uZmlndXJhdGlvbiIsCiAgICAgIGBGb3JtYXQgOiAkeyQoImZvcm1hdCIpLnNlbGVjdGVkT3B0aW9uc1swXS50ZXh0Q29udGVudH1gLAogICAgICBgUXVhbnRpdHkgOiAkeyQoInF0eSIpLnZhbHVlfWAsCiAgICAgIGBBcnR3b3JrOiAke3NvdXJjZUluZm8ubmFtZX1gLAogICAgICBgV2FycGluZyA6ICR7d2FycE1vZGUgPT09ICJzdGFuZGFyZCIgPyAiU3RhbmRhcmQiIDogIlByZXNlcnZlIHNoYXBlcyJ9YCwKICAgICAgYFBvc2VzIDogJHtwb3Nlcy5ueH0gYWNyb3NzIMOXICR7cG9zZXMubnl9IGRvd24ke3Bvc2VzLmtlZXAgPyAiIMK3IHByb3BvcnRpb25zIHByZXNlcnZlZCIgOiAiIMK3IHN0cmV0Y2hlZCJ9YCwKICAgICAgYENvbG91cnM6ICR7YW5hbHlzaXMuaW5rcy5sZW5ndGh9IMK3ICR7aW5rcy5qb2luKCIsICIpIHx8ICJub25lIn1gLAogICAgICBgUmVkdWN0aW9uOiAke2xpbWl0ID8gYExpbWl0ZWQgdG8gJHtsaW1pdH0gY291bGV1ciR7bGltaXQgPiAxID8gInMiIDogIiJ9YCA6ICJOb25lIn1gLAogICAgICAiVGhlIGN1c3RvbWVyIGNvbmZpcm1lZCB0aGUgM0QgcHJldmlldy4iCiAgICBdLmpvaW4oU3RyaW5nLmZyb21DaGFyQ29kZSgxMCkpOwoKICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoewogICAgICB0eXBlOiAiYXN3YWwtY3VwLWNvbmZpZ3VyYXRvci1xdW90ZSIsCiAgICAgIHN1bW1hcnk6IHN1bW1hcnksCiAgICAgIGZpbGU6IHVwbG9hZGVkRmlsZSB8fCBudWxsLAogICAgICBwcmV2aWV3RGF0YVVybDogdmlld3NbMF0gPyB2aWV3c1swXS5zcmMgOiBudWxsCiAgICB9LCAiKiIpOwogIH0pOwoKICAvKiAtLS0tLS0tLS0tIFLDqWFsaXTDqSBhdWdtZW50w6llIDogZ29iZWxldCDDoCB0YWlsbGUgcsOpZWxsZSAobcOodHJlcyksIGJhc2UgcG9zw6llIMOgIHkgPSAwIC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiByZXZlcnNlZEdlbyhnKSB7CiAgICBjb25zdCByID0gZy5jbG9uZSgpOyBjb25zdCBpZHggPSByLmluZGV4LmFycmF5LnNsaWNlKCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkeC5sZW5ndGg7IGkgKz0gMykgeyBjb25zdCB0ID0gaWR4W2kgKyAxXTsgaWR4W2kgKyAxXSA9IGlkeFtpICsgMl07IGlkeFtpICsgMl0gPSB0OyB9CiAgICByLnNldEluZGV4KEFycmF5LmZyb20oaWR4KSk7IHIuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTsgcmV0dXJuIHI7CiAgfQogIGZ1bmN0aW9uIGJ1aWxkQVJDdXAoKSB7CiAgICBjb25zdCBrID0gMC4wMDEsIEggPSBjdXAuaCwgclQgPSBjdXAuRCAvIDIsIHJCID0gY3VwLmQgLyAyLCBnID0gbmV3IFRIUkVFLkdyb3VwKCk7CiAgICAvLyBtYXF1ZXR0ZSByZWNhZHLDqWUgY29tbWUgZGFucyBsJ2FwZXLDp3UgKGNlbnRyZSBkZSBsYSBtYXF1ZXR0ZSBmYWNlIMOgIGwnYXZhbnQpCiAgICBjb25zdCB3ID0gMjA0OCwgaCA9IE1hdGgucm91bmQodyAqIGFydC5oZWlnaHQgLyBhcnQud2lkdGgpLCBjdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOyBjdi53aWR0aCA9IHc7IGN2LmhlaWdodCA9IGg7CiAgICBjb25zdCBjID0gY3YuZ2V0Q29udGV4dCgiMmQiKTsgYy5kcmF3SW1hZ2UoYXJ0LCAtMC4yNSAqIHcsIDAsIHcsIGgpOyBjLmRyYXdJbWFnZShhcnQsIDAuNzUgKiB3LCAwLCB3LCBoKTsKICAgIGNvbnN0IHR4ID0gbmV3IFRIUkVFLkNhbnZhc1RleHR1cmUoY3YpOyB0eC5lbmNvZGluZyA9IFRIUkVFLnNSR0JFbmNvZGluZzsKICAgIGNvbnN0IHdhbGxHID0gY3VwV2FsbEdlbyhyVCwgckIsIEgsIDk2KTsgd2FsbEcudHJhbnNsYXRlKDAsIEggLyAyLCAwKTsgd2FsbEcuc2NhbGUoaywgaywgayk7CiAgICBnLmFkZChuZXcgVEhSRUUuTWVzaCh3YWxsRywgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbWFwOiB0eCwgcm91Z2huZXNzOiAwLjYgfSkpKTsKICAgIGNvbnN0IGlubkcgPSBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeShyVCAtIDAuNCwgckIgLSAwLjQsIEggLSAwLjUsIDk2LCAxLCB0cnVlKTsgaW5uRy50cmFuc2xhdGUoMCwgSCAvIDIgKyAwLjI1LCAwKTsgaW5uRy5zY2FsZShrLCBrLCBrKTsKICAgIGNvbnN0IHBhcGVyID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgY29sb3I6IDB4ZjRmMmVlLCByb3VnaG5lc3M6IDAuOCB9KTsKICAgIGcuYWRkKG5ldyBUSFJFRS5NZXNoKHJldmVyc2VkR2VvKGlubkcpLCBwYXBlcikpOwogICAgY29uc3QgcmltRyA9IG5ldyBUSFJFRS5Ub3J1c0dlb21ldHJ5KHJUICsgMC40LCAxLjUsIDEyLCA5Nik7IHJpbUcucm90YXRlWChNYXRoLlBJIC8gMik7IHJpbUcudHJhbnNsYXRlKDAsIEgsIDApOyByaW1HLnNjYWxlKGssIGssIGspOwogICAgZy5hZGQobmV3IFRIUkVFLk1lc2gocmltRywgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgY29sb3I6IDB4ZjdmNmYzLCByb3VnaG5lc3M6IDAuNTUgfSkpKTsKICAgIGNvbnN0IGJJbiA9IDYsIHJJbiA9IHJCICsgKHJUIC0gckIpICogKGJJbiAvIEgpOwogICAgY29uc3QgYm90RyA9IG5ldyBUSFJFRS5DaXJjbGVHZW9tZXRyeShySW4sIDY0KTsgYm90Ry5yb3RhdGVYKC1NYXRoLlBJIC8gMik7IGJvdEcudHJhbnNsYXRlKDAsIGJJbiwgMCk7IGJvdEcuc2NhbGUoaywgaywgayk7CiAgICBjb25zdCBib3RNID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgY29sb3I6IDB4ZWJlOGUyLCByb3VnaG5lc3M6IDAuODUgfSk7CiAgICBnLmFkZChuZXcgVEhSRUUuTWVzaChib3RHLCBib3RNKSk7IGcuYWRkKG5ldyBUSFJFRS5NZXNoKHJldmVyc2VkR2VvKGJvdEcpLCBib3RNKSk7CiAgICAvLyBmb25kIGV4dMOpcmlldXIgKGJvcmQgcm91bMOpKSBwb3VyIHF1ZSBsZSBnb2JlbGV0IHJlcG9zZSBzdXIgdW5lIHN1cmZhY2UKICAgIGNvbnN0IGJhc2VHID0gbmV3IFRIUkVFLkNpcmNsZUdlb21ldHJ5KHJCLCA2NCk7IGJhc2VHLnJvdGF0ZVgoTWF0aC5QSSAvIDIpOyBiYXNlRy5zY2FsZShrLCBrLCBrKTsKICAgIGcuYWRkKG5ldyBUSFJFRS5NZXNoKGJhc2VHLCBib3RNKSk7CiAgICByZXR1cm4gZzsKICB9CiAgY29uc3QgYXJFeHBvcnRHTEIgPSBncnAgPT4gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7IHRyeSB7IG5ldyBUSFJFRS5HTFRGRXhwb3J0ZXIoKS5wYXJzZShncnAsIHIgPT4gcmVzKG5ldyBCbG9iKFtyXSwgeyB0eXBlOiAibW9kZWwvZ2x0Zi1iaW5hcnkiIH0pKSwgeyBiaW5hcnk6IHRydWUgfSk7IH0gY2F0Y2ggKGUpIHsgcmVqKGUpOyB9IH0pOwogIGNvbnN0IGFyRXhwb3J0VVNEWiA9IGFzeW5jIGdycCA9PiB7CiAgICAvLyBsJ2V4cG9ydGF0ZXVyIFVTRFogZGUgdGhyZWUgcjEyOCBpbnZlcnNlIGTDqWrDoCBsZSBWIDogb24gY29tcGVuc2UgcG91ciBxdWUgbGUgdmlzdWVsIHNvaXQgw6AgbCdlbmRyb2l0IGRhbnMgUXVpY2sgTG9vawogICAgY29uc3QgZzIgPSBncnAuY2xvbmUodHJ1ZSk7CiAgICBnMi50cmF2ZXJzZShvID0+IHsgaWYgKG8uaXNNZXNoKSB7IG8uZ2VvbWV0cnkgPSBvLmdlb21ldHJ5LmNsb25lKCk7IGNvbnN0IHV2ID0gby5nZW9tZXRyeS5hdHRyaWJ1dGVzLnV2OyBpZiAodXYpIHsgZm9yIChsZXQgaSA9IDA7IGkgPCB1di5jb3VudDsgaSsrKSB1di5zZXRZKGksIDEgLSB1di5nZXRZKGkpKTsgdXYubmVlZHNVcGRhdGUgPSB0cnVlOyB9IH0gfSk7CiAgICByZXR1cm4gbmV3IEJsb2IoW2F3YWl0IG5ldyBUSFJFRS5VU0RaRXhwb3J0ZXIoKS5wYXJzZShnMildLCB7IHR5cGU6ICJtb2RlbC92bmQudXNkeit6aXAiIH0pOwogIH07CiAgbGV0IGFyRmlsZXMgPSB7fSwgYXJVUkxzID0gW107CiAgY29uc3QgaXNJT1MgPSAvaVAoaG9uZXxhZHxvZCkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgKG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gIk1hY0ludGVsIiAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxKTsKICBhc3luYyBmdW5jdGlvbiBwcmVwYXJlQVIoKSB7CiAgICAkKCJhclN1YiIpLnRleHRDb250ZW50ID0gIlByZXBhcmluZyBtb2RlbOKApiI7ICQoImFyTGF1bmNoIikuZGlzYWJsZWQgPSAkKCJhclppcCIpLmRpc2FibGVkID0gdHJ1ZTsgJCgiYXJNc2ciKS5oaWRkZW4gPSB0cnVlOwogICAgYXJVUkxzLmZvckVhY2godSA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKHUpKTsgYXJVUkxzID0gW107CiAgICAkKCJhclN0YWdlIikuaW5uZXJIVE1MID0gYDxwIGNsYXNzPSJmaW5lIiBzdHlsZT0icGFkZGluZzoxNnB4Ij5QcmVwYXJpbmcgQVIgbW9kZWzigKY8L3A+YDsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGdycCA9IGJ1aWxkQVJDdXAoKSwgZ2xiID0gYXdhaXQgYXJFeHBvcnRHTEIoZ3JwKSwgdXNkeiA9IGF3YWl0IGFyRXhwb3J0VVNEWihncnApOwogICAgICBhckZpbGVzID0geyBnbGIsIHVzZHogfTsgY29uc3QgZ3UgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGdsYiksIHV1ID0gVVJMLmNyZWF0ZU9iamVjdFVSTCh1c2R6KTsgYXJVUkxzLnB1c2goZ3UsIHV1KTsKICAgICAgJCgiYXJTdWIiKS50ZXh0Q29udGVudCA9IGAke2N1cC5sYWJlbH0gwrcgJHtjdXAubWx9IG1sIMK3ICR7c291cmNlSW5mby5uYW1lfWA7CiAgICAgICQoImFyWmlwIikuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMgfHwgIWN1c3RvbUVsZW1lbnRzLmdldCgibW9kZWwtdmlld2VyIikpIHsgJCgiYXJTdGFnZSIpLmlubmVySFRNTCA9IGA8cCBjbGFzcz0iZmluZSIgc3R5bGU9InBhZGRpbmc6MTZweCI+VGhlIEFSIHByZXZpZXcgY291bGQgbm90IGxvYWQuIEFSIGZpbGVzIGFyZSBzdGlsbCBhdmFpbGFibGUgdG8gZG93bmxvYWQuPC9wPmA7IHJldHVybjsgfQogICAgICAkKCJhclN0YWdlIikuaW5uZXJIVE1MID0gYDxtb2RlbC12aWV3ZXIgaWQ9Im12IiBzcmM9IiR7Z3V9IiBpb3Mtc3JjPSIke3V1fSIgYXIgYXItbW9kZXM9IndlYnhyIHF1aWNrLWxvb2sgc2NlbmUtdmlld2VyIiBhci1zY2FsZT0iZml4ZWQiIGFyLXBsYWNlbWVudD0iZmxvb3IiIGNhbWVyYS1jb250cm9scyBhdXRvLXJvdGF0ZSBzaGFkb3ctaW50ZW5zaXR5PSIxIiBlbnZpcm9ubWVudC1pbWFnZT0ibmV1dHJhbCIgY2FtZXJhLW9yYml0PSIwZGVnIDc1ZGVnIDAuNDVtIiBhbHQ9IkF1Z21lbnRlZCByZWFsaXR5IGN1cCI+PGJ1dHRvbiBzbG90PSJhci1idXR0b24iIGhpZGRlbj48L2J1dHRvbj48L21vZGVsLXZpZXdlcj5gOwogICAgICAkKCJhckxhdW5jaCIpLmRpc2FibGVkID0gZmFsc2U7CiAgICB9IGNhdGNoIChlKSB7ICQoImFyTXNnIikuaGlkZGVuID0gZmFsc2U7ICQoImFyTXNnIikudGV4dENvbnRlbnQgPSAiVGhlIEFSIG1vZGVsIGNvdWxkIG5vdCBiZSBwcmVwYXJlZDogIiArIGUubWVzc2FnZTsgfQogIH0KICAkKCJhckJ0biIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4geyAkKCJhck92IikuaGlkZGVuID0gZmFsc2U7IHByZXBhcmVBUigpOyB9KTsKICAkKCJhckNsb3NlIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7ICQoImFyT3YiKS5oaWRkZW4gPSB0cnVlOyB9KTsKICAkKCJhck92IikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBlID0+IHsgaWYgKGUudGFyZ2V0ID09PSAkKCJhck92IikpICQoImFyT3YiKS5oaWRkZW4gPSB0cnVlOyB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7IGlmIChlLmtleSA9PT0gIkVzY2FwZSIpICQoImFyT3YiKS5oaWRkZW4gPSB0cnVlOyB9KTsKICAkKCJhckxhdW5jaCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKCkgPT4gewogICAgJCgiYXJNc2ciKS5oaWRkZW4gPSB0cnVlOwogICAgaWYgKGlzSU9TKSB7IGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7IGEucmVsID0gImFyIjsgYS5ocmVmID0gYXJVUkxzWzFdOyBhLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpKTsgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsgYS5jbGljaygpOyBhLnJlbW92ZSgpOyByZXR1cm47IH0KICAgIGNvbnN0IG12ID0gJCgibXYiKTsgaWYgKG12ICYmIG12LmNhbkFjdGl2YXRlQVIpIHsgdHJ5IHsgYXdhaXQgbXYuYWN0aXZhdGVBUigpOyByZXR1cm47IH0gY2F0Y2ggKGUpIHsgLyogc3VpdGUgKi8gfSB9CiAgICAkKCJhck1zZyIpLmhpZGRlbiA9IGZhbHNlOwogICAgJCgiYXJNc2ciKS50ZXh0Q29udGVudCA9ICJBdWdtZW50ZWQgcmVhbGl0eSBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgd2luZG93LiBPcGVuIHRoaXMgcGFnZSBpbiBTYWZhcmkgKGlQaG9uZSkgb3IgQ2hyb21lIChBbmRyb2lkKSwgb3IgZG93bmxvYWQgdGhlIEFSIGZpbGVzLiI7CiAgfSk7CiAgJCgiYXJaaXAiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgIGNvbnN0IGJhc2UgPSAiZ29iZWxldC0iICsgY3VwLmxhYmVsLnJlcGxhY2UoIiAiLCAiIik7CiAgICBQcm9taXNlLmFsbChbYXJGaWxlcy51c2R6LmFycmF5QnVmZmVyKCksIGFyRmlsZXMuZ2xiLmFycmF5QnVmZmVyKCldKS50aGVuKChbdSwgZ10pID0+IHsKICAgICAgY29uc3QgeiA9IGZmbGF0ZS56aXBTeW5jKHsgW2Jhc2UgKyAiLnVzZHoiXTogW25ldyBVaW50OEFycmF5KHUpLCB7IGxldmVsOiAwIH1dLCBbYmFzZSArICIuZ2xiIl06IFtuZXcgVWludDhBcnJheShnKSwgeyBsZXZlbDogNiB9XSwKICAgICAgICAiTElTRVotTU9JLnR4dCI6IGZmbGF0ZS5zdHJUb1U4KCJpUGhvbmUvaVBhZCA6IG91dnJleiBsZSBmaWNoaWVyIC51c2R6IGRhbnMgRmljaGllcnMgcG91ciBsZSB2b2lyIGVuIEFSIChBUiBRdWljayBMb29rKS5uQW5kcm9pZCA6IG91dnJleiBsZSBmaWNoaWVyIC5nbGIgYXZlYyB1bmUgdmlzaW9ubmV1c2UgM0QgY29tcGF0aWJsZSBBUi5uIikgfSk7CiAgICAgIGRvd25sb2FkKGJhc2UgKyAiLWFyLnppcCIsIG5ldyBCbG9iKFt6XSwgeyB0eXBlOiAiYXBwbGljYXRpb24vemlwIiB9KSk7CiAgICB9KTsKICB9KTsKCiAgLyogLS0tLS0tLS0tLSBUaMOobWUgOiByZWRlc3NpbmVyIGxlcyByZXDDqHJlcyAtLS0tLS0tLS0tICovCiAgbWF0Y2hNZWRpYSgiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIpLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsICgpID0+IHJlbmRlckZhbihmYW5DYW52YXMsIG51bGwsIHRydWUpKTsKICBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiByZW5kZXJGYW4oZmFuQ2FudmFzLCBudWxsLCB0cnVlKSkub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbImRhdGEtdGhlbWUiXSB9KTsKCiAgLyogLS0tLS0tLS0tLSBEw6ltYXJyYWdlIC0tLS0tLS0tLS0gKi8KICByZW5kZXJTcGVjcygpOwogIGRyYXdTYW1wbGUoKTsgcmVmcmVzaEFsbCgpOwogIGlmIChkb2N1bWVudC5mb250cyAmJiBkb2N1bWVudC5mb250cy5yZWFkeSkgZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbigoKSA9PiB7IGRyYXdTYW1wbGUoKTsgcmVmcmVzaEFsbCgpOyB9KTsKCiAgZnVuY3Rpb24gc2VuZEhlaWdodCgpIHsKICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoewogICAgICB0eXBlOiAiYXN3YWwtY3VwLWNvbmZpZ3VyYXRvci1oZWlnaHQiLAogICAgICBoZWlnaHQ6IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KQogICAgfSwgIioiKTsKICB9CiAgbmV3IFJlc2l6ZU9ic2VydmVyKHNlbmRIZWlnaHQpLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBzZW5kSGVpZ2h0KTsKICBzZXRUaW1lb3V0KHNlbmRIZWlnaHQsIDUwMCk7Cn0pKCk7Cjwvc2NyaXB0PgoKPC9ib2R5PjwvaHRtbD4=\":\"PCFkb2N0eXBlIGh0bWw+PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD11dGY4PjxtZXRhIG5hbWU9dmlld3BvcnQgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSx2aWV3cG9ydC1maXQ9Y292ZXIiPjxzdHlsZT46cm9vdHtjb2xvci1zY2hlbWU6bGlnaHQ7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmctdG9wOmVudihzYWZlLWFyZWEtaW5zZXQtdG9wLDBweCk7cGFkZGluZy1ib3R0b206ZW52KHNhZmUtYXJlYS1pbnNldC1ib3R0b20sMHB4KX1odG1se3Njcm9sbC1wYWRkaW5nLXRvcDplbnYoc2FmZS1hcmVhLWluc2V0LXRvcCwwcHgpfWJvZHl7bWFyZ2luOjA7cGFkZGluZzowO2ZvbnQ6MTRweCAtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCxzYW5zLXNlcmlmO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMDAwfWltZ3ttYXgtd2lkdGg6MTAwJX1baGlkZGVuXTpub3QoW2hpZGRlbj11bnRpbC1mb3VuZCBpXSl7ZGlzcGxheTpub25lIWltcG9ydGFudH08L3N0eWxlPjwvaGVhZD48Ym9keT4KPHRpdGxlPkNvbmZpZ3VyYXRldXIgZGUgZ29iZWxldHM8L3RpdGxlPgo8bWV0YSBuYW1lPSJjbGF1ZGU6dmlld3BvcnQtZml0LXNpZGVzIiBjb250ZW50PSJjb3ZlciI+CjxsaW5rIHJlbD0icHJlY29ubmVjdCIgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbSI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1JbnRlcjp3Z2h0QDUwMDs2MDA7NzAwOzgwMCZmYW1pbHk9TGF0bzp3Z2h0QDQwMDs1MDA7NjAwOzcwMCZkaXNwbGF5PXN3YXAiPgo8c3R5bGU+Ci8qIExheW91dCA6IGNvbG9ubmUgZCfDqXRhcGVzIMOgIGdhdWNoZSAocGFyY291cnMgY2xpZW50KSwgYXRlbGllciB2aXN1ZWwgw6AgZHJvaXRlICgzRCArIMOpdmVudGFpbCBkJ2ltcHJlc3Npb24pICovCjpyb290IHsKICBjb2xvci1zY2hlbWU6IGxpZ2h0OwogIC0tYmc6ICNGRkZGRkY7CiAgLS1zdXJmYWNlOiAjRkZGRkZGOwogIC0tc3VuazogI0Y4RjhGODsKICAtLWluazogIzU3NTc1NzsKICAtLWhlYWRpbmc6ICMwRjM2OUE7CiAgLS1tdXRlZDogIzc2NzY3NjsKICAtLWxpbmU6ICNFMkUyRTI7CiAgLS1hY2NlbnQ6ICMwRjM2OUE7CiAgLS1hY2NlbnQtaW5rOiAjRkZGRkZGOwogIC0tY3RhOiAjRTkzMjIzOwogIC0td2FybjogI0I5NDgzNTsKICAtLXdhcm4tYmc6ICNGRkYzRjA7CiAgLS1vazogIzJCN0E0NzsKICAtLW9rLWJnOiAjRUVGOEYxOwogIC0tZ3VpZGU6ICNFOTMyMjM7CiAgLS1zdGFnZTogcmFkaWFsLWdyYWRpZW50KDEyMCUgOTAlIGF0IDUwJSAzMCUsICNGRkZGRkYgMCUsICNGMkY0RjggNzIlKTsKICAtLWYtZGlzcGxheTogIkludGVyIiwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgLS1mLWJvZHk6ICJMYXRvIiwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgLS1mLW1vbm86ICJMYXRvIiwgQXJpYWwsIHNhbnMtc2VyaWY7Cn0KKiB7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH0KYm9keSB7CiAgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0taW5rKTsgZm9udC1mYW1pbHk6IHZhcigtLWYtYm9keSk7IGZvbnQtc2l6ZTogMTVweDsgbGluZS1oZWlnaHQ6IDEuNTsKICBwYWRkaW5nLWxlZnQ6IG1heCgxNnB4LCBlbnYoc2FmZS1hcmVhLWluc2V0LWxlZnQsIDBweCkpOyBwYWRkaW5nLXJpZ2h0OiBtYXgoMTZweCwgZW52KHNhZmUtYXJlYS1pbnNldC1yaWdodCwgMHB4KSk7CiAgcGFkZGluZy1ibG9jazogMjBweCA0MHB4Owp9Ci53cmFwIHsgbWF4LXdpZHRoOiAxMzIwcHg7IG1hcmdpbjogMCBhdXRvOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDE4cHg7IH0KaGVhZGVyLnRvcCB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgYWxpZ24taXRlbXM6IGJhc2VsaW5lOyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGdhcDogOHB4IDIwcHg7IH0KaGVhZGVyLnRvcCBoMSB7IGZvbnQtZmFtaWx5OiB2YXIoLS1mLWRpc3BsYXkpOyBmb250LXdlaWdodDogODAwOyBmb250LXNpemU6IGNsYW1wKDI0cHgsIDN2dywgMzJweCk7IGxldHRlci1zcGFjaW5nOiAtMC4wMmVtOyBtYXJnaW46IDA7IHRleHQtd3JhcDogYmFsYW5jZTsgY29sb3I6IHZhcigtLWhlYWRpbmcpOyB9CmhlYWRlci50b3AgLnRhZyB7IGZvbnQtZmFtaWx5OiB2YXIoLS1mLW1vbm8pOyBmb250LXNpemU6IDEycHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGxldHRlci1zcGFjaW5nOiAwLjA0ZW07IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IH0KLmFwcCB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDM2MHB4KSBtaW5tYXgoMCwgMWZyKTsgZ2FwOiAxOHB4OyBhbGlnbi1pdGVtczogc3RhcnQ7IH0KQG1lZGlhIChtYXgtd2lkdGg6IDkwMHB4KSB7CiAgLmFwcCB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDFmcik7IH0KICAuc3RlcHMgeyBvcmRlcjogLTE7IH0KICAuc3R1ZGlvIHsgb3JkZXI6IDA7IH0KfQoKLnN0ZXBzIHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxMnB4OyB9Ci5zdGVwIHsgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOyBib3JkZXItcmFkaXVzOiAxMHB4OyBwYWRkaW5nOiAxNnB4OyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEycHg7IG1pbi13aWR0aDogMDsgfQouc3RlcCBoMiB7IG1hcmdpbjogMDsgZm9udC1mYW1pbHk6IHZhcigtLWYtZGlzcGxheSk7IGZvbnQtd2VpZ2h0OiA3MDA7IGZvbnQtc2l6ZTogMTdweDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyBjb2xvcjogdmFyKC0taGVhZGluZyk7IH0KLnN0ZXAgaDIgLm4geyBmb250LWZhbWlseTogdmFyKC0tZi1kaXNwbGF5KTsgZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNzAwOyB3aWR0aDogMjRweDsgaGVpZ2h0OiAyNHB4OyBib3JkZXItcmFkaXVzOiA1MCU7IGRpc3BsYXk6IGlubGluZS1ncmlkOyBwbGFjZS1pdGVtczogY2VudGVyOyBiYWNrZ3JvdW5kOiAjRjJGNUZDOyBib3JkZXI6IDFweCBzb2xpZCAjQ0ZEOUYzOyBjb2xvcjogdmFyKC0taGVhZGluZyk7IGZsZXg6IG5vbmU7IH0KLnN0ZXAgcC5oaW50IHsgbWFyZ2luOiAwOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDEzLjVweDsgfQpsYWJlbC5sYmwgeyBmb250LXNpemU6IDEycHg7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGxldHRlci1zcGFjaW5nOiAwLjA2ZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtd2VpZ2h0OiA2MDA7IH0Kc2VsZWN0LCBpbnB1dFt0eXBlPSJ0ZXh0Il0gewogIGZvbnQ6IGluaGVyaXQ7IGNvbG9yOiB2YXIoLS1pbmspOyBiYWNrZ3JvdW5kOiB2YXIoLS1zdW5rKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7IGJvcmRlci1yYWRpdXM6IDdweDsgcGFkZGluZzogOHB4IDEwcHg7IHdpZHRoOiAxMDAlOwp9CnNlbGVjdDpmb2N1cy12aXNpYmxlLCBpbnB1dDpmb2N1cy12aXNpYmxlLCBidXR0b246Zm9jdXMtdmlzaWJsZSwgLmRyb3A6Zm9jdXMtdmlzaWJsZSB7IG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1hY2NlbnQpOyBvdXRsaW5lLW9mZnNldDogMnB4OyB9Ci5zcGVjcyB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDMsIG1pbm1heCgwLCAxZnIpKTsgZ2FwOiA2cHg7IH0KLnNwZWNzIGRpdiB7IGJhY2tncm91bmQ6IHZhcigtLXN1bmspOyBib3JkZXItcmFkaXVzOiA3cHg7IHBhZGRpbmc6IDdweCA4cHg7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMXB4OyB9Ci5zcGVjcyBiIHsgZm9udC1mYW1pbHk6IHZhcigtLWYtbW9ubyk7IGZvbnQtd2VpZ2h0OiA1MDA7IGZvbnQtc2l6ZTogMTRweDsgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsgfQouc3BlY3Mgc3BhbiB7IGZvbnQtc2l6ZTogMTFweDsgY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsgfQoKLmJ0biB7IGZvbnQ6IGluaGVyaXQ7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMTRweDsgYm9yZGVyLXJhZGl1czogOHB4OyBwYWRkaW5nOiA5cHggMTRweDsgY3Vyc29yOiBwb2ludGVyOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZSk7IGNvbG9yOiB2YXIoLS1pbmspOyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogOHB4OyB9Ci5idG46aG92ZXIgeyBib3JkZXItY29sb3I6IHZhcigtLW11dGVkKTsgfQouYnRuLnByaW1hcnkgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1hY2NlbnQtaW5rKTsgfQojb3JkZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1jdGEpOyBib3JkZXItY29sb3I6IHZhcigtLWN0YSk7IGNvbG9yOiAjRkZGRkZGOyB9CiNvcmRlcjpob3ZlciB7IGZpbHRlcjogYnJpZ2h0bmVzcyguOTYpOyB9Ci5idG4ucHJpbWFyeTpob3ZlciB7IGZpbHRlcjogYnJpZ2h0bmVzcygxLjA4KTsgfQouYnRuOmRpc2FibGVkIHsgb3BhY2l0eTogMC40NTsgY3Vyc29yOiBub3QtYWxsb3dlZDsgZmlsdGVyOiBub25lOyB9Ci5idG4uc20geyBmb250LXNpemU6IDEzcHg7IHBhZGRpbmc6IDZweCAxMHB4OyB9Ci5yb3cgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogOHB4OyB9CgouZHJvcCB7IGJvcmRlcjogMS41cHggZGFzaGVkIHZhcigtLWxpbmUpOyBib3JkZXItcmFkaXVzOiA5cHg7IHBhZGRpbmc6IDE4cHggMTRweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjdXJzb3I6IHBvaW50ZXI7IGJhY2tncm91bmQ6IHZhcigtLXN1bmspOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDRweDsgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIC4xNXMsIGJhY2tncm91bmQgLjE1czsgfQouZHJvcDpob3ZlciwgLmRyb3Aub3ZlciB7IGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsgfQouZHJvcCBzdHJvbmcgeyBmb250LXdlaWdodDogNjAwOyB9Ci5kcm9wIHNtYWxsIHsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAxMi41cHg7IH0KLmZpbGUtbmF0aXZlIHsgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7IHdpZHRoOiAxcHggIWltcG9ydGFudDsgaGVpZ2h0OiAxcHggIWltcG9ydGFudDsgb3BhY2l0eTogMCAhaW1wb3J0YW50OyBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7IHBvaW50ZXItZXZlbnRzOiBub25lICFpbXBvcnRhbnQ7IH0KLnBvc2VzIHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA4cHg7IHBhZGRpbmctdG9wOiA0cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgcGFkZGluZy10b3A6IDEycHg7IH0KLnBvc2UtZ3JpZCB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTsgZ2FwOiA4cHg7IH0KLnN1YmxibCB7IGRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDEyLjVweDsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogM3B4OyB9Ci5maWxlbWV0YSB7IGZvbnQtZmFtaWx5OiB2YXIoLS1mLW1vbm8pOyBmb250LXNpemU6IDEycHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgfQoudGVjaC1oaWRkZW4geyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KCi5ub3RlcyB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyB9Ci5ub3RlIHsgZm9udC1zaXplOiAxM3B4OyBib3JkZXItcmFkaXVzOiA3cHg7IHBhZGRpbmc6IDdweCAxMHB4OyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IH0KLm5vdGU6OmJlZm9yZSB7IGNvbnRlbnQ6ICIiOyB3aWR0aDogN3B4OyBoZWlnaHQ6IDdweDsgYm9yZGVyLXJhZGl1czogNTAlOyBtYXJnaW4tdG9wOiA2cHg7IGZsZXg6IG5vbmU7IGJhY2tncm91bmQ6IGN1cnJlbnRDb2xvcjsgfQoubm90ZS5vayB7IGJhY2tncm91bmQ6IHZhcigtLW9rLWJnKTsgY29sb3I6IHZhcigtLW9rKTsgfQoubm90ZS53YXJuIHsgYmFja2dyb3VuZDogdmFyKC0td2Fybi1iZyk7IGNvbG9yOiB2YXIoLS13YXJuKTsgfQoKLmlua3MgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDsgfQouaW5rIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAzNHB4IG1pbm1heCgwLCAxZnIpOyBnYXA6IDEwcHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IH0KLmluayAuc3cgeyB3aWR0aDogMzRweDsgaGVpZ2h0OiAzNHB4OyBib3JkZXItcmFkaXVzOiA3cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOyB9Ci5pbmsgLm1ldGEgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDRweDsgbWluLXdpZHRoOiAwOyB9Ci5pbmsgLm1ldGEgLmwxIHsgZm9udC1mYW1pbHk6IHZhcigtLWYtbW9ubyk7IGZvbnQtc2l6ZTogMTEuNXB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGdhcDogNnB4OyB9Ci5pbmsgaW5wdXQgeyBwYWRkaW5nOiA1cHggOHB4OyBmb250LXNpemU6IDEzLjVweDsgfQouY291bnQgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGdhcDogMTBweDsgfQouY291bnQgLmJpZyB7IGZvbnQtZmFtaWx5OiB2YXIoLS1mLWRpc3BsYXkpOyBmb250LXNpemU6IDMwcHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGxpbmUtaGVpZ2h0OiAxOyBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOyB9Ci5jb3VudCAuYmlnIHNtYWxsIHsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXdlaWdodDogNTAwOyB9Ci5waWxsIHsgZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBwYWRkaW5nOiAzcHggOXB4OyBib3JkZXItcmFkaXVzOiA5OXB4OyB9Ci5waWxsLm9rIHsgYmFja2dyb3VuZDogdmFyKC0tb2stYmcpOyBjb2xvcjogdmFyKC0tb2spOyB9Ci5waWxsLndhcm4geyBiYWNrZ3JvdW5kOiB2YXIoLS13YXJuLWJnKTsgY29sb3I6IHZhcigtLXdhcm4pOyB9Ci5zZWcgeyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgb3ZlcmZsb3c6IGhpZGRlbjsgfQouc2VnIGJ1dHRvbiB7IGZvbnQ6IGluaGVyaXQ7IGZvbnQtZmFtaWx5OiB2YXIoLS1mLW1vbm8pOyBmb250LXNpemU6IDEzcHg7IGJvcmRlcjogMDsgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZSk7IGNvbG9yOiB2YXIoLS1pbmspOyBwYWRkaW5nOiA2cHggMTFweDsgY3Vyc29yOiBwb2ludGVyOyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgfQouc2VnIGJ1dHRvbjpsYXN0LWNoaWxkIHsgYm9yZGVyLXJpZ2h0OiAwOyB9Ci5zZWcgYnV0dG9uW2FyaWEtcHJlc3NlZD0idHJ1ZSJdIHsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWFjY2VudC1pbmspOyB9CgouY2hlY2sgeyBkaXNwbGF5OiBmbGV4OyBnYXA6IDEwcHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBmb250LXNpemU6IDE0cHg7IGN1cnNvcjogcG9pbnRlcjsgfQouY2hlY2sgaW5wdXQgeyB3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4OyBtYXJnaW4tdG9wOiAycHg7IGFjY2VudC1jb2xvcjogdmFyKC0tYWNjZW50KTsgZmxleDogbm9uZTsgfQouZmluZSB7IGZvbnQtc2l6ZTogMTIuNXB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDA7IH0KCi5zdHVkaW8geyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDE4cHg7IG1pbi13aWR0aDogMDsgfQoucGFuZWwgeyBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7IGJvcmRlci1yYWRpdXM6IDEwcHg7IG92ZXJmbG93OiBoaWRkZW47IG1pbi13aWR0aDogMDsgfQoucGFuZWwtaGVhZCB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBnYXA6IDhweCAxNHB4OyBwYWRkaW5nOiAxMnB4IDE2cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgfQoucGFuZWwtaGVhZCBoMyB7IG1hcmdpbjogMDsgZm9udC1mYW1pbHk6IHZhcigtLWYtZGlzcGxheSk7IGZvbnQtd2VpZ2h0OiA3MDA7IGZvbnQtc2l6ZTogMTZweDsgY29sb3I6IHZhcigtLWhlYWRpbmcpOyB9Ci5wYW5lbC1oZWFkIC5zdWIgeyBmb250LXNpemU6IDEyLjVweDsgY29sb3I6IHZhcigtLW11dGVkKTsgfQojdmlld2VyIHsgcG9zaXRpb246IHJlbGF0aXZlOyBoZWlnaHQ6IGNsYW1wKDM2MHB4LCA1OHZoLCA1NjBweCk7IGJhY2tncm91bmQ6IHZhcigtLXN0YWdlKTsgdG91Y2gtYWN0aW9uOiBub25lOyB9CiN2aWV3ZXIgY2FudmFzIHsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IGN1cnNvcjogZ3JhYjsgfQojdmlld2VyIGNhbnZhczphY3RpdmUgeyBjdXJzb3I6IGdyYWJiaW5nOyB9Ci5tb2JpbGUtM2QtdG9nZ2xlIHsgZGlzcGxheTogbm9uZTsgfQpAbWVkaWEgKG1heC13aWR0aDogOTAwcHgpIHsKICAjdmlld2VyUGFuZWwgewogICAgd2lkdGg6IGNhbGMoMTAwJSAtIDQ4cHgpOwogICAgbWFyZ2luOiAxNHB4IDI0cHggNHB4OwogIH0KICAjdmlld2VyIHsKICAgIGhlaWdodDogY2xhbXAoMzMwcHgsIDUwdmgsIDQ3MHB4KTsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKICB9CiAgI3ZpZXdlciBjYW52YXMgewogICAgdG91Y2gtYWN0aW9uOiBub25lOwogICAgY3Vyc29yOiBncmFiOwogIH0KICAjc3BpbiwKICAubW9iaWxlLTNkLXRvZ2dsZSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgfQogIC52aWV3ZXItaGludCB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgfQp9Ci52aWV3ZXItaGludCB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMTRweDsgYm90dG9tOiAxMnB4OyBmb250LXNpemU6IDEycHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgcGFkZGluZzogNHB4IDlweDsgYm9yZGVyLXJhZGl1czogOTlweDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IH0KLmZhbi1ib3ggeyBwYWRkaW5nOiAxNHB4IDE2cHggMTZweDsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxMnB4OyB9Ci5mYW4tc2Nyb2xsIHsgb3ZlcmZsb3cteDogYXV0bzsgYmFja2dyb3VuZDogdmFyKC0tc3Vuayk7IGJvcmRlci1yYWRpdXM6IDhweDsgcGFkZGluZzogMTBweDsgfQojZmFuIHsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyBtaW4td2lkdGg6IDUyMHB4OyBoZWlnaHQ6IGF1dG87IH0KLmRpbXMgeyBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDEzMHB4LCAxZnIpKTsgZ2FwOiA4cHg7IH0KLmRpbXMgZGl2IHsgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCB2YXIoLS1saW5lKTsgcGFkZGluZy1sZWZ0OiAxMHB4OyB9Ci5kaW1zIGIgeyBkaXNwbGF5OiBibG9jazsgZm9udC1mYW1pbHk6IHZhcigtLWYtbW9ubyk7IGZvbnQtd2VpZ2h0OiA1MDA7IGZvbnQtc2l6ZTogMTVweDsgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsgfQouZGltcyBzcGFuIHsgZm9udC1zaXplOiAxMnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9Ci5sZWdlbmQgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogNnB4IDE2cHg7IGZvbnQtc2l6ZTogMTIuNXB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9Ci5sZWdlbmQgaSB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IDE4cHg7IGJvcmRlci10b3A6IDJweCBzb2xpZCB2YXIoLS1tdXRlZCk7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IG1hcmdpbi1yaWdodDogNnB4OyB9Ci5sZWdlbmQgaS5zYWZlIHsgYm9yZGVyLXRvcDogMnB4IGRhc2hlZCB2YXIoLS1ndWlkZSk7IH0KLmxlZ2VuZCBpLmJsZWVkIHsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLW11dGVkKTsgfQoKI3JlY2FwIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOyB9Ci5yZWNhcC1ib2R5IHsgcGFkZGluZzogMTZweDsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxOHB4OyB9Ci52aWV3cyB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDQsIG1pbm1heCgwLCAxZnIpKTsgZ2FwOiAxMHB4OyBtYXJnaW46IDA7IH0KQG1lZGlhIChtYXgtd2lkdGg6IDY0MHB4KSB7IC52aWV3cyB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTsgfSB9Ci52aWV3cyBmaWd1cmUgeyBtYXJnaW46IDA7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4OyB9Ci52aWV3cyBpbWcgeyB3aWR0aDogMTAwJTsgYXNwZWN0LXJhdGlvOiA1IC8gNjsgb2JqZWN0LWZpdDogY29udGFpbjsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgYmFja2dyb3VuZDogdmFyKC0tc3RhZ2UpOyB9Ci52aWV3cyBmaWdjYXB0aW9uIHsgZm9udC1zaXplOiAxMi41cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgZ2FwOiA2cHg7IH0KLnZpZXdzIGZpZ2NhcHRpb24gYiB7IGNvbG9yOiB2YXIoLS1pbmspOyBmb250LXdlaWdodDogNjAwOyB9Ci5kZWFkbGluZSB7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOyBib3JkZXItcmFkaXVzOiA5cHg7IHBhZGRpbmc6IDE0cHg7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tc3Vuayk7IH0KLmRlYWRsaW5lIGg0IHsgbWFyZ2luOiAwOyBmb250LWZhbWlseTogdmFyKC0tZi1kaXNwbGF5KTsgZm9udC1zaXplOiAxNXB4OyBmb250LXdlaWdodDogNjAwOyBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgZ2FwOiA2cHg7IH0KLmRlYWRsaW5lIGg0IHNwYW4geyBmb250LWZhbWlseTogdmFyKC0tZi1tb25vKTsgZm9udC13ZWlnaHQ6IDUwMDsgZm9udC1zaXplOiAxM3B4OyBjb2xvcjogdmFyKC0tYWNjZW50KTsgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsgfQouZGVhZGxpbmUgcCB7IG1hcmdpbjogMDsgZm9udC1zaXplOiAxMy41cHg7IH0KLmZlZSB7IGJhY2tncm91bmQ6IHZhcigtLXdhcm4tYmcpOyBjb2xvcjogdmFyKC0td2Fybik7IGJvcmRlci1yYWRpdXM6IDdweDsgcGFkZGluZzogOHB4IDEwcHg7IGZvbnQtc2l6ZTogMTNweDsgfQouY29uZmlybSB7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgcGFkZGluZy10b3A6IDEwcHg7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogOHB4OyB9Ci5jb25maXJtIHRleHRhcmVhIHsgZm9udDogaW5oZXJpdDsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogdmFyKC0taW5rKTsgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOyBib3JkZXItcmFkaXVzOiA3cHg7IHBhZGRpbmc6IDhweCAxMHB4OyB3aWR0aDogMTAwJTsgbWluLWhlaWdodDogNzBweDsgcmVzaXplOiB2ZXJ0aWNhbDsgfQouYnRuLmRhbmdlciB7IGNvbG9yOiB2YXIoLS13YXJuKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS13YXJuKTsgfQoucmVjYXAtYm9keSBkbCB7IG1hcmdpbjogMDsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtYXgtY29udGVudCBtaW5tYXgoMCwgMWZyKTsgZ2FwOiA2cHggMTRweDsgZm9udC1zaXplOiAxNHB4OyB9Ci5yZWNhcC1ib2R5IGR0IHsgY29sb3I6IHZhcigtLW11dGVkKTsgfQoucmVjYXAtYm9keSBkZCB7IG1hcmdpbjogMDsgZm9udC1mYW1pbHk6IHZhcigtLWYtbW9ubyk7IGZvbnQtc2l6ZTogMTNweDsgd29yZC1icmVhazogYnJlYWstd29yZDsgfQouYnVzeSB7IG9wYWNpdHk6IC41NTsgdHJhbnNpdGlvbjogb3BhY2l0eSAuMnM7IH0KQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsgKiB7IHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDsgfSB9Ci5hci1vdiB7IHBvc2l0aW9uOiBmaXhlZDsgaW5zZXQ6IDA7IHotaW5kZXg6IDUwOyBiYWNrZ3JvdW5kOiByZ2JhKDEwLCAxOCwgMjQsIDAuNTUpOyBkaXNwbGF5OiBncmlkOyBwbGFjZS1pdGVtczogY2VudGVyOwogIHBhZGRpbmc6IG1heCgxNnB4LCBlbnYoc2FmZS1hcmVhLWluc2V0LXRvcCwgMHB4KSkgbWF4KDE2cHgsIGVudihzYWZlLWFyZWEtaW5zZXQtcmlnaHQsIDBweCkpIG1heCgxNnB4LCBlbnYoc2FmZS1hcmVhLWluc2V0LWJvdHRvbSwgMHB4KSkgbWF4KDE2cHgsIGVudihzYWZlLWFyZWEtaW5zZXQtbGVmdCwgMHB4KSk7IH0KLmFyLWJveCB7IGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgYm9yZGVyLXJhZGl1czogMTRweDsgd2lkdGg6IG1pbig2MjBweCwgMTAwJSk7IG1heC1oZWlnaHQ6IDEwMCU7IG92ZXJmbG93OiBhdXRvOyB9Ci5hci1ib2R5IHsgcGFkZGluZzogMTRweCAxNnB4IDE2cHg7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMTJweDsgfQouYXItc3RhZ2UgeyBoZWlnaHQ6IGNsYW1wKDI2MHB4LCA1MHZoLCA0NDBweCk7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLXN0YWdlKTsgb3ZlcmZsb3c6IGhpZGRlbjsgfQouYXItc3RhZ2UgbW9kZWwtdmlld2VyIHsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgfQouYXItb3ZbaGlkZGVuXSB7IGRpc3BsYXk6IG5vbmU7IH0KLmFyLW1zZyB7IGZvbnQtc2l6ZTogMTNweDsgY29sb3I6IHZhcigtLXdhcm4pOyBtYXJnaW46IDA7IH0KPC9zdHlsZT4KCjxkaXYgY2xhc3M9IndyYXAiPgogIDxoZWFkZXIgY2xhc3M9InRvcCI+CiAgICA8aDE+Q29uZmlndXJhdGV1ciBkZSBnb2JlbGV0czwvaDE+CiAgICAKICA8L2hlYWRlcj4KCiAgPGRpdiBjbGFzcz0iYXBwIj4KICAgIDxhc2lkZSBjbGFzcz0ic3RlcHMiPgogICAgICA8c2VjdGlvbiBjbGFzcz0ic3RlcCI+CiAgICAgICAgPGgyPjxzcGFuIGNsYXNzPSJuIj4xPC9zcGFuPkZvcm1hdDwvaDI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibGJsIiBmb3I9ImZvcm1hdCI+R29iZWxldDwvbGFiZWw+ICAgICAgICAgIDxzZWxlY3QgaWQ9ImZvcm1hdCI+PG9wdGlvbiB2YWx1ZT0iNW96Ij41IG96PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iN296Ij43IG96PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iOG96Ij44IG96PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iMTBveiI+MTAgb3o8L29wdGlvbj48b3B0aW9uIHZhbHVlPSIxMm96IiBzZWxlY3RlZD4xMiBvejwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjE2b3oiPjE2IG96PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iMjBveiI+MjAgb3o8L29wdGlvbj48b3B0aW9uIHZhbHVlPSIyMm96Ij4yMiBvejwvb3B0aW9uPjwvc2VsZWN0PjxwIGNsYXNzPSJoaW50Ij5BcGVyw6d1IHByb3Zpc29pcmUgOiB0b3VzIGxlcyBmb3JtYXRzIHV0aWxpc2VudCBsZSBtb2TDqGxlIDEyIG96LiBMZSBmb3JtYXQgY2hvaXNpIHNlcmEgaW5kaXF1w6kgZGFucyB2b3RyZSBkZW1hbmRlIGRlIGRldmlzLjwvcD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzcGVjcyB0ZWNoLWhpZGRlbiIgaWQ9InNwZWNzIj48L2Rpdj4KICAgICAgPC9zZWN0aW9uPgoKICAgICAgPHNlY3Rpb24gY2xhc3M9InN0ZXAgdGVjaC1oaWRkZW4iPgogICAgICAgIDxoMj48c3BhbiBjbGFzcz0ibiI+Mjwvc3Bhbj5HYWJhcml0IHJlY3Rhbmd1bGFpcmU8L2gyPgogICAgICAgIDxwIGNsYXNzPSJoaW50Ij5DcsOpZXogdm90cmUgbWFxdWV0dGUgw6AgcGxhdCBkYW5zIGNlIHJlY3RhbmdsZS4gTGUgc3lzdMOobWUgc2UgY2hhcmdlIGRlIGxhIGTDqWZvcm1lciBlbiDDqXZlbnRhaWwuPC9wPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8bGFiZWwgY2xhc3M9ImxibCI+RMOpZm9ybWF0aW9uPC9sYWJlbD4KICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyIgc3R5bGU9Im1hcmdpbi10b3A6NnB4Ij48ZGl2IGNsYXNzPSJzZWciIGlkPSJ3YXJwU2VnIiByb2xlPSJncm91cCIgYXJpYS1sYWJlbD0iTW9kZSBkZSBkw6lmb3JtYXRpb24iPgogICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS13PSJzdGFuZGFyZCIgYXJpYS1wcmVzc2VkPSJ0cnVlIj5TdGFuZGFyZDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS13PSJjb25mb3JtZSIgYXJpYS1wcmVzc2VkPSJmYWxzZSI+Rm9ybWVzIHByw6lzZXJ2w6llczwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+PC9kaXY+CiAgICAgICAgICA8cCBjbGFzcz0iZmluZSIgaWQ9IndhcnBIaW50IiBzdHlsZT0ibWFyZ2luLXRvcDo2cHgiPjwvcD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJkaW1zIiBpZD0icmVjdERpbXMiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InJvdyI+PGJ1dHRvbiBjbGFzcz0iYnRuIHNtIiBpZD0iZGxUZW1wbGF0ZSIgdHlwZT0iYnV0dG9uIj5Uw6lsw6ljaGFyZ2VyIGxlIGdhYmFyaXQgKFNWRyk8L2J1dHRvbj48L2Rpdj4KICAgICAgPC9zZWN0aW9uPgoKICAgICAgPHNlY3Rpb24gY2xhc3M9InN0ZXAiIGlkPSJ1cGxvYWRTdGVwIj4KICAgICAgICA8aDI+PHNwYW4gY2xhc3M9Im4iPjI8L3NwYW4+Vm90cmUgbWFxdWV0dGU8L2gyPgogICAgICAgIDxsYWJlbCBjbGFzcz0iZHJvcCIgaWQ9ImRyb3AiIGZvcj0iZmlsZSIgdGFiaW5kZXg9IjAiIHJvbGU9ImJ1dHRvbiIgYXJpYS1sYWJlbD0iRMOpcG9zZXIgdW5lIG1hcXVldHRlIj4KICAgICAgICAgIDxzdHJvbmc+RMOpcG9zZXogdm90cmUgZmljaGllciBpY2k8L3N0cm9uZz4KICAgICAgICAgIDxzbWFsbD5QTkcsIEpQRyBvdSBTVkcgwrcgb3UgY2xpcXVleiBwb3VyIHBhcmNvdXJpcjwvc21hbGw+CiAgICAgICAgPC9sYWJlbD4KICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgaWQ9ImZpbGUiIGNsYXNzPSJmaWxlLW5hdGl2ZSIgYWNjZXB0PSJpbWFnZS9wbmcsaW1hZ2UvanBlZyxpbWFnZS9zdmcreG1sIj4KICAgICAgICA8ZGl2IGNsYXNzPSJmaWxlbWV0YSB0ZWNoLWhpZGRlbiIgaWQ9ImZpbGVtZXRhIj5Hb2JlbGV0IGJsYW5jIHZpZXJnZS4gRMOpcG9zZXogdm90cmUgZmljaGllciBwb3VyIHZvaXIgbOKAmWFwZXLDp3UgM0QuPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0icG9zZXMgdGVjaC1oaWRkZW4iPgogICAgICAgICAgPGxhYmVsIGNsYXNzPSJsYmwiPlLDqXDDqXRpdGlvbiAocG9zZXMpPC9sYWJlbD4KICAgICAgICAgIDxkaXYgY2xhc3M9InBvc2UtZ3JpZCI+CiAgICAgICAgICAgIDxkaXY+PGxhYmVsIGNsYXNzPSJzdWJsYmwiIGZvcj0icG9zZXNYIj5FbiBsYXJnZXVyPC9sYWJlbD4KICAgICAgICAgICAgICA8c2VsZWN0IGlkPSJwb3Nlc1giPjxvcHRpb24gc2VsZWN0ZWQ+MTwvb3B0aW9uPjxvcHRpb24+Mjwvb3B0aW9uPjxvcHRpb24+Mzwvb3B0aW9uPjxvcHRpb24+NDwvb3B0aW9uPjxvcHRpb24+NTwvb3B0aW9uPjxvcHRpb24+Njwvb3B0aW9uPjxvcHRpb24+ODwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PgogICAgICAgICAgICA8ZGl2PjxsYWJlbCBjbGFzcz0ic3VibGJsIiBmb3I9InBvc2VzWSI+RW4gaGF1dGV1cjwvbGFiZWw+CiAgICAgICAgICAgICAgPHNlbGVjdCBpZD0icG9zZXNZIj48b3B0aW9uIHNlbGVjdGVkPjE8L29wdGlvbj48b3B0aW9uPjI8L29wdGlvbj48b3B0aW9uPjM8L29wdGlvbj48b3B0aW9uPjQ8L29wdGlvbj48L3NlbGVjdD48L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGxhYmVsIGNsYXNzPSJjaGVjayI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icG9zZXNLZWVwIiBjaGVja2VkPiA8c3Bhbj5HYXJkZXIgbGVzIHByb3BvcnRpb25zIGRlIGNoYXF1ZSBwb3NlPC9zcGFuPjwvbGFiZWw+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJmaWxlbWV0YSIgaWQ9InBvc2VJbmZvIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJub3RlcyB0ZWNoLWhpZGRlbiIgaWQ9ImNoZWNrcyI+PC9kaXY+CgogICAgICA8L3NlY3Rpb24+CgogICAgICA8c2VjdGlvbiBjbGFzcz0ic3RlcCI+CiAgICAgICAgPGgyPjxzcGFuIGNsYXNzPSJuIj4zPC9zcGFuPkNvdWxldXJzIGQnaW1wcmVzc2lvbjwvaDI+CiAgICAgICAgPGRpdiBjbGFzcz0iY291bnQiPgogICAgICAgICAgPGRpdiBjbGFzcz0iYmlnIiBpZD0iaW5rQ291bnQiPjAgPHNtYWxsPmNvdWxldXJzPC9zbWFsbD48L2Rpdj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJwaWxsIG9rIiBpZD0iaW5rUGlsbCI+T0s8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibGJsIj5MaW1pdGVyIMOgPC9sYWJlbD4KICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyIgc3R5bGU9ImFsaWduLWl0ZW1zOmNlbnRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlZyIgaWQ9ImxpbWl0U2VnIiByb2xlPSJncm91cCIgYXJpYS1sYWJlbD0iTm9tYnJlIGRlIGNvdWxldXJzIG1heGltdW0iPgogICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLW49IjAiIGFyaWEtcHJlc3NlZD0idHJ1ZSI+T3JpZ2luYWw8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1uPSIxIiBhcmlhLXByZXNzZWQ9ImZhbHNlIj4xPC9idXR0b24+CiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtbj0iMiIgYXJpYS1wcmVzc2VkPSJmYWxzZSI+MjwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLW49IjMiIGFyaWEtcHJlc3NlZD0iZmFsc2UiPjM8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1uPSI0IiBhcmlhLXByZXNzZWQ9ImZhbHNlIj40PC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iaW5rcyIgaWQ9Imlua3MiPjwvZGl2PgogICAgICAgIDxwIGNsYXNzPSJmaW5lIj5MZXMgUGFudG9uZSBwcm9wb3PDqXMgc29udCBsZXMgcGx1cyBwcm9jaGVzIMOgIGwnw6ljcmFuLiBWb3VzIHBvdXZleiBzYWlzaXIgdm9zIHByb3ByZXMgcsOpZsOpcmVuY2VzLiBMZSBibGFuYyBlc3QgbGUgcGFwaWVyIGV0IG5lIGNvbXB0ZSBwYXMgY29tbWUgZW5jcmUuPC9wPgogICAgICA8L3NlY3Rpb24+CgogICAgICA8c2VjdGlvbiBjbGFzcz0ic3RlcCI+CiAgICAgICAgPGgyPjxzcGFuIGNsYXNzPSJuIj40PC9zcGFuPlZhbGlkYXRpb24gZXQgZGVtYW5kZSBkZSBkZXZpczwvaDI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibGJsIiBmb3I9InF0eSI+UXVhbnRpdMOpPC9sYWJlbD4KICAgICAgICAgIDxzZWxlY3QgaWQ9InF0eSI+CiAgICAgICAgICAgIDxvcHRpb24+MSAwMDA8L29wdGlvbj48b3B0aW9uIHNlbGVjdGVkPjIgNTAwPC9vcHRpb24+PG9wdGlvbj41IDAwMDwvb3B0aW9uPjxvcHRpb24+MTAgMDAwPC9vcHRpb24+PG9wdGlvbj4yNSAwMDA8L29wdGlvbj4KICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgIDwvZGl2PgogICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2siPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImFwcHJvdmUiPiA8c3Bhbj5KZSBjb25maXJtZSBxdWUgY2V0IGFwZXLDp3UgM0QgY29ycmVzcG9uZCDDoCBsYSBwZXJzb25uYWxpc2F0aW9uIHNvdWhhaXTDqWUuPC9zcGFuPjwvbGFiZWw+CiAgICAgICAgPHAgY2xhc3M9ImZpbmUiPkxlcyBjb3VsZXVycyDDoCBsJ8OpY3JhbiBzb250IGluZGljYXRpdmVzLiBMZSBmaWNoaWVyIHNlcmEgdsOpcmlmacOpIGV0IGFqdXN0w6kgYXUgYmVzb2luIHBhciBub3RyZSBzZXJ2aWNlIHByw6lwcmVzc2UgYXZhbnQgaW1wcmVzc2lvbi48L3A+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHByaW1hcnkiIGlkPSJvcmRlciIgdHlwZT0iYnV0dG9uIiBkaXNhYmxlZD5Db250aW51ZXIgdmVycyBsZSBkZXZpczwvYnV0dG9uPgogICAgICA8L3NlY3Rpb24+CiAgICA8L2FzaWRlPgoKICAgIDxtYWluIGNsYXNzPSJzdHVkaW8iPgogICAgICA8c2VjdGlvbiBjbGFzcz0icGFuZWwiIGlkPSJ2aWV3ZXJQYW5lbCI+CiAgICAgICAgPGRpdiBjbGFzcz0icGFuZWwtaGVhZCI+CiAgICAgICAgICA8aDM+QXBlcsOndSAzRDwvaDM+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gc20iIGlkPSJzcGluIiB0eXBlPSJidXR0b24iIGFyaWEtcHJlc3NlZD0idHJ1ZSI+UGF1c2Ugcm90YXRpb248L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHNtIHByaW1hcnkiIGlkPSJhckJ0biIgdHlwZT0iYnV0dG9uIj5Wb2lyIGVuIEFSPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJ2aWV3ZXIiPjxzcGFuIGNsYXNzPSJ2aWV3ZXItaGludCIgaWQ9InZpZXdlckhpbnQiPkdsaXNzZXogc3VyIGxlIGdvYmVsZXQgcG91ciB0b3VybmVyIMK3IHV0aWxpc2V6IGxlcyBjw7R0w6lzIHBvdXIgZMOpZmlsZXI8L3NwYW4+PC9kaXY+CiAgICAgIDwvc2VjdGlvbj4KCiAgICAgIDxzZWN0aW9uIGNsYXNzPSJwYW5lbCI+CiAgICAgICAgPGRpdiBjbGFzcz0icGFuZWwtaGVhZCI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8aDM+w4l2ZW50YWlsIGQnaW1wcmVzc2lvbjwvaDM+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1YiI+TWFxdWV0dGUgZMOpZm9ybcOpZSBhdXRvbWF0aXF1ZW1lbnQgc2Vsb24gbGUgZ2FiYXJpdCAxMiBvejwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gc20iIGlkPSJkbEZhblBuZyIgdHlwZT0iYnV0dG9uIj5QTkcgMzAwIGRwaTwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gc20iIGlkPSJkbEZhblN2ZyIgdHlwZT0iYnV0dG9uIj5TVkcgYXZlYyB0cmFjw6kgZGUgY291cGU8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImZhbi1ib3giPgogICAgICAgICAgPGRpdiBjbGFzcz0iZmFuLXNjcm9sbCI+PGNhbnZhcyBpZD0iZmFuIiB3aWR0aD0iMTQwMCIgaGVpZ2h0PSI3MDAiPjwvY2FudmFzPjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kIj48c3Bhbj48aT48L2k+VHJhY8OpIGRlIGNvdXBlPC9zcGFuPjxzcGFuPjxpIGNsYXNzPSJibGVlZCI+PC9pPkZvbmQgcGVyZHUgMyBtbTwvc3Bhbj48c3Bhbj48aSBjbGFzcz0ic2FmZSI+PC9pPlpvbmUgZGUgc8OpY3VyaXTDqSA0IG1tPC9zcGFuPjxzcGFuPkhhY2h1cmVzIDogcmVjb3V2cmVtZW50IGRlIGNvbGxhZ2U8L3NwYW4+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaW1zIiBpZD0iZmFuRGltcyI+PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvc2VjdGlvbj4KCiAgICAgIDxzZWN0aW9uIGNsYXNzPSJwYW5lbCIgaWQ9InJlY2FwIiBoaWRkZW4+CiAgICAgICAgPGRpdiBjbGFzcz0icGFuZWwtaGVhZCI+PGRpdj48aDM+QWNjdXPDqSBkZSBjb21tYW5kZSAoc2ltdWxhdGlvbik8L2gzPjxkaXYgY2xhc3M9InN1YiIgaWQ9Im9yZGVyTm8iPjwvZGl2PjwvZGl2PjxzcGFuIGNsYXNzPSJwaWxsIG9rIiBpZD0ib3JkZXJQaWxsIj5FbnZvecOpZSBhdSBwcsOpcHJlc3NlPC9zcGFuPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InJlY2FwLWJvZHkiPgogICAgICAgICAgPGZpZ3VyZSBjbGFzcz0idmlld3MiIGlkPSJyZWNhcFZpZXdzIiBhcmlhLWxhYmVsPSJMZXMgNCBjw7R0w6lzIGR1IGdvYmVsZXQgYXBwcm91dsOpIj48L2ZpZ3VyZT4KICAgICAgICAgIDxkbCBpZD0icmVjYXBMaXN0Ij48L2RsPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVhZGxpbmUiIGlkPSJkZWFkbGluZSI+CiAgICAgICAgICAgIDxoND5Bbm51bGF0aW9uIG91IHJlY3RpZmljYXRpb24gPHNwYW4gaWQ9ImNvdW50ZG93biI+PC9zcGFuPjwvaDQ+CiAgICAgICAgICAgIDxwIGlkPSJkZWFkbGluZVRleHQiPjwvcD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVlIj5Ub3V0ZSBhbm51bGF0aW9uIG91IHJlY3RpZmljYXRpb24gZW50cmHDrm5lIHVuZSByZXRlbnVlIGRlIDEwICUgZHUgbW9udGFudCBkZSBsYSBjb21tYW5kZSBwb3VyIGZyYWlzIGRlIHRyYWl0ZW1lbnQuPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyIgaWQ9ImRlYWRsaW5lQWN0aW9ucyI+CiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHNtIiBpZD0iYXNrRml4IiB0eXBlPSJidXR0b24iPkRlbWFuZGVyIHVuZSByZWN0aWZpY2F0aW9uPC9idXR0b24+CiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHNtIGRhbmdlciIgaWQ9ImFza0NhbmNlbCIgdHlwZT0iYnV0dG9uIj5Bbm51bGVyIGxhIGNvbW1hbmRlPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb25maXJtIiBpZD0iY29uZmlybUJveCIgaGlkZGVuPgogICAgICAgICAgICAgIDxwIGlkPSJjb25maXJtVGV4dCI+PC9wPgogICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iZml4Tm90ZSIgcGxhY2Vob2xkZXI9IkTDqWNyaXZleiBsYSBtb2RpZmljYXRpb24gc291aGFpdMOpZSAodGV4dGUsIGNvdWxldXIsIHBvc2l0aW9u4oCmKSIgaGlkZGVuPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBzbSBwcmltYXJ5IiBpZD0iY29uZmlybVllcyIgdHlwZT0iYnV0dG9uIj5Db25maXJtZXI8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBzbSIgaWQ9ImNvbmZpcm1ObyIgdHlwZT0iYnV0dG9uIj5SZXRvdXI8L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9zZWN0aW9uPgogICAgPC9tYWluPgogIDwvZGl2Pgo8L2Rpdj4KCjxkaXYgY2xhc3M9ImFyLW92IiBpZD0iYXJPdiIgaGlkZGVuIHJvbGU9ImRpYWxvZyIgYXJpYS1tb2RhbD0idHJ1ZSIgYXJpYS1sYWJlbGxlZGJ5PSJhclRpdGxlIj4KICA8ZGl2IGNsYXNzPSJhci1ib3giPgogICAgPGRpdiBjbGFzcz0icGFuZWwtaGVhZCI+CiAgICAgIDxkaXY+PGgzIGlkPSJhclRpdGxlIj5Hb2JlbGV0IGVuIHLDqWFsaXTDqSBhdWdtZW50w6llPC9oMz48ZGl2IGNsYXNzPSJzdWIiIGlkPSJhclN1YiI+UHLDqXBhcmF0aW9uIGR1IG1vZMOobGXigKY8L2Rpdj48L2Rpdj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHNtIiBpZD0iYXJDbG9zZSIgdHlwZT0iYnV0dG9uIj5GZXJtZXI8L2J1dHRvbj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iYXItYm9keSI+CiAgICAgIDxwIGNsYXNzPSJmaW5lIj5MZSBnb2JlbGV0IGFwcGFyYcOudCDDoCB0YWlsbGUgcsOpZWxsZSBhdmVjIHZvdHJlIG1hcXVldHRlLiBQb3Nlei1sZSBzdXIgdW5lIHRhYmxlIHBvdXIganVnZXIgZGUgbGEgdGFpbGxlIGR1IGxvZ28gZXQgZGUgbGEgbGlzaWJpbGl0w6kuPC9wPgogICAgICA8ZGl2IGNsYXNzPSJhci1zdGFnZSIgaWQ9ImFyU3RhZ2UiPjwvZGl2PgogICAgICA8cCBjbGFzcz0iYXItbXNnIiBpZD0iYXJNc2ciIGhpZGRlbj48L3A+CiAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHByaW1hcnkiIGlkPSJhckxhdW5jaCIgdHlwZT0iYnV0dG9uIiBkaXNhYmxlZD5PdXZyaXIgbGEgY2Ftw6lyYSBlbiBBUjwvYnV0dG9uPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBzbSIgaWQ9ImFyWmlwIiB0eXBlPSJidXR0b24iIGRpc2FibGVkPlTDqWzDqWNoYXJnZXIgbGVzIGZpY2hpZXJzIEFSPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8cCBjbGFzcz0iZmluZSI+aVBob25lIGV0IGlQYWQgOiBBUiBRdWljayBMb29rLiBBbmRyb2lkIDogQ2hyb21lIGF2ZWMgQVJDb3JlLjwvcD4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KCjxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy90aHJlZS5qcy9yMTI4L3RocmVlLm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3RocmVlQDAuMTI4LjAvZXhhbXBsZXMvanMvY29udHJvbHMvT3JiaXRDb250cm9scy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3RocmVlQDAuMTI4LjAvZXhhbXBsZXMvanMvbGlicy9mZmxhdGUubWluLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vdGhyZWVAMC4xMjguMC9leGFtcGxlcy9qcy9leHBvcnRlcnMvR0xURkV4cG9ydGVyLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vdGhyZWVAMC4xMjguMC9leGFtcGxlcy9qcy9leHBvcnRlcnMvVVNEWkV4cG9ydGVyLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQGdvb2dsZS9tb2RlbC12aWV3ZXJAMy41LjAvZGlzdC9tb2RlbC12aWV3ZXItdW1kLm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQ+CihmdW5jdGlvbiAoKSB7CiAgInVzZSBzdHJpY3QiOwoKICAvKiAtLS0tLS0tLS0tIEZvcm1hdHMgKHVuZSBsaWduZSBwYXIgZm9ybWF0KSAtLS0tLS0tLS0tICovCiAgY29uc3QgRk9STUFUUyA9IHsKICAgICIxMm96IjogeyBsYWJlbDogIjEyIG96IiwgbWw6IDM1NSwgRDogOTAsIGQ6IDYwLCBoOiAxMTAsIGJsZWVkOiAzLCBzYWZlOiA0LCBnbHVlOiA2IH0KICB9OwogIGxldCBjdXAgPSBGT1JNQVRTWyIxMm96Il07CgogIGZ1bmN0aW9uIGdlb20oYykgewogICAgY29uc3QgcjEgPSBjLkQgLyAyLCByMiA9IGMuZCAvIDIsIGRyID0gcjEgLSByMjsKICAgIGNvbnN0IHMgPSBNYXRoLmh5cG90KGMuaCwgZHIpOyAgICAgICAgICAgLy8gZ8OpbsOpcmF0cmljZSAoaGF1dGV1ciBpbXByaW3DqWUgcsOpZWxsZSkKICAgIGNvbnN0IFJvID0gcyAqIHIxIC8gZHI7ICAgICAgICAgICAgICAgICAgLy8gcmF5b24gZXh0w6lyaWV1ciBkZSBsJ8OpdmVudGFpbAogICAgY29uc3QgUmkgPSBSbyAtIHM7ICAgICAgICAgICAgICAgICAgICAgICAvLyByYXlvbiBpbnTDqXJpZXVyCiAgICBjb25zdCB0aCA9IDIgKiBNYXRoLlBJICogcjEgLyBSbzsgICAgICAgIC8vIGFuZ2xlIGQnb3V2ZXJ0dXJlIChyYWQpCiAgICBjb25zdCBXID0gMiAqIE1hdGguUEkgKiByMTsgICAgICAgICAgICAgIC8vIGxhcmdldXIgZHUgcmVjdGFuZ2xlIChjaXJjb25mw6lyZW5jZSBkdSBoYXV0KQogICAgcmV0dXJuIHsgcjEsIHIyLCBzLCBSbywgUmksIHRoLCBXLCBIOiBzIH07CiAgfQogIGxldCBHID0gZ2VvbShjdXApOwoKICAvKiBEw6lmb3JtYXRpb24gOiAic3RhbmRhcmQiIChyZWN0YW5nbGUgw6l0aXLDqSBlbiBoYXV0ZXVyKSBvdSAiY29uZm9ybWUiIChsZXMgZm9ybWVzIHNvbnQgcHLDqXNlcnbDqWVzIDoKICAgICBhbmdsZSA9IFggLyBybSwgcmF5b24gPSBSbyDCtyBleHAoLVkgLyBybSksIMOpY2hlbGxlIDE6MSDDoCBtaS1oYXV0ZXVyLCBybSA9IG1veWVubmUgZ8Opb23DqXRyaXF1ZSBkZXMgcmF5b25zKSAqLwogIGxldCB3YXJwTW9kZSA9ICJzdGFuZGFyZCI7CiAgZnVuY3Rpb24gdHBsKCkgewogICAgaWYgKHdhcnBNb2RlID09PSAic3RhbmRhcmQiKSByZXR1cm4geyBXOiBHLlcsIEg6IEcuSCB9OwogICAgY29uc3Qgcm0gPSBNYXRoLnNxcnQoRy5SbyAqIEcuUmkpOwogICAgcmV0dXJuIHsgVzogRy50aCAqIHJtLCBIOiBybSAqIE1hdGgubG9nKEcuUm8gLyBHLlJpKSwgcm0gfTsKICB9CiAgLy8gcG9zaXRpb24gdmVydGljYWxlIGRhbnMgbGEgbWFxdWV0dGUgKDAgPSBoYXV0LCAxID0gYmFzKSBwb3VyIHVuIHJheW9uIGRvbm7DqSBkZSBsJ8OpdmVudGFpbAogIGZ1bmN0aW9uIHZPZlJhZGl1cyhyKSB7IHJldHVybiB3YXJwTW9kZSA9PT0gInN0YW5kYXJkIiA\/IChHLlJvIC0gcikgLyBHLnMgOiBNYXRoLmxvZyhHLlJvIC8gcikgLyBNYXRoLmxvZyhHLlJvIC8gRy5SaSk7IH0KCiAgY29uc3QgZm10ID0gKHYsIG4gPSAxKSA9PiB2LnRvTG9jYWxlU3RyaW5nKCJmci1DQSIsIHsgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBuLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IG4gfSk7CgogIC8qIC0tLS0tLS0tLS0gUGFudG9uZSAoYXBwcm94aW1hdGlvbnMgw6ljcmFuLCBjb2F0ZWQpIC0tLS0tLS0tLS0gKi8KICBjb25zdCBQQU5UT05FID0gWwogICAgWyJCbGFjayBDIiwgIiMyRDI5MjYiXSwgWyJDb29sIEdyYXkgMTEgQyIsICIjNTM1NjVBIl0sIFsiQ29vbCBHcmF5IDcgQyIsICIjOTc5OTlCIl0sCiAgICBbIjE4NiBDIiwgIiNDODEwMkUiXSwgWyIxODUgQyIsICIjRTQwMDJCIl0sIFsiMDMyIEMiLCAiI0VGMzM0MCJdLCBbIjc2MjEgQyIsICIjQUIyMzI4Il0sIFsiMTc5NSBDIiwgIiNEMjI2MzAiXSwKICAgIFsiMDIxIEMiLCAiI0ZFNTAwMCJdLCBbIjE1MSBDIiwgIiNGRjgyMDAiXSwgWyIxMjM1IEMiLCAiI0ZGQjgxQyJdLCBbIjExNiBDIiwgIiNGRkNEMDAiXSwgWyJZZWxsb3cgQyIsICIjRkVERDAwIl0sCiAgICBbIjM3NiBDIiwgIiM4NEJEMDAiXSwgWyIzNTUgQyIsICIjMDA5NjM5Il0sIFsiMzQ4IEMiLCAiIzAwODQzRCJdLCBbIjc3NDEgQyIsICIjNDQ4ODNFIl0sIFsiMzQyNSBDIiwgIiMwMDYzNDEiXSwgWyI1NTM1IEMiLCAiIzE4MzAyOCJdLAogICAgWyIzMTEgQyIsICIjMDVDM0RFIl0sIFsiUHJvY2VzcyBCbHVlIEMiLCAiIzAwODVDQSJdLCBbIjMwMDUgQyIsICIjMDA3N0M4Il0sIFsiMzAwIEMiLCAiIzAwNUVCOCJdLCBbIjI5NDUgQyIsICIjMDA0Qzk3Il0sCiAgICBbIjI4NiBDIiwgIiMwMDMzQTAiXSwgWyI3NDY5IEMiLCAiIzAwNUY4NiJdLCBbIjI4MiBDIiwgIiMwNDFFNDIiXSwgWyIyNjYgQyIsICIjNzUzQkJEIl0sIFsiMjY4NSBDIiwgIiMzMzAwNzIiXSwKICAgIFsiMjE5IEMiLCAiI0RBMTg4NCJdLCBbIlJob2RhbWluZSBSZWQgQyIsICIjRTEwMDk4Il0sIFsiNDY1IEMiLCAiI0I5OTc1QiJdLCBbIjc1MDMgQyIsICIjQTg5OTY4Il0sCiAgICBbIjQ2OSBDIiwgIiM2OTNGMjMiXSwgWyI0NjI1IEMiLCAiIzRGMkMxRCJdLCBbIjc1MTYgQyIsICIjOUEzMzI0Il0KICBdOwogIGZ1bmN0aW9uIGhleFRvUmdiKGgpIHsgY29uc3QgbiA9IHBhcnNlSW50KGguc2xpY2UoMSksIDE2KTsgcmV0dXJuIFtuID4+IDE2ICYgMjU1LCBuID4+IDggJiAyNTUsIG4gJiAyNTVdOyB9CiAgZnVuY3Rpb24gcmdiVG9IZXgoYykgeyByZXR1cm4gIiMiICsgYy5tYXAodiA9PiBNYXRoLnJvdW5kKHYpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAiMCIpKS5qb2luKCIiKS50b1VwcGVyQ2FzZSgpOyB9CiAgZnVuY3Rpb24gdG9MYWIoW3IsIGcsIGJdKSB7CiAgICBjb25zdCBmID0gdiA9PiB7IHYgLz0gMjU1OyByZXR1cm4gdiA8PSAwLjA0MDQ1ID8gdiAvIDEyLjkyIDogTWF0aC5wb3coKHYgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTsgfTsKICAgIGNvbnN0IFIgPSBmKHIpLCBHYyA9IGYoZyksIEIgPSBmKGIpOwogICAgbGV0IHggPSAoUiAqIDAuNDEyNCArIEdjICogMC4zNTc2ICsgQiAqIDAuMTgwNSkgLyAwLjk1MDQ3LCB5ID0gUiAqIDAuMjEyNiArIEdjICogMC43MTUyICsgQiAqIDAuMDcyMiwgeiA9IChSICogMC4wMTkzICsgR2MgKiAwLjExOTIgKyBCICogMC45NTA1KSAvIDEuMDg4ODM7CiAgICBjb25zdCB0ID0gdiA9PiB2ID4gMC4wMDg4NTYgPyBNYXRoLmNicnQodikgOiA3Ljc4NyAqIHYgKyAxNiAvIDExNjsKICAgIHggPSB0KHgpOyB5ID0gdCh5KTsgeiA9IHQoeik7CiAgICByZXR1cm4gWzExNiAqIHkgLSAxNiwgNTAwICogKHggLSB5KSwgMjAwICogKHkgLSB6KV07CiAgfQogIGNvbnN0IFBBTlRPTkVfTEFCID0gUEFOVE9ORS5tYXAoKFtuLCBoXSkgPT4gKHsgbiwgaCwgbGFiOiB0b0xhYihoZXhUb1JnYihoKSkgfSkpOwogIGZ1bmN0aW9uIG5lYXJlc3RQYW50b25lKHJnYikgewogICAgY29uc3QgTCA9IHRvTGFiKHJnYik7IGxldCBiZXN0ID0gbnVsbCwgYmQgPSBJbmZpbml0eTsKICAgIGZvciAoY29uc3QgcCBvZiBQQU5UT05FX0xBQikgeyBjb25zdCBkID0gTWF0aC5oeXBvdChMWzBdIC0gcC5sYWJbMF0sIExbMV0gLSBwLmxhYlsxXSwgTFsyXSAtIHAubGFiWzJdKTsgaWYgKGQgPCBiZCkgeyBiZCA9IGQ7IGJlc3QgPSBwOyB9IH0KICAgIHJldHVybiB7IG5hbWU6ICJQQU5UT05FICIgKyBiZXN0Lm4sIGhleDogYmVzdC5oLCBkRTogYmQgfTsKICB9CgogIC8qIC0tLS0tLS0tLS0gTWFxdWV0dGUgKGNhbnZhcyByZWN0YW5ndWxhaXJlIGRlIHLDqWbDqXJlbmNlKSAtLS0tLS0tLS0tICovCiAgY29uc3QgQVcgPSAyNDAwOwogIGxldCBBSCA9IE1hdGgucm91bmQoQVcgKiB0cGwoKS5IIC8gdHBsKCkuVyk7CiAgY29uc3Qgb3JpZ2luYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICBjb25zdCBhcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICBvcmlnaW5hbC53aWR0aCA9IGFydC53aWR0aCA9IEFXOyBvcmlnaW5hbC5oZWlnaHQgPSBhcnQuaGVpZ2h0ID0gQUg7CiAgbGV0IHNvdXJjZUluZm8gPSB7IG5hbWU6ICJHb2JlbGV0IGJsYW5jIHZpZXJnZSIsIHB4VzogbnVsbCwgdmVjdG9yOiB0cnVlLCByYXRpbzogKEFXIC8gMikgLyBBSCB9OwogIGxldCB1cGxvYWRlZEZpbGUgPSBudWxsOwogIGxldCBhbmFseXNpcyA9IG51bGw7IGxldCBsaW1pdCA9IDA7IGxldCBwb3N0ZXJQYWxldHRlID0gbnVsbDsKCiAgLyogRm9uZCBibGFuYyBwYXIgZMOpZmF1dCBhdSBjaGFyZ2VtZW50ICovCiAgY29uc3Qgc2FtcGxlQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CiAgZnVuY3Rpb24gZHJhd1NhbXBsZSgpIHsKICAgIGNvbnN0IFcgPSBzYW1wbGVDYW52YXMud2lkdGggPSBBVywgSCA9IHNhbXBsZUNhbnZhcy5oZWlnaHQgPSBBSDsKICAgIGNvbnN0IGMgPSBzYW1wbGVDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGMuY2xlYXJSZWN0KDAsIDAsIFcsIEgpOwogICAgYy5maWxsU3R5bGUgPSAiI0ZGRkZGRiI7CiAgICBjLmZpbGxSZWN0KDAsIDAsIFcsIEgpOwogIH0KCiAgLyogLS0tLS0tLS0tLSBQb3NlcyA6IHLDqXDDqXRpdGlvbiBkZSBsYSBtYXF1ZXR0ZSBzdXIgbGUgZ2FiYXJpdCAtLS0tLS0tLS0tICovCiAgbGV0IHNyY0ltZyA9IHNhbXBsZUNhbnZhcywgc3JjVyA9IEFXLCBzcmNIID0gQUg7CiAgbGV0IHBvc2VzID0geyBueDogMSwgbnk6IDEsIGtlZXA6IHRydWUgfTsKICBmdW5jdGlvbiBjb21wb3NlKCkgewogICAgY29uc3QgYyA9IG9yaWdpbmFsLmdldENvbnRleHQoIjJkIik7CiAgICBjLmZpbGxTdHlsZSA9ICIjRkZGRkZGIjsgYy5maWxsUmVjdCgwLCAwLCBBVywgQUgpOwogICAgY29uc3QgY3cgPSBBVyAvIHBvc2VzLm54LCBjaCA9IEFIIC8gcG9zZXMubnk7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHBvc2VzLm55OyBqKyspIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zZXMubng7IGkrKykgewogICAgICBpZiAocG9zZXMua2VlcCkgewogICAgICAgIGNvbnN0IHNjID0gTWF0aC5taW4oY3cgLyBzcmNXLCBjaCAvIHNyY0gpLCB3ID0gc3JjVyAqIHNjLCBoID0gc3JjSCAqIHNjOwogICAgICAgIGMuZHJhd0ltYWdlKHNyY0ltZywgaSAqIGN3ICsgKGN3IC0gdykgLyAyLCBqICogY2ggKyAoY2ggLSBoKSAvIDIsIHcsIGgpOwogICAgICB9IGVsc2UgYy5kcmF3SW1hZ2Uoc3JjSW1nLCBpICogY3csIGogKiBjaCwgY3csIGNoKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gY2VsbE1tKCkgeyBjb25zdCBUID0gdHBsKCk7IHJldHVybiB7IHc6IFQuVyAvIHBvc2VzLm54LCBoOiBULkggLyBwb3Nlcy5ueSB9OyB9CiAgZnVuY3Rpb24gcmVuZGVyUG9zZUluZm8oKSB7CiAgICBjb25zdCBtID0gY2VsbE1tKCk7CiAgICAkKCJwb3NlSW5mbyIpLnRleHRDb250ZW50ID0gYENoYXF1ZSBwb3NlIDogJHtmbXQobS53KX0gw5cgJHtmbXQobS5oKX0gbW0gwrcgJHtwb3Nlcy5ueCAqIHBvc2VzLm55fSBwb3NlJHtwb3Nlcy5ueCAqIHBvc2VzLm55ID4gMSA\/ICJzIiA6ICIifSBhdSB0b3RhbGA7CiAgfQogIGZ1bmN0aW9uIHNldFBvc2VzKG54LCBueSkgeyBwb3Nlcy5ueCA9IG54OyBwb3Nlcy5ueSA9IG55OyAkKCJwb3Nlc1giKS52YWx1ZSA9IG54OyAkKCJwb3Nlc1kiKS52YWx1ZSA9IG55OyB9CgogIGZ1bmN0aW9uIGxvYWRJbWFnZVRvT3JpZ2luYWwoaW1nLCBpbmZvKSB7CiAgICBzcmNJbWcgPSBpbWc7IHNyY1cgPSBpbmZvLnB4Vzsgc3JjSCA9IGluZm8ucHhXIC8gaW5mby5yYXRpbzsKICAgIHNldFBvc2VzKDEsIDEpOwogICAgc291cmNlSW5mbyA9IGluZm87CiAgICBsaW1pdCA9IDA7IHNldFNlZygwKTsKICAgIHJlZnJlc2hBbGwoKTsKICB9CgogIC8qIC0tLS0tLS0tLS0gQW5hbHlzZSBkZXMgY291bGV1cnMgKGstbWVhbnMgc3VyIMOpY2hhbnRpbGxvbikgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIGFuYWx5emUoY2FudmFzKSB7CiAgICBjb25zdCBzdyA9IDI0MCwgc2ggPSBNYXRoLnJvdW5kKHN3ICogY2FudmFzLmhlaWdodCAvIGNhbnZhcy53aWR0aCk7CiAgICBjb25zdCB0bXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsgdG1wLndpZHRoID0gc3c7IHRtcC5oZWlnaHQgPSBzaDsKICAgIGNvbnN0IHQgPSB0bXAuZ2V0Q29udGV4dCgiMmQiKTsgdC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTsgdC5kcmF3SW1hZ2UoY2FudmFzLCAwLCAwLCBzdywgc2gpOwogICAgY29uc3QgZCA9IHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIHN3LCBzaCkuZGF0YTsKICAgIGNvbnN0IHB0cyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkLmxlbmd0aDsgaSArPSA0KSBwdHMucHVzaChkW2kgKyAzXSA8IDEyOCA\/IFsyNTUsIDI1NSwgMjU1XSA6IFtkW2ldLCBkW2kgKyAxXSwgZFtpICsgMl1dKTsKICAgIGNvbnN0IGsgPSAxMDsgbGV0IGNlbnRzID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGs7IGkrKykgY2VudHMucHVzaChwdHNbTWF0aC5mbG9vcigoaSArIDAuNSkgKiBwdHMubGVuZ3RoIC8gayldLnNsaWNlKCkpOwogICAgLy8gaW5pdCBwbHVzIHJvYnVzdGUgOiBtYXgtZGlzdGFuY2UKICAgIGNlbnRzID0gW3B0c1swXS5zbGljZSgpXTsKICAgIHdoaWxlIChjZW50cy5sZW5ndGggPCBrKSB7CiAgICAgIGxldCBiaSA9IDAsIGJkID0gLTE7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSArPSA3KSB7IGxldCBtID0gSW5maW5pdHk7IGZvciAoY29uc3QgYyBvZiBjZW50cykgeyBjb25zdCBkZCA9IChwdHNbaV1bMF0gLSBjWzBdKSAqKiAyICsgKHB0c1tpXVsxXSAtIGNbMV0pICoqIDIgKyAocHRzW2ldWzJdIC0gY1syXSkgKiogMjsgaWYgKGRkIDwgbSkgbSA9IGRkOyB9IGlmIChtID4gYmQpIHsgYmQgPSBtOyBiaSA9IGk7IH0gfQogICAgICBjZW50cy5wdXNoKHB0c1tiaV0uc2xpY2UoKSk7CiAgICB9CiAgICBsZXQgYXNzaWduID0gbmV3IEFycmF5KHB0cy5sZW5ndGgpLmZpbGwoMCk7CiAgICBmb3IgKGxldCBpdCA9IDA7IGl0IDwgMTI7IGl0KyspIHsKICAgICAgY29uc3Qgc3VtID0gY2VudHMubWFwKCgpID0+IFswLCAwLCAwLCAwXSk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IG0gPSBJbmZpbml0eSwgbWkgPSAwOyBjb25zdCBwID0gcHRzW2ldOwogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2VudHMubGVuZ3RoOyBqKyspIHsgY29uc3QgYyA9IGNlbnRzW2pdOyBjb25zdCBkZCA9IChwWzBdIC0gY1swXSkgKiogMiArIChwWzFdIC0gY1sxXSkgKiogMiArIChwWzJdIC0gY1syXSkgKiogMjsgaWYgKGRkIDwgbSkgeyBtID0gZGQ7IG1pID0gajsgfSB9CiAgICAgICAgYXNzaWduW2ldID0gbWk7IGNvbnN0IHMgPSBzdW1bbWldOyBzWzBdICs9IHBbMF07IHNbMV0gKz0gcFsxXTsgc1syXSArPSBwWzJdOyBzWzNdKys7CiAgICAgIH0KICAgICAgY2VudHMgPSBjZW50cy5tYXAoKGMsIGopID0+IHN1bVtqXVszXSA\/IFtzdW1bal1bMF0gLyBzdW1bal1bM10sIHN1bVtqXVsxXSAvIHN1bVtqXVszXSwgc3VtW2pdWzJdIC8gc3VtW2pdWzNdXSA6IGMpOwogICAgfQogICAgbGV0IGNsdXN0ZXJzID0gY2VudHMubWFwKChjLCBqKSA9PiAoeyByZ2I6IGMsIG46IDAgfSkpOwogICAgZm9yIChjb25zdCBhIG9mIGFzc2lnbikgY2x1c3RlcnNbYV0ubisrOwogICAgY2x1c3RlcnMgPSBjbHVzdGVycy5maWx0ZXIoYyA9PiBjLm4gPiAwKTsKICAgIC8vIGZ1c2lvbiBkZXMgdGVpbnRlcyBwcm9jaGVzIChhbnRpY3LDqW5lbGFnZSwgZMOpZ3JhZMOpcyBsw6lnZXJzKQogICAgY2x1c3RlcnMuc29ydCgoYSwgYikgPT4gYi5uIC0gYS5uKTsKICAgIGNvbnN0IG1lcmdlZCA9IFtdOwogICAgZm9yIChjb25zdCBjIG9mIGNsdXN0ZXJzKSB7CiAgICAgIGNvbnN0IEwgPSB0b0xhYihjLnJnYik7CiAgICAgIGNvbnN0IGhpdCA9IG1lcmdlZC5maW5kKG0gPT4geyBjb25zdCBNID0gdG9MYWIobS5yZ2IpOyByZXR1cm4gTWF0aC5oeXBvdChMWzBdIC0gTVswXSwgTFsxXSAtIE1bMV0sIExbMl0gLSBNWzJdKSA8IDE4OyB9KTsKICAgICAgaWYgKGhpdCkgaGl0Lm4gKz0gYy5uOyBlbHNlIG1lcmdlZC5wdXNoKHsgcmdiOiBjLnJnYiwgbjogYy5uIH0pOwogICAgfQogICAgY29uc3QgdG90YWwgPSBwdHMubGVuZ3RoOwogICAgY29uc3QgaXNQYXBlciA9IHJnYiA9PiByZ2JbMF0gPiAyMzIgJiYgcmdiWzFdID4gMjMyICYmIHJnYlsyXSA+IDIzMjsKICAgIGNvbnN0IGFsbCA9IG1lcmdlZC5tYXAoYyA9PiAoeyAuLi5jLCBzaGFyZTogYy5uIC8gdG90YWwsIHBhcGVyOiBpc1BhcGVyKGMucmdiKSB9KSk7CiAgICBjb25zdCBpbmtzID0gYWxsLmZpbHRlcihjID0+ICFjLnBhcGVyICYmIGMuc2hhcmUgPj0gMC4wMTIpLnNvcnQoKGEsIGIpID0+IGIuc2hhcmUgLSBhLnNoYXJlKTsKICAgIGNvbnN0IHBhcGVyID0gYWxsLnNvbWUoYyA9PiBjLnBhcGVyICYmIGMuc2hhcmUgPiAwLjAxKTsKICAgIHJldHVybiB7IGlua3MsIHBhcGVyIH07CiAgfQoKICBmdW5jdGlvbiBwb3N0ZXJpemUobikgewogICAgY29uc3Qgc3JjID0gb3JpZ2luYWwuZ2V0Q29udGV4dCgiMmQiKS5nZXRJbWFnZURhdGEoMCwgMCwgQVcsIEFIKTsKICAgIGNvbnN0IGJhc2UgPSBhbmFseXNpczAuaW5rcy5zbGljZSgwLCBuKS5tYXAoYyA9PiBjLnJnYik7CiAgICBjb25zdCBwYWwgPSBhbmFseXNpczAucGFwZXIgPyBiYXNlLmNvbmNhdChbWzI1NSwgMjU1LCAyNTVdXSkgOiBiYXNlOwogICAgaWYgKCFwYWwubGVuZ3RoKSByZXR1cm47CiAgICBjb25zdCBkID0gc3JjLmRhdGE7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGQubGVuZ3RoOyBpICs9IDQpIHsKICAgICAgbGV0IG0gPSBJbmZpbml0eSwgYmVzdCA9IHBhbFswXTsKICAgICAgZm9yIChjb25zdCBwIG9mIHBhbCkgeyBjb25zdCBkZCA9IChkW2ldIC0gcFswXSkgKiogMiArIChkW2kgKyAxXSAtIHBbMV0pICoqIDIgKyAoZFtpICsgMl0gLSBwWzJdKSAqKiAyOyBpZiAoZGQgPCBtKSB7IG0gPSBkZDsgYmVzdCA9IHA7IH0gfQogICAgICBkW2ldID0gYmVzdFswXTsgZFtpICsgMV0gPSBiZXN0WzFdOyBkW2kgKyAyXSA9IGJlc3RbMl07IGRbaSArIDNdID0gMjU1OwogICAgfQogICAgYXJ0LmdldENvbnRleHQoIjJkIikucHV0SW1hZ2VEYXRhKHNyYywgMCwgMCk7CiAgfQoKICBsZXQgYW5hbHlzaXMwID0gbnVsbDsKICBmdW5jdGlvbiByZWZyZXNoQWxsKCkgewogICAgY29tcG9zZSgpOyByZW5kZXJQb3NlSW5mbygpOwogICAgYW5hbHlzaXMwID0gYW5hbHl6ZShvcmlnaW5hbCk7CiAgICBpZiAobGltaXQgPiAwICYmIGFuYWx5c2lzMC5pbmtzLmxlbmd0aCA+IGxpbWl0KSB7IHBvc3Rlcml6ZShsaW1pdCk7IGFuYWx5c2lzID0gYW5hbHl6ZShhcnQpOyB9CiAgICBlbHNlIHsgY29uc3QgYyA9IGFydC5nZXRDb250ZXh0KCIyZCIpOyBjLmNsZWFyUmVjdCgwLCAwLCBBVywgQUgpOyBjLmRyYXdJbWFnZShvcmlnaW5hbCwgMCwgMCk7IGFuYWx5c2lzID0gYW5hbHlzaXMwOyB9CiAgICByZW5kZXJDaGVja3MoKTsgcmVuZGVySW5rcygpOyB1cGRhdGVUZXh0dXJlKCk7IHJlbmRlckZhbihmYW5DYW52YXMsIG51bGwsIHRydWUpOwogIH0KCiAgLyogLS0tLS0tLS0tLSBVSSA6IMOpdGFwZXMgLS0tLS0tLS0tLSAqLwogIGNvbnN0ICQgPSBpZCA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7ICBmdW5jdGlvbiByZW5kZXJTcGVjcygpIHsKICAgIGNvbnN0IFQgPSB0cGwoKTsKICAgICQoInNwZWNzIikuaW5uZXJIVE1MID0gYDxkaXY+PHNwYW4+w5ggaGF1dDwvc3Bhbj48Yj4ke2N1cC5EfSBtbTwvYj48L2Rpdj48ZGl2PjxzcGFuPsOYIGJhczwvc3Bhbj48Yj4ke2N1cC5kfSBtbTwvYj48L2Rpdj48ZGl2PjxzcGFuPkhhdXRldXI8L3NwYW4+PGI+JHtjdXAuaH0gbW08L2I+PC9kaXY+YDsKICAgICQoInJlY3REaW1zIikuaW5uZXJIVE1MID0gYAogICAgICA8ZGl2PjxiPiR7Zm10KFQuVyl9IMOXICR7Zm10KFQuSCl9IG1tPC9iPjxzcGFuPlpvbmUgdXRpbGU8L3NwYW4+PC9kaXY+CiAgICAgIDxkaXY+PGI+JHtmbXQoVC5XICsgMiAqIGN1cC5ibGVlZCl9IMOXICR7Zm10KFQuSCArIDIgKiBjdXAuYmxlZWQpfSBtbTwvYj48c3Bhbj5BdmVjIGZvbmQgcGVyZHUgJHtjdXAuYmxlZWR9IG1tPC9zcGFuPjwvZGl2PgogICAgICA8ZGl2PjxiPiR7TWF0aC5yb3VuZChULlcgLyAyNS40ICogMzAwKX0gw5cgJHtNYXRoLnJvdW5kKFQuSCAvIDI1LjQgKiAzMDApfSBweDwvYj48c3Bhbj5JbWFnZSDDoCAzMDAgZHBpPC9zcGFuPjwvZGl2PmA7CiAgICAkKCJ3YXJwSGludCIpLnRleHRDb250ZW50ID0gd2FycE1vZGUgPT09ICJzdGFuZGFyZCIKICAgICAgPyBgTGEgbWFxdWV0dGUgY291dnJlIHRvdXRlIGxhIGhhdXRldXIgZHUgZ29iZWxldC4gVmVycyBsZSBiYXMsIGxlcyDDqWzDqW1lbnRzIHNlIHJlc3NlcnJlbnQgZW4gbGFyZ2V1ciAoanVzcXUnw6AgJHtmbXQoRy5SaSAvIEcuUm8gKiAxMDAsIDApfSAlKSA6IHVuIGNlcmNsZSBkZXZpZW50IG92YWxlLmAKICAgICAgOiBgVW4gY2VyY2xlIHJlc3RlIHVuIGNlcmNsZS4gTGVzIMOpbMOpbWVudHMgZ2FyZGVudCBsZXVyIGZvcm1lIG1haXMgY2hhbmdlbnQgZGUgdGFpbGxlIDogJHtmbXQoRy5SbyAvIFQucm0gKiAxMDAsIDApfSAlIGVuIGhhdXQsIDEwMCAlIMOgIG1pLWhhdXRldXIsICR7Zm10KEcuUmkgLyBULnJtICogMTAwLCAwKX0gJSBlbiBiYXMuYDsKICAgICQoImZhbkRpbXMiKS5pbm5lckhUTUwgPSBgCiAgICAgIDxkaXY+PGI+JHtmbXQoRy5Sbyl9IG1tPC9iPjxzcGFuPlJheW9uIGV4dMOpcmlldXI8L3NwYW4+PC9kaXY+CiAgICAgIDxkaXY+PGI+JHtmbXQoRy5SaSl9IG1tPC9iPjxzcGFuPlJheW9uIGludMOpcmlldXI8L3NwYW4+PC9kaXY+CiAgICAgIDxkaXY+PGI+JHtmbXQoRy50aCAqIDE4MCAvIE1hdGguUEksIDIpfcKwPC9iPjxzcGFuPkFuZ2xlIGQnb3V2ZXJ0dXJlPC9zcGFuPjwvZGl2PgogICAgICA8ZGl2PjxiPiR7Zm10KEcucyl9IG1tPC9iPjxzcGFuPkhhdXRldXIgZMOpdmVsb3Bww6llPC9zcGFuPjwvZGl2PgogICAgICA8ZGl2PjxiPiR7Y3VwLmdsdWV9IG1tPC9iPjxzcGFuPlJlY291dnJlbWVudCBkZSBjb2xsYWdlPC9zcGFuPjwvZGl2PmA7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJDaGVja3MoKSB7CiAgICBjb25zdCBvdXQgPSBbXTsKICAgIGNvbnN0IGNtID0gY2VsbE1tKCk7CiAgICBjb25zdCByID0gc291cmNlSW5mby5yYXRpbywgdGFyZ2V0ID0gY20udyAvIGNtLmgsIGRldiA9IE1hdGguYWJzKHIgLyB0YXJnZXQgLSAxKTsKICAgIGlmIChkZXYgPiAwLjAzKSBvdXQucHVzaChbIndhcm4iLCBwb3Nlcy5rZWVwCiAgICAgID8gYFByb3BvcnRpb25zICR7Zm10KHIsIDIpfToxIGF1IGxpZXUgZGUgJHtmbXQodGFyZ2V0LCAyKX06MSBwYXIgcG9zZS4gRGVzIG1hcmdlcyBibGFuY2hlcyBjb21wbMOodGVudCBjaGFxdWUgcG9zZS5gCiAgICAgIDogYFByb3BvcnRpb25zICR7Zm10KHIsIDIpfToxIGF1IGxpZXUgZGUgJHtmbXQodGFyZ2V0LCAyKX06MSBwYXIgcG9zZS4gTGEgbWFxdWV0dGUgZXN0IMOpdGlyw6llLmBdKTsKICAgIGVsc2Ugb3V0LnB1c2goWyJvayIsICJQcm9wb3J0aW9ucyBjb25mb3JtZXMgw6AgbGEgcG9zZS4iXSk7CiAgICBpZiAoc291cmNlSW5mby52ZWN0b3IpIG91dC5wdXNoKFsib2siLCAiRmljaGllciB2ZWN0b3JpZWwgb3UgZXhlbXBsZSA6IHLDqXNvbHV0aW9uIG5vbiBsaW1pdGFudGUuIl0pOwogICAgZWxzZSB7CiAgICAgIGNvbnN0IGRwaSA9IE1hdGgucm91bmQoc291cmNlSW5mby5weFcgLyAoY20udyAvIDI1LjQpKTsKICAgICAgb3V0LnB1c2goZHBpID49IDMwMCA\/IFsib2siLCBgUsOpc29sdXRpb24gJHtkcGl9IGRwaSDDoCB0YWlsbGUgcsOpZWxsZS5gXSA6IFsid2FybiIsIGBSw6lzb2x1dGlvbiAke2RwaX0gZHBpIMOgIHRhaWxsZSByw6llbGxlLiAzMDAgZHBpIHJlY29tbWFuZMOpcy5gXSk7CiAgICB9CiAgICBjb25zdCBuID0gYW5hbHlzaXMuaW5rcy5sZW5ndGg7CiAgICBvdXQucHVzaChuIDw9IDQgPyBbIm9rIiwgYCR7bn0gY291bGV1ciR7biA+IDEgPyAicyIgOiAiIn0gZCdlbmNyZSBkw6l0ZWN0w6llJHtuID4gMSA\/ICJzIiA6ICIifS5gXSA6IFsid2FybiIsIGAke259IGNvdWxldXJzIGTDqXRlY3TDqWVzIDogbWF4aW11bSA0LiBVdGlsaXNleiDCqyBMaW1pdGVyIMOgIMK7IG91IGxlIHByw6lwcmVzc2Ugc2ltcGxpZmllcmEuYF0pOwogICAgJCgiY2hlY2tzIikuaW5uZXJIVE1MID0gb3V0Lm1hcCgoW2ssIHRdKSA9PiBgPGRpdiBjbGFzcz0ibm90ZSAke2t9Ij4ke3R9PC9kaXY+YCkuam9pbigiIik7CiAgfQoKICBjb25zdCBwYW50b25lT3ZlcnJpZGVzID0ge307CiAgZnVuY3Rpb24gcmVuZGVySW5rcygpIHsKICAgIGNvbnN0IG4gPSBhbmFseXNpcy5pbmtzLmxlbmd0aDsKICAgICQoImlua0NvdW50IikuaW5uZXJIVE1MID0gYCR7bn0gPHNtYWxsPmNvdWxldXIke24gPiAxID8gInMiIDogIiJ9PC9zbWFsbD5gOwogICAgY29uc3QgcGlsbCA9ICQoImlua1BpbGwiKTsKICAgIHBpbGwuY2xhc3NOYW1lID0gInBpbGwgIiArIChuIDw9IDQgPyAib2siIDogIndhcm4iKTsKICAgIHBpbGwudGV4dENvbnRlbnQgPSBuIDw9IDQgPyAobiA8PSAyID8gIsOJY29ub21pcXVlIiA6ICJDb25mb3JtZSIpIDogIlRyb3AgZGUgY291bGV1cnMiOwogICAgJCgiaW5rcyIpLmlubmVySFRNTCA9IGFuYWx5c2lzLmlua3Muc2xpY2UoMCwgOCkubWFwKChjLCBpKSA9PiB7CiAgICAgIGNvbnN0IGhleCA9IHJnYlRvSGV4KGMucmdiKSwgcCA9IG5lYXJlc3RQYW50b25lKGMucmdiKTsKICAgICAgY29uc3QgdmFsID0gcGFudG9uZU92ZXJyaWRlc1tpXSA\/PyBwLm5hbWU7CiAgICAgIHJldHVybiBgPGRpdiBjbGFzcz0iaW5rIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzdyIgc3R5bGU9ImJhY2tncm91bmQ6JHtoZXh9Ij48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtZXRhIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImwxIj48c3Bhbj4ke2hleH0gwrcgJHtmbXQoYy5zaGFyZSAqIDEwMCwgMCl9ICU8L3NwYW4+PHNwYW4gdGl0bGU9IlBhc3RpbGxlIFBhbnRvbmUgc3VnZ8OpcsOpZSIgc3R5bGU9ImRpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo1cHgiPjxpIHN0eWxlPSJ3aWR0aDoxMXB4O2hlaWdodDoxMXB4O2JvcmRlci1yYWRpdXM6M3B4O2JhY2tncm91bmQ6JHtwLmhleH07ZGlzcGxheTppbmxpbmUtYmxvY2siPjwvaT7OlEUgJHtmbXQocC5kRSwgMCl9PC9zcGFuPjwvZGl2PgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwbXMtJHtpfSIgZGF0YS1pPSIke2l9IiB2YWx1ZT0iJHt2YWx9IiBhcmlhLWxhYmVsPSJSw6lmw6lyZW5jZSBQYW50b25lIGNvdWxldXIgJHtpICsgMX0iPgogICAgICAgIDwvZGl2PjwvZGl2PmA7CiAgICB9KS5qb2luKCIiKTsKICAgICQoImlua3MiKS5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dCIpLmZvckVhY2goaW5wID0+IGlucC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGUgPT4geyBwYW50b25lT3ZlcnJpZGVzW2UudGFyZ2V0LmRhdGFzZXQuaV0gPSBlLnRhcmdldC52YWx1ZTsgfSkpOwogIH0KCiAgZnVuY3Rpb24gc2V0U2VnKG4pIHsgJCgibGltaXRTZWciKS5xdWVyeVNlbGVjdG9yQWxsKCJidXR0b24iKS5mb3JFYWNoKGIgPT4gYi5zZXRBdHRyaWJ1dGUoImFyaWEtcHJlc3NlZCIsIFN0cmluZygrYi5kYXRhc2V0Lm4gPT09IG4pKSk7IH0KICAkKCJsaW1pdFNlZyIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZSA9PiB7CiAgICBjb25zdCBiID0gZS50YXJnZXQuY2xvc2VzdCgiYnV0dG9uIik7IGlmICghYikgcmV0dXJuOwogICAgbGltaXQgPSArYi5kYXRhc2V0Lm47IHNldFNlZyhsaW1pdCk7CiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuc3R1ZGlvIikuY2xhc3NMaXN0LmFkZCgiYnVzeSIpOwogICAgc2V0VGltZW91dCgoKSA9PiB7IHJlZnJlc2hBbGwoKTsgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnN0dWRpbyIpLmNsYXNzTGlzdC5yZW1vdmUoImJ1c3kiKTsgfSwgMjApOwogIH0pOwoKICBmdW5jdGlvbiBvblBvc2VzQ2hhbmdlKCkgewogICAgcG9zZXMubnggPSArJCgicG9zZXNYIikudmFsdWU7IHBvc2VzLm55ID0gKyQoInBvc2VzWSIpLnZhbHVlOyBwb3Nlcy5rZWVwID0gJCgicG9zZXNLZWVwIikuY2hlY2tlZDsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5zdHVkaW8iKS5jbGFzc0xpc3QuYWRkKCJidXN5Iik7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsgcmVmcmVzaEFsbCgpOyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuc3R1ZGlvIikuY2xhc3NMaXN0LnJlbW92ZSgiYnVzeSIpOyB9LCAyMCk7CiAgfQogIFsicG9zZXNYIiwgInBvc2VzWSIsICJwb3Nlc0tlZXAiXS5mb3JFYWNoKGlkID0+ICQoaWQpLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIG9uUG9zZXNDaGFuZ2UpKTsKCiAgJCgid2FycFNlZyIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZSA9PiB7CiAgICBjb25zdCBiID0gZS50YXJnZXQuY2xvc2VzdCgiW2RhdGEtd10iKTsgaWYgKCFiIHx8IGIuZGF0YXNldC53ID09PSB3YXJwTW9kZSkgcmV0dXJuOwogICAgd2FycE1vZGUgPSBiLmRhdGFzZXQudzsKICAgICQoIndhcnBTZWciKS5xdWVyeVNlbGVjdG9yQWxsKCJidXR0b24iKS5mb3JFYWNoKHggPT4geC5zZXRBdHRyaWJ1dGUoImFyaWEtcHJlc3NlZCIsIFN0cmluZyh4ID09PSBiKSkpOwogICAgQUggPSBNYXRoLnJvdW5kKEFXICogdHBsKCkuSCAvIHRwbCgpLlcpOwogICAgb3JpZ2luYWwud2lkdGggPSBhcnQud2lkdGggPSBBVzsgb3JpZ2luYWwuaGVpZ2h0ID0gYXJ0LmhlaWdodCA9IEFIOwogICAgaWYgKHNyY0ltZyA9PT0gc2FtcGxlQ2FudmFzKSB7IGRyYXdTYW1wbGUoKTsgc3JjVyA9IHNhbXBsZUNhbnZhcy53aWR0aDsgc3JjSCA9IHNhbXBsZUNhbnZhcy5oZWlnaHQ7IHNvdXJjZUluZm8ucmF0aW8gPSBzcmNXIC8gc3JjSDsgfQogICAgdGV4dHVyZS5kaXNwb3NlKCk7IHJlbmRlclNwZWNzKCk7IGJ1aWxkQ3VwKCk7CiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuc3R1ZGlvIikuY2xhc3NMaXN0LmFkZCgiYnVzeSIpOwogICAgc2V0VGltZW91dCgoKSA9PiB7IHJlZnJlc2hBbGwoKTsgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnN0dWRpbyIpLmNsYXNzTGlzdC5yZW1vdmUoImJ1c3kiKTsgfSwgMjApOwogIH0pOwoKICAvKiAtLS0tLS0tLS0tIETDqXDDtHQgZGUgZmljaGllciAtLS0tLS0tLS0tICovCiAgY29uc3QgZHJvcCA9ICQoImRyb3AiKSwgZmlsZUlucHV0ID0gJCgiZmlsZSIpOwogIGRyb3AuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgaWYgKGUua2V5ID09PSAiRW50ZXIiIHx8IGUua2V5ID09PSAiICIpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBmaWxlSW5wdXQuY2xpY2soKTsKICAgIH0KICB9KTsKICBbImRyYWdlbnRlciIsICJkcmFnb3ZlciJdLmZvckVhY2goZXYgPT4gZHJvcC5hZGRFdmVudExpc3RlbmVyKGV2LCBlID0+IHsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIGRyb3AuY2xhc3NMaXN0LmFkZCgib3ZlciIpOwogIH0pKTsKICBbImRyYWdsZWF2ZSIsICJkcm9wIl0uZm9yRWFjaChldiA9PiBkcm9wLmFkZEV2ZW50TGlzdGVuZXIoZXYsIGUgPT4gewogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgZHJvcC5jbGFzc0xpc3QucmVtb3ZlKCJvdmVyIik7CiAgfSkpOwogIGRyb3AuYWRkRXZlbnRMaXN0ZW5lcigiZHJvcCIsIGUgPT4gewogICAgY29uc3QgZiA9IGUuZGF0YVRyYW5zZmVyICYmIGUuZGF0YVRyYW5zZmVyLmZpbGVzID8gZS5kYXRhVHJhbnNmZXIuZmlsZXNbMF0gOiBudWxsOwogICAgaWYgKCFmKSByZXR1cm47CiAgICAkKCJmaWxlbWV0YSIpLnRleHRDb250ZW50ID0gIkZpY2hpZXIgcmXDp3UgOiAiICsgZi5uYW1lICsgIiDCtyBsZWN0dXJlIGVuIGNvdXJz4oCmIjsKICAgIGhhbmRsZUZpbGUoZik7CiAgfSk7CiAgZmlsZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGUgPT4gewogICAgY29uc3QgZiA9IGUudGFyZ2V0LmZpbGVzICYmIGUudGFyZ2V0LmZpbGVzWzBdID8gZS50YXJnZXQuZmlsZXNbMF0gOiBudWxsOwogICAgaWYgKCFmKSB7CiAgICAgICQoImZpbGVtZXRhIikudGV4dENvbnRlbnQgPSAiQXVjdW4gZmljaGllciBzw6lsZWN0aW9ubsOpLiI7CiAgICAgIHJldHVybjsKICAgIH0KICAgICQoImZpbGVtZXRhIikudGV4dENvbnRlbnQgPSAiRmljaGllciByZcOndSA6ICIgKyBmLm5hbWUgKyAiIMK3IGxlY3R1cmUgZW4gY291cnPigKYiOwogICAgaGFuZGxlRmlsZShmKTsKICB9KTsKCiAgZnVuY3Rpb24gaGFuZGxlRmlsZShmKSB7CiAgICBjb25zdCBuYW1lID0gU3RyaW5nKGYubmFtZSB8fCAiIikudG9Mb3dlckNhc2UoKTsKICAgIGNvbnN0IGlzU3ZnID0gZi50eXBlID09PSAiaW1hZ2Uvc3ZnK3htbCIgfHwgbmFtZS5lbmRzV2l0aCgiLnN2ZyIpOwogICAgY29uc3QgYWxsb3dlZFR5cGVzID0gWyJpbWFnZS9wbmciLCAiaW1hZ2UvanBlZyIsICJpbWFnZS9zdmcreG1sIl07CgogICAgaWYgKGFsbG93ZWRUeXBlcy5pbmRleE9mKGYudHlwZSkgPT09IC0xICYmICFpc1N2ZykgewogICAgICAkKCJmaWxlbWV0YSIpLnRleHRDb250ZW50ID0gYMKrICR7Zi5uYW1lfSDCuyBuJ2VzdCBwYXMgYWNjZXB0w6kuIETDqXBvc2V6IHVuIFBORywgdW4gSlBHIG91IHVuIFNWRy5gOwogICAgICByZXR1cm47CiAgICB9CgogICAgdXBsb2FkZWRGaWxlID0gZjsKCiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwogICAgcmVhZGVyLm9uZXJyb3IgPSAoKSA9PiB7CiAgICAgICQoImZpbGVtZXRhIikudGV4dENvbnRlbnQgPSBgSW1wb3NzaWJsZSBkZSBsaXJlIMKrICR7Zi5uYW1lfSDCuyBkZXB1aXMgdm90cmUgYXBwYXJlaWwuYDsKICAgIH07CgogICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHsKICAgICAgJCgiZmlsZW1ldGEiKS50ZXh0Q29udGVudCA9IGBGaWNoaWVyIGx1IDogJHtmLm5hbWV9IMK3IHByw6lwYXJhdGlvbiBkZSBsJ2FwZXLDp3UgM0TigKZgOwoKICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7CgogICAgICBpbWcub25lcnJvciA9ICgpID0+IHsKICAgICAgICAkKCJmaWxlbWV0YSIpLnRleHRDb250ZW50ID0gYEltcG9zc2libGUgZCdhZmZpY2hlciDCqyAke2YubmFtZX0gwrsuIEVzc2F5ZXogdW4gYXV0cmUgUE5HLCBKUEcgb3UgU1ZHLmA7CiAgICAgIH07CgogICAgICBpbWcub25sb2FkID0gKCkgPT4gewogICAgICAgIGNvbnN0IHcgPSBpbWcubmF0dXJhbFdpZHRoIHx8IDI0MDA7CiAgICAgICAgY29uc3QgaCA9IGltZy5uYXR1cmFsSGVpZ2h0IHx8IDk0MDsKCiAgICAgICAgT2JqZWN0LmtleXMocGFudG9uZU92ZXJyaWRlcykuZm9yRWFjaChrID0+IGRlbGV0ZSBwYW50b25lT3ZlcnJpZGVzW2tdKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgIGxvYWRJbWFnZVRvT3JpZ2luYWwoaW1nLCB7CiAgICAgICAgICAgIG5hbWU6IGYubmFtZSwKICAgICAgICAgICAgcHhXOiB3LAogICAgICAgICAgICB2ZWN0b3I6IGlzU3ZnLAogICAgICAgICAgICByYXRpbzogdyAvIGgKICAgICAgICAgIH0pOwoKICAgICAgICAgICQoImZpbGVtZXRhIikudGV4dENvbnRlbnQgPQogICAgICAgICAgICBgQXBlcsOndSAzRCBtaXMgw6Agam91ciA6ICR7Zi5uYW1lfSDCtyAke2lzU3ZnID8gInZlY3RvcmllbCIgOiB3ICsgIiDDlyAiICsgaCArICIgcHgifSDCtyAke2ZtdChmLnNpemUgLyAxMDI0LCAwKX0gS29gOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgY29uc29sZS5lcnJvcigiQVNXQUwgY29uZmlndXJhdGV1ciDigJQgZXJyZXVyIHRyYWl0ZW1lbnQgZmljaGllciIsIGVycik7CiAgICAgICAgICAkKCJmaWxlbWV0YSIpLnRleHRDb250ZW50ID0KICAgICAgICAgICAgYExlIGZpY2hpZXIgwqsgJHtmLm5hbWV9IMK7IGVzdCBjaGFyZ8OpLCBtYWlzIGwnYXBlcsOndSAzRCBuJ2EgcGFzIHB1IMOqdHJlIGfDqW7DqXLDqS4gRXNzYXlleiB1biBQTkcgb3UgSlBHLmA7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgaW1nLnNyYyA9IHJlYWRlci5yZXN1bHQ7CiAgICB9OwoKICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGYpOwogIH0KICAvKiAtLS0tLS0tLS0tIFNjw6huZSAzRCAtLS0tLS0tLS0tICovCiAgY29uc3Qgdmlld2VyID0gJCgidmlld2VyIik7CiAgY29uc3QgcmVuZGVyZXIgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7IGFudGlhbGlhczogdHJ1ZSwgYWxwaGE6IHRydWUsIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdHJ1ZSB9KTsKICByZW5kZXJlci5zZXRQaXhlbFJhdGlvKE1hdGgubWluKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLCAyKSk7CiAgcmVuZGVyZXIub3V0cHV0RW5jb2RpbmcgPSBUSFJFRS5zUkdCRW5jb2Rpbmc7CiAgcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgPSB0cnVlOyByZW5kZXJlci5zaGFkb3dNYXAudHlwZSA9IFRIUkVFLlBDRlNvZnRTaGFkb3dNYXA7CiAgdmlld2VyLnByZXBlbmQocmVuZGVyZXIuZG9tRWxlbWVudCk7CiAgY29uc3Qgc2NlbmUgPSBuZXcgVEhSRUUuU2NlbmUoKTsKICBjb25zdCBjYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoMzIsIDEsIDEsIDIwMDApOwogIGNhbWVyYS5wb3NpdGlvbi5zZXQoMCwgNzAsIDMzMCk7CiAgY29uc3QgY29udHJvbHMgPSBuZXcgVEhSRUUuT3JiaXRDb250cm9scyhjYW1lcmEsIHJlbmRlcmVyLmRvbUVsZW1lbnQpOwogIGNvbnRyb2xzLnRhcmdldC5zZXQoMCwgMCwgMCk7IGNvbnRyb2xzLmVuYWJsZURhbXBpbmcgPSB0cnVlOyBjb250cm9scy5kYW1waW5nRmFjdG9yID0gMC4wODsKICBjb250cm9scy5taW5EaXN0YW5jZSA9IDE2MDsgY29udHJvbHMubWF4RGlzdGFuY2UgPSA2MDA7IGNvbnRyb2xzLmVuYWJsZVBhbiA9IGZhbHNlOwogIGNvbnRyb2xzLmF1dG9Sb3RhdGUgPSB0cnVlOyBjb250cm9scy5hdXRvUm90YXRlU3BlZWQgPSAxLjY7CgogIGNvbnN0IG1vYmlsZTNkUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgiKG1heC13aWR0aDogOTAwcHgpIik7CiAgY29uc3Qgdmlld2VyUGFuZWwgPSAkKCJ2aWV3ZXJQYW5lbCIpOwogIGNvbnN0IHVwbG9hZFN0ZXAgPSAkKCJ1cGxvYWRTdGVwIik7CiAgY29uc3Qgc3R1ZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnN0dWRpbyIpOwogIGNvbnN0IHZpZXdlckFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIkFTV0FMIHZpZXdlciBkZXNrdG9wIHBvc2l0aW9uIik7CgogIGlmIChzdHVkaW8gJiYgdmlld2VyUGFuZWwpIHsKICAgIHN0dWRpby5pbnNlcnRCZWZvcmUodmlld2VyQW5jaG9yLCB2aWV3ZXJQYW5lbCk7CiAgfQoKICBjb250cm9scy5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsICgpID0+IHsKICAgIGlmICghbW9iaWxlM2RRdWVyeS5tYXRjaGVzKSBzZXRTcGluKGZhbHNlKTsKICB9KTsKCiAgZnVuY3Rpb24gcGxhY2VWaWV3ZXIoKSB7CiAgICBjb25zdCBtb2JpbGUgPSBtb2JpbGUzZFF1ZXJ5Lm1hdGNoZXM7CiAgICBjb25zdCBoaW50ID0gJCgidmlld2VySGludCIpOwoKICAgIGNvbnRyb2xzLmVuYWJsZWQgPSB0cnVlOwogICAgY29udHJvbHMuZW5hYmxlUm90YXRlID0gdHJ1ZTsKICAgIGNvbnRyb2xzLmVuYWJsZVpvb20gPSB0cnVlOwogICAgY29udHJvbHMuYXV0b1JvdGF0ZSA9IHRydWU7CiAgICByZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLnRvdWNoQWN0aW9uID0gIm5vbmUiOwoKICAgIGlmIChtb2JpbGUpIHsKICAgICAgaWYgKHVwbG9hZFN0ZXAgJiYgdmlld2VyUGFuZWwgJiYgdmlld2VyUGFuZWwucHJldmlvdXNFbGVtZW50U2libGluZyAhPT0gdXBsb2FkU3RlcCkgewogICAgICAgIHVwbG9hZFN0ZXAuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJhZnRlcmVuZCIsIHZpZXdlclBhbmVsKTsKICAgICAgfQogICAgICBpZiAoaGludCkgewogICAgICAgIGhpbnQudGV4dENvbnRlbnQgPSAiR2xpc3NleiBzdXIgbGUgZ29iZWxldCBwb3VyIHRvdXJuZXIgwrcgdXRpbGlzZXogbGVzIGPDtHTDqXMgcG91ciBkw6lmaWxlciI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmICh2aWV3ZXJBbmNob3IucGFyZW50Tm9kZSAmJiB2aWV3ZXJQYW5lbCkgewogICAgICAgIHZpZXdlckFuY2hvci5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh2aWV3ZXJQYW5lbCwgdmlld2VyQW5jaG9yLm5leHRTaWJsaW5nKTsKICAgICAgfQogICAgICBpZiAoaGludCkgewogICAgICAgIGhpbnQudGV4dENvbnRlbnQgPSAiR2xpc3NleiBwb3VyIHRvdXJuZXIgwrcgbW9sZXR0ZSBwb3VyIHpvb21lciI7CiAgICAgIH0KICAgIH0KCiAgICBzZXRUaW1lb3V0KHJlc2l6ZSwgMCk7CiAgfQoKICBpZiAodHlwZW9mIG1vYmlsZTNkUXVlcnkuYWRkRXZlbnRMaXN0ZW5lciA9PT0gImZ1bmN0aW9uIikgewogICAgbW9iaWxlM2RRdWVyeS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBwbGFjZVZpZXdlcik7CiAgfQoKICBwbGFjZVZpZXdlcigpOwoKICBzY2VuZS5hZGQobmV3IFRIUkVFLkhlbWlzcGhlcmVMaWdodCgweGZmZmZmZiwgMHg4YTk2YTAsIDAuNzUpKTsKICBjb25zdCBrZXkgPSBuZXcgVEhSRUUuRGlyZWN0aW9uYWxMaWdodCgweGZmZmZmZiwgMC43NSk7IGtleS5wb3NpdGlvbi5zZXQoMTIwLCAyMjAsIDE2MCk7IGtleS5jYXN0U2hhZG93ID0gdHJ1ZTsKICBrZXkuc2hhZG93Lm1hcFNpemUuc2V0KDEwMjQsIDEwMjQpOyBPYmplY3QuYXNzaWduKGtleS5zaGFkb3cuY2FtZXJhLCB7IGxlZnQ6IC0xMjAsIHJpZ2h0OiAxMjAsIHRvcDogMTIwLCBib3R0b206IC0xMjAgfSk7CiAgc2NlbmUuYWRkKGtleSk7CiAgY29uc3QgcmltTCA9IG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0KDB4ZmZmZmZmLCAwLjI1KTsgcmltTC5wb3NpdGlvbi5zZXQoLTE2MCwgNjAsIC0xMjApOyBzY2VuZS5hZGQocmltTCk7CgogIGNvbnN0IHRleHR1cmUgPSBuZXcgVEhSRUUuQ2FudmFzVGV4dHVyZShhcnQpOwogIHRleHR1cmUuZW5jb2RpbmcgPSBUSFJFRS5zUkdCRW5jb2Rpbmc7IHRleHR1cmUuYW5pc290cm9weSA9IHJlbmRlcmVyLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCk7CiAgdGV4dHVyZS53cmFwUyA9IFRIUkVFLlJlcGVhdFdyYXBwaW5nOyB0ZXh0dXJlLm9mZnNldC54ID0gMC4yNTsgLy8gY2VudHJlIGRlIGxhIG1hcXVldHRlIGZhY2Ugw6AgbGEgY2Ftw6lyYQoKICAvLyBQYXJvaSBkdSBnb2JlbGV0IDogVVYgcmVjYWxjdWzDqWVzIHBvdXIgc3VpdnJlIGV4YWN0ZW1lbnQgbGEgbcOqbWUgZMOpZm9ybWF0aW9uIHF1ZSBsJ8OpdmVudGFpbCBkJ2ltcHJlc3Npb24KICBmdW5jdGlvbiBjdXBXYWxsR2VvKHJULCByQiwgSCwgcmFkaWFsKSB7CiAgICBjb25zdCBnID0gbmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoclQsIHJCLCBILCByYWRpYWwsIDQ4LCB0cnVlKSwgdXYgPSBnLmF0dHJpYnV0ZXMudXYsIHBvcyA9IGcuYXR0cmlidXRlcy5wb3NpdGlvbjsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXYuY291bnQ7IGkrKykgewogICAgICBjb25zdCB0ID0gKEggLyAyIC0gcG9zLmdldFkoaSkpIC8gSDsgICAgICAgICAgLy8gMCA9IGJvcmQsIDEgPSBmb25kCiAgICAgIGNvbnN0IHIgPSBHLlJvIC0gdCAqIEcuczsgICAgICAgICAgICAgICAgICAgICAgIC8vIHJheW9uIGNvcnJlc3BvbmRhbnQgZGFucyBsJ8OpdmVudGFpbAogICAgICB1di5zZXRZKGksIDEgLSB2T2ZSYWRpdXMocikpOwogICAgfQogICAgdXYubmVlZHNVcGRhdGUgPSB0cnVlOyByZXR1cm4gZzsKICB9CiAgY29uc3QgY3VwR3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTsgc2NlbmUuYWRkKGN1cEdyb3VwKTsKICBsZXQgd2FsbCwgaW5uZXIsIHJpbSwgYm90dG9tOwogIGZ1bmN0aW9uIGJ1aWxkQ3VwKCkgewogICAgY3VwR3JvdXAuY2xlYXIoKTsKICAgIGNvbnN0IEggPSBjdXAuaCwgclQgPSBjdXAuRCAvIDIsIHJCID0gY3VwLmQgLyAyOwogICAgY29uc3QgZ2VvID0gY3VwV2FsbEdlbyhyVCwgckIsIEgsIDE2MCk7CiAgICB3YWxsID0gbmV3IFRIUkVFLk1lc2goZ2VvLCBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBtYXA6IHRleHR1cmUsIHJvdWdobmVzczogMC42MiwgbWV0YWxuZXNzOiAwLCBzaWRlOiBUSFJFRS5Gcm9udFNpZGUgfSkpOwogICAgd2FsbC5jYXN0U2hhZG93ID0gdHJ1ZTsgY3VwR3JvdXAuYWRkKHdhbGwpOwogICAgaW5uZXIgPSBuZXcgVEhSRUUuTWVzaChnZW8sIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IGNvbG9yOiAweGY0ZjJlZSwgcm91Z2huZXNzOiAwLjgsIHNpZGU6IFRIUkVFLkJhY2tTaWRlIH0pKTsKICAgIGN1cEdyb3VwLmFkZChpbm5lcik7CiAgICByaW0gPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuVG9ydXNHZW9tZXRyeShyVCArIDAuNCwgMS41LCAxNiwgMTYwKSwgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgY29sb3I6IDB4ZjdmNmYzLCByb3VnaG5lc3M6IDAuNTUgfSkpOwogICAgcmltLnJvdGF0aW9uLnggPSBNYXRoLlBJIC8gMjsgcmltLnBvc2l0aW9uLnkgPSBIIC8gMjsgY3VwR3JvdXAuYWRkKHJpbSk7CiAgICBjb25zdCBiSW5zZXQgPSA2OwogICAgY29uc3QgckF0SW5zZXQgPSByQiArIChyVCAtIHJCKSAqIChiSW5zZXQgLyBIKTsKICAgIGJvdHRvbSA9IG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DaXJjbGVHZW9tZXRyeShyQXRJbnNldCwgOTYpLCBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBjb2xvcjogMHhlYmU4ZTIsIHJvdWdobmVzczogMC44NSwgc2lkZTogVEhSRUUuRG91YmxlU2lkZSB9KSk7CiAgICBib3R0b20ucm90YXRpb24ueCA9IC1NYXRoLlBJIC8gMjsgYm90dG9tLnBvc2l0aW9uLnkgPSAtSCAvIDIgKyBiSW5zZXQ7IGN1cEdyb3VwLmFkZChib3R0b20pOwogICAgY29uc3QgZ3JvdW5kID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLlBsYW5lR2VvbWV0cnkoNjAwLCA2MDApLCBuZXcgVEhSRUUuU2hhZG93TWF0ZXJpYWwoeyBvcGFjaXR5OiAwLjE2IH0pKTsKICAgIGdyb3VuZC5yb3RhdGlvbi54ID0gLU1hdGguUEkgLyAyOyBncm91bmQucG9zaXRpb24ueSA9IC1IIC8gMiAtIDAuNTsgZ3JvdW5kLnJlY2VpdmVTaGFkb3cgPSB0cnVlOyBjdXBHcm91cC5hZGQoZ3JvdW5kKTsKICAgIGN1cEdyb3VwLnBvc2l0aW9uLnkgPSA0OwogIH0KICBidWlsZEN1cCgpOwogIGZ1bmN0aW9uIHVwZGF0ZVRleHR1cmUoKSB7IHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOyB9CgogIGZ1bmN0aW9uIHJlc2l6ZSgpIHsKICAgIGNvbnN0IHcgPSB2aWV3ZXIuY2xpZW50V2lkdGgsIGggPSB2aWV3ZXIuY2xpZW50SGVpZ2h0OwogICAgcmVuZGVyZXIuc2V0U2l6ZSh3LCBoLCBmYWxzZSk7IGNhbWVyYS5hc3BlY3QgPSB3IC8gaDsKICAgIGNhbWVyYS5wb3NpdGlvbi5zZXRMZW5ndGgodyA8IDUyMCA\/IDM5MCA6IDMzMCk7ICAgIGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CiAgfQogIG5ldyBSZXNpemVPYnNlcnZlcihyZXNpemUpLm9ic2VydmUodmlld2VyKTsgcmVzaXplKCk7CiAgKGZ1bmN0aW9uIGxvb3AoKSB7IGNvbnRyb2xzLnVwZGF0ZSgpOyByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSk7IHJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTsgfSkoKTsKCiAgZnVuY3Rpb24gc2V0U3BpbihvbikgeyBjb250cm9scy5hdXRvUm90YXRlID0gb247IGNvbnN0IGIgPSAkKCJzcGluIik7IGIuc2V0QXR0cmlidXRlKCJhcmlhLXByZXNzZWQiLCBTdHJpbmcob24pKTsgYi50ZXh0Q29udGVudCA9IG9uID8gIlBhdXNlIHJvdGF0aW9uIiA6ICJSZXByZW5kcmUgcm90YXRpb24iOyB9CiAgJCgic3BpbiIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gc2V0U3BpbighY29udHJvbHMuYXV0b1JvdGF0ZSkpOwoKICAvKiAtLS0tLS0tLS0tIMOJdmVudGFpbCAoZMOpZm9ybWF0aW9uIHJlY3RhbmdsZSDihpIgYXJjKSAtLS0tLS0tLS0tICovCiAgY29uc3QgZmFuQ2FudmFzID0gJCgiZmFuIik7CiAgZnVuY3Rpb24gZmFuTGF5b3V0KHB4UGVyTW0sIG1hcmdpbikgewogICAgY29uc3QgaGFsZiA9IEcudGggLyAyOwogICAgY29uc3QgZXh0ID0gRy5SbyArIGN1cC5ibGVlZDsKICAgIGNvbnN0IHdtbSA9IDIgKiBleHQgKiBNYXRoLnNpbihoYWxmICsgKGN1cC5nbHVlICsgY3VwLmJsZWVkKSAvIEcuUmkpIDsKICAgIGNvbnN0IHRvcCA9IGV4dCwgYm90dG9tWSA9IChHLlJpIC0gY3VwLmJsZWVkKSAqIE1hdGguY29zKGhhbGYgKyAoY3VwLmdsdWUgKyBjdXAuYmxlZWQpIC8gRy5SaSk7CiAgICBjb25zdCBobW0gPSB0b3AgLSBib3R0b21ZOwogICAgY29uc3QgVyA9IE1hdGguY2VpbCgod21tICsgMiAqIG1hcmdpbikgKiBweFBlck1tKSwgSCA9IE1hdGguY2VpbCgoaG1tICsgMiAqIG1hcmdpbikgKiBweFBlck1tKTsKICAgIGNvbnN0IGN4ID0gVyAvIDIsIGN5ID0gKG1hcmdpbiArIHRvcCkgKiBweFBlck1tOyAvLyBjZW50cmUgZHUgY2VyY2xlIChzb3VzIGwnw6l2ZW50YWlsKQogICAgcmV0dXJuIHsgVywgSCwgY3gsIGN5LCBrOiBweFBlck1tIH07CiAgfQoKICBmdW5jdGlvbiB3YXJwSW50byhjdHgsIEwsIG9wdHMpIHsKICAgIGNvbnN0IHsgVywgSCwgY3gsIGN5LCBrIH0gPSBMOwogICAgY29uc3Qgc3JjID0gYXJ0LmdldENvbnRleHQoIjJkIikuZ2V0SW1hZ2VEYXRhKDAsIDAsIEFXLCBBSCkuZGF0YTsKICAgIGNvbnN0IG91dCA9IGN0eC5jcmVhdGVJbWFnZURhdGEoVywgSCk7IGNvbnN0IG8gPSBvdXQuZGF0YTsKICAgIGNvbnN0IGhhbGYgPSBHLnRoIC8gMjsKICAgIGNvbnN0IFJvdXQgPSBHLlJvICsgY3VwLmJsZWVkLCBSaW4gPSBHLlJpIC0gY3VwLmJsZWVkOwogICAgZm9yIChsZXQgcHkgPSAwOyBweSA8IEg7IHB5KyspIHsKICAgICAgY29uc3QgeSA9IChjeSAtIHB5IC0gMC41KSAvIGs7CiAgICAgIGZvciAobGV0IHB4ID0gMDsgcHggPCBXOyBweCsrKSB7CiAgICAgICAgY29uc3QgeCA9IChweCArIDAuNSAtIGN4KSAvIGs7CiAgICAgICAgY29uc3QgciA9IE1hdGguaHlwb3QoeCwgeSk7CiAgICAgICAgaWYgKHIgPiBSb3V0IHx8IHIgPCBSaW4pIGNvbnRpbnVlOwogICAgICAgIGNvbnN0IHBoaSA9IE1hdGguYXRhbjIoeCwgeSk7CiAgICAgICAgY29uc3QgYmxlZWRBbmcgPSBjdXAuYmxlZWQgLyByOwogICAgICAgIGlmIChNYXRoLmFicyhwaGkpID4gaGFsZiArIGJsZWVkQW5nKSBjb250aW51ZTsKICAgICAgICAvLyB1IDogcG9zaXRpb24gaG9yaXpvbnRhbGUgZGFucyBsYSBtYXF1ZXR0ZSwgdiA6IHZlcnRpY2FsZSAoaGF1dCA9IHJheW9uIGV4dMOpcmlldXIpCiAgICAgICAgbGV0IHUgPSAocGhpICsgaGFsZikgLyBHLnRoOyBsZXQgdiA9IHZPZlJhZGl1cyhyKTsKICAgICAgICB1ID0gTWF0aC5taW4oTWF0aC5tYXgodSwgMCksIDEpOyB2ID0gTWF0aC5taW4oTWF0aC5tYXgodiwgMCksIDEpOwogICAgICAgIGNvbnN0IHN4ID0gTWF0aC5taW4oQVcgLSAxLCBNYXRoLmZsb29yKHUgKiBBVykpLCBzeSA9IE1hdGgubWluKEFIIC0gMSwgTWF0aC5mbG9vcih2ICogQUgpKTsKICAgICAgICBjb25zdCBzaSA9IChzeSAqIEFXICsgc3gpICogNCwgb2kgPSAocHkgKiBXICsgcHgpICogNDsKICAgICAgICBvW29pXSA9IHNyY1tzaV07IG9bb2kgKyAxXSA9IHNyY1tzaSArIDFdOyBvW29pICsgMl0gPSBzcmNbc2kgKyAyXTsgb1tvaSArIDNdID0gMjU1OwogICAgICB9CiAgICB9CiAgICBjdHgucHV0SW1hZ2VEYXRhKG91dCwgMCwgMCk7CiAgfQoKICBmdW5jdGlvbiBhcmNQYXRoKGN0eCwgTCwgUmluLCBSb3V0LCBhMCwgYTEpIHsKICAgIGNvbnN0IHsgY3gsIGN5LCBrIH0gPSBMOwogICAgY3R4LmJlZ2luUGF0aCgpOwogICAgY3R4LmFyYyhjeCwgY3ksIFJvdXQgKiBrLCAtTWF0aC5QSSAvIDIgKyBhMCwgLU1hdGguUEkgLyAyICsgYTEpOwogICAgY3R4LmFyYyhjeCwgY3ksIFJpbiAqIGssIC1NYXRoLlBJIC8gMiArIGExLCAtTWF0aC5QSSAvIDIgKyBhMCwgdHJ1ZSk7CiAgICBjdHguY2xvc2VQYXRoKCk7CiAgfQoKICBmdW5jdGlvbiBjc3NWYXIobikgeyByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUobikudHJpbSgpOyB9CgogIGZ1bmN0aW9uIHJlbmRlckZhbihjYW52YXMsIHB4UGVyTW0sIGd1aWRlcykgewogICAgY29uc3QgayA9IHB4UGVyTW0gfHwgKDE0MDAgLyAzMDApOwogICAgY29uc3QgTCA9IGZhbkxheW91dChrLCBweFBlck1tID8gMiA6IDYpOwogICAgY2FudmFzLndpZHRoID0gTC5XOyBjYW52YXMuaGVpZ2h0ID0gTC5IOwogICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICB3YXJwSW50byhjdHgsIEwpOwogICAgaWYgKCFndWlkZXMpIHJldHVybiBMOwogICAgY29uc3QgaGFsZiA9IEcudGggLyAyLCBsdyA9IE1hdGgubWF4KDEsIGsgKiAwLjI1KTsKICAgIC8vIHJlY291dnJlbWVudCBkZSBjb2xsYWdlIChjw7R0w6kgZHJvaXQpCiAgICBjb25zdCBnbHVlQSA9IGN1cC5nbHVlIC8gKChHLlJvICsgRy5SaSkgLyAyKTsKICAgIGN0eC5zYXZlKCk7CiAgICBhcmNQYXRoKGN0eCwgTCwgRy5SaSwgRy5SbywgaGFsZiwgaGFsZiArIGdsdWVBKTsgY3R4LmNsaXAoKTsKICAgIGN0eC5zdHJva2VTdHlsZSA9IGNzc1ZhcigiLS1tdXRlZCIpOyBjdHgubGluZVdpZHRoID0gbHc7CiAgICBmb3IgKGxldCBpID0gLUwuSDsgaSA8IEwuVyArIEwuSDsgaSArPSBrICogMi4yKSB7IGN0eC5iZWdpblBhdGgoKTsgY3R4Lm1vdmVUbyhpLCAwKTsgY3R4LmxpbmVUbyhpIC0gTC5ILCBMLkgpOyBjdHguc3Ryb2tlKCk7IH0KICAgIGN0eC5yZXN0b3JlKCk7CiAgICAvLyBmb25kIHBlcmR1CiAgICBjdHguc3Ryb2tlU3R5bGUgPSBjc3NWYXIoIi0tbXV0ZWQiKTsgY3R4LmxpbmVXaWR0aCA9IGx3ICogMC42OyBjdHguc2V0TGluZURhc2goW10pOwogICAgYXJjUGF0aChjdHgsIEwsIEcuUmkgLSBjdXAuYmxlZWQsIEcuUm8gKyBjdXAuYmxlZWQsIC1oYWxmIC0gY3VwLmJsZWVkIC8gRy5SbywgaGFsZiArIGN1cC5ibGVlZCAvIEcuUm8pOyBjdHguZ2xvYmFsQWxwaGEgPSAwLjY7IGN0eC5zdHJva2UoKTsgY3R4Lmdsb2JhbEFscGhhID0gMTsKICAgIC8vIHRyYWPDqSBkZSBjb3VwZQogICAgY3R4LnN0cm9rZVN0eWxlID0gY3NzVmFyKCItLWluayIpOyBjdHgubGluZVdpZHRoID0gbHcgKiAxLjQ7CiAgICBhcmNQYXRoKGN0eCwgTCwgRy5SaSwgRy5SbyArIDAsIC1oYWxmLCBoYWxmICsgZ2x1ZUEpOyBjdHguc3Ryb2tlKCk7CiAgICAvLyB6b25lIGRlIHPDqWN1cml0w6kKICAgIGN0eC5zdHJva2VTdHlsZSA9IGNzc1ZhcigiLS1ndWlkZSIpOyBjdHgubGluZVdpZHRoID0gbHc7IGN0eC5zZXRMaW5lRGFzaChbayAqIDIsIGsgKiAxLjRdKTsKICAgIGFyY1BhdGgoY3R4LCBMLCBHLlJpICsgY3VwLnNhZmUsIEcuUm8gLSBjdXAuc2FmZSwgLWhhbGYgKyBjdXAuc2FmZSAvIEcuUmksIGhhbGYgLSBjdXAuc2FmZSAvIEcuUmkpOyBjdHguc3Ryb2tlKCk7CiAgICBjdHguc2V0TGluZURhc2goW10pOwogICAgcmV0dXJuIEw7CiAgfQoKICAvKiAtLS0tLS0tLS0tIEV4cG9ydHMgLS0tLS0tLS0tLSAqLwogIGxldCBkbENhcCA9IG51bGw7CiAgaWYgKHdpbmRvdy5jbGF1ZGUgJiYgdHlwZW9mIHdpbmRvdy5jbGF1ZGUudXNlID09PSAiZnVuY3Rpb24iKSB3aW5kb3cuY2xhdWRlLnVzZSgiZG93bmxvYWRzIikudGhlbihkID0+IHsgZGxDYXAgPSBkOyB9KS5jYXRjaCgoKSA9PiB7fSk7CiAgZnVuY3Rpb24gZG93bmxvYWQobmFtZSwgYmxvYikgewogICAgaWYgKGRsQ2FwKSB7IGRsQ2FwLnNhdmUoeyBmaWxlbmFtZTogbmFtZSwgZGF0YTogYmxvYiB9KS5jYXRjaCgoKSA9PiB7fSk7IHJldHVybjsgfQogICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsgYS5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsgYS5kb3dubG9hZCA9IG5hbWU7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOyBhLmNsaWNrKCk7IHNldFRpbWVvdXQoKCkgPT4geyBVUkwucmV2b2tlT2JqZWN0VVJMKGEuaHJlZik7IGEucmVtb3ZlKCk7IH0sIDEwMDApOwogIH0KICAkKCJkbEZhblBuZyIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgcmVuZGVyRmFuKGMsIDMwMCAvIDI1LjQsIGZhbHNlKTsKICAgIGMudG9CbG9iKGIgPT4gZG93bmxvYWQoYGV2ZW50YWlsLSR7Y3VwLmxhYmVsLnJlcGxhY2UoIiAiLCAiIil9LTMwMGRwaS5wbmdgLCBiKSwgImltYWdlL3BuZyIpOwogIH0pOwogICQoImRsRmFuU3ZnIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CiAgICBjb25zdCBrID0gMTUwIC8gMjUuNDsgY29uc3QgTCA9IHJlbmRlckZhbihjLCBrLCBmYWxzZSk7CiAgICBjb25zdCB3bW0gPSBMLlcgLyBrLCBobW0gPSBMLkggLyBrLCBjeCA9IEwuY3ggLyBrLCBjeSA9IEwuY3kgLyBrLCBoYWxmID0gRy50aCAvIDI7CiAgICBjb25zdCBwdCA9IChSLCBhKSA9PiBbY3ggKyBSICogTWF0aC5zaW4oYSksIGN5IC0gUiAqIE1hdGguY29zKGEpXS5tYXAodiA9PiB2LnRvRml4ZWQoMykpLmpvaW4oIiAiKTsKICAgIGNvbnN0IGdsdWVBID0gY3VwLmdsdWUgLyAoKEcuUm8gKyBHLlJpKSAvIDIpOwogICAgY29uc3QgY3V0ID0gYE0gJHtwdChHLlJvLCAtaGFsZil9IEEgJHtHLlJvLnRvRml4ZWQoMyl9ICR7Ry5Sby50b0ZpeGVkKDMpfSAwIDAgMSAke3B0KEcuUm8sIGhhbGYgKyBnbHVlQSl9IEwgJHtwdChHLlJpLCBoYWxmICsgZ2x1ZUEpfSBBICR7Ry5SaS50b0ZpeGVkKDMpfSAke0cuUmkudG9GaXhlZCgzKX0gMCAwIDAgJHtwdChHLlJpLCAtaGFsZil9IFpgOwogICAgY29uc3Qgc3ZnID0gYDw\/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IiR7d21tLnRvRml4ZWQoMil9bW0iIGhlaWdodD0iJHtobW0udG9GaXhlZCgyKX1tbSIgdmlld0JveD0iMCAwICR7d21tLnRvRml4ZWQoMyl9ICR7aG1tLnRvRml4ZWQoMyl9Ij4KICA8dGl0bGU+w4l2ZW50YWlsICR7Y3VwLmxhYmVsfSDigJQgUm8gJHtmbXQoRy5Sbyl9IG1tLCBSaSAke2ZtdChHLlJpKX0gbW0sIGFuZ2xlICR7Zm10KEcudGggKiAxODAgLyBNYXRoLlBJLCAyKX3CsDwvdGl0bGU+CiAgPGcgaWQ9IlZpc3VlbCI+PGltYWdlIHg9IjAiIHk9IjAiIHdpZHRoPSIke3dtbS50b0ZpeGVkKDMpfSIgaGVpZ2h0PSIke2htbS50b0ZpeGVkKDMpfSIgeGxpbms6aHJlZj0iJHtjLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIil9Ii8+PC9nPgogIDxnIGlkPSJEZWNvdXBlIiBmaWxsPSJub25lIiBzdHJva2U9IiNGRjAwRkYiIHN0cm9rZS13aWR0aD0iMC4yNSI+PHBhdGggZD0iJHtjdXR9Ii8+PC9nPgo8L3N2Zz5gOwogICAgZG93bmxvYWQoYGV2ZW50YWlsLSR7Y3VwLmxhYmVsLnJlcGxhY2UoIiAiLCAiIil9LnN2Z2AsIG5ldyBCbG9iKFtzdmddLCB7IHR5cGU6ICJpbWFnZS9zdmcreG1sIiB9KSk7CiAgfSk7CiAgJCgiZGxUZW1wbGF0ZSIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgY29uc3QgVCA9IHRwbCgpLCBiID0gY3VwLmJsZWVkLCBzID0gY3VwLnNhZmUsIFcgPSBULlcgKyAyICogYiwgSCA9IFQuSCArIDIgKiBiOwogICAgY29uc3Qgc3ZnID0gYDw\/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iJHtXLnRvRml4ZWQoMil9bW0iIGhlaWdodD0iJHtILnRvRml4ZWQoMil9bW0iIHZpZXdCb3g9IjAgMCAke1cudG9GaXhlZCgzKX0gJHtILnRvRml4ZWQoMyl9Ij4KICA8dGl0bGU+R2FiYXJpdCByZWN0YW5ndWxhaXJlICR7Y3VwLmxhYmVsfSDigJQgem9uZSB1dGlsZSAke2ZtdChULlcpfSDDlyAke2ZtdChULkgpfSBtbTwvdGl0bGU+CiAgPGcgaWQ9IkZvbmQtcGVyZHUiPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIke1cudG9GaXhlZCgzKX0iIGhlaWdodD0iJHtILnRvRml4ZWQoMyl9IiBmaWxsPSIjRkZGRkZGIiBzdHJva2U9IiM5OTk5OTkiIHN0cm9rZS13aWR0aD0iMC4yIi8+PC9nPgogIDxnIGlkPSJDb3VwZSI+PHJlY3QgeD0iJHtifSIgeT0iJHtifSIgd2lkdGg9IiR7VC5XLnRvRml4ZWQoMyl9IiBoZWlnaHQ9IiR7VC5ILnRvRml4ZWQoMyl9IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMC4zIi8+PC9nPgogIDxnIGlkPSJTZWN1cml0ZSI+PHJlY3QgeD0iJHtiICsgc30iIHk9IiR7YiArIHN9IiB3aWR0aD0iJHsoVC5XIC0gMiAqIHMpLnRvRml4ZWQoMyl9IiBoZWlnaHQ9IiR7KFQuSCAtIDIgKiBzKS50b0ZpeGVkKDMpfSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjRDIzMzdBIiBzdHJva2Utd2lkdGg9IjAuMjUiIHN0cm9rZS1kYXNoYXJyYXk9IjIgMS40Ii8+PC9nPgogIDxnIGlkPSJJbmZvcyIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjMuMiIgZmlsbD0iIzY2NjY2NiI+CiAgICA8dGV4dCB4PSIke2IgKyBzICsgMn0iIHk9IiR7YiArIHMgKyA1fSI+R29iZWxldCAke2N1cC5sYWJlbH0gwrcgem9uZSB1dGlsZSAke2ZtdChULlcpfSDDlyAke2ZtdChULkgpfSBtbSDCtyBmb25kIHBlcmR1ICR7Yn0gbW0gwrcgc8OpY3VyaXTDqSAke3N9IG1tPC90ZXh0PgogICAgPHRleHQgeD0iJHtiICsgcyArIDJ9IiB5PSIke2IgKyBzICsgMTB9Ij5IYXV0IGRlIGxhIG1hcXVldHRlID0gYm9yZCBkdSBnb2JlbGV0LiBDb3VsZXVycyBlbiB0b25zIGRpcmVjdHMgUGFudG9uZSwgNCBtYXhpbXVtLiBEw6lmb3JtYXRpb24gOiAke3dhcnBNb2RlID09PSAic3RhbmRhcmQiID8gInN0YW5kYXJkIiA6ICJmb3JtZXMgcHLDqXNlcnbDqWVzIn0uPC90ZXh0PgogIDwvZz4KPC9zdmc+YDsKICAgIGRvd25sb2FkKGBnYWJhcml0LXJlY3Rhbmd1bGFpcmUtJHtjdXAubGFiZWwucmVwbGFjZSgiICIsICIiKX0uc3ZnYCwgbmV3IEJsb2IoW3N2Z10sIHsgdHlwZTogImltYWdlL3N2Zyt4bWwiIH0pKTsKICB9KTsKCiAgLyogLS0tLS0tLS0tLSBWYWxpZGF0aW9uIC0tLS0tLS0tLS0gKi8KICAkKCJhcHByb3ZlIikuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZSA9PiB7ICQoIm9yZGVyIikuZGlzYWJsZWQgPSAhZS50YXJnZXQuY2hlY2tlZDsgfSk7CiAgLyogQ2FwdHVyZSBkZXMgNCBjw7R0w6lzIGF2ZWMgdW4gcmVuZHUgc8OpcGFyw6ksIHNhbnMgdG91Y2hlciDDoCBsYSB2dWUgZHUgY2xpZW50ICovCiAgbGV0IHNob3RSZW5kZXJlciA9IG51bGw7CiAgZnVuY3Rpb24gY2FwdHVyZVZpZXdzKCkgewogICAgY29uc3QgdyA9IDUwMCwgaCA9IDYwMDsKICAgIGlmICghc2hvdFJlbmRlcmVyKSB7CiAgICAgIHNob3RSZW5kZXJlciA9IG5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHsgYW50aWFsaWFzOiB0cnVlLCBhbHBoYTogdHJ1ZSwgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0cnVlIH0pOwogICAgICBzaG90UmVuZGVyZXIub3V0cHV0RW5jb2RpbmcgPSBUSFJFRS5zUkdCRW5jb2Rpbmc7CiAgICAgIHNob3RSZW5kZXJlci5zaGFkb3dNYXAuZW5hYmxlZCA9IHRydWU7IHNob3RSZW5kZXJlci5zaGFkb3dNYXAudHlwZSA9IFRIUkVFLlBDRlNvZnRTaGFkb3dNYXA7CiAgICAgIHNob3RSZW5kZXJlci5zZXRTaXplKHcsIGgsIGZhbHNlKTsKICAgIH0KICAgIGNvbnN0IGNhbSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSgzMCwgdyAvIGgsIDEsIDIwMDApOwogICAgY2FtLnBvc2l0aW9uLnNldCgwLCA0NSwgMzM1KTsgY2FtLmxvb2tBdCgwLCAtMiwgMCk7CiAgICBjb25zdCBrZWVwID0gY3VwR3JvdXAucm90YXRpb24ueTsKICAgIGNvbnN0IG5hbWVzID0gW1siRmFjZSIsIDBdLCBbIkPDtHTDqSBkcm9pdCIsIDkwXSwgWyJEb3MiLCAxODBdLCBbIkPDtHTDqSBnYXVjaGUiLCAyNzBdXTsKICAgIGNvbnN0IG91dCA9IG5hbWVzLm1hcCgoW2xhYmVsLCBkZWddKSA9PiB7CiAgICAgIGN1cEdyb3VwLnJvdGF0aW9uLnkgPSAtZGVnICogTWF0aC5QSSAvIDE4MDsKICAgICAgc2hvdFJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtKTsKICAgICAgcmV0dXJuIHsgbGFiZWwsIGRlZywgc3JjOiBzaG90UmVuZGVyZXIuZG9tRWxlbWVudC50b0RhdGFVUkwoImltYWdlL3BuZyIpIH07CiAgICB9KTsKICAgIGN1cEdyb3VwLnJvdGF0aW9uLnkgPSBrZWVwOwogICAgcmV0dXJuIG91dDsKICB9CgogIGxldCBkZWFkbGluZUF0ID0gbnVsbCwgb3JkZXJTdGF0ZSA9ICJvcGVuIiwgcGVuZGluZ0FjdGlvbiA9IG51bGwsIGNkVGltZXIgPSBudWxsOwogIGNvbnN0IGZtdERhdGUgPSBkID0+IGAke2QudG9Mb2NhbGVEYXRlU3RyaW5nKCJmci1DQSIsIHsgd2Vla2RheTogImxvbmciLCBkYXk6ICJudW1lcmljIiwgbW9udGg6ICJsb25nIiB9KX0gw6AgJHtkLnRvTG9jYWxlVGltZVN0cmluZygiZnItQ0EiLCB7IGhvdXI6ICIyLWRpZ2l0IiwgbWludXRlOiAiMi1kaWdpdCIgfSl9YDsKICBmdW5jdGlvbiB0aWNrKCkgewogICAgaWYgKCFkZWFkbGluZUF0IHx8IG9yZGVyU3RhdGUgIT09ICJvcGVuIikgcmV0dXJuOwogICAgY29uc3QgbXMgPSBkZWFkbGluZUF0IC0gRGF0ZS5ub3coKTsKICAgIGlmIChtcyA8PSAwKSB7CiAgICAgIG9yZGVyU3RhdGUgPSAibG9ja2VkIjsgJCgiY291bnRkb3duIikudGV4dENvbnRlbnQgPSAiZMOpbGFpIGV4cGlyw6kiOwogICAgICAkKCJkZWFkbGluZUFjdGlvbnMiKS5oaWRkZW4gPSB0cnVlOyAkKCJjb25maXJtQm94IikuaGlkZGVuID0gdHJ1ZTsKICAgICAgJCgiZGVhZGxpbmVUZXh0IikudGV4dENvbnRlbnQgPSAiTGUgZMOpbGFpIGRlIDI0IGggZXN0IMOpY291bMOpIDogbGEgY29tbWFuZGUgcGFydCBlbiBwcm9kdWN0aW9uIHRlbGxlIHF1J2FwcHJvdXbDqWUuIjsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgaGggPSBNYXRoLmZsb29yKG1zIC8gMzYwMDAwMCksIG1tID0gTWF0aC5mbG9vcihtcyAlIDM2MDAwMDAgLyA2MDAwMCk7CiAgICAkKCJjb3VudGRvd24iKS50ZXh0Q29udGVudCA9IGAke2hofSBoICR7U3RyaW5nKG1tKS5wYWRTdGFydCgyLCAiMCIpfSBtaW4gcmVzdGFudGVzYDsKICB9CiAgZnVuY3Rpb24gb3BlbkNvbmZpcm0oa2luZCkgewogICAgcGVuZGluZ0FjdGlvbiA9IGtpbmQ7CiAgICAkKCJjb25maXJtQm94IikuaGlkZGVuID0gZmFsc2U7ICQoImZpeE5vdGUiKS5oaWRkZW4gPSBraW5kICE9PSAiZml4IjsKICAgICQoImNvbmZpcm1UZXh0IikudGV4dENvbnRlbnQgPSBraW5kID09PSAiY2FuY2VsIgogICAgICA\/ICJDb25maXJtZXotdm91cyBsJ2FubnVsYXRpb24gPyAxMCAlIGR1IG1vbnRhbnQgZGUgbGEgY29tbWFuZGUgc2Vyb250IHJldGVudXMgcG91ciBmcmFpcyBkZSB0cmFpdGVtZW50LCBsZSByZXN0ZSB2b3VzIHNlcmEgcmVtYm91cnPDqS4iCiAgICAgIDogIlZvdHJlIGRlbWFuZGUgZGUgcmVjdGlmaWNhdGlvbiBzZXJhIHRyYW5zbWlzZSBhdSBwcsOpcHJlc3NlLiAxMCAlIGR1IG1vbnRhbnQgZGUgbGEgY29tbWFuZGUgc2Vyb250IGZhY3R1csOpcyBwb3VyIGZyYWlzIGRlIHRyYWl0ZW1lbnQsIGV0IHVuZSBub3V2ZWxsZSDDqXByZXV2ZSB2b3VzIHNlcmEgZW52b3nDqWUuIjsKICB9CiAgJCgiYXNrQ2FuY2VsIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBvcGVuQ29uZmlybSgiY2FuY2VsIikpOwogICQoImFza0ZpeCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gb3BlbkNvbmZpcm0oImZpeCIpKTsKICAkKCJjb25maXJtTm8iKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsgJCgiY29uZmlybUJveCIpLmhpZGRlbiA9IHRydWU7IHBlbmRpbmdBY3Rpb24gPSBudWxsOyB9KTsKICAkKCJjb25maXJtWWVzIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICBpZiAocGVuZGluZ0FjdGlvbiA9PT0gImZpeCIgJiYgISQoImZpeE5vdGUiKS52YWx1ZS50cmltKCkpIHsgJCgiZml4Tm90ZSIpLmZvY3VzKCk7ICQoImZpeE5vdGUiKS5wbGFjZWhvbGRlciA9ICJJbmRpcXVleiBsYSBtb2RpZmljYXRpb24gc291aGFpdMOpZSBhdmFudCBkZSBjb25maXJtZXIuIjsgcmV0dXJuOyB9ICAgIG9yZGVyU3RhdGUgPSBwZW5kaW5nQWN0aW9uID09PSAiY2FuY2VsIiA\/ICJjYW5jZWxsZWQiIDogImZpeCI7CiAgICAkKCJjb25maXJtQm94IikuaGlkZGVuID0gdHJ1ZTsgJCgiZGVhZGxpbmVBY3Rpb25zIikuaGlkZGVuID0gdHJ1ZTsKICAgIGNvbnN0IHBpbGwgPSAkKCJvcmRlclBpbGwiKTsKICAgIGlmIChvcmRlclN0YXRlID09PSAiY2FuY2VsbGVkIikgewogICAgICBwaWxsLmNsYXNzTmFtZSA9ICJwaWxsIHdhcm4iOyBwaWxsLnRleHRDb250ZW50ID0gIkFubnVsw6llIjsKICAgICAgJCgiY291bnRkb3duIikudGV4dENvbnRlbnQgPSAiIjsgJCgiZGVhZGxpbmVUZXh0IikudGV4dENvbnRlbnQgPSAiQ29tbWFuZGUgYW5udWzDqWUuIFJldGVudWUgZGUgMTAgJSBwb3VyIGZyYWlzIGRlIHRyYWl0ZW1lbnQgYXBwbGlxdcOpZS4iOwogICAgfSBlbHNlIHsKICAgICAgcGlsbC5jbGFzc05hbWUgPSAicGlsbCB3YXJuIjsgcGlsbC50ZXh0Q29udGVudCA9ICJSZWN0aWZpY2F0aW9uIGRlbWFuZMOpZSI7CiAgICAgICQoImNvdW50ZG93biIpLnRleHRDb250ZW50ID0gIiI7ICQoImRlYWRsaW5lVGV4dCIpLnRleHRDb250ZW50ID0gYFJlY3RpZmljYXRpb24gdHJhbnNtaXNlIGF1IHByw6lwcmVzc2UgOiDCqyAkeyQoImZpeE5vdGUiKS52YWx1ZS50cmltKCl9IMK7LiBGcmFpcyBkZSB0cmFpdGVtZW50IGRlIDEwICUgYXBwbGlxdcOpcy4gVW5lIG5vdXZlbGxlIMOpcHJldXZlIDNEIHZvdXMgc2VyYSBzb3VtaXNlLmA7CiAgICB9CiAgfSk7CgogICQoIm9yZGVyIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICBjb25zdCB2aWV3cyA9IGNhcHR1cmVWaWV3cygpOwogICAgY29uc3QgaW5rcyA9IGFuYWx5c2lzLmlua3Muc2xpY2UoMCwgNCkubWFwKChjLCBpKSA9PiBgJHtwYW50b25lT3ZlcnJpZGVzW2ldID8\/IG5lYXJlc3RQYW50b25lKGMucmdiKS5uYW1lfWApOwogICAgY29uc3Qgc3VtbWFyeSA9IFsKICAgICAgIkNvbmZpZ3VyYXRpb24gM0QgQVNXQUwiLAogICAgICBgRm9ybWF0IDogJHskKCJmb3JtYXQiKS5zZWxlY3RlZE9wdGlvbnNbMF0udGV4dENvbnRlbnR9YCwKICAgICAgYFF1YW50aXTDqSA6ICR7JCgicXR5IikudmFsdWV9YCwKICAgICAgYE1hcXVldHRlIDogJHtzb3VyY2VJbmZvLm5hbWV9YCwKICAgICAgYETDqWZvcm1hdGlvbiA6ICR7d2FycE1vZGUgPT09ICJzdGFuZGFyZCIgPyAiU3RhbmRhcmQiIDogIkZvcm1lcyBwcsOpc2VydsOpZXMifWAsCiAgICAgIGBQb3NlcyA6ICR7cG9zZXMubnh9IGVuIGxhcmdldXIgw5cgJHtwb3Nlcy5ueX0gZW4gaGF1dGV1ciR7cG9zZXMua2VlcCA\/ICIgwrcgcHJvcG9ydGlvbnMgZ2FyZMOpZXMiIDogIiDCtyDDqXRpcsOpZSJ9YCwKICAgICAgYENvdWxldXJzIDogJHthbmFseXNpcy5pbmtzLmxlbmd0aH0gwrcgJHtpbmtzLmpvaW4oIiwgIikgfHwgImF1Y3VuZSJ9YCwKICAgICAgYFLDqWR1Y3Rpb24gOiAke2xpbWl0ID8gYExpbWl0w6llIMOgICR7bGltaXR9IGNvdWxldXIke2xpbWl0ID4gMSA\/ICJzIiA6ICIifWAgOiAiQXVjdW5lIn1gLAogICAgICAiQXBlcsOndSBwcm92aXNvaXJlIHN1ciBsZSBtb2TDqGxlIDEyIG96OyBnYWJhcml0IGR1IGZvcm1hdCBjaG9pc2kgw6AgdmFsaWRlciBwYXIgQVNXQUwuIiwiTGUgY2xpZW50IGEgY29uZmlybcOpIGwnYXBlcsOndSAzRC4iCiAgICBdLmpvaW4oU3RyaW5nLmZyb21DaGFyQ29kZSgxMCkpOwoKICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoewogICAgICB0eXBlOiAiYXN3YWwtY3VwLWNvbmZpZ3VyYXRvci1xdW90ZSIsCiAgICAgIHN1bW1hcnk6IHN1bW1hcnksCiAgICAgIGZpbGU6IHVwbG9hZGVkRmlsZSB8fCBudWxsLAogICAgICBwcmV2aWV3RGF0YVVybDogdmlld3NbMF0gPyB2aWV3c1swXS5zcmMgOiBudWxsCiAgICB9LCAiKiIpOwogIH0pOwoKICAvKiAtLS0tLS0tLS0tIFLDqWFsaXTDqSBhdWdtZW50w6llIDogZ29iZWxldCDDoCB0YWlsbGUgcsOpZWxsZSAobcOodHJlcyksIGJhc2UgcG9zw6llIMOgIHkgPSAwIC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiByZXZlcnNlZEdlbyhnKSB7CiAgICBjb25zdCByID0gZy5jbG9uZSgpOyBjb25zdCBpZHggPSByLmluZGV4LmFycmF5LnNsaWNlKCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkeC5sZW5ndGg7IGkgKz0gMykgeyBjb25zdCB0ID0gaWR4W2kgKyAxXTsgaWR4W2kgKyAxXSA9IGlkeFtpICsgMl07IGlkeFtpICsgMl0gPSB0OyB9CiAgICByLnNldEluZGV4KEFycmF5LmZyb20oaWR4KSk7IHIuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTsgcmV0dXJuIHI7CiAgfQogIGZ1bmN0aW9uIGJ1aWxkQVJDdXAoKSB7CiAgICBjb25zdCBrID0gMC4wMDEsIEggPSBjdXAuaCwgclQgPSBjdXAuRCAvIDIsIHJCID0gY3VwLmQgLyAyLCBnID0gbmV3IFRIUkVFLkdyb3VwKCk7CiAgICAvLyBtYXF1ZXR0ZSByZWNhZHLDqWUgY29tbWUgZGFucyBsJ2FwZXLDp3UgKGNlbnRyZSBkZSBsYSBtYXF1ZXR0ZSBmYWNlIMOgIGwnYXZhbnQpCiAgICBjb25zdCB3ID0gMjA0OCwgaCA9IE1hdGgucm91bmQodyAqIGFydC5oZWlnaHQgLyBhcnQud2lkdGgpLCBjdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOyBjdi53aWR0aCA9IHc7IGN2LmhlaWdodCA9IGg7CiAgICBjb25zdCBjID0gY3YuZ2V0Q29udGV4dCgiMmQiKTsgYy5kcmF3SW1hZ2UoYXJ0LCAtMC4yNSAqIHcsIDAsIHcsIGgpOyBjLmRyYXdJbWFnZShhcnQsIDAuNzUgKiB3LCAwLCB3LCBoKTsKICAgIGNvbnN0IHR4ID0gbmV3IFRIUkVFLkNhbnZhc1RleHR1cmUoY3YpOyB0eC5lbmNvZGluZyA9IFRIUkVFLnNSR0JFbmNvZGluZzsKICAgIGNvbnN0IHdhbGxHID0gY3VwV2FsbEdlbyhyVCwgckIsIEgsIDk2KTsgd2FsbEcudHJhbnNsYXRlKDAsIEggLyAyLCAwKTsgd2FsbEcuc2NhbGUoaywgaywgayk7CiAgICBnLmFkZChuZXcgVEhSRUUuTWVzaCh3YWxsRywgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgbWFwOiB0eCwgcm91Z2huZXNzOiAwLjYgfSkpKTsKICAgIGNvbnN0IGlubkcgPSBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeShyVCAtIDAuNCwgckIgLSAwLjQsIEggLSAwLjUsIDk2LCAxLCB0cnVlKTsgaW5uRy50cmFuc2xhdGUoMCwgSCAvIDIgKyAwLjI1LCAwKTsgaW5uRy5zY2FsZShrLCBrLCBrKTsKICAgIGNvbnN0IHBhcGVyID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgY29sb3I6IDB4ZjRmMmVlLCByb3VnaG5lc3M6IDAuOCB9KTsKICAgIGcuYWRkKG5ldyBUSFJFRS5NZXNoKHJldmVyc2VkR2VvKGlubkcpLCBwYXBlcikpOwogICAgY29uc3QgcmltRyA9IG5ldyBUSFJFRS5Ub3J1c0dlb21ldHJ5KHJUICsgMC40LCAxLjUsIDEyLCA5Nik7IHJpbUcucm90YXRlWChNYXRoLlBJIC8gMik7IHJpbUcudHJhbnNsYXRlKDAsIEgsIDApOyByaW1HLnNjYWxlKGssIGssIGspOwogICAgZy5hZGQobmV3IFRIUkVFLk1lc2gocmltRywgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgY29sb3I6IDB4ZjdmNmYzLCByb3VnaG5lc3M6IDAuNTUgfSkpKTsKICAgIGNvbnN0IGJJbiA9IDYsIHJJbiA9IHJCICsgKHJUIC0gckIpICogKGJJbiAvIEgpOwogICAgY29uc3QgYm90RyA9IG5ldyBUSFJFRS5DaXJjbGVHZW9tZXRyeShySW4sIDY0KTsgYm90Ry5yb3RhdGVYKC1NYXRoLlBJIC8gMik7IGJvdEcudHJhbnNsYXRlKDAsIGJJbiwgMCk7IGJvdEcuc2NhbGUoaywgaywgayk7CiAgICBjb25zdCBib3RNID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgY29sb3I6IDB4ZWJlOGUyLCByb3VnaG5lc3M6IDAuODUgfSk7CiAgICBnLmFkZChuZXcgVEhSRUUuTWVzaChib3RHLCBib3RNKSk7IGcuYWRkKG5ldyBUSFJFRS5NZXNoKHJldmVyc2VkR2VvKGJvdEcpLCBib3RNKSk7CiAgICAvLyBmb25kIGV4dMOpcmlldXIgKGJvcmQgcm91bMOpKSBwb3VyIHF1ZSBsZSBnb2JlbGV0IHJlcG9zZSBzdXIgdW5lIHN1cmZhY2UKICAgIGNvbnN0IGJhc2VHID0gbmV3IFRIUkVFLkNpcmNsZUdlb21ldHJ5KHJCLCA2NCk7IGJhc2VHLnJvdGF0ZVgoTWF0aC5QSSAvIDIpOyBiYXNlRy5zY2FsZShrLCBrLCBrKTsKICAgIGcuYWRkKG5ldyBUSFJFRS5NZXNoKGJhc2VHLCBib3RNKSk7CiAgICByZXR1cm4gZzsKICB9CiAgY29uc3QgYXJFeHBvcnRHTEIgPSBncnAgPT4gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7IHRyeSB7IG5ldyBUSFJFRS5HTFRGRXhwb3J0ZXIoKS5wYXJzZShncnAsIHIgPT4gcmVzKG5ldyBCbG9iKFtyXSwgeyB0eXBlOiAibW9kZWwvZ2x0Zi1iaW5hcnkiIH0pKSwgeyBiaW5hcnk6IHRydWUgfSk7IH0gY2F0Y2ggKGUpIHsgcmVqKGUpOyB9IH0pOwogIGNvbnN0IGFyRXhwb3J0VVNEWiA9IGFzeW5jIGdycCA9PiB7CiAgICAvLyBsJ2V4cG9ydGF0ZXVyIFVTRFogZGUgdGhyZWUgcjEyOCBpbnZlcnNlIGTDqWrDoCBsZSBWIDogb24gY29tcGVuc2UgcG91ciBxdWUgbGUgdmlzdWVsIHNvaXQgw6AgbCdlbmRyb2l0IGRhbnMgUXVpY2sgTG9vawogICAgY29uc3QgZzIgPSBncnAuY2xvbmUodHJ1ZSk7CiAgICBnMi50cmF2ZXJzZShvID0+IHsgaWYgKG8uaXNNZXNoKSB7IG8uZ2VvbWV0cnkgPSBvLmdlb21ldHJ5LmNsb25lKCk7IGNvbnN0IHV2ID0gby5nZW9tZXRyeS5hdHRyaWJ1dGVzLnV2OyBpZiAodXYpIHsgZm9yIChsZXQgaSA9IDA7IGkgPCB1di5jb3VudDsgaSsrKSB1di5zZXRZKGksIDEgLSB1di5nZXRZKGkpKTsgdXYubmVlZHNVcGRhdGUgPSB0cnVlOyB9IH0gfSk7CiAgICByZXR1cm4gbmV3IEJsb2IoW2F3YWl0IG5ldyBUSFJFRS5VU0RaRXhwb3J0ZXIoKS5wYXJzZShnMildLCB7IHR5cGU6ICJtb2RlbC92bmQudXNkeit6aXAiIH0pOwogIH07CiAgbGV0IGFyRmlsZXMgPSB7fSwgYXJVUkxzID0gW107CiAgY29uc3QgaXNJT1MgPSAvaVAoaG9uZXxhZHxvZCkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgKG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gIk1hY0ludGVsIiAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxKTsKICBhc3luYyBmdW5jdGlvbiBwcmVwYXJlQVIoKSB7CiAgICAkKCJhclN1YiIpLnRleHRDb250ZW50ID0gIlByw6lwYXJhdGlvbiBkdSBtb2TDqGxl4oCmIjsgJCgiYXJMYXVuY2giKS5kaXNhYmxlZCA9ICQoImFyWmlwIikuZGlzYWJsZWQgPSB0cnVlOyAkKCJhck1zZyIpLmhpZGRlbiA9IHRydWU7CiAgICBhclVSTHMuZm9yRWFjaCh1ID0+IFVSTC5yZXZva2VPYmplY3RVUkwodSkpOyBhclVSTHMgPSBbXTsKICAgICQoImFyU3RhZ2UiKS5pbm5lckhUTUwgPSBgPHAgY2xhc3M9ImZpbmUiIHN0eWxlPSJwYWRkaW5nOjE2cHgiPlByw6lwYXJhdGlvbiBkdSBtb2TDqGxlIEFS4oCmPC9wPmA7CiAgICB0cnkgewogICAgICBjb25zdCBncnAgPSBidWlsZEFSQ3VwKCksIGdsYiA9IGF3YWl0IGFyRXhwb3J0R0xCKGdycCksIHVzZHogPSBhd2FpdCBhckV4cG9ydFVTRFooZ3JwKTsKICAgICAgYXJGaWxlcyA9IHsgZ2xiLCB1c2R6IH07IGNvbnN0IGd1ID0gVVJMLmNyZWF0ZU9iamVjdFVSTChnbGIpLCB1dSA9IFVSTC5jcmVhdGVPYmplY3RVUkwodXNkeik7IGFyVVJMcy5wdXNoKGd1LCB1dSk7CiAgICAgICQoImFyU3ViIikudGV4dENvbnRlbnQgPSBgJHtjdXAubGFiZWx9IMK3ICR7Y3VwLm1sfSBtbCDCtyAke3NvdXJjZUluZm8ubmFtZX1gOwogICAgICAkKCJhclppcCIpLmRpc2FibGVkID0gZmFsc2U7CiAgICAgIGlmICghd2luZG93LmN1c3RvbUVsZW1lbnRzIHx8ICFjdXN0b21FbGVtZW50cy5nZXQoIm1vZGVsLXZpZXdlciIpKSB7ICQoImFyU3RhZ2UiKS5pbm5lckhUTUwgPSBgPHAgY2xhc3M9ImZpbmUiIHN0eWxlPSJwYWRkaW5nOjE2cHgiPkwnYXBlcsOndSBBUiBuJ2EgcGFzIHB1IHNlIGNoYXJnZXIuIExlcyBmaWNoaWVycyBBUiByZXN0ZW50IHTDqWzDqWNoYXJnZWFibGVzLjwvcD5gOyByZXR1cm47IH0KICAgICAgJCgiYXJTdGFnZSIpLmlubmVySFRNTCA9IGA8bW9kZWwtdmlld2VyIGlkPSJtdiIgc3JjPSIke2d1fSIgaW9zLXNyYz0iJHt1dX0iIGFyIGFyLW1vZGVzPSJ3ZWJ4ciBxdWljay1sb29rIHNjZW5lLXZpZXdlciIgYXItc2NhbGU9ImZpeGVkIiBhci1wbGFjZW1lbnQ9ImZsb29yIiBjYW1lcmEtY29udHJvbHMgYXV0by1yb3RhdGUgc2hhZG93LWludGVuc2l0eT0iMSIgZW52aXJvbm1lbnQtaW1hZ2U9Im5ldXRyYWwiIGNhbWVyYS1vcmJpdD0iMGRlZyA3NWRlZyAwLjQ1bSIgYWx0PSJHb2JlbGV0IGVuIHLDqWFsaXTDqSBhdWdtZW50w6llIj48YnV0dG9uIHNsb3Q9ImFyLWJ1dHRvbiIgaGlkZGVuPjwvYnV0dG9uPjwvbW9kZWwtdmlld2VyPmA7CiAgICAgICQoImFyTGF1bmNoIikuZGlzYWJsZWQgPSBmYWxzZTsKICAgIH0gY2F0Y2ggKGUpIHsgJCgiYXJNc2ciKS5oaWRkZW4gPSBmYWxzZTsgJCgiYXJNc2ciKS50ZXh0Q29udGVudCA9ICJMZSBtb2TDqGxlIEFSIG4nYSBwYXMgcHUgw6p0cmUgcHLDqXBhcsOpIDogIiArIGUubWVzc2FnZTsgfQogIH0KICAkKCJhckJ0biIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4geyAkKCJhck92IikuaGlkZGVuID0gZmFsc2U7IHByZXBhcmVBUigpOyB9KTsKICAkKCJhckNsb3NlIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7ICQoImFyT3YiKS5oaWRkZW4gPSB0cnVlOyB9KTsKICAkKCJhck92IikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBlID0+IHsgaWYgKGUudGFyZ2V0ID09PSAkKCJhck92IikpICQoImFyT3YiKS5oaWRkZW4gPSB0cnVlOyB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7IGlmIChlLmtleSA9PT0gIkVzY2FwZSIpICQoImFyT3YiKS5oaWRkZW4gPSB0cnVlOyB9KTsKICAkKCJhckxhdW5jaCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKCkgPT4gewogICAgJCgiYXJNc2ciKS5oaWRkZW4gPSB0cnVlOwogICAgaWYgKGlzSU9TKSB7IGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7IGEucmVsID0gImFyIjsgYS5ocmVmID0gYXJVUkxzWzFdOyBhLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpKTsgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsgYS5jbGljaygpOyBhLnJlbW92ZSgpOyByZXR1cm47IH0KICAgIGNvbnN0IG12ID0gJCgibXYiKTsgaWYgKG12ICYmIG12LmNhbkFjdGl2YXRlQVIpIHsgdHJ5IHsgYXdhaXQgbXYuYWN0aXZhdGVBUigpOyByZXR1cm47IH0gY2F0Y2ggKGUpIHsgLyogc3VpdGUgKi8gfSB9CiAgICAkKCJhck1zZyIpLmhpZGRlbiA9IGZhbHNlOwogICAgJCgiYXJNc2ciKS50ZXh0Q29udGVudCA9ICJMYSByw6lhbGl0w6kgYXVnbWVudMOpZSBuJ2VzdCBwYXMgZGlzcG9uaWJsZSBkYW5zIGNldHRlIGZlbsOqdHJlLiBPdXZyZXogbGEgcGFnZSBkYW5zIFNhZmFyaSAoaVBob25lKSBvdSBDaHJvbWUgKEFuZHJvaWQpIHN1ciB2b3RyZSBwcm9wcmUgc2l0ZSwgb3UgdMOpbMOpY2hhcmdleiBsZXMgZmljaGllcnMgQVIuIjsKICB9KTsKICAkKCJhclppcCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgY29uc3QgYmFzZSA9ICJnb2JlbGV0LSIgKyBjdXAubGFiZWwucmVwbGFjZSgiICIsICIiKTsKICAgIFByb21pc2UuYWxsKFthckZpbGVzLnVzZHouYXJyYXlCdWZmZXIoKSwgYXJGaWxlcy5nbGIuYXJyYXlCdWZmZXIoKV0pLnRoZW4oKFt1LCBnXSkgPT4gewogICAgICBjb25zdCB6ID0gZmZsYXRlLnppcFN5bmMoeyBbYmFzZSArICIudXNkeiJdOiBbbmV3IFVpbnQ4QXJyYXkodSksIHsgbGV2ZWw6IDAgfV0sIFtiYXNlICsgIi5nbGIiXTogW25ldyBVaW50OEFycmF5KGcpLCB7IGxldmVsOiA2IH1dLAogICAgICAgICJMSVNFWi1NT0kudHh0IjogZmZsYXRlLnN0clRvVTgoImlQaG9uZS9pUGFkIDogb3V2cmV6IGxlIGZpY2hpZXIgLnVzZHogZGFucyBGaWNoaWVycyBwb3VyIGxlIHZvaXIgZW4gQVIgKEFSIFF1aWNrIExvb2spLm5BbmRyb2lkIDogb3V2cmV6IGxlIGZpY2hpZXIgLmdsYiBhdmVjIHVuZSB2aXNpb25uZXVzZSAzRCBjb21wYXRpYmxlIEFSLm4iKSB9KTsKICAgICAgZG93bmxvYWQoYmFzZSArICItYXIuemlwIiwgbmV3IEJsb2IoW3pdLCB7IHR5cGU6ICJhcHBsaWNhdGlvbi96aXAiIH0pKTsKICAgIH0pOwogIH0pOwoKICAvKiAtLS0tLS0tLS0tIFRow6htZSA6IHJlZGVzc2luZXIgbGVzIHJlcMOocmVzIC0tLS0tLS0tLS0gKi8KICBtYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIikuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgKCkgPT4gcmVuZGVyRmFuKGZhbkNhbnZhcywgbnVsbCwgdHJ1ZSkpOwogIG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHJlbmRlckZhbihmYW5DYW52YXMsIG51bGwsIHRydWUpKS5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgeyBhdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsiZGF0YS10aGVtZSJdIH0pOwoKICAvKiAtLS0tLS0tLS0tIETDqW1hcnJhZ2UgLS0tLS0tLS0tLSAqLwogIHJlbmRlclNwZWNzKCk7CiAgZHJhd1NhbXBsZSgpOyByZWZyZXNoQWxsKCk7CiAgaWYgKGRvY3VtZW50LmZvbnRzICYmIGRvY3VtZW50LmZvbnRzLnJlYWR5KSBkb2N1bWVudC5mb250cy5yZWFkeS50aGVuKCgpID0+IHsgZHJhd1NhbXBsZSgpOyByZWZyZXNoQWxsKCk7IH0pOwoKICBmdW5jdGlvbiBzZW5kSGVpZ2h0KCkgewogICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7CiAgICAgIHR5cGU6ICJhc3dhbC1jdXAtY29uZmlndXJhdG9yLWhlaWdodCIsCiAgICAgIGhlaWdodDogTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpCiAgICB9LCAiKiIpOwogIH0KICBuZXcgUmVzaXplT2JzZXJ2ZXIoc2VuZEhlaWdodCkub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIHNlbmRIZWlnaHQpOwogIHNldFRpbWVvdXQoc2VuZEhlaWdodCwgNTAwKTsKfSkoKTsKPC9zY3JpcHQ+Cgo8L2JvZHk+PC9odG1sPg==\";f.title=en?\"ASWAL 3D cup configurator\":\"Configurateur 3D de gobelets ASWAL\";f.srcdoc=new TextDecoder().decode(Uint8Array.from(atob(data),function(c){return c.charCodeAt(0);}));})();<\/script>\n<\/div>\n\n<a id=\"aswal-3d-popup-trigger\"\n   href=\"#elementor-action%3Aaction%3Dpopup%3Aopen%26settings%3DeyJpZCI6IjEyMDYiLCJ0b2dnbGUiOmZhbHNlfQ%3D%3D\"\n   hidden tabindex=\"-1\" aria-hidden=\"true\">Quote<\/a>\n\n<script>\n(function(){\n  'use strict';\n\n  var frame = document.getElementById('aswal-cup-configurator-frame');\n  var pendingQuote = null;\n  var fillTimer1 = null;\n  var fillTimer2 = null;\n\n  if (!frame) return;\n\n  function dataUrlToFile(dataUrl, filename) {\n    if (!dataUrl || typeof dataUrl !== 'string' || dataUrl.indexOf('data:') !== 0) return null;\n    try {\n      var parts = dataUrl.split(',');\n      var mime = (parts[0].match(\/data:([^;]+)\/) || [])[1] || 'image\/png';\n      var bytes = atob(parts[1] || '');\n      var arr = new Uint8Array(bytes.length);\n      for (var i = 0; i < bytes.length; i++) arr[i] = bytes.charCodeAt(i);\n      return new File([arr], filename, { type: mime });\n    } catch (e) {\n      return null;\n    }\n  }\n\n  function checkProduct(form, id, checked) {\n    var field = form.querySelector('#form-field-produitservice-' + id);\n    if (!field) return;\n    field.checked = checked;\n    field.dispatchEvent(new Event('change', { bubbles: true }));\n  }\n\n  function setMessage(field, value) {\n    if (!field) return;\n    field.value = value;\n    field.dispatchEvent(new Event('input', { bubbles: true }));\n    field.dispatchEvent(new Event('change', { bubbles: true }));\n  }\n\n  function setStatus(form, text, error) {\n    var note = form.querySelector('.aswal-3d-quote-transfer');\n    if (!note) {\n      note = document.createElement('div');\n      note.className = 'aswal-3d-quote-transfer';\n      note.setAttribute('role', 'status');\n      note.style.cssText = 'margin:0 0 14px;padding:10px 12px;border-radius:7px;font-size:13px;line-height:1.45;';\n      form.prepend(note);\n    }\n    note.style.background = error ? '#fff2f0' : '#edf8f0';\n    note.style.color = error ? '#9c2f24' : '#22663b';\n    note.textContent = text;\n  }\n\n  function fillQuoteForm() {\n    if (!pendingQuote) return false;\n\n    var modal = document.getElementById('elementor-popup-modal-1206');\n    if (!modal) return false;\n\n    var fileInputs = modal.querySelectorAll('form input[type=\"file\"][id=\"form-field-file\"]');\n    var fileInput = Array.from(fileInputs).find(function(el){\n      return el.getClientRects().length > 0;\n    }) || fileInputs[0];\n\n    if (!fileInput) return false;\n\n    var form = fileInput.closest('form');\n    if (!form) return false;\n\n    var message = form.querySelector('#form-field-message, textarea[name=\"form_fields[message]\"]');\n    setMessage(message, pendingQuote.summary || '');\n\n    checkProduct(form, 0, true);\n    checkProduct(form, 4, true);\n\n    var attached = false;\n    try {\n      if (!fileInput.multiple || !window.DataTransfer) throw new Error('multiple upload unavailable');\n\n      var dt = new DataTransfer();\n      if (pendingQuote.file && pendingQuote.file.name) {\n        dt.items.add(pendingQuote.file);\n      }\n\n      var preview = dataUrlToFile(pendingQuote.previewDataUrl, 'apercu-3d-aswal.png');\n      if (preview) dt.items.add(preview);\n\n      if (dt.files.length) {\n        fileInput.files = dt.files;\n        fileInput.dispatchEvent(new Event('change', { bubbles: true }));\n        attached = fileInput.files.length === dt.files.length;\n      }\n    } catch (e) {\n      attached = false;\n    }\n\n    if (attached) {\n      setStatus(\n        form,\n        (document.documentElement.lang.indexOf('en')===0 ? 'Your artwork and 3D preview are attached. Complete your contact details and send your quote request.' : 'Votre maquette et l\u2019aper\u00e7u 3D sont joints. Compl\u00e9tez vos coordonn\u00e9es puis envoyez la demande de devis.'),\n        false\n      );\n    } else {\n      setStatus(\n        form,\n        (document.documentElement.lang.indexOf('en')===0 ? 'Your 3D selections are included in the message. Check the attachments before sending your request.' : 'Vos choix 3D sont dans le message. V\u00e9rifiez les fichiers joints avant d\u2019envoyer la demande.'),\n        true\n      );\n    }\n\n    return true;\n  }\n\n  function openQuotePopup() {\n    var popupApi = window.elementorProFrontend &&\n      window.elementorProFrontend.modules &&\n      window.elementorProFrontend.modules.popup;\n\n    if (popupApi && typeof popupApi.showPopup === 'function') {\n      popupApi.showPopup({ id: 1206 });\n    } else {\n      var fallback = document.getElementById('aswal-3d-popup-trigger');\n      if (fallback) fallback.click();\n    }\n\n    clearTimeout(fillTimer1);\n    clearTimeout(fillTimer2);\n    fillTimer1 = setTimeout(fillQuoteForm, 250);\n    fillTimer2 = setTimeout(fillQuoteForm, 800);\n  }\n\n  window.addEventListener('message', function(event){\n    if (event.source !== frame.contentWindow || !event.data) return;\n\n    if (event.data.type === 'aswal-cup-configurator-height') {\n      var h = parseInt(event.data.height, 10);\n      if (Number.isFinite(h)) {\n        frame.style.height = Math.max(760, Math.min(h + 12, 5200)) + 'px';\n      }\n      return;\n    }\n\n    if (event.data.type !== 'aswal-cup-configurator-quote') return;\n\n    pendingQuote = event.data;\n    openQuotePopup();\n  });\n\n  document.addEventListener('click', function(event){var a=event.target.closest('a');if(a && a.id !== 'aswal-3d-popup-trigger' && (a.getAttribute('href')||'').indexOf('popup')>=0){pendingQuote=null;clearTimeout(fillTimer1);clearTimeout(fillTimer2);}},true);\n  if (window.jQuery) {\n    jQuery(document).on('elementor\/popup\/show', function(event, id){\n      if (parseInt(id, 10) !== 1206) return;\n      setTimeout(fillQuoteForm, 120);\n    });\n  }\n})();\n<\/script>","protected":false},"excerpt":{"rendered":"<p>Quote<\/p>","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-18022","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Cr\u00e9er mon gobelet personnalis\u00e9 | ASWAL Montr\u00e9al<\/title>\n<meta name=\"description\" content=\"Ajoutez votre logo, visualisez votre gobelet personnalis\u00e9 et demandez un prix \u00e0 ASWAL Montr\u00e9al. Choisissez votre format et pr\u00e9parez votre projet en ligne.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/aswal.ca\/en\/creer-mon-gobelet\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cr\u00e9er mon gobelet personnalis\u00e9 | ASWAL Montr\u00e9al\" \/>\n<meta property=\"og:description\" content=\"Ajoutez votre logo, visualisez votre gobelet personnalis\u00e9 et demandez un prix \u00e0 ASWAL Montr\u00e9al. Choisissez votre format et pr\u00e9parez votre projet en ligne.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/aswal.ca\/en\/creer-mon-gobelet\/\" \/>\n<meta property=\"og:site_name\" content=\"ASWAL\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-27T04:06:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/aswal.ca\/wp-content\/uploads\/2025\/09\/aswal-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"728\" \/>\n\t<meta property=\"og:image:height\" content=\"880\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/aswal.ca\/creer-mon-gobelet\/\",\"url\":\"https:\/\/aswal.ca\/creer-mon-gobelet\/\",\"name\":\"Cr\u00e9er mon gobelet personnalis\u00e9 | ASWAL Montr\u00e9al\",\"isPartOf\":{\"@id\":\"https:\/\/aswal.ca\/#website\"},\"datePublished\":\"2026-09-20T03:38:19+00:00\",\"dateModified\":\"2026-10-27T04:06:38+00:00\",\"description\":\"Ajoutez votre logo, visualisez votre gobelet personnalis\u00e9 et demandez un prix \u00e0 ASWAL Montr\u00e9al. Choisissez votre format et pr\u00e9parez votre projet en ligne.\",\"breadcrumb\":{\"@id\":\"https:\/\/aswal.ca\/creer-mon-gobelet\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/aswal.ca\/creer-mon-gobelet\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/aswal.ca\/creer-mon-gobelet\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/aswal.ca\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cr\u00e9er mon gobelet\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/aswal.ca\/#website\",\"url\":\"https:\/\/aswal.ca\/\",\"name\":\"ASWAL\",\"description\":\"Verres en papier canadiens\",\"publisher\":{\"@id\":\"https:\/\/aswal.ca\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/aswal.ca\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/aswal.ca\/#organization\",\"name\":\"ASWAL\",\"url\":\"https:\/\/aswal.ca\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/aswal.ca\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/aswal.ca\/wp-content\/uploads\/2025\/09\/logo-aswal-registered.svg\",\"contentUrl\":\"https:\/\/aswal.ca\/wp-content\/uploads\/2025\/09\/logo-aswal-registered.svg\",\"width\":594,\"height\":396,\"caption\":\"ASWAL\"},\"image\":{\"@id\":\"https:\/\/aswal.ca\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Design Your Custom Paper Cup | ASWAL Montreal","description":"Upload your logo, preview your custom paper cup and request a quote from ASWAL Montreal. Choose your cup size and start your project online.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/aswal.ca\/en\/creer-mon-gobelet\/","og_locale":"en_US","og_type":"article","og_title":"Cr\u00e9er mon gobelet personnalis\u00e9 | ASWAL Montr\u00e9al","og_description":"Ajoutez votre logo, visualisez votre gobelet personnalis\u00e9 et demandez un prix \u00e0 ASWAL Montr\u00e9al. Choisissez votre format et pr\u00e9parez votre projet en ligne.","og_url":"https:\/\/aswal.ca\/en\/creer-mon-gobelet\/","og_site_name":"ASWAL","article_modified_time":"2026-10-27T04:06:38+00:00","og_image":[{"width":728,"height":880,"url":"https:\/\/aswal.ca\/wp-content\/uploads\/2025\/09\/aswal-1.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/aswal.ca\/creer-mon-gobelet\/","url":"https:\/\/aswal.ca\/creer-mon-gobelet\/","name":"Design Your Custom Paper Cup | ASWAL Montreal","isPartOf":{"@id":"https:\/\/aswal.ca\/#website"},"datePublished":"2026-09-20T03:38:19+00:00","dateModified":"2026-10-27T04:06:38+00:00","description":"Upload your logo, preview your custom paper cup and request a quote from ASWAL Montreal. Choose your cup size and start your project online.","breadcrumb":{"@id":"https:\/\/aswal.ca\/creer-mon-gobelet\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/aswal.ca\/creer-mon-gobelet\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/aswal.ca\/creer-mon-gobelet\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/aswal.ca\/"},{"@type":"ListItem","position":2,"name":"Cr\u00e9er mon gobelet"}]},{"@type":"WebSite","@id":"https:\/\/aswal.ca\/#website","url":"https:\/\/aswal.ca\/","name":"ASWAL","description":"Canadian-made paper cups","publisher":{"@id":"https:\/\/aswal.ca\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/aswal.ca\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/aswal.ca\/#organization","name":"ASWAL","url":"https:\/\/aswal.ca\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/aswal.ca\/#\/schema\/logo\/image\/","url":"https:\/\/aswal.ca\/wp-content\/uploads\/2025\/09\/logo-aswal-registered.svg","contentUrl":"https:\/\/aswal.ca\/wp-content\/uploads\/2025\/09\/logo-aswal-registered.svg","width":594,"height":396,"caption":"ASWAL"},"image":{"@id":"https:\/\/aswal.ca\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/aswal.ca\/en\/wp-json\/wp\/v2\/pages\/18022","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aswal.ca\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/aswal.ca\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/aswal.ca\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/aswal.ca\/en\/wp-json\/wp\/v2\/comments?post=18022"}],"version-history":[{"count":24,"href":"https:\/\/aswal.ca\/en\/wp-json\/wp\/v2\/pages\/18022\/revisions"}],"predecessor-version":[{"id":19156,"href":"https:\/\/aswal.ca\/en\/wp-json\/wp\/v2\/pages\/18022\/revisions\/19156"}],"wp:attachment":[{"href":"https:\/\/aswal.ca\/en\/wp-json\/wp\/v2\/media?parent=18022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}