| // Copyright (c) 2026, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| // *********************************************************************************** |
| // GENERATED FILE. DO NOT EDIT! See GenerateBlastRadiusHtmlReportTemplate.java. |
| // *********************************************************************************** |
| |
| package com.android.tools.r8.blastradius; |
| |
| import java.nio.charset.StandardCharsets; |
| import java.util.Base64; |
| |
| public class BlastRadiusHtmlReportTemplate { |
| public static String getHtmlTemplate() { |
| return decodeBase64( |
| "PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8dGl0bGU+UjggQmxhc3QgUmFkaXVzIFZpc3VhbGl6ZXI8L3RpdGxlPgogICAgPHN0eWxlPmJvZHkgewogICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCBzYW5zLXNlcmlmOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgaGVpZ2h0OiAxMDB2aDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7Cn0KCmhlYWRlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2Y1MWI1OwogICAgY29sb3I6IHdoaXRlOwogICAgcGFkZGluZzogMCAycmVtOwogICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwwLDAsMC4xKTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgaGVpZ2h0OiA2NHB4Owp9CgojdGFicyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgaGVpZ2h0OiAxMDAlOwp9CgoudGFiLWJ1dHRvbiB7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgYm9yZGVyOiBub25lOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTsKICAgIHBhZGRpbmc6IDAgMS41cmVtOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxcmVtOwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzOwogICAgaGVpZ2h0OiAxMDAlOwogICAgYm9yZGVyLWJvdHRvbTogNHB4IHNvbGlkIHRyYW5zcGFyZW50Owp9CgoudGFiLWJ1dHRvbjpob3ZlciB7CiAgICBjb2xvcjogd2hpdGU7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7Cn0KCi50YWItYnV0dG9uLmFjdGl2ZSB7CiAgICBjb2xvcjogd2hpdGU7CiAgICBib3JkZXItYm90dG9tOiA0cHggc29saWQgd2hpdGU7Cn0KCiNjb250YWluZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXg6IDE7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9Cgojc2lkZWJhciB7CiAgICB3aWR0aDogMzUwcHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkZGQ7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoKI21haW4tY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgcGFkZGluZzogMnJlbTsKICAgIG92ZXJmbG93LXk6IGF1dG87Cn0KCiNkcm9wLXpvbmUgewogICAgYm9yZGVyOiAycHggZGFzaGVkICMzZjUxYjU7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBwYWRkaW5nOiAycmVtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6ICMzZjUxYjU7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBtYXJnaW46IDFyZW07CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3M7Cn0KCiNkcm9wLXpvbmUuaG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2U4ZWFmNjsKfQoKLnNlYXJjaC1ib3ggewogICAgcGFkZGluZzogMXJlbTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlOwp9Cgouc2VhcmNoLWJveCBpbnB1dCB7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDAuNXJlbTsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgojcnVsZS1saXN0IHsKICAgIGZsZXg6IDE7CiAgICBvdmVyZmxvdy15OiBhdXRvOwp9CgoucnVsZS1pdGVtIHsKICAgIHBhZGRpbmc6IDFyZW07CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4yczsKfQoKLnJ1bGUtaXRlbTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOwp9CgoucnVsZS1pdGVtLmFjdGl2ZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZThlYWY2OwogICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjM2Y1MWI1Owp9CgoucnVsZS1uYW1lIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXJnaW4tYm90dG9tOiAwLjI1cmVtOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKfQoKLnJ1bGUtc3RhdHMgewogICAgZm9udC1zaXplOiAwLjhyZW07CiAgICBjb2xvcjogIzY2NjsKfQoKLmNhcmQgewogICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICBwYWRkaW5nOiAxLjVyZW07CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLDAsMCwwLjEpOwogICAgbWFyZ2luLWJvdHRvbTogMnJlbTsKfQoKLmNhcmQgaDIgewogICAgbWFyZ2luLXRvcDogMDsKICAgIGNvbG9yOiAjMzMzOwp9Cgoua2VlcC1ydWxlLXNvdXJjZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4OwogICAgcGFkZGluZzogMXJlbTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkICMzZjUxYjU7CiAgICBtYXJnaW4tYm90dG9tOiAxcmVtOwp9Cgouc2VjdGlvbi10aXRsZSB7CiAgICBmb250LXNpemU6IDEuMXJlbTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luOiAxLjVyZW0gMCAxcmVtIDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgouaXRlbS1saXN0IHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luOiAwOwp9CgouaXRlbS1saXN0IGxpIHsKICAgIHBhZGRpbmc6IDAuNXJlbTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlOwogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogMC45cmVtOwp9CgouaXRlbS1saXN0IGxpOmxhc3QtY2hpbGQgewogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKfQoKLmJhZGdlIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICBwYWRkaW5nOiAycHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGZvbnQtc2l6ZTogMC43NXJlbTsKICAgIG1hcmdpbi1sZWZ0OiA1cHg7Cn0KCi5iYWRnZS1yZWQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZlYmVlOyBjb2xvcjogI2M2MjgyODsgfQouYmFkZ2UtYmx1ZSB7IGJhY2tncm91bmQtY29sb3I6ICNlM2YyZmQ7IGNvbG9yOiAjMTU2NWMwOyB9Ci5iYWRnZS1ncmVlbiB7IGJhY2tncm91bmQtY29sb3I6ICNlOGY1ZTk7IGNvbG9yOiAjMmU3ZDMyOyB9CgouYmFubmVyIHsKICAgIHBhZGRpbmc6IDFyZW07CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBtYXJnaW4tYm90dG9tOiAxLjVyZW07CiAgICBmb250LXNpemU6IDAuOXJlbTsKfQoKLmJhbm5lci13YXJuaW5nIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmYzZTA7CiAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkICNmZjk4MDA7CiAgICBjb2xvcjogI2U2NTEwMDsKfQoKLnN1YnN1bWVkLWJ5LWl0ZW0gewogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpOwogICAgcGFkZGluZzogMC41cmVtOwogICAgbWFyZ2luLXRvcDogMC4yNXJlbTsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7Cn0KCi5zdWJzdW1lZC1ieS1pdGVtOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsKfQoKLnNob3ctbW9yZS1idG4gewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDAuNzVyZW07CiAgICBtYXJnaW4tdG9wOiAxcmVtOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjb2xvcjogIzNmNTFiNTsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7Cn0KCi5zaG93LW1vcmUtYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7Cn0KCi50YWItYnV0dG9uIC5iYWRnZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7CiAgICBjb2xvcjogd2hpdGU7CiAgICBtYXJnaW4tbGVmdDogOHB4OwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRhYi1idXR0b24uYWN0aXZlIC5iYWRnZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgIGNvbG9yOiAjM2Y1MWI1Owp9Cgojc3RhdHMtb3ZlcnZpZXcgewogICAgbWFyZ2luLWJvdHRvbTogMnJlbTsKfQoKLnN0YXRzLXRhYmxlIHsKICAgIHdpZHRoOiAxMDAlOwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKfQoKLnN0YXRzLXRhYmxlIHRoLCAuc3RhdHMtdGFibGUgdGQgewogICAgcGFkZGluZzogMS4yNXJlbSAxLjVyZW07CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTsKfQoKLnN0YXRzLXRhYmxlIHRoIHsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBmb250LXNpemU6IDAuNzVyZW07CiAgICBmb250LXdlaWdodDogNTAwOwogICAgY29sb3I6ICM2NjY7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7Cn0KCi5zdGF0cy10YWJsZSB0cjpsYXN0LWNoaWxkIHRkIHsKICAgIGJvcmRlci1ib3R0b206IG5vbmU7Cn0KCi5zdGF0cy10YWJsZSB0ZCB7CiAgICBmb250LXNpemU6IDEuMXJlbTsKICAgIGNvbG9yOiAjM2Y1MWI1OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLnN0YXRzLXRhYmxlIHRkOmZpcnN0LWNoaWxkIHsKICAgIGNvbG9yOiAjMzMzOwogICAgZm9udC13ZWlnaHQ6IDQwMDsKfQoKLnN0YXQtY2FyZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgIHBhZGRpbmc6IDFyZW07CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLDAsMCwwLjEpOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Cgouc3RhdC12YWx1ZSB7CiAgICBmb250LXNpemU6IDEuNXJlbTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgY29sb3I6ICMzZjUxYjU7Cn0KCi5zdGF0LWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMC44cmVtOwogICAgY29sb3I6ICM2NjY7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgouaGlkZGVuIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLnNwaW5uZXIgewogICAgYm9yZGVyOiA0cHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpOwogICAgd2lkdGg6IDQ4cHg7CiAgICBoZWlnaHQ6IDQ4cHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBib3JkZXItbGVmdC1jb2xvcjogIzNmNTFiNTsKICAgIGFuaW1hdGlvbjogc3BpbiAxcyBsaW5lYXIgaW5maW5pdGU7CiAgICBtYXJnaW46IDJyZW0gYXV0bzsKfQoKQGtleWZyYW1lcyBzcGluIHsKICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH0KICAgIDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9Cn0KCiNsb2FkaW5nLXNjcmVlbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGhlaWdodDogMTAwJTsKICAgIGNvbG9yOiAjNjY2Owp9Cgouc3ViLXRhYnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkOwogICAgbWFyZ2luLWJvdHRvbTogMXJlbTsKfQoKLnN1Yi10YWItYnV0dG9uIHsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBwYWRkaW5nOiAwLjc1cmVtIDEuNXJlbTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMC45cmVtOwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIGNvbG9yOiAjNjY2OwogICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHRyYW5zcGFyZW50Owp9Cgouc3ViLXRhYi1idXR0b246aG92ZXIgewogICAgY29sb3I6ICMzZjUxYjU7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOwp9Cgouc3ViLXRhYi1idXR0b24uYWN0aXZlIHsKICAgIGNvbG9yOiAjM2Y1MWI1OwogICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICMzZjUxYjU7Cn0KPC9zdHlsZT4KICAgIDxsaW5rIGhyZWY9Imh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9Um9ib3RvOndnaHRAMzAwOzQwMDs1MDA7NzAwJmRpc3BsYXk9c3dhcCIgcmVsPSJzdHlsZXNoZWV0Ij4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3Byb3RvYnVmanNANy4yLjQvZGlzdC9wcm90b2J1Zi5taW4uanMiPjwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5PgogICAgPGhlYWRlcj4KICAgICAgICA8aDEgb25jbGljaz0ic3dpdGNoVmlldygncnVsZXMnKSIgc3R5bGU9ImN1cnNvcjogcG9pbnRlcjsiPlI4IEJsYXN0IFJhZGl1cyBWaXN1YWxpemVyPC9oMT4KICAgICAgICA8ZGl2IGlkPSJ0YWJzIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLWJ1dHRvbiBhY3RpdmUiIG9uY2xpY2s9InN3aXRjaFZpZXcoJ3J1bGVzJykiPktlZXAgUnVsZXMgPHNwYW4gaWQ9InJ1bGVzLWNvdW50IiBjbGFzcz0iYmFkZ2UgaGlkZGVuIj4wPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJ0YWItYnV0dG9uIiBvbmNsaWNrPSJzd2l0Y2hWaWV3KCdmaWxlcycpIj5LZWVwIFJ1bGUgRmlsZXMgPHNwYW4gaWQ9ImZpbGVzLWNvdW50IiBjbGFzcz0iYmFkZ2UgaGlkZGVuIj4wPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJ0YWItYnV0dG9uIiBvbmNsaWNrPSJzd2l0Y2hWaWV3KCd1bnVzZWQnKSI+VW51c2VkIFJ1bGVzIDxzcGFuIGlkPSJ1bnVzZWQtY291bnQiIGNsYXNzPSJiYWRnZSBoaWRkZW4iPjA8L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InRhYi1idXR0b24iIG9uY2xpY2s9InN3aXRjaFZpZXcoJ3JlZHVuZGFudCcpIj5SZWR1bmRhbnQgUnVsZXMgPHNwYW4gaWQ9InJlZHVuZGFudC1jb3VudCIgY2xhc3M9ImJhZGdlIGhpZGRlbiI+MDwvc3Bhbj48L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJmaWxlLWluZm8iPjwvZGl2PgogICAgPC9oZWFkZXI+CgogICAgPGRpdiBpZD0iY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgICAgICAgPGRpdiBpZD0iZHJvcC16b25lIiBjbGFzcz0iaGlkZGVuIj4KICAgICAgICAgICAgICAgIDxwPkRyb3AgYSAucGIgZmlsZSBoZXJlPGJyPm9yIGNsaWNrIHRvIHVwbG9hZDwvcD4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBpZD0iZmlsZS1pbnB1dCIgY2xhc3M9ImhpZGRlbiIgYWNjZXB0PSIucGIiPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlYXJjaC1ib3ggaGlkZGVuIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ic2VhcmNoLWlucHV0IiBwbGFjZWhvbGRlcj0iU2VhcmNoIGtlZXAgcnVsZXMuLi4iPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgaWQ9InJ1bGUtbGlzdCI+CiAgICAgICAgICAgICAgICA8IS0tIFJ1bGVzIHdpbGwgYmUgcG9wdWxhdGVkIGhlcmUgLS0+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGlkPSJtYWluLWNvbnRlbnQiPgogICAgICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nLXNjcmVlbiI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzcGlubmVyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDxwPkxvYWRpbmcgYmxhc3QgcmFkaXVzLi4uPC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPHRlbXBsYXRlIGlkPSJzdGF0cy1vdmVydmlldy10ZW1wbGF0ZSI+CiAgICAgICAgICAgIDxkaXYgaWQ9InN0YXRzLW92ZXJ2aWV3Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtY2FyZCIgc3R5bGU9Im1hcmdpbi1ib3R0b206IDFyZW07IGRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtbGFiZWwiIHN0eWxlPSJmb250LXNpemU6IDFyZW07Ij5LZWVwIFJ1bGVzPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC12YWx1ZSIgaWQ9InN0YXQtcnVsZXMiIHN0eWxlPSJmb250LXNpemU6IDJyZW07Ij4wPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQiIHN0eWxlPSJwYWRkaW5nOiAwOyBvdmVyZmxvdzogaGlkZGVuOyI+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJzdGF0cy10YWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+SXRlbSBUeXBlPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyI+Tm8gb2JmdXNjYXRpb248L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij5ObyBvcHRpbWl6YXRpb248L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij5ObyBzaHJpbmtpbmc8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij5SZWFjaGFibGU8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij5Ub3RhbDwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPkNsYXNzZXM8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBpZD0ic3RhdC1uby1vYmZ1c2NhdGlvbi1jbGFzc2VzIiBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij4wPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgaWQ9InN0YXQtbm8tb3B0aW1pemF0aW9uLWNsYXNzZXMiIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodDsiPjA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBpZD0ic3RhdC1uby1zaHJpbmtpbmctY2xhc3NlcyIgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyI+MDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGlkPSJzdGF0LXJlYWNoYWJsZS1jbGFzc2VzIiBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij4wPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgaWQ9InN0YXQtdG90YWwtY2xhc3NlcyIgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyI+MDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5NZXRob2RzPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgaWQ9InN0YXQtbm8tb2JmdXNjYXRpb24tbWV0aG9kcyIgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyI+MDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGlkPSJzdGF0LW5vLW9wdGltaXphdGlvbi1tZXRob2RzIiBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij4wPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgaWQ9InN0YXQtbm8tc2hyaW5raW5nLW1ldGhvZHMiIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodDsiPjA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBpZD0ic3RhdC1yZWFjaGFibGUtbWV0aG9kcyIgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyI+MDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGlkPSJzdGF0LXRvdGFsLW1ldGhvZHMiIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodDsiPjA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+RmllbGRzPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgaWQ9InN0YXQtbm8tb2JmdXNjYXRpb24tZmllbGRzIiBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij4wPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgaWQ9InN0YXQtbm8tb3B0aW1pemF0aW9uLWZpZWxkcyIgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyI+MDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGlkPSJzdGF0LW5vLXNocmlua2luZy1maWVsZHMiIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodDsiPjA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBpZD0ic3RhdC1yZWFjaGFibGUtZmllbGRzIiBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij4wPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgaWQ9InN0YXQtdG90YWwtZmllbGRzIiBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij4wPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8dGVtcGxhdGUgaWQ9IndlbGNvbWUtbWVzc2FnZS10ZW1wbGF0ZSI+CiAgICAgICAgICAgIDxkaXYgaWQ9IndlbGNvbWUtbWVzc2FnZSI+CiAgICAgICAgICAgICAgICA8aDI+V2VsY29tZSB0byB0aGUgQmxhc3QgUmFkaXVzIFZpc3VhbGl6ZXI8L2gyPgogICAgICAgICAgICAgICAgPHA+VXBsb2FkIGEgPGNvZGU+LnBiPC9jb2RlPiBmaWxlIGdlbmVyYXRlZCBieSBSOCB3aXRoIHRoZSA8Y29kZT4tcHJpbnRibGFzdHJhZGl1czwvY29kZT4gZmxhZyB0byBzZWUgaG93IHlvdXIga2VlcCBydWxlcyBhZmZlY3QgeW91ciBidWlsZC48L3A+CiAgICAgICAgICAgICAgICA8cD5UaGlzIHRvb2wgaGVscHMgeW91IGlkZW50aWZ5OjwvcD4KICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICA8bGk+S2VlcCBydWxlcyB3aXRoIHRoZSBsYXJnZXN0IGltcGFjdCBvbiB5b3VyIGFwcCBzaXplLjwvbGk+CiAgICAgICAgICAgICAgICAgICAgPGxpPkRlcGVuZGVuY2llcyB0aGF0IGludHJvZHVjZSBicm9hZCBrZWVwIHJ1bGVzLjwvbGk+CiAgICAgICAgICAgICAgICAgICAgPGxpPlJlZHVuZGFudCBrZWVwIHJ1bGVzIHRoYXQgYXJlIHN1YnN1bWVkIGJ5IG90aGVycy48L2xpPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzY3JpcHQgaWQ9ImJsYXN0cmFkaXVzLXByb3RvIiB0eXBlPSJ0ZXh0L3BsYWluIj4vLyBDb3B5cmlnaHQgKGMpIDIwMjYsIHRoZSBSOCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgpzeW50YXggPSAicHJvdG8zIjsKCnBhY2thZ2UgY29tLmFuZHJvaWQudG9vbHMucjguYmxhc3RyYWRpdXMucHJvdG87CgovLyBEb24ndCBwdXQgYWxsIG1lc3NhZ2VzIHVuZGVyIHRoZSBvdXRlciBjbGFzcy4Kb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOwoKLy8gQ2FtZWwtY2FzZSB0aGUgb3V0ZXIgY2xhc3MgbmFtZSAoZGVmYXVsdCBpcyBgQmxhc3RyYWRpdXNgKS4Kb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIktlZXBSdWxlQmxhc3RSYWRpdXNQcm90b3MiOwoKLy8gSmF2YSBwYWNrYWdlIGNvbnNpc3RlbnQgd2l0aCBSOCBjb252ZW50aW9uLgpvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5hbmRyb2lkLnRvb2xzLnI4LmJsYXN0cmFkaXVzLnByb3RvIjsKCi8vIEluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGtlZXAgcnVsZSBhbmQgaXRzIGltbWVkaWF0ZSBibGFzdCByYWRpdXMuCm1lc3NhZ2UgS2VlcFJ1bGVCbGFzdFJhZGl1cyB7CiAgaW50MzIgaWQgPSAxOwogIC8vIFRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGtlZXAgcnVsZS4KICBzdHJpbmcgc291cmNlID0gMjsKICAvLyBXaGF0IHRoaXMga2VlcCBydWxlIHByb2hpYml0cyAoZS5nLiwgb3B0aW1pemF0aW9uKS4KICAvLyBJZCBpbnRvIEtlZXBDb25zdHJhaW50cy4KICBpbnQzMiBjb25zdHJhaW50c19pZCA9IDM7CiAgLy8gV2hlcmUgdGhpcyBydWxlIGNvbWVzIGZyb20uCiAgVGV4dEZpbGVPcmlnaW4gb3JpZ2luID0gNDsKICAvLyBCbGFzdCByYWRpdXMgaW5mb3JtYXRpb24uCiAgQmxhc3RSYWRpdXMgYmxhc3RfcmFkaXVzID0gNTsKICAvLyBLZWVwIHJ1bGUgdGFncy4KICByZXBlYXRlZCBLZWVwUnVsZVRhZyB0YWdzID0gNjsKfQoKZW51bSBLZWVwUnVsZVRhZyB7CiAgUEFDS0FHRV9XSURFID0gMDsKfQoKbWVzc2FnZSBCbGFzdFJhZGl1cyB7CiAgLy8gV2hpY2ggcnVsZXMgc3Vic3VtZSB0aGlzIHJ1bGUuIE5vdGU6IFRoaXMgaW5mb3JtYXRpb24gY291bGQgaW4gcHJpbmNpcGxlCiAgLy8gYmUgY29tcHV0ZWQgb2ZmbGluZSB1c2luZyB0aGUga2VwdF9ieSBpbmZvIG9mIEtlcHQqSW5mby4KICAvLyBJZHMgaW50byBLZWVwQW5ub3RhdGlvbkJsYXN0UmFkaXVzIGFuZCBLZWVwUnVsZUJsYXN0UmFkaXVzLgogIHJlcGVhdGVkIGludDMyIHN1YnN1bWVkX2J5ID0gMTsKICAvLyBUaGUgaW1tZWRpYXRlIGJsYXN0IHJhZGl1cyBvZiB0aGlzIHJ1bGUuCiAgLy8gLSBJZHMgaW50byBLZXB0Q2xhc3NJbmZvLgogIHJlcGVhdGVkIGludDMyIGNsYXNzX2JsYXN0X3JhZGl1cyA9IDI7CiAgLy8gLSBJZHMgaW50byBLZXB0RmllbGRJbmZvLgogIHJlcGVhdGVkIGludDMyIGZpZWxkX2JsYXN0X3JhZGl1cyA9IDM7CiAgLy8gLSBJZHMgaW50byBLZXB0TWV0aG9kSW5mby4KICByZXBlYXRlZCBpbnQzMiBtZXRob2RfYmxhc3RfcmFkaXVzID0gNDsKfQoKLy8gVGhlIGlkcyBvZiBHbG9iYWxLZWVwUnVsZUJsYXN0UmFkaXVzIGFuZCBLZWVwUnVsZUJsYXN0UmFkaXVzIGFyZQovLyBub24tb3ZlcmxhcHBpbmcgYnkgZGVzaWduLCBzbyB0aGF0IGEgc2luZ2xlIGludDMyIGlkIGNhbiBiZSB1c2VkIHRvCi8vIHVuYW1iaWd1b3VzbHkgcmVmZXJlbmNlIGEgR2xvYmFsS2VlcFJ1bGVCbGFzdFJhZGl1cyBvciBLZWVwUnVsZUJsYXN0UmFkaXVzLgptZXNzYWdlIEdsb2JhbEtlZXBSdWxlQmxhc3RSYWRpdXMgewogIGludDMyIGlkID0gMTsKICAvLyBUZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBrZWVwIHJ1bGUuCiAgc3RyaW5nIHNvdXJjZSA9IDI7CiAgLy8gV2hlcmUgdGhpcyBydWxlIGNvbWVzIGZyb20uCiAgVGV4dEZpbGVPcmlnaW4gb3JpZ2luID0gMzsKfQoKLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnN0cmFpbnRzIG9mIGEgc2luZ2xlIGtlZXAgYW5ub3RhdGlvbiBvciBydWxlLAovLyBpLmUuLCB3aGF0IGlzIHByb2hpYml0ZWQgYnkgaXQuCi8vCi8vIFRoaXMgaXMgZW5jb2RlZCBhcyBhIG1lc3NhZ2UgdG8gc3VwcG9ydCBrZWVwIGNvbnN0cmFpbnRzIHRoYXQgY2Fubm90IGJlCi8vIGVuY29kZWQgYXMgYSBiaXQgaW4gdGhlIGZ1dHVyZS4KbWVzc2FnZSBLZWVwQ29uc3RyYWludHMgewogIGludDMyIGlkID0gMTsKICByZXBlYXRlZCBLZWVwQ29uc3RyYWludCBjb25zdHJhaW50cyA9IDI7Cn0KCmVudW0gS2VlcENvbnN0cmFpbnQgewogIERPTlRfT0JGVVNDQVRFID0gMDsKICBET05UX09QVElNSVpFID0gMTsKICBET05UX1NIUklOSyA9IDI7Cn0KCi8vIEluZm9ybWF0aW9uIGFib3V0IGEgY2xhc3MgaW4gdGhlIGFwcC9saWJyYXJ5IGFuZCB3aGljaCBrZWVwIHJ1bGVzIHRoYXQKLy8ga2VlcCBpdC4KbWVzc2FnZSBLZXB0Q2xhc3NJbmZvIHsKICBpbnQzMiBpZCA9IDE7CiAgLy8gSWQgaW50byBUeXBlUmVmZXJlbmNlLgogIGludDMyIGNsYXNzX3JlZmVyZW5jZV9pZCA9IDI7CiAgLy8gSWQgaW50byBGaWxlT3JpZ2luIG9yIENsYXNzRmlsZUluSmFyT3JpZ2luLgogIGludDMyIGZpbGVfb3JpZ2luX2lkID0gMzsKICAvLyBJZHMgaW50byBLZWVwUnVsZUJsYXN0UmFkaXVzLCB0ZWxsaW5nIHdoaWNoIHJ1bGVzIGtlZXAgdGhpcyBjbGFzcy4KICAvLyBBbGxvd3MgcmVhc29uaW5nIGFib3V0IHByb3BlcnRpZXMgc3VjaCBhczoKICAvLyAtIFdoaWNoIGtlZXAgcnVsZXMgYXJlIGZ1bGx5IHN1YnN1bWVkIGJ5IG90aGVyIGtlZXAgcnVsZXM/CiAgLy8gLSBXaGljaCBrZWVwIHJ1bGVzIGtlZXAgdGhlIG1vc3QgY2xhc3Nlcy9maWVsZHMvbWV0aG9kcwogIC8vICAgbm90IGtlcHQgYnkgcnVsZXM/CiAgcmVwZWF0ZWQgaW50MzIga2VwdF9ieSA9IDQ7Cn0KCm1lc3NhZ2UgS2VwdEZpZWxkSW5mbyB7CiAgaW50MzIgaWQgPSAxOwogIC8vIElkIGludG8gRmllbGRSZWZlcmVuY2UuCiAgaW50MzIgZmllbGRfcmVmZXJlbmNlX2lkID0gMjsKICAvLyBJZCBpbnRvIEZpbGVPcmlnaW4gb3IgQ2xhc3NGaWxlSW5KYXJPcmlnaW4uCiAgaW50MzIgZmlsZV9vcmlnaW5faWQgPSAzOwogIC8vIElkcyBpbnRvIEtlZXBSdWxlQmxhc3RSYWRpdXMsIHRlbGxpbmcgd2hpY2ggcnVsZXMga2VlcCB0aGlzIGZpZWxkLgogIHJlcGVhdGVkIGludDMyIGtlcHRfYnkgPSA0Owp9CgptZXNzYWdlIEtlcHRNZXRob2RJbmZvIHsKICBpbnQzMiBpZCA9IDE7CiAgLy8gSWQgaW50byBNZXRob2RSZWZlcmVuY2UuCiAgaW50MzIgbWV0aG9kX3JlZmVyZW5jZV9pZCA9IDI7CiAgLy8gSWQgaW50byBGaWxlT3JpZ2luIG9yIENsYXNzRmlsZUluSmFyT3JpZ2luLgogIGludDMyIGZpbGVfb3JpZ2luX2lkID0gMzsKICAvLyBJZHMgaW50byBLZWVwUnVsZUJsYXN0UmFkaXVzLCB0ZWxsaW5nIHdoaWNoIHJ1bGVzIGtlZXAgdGhpcyBtZXRob2QuCiAgcmVwZWF0ZWQgaW50MzIga2VwdF9ieSA9IDQ7Cn0KCi8vIFJlZmVyZW5jZXM6CgptZXNzYWdlIEZpZWxkUmVmZXJlbmNlIHsKICBpbnQzMiBpZCA9IDE7CiAgLy8gVGhlIGNsYXNzIG9uIHdoaWNoIHRoZSBmaWVsZCBpcyBkZWNsYXJlZC4KICAvLyBJZCBpbnRvIFR5cGVSZWZlcmVuY2UuCiAgaW50MzIgY2xhc3NfcmVmZXJlbmNlX2lkID0gMjsKICAvLyBUaGUgdHlwZSBvZiB0aGUgZmllbGQuCiAgLy8gSWQgaW50byB0eXBlIHJlZmVyZW5jZS4KICBpbnQzMiB0eXBlX3JlZmVyZW5jZV9pZCA9IDM7CiAgLy8gVGhlIG5hbWUgb2YgdGhlIGZpZWxkLgogIHN0cmluZyBuYW1lID0gNDsKfQoKbWVzc2FnZSBNZXRob2RSZWZlcmVuY2UgewogIGludDMyIGlkID0gMTsKICAvLyBUaGUgY2xhc3Mgb24gd2hpY2ggdGhlIG1ldGhvZCBpcyBkZWNsYXJlZC4KICAvLyBJZCBpbnRvIFR5cGVSZWZlcmVuY2UuCiAgaW50MzIgY2xhc3NfcmVmZXJlbmNlX2lkID0gMjsKICAvLyBUaGUgcHJvdG8gKHJldHVybiB0eXBlLCBwYXJhbWV0ZXIgdHlwZXMpIG9mIHRoZSBtZXRob2QuCiAgLy8gSWQgaW50byBQcm90b1JlZmVyZW5jZS4KICBpbnQzMiBwcm90b19yZWZlcmVuY2VfaWQgPSAzOwogIC8vIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QuCiAgc3RyaW5nIG5hbWUgPSA0Owp9CgptZXNzYWdlIFByb3RvUmVmZXJlbmNlIHsKICBpbnQzMiBpZCA9IDE7CiAgLy8gSWQgaW50byBUeXBlUmVmZXJlbmNlTGlzdC4KICBpbnQzMiBwYXJhbWV0ZXJzX2lkID0gMjsKICAvLyBJZCBpbnRvIFR5cGVSZWZlcmVuY2UuCiAgaW50MzIgcmV0dXJuX3R5cGVfaWQgPSAzOwp9CgptZXNzYWdlIFR5cGVSZWZlcmVuY2UgewogIGludDMyIGlkID0gMTsKICAvLyBUaGUgZGVzY3JpcHRvciwgZS5nLiwKICAvLyAtIFoKICAvLyAtIExqYXZhL2xhbmcvT2JqZWN0OwogIC8vIC0gW1tMamF2YS9sYW5nL09iamVjdDsKICBzdHJpbmcgamF2YV9kZXNjcmlwdG9yID0gMjsKfQoKbWVzc2FnZSBUeXBlUmVmZXJlbmNlTGlzdCB7CiAgaW50MzIgaWQgPSAxOwogIHJlcGVhdGVkIGludDMyIHR5cGVfcmVmZXJlbmNlX2lkcyA9IDI7Cn0KCi8vIE9yaWdpbnM6CgptZXNzYWdlIEZpbGVPcmlnaW4gewogIGludDMyIGlkID0gMTsKICBzdHJpbmcgZmlsZW5hbWUgPSAyOwogIE1hdmVuQ29vcmRpbmF0ZSBtYXZlbl9jb29yZGluYXRlID0gMzsKfQoKLy8gVGhlIGlkcyBvZiBDbGFzc0ZpbGVJbkphck9yaWdpbiBhbmQgRmlsZU9yaWdpbiBhcmUgbm9uLW92ZXJsYXBwaW5nCi8vIGJ5IGRlc2lnbiwgc28gdGhhdCBhIHNpbmdsZSBpbnQzMiBpZCBjYW4gYmUgdXNlZCB0bwovLyB1bmFtYmlndW91c2x5IHJlZmVyZW5jZSBhIENsYXNzRmlsZUluSmFyT3JpZ2luIG9yIEZpbGVPcmlnaW4uCm1lc3NhZ2UgQ2xhc3NGaWxlSW5KYXJPcmlnaW4gewogIGludDMyIGlkID0gMTsKICBpbnQzMiBmaWxlX29yaWdpbl9pZCA9IDI7CiAgc3RyaW5nIGVudHJ5ID0gMzsKfQoKLy8gSW50ZW50aW9uYWxseSBkb2Vzbid0IGRlY2xhcmUgYW4gaWQgc2luY2UgZWFjaCBrZWVwIHJ1bGUgaGFzIGl0cyBvd24KLy8gVGV4dEZpbGVPcmlnaW4sIGkuZS4sIHRoZXJlIGlzIG5vIHNoYXJpbmcgb2YgVGV4dEZpbGVPcmlnaW4uCm1lc3NhZ2UgVGV4dEZpbGVPcmlnaW4gewogIC8vIElkIGludG8gRmlsZU9yaWdpbgogIGludDMyIGZpbGVfb3JpZ2luX2lkID0gMTsKICBpbnQzMiBsaW5lX251bWJlciA9IDI7CiAgaW50MzIgY29sdW1uX251bWJlciA9IDM7Cn0KCm1lc3NhZ2UgTWF2ZW5Db29yZGluYXRlIHsKICBpbnQzMiBpZCA9IDE7CiAgc3RyaW5nIGdyb3VwX2lkID0gMjsKICBzdHJpbmcgYXJ0aWZhY3RfaWQgPSAzOwogIHN0cmluZyB2ZXJzaW9uID0gNDsKfQoKbWVzc2FnZSBCdWlsZEluZm8gewogIGludDMyIGNsYXNzX2NvdW50ID0gMTsKICBpbnQzMiBmaWVsZF9jb3VudCA9IDI7CiAgaW50MzIgbWV0aG9kX2NvdW50ID0gMzsKICBpbnQzMiBsaXZlX2NsYXNzX2NvdW50ID0gNDsKICBpbnQzMiBsaXZlX2ZpZWxkX2NvdW50ID0gNTsKICBpbnQzMiBsaXZlX21ldGhvZF9jb3VudCA9IDY7Cn0KCi8vIENvbnRhaW5lci4KCm1lc3NhZ2UgQmxhc3RSYWRpdXNDb250YWluZXIgewogIC8vIE9yaWdpbnMuCiAgcmVwZWF0ZWQgRmlsZU9yaWdpbiBmaWxlX29yaWdpbl90YWJsZSA9IDE7CiAgcmVwZWF0ZWQgQ2xhc3NGaWxlSW5KYXJPcmlnaW4gY2xhc3NfZmlsZV9pbl9qYXJfb3JpZ2luX3RhYmxlID0gMjsKICByZXBlYXRlZCBNYXZlbkNvb3JkaW5hdGUgbWF2ZW5fY29vcmRpbmF0ZV90YWJsZSA9IDM7CgogIC8vIFJlZmVyZW5jZXMuCiAgcmVwZWF0ZWQgRmllbGRSZWZlcmVuY2UgZmllbGRfcmVmZXJlbmNlX3RhYmxlID0gNDsKICByZXBlYXRlZCBNZXRob2RSZWZlcmVuY2UgbWV0aG9kX3JlZmVyZW5jZV90YWJsZSA9IDU7CiAgcmVwZWF0ZWQgUHJvdG9SZWZlcmVuY2UgcHJvdG9fcmVmZXJlbmNlX3RhYmxlID0gNjsKICByZXBlYXRlZCBUeXBlUmVmZXJlbmNlIHR5cGVfcmVmZXJlbmNlX3RhYmxlID0gNzsKICByZXBlYXRlZCBUeXBlUmVmZXJlbmNlTGlzdCB0eXBlX3JlZmVyZW5jZV9saXN0X3RhYmxlID0gODsKCiAgLy8gS2VwdCBpdGVtcy4KICByZXBlYXRlZCBLZXB0Q2xhc3NJbmZvIGtlcHRfY2xhc3NfaW5mb190YWJsZSA9IDk7CiAgcmVwZWF0ZWQgS2VwdEZpZWxkSW5mbyBrZXB0X2ZpZWxkX2luZm9fdGFibGUgPSAxMDsKICByZXBlYXRlZCBLZXB0TWV0aG9kSW5mbyBrZXB0X21ldGhvZF9pbmZvX3RhYmxlID0gMTE7CgogIC8vIEtlZXAgc3BlY2lmaWNhdGlvbnMuCiAgcmVwZWF0ZWQgS2VlcENvbnN0cmFpbnRzIGtlZXBfY29uc3RyYWludHNfdGFibGUgPSAxMjsKICByZXBlYXRlZCBLZWVwUnVsZUJsYXN0UmFkaXVzIGtlZXBfcnVsZV9ibGFzdF9yYWRpdXNfdGFibGUgPSAxMzsKICByZXBlYXRlZCBHbG9iYWxLZWVwUnVsZUJsYXN0UmFkaXVzIGdsb2JhbF9rZWVwX3J1bGVfYmxhc3RfcmFkaXVzX3RhYmxlID0gMTQ7CgogIC8vIEJ1aWxkIGluZm8uCiAgQnVpbGRJbmZvIGJ1aWxkX2luZm8gPSAxNTsKfQo8L3NjcmlwdD48c2NyaXB0IGlkPSJibGFzdHJhZGl1cy1kYXRhIiB0eXBlPSJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iPjwvc2NyaXB0PjxzY3JpcHQ+Ly8gQ29weXJpZ2h0IChjKSAyMDI2LCB0aGUgUjggcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KbGV0IHByb3RvYnVmUm9vdCA9IG51bGw7CmxldCBjb250YWluZXJEYXRhID0gbnVsbDsKbGV0IGZpbHRlcmVkUnVsZXMgPSBbXTsKbGV0IGZpbHRlcmVkRmlsZXMgPSBbXTsKbGV0IGN1cnJlbnRWaWV3ID0gJ3J1bGVzJzsgLy8gJ3J1bGVzJywgJ2ZpbGVzJywgJ3VudXNlZCcsICdyZWR1bmRhbnQnCmxldCBjdXJyZW50U3ViVmlldyA9ICdjbGFzcyc7IC8vICdjbGFzcycsICdtZXRob2QnLCAnZmllbGQnCmxldCBjdXJyZW50U2VsZWN0ZWRSdWxlID0gbnVsbDsKbGV0IGN1cnJlbnRSdWxlUGFnaW5hdGlvbiA9IHsKICBjbGFzc2VzOiAxMDAsCiAgbWV0aG9kczogMTAwLAogIGZpZWxkczogMTAwCn07CgovLyBMb29rdXAgbWFwcwpsZXQgdGFibGVzID0gewogIHJ1bGVzOiBuZXcgTWFwKCksCiAgY2xhc3NlczogbmV3IE1hcCgpLAogIGZpZWxkczogbmV3IE1hcCgpLAogIG1ldGhvZHM6IG5ldyBNYXAoKSwKICB0eXBlczogbmV3IE1hcCgpLAogIHByb3RvczogbmV3IE1hcCgpLAogIHR5cGVMaXN0czogbmV3IE1hcCgpLAogIG9yaWdpbnM6IG5ldyBNYXAoKSwKICBqYXJPcmlnaW5zOiBuZXcgTWFwKCksCiAga2VlcENvbnN0cmFpbnRzOiBuZXcgTWFwKCksCiAgZmlsZXM6IG5ldyBNYXAoKSwgLy8gZmlsZW5hbWUgLT4geyBydWxlczogW10sIHRvdGFsUmFkaXVzOiAwLCBjbGFzc2VzOiAwLCBtZXRob2RzOiAwLCBmaWVsZHM6IDAgfQogIG1ldGhvZFJlZnM6IG5ldyBNYXAoKSwKICBmaWVsZFJlZnM6IG5ldyBNYXAoKQp9OwoKbGV0IGNvbnN0cmFpbnRTdGF0cyA9IHsKICBET05UX09CRlVTQ0FURTogewogICAgY2xhc3NlczogbmV3IFNldCgpLAogICAgbWV0aG9kczogbmV3IFNldCgpLAogICAgZmllbGRzOiBuZXcgU2V0KCkKICB9LAogIERPTlRfT1BUSU1JWkU6IHsKICAgIGNsYXNzZXM6IG5ldyBTZXQoKSwKICAgIG1ldGhvZHM6IG5ldyBTZXQoKSwKICAgIGZpZWxkczogbmV3IFNldCgpCiAgfSwKICBET05UX1NIUklOSzogewogICAgY2xhc3NlczogbmV3IFNldCgpLAogICAgbWV0aG9kczogbmV3IFNldCgpLAogICAgZmllbGRzOiBuZXcgU2V0KCkKICB9Cn07Cgpjb25zdCBkcm9wWm9uZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcm9wLXpvbmUnKTsKY29uc3QgZmlsZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtaW5wdXQnKTsKY29uc3QgcnVsZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncnVsZS1saXN0Jyk7CmNvbnN0IHNlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaC1pbnB1dCcpOwpjb25zdCBtYWluQ29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLWNvbnRlbnQnKTsKCmNvbnN0IGVtYmVkZGVkUHJvdG9TY2hlbWFTb3VyY2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmxhc3RyYWRpdXMtcHJvdG8nKTsKY29uc3QgZW1iZWRkZWRQcm90b0RhdGFTb3VyY2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmxhc3RyYWRpdXMtZGF0YScpOwoKLy8gTG9hZCBQcm90b2J1ZiBkZWZpbml0aW9uLgppZiAoZW1iZWRkZWRQcm90b1NjaGVtYVNvdXJjZSkgewogIHRyeSB7CiAgICBwcm90b2J1ZlJvb3QgPSBwcm90b2J1Zi5wYXJzZShlbWJlZGRlZFByb3RvU2NoZW1hU291cmNlLnRleHRDb250ZW50KS5yb290OwogIH0gY2F0Y2ggKGUpIHsKICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBwYXJzZSBlbWJlZGRlZCBwcm90bzoiLCBlKTsKICB9Cn0gZWxzZSB7CiAgcHJvdG9idWYubG9hZCgiYmxhc3RyYWRpdXMucHJvdG8iLCBmdW5jdGlvbihlcnIsIHJvb3QpIHsKICAgIGlmIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgbG9hZGluZyBwcm90bzoiLCBlcnIpOwogICAgICBhbGVydCgiRmFpbGVkIHRvIGxvYWQgYmxhc3RyYWRpdXMucHJvdG8uIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHByb3RvYnVmUm9vdCA9IHJvb3Q7CiAgfSk7Cn0KCi8vIExvYWQgYmxhc3QgcmFkaXVzIGRhdGEgKC5wYikuCmlmIChlbWJlZGRlZFByb3RvRGF0YVNvdXJjZSkgewogIHNldFRpbWVvdXQoKCkgPT4gewogICAgdHJ5IHsKICAgICAgY29uc3QgZGF0YSA9IGVtYmVkZGVkUHJvdG9EYXRhU291cmNlLnRleHRDb250ZW50LnRyaW0oKTsKICAgICAgY29uc3QgYnl0ZXMgPSBVaW50OEFycmF5LmZyb20oYXRvYihkYXRhKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpOwogICAgICBjb25zdCBCbGFzdFJhZGl1c0NvbnRhaW5lciA9IHByb3RvYnVmUm9vdC5sb29rdXBUeXBlKCJjb20uYW5kcm9pZC50b29scy5yOC5ibGFzdHJhZGl1cy5wcm90by5CbGFzdFJhZGl1c0NvbnRhaW5lciIpOwogICAgICBjb25zdCBtZXNzYWdlID0gQmxhc3RSYWRpdXNDb250YWluZXIuZGVjb2RlKGJ5dGVzKTsKICAgICAgY29udGFpbmVyRGF0YSA9IEJsYXN0UmFkaXVzQ29udGFpbmVyLnRvT2JqZWN0KG1lc3NhZ2UsIHsKICAgICAgICBsb25nczogU3RyaW5nLAogICAgICAgIGVudW1zOiBTdHJpbmcsCiAgICAgICAgYnl0ZXM6IFN0cmluZywKICAgICAgICBkZWZhdWx0czogdHJ1ZSwKICAgICAgICBhcnJheXM6IHRydWUsCiAgICAgICAgb2JqZWN0czogdHJ1ZSwKICAgICAgICBvbmVvZnM6IHRydWUKICAgICAgfSk7CiAgICAgIHByb2Nlc3NEYXRhKCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBkZWNvZGUgZW1iZWRkZWQgZGF0YToiLCBlKTsKICAgIH0KICB9LCAwKTsKfSBlbHNlIHsKICBkcm9wWm9uZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGZpbGVJbnB1dC5jbGljaygpKTsKCiAgZHJvcFpvbmUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCAoZSkgPT4gewogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgZHJvcFpvbmUuY2xhc3NMaXN0LmFkZCgnaG92ZXInKTsKICB9KTsKCiAgZHJvcFpvbmUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgKCkgPT4gewogICAgZHJvcFpvbmUuY2xhc3NMaXN0LnJlbW92ZSgnaG92ZXInKTsKICB9KTsKCiAgZHJvcFpvbmUuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIChlKSA9PiB7CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICBkcm9wWm9uZS5jbGFzc0xpc3QucmVtb3ZlKCdob3ZlcicpOwogICAgaWYgKGUuZGF0YVRyYW5zZmVyLmZpbGVzLmxlbmd0aCA+IDApIHsKICAgICAgaGFuZGxlRmlsZShlLmRhdGFUcmFuc2Zlci5maWxlc1swXSk7CiAgICB9CiAgfSk7CgogIGZpbGVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4gewogICAgaWYgKGUudGFyZ2V0LmZpbGVzLmxlbmd0aCA+IDApIHsKICAgICAgaGFuZGxlRmlsZShlLnRhcmdldC5maWxlc1swXSk7CiAgICB9CiAgfSk7CgogIGZ1bmN0aW9uIGhhbmRsZUZpbGUoZmlsZSkgewogICAgaWYgKCFwcm90b2J1ZlJvb3QpIHsKICAgICAgYWxlcnQoIlByb3RvYnVmIGRlZmluaXRpb24gbm90IGxvYWRlZCB5ZXQuIik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICByZW5kZXJMb2FkaW5nKCk7CiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwogICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBlLnRhcmdldC5yZXN1bHQ7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBCbGFzdFJhZGl1c0NvbnRhaW5lciA9IHByb3RvYnVmUm9vdC5sb29rdXBUeXBlKCJjb20uYW5kcm9pZC50b29scy5yOC5ibGFzdHJhZGl1cy5wcm90by5CbGFzdFJhZGl1c0NvbnRhaW5lciIpOwogICAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpOwogICAgICAgICAgY29uc3QgbWVzc2FnZSA9IEJsYXN0UmFkaXVzQ29udGFpbmVyLmRlY29kZShidWZmZXIpOwogICAgICAgICAgY29udGFpbmVyRGF0YSA9IEJsYXN0UmFkaXVzQ29udGFpbmVyLnRvT2JqZWN0KG1lc3NhZ2UsIHsKICAgICAgICAgICAgbG9uZ3M6IFN0cmluZywKICAgICAgICAgICAgZW51bXM6IFN0cmluZywKICAgICAgICAgICAgYnl0ZXM6IFN0cmluZywKICAgICAgICAgICAgZGVmYXVsdHM6IHRydWUsCiAgICAgICAgICAgIGFycmF5czogdHJ1ZSwKICAgICAgICAgICAgb2JqZWN0czogdHJ1ZSwKICAgICAgICAgICAgb25lb2ZzOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICAgIHByb2Nlc3NEYXRhKCk7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciBkZWNvZGluZyBwcm90bzoiLCBlcnIpOwogICAgICAgICAgYWxlcnQoIkZhaWxlZCB0byBkZWNvZGUgdGhlIC5wYiBmaWxlLiBFbnN1cmUgaXQgbWF0Y2hlcyB0aGUgYmxhc3RyYWRpdXMucHJvdG8gc2NoZW1hLiIpOwogICAgICAgICAgcmVuZGVyV2VsY29tZU1lc3NhZ2UoKTsKICAgICAgICAgIGRyb3Bab25lLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpOwogICAgICAgIH0KICAgICAgfSwgMCk7CiAgICB9OwogICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpOwogIH0KfQoKc2VhcmNoSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gewogIGlmIChjdXJyZW50VmlldyA9PT0gJ3J1bGVzJykgewogICAgZmlsdGVyUnVsZXMoZS50YXJnZXQudmFsdWUpOwogIH0gZWxzZSBpZiAoY3VycmVudFZpZXcgPT09ICd1bnVzZWQnKSB7CiAgICBmaWx0ZXJVbnVzZWRSdWxlcyhlLnRhcmdldC52YWx1ZSk7CiAgfSBlbHNlIGlmIChjdXJyZW50VmlldyA9PT0gJ3JlZHVuZGFudCcpIHsKICAgIGZpbHRlclJlZHVuZGFudFJ1bGVzKGUudGFyZ2V0LnZhbHVlKTsKICB9IGVsc2UgaWYgKGN1cnJlbnRWaWV3ID09PSAnZmlsZXMnKSB7CiAgICBmaWx0ZXJGaWxlcyhlLnRhcmdldC52YWx1ZSk7CiAgfQp9KTsKCmZ1bmN0aW9uIHByb2Nlc3NEYXRhKCkgewogIC8vIENsZWFyIHByZXZpb3VzIGRhdGEKICBPYmplY3QudmFsdWVzKHRhYmxlcykuZm9yRWFjaChtYXAgPT4gbWFwIGluc3RhbmNlb2YgTWFwID8gbWFwLmNsZWFyKCkgOiBudWxsKTsKICB0YWJsZXMuZmlsZXMgPSBuZXcgTWFwKCk7CgogIC8vIFJlc2V0IGNvbnN0cmFpbnQgc3RhdHMKICBPYmplY3QudmFsdWVzKGNvbnN0cmFpbnRTdGF0cykuZm9yRWFjaChzID0+IHsKICAgIHMuY2xhc3Nlcy5jbGVhcigpOwogICAgcy5tZXRob2RzLmNsZWFyKCk7CiAgICBzLmZpZWxkcy5jbGVhcigpOwogIH0pOwoKICAvLyBCdWlsZCBsb29rdXAgdGFibGVzIGZvciBvcmlnaW5zCiAgaWYgKGNvbnRhaW5lckRhdGEuY2xhc3NGaWxlSW5KYXJPcmlnaW5UYWJsZSkKICAgIGNvbnRhaW5lckRhdGEuY2xhc3NGaWxlSW5KYXJPcmlnaW5UYWJsZS5mb3JFYWNoKG8gPT4gdGFibGVzLmphck9yaWdpbnMuc2V0KG8uaWQsIG8pKTsKICBpZiAoY29udGFpbmVyRGF0YS5maWxlT3JpZ2luVGFibGUpCiAgICBjb250YWluZXJEYXRhLmZpbGVPcmlnaW5UYWJsZS5mb3JFYWNoKG8gPT4gdGFibGVzLm9yaWdpbnMuc2V0KG8uaWQsIG8pKTsKCiAgLy8gQnVpbGQgbG9va3VwIHRhYmxlIGZvciByZWZlcmVuY2VzLgogIGlmIChjb250YWluZXJEYXRhLmZpZWxkUmVmZXJlbmNlVGFibGUpCiAgICBjb250YWluZXJEYXRhLmZpZWxkUmVmZXJlbmNlVGFibGUuZm9yRWFjaChmID0+IHRhYmxlcy5maWVsZFJlZnMuc2V0KGYuaWQsIGYpKTsKICBpZiAoY29udGFpbmVyRGF0YS5tZXRob2RSZWZlcmVuY2VUYWJsZSkKICAgIGNvbnRhaW5lckRhdGEubWV0aG9kUmVmZXJlbmNlVGFibGUuZm9yRWFjaChtID0+IHRhYmxlcy5tZXRob2RSZWZzLnNldChtLmlkLCBtKSk7CiAgaWYgKGNvbnRhaW5lckRhdGEucHJvdG9SZWZlcmVuY2VUYWJsZSkKICAgIGNvbnRhaW5lckRhdGEucHJvdG9SZWZlcmVuY2VUYWJsZS5mb3JFYWNoKHAgPT4gdGFibGVzLnByb3Rvcy5zZXQocC5pZCwgcCkpOwogIGlmIChjb250YWluZXJEYXRhLnR5cGVSZWZlcmVuY2VUYWJsZSkKICAgIGNvbnRhaW5lckRhdGEudHlwZVJlZmVyZW5jZVRhYmxlLmZvckVhY2godCA9PiB0YWJsZXMudHlwZXMuc2V0KHQuaWQsIHQpKTsKICBpZiAoY29udGFpbmVyRGF0YS50eXBlUmVmZXJlbmNlTGlzdFRhYmxlKQogICAgY29udGFpbmVyRGF0YS50eXBlUmVmZXJlbmNlTGlzdFRhYmxlLmZvckVhY2godGwgPT4gdGFibGVzLnR5cGVMaXN0cy5zZXQodGwuaWQsIHRsKSk7CgogIC8vIEJ1aWxkIGxvb2t1cCB0YWJsZXMgZm9yIGtlcHQgaXRlbXMKICBpZiAoY29udGFpbmVyRGF0YS5rZXB0Q2xhc3NJbmZvVGFibGUpCiAgICBjb250YWluZXJEYXRhLmtlcHRDbGFzc0luZm9UYWJsZS5mb3JFYWNoKGMgPT4gdGFibGVzLmNsYXNzZXMuc2V0KGMuaWQsIGMpKTsKICBpZiAoY29udGFpbmVyRGF0YS5rZXB0RmllbGRJbmZvVGFibGUpCiAgICBjb250YWluZXJEYXRhLmtlcHRGaWVsZEluZm9UYWJsZS5mb3JFYWNoKGYgPT4gdGFibGVzLmZpZWxkcy5zZXQoZi5pZCwgZikpOwogIGlmIChjb250YWluZXJEYXRhLmtlcHRNZXRob2RJbmZvVGFibGUpCiAgICBjb250YWluZXJEYXRhLmtlcHRNZXRob2RJbmZvVGFibGUuZm9yRWFjaChtID0+IHRhYmxlcy5tZXRob2RzLnNldChtLmlkLCBtKSk7CgogIGlmIChjb250YWluZXJEYXRhLmtlZXBDb25zdHJhaW50c1RhYmxlKQogICAgY29udGFpbmVyRGF0YS5rZWVwQ29uc3RyYWludHNUYWJsZS5mb3JFYWNoKGMgPT4gdGFibGVzLmtlZXBDb25zdHJhaW50cy5zZXQoYy5pZCwgYykpOwoKICBpZiAoY29udGFpbmVyRGF0YS5rZWVwUnVsZUJsYXN0UmFkaXVzVGFibGUpIHsKICAgIGNvbnRhaW5lckRhdGEua2VlcFJ1bGVCbGFzdFJhZGl1c1RhYmxlLmZvckVhY2gociA9PiB7CiAgICAgIHRhYmxlcy5ydWxlcy5zZXQoci5pZCwgcik7CiAgICAgIHIudG90YWxSYWRpdXMgPSAoci5ibGFzdFJhZGl1cy5jbGFzc0JsYXN0UmFkaXVzPy5sZW5ndGggfHwgMCkgKwogICAgICAgIChyLmJsYXN0UmFkaXVzLmZpZWxkQmxhc3RSYWRpdXM/Lmxlbmd0aCB8fCAwKSArCiAgICAgICAgKHIuYmxhc3RSYWRpdXMubWV0aG9kQmxhc3RSYWRpdXM/Lmxlbmd0aCB8fCAwKTsKCiAgICAgIC8vIFBvcHVsYXRlIGNvbnN0cmFpbnQgc3RhdHMKICAgICAgY29uc3QgY29uc3RyYWludHMgPSB0YWJsZXMua2VlcENvbnN0cmFpbnRzLmdldChyLmNvbnN0cmFpbnRzSWQpOwogICAgICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuY29uc3RyYWludHMpIHsKICAgICAgICBjb25zdHJhaW50cy5jb25zdHJhaW50cy5mb3JFYWNoKGMgPT4gewogICAgICAgICAgY29uc3Qgc3RhdHMgPSBjb25zdHJhaW50U3RhdHNbY107CiAgICAgICAgICBpZiAoc3RhdHMpIHsKICAgICAgICAgICAgci5ibGFzdFJhZGl1cy5jbGFzc0JsYXN0UmFkaXVzPy5mb3JFYWNoKGlkID0+IHN0YXRzLmNsYXNzZXMuYWRkKGlkKSk7CiAgICAgICAgICAgIHIuYmxhc3RSYWRpdXMubWV0aG9kQmxhc3RSYWRpdXM/LmZvckVhY2goaWQgPT4gc3RhdHMubWV0aG9kcy5hZGQoaWQpKTsKICAgICAgICAgICAgci5ibGFzdFJhZGl1cy5maWVsZEJsYXN0UmFkaXVzPy5mb3JFYWNoKGlkID0+IHN0YXRzLmZpZWxkcy5hZGQoaWQpKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQoKICAgICAgLy8gR3JvdXAgYnkgZmlsZQogICAgICBjb25zdCBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKHIub3JpZ2luKTsKICAgICAgaWYgKCF0YWJsZXMuZmlsZXMuaGFzKGZpbGVOYW1lKSkgewogICAgICAgIHRhYmxlcy5maWxlcy5zZXQoZmlsZU5hbWUsIHsKICAgICAgICAgIG5hbWU6IGZpbGVOYW1lLAogICAgICAgICAgb3JpZ2luOiByLm9yaWdpbiwKICAgICAgICAgIHJ1bGVzOiBbXSwKICAgICAgICAgIGNsYXNzSWRzOiBuZXcgU2V0KCksCiAgICAgICAgICBtZXRob2RJZHM6IG5ldyBTZXQoKSwKICAgICAgICAgIGZpZWxkSWRzOiBuZXcgU2V0KCkKICAgICAgICB9KTsKICAgICAgfQogICAgICBjb25zdCBmaWxlRGF0YSA9IHRhYmxlcy5maWxlcy5nZXQoZmlsZU5hbWUpOwogICAgICBmaWxlRGF0YS5ydWxlcy5wdXNoKHIpOwogICAgICByLmJsYXN0UmFkaXVzLmNsYXNzQmxhc3RSYWRpdXM/LmZvckVhY2goaWQgPT4gZmlsZURhdGEuY2xhc3NJZHMuYWRkKGlkKSk7CiAgICAgIHIuYmxhc3RSYWRpdXMubWV0aG9kQmxhc3RSYWRpdXM/LmZvckVhY2goaWQgPT4gZmlsZURhdGEubWV0aG9kSWRzLmFkZChpZCkpOwogICAgICByLmJsYXN0UmFkaXVzLmZpZWxkQmxhc3RSYWRpdXM/LmZvckVhY2goaWQgPT4gZmlsZURhdGEuZmllbGRJZHMuYWRkKGlkKSk7CiAgICB9KTsKCiAgICAvLyBDb21wdXRlIGZpbmFsIGNvdW50cyBmb3IgZmlsZXMKICAgIHRhYmxlcy5maWxlcy5mb3JFYWNoKGZpbGVEYXRhID0+IHsKICAgICAgZmlsZURhdGEuY2xhc3NlcyA9IGZpbGVEYXRhLmNsYXNzSWRzLnNpemU7CiAgICAgIGZpbGVEYXRhLm1ldGhvZHMgPSBmaWxlRGF0YS5tZXRob2RJZHMuc2l6ZTsKICAgICAgZmlsZURhdGEuZmllbGRzID0gZmlsZURhdGEuZmllbGRJZHMuc2l6ZTsKICAgICAgZmlsZURhdGEudG90YWxSYWRpdXMgPSBmaWxlRGF0YS5jbGFzc2VzICsgZmlsZURhdGEubWV0aG9kcyArIGZpbGVEYXRhLmZpZWxkczsKICAgIH0pOwogIH0KCiAgZHJvcFpvbmUuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlYXJjaC1ib3gnKS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTsKICBzd2l0Y2hWaWV3KCdydWxlcycpOwp9CgpmdW5jdGlvbiByZW5kZXJTdGF0cygpIHsKICBjb25zdCBydWxlcyA9IGNvbnRhaW5lckRhdGEua2VlcFJ1bGVCbGFzdFJhZGl1c1RhYmxlIHx8IFtdOwogIGNvbnN0IHVudXNlZENvdW50ID0gcnVsZXMuZmlsdGVyKHIgPT4gci50b3RhbFJhZGl1cyA9PT0gMCkubGVuZ3RoOwogIGNvbnN0IHJlZHVuZGFudENvdW50ID0gcnVsZXMuZmlsdGVyKHIgPT4gci5ibGFzdFJhZGl1cy5zdWJzdW1lZEJ5ICYmIHIuYmxhc3RSYWRpdXMuc3Vic3VtZWRCeS5sZW5ndGggPiAwKS5sZW5ndGg7CgogIGNvbnN0IGZvcm1hdCA9ICh2YWwpID0+ICh2YWwgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKTsKCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXQtcnVsZXMnKS50ZXh0Q29udGVudCA9IGZvcm1hdChydWxlcy5sZW5ndGgpOwoKICAvLyBDb25zdHJhaW50LXNwZWNpZmljIGNvdW50cwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0LW5vLW9iZnVzY2F0aW9uLWNsYXNzZXMnKS50ZXh0Q29udGVudCA9IGZvcm1hdChjb25zdHJhaW50U3RhdHMuRE9OVF9PQkZVU0NBVEUuY2xhc3Nlcy5zaXplKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdC1uby1vYmZ1c2NhdGlvbi1tZXRob2RzJykudGV4dENvbnRlbnQgPSBmb3JtYXQoY29uc3RyYWludFN0YXRzLkRPTlRfT0JGVVNDQVRFLm1ldGhvZHMuc2l6ZSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXQtbm8tb2JmdXNjYXRpb24tZmllbGRzJykudGV4dENvbnRlbnQgPSBmb3JtYXQoY29uc3RyYWludFN0YXRzLkRPTlRfT0JGVVNDQVRFLmZpZWxkcy5zaXplKTsKCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXQtbm8tb3B0aW1pemF0aW9uLWNsYXNzZXMnKS50ZXh0Q29udGVudCA9IGZvcm1hdChjb25zdHJhaW50U3RhdHMuRE9OVF9PUFRJTUlaRS5jbGFzc2VzLnNpemUpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0LW5vLW9wdGltaXphdGlvbi1tZXRob2RzJykudGV4dENvbnRlbnQgPSBmb3JtYXQoY29uc3RyYWludFN0YXRzLkRPTlRfT1BUSU1JWkUubWV0aG9kcy5zaXplKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdC1uby1vcHRpbWl6YXRpb24tZmllbGRzJykudGV4dENvbnRlbnQgPSBmb3JtYXQoY29uc3RyYWludFN0YXRzLkRPTlRfT1BUSU1JWkUuZmllbGRzLnNpemUpOwoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdC1uby1zaHJpbmtpbmctY2xhc3NlcycpLnRleHRDb250ZW50ID0gZm9ybWF0KGNvbnN0cmFpbnRTdGF0cy5ET05UX1NIUklOSy5jbGFzc2VzLnNpemUpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0LW5vLXNocmlua2luZy1tZXRob2RzJykudGV4dENvbnRlbnQgPSBmb3JtYXQoY29uc3RyYWludFN0YXRzLkRPTlRfU0hSSU5LLm1ldGhvZHMuc2l6ZSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXQtbm8tc2hyaW5raW5nLWZpZWxkcycpLnRleHRDb250ZW50ID0gZm9ybWF0KGNvbnN0cmFpbnRTdGF0cy5ET05UX1NIUklOSy5maWVsZHMuc2l6ZSk7CgogIGlmIChjb250YWluZXJEYXRhLmJ1aWxkSW5mbykgewogICAgY29uc3QgaW5mbyA9IGNvbnRhaW5lckRhdGEuYnVpbGRJbmZvOwogICAgLy8gUmVhY2hhYmxlIGNvdW50cwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXQtcmVhY2hhYmxlLWNsYXNzZXMnKS50ZXh0Q29udGVudCA9IGZvcm1hdChpbmZvLmxpdmVDbGFzc0NvdW50KTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0LXJlYWNoYWJsZS1tZXRob2RzJykudGV4dENvbnRlbnQgPSBmb3JtYXQoaW5mby5saXZlTWV0aG9kQ291bnQpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXQtcmVhY2hhYmxlLWZpZWxkcycpLnRleHRDb250ZW50ID0gZm9ybWF0KGluZm8ubGl2ZUZpZWxkQ291bnQpOwogICAgLy8gVG90YWwgY291bnRzCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdC10b3RhbC1jbGFzc2VzJykudGV4dENvbnRlbnQgPSBmb3JtYXQoaW5mby5jbGFzc0NvdW50KTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0LXRvdGFsLW1ldGhvZHMnKS50ZXh0Q29udGVudCA9IGZvcm1hdChpbmZvLm1ldGhvZENvdW50KTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0LXRvdGFsLWZpZWxkcycpLnRleHRDb250ZW50ID0gZm9ybWF0KGluZm8uZmllbGRDb3VudCk7CiAgfSBlbHNlIHsKICAgIC8vIEZhbGxiYWNrIGlmIGJ1aWxkSW5mbyBpcyBtaXNzaW5nCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdC1yZWFjaGFibGUtY2xhc3NlcycpLnRleHRDb250ZW50ID0gIi0iOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXQtcmVhY2hhYmxlLW1ldGhvZHMnKS50ZXh0Q29udGVudCA9ICItIjsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0LXJlYWNoYWJsZS1maWVsZHMnKS50ZXh0Q29udGVudCA9ICItIjsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0LXRvdGFsLWNsYXNzZXMnKS50ZXh0Q29udGVudCA9ICItIjsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0LXRvdGFsLW1ldGhvZHMnKS50ZXh0Q29udGVudCA9ICItIjsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0LXRvdGFsLWZpZWxkcycpLnRleHRDb250ZW50ID0gIi0iOwogIH0KCiAgY29uc3QgdW51c2VkQmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndW51c2VkLWNvdW50Jyk7CiAgdW51c2VkQmFkZ2UudGV4dENvbnRlbnQgPSB1bnVzZWRDb3VudDsKICB1bnVzZWRCYWRnZS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTsKCiAgY29uc3QgcmVkdW5kYW50QmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVkdW5kYW50LWNvdW50Jyk7CiAgcmVkdW5kYW50QmFkZ2UudGV4dENvbnRlbnQgPSByZWR1bmRhbnRDb3VudDsKICByZWR1bmRhbnRCYWRnZS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTsKCiAgY29uc3QgcnVsZXNCYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdydWxlcy1jb3VudCcpOwogIHJ1bGVzQmFkZ2UudGV4dENvbnRlbnQgPSBydWxlcy5sZW5ndGg7CiAgcnVsZXNCYWRnZS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTsKCiAgY29uc3QgZmlsZXNCYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlcy1jb3VudCcpOwogIGZpbGVzQmFkZ2UudGV4dENvbnRlbnQgPSB0YWJsZXMuZmlsZXMuc2l6ZTsKICBmaWxlc0JhZGdlLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpOwp9CgpmdW5jdGlvbiBmaWx0ZXJSdWxlcyhxdWVyeSkgewogIGNvbnN0IHJ1bGVzID0gY29udGFpbmVyRGF0YS5rZWVwUnVsZUJsYXN0UmFkaXVzVGFibGUgfHwgW107CiAgY29uc3QgbG93ZXJRdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7CgogIGZpbHRlcmVkUnVsZXMgPSBydWxlcy5maWx0ZXIociA9PgogICAgci5zb3VyY2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlclF1ZXJ5KQogICk7CgogIGZpbHRlcmVkUnVsZXMuc29ydCgoYSwgYikgPT4gYi50b3RhbFJhZGl1cyAtIGEudG90YWxSYWRpdXMpOwogIHJlbmRlclJ1bGVMaXN0KCk7Cn0KCmZ1bmN0aW9uIGZpbHRlckZpbGVzKHF1ZXJ5KSB7CiAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKHRhYmxlcy5maWxlcy52YWx1ZXMoKSk7CiAgY29uc3QgbG93ZXJRdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7CgogIGZpbHRlcmVkRmlsZXMgPSBmaWxlcy5maWx0ZXIoZiA9PgogICAgZi5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJRdWVyeSkKICApOwoKICBmaWx0ZXJlZEZpbGVzLnNvcnQoKGEsIGIpID0+IGIudG90YWxSYWRpdXMgLSBhLnRvdGFsUmFkaXVzKTsKICByZW5kZXJGaWxlTGlzdCgpOwp9CgpmdW5jdGlvbiByZW5kZXJSdWxlTGlzdCgpIHsKICBydWxlTGlzdC5pbm5lckhUTUwgPSAnJzsKICBmaWx0ZXJlZFJ1bGVzLmZvckVhY2gocnVsZSA9PiB7CiAgICBjb25zdCBpc1JlZHVuZGFudCA9IHJ1bGUuYmxhc3RSYWRpdXMuc3Vic3VtZWRCeSAmJiBydWxlLmJsYXN0UmFkaXVzLnN1YnN1bWVkQnkubGVuZ3RoID4gMDsKICAgIGxldCBzYW1lT3JpZ2luU3Vic3VtcHRpb24gPSBmYWxzZTsKICAgIGlmIChpc1JlZHVuZGFudCkgewogICAgICBjb25zdCBydWxlT3JpZ2luRmlsZSA9IGdldEZpbGVOYW1lKHJ1bGUub3JpZ2luKTsKICAgICAgc2FtZU9yaWdpblN1YnN1bXB0aW9uID0gcnVsZS5ibGFzdFJhZGl1cy5zdWJzdW1lZEJ5LnNvbWUoaWQgPT4gewogICAgICAgIGNvbnN0IHN1YnN1bWVyID0gdGFibGVzLnJ1bGVzLmdldChpZCk7CiAgICAgICAgcmV0dXJuIHN1YnN1bWVyICYmIGdldEZpbGVOYW1lKHN1YnN1bWVyLm9yaWdpbikgPT09IHJ1bGVPcmlnaW5GaWxlOwogICAgICB9KTsKICAgIH0KCiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGRpdi5jbGFzc05hbWUgPSAncnVsZS1pdGVtJzsKICAgIGRpdi5kYXRhc2V0LnJ1bGVJZCA9IHJ1bGUuaWQ7CiAgICBjb25zdCBjbGFzc2VzID0gcnVsZS5ibGFzdFJhZGl1cy5jbGFzc0JsYXN0UmFkaXVzPy5sZW5ndGggfHwgMDsKICAgIGNvbnN0IG1ldGhvZHMgPSBydWxlLmJsYXN0UmFkaXVzLm1ldGhvZEJsYXN0UmFkaXVzPy5sZW5ndGggfHwgMDsKICAgIGNvbnN0IGZpZWxkcyA9IHJ1bGUuYmxhc3RSYWRpdXMuZmllbGRCbGFzdFJhZGl1cz8ubGVuZ3RoIHx8IDA7CiAgICBkaXYuaW5uZXJIVE1MID0gYAogICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgZ2FwOiA4cHg7Ij4KICAgICAgICAgICAgICAgICR7c2FtZU9yaWdpblN1YnN1bXB0aW9uID8gJzxzcGFuIHRpdGxlPSJTdWJzdW1lZCBieSBydWxlIGluIHNhbWUgZmlsZSIgc3R5bGU9ImNvbG9yOiAjZmY5ODAwOyBjdXJzb3I6IGhlbHA7Ij7imqDvuI88L3NwYW4+JyA6ICcnfQogICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZmxleDogMTsiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJydWxlLW5hbWUiPiR7ZXNjYXBlSHRtbChydWxlLnNvdXJjZSl9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICR7Y3VycmVudFZpZXcgIT09ICJ1bnVzZWQiID8gYAogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJydWxlLXN0YXRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsYXN0IHJhZGl1czogJHtydWxlLnRvdGFsUmFkaXVzfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtmb3JtYXRTdGF0c0JyZWFrZG93bihjbGFzc2VzLCBtZXRob2RzLCBmaWVsZHMpfQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICBgIDogJyd9CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgYDsKICAgIGRpdi5vbmNsaWNrID0gKCkgPT4gc2VsZWN0UnVsZShydWxlLCBkaXYpOwogICAgcnVsZUxpc3QuYXBwZW5kQ2hpbGQoZGl2KTsKICB9KTsKfQoKZnVuY3Rpb24gcmVuZGVyRmlsZUxpc3QoKSB7CiAgcnVsZUxpc3QuaW5uZXJIVE1MID0gJyc7CiAgZmlsdGVyZWRGaWxlcy5mb3JFYWNoKGZpbGUgPT4gewogICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkaXYuY2xhc3NOYW1lID0gJ3J1bGUtaXRlbSc7CiAgICBkaXYuaW5uZXJIVE1MID0gYAogICAgICAgICAgICA8c3BhbiBjbGFzcz0icnVsZS1uYW1lIj4ke2VzY2FwZUh0bWwoZ2V0T3JpZ2luU3RyaW5nKGZpbGUub3JpZ2luKSl9PC9zcGFuPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJydWxlLXN0YXRzIj4KICAgICAgICAgICAgICAgIEJsYXN0IHJhZGl1czogJHtmaWxlLnRvdGFsUmFkaXVzfSBhY3Jvc3MgJHtmaWxlLnJ1bGVzLmxlbmd0aH0gcnVsZXMKICAgICAgICAgICAgICAgIDxicj4ke2Zvcm1hdFN0YXRzQnJlYWtkb3duKGZpbGUuY2xhc3NlcywgZmlsZS5tZXRob2RzLCBmaWxlLmZpZWxkcyl9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIGA7CiAgICBkaXYub25jbGljayA9ICgpID0+IHNlbGVjdEZpbGUoZmlsZSwgZGl2KTsKICAgIHJ1bGVMaXN0LmFwcGVuZENoaWxkKGRpdik7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNlbGVjdFJ1bGUocnVsZSwgZWxlbWVudCkgewogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5ydWxlLWl0ZW0nKS5mb3JFYWNoKGVsID0+IGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTsKICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogIGN1cnJlbnRTZWxlY3RlZFJ1bGUgPSBydWxlOwogIGN1cnJlbnRTdWJWaWV3ID0gJ2NsYXNzJzsKICBjdXJyZW50UnVsZVBhZ2luYXRpb24gPSB7CiAgICBjbGFzc2VzOiAxMDAsCiAgICBtZXRob2RzOiAxMDAsCiAgICBmaWVsZHM6IDEwMAogIH07CiAgcmVuZGVyUnVsZURldGFpbChydWxlKTsKfQoKZnVuY3Rpb24gc2VsZWN0RmlsZShmaWxlLCBlbGVtZW50KSB7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJ1bGUtaXRlbScpLmZvckVhY2goZWwgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpOwogIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgcmVuZGVyRmlsZURldGFpbChmaWxlKTsKfQoKZnVuY3Rpb24gcmVuZGVyUnVsZURldGFpbChydWxlKSB7CiAgY29uc3QgaXNSZWR1bmRhbnQgPSBydWxlLmJsYXN0UmFkaXVzLnN1YnN1bWVkQnkgJiYgcnVsZS5ibGFzdFJhZGl1cy5zdWJzdW1lZEJ5Lmxlbmd0aCA+IDA7CiAgY29uc3QgcnVsZU9yaWdpbkZpbGUgPSBnZXRGaWxlTmFtZShydWxlLm9yaWdpbik7CgogIGxldCBodG1sID0gYAogICAgICAgIDxkaXYgY2xhc3M9ImNhcmQiPgogICAgICAgICAgICA8aDI+S2VlcCBSdWxlIERldGFpbHM8L2gyPgogICAgICAgICAgICAke2lzUmVkdW5kYW50ID8gcnVsZS5ibGFzdFJhZGl1cy5zdWJzdW1lZEJ5Lm1hcChpZCA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGFibGVzLnJ1bGVzLmdldChpZCk7CiAgICAgICAgICAgICAgICBjb25zdCBpc1NhbWVGaWxlID0gciAmJiBnZXRGaWxlTmFtZShyLm9yaWdpbikgPT09IHJ1bGVPcmlnaW5GaWxlOwogICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luU3RyID0gciA/IGdldE9yaWdpblN0cmluZyhyLm9yaWdpbikgOiAiVW5rbm93biBvcmlnaW4iOwogICAgICAgICAgICAgICAgcmV0dXJuIGAKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJiYW5uZXIgYmFubmVyLXdhcm5pbmciPgogICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPlJlZHVuZGFudCBSdWxlOjwvc3Ryb25nPiBUaGlzIHJ1bGUgaXMgZnVsbHkgc3Vic3VtZWQgYnkgJHtpc1NhbWVGaWxlID8gJ2Fub3RoZXIgcnVsZSBpbiB0aGUgc2FtZSBmaWxlJyA6ICdhIHJ1bGUgaW4gYSBkaWZmZXJlbnQgZmlsZSd9OgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAwLjVyZW07Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnN1bWVkLWJ5LWl0ZW0iIG9uY2xpY2s9Im5hdmlnYXRlVG9SdWxlKCcke2lkfScpIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXdlaWdodDogNTAwOyI+JHtyID8gZXNjYXBlSHRtbChyLnNvdXJjZSkgOiBgUnVsZSBJRDogJHtpZH1gfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogIzY2NjsgbWFyZ2luLXRvcDogMnB4OyI+T3JpZ2luOiAke2VzY2FwZUh0bWwob3JpZ2luU3RyKX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIGA7CiAgICAgICAgICAgIH0pLmpvaW4oJycpIDogJyd9CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImtlZXAtcnVsZS1zb3VyY2UiPiR7ZXNjYXBlSHRtbChydWxlLnNvdXJjZSl9PC9kaXY+CiAgICAgICAgICAgIDxwPjxzdHJvbmc+T3JpZ2luOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwoZ2V0T3JpZ2luU3RyaW5nKHJ1bGUub3JpZ2luKSl9PC9wPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InN1Yi10YWJzIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ic3ViLXRhYi1idXR0b24gJHtjdXJyZW50U3ViVmlldyA9PT0gJ2NsYXNzJyA/ICdhY3RpdmUnIDogJyd9IiBvbmNsaWNrPSJzd2l0Y2hTdWJWaWV3KCdjbGFzcycpIj4KICAgICAgICAgICAgICAgIE1hdGNoZWQgQ2xhc3NlcyA8c3BhbiBjbGFzcz0iYmFkZ2UiPiR7cnVsZS5ibGFzdFJhZGl1cy5jbGFzc0JsYXN0UmFkaXVzPy5sZW5ndGggfHwgMH08L3NwYW4+CiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJzdWItdGFiLWJ1dHRvbiAke2N1cnJlbnRTdWJWaWV3ID09PSAnbWV0aG9kJyA/ICdhY3RpdmUnIDogJyd9IiBvbmNsaWNrPSJzd2l0Y2hTdWJWaWV3KCdtZXRob2QnKSI+CiAgICAgICAgICAgICAgICBNYXRjaGVkIE1ldGhvZHMgPHNwYW4gY2xhc3M9ImJhZGdlIj4ke3J1bGUuYmxhc3RSYWRpdXMubWV0aG9kQmxhc3RSYWRpdXM/Lmxlbmd0aCB8fCAwfTwvc3Bhbj4KICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InN1Yi10YWItYnV0dG9uICR7Y3VycmVudFN1YlZpZXcgPT09ICdmaWVsZCcgPyAnYWN0aXZlJyA6ICcnfSIgb25jbGljaz0ic3dpdGNoU3ViVmlldygnZmllbGQnKSI+CiAgICAgICAgICAgICAgICBNYXRjaGVkIEZpZWxkcyA8c3BhbiBjbGFzcz0iYmFkZ2UiPiR7cnVsZS5ibGFzdFJhZGl1cy5maWVsZEJsYXN0UmFkaXVzPy5sZW5ndGggfHwgMH08L3NwYW4+CiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgYDsKCiAgaHRtbCArPSByZW5kZXJCbGFzdFJhZGl1c0l0ZW1zKHJ1bGUuYmxhc3RSYWRpdXMpOwogIG1haW5Db250ZW50LmlubmVySFRNTCA9IGh0bWw7Cn0KCmZ1bmN0aW9uIHJlbmRlckZpbGVEZXRhaWwoZmlsZSkgewogIGNvbnN0IHVzZWRSdWxlcyA9IGZpbGUucnVsZXMuZmlsdGVyKHIgPT4gci50b3RhbFJhZGl1cyA+IDApLnNvcnQoKGEsIGIpID0+IGIudG90YWxSYWRpdXMgLSBhLnRvdGFsUmFkaXVzKTsKICBjb25zdCB1bnVzZWRSdWxlcyA9IGZpbGUucnVsZXMuZmlsdGVyKHIgPT4gci50b3RhbFJhZGl1cyA9PT0gMCkuc29ydCgoYSwgYikgPT4gYS5zb3VyY2UubG9jYWxlQ29tcGFyZShiLnNvdXJjZSkpOwoKICBsZXQgaHRtbCA9IGAKICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkIj4KICAgICAgICAgICAgPGgyPkZpbGUgRGV0YWlsczwvaDI+CiAgICAgICAgICAgIDxwPjxzdHJvbmc+RmlsZTo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGZpbGUubmFtZSl9PC9wPgogICAgICAgICAgICA8cD48c3Ryb25nPkJsYXN0IHJhZGl1czo8L3N0cm9uZz4gJHtmaWxlLnRvdGFsUmFkaXVzfSBpdGVtcyBrZXB0IGFjcm9zcyAke2ZpbGUucnVsZXMubGVuZ3RofSBydWxlcy48L3A+CiAgICAgICAgPC9kaXY+CiAgICBgOwoKICBpZiAodXNlZFJ1bGVzLmxlbmd0aCA+IDApIHsKICAgIGh0bWwgKz0gYAogICAgICAgIDxkaXYgY2xhc3M9ImNhcmQiPgogICAgICAgICAgICA8aDI+S2VlcCBSdWxlcyBpbiB0aGlzIEZpbGU8L2gyPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpdGVtLWxpc3QiPgogICAgICAgICAgICAgICAgJHt1c2VkUnVsZXMubWFwKHIgPT4gYAogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJ1bGUtaXRlbSIgb25jbGljaz0ibmF2aWdhdGVUb1J1bGUoJyR7ci5pZH0nKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJ1bGUtbmFtZSI+JHtlc2NhcGVIdG1sKHIuc291cmNlKX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icnVsZS1zdGF0cyI+Qmxhc3QgcmFkaXVzOiAke3IudG90YWxSYWRpdXN9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBgKS5qb2luKCcnKX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICBgOwogIH0KCiAgaWYgKHVudXNlZFJ1bGVzLmxlbmd0aCA+IDApIHsKICAgIGh0bWwgKz0gYAogICAgICAgIDxkaXYgY2xhc3M9ImNhcmQiPgogICAgICAgICAgICA8aDI+VW51c2VkIEtlZXAgUnVsZXMgaW4gdGhpcyBGaWxlPC9oMj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1saXN0Ij4KICAgICAgICAgICAgICAgICR7dW51c2VkUnVsZXMubWFwKHIgPT4gYAogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJ1bGUtaXRlbSIgb25jbGljaz0ibmF2aWdhdGVUb1J1bGUoJyR7ci5pZH0nKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJ1bGUtbmFtZSI+JHtlc2NhcGVIdG1sKHIuc291cmNlKX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIGApLmpvaW4oJycpfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIGA7CiAgfQoKICBtYWluQ29udGVudC5pbm5lckhUTUwgPSBodG1sOwp9CgpmdW5jdGlvbiByZW5kZXJCbGFzdFJhZGl1c0l0ZW1zKGJsYXN0UmFkaXVzKSB7CiAgbGV0IGh0bWwgPSAiIjsKCiAgY29uc3QgcmVuZGVyU2VjdGlvbiA9ICh0aXRsZSwgaXRlbXMsIHR5cGUsIGZvcm1hdHRlciwgYmFkZ2VDbGFzcywgbGltaXQpID0+IHsKICAgIGlmIChjdXJyZW50U3ViVmlldyAhPT0gdHlwZSkgcmV0dXJuICIiOwogICAgaWYgKCFpdGVtcyB8fCBpdGVtcy5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIGAKICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkIj4KICAgICAgICAgICAgPHAgc3R5bGU9ImNvbG9yOiAjNjY2OyBmb250LXN0eWxlOiBpdGFsaWM7Ij5ObyBpdGVtcyBtYXRjaGVkIHRoaXMgY2F0ZWdvcnkuPC9wPgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgfQogICAgY29uc3QgdmlzaWJsZUl0ZW1zID0gaXRlbXMuc2xpY2UoMCwgbGltaXQpOwogICAgY29uc3QgaGFzTW9yZSA9IGl0ZW1zLmxlbmd0aCA+IGxpbWl0OwoKICAgIHJldHVybiBgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQiPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJpdGVtLWxpc3QiPgogICAgICAgICAgICAgICAgICAgICR7dmlzaWJsZUl0ZW1zLm1hcChpZCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSB0eXBlID09PSAnY2xhc3MnID8gdGFibGVzLmNsYXNzZXMuZ2V0KGlkKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT09ICdtZXRob2QnID8gdGFibGVzLm1ldGhvZHMuZ2V0KGlkKSA6IHRhYmxlcy5maWVsZHMuZ2V0KGlkKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvID8gYDxsaT4ke2VzY2FwZUh0bWwoZm9ybWF0dGVyKHR5cGUgPT09ICdjbGFzcycgPyBpbmZvLmNsYXNzUmVmZXJlbmNlSWQgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09PSAnbWV0aG9kJyA/IGluZm8ubWV0aG9kUmVmZXJlbmNlSWQgOiBpbmZvLmZpZWxkUmVmZXJlbmNlSWQpKSl9PC9saT5gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYDxsaT5Vbmtub3duICR7dHlwZX0gSUQgJHtpZH08L2xpPmA7CiAgICAgICAgICAgICAgICAgICAgfSkuam9pbignJyl9CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgJHtoYXNNb3JlID8gYDxidXR0b24gY2xhc3M9InNob3ctbW9yZS1idG4iIG9uY2xpY2s9InNob3dNb3JlKCcke3R5cGV9JykiPlNob3cgbW9yZSAoJHtpdGVtcy5sZW5ndGggLSBsaW1pdH0gcmVtYWluaW5nKTwvYnV0dG9uPmAgOiAnJ30KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgYDsKICB9OwoKICBodG1sICs9IHJlbmRlclNlY3Rpb24oIk1hdGNoZWQgQ2xhc3NlcyIsIGJsYXN0UmFkaXVzLmNsYXNzQmxhc3RSYWRpdXMsICdjbGFzcycsIGZvcm1hdFR5cGVOYW1lLCAnYmFkZ2UtZ3JlZW4nLCBjdXJyZW50UnVsZVBhZ2luYXRpb24uY2xhc3Nlcyk7CiAgaHRtbCArPSByZW5kZXJTZWN0aW9uKCJNYXRjaGVkIE1ldGhvZHMiLCBibGFzdFJhZGl1cy5tZXRob2RCbGFzdFJhZGl1cywgJ21ldGhvZCcsIGZvcm1hdE1ldGhvZE5hbWUsICdiYWRnZS1ibHVlJywgY3VycmVudFJ1bGVQYWdpbmF0aW9uLm1ldGhvZHMpOwogIGh0bWwgKz0gcmVuZGVyU2VjdGlvbigiTWF0Y2hlZCBGaWVsZHMiLCBibGFzdFJhZGl1cy5maWVsZEJsYXN0UmFkaXVzLCAnZmllbGQnLCBmb3JtYXRGaWVsZE5hbWUsICdiYWRnZS1yZWQnLCBjdXJyZW50UnVsZVBhZ2luYXRpb24uZmllbGRzKTsKCiAgcmV0dXJuIGh0bWw7Cn0KCmZ1bmN0aW9uIHNob3dNb3JlKHR5cGUpIHsKICBpZiAodHlwZSA9PT0gJ2NsYXNzJykgY3VycmVudFJ1bGVQYWdpbmF0aW9uLmNsYXNzZXMgKz0gMTAwOwogIGVsc2UgaWYgKHR5cGUgPT09ICdtZXRob2QnKSBjdXJyZW50UnVsZVBhZ2luYXRpb24ubWV0aG9kcyArPSAxMDA7CiAgZWxzZSBpZiAodHlwZSA9PT0gJ2ZpZWxkJykgY3VycmVudFJ1bGVQYWdpbmF0aW9uLmZpZWxkcyArPSAxMDA7CgogIGlmIChjdXJyZW50U2VsZWN0ZWRSdWxlKSB7CiAgICByZW5kZXJSdWxlRGV0YWlsKGN1cnJlbnRTZWxlY3RlZFJ1bGUpOwogIH0KfQoKZnVuY3Rpb24gZmlsdGVyVW51c2VkUnVsZXMocXVlcnkpIHsKICBjb25zdCBydWxlcyA9IGNvbnRhaW5lckRhdGEua2VlcFJ1bGVCbGFzdFJhZGl1c1RhYmxlIHx8IFtdOwogIGNvbnN0IGxvd2VyUXVlcnkgPSBxdWVyeS50b0xvd2VyQ2FzZSgpOwoKICBmaWx0ZXJlZFJ1bGVzID0gcnVsZXMuZmlsdGVyKHIgPT4KICAgIHIudG90YWxSYWRpdXMgPT09IDAgJiYgci5zb3VyY2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlclF1ZXJ5KQogICk7CgogIC8vIEZvciB1bnVzZWQgcnVsZXMsIHNvcnQgYnkgc291cmNlIHRleHQKICBmaWx0ZXJlZFJ1bGVzLnNvcnQoKGEsIGIpID0+IGEuc291cmNlLmxvY2FsZUNvbXBhcmUoYi5zb3VyY2UpKTsKICByZW5kZXJSdWxlTGlzdCgpOwp9CgpmdW5jdGlvbiBmaWx0ZXJSZWR1bmRhbnRSdWxlcyhxdWVyeSkgewogIGNvbnN0IHJ1bGVzID0gY29udGFpbmVyRGF0YS5rZWVwUnVsZUJsYXN0UmFkaXVzVGFibGUgfHwgW107CiAgY29uc3QgbG93ZXJRdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7CgogIGZpbHRlcmVkUnVsZXMgPSBydWxlcy5maWx0ZXIociA9PgogICAgci5ibGFzdFJhZGl1cy5zdWJzdW1lZEJ5ICYmIHIuYmxhc3RSYWRpdXMuc3Vic3VtZWRCeS5sZW5ndGggPiAwICYmCiAgICByLnNvdXJjZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyUXVlcnkpCiAgKTsKCiAgZmlsdGVyZWRSdWxlcy5zb3J0KChhLCBiKSA9PiBiLnRvdGFsUmFkaXVzIC0gYS50b3RhbFJhZGl1cyk7CiAgcmVuZGVyUnVsZUxpc3QoKTsKfQoKZnVuY3Rpb24gbmF2aWdhdGVUb1J1bGUocnVsZUlkKSB7CiAgY29uc3QgcnVsZSA9IHRhYmxlcy5ydWxlcy5nZXQoTnVtYmVyKHJ1bGVJZCkpOwogIGlmICghcnVsZSkgcmV0dXJuOwoKICBzd2l0Y2hWaWV3KCdydWxlcycsIHRydWUpOwogIGNvbnN0IGVsZW1lbnQgPSBydWxlTGlzdC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ydWxlLWlkPSIke3J1bGUuaWR9Il1gKTsKICBpZiAoZWxlbWVudCkgewogICAgc2VsZWN0UnVsZShydWxlLCBlbGVtZW50KTsKICAgIGVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcgfSk7CiAgfQp9CgpmdW5jdGlvbiBzd2l0Y2hWaWV3KHZpZXcsIHByZXNlcnZlRGV0YWlsID0gZmFsc2UpIHsKICBjdXJyZW50VmlldyA9IHZpZXc7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhYi1idXR0b24nKS5mb3JFYWNoKGJ0biA9PiB7CiAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgYnRuLmdldEF0dHJpYnV0ZSgnb25jbGljaycpLmluY2x1ZGVzKGAnJHt2aWV3fSdgKSk7CiAgfSk7CgogIHNlYXJjaElucHV0LnZhbHVlID0gIiI7CiAgc2VhcmNoSW5wdXQucGxhY2Vob2xkZXIgPSB2aWV3ID09PSAnZmlsZXMnID8gIlNlYXJjaCBmaWxlcy4uLiIgOiAiU2VhcmNoIGtlZXAgcnVsZXMuLi4iOwoKICBpZiAoY29udGFpbmVyRGF0YSkgewogICAgaWYgKHZpZXcgPT09ICdydWxlcycpIHsKICAgICAgZmlsdGVyUnVsZXMoIiIpOwogICAgICBpZiAoIXByZXNlcnZlRGV0YWlsKSB7CiAgICAgICAgcmVuZGVyU3RhdHNPdmVydmlldygpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHZpZXcgPT09ICd1bnVzZWQnKSB7CiAgICAgIGZpbHRlclVudXNlZFJ1bGVzKCIiKTsKICAgICAgbWFpbkNvbnRlbnQuaW5uZXJIVE1MID0gJyc7CiAgICB9IGVsc2UgaWYgKHZpZXcgPT09ICdyZWR1bmRhbnQnKSB7CiAgICAgIGZpbHRlclJlZHVuZGFudFJ1bGVzKCIiKTsKICAgICAgbWFpbkNvbnRlbnQuaW5uZXJIVE1MID0gJyc7CiAgICB9IGVsc2UgaWYgKHZpZXcgPT09ICdmaWxlcycpIHsKICAgICAgZmlsdGVyRmlsZXMoIiIpOwogICAgICBtYWluQ29udGVudC5pbm5lckhUTUwgPSAnJzsKICAgIH0KICB9IGVsc2UgewogICAgcmVuZGVyV2VsY29tZU1lc3NhZ2UoKTsKICB9Cn0KCmZ1bmN0aW9uIHN3aXRjaFN1YlZpZXcoc3ViVmlldykgewogIGN1cnJlbnRTdWJWaWV3ID0gc3ViVmlldzsKICBpZiAoY3VycmVudFNlbGVjdGVkUnVsZSkgewogICAgcmVuZGVyUnVsZURldGFpbChjdXJyZW50U2VsZWN0ZWRSdWxlKTsKICB9Cn0KCmZ1bmN0aW9uIHJlbmRlclN0YXRzT3ZlcnZpZXcoKSB7CiAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtb3ZlcnZpZXctdGVtcGxhdGUnKTsKICBtYWluQ29udGVudC5pbm5lckhUTUwgPSAnJzsKICBtYWluQ29udGVudC5hcHBlbmRDaGlsZCh0ZW1wbGF0ZS5jb250ZW50LmNsb25lTm9kZSh0cnVlKSk7CiAgcmVuZGVyU3RhdHMoKTsKfQoKZnVuY3Rpb24gcmVuZGVyV2VsY29tZU1lc3NhZ2UoKSB7CiAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VsY29tZS1tZXNzYWdlLXRlbXBsYXRlJyk7CiAgaWYgKHRlbXBsYXRlKSB7CiAgICBtYWluQ29udGVudC5pbm5lckhUTUwgPSAnJzsKICAgIG1haW5Db250ZW50LmFwcGVuZENoaWxkKHRlbXBsYXRlLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpKTsKICB9Cn0KCmZ1bmN0aW9uIHJlbmRlckxvYWRpbmcoKSB7CiAgbWFpbkNvbnRlbnQuaW5uZXJIVE1MID0gYAogICAgPGRpdiBpZD0ibG9hZGluZy1zY3JlZW4iPgogICAgICA8ZGl2IGNsYXNzPSJzcGlubmVyIj48L2Rpdj4KICAgICAgPHA+UHJvY2Vzc2luZyBkYXRhLi4uPC9wPgogICAgPC9kaXY+CiAgYDsKfQoKZnVuY3Rpb24gZm9ybWF0VHlwZU5hbWUodHlwZUlkKSB7CiAgY29uc3QgdHlwZSA9IHRhYmxlcy50eXBlcy5nZXQodHlwZUlkKTsKICBpZiAoIXR5cGUpIHJldHVybiAiVW5rbm93biI7CiAgcmV0dXJuIGZvcm1hdERlc2NyaXB0b3IodHlwZS5qYXZhRGVzY3JpcHRvcik7Cn0KCmZ1bmN0aW9uIGZvcm1hdERlc2NyaXB0b3IoZGVzYykgewogIGlmICghZGVzYykgcmV0dXJuICIiOwogIGxldCBkaW1lbnNpb25zID0gMDsKICB3aGlsZSAoZGVzY1tkaW1lbnNpb25zXSA9PT0gJ1snKSB7CiAgICBkaW1lbnNpb25zKys7CiAgfQogIGxldCBiYXNlID0gZGVzYy5zdWJzdHJpbmcoZGltZW5zaW9ucyk7CiAgbGV0IHJlcyA9ICIiOwogIGlmIChiYXNlLnN0YXJ0c1dpdGgoJ0wnKSAmJiBiYXNlLmVuZHNXaXRoKCc7JykpIHsKICAgIHJlcyA9IGJhc2Uuc3Vic3RyaW5nKDEsIGJhc2UubGVuZ3RoIC0gMSkucmVwbGFjZSgvXC8vZywgJy4nKTsKICB9IGVsc2UgaWYgKGJhc2UubGVuZ3RoID09PSAxKSB7CiAgICBzd2l0Y2ggKGJhc2VbMF0pIHsKICAgICAgY2FzZSAnVic6CiAgICAgICAgcmVzID0gInZvaWQiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdaJzoKICAgICAgICByZXMgPSAiYm9vbGVhbiI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ0InOgogICAgICAgIHJlcyA9ICJieXRlIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnUyc6CiAgICAgICAgcmVzID0gInNob3J0IjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnQyc6CiAgICAgICAgcmVzID0gImNoYXIiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdJJzoKICAgICAgICByZXMgPSAiaW50IjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnSic6CiAgICAgICAgcmVzID0gImxvbmciOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdGJzoKICAgICAgICByZXMgPSAiZmxvYXQiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdEJzoKICAgICAgICByZXMgPSAiZG91YmxlIjsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXMgPSBiYXNlOwogICAgfQogIH0gZWxzZSB7CiAgICByZXMgPSBiYXNlOwogIH0KICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbnM7IGkrKykgewogICAgcmVzICs9ICJbXSI7CiAgfQogIHJldHVybiByZXM7Cn0KCmZ1bmN0aW9uIGZvcm1hdE1ldGhvZE5hbWUobWV0aG9kUmVmSWQpIHsKICBjb25zdCByZWYgPSB0YWJsZXMubWV0aG9kUmVmcy5nZXQobWV0aG9kUmVmSWQpOwogIGlmICghcmVmKSByZXR1cm4gIlVua25vd24gbWV0aG9kIjsKICBjb25zdCBjbGFzc05hbWUgPSBmb3JtYXRUeXBlTmFtZShyZWYuY2xhc3NSZWZlcmVuY2VJZCk7CiAgY29uc3QgcHJvdG8gPSB0YWJsZXMucHJvdG9zLmdldChyZWYucHJvdG9SZWZlcmVuY2VJZCk7CiAgbGV0IHBhcmFtcyA9ICIiOwogIGlmIChwcm90byAmJiBwcm90by5wYXJhbWV0ZXJzSWQpIHsKICAgIGNvbnN0IGxpc3QgPSB0YWJsZXMudHlwZUxpc3RzLmdldChwcm90by5wYXJhbWV0ZXJzSWQpOwogICAgaWYgKGxpc3QgJiYgbGlzdC50eXBlUmVmZXJlbmNlSWRzKSB7CiAgICAgIHBhcmFtcyA9IGxpc3QudHlwZVJlZmVyZW5jZUlkcy5tYXAoaWQgPT4gZm9ybWF0VHlwZU5hbWUoaWQpKS5qb2luKCcsICcpOwogICAgfQogIH0KICBjb25zdCByZXR1cm5UeXBlID0gcHJvdG8gPyBmb3JtYXRUeXBlTmFtZShwcm90by5yZXR1cm5UeXBlSWQpIDogIiI7CiAgcmV0dXJuIGAke3JldHVyblR5cGV9ICR7Y2xhc3NOYW1lfS4ke3JlZi5uYW1lfSgke3BhcmFtc30pYDsKfQoKZnVuY3Rpb24gZm9ybWF0RmllbGROYW1lKGZpZWxkUmVmSWQpIHsKICBjb25zdCByZWYgPSB0YWJsZXMuZmllbGRSZWZzLmdldChmaWVsZFJlZklkKTsKICBpZiAoIXJlZikgcmV0dXJuICJVbmtub3duIGZpZWxkIjsKICBjb25zdCBjbGFzc05hbWUgPSBmb3JtYXRUeXBlTmFtZShyZWYuY2xhc3NSZWZlcmVuY2VJZCk7CiAgY29uc3QgdHlwZSA9IGZvcm1hdFR5cGVOYW1lKHJlZi50eXBlUmVmZXJlbmNlSWQpOwogIHJldHVybiBgJHt0eXBlfSAke2NsYXNzTmFtZX0uJHtyZWYubmFtZX1gOwp9CgpmdW5jdGlvbiBnZXRGaWxlTmFtZShvcmlnaW4pIHsKICBpZiAoIW9yaWdpbikgcmV0dXJuICJVbmtub3duIjsKICBjb25zdCBmaWxlT3JpZ2luID0gdGFibGVzLm9yaWdpbnMuZ2V0KG9yaWdpbi5maWxlT3JpZ2luSWQpOwogIHJldHVybiBmaWxlT3JpZ2luID8gZmlsZU9yaWdpbi5maWxlbmFtZSA6ICJVbmtub3duIjsKfQoKZnVuY3Rpb24gZ2V0TWF2ZW5Db29yZGluYXRlKG9yaWdpbikgewogIGlmICghb3JpZ2luKSByZXR1cm4gbnVsbDsKICBjb25zdCBmaWxlT3JpZ2luID0gdGFibGVzLm9yaWdpbnMuZ2V0KG9yaWdpbi5maWxlT3JpZ2luSWQpOwogIHJldHVybiBmaWxlT3JpZ2luPy5tYXZlbkNvb3JkaW5hdGU7Cn0KCmZ1bmN0aW9uIGdldE1hdmVuQ29vcmRpbmF0ZVN0cmluZyhtYXZlbkNvb3JkaW5hdGUpIHsKICByZXR1cm4gbWF2ZW5Db29yZGluYXRlLmdyb3VwSWQgKyAiOiIgKyBtYXZlbkNvb3JkaW5hdGUuYXJ0aWZhY3RJZCArICI6IiArIG1hdmVuQ29vcmRpbmF0ZS52ZXJzaW9uOwp9CgpmdW5jdGlvbiBnZXRPcmlnaW5TdHJpbmcob3JpZ2luKSB7CiAgaWYgKCFvcmlnaW4pIHJldHVybiAiVW5rbm93biI7CiAgY29uc3QgbWF2ZW5Db29yZGluYXRlID0gZ2V0TWF2ZW5Db29yZGluYXRlKG9yaWdpbik7CiAgaWYgKG1hdmVuQ29vcmRpbmF0ZSkgewogICAgcmV0dXJuIGdldE1hdmVuQ29vcmRpbmF0ZVN0cmluZyhtYXZlbkNvb3JkaW5hdGUpOwogIH0KICBjb25zdCBuYW1lID0gZ2V0RmlsZU5hbWUob3JpZ2luKTsKICBsZXQgcmVzID0gbmFtZTsKICBpZiAob3JpZ2luLmxpbmVOdW1iZXIpIHsKICAgIHJlcyArPSAiOiIgKyBvcmlnaW4ubGluZU51bWJlcjsKICAgIGlmIChvcmlnaW4uY29sdW1uTnVtYmVyKSByZXMgKz0gIjoiICsgb3JpZ2luLmNvbHVtbk51bWJlcjsKICB9CiAgcmV0dXJuIHJlczsKfQoKZnVuY3Rpb24gZXNjYXBlSHRtbCh0ZXh0KSB7CiAgaWYgKCF0ZXh0KSByZXR1cm4gIiI7CiAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgZGl2LnRleHRDb250ZW50ID0gdGV4dDsKICByZXR1cm4gZGl2LmlubmVySFRNTDsKfQoKZnVuY3Rpb24gZm9ybWF0U3RhdHNCcmVha2Rvd24oY2xhc3NlcywgbWV0aG9kcywgZmllbGRzKSB7CiAgY29uc3QgcGFydHMgPSBbXTsKICBpZiAoY2xhc3NlcyA+IDApIHBhcnRzLnB1c2goYCR7Y2xhc3Nlc30gY2xhc3Mke2NsYXNzZXMgIT09IDEgPyAnZXMnIDogJyd9YCk7CiAgaWYgKG1ldGhvZHMgPiAwKSBwYXJ0cy5wdXNoKGAke21ldGhvZHN9IG1ldGhvZCR7bWV0aG9kcyAhPT0gMSA/ICdzJyA6ICcnfWApOwogIGlmIChmaWVsZHMgPiAwKSBwYXJ0cy5wdXNoKGAke2ZpZWxkc30gZmllbGQke2ZpZWxkcyAhPT0gMSA/ICdzJyA6ICcnfWApOwogIHJldHVybiBwYXJ0cy5sZW5ndGggPiAwID8gYCgke3BhcnRzLmpvaW4oJywgJyl9KWAgOiAnJzsKfQoKaWYgKCFjb250YWluZXJEYXRhICYmICFlbWJlZGRlZFByb3RvRGF0YVNvdXJjZSkgewogIHJlbmRlcldlbGNvbWVNZXNzYWdlKCk7CiAgZHJvcFpvbmUuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7Cn0KPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgo="); |
| } |
| |
| public static String getSummaryHtmlTemplate() { |
| return decodeBase64( |
| "PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8dGl0bGU+Qmxhc3QgUmFkaXVzIFN1bW1hcnkgUmVwb3J0czwvdGl0bGU+CiAgICA8c3R5bGU+Ym9keSB7CiAgICBmb250LWZhbWlseTogJ1JvYm90bycsIHNhbnMtc2VyaWY7CiAgICBwYWRkaW5nOiAycmVtOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsKICAgIG1hcmdpbjogMDsKICAgIGNvbG9yOiAjMzMzOwp9Ci5jb250YWluZXIgewogICAgbWF4LXdpZHRoOiAxMjAwcHg7CiAgICBtYXJnaW46IDAgYXV0bzsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgcGFkZGluZzogMnJlbTsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsMCwwLDAuMSk7Cn0KaDEgewogICAgY29sb3I6ICMzZjUxYjU7CiAgICBtYXJnaW4tdG9wOiAwOwp9CnRhYmxlIHsKICAgIHdpZHRoOiAxMDAlOwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIG1hcmdpbi10b3A6IDFyZW07Cn0KdGgsIHRkIHsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBwYWRkaW5nOiAxMnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7Cn0KdGggewogICAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjlmYTsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBjb2xvcjogIzU1NTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CnRoOmxhc3QtY2hpbGQgewogICAgY3Vyc29yOiBkZWZhdWx0Owp9CnRoOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmMGYxZjI7Cn0KdHI6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZmNmYzsKfQoucmVwb3J0LWxpbmsgewogICAgY29sb3I6ICMxYTczZTg7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBmb250LXdlaWdodDogNTAwOwp9Ci5yZXBvcnQtbGluazpob3ZlciB7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQouc3RhdC1iYWRnZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZThmNWU5OwogICAgY29sb3I6ICMyZTdkMzI7CiAgICBwYWRkaW5nOiAycHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGZvbnQtc2l6ZTogMC44cmVtOwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIG1hcmdpbi1yaWdodDogNHB4Owp9Ci5zdGF0LWJhZGdlLndhcm4gewogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjNlMDsKICAgIGNvbG9yOiAjZWY2YzAwOwp9Ci5zdGF0LWJhZGdlLmVycm9yIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmViZWU7CiAgICBjb2xvcjogI2M2MjgyODsKfQoubmFtZS1yb3cgdGQgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjlmYTsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBjb2xvcjogIzNmNTFiNTsKICAgIHBhZGRpbmctdG9wOiAxcmVtOwogICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTsKICAgIGJvcmRlci1ib3R0b206IG5vbmU7Cn0KLmRhdGEtcm93IHRkIHsKICAgIHBhZGRpbmctYm90dG9tOiAxcmVtOwogICAgYm9yZGVyLXRvcDogbm9uZTsKfQo8L3N0eWxlPgogICAgPGxpbmsgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1Sb2JvdG86d2dodEAzMDA7NDAwOzUwMDs3MDAmZGlzcGxheT1zd2FwIiByZWw9InN0eWxlc2hlZXQiPgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vcHJvdG9idWZqc0A3LjIuNC9kaXN0L3Byb3RvYnVmLm1pbi5qcyI+PC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHk+CiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgIDxoMT5CbGFzdCBSYWRpdXMgUmVwb3J0czwvaDE+CiAgICAgICAgPGRpdiBpZD0idGFibGUtY29udGFpbmVyIj4KICAgICAgICAgICAgPHRhYmxlPgogICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGRhdGEtc29ydD0icnVsZXMiPktlZXAgUnVsZXM8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8dGggZGF0YS1zb3J0PSJpdGVtcyI+S2VwdCBJdGVtczwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLXNvcnQ9ImNsYXNzZXMiPktlcHQgQ2xhc3NlczwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLXNvcnQ9Im1ldGhvZHMiPktlcHQgTWV0aG9kczwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLXNvcnQ9ImZpZWxkcyI+S2VwdCBGaWVsZHM8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8dGg+UHJvYmxlbWF0aWMgUnVsZXM8L3RoPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgPHRib2R5IGlkPSJzdW1tYXJ5LXRhYmxlLWJvZHkiPgogICAgICAgICAgICAgICAgICAgIDwhLS0gSmF2YVNjcmlwdCB3aWxsIHBvcHVsYXRlIHRoaXMgLS0+CiAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHNjcmlwdCBpZD0iYmxhc3RyYWRpdXMtcHJvdG8iIHR5cGU9InRleHQvcGxhaW4iPi8vIENvcHlyaWdodCAoYykgMjAyNiwgdGhlIFI4IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCnN5bnRheCA9ICJwcm90bzMiOwoKcGFja2FnZSBjb20uYW5kcm9pZC50b29scy5yOC5ibGFzdHJhZGl1cy5wcm90bzsKCi8vIERvbid0IHB1dCBhbGwgbWVzc2FnZXMgdW5kZXIgdGhlIG91dGVyIGNsYXNzLgpvcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7CgovLyBDYW1lbC1jYXNlIHRoZSBvdXRlciBjbGFzcyBuYW1lIChkZWZhdWx0IGlzIGBCbGFzdHJhZGl1c3N1bW1hcnlgKS4Kb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIkJsYXN0UmFkaXVzU3VtbWFyeVByb3RvcyI7CgovLyBKYXZhIHBhY2thZ2UgY29uc2lzdGVudCB3aXRoIFI4IGNvbnZlbnRpb24uCm9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmFuZHJvaWQudG9vbHMucjguYmxhc3RyYWRpdXMucHJvdG8iOwoKbWVzc2FnZSBCbGFzdFJhZGl1c1N1bW1hcnkgewogIC8vIE5hbWUgdGhhdCBpZGVudGlmaWVzIHRoZSBidWlsZC4KICBzdHJpbmcgbmFtZSA9IDE7CgogIC8vIExpbmsgdG8gdGhlIGZ1bGwgcmVwb3J0LgogIHN0cmluZyBsaW5rID0gMjsKCiAgLy8gSW5mbyBhYm91dCBudW1iZXIgb2YgaXRlbXMuCiAgaW50MzIgY2xhc3NfY291bnQgPSAzOwogIGludDMyIGZpZWxkX2NvdW50ID0gNDsKICBpbnQzMiBtZXRob2RfY291bnQgPSA1OwoKICAvLyBJbmZvIGFib3V0IG51bWJlciBvZiBrZWVwIHJ1bGVzLgogIGludDMyIGtlZXBfcnVsZV9jb3VudCA9IDY7CiAgaW50MzIga2VlcF9ydWxlX3BhY2thZ2Vfd2lkZV9jb3VudCA9IDc7CgogIC8vIEluZm8gYWJvdXQgbnVtYmVyIG9mIGtlcHQgaXRlbXMuCiAgS2VlcEluZm9Db2xsZWN0aW9uU3VtbWFyeSBrZXB0X2NsYXNzZXMgPSA4OwogIEtlZXBJbmZvQ29sbGVjdGlvblN1bW1hcnkga2VwdF9maWVsZHMgPSA5OwogIEtlZXBJbmZvQ29sbGVjdGlvblN1bW1hcnkga2VwdF9tZXRob2RzID0gMTA7CgogIC8vIEluZm8gYWJvdXQgcHJvYmxlbWF0aWMgcnVsZXMuCiAgcmVwZWF0ZWQgS2VlcFJ1bGVCbGFzdFJhZGl1c1N1bW1hcnkga2VlcF9ydWxlX2JsYXN0X3JhZGl1cyA9IDExOwp9CgptZXNzYWdlIEtlZXBJbmZvQ29sbGVjdGlvblN1bW1hcnkgewogIGludDMyIGl0ZW1fY291bnQgPSAxOwogIGludDMyIG5vX29iZnVzY2F0aW9uX2NvdW50ID0gMjsKICBpbnQzMiBub19vcHRpbWl6YXRpb25fY291bnQgPSAzOwogIGludDMyIG5vX3Nocmlua2luZ19jb3VudCA9IDQ7Cn0KCm1lc3NhZ2UgS2VlcFJ1bGVCbGFzdFJhZGl1c1N1bW1hcnkgewogIHN0cmluZyBzb3VyY2UgPSAxOwogIGludDMyIGl0ZW1fY291bnQgPSAyOwp9Cjwvc2NyaXB0PgogICAgPHNjcmlwdCBpZD0iYmxhc3RyYWRpdXMtZGF0YSIgdHlwZT0iYXBwbGljYXRpb24vanNvbiI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0Pi8vIENvcHlyaWdodCAoYykgMjAyNiwgdGhlIFI4IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgooZnVuY3Rpb24oKSB7CiAgY29uc3QgcHJvdG9TY2hlbWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmxhc3RyYWRpdXMtcHJvdG8nKS50ZXh0Q29udGVudDsKICBjb25zdCBzdW1tYXJpZXNEYXRhID0gSlNPTi5wYXJzZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmxhc3RyYWRpdXMtZGF0YScpLnRleHRDb250ZW50KTsKICBjb25zdCB0YWJsZUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VtbWFyeS10YWJsZS1ib2R5Jyk7CiAgY29uc3QgaGVhZGVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoW2RhdGEtc29ydF0nKTsKCiAgY29uc3Qgcm9vdCA9IHByb3RvYnVmLnBhcnNlKHByb3RvU2NoZW1hKS5yb290OwogIGNvbnN0IEJsYXN0UmFkaXVzU3VtbWFyeSA9IHJvb3QubG9va3VwVHlwZSgiY29tLmFuZHJvaWQudG9vbHMucjguYmxhc3RyYWRpdXMucHJvdG8uQmxhc3RSYWRpdXNTdW1tYXJ5Iik7CgogIGxldCBzdW1tYXJpZXMgPSBbXTsKICBsZXQgY3VycmVudFNvcnQgPSB7CiAgICBrZXk6IG51bGwsCiAgICBkZXNjOiB0cnVlCiAgfTsKCiAgc3VtbWFyaWVzRGF0YS5mb3JFYWNoKHN1bW1hcnlCYXNlNjQgPT4gewogICAgdHJ5IHsKICAgICAgY29uc3QgYmluYXJ5ID0gYXRvYihzdW1tYXJ5QmFzZTY0KTsKICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnkubGVuZ3RoKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5hcnkubGVuZ3RoOyBpKyspIHsKICAgICAgICBieXRlc1tpXSA9IGJpbmFyeS5jaGFyQ29kZUF0KGkpOwogICAgICB9CiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBCbGFzdFJhZGl1c1N1bW1hcnkuZGVjb2RlKGJ5dGVzKTsKICAgICAgY29uc3Qgc3VtbWFyeSA9IEJsYXN0UmFkaXVzU3VtbWFyeS50b09iamVjdChtZXNzYWdlLCB7CiAgICAgICAgZGVmYXVsdHM6IHRydWUsCiAgICAgICAgZW51bXM6IFN0cmluZwogICAgICB9KTsKICAgICAgc3VtbWFyaWVzLnB1c2goc3VtbWFyeSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBkZWNvZGUgc3VtbWFyeToiLCBlKTsKICAgIH0KICB9KTsKCiAgZnVuY3Rpb24gcmVuZGVyVGFibGUoKSB7CiAgICB0YWJsZUJvZHkuaW5uZXJIVE1MID0gJyc7CiAgICBzdW1tYXJpZXMuZm9yRWFjaChyZW5kZXJSb3cpOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyUm93KHN1bW1hcnkpIHsKICAgIC8vIE5hbWUgcm93IChGdWxsIHdpZHRoKQogICAgY29uc3QgbmFtZVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKICAgIG5hbWVUci5jbGFzc05hbWUgPSAnbmFtZS1yb3cnOwogICAgY29uc3QgbmFtZVRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKICAgIG5hbWVUZC5jb2xTcGFuID0gNjsKICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICBsaW5rLmNsYXNzTmFtZSA9ICdyZXBvcnQtbGluayc7CiAgICBsaW5rLmhyZWYgPSBzdW1tYXJ5LmxpbmsgfHwgc3VtbWFyeS5uYW1lLnJlcGxhY2UoJy5wYicsICcuaHRtbCcpOwogICAgbGluay50ZXh0Q29udGVudCA9IHN1bW1hcnkubmFtZTsKICAgIG5hbWVUZC5hcHBlbmRDaGlsZChsaW5rKTsKICAgIG5hbWVUci5hcHBlbmRDaGlsZChuYW1lVGQpOwogICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5hbWVUcik7CgogICAgLy8gRGF0YSByb3cKICAgIGNvbnN0IGRhdGFUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CiAgICBkYXRhVHIuY2xhc3NOYW1lID0gJ2RhdGEtcm93JzsKCiAgICBjb25zdCBydWxlc1RkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKICAgIHJ1bGVzVGQudGV4dENvbnRlbnQgPSBzdW1tYXJ5LmtlZXBSdWxlQ291bnQgfHwgIjAiOwogICAgaWYgKHN1bW1hcnkua2VlcFJ1bGVQYWNrYWdlV2lkZUNvdW50ICYmIHN1bW1hcnkua2VlcFJ1bGVQYWNrYWdlV2lkZUNvdW50ICE9PSAwKSB7CiAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIHNwYW4uY2xhc3NOYW1lID0gJ3N0YXQtYmFkZ2Ugd2Fybic7CiAgICAgIHNwYW4udGV4dENvbnRlbnQgPSBgJHtzdW1tYXJ5LmtlZXBSdWxlUGFja2FnZVdpZGVDb3VudH0gcGFja2FnZS13aWRlYDsKICAgICAgc3Bhbi50aXRsZSA9ICJOdW1iZXIgb2Yga2VlcCBydWxlcyB0aGF0IGtlZXAgYW4gZW50aXJlIHBhY2thZ2UiOwogICAgICBydWxlc1RkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JyJykpOwogICAgICBydWxlc1RkLmFwcGVuZENoaWxkKHNwYW4pOwogICAgfQogICAgZGF0YVRyLmFwcGVuZENoaWxkKHJ1bGVzVGQpOwoKICAgIGNvbnN0IGl0ZW1zVGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogICAgY29uc3QgdG90YWxLZXB0ID0gKHN1bW1hcnkua2VwdENsYXNzZXM/Lml0ZW1Db3VudCB8fCAwKSArCiAgICAgIChzdW1tYXJ5LmtlcHRNZXRob2RzPy5pdGVtQ291bnQgfHwgMCkgKwogICAgICAoc3VtbWFyeS5rZXB0RmllbGRzPy5pdGVtQ291bnQgfHwgMCk7CiAgICBjb25zdCB0b3RhbEl0ZW1zID0gKHN1bW1hcnkuY2xhc3NDb3VudCB8fCAwKSArIChzdW1tYXJ5Lm1ldGhvZENvdW50IHx8IDApICsgKHN1bW1hcnkuZmllbGRDb3VudCB8fCAwKTsKICAgIGl0ZW1zVGQudGV4dENvbnRlbnQgPSBgJHt0b3RhbEtlcHR9IC8gJHt0b3RhbEl0ZW1zfWA7CiAgICBkYXRhVHIuYXBwZW5kQ2hpbGQoaXRlbXNUZCk7CgogICAgY29uc3QgY2xhc3Nlc1RkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKICAgIGNsYXNzZXNUZC5pbm5lckhUTUwgPSBmb3JtYXRLZWVwSW5mbyhzdW1tYXJ5LmtlcHRDbGFzc2VzLCBzdW1tYXJ5LmNsYXNzQ291bnQpOwogICAgZGF0YVRyLmFwcGVuZENoaWxkKGNsYXNzZXNUZCk7CgogICAgY29uc3QgbWV0aG9kc1RkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKICAgIG1ldGhvZHNUZC5pbm5lckhUTUwgPSBmb3JtYXRLZWVwSW5mbyhzdW1tYXJ5LmtlcHRNZXRob2RzLCBzdW1tYXJ5Lm1ldGhvZENvdW50KTsKICAgIGRhdGFUci5hcHBlbmRDaGlsZChtZXRob2RzVGQpOwoKICAgIGNvbnN0IGZpZWxkc1RkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKICAgIGZpZWxkc1RkLmlubmVySFRNTCA9IGZvcm1hdEtlZXBJbmZvKHN1bW1hcnkua2VwdEZpZWxkcywgc3VtbWFyeS5maWVsZENvdW50KTsKICAgIGRhdGFUci5hcHBlbmRDaGlsZChmaWVsZHNUZCk7CgogICAgY29uc3QgcHJvYmxlbWF0aWNUZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CiAgICBpZiAoc3VtbWFyeS5rZWVwUnVsZUJsYXN0UmFkaXVzICYmIHN1bW1hcnkua2VlcFJ1bGVCbGFzdFJhZGl1cy5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IHVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTsKICAgICAgdWwuc3R5bGUubWFyZ2luID0gJzAnOwogICAgICB1bC5zdHlsZS5wYWRkaW5nTGVmdCA9ICcwJzsKICAgICAgdWwuc3R5bGUubGlzdFN0eWxlVHlwZSA9ICdub25lJzsKICAgICAgdWwuc3R5bGUuZm9udFNpemUgPSAnMC45cmVtJzsKICAgICAgc3VtbWFyeS5rZWVwUnVsZUJsYXN0UmFkaXVzLmZvckVhY2gocnVsZSA9PiB7CiAgICAgICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgICAgIGxpLnN0eWxlLm1hcmdpbkJvdHRvbSA9ICc0cHgnOwoKICAgICAgICBjb25zdCBiYWRnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICBiYWRnZS5jbGFzc05hbWUgPSAnc3RhdC1iYWRnZSB3YXJuJzsKICAgICAgICBiYWRnZS50ZXh0Q29udGVudCA9IHJ1bGUuaXRlbUNvdW50OwogICAgICAgIGJhZGdlLnRpdGxlID0gIk51bWJlciBvZiBpdGVtcyBrZXB0IGJ5IHRoZSBydWxlLiI7CiAgICAgICAgYmFkZ2Uuc3R5bGUubWFyZ2luUmlnaHQgPSAnOHB4JzsKCiAgICAgICAgbGkuYXBwZW5kQ2hpbGQoYmFkZ2UpOwogICAgICAgIGNvbnN0IGNvZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgY29kZS5zdHlsZS5mb250RmFtaWx5ID0gJ21vbm9zcGFjZSc7CiAgICAgICAgY29kZS5zdHlsZS5mb250U2l6ZSA9ICcwLjg1cmVtJzsKICAgICAgICBjb2RlLnRleHRDb250ZW50ID0gcnVsZS5zb3VyY2U7CiAgICAgICAgbGkuYXBwZW5kQ2hpbGQoY29kZSk7CiAgICAgICAgdWwuYXBwZW5kQ2hpbGQobGkpOwogICAgICB9KTsKICAgICAgcHJvYmxlbWF0aWNUZC5hcHBlbmRDaGlsZCh1bCk7CiAgICB9IGVsc2UgewogICAgICBwcm9ibGVtYXRpY1RkLnRleHRDb250ZW50ID0gIi0iOwogICAgfQogICAgZGF0YVRyLmFwcGVuZENoaWxkKHByb2JsZW1hdGljVGQpOwoKICAgIHRhYmxlQm9keS5hcHBlbmRDaGlsZChkYXRhVHIpOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0S2VlcEluZm8oa2VlcEluZm8sIHRvdGFsKSB7CiAgICBpZiAoIWtlZXBJbmZvKSByZXR1cm4gIjAgLyAiICsgKHRvdGFsIHx8IDApOwogICAgY29uc3Qga2VwdCA9IGtlZXBJbmZvLml0ZW1Db3VudCB8fCAwOwogICAgbGV0IGJhZGdlcyA9ICIiOwogICAgaWYgKGtlZXBJbmZvLm5vT2JmdXNjYXRpb25Db3VudCA+IDApIHsKICAgICAgYmFkZ2VzICs9IGA8c3BhbiBjbGFzcz0ic3RhdC1iYWRnZSIgdGl0bGU9Ik5vIG9iZnVzY2F0aW9uIj4ke2tlZXBJbmZvLm5vT2JmdXNjYXRpb25Db3VudCB8fCAwfSBPQkY8L3NwYW4+YDsKICAgIH0KICAgIGlmIChrZWVwSW5mby5ub09wdGltaXphdGlvbkNvdW50ID4gMCkgewogICAgICBiYWRnZXMgKz0gYDxzcGFuIGNsYXNzPSJzdGF0LWJhZGdlIHdhcm4iIHRpdGxlPSJObyBvcHRpbWl6YXRpb24iPiR7a2VlcEluZm8ubm9PcHRpbWl6YXRpb25Db3VudCB8fCAwfSBPUFQ8L3NwYW4+YDsKICAgIH0KICAgIGlmIChrZWVwSW5mby5ub1Nocmlua2luZ0NvdW50ID4gMCkgewogICAgICBiYWRnZXMgKz0gYDxzcGFuIGNsYXNzPSJzdGF0LWJhZGdlIGVycm9yIiB0aXRsZT0iTm8gc2hyaW5raW5nIj4ke2tlZXBJbmZvLm5vU2hyaW5raW5nQ291bnQgfHwgMH0gU0hSPC9zcGFuPmA7CiAgICB9CiAgICByZXR1cm4gYCR7a2VwdH0gLyAke3RvdGFsIHx8IDB9PGJyPiR7YmFkZ2VzfWA7CiAgfQoKICBmdW5jdGlvbiBzb3J0U3VtbWFyaWVzKGtleSkgewogICAgaWYgKGN1cnJlbnRTb3J0LmtleSA9PT0ga2V5KSB7CiAgICAgIGN1cnJlbnRTb3J0LmRlc2MgPSAhY3VycmVudFNvcnQuZGVzYzsKICAgIH0gZWxzZSB7CiAgICAgIGN1cnJlbnRTb3J0LmtleSA9IGtleTsKICAgICAgY3VycmVudFNvcnQuZGVzYyA9IHRydWU7CiAgICB9CgogICAgc3VtbWFyaWVzLnNvcnQoKGEsIGIpID0+IHsKICAgICAgbGV0IHZhbEEsIHZhbEI7CiAgICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgICAgY2FzZSAncnVsZXMnOgogICAgICAgICAgdmFsQSA9IGEua2VlcFJ1bGVDb3VudCB8fCAwOwogICAgICAgICAgdmFsQiA9IGIua2VlcFJ1bGVDb3VudCB8fCAwOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnaXRlbXMnOgogICAgICAgICAgdmFsQSA9IChhLmtlcHRDbGFzc2VzPy5pdGVtQ291bnQgfHwgMCkgKyAoYS5rZXB0TWV0aG9kcz8uaXRlbUNvdW50IHx8IDApICsgKGEua2VwdEZpZWxkcz8uaXRlbUNvdW50IHx8IDApOwogICAgICAgICAgdmFsQiA9IChiLmtlcHRDbGFzc2VzPy5pdGVtQ291bnQgfHwgMCkgKyAoYi5rZXB0TWV0aG9kcz8uaXRlbUNvdW50IHx8IDApICsgKGIua2VwdEZpZWxkcz8uaXRlbUNvdW50IHx8IDApOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnY2xhc3Nlcyc6CiAgICAgICAgICB2YWxBID0gKGEua2VwdENsYXNzZXMgJiYgYS5rZXB0Q2xhc3Nlcy5pdGVtQ291bnQpIHx8IDA7CiAgICAgICAgICB2YWxCID0gKGIua2VwdENsYXNzZXMgJiYgYi5rZXB0Q2xhc3Nlcy5pdGVtQ291bnQpIHx8IDA7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdtZXRob2RzJzoKICAgICAgICAgIHZhbEEgPSAoYS5rZXB0TWV0aG9kcyAmJiBhLmtlcHRNZXRob2RzLml0ZW1Db3VudCkgfHwgMDsKICAgICAgICAgIHZhbEIgPSAoYi5rZXB0TWV0aG9kcyAmJiBiLmtlcHRNZXRob2RzLml0ZW1Db3VudCkgfHwgMDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2ZpZWxkcyc6CiAgICAgICAgICB2YWxBID0gKGEua2VwdEZpZWxkcyAmJiBhLmtlcHRGaWVsZHMuaXRlbUNvdW50KSB8fCAwOwogICAgICAgICAgdmFsQiA9IChiLmtlcHRGaWVsZHMgJiYgYi5rZXB0RmllbGRzLml0ZW1Db3VudCkgfHwgMDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICByZXR1cm4gY3VycmVudFNvcnQuZGVzYyA/IHZhbEIgLSB2YWxBIDogdmFsQSAtIHZhbEI7CiAgICB9KTsKCiAgICByZW5kZXJUYWJsZSgpOwogICAgdXBkYXRlSGVhZGVyU3R5bGVzKCk7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVIZWFkZXJTdHlsZXMoKSB7CiAgICBoZWFkZXJzLmZvckVhY2godGggPT4gewogICAgICBjb25zdCBrZXkgPSB0aC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc29ydCcpOwogICAgICB0aC5pbm5lckhUTUwgPSB0aC50ZXh0Q29udGVudC5yZXBsYWNlKC8gW+KWsuKWvF0vLCAnJyk7CiAgICAgIGlmIChrZXkgPT09IGN1cnJlbnRTb3J0LmtleSkgewogICAgICAgIHRoLmlubmVySFRNTCArPSBjdXJyZW50U29ydC5kZXNjID8gJyDilrwnIDogJyDilrInOwogICAgICB9CiAgICB9KTsKICB9CgogIGhlYWRlcnMuZm9yRWFjaCh0aCA9PiB7CiAgICB0aC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgICAgc29ydFN1bW1hcmllcyh0aC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc29ydCcpKTsKICAgIH0pOwogIH0pOwoKICBzb3J0U3VtbWFyaWVzKCdpdGVtcycpOwp9KSgpOzwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K"); |
| } |
| |
| private static String decodeBase64(String string) { |
| return new String(Base64.getDecoder().decode(string), StandardCharsets.UTF_8); |
| } |
| } |