PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XNEMvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+CjxodG1sPgo8aGVhZD4KCiAgICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+CgogICAgPHRpdGxlPk9wZW5PZmZpY2Uub3JnIENvbmZlcmVuY2UgMjAwNjwvdGl0bGU+CgogICAgPCEtLSBJbmNsdWRlIHRoZSBjb21tb24gQ1NTIHN0eWxlc2hlZXQgLS0+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJkZWZhdWx0LmNzcyIgLz4KICAKICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgICAgLm5vdGUgLm5hbWUgewogICAgICAgICAgICBjb2xvcjogIzAzMjM2MDsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogc21hbGxlcjsKICAgICAgICB9CgogICAgICAgIC5ub3RlIC5uYW1lIGEgewogICAgICAgICAgICBjb2xvcjogIzAzMjM2MDsKICAgICAgICB9CgogICAgICAgIC5ub3RlIC5pbmZvIHsKICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDAuNWVtOwogICAgICAgICAgICBmb250LXNpemU6IHNtYWxsZXI7CiAgICAgICAgfQogICAgPC9zdHlsZT4KIAogICAgPHNjcmlwdCBzcmM9Imh0dHA6Ly9tYXBzLmdvb2dsZS5jb20vbWFwcz9maWxlPWFwaSZhbXA7dj0yJmFtcDtrZXk9QUJRSUFBQUFrdXpaYWZ1TThHR180Q01FblYxVG14U0NOYVh5ZnVacjBVd3pJeHFPVWcxZ09qd3BZaFRLR3prajhCZmZSd0J0TzRTMFJBVllyU3dYekEiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgogICAgLy88IVtDREFUQVsKCiAgICB2YXIgbWFya2VycyA9IG5ldyBPYmplY3QoKTsKICAgIHZhciBtYXA7CgogICAgLy8gQ3JlYXRlIHRoZSAiSG90ZWwiIG1hcmtlciBpY29uCiAgICB2YXIgaG90ZWwgPSBuZXcgR0ljb24oKTsKICAgIGhvdGVsLmltYWdlID0gImltZy9ob3RlbC5naWYiOwogICAgaG90ZWwuaWNvblNpemUgPSBuZXcgR1NpemUoMjAsIDIwKTsKICAgIGhvdGVsLmljb25BbmNob3IgPSBuZXcgR1BvaW50KDEwLCAxMCk7CiAgICBob3RlbC5pbmZvV2luZG93QW5jaG9yID0gbmV3IEdQb2ludCgxMCwgMTApOwogICAgICAgCiAgICAvLyBDcmVhdGUgdGhlICJsb2dvYWoiIG1hcmtlciBpY29uCiAgICB2YXIgbG9nb2FqID0gbmV3IEdJY29uKCk7CiAgICBsb2dvYWouaW1hZ2UgPSAiaW1nL2xvZ29hai5naWYiOwogICAgbG9nb2FqLmljb25TaXplID0gbmV3IEdTaXplKDIwLCAyMCk7CiAgICBsb2dvYWouaWNvbkFuY2hvciA9IG5ldyBHUG9pbnQoMTAsIDEwKTsKICAgIGxvZ29hai5pbmZvV2luZG93QW5jaG9yID0gbmV3IEdQb2ludCgxMCwgMTApOwogICAgICAgIAogICAgLy8gQ3JlYXRlIHRoZSAiUmVzdG8iIG1hcmtlciBpY29uCiAgICB2YXIgcmVzdG8gPSBuZXcgR0ljb24oKTsKICAgIHJlc3RvLmltYWdlID0gImltZy9yZXN0by5naWYiOwogICAgcmVzdG8uaWNvblNpemUgPSBuZXcgR1NpemUoMjAsIDIwKTsKICAgIHJlc3RvLmljb25BbmNob3IgPSBuZXcgR1BvaW50KDEwLCAxMCk7CiAgICByZXN0by5pbmZvV2luZG93QW5jaG9yID0gbmV3IEdQb2ludCgxMCwgMTApOwoKICAgIC8vIERlZmluaXRpb24gb2YgSG90ZWwgTWFya2VyCiAgICBmdW5jdGlvbiBIb3RlbChpZCwgcG9pbnQsIG5hbWUsIGFkZHJlc3MsIGNpdHksIG9wdF9waG9uZSwgb3B0X3VybCwgb3B0X2ljb24pIHsKICAgICAgICBHTWFya2VyLmNhbGwodGhpcywgcG9pbnQsIG9wdF9pY29uIHx8IGhvdGVsKTsKCiAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKICAgICAgICB0aGlzLmNpdHkgPSBjaXR5OwogICAgICAgIHRoaXMucGhvbmUgPSBvcHRfcGhvbmU7CiAgICAgICAgdGhpcy51cmwgPSBvcHRfdXJsOwoKICAgICAgICB0aGlzLmNsaWNraGFuZGxlciA9IEdFdmVudC5hZGRMaXN0ZW5lcih0aGlzLCAnY2xpY2snLCB0aGlzLm9wZW5JbmZvV2luZG93KTsKICAgIH0KCiAgICBIb3RlbC5wcm90b3R5cGUgPSBuZXcgR01hcmtlcihuZXcgR0xhdExuZygwLCAwKSk7CgogICAgSG90ZWwucHJvdG90eXBlLm9wZW5JbmZvV2luZG93ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHRleHQgPSAnPGRpdiBjbGFzcz0ibm90ZSI+JzsKICAgICAgICB0ZXh0ID0gdGV4dCArICc8cCBjbGFzcz0ibmFtZSI+JzsKCiAgICAgICAgaWYgKHRoaXMudXJsKSB7CiAgICAgICAgICAgIHRleHQgPSB0ZXh0ICsgJzxhIGhyZWY9IicgKyB0aGlzLnVybCArICciPic7CiAgICAgICAgfQogICAgICAgIHRleHQgKz0gdGhpcy5uYW1lOwogICAgICAgIGlmICh0aGlzLnVybCkgewogICAgICAgICAgICB0ZXh0ID0gdGV4dCArICc8L2E+JzsKICAgICAgICB9CiAgICAgICAgdGV4dCA9IHRleHQgKyAnPC9wPic7CiAgICAgICAgdGV4dCA9IHRleHQgKyAnPHAgY2xhc3M9ImluZm8iPjxzdHJvbmc+QWRkcmVzczogPC9zdHJvbmc+JyArIAogICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzICsgJzxiciAvPicgKyB0aGlzLmNpdHkgKyAnPC9wPic7CiAgICAgICAgICAgIAogICAgICAgIGlmICh0aGlzLnBob25lKSB7CiAgICAgICAgICAgIHRleHQgPSB0ZXh0ICsgJzxwIGNsYXNzPSJpbmZvIj48c3Ryb25nPlBob25lOiA8L3N0cm9uZz4nICsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBob25lICsgJzwvcD4nOwogICAgICAgIH0KICAgICAgICB0ZXh0ID0gdGV4dCArICc8L2Rpdj4nOwoKICAgICAgICB0aGlzLm9wZW5JbmZvV2luZG93SHRtbCh0ZXh0KTsKICAgIH0KICAgICAgICAKICAgIC8vIERlZmluaXRpb24gb2YgUmVzdG8gTWFya2VyCiAgICBmdW5jdGlvbiBSZXN0byhpZCwgcG9pbnQsIG5hbWUsIGRlc2NyaXB0aW9uKSB7CiAgICAgICAgR01hcmtlci5jYWxsKHRoaXMsIHBvaW50LCByZXN0byk7CgogICAgICAgIHRoaXMuaWQgPSBpZDsKICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKCiAgICAgICAgdGhpcy5jbGlja2hhbmRsZXIgPSBHRXZlbnQuYWRkTGlzdGVuZXIodGhpcywgJ2NsaWNrJywgdGhpcy5vcGVuSW5mb1dpbmRvdyk7CiAgICB9CgogICAgUmVzdG8ucHJvdG90eXBlID0gbmV3IEdNYXJrZXIobmV3IEdMYXRMbmcoMCwgMCkpOwoKICAgIFJlc3RvLnByb3RvdHlwZS5vcGVuSW5mb1dpbmRvdyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB0ZXh0ID0gJzxkaXYgY2xhc3M9Im5vdGUiPic7CiAgICAgICAgdGV4dCA9IHRleHQgKyAnPHAgY2xhc3M9Im5hbWUiPicgKyB0aGlzLm5hbWUgKyAnPC9wPic7CiAgICAgICAgdGV4dCA9IHRleHQgKyAnPHAgY2xhc3M9ImluZm8iPicgKyB0aGlzLmRlc2NyaXB0aW9uICsgJzwvcD4nOwogICAgICAgIHRleHQgPSB0ZXh0ICsgJzwvZGl2Pic7CgogICAgICAgIHRoaXMub3BlbkluZm9XaW5kb3dIdG1sKHRleHQpOwogICAgfQogICAgICAgIAogICAgLy8gQ3JlYXRlIHRoZSAiUGVvcGxlIiBtYXJrZXIgaWNvbgogICAgdmFyIHBlb3BsZSA9IG5ldyBHSWNvbigpOwogICAgcGVvcGxlLmltYWdlID0gImltZy9wZW9wbGUucG5nIjsKICAgIHBlb3BsZS5pY29uU2l6ZSA9IG5ldyBHU2l6ZSg1MCwgNTApOwogICAgcGVvcGxlLmljb25BbmNob3IgPSBuZXcgR1BvaW50KDI1LCAyNSk7CiAgICBwZW9wbGUuaW5mb1dpbmRvd0FuY2hvciA9IG5ldyBHUG9pbnQoMjUsIDI1KTsKICAgICAgICAKICAgIC8vIERlZmluaXRpb24gb2YgUGVvcGxlIE1hcmtlcgogICAgZnVuY3Rpb24gUGVvcGxlKGlkLCBwb2ludCwgdGl0bGUsIGRlc2NyaXB0aW9uKSB7CiAgICAgICAgR01hcmtlci5jYWxsKHRoaXMsIHBvaW50LCBwZW9wbGUpOwoKICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOwogICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKCiAgICAgICAgdGhpcy5jbGlja2hhbmRsZXIgPSBHRXZlbnQuYWRkTGlzdGVuZXIodGhpcywgJ2NsaWNrJywgdGhpcy5vcGVuSW5mb1dpbmRvdyk7CiAgICB9CgogICAgUGVvcGxlLnByb3RvdHlwZSA9IG5ldyBHTWFya2VyKG5ldyBHTGF0TG5nKDAsIDApKTsKCiAgICBQZW9wbGUucHJvdG90eXBlLm9wZW5JbmZvV2luZG93ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHRleHQgPSAnPGRpdiBjbGFzcz0ibm90ZSI+JzsKICAgICAgICB0ZXh0ID0gdGV4dCArICc8cCBjbGFzcz0ibmFtZSI+JyArIHRoaXMudGl0bGUgKyAnPC9wPic7CiAgICAgICAgdGV4dCA9IHRleHQgKyAnPHAgY2xhc3M9ImluZm8iPicgKyB0aGlzLmRlc2NyaXB0aW9uICsgJzwvcD4nOwogICAgICAgIHRleHQgPSB0ZXh0ICsgJzwvZGl2Pic7CgogICAgICAgIHRoaXMub3BlbkluZm9XaW5kb3dIdG1sKHRleHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZE1hcmtlcihtYXJrZXIpIHsKICAgICAgICBpZiAobWFya2VyKSB7CiAgICAgICAgICAgIG1hcmtlcnNbbWFya2VyLmlkXSA9IG1hcmtlcjsKICAgICAgICAgICAgbWFwLmFkZE92ZXJsYXkobWFya2VyKTsKICAgICAgICB9CiAgICB9CiAgICAKCiAgICBmdW5jdGlvbiBsb2FkKCkgewogICAgICBpZiAoR0Jyb3dzZXJJc0NvbXBhdGlibGUoKSkgewogICAgICAgIG1hcCA9IG5ldyBHTWFwMihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFwIikpOwogICAgICAgIAogICAgICAgIC8vIENlbnRlciB0byB2aWV3IHF1aXRlIGFsbCB0aGUgbWFwCiAgICAgICAgbWFwLnNldENlbnRlcihuZXcgR0xhdExuZyg0NS43NzY1MCwgNC44NTU5NSksIDEzKTsKICAgICAgICBtYXAuYWRkQ29udHJvbChuZXcgR0xhcmdlTWFwQ29udHJvbCgpKTsKICAgICAgICBtYXAuYWRkQ29udHJvbChuZXcgR092ZXJ2aWV3TWFwQ29udHJvbCgpKTsKICAgICAgICBtYXAuYWRkQ29udHJvbChuZXcgR01hcFR5cGVDb250cm9sKCkpOwoKCiAgICAgICAgLy8gQ29uZmVyZW5jZXMgUGxhY2UKICAgICAgICBhZGRNYXJrZXIobmV3IFBlb3BsZSgibWFpbiIsIG5ldyBHTGF0TG5nKDQ1Ljc4NDM2MywgNC44ODI4OTEpLCAKICAgICAgICAgICAgIkNvbmZlcmVuY2VzIG1haW4gcGxhY2UiLAogICAgICAgICAgICAiQWxsIHRoZSBjb25mZXJlbmNlcyB0aHJlYWQgd2lsbCB0YWtlIHBsYWNlIGhlcmUuIikpOwoKICAgICAgICBhZGRNYXJrZXIobmV3IFBlb3BsZSgiY2FwZWxsZSIsIG5ldyBHTGF0TG5nKDQ1Ljc4MzUzLCA0Ljg4MTI5KSwKICAgICAgICAgICAgIktleW5vdGUgcGxhY2UiLAogICAgICAgICAgICAiRXZlcnkga2V5bm90ZSBvciBiaWcgY29uZmVyZW5jZSwgd2lsbCB0YWtlIHBsYWNlIGF0IENhcGVsbGUgdGhlYXRlci4iKSk7CgogICAgICAgIC8vIFBhcnRpZXMgcGxhY2VzCiAgICAgICAgYWRkTWFya2VyKG5ldyBQZW9wbGUoInRvd25oYWxsIiwgbmV3IEdMYXRMbmcoNDUuNzY3NzQ3LCA0LjgzNTQyMjApLAogICAgICAgICAgICAiTHlvbiBUb3duaGFsbCIsCiAgICAgICAgICAgICJPZmZpY2lhbCByZWNlcHRpb24gYXQgdGhlIGJlYXV0aWZ1bCBMeW9uIHRvd25oYWxsIHJvb21zLCBmb2xsb3dlZCBieSBhIGNvY2t0YWlsLiIpKTsKCiAgICAgICAgYWRkTWFya2VyKG5ldyBQZW9wbGUoImhlcm1lcyIsIG5ldyBHTGF0TG5nKDQ1Ljc1MTMzOSwgNC44MzU1OTMpLAogICAgICAgICAgICAiVG91cmlzdGljIENydWlzZSZuYnNwJm5kYXNoOyZuYnNwO05MQyBQYXJ0eSIsCiAgICAgICAgICAgICJBIGdvb2Qgd2F5IHRvIHZpc2l0IEx5b24gYnkgbmlnaHQ6IGp1c3Qgc2l0IGRvd24gYW5kIGxvb2sgYXQgdGhlIGNpdHkgZHVyaW5nIHRoZSBkaW5uZXIuIikpOwoKICAgICAgICAvLyBSZXN0YXVyYW50cwogICAgICAgIGFkZE1hcmtlcihuZXcgUmVzdG8oInJ1IiwgbmV3IEdMYXRMbmcoNDUuNzgwNzksIDQuODc2MDQxKSwKICAgICAgICAgICAgIlVuaXZlcnNpdHkgUmVzdGF1cmFudCIsCiAgICAgICAgICAgICJBIHBsYWNlIHdoZXJlIGEgaG90IG1lYWwgYXdhaXRzIHlvdS4iKSk7CiAgICAgICAgCiAgICAgICAgYWRkTWFya2VyKG5ldyBSZXN0bygic2FuZHdpY2hlcyIsIG5ldyBHTGF0TG5nKDQ1Ljc4NDU0NiwgNC44ODI4MTEpLAogICAgICAgICAgICAiU2FuZHdpY2hlcyIsCiAgICAgICAgICAgICJUbyBnZXQgc2FuZHdpY2hlcyBhbmQgZWF0IHF1aWNrbHkuIikpOwoKICAgICAgICAvLyBIb3RlbHMKICAgICAgICBhZGRNYXJrZXIobmV3IEhvdGVsKCJpbnNhX2giLCBuZXcgR0xhdExuZyg0NS43ODQ4MywgNC44NzQ0NTMpLAogICAgICAgICAgICAiSU5TQSBidWlsZGluZyBIIiwKICAgICAgICAgICAgIjIwLCBhdmVudWUgQWxiZXJ0IEVpbnN0ZWluIiwKICAgICAgICAgICAgIjY5MTAwIFZpbGxldXJiYW5uZSIsCiAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICJhY2NvbW1vZGF0aW9uLmh0bWwjaW5zYSIpKTsKICAgICAgICAKICAgICAgICBhZGRNYXJrZXIobmV3IEhvdGVsKCJpbnNhX2YiLCBuZXcgR0xhdExuZyg0NS43ODQyODQsIDQuODcxNzA2KSwKICAgICAgICAgICAgIklOU0EgYnVpbGRpbmcgRiIsCiAgICAgICAgICAgICIyMCwgYXZlbnVlIEFsYmVydCBFaW5zdGVpbiIsCiAgICAgICAgICAgICI2OTEwMCBWaWxsZXVyYmFubmUiLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICAiYWNjb21tb2RhdGlvbi5odG1sI2luc2EiKSk7CgogICAgICAgIGFkZE1hcmtlcihuZXcgSG90ZWwoInlvdWdodGhvdGVsIiwgbmV3IEdMYXRMbmcoNDUuNzYwMzA3NywgNC44MjQ0NTcpLAogICAgICAgICAgICAiWW91Z3RoIEhvdGVsIiwKICAgICAgICAgICAgIjQxLTQ1LCBtb250ZWUgZHUgQ2hlbWluIE5ldWYiLAogICAgICAgICAgICAiNjkwMDUgTHlvbiIsCiAgICAgICAgICAgICIrMzMgKDApNCA3OCAxNSAwNSA1MCIsCiAgICAgICAgICAgICJhY2NvbW1vZGF0aW9uLmh0bWwjeW91Z3RoaG90ZWwiLAogICAgICAgICAgICBsb2dvYWopKTsKCiAgICAgICAgLy8gRXRhcCBIb3RlbCBWaWxsZXVyYmFubmUKICAgICAgICBhZGRNYXJrZXIobmV3IEhvdGVsKCJob3RlbDMiLCBuZXcgR0xhdExuZyg0NS43ODIyNiwgNC44OTA3MDcpLCAKICAgICAgICAgICAgIkV0YXAgSG90ZWwgVmlsbGV1cmJhbm5lIiwgCiAgICAgICAgICAgICIzIHJ1ZSA4IG1haSAxOTQ1IiwKICAgICAgICAgICAgIjY5MTAwIFZpbGxldXJiYW5uZSIsCiAgICAgICAgICAgICIrMzMgKDApOCA5MiA2OCAwOSA0MSIsCiAgICAgICAgICAgICJhY2NvbW1vZGF0aW9uLmh0bWwjaG90ZWwzIikpOwoKICAgICAgICAvLyBFdGFwIEhvdGVsIENhbHVpcmUKICAgICAgICBhZGRNYXJrZXIobmV3IEhvdGVsKCJob3RlbDIiLCBuZXcgR0xhdExuZyg0NS43OTA0LCA0Ljg1ODQpLCAKICAgICAgICAgICAgIkV0YXAgSG90ZWwgQ2FsdWlyZSBldCBDdWlyZSIsCiAgICAgICAgICAgICIxNTQgZ3JhbmRlIHJ1ZSBTdCBDbGFpciIsCiAgICAgICAgICAgICI2OTMwMCBDYWx1aXJlIGV0IEN1aXJlIiwKICAgICAgICAgICAgIiszMyAoMCk4IDkyIDY4IDA0IDkxIiwKICAgICAgICAgICAgImFjY29tbW9kYXRpb24uaHRtbCNob3RlbDIiKSk7CiAgICAgICAgCiAgICAgICAgLy8gSG9saWRheSBJbm4gVmlsbGV1cmJhbm5lCiAgICAgICAgYWRkTWFya2VyKG5ldyBIb3RlbCgiaG90ZWw0IiwgbmV3IEdMYXRMbmcoNDUuNzc5MCwgNC44NzQyKSwKICAgICAgICAgICAgIkhvbGlkYXkgSW5uIFZpbGxldXJiYW5uZSIsCiAgICAgICAgICAgICIxMzAgYm91bGV2YXJkIDExIG5vdmVtYnJlIDE5MTgiLAogICAgICAgICAgICAiNjkxMDAgVmlsbGV1cmJhbm5lIiwKICAgICAgICAgICAgIiszMyAoMCk0IDc4IDg5IDk1IDk1IiwKICAgICAgICAgICAgImFjY29tbW9kYXRpb24uaHRtbCNob3RlbDQiKSk7CiAgICAgICAgCiAgICAgICAgLy8gTWVyY3VyZSBDaGFycGVubmVzCiAgICAgICAgYWRkTWFya2VyKG5ldyBIb3RlbCgiaG90ZWw1IiwgbmV3IEdMYXRMbmcoNDUuNzcxMCwgNC44NjMzKSwKICAgICAgICAgICAgIiBIJm9jaXJjO3RlbCBNZXJjdXJlIEx5b24gQ2hhcnBlbm5lcyIsCiAgICAgICAgICAgICI3IHBsYWNlIENoYXJsZXMgSGVybnUiLAogICAgICAgICAgICAiNjkxMDAgVmlsbGV1cmJhbm5lIiwKICAgICAgICAgICAgIiszMyAoMCk0IDcyIDQ0IDQ2IDQ2IiwKICAgICAgICAgICAgImFjY29tbW9kYXRpb24uaHRtbCNob3RlbDUiKSk7CgogICAgICAgIC8vIEhvdGVsIGRlcyBjb25ncmVzCiAgICAgICAgYWRkTWFya2VyKG5ldyBIb3RlbCgiaG90ZWwxIiwgbmV3IEdMYXRMbmcoNDUuNzc3MiwgNC44NjE4KSwgCiAgICAgICAgICAgICJIJm9jaXJjO3RlbCBkZXMgQ29uZ3ImZWdyYXZlO3MiLAogICAgICAgICAgICAicGxhY2UgUml2aSZlZ3JhdmU7cmUiLAogICAgICAgICAgICAiNjkxMDAgVmlsbGV1cmJhbm5lIiwKICAgICAgICAgICAgIiszMyAoMCk0IDcyIDY5IDE2IDE2IiwKICAgICAgICAgICAgImFjY29tbW9kYXRpb24uaHRtbCNob3RlbDEiKSk7CiAgICAgICAgCiAgICAgICAgLy8gSG90ZWwgYnJpdGFuaWEKICAgICAgICBhZGRNYXJrZXIobmV3IEhvdGVsKCJob3RlbDYiLCBuZXcgR0xhdExuZyg0NS43Njg3MiwgNC44NTcwODMpLCAKICAgICAgICAgICAgIkgmb2NpcmM7dGVsIEJyaXRhbmlhIiwKICAgICAgICAgICAgIjcgcnVlIFByb2YuIFdlaWxsIiwKICAgICAgICAgICAgIjY5MDA2IEx5b24iLAogICAgICAgICAgICAiKzMzICgwKTQgNzggNTIgODYgNTIiLAogICAgICAgICAgICAiYWNjb21tb2RhdGlvbi5odG1sI2hvdGVsNiIpKTsKICAgICAgCiAgICAgICAgLy8gQ2FtcGluZwogICAgICAgIGFkZE1hcmtlcihuZXcgSG90ZWwoImNhbXBpbmciLCBuZXcgR0xhdExuZyg0NS44MTk3NiwgNC43NjE0NTc0KSwKICAgICAgICAgICAgIkNhbXBpbmcgR3JvdW5kIiwKICAgICAgICAgICAgIlBvcnRlIGRlIEx5b24iLAogICAgICAgICAgICAiNjk1NzAgRGFyZGlsbHkiLAogICAgICAgICAgICAiKzMzICgwKTQgNzggMzUgNjQgNTUiLAogICAgICAgICAgICAiYWNjb21tb2RhdGlvbi5odG1sI2NhbXBpbmciKSk7CgogICAgICAgIC8vIENlbnRyZSBpbnRlcm5hdGlvbmFsIGRlIHPpam91cgogICAgICAgIGFkZE1hcmtlcihuZXcgSG90ZWwoImNpcyIsIG5ldyBHTGF0TG5nKDQ1LjcyOTcxNSwgNC44Njc2OTQzKSwKICAgICAgICAgICAgIkNlbnRyZSBJbnRlcm5hdC4gZGUgcyZlYWN1dGU7am91ciIsCiAgICAgICAgICAgICIxMDMsIEJkIGRlcyAmRWFjdXRlO3RhdHMtVW5pcyIsCiAgICAgICAgICAgICI2OTAwOCBMeW9uIiwKICAgICAgICAgICAgIiszMyAoMCk0IDM3IDkwIDQyIDQyIiwKICAgICAgICAgICAgImFjY29tbW9kYXRpb24uaHRtbCNjaXMiKSk7CgogICAgICAgIC8vIE9wZW4gdGhlIG1hcmtlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBoYXNoCiAgICAgICAgdmFyIGhhc2ggPSBsb2NhdGlvbi5oYXNoOwogICAgICAgIGlmIChoYXNoKSB7CiAgICAgICAgICAgIGhhc2ggPSBoYXNoLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgdmFyIG1hcmtlciA9IG1hcmtlcnNbaGFzaF07CgogICAgICAgICAgICBpZiAobWFya2VyKSB7CiAgICAgICAgICAgICAgICBtYXJrZXIub3BlbkluZm9XaW5kb3coKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vXV0+CiAgICA8L3NjcmlwdD4KCjwvaGVhZD4KCjxib2R5IG9ubG9hZD0ibG9hZCgpIiBvbnVubG9hZD0iR1VubG9hZCgpIj4KCjxkaXYgaWQ9ImNvbnRlbnQiPgoKCTxkaXYgaWQ9ImxvZ28iPgogICAgICAgIDxhIGhyZWY9Ii9jb25mZXJlbmNlL2luZGV4Lmh0bWwiPgogICAgICAgICAgICA8aW1nIHN0eWxlPSJib3JkZXI6IDBweCBzb2xpZCIgCiAgICAgICAgICAgICAgICBzcmM9Ik9Pb0Nvbkx5b24ucG5nIiAKICAgICAgICAgICAgICAgIGFsdD0iT3Blbk9mZmljZS5vcmcgQ29uZmVyZW5jZXMgbG9nbyIgLz4KICAgICAgICA8L2E+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJ0aXRsZSI+CiAgICAgICAgPGgzPk9wZW5PZmZpY2Uub3JnIENvbmZlcmVuY2UgKE9Pb0NvbiAyMDA2KTwvaDM+CiAgICAgICAgPHA+TWFwPC9wPgogICAgPC9kaXY+CgogICAgPG5vc2NyaXB0PgogICAgICAgIDxoMz5KYXZhc2NyaXB0IHdhcm5pbmc8L2gzPgogICAgICAgIAogICAgICAgIDxwPkluIG9yZGVyIHRvIHNlZSBhIG1hcCwgcGxlYXNlIHVzZSBhIEphdmFzY3JpcHQgY29tcGF0aWJsZSBicm93c2VyIG9yIGFjdGl2YXRlCiAgICAgICAgSmF2YXNjcmlwdCBpbiB5b3VyIGJyb3dzZXIgcHJlZmVyZW5jZXMuPC9wPgogICAgPC9ub3NjcmlwdD4KICAgIDxkaXYgaWQ9Im1hcCIgc3R5bGU9IndpZHRoOiA2MDBweDsgaGVpZ2h0OiA0MDBweDsgdGV4dC1hbGlnbjpjZW50ZXIiPjwvZGl2PiAgICAKICAgCjwvZGl2PgoKPCEtLSBSaWdodCBtZW51IC0tPgo8ZGl2IGlkPSJtZW51Ij4KCTxwIGlkPSJsYW5nTGluZSI+CgkJPHNwYW4gY2xhc3M9InRoaXNMYW5nIj5Fbjwvc3Bhbj4gLQoJCTxhIGNsYXNzPSJsYW5nIiBocmVmPSJtYXBfZnIuaHRtbCI+RnI8L2E+Cgk8L3A+CiAgICA8aDM+V2hhdCBpcyBPT29Db248L2gzPgogICAgICAgIDxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkhvbWU8L2E+PC9wPgogICAgPGgzPkhvdyB0byBwYXJ0aWNpcGF0ZTwvaDM+CiAgICAgICAgPHA+PGEgaHJlZj0ic3BvbnNvcnNoaXAuaHRtbCI+U3BvbnNvcnM8L2E+PC9wPgogICAgICAgIDxwPjxhIGhyZWY9InJlZ2lzdHJhdGlvbi5odG1sIj5SZWdpc3RyYXRpb248L2E+PC9wPgogICAgPGgzPlRyYXZlbCBpbmZvcm1hdGlvbnM8L2gzPgogICAgICAgIDxwPjxhIGhyZWY9InRyYXZlbC5odG1sIj5UcmF2ZWw8L2E+PC9wPgogICAgICAgIDxwPjxhIGhyZWY9ImFjY29tbW9kYXRpb24uaHRtbCI+QWNjb21tb2RhdGlvbjwvYT48L3A+CiAgICAgICAgPHA+TWFwPC9wPgogICAgPGgzPlByb2dyYW1tZTwvaDM+CiAgICAgICAgPHA+PGEgaHJlZj0ic2NoZWR1bGUuaHRtbCI+T3ZlcnZpZXc8L2E+PC9wPgogICAgICAgIDxwPjxhIGhyZWY9InNjaGVkdWxlL21vbmRheS5odG1sIj5Nb25kYXk8L2E+PC9wPgogICAgICAgIDxwPjxhIGhyZWY9InNjaGVkdWxlL3R1ZXNkYXkuaHRtbCI+VHVlc2RheTwvYT48L3A+CiAgICAgICAgPHA+PGEgaHJlZj0ic2NoZWR1bGUvd2VkbmVzZGF5Lmh0bWwiPldlZG5lc2RheTwvYT48L3A+Cgo8L2Rpdj4KCjwvYm9keT4KPC9odG1sPgoK