{"product_id":"custom-dtf-transfer-stickers-tote-bag-hats-t-shirt-hoodies","title":"Custom DTF transfer stickers-tote bag,hats,T-shirt,hoodies...","description":"\u003cdiv id=\"artetribe-dtf-preview-embed\" class=\"artetribe-dtf-preview-embed\" aria-label=\"DTF transfers 3D preview\"\u003e\n  \u003csection class=\"artetribe-dtf-preview-embed__benefits\" aria-label=\"DTF transfer preview benefits\"\u003e\n    \u003carticle\u003e\u003cspan class=\"artetribe-dtf-preview-embed__icon\" aria-hidden=\"true\"\u003e\u003csvg class=\"artetribe-dtf-preview-embed__icon-reference\" viewbox=\"0 0 80 80\"\u003e\u003cpath d=\"M68 24H47.73C37.37 24 27.79 29.5 22.57 38.45L17 48H61.5C62.97 45.52 65.64 44 68.53 44H70L68 24ZM64 51H15M64 34.18l-.31-3.05A3.48 3.48 0 0 0 60.23 28h-9.5A24.9 24.9 0 0 0 35.73 33c-2.14 1.58-1.01 5 1.67 5h23.15a3.49 3.49 0 0 0 3.46-3.82ZM56 35H46M76 26h-7v3h7v-3Z\"\u003e\u003c\/path\u003e\u003cpath class=\"accent\" d=\"M69.5 47.25 77 60H3l10-17h3.04\"\u003e\u003c\/path\u003e\u003cpath d=\"M22 7.97c0 2.4 3 2.4 3 4.8s-3 2.4-3 4.8 3 2.4 3 4.8-3 2.4-3 4.8M16 15.8c0 2.4-3 2.4-3 4.8s3 2.4 3 4.8-3 2.4-3 4.8 3 2.4 3 4.8\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/span\u003e\u003ch3\u003eHeat application\u003c\/h3\u003e\n\u003cp\u003eApply easily with an iron or heat press and peel off the backer.\u003c\/p\u003e\u003c\/article\u003e\n    \u003carticle\u003e\u003cspan class=\"artetribe-dtf-preview-embed__icon\" aria-hidden=\"true\"\u003e\u003csvg class=\"artetribe-dtf-preview-embed__icon-reference\" viewbox=\"0 0 81 80\"\u003e\u003cpath d=\"M68.666 30v39a4 4 0 0 1-4 4h-48a4 4 0 0 1-4-4V14a4 4 0 0 1 4-4h37M13.666 24h40\"\u003e\u003c\/path\u003e\u003cpath class=\"accent\" d=\"M70.586 9.04a9.94 9.94 0 1 0 3.76 5.61M60.246 17.4l3.43 3.43L76.016 8.49\"\u003e\u003c\/path\u003e\u003cpath d=\"M40.666 65a17.5 17.5 0 1 0 0-35 17.5 17.5 0 0 0 0 35ZM20.666 20a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM30.666 20a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM50.726 52a2.06 2.06 0 0 1-2.06-2.06v-3.88A2.06 2.06 0 0 1 50.726 44h1.93a12.5 12.5 0 1 0-.34 8h-1.59Z\"\u003e\u003c\/path\u003e\u003cpath class=\"accent accent--round\" d=\"M31.226 47.5s3.4-2.19 7.38 0 7.06 0 7.06 0\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/span\u003e\u003ch3\u003eMachine washable\u003c\/h3\u003e\n\u003cp\u003eOur DTF transfers are durable, stretchable, and machine washable.\u003c\/p\u003e\u003c\/article\u003e\n    \u003carticle\u003e\u003cspan class=\"artetribe-dtf-preview-embed__icon\" aria-hidden=\"true\"\u003e\u003csvg viewbox=\"0 0 72 72\"\u003e\u003cpath d=\"M18 13h31l8 8v38H18zM49 13v9h8M26 32h23M26 49h23\"\u003e\u003c\/path\u003e\u003cpath class=\"accent\" d=\"M27 40h6M38 40h6M49 40h6\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/span\u003e\u003ch3\u003eFull-color detail\u003c\/h3\u003e\n\u003cp\u003eReproduce detailed artwork and vivid color across apparel and accessories.\u003c\/p\u003e\u003c\/article\u003e\n  \u003c\/section\u003e\n  \u003csection class=\"artetribe-dtf-preview-embed__tool\" aria-labelledby=\"artetribe-dtf-preview-title\"\u003e\n    \u003cdiv class=\"artetribe-dtf-preview-embed__heading\"\u003e\n\u003ch2 id=\"artetribe-dtf-preview-title\"\u003ePreview your DTF transfer\u003c\/h2\u003e\n\u003cp\u003eUpload artwork, choose a product view, and adjust the placement.\u003c\/p\u003e\n\u003c\/div\u003e\n    \u003cdiv class=\"artetribe-dtf-preview-embed__frame\"\u003e\n\u003cdiv class=\"artetribe-dtf-preview-embed__loading\" data-preview-loading\u003eLoading 3D preview...\u003c\/div\u003e\n\u003ciframe class=\"artetribe-dtf-preview-embed__iframe\" data-preview-frame title=\"ArteTribe DTF transfers 3D preview\" loading=\"lazy\"\u003e\u003c\/iframe\u003e\u003cscript type=\"text\/plain\" data-preview-source\u003ePCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KICA8dGl0bGU+QXJ0ZVRyaWJlIERURiBUcmFuc2ZlcnMgM0QgUHJldmlldzwvdGl0bGU+CiAgPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlVwbG9hZCBhcnR3b3JrIGFuZCBwcmV2aWV3IERURiB0cmFuc2ZlciBwbGFjZW1lbnQgb24gYSBULXNoaXJ0LCBob29kaWUsIGNhbnZhcyB0b3RlLCBvciBiYXNlYmFsbCBjYXAuIj4KICA8c3R5bGU+CiAgICA6cm9vdHstLWNhbnZhczojZWFmMWY3Oy0tc3VyZmFjZTojZmZmOy0taW5rOiMxODIxMmI7LS1tdXRlZDojNjQ3MTdkOy0tbXV0ZWQtMjojOGI5OWE1Oy0tbGluZTpyZ2JhKDIwLDQ1LDY2LC4xMik7LS1ibHVlOiMwODdhYjU7LS1ibHVlLWhvdmVyOiMwNjZkOWY7LS1zdWNjZXNzOiMxNDc3NDQ7LS1kYW5nZXI6I2I0MjMxODstLXJhZGl1czoxNnB4Oy0tc2hhZG93OjAgMThweCA0OHB4IHJnYmEoMTgsNDgsNzAsLjEyKX0KICAgICp7Ym94LXNpemluZzpib3JkZXItYm94fWh0bWwsYm9keXttYXJnaW46MDttaW4taGVpZ2h0OjEwMCU7YmFja2dyb3VuZDp2YXIoLS1jYW52YXMpO2NvbG9yOnZhcigtLWluayk7Zm9udC1mYW1pbHk6LWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsIlNlZ29lIFVJIiwiUGluZ0ZhbmcgU0MiLCJNaWNyb3NvZnQgWWFIZWkiLHNhbnMtc2VyaWY7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZH0KICAgIGJ1dHRvbixpbnB1dHtmb250OmluaGVyaXR9YnV0dG9ue2N1cnNvcjpwb2ludGVyfWJ1dHRvbjpkaXNhYmxlZHtjdXJzb3I6bm90LWFsbG93ZWQ7b3BhY2l0eTouNDh9OjpzZWxlY3Rpb257YmFja2dyb3VuZDpyZ2JhKDgsMTIyLDE4MSwuMTgpO2NvbG9yOnZhcigtLWluayl9CiAgICA6Zm9jdXMtdmlzaWJsZXtvdXRsaW5lOjNweCBzb2xpZCByZ2JhKDgsMTIyLDE4MSwuMjgpO291dGxpbmUtb2Zmc2V0OjJweH0KICAgIC5hcHB7d2lkdGg6bWluKDE0MDBweCwxMDAlKTttaW4taGVpZ2h0Ojc2MHB4O21hcmdpbjphdXRvO3BhZGRpbmc6MTRweH0KICAgIC50b29sYmFye2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7bWluLWhlaWdodDo0NnB4O3BhZGRpbmc6MCA0cHggMTJweH0KICAgIC5icmFuZHtkaXNwbGF5OmdyaWQ7cGxhY2UtaXRlbXM6Y2VudGVyO3dpZHRoOjMwcHg7aGVpZ2h0OjMwcHg7Ym9yZGVyLXJhZGl1czo5cHg7YmFja2dyb3VuZDp2YXIoLS1ibHVlKTtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OjkwMDtsZXR0ZXItc3BhY2luZzotLjA1ZW19CiAgICAudG9vbGJhciBoMXttaW4td2lkdGg6MDttYXJnaW46MDtmb250LXNpemU6MTdweDtsaW5lLWhlaWdodDoxLjI7bGV0dGVyLXNwYWNpbmc6LS4wMmVtfQogICAgLnRvb2xiYXIgcHttYXJnaW46MnB4IDAgMDtjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjEwcHh9CiAgICAucHJldmlldy1iYWRnZXttYXJnaW4tbGVmdDphdXRvO3BhZGRpbmc6NnB4IDlweDtib3JkZXI6MXB4IHNvbGlkIHJnYmEoOCwxMjIsMTgxLC4xOCk7Ym9yZGVyLXJhZGl1czo5OTlweDtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6dmFyKC0tYmx1ZSk7Zm9udC1zaXplOjEwcHg7Zm9udC13ZWlnaHQ6ODAwO3doaXRlLXNwYWNlOm5vd3JhcH0KICAgIC53b3Jrc3BhY2V7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW5tYXgoMCwxZnIpIDM4MnB4O21pbi1oZWlnaHQ6NjkwcHg7b3ZlcmZsb3c6aGlkZGVuO2JvcmRlci1yYWRpdXM6dmFyKC0tcmFkaXVzKTtiYWNrZ3JvdW5kOnZhcigtLXN1cmZhY2UpO2JveC1zaGFkb3c6dmFyKC0tc2hhZG93KX0KICAgIC5zdGFnZS1zaGVsbHtwb3NpdGlvbjpyZWxhdGl2ZTttaW4td2lkdGg6MDtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZDp2YXIoLS1jYW52YXMpfQogICAgI3N0YWdle3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjB9I3N0YWdlIGNhbnZhc3tkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dG91Y2gtYWN0aW9uOm5vbmV9CiAgICAuc3RhZ2Utc3RhdHVze3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxNnB4O2xlZnQ6MTZweDt6LWluZGV4OjI7bWF4LXdpZHRoOmNhbGMoMTAwJSAtIDMycHgpO3BhZGRpbmc6OHB4IDExcHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuODQpO2JveC1zaGFkb3c6MCA3cHggMjJweCByZ2JhKDIwLDQ1LDY2LC4wOCk7Y29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuMzU7cG9pbnRlci1ldmVudHM6bm9uZX0KICAgIC5zdGFnZS1zdGF0dXMgc3Ryb25ne2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbToycHg7Y29sb3I6dmFyKC0taW5rKTtmb250LXNpemU6MTNweH0KICAgIC5zdGFnZS1oaW50e3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjE2cHg7Ym90dG9tOjE0cHg7bGVmdDoxNnB4O2NvbG9yOiM1MzY4N2I7Zm9udC1zaXplOjEwcHg7dGV4dC1hbGlnbjpjZW50ZXI7cG9pbnRlci1ldmVudHM6bm9uZX0KICAgIC5sb2FkaW5ne3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7ei1pbmRleDo1O2Rpc3BsYXk6Z3JpZDtwbGFjZS1pdGVtczpjZW50ZXI7YmFja2dyb3VuZDp2YXIoLS1jYW52YXMpO3RyYW5zaXRpb246b3BhY2l0eSAuMnMgZWFzZX0KICAgIC5sb2FkaW5nW2hpZGRlbl17ZGlzcGxheTpub25lfS5sb2FkaW5nLWNhcmR7d2lkdGg6bWluKDI1MHB4LDcwJSk7cGFkZGluZzoxNnB4O2JvcmRlci1yYWRpdXM6MTJweDtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjc2KX0KICAgIC5sb2FkaW5nLWxpbmV7aGVpZ2h0OjlweDttYXJnaW46N3B4IDA7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoOTBkZWcscmdiYSg4LDEyMiwxODEsLjA4KSxyZ2JhKDgsMTIyLDE4MSwuMjIpLHJnYmEoOCwxMjIsMTgxLC4wOCkpO2JhY2tncm91bmQtc2l6ZToyMjAlIDEwMCU7YW5pbWF0aW9uOmxvYWQgMS4ycyBsaW5lYXIgaW5maW5pdGV9LmxvYWRpbmctbGluZTpsYXN0LWNoaWxke3dpZHRoOjY4JX0KICAgIEBrZXlmcmFtZXMgbG9hZHt0b3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjAlIDB9fQogICAgLnBhbmVse21pbi13aWR0aDowO21heC1oZWlnaHQ6NjkwcHg7b3ZlcmZsb3c6YXV0bztib3JkZXItbGVmdDoxcHggc29saWQgdmFyKC0tbGluZSk7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC45Nik7c2Nyb2xsYmFyLXdpZHRoOnRoaW47c2Nyb2xsYmFyLWNvbG9yOiM5YWFiYmEgdHJhbnNwYXJlbnR9CiAgICAuYmxvY2t7cGFkZGluZzoxNHB4IDE2cHh9LmJsb2NrKy5ibG9ja3tib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1saW5lKX0KICAgIC5sYWJlbHtkaXNwbGF5OmJsb2NrO21hcmdpbjowIDAgOXB4O2NvbG9yOnZhcigtLW11dGVkKTtmb250LXNpemU6MTBweDtmb250LXdlaWdodDo4MDA7bGV0dGVyLXNwYWNpbmc6LjA2ZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfQogICAgLnVwbG9hZC1yb3csLmFjdGlvbi1yb3d7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW5tYXgoMCwxZnIpIGF1dG87Z2FwOjhweH0KICAgIC5idG57bWluLWhlaWdodDo0MHB4O3BhZGRpbmc6OHB4IDEycHg7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czoxMHB4O2JhY2tncm91bmQ6cmdiYSg4LDEyMiwxODEsLjA5KTtjb2xvcjp2YXIoLS1ibHVlKTtmb250LXNpemU6MTNweDtmb250LXdlaWdodDo4MDA7bGluZS1oZWlnaHQ6MS4yO3doaXRlLXNwYWNlOm5vd3JhcDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjE4cyBlYXNlLHRyYW5zZm9ybSAuMThzIGVhc2UsYm94LXNoYWRvdyAuMThzIGVhc2V9CiAgICAuYnRuOmhvdmVye2JhY2tncm91bmQ6cmdiYSg4LDEyMiwxODEsLjE0KX0uYnRuOmFjdGl2ZXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgxcHgpfS5idG4ucHJpbWFyeXtiYWNrZ3JvdW5kOnZhcigtLWJsdWUpO2NvbG9yOiNmZmY7Ym94LXNoYWRvdzowIDVweCAxNnB4IHJnYmEoOCwxMjIsMTgxLC4yNCl9LmJ0bi5wcmltYXJ5OmhvdmVye2JhY2tncm91bmQ6dmFyKC0tYmx1ZS1ob3Zlcil9CiAgICAudXBsb2FkLXJvd3tncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjttYXJnaW4tdG9wOjhweH0uZmlsZS1pbnB1dHtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7aGVpZ2h0OjFweDtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZX0KICAgIC5zdGF0dXN7bWluLWhlaWdodDoxNnB4O21hcmdpbjo3cHggMCAwO2NvbG9yOnZhcigtLW11dGVkLTIpO2ZvbnQtc2l6ZToxMHB4O2xpbmUtaGVpZ2h0OjEuNH0uc3RhdHVzLm9re2NvbG9yOnZhcigtLXN1Y2Nlc3MpfS5zdGF0dXMuZXJye2NvbG9yOnZhcigtLWRhbmdlcil9CiAgICAucHJpdmFjeXttYXJnaW46NnB4IDAgMDtjb2xvcjp2YXIoLS1tdXRlZC0yKTtmb250LXNpemU6MTBweDtsaW5lLWhlaWdodDoxLjQ1fQogICAgLnByb2R1Y3QtZ3JpZHtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjZweDtwYWRkaW5nOjRweDtib3JkZXItcmFkaXVzOjEycHg7YmFja2dyb3VuZDpyZ2JhKDIwLDQ1LDY2LC4wNyl9CiAgICAucHJvZHVjdC1idG57bWluLWhlaWdodDo0MnB4O3BhZGRpbmc6NnB4IDhweDtib3JkZXI6MDtib3JkZXItcmFkaXVzOjlweDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOnZhcigtLW11dGVkKTtmb250LXNpemU6MTNweDtmb250LXdlaWdodDo4MDB9LnByb2R1Y3QtYnRuOmhvdmVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuNTgpO2NvbG9yOnZhcigtLWluayl9LnByb2R1Y3QtYnRuW2FyaWEtcHJlc3NlZD0idHJ1ZSJde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjp2YXIoLS1ibHVlKTtib3gtc2hhZG93OjAgMnB4IDhweCByZ2JhKDIwLDQ1LDY2LC4xMil9CiAgICAuY29sb3Itcm93e2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIGF1dG87YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMnB4O21hcmdpbi10b3A6MTBweH0uY29sb3Itcm93IHNwYW57Zm9udC1zaXplOjEzcHg7Zm9udC13ZWlnaHQ6NzAwfS5jb2xvci1jb250cm9se2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjdweDtjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjEwcHg7Zm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zfS5jb2xvci1jb250cm9sIGlucHV0e3dpZHRoOjMwcHg7aGVpZ2h0OjMwcHg7cGFkZGluZzowO292ZXJmbG93OmhpZGRlbjtib3JkZXI6MDtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOm5vbmV9LmNvbG9yLWNvbnRyb2wgaW5wdXQ6Oi13ZWJraXQtY29sb3Itc3dhdGNoLXdyYXBwZXJ7cGFkZGluZzowfS5jb2xvci1jb250cm9sIGlucHV0Ojotd2Via2l0LWNvbG9yLXN3YXRjaHtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWxpbmUpO2JvcmRlci1yYWRpdXM6NTAlfQogICAgLmNvbnRyb2x7bWFyZ2luLXRvcDoxMHB4fS5jb250cm9sLWhlYWR7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2dhcDoxMnB4O21hcmdpbi1ib3R0b206MnB4O2NvbG9yOnZhcigtLW11dGVkKTtmb250LXNpemU6MTBweDtmb250LXdlaWdodDo3MDB9LmNvbnRyb2wgb3V0cHV0e2NvbG9yOnZhcigtLWluayk7Zm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zfQogICAgaW5wdXRbdHlwZT1yYW5nZV17d2lkdGg6MTAwJTtoZWlnaHQ6MjhweDttYXJnaW46MDthcHBlYXJhbmNlOm5vbmU7YmFja2dyb3VuZDp0cmFuc3BhcmVudH1pbnB1dFt0eXBlPXJhbmdlXTo6LXdlYmtpdC1zbGlkZXItcnVubmFibGUtdHJhY2t7aGVpZ2h0OjNweDtib3JkZXItcmFkaXVzOjJweDtiYWNrZ3JvdW5kOnJnYmEoMjAsNDUsNjYsLjE0KX1pbnB1dFt0eXBlPXJhbmdlXTo6LXdlYmtpdC1zbGlkZXItdGh1bWJ7d2lkdGg6MThweDtoZWlnaHQ6MThweDttYXJnaW4tdG9wOi03LjVweDthcHBlYXJhbmNlOm5vbmU7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDojZmZmO2JveC1zaGFkb3c6MCAwIDAgLjVweCByZ2JhKDAsMCwwLC4wOCksMCAycHggNnB4IHJnYmEoMCwwLDAsLjIyKX0KICAgIC5hY3Rpb24tcm93e2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgMWZyfS5wcm9kdWN0aW9uLW5vdGV7bWFyZ2luOjhweCAwIDA7Y29sb3I6dmFyKC0tbXV0ZWQtMik7Zm9udC1zaXplOjEwcHg7bGluZS1oZWlnaHQ6MS40NX0KICAgIEBtZWRpYShtYXgtd2lkdGg6ODAwcHgpey5hcHB7cGFkZGluZzowfS50b29sYmFye3BhZGRpbmc6OHB4IDEwcHh9LnRvb2xiYXIgaDF7Zm9udC1zaXplOjEzcHh9LndvcmtzcGFjZXtkaXNwbGF5OmJsb2NrO21pbi1oZWlnaHQ6MDtib3JkZXItcmFkaXVzOjA7Ym94LXNoYWRvdzpub25lfS5zdGFnZS1zaGVsbHtoZWlnaHQ6NTIwcHh9LnBhbmVse21heC1oZWlnaHQ6bm9uZTtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1saW5lKTtib3JkZXItbGVmdDowfS5ibG9ja3twYWRkaW5nOjEycHggMTRweH0uc3RhZ2UtaGludHtib3R0b206MTBweH0ucHJldmlldy1iYWRnZXtmb250LXNpemU6MTBweH19CiAgICBAbWVkaWEobWF4LXdpZHRoOjQzMHB4KXsudG9vbGJhciBwe2Rpc3BsYXk6bm9uZX0uc3RhZ2Utc2hlbGx7aGVpZ2h0OjQ1MHB4fS5hY3Rpb24tcm93LC51cGxvYWQtcm93e2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnJ9LnByb2R1Y3QtZ3JpZHtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcn0uc3RhZ2Utc3RhdHVze3RvcDoxMHB4O2xlZnQ6MTBweH0uc3RhZ2UtaGludHtkaXNwbGF5Om5vbmV9fQogICAgQG1lZGlhKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246cmVkdWNlKXsqLCo6YmVmb3JlLCo6YWZ0ZXJ7c2Nyb2xsLWJlaGF2aW9yOmF1dG8haW1wb3J0YW50O2FuaW1hdGlvbi1kdXJhdGlvbjouMDFtcyFpbXBvcnRhbnQ7YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDoxIWltcG9ydGFudDt0cmFuc2l0aW9uLWR1cmF0aW9uOi4wMW1zIWltcG9ydGFudH19CiAgPC9zdHlsZT4KICA8c2NyaXB0IHR5cGU9ImltcG9ydG1hcCI+eyJpbXBvcnRzIjp7InRocmVlIjoiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS90aHJlZUAwLjE2MC4wL2J1aWxkL3RocmVlLm1vZHVsZS5qcyIsInRocmVlL2FkZG9ucy8iOiJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3RocmVlQDAuMTYwLjAvZXhhbXBsZXMvanNtLyJ9fTwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5PgogIDwhLS0gVEhFU0lTOiBhIGNhbG0gY3JlYXRvciB3b3Jrc2hvcCB3aGVyZSB0aGUgZ2FybWVudCBpcyB0aGUgZXZpZGVuY2U7IE9XTi1XT1JMRDogY29vbCB3aGl0ZSBzdHVkaW8sIEFydGVUcmliZSBibHVlIGNvbnRyb2xzLCBmYWJyaWMtZmlyc3QgbW9kZWwgdHJlYXRtZW50OyBTVE9SWTogYWRkIGFydHdvcmssIGNob29zZSBhIGNhcnJpZXIsIHBsYWNlIHRoZSBwcmludCwgZXhwb3J0IG9yIGF0dGFjaDsgRklSU1QgVklFV1BPUlQ6IG1vZGVsIGFuZCBlc3NlbnRpYWwgY29udHJvbHMgYXJlIGltbWVkaWF0ZWx5IHZpc2libGU7IEZPUk06IGZhbWlsaWFyIHByb2R1Y3QtdG9vbCBjb250cm9scyB3aXRoIG5vIGRlY29yYXRpdmUgZGV0b3VyczsgRklOSVNIOiB1bnJldmlld2VkIGFuZCB1bmRvY3VtZW50ZWQgaXMgdW5maW5pc2hlZDsgdGhpcyBidWlsZCBlbmRzIHdpdGggdGhlIGZpbmlzaCByZXZpZXcsIHRoZSB2ZXJkaWN0LCBhbmQgREVTSUdOLm1kIC0tPgogIDxtYWluIGNsYXNzPSJhcHAiPgogICAgPGhlYWRlciBjbGFzcz0idG9vbGJhciI+CiAgICAgIDxzcGFuIGNsYXNzPSJicmFuZCIgYXJpYS1oaWRkZW49InRydWUiPkFUPC9zcGFuPgogICAgICA8ZGl2PjxoMT5EVEYgVHJhbnNmZXJzIDNEIFByZXZpZXc8L2gxPjxwPlJldmlldyBhcHByb3hpbWF0ZSBhcnR3b3JrIHBsYWNlbWVudCBiZWZvcmUgb3JkZXJpbmcuPC9wPjwvZGl2PgogICAgICA8c3BhbiBjbGFzcz0icHJldmlldy1iYWRnZSI+TE9DQUwgUFJFVklFVzwvc3Bhbj4KICAgIDwvaGVhZGVyPgogICAgPHNlY3Rpb24gY2xhc3M9IndvcmtzcGFjZSIgYXJpYS1sYWJlbD0iRFRGIHRyYW5zZmVyIHByZXZpZXcgd29ya3NwYWNlIj4KICAgICAgPGRpdiBjbGFzcz0ic3RhZ2Utc2hlbGwiPgogICAgICAgIDxkaXYgaWQ9InN0YWdlIiBhcmlhLWxhYmVsPSJJbnRlcmFjdGl2ZSAzRCBnYXJtZW50IHByZXZpZXciPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InN0YWdlLXN0YXR1cyIgaWQ9InN0YWdlU3RhdHVzIj48c3Ryb25nPlQtU2hpcnQ8L3N0cm9uZz48c3Bhbj5Gcm9udCBwbGFjZW1lbnQuIFVwbG9hZCBhcnR3b3JrIHRvIGJlZ2luLjwvc3Bhbj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzdGFnZS1oaW50Ij5EcmFnIHRvIHJvdGF0ZS4gU2Nyb2xsIG9yIHBpbmNoIHRvIHpvb20uPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibG9hZGluZyIgaWQ9ImxvYWRpbmciPjxkaXYgY2xhc3M9ImxvYWRpbmctY2FyZCIgYXJpYS1sYWJlbD0iTG9hZGluZyAzRCBtb2RlbCI+PGRpdiBjbGFzcz0ibG9hZGluZy1saW5lIj48L2Rpdj48ZGl2IGNsYXNzPSJsb2FkaW5nLWxpbmUiPjwvZGl2PjwvZGl2PjwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGFzaWRlIGNsYXNzPSJwYW5lbCIgYXJpYS1sYWJlbD0iUHJldmlldyBjb250cm9scyI+CiAgICAgICAgPHNlY3Rpb24gY2xhc3M9ImJsb2NrIj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJsYWJlbCI+QXJ0d29yazwvc3Bhbj4KICAgICAgICAgIDxkaXYgY2xhc3M9InVwbG9hZC1yb3ciPjxidXR0b24gY2xhc3M9ImJ0biBwcmltYXJ5IiBpZD0idXBsb2FkQnV0dG9uIiB0eXBlPSJidXR0b24iPlVwbG9hZCBhcnR3b3JrPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0iYnRuIiBpZD0iY2xlYXJBcnQiIHR5cGU9ImJ1dHRvbiIgZGlzYWJsZWQ+Q2xlYXIgYXJ0d29yazwvYnV0dG9uPjwvZGl2PgogICAgICAgICAgPGlucHV0IGNsYXNzPSJmaWxlLWlucHV0IiBpZD0iZmlsZSIgdHlwZT0iZmlsZSIgYWNjZXB0PSJpbWFnZS9wbmcsaW1hZ2UvanBlZyxpbWFnZS93ZWJwIiB0YWJpbmRleD0iLTEiPgogICAgICAgICAgPHAgY2xhc3M9InN0YXR1cyIgaWQ9ImFydFN0YXR1cyIgYXJpYS1saXZlPSJwb2xpdGUiPjwvcD4KICAgICAgICAgIDxwIGNsYXNzPSJwcml2YWN5Ij5UcmFuc3BhcmVudCBQTkcgd29ya3MgYmVzdC4gUHJldmlldyBjaGFuZ2VzIHJlbWFpbiBpbiB0aGlzIGJyb3dzZXIgdW50aWwgeW91IGF0dGFjaCBmaWxlcyB0byB0aGUgcHJvZHVjdCBvcmRlci48L3A+CiAgICAgICAgPC9zZWN0aW9uPgogICAgICAgIDxzZWN0aW9uIGNsYXNzPSJibG9jayI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ibGFiZWwiPlByZXZpZXcgcHJvZHVjdDwvc3Bhbj4KICAgICAgICAgIDxkaXYgY2xhc3M9InByb2R1Y3QtZ3JpZCIgaWQ9InByb2R1Y3RHcmlkIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0icHJvZHVjdC1idG4iIHR5cGU9ImJ1dHRvbiIgZGF0YS1wcm9kdWN0PSJ0ZWUiIGFyaWEtcHJlc3NlZD0idHJ1ZSI+VC1TaGlydDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJwcm9kdWN0LWJ0biIgdHlwZT0iYnV0dG9uIiBkYXRhLXByb2R1Y3Q9Imhvb2RpZSIgYXJpYS1wcmVzc2VkPSJmYWxzZSI+SG9vZGllPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InByb2R1Y3QtYnRuIiB0eXBlPSJidXR0b24iIGRhdGEtcHJvZHVjdD0idG90ZSIgYXJpYS1wcmVzc2VkPSJmYWxzZSI+Q2FudmFzIFRvdGU8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0icHJvZHVjdC1idG4iIHR5cGU9ImJ1dHRvbiIgZGF0YS1wcm9kdWN0PSJjYXAiIGFyaWEtcHJlc3NlZD0iZmFsc2UiPkJhc2ViYWxsIENhcDwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1yb3ciPjxzcGFuPkZhYnJpYyBjb2xvcjwvc3Bhbj48bGFiZWwgY2xhc3M9ImNvbG9yLWNvbnRyb2wiPjxvdXRwdXQgaWQ9Imdhcm1lbnRDb2xvclZhbHVlIj4jRkZGRkZGPC9vdXRwdXQ+PGlucHV0IGlkPSJnYXJtZW50Q29sb3IiIHR5cGU9ImNvbG9yIiB2YWx1ZT0iI2ZmZmZmZiIgYXJpYS1sYWJlbD0iRmFicmljIGNvbG9yIj48L2xhYmVsPjwvZGl2PgogICAgICAgIDwvc2VjdGlvbj4KICAgICAgICA8c2VjdGlvbiBjbGFzcz0iYmxvY2siPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYmVsIj5QcmludCBwbGFjZW1lbnQ8L3NwYW4+CiAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbnRyb2wiPjxzcGFuIGNsYXNzPSJjb250cm9sLWhlYWQiPjxzcGFuPlNpemU8L3NwYW4+PG91dHB1dCBpZD0ic2NhbGVWYWx1ZSI+ODUlPC9vdXRwdXQ+PC9zcGFuPjxpbnB1dCBpZD0ic2NhbGUiIHR5cGU9InJhbmdlIiBtaW49IjM1IiBtYXg9IjE1MCIgc3RlcD0iMSIgdmFsdWU9Ijg1Ij48L2xhYmVsPgogICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb250cm9sIj48c3BhbiBjbGFzcz0iY29udHJvbC1oZWFkIj48c3Bhbj5Ib3Jpem9udGFsPC9zcGFuPjxvdXRwdXQgaWQ9InhWYWx1ZSI+MDwvb3V0cHV0Pjwvc3Bhbj48aW5wdXQgaWQ9IngiIHR5cGU9InJhbmdlIiBtaW49Ii0xMDAiIG1heD0iMTAwIiBzdGVwPSIxIiB2YWx1ZT0iMCI+PC9sYWJlbD4KICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY29udHJvbCI+PHNwYW4gY2xhc3M9ImNvbnRyb2wtaGVhZCI+PHNwYW4+VmVydGljYWw8L3NwYW4+PG91dHB1dCBpZD0ieVZhbHVlIj4wPC9vdXRwdXQ+PC9zcGFuPjxpbnB1dCBpZD0ieSIgdHlwZT0icmFuZ2UiIG1pbj0iLTEwMCIgbWF4PSIxMDAiIHN0ZXA9IjEiIHZhbHVlPSIwIj48L2xhYmVsPgogICAgICAgIDwvc2VjdGlvbj4KICAgICAgICA8c2VjdGlvbiBjbGFzcz0iYmxvY2siPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYmVsIj5PcmRlciBmaWxlczwvc3Bhbj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbi1yb3ciPjxidXR0b24gY2xhc3M9ImJ0biIgaWQ9ImRvd25sb2FkUGFjayIgdHlwZT0iYnV0dG9uIiBkaXNhYmxlZD5Eb3dubG9hZCBwYWNrPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0iYnRuIHByaW1hcnkiIGlkPSJhdHRhY2hPcmRlciIgdHlwZT0iYnV0dG9uIiBkaXNhYmxlZD5BdHRhY2ggdG8gb3JkZXI8L2J1dHRvbj48L2Rpdj4KICAgICAgICAgIDxwIGNsYXNzPSJzdGF0dXMiIGlkPSJwcm9kdWN0aW9uU3RhdHVzIiBhcmlhLWxpdmU9InBvbGl0ZSI+VXBsb2FkIGFydHdvcmsgdG8gcHJlcGFyZSBmaWxlcy48L3A+CiAgICAgICAgICA8cCBjbGFzcz0icHJvZHVjdGlvbi1ub3RlIj5UaGUgZ2FybWVudCBpcyBhbiBpbGx1c3RyYXRpdmUgcGxhY2VtZW50IHByZXZpZXcuIENvbmZpcm0gdGhlIGZpbmFsIHRyYW5zZmVyIHNpemUgYmVmb3JlIHByb2R1Y3Rpb24uPC9wPgogICAgICAgIDwvc2VjdGlvbj4KICAgICAgPC9hc2lkZT4KICAgIDwvc2VjdGlvbj4KICA8L21haW4+CiAgPHNjcmlwdCB0eXBlPSJtb2R1bGUiPgogICAgaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnOwogICAgaW1wb3J0IHtPcmJpdENvbnRyb2xzfSBmcm9tICd0aHJlZS9hZGRvbnMvY29udHJvbHMvT3JiaXRDb250cm9scy5qcyc7CiAgICBpbXBvcnQge0dMVEZMb2FkZXJ9IGZyb20gJ3RocmVlL2FkZG9ucy9sb2FkZXJzL0dMVEZMb2FkZXIuanMnOwogICAgaW1wb3J0IHtEUkFDT0xvYWRlcn0gZnJvbSAndGhyZWUvYWRkb25zL2xvYWRlcnMvRFJBQ09Mb2FkZXIuanMnOwogICAgaW1wb3J0IHtEZWNhbEdlb21ldHJ5fSBmcm9tICd0aHJlZS9hZGRvbnMvZ2VvbWV0cmllcy9EZWNhbEdlb21ldHJ5LmpzJzsKICAgIGltcG9ydCB7Um9vbUVudmlyb25tZW50fSBmcm9tICd0aHJlZS9hZGRvbnMvZW52aXJvbm1lbnRzL1Jvb21FbnZpcm9ubWVudC5qcyc7CiAgICBpbXBvcnQge1JlY3RBcmVhTGlnaHRVbmlmb3Jtc0xpYn0gZnJvbSAndGhyZWUvYWRkb25zL2xpZ2h0cy9SZWN0QXJlYUxpZ2h0VW5pZm9ybXNMaWIuanMnOwoKICAgIGNvbnN0ICQ9c2VsZWN0b3I9PmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpLCAkJD1zZWxlY3Rvcj0+Wy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXTsKICAgIGNvbnN0IHN0YWdlPSQoJyNzdGFnZScpLGxvYWRpbmc9JCgnI2xvYWRpbmcnKSxzdGFnZVN0YXR1cz0kKCcjc3RhZ2VTdGF0dXMnKSxhcnRTdGF0dXM9JCgnI2FydFN0YXR1cycpLHByb2R1Y3Rpb25TdGF0dXM9JCgnI3Byb2R1Y3Rpb25TdGF0dXMnKTsKICAgIGNvbnN0IGxhYmVscz17dGVlOidULVNoaXJ0Jyxob29kaWU6J0hvb2RpZScsdG90ZTonQ2FudmFzIFRvdGUnLGNhcDonQmFzZWJhbGwgQ2FwJ307CiAgICBjb25zdCBtb2RlbFVybHM9e3RlZTonaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vM2QvbW9kZWxzL28vYzY3ZDEwMzY3NzQ0MGNlNi9hcnRldHJpYmUtZHRmLXRzaGlydC5nbGInLGhvb2RpZTonaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vM2QvbW9kZWxzL28vMTY2Nzk3MzVlMzg0MTY1OS9hcnRldHJpYmUtZHRmLWhvb2RpZS5nbGInLHRvdGU6J2h0dHBzOi8vY2RuLnNob3BpZnkuY29tLzNkL21vZGVscy9vL2NkZjRiN2JhNjY5MWI4MGQvYXJ0ZXRyaWJlLWR0Zi10b3RlLmdsYicsY2FwOidodHRwczovL2Nkbi5zaG9waWZ5LmNvbS8zZC9tb2RlbHMvby8zM2RlNTJhMGI5M2QzYTBhL2FydGV0cmliZS1kdGYtY2FwLmdsYid9OwogICAgY29uc3QgZGVmYXVsdHM9e3RlZTp7bW9kZWxTaXplOjEwMCxtb2RlbFg6Mixtb2RlbFk6MCxzY2FsZTo4OCx4OjAseTozOH0saG9vZGllOnttb2RlbFNpemU6MTAwLG1vZGVsWDowLG1vZGVsWTowLHNjYWxlOjEwMCx4OjAseTotMjN9LHRvdGU6e21vZGVsU2l6ZToxMDAsbW9kZWxYOjAsbW9kZWxZOjE2LHNjYWxlOjE1MCx4OjAseTotMTB9LGNhcDp7bW9kZWxTaXplOjgwLG1vZGVsWDo1LG1vZGVsWToxNyxzY2FsZToxMzgseDowLHk6LTIyfX07CiAgICBjb25zdCBzdGF0ZT17cHJvZHVjdDondGVlJyxtb2RlbFNpemU6MTAwLG1vZGVsWDoyLG1vZGVsWTowLHNjYWxlOjg4LHg6MCx5OjM4LGNvbG9yOicjZmZmZmZmJyxiYWNrZ3JvdW5kOicjZWFmMWY3JyxhcnR3b3JrRmlsZTpudWxsLGFydHdvcmtUZXh0dXJlOm51bGwsYXJ0d29ya0FzcGVjdDoxLGFydHdvcmtTb3VyY2U6JycsYXR0YWNoZWQ6ZmFsc2V9OwoKICAgIGNvbnN0IHJlbmRlcmVyPW5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHthbnRpYWxpYXM6dHJ1ZSxhbHBoYTpmYWxzZSxwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6dHJ1ZSxwb3dlclByZWZlcmVuY2U6J2RlZmF1bHQnfSk7CiAgICByZW5kZXJlci5zZXRQaXhlbFJhdGlvKE1hdGgubWluKGRldmljZVBpeGVsUmF0aW8sMikpO3JlbmRlcmVyLm91dHB1dENvbG9yU3BhY2U9VEhSRUUuU1JHQkNvbG9yU3BhY2U7cmVuZGVyZXIudG9uZU1hcHBpbmc9VEhSRUUuQUNFU0ZpbG1pY1RvbmVNYXBwaW5nO3JlbmRlcmVyLnRvbmVNYXBwaW5nRXhwb3N1cmU9MTtyZW5kZXJlci5zaGFkb3dNYXAuZW5hYmxlZD1mYWxzZTtzdGFnZS5hcHBlbmRDaGlsZChyZW5kZXJlci5kb21FbGVtZW50KTsKICAgIGNvbnN0IHNjZW5lPW5ldyBUSFJFRS5TY2VuZSgpO3NjZW5lLmJhY2tncm91bmQ9bmV3IFRIUkVFLkNvbG9yKHN0YXRlLmJhY2tncm91bmQpOwogICAgY29uc3QgZW52aXJvbm1lbnRHZW5lcmF0b3I9bmV3IFRIUkVFLlBNUkVNR2VuZXJhdG9yKHJlbmRlcmVyKSxlbnZpcm9ubWVudD1lbnZpcm9ubWVudEdlbmVyYXRvci5mcm9tU2NlbmUobmV3IFJvb21FbnZpcm9ubWVudCgpLC4wNCkudGV4dHVyZTtzY2VuZS5lbnZpcm9ubWVudD1lbnZpcm9ubWVudDtlbnZpcm9ubWVudEdlbmVyYXRvci5kaXNwb3NlKCk7CiAgICBSZWN0QXJlYUxpZ2h0VW5pZm9ybXNMaWIuaW5pdCgpOwogICAgY29uc3QgYW1iaWVudExpZ2h0PW5ldyBUSFJFRS5IZW1pc3BoZXJlTGlnaHQoMHhmZmZmZmYsMHg3YjgyODgsLjI4KSxrZXlMaWdodD1uZXcgVEhSRUUuUmVjdEFyZWFMaWdodCgweGZmZmJmNSw0LjgsNC41LDQuNSksZmlsbExpZ2h0PW5ldyBUSFJFRS5SZWN0QXJlYUxpZ2h0KDB4ZWVmNmZmLDIuMTUsMy41LDMuNSkscmltTGlnaHQ9bmV3IFRIUkVFLlJlY3RBcmVhTGlnaHQoMHhmZmZmZmYsMy4xLDMsMi41KTtrZXlMaWdodC5wb3NpdGlvbi5zZXQoMy44LDQuOCw1KTtmaWxsTGlnaHQucG9zaXRpb24uc2V0KC0zLjUsMi4zLDQpO3JpbUxpZ2h0LnBvc2l0aW9uLnNldCgwLDUsLTIuOCk7a2V5TGlnaHQubG9va0F0KDAsMCwwKTtmaWxsTGlnaHQubG9va0F0KDAsMCwwKTtyaW1MaWdodC5sb29rQXQoMCwwLDApO3NjZW5lLmFkZChhbWJpZW50TGlnaHQsa2V5TGlnaHQsZmlsbExpZ2h0LHJpbUxpZ2h0KTsKICAgIGNvbnN0IGNhbWVyYT1uZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoMzEsMSwuMSwxMDApO2NhbWVyYS5wb3NpdGlvbi5zZXQoMCwuMSw3LjIpOwogICAgY29uc3QgY29udHJvbHM9bmV3IE9yYml0Q29udHJvbHMoY2FtZXJhLHJlbmRlcmVyLmRvbUVsZW1lbnQpO2NvbnRyb2xzLmVuYWJsZURhbXBpbmc9dHJ1ZTtjb250cm9scy5kYW1waW5nRmFjdG9yPS4wNzU7Y29udHJvbHMuZW5hYmxlUGFuPWZhbHNlO2NvbnRyb2xzLm1pblBvbGFyQW5nbGU9LjM1O2NvbnRyb2xzLm1heFBvbGFyQW5nbGU9TWF0aC5QSS0uMzU7Y29udHJvbHMudGFyZ2V0LnNldCgwLDAsMCk7CiAgICBmdW5jdGlvbiByZW5kZXJOb3coKXtyZW5kZXJlci5yZW5kZXIoc2NlbmUsY2FtZXJhKX0KICAgIGNvbnN0IHJvb3Q9bmV3IFRIUkVFLkdyb3VwKCk7cm9vdC5uYW1lPSdkdGZQcmV2aWV3Um9vdCc7c2NlbmUuYWRkKHJvb3QpOwogICAgY29uc3QgcmF5Y2FzdGVyPW5ldyBUSFJFRS5SYXljYXN0ZXIoKSxwb2ludGVyPW5ldyBUSFJFRS5WZWN0b3IyKCk7CgogICAgZnVuY3Rpb24gZGVjYWxNYXRlcmlhbCgpe3JldHVybiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe2NvbG9yOjB4ZmZmZmZmLHRyYW5zcGFyZW50OnRydWUsYWxwaGFUZXN0Oi4wMTIscG9seWdvbk9mZnNldDp0cnVlLHBvbHlnb25PZmZzZXRGYWN0b3I6LTMsZGVwdGhXcml0ZTpmYWxzZSxzaWRlOlRIUkVFLkRvdWJsZVNpZGUsdG9uZU1hcHBlZDpmYWxzZX0pfQogICAgY29uc3QgZnJvbnRNYXQ9ZGVjYWxNYXRlcmlhbCgpO2xldCBjdXJyZW50PW51bGwsZnJvbnREZWNhbD1udWxsLGJ1aWxkUmVxdWVzdD0wO2NvbnN0IGNhY2hlPXt9OwoKICAgIGNvbnN0IGRyYWNvPW5ldyBEUkFDT0xvYWRlcigpO2RyYWNvLnNldERlY29kZXJQYXRoKCdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3RocmVlQDAuMTYwLjAvZXhhbXBsZXMvanNtL2xpYnMvZHJhY28vJyk7Y29uc3QgZ2x0ZkxvYWRlcj1uZXcgR0xURkxvYWRlcigpO2dsdGZMb2FkZXIuc2V0RFJBQ09Mb2FkZXIoZHJhY28pOwogICAgY29uc3Qgc3VyZmFjZVByb2ZpbGVzPXt0ZWU6e3JvdWdobmVzczouNzgsc2hlZW46LjE4LHNoZWVuUm91Z2huZXNzOi44OCxjbGVhcmNvYXQ6LjAxMixlbnY6LjY4fSxob29kaWU6e3JvdWdobmVzczouOSxzaGVlbjouMzQsc2hlZW5Sb3VnaG5lc3M6Ljk0LGNsZWFyY29hdDouMDA0LGVudjouNTV9LHRvdGU6e3JvdWdobmVzczouODYsc2hlZW46LjI2LHNoZWVuUm91Z2huZXNzOi45MSxjbGVhcmNvYXQ6LjAwNCxlbnY6LjU4fSxjYXA6e3JvdWdobmVzczouNzIsc2hlZW46LjIsc2hlZW5Sb3VnaG5lc3M6Ljg2LGNsZWFyY29hdDouMDI1LGVudjouNzJ9fTsKICAgIGZ1bmN0aW9uIG1hdGVyaWFsRm9yKHNvdXJjZSxrZXkpewogICAgICBjb25zdCBwcm9maWxlPXN1cmZhY2VQcm9maWxlc1trZXldLG1hdD1uZXcgVEhSRUUuTWVzaFBoeXNpY2FsTWF0ZXJpYWwoKTsKICAgICAgaWYoc291cmNlPy5pc01lc2hQaHlzaWNhbE1hdGVyaWFsKW1hdC5jb3B5KHNvdXJjZSk7ZWxzZSBpZihzb3VyY2U\/LmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwpVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbChtYXQsc291cmNlKTtlbHNlIGlmKHNvdXJjZSl7Zm9yKGNvbnN0IHByb3Agb2YgWydtYXAnLCdhbHBoYU1hcCcsJ2FvTWFwJywnZW1pc3NpdmVNYXAnLCdsaWdodE1hcCcsJ25vcm1hbE1hcCcsJ3JvdWdobmVzc01hcCcsJ21ldGFsbmVzc01hcCddKWlmKHNvdXJjZVtwcm9wXSltYXRbcHJvcF09c291cmNlW3Byb3BdO21hdC5uYW1lPXNvdXJjZS5uYW1lfHwnJzttYXQudHJhbnNwYXJlbnQ9c291cmNlLnRyYW5zcGFyZW50O21hdC5vcGFjaXR5PXNvdXJjZS5vcGFjaXR5O21hdC5hbHBoYVRlc3Q9c291cmNlLmFscGhhVGVzdDt9CiAgICAgIG1hdC5jb2xvci5zZXQoc3RhdGUuY29sb3IpO21hdC52ZXJ0ZXhDb2xvcnM9ZmFsc2U7bWF0Lm1ldGFsbmVzcz1NYXRoLm1pbiguMDM1LG1hdC5tZXRhbG5lc3M\/PzApO21hdC5yb3VnaG5lc3M9TWF0aC5tYXgocHJvZmlsZS5yb3VnaG5lc3MsTWF0aC5taW4oLjk2LG1hdC5yb3VnaG5lc3M\/P3Byb2ZpbGUucm91Z2huZXNzKSk7bWF0LnNoZWVuPXByb2ZpbGUuc2hlZW47bWF0LnNoZWVuQ29sb3Iuc2V0KHN0YXRlLmNvbG9yKTttYXQuc2hlZW5Sb3VnaG5lc3M9cHJvZmlsZS5zaGVlblJvdWdobmVzczttYXQuY2xlYXJjb2F0PXByb2ZpbGUuY2xlYXJjb2F0O21hdC5jbGVhcmNvYXRSb3VnaG5lc3M9LjkyO21hdC5lbnZNYXBJbnRlbnNpdHk9cHJvZmlsZS5lbnY7bWF0LnNpZGU9VEhSRUUuRG91YmxlU2lkZTttYXQudG9uZU1hcHBlZD10cnVlO21hdC5uZWVkc1VwZGF0ZT10cnVlO3JldHVybiBtYXQ7CiAgICB9CiAgICBmdW5jdGlvbiBub3JtYWxpemVMb2FkZWQoc291cmNlLGtleSl7CiAgICAgIGNvbnN0IGJlZm9yZT1uZXcgVEhSRUUuQm94MygpLnNldEZyb21PYmplY3Qoc291cmNlKSxzaXplPWJlZm9yZS5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IzKCkpLGNlbnRlcj1iZWZvcmUuZ2V0Q2VudGVyKG5ldyBUSFJFRS5WZWN0b3IzKCkpLGdyb3VwPW5ldyBUSFJFRS5Hcm91cCgpLHRhcmdldEhlaWdodD1rZXk9PT0ndG90ZSc\/My4yNTprZXk9PT0nY2FwJz8yLjU1OjMuMTUsc2NhbGU9dGFyZ2V0SGVpZ2h0L01hdGgubWF4KHNpemUueSwuMDAxKTsKICAgICAgc291cmNlLnBvc2l0aW9uLnNldCgtY2VudGVyLngqc2NhbGUsLWNlbnRlci55KnNjYWxlLC1jZW50ZXIueipzY2FsZSk7c291cmNlLnNjYWxlLnNldFNjYWxhcihzY2FsZSk7Z3JvdXAubmFtZT1gJHtrZXl9TW9kZWxgO2dyb3VwLmFkZChzb3VyY2UpO2dyb3VwLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpOwogICAgICBjb25zdCBtZXNoZXM9W107c291cmNlLnRyYXZlcnNlKG9iamVjdD0+e2lmKCFvYmplY3QuaXNNZXNoKXJldHVybjtvYmplY3QubmFtZT1gJHtrZXl9UGFydCR7bWVzaGVzLmxlbmd0aCsxfWA7b2JqZWN0LmNhc3RTaGFkb3c9ZmFsc2U7b2JqZWN0LnJlY2VpdmVTaGFkb3c9ZmFsc2U7b2JqZWN0Lm1hdGVyaWFsPUFycmF5LmlzQXJyYXkob2JqZWN0Lm1hdGVyaWFsKT9vYmplY3QubWF0ZXJpYWwubWFwKGl0ZW09Pm1hdGVyaWFsRm9yKGl0ZW0sa2V5KSk6bWF0ZXJpYWxGb3Iob2JqZWN0Lm1hdGVyaWFsLGtleSk7b2JqZWN0LnVzZXJEYXRhLnBhcnRJZD1vYmplY3QubmFtZTttZXNoZXMucHVzaChvYmplY3QpfSk7CiAgICAgIGdyb3VwLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO2NvbnN0IHJhbmtlZD1tZXNoZXMubWFwKG1lc2g9Pntjb25zdCBib3g9bmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KG1lc2gpLHM9Ym94LmdldFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSk7cmV0dXJue21lc2gsc2NvcmU6cy54KnMueSpNYXRoLm1heChzLnosLjA0KX19KS5zb3J0KChhLGIpPT5iLnNjb3JlLWEuc2NvcmUpO2NvbnN0IHByaW50VGFyZ2V0cz1rZXk9PT0naG9vZGllJz9yYW5rZWQuc2xpY2UoMCwyKS5tYXAoaXRlbT0+aXRlbS5tZXNoKTpbcmFua2VkWzBdLm1lc2hdOwogICAgICBjb25zdCBib3g9bmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KGdyb3VwKTtyZXR1cm57Z3JvdXAsbWVzaGVzLHBhcnRzOm1lc2hlcyxwcmludFRhcmdldDpwcmludFRhcmdldHNbMF0scHJpbnRUYXJnZXRzLGJveCxrZXl9OwogICAgfQogICAgY29uc3QgbG9hZEdsYj1rZXk9Pm5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PmdsdGZMb2FkZXIubG9hZChtb2RlbFVybHNba2V5XSxnbHRmPT5yZXNvbHZlKG5vcm1hbGl6ZUxvYWRlZChnbHRmLnNjZW5lLGtleSkpLHVuZGVmaW5lZCxyZWplY3QpKTsKICAgIGZ1bmN0aW9uIGNsZWFyRGVjYWxzKCl7aWYoZnJvbnREZWNhbCl7cm9vdC5yZW1vdmUoZnJvbnREZWNhbCk7ZnJvbnREZWNhbC50cmF2ZXJzZShub2RlPT5ub2RlLmdlb21ldHJ5Py5kaXNwb3NlKCkpfWZyb250RGVjYWw9bnVsbH0KICAgIGZ1bmN0aW9uIGFwcGx5Q29sb3IoKXtpZighY3VycmVudClyZXR1cm47Zm9yKGNvbnN0IG1lc2ggb2YgY3VycmVudC5tZXNoZXMpe2NvbnN0IG1hdHM9QXJyYXkuaXNBcnJheShtZXNoLm1hdGVyaWFsKT9tZXNoLm1hdGVyaWFsOlttZXNoLm1hdGVyaWFsXTtmb3IoY29uc3QgbWF0IG9mIG1hdHMpe21hdC5jb2xvcj8uc2V0KHN0YXRlLmNvbG9yKTtpZihtYXQuc2hlZW5Db2xvciltYXQuc2hlZW5Db2xvci5zZXQoc3RhdGUuY29sb3IpO21hdC5uZWVkc1VwZGF0ZT10cnVlfX1yZW5kZXJOb3coKX0KICAgIGZ1bmN0aW9uIGFydHdvcmtTaXplKHRhcmdldEJveCl7Y29uc3Qgc2l6ZT10YXJnZXRCb3guZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMygpKSxsaW1pdFc9c2l6ZS54KihzdGF0ZS5wcm9kdWN0PT09J2NhcCc\/LjQyOi41MikqKHN0YXRlLnNjYWxlLzEwMCksaGVpZ2h0RmFjdG9yPXN0YXRlLnByb2R1Y3Q9PT0nY2FwJz8uMjg6c3RhdGUucHJvZHVjdD09PSd0b3RlJz8uMzQ6LjQ4LGxpbWl0SD1zaXplLnkqaGVpZ2h0RmFjdG9yKihzdGF0ZS5zY2FsZS8xMDApLGFzcGVjdD1NYXRoLm1heCguMDgsTWF0aC5taW4oMTIsc3RhdGUuYXJ0d29ya0FzcGVjdCkpO2xldCB3aWR0aD1saW1pdFcsaGVpZ2h0PXdpZHRoL2FzcGVjdDtpZihoZWlnaHQ+bGltaXRIKXtoZWlnaHQ9bGltaXRIO3dpZHRoPWhlaWdodCphc3BlY3R9cmV0dXJue3dpZHRoLGhlaWdodCxkZXB0aDpNYXRoLm1heChzaXplLnoqLjksLjI0KX19CiAgICBmdW5jdGlvbiBtYWtlRGVjYWwodGFyZ2V0cyxtYXRlcmlhbCl7CiAgICAgIGNvbnN0IHRhcmdldExpc3Q9QXJyYXkuaXNBcnJheSh0YXJnZXRzKT90YXJnZXRzOlt0YXJnZXRzXSxib3g9bmV3IFRIUkVFLkJveDMoKTtib3gubWFrZUVtcHR5KCk7Zm9yKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRMaXN0KXt0YXJnZXQudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7Ym94LmV4cGFuZEJ5T2JqZWN0KHRhcmdldCl9Y29uc3Qgc2l6ZT1ib3guZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMygpKSxjZW50ZXI9Ym94LmdldENlbnRlcihuZXcgVEhSRUUuVmVjdG9yMygpKSxhcnQ9YXJ0d29ya1NpemUoYm94KSx4PWNlbnRlci54KyhzdGF0ZS54LzEwMCkqc2l6ZS54Ki4yNixiYXNlWT1zdGF0ZS5wcm9kdWN0PT09J3RvdGUnP2NlbnRlci55LXNpemUueSouMTg6c3RhdGUucHJvZHVjdD09PSdjYXAnP2NlbnRlci55K3NpemUueSouMDg6Y2VudGVyLnkseT1iYXNlWSsoc3RhdGUueS8xMDApKnNpemUueSouMjc7CiAgICAgIGNvbnN0IHo9Ym94Lm1heC56Ky4wMDgsb3JpZW50YXRpb249bmV3IFRIUkVFLkV1bGVyKDAsMCwwKSxwcm9qZWN0aW9uPW5ldyBUSFJFRS5WZWN0b3IzKGFydC53aWR0aCxhcnQuaGVpZ2h0LGFydC5kZXB0aCoyLjQpLGdyb3VwPW5ldyBUSFJFRS5Hcm91cCgpOwogICAgICBmb3IoY29uc3QgdGFyZ2V0IG9mIHRhcmdldExpc3QpdHJ5e2NvbnN0IGdlb21ldHJ5PW5ldyBEZWNhbEdlb21ldHJ5KHRhcmdldCxuZXcgVEhSRUUuVmVjdG9yMyh4LHkseiksb3JpZW50YXRpb24scHJvamVjdGlvbik7aWYoZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbj8uY291bnQpZ3JvdXAuYWRkKG5ldyBUSFJFRS5NZXNoKGdlb21ldHJ5LG1hdGVyaWFsKSl9Y2F0Y2goZXJyb3Ipe2NvbnNvbGUud2FybignRGVjYWwgcHJvamVjdGlvbiBmYWxsYmFjaycsZXJyb3IpfQogICAgICBpZihncm91cC5jaGlsZHJlbi5sZW5ndGgpcmV0dXJuIGdyb3VwO2NvbnN0IG1lc2g9bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLlBsYW5lR2VvbWV0cnkoYXJ0LndpZHRoLGFydC5oZWlnaHQpLG1hdGVyaWFsKTttZXNoLnBvc2l0aW9uLnNldCh4LHkseik7aWYoc2lkZT09PSdiYWNrJyltZXNoLnJvdGF0aW9uLnk9TWF0aC5QSTtyZXR1cm4gbWVzaDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYnVpbGREZWNhbCgpewogICAgICBjbGVhckRlY2FscygpO2lmKCFjdXJyZW50fHwhc3RhdGUuYXJ0d29ya1RleHR1cmUpe3VwZGF0ZVN0YWdlU3RhdHVzKCk7cmVuZGVyTm93KCk7cmV0dXJufWNvbnN0IHNhdmVkPXJvb3Qucm90YXRpb24ueTtyb290LnJvdGF0aW9uLnk9MDtyb290LnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO2Zyb250TWF0Lm1hcD1zdGF0ZS5hcnR3b3JrVGV4dHVyZTtmcm9udE1hdC5uZWVkc1VwZGF0ZT10cnVlOwogICAgICBjb25zdCBtZXNoPW1ha2VEZWNhbChjdXJyZW50LnByaW50VGFyZ2V0cyxmcm9udE1hdCk7bWVzaC5uYW1lPWAke3N0YXRlLnByb2R1Y3R9ZnJvbnRBcnR3b3JrYDttZXNoLnVzZXJEYXRhLnBhcnRJZD0nYXJ0d29yayc7ZnJvbnREZWNhbD1tZXNoO3Jvb3QuYWRkKG1lc2gpO3Jvb3Qucm90YXRpb24ueT1zYXZlZDtyb290LnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO3VwZGF0ZVN0YWdlU3RhdHVzKCk7cmVuZGVyTm93KCk7CiAgICB9CiAgICBmdW5jdGlvbiB1cGRhdGVSdW50aW1lKCl7CiAgICAgIGlmKCFjdXJyZW50KXJldHVybjtjb25zdCBub2Rlcz17fTtmb3IoY29uc3QgcGFydCBvZiBjdXJyZW50LnBhcnRzKXtub2Rlc1twYXJ0Lm5hbWVdPXBhcnQ7cGFydC51c2VyRGF0YS5ob21lUG9zaXRpb249cGFydC5wb3NpdGlvbi5jbG9uZSgpfQogICAgICByb290LnVzZXJEYXRhLnNjdWxwdFJ1bnRpbWU9e25vZGVzLGRlc3RydWN0aW9uR3JvdXBzOntnYXJtZW50Ok9iamVjdC5rZXlzKG5vZGVzKX0sc2V0RXhwbG9kZWQoYW1vdW50PTApe2NvbnN0IHZhbHVlPU1hdGgubWF4KDAsTWF0aC5taW4oMSxOdW1iZXIoYW1vdW50KXx8MCkpO2Zvcihjb25zdCBwYXJ0IG9mIGN1cnJlbnQucGFydHMpe2NvbnN0IGhvbWU9cGFydC51c2VyRGF0YS5ob21lUG9zaXRpb258fG5ldyBUSFJFRS5WZWN0b3IzKCksYm94PW5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdChwYXJ0KSxjZW50ZXI9Ym94LmdldENlbnRlcihuZXcgVEhSRUUuVmVjdG9yMygpKTtwYXJ0LnBvc2l0aW9uLmNvcHkoaG9tZSkuYWRkKGNlbnRlci5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih2YWx1ZSouMzQpKX19fTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIGJ1aWxkUHJvZHVjdChrZXkpewogICAgICBjb25zdCByZXF1ZXN0PSsrYnVpbGRSZXF1ZXN0O2xvYWRpbmcuaGlkZGVuPWZhbHNlO2NvbnN0IG5leHQ9Y2FjaGVba2V5XXx8KGNhY2hlW2tleV09YXdhaXQgbG9hZEdsYihrZXkpKTtpZihyZXF1ZXN0IT09YnVpbGRSZXF1ZXN0KXJldHVybiBmYWxzZTtjbGVhckRlY2FscygpO2lmKGN1cnJlbnQpcm9vdC5yZW1vdmUoY3VycmVudC5ncm91cCk7c3RhdGUucHJvZHVjdD1rZXk7Y3VycmVudD1uZXh0O3Jvb3QuYWRkKGN1cnJlbnQuZ3JvdXApO2FwcGx5Q29sb3IoKTt1cGRhdGVSdW50aW1lKCk7Zml0Vmlldyh0cnVlKTtyZWJ1aWxkRGVjYWwoKTtyZW5kZXJOb3coKTtsb2FkaW5nLmhpZGRlbj10cnVlO3VwZGF0ZVN0YWdlU3RhdHVzKCk7cmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBmaXRWaWV3KHJlc2V0Um90YXRpb249ZmFsc2UpewogICAgICBpZighY3VycmVudClyZXR1cm47Y3VycmVudC5ncm91cC51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtjb25zdCBib3g9bmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KGN1cnJlbnQuZ3JvdXApLHNpemU9Ym94LmdldFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSksY2VudGVyPWJveC5nZXRDZW50ZXIobmV3IFRIUkVFLlZlY3RvcjMoKSksd2lkdGg9TWF0aC5tYXgoMSxzdGFnZS5jbGllbnRXaWR0aCksaGVpZ2h0PU1hdGgubWF4KDEsc3RhZ2UuY2xpZW50SGVpZ2h0KSxhc3BlY3Q9d2lkdGgvaGVpZ2h0LHZGb3Y9VEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKGNhbWVyYS5mb3YpLGRpc3RWPXNpemUueSouNjYvTWF0aC50YW4odkZvdi8yKSxoRm92PTIqTWF0aC5hdGFuKE1hdGgudGFuKHZGb3YvMikqYXNwZWN0KSxkaXN0SD1zaXplLngqLjY2L01hdGgudGFuKGhGb3YvMiksZGlzdD1NYXRoLm1heChkaXN0VixkaXN0SCwzLjYpLGlzQ2FwPXN0YXRlLnByb2R1Y3Q9PT0nY2FwJyxjYW1lcmFZPWNlbnRlci55Kyhpc0NhcD9zaXplLnkqLjE4OjApO2NhbWVyYS5hc3BlY3Q9YXNwZWN0O2NhbWVyYS5wb3NpdGlvbi5zZXQoaXNDYXA\/c2l6ZS54Ki4wODowLGNhbWVyYVksZGlzdCk7Y2FtZXJhLm5lYXI9TWF0aC5tYXgoLjA1LGRpc3QvMTAwKTtjYW1lcmEuZmFyPWRpc3QqMTI7Y2FtZXJhLnpvb209c3RhdGUubW9kZWxTaXplLzEwMDtpZihzdGF0ZS5tb2RlbFh8fHN0YXRlLm1vZGVsWSljYW1lcmEuc2V0Vmlld09mZnNldCh3aWR0aCxoZWlnaHQsLXN0YXRlLm1vZGVsWC8xMDAqd2lkdGgqLjQ1LHN0YXRlLm1vZGVsWS8xMDAqaGVpZ2h0Ki40NSx3aWR0aCxoZWlnaHQpO2Vsc2UgY2FtZXJhLmNsZWFyVmlld09mZnNldCgpO2NhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7Y29udHJvbHMudGFyZ2V0LmNvcHkoY2VudGVyKTtpZihpc0NhcCljb250cm9scy50YXJnZXQueS09c2l6ZS55Ki4wNDtjb250cm9scy5taW5EaXN0YW5jZT1kaXN0Ki41ODtjb250cm9scy5tYXhEaXN0YW5jZT1kaXN0KjIuMTtpZihyZXNldFJvdGF0aW9uKXJvb3Qucm90YXRpb24uc2V0KDAsaXNDYXA\/LS4yMjowLDApO2NvbnRyb2xzLnVwZGF0ZSgpO3JlbmRlcmVyLnNldFNpemUod2lkdGgsaGVpZ2h0LGZhbHNlKTtyZW5kZXJOb3coKX0KICAgIGNvbnN0IHJlc2l6ZT1uZXcgUmVzaXplT2JzZXJ2ZXIoKCk9PmZpdFZpZXcoZmFsc2UpKTtyZXNpemUub2JzZXJ2ZShzdGFnZSk7CiAgICBsZXQgc3RhZ2VWaXNpYmxlPXRydWU7bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXM9PntzdGFnZVZpc2libGU9ZW50cmllc1swXT8uaXNJbnRlcnNlY3RpbmchPT1mYWxzZX0se3RocmVzaG9sZDouMDF9KS5vYnNlcnZlKHN0YWdlKTsKICAgIHJlbmRlcmVyLnNldEFuaW1hdGlvbkxvb3AoKCk9PntpZighc3RhZ2VWaXNpYmxlfHxkb2N1bWVudC5oaWRkZW4pcmV0dXJuO2NvbnRyb2xzLnVwZGF0ZSgpO3JlbmRlcmVyLnJlbmRlcihzY2VuZSxjYW1lcmEpfSk7CiAgICBjb250cm9scy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLHJlbmRlck5vdyk7YWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScscmVuZGVyTm93KTthZGRFdmVudExpc3RlbmVyKCdwYWdlc2hvdycscmVuZGVyTm93KTsKICAgIHJlbmRlcmVyLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2ViZ2xjb250ZXh0bG9zdCcsZXZlbnQ9PntldmVudC5wcmV2ZW50RGVmYXVsdCgpO2FydFN0YXR1cy5jbGFzc05hbWU9J3N0YXR1cyBlcnInO2FydFN0YXR1cy50ZXh0Q29udGVudD0nM0QgcHJldmlldyBwYXVzZWQgYnkgdGhlIGdyYXBoaWNzIHN5c3RlbS4gUmV0dXJuIHRvIHRoaXMgdGFiIG9yIHJlZnJlc2ggdG8gcmVzdG9yZSBpdC4nfSk7CiAgICByZW5kZXJlci5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmdsY29udGV4dHJlc3RvcmVkJywoKT0+e2FydFN0YXR1cy5jbGFzc05hbWU9J3N0YXR1cyc7YXJ0U3RhdHVzLnRleHRDb250ZW50PXN0YXRlLmFydHdvcmtGaWxlP2BMb2FkZWQgJHtzdGF0ZS5hcnR3b3JrU291cmNlfS5gOicnO2ZpdFZpZXcoZmFsc2UpO3JlbmRlck5vdygpfSk7CgogICAgZnVuY3Rpb24gdXBkYXRlU3RhZ2VTdGF0dXMoc2VsZWN0ZWQ9Jycpe2NvbnN0IGFydD1zdGF0ZS5hcnR3b3JrVGV4dHVyZT8nQXJ0d29yayBsb2FkZWQnOidVcGxvYWQgYXJ0d29yayB0byBiZWdpbic7c3RhZ2VTdGF0dXMuaW5uZXJIVE1MPWA8c3Ryb25nPiR7bGFiZWxzW3N0YXRlLnByb2R1Y3RdfTwvc3Ryb25nPjxzcGFuPkZyb250IHBsYWNlbWVudC4gJHtzZWxlY3RlZHx8YXJ0fS48L3NwYW4+YH0KICAgIGZ1bmN0aW9uIG1hcmtEaXJ0eSgpe2lmKCFzdGF0ZS5hcnR3b3JrRmlsZSlyZXR1cm47aWYoc3RhdGUuYXR0YWNoZWQpe3Byb2R1Y3Rpb25TdGF0dXMuY2xhc3NOYW1lPSdzdGF0dXMnO3Byb2R1Y3Rpb25TdGF0dXMudGV4dENvbnRlbnQ9J1NldHRpbmdzIGNoYW5nZWQuIEF0dGFjaCBhZ2FpbiBiZWZvcmUgYWRkaW5nIHRvIGNhcnQuJ31zdGF0ZS5hdHRhY2hlZD1mYWxzZTtwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J2FydGV0cmliZTpwcm9kdWN0aW9uLWNvbmZpZy1kaXJ0eSd9LGxvY2F0aW9uLm9yaWdpbil9CiAgICBmdW5jdGlvbiBzeW5jUGxhY2VtZW50KCl7c3RhdGUuc2NhbGU9TnVtYmVyKCQoJyNzY2FsZScpLnZhbHVlKTtzdGF0ZS54PU51bWJlcigkKCcjeCcpLnZhbHVlKTtzdGF0ZS55PU51bWJlcigkKCcjeScpLnZhbHVlKTskKCcjc2NhbGVWYWx1ZScpLnRleHRDb250ZW50PWAke3N0YXRlLnNjYWxlfSVgOyQoJyN4VmFsdWUnKS50ZXh0Q29udGVudD1zdGF0ZS54OyQoJyN5VmFsdWUnKS50ZXh0Q29udGVudD1zdGF0ZS55O3JlYnVpbGREZWNhbCgpO21hcmtEaXJ0eSgpfQogICAgZnVuY3Rpb24gYXBwbHlEZWZhdWx0cygpe2NvbnN0IHZhbHVlPWRlZmF1bHRzW3N0YXRlLnByb2R1Y3RdO2Zvcihjb25zdCBrZXkgb2YgWydtb2RlbFNpemUnLCdtb2RlbFgnLCdtb2RlbFknXSlzdGF0ZVtrZXldPXZhbHVlW2tleV07Zm9yKGNvbnN0IGtleSBvZiBbJ3NjYWxlJywneCcsJ3knXSl7JChgIyR7a2V5fWApLnZhbHVlPXZhbHVlW2tleV07c3RhdGVba2V5XT12YWx1ZVtrZXldfWZpdFZpZXcoZmFsc2UpO3N5bmNQbGFjZW1lbnQoKX0KICAgICQkKCcjcHJvZHVjdEdyaWQgW2RhdGEtcHJvZHVjdF0nKS5mb3JFYWNoKGJ1dHRvbj0+YnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxhc3luYygpPT57aWYoYnV0dG9uLmRhdGFzZXQucHJvZHVjdD09PXN0YXRlLnByb2R1Y3QpcmV0dXJuOyQkKCcjcHJvZHVjdEdyaWQgW2RhdGEtcHJvZHVjdF0nKS5mb3JFYWNoKGl0ZW09Pml0ZW0uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLFN0cmluZyhpdGVtPT09YnV0dG9uKSkpO2lmKCFhd2FpdCBidWlsZFByb2R1Y3QoYnV0dG9uLmRhdGFzZXQucHJvZHVjdCkpcmV0dXJuO2FwcGx5RGVmYXVsdHMoKTttYXJrRGlydHkoKX0pKTsKICAgIGZvcihjb25zdCBpZCBvZiBbJ3NjYWxlJywneCcsJ3knXSkkKGAjJHtpZH1gKS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsc3luY1BsYWNlbWVudCk7CiAgICAkKCcjZ2FybWVudENvbG9yJykuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLGV2ZW50PT57c3RhdGUuY29sb3I9ZXZlbnQudGFyZ2V0LnZhbHVlOyQoJyNnYXJtZW50Q29sb3JWYWx1ZScpLnRleHRDb250ZW50PXN0YXRlLmNvbG9yLnRvVXBwZXJDYXNlKCk7YXBwbHlDb2xvcigpO21hcmtEaXJ0eSgpfSk7CiAgICByZW5kZXJlci5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsZXZlbnQ9PntpZighY3VycmVudClyZXR1cm47Y29uc3QgcmVjdD1yZW5kZXJlci5kb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3BvaW50ZXIuc2V0KCgoZXZlbnQuY2xpZW50WC1yZWN0LmxlZnQpL3JlY3Qud2lkdGgpKjItMSwtKChldmVudC5jbGllbnRZLXJlY3QudG9wKS9yZWN0LmhlaWdodCkqMisxKTtyYXljYXN0ZXIuc2V0RnJvbUNhbWVyYShwb2ludGVyLGNhbWVyYSk7Y29uc3QgaGl0PXJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKGN1cnJlbnQubWVzaGVzLHRydWUpWzBdO2lmKGhpdCl1cGRhdGVTdGFnZVN0YXR1cyhgU2VsZWN0ZWQgJHtoaXQub2JqZWN0LnVzZXJEYXRhLnBhcnRJZHx8J21vZGVsIHBhcnQnfWApfSk7CgogICAgZnVuY3Rpb24gc2V0VGV4dHVyZSh0ZXh0dXJlLGZpbGUsc291cmNlKXtpZihzdGF0ZS5hcnR3b3JrVGV4dHVyZSlzdGF0ZS5hcnR3b3JrVGV4dHVyZS5kaXNwb3NlKCk7dGV4dHVyZS5jb2xvclNwYWNlPVRIUkVFLlNSR0JDb2xvclNwYWNlO3RleHR1cmUuYW5pc290cm9weT1yZW5kZXJlci5jYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpO3N0YXRlLmFydHdvcmtUZXh0dXJlPXRleHR1cmU7c3RhdGUuYXJ0d29ya0FzcGVjdD0odGV4dHVyZS5pbWFnZT8ubmF0dXJhbFdpZHRofHx0ZXh0dXJlLmltYWdlPy53aWR0aHx8MSkvKHRleHR1cmUuaW1hZ2U\/Lm5hdHVyYWxIZWlnaHR8fHRleHR1cmUuaW1hZ2U\/LmhlaWdodHx8MSk7c3RhdGUuYXJ0d29ya0ZpbGU9ZmlsZTtzdGF0ZS5hcnR3b3JrU291cmNlPXNvdXJjZTskKCcjY2xlYXJBcnQnKS5kaXNhYmxlZD1mYWxzZTskKCcjZG93bmxvYWRQYWNrJykuZGlzYWJsZWQ9ZmFsc2U7JCgnI2F0dGFjaE9yZGVyJykuZGlzYWJsZWQ9ZmFsc2U7YXJ0U3RhdHVzLmNsYXNzTmFtZT0nc3RhdHVzIG9rJzthcnRTdGF0dXMudGV4dENvbnRlbnQ9YExvYWRlZCAke3NvdXJjZX0uYDtwcm9kdWN0aW9uU3RhdHVzLmNsYXNzTmFtZT0nc3RhdHVzJztwcm9kdWN0aW9uU3RhdHVzLnRleHRDb250ZW50PSdSZWFkeSB0byBkb3dubG9hZCBvciBhdHRhY2ggdG8gdGhpcyBwcm9kdWN0Lic7cmVidWlsZERlY2FsKCk7bWFya0RpcnR5KCl9CiAgICBmdW5jdGlvbiB0ZXh0dXJlRnJvbUJsb2IoYmxvYixmaWxlLHNvdXJjZSl7cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9Pntjb25zdCB1cmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSxsb2FkZXI9bmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKTtsb2FkZXIubG9hZCh1cmwsdGV4dHVyZT0+e1VSTC5yZXZva2VPYmplY3RVUkwodXJsKTtzZXRUZXh0dXJlKHRleHR1cmUsZmlsZSxzb3VyY2UpO3Jlc29sdmUoKX0sdW5kZWZpbmVkLGVycm9yPT57VVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO3JlamVjdChlcnJvcil9KX0pfQogICAgYXN5bmMgZnVuY3Rpb24gbG9hZEZpbGUoZmlsZSl7aWYoIWZpbGV8fCFmaWxlLnR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJykpcmV0dXJuO2lmKGZpbGUuc2l6ZT4yMCoxMDI0KjEwMjQpdGhyb3cgbmV3IEVycm9yKCdVc2UgYW4gaW1hZ2Ugc21hbGxlciB0aGFuIDIwIE1CLicpO2F3YWl0IHRleHR1cmVGcm9tQmxvYihmaWxlLGZpbGUsZmlsZS5uYW1lKX0KICAgICQoJyN1cGxvYWRCdXR0b24nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKCk9PiQoJyNmaWxlJykuY2xpY2soKSk7CiAgICAkKCcjZmlsZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsYXN5bmMgZXZlbnQ9Pntjb25zdCBmaWxlPWV2ZW50LnRhcmdldC5maWxlcz8uWzBdO2V2ZW50LnRhcmdldC52YWx1ZT0nJztpZighZmlsZSlyZXR1cm47YXJ0U3RhdHVzLmNsYXNzTmFtZT0nc3RhdHVzJzthcnRTdGF0dXMudGV4dENvbnRlbnQ9J09wZW5pbmcgYXJ0d29yay4uLic7dHJ5e2F3YWl0IGxvYWRGaWxlKGZpbGUpfWNhdGNoKGVycm9yKXthcnRTdGF0dXMuY2xhc3NOYW1lPSdzdGF0dXMgZXJyJzthcnRTdGF0dXMudGV4dENvbnRlbnQ9ZXJyb3IubWVzc2FnZXx8J1RoZSBhcnR3b3JrIGNvdWxkIG5vdCBiZSBvcGVuZWQuJ319KTsKICAgICQoJyNjbGVhckFydCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoKT0+e2lmKHN0YXRlLmFydHdvcmtUZXh0dXJlKXN0YXRlLmFydHdvcmtUZXh0dXJlLmRpc3Bvc2UoKTtzdGF0ZS5hcnR3b3JrVGV4dHVyZT1udWxsO3N0YXRlLmFydHdvcmtGaWxlPW51bGw7c3RhdGUuYXJ0d29ya1NvdXJjZT0nJztjbGVhckRlY2FscygpO2Zvcihjb25zdCBpZCBvZiBbJ2NsZWFyQXJ0JywnZG93bmxvYWRQYWNrJywnYXR0YWNoT3JkZXInXSkkKGAjJHtpZH1gKS5kaXNhYmxlZD10cnVlO2FydFN0YXR1cy5jbGFzc05hbWU9J3N0YXR1cyc7YXJ0U3RhdHVzLnRleHRDb250ZW50PSdBcnR3b3JrIGNsZWFyZWQuJztwcm9kdWN0aW9uU3RhdHVzLmNsYXNzTmFtZT0nc3RhdHVzJztwcm9kdWN0aW9uU3RhdHVzLnRleHRDb250ZW50PSdVcGxvYWQgYXJ0d29yayB0byBwcmVwYXJlIGZpbGVzLic7cGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidhcnRldHJpYmU6cHJvZHVjdGlvbi1jb25maWctZGlydHknfSxsb2NhdGlvbi5vcmlnaW4pO3VwZGF0ZVN0YWdlU3RhdHVzKCl9KTsKCiAgICBjb25zdCBjYW52YXNCbG9iPSgpPT5uZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57cmVuZGVyZXIucmVuZGVyKHNjZW5lLGNhbWVyYSk7cmVuZGVyZXIuZG9tRWxlbWVudC50b0Jsb2IoYmxvYj0+YmxvYj9yZXNvbHZlKGJsb2IpOnJlamVjdChuZXcgRXJyb3IoJ1ByZXZpZXcgaW1hZ2UgY291bGQgbm90IGJlIGNyZWF0ZWQuJykpLCdpbWFnZS9wbmcnKX0pOwogICAgZnVuY3Rpb24gY29uZmlndXJhdGlvbigpe3JldHVybntjb25maWd1cmF0aW9uSWQ6YERURi0ke0RhdGUubm93KCkudG9TdHJpbmcoMzYpLnRvVXBwZXJDYXNlKCl9YCxwcm9kdWN0OidDdXN0b20gRFRGIFRyYW5zZmVycycsY3JlYXRlZEF0Om5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxwcm9kdWN0aW9uOntwcmV2aWV3R2FybWVudDp7a2V5OnN0YXRlLnByb2R1Y3QsbGFiZWw6bGFiZWxzW3N0YXRlLnByb2R1Y3RdfSxwcmludFNpZGU6J2Zyb250JyxhcnR3b3JrU2NhbGVQZXJjZW50OnN0YXRlLnNjYWxlLGhvcml6b250YWxPZmZzZXQ6c3RhdGUueCx2ZXJ0aWNhbE9mZnNldDpzdGF0ZS55LGdhcm1lbnRDb2xvcjpzdGF0ZS5jb2xvcixiYWNrZ3JvdW5kOnN0YXRlLmJhY2tncm91bmQsZGVzaWduU291cmNlOnN0YXRlLmFydHdvcmtTb3VyY2V9LG5vdGU6J1ByZXZpZXcgcGxhY2VtZW50IGlzIGlsbHVzdHJhdGl2ZS4gQ29uZmlybSBmaW5hbCB0cmFuc2ZlciBkaW1lbnNpb25zIGJlZm9yZSBwcm9kdWN0aW9uLid9fQogICAgd2luZG93LkFydGV0cmliZURURlByZXZpZXc9e3NldEV4cGxvZGVkOnZhbHVlPT5yb290LnVzZXJEYXRhLnNjdWxwdFJ1bnRpbWU\/LnNldEV4cGxvZGVkKHZhbHVlKSxnZXRDb25maWd1cmF0aW9uOmNvbmZpZ3VyYXRpb259OwogICAgYXN5bmMgZnVuY3Rpb24gYnVpbGRGaWxlcygpe2lmKCFzdGF0ZS5hcnR3b3JrRmlsZSl0aHJvdyBuZXcgRXJyb3IoJ1VwbG9hZCBhcnR3b3JrIGZpcnN0LicpO2NvbnN0IGNvbmZpZz1jb25maWd1cmF0aW9uKCksYmxvYj1hd2FpdCBjYW52YXNCbG9iKCkscHJldmlld0ZpbGU9bmV3IEZpbGUoW2Jsb2JdLGAke2NvbmZpZy5jb25maWd1cmF0aW9uSWR9LXByZXZpZXcucG5nYCx7dHlwZTonaW1hZ2UvcG5nJ30pO3JldHVybntjb25maWcsYXJ0d29ya0ZpbGU6c3RhdGUuYXJ0d29ya0ZpbGUscHJldmlld0ZpbGV9fQogICAgZnVuY3Rpb24gY3JjMzIoYnl0ZXMpe2xldCBjPS0xO2Zvcihjb25zdCBieXRlIG9mIGJ5dGVzKXtjXj1ieXRlO2ZvcihsZXQgaT0wO2k8ODtpKyspYz0oYz4+PjEpXigoYyYxKT8weGVkYjg4MzIwOjApfXJldHVybihjXi0xKT4+PjB9CiAgICBmdW5jdGlvbiB6aXBTdG9yZShmaWxlcyl7Y29uc3QgZW5jPW5ldyBUZXh0RW5jb2RlcigpLHBhcnRzPVtdLGNlbnRyYWw9W107bGV0IG9mZnNldD0wO2NvbnN0IHUxNj1uPT5uZXcgVWludDhBcnJheShbbiYyNTUsbj4+PjgmMjU1XSksdTMyPW49Pm5ldyBVaW50OEFycmF5KFtuJjI1NSxuPj4+OCYyNTUsbj4+PjE2JjI1NSxuPj4+MjQmMjU1XSk7Zm9yKGNvbnN0IGZpbGUgb2YgZmlsZXMpe2NvbnN0IG5hbWU9ZW5jLmVuY29kZShmaWxlLm5hbWUpLGRhdGE9ZmlsZS5kYXRhLGNyYz1jcmMzMihkYXRhKSxoZWFkPVt1MzIoMHgwNDAzNGI1MCksdTE2KDIwKSx1MTYoMCksdTE2KDApLHUxNigwKSx1MTYoMCksdTMyKGNyYyksdTMyKGRhdGEubGVuZ3RoKSx1MzIoZGF0YS5sZW5ndGgpLHUxNihuYW1lLmxlbmd0aCksdTE2KDApLG5hbWVdO3BhcnRzLnB1c2goLi4uaGVhZCxkYXRhKTtjZW50cmFsLnB1c2godTMyKDB4MDIwMTRiNTApLHUxNigyMCksdTE2KDIwKSx1MTYoMCksdTE2KDApLHUxNigwKSx1MTYoMCksdTMyKGNyYyksdTMyKGRhdGEubGVuZ3RoKSx1MzIoZGF0YS5sZW5ndGgpLHUxNihuYW1lLmxlbmd0aCksdTE2KDApLHUxNigwKSx1MTYoMCksdTE2KDApLHUzMigwKSx1MzIob2Zmc2V0KSxuYW1lKTtvZmZzZXQrPWhlYWQucmVkdWNlKChzdW0saXRlbSk9PnN1bStpdGVtLmxlbmd0aCwwKStkYXRhLmxlbmd0aH1jb25zdCBjc2l6ZT1jZW50cmFsLnJlZHVjZSgoc3VtLGl0ZW0pPT5zdW0raXRlbS5sZW5ndGgsMCk7cmV0dXJuIG5ldyBCbG9iKFsuLi5wYXJ0cywuLi5jZW50cmFsLHUzMigweDA2MDU0YjUwKSx1MTYoMCksdTE2KDApLHUxNihmaWxlcy5sZW5ndGgpLHUxNihmaWxlcy5sZW5ndGgpLHUzMihjc2l6ZSksdTMyKG9mZnNldCksdTE2KDApXSx7dHlwZTonYXBwbGljYXRpb24vemlwJ30pfQogICAgZnVuY3Rpb24gc2F2ZUJsb2IoYmxvYixuYW1lKXtjb25zdCBsaW5rPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtsaW5rLmhyZWY9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtsaW5rLmRvd25sb2FkPW5hbWU7bGluay5jbGljaygpO3NldFRpbWVvdXQoKCk9PlVSTC5yZXZva2VPYmplY3RVUkwobGluay5ocmVmKSwxMjAwKX0KICAgICQoJyNkb3dubG9hZFBhY2snKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsYXN5bmMoKT0+e2NvbnN0IGJ1dHRvbj0kKCcjZG93bmxvYWRQYWNrJyk7YnV0dG9uLmRpc2FibGVkPXRydWU7YnV0dG9uLnRleHRDb250ZW50PSdQcmVwYXJpbmcuLi4nO3RyeXtjb25zdCBmaWxlcz1hd2FpdCBidWlsZEZpbGVzKCksZW5jPW5ldyBUZXh0RW5jb2RlcigpLGl0ZW1zPVt7bmFtZTonY29uZmlndXJhdGlvbi5qc29uJyxkYXRhOmVuYy5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoZmlsZXMuY29uZmlnLG51bGwsMikpfSx7bmFtZTpmaWxlcy5wcmV2aWV3RmlsZS5uYW1lLGRhdGE6bmV3IFVpbnQ4QXJyYXkoYXdhaXQgZmlsZXMucHJldmlld0ZpbGUuYXJyYXlCdWZmZXIoKSl9LHtuYW1lOmBvcmlnaW5hbC0ke3N0YXRlLmFydHdvcmtGaWxlLm5hbWV9YCxkYXRhOm5ldyBVaW50OEFycmF5KGF3YWl0IHN0YXRlLmFydHdvcmtGaWxlLmFycmF5QnVmZmVyKCkpfV07c2F2ZUJsb2IoemlwU3RvcmUoaXRlbXMpLGAke2ZpbGVzLmNvbmZpZy5jb25maWd1cmF0aW9uSWR9LXByb2R1Y3Rpb24tcGFjay56aXBgKTtwcm9kdWN0aW9uU3RhdHVzLmNsYXNzTmFtZT0nc3RhdHVzIG9rJztwcm9kdWN0aW9uU3RhdHVzLnRleHRDb250ZW50PSdQcm9kdWN0aW9uIHBhY2sgZG93bmxvYWRlZC4nfWNhdGNoKGVycm9yKXtwcm9kdWN0aW9uU3RhdHVzLmNsYXNzTmFtZT0nc3RhdHVzIGVycic7cHJvZHVjdGlvblN0YXR1cy50ZXh0Q29udGVudD1lcnJvci5tZXNzYWdlfHwnVGhlIHByb2R1Y3Rpb24gcGFjayBjb3VsZCBub3QgYmUgY3JlYXRlZC4nfWZpbmFsbHl7YnV0dG9uLmRpc2FibGVkPWZhbHNlO2J1dHRvbi50ZXh0Q29udGVudD0nRG93bmxvYWQgcGFjayd9fSk7CiAgICAkKCcjYXR0YWNoT3JkZXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsYXN5bmMoKT0+e2NvbnN0IGJ1dHRvbj0kKCcjYXR0YWNoT3JkZXInKTtidXR0b24uZGlzYWJsZWQ9dHJ1ZTtidXR0b24udGV4dENvbnRlbnQ9J0F0dGFjaGluZy4uLic7dHJ5e2lmKHBhcmVudD09PXdpbmRvdyl0aHJvdyBuZXcgRXJyb3IoJ09wZW4gdGhpcyB0b29sIGZyb20gdGhlIFNob3BpZnkgcHJvZHVjdCBwYWdlIHRvIGF0dGFjaCBmaWxlcy4nKTtjb25zdCBmaWxlcz1hd2FpdCBidWlsZEZpbGVzKCk7cGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidhcnRldHJpYmU6YXR0YWNoLXByb2R1Y3Rpb24tY29uZmlnJywuLi5maWxlc30sbG9jYXRpb24ub3JpZ2luKX1jYXRjaChlcnJvcil7YnV0dG9uLmRpc2FibGVkPWZhbHNlO2J1dHRvbi50ZXh0Q29udGVudD0nQXR0YWNoIHRvIG9yZGVyJztwcm9kdWN0aW9uU3RhdHVzLmNsYXNzTmFtZT0nc3RhdHVzIGVycic7cHJvZHVjdGlvblN0YXR1cy50ZXh0Q29udGVudD1lcnJvci5tZXNzYWdlfHwnRmlsZXMgY291bGQgbm90IGJlIGF0dGFjaGVkLid9fSk7CiAgICBhZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJyxldmVudD0+e2lmKGV2ZW50Lm9yaWdpbiE9PWxvY2F0aW9uLm9yaWdpbnx8ZXZlbnQuZGF0YT8udHlwZSE9PSdhcnRldHJpYmU6b3JkZXItYXR0YWNobWVudC1yZXN1bHQnKXJldHVybjtjb25zdCBidXR0b249JCgnI2F0dGFjaE9yZGVyJyk7YnV0dG9uLmRpc2FibGVkPWZhbHNlO2J1dHRvbi50ZXh0Q29udGVudD0nQXR0YWNoIHRvIG9yZGVyJztzdGF0ZS5hdHRhY2hlZD1Cb29sZWFuKGV2ZW50LmRhdGEuc3VjY2Vzcyk7cHJvZHVjdGlvblN0YXR1cy5jbGFzc05hbWU9YHN0YXR1cyAke3N0YXRlLmF0dGFjaGVkPydvayc6J2Vycid9YDtwcm9kdWN0aW9uU3RhdHVzLnRleHRDb250ZW50PXN0YXRlLmF0dGFjaGVkPydBdHRhY2hlZCB0byB0aGlzIHByb2R1Y3QuIENob29zZSBvcHRpb25zIGFuZCBhZGQgdG8gY2FydC4nOidGaWxlcyBjb3VsZCBub3QgYmUgYXR0YWNoZWQuIFJlZnJlc2ggdGhlIHByb2R1Y3QgcGFnZSBhbmQgdHJ5IGFnYWluLid9KTsKICAgIGJ1aWxkUHJvZHVjdCgndGVlJykudGhlbigoKT0+YXBwbHlEZWZhdWx0cygpKS5jYXRjaChlcnJvcj0+e2NvbnNvbGUuZXJyb3IoZXJyb3IpO2xvYWRpbmcuaGlkZGVuPXRydWU7YXJ0U3RhdHVzLmNsYXNzTmFtZT0nc3RhdHVzIGVycic7YXJ0U3RhdHVzLnRleHRDb250ZW50PSdUaGUgM0QgbW9kZWwgY291bGQgbm90IGJlIGxvYWRlZC4gUmVmcmVzaCB0aGUgcGFnZS4nfSk7CiAgPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgo=\u003c\/script\u003e\n\u003c\/div\u003e\n  \u003c\/section\u003e\n  \u003csection class=\"artetribe-dtf-preview-embed__closet\" aria-labelledby=\"artetribe-dtf-closet-title\"\u003e\n    \u003cdiv class=\"artetribe-dtf-preview-embed__closet-copy\"\u003e\n\u003ch2 id=\"artetribe-dtf-closet-title\"\u003eCustomize your closet\u003c\/h2\u003e\n\u003cp\u003eTurn your artwork into custom T-shirts, hoodies, tote bags, hats, and more. Upload a transparent PNG, preview the placement, then attach the artwork and preview to your order. Final transfer size and placement are confirmed before production.\u003c\/p\u003e\n\u003c\/div\u003e\n    \u003cdiv class=\"artetribe-dtf-preview-embed__closet-gallery\"\u003e\n      \u003cfigure class=\"artetribe-dtf-preview-embed__closet-main\"\u003e\u003cimg src=\"\/cdn\/shop\/files\/Custom_your_closet.jpg\" alt=\"Colorful custom transfer applied to the back of a denim jacket\" loading=\"lazy\" decoding=\"async\"\u003e\u003c\/figure\u003e\n      \u003cfigure\u003e\u003cimg src=\"\/cdn\/shop\/files\/Custom_hoodies.jpg\" alt=\"Carrier film being peeled from a colorful transfer on a hoodie\" loading=\"lazy\" decoding=\"async\"\u003e\u003c\/figure\u003e\n      \u003cfigure\u003e\u003cimg src=\"\/cdn\/shop\/files\/Custom_hats.jpg\" alt=\"Three knit hats decorated with custom full-color transfers\" loading=\"lazy\" decoding=\"async\"\u003e\u003c\/figure\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\u003c\/div\u003e\n\u003cstyle\u003e\n  #artetribe-dtf-preview-embed{--at-ink:#18212b;--at-muted:#64717d;--at-line:rgba(20,45,66,.12);--at-blue:#087ab5;--at-blue-hover:#066d9f;--at-pale:#eaf1f7;--at-orange:#ff9151;width:min(1240px,calc(100% - 32px));margin:48px auto 72px;color:var(--at-ink);font-family:inherit}\n  #artetribe-dtf-preview-embed *{box-sizing:border-box}#artetribe-dtf-preview-embed h2,#artetribe-dtf-preview-embed h3,#artetribe-dtf-preview-embed p{margin-top:0}\n  #artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__benefits{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:48px;margin-bottom:44px;padding:30px 48px;border-block:1px solid var(--at-line)}\n  #artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__benefits article{display:grid;grid-template-rows:80px auto auto;justify-items:center;text-align:center}\n  #artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__icon{display:block;width:80px;height:80px;margin-bottom:14px}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__icon svg{display:block;width:100%;height:100%;fill:none;stroke:#98a8b0;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__icon .accent{fill:none;stroke:var(--at-orange);stroke-width:2}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__icon-reference{stroke-linecap:butt;stroke-linejoin:miter}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__icon-reference .accent--round{stroke-linecap:round;stroke-linejoin:round}\n  #artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__benefits h3{margin-bottom:9px;font:inherit;font-size:20px;font-weight:800;line-height:1.2}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__benefits p{max-width:350px;margin-bottom:0;color:var(--at-muted);font-size:14px;line-height:1.55}\n  #artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__tool{margin-bottom:68px}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__heading{max-width:720px;margin-bottom:18px}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__heading h2,#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__closet h2{margin-bottom:7px;font:inherit;font-size:38px;font-weight:900;line-height:1.05;letter-spacing:-.035em;text-transform:uppercase}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__heading p{margin-bottom:0;color:var(--at-muted);font-size:15px;line-height:1.6}\n  #artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__frame{position:relative;min-height:840px;overflow:hidden;border:1px solid var(--at-line);border-radius:16px;background:var(--at-pale);box-shadow:0 22px 54px rgba(58,91,123,.12)}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__iframe{display:block;width:100%;height:840px;border:0;opacity:0;background:var(--at-pale)}#artetribe-dtf-preview-embed.is-loaded .artetribe-dtf-preview-embed__iframe{opacity:1}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__loading{position:absolute;inset:0;display:grid;place-items:center;color:var(--at-muted);font-size:14px}#artetribe-dtf-preview-embed.is-loaded .artetribe-dtf-preview-embed__loading{display:none}\n  #artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__closet-copy{max-width:940px;margin:0 auto 24px;text-align:center}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__closet-copy\u003ep{margin:0;color:var(--at-muted);font-size:15px;line-height:1.6}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__closet-gallery{display:grid;grid-template-columns:2fr 1fr;grid-template-rows:repeat(2,minmax(0,1fr));gap:16px;min-height:0}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__closet-gallery figure{min-height:0;margin:0;overflow:hidden;border-radius:12px;background:var(--at-pale)}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__closet-gallery img{display:block;width:100%;height:100%;object-fit:cover}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__closet-main{grid-row:1\/3;aspect-ratio:1.5\/1}\n  #artetribe-dtf-preview-embed.is-viewport-breakout{width:100vw;max-width:none;margin-left:calc(50% - 50vw);padding-inline:14px}\n  @media(max-width:900px){#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__benefits{gap:24px;padding-inline:22px}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__benefits h3{font-size:18px}}\n  @media(max-width:760px){#artetribe-dtf-preview-embed{width:100%;margin:30px auto 52px}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__benefits{grid-template-columns:1fr;gap:30px;margin-inline:14px;margin-bottom:34px;padding:26px 8px}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__heading{padding-inline:14px}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__heading h2,#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__closet h2{font-size:31px}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__frame{min-height:1420px;border-radius:0;border-inline:0;box-shadow:none}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__iframe{height:1420px}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__closet{padding-inline:14px}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__closet-copy{margin-bottom:18px;text-align:left}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__closet-gallery{display:grid;grid-template-columns:1fr;grid-template-rows:auto;gap:12px}#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__closet-gallery figure,#artetribe-dtf-preview-embed .artetribe-dtf-preview-embed__closet-main{grid-row:auto;aspect-ratio:3\/2;border-radius:10px}}\n\u003c\/style\u003e\n\u003cscript\u003e\n(()=\u003e{\n  const root=document.getElementById('artetribe-dtf-preview-embed');if(!root||root.dataset.previewReady==='true')return;\n  const path=location.pathname.replace(\/\\\/+$\/,'').toLowerCase();if(!path.includes('\/products\/')||!path.includes('dtf')||path.includes('uv-dtf')){root.remove();return}root.dataset.previewReady='true';\n  const productInfo=root.closest('product-info,.product__info,.product__info-container,.product__info-wrapper,.product-info,.product-info__wrapper,[data-product-info],[id*=\"ProductInfo\"]'),owningSection=root.closest('.shopify-section,[id^=\"shopify-section-\"]');if((productInfo||root.getBoundingClientRect().width\u003c760)\u0026\u0026owningSection\u0026\u0026owningSection.parentElement)owningSection.insertAdjacentElement('afterend',root);if(root.getBoundingClientRect().width\u003cMath.min(760,innerWidth*.72))root.classList.add('is-viewport-breakout');\n  const frame=root.querySelector('[data-preview-frame]'),source=root.querySelector('[data-preview-source]'),loading=root.querySelector('[data-preview-loading]');\n  const findProductForm=()=\u003eArray.from(document.querySelectorAll('form[action*=\"\/cart\/add\"]')).filter(form=\u003e!form.classList.contains('shopify-payment-terms')).map(form=\u003e({form,score:(owningSection\u0026\u0026owningSection.contains(form)?100:0)+(form.classList.contains('shopify-product-form')?30:0)+(form.querySelector('[name=\"quantity\"]')?20:0)+(form.querySelector('[name=\"add\"],[type=\"submit\"]')?10:0)})).sort((a,b)=\u003eb.score-a.score)[0]?.form||null;\n  const clearFields=()=\u003edocument.querySelectorAll('[data-artetribe-dtf-property]').forEach(field=\u003efield.remove());\n  const textField=(form,name,value)=\u003e{const input=document.createElement('input');input.type='hidden';input.name=`properties[${name}]`;input.value=String(value??'');input.dataset.artetribeDtfProperty='true';form.appendChild(input)};\n  const fileField=(form,name,file)=\u003e{if(!file)return;const input=document.createElement('input'),transfer=new DataTransfer();input.type='file';input.name=`properties[${name}]`;input.hidden=true;input.dataset.artetribeDtfProperty='true';transfer.items.add(file);input.files=transfer.files;form.appendChild(input)};\n  const reply=(success,diagnostic='')=\u003eframe.contentWindow?.postMessage({type:'artetribe:order-attachment-result',success,diagnostic},location.origin);\n  addEventListener('message',event=\u003e{if(event.origin!==location.origin||event.source!==frame.contentWindow||!event.data)return;if(event.data.type==='artetribe:production-config-dirty'){clearFields();return}if(event.data.type!=='artetribe:attach-production-config')return;const form=findProductForm(),{config,artworkFile,previewFile}=event.data;if(!form||!config||!artworkFile||!previewFile){clearFields();reply(false,'Product form or required files were not found.');return}try{clearFields();form.enctype='multipart\/form-data';const p=config.production||{};textField(form,'DTF Preview Configuration',config.configurationId);textField(form,'Preview Garment',p.previewGarment?.label);textField(form,'Print Side',p.printSide);textField(form,'Artwork Scale',`${p.artworkScalePercent}%`);textField(form,'Artwork Position',`${p.horizontalOffset}, ${p.verticalOffset}`);textField(form,'Garment Color',p.garmentColor);textField(form,'Design Source',p.designSource);fileField(form,'Artwork',artworkFile);fileField(form,'DTF 3D Preview',previewFile);reply(true)}catch(error){clearFields();reply(false,error instanceof Error?error.message:String(error));console.error('ArteTribe DTF files could not be attached.',error)}});\n  try{const encoded=source.textContent.replace(\/\\s+\/g,''),bytes=Uint8Array.from(atob(encoded),character=\u003echaracter.charCodeAt(0)),doc=new TextDecoder().decode(bytes);frame.addEventListener('load',()=\u003eroot.classList.add('is-loaded'),{once:true});frame.srcdoc=doc;source.remove()}catch(error){if(loading)loading.textContent='The preview could not be loaded. Refresh the page.';console.error('ArteTribe DTF preview failed to initialize.',error)}\n})();\n\u003c\/script\u003e\n","brand":"ArteTribe","offers":[{"title":"Deposit","offer_id":49036981174372,"sku":null,"price":30.0,"currency_code":"USD","in_stock":true},{"title":"Remaining balance","offer_id":49036981207140,"sku":null,"price":1.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0572\/0627\/6196\/files\/Customhats.png?v=1787204846","url":"https:\/\/artetribe.co\/ko\/products\/custom-dtf-transfer-stickers-tote-bag-hats-t-shirt-hoodies","provider":"ArteTribe","version":"1.0","type":"link"}