Danfoss ASV-I Haberci Vana DN20 (¾”)

003L7641 · 003L7642 · 003L7643 · 003L7644 · 003L7645, ASV-I Haberci Vana, Bağlantı tipleri: İçten diş, Basınç sınıfı: PN 16, Akışkan sıcaklığı: 120 °C
Bu ürün seçenekli satılır. Sepete eklemeden önce aşağıdan seçim yapınız.
1.285,90₺ + KDV
KDV Dahil: 1.543,08₺
Stok Kodu
003L7642
Fiyat
23,13 € + KDV
Çap (DN - inch)
DN15 (½”) DN20 (¾”) DN25 (1”) DN32 (1¼”) DN40 (1½”)

Toptan Sipariş Formu

Toptan sipariş taleplerinizi bu form üzerinden kolayca iletebilirsiniz.
Lütfen talep ettiğiniz ürünleri, miktar bilgilerini ve varsa teknik detayları eksiksiz şekilde belirtiniz.

Yetkili ekibimiz başvurunuzu inceledikten sonra en kısa sürede fiyat teklifi ve detaylı bilgilendirme için sizinle iletişime geçecektir.

Toplu alımlar ve proje bazlı talepler için bu formu kullanabilirsiniz.

*
*
*
*
*

Danfoss ASV-I Haberci Vana

ASV-I DN 15 INTERNAL THREAD. ASV-I DN 15, içten dişli, ayar vanası.

Teknik Özellikler

ÖzellikDeğer
TipASV-I
Akışkan sıcaklığı [°C] [Maks.]120 °C
Akışkan sıcaklığı [°C] [Min.]-20 °C
Ayar ölçeğiEvet
Basınç sınıfıPN 16
Bağlantı tipleriİçten diş
Debi sınırlandırmaEvet
Kesme fonksiyonuEvet
Montaj konumuBesleme borusu
Tahliye fonksiyonuHayır
Vana gövdesi malzemesiPirinç
Vana üzerinde fark basınç [kPa] [Maks.]150 KPa

Sipariş Kodları

Sipariş KoduÇap
003L7641DN15 (½”)
003L7642DN20 (¾”)
003L7643DN25 (1”)
003L7644DN32 (1¼”)
003L7645DN40 (1½”)

Danfoss ürünleri Novus Mühendislik ve Enerji Sistemleri güvencesiyle; ürün seçimi, proje ve toplu alım için WhatsApp veya telefonla teknik destek alabilirsiniz. Teknik değerler üretici verilerinden derlenmiştir; kesin seçim için ürün veri sayfasına başvurunuz.

Danfoss ASV-I Haberci Vana DN20 (¾”)

ASV-I DN 20 INTERNAL THREAD. ASV-I DN 20, içten dişli, ayar vanası.

Teknik Özellikler

ÖzellikDeğer
Net ağırlık0.476 Kilogram
TipASV-I
Akışkan sıcaklığı [°C] [Maks.]120 °C
Akışkan sıcaklığı [°C] [Min.]-20 °C
Ayar ölçeğiEvet
AçıklamaASV-I DN 20, içten dişli, ayar vanası
Basınç sınıfıPN 16
Bağlantı tipleriİçten diş
Debi sınırlandırmaEvet
Kesme fonksiyonuEvet
Kvs [m³/h]2.5 m³/h
Montaj konumuBesleme borusu
Tahliye fonksiyonuHayır
Vana boyutuDN 20
Vana gövdesi malzemesiPirinç
Vana üzerinde fark basınç [kPa] [Maks.]150 KPa

Danfoss ürünleri Novus Mühendislik ve Enerji Sistemleri güvencesiyle; ürün seçimi, proje ve toplu alım için WhatsApp veya telefonla teknik destek alabilirsiniz. Teknik değerler üretici verilerinden derlenmiştir; kesin seçim için ürün veri sayfasına başvurunuz.

Bu ürüne ilk yorumu siz yapın!
Ürün hakkında henüz soru sorulmamış.
Bu ürünün fiyat bilgisi, resim, ürün açıklamalarında ve diğer konularda yetersiz gördüğünüz noktaları öneri formunu kullanarak tarafımıza iletebilirsiniz.
Görüş ve önerileriniz için teşekkür ederiz.
Sitemize ilk yorumu siz yapın!
Danfoss ASV-I Haberci Vana DN20 (¾”) 003L7641 · 003L7642 · 003L7643 · 003L7644 · 003L7645, ASV-I Haberci Vana, Bağlantı tipleri: İçten diş, Basınç sınıfı: PN 16, Akışkan sıcaklığı: 120 °C 003L7642
Danfoss ASV-I Haberci Vana DN20 (¾”)

Tavsiye Et

*
*
*

Güvenli Alışveriş

256 bit SSL Sertifikası ile %100 güvenli alışveriş imkanı

Aynı Gün Kargo

Saat 16:00’a kadar ki siparişlerde aynı gün kargo hizmeti

Taksitli Alışveriş

Kredi kartınıza taksit ve banka havalesi ile ödeme

Ücretsiz Kargo

2.500 ₺ ve üzeri tüm siparişleriniz de kargo ücretsiz!

Merhaba! 👋
Sorularınız, talepleriniz için bize yazabilirsiniz...
data:text/plain;base64,PGxpbmsgcmVsPSJwcmVsb2FkIiBhcz0ic2NyaXB0IiBocmVmPSJ7eyB0aGVtZUFzc2V0KCdqYXZhc2NyaXB0L3RoZW1lLmpzJykgfX0iPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7eyB0aGVtZUFzc2V0KCdqYXZhc2NyaXB0L3RoZW1lLmpzJykgfX0iPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7eyB0aGVtZUFzc2V0KCdqYXZhc2NyaXB0L25hdmlnYXRpb24tbWVudS5qcycpIH19Ij48L3NjcmlwdD4KPHNjcmlwdD4KLyogTm92dXMgMjAyNi0wOS0xODogZmlsdHJlIHNvbnVjdSBib3NzYSAiVXJ1biBCdWx1bmFtYWRpIiB5ZXJpbmUgdXJ1biBnb3N0ZXJlbiBhZHJlc2UgZ2VjLgogICAxKSBrYXRlZ29yaSBzYXlmYXNpbmRhIG1hcmthIGZpbHRyZXNpIHZhcnNhIHlhbG5peiBtYXJrYSBrYWxpciAgMikgbyBkYSBib3NzYSBmaWx0cmVzaXogc2F5ZmEuCiAgIE5vdDogZG9sdSBzYXlmYWxhcmRhIGRhIGdpemxpIGJpciBpbmZvcm1hdGlvbi1jb250ZW50IGt1dHVzdSB2YXI7IGthcmFyIFVSVU4gU0FZSVNJTkEgZ29yZS4gKi8KKGZ1bmN0aW9uICgpIHsKICBmdW5jdGlvbiBjYWxpcygpIHsKICAgIHRyeSB7CiAgICAgIHZhciB5b2wgPSBsb2NhdGlvbi5wYXRobmFtZTsKICAgICAgaWYgKCEvXlwvKGthdGVnb3JpfG1hcmthKVwvLy50ZXN0KHlvbCkgfHwgbG9jYXRpb24uc2VhcmNoLmxlbmd0aCA8IDIpIHJldHVybjsKICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zaG93Y2FzZS1jb250YWluZXIgLnNob3djYXNlJykpIHJldHVybjsKICAgICAgdmFyIGJpbGdpID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmluZm9ybWF0aW9uLWNvbnRlbnQnKTsKICAgICAgaWYgKCFiaWxnaSB8fCAhL8OccsO8biBCdWx1bmFtYWTEsS9pLnRlc3QoYmlsZ2kudGV4dENvbnRlbnQpKSByZXR1cm47CiAgICAgIHZhciBwID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhsb2NhdGlvbi5zZWFyY2gpOwogICAgICB2YXIgbWFya2EgPSBwLmdldCgnbWFya2EnKTsKICAgICAgdmFyIGRpZ2VyID0gZmFsc2U7CiAgICAgIHAuZm9yRWFjaChmdW5jdGlvbiAodiwgaykgeyBpZiAoayAhPT0gJ21hcmthJyAmJiAhL14oc3JzbHRpZHxnY2xpZHxmYmNsaWR8dXRtXykvLnRlc3QoaykpIGRpZ2VyID0gdHJ1ZTsgfSk7CiAgICAgIHZhciBoZWRlZiA9IChtYXJrYSAmJiBkaWdlciAmJiB5b2wuaW5kZXhPZignL2thdGVnb3JpLycpID09PSAwKSA/IHlvbCArICc/bWFya2E9JyArIG1hcmthLnJlcGxhY2UoL1teYS16MC05LF8tXS9naSwgJycpIDogeW9sOwogICAgICBpZiAoaGVkZWYgIT09IHlvbCArIGxvY2F0aW9uLnNlYXJjaCkgbG9jYXRpb24ucmVwbGFjZShoZWRlZik7CiAgICB9IGNhdGNoIChlKSB7fQogIH0KICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgY2FsaXMpOyBlbHNlIGNhbGlzKCk7Cn0pKCk7Cjwvc2NyaXB0Pgo8c2NyaXB0PgovKiBOb3Z1cyAoMjAyNi0wOSk6IC9zYXlmYWxhciBnw7Zyc2VsIGTDvHplbmkgKi8KKGZ1bmN0aW9uICgpIHsKICBmdW5jdGlvbiBjYWxpcygpIHsKICAgIHRyeSB7CiAgICAgIGlmICghZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ2N1cnJlbnQtcGFnZS1wYWdlLWxpc3QnKSkgcmV0dXJuOwogICAgICB2YXIgbGlzdGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGFnZS1saXN0LWNvbnRlbnQnKTsgaWYgKCFsaXN0ZSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubnMnKSkgcmV0dXJuOwogICAgICB2YXIgUyA9IHsiaXNpLXNheWFjaS1tdWF5ZW5lLXZlLWthbGlicmFzeW9uIjogWyJoaXptZXQiLCAia2Fsa2FuIiwgIklzxLEgU2F5YWPEsSBNdWF5ZW5lc2kiLCAiNSB5xLFsbMSxayB6b3J1bmx1IG11YXllbmUgdGFrdmltaSwgMjAyNiByZXNtaSBiZWRlbGxlcmkgdmUgc8O8cmXDpy4iXSwgInN1LXNheWFjLWF5aXJtYS1iaXJleXNlbC1hYm9uZWxpayI6IFsiaGl6bWV0IiwgImRhbWxhIiwgIlN1IFNheWFjxLEgQXnEsXJtYSIsICLEsFNLxLAgYmlyZXlzZWwgc3UgYWJvbmVsacSfaTogc8O8cmXDpywgZ2VyZWtsaSBiZWxnZWxlciB2ZSDDvGNyZXRsZXIuIl0sICJ5ZXJkZW4taXNpdG1hLXplbWluZGVuLWhlc2FwbGFtYS1wcm9ncmFtaS12ZS1tYWxpeWV0LWhlc2FiaSI6IFsiaGl6bWV0IiwgImhlc2FwIiwgIlllcmRlbiBJc8SxdG1hIEhlc2FwbGFtYSIsICJCb3J1IG1ldHJlc2luaSB2ZSBrb2xsZWt0w7ZyIGRldnJlIHNhecSxc8SxbsSxIGFuxLFuZGEgaGVzYXBsYXnEsW4uIl0sICJkZWJpLWF5YXJsaS1rb2xsZWt0b3ItbmUtaXNlLXlhcmFyIjogWyJ1cnVuIiwgImF5YXIiLCAiRGViaSBBeWFybMSxIEtvbGxla3TDtnIgTmUgxLDFn2UgWWFyYXI/IiwgIkZheWRhbGFyxLEsIGt1bGxhbsSxbSBhbGFubGFyxLEgdmUgc8SxayBzb3J1bGFuIHNvcnVsYXIuIl0sICJkZWJpLWF5YXJsaS1rb2xsZWt0b3ItZml5YXRpIjogWyJ1cnVuIiwgImV0aWtldCIsICJEZWJpIEF5YXJsxLEgS29sbGVrdMO2ciBGaXlhdMSxIiwgIkZpeWF0xLEgYmVsaXJsZXllbiBldGtlbmxlciB2ZSDDtm5lIMOnxLFrYW4gbW9kZWxsZXIuIl0sICJmaXlhdC1saXN0ZXNpIjogWyJ1cnVuIiwgImV0aWtldCIsICJLb2xsZWt0w7ZyIEZpeWF0IExpc3Rlc2kiLCAiRGViaSBheWFybMSxIGtvbGxla3TDtnIgc2V0bGVyaSB2ZSBmaXlhdCBncnVwbGFyxLEuIl0sICJtZXNhZmVsaS1zYXRpcy1zb3psZXNtZXNpIjogWyJ5YXNhbCIsICJiZWxnZSIsICJNZXNhZmVsaSBTYXTEscWfIFPDtnpsZcWfbWVzaSIsICIiXSwgImlwdGFsLXZlLWlhZGUtc2FydGxhcmkiOiBbInlhc2FsIiwgImJlbGdlIiwgIkNheW1hLCDEsHB0YWwgdmUgxLBhZGUgS2/Fn3VsbGFyxLEiLCAiIl0sICJnaXpsaWxpay12ZS1ndXZlbmxpayI6IFsieWFzYWwiLCAiYmVsZ2UiLCAiR2l6bGlsaWsgdmUgR8O8dmVubGlrIiwgIiJdLCAia2lzaXNlbC12ZXJpbGVyLXBvbGl0aWthc2kiOiBbInlhc2FsIiwgImJlbGdlIiwgIktpxZ9pc2VsIFZlcmlsZXJpbiBLb3J1bm1hc8SxIChLVktLKSIsICIiXSwgImJhbmthLXZlLWNhcmktYmlsZ2lsZXIiOiBbInlhc2FsIiwgImJlbGdlIiwgIkJhbmthIHZlIENhcmkgQmlsZ2lsZXIiLCAiIl19LCBHID0gW1siaGl6bWV0IiwgIkhpem1ldGxlciB2ZSBBcmHDp2xhciIsICJNdWF5ZW5lLCBhYm9uZWxpayB2ZSBoZXNhcGxhbWEgc2F5ZmFsYXLEsW3EsXoiXSwgWyJ1cnVuIiwgIsOccsO8biBSZWhiZXJsZXJpIiwgIsOccsO8biBzZcOnaW1pIHZlIGZpeWF0bGFuZMSxcm1hIl0sIFsiZGlnZXIiLCAiRGnEn2VyIFNheWZhbGFyIiwgIiJdLCBbInlhc2FsIiwgIkFsxLHFn3ZlcmnFnyB2ZSBZYXNhbCBCaWxnaWxlciIsICJTw7Z6bGXFn21lbGVyLCBnaXpsaWxpayB2ZSDDtmRlbWUgYmlsZ2lsZXJpIl1dLCBSID0gW1s4LCAia2Fsb3JpbWV0cmUtbmVkaXIiLCAiS2Fsb3JpbWV0cmUgTmVkaXI/Il0sIFs5LCAia2Fsb3JpbWV0cmUtbmFzaWwtb2t1bnVyIiwgIkthbG9yaW1ldHJlIE5hc8SxbCBPa3VudXI/Il0sIFsxMiwgImthbG9yaW1ldHJlLW1hcmthbGFyaSIsICJLYWxvcmltZXRyZSBNYXJrYWxhcsSxIDIwMjYiXSwgWzEzLCAia2Fsb3JpbWV0cmUtbW9udGFqaSIsICJNb250YWogdmUgRGXEn2nFn2ltIl0sIFsxMCwgImthbG9yaW1ldHJlLXBpbGkiLCAiS2Fsb3JpbWV0cmUgUGlsaSJdLCBbMTEsICJrYWxvcmltZXRyZS1oYXRhLWtvZGxhcmkiLCAiSGF0YSBLb2RsYXLEsSJdLCBbMTQsICJpc2ktcGF5LW9sY2VyLW5hc2lsLW9rdW51ciIsICJJc8SxIFBheSDDlmzDp2VyIE5hc8SxbCBPa3VudXI/Il1dLCBJSyA9IHsia2Fsa2FuIjogIjxwYXRoIGQ9XCJNMTIgMiA0IDV2NmMwIDUgMy40IDkuNCA4IDExIDQuNi0xLjYgOC02IDgtMTFWNWwtOC0zem0tMS4yIDE0LjItMy41LTMuNSAxLjQtMS40IDIuMSAyLjEgNC45LTQuOSAxLjQgMS40LTYuMyA2LjN6XCIvPiIsICJkYW1sYSI6ICI8cGF0aCBkPVwiTTEyIDIuNVM1IDEwLjIgNSAxNC44QTcgNyAwIDAgMCAxOSAxNC44QzE5IDEwLjIgMTIgMi41IDEyIDIuNXpcIi8+IiwgImhlc2FwIjogIjxwYXRoIGQ9XCJNNiAyaDEyYTIgMiAwIDAgMSAyIDJ2MTZhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yem0xIDN2NGgxMFY1SDd6bTAgN3YyaDJ2LTJIN3ptNCAwdjJoMnYtMmgtMnptNCAwdjZoMnYtNmgtMnptLTggNHYyaDJ2LTJIN3ptNCAwdjJoMnYtMmgtMnpcIi8+IiwgImF5YXIiOiAiPHBhdGggZD1cIk00IDZoMTB2Mkg0VjZ6bTEyIDBoNHYyaC00djJoLTJWNGgydjJ6TTQgMTFoNHYySDR2LTJ6bTYtMmgydjJoOHYyaC04djJoLTJWOXpNNCAxNmgxMHYySDR2LTJ6bTEyLTJoMnYyaDJ2MmgtMnYyaC0ydi02elwiLz4iLCAiZXRpa2V0IjogIjxwYXRoIGQ9XCJNMjEuNCAxMS42IDEyLjQgMi42QTIgMiAwIDAgMCAxMSAySDRhMiAyIDAgMCAwLTIgMnY3YzAgLjYuMiAxLjEuNiAxLjRsOSA5YTIgMiAwIDAgMCAyLjggMGw3LTdhMiAyIDAgMCAwIDAtMi44ek02LjUgOEExLjUgMS41IDAgMSAxIDYuNSA1YTEuNSAxLjUgMCAwIDEgMCAzelwiLz4iLCAiYmVsZ2UiOiAiPHBhdGggZD1cIk02IDJoOGw2IDZ2MTJhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yem03IDEuNVY5aDUuNUwxMyAzLjV6TTggMTN2Mmg4di0ySDh6bTAgNHYyaDV2LTJIOHpcIi8+In07CiAgICAgIHZhciBvZ2VsZXIgPSBbXS5zbGljZS5jYWxsKGxpc3RlLnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYWdlLWxpc3QtaXRlbScpKS5tYXAoZnVuY3Rpb24gKGl0KSB7CiAgICAgICAgdmFyIGEgPSBpdC5xdWVyeVNlbGVjdG9yKCcucGFnZS10aXRsZSBhJyk7IGlmICghYSkgcmV0dXJuIG51bGw7CiAgICAgICAgdmFyIHlvbCA9IGEuZ2V0QXR0cmlidXRlKCdocmVmJykgfHwgJyc7IHZhciBzbHVnID0geW9sLnNwbGl0KCcvJykucG9wKCk7CiAgICAgICAgdmFyIG96ID0gKGl0LnF1ZXJ5U2VsZWN0b3IoJy5wYWdlLWNvbnRlbnQnKSB8fCB7fSkudGV4dENvbnRlbnQgfHwgJyc7CiAgICAgICAgcmV0dXJuIHsgeW9sOiB5b2wsIHNsdWc6IHNsdWcsIGFkOiBhLnRleHRDb250ZW50LnRyaW0oKSwgb3o6IG96LnRyaW0oKS5zbGljZSgwLCAxNDApIH07CiAgICAgIH0pLmZpbHRlcihCb29sZWFuKTsKICAgICAgaWYgKCFvZ2VsZXIubGVuZ3RoKSByZXR1cm47CiAgICAgIHZhciBlc2MgPSBmdW5jdGlvbiAocykgeyByZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpOyB9OwogICAgICB2YXIgc3ZnID0gZnVuY3Rpb24gKGspIHsgcmV0dXJuICc8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgYXJpYS1oaWRkZW49InRydWUiPicgKyAoSUtba10gfHwgSUsuYmVsZ2UpICsgJzwvc3ZnPic7IH07CiAgICAgIHZhciBoID0gJzxkaXYgY2xhc3M9Im5zIj48c2VjdGlvbiBjbGFzcz0ibnMtaGVybyI+PHNwYW4gY2xhc3M9Im5zLXJvemV0Ij5CaWxnaSBtZXJrZXppPC9zcGFuPjxoMT5IaXptZXRsZXIsIFJlaGJlcmxlciB2ZSBCaWxnaSBTYXlmYWxhcsSxPC9oMT4nICsKICAgICAgICAnPHA+TXVheWVuZSB2ZSBhYm9uZWxpayBzw7xyZcOnbGVyaSwgaGVzYXBsYW1hIGFyYcOnbGFyxLEsIMO8csO8biByZWhiZXJsZXJpIHZlIGFsxLHFn3ZlcmnFnyBiaWxnaWxlcmkgdGVrIHllcmRlLjwvcD4nICsKICAgICAgICAnPGRpdiBjbGFzcz0ibnMtaGl6bGkiPjxhIGhyZWY9Ii9ibG9nIj5CbG9nIHZlIHJlaGJlcmxlciDihpI8L2E+PGEgaHJlZj0iL2thdGVnb3JpL2thbG9yaW1ldHJlIj5LYWxvcmltZXRyZWxlcjwvYT48YSBocmVmPSIva2F0ZWdvcmkvc3Utc2F5YWNpIj5TdSBzYXlhw6dsYXLEsTwvYT48L2Rpdj48L3NlY3Rpb24+JzsKICAgICAgRy5mb3JFYWNoKGZ1bmN0aW9uIChnKSB7CiAgICAgICAgdmFyIGdydXAgPSBvZ2VsZXIuZmlsdGVyKGZ1bmN0aW9uIChvKSB7IHJldHVybiAoKFNbby5zbHVnXSB8fCBbJ2RpZ2VyJ10pWzBdKSA9PT0gZ1swXTsgfSk7CiAgICAgICAgaWYgKCFncnVwLmxlbmd0aCkgcmV0dXJuOwogICAgICAgIGggKz0gJzxzZWN0aW9uIGNsYXNzPSJucy1ncnVwIG5zLScgKyBnWzBdICsgJyI+PGRpdiBjbGFzcz0ibnMtZ3J1cC11c3QiPjxoMj4nICsgZ1sxXSArICc8L2gyPicgKyAoZ1syXSA/ICc8cD4nICsgZ1syXSArICc8L3A+JyA6ICcnKSArICc8L2Rpdj48ZGl2IGNsYXNzPSJucy1rYXJ0bGFyIj4nOwogICAgICAgIGdydXAuZm9yRWFjaChmdW5jdGlvbiAobykgewogICAgICAgICAgdmFyIHMgPSBTW28uc2x1Z10gfHwgWydkaWdlcicsICdiZWxnZScsIG8uYWQsIG8ub3pdOwogICAgICAgICAgdmFyIGFkID0gc1syXSB8fCBvLmFkLCBveiA9IHNbM10gIT09IHVuZGVmaW5lZCA/IHNbM10gOiBvLm96OwogICAgICAgICAgaCArPSAnPGEgY2xhc3M9Im5zLWthcnQiIGhyZWY9IicgKyBlc2Moby55b2wpICsgJyI+PHNwYW4gY2xhc3M9Im5zLWlrb24iPicgKyBzdmcoc1sxXSkgKyAnPC9zcGFuPjxzcGFuIGNsYXNzPSJucy1tZXRpbiI+PGI+JyArIGVzYyhhZCkgKyAnPC9iPicgKwogICAgICAgICAgICAob3ogPyAnPHNwYW4+JyArIGVzYyhveikgKyAnPC9zcGFuPicgOiAnJykgKyAnPC9zcGFuPjxpPuKGkjwvaT48L2E+JzsKICAgICAgICB9KTsKICAgICAgICBoICs9ICc8L2Rpdj48L3NlY3Rpb24+JzsKICAgICAgfSk7CiAgICAgIGggKz0gJzxzZWN0aW9uIGNsYXNzPSJucy1ncnVwIG5zLXJlaGJlciI+PGRpdiBjbGFzcz0ibnMtZ3J1cC11c3QiPjxoMj5LYWxvcmltZXRyZSBSZWhiZXJsZXJpPC9oMj48cD7DnHJldGljaSBiZWxnZWxlcmluZSBkYXlhbmFuIHJlaGJlcmxlcmltaXo8L3A+PC9kaXY+PGRpdiBjbGFzcz0ibnMtcmVoYmVybGVyIj4nOwogICAgICBSLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgaCArPSAnPGEgaHJlZj0iL2Jsb2cvaWNlcmlrLycgKyByWzFdICsgJyI+PGltZyBzcmM9Ii8vd3d3Lm5vdnVzLnRyL2lkZWEvcnUvMDcvbXlhc3NldHMvYmxvZ3MvYmxvZy0nICsgclswXSArICcuanBnIiBhbHQ9IicgKyBlc2MoclsyXSkgKyAnIiBsb2FkaW5nPSJsYXp5IiB3aWR0aD0iMzAwIiBoZWlnaHQ9IjIwMCI+PHNwYW4+JyArIGVzYyhyWzJdKSArICc8L3NwYW4+PC9hPic7IH0pOwogICAgICBoICs9ICc8L2Rpdj48YSBjbGFzcz0ibnMtdHVtdSIgaHJlZj0iL2Jsb2ciPlTDvG0gcmVoYmVybGVyIHZlIHlhesSxbGFyIOKGkjwvYT48L3NlY3Rpb24+PC9kaXY+JzsKICAgICAgdmFyIGthcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBrYXAuaW5uZXJIVE1MID0gaDsKICAgICAgbGlzdGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoa2FwLmZpcnN0Q2hpbGQsIGxpc3RlKTsKICAgICAgbGlzdGUuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgdmFyIGhkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRlbnRib3gtaGVhZGVyJyk7IGlmIChoZCkgaGQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQogIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBjYWxpcyk7IGVsc2UgY2FsaXMoKTsKfSkoKTsKPC9zY3JpcHQ+CjxzY3JpcHQ+Ci8qIE5vdnVzICgyMDI2LTA5KTogL2Jsb2cgZ8O2cnNlbCBkw7x6ZW5pICovCihmdW5jdGlvbiAoKSB7CiAgZnVuY3Rpb24gY2FsaXMoKSB7CiAgICB0cnkgewogICAgICBpZiAoIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdjdXJyZW50LXBhZ2UtYmxvZy1saXN0JykpIHJldHVybjsKICAgICAgdmFyIGthcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ibG9nLWxpc3QtY29udGVudCcpOyBpZiAoIWthcCB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubmJsJykpIHJldHVybjsKICAgICAgdmFyIGVzYyA9IGZ1bmN0aW9uIChzKSB7IHJldHVybiBTdHJpbmcocyB8fCAnJykucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvIi9nLCAnJnF1b3Q7Jyk7IH07CiAgICAgIHZhciBvZ2VsZXIgPSBbXS5zbGljZS5jYWxsKGthcC5xdWVyeVNlbGVjdG9yQWxsKCcuYmxvZy1saXN0LWl0ZW0nKSkubWFwKGZ1bmN0aW9uIChpdCkgewogICAgICAgIHZhciBhID0gaXQucXVlcnlTZWxlY3RvcignLmJsb2ctbGlzdC1pdGVtLXRpdGxlIGEnKTsgaWYgKCFhKSByZXR1cm4gbnVsbDsKICAgICAgICB2YXIgaW1nID0gaXQucXVlcnlTZWxlY3RvcignLmJsb2ctbGlzdC1pdGVtLWltYWdlIGltZycpOwogICAgICAgIHZhciB0YXJpaCA9IGl0LnF1ZXJ5U2VsZWN0b3IoJy5ibG9nLWxpc3QtaXRlbS1kYXRlJyk7CiAgICAgICAgcmV0dXJuIHsgeW9sOiBhLmdldEF0dHJpYnV0ZSgnaHJlZicpLCBzbHVnOiAoYS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSB8fCAnJykuc3BsaXQoJy8nKS5wb3AoKSwgYWQ6IGEudGV4dENvbnRlbnQudHJpbSgpLAogICAgICAgICAgb3o6ICgoaXQucXVlcnlTZWxlY3RvcignLmJsb2ctbGlzdC1pdGVtLWV4Y2VycHQnKSB8fCB7fSkudGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKSwKICAgICAgICAgIGltZzogaW1nID8gKGltZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3JjJykgfHwgaW1nLmdldEF0dHJpYnV0ZSgnc3JjJykpIDogJycsIHRhcmloOiB0YXJpaCA/IHRhcmloLnRleHRDb250ZW50LnJlcGxhY2UoL1xzKy9nLCAnICcpLnRyaW0oKSA6ICcnIH07CiAgICAgIH0pLmZpbHRlcihCb29sZWFuKTsKICAgICAgaWYgKCFvZ2VsZXIubGVuZ3RoKSByZXR1cm47CiAgICAgIHZhciBrYWwgPSBmdW5jdGlvbiAobykgeyByZXR1cm4gL14oa2Fsb3JpbWV0cmV8aXNpLXBheS1vbGNlcikvLnRlc3Qoby5zbHVnKTsgfTsKICAgICAgdmFyIHNpcmEgPSBbJ2thbG9yaW1ldHJlLW5lZGlyJywgJ2thbG9yaW1ldHJlLW5hc2lsLW9rdW51cicsICdrYWxvcmltZXRyZS1tYXJrYWxhcmknLCAna2Fsb3JpbWV0cmUtbW9udGFqaScsICdrYWxvcmltZXRyZS1waWxpJywgJ2thbG9yaW1ldHJlLWhhdGEta29kbGFyaScsICdpc2ktcGF5LW9sY2VyLW5hc2lsLW9rdW51ciddOwogICAgICB2YXIgZzEgPSBvZ2VsZXIuZmlsdGVyKGthbCkuc29ydChmdW5jdGlvbiAoYSwgYikgeyB2YXIgeCA9IHNpcmEuaW5kZXhPZihhLnNsdWcpLCB5ID0gc2lyYS5pbmRleE9mKGIuc2x1Zyk7IHJldHVybiAoeCA8IDAgPyA5OSA6IHgpIC0gKHkgPCAwID8gOTkgOiB5KTsgfSk7CiAgICAgIHZhciBnMiA9IG9nZWxlci5maWx0ZXIoZnVuY3Rpb24gKG8pIHsgcmV0dXJuICFrYWwobyk7IH0pOwogICAgICB2YXIgb25lID0gZzEubGVuZ3RoID8gZzEuc2hpZnQoKSA6IGcyLnNoaWZ0KCk7CiAgICAgIHZhciBrYXJ0ID0gZnVuY3Rpb24gKG8sIHJvemV0KSB7CiAgICAgICAgcmV0dXJuICc8YSBjbGFzcz0ibmJsLWthcnQiIGhyZWY9IicgKyBlc2Moby55b2wpICsgJyI+PHNwYW4gY2xhc3M9Im5ibC1nb3JzZWwiPjxpbWcgc3JjPSInICsgZXNjKG8uaW1nKSArICciIGFsdD0iJyArIGVzYyhvLmFkKSArICciIGxvYWRpbmc9ImxhenkiIHdpZHRoPSI2MDAiIGhlaWdodD0iNDAwIj48ZW0+JyArIHJvemV0ICsgJzwvZW0+PC9zcGFuPicgKwogICAgICAgICAgJzxzcGFuIGNsYXNzPSJuYmwtbWV0aW4iPjxiPicgKyBlc2Moby5hZCkgKyAnPC9iPjxzcGFuPicgKyBlc2Moby5vei5zbGljZSgwLCAxNTApKSArIChvLm96Lmxlbmd0aCA+IDE1MCA/ICfigKYnIDogJycpICsgJzwvc3Bhbj48aT5Pa3Ug4oaSPC9pPjwvc3Bhbj48L2E+JzsKICAgICAgfTsKICAgICAgdmFyIGggPSAnPGRpdiBjbGFzcz0ibmJsIj48c2VjdGlvbiBjbGFzcz0ibmJsLWhlcm8iPjxzcGFuIGNsYXNzPSJuYmwtcm96ZXQiPkJpbGdpIG1lcmtlemk8L3NwYW4+PGgxPkJsb2cgdmUgUmVoYmVybGVyPC9oMT4nICsKICAgICAgICAnPHA+S2Fsb3JpbWV0cmUsIMSxc8SxIHBheSDDtmzDp2VyLCBzdSBzYXlhY8SxIHZlIMSxc8SxdG1hIHRlc2lzYXTEsSDDvHplcmluZSDDvHJldGljaSBiZWxnZWxlcmluZSBkYXlhbmFuIHJlaGJlcmxlciB2ZSB1eWd1bGFtYSB5YXrEsWxhcsSxLjwvcD4nICsKICAgICAgICAnPGRpdiBjbGFzcz0ibmJsLWhpemxpIj48YSBocmVmPSIjbmJsLWthbG9yaW1ldHJlIj5LYWxvcmltZXRyZSByZWhiZXJsZXJpPC9hPjxhIGhyZWY9IiNuYmwtdGVzaXNhdCI+SXPEsXRtYSB2ZSB0ZXNpc2F0PC9hPjxhIGhyZWY9Ii9zYXlmYWxhciI+SGl6bWV0IHNheWZhbGFyxLE8L2E+PC9kaXY+PC9zZWN0aW9uPic7CiAgICAgIGlmIChvbmUpIHsKICAgICAgICBoICs9ICc8YSBjbGFzcz0ibmJsLW9uZSIgaHJlZj0iJyArIGVzYyhvbmUueW9sKSArICciPjxzcGFuIGNsYXNzPSJuYmwtb25lLWdvcnNlbCI+PGltZyBzcmM9IicgKyBlc2Mob25lLmltZykgKyAnIiBhbHQ9IicgKyBlc2Mob25lLmFkKSArICciIHdpZHRoPSI5MDAiIGhlaWdodD0iNjAwIj48L3NwYW4+JyArCiAgICAgICAgICAnPHNwYW4gY2xhc3M9Im5ibC1vbmUtbWV0aW4iPjxlbT7Dlm5lIMOnxLFrYW4gcmVoYmVyPC9lbT48Yj4nICsgZXNjKG9uZS5hZCkgKyAnPC9iPjxzcGFuPicgKyBlc2Mob25lLm96LnNsaWNlKDAsIDI2MCkpICsgJzwvc3Bhbj48aT5SZWhiZXJpIG9rdSDihpI8L2k+PC9zcGFuPjwvYT4nOwogICAgICB9CiAgICAgIGlmIChnMS5sZW5ndGgpIHsgaCArPSAnPHNlY3Rpb24gY2xhc3M9Im5ibC1ncnVwIiBpZD0ibmJsLWthbG9yaW1ldHJlIj48ZGl2IGNsYXNzPSJuYmwtZ3J1cC11c3QiPjxoMj5LYWxvcmltZXRyZSB2ZSBJc8SxIFBheSDDlmzDp2VyIFJlaGJlcmxlcmk8L2gyPjxwPlNlw6dpbSwgb2t1bWEsIG1vbnRhaiwgcGlsIHZlIGhhdGEga29kbGFyxLE8L3A+PC9kaXY+PGRpdiBjbGFzcz0ibmJsLWthcnRsYXIiPic7IGcxLmZvckVhY2goZnVuY3Rpb24gKG8pIHsgaCArPSBrYXJ0KG8sICdSZWhiZXInKTsgfSk7IGggKz0gJzwvZGl2Pjwvc2VjdGlvbj4nOyB9CiAgICAgIGlmIChnMi5sZW5ndGgpIHsgaCArPSAnPHNlY3Rpb24gY2xhc3M9Im5ibC1ncnVwIiBpZD0ibmJsLXRlc2lzYXQiPjxkaXYgY2xhc3M9Im5ibC1ncnVwLXVzdCI+PGgyPklzxLF0bWEgdmUgVGVzaXNhdCBZYXrEsWxhcsSxPC9oMj48cD5ZZXJkZW4gxLFzxLF0bWEsIGtvbGxla3TDtnIsIGdpZGVyIHBheWxhxZ/EsW3EsSB2ZSB0ZXNpc2F0PC9wPjwvZGl2PjxkaXYgY2xhc3M9Im5ibC1rYXJ0bGFyIj4nOyBnMi5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7IGggKz0ga2FydChvLCAnWWF6xLEnKTsgfSk7IGggKz0gJzwvZGl2Pjwvc2VjdGlvbj4nOyB9CiAgICAgIGggKz0gJzxzZWN0aW9uIGNsYXNzPSJuYmwtaGl6bWV0Ij48YSBocmVmPSIvc2F5ZmEvaXNpLXNheWFjaS1tdWF5ZW5lLXZlLWthbGlicmFzeW9uIj48Yj5Jc8SxIFNheWFjxLEgTXVheWVuZXNpPC9iPjxzcGFuPk11YXllbmUgdGFrdmltaSB2ZSAyMDI2IGJlZGVsbGVyaTwvc3Bhbj48L2E+JyArCiAgICAgICAgJzxhIGhyZWY9Ii9zYXlmYS9zdS1zYXlhYy1heWlybWEtYmlyZXlzZWwtYWJvbmVsaWsiPjxiPlN1IFNheWFjxLEgQXnEsXJtYTwvYj48c3Bhbj7EsFNLxLAgR0lTIHByb2plc2kgdmUgYmlyZXlzZWwgYWJvbmVsaWs8L3NwYW4+PC9hPicgKwogICAgICAgICc8YSBocmVmPSIvc2F5ZmEveWVyZGVuLWlzaXRtYS16ZW1pbmRlbi1oZXNhcGxhbWEtcHJvZ3JhbWktdmUtbWFsaXlldC1oZXNhYmkiPjxiPlllcmRlbiBJc8SxdG1hIEhlc2FwbGFtYTwvYj48c3Bhbj5Cb3J1IG1ldHJlc2kgdmUgZGV2cmUgc2F5xLFzxLE8L3NwYW4+PC9hPjwvc2VjdGlvbj48L2Rpdj4nOwogICAgICB2YXIgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBkLmlubmVySFRNTCA9IGg7CiAgICAgIGthcC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLmZpcnN0Q2hpbGQsIGthcCk7IGthcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICB2YXIgaGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29udGVudGJveC1oZWFkZXInKTsgaWYgKGhkKSBoZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgfSBjYXRjaCAoZSkge30KICB9CiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGNhbGlzKTsgZWxzZSBjYWxpcygpOwp9KSgpOwo8L3NjcmlwdD4KPHNjcmlwdD4KLyogTm92dXMgKDIwMjYtMDkpOiAvbWFya2FsYXIgZ8O2cnNlbCBkw7x6ZW5pICsgbWFya2Egc2F5ZmFzxLEgYnJlYWRjcnVtYiAqLwooZnVuY3Rpb24gKCkgewogIHZhciBWID0geyJtaW5vbC16ZW5uZXIiOiB7ImFkIjogIk1pbm9sIFplbm5lciIsICJncnVwIjogIm9sY3VtIiwgInVsa2UiOiAiQWxtYW55YSIsICJ0YW5pdGltIjogIkFsbWFueWEgbWVya2V6bGkgTWlub2wtWkVOTkVSIGdydWJ1bnVuIMO2bMOnw7xtIGNpaGF6bGFyxLE7IMO8cmV0aWNpIFpFTk5FUiAxOTAzJ3RlIGt1cnVsZHUsIG1lcmtlemkgU2FhcmJyw7xja2VuJ2RlZGlyLiBub3Z1cy50cidkZSB1bHRyYXNvbmlrIHZlIG1la2FuaWsga2Fsb3JpbWV0cmVsZXIgaWxlIHN1IHNheWHDp2xhcsSxeWxhIHllciBhbMSxci4iLCAiZXRpa2V0IjogWyJVbHRyYXNvbmlrIGthbG9yaW1ldHJlIiwgIk1la2FuaWsga2Fsb3JpbWV0cmUiLCAiU3Ugc2F5YWPEsSIsICJXb2x0bWFuIHN1IHNheWFjxLEiXX0sICJjYWxtZXQiOiB7ImFkIjogIkNhbG1ldCIsICJncnVwIjogIm9sY3VtIiwgInVsa2UiOiAiVMO8cmtpeWUiLCAidGFuaXRpbSI6ICJLYXlzZXJpJ2Rla2kgRk5GIFRla25vbG9qaSBBLsWeLiduaW4gbWFya2FzxLE7IDIwMTQndGVuIGJ1IHlhbmEga2Fsb3JpbWV0cmUsIHN1IHNheWFjxLEgdmUgdXpha3RhbiBva3VtYSBzaXN0ZW1sZXJpIGdlbGnFn3Rpcml5b3IuIG5vdnVzLnRyJ2RlIFBNMDIgdWx0cmFzb25payBrYWxvcmltZXRyZWxlcml5bGUgeWVyIGFsxLFyLiIsICJldGlrZXQiOiBbIlVsdHJhc29uaWsga2Fsb3JpbWV0cmUiLCAiQsO8ecO8ayDDp2FwIGthbG9yaW1ldHJlIl19LCAiY2VtIjogeyJhZCI6ICJDRU0iLCAiZ3J1cCI6ICJvbGN1bSIsICJ1bGtlIjogIlTDvHJraXllIiwgInRhbml0aW0iOiAiMTk3NCd0ZSDEsHN0YW5idWwnZGEga3VydWxhbiBDRU0sIDE5OTQndGUgc3Ugc2F5YWPEsSwgMjAxMyd0ZSBrYWxvcmltZXRyZSDDvHJldGltaW5lIGJhxZ9sYWTEsTsgMjAxMidkZW4gYmVyaSBZYXZ1eiBNZXRhbCBiw7xueWVzaW5kZS4gbm92dXMudHInZGUgQ00tSFIga2Fsb3JpbWV0cmUgdmUgS1QxMyBzdSBzYXlhw6dsYXLEsXlsYSB5ZXIgYWzEsXIuIiwgImV0aWtldCI6IFsiVWx0cmFzb25payBrYWxvcmltZXRyZSIsICJTxLFjYWsgc3Ugc2F5YWPEsSIsICJTb8SfdWsgc3Ugc2F5YWPEsSJdfSwgImhvbmV5d2VsbCI6IHsiYWQiOiAiSG9uZXl3ZWxsIiwgImdydXAiOiAib2xjdW0iLCAidWxrZSI6ICJBQkQiLCAidGFuaXRpbSI6ICJIb25leXdlbGwgbWFya2FsxLEgxLFzxLEgc2F5YcOnbGFyxLEsIEhvbmV5d2VsbCBIb21lIG1hcmthc8SxbsSxIEhvbmV5d2VsbCBJbnRlcm5hdGlvbmFsIEluYy4gbGlzYW5zxLF5bGEga3VsbGFuYW4gUmVzaWRlbyB0YXJhZsSxbmRhbiBzdW51bHVyLiBub3Z1cy50cidkZSBFVzcwMCBzZXJpc2kgdWx0cmFzb25payBrYWxvcmltZXRyZWxlcmxlIHllciBhbMSxci4iLCAiZXRpa2V0IjogWyJVbHRyYXNvbmlrIGthbG9yaW1ldHJlIiwgIk0tQnVzIGthbG9yaW1ldHJlIl19LCAiZGFuZm9zcyI6IHsiYWQiOiAiRGFuZm9zcyIsICJncnVwIjogIm9sY3VtIiwgInVsa2UiOiAiRGFuaW1hcmthIiwgInRhbml0aW0iOiAiMTkzMyd0ZSBEYW5pbWFya2EnbsSxbiBOb3JkYm9yZyBrZW50aW5kZSBNYWRzIENsYXVzZW4naW4ga3VyZHXEn3UgRGFuZm9zcywgxLFzxLF0bWEgdmUgc2/En3V0bWEgw6fDtnrDvG1sZXJpIMO8cmV0aXIuIG5vdnVzLnRyJ2RlIFNvbm9TYWZlIDEwIHVsdHJhc29uaWsga2Fsb3JpbWV0cmUgdmUgdGVybW9zdGF0aWsgcmFkeWF0w7ZyIHZhbmFsYXLEsXlsYSB5ZXIgYWzEsXIuIiwgImV0aWtldCI6IFsiVWx0cmFzb25payBrYWxvcmltZXRyZSIsICJUZXJtb3N0YXRpayByYWR5YXTDtnIgdmFuYXPEsSJdfSwgImludGVncmFsIjogeyJhZCI6ICLEsG50ZWdyYWwiLCAiZ3J1cCI6ICJvbGN1bSIsICJ1bGtlIjogIlTDvHJraXllIiwgInRhbml0aW0iOiAixLBudGVncmFsIFNheWHDpyBBLsWeLiwgeWVybGkgdGFzYXLEsW0gdmUgw7xyZXRpbWxlIMSxc8SxIHNheWFjxLEgKGthbG9yaW1ldHJlKSwgc3Ugc2F5YWPEsSB2ZSBrYXQgxLFzxLEgaXN0YXN5b251IGFsYW7EsW5kYSDDp2FsxLHFn8Sxci4gbm92dXMudHInZGUgVUstUExVUyB1bHRyYXNvbmlrIGthbG9yaW1ldHJlc2l5bGUgeWVyIGFsxLFyLiIsICJldGlrZXQiOiBbIkthbG9yaW1ldHJlIiwgIlVsdHJhc29uaWsga2Fsb3JpbWV0cmUiXX0sICJxdW5kaXMiOiB7ImFkIjogIlF1bmRpcyIsICJncnVwIjogIm9sY3VtIiwgInVsa2UiOiAiQWxtYW55YSIsICJ0YW5pdGltIjogIkFsbWFuIMO2bMOnw7xtIGNpaGF6xLEgw7xyZXRpY2lzaSBRVU5ESVMsIDMwIHnEsWzEsSBhxZ9rxLFuIHPDvHJlZGlyIGVsZWt0cm9uaWsgxLFzxLEgcGF5IMO2bMOnZXIsIMSxc8SxIHZlIHN1IHNheWFjxLEgZ2VsacWfdGlyaXlvci4gbm92dXMudHInZGUgcmFkeW8gbW9kw7xsbMO8IFEgY2Fsb3JpYyA1LjUgxLFzxLEgcGF5IMO2bMOnZXJpeWxlIHllciBhbMSxci4iLCAiZXRpa2V0IjogWyJJc8SxIHBheSDDtmzDp2VyIiwgIlJhZHlhdMO2ciB0aXBpIHBheSDDtmzDp2VyIl19LCAicG9saW1ldGVyIjogeyJhZCI6ICJQb2xpbWV0ZXIiLCAiZ3J1cCI6ICJvbGN1bSIsICJ1bGtlIjogIlTDvHJraXllIiwgInRhbml0aW0iOiAiS2F5c2VyaSdkZWtpIEZORiBUZWtub2xvamkgQS7Fni4nbmluIG1hcmthc8SxOyAyMDE0J3RlbiBidSB5YW5hIGthbG9yaW1ldHJlIHZlIHN1IHNheWFjxLEgc3VudXlvci4gbm92dXMudHInZGUgUEhXLTIwIHRlayBow7x6bWVsaSBzxLFjYWsgc3Ugc2F5YWPEsXlsYSB5ZXIgYWzEsXIuIiwgImV0aWtldCI6IFsiU3Ugc2F5YWPEsSIsICJTxLFjYWsgc3Ugc2F5YWPEsSJdfSwgImtsZXBzYW4iOiB7ImFkIjogIktsZXBzYW4iLCAiZ3J1cCI6ICJvbGN1bSIsICJ1bGtlIjogIlTDvHJraXllIiwgInRhbml0aW0iOiAiMTk3MCdsZXJpbiBiYcWfxLFuZGEgxLBzdGFuYnVsIFBlcsWfZW1iZSBQYXphcsSxJ25kYSDDvHJldGltZSBiYcWfbGF5YW4gS2xlcHNhbiwgSGFkxLFta8O2eSdkZWtpIGZhYnJpa2FzxLFuZGEgdmFuYSB2ZSBzdSBzYXlhY8SxIMO8cmV0aXIuIG5vdnVzLnRyJ2RlIHN1IHNheWHDp2xhcsSxIHZlIGvDvHJlc2VsIHZhbmFsYXLEsXlsYSB5ZXIgYWzEsXIuIiwgImV0aWtldCI6IFsiU3Ugc2F5YWPEsSIsICJXb2x0bWFuIHN1IHNheWFjxLEiLCAiS8O8cmVzZWwgdmFuYSIsICLFnmliZXIgdmFuYSJdfSwgImNhbGVmZmkiOiB7ImFkIjogIkNhbGVmZmkiLCAiZ3J1cCI6ICJ0ZXNpc2F0IiwgInVsa2UiOiAixLB0YWx5YSIsICJ0YW5pdGltIjogIjE5NjEnZGUgxLB0YWx5YSdkYSBGcmFuY2VzY28gQ2FsZWZmaSduaW4ga3VyZHXEn3UsIGhpZHJvbmlrIHRlc2lzYXQgYmlsZcWfZW5sZXJpIMO8cmV0ZW4gZmlybWEuIG5vdnVzLnRyJ2RlIGVtbml5ZXQgdmVudGlsaSwgYmFzxLFuw6cgZMO8xZ/DvHLDvGPDvCwgRElTQ0FMIGhhdmEgYXnEsXLEsWPEsSB2ZSBESVJUTUFHIHRvcnR1IHR1dHVjdWxhcsSxeWxhIHllciBhbMSxci4iLCAiZXRpa2V0IjogWyJFbW5peWV0IHZlbnRpbGkiLCAiQmFzxLFuw6cgZMO8xZ/DvHLDvGPDvCB2YW5hIiwgIkhhdmEgYXnEsXLEsWPEsSIsICJUb3J0dSB0dXR1Y3UiXX0sICJrYXMiOiB7ImFkIjogIktBUyIsICJncnVwIjogInRlc2lzYXQiLCAidWxrZSI6ICJUw7xya2l5ZSIsICJ0YW5pdGltIjogIsSwc3RhbmJ1bCdkYWtpIEtheWFsYXIgR3J1cCd1biAxOTk0J3RlIHRlc2NpbCBldHRpcmRpxJ9pIG1hcmthOyByYWR5YXTDtnIgdmFuYXPEsSB2ZSBwaXJpbsOnIGZpdHRpbmdzIGlsZSBiYcWfbGFkxLEuIG5vdnVzLnRyJ2RlIGtvbGxla3TDtnIsIHJhZHlhdMO2ciB2YW5hc8SxLCBrw7xyZXNlbCB2YW5hIHZlIGZsZXggw7xyw7xubGVyaXlsZSB5ZXIgYWzEsXIuIiwgImV0aWtldCI6IFsiS29sbGVrdMO2ciIsICJSYWR5YXTDtnIgdmFuYXPEsSIsICJLw7xyZXNlbCB2YW5hIiwgIlBhc2xhbm1heiBmbGV4Il19LCAiZHV5YXIiOiB7ImFkIjogIkR1eWFyIiwgImdydXAiOiAidGVzaXNhdCIsICJ1bGtlIjogIlTDvHJraXllIiwgInRhbml0aW0iOiAiMTk2NSd0ZSBtZXRhbCBpxZ9sZW1lIGF0w7ZseWVzaSBvbGFyYWsgeW9sYSDDp8Sxa2FuIER1eWFyLCDEsHN0YW5idWwgRXNlbnl1cnQndGFraSB0ZXNpc2xlcmluZGUgdmFuYSB2ZSB5YW5nxLFuIGVraXBtYW7EsSDDvHJldGlyLiBub3Z1cy50cidkZSBzcHJpbmtsZXIsIHlhbmfEsW4gdmFuYWxhcsSxIHZlIGtvbXBhbnNhdMO2cmxlcmxlIHllciBhbMSxci4iLCAiZXRpa2V0IjogWyJTcHJpbmtsZXIiLCAiWWFuZ8SxbiB2YW5hc8SxIiwgIktvbXBhbnNhdMO2ciIsICJLZWxlYmVrIHZhbmEiXX0sICJlY2EiOiB7ImFkIjogIkVDQSIsICJncnVwIjogInRlc2lzYXQiLCAidWxrZSI6ICJUw7xya2l5ZSIsICJ0YW5pdGltIjogIkVsZ2lua2FuIFRvcGx1bHXEn3UgbWFya2FzxLE7IEUuQy5BLiBtYXJrYWzEsSB2YW5hIMO8cmV0aW1pIDE5NTcnZGUgYmHFn2xhZMSxLCBidWfDvG4gTWFuaXNhJ2Rha2kgVkFMRiBTYW5heWlpJ25kZSBzw7xyw7x5b3IuIG5vdnVzLnRyJ2RlIHJhZHlhdMO2ciB2YW5hc8SxLCBrw7xyZXNlbCB2YW5hIHZlIGtvbGxla3TDtnIgc2V0bGVyaXlsZSB5ZXIgYWzEsXIuIiwgImV0aWtldCI6IFsiUmFkeWF0w7ZyIHZhbmFzxLEiLCAiS8O8cmVzZWwgdmFuYSIsICJLb2xsZWt0w7ZyIHNldGkiLCAiVGVybW9zdGF0aWsgdmFuYSJdfSwgImNhc2UiOiB7ImFkIjogIkNhc2UiLCAiZ3J1cCI6ICJ0ZXNpc2F0IiwgInVsa2UiOiAiVMO8cmtpeWUiLCAidGFuaXRpbSI6ICIxOTg0J3RlIEthcmFrw7Z5J2RlIHllZGVrIHBhcsOnYSDDvHJldGltaXlsZSBiYcWfbGF5YW4sIDE5OTUndGUgQ0FTRSBhZMSxbsSxIGFsYW4gZW1uaXlldCB2ZSBrb250cm9sIHZhbmFzxLEgw7xyZXRpY2lzaS4gbm92dXMudHInZGUgZW1uaXlldCB2ZW50aWxpLCBiYXPEsW7DpyBkw7zFn8O8csO8Y8O8IHZlIGthemFuIGRvbGR1cm1hIMO8csO8bmxlcml5bGUgeWVyIGFsxLFyLiIsICJldGlrZXQiOiBbIkVtbml5ZXQgdmVudGlsaSIsICJCYXPEsW7DpyBkw7zFn8O8csO8Y8O8IHZhbmEiLCAiT3RvbWF0aWsgZG9sZHVybWEgw7xuaXRlc2kiLCAiVGVybW9zdGF0aWsga2FyxLHFn8SxbSB2YW5hc8SxIl19LCAia2FsZGUiOiB7ImFkIjogIkthbGRlIiwgImdydXAiOiAidGVzaXNhdCIsICJ1bGtlIjogIlTDvHJraXllIiwgInRhbml0aW0iOiAiMTk3NydkZSBrdXJ1bGFuIEthbGRlLCBtZXRhbCBpbWFsYXTEsW5kYW4gMjAwMCdsZXJkZSBwbGFzdGlrIGJvcnUgdmUgdGVzaXNhdCBzaXN0ZW1sZXJpbmUgdXphbmFuIMSwc3RhbmJ1bCBtZXJrZXpsaSDDvHJldGljaWRpci4gbm92dXMudHInZGUgcmFkeWF0w7ZyIHZhbmFzxLEsIGvDvHJlc2VsIHZhbmEgdmUga3JvbSB1emF0bWFsYXLEsXlsYSB5ZXIgYWzEsXIuIiwgImV0aWtldCI6IFsiUmFkeWF0w7ZyIHZhbmFzxLEiLCAiS8O8cmVzZWwgdmFuYSIsICJEb8SfYWxnYXogdmFuYXPEsSIsICJLcm9tIHV6YXRtYSJdfSwgInRyYWt5YS1kb2t1bSI6IHsiYWQiOiAiVHJha3lhIETDtmvDvG0iLCAiZ3J1cCI6ICJ0ZXNpc2F0IiwgInVsa2UiOiAiVMO8cmtpeWUiLCAidGFuaXRpbSI6ICJTb3lhayBIb2xkaW5nIGLDvG55ZXNpbmRlIDE5ODAnZGVuIGJlcmkgw7xyZXRpbSB5YXBhbiBUcmFreWEgRMO2a8O8bSwgVFMgRU4gMTAyNDIneWUgdXlndW4gdGVtcGVyIGTDtmttZSBkZW1pciBib3J1IGVrbGVtZSBwYXLDp2FsYXLEsSAoZml0dGluZ3MpIMO8cmV0aXIuIG5vdnVzLnRyJ2RlIGRpcnNlaywgdGUsIG1hbsWfb24gdmUgbmlwZWxsZXJsZSB5ZXIgYWzEsXIuIiwgImV0aWtldCI6IFsiVGVtcGVyIGTDtmvDvG0gZml0dGluZ3MiLCAiRGnFn2xpIGJhxJ9sYW50xLEgcGFyw6dhc8SxIiwgIkRvxJ9hbGdheiB0ZXN0IHBhcsOnYXPEsSJdfSwgImdmLWhha2FuLXBsYXN0aWsiOiB7ImFkIjogIkdGIEhha2FuIFBsYXN0aWsiLCAiZ3J1cCI6ICJ0ZXNpc2F0IiwgInVsa2UiOiAiVMO8cmtpeWUiLCAidGFuaXRpbSI6ICIxOTY1J3RlbiBiZXJpIHBsYXN0aWsgYm9ydSDDvHJldGVuIEdGIEhha2FuIFBsYXN0aWssIDIwMTMndGVuIGJ1IHlhbmEgR2VvcmcgRmlzY2hlciAoR0YpIGLDvG55ZXNpbmRlZGlyLiBub3Z1cy50cidkZSBQUFJDIGZpdHRpbmdzIHZlIGJhdGFyeWEgYmHEn2xhbnTEsSBwYXLDp2FsYXLEsXlsYSB5ZXIgYWzEsXIuIiwgImV0aWtldCI6IFsiUFBSQyBmaXR0aW5ncyIsICJCYXRhcnlhIGJhxJ9sYW50xLFzxLEiXX0sICJoYXVzdGhlcm0iOiB7ImFkIjogIkhhdXN0aGVybSIsICJncnVwIjogInRlc2lzYXQiLCAidWxrZSI6ICJUw7xya2l5ZSIsICJ0YW5pdGltIjogIkFua2FyYSBHw7ZsYmHFn8SxJ25kYWtpIEhhdXN0aGVybSBZZXJkZW4gSXPEsXRtYSBTaXN0ZW1sZXJpIEEuxZ4uJ25pbiBtYXJrYXPEsTsgeWVyZGVuIMSxc8SxdG1hZGEgZGFuxLHFn21hbmzEsWssIHByb2plbGVuZGlybWUsIMO8csO8biB0ZWRhcmnEn2kgdmUgdXlndWxhbWEgeWFwYXIuIG5vdnVzLnRyJ2RlIHBhc2xhbm1heiBrb2xsZWt0w7ZyIHNldGl5bGUgeWVyIGFsxLFyLiIsICJldGlrZXQiOiBbIlllcmRlbiDEsXPEsXRtYSBrb2xsZWt0w7Zyw7wiLCAiTWFuaWZvbGQgc2V0aSJdfSwgIm5vdnVzIjogeyJhZCI6ICJOb3Z1cyIsICJncnVwIjogIm9sY3VtIiwgInVsa2UiOiAiVMO8cmtpeWUiLCAidGFuaXRpbSI6ICJOb3Z1cyBtYXJrYXPEsXlsYSBzdW51bGFuIERpZ2l0ZXJtbyBEVEwgc2VyaXNpIHVsdHJhc29uaWsga2Fsb3JpbWV0cmVsZXI7IHV6YWt0YW4gb2t1bWEgdmUgxLFzxLEgZ2lkZXJpIHBheWxhxZ/EsW3EsSBoaXptZXRsZXJpeWxlIGJpcmxpa3RlLiIsICJldGlrZXQiOiBbIlVsdHJhc29uaWsga2Fsb3JpbWV0cmUiLCAiTS1CdXMiXX0sICJudnMiOiB7ImFkIjogIk5WUyIsICJncnVwIjogInRlc2lzYXQiLCAidWxrZSI6ICJUw7xya2l5ZSIsICJ0YW5pdGltIjogIk5vdnVz4oCZdW4gdGVzaXNhdCBtYXJrYXPEsTogc2F5YcOnIHJla29ybGFyxLEsIHN1IHNheWFjxLEga29sbGVrdMO2cmxlcmkgdmUgYmHEn2xhbnTEsSBlbGVtYW5sYXLEsS4iLCAiZXRpa2V0IjogWyJTYXlhw6cgcmVrb3J1IiwgIlNheWHDpyBrb2xsZWt0w7Zyw7wiLCAiQmHEn2xhbnTEsSBlbGVtYW7EsSJdfX07CiAgdmFyIFMgPSB7Im9sY3VtIjogWyJtaW5vbC16ZW5uZXIiLCAiY2FsbWV0IiwgImNlbSIsICJob25leXdlbGwiLCAiZGFuZm9zcyIsICJpbnRlZ3JhbCIsICJxdW5kaXMiLCAicG9saW1ldGVyIiwgImtsZXBzYW4iLCAibm92dXMiXSwgInRlc2lzYXQiOiBbImNhbGVmZmkiLCAiZHV5YXIiLCAia2FzIiwgImVjYSIsICJjYXNlIiwgImthbGRlIiwgInRyYWt5YS1kb2t1bSIsICJnZi1oYWthbi1wbGFzdGlrIiwgIm52cyIsICJoYXVzdGhlcm0iXX07CiAgdmFyIGVzYyA9IGZ1bmN0aW9uIChzKSB7IHJldHVybiBTdHJpbmcocyB8fCAnJykucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvIi9nLCAnJnF1b3Q7Jyk7IH07CiAgZnVuY3Rpb24gbWFya2FsYXIoKSB7CiAgICB2YXIga2FwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJyYW5kLWxpc3QnKTsgaWYgKCFrYXAgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5taycpKSByZXR1cm47CiAgICB2YXIgc2lzdGVtID0ge307CiAgICBbXS5zbGljZS5jYWxsKGthcC5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWYqPSIvbWFya2EvIl0nKSkuZm9yRWFjaChmdW5jdGlvbiAoYSkgewogICAgICB2YXIgc2x1ZyA9IChhLmdldEF0dHJpYnV0ZSgnaHJlZicpIHx8ICcnKS5zcGxpdCgnL21hcmthLycpWzFdOyBpZiAoIXNsdWcpIHJldHVybjsKICAgICAgdmFyIGltZyA9IGEucXVlcnlTZWxlY3RvcignaW1nJyk7CiAgICAgIHNpc3RlbVtzbHVnXSA9IHsgeW9sOiBhLmdldEF0dHJpYnV0ZSgnaHJlZicpLCBpbWc6IGltZyA/IChpbWcuZ2V0QXR0cmlidXRlKCdkYXRhLXNyYycpIHx8IGltZy5nZXRBdHRyaWJ1dGUoJ3NyYycpKSA6ICcnLCBhZDogKGEudGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKSB9OwogICAgfSk7CiAgICB2YXIga2FydCA9IGZ1bmN0aW9uIChzbHVnKSB7CiAgICAgIHZhciB2ID0gVltzbHVnXSwgcyA9IHNpc3RlbVtzbHVnXTsgaWYgKCF2IHx8ICFzKSByZXR1cm4gJyc7CiAgICAgIHZhciBsb2dvID0gcy5pbWcgJiYgIS9uby1pbWFnZXxub2ltYWdlfHBsYWNlaG9sZGVyfFwvdGhlbWVzXC8vaS50ZXN0KHMuaW1nKQogICAgICAgID8gJzxpbWcgc3JjPSInICsgZXNjKHMuaW1nKSArICciIGFsdD0iJyArIGVzYyh2LmFkKSArICcgbG9nb3N1IiBsb2FkaW5nPSJsYXp5IiB3aWR0aD0iNjAwIiBoZWlnaHQ9IjMwMCI+JwogICAgICAgIDogJzxiIGNsYXNzPSJubWsteWF6aSI+JyArIGVzYyh2LmFkKSArICc8L2I+JzsKICAgICAgcmV0dXJuICc8YSBjbGFzcz0ibm1rLWthcnQiIGhyZWY9IicgKyBlc2Mocy55b2wpICsgJyI+PHNwYW4gY2xhc3M9Im5tay1sb2dvIj4nICsgbG9nbyArICc8L3NwYW4+JyArCiAgICAgICAgJzxzcGFuIGNsYXNzPSJubWstbWV0aW4iPjxzcGFuIGNsYXNzPSJubWstYWQiPjxiPicgKyBlc2Modi5hZCkgKyAnPC9iPicgKyAodi51bGtlID8gJzxlbT4nICsgZXNjKHYudWxrZSkgKyAnPC9lbT4nIDogJycpICsgJzwvc3Bhbj4nICsKICAgICAgICAnPHNwYW4gY2xhc3M9Im5tay10YW5pdGltIj4nICsgZXNjKHYudGFuaXRpbSkgKyAnPC9zcGFuPicgKwogICAgICAgICc8c3BhbiBjbGFzcz0ibm1rLWV0aWtldGxlciI+JyArIHYuZXRpa2V0Lm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gJzxpPicgKyBlc2MoZSkgKyAnPC9pPic7IH0pLmpvaW4oJycpICsgJzwvc3Bhbj4nICsKICAgICAgICAnPHNwYW4gY2xhc3M9Im5tay1naXQiPsOccsO8bmxlcmkgZ8O2ciDihpI8L3NwYW4+PC9zcGFuPjwvYT4nOwogICAgfTsKICAgIHZhciBncnVwID0gZnVuY3Rpb24gKGlkLCBiYXNsaWssIGFsdCwgbGlzdGUpIHsKICAgICAgdmFyIGljID0gbGlzdGUubWFwKGthcnQpLmpvaW4oJycpOyBpZiAoIWljKSByZXR1cm4gJyc7CiAgICAgIHJldHVybiAnPHNlY3Rpb24gY2xhc3M9Im5tay1ncnVwIiBpZD0iJyArIGlkICsgJyI+PGRpdiBjbGFzcz0ibm1rLWdydXAtdXN0Ij48aDI+JyArIGJhc2xpayArICc8L2gyPjxwPicgKyBhbHQgKyAnPC9wPjwvZGl2PjxkaXYgY2xhc3M9Im5tay1rYXJ0bGFyIj4nICsgaWMgKyAnPC9kaXY+PC9zZWN0aW9uPic7CiAgICB9OwogICAgdmFyIGthbGFuID0gT2JqZWN0LmtleXMoc2lzdGVtKS5maWx0ZXIoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIFZbc10gJiYgUy5vbGN1bS5pbmRleE9mKHMpIDwgMCAmJiBTLnRlc2lzYXQuaW5kZXhPZihzKSA8IDA7IH0pOwogICAgdmFyIG4gPSBPYmplY3Qua2V5cyhzaXN0ZW0pLmZpbHRlcihmdW5jdGlvbiAocykgeyByZXR1cm4gVltzXTsgfSkubGVuZ3RoOwogICAgdmFyIGggPSAnPGRpdiBjbGFzcz0ibm1rIj48c2VjdGlvbiBjbGFzcz0ibm1rLWhlcm8iPjxzcGFuIGNsYXNzPSJubWstcm96ZXQiPk1hcmthbGFyxLFtxLF6PC9zcGFuPjxoMT5NYXJrYWxhcjwvaDE+JyArCiAgICAgICc8cD7DlmzDp8O8bSwgc2F5YcOnIHZlIHRlc2lzYXQgw7xyw7xubGVyaW5kZSBiaXJsaWt0ZSDDp2FsxLHFn3TEscSfxLFtxLF6ICcgKyBuICsgJyDDvHJldGljaS4gTWFya2F5xLEgc2XDp2luLCBvIG1hcmthbsSxbiBub3Z1cy50cuKAmWRla2kgYsO8dMO8biDDvHLDvG5sZXJpbmkgZ8O2csO8bi48L3A+JyArCiAgICAgICc8ZGl2IGNsYXNzPSJubWstaGl6bGkiPjxhIGhyZWY9IiNubWstb2xjdW0iPsOWbMOnw7xtIHZlIHNheWHDpyBtYXJrYWxhcsSxPC9hPjxhIGhyZWY9IiNubWstdGVzaXNhdCI+VGVzaXNhdCB2ZSB2YW5hIG1hcmthbGFyxLE8L2E+PGEgaHJlZj0iL2thdGVnb3JpL2thbG9yaW1ldHJlIj5LYWxvcmltZXRyZWxlcjwvYT48YSBocmVmPSIva2F0ZWdvcmkvc3Utc2F5YWNpIj5TdSBzYXlhw6dsYXLEsTwvYT48L2Rpdj48L3NlY3Rpb24+JyArCiAgICAgIGdydXAoJ25tay1vbGN1bScsICfDlmzDp8O8bSB2ZSBTYXlhw6cgTWFya2FsYXLEsScsICdLYWxvcmltZXRyZSwgc3Ugc2F5YWPEsSwgxLFzxLEgcGF5IMO2bMOnZXIgdmUgb2t1bWEgZWtpcG1hbmxhcsSxJywgUy5vbGN1bS5jb25jYXQoa2FsYW4uZmlsdGVyKGZ1bmN0aW9uIChzKSB7IHJldHVybiBWW3NdLmdydXAgPT09ICdvbGN1bSc7IH0pKSkgKwogICAgICBncnVwKCdubWstdGVzaXNhdCcsICdUZXNpc2F0IHZlIFZhbmEgTWFya2FsYXLEsScsICdWYW5hLCBrb2xsZWt0w7ZyLCBoYXZhIHZlIHRvcnR1IGF5xLFyxLFjxLEsIGJvcnUgdmUgYmHEn2xhbnTEsSBlbGVtYW5sYXLEsScsIFMudGVzaXNhdC5jb25jYXQoa2FsYW4uZmlsdGVyKGZ1bmN0aW9uIChzKSB7IHJldHVybiBWW3NdLmdydXAgIT09ICdvbGN1bSc7IH0pKSkgKwogICAgICAnPC9kaXY+JzsKICAgIHZhciBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGQuaW5uZXJIVE1MID0gaDsKICAgIGthcC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLmZpcnN0Q2hpbGQsIGthcCk7IGthcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgdmFyIGhkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRlbnRib3gtaGVhZGVyJyk7IGlmIChoZCkgaGQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICB9CiAgZnVuY3Rpb24gbWFya2FCcmVhZGNydW1iKCkgewogICAgaWYgKGxvY2F0aW9uLnBhdGhuYW1lLmluZGV4T2YoJy9tYXJrYS8nKSAhPT0gMCkgcmV0dXJuOwogICAgdmFyIG9sID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignb2xbdHlwZW9mPSJCcmVhZGNydW1iTGlzdCJdJyk7IGlmICghb2wgfHwgb2wucXVlcnlTZWxlY3RvcignLm5tay1iYycpKSByZXR1cm47CiAgICB2YXIgaWxrID0gb2wucXVlcnlTZWxlY3RvcignbGknKTsgaWYgKCFpbGspIHJldHVybjsKICAgIHZhciBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7IGxpLmNsYXNzTmFtZSA9ICdubWstYmMnOwogICAgbGkuaW5uZXJIVE1MID0gJzxzcGFuPjxpPjwvaT48YSBocmVmPSIvbWFya2FsYXIiPk1hcmthbGFyPC9hPjwvc3Bhbj4nOwogICAgaWxrLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGxpLCBpbGsubmV4dFNpYmxpbmcpOwogIH0KICBmdW5jdGlvbiBjYWxpcygpIHsKICAgIHRyeSB7IGlmIChkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygnY3VycmVudC1wYWdlLWJyYW5kLWluZGV4JykpIG1hcmthbGFyKCk7IG1hcmthQnJlYWRjcnVtYigpOyB9IGNhdGNoIChlKSB7fQogIH0KICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgY2FsaXMpOyBlbHNlIGNhbGlzKCk7Cn0pKCk7Cjwvc2NyaXB0Pgo8c2NyaXB0Pi8qIE5vdnVzIDIwMjY6IGthdGVnb3JpIGHDp8Sxa2xhbWFzxLEgbW9iaWxkZSBrxLFzYWx0xLFsxLFyIChtZXRpbiBzYXlmYWRhIGthbMSxcikgKi8KKGZ1bmN0aW9uKCl7ZnVuY3Rpb24ga3VyKCl7dmFyIGg9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWQtY29udGVudCcpO2lmKCFofHx3aW5kb3cuaW5uZXJXaWR0aD43Njd8fGguZ2V0QXR0cmlidXRlKCdkYXRhLW52LWtpc2EnKSlyZXR1cm47aWYoaC5zY3JvbGxIZWlnaHQ8MjYwKXJldHVybjtoLnNldEF0dHJpYnV0ZSgnZGF0YS1udi1raXNhJywnMScpO2guY2xhc3NMaXN0LmFkZCgnbnYta2lzYScpO3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO2IudHlwZT0nYnV0dG9uJztiLmNsYXNzTmFtZT0nbnYtZGV2YW0nO2IudGV4dENvbnRlbnQ9J0RldmFtxLFuxLEgb2t1JztiLm9uY2xpY2s9ZnVuY3Rpb24oKXt2YXIgYT1oLmNsYXNzTGlzdC50b2dnbGUoJ252LWtpc2EnKTtiLnRleHRDb250ZW50PWE/J0RldmFtxLFuxLEgb2t1JzonRGFoYSBheiBnw7ZzdGVyJzt9O2gucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYixoLm5leHRTaWJsaW5nKTt9aWYoZG9jdW1lbnQucmVhZHlTdGF0ZSE9PSdsb2FkaW5nJylrdXIoKTtlbHNlIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLGt1cik7fSkoKTsKPC9zY3JpcHQ+CjxzY3JpcHQ+LyogTm92dXMgMjAyNjogbWFya2EgZmlsdHJlc2luZGUgbG9nb2xhciAqLwooZnVuY3Rpb24oKXt2YXIgQj0iLy93d3cubm92dXMudHIvaWRlYS9ydS8wNy90aGVtZXMvc2VsZnRwbF82YWFlODU4MGRjMTBiL2Fzc2V0cy91cGxvYWRzL252LW1hcmthLSIsUz1bImNhbGVmZmkiLCJjYWxtZXQiLCJjYXNlIiwiY2VtIiwiZGFuZm9zcyIsImR1eWFyIiwiZWNhIiwiZ2YtaGFrYW4tcGxhc3RpayIsImhhdXN0aGVybSIsImhvbmV5d2VsbCIsImludGVncmFsIiwia2FsZGUiLCJrYXMiLCJrbGVwc2FuIiwibWFkZGFsZW5hIiwibWlub2wtemVubmVyIiwibm92dXMiLCJudnMiLCJwb2xpbWV0ZXIiLCJwb3dvZ2F6IiwicXVuZGlzIiwidHJha3lhLWRva3VtIl0sTD17fTtmb3IodmFyIHE9MDtxPFMubGVuZ3RoO3ErKylMW1NbcV1dPUIrU1txXSsiLnBuZz92PTQiOwpmdW5jdGlvbiBmaWx0cmUoKXt2YXIga3V0dT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmlsdGVyLW1lbnUtYm94LWJyYW5kIC5jaGVja2JveC1jdXN0b20nKTtmb3IodmFyIGk9MDtpPGt1dHUubGVuZ3RoO2krKyl7dmFyIGM9a3V0dVtpXTtpZihjLmdldEF0dHJpYnV0ZSgnZGF0YS1udi1sb2dvJykpY29udGludWU7dmFyIGlucD1jLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W2RhdGEtc2x1Z10nKSxsYj1jLnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsJyk7aWYoIWlucHx8IWxiKWNvbnRpbnVlO3ZhciBzPWlucC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2x1ZycpLHU9TFtzXTtjLnNldEF0dHJpYnV0ZSgnZGF0YS1udi1sb2dvJywnMScpO2lmKCF1KWNvbnRpbnVlO3ZhciB0PWxiLnRleHRDb250ZW50LnJlcGxhY2UoL1xzKy9nLCcgJykudHJpbSgpLG09dC5tYXRjaCgvXiguKj8pXHMqXCgoXGQrKVwpJC8pLGFkPW0/bVsxXTp0LHNheT1tP21bMl06Jyc7bGIudGV4dENvbnRlbnQ9Jyc7bGIuY2xhc3NMaXN0LmFkZCgnbnYtbG9nb2x1Jyk7dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO2suY2xhc3NOYW1lPSdudi1tbG9nbyc7dmFyIGltPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO2ltLnNyYz11O2ltLmFsdD1hZDtpbS5sb2FkaW5nPSdsYXp5JztrLmFwcGVuZENoaWxkKGltKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7Zy5jbGFzc05hbWU9J252LWdpemxpJztnLnRleHRDb250ZW50PWFkO2xiLmFwcGVuZENoaWxkKGspO2xiLmFwcGVuZENoaWxkKGcpO2lmKHNheSl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO24uY2xhc3NOYW1lPSdudi1tc2F5JztuLnRleHRDb250ZW50PXNheTtsYi5hcHBlbmRDaGlsZChuKTt9bGIudGl0bGU9YWQ7fX0KZnVuY3Rpb24ga2FydCgpe3ZhciBhPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zaG93Y2FzZS1icmFuZCBhOm5vdChbZGF0YS1udi1sb2dvXSknKTtmb3IodmFyIGk9MDtpPGEubGVuZ3RoO2krKyl7dmFyIGU9YVtpXTtlLnNldEF0dHJpYnV0ZSgnZGF0YS1udi1sb2dvJywnMScpO3ZhciBoPShlLmdldEF0dHJpYnV0ZSgnaHJlZicpfHwnJykuc3BsaXQoJz8nKVswXS5yZXBsYWNlKC9cLyskLywnJykscz1oLnN1YnN0cmluZyhoLmxhc3RJbmRleE9mKCcvJykrMSksdT1MW3NdO2lmKCF1KWNvbnRpbnVlO3ZhciBhZD1lLnRleHRDb250ZW50LnRyaW0oKTtlLnRleHRDb250ZW50PScnO2UuY2xhc3NMaXN0LmFkZCgnbnYta2xvZ28nKTt2YXIgaW09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7aW0uc3JjPXU7aW0uYWx0PWFkO2ltLmxvYWRpbmc9J2xhenknO2UuYXBwZW5kQ2hpbGQoaW0pO2UudGl0bGU9YWQ7fX0KZnVuY3Rpb24gZG4oKXt2YXIgaz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hvd2Nhc2U6bm90KFtkYXRhLW52LWRuXSknKTtmb3IodmFyIGk9MDtpPGsubGVuZ3RoO2krKyl7dmFyIHM9a1tpXTtzLnNldEF0dHJpYnV0ZSgnZGF0YS1udi1kbicsJzEnKTt2YXIgYT1zLnF1ZXJ5U2VsZWN0b3IoJy5zaG93Y2FzZS10aXRsZSBhJyksdD1hP2EudGV4dENvbnRlbnQ6Jyc7aWYoIS9rYWxvcmltZXRyZXzEsXPEsSBzYXlhY8SxfGlzaSBzYXlhY2l8c3Ugc2F5YWN8d29sdG1hbi9pLnRlc3QodCkpY29udGludWU7dmFyIG09dC5tYXRjaCgvRE5ccz8oXGR7MiwzfSkvaSk7aWYoIW0pY29udGludWU7dmFyIGM9cy5xdWVyeVNlbGVjdG9yKCcuc2hvd2Nhc2UtaW1hZ2UtY29udGFpbmVyJyk7aWYoIWMpY29udGludWU7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO2IuY2xhc3NOYW1lPSdudi1kbic7Yi50ZXh0Q29udGVudD0nRE4nK21bMV07Yi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCdHw7Z2ZGUgw6dhcMSxIEROJyttWzFdKTtjLmFwcGVuZENoaWxkKGIpO319CmZ1bmN0aW9uIHV5Z3VsYSgpe2ZpbHRyZSgpO2thcnQoKTtkbigpO30KZnVuY3Rpb24gYmFzKCl7dXlndWxhKCk7aWYod2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIpe3ZhciB6PW51bGw7bmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoeik7ej1zZXRUaW1lb3V0KHV5Z3VsYSw2MCk7fSkub2JzZXJ2ZShkb2N1bWVudC5ib2R5LHtjaGlsZExpc3Q6dHJ1ZSxzdWJ0cmVlOnRydWV9KTt9fQppZihkb2N1bWVudC5yZWFkeVN0YXRlIT09J2xvYWRpbmcnKWJhcygpO2Vsc2UgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsYmFzKTt9KSgpOwo8L3NjcmlwdD4KPHNjcmlwdD4vKiBOb3Z1cyAyMDI2OiDDvHLDvG4gc2F5ZmFzxLEg4oCUIHZhcnlhbnQgc2XDp2ltaSB6b3J1bmx1LCBmaXlhdMSxbiBoYW5naSB2YXJ5YW50YSBhaXQgb2xkdcSfdSwgV2hhdHNBcHAgbWVzYWrEsW5kYSDDvHLDvG4gKi8KKGZ1bmN0aW9uKCl7CmZ1bmN0aW9uIHRlbWl6KHMpe3JldHVybiAoc3x8JycpLnJlcGxhY2UoL1xzKy9nLCcgJykudHJpbSgpO30KZnVuY3Rpb24gZ3J1cGxhcigpe3JldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1yaWdodCAucHJvZHVjdC1vcHRpb25zIC52YXJpYW50LWxpc3QtZ3JvdXAnKTt9CmZ1bmN0aW9uIGJhc2xpayhnKXt2YXIgZT1nLnF1ZXJ5U2VsZWN0b3IoJy52YXJpYW50LWdyb3VwLXRpdGxlJyksdD1lP3RlbWl6KGUudGV4dENvbnRlbnQpOicnO3Q9dC5yZXBsYWNlKC9ccyooU0XDh8SwTsSwWnxTZcOnaW5penxzZcOnaW5peikkLywnJyk7aWYodCYmdD09PXQudG9Mb2NhbGVVcHBlckNhc2UoJ3RyJykpdD10LmNoYXJBdCgwKSt0LnNsaWNlKDEpLnRvTG9jYWxlTG93ZXJDYXNlKCd0cicpO3JldHVybiB0O30KZnVuY3Rpb24gc2VjaW0oZyl7dmFyIHM9Zy5xdWVyeVNlbGVjdG9yKCcudmFyaWFudC1zZWxlY3RlZCcpO3JldHVybiBzP3RlbWl6KHMuZ2V0QXR0cmlidXRlKCdkYXRhLW9wdGlvbi10aXRsZScpfHxzLnRleHRDb250ZW50KTonJzt9CmZ1bmN0aW9uIGR1cnVtKCl7dmFyIEc9Z3J1cGxhcigpLGVrc2lrPVtdLHNlY2lsaT1bXTtmb3IodmFyIGk9MDtpPEcubGVuZ3RoO2krKyl7dmFyIHM9c2VjaW0oR1tpXSk7aWYocylzZWNpbGkucHVzaChzKTtlbHNlIGVrc2lrLnB1c2goR1tpXSk7fXJldHVybiB7RzpHLGVrc2lrOmVrc2lrLHNlY2lsaTpzZWNpbGl9O30KZnVuY3Rpb24gc2F0aXIoYWQpe3ZhciByPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wcm9kdWN0LXJpZ2h0IC5wcm9kdWN0LWxpc3Qtcm93Jyk7Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciB0PXJbaV0ucXVlcnlTZWxlY3RvcignLnByb2R1Y3QtbGlzdC10aXRsZScpO2lmKHQmJnRlbWl6KHQudGV4dENvbnRlbnQpPT09YWQpcmV0dXJuIHJbaV0ucXVlcnlTZWxlY3RvcignLnByb2R1Y3QtbGlzdC1jb250ZW50Jyk7fXJldHVybiBudWxsO30KZnVuY3Rpb24gdXJ1bklkKCl7dmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnByb2R1Y3QtZGV0YWlsLXRhYltkYXRhLXByb2R1Y3QtaWRdJyl8fGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wcm9kdWN0LWNhcnQtYnV0dG9ucyBbZGF0YS1wcm9kdWN0LWlkXScpO3JldHVybiBlP2UuZ2V0QXR0cmlidXRlKCdkYXRhLXByb2R1Y3QtaWQnKTonJzt9Ci8qIGZpeWF0IHNhdMSxcsSxbsSxbiB5YW7EsW5hIG8gZml5YXTEsW4gdmFyeWFudCBhZMSxOiBzZcOnaW0gdGFtYW1zYSBzZcOnaWxlbmxlciwgZGXEn2lsc2UgYW5hIMO8csO8biBmaXlhdMSxbsSxbiBlxZ9sZcWfdGnEn2kgdmFyeWFudCAqLwpmdW5jdGlvbiBmaXlhdEV0aWtldGkoZCl7dmFyIGM9c2F0aXIoJ0ZpeWF0Jyk7aWYoIWMpcmV0dXJuO3ZhciB0PScnO2lmKGQuRy5sZW5ndGgpe2lmKCFkLmVrc2lrLmxlbmd0aCl0PWQuc2VjaWxpLmpvaW4oJyDCtyAnKTtlbHNlIHQ9KHdpbmRvdy5OVl9WRiYmd2luZG93Lk5WX1ZGW3VydW5JZCgpXSl8fCcnO30KdmFyIGU9Yy5xdWVyeVNlbGVjdG9yKCcubnYtdmYnKTtpZighdCl7aWYoZSllLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7cmV0dXJuO31pZighZSl7ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7ZS5jbGFzc05hbWU9J252LXZmJztjLmFwcGVuZENoaWxkKGUpO31pZihlLnRleHRDb250ZW50IT09dCllLnRleHRDb250ZW50PXQ7fQovKiDDtnpldCBhbHTEsW5kYWtpIG5vdDogaGFuZ2kgc2XDp2ltbGVyaW4gZ2VyZWt0acSfaW5pIHlhemFyICovCmZ1bmN0aW9uIG5vdChkKXt2YXIgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1yaWdodCAubnYtdm5vdCcpO2lmKCFufHwhZC5HLmxlbmd0aClyZXR1cm47dmFyIHM9bi5xdWVyeVNlbGVjdG9yKCdzcGFuJyksYWQ9W107Zm9yKHZhciBpPTA7aTxkLkcubGVuZ3RoO2krKylhZC5wdXNoKGJhc2xpayhkLkdbaV0pKTsKdmFyIHQ9ZC5la3Npay5sZW5ndGg/J0J1IMO8csO8biBzZcOnZW5la2xpIHNhdMSxbMSxci4gU2VwZXRlIGVrbGVtZWRlbiDDtm5jZSBhxZ9hxJ/EsWRhbiBzZcOnaW0geWFwxLFuxLF6OiAnK2FkLmpvaW4oJywgJykrJy4nOidTZcOnaW1pbml6OiAnK2Quc2VjaWxpLmpvaW4oJyDCtyAnKSsnLiBGYXJrbMSxIGJpciBzZcOnZW5layBpw6dpbiBhxZ9hxJ/EsWRhbiBkZcSfacWfdGlyZWJpbGlyc2luaXouJzsKaWYocyYmcy50ZXh0Q29udGVudCE9PXQpcy50ZXh0Q29udGVudD10O24uY2xhc3NMaXN0LnRvZ2dsZSgnbnYtdGFtYW0nLCFkLmVrc2lrLmxlbmd0aCk7fQpmdW5jdGlvbiB1eWFyaVRlbWl6bGUoZCl7dmFyIG89ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnByb2R1Y3QtcmlnaHQgLnByb2R1Y3Qtb3B0aW9ucycpO2lmKCFvKXJldHVybjtmb3IodmFyIGk9MDtpPGQuRy5sZW5ndGg7aSsrKWlmKHNlY2ltKGQuR1tpXSkpZC5HW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ252LWVrc2lrJyk7dmFyIG09by5xdWVyeVNlbGVjdG9yKCcubnYtdnV5YXJpJyk7aWYobSYmIWQuZWtzaWsubGVuZ3RoKW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtKTt9CmZ1bmN0aW9uIGd1bmNlbGxlKCl7dmFyIGQ9ZHVydW0oKTtmaXlhdEV0aWtldGkoZCk7bm90KGQpO3V5YXJpVGVtaXpsZShkKTt9CmZ1bmN0aW9uIHV5YXIoZCl7dmFyIG89ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnByb2R1Y3QtcmlnaHQgLnByb2R1Y3Qtb3B0aW9ucycpO2lmKCFvKXJldHVybjt2YXIgYWQ9W107Zm9yKHZhciBpPTA7aTxkLkcubGVuZ3RoO2krKyl7dmFyIGVrPWQuZWtzaWsuaW5kZXhPZihkLkdbaV0pPj0wO2QuR1tpXS5jbGFzc0xpc3QudG9nZ2xlKCdudi1la3NpaycsZWspO2lmKGVrKWFkLnB1c2goYmFzbGlrKGQuR1tpXSkpO30KdmFyIG09by5xdWVyeVNlbGVjdG9yKCcubnYtdnV5YXJpJyk7aWYoIW0pe209ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7bS5jbGFzc05hbWU9J252LXZ1eWFyaSc7bS5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCdhbGVydCcpO28uaW5zZXJ0QmVmb3JlKG0sby5maXJzdENoaWxkKTt9Cm0udGV4dENvbnRlbnQ9J1NlcGV0ZSBla2xlbWVkZW4gw7ZuY2UgbMO8dGZlbiBzZcOnaW0geWFwxLFuxLF6OiAnK2FkLmpvaW4oJywgJyk7Cm8uY2xhc3NMaXN0LnJlbW92ZSgnbnYtc2FsbGEnKTt2b2lkIG8ub2Zmc2V0V2lkdGg7by5jbGFzc0xpc3QuYWRkKCdudi1zYWxsYScpOwp0cnl7by5zY3JvbGxJbnRvVmlldyh7YmVoYXZpb3I6J3Ntb290aCcsYmxvY2s6J2NlbnRlcid9KTt9Y2F0Y2goZSl7by5zY3JvbGxJbnRvVmlldygpO319Ci8qIHNlw6dpbSB0YW1hbWxhbm1hZGFuIHNlcGV0ZSBla2xlbWUgeW9rIChJZGVhU29mdCBidSBkdXJ1bWRhIHNlc3NpemNlIGhpw6diaXIgxZ9leSB5YXBtxLF5b3JkdSkgKi8Kd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihldil7dmFyIGE9ZXYudGFyZ2V0JiZldi50YXJnZXQuY2xvc2VzdCYmZXYudGFyZ2V0LmNsb3Nlc3QoJy5wcm9kdWN0LWNhcnQtYnV0dG9ucyAuYWRkLXRvLWNhcnQtYnV0dG9uJyk7aWYoIWEpcmV0dXJuO3ZhciBkPWR1cnVtKCk7aWYoIWQuZWtzaWsubGVuZ3RoKXJldHVybjtldi5wcmV2ZW50RGVmYXVsdCgpO2V2LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO3V5YXIoZCk7fSx0cnVlKTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGV2KXtpZihldi50YXJnZXQmJmV2LnRhcmdldC5jbG9zZXN0JiZldi50YXJnZXQuY2xvc2VzdCgnLnByb2R1Y3Qtb3B0aW9ucyAudmFyaWFudC1saXN0IHNwYW4nKSlzZXRUaW1lb3V0KGd1bmNlbGxlLDYwKTt9KTsKLyogV2hhdHNBcHAgc2lwYXJpxZ86IG1lc2FqYSDDvHLDvG4gYWTEsSwgc2XDp2VuZWssIHN0b2sga29kdSwgYWRldCB2ZSBzYXlmYSBhZHJlc2kgKi8KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGV2KXt2YXIgYT1ldi50YXJnZXQmJmV2LnRhcmdldC5jbG9zZXN0JiZldi50YXJnZXQuY2xvc2VzdCgnYS5udi13YS1idG4nKTtpZighYSlyZXR1cm47CnZhciB0YWJhbj1hLmdldEF0dHJpYnV0ZSgnZGF0YS1udi13YScpO2lmKCF0YWJhbil7dGFiYW49YS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5zcGxpdCgnPycpWzBdO2Euc2V0QXR0cmlidXRlKCdkYXRhLW52LXdhJyx0YWJhbik7fQp2YXIgaD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1yaWdodCBoMScpLGFkPWg/dGVtaXooaC50ZXh0Q29udGVudCk6dGVtaXooZG9jdW1lbnQudGl0bGUpLGQ9ZHVydW0oKSxzaz1zYXRpcignU3RvayBLb2R1JykscT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1jYXJ0LWJ1dHRvbnMgLnByb2R1Y3QtcXR5IGlucHV0Jyk7CnZhciB0PSdNZXJoYWJhLCBhxZ9hxJ/EsWRha2kgw7xyw7xuIGnDp2luIHNpcGFyacWfIHZlcm1layBpc3RpeW9ydW0uXG5cbsOccsO8bjogJythZDsKaWYoZC5HLmxlbmd0aCl7aWYoIWQuZWtzaWsubGVuZ3RoKXt2YXIgeT1kLnNlY2lsaS5qb2luKCcgwrcgJyk7aWYoYWQuaW5kZXhPZihkLnNlY2lsaVswXSk8MCl0Kz0nXG5TZcOnZW5lazogJyt5O31lbHNlIHQrPSdcblNlw6dlbmVrOiBoZW7DvHogc2XDp2lsbWVkaSc7fQppZihzayYmdGVtaXooc2sudGV4dENvbnRlbnQpKXQrPSdcblN0b2sga29kdTogJyt0ZW1peihzay50ZXh0Q29udGVudCk7CmlmKHEmJnEudmFsdWUpdCs9J1xuQWRldDogJytxLnZhbHVlOwp0Kz0nXG4nK2xvY2F0aW9uLm9yaWdpbitsb2NhdGlvbi5wYXRobmFtZTsKYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLHRhYmFuKyc/dGV4dD0nK2VuY29kZVVSSUNvbXBvbmVudCh0KSk7fSk7CmZ1bmN0aW9uIGJhcygpe2lmKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1yaWdodCcpKXJldHVybjtndW5jZWxsZSgpO2lmKHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyKXt2YXIgej1udWxsO25ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHopO3o9c2V0VGltZW91dChndW5jZWxsZSw4MCk7fSkub2JzZXJ2ZShkb2N1bWVudC5ib2R5LHtjaGlsZExpc3Q6dHJ1ZSxzdWJ0cmVlOnRydWV9KTt9fQppZihkb2N1bWVudC5yZWFkeVN0YXRlIT09J2xvYWRpbmcnKWJhcygpO2Vsc2UgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsYmFzKTt9KSgpOwo8L3NjcmlwdD4KCgp7IyBOb3Z1cyAyMDI2LTA5LTIyOiBrb2xsZWt0w7ZyIG9sdcWfdHVydWN1IEJVUkFEQU4gS0FMRElSSUxESS4KICAgQXJhw6cgYXJ0xLFrIGVycC5ub3Z1cy50ci9rb2xsZWt0b3IgYWRyZXNpbmRlbiDDh0VSw4dFVkVMRU7EsFlPUjsgbW90b3J1biB0ZWsKICAga29weWFzxLEgb3JhZGEgZHVydXlvciB2ZSBnaXQgaWxlIHPDvHLDvG1sZW5peW9yLgogICBCdXJhZGFraSA4NCBLQuKAmWxpayBrb3B5YSBTxLBURU7EsE4gSEVSIFNBWUZBU0lOREEgYXlyxLHFn3TEsXLEsWzEsXlvcmR1IChhbmEKICAgc2F5ZmEgZGFoaWwpIHZlIGVza2ltacWfdGk6IGJvcnUgdmVyaXNpIFNEUiAxMSBpbGUgZHVydXlvcmR1LCBveXNhCiAgIGtvbGxla3TDtnJkZSBkb8SfcnUgc2VyaSBTRFIgOSDigJQga2FwYXNpdGUgaGVzYWLEsSBidSB5w7x6ZGVuIMWfacWfaWsgw6fEsWvEsXlvcmR1LgogICBTYXlmYSBpw6dlcmnEn2k6IC9zYXlmYS9rb2xsZWt0b3Itb2x1c3R1ciAoc2F5ZmEgaWQgMTcpLCBpZnJhbWUgb3JhZGEuCiAgIEthbGTEsXLEsWxtYWRhbiDDtm5jZWtpIHRhbSBow6JsaTogYXNzZXRzL2phdmFzY3JpcHQvbnYteWVkZWstc2NyaXB0cy0yMDI2LTA5LTIyLmpzICN9CgoKCgp7IyBOb3Z1czoga29sbGVrdMO2ciBoZXNhcGxhbWEgYXJhY8SxIOKAlCBpa2kgbW9kOiDDtmzDp8O8ZGVuIGJhxZ9sYSAvIGfDvMOndGVuIGJhxZ9sYSAoeWFsbsSxeiBrxLFsYXZ1eiBzYXlmYXPEsW5kYSkgI30KPHNjcmlwdD4vKiBOb3Z1cyAyMDI2OiBrb2xsZWt0w7ZyIGhlc2FwbGFtYSBhcmFjxLEgKi8KKGZ1bmN0aW9uICgpIHsKICB2YXIgayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5udi1oZXNhcCcpOyBpZiAoIWspIHJldHVybjsKICB2YXIgdkVsID0gay5xdWVyeVNlbGVjdG9yKCcubnYtaGVzYXAtdmVyaScpOyB2YXIgViA9IHt9OwogIHRyeSB7IFYgPSBKU09OLnBhcnNlKHZFbC50ZXh0Q29udGVudCk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuOyB9CiAgdmFyIE0gPSBWLm1hbHplbWUgfHwge307IGlmICghT2JqZWN0LmtleXMoTSkubGVuZ3RoKSByZXR1cm47CiAgdmFyIHEgPSBmdW5jdGlvbiAobikgeyByZXR1cm4gay5xdWVyeVNlbGVjdG9yKCdbbmFtZT0iJyArIG4gKyAnIl0nKTsgfTsKICB2YXIgcyA9IGZ1bmN0aW9uIChuKSB7IHJldHVybiBrLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXM9IicgKyBuICsgJyJdJyk7IH07CiAgdmFyIGUgPSBmdW5jdGlvbiAobikgeyByZXR1cm4gay5xdWVyeVNlbGVjdG9yKCdbZGF0YS1lPSInICsgbiArICciXScpOyB9OwogIHZhciBNT0QgPSAnb2xjdSc7CgogIGZ1bmN0aW9uIG51bSh4KSB7IHZhciB2ID0gcGFyc2VGbG9hdChTdHJpbmcoeCkucmVwbGFjZSgnLCcsICcuJykpOyByZXR1cm4gaXNGaW5pdGUodikgPyB2IDogMDsgfQogIGZ1bmN0aW9uIHRyKHgsIGIpIHsKICAgIGIgPSBiIHx8IDA7IHZhciB0ID0gKE1hdGgucm91bmQoeCAqIE1hdGgucG93KDEwLCBiKSkgLyBNYXRoLnBvdygxMCwgYikpLnRvRml4ZWQoYik7CiAgICB2YXIgcCA9IHQuc3BsaXQoJy4nKTsgcFswXSA9IHBbMF0ucmVwbGFjZSgvXEIoPz0oXGR7M30pKyg/IVxkKSkvZywgJy4nKTsgcmV0dXJuIHAuam9pbignLCcpOwogIH0KICB2YXIgQU1QID0gJyYnICsgJ2FtcDsnLCBMVCA9ICcmJyArICdsdDsnLCBHVCA9ICcmJyArICdndDsnOwogIGZ1bmN0aW9uIGVzYyh0KSB7IHJldHVybiBTdHJpbmcodCkucmVwbGFjZSgvJi9nLCBBTVApLnJlcGxhY2UoLzwvZywgTFQpLnJlcGxhY2UoLz4vZywgR1QpOyB9CiAgZnVuY3Rpb24gYWxhbihkKSB7IHJldHVybiBNYXRoLlBJICogTWF0aC5wb3coZCAvIDIwMDAsIDIpOyB9CiAgZnVuY3Rpb24gbWFsKCkgeyByZXR1cm4gTVtxKCdoX21hbHplbWUnKS52YWx1ZV0gfHwgTS5wYXNsYW5tYXo7IH0KICBmdW5jdGlvbiBidWwobGlzdCwgeCkgeyBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIGlmIChsaXN0W2ldLmUgPT09IHgpIHJldHVybiBsaXN0W2ldOyByZXR1cm4gbnVsbDsgfQogIGZ1bmN0aW9uIGd1YyhxMTUsIGR0KSB7IHZhciBwID0gcTE1ICogMS4xNjMgKiBkdDsgcmV0dXJuIHAgPj0gMTAwMCA/IHRyKHAgLyAxMDAwLCAyKSArICcgTVcnIDogdHIocCwgMCkgKyAnIGtXJzsgfQoKICBmdW5jdGlvbiBkb2xkdXIoc2VsLCBsaXN0LCBzaXJhKSB7CiAgICB2YXIgZXNraSA9IHNlbC52YWx1ZSwgc2VjaWxkaSA9IGZhbHNlOwogICAgd2hpbGUgKHNlbC5maXJzdENoaWxkKSBzZWwucmVtb3ZlQ2hpbGQoc2VsLmZpcnN0Q2hpbGQpOwogICAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChiKSB7CiAgICAgIHZhciBvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7IG8udmFsdWUgPSBiLmU7IG8udGV4dENvbnRlbnQgPSBiLmU7CiAgICAgIGlmIChlc2tpICYmIGIuZSA9PT0gZXNraSkgeyBvLnNlbGVjdGVkID0gdHJ1ZTsgc2VjaWxkaSA9IHRydWU7IH0KICAgICAgc2VsLmFwcGVuZENoaWxkKG8pOwogICAgfSk7CiAgICBpZiAoIXNlY2lsZGkpIHNlbC5zZWxlY3RlZEluZGV4ID0gTWF0aC5taW4oc2lyYSwgc2VsLm9wdGlvbnMubGVuZ3RoIC0gMSk7CiAgfQogIGZ1bmN0aW9uIG1hbHplbWVLdXIoKSB7CiAgICB2YXIgbSA9IG1hbCgpOwogICAgZG9sZHVyKHEoJ2hfZ292ZGUnKSwgbS5jYXBsYXIsIDUpOwogICAgZG9sZHVyKHEoJ2hfYmNhcCcpLCBtLmJyYW5zLCA1KTsKICB9CgogIGZ1bmN0aW9uIG1vZEt1cihtb2QpIHsKICAgIE1PRCA9IG1vZDsKICAgIFtdLmZvckVhY2guY2FsbChrLnF1ZXJ5U2VsZWN0b3JBbGwoJy5udi1tb2QtYnRuJyksIGZ1bmN0aW9uIChiKSB7CiAgICAgIGIuY2xhc3NMaXN0LnRvZ2dsZSgnYWt0aWYnLCBiLmdldEF0dHJpYnV0ZSgnZGF0YS1tb2QnKSA9PT0gbW9kKTsKICAgIH0pOwogICAgW10uZm9yRWFjaC5jYWxsKGsucXVlcnlTZWxlY3RvckFsbCgnLm52LWFsYW4tb2xjdScpLCBmdW5jdGlvbiAoeCkgeyB4LnN0eWxlLmRpc3BsYXkgPSAobW9kID09PSAnb2xjdScpID8gJycgOiAnbm9uZSc7IH0pOwogICAgW10uZm9yRWFjaC5jYWxsKGsucXVlcnlTZWxlY3RvckFsbCgnLm52LWFsYW4tZ3VjIGVtJyksIGZ1bmN0aW9uICh4KSB7IHguc3R5bGUuZGlzcGxheSA9IChtb2QgPT09ICdndWMnKSA/ICdub25lJyA6ICcnOyB9KTsKICAgIGUoJ2dvdmRlJykudGV4dENvbnRlbnQgPSAobW9kID09PSAnb2xjdScpID8gJ1Nlw6dpbGVuIGfDtnZkZScgOiAnw5ZuZXJpbGVuIGfDtnZkZSc7CiAgICBlKCdrYXBhc2l0ZScpLnRleHRDb250ZW50ID0gKG1vZCA9PT0gJ29sY3UnKSA/ICdHw7Z2ZGUga2FwYXNpdGVzaSAow7xzdCBzxLFuxLFyKScgOiAnR2VyZWtlbiBkZWJpJzsKICAgIGhlc2FwbGEoKTsKICB9CgogIGZ1bmN0aW9uIHNlbWEoZywgY2FwLCBhZGV0LCBib3ksIG0pIHsKICAgIHZhciBXID0gNjQwLCBIID0gMjEwLCB4MCA9IDgwLCB4MSA9IDU2MCwgeWMgPSA5NiwgUiA9IE1hdGgubWF4KDksIE1hdGgubWluKDMwLCBnLmQgLyAxMikpOwogICAgdmFyIG8gPSBbJzxzdmcgdmlld0JveD0iMCAwICcgKyBXICsgJyAnICsgSCArICciIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iSGVzYXBsYW5hbiBrb2xsZWt0w7ZyIMWfZW1hc8SxIj4nXTsKICAgIG8ucHVzaCgnPGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJoYyIgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjEiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPicKICAgICAgICAgKyAnPHN0b3Agb2Zmc2V0PSIwLjQiIHN0b3AtY29sb3I9IiNlM2U5ZWYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM5YWE2YjEiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz4nKTsKICAgIHZhciBiZCA9IE1hdGgubWF4KDUsIE1hdGgubWluKDIyLCBjYXAuZCAvIDEwKSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFkZXQ7IGkrKykgewogICAgICB2YXIgeCA9IHgwICsgKHgxIC0geDApICogKGkgKyAwLjUpIC8gYWRldDsKICAgICAgby5wdXNoKCc8cmVjdCB4PSInICsgKHggLSBiZCAvIDIpICsgJyIgeT0iJyArICh5YyAtIFIgLSAzNCkgKyAnIiB3aWR0aD0iJyArIGJkICsgJyIgaGVpZ2h0PSIzNiIgcng9IjIiIGZpbGw9InVybCgjaGMpIiBzdHJva2U9IiMwZjJmNTYiIHN0cm9rZS13aWR0aD0iMS42Ii8+Jyk7CiAgICAgIG8ucHVzaCgnPHJlY3QgeD0iJyArICh4IC0gYmQpICsgJyIgeT0iJyArICh5YyAtIFIgLSA0MikgKyAnIiB3aWR0aD0iJyArIChiZCAqIDIpICsgJyIgaGVpZ2h0PSI4IiByeD0iMiIgZmlsbD0iIzBmMmY1NiIvPicpOwogICAgfQogICAgby5wdXNoKCc8cGF0aCBkPSJNJyArIHgwICsgJyAnICsgKHljIC0gUikgKyAnIEgnICsgeDEgKyAnIGEnICsgUiArICcgJyArIFIgKyAnIDAgMCAxIDAgJyArICgyICogUikgKyAnIEgnICsgeDAgKyAnIGEnICsgUiArICcgJyArIFIgKyAnIDAgMCAxIDAgJyArICgtMiAqIFIpICsgJyBaIiBmaWxsPSJ1cmwoI2hjKSIgc3Ryb2tlPSIjMGYyZjU2IiBzdHJva2Utd2lkdGg9IjIuNCIvPicpOwogICAgby5wdXNoKCc8dGV4dCB4PSInICsgKCh4MCArIHgxKSAvIDIpICsgJyIgeT0iJyArICh5YyArIDQpICsgJyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2ZvbnQtd2VpZ2h0OjcwMDtmaWxsOiMwZjJmNTYiPicgKyBlc2MoZy5lKSArICc8L3RleHQ+Jyk7CiAgICBvLnB1c2goJzxwYXRoIGQ9Ik0nICsgeDAgKyAnICcgKyAoeWMgKyBSICsgMzQpICsgJyBIJyArIHgxICsgJyIgc3Ryb2tlPSIjOGU5OWE2IiBzdHJva2Utd2lkdGg9IjEuMyIvPicpOwogICAgby5wdXNoKCc8cGF0aCBkPSJNJyArIHgwICsgJyAnICsgKHljICsgUiArIDI4KSArICcgdjEyIE0nICsgeDEgKyAnICcgKyAoeWMgKyBSICsgMjgpICsgJyB2MTIiIHN0cm9rZT0iIzhlOTlhNiIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4nKTsKICAgIG8ucHVzaCgnPHRleHQgeD0iJyArICgoeDAgKyB4MSkgLyAyKSArICciIHk9IicgKyAoeWMgKyBSICsgMjgpICsgJyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZpbGw6IzVmNjE1NiI+TCDiiYggJyArIHRyKGJveSkgKyAnIG1tPC90ZXh0PicpOwogICAgby5wdXNoKCc8dGV4dCB4PSInICsgeDAgKyAnIiB5PSInICsgKHljIC0gUiAtIDUyKSArICciIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LXdlaWdodDo3MDA7ZmlsbDojMGYyZjU2Ij4nICsgYWRldCArICcgw5cgJyArIGVzYyhjYXAuZSkgKyAnPC90ZXh0PicpOwogICAgby5wdXNoKCc8dGV4dCB4PSInICsgeDEgKyAnIiB5PSInICsgKHljIC0gUiAtIDUyKSArICciIHRleHQtYW5jaG9yPSJlbmQiIHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOiM1ZjYxNTYiPicgKyBlc2MobS5raXNhKSArICc8L3RleHQ+Jyk7CiAgICBvLnB1c2goJzwvc3ZnPicpOwogICAgcmV0dXJuIG8uam9pbignJyk7CiAgfQoKICBmdW5jdGlvbiBoZXNhcGxhKCkgewogICAgdmFyIG0gPSBtYWwoKSwgZHQgPSBNYXRoLm1heCgzLCBudW0ocSgnaF9kdCcpLnZhbHVlKSB8fCAyMCk7CiAgICB2YXIgaGVkZWYgPSBudW0ocSgnaF9oaXonKS52YWx1ZSkgfHwgMS41OwogICAgdmFyIGJjYXAgPSBidWwobS5icmFucywgcSgnaF9iY2FwJykudmFsdWUpIHx8IG0uYnJhbnNbMF07CiAgICB2YXIgYWRldCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQobnVtKHEoJ2hfYmFkZXQnKS52YWx1ZSkgfHwgMSkpOwogICAgdmFyIGFrcyA9IE1hdGgubWF4KDYwLCBudW0ocSgnaF9ha3MnKS52YWx1ZSkgfHwgMzAwKTsKICAgIHZhciBndWNHaXJpcyA9IG51bShxKCdoX2d1YycpLnZhbHVlKSwgZGViaUdpcmlzID0gbnVtKHEoJ2hfZGViaScpLnZhbHVlKTsKICAgIHZhciBpc3RlbmVuID0gZGViaUdpcmlzID4gMCA/IGRlYmlHaXJpcyA6IChndWNHaXJpcyA+IDAgPyBndWNHaXJpcyAvICgxLjE2MyAqIGR0KSA6IDApOwogICAgdmFyIGJyQWxhbiA9IGFkZXQgKiBhbGFuKGJjYXAuaSk7CiAgICB2YXIgYkthcCA9IGFsYW4oYmNhcC5pKSAqIGhlZGVmICogMzYwMDsgICAgICAgLy8gdGVrIGJyYW7Fn21hbgogICAgdmFyIGJyVG9wID0gYWRldCAqIGJLYXA7CgogICAgdmFyIGdvdmRlLCBoaXogPSAwOwogICAgaWYgKE1PRCA9PT0gJ29sY3UnKSB7CiAgICAgIGdvdmRlID0gYnVsKG0uY2FwbGFyLCBxKCdoX2dvdmRlJykudmFsdWUpIHx8IG0uY2FwbGFyWzBdOwogICAgfSBlbHNlIHsKICAgICAgZ292ZGUgPSBudWxsOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG0uY2FwbGFyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGMgPSBtLmNhcGxhcltpXTsKICAgICAgICB2YXIgdiA9IGlzdGVuZW4gPiAwID8gaXN0ZW5lbiAvIChhbGFuKGMuaSkgKiAzNjAwKSA6IDA7CiAgICAgICAgaWYgKChpc3RlbmVuID09PSAwIHx8IHYgPD0gaGVkZWYpICYmIGFsYW4oYy5pKSA+PSAxLjUgKiBickFsYW4pIHsgZ292ZGUgPSBjOyBicmVhazsgfQogICAgICB9CiAgICAgIGlmICghZ292ZGUpIGdvdmRlID0gbS5jYXBsYXJbbS5jYXBsYXIubGVuZ3RoIC0gMV07CiAgICAgIHEoJ2hfZ292ZGUnKS52YWx1ZSA9IGdvdmRlLmU7CiAgICB9CiAgICB2YXIgQSA9IGFsYW4oZ292ZGUuaSk7CiAgICB2YXIgZ0thcCA9IEEgKiBoZWRlZiAqIDM2MDA7ICAgICAgICAgICAgICAgICAgLy8gZ8O2dmRlbmluIMO8c3Qgc8SxbsSxciBkZWJpc2kKICAgIGlmIChpc3RlbmVuID4gMCkgaGl6ID0gaXN0ZW5lbiAvIChBICogMzYwMCk7CiAgICB2YXIgb3JhbiA9IGJyQWxhbiA+IDAgPyBBIC8gYnJBbGFuIDogMDsKICAgIHZhciB1Y1BheWkgPSBNYXRoLm1heCgxMjAsIE1hdGgucm91bmQoZ292ZGUuZCAqIDAuOCAvIDEwKSAqIDEwKTsKICAgIHZhciBib3lHZXJlayA9IE1hdGgucm91bmQoKGFkZXQgKiBha3MgKyAyICogdWNQYXlpKSAvIDEwKSAqIDEwOwogICAgdmFyIGJveUdpcmlzID0gTWF0aC5yb3VuZChudW0ocSgnaF9ib3knKS52YWx1ZSkpOwogICAgdmFyIGJveSA9IGJveUdpcmlzID4gMCA/IGJveUdpcmlzIDogYm95R2VyZWs7CgogICAgcygnZ292ZGUnKS50ZXh0Q29udGVudCA9IGdvdmRlLmU7CiAgICBzKCdrYXBhc2l0ZScpLnRleHRDb250ZW50ID0gKE1PRCA9PT0gJ29sY3UnIHx8IGlzdGVuZW4gPT09IDApCiAgICAgID8gdHIoZ0thcCwgMSkgKyAnIG3Csy9oIMK3ICcgKyBndWMoZ0thcCwgZHQpCiAgICAgIDogdHIoaXN0ZW5lbiwgMSkgKyAnIG3Csy9oIMK3ICcgKyBndWMoaXN0ZW5lbiwgZHQpOwogICAgcygnYmthcCcpLnRleHRDb250ZW50ID0gdHIoYkthcCwgMSkgKyAnIG3Csy9oIMK3ICcgKyBndWMoYkthcCwgZHQpOwogICAgcygnYnRvcCcpLnRleHRDb250ZW50ID0gYWRldCArICcgw5cgJyArIGJjYXAuZSArICcgPSAnICsgdHIoYnJUb3AsIDEpICsgJyBtwrMvaCDCtyAnICsgZ3VjKGJyVG9wLCBkdCk7CiAgICBzKCdvcmFuJykudGV4dENvbnRlbnQgPSBickFsYW4gPiAwID8gdHIob3JhbiwgMikgOiAn4oCUJzsKICAgIHMoJ2JveScpLnRleHRDb250ZW50ID0gdHIoYm95KSArICcgbW0nOwogICAgZSgnYm95JykudGV4dENvbnRlbnQgPSBib3lHaXJpcyA+IDAgPyAnR2lyaWxlbiBnw7Z2ZGUgYm95dScgOiAnWWFrbGHFn8SxayBnw7Z2ZGUgYm95dSc7CgogICAgdmFyIHUgPSBbXTsKICAgIGlmIChvcmFuID49IDEuNSkgdS5wdXNoKFsndGFtYW0nLCAnS2VzaXQgb3JhbsSxIDxzdHJvbmc+JyArIHRyKG9yYW4sIDIpICsgJzwvc3Ryb25nPiDigJQgJyArIGVzYyhnb3ZkZS5lKSArICcgZ8O2dmRlICcKICAgICAgKyBhZGV0ICsgJyDDlyAnICsgZXNjKGJjYXAuZSkgKyAnIGJyYW7Fn21hbiBpw6dpbiB1eWd1bi4gw5xzdCBzxLFuxLFyICcgKyBndWMoTWF0aC5taW4oZ0thcCwgYnJUb3ApLCBkdCkKICAgICAgKyAnICgnICsgdHIoTWF0aC5taW4oZ0thcCwgYnJUb3ApLCAxKSArICcgbcKzL2gpLiddKTsKICAgIGVsc2UgewogICAgICB2YXIgb25lcmkgPSBudWxsOwogICAgICBmb3IgKHZhciB6ID0gMDsgeiA8IG0uY2FwbGFyLmxlbmd0aDsgeisrKSBpZiAoYWxhbihtLmNhcGxhclt6XS5pKSA+PSAxLjUgKiBickFsYW4pIHsgb25lcmkgPSBtLmNhcGxhclt6XTsgYnJlYWs7IH0KICAgICAgdS5wdXNoKFsnZGlra2F0JywgJ0tlc2l0IG9yYW7EsSA8c3Ryb25nPicgKyB0cihvcmFuLCAyKSArICc8L3N0cm9uZz4sIGt1cmFsIDEsNeKAmXRpci4gJwogICAgICAgICsgKG9uZXJpID8gJ0fDtnZkZXlpIDxzdHJvbmc+JyArIGVzYyhvbmVyaS5lKSArICc8L3N0cm9uZz7igJllIMOnxLFrYXLEsW4nIDogJ0JyYW7Fn21hbmxhcsSxIGlraSBrb2xsZWt0w7ZyZSBiw7Zsw7xuJykKICAgICAgICArICcgeWEgZGEgYnJhbsWfbWFuIHNhecSxc8SxbsSxL8OnYXDEsW7EsSBkw7zFn8O8csO8bi4nXSk7CiAgICB9CiAgICBpZiAoYm95R2lyaXMgPiAwKSB7CiAgICAgIGlmIChib3lHaXJpcyA8IGJveUdlcmVrKSB7CiAgICAgICAgdmFyIGFrc09uZXIgPSBNYXRoLmZsb29yKChib3lHaXJpcyAtIDIgKiB1Y1BheWkpIC8gYWRldCAvIDEwKSAqIDEwOwogICAgICAgIHUucHVzaChbJ2Rpa2thdCcsICdHaXJpbGVuIGJveSA8c3Ryb25nPicgKyB0cihib3lHaXJpcykgKyAnIG1tPC9zdHJvbmc+LCAnICsgYWRldCArICcgYnJhbsWfbWFuICcgKyB0cihha3MpCiAgICAgICAgICArICcgbW0gYWtzbGEgdmUgMiDDlyAnICsgdHIodWNQYXlpKSArICcgbW0gdcOnIHBhecSxeWxhIDxzdHJvbmc+JyArIHRyKGJveUdlcmVrKSArICcgbW08L3N0cm9uZz4gaXN0ZXIuICcKICAgICAgICAgICsgKGFrc09uZXIgPj0gNjAgPyAnQWtzIGFyYWzEscSfxLFuxLEgPHN0cm9uZz4nICsgdHIoYWtzT25lcikgKyAnIG1tPC9zdHJvbmc+4oCZeWUgZMO8xZ/DvHLDvG4nIDogJ0JyYW7Fn21hbiBhZGVkaW5pIGF6YWx0xLFuJykKICAgICAgICAgICsgJyB5YSBkYSBib3l1IGLDvHnDvHTDvG4uJ10pOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBha3NCb3MgPSBNYXRoLmZsb29yKChib3lHaXJpcyAtIDIgKiB1Y1BheWkpIC8gYWRldCAvIDEwKSAqIDEwOwogICAgICAgIHUucHVzaChbJ3RhbWFtJywgJ0dpcmlsZW4gYm95IDxzdHJvbmc+JyArIHRyKGJveUdpcmlzKSArICcgbW08L3N0cm9uZz4geWV0ZXJsaSDigJQgJyArIGFkZXQgKyAnIGJyYW7Fn21hbiBpw6dpbiBha3MgYXJhbMSxxJ/EsSAnCiAgICAgICAgICArICc8c3Ryb25nPicgKyB0cihha3NCb3MpICsgJyBtbTwvc3Ryb25nPuKAmXllIGthZGFyIGHDp8SxbGFiaWxpciAodcOnIHBhecSxIDIgw5cgJyArIHRyKHVjUGF5aSkgKyAnIG1tKS4nXSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc3RlbmVuID4gMCkgewogICAgICBpZiAoaGl6ID4gaGVkZWYgKyAwLjAxKSB1LnB1c2goWydkaWtrYXQnLCAnQnUgZGViaWRlIGfDtnZkZWRla2kgaMSxeiA8c3Ryb25nPicgKyB0cihoaXosIDIpICsgJyBtL3M8L3N0cm9uZz4sIGhlZGVmaW4gKCcgKyB0cihoZWRlZiwgMSkgKyAnKSDDvHN0w7xuZGUuIEJpciDDvHN0IMOnYXBhIGdlw6dpbi4nXSk7CiAgICAgIGVsc2UgdS5wdXNoKFsndGFtYW0nLCAnR8O2dmRlZGVraSBoxLF6IDxzdHJvbmc+JyArIHRyKGhpeiwgMikgKyAnIG0vczwvc3Ryb25nPiDigJQgaGVkZWYgJyArIHRyKGhlZGVmLCAxKSArICcgbS9zIGnDp2luZGUuJ10pOwogICAgICBpZiAoYnJUb3AgPCBpc3RlbmVuICogMC45OCkgewogICAgICAgIHZhciBnZXIgPSBNYXRoLmNlaWwoaXN0ZW5lbiAvIGJLYXApLCBvbjIgPSBudWxsOwogICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgbS5icmFucy5sZW5ndGg7IHkrKykgaWYgKGFkZXQgKiBhbGFuKG0uYnJhbnNbeV0uaSkgKiBoZWRlZiAqIDM2MDAgPj0gaXN0ZW5lbikgeyBvbjIgPSBtLmJyYW5zW3ldOyBicmVhazsgfQogICAgICAgIHUucHVzaChbJ2Rpa2thdCcsICdCcmFuxZ9tYW5sYXLEsW4gdG9wbGFtxLEgPHN0cm9uZz4nICsgdHIoYnJUb3AsIDEpICsgJyBtwrMvaDwvc3Ryb25nPiwgZ2VyZWtlbiAnICsgdHIoaXN0ZW5lbiwgMSkgKyAnIG3Csy9o4oCZaW4gYWx0xLFuZGEuICcKICAgICAgICAgICsgKG9uMiA/ICdBeW7EsSBhZGV0dGUgPHN0cm9uZz4nICsgZXNjKG9uMi5lKSArICc8L3N0cm9uZz4ga3VsbGFuxLFuJyA6ICdCcmFuxZ9tYW4gYcSfesSxbsSxIGLDvHnDvHTDvG4nKSArICcgeWEgZGEgYWRlZGkgPHN0cm9uZz4nICsgZ2VyICsgJzwvc3Ryb25nPuKAmWUgw6fEsWthcsSxbi4nXSk7CiAgICAgIH0KICAgIH0KICAgIGsucXVlcnlTZWxlY3RvcignLm52LWhlc2FwLXV5YXJpJykuaW5uZXJIVE1MID0gdS5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuICc8cCBjbGFzcz0ibnYta2ZnLScgKyB4WzBdICsgJyI+JyArIHhbMV0gKyAnPC9wPic7IH0pLmpvaW4oJycpOwogICAgay5xdWVyeVNlbGVjdG9yKCcubnYtaGVzYXAtc2VtYScpLmlubmVySFRNTCA9IHNlbWEoZ292ZGUsIGJjYXAsIGFkZXQsIGJveSwgbSk7CiAgICBrLnF1ZXJ5U2VsZWN0b3IoJy5udi1oZXNhcC1naXQnKS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnL2tvbGxla3Rvcj9tPScgKyBlbmNvZGVVUklDb21wb25lbnQocSgnaF9tYWx6ZW1lJykudmFsdWUpCiAgICAgICsgJyZkbj0nICsgZ292ZGUuZCArICcmYm95PScgKyBib3kgKyAnJmJjPScgKyBiY2FwLmQgKyAnJmJhPScgKyBhZGV0ICsgJyZha3M9JyArIGFrcyk7CiAgICBrLl9fbWV0aW4gPSAnS09MTEVLVMOWUiDDlk4gU0XDh8SwTVxuJwogICAgICArICdNYWx6ZW1lOiAnICsgbS5hZCArICdcbicKICAgICAgKyAnR8O2dmRlOiAnICsgZ292ZGUuZSArICcgKGnDpyDDp2FwICcgKyB0cihnb3ZkZS5pLCAwKSArICcgbW0pXG4nCiAgICAgICsgJ0JyYW7Fn21hbjogJyArIGFkZXQgKyAnIMOXICcgKyBiY2FwLmUgKyAnIMK3IGFrcyAnICsgdHIoYWtzKSArICcgbW1cbicKICAgICAgKyAnR8O2dmRlIGthcGFzaXRlc2k6ICcgKyB0cihnS2FwLCAxKSArICcgbcKzL2ggwrcgJyArIGd1YyhnS2FwLCBkdCkgKyAnICh2ID0gJyArIHRyKGhlZGVmLCAxKSArICcgbS9zLCDOlFQgJyArIHRyKGR0LCAwKSArICcgSylcbicKICAgICAgKyAnQnJhbsWfbWFuIGthcGFzaXRlc2k6ICcgKyB0cihiS2FwLCAxKSArICcgbcKzL2ggw5cgJyArIGFkZXQgKyAnID0gJyArIHRyKGJyVG9wLCAxKSArICcgbcKzL2hcbicKICAgICAgKyAoaXN0ZW5lbiA+IDAgPyAnxLBzdGVuZW4gZGViaTogJyArIHRyKGlzdGVuZW4sIDEpICsgJyBtwrMvaCDCtyBoxLF6ICcgKyB0cihoaXosIDIpICsgJyBtL3NcbicgOiAnJykKICAgICAgKyAnS2VzaXQgb3JhbsSxOiAnICsgdHIob3JhbiwgMikgKyAnIChrdXJhbCDiiaUgMSw1KVxuJwogICAgICArIChib3lHaXJpcyA+IDAgPyAnR8O2dmRlIGJveXUgKGdpcmlsZW4pOiAnIDogJ1lha2xhxZ/EsWsgZ8O2dmRlIGJveXU6ICcpICsgdHIoYm95KSArICcgbW1cbicKICAgICAgKyAnKG5vdnVzLnRyIGtvbGxla3TDtnIgaGVzYXBsYW1hIGFyYWPEsSknOwogIH0KCiAgay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChldikgewogICAgdmFyIHQgPSBldi50YXJnZXQ7CiAgICBpZiAodC5jbGFzc0xpc3QuY29udGFpbnMoJ252LW1vZC1idG4nKSkgeyBldi5wcmV2ZW50RGVmYXVsdCgpOyBtb2RLdXIodC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbW9kJykpOyByZXR1cm47IH0KICAgIGlmICghdC5jbGFzc0xpc3QuY29udGFpbnMoJ252LWhlc2FwLWtvcHlhJykpIHJldHVybjsKICAgIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICB2YXIgbWV0aW4gPSBrLl9fbWV0aW4gfHwgJyc7CiAgICB2YXIgb2sgPSBmdW5jdGlvbiAoKSB7IHQudGV4dENvbnRlbnQgPSAnS29weWFsYW5kxLEg4pyTJzsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHQudGV4dENvbnRlbnQgPSAnU29udWN1IGtvcHlhbGEnOyB9LCAyMDAwKTsgfTsKICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChtZXRpbikudGhlbihvaywgZnVuY3Rpb24gKCkge30pOwogICAgZWxzZSB7IHZhciB0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7IHRhLnZhbHVlID0gbWV0aW47IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpOyB0YS5zZWxlY3QoKTsgdHJ5IHsgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsgb2soKTsgfSBjYXRjaCAoeCkge30gdGEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YSk7IH0KICB9KTsKICBmdW5jdGlvbiBkZWdpc3RpKGV2KSB7IGlmIChldi50YXJnZXQubmFtZSA9PT0gJ2hfbWFsemVtZScpIG1hbHplbWVLdXIoKTsgaGVzYXBsYSgpOyB9CiAgay5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGRlZ2lzdGkpOwogIGsuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZGVnaXN0aSk7CgogIG1hbHplbWVLdXIoKTsKICBtb2RLdXIoJ29sY3UnKTsKfSkoKTs8L3NjcmlwdD4KCnsjIE5vdnVzOiDDvHLDvG4gc2F5ZmFzxLEgdGFsZXAgZm9ybXUg4oCUIMOnaXppbS9mb3RvxJ9yYWYgRVJQJ3llIChlcnAubm92dXMudHIpIHnDvGtsZW5pciAjfQo8c2NyaXB0Pi8qIE5vdnVzIDIwMjY6IHNpdGVkZW4gRVJQJ3llIHRhbGVwIGZvcm11IChrdWxsYW7EsWPEsSBpc3RlxJ9pIDIwMjYtMDktMjApICovCihmdW5jdGlvbiAoKSB7CiAgdmFyIGthcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5udi10YWxlcCcpOyBpZiAoIWthcCkgcmV0dXJuOwogIHZhciBVQyA9ICdodHRwczovL2VycC5ub3Z1cy50ci9hcGkvc2l0ZS10YWxlcCc7CiAgdmFyIEFaQU1JID0gNSAqIDEwMjQgKiAxMDI0LCBBWkFNSV9BREVUID0gNTsgICAvKiBJSVMgMzAgTUIgZ8O2dmRlIHPEsW7EsXLEsTogNcOXNSBNQiBhbHTEsW5kYSBrYWzEsXIgKi8KCiAgLyogRm9ybSBET00gaWxlIGt1cnVsdXlvciwgSFRNTCBkaXplc2l5bGUgREXEnsSwTDogw7xyw7xuIGHDp8Sxa2xhbWFzxLEgcGFuZWxkZQogICAgIGthecSxdCBlZGlsaXJrZW4gdmFybMSxa2xhciAoJnF1b3Q7KSDDp8O2esO8bMO8eW9yIHZlIGfDtm3DvGzDvCBmb3JtIGJvenVsdXlvcmR1CiAgICAgKGF5bsSxIHR1emFrIGtvbGxla3TDtnIgb2x1xZ90dXJ1Y3VkYSBkYSB5YcWfYW5kxLEpLiAqLwogIGZ1bmN0aW9uIGVsKHQsIHMsIG0pIHsgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHQpOyBpZiAocykgZS5jbGFzc05hbWUgPSBzOyBpZiAobSAhPSBudWxsKSBlLnRleHRDb250ZW50ID0gbTsgcmV0dXJuIGU7IH0KICBmdW5jdGlvbiBhbGFuKGFkLCBldGlrZXQsIHRpcCwgem9ydW5sdSwgaXB1Y3UpIHsKICAgIHZhciBsID0gZWwoJ2xhYmVsJywgJ252LXRhbGVwLWFsYW4nKTsKICAgIHZhciBiID0gZWwoJ3NwYW4nLCAnbnYtdGFsZXAtZXRpa2V0JywgZXRpa2V0KTsKICAgIGlmICh6b3J1bmx1KSB7IHZhciB5ID0gZWwoJ2VtJywgbnVsbCwgJyonKTsgYi5hcHBlbmRDaGlsZCh5KTsgfQogICAgdmFyIGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRpcCA9PT0gJ2Nva3NhdGlyJyA/ICd0ZXh0YXJlYScgOiAnaW5wdXQnKTsKICAgIGlmICh0aXAgIT09ICdjb2tzYXRpcicpIGkudHlwZSA9IHRpcDsKICAgIGkubmFtZSA9IGFkOyBpZiAoem9ydW5sdSkgaS5yZXF1aXJlZCA9IHRydWU7CiAgICBpZiAoaXB1Y3UpIGkucGxhY2Vob2xkZXIgPSBpcHVjdTsKICAgIGlmICh0aXAgPT09ICdjb2tzYXRpcicpIGkucm93cyA9IDM7CiAgICBsLmFwcGVuZENoaWxkKGIpOyBsLmFwcGVuZENoaWxkKGkpOwogICAgcmV0dXJuIGw7CiAgfQoKICB2YXIgdXJ1bktvZHUgPSBrYXAuZ2V0QXR0cmlidXRlKCdkYXRhLWtvZCcpIHx8ICcnOwogIHZhciB1cnVuQWQgPSBrYXAuZ2V0QXR0cmlidXRlKCdkYXRhLWFkJykgfHwgZG9jdW1lbnQudGl0bGU7CgogIHZhciBiYXNsaWsgPSBlbCgnZGl2JywgJ252LXRhbGVwLWJhc2xpaycpOwogIGJhc2xpay5hcHBlbmRDaGlsZChlbCgnc3Ryb25nJywgbnVsbCwgJ8OHaXppbWluaXppIGfDtm5kZXJpbiwgc2l6ZSDDtnplbCBmaXlhdCB2ZXJlbGltJykpOwogIGJhc2xpay5hcHBlbmRDaGlsZChlbCgnc3BhbicsIG51bGwsICdLcm9raSwgdGVrbmlrIHJlc2ltIHlhIGRhIHNhaGFkYW4gw6dla3RpxJ9pbml6IGZvdG/En3JhZsSxIHnDvGtsZXlpbjsgw7Zsw6fDvGxlcmluaXplIGfDtnJlIGltYWxhdCB0ZWtsaWZpbmkgaGF6xLFybGF5YWzEsW0uJykpOwoKICB2YXIgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTsKICBmb3JtLmNsYXNzTmFtZSA9ICdudi10YWxlcC1mb3JtJzsKICBmb3JtLnNldEF0dHJpYnV0ZSgnbm92YWxpZGF0ZScsICdub3ZhbGlkYXRlJyk7CgogIHZhciBpemdhcmEgPSBlbCgnZGl2JywgJ252LXRhbGVwLWdyaWQnKTsKICBpemdhcmEuYXBwZW5kQ2hpbGQoYWxhbignYWRTb3lhZCcsICdBZCBzb3lhZCcsICd0ZXh0JywgdHJ1ZSkpOwogIGl6Z2FyYS5hcHBlbmRDaGlsZChhbGFuKCd0ZWxlZm9uJywgJ1RlbGVmb24nLCAndGVsJywgdHJ1ZSwgJzA1eHggeHh4IHh4IHh4JykpOwogIGl6Z2FyYS5hcHBlbmRDaGlsZChhbGFuKCdlcG9zdGEnLCAnRS1wb3N0YScsICdlbWFpbCcsIGZhbHNlKSk7CiAgaXpnYXJhLmFwcGVuZENoaWxkKGFsYW4oJ2Zpcm1hJywgJ0Zpcm1hJywgJ3RleHQnLCBmYWxzZSkpOwogIGZvcm0uYXBwZW5kQ2hpbGQoaXpnYXJhKTsKCiAgdmFyIG1lc2FqID0gYWxhbignbWVzYWonLCAnTm90dW51eicsICdjb2tzYXRpcicsIGZhbHNlLCAnR8O2dmRlIGJveXUsIGJyYW7Fn21hbiBzYXnEsXPEsS/Dp2FwxLEsIHRlcm1pbuKApicpOwogIG1lc2FqLmNsYXNzTmFtZSA9ICdudi10YWxlcC1hbGFuIG52LXRhbGVwLWdlbmlzJzsKICBmb3JtLmFwcGVuZENoaWxkKG1lc2FqKTsKCiAgLyogRG9zeWEgYWxhbsSxOiBnaXpsaSBpbnB1dCArIGfDtnLDvG7DvHIgZMO8xJ9tZSAodGFyYXnEsWPEsSB2YXJzYXnEsWxhbsSxIGhlciB5ZXJkZQogICAgIGZhcmtsxLEgZ8O2csO8bsO8eW9yIHZlIG1vYmlsZGUgdGHFn8SxeW9yKS4gKi8KICB2YXIgZG9zeWFLYXAgPSBlbCgnZGl2JywgJ252LXRhbGVwLWRvc3lhJyk7CiAgdmFyIGRvc3lhR2lyaXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOwogIGRvc3lhR2lyaXMudHlwZSA9ICdmaWxlJzsgZG9zeWFHaXJpcy5uYW1lID0gJ2Rvc3lhbGFyJzsgZG9zeWFHaXJpcy5tdWx0aXBsZSA9IHRydWU7CiAgZG9zeWFHaXJpcy5hY2NlcHQgPSAnLnBkZiwuanBnLC5qcGVnLC5wbmcsLndlYnAsLmhlaWMsLmR3ZywuZHhmLGltYWdlLyosYXBwbGljYXRpb24vcGRmJzsKICBkb3N5YUdpcmlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgdmFyIGRvc3lhQnRuID0gZWwoJ2J1dHRvbicsICdudi10YWxlcC1kb3N5YS1idG4nLCAnRG9zeWEgc2XDpyAow6dpemltLCBQREYsIGZvdG/En3JhZiknKTsKICBkb3N5YUJ0bi50eXBlID0gJ2J1dHRvbic7CiAgdmFyIGxpc3RlID0gZWwoJ2RpdicsICdudi10YWxlcC1saXN0ZScpOwogIGRvc3lhQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBkb3N5YUdpcmlzLmNsaWNrKCk7IH0pOwogIGRvc3lhR2lyaXMuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkgeyBkb3N5YUxpc3RlbGUoKTsgfSk7CiAgZG9zeWFLYXAuYXBwZW5kQ2hpbGQoZG9zeWFCdG4pOyBkb3N5YUthcC5hcHBlbmRDaGlsZChkb3N5YUdpcmlzKTsgZG9zeWFLYXAuYXBwZW5kQ2hpbGQobGlzdGUpOwogIGZvcm0uYXBwZW5kQ2hpbGQoZG9zeWFLYXApOwoKICBmdW5jdGlvbiBkb3N5YUxpc3RlbGUoKSB7CiAgICB3aGlsZSAobGlzdGUuZmlyc3RDaGlsZCkgbGlzdGUucmVtb3ZlQ2hpbGQobGlzdGUuZmlyc3RDaGlsZCk7CiAgICB2YXIgZiA9IGRvc3lhR2lyaXMuZmlsZXMgfHwgW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGYubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGtiID0gZltpXS5zaXplID4gMTA0ODU3NiA/IChmW2ldLnNpemUgLyAxMDQ4NTc2KS50b0ZpeGVkKDEpICsgJyBNQicgOiBNYXRoLnJvdW5kKGZbaV0uc2l6ZSAvIDEwMjQpICsgJyBLQic7CiAgICAgIGxpc3RlLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgJ252LXRhbGVwLWRvc3lhLWFkJywgZltpXS5uYW1lICsgJyDCtyAnICsga2IpKTsKICAgIH0KICB9CgogIC8qIEJhbCBrw7xww7w6IGVrcmFuZGEgZ8O2csO8bm1leiwgYm90bGFyIGRvbGR1cnVyIChzdW51Y3UgZG9sdSBnZWxpcnNlIGtheWTEsSBhw6dtYXopLiAqLwogIHZhciBrdXBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKICBrdXBlLnR5cGUgPSAndGV4dCc7IGt1cGUubmFtZSA9ICd3ZWJzaXRlJzsga3VwZS50YWJJbmRleCA9IC0xOyBrdXBlLmF1dG9jb21wbGV0ZSA9ICdvZmYnOwogIGt1cGUuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi05OTk5cHg7d2lkdGg6MXB4O2hlaWdodDoxcHg7b3BhY2l0eTowJzsKICBmb3JtLmFwcGVuZENoaWxkKGt1cGUpOwoKICB2YXIgb25heUwgPSBlbCgnbGFiZWwnLCAnbnYtdGFsZXAtb25heScpOwogIHZhciBvbmF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsgb25heS50eXBlID0gJ2NoZWNrYm94Jzsgb25heS5uYW1lID0gJ2t2a2snOwogIHZhciBvbmF5TWV0aW4gPSBlbCgnc3BhbicsIG51bGwsICdCaWxnaWxlcmltaW4gdGVrbGlmIGhhesSxcmxhbm1hc8SxIGFtYWPEsXlsYSBpxZ9sZW5tZXNpbmkga2FidWwgZWRpeW9ydW0uICcpOwogIHZhciBrdmtrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogIGt2a2suaHJlZiA9ICcvc2F5ZmEva2lzaXNlbC12ZXJpbGVyLXBvbGl0aWthc2knOyBrdmtrLnRhcmdldCA9ICdfYmxhbmsnOyBrdmtrLnRleHRDb250ZW50ID0gJ0tpxZ9pc2VsIHZlcmlsZXIgcG9saXRpa2FzxLEnOwogIG9uYXlNZXRpbi5hcHBlbmRDaGlsZChrdmtrKTsKICBvbmF5TC5hcHBlbmRDaGlsZChvbmF5KTsgb25heUwuYXBwZW5kQ2hpbGQob25heU1ldGluKTsKICBmb3JtLmFwcGVuZENoaWxkKG9uYXlMKTsKCiAgdmFyIGdvbmRlciA9IGVsKCdidXR0b24nLCAnbnYtY3RhLWJ0biBudi10YWxlcC1nb25kZXInLCAnR8O2bmRlcicpOwogIGdvbmRlci50eXBlID0gJ3N1Ym1pdCc7CiAgdmFyIGR1cnVtID0gZWwoJ3AnLCAnbnYtdGFsZXAtZHVydW0nKTsKICBmb3JtLmFwcGVuZENoaWxkKGdvbmRlcik7IGZvcm0uYXBwZW5kQ2hpbGQoZHVydW0pOwoKICBrYXAuYXBwZW5kQ2hpbGQoYmFzbGlrKTsga2FwLmFwcGVuZENoaWxkKGZvcm0pOwoKICBmdW5jdGlvbiB1eWFyKG1ldGluLCBpeWkpIHsKICAgIGR1cnVtLnRleHRDb250ZW50ID0gbWV0aW47CiAgICBkdXJ1bS5jbGFzc05hbWUgPSAnbnYtdGFsZXAtZHVydW0nICsgKGl5aSA/ICcgbnYtdGFsZXAtdGFtYW0nIDogKG1ldGluID8gJyBudi10YWxlcC1oYXRhJyA6ICcnKSk7CiAgfQoKICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGZ1bmN0aW9uIChldikgewogICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgIHZhciBhZCA9IGZvcm0uYWRTb3lhZC52YWx1ZS50cmltKCksIHRlbCA9IGZvcm0udGVsZWZvbi52YWx1ZS50cmltKCk7CiAgICBpZiAoYWQubGVuZ3RoIDwgMikgeyB1eWFyKCdMw7x0ZmVuIGFkxLFuxLF6xLEgeWF6xLFuLicpOyBmb3JtLmFkU295YWQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICBpZiAodGVsLnJlcGxhY2UoL1xEL2csICcnKS5sZW5ndGggPCAxMCkgeyB1eWFyKCdMw7x0ZmVuIHVsYcWfYWJpbGVjZcSfaW1peiBiaXIgdGVsZWZvbiB5YXrEsW4uJyk7IGZvcm0udGVsZWZvbi5mb2N1cygpOyByZXR1cm47IH0KICAgIGlmICghb25heS5jaGVja2VkKSB7IHV5YXIoJ0RldmFtIGV0bWVrIGnDp2luIG9uYXkga3V0dXN1bnUgacWfYXJldGxleWluLicpOyByZXR1cm47IH0KICAgIHZhciBmID0gZG9zeWFHaXJpcy5maWxlcyB8fCBbXTsKICAgIGlmIChmLmxlbmd0aCA+IEFaQU1JX0FERVQpIHsgdXlhcignRW4gZmF6bGEgJyArIEFaQU1JX0FERVQgKyAnIGRvc3lhIGfDtm5kZXJlYmlsaXJzaW5pei4nKTsgcmV0dXJuOyB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGYubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGZbaV0uc2l6ZSA+IEFaQU1JKSB7IHV5YXIoZltpXS5uYW1lICsgJyA1IE1CIHPEsW7EsXLEsW7EsSBhxZ/EsXlvci4gRm90b8SfcmFmxLEga8O8w6fDvGx0w7xwIHRla3JhciBkZW5leWluLicpOyByZXR1cm47IH0KICAgIH0KCiAgICB2YXIgZmQgPSBuZXcgRm9ybURhdGEoKTsKICAgIGZkLmFwcGVuZCgnYWRTb3lhZCcsIGFkKTsKICAgIGZkLmFwcGVuZCgndGVsZWZvbicsIHRlbCk7CiAgICBmZC5hcHBlbmQoJ2Vwb3N0YScsIGZvcm0uZXBvc3RhLnZhbHVlLnRyaW0oKSk7CiAgICBmZC5hcHBlbmQoJ2Zpcm1hJywgZm9ybS5maXJtYS52YWx1ZS50cmltKCkpOwogICAgZmQuYXBwZW5kKCdtZXNhaicsIGZvcm0ubWVzYWoudmFsdWUudHJpbSgpKTsKICAgIGZkLmFwcGVuZCgna2F5bmFrJywgJ2tvbGxla3RvcicpOwogICAgZmQuYXBwZW5kKCd1cnVuS29kdScsIHVydW5Lb2R1KTsKICAgIGZkLmFwcGVuZCgndXJ1bkFkJywgdXJ1bkFkKTsKICAgIGZkLmFwcGVuZCgndXJ1blVybCcsIGxvY2F0aW9uLmhyZWYuc3BsaXQoJyMnKVswXSk7CiAgICBmZC5hcHBlbmQoJ3dlYnNpdGUnLCBrdXBlLnZhbHVlKTsKICAgIC8qIMOccsO8biBzYXlmYXPEsW5kYWtpIHZhcnlhbnQgc2XDp2ltaSAoTUVUUkUpIHZhcnNhIHRhxZ/EsW7EsXlvcjogbcO8xZ90ZXJpbmluCiAgICAgICBoYW5naSBib3lhIGJha3TEscSfxLEgdGVrbGlmdGUgZW4gw6dvayBzb3J1bGFuIMWfZXkuICovCiAgICB2YXIgc2VjaW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1vcHRpb25zIC5zZWxlY3RlZCwgLm9wdGlvbi1pdGVtLnNlbGVjdGVkJyk7CiAgICBpZiAoc2VjaW0pIGZkLmFwcGVuZCgnc2VjaW1sZXInLCBzZWNpbS50ZXh0Q29udGVudC5yZXBsYWNlKC9ccysvZywgJyAnKS50cmltKCkuc2xpY2UoMCwgMjAwKSk7CiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGYubGVuZ3RoOyBqKyspIGZkLmFwcGVuZCgnZG9zeWFsYXInLCBmW2pdKTsKCiAgICBnb25kZXIuZGlzYWJsZWQgPSB0cnVlOwogICAgdXlhcignR8O2bmRlcmlsaXlvcuKApicpOwogICAgdmFyIHggPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgIHgub3BlbignUE9TVCcsIFVDLCB0cnVlKTsKICAgIHgudGltZW91dCA9IDEyMDAwMDsKICAgIHgub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICBnb25kZXIuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgaWYgKHguc3RhdHVzID49IDIwMCAmJiB4LnN0YXR1cyA8IDMwMCkgewogICAgICAgIHZhciBubyA9ICcnOwogICAgICAgIHRyeSB7IG5vID0gKEpTT04ucGFyc2UoeC5yZXNwb25zZVRleHQpIHx8IHt9KS5udW1hcmEgfHwgJyc7IH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgZm9ybS5yZXNldCgpOyBkb3N5YUdpcmlzLnZhbHVlID0gJyc7IGRvc3lhTGlzdGVsZSgpOwogICAgICAgIHV5YXIoJ1RhbGViaW5peiBhbMSxbmTEsScgKyAobm8gPyAnICgnICsgbm8gKyAnKScgOiAnJykgKyAnLiBFbiBrxLFzYSBzw7xyZWRlIGTDtm7DvMWfIHlhcGFjYcSfxLF6LicsIHRydWUpOwogICAgICB9IGVsc2UgaWYgKHguc3RhdHVzID09PSA0MjkpIHsKICAgICAgICB1eWFyKCfDh29rIGZhemxhIGRlbmVtZSB5YXDEsWxkxLEsIGJpcmthw6cgZGFraWthIHNvbnJhIHRla3JhciBkZW5leWluLicpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBtID0gJyc7CiAgICAgICAgdHJ5IHsgbSA9IChKU09OLnBhcnNlKHgucmVzcG9uc2VUZXh0KSB8fCB7fSkuaGF0YSB8fCAnJzsgfSBjYXRjaCAoZSkge30KICAgICAgICB1eWFyKG0gfHwgJ0fDtm5kZXJpbGVtZWRpLiBXaGF0c0FwcOKAmXRhbiB1bGHFn2FiaWxpcnNpbml6OiAwNTU1IDAwNSA5OSA4NCcpOwogICAgICB9CiAgICB9OwogICAgeC5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyBnb25kZXIuZGlzYWJsZWQgPSBmYWxzZTsgdXlhcignQmHEn2xhbnTEsSBrdXJ1bGFtYWTEsS4gV2hhdHNBcHA6IDA1NTUgMDA1IDk5IDg0Jyk7IH07CiAgICB4Lm9udGltZW91dCA9IGZ1bmN0aW9uICgpIHsgZ29uZGVyLmRpc2FibGVkID0gZmFsc2U7IHV5YXIoJ1nDvGtsZW1lIHphbWFuIGHFn8SxbcSxbmEgdcSfcmFkxLE7IGRvc3lhIGJveXV0dW51IGvDvMOnw7xsdMO8cCBkZW5leWluLicpOyB9OwogICAgeC5zZW5kKGZkKTsKICB9KTsKfSkoKTs8L3NjcmlwdD4KCnsjIE5vdnVzOiBrb2xsZWt0w7ZyIHNheWZhbGFyxLFuZGEga8SxcsSxbnTEsSAiU2F5ZmFsYXIiIHllcmluZSAiS29sbGVrdMO2cmxlciIgI30KPHNjcmlwdD4vKiBOb3Z1cyAyMDI2OiBrb2xsZWt0w7ZyIHNheWZhc8SxIGvEsXLEsW50xLFzxLEgKGt1bGxhbsSxY8SxLCAyMDI2LTA5LTIwKSAqLwooZnVuY3Rpb24gKCkgewogIC8qIFlhbG7EsXogYml6aW0gc2F5ZmFsYXLEsW3EsXpkYSDDp2FsxLHFn8SxcjogacOnZXJpayAubnYtc2F5ZmEgaWxlIHNhcsSxbMSxLgogICAgIFBsYXRmb3JtdW4ga8SxcsSxbnTEsXPEsSBoZXIgQ01TIHNheWZhc8SxbmRhICJTYXlmYWxhciIgZGl5b3I7IHppeWFyZXTDp2kKICAgICBrb2xsZWt0w7ZyIGnDp2VyacSfaW5kZXlrZW4gYnUgYXJhIGFkxLFtIGhpw6diaXIgacWfZSB5YXJhbcSxeW9yLCDDvHN0ZWxpawogICAgIHNheWZhecSxICJnZW5lbCBiaXIgacOnZXJpayBzYXlmYXPEsSIgZ2liaSBnw7ZzdGVyaXlvcmR1LiAqLwogIC8qIOKaoCBLb8WfdWwgWU9MQSBiYWthcjogLm52LXNheWZhIHNhcm1hbGF5xLFjxLFzxLEgYXJ0xLFrIGJhbmthL2lsZXRpxZ9pbSBnaWJpCiAgICAga29sbGVrdMO2cmxlIGlsZ2lzaXogc2F5ZmFsYXJkYSBkYSBrdWxsYW7EsWzEsXlvcjsgeWFsbsSxeiBzxLFuxLFmYSBiYWvEsW5jYQogICAgIG9yYWxhcmRhIGRhIGvEsXLEsW50xLEgIktvbGxla3TDtnJsZXIiIG9sdXlvcmR1IChrdWxsYW7EsWPEsSwgMjAyNi0wOS0yMCkuICovCiAgaWYgKCEva29sbGVrdG9yL2kudGVzdChsb2NhdGlvbi5wYXRobmFtZSkpIHJldHVybjsKICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5udi1zYXlmYScpKSByZXR1cm47CiAgdmFyIGIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYnJlYWRjcnVtYnMgYVtocmVmPSIvc2F5ZmFsYXIiXScpOwogIGlmICghYikgcmV0dXJuOwogIGIuc2V0QXR0cmlidXRlKCdocmVmJywgJy9rYXRlZ29yaS9rb2xsZWt0b3JsZXInKTsKICAvKiBNZXRpbiBlbiBpw6d0ZWtpIHNwYW4nZGU7IDxpPiBheXJhw6cgaWtvbnVuYSBkb2t1bnVsbXV5b3IuICovCiAgdmFyIGhlZGVmID0gYi5xdWVyeVNlbGVjdG9yKCdzcGFuID4gc3BhbicpIHx8IGIucXVlcnlTZWxlY3Rvcignc3BhbicpIHx8IGI7CiAgaGVkZWYudGV4dENvbnRlbnQgPSAnS29sbGVrdMO2cmxlcic7Cn0pKCk7PC9zY3JpcHQ+Cgp7IyBOb3Z1czogcGxhdGZvcm0gc2F5ZmFsYXLEsW7EsSAoaWxldGnFn2ltIMK3IGthcmdvIHRha2liaSkgc2F5ZmEgc3RhbmRhcmTEsW5hIGdldGlyaXIgI30KPHNjcmlwdD4vKiBOb3Z1cyAyMDI2OiB0ZW1hIGRvc3lhc8SxIE9MTUFZQU4gcGxhdGZvcm0gc2F5ZmFsYXLEsW5hIG9ydGFrIGJhxZ9sxLFrIGJhbmTEsS4KICAg4pqgIE5lZGVuIEpTOiAvaWxldGlzaW0gdmUgL2thcmdvLXRha2liaSDFn2FibG9ubGFyxLEgdGVtYWRhIHlvayAoaHRtbC90ZW1wbGF0ZXMKICAgYWx0xLFuZGEgeWFsbsSxeiBlbnRyeSwgbG9naW4gdmUgw7xyw7xuIGRldGF5xLEgdmFyKSDigJQgZMO8emVubGVuZWJpbGlyIHRlayB5ZXIgYnUuICovCihmdW5jdGlvbiAoKSB7CiAgdmFyIGcgPSBkb2N1bWVudC5ib2R5ID8gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QgOiBudWxsOwogIGlmICghZykgcmV0dXJuOwoKICBmdW5jdGlvbiBiYW50KHJvemV0LCBiYXNsaWssIG96ZXQpIHsKICAgIHZhciBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaGVhZGVyJyk7CiAgICBoLmNsYXNzTmFtZSA9ICdudi1zYXlmYS11c3QgbnYtc2F5ZmEnOwogICAgaC5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9Im52LXNheWZhLXJvemV0Ij48L3NwYW4+PGgxPjwvaDE+PHAgY2xhc3M9Im52LXNheWZhLW96ZXQiPjwvcD4nOwogICAgaC5xdWVyeVNlbGVjdG9yKCcubnYtc2F5ZmEtcm96ZXQnKS50ZXh0Q29udGVudCA9IHJvemV0OwogICAgaC5xdWVyeVNlbGVjdG9yKCdoMScpLnRleHRDb250ZW50ID0gYmFzbGlrOwogICAgaC5xdWVyeVNlbGVjdG9yKCcubnYtc2F5ZmEtb3pldCcpLmlubmVySFRNTCA9IG96ZXQ7CiAgICByZXR1cm4gaDsKICB9CgogIGZ1bmN0aW9uIGthcnQoaWtvbiwgYWQsIGRlZ2VyLCB5b2wsIGRpcykgewogICAgcmV0dXJuICc8YSBjbGFzcz0ibnYta2FydCBudi1rYXJ0LW1pbiIgaHJlZj0iJyArIHlvbCArICciJyArIChkaXMgPyAnIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIicgOiAnJykgKyAnPicKICAgICAgKyAnPHNwYW4gY2xhc3M9Im52LWthdC1pa29uIj4nICsgaWtvbiArICc8L3NwYW4+PHN0cm9uZz4nICsgYWQgKyAnPC9zdHJvbmc+JwogICAgICArICc8c3BhbiBjbGFzcz0ibnYta2FydC1uZSI+JyArIGRlZ2VyICsgJzwvc3Bhbj48L2E+JzsKICB9CiAgdmFyIFMgPSBmdW5jdGlvbiAoZCkgewogICAgcmV0dXJuICc8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMGYyZjU2IiBzdHJva2Utd2lkdGg9IjEuNyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4nICsgZCArICc8L3N2Zz4nOwogIH07CiAgdmFyIElLID0gewogICAgdGVsOiBTKCc8cGF0aCBkPSJNNi41IDNoM2wxLjUgNC0yIDEuNWExMiAxMiAwIDAgMCA2LjUgNi41TDE3IDEzbDQgMS41djNhMiAyIDAgMCAxLTIuMiAyQTE2LjUgMTYuNSAwIDAgMSA0IDUuMiAyIDIgMCAwIDEgNi41IDNaIi8+JyksCiAgICB3YTogUygnPHBhdGggZD0iTTMuNSAyMC41IDUgMTYuM0E4LjUgOC41IDAgMSAxIDguMiAxOS4zbC00LjcgMS4yWiIvPjxwYXRoIGQ9Ik05IDkuNWMuNCAyLjIgMy4zIDUuMSA1LjUgNS41Ii8+JyksCiAgICBtYWlsOiBTKCc8cmVjdCB4PSIzIiB5PSI1IiB3aWR0aD0iMTgiIGhlaWdodD0iMTQiIHJ4PSIyIi8+PHBhdGggZD0ibTMuNSA2LjUgOC41IDYgOC41LTYiLz4nKSwKICAgIHllcjogUygnPHBhdGggZD0iTTEyIDIxczctNS43IDctMTFhNyA3IDAgMSAwLTE0IDBjMCA1LjMgNyAxMSA3IDExWiIvPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTAiIHI9IjIuNiIvPicpLAogIH07CgoKICAvKiDilIDilIAgSUJBTiAvIG1ldGluIGtvcHlhbGFtYSAoa3VsbGFuxLFjxLEsIDIwMjYtMDktMjApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgIOKaoCBPbGF5IERFTEVHQVNZT05MQSBiYcSfbGFuxLF5b3I6IGTDvMSfbWVsZXIgQ01TIGnDp2VyacSfaW5kZW4gZ2VsaXlvciB2ZQogICAgIHNheWZhIGnDp2VyacSfaSBwYW5lbGRlbiBkZcSfacWfdGnEn2luZGUgeWVuaWRlbiBiYcSfbGFubWEgZGVyZGkgb2xtYXPEsW4uICovCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgewogICAgdmFyIGQgPSBlLnRhcmdldC5jbG9zZXN0ID8gZS50YXJnZXQuY2xvc2VzdCgnLm52LWtvcHlhbGEnKSA6IG51bGw7CiAgICBpZiAoIWQpIHJldHVybjsKICAgIHZhciBtZXRpbiA9IChkLmdldEF0dHJpYnV0ZSgnZGF0YS1tZXRpbicpIHx8ICcnKS5yZXBsYWNlKC9ccysvZywgJyAnKS50cmltKCk7CiAgICBpZiAoIW1ldGluKSByZXR1cm47CiAgICB2YXIgYml0dGkgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBvbmNla2kgPSBkLnRleHRDb250ZW50OwogICAgICBkLmNsYXNzTGlzdC5hZGQoJ252LWtvcHlhbGFuZGknKTsKICAgICAgZC50ZXh0Q29udGVudCA9ICdLb3B5YWxhbmTEsSc7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBkLnRleHRDb250ZW50ID0gb25jZWtpOyBkLmNsYXNzTGlzdC5yZW1vdmUoJ252LWtvcHlhbGFuZGknKTsgfSwgMTYwMCk7CiAgICB9OwogICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpIHsKICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQobWV0aW4pLnRoZW4oYml0dGksIGZ1bmN0aW9uICgpIHt9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLyogRXNraSB0YXJhecSxY8SxIC8gZ8O8dmVuc2l6IGJhxJ9sYW06IGdlw6dpY2kgYWxhbiDDvHplcmluZGVuIGtvcHlhbGEuICovCiAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICB0LnZhbHVlID0gbWV0aW47IHQuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICcnKTsgdC5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTk5OTlweCc7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpOyB0LnNlbGVjdCgpOwogICAgdHJ5IHsgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsgYml0dGkoKTsgfSBjYXRjaCAoeCkge30KICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodCk7CiAgfSk7CgoKICAvKiDilIDilIAgS8SxcsSxbnTEsWRha2kgIlNheWZhbGFyIiBhZMSxbcSxIGthbGTEsXLEsWzEsXIgKGt1bGxhbsSxY8SxLCAyMDI2LTA5LTIwKSDilIDilIDilIAKICAgICBaaXlhcmV0w6dpIGnDp2luIGJpciBpxZ9lIHlhcmFtxLF5b3I6IC9zYXlmYWxhciBsaXN0ZXNpIHTDvG0gQ01TIHNheWZhbGFyxLFuxLEKICAgICBoYW0gbGlzdGUgaMOibGluZGUgZ8O2c3Rlcml5b3IuIEtvbGxla3TDtnIgc2F5ZmFsYXLEsW5kYSBheXLEsSBibG9rIG9udQogICAgICJLb2xsZWt0w7ZybGVyIiB5YXDEsXlvcjsgYnVyYWRhIFlBTE5JWiBkacSfZXIgc2F5ZmFsYXJkYSBzaWxpeW9ydXouICovCiAgaWYgKCEva29sbGVrdG9yL2kudGVzdChsb2NhdGlvbi5wYXRobmFtZSkpIHsKICAgIHZhciBzeSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNicmVhZGNydW1icyBhW2hyZWY9Ii9zYXlmYWxhciJdJyk7CiAgICBpZiAoc3kpIHsKICAgICAgdmFyIG9nZSA9IHN5LmNsb3Nlc3QgPyAoc3kuY2xvc2VzdCgnbGknKSB8fCBzeS5wYXJlbnRFbGVtZW50KSA6IHN5LnBhcmVudEVsZW1lbnQ7CiAgICAgIHZhciBheXIgPSBvZ2UubmV4dEVsZW1lbnRTaWJsaW5nOwogICAgICBpZiAoYXlyICYmICFheXIucXVlcnlTZWxlY3RvcignYScpICYmIGF5ci50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoIDw9IDIpIGF5ci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGF5cik7CiAgICAgIG9nZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9nZSk7CiAgICB9CiAgfQoKICAvKiDilIDilIAgxLBsZXRpxZ9pbSBzYXlmYXPEsW5kYWtpIGJhbmthL0lCQU4gYmxvxJ91IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgIEt1bGxhbsSxY8SxOiAiaWxldGnFn2ltIHNheWZhc8SxbmRhIElCQU4nbGFyxLEgZ8O2c3Rlcm1lLCBiYW5rYSBiaWxnaWxlcmkgacOnaW4KICAgICBjYXJpIHNheWZhc8SxbmEgecO2bmxlbmRpci4iIEhlc2FwbGFyIHRlayB5ZXJkZSBkdXJzdW4ga2kgZGXEn2nFn3RpxJ9pbmRlCiAgICAgaWtpIHNheWZhIGJpcmJpcmluaSB0dXRtYXogZHVydW1hIGTDvMWfbWVzaW4uICovCiAgdmFyIGJhbmthbGFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRhY3QtdXMuYmFua3MnKTsKICBpZiAoYmFua2FsYXIpIHsKICAgIHZhciB5ZXJpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIHllcmluZS5jbGFzc05hbWUgPSAnbnYtY3RhLWt1dHUnOwogICAgeWVyaW5lLmlubmVySFRNTCA9ICc8ZGl2PjxzdHJvbmc+QmFua2EgdmUgY2FyaSBiaWxnaWxlcjwvc3Ryb25nPicKICAgICAgKyAnPHNwYW4+SUJBTiwgdmVyZ2kgZGFpcmVzaS9udW1hcmFzxLEgdmUgZmF0dXJhIGJpbGdpbGVyaW1peiB0ZWsgc2F5ZmFkYTsgSUJBTuKAmcSxIHRlayBkb2t1bnXFn2xhIGtvcHlhbGF5YWJpbGlyc2luaXouPC9zcGFuPjwvZGl2PicKICAgICAgKyAnPGEgY2xhc3M9Im52LWN0YS1idG4iIGhyZWY9Ii9zYXlmYS9iYW5rYS12ZS1jYXJpLWJpbGdpbGVyIj5CYW5rYSBiaWxnaWxlcmluaSBhw6cg4oaSPC9hPic7CiAgICBiYW5rYWxhci5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh5ZXJpbmUsIGJhbmthbGFyKTsKICB9CgogIC8qIOKUgOKUgCDEsGxldGnFn2ltIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwogIGlmIChnLmNvbnRhaW5zKCdjdXJyZW50LXBhZ2UtZGVmYXVsdC1jb250YWN0LXVzJykpIHsKICAgIHZhciBrYXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWFpbiAuY29udGFpbmVyJykgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRhaW5lcicpOwogICAgaWYgKGthcCkgewogICAgICB2YXIgaCA9IGJhbnQoJ8SwbGV0acWfaW0nLCAnTm92dXMgxLBsZXRpxZ9pbSBCaWxnaWxlcmknLAogICAgICAgICdLYWxvcmltZXRyZSwgc3Ugc2F5YWPEsSwga29sbGVrdMO2ciBpbWFsYXTEsSB2ZSBva3VtYSBoaXptZXRsZXJpIGnDp2luIGJpemUgdWxhxZ/EsW4uICcgKwogICAgICAgICdUZWtsaWYgdmUgdGVrbmlrIHNvcnVsYXLEsW7EsXpkYSA8c3Ryb25nPldoYXRzQXBwPC9zdHJvbmc+IGVuIGjEsXpsxLEga2FuYWxkxLFyOyAnICsKICAgICAgICAnw7Zsw6fDvGzDvCDDp2l6aW0gdmUgcHJvamUgZG9zeWFsYXLEsW7EsXrEsSBkYSBvcmFkYW4gZ8O2bmRlcmViaWxpcnNpbml6LicpOwogICAgICB2YXIgZWsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgZWsuY2xhc3NOYW1lID0gJ252LWthcnQtZ3JpZCBudi1rYXJ0LTMgbnYtaWxldGlzaW0ta2FydCc7CiAgICAgIGVrLmlubmVySFRNTCA9IGthcnQoSUsudGVsLCAnVGVsZWZvbicsICcwIDIxNiA2NDIgNDIgNjYnLCAndGVsOis5MDIxNjY0MjQyNjYnKQogICAgICAgICsga2FydChJSy53YSwgJ1doYXRzQXBwJywgJzAgNTU1IDAwNSA5OSA4NCcsICdodHRwczovL3dhLm1lLzkwNTU1MDA1OTk4NCcsIDEpCiAgICAgICAgKyBrYXJ0KElLLm1haWwsICdFLXBvc3RhJywgJ2JpbGdpQG5vdnVzLnRyJywgJ21haWx0bzpiaWxnaUBub3Z1cy50cicpCiAgICAgICAgKyBrYXJ0KElLLnllciwgJ0FkcmVzJywgJ01pbWFyIFNpbmFuIE1oLiBDZXJlbiBTay4gTm86MjUvNCwgw4dla21la8O2eSAvIMSwc3RhbmJ1bCcsCiAgICAgICAgICAgICAgICdodHRwczovL3d3dy5nb29nbGUuY29tL21hcHMvc2VhcmNoLz9hcGk9MSZxdWVyeT1NaW1hcitTaW5hbitNaC4rQ2VyZW4rU2suK05vOjI1LzQrw4dla21la8O2eSvEsHN0YW5idWwnLCAxKTsKICAgICAga2FwLmluc2VydEJlZm9yZShlaywga2FwLmZpcnN0Q2hpbGQpOwogICAgICBrYXAuaW5zZXJ0QmVmb3JlKGgsIGthcC5maXJzdENoaWxkKTsKICAgIH0KICB9CgogIC8qIOKUgOKUgCBLYXJnbyB0YWtpYmkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCiAgaWYgKGcuY29udGFpbnMoJ2N1cnJlbnQtcGFnZS1zaGlwcGluZy10cmFja2luZycpKSB7CiAgICB2YXIga2FwMiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NlY3Rpb24uY29udGVudC1ibG9jaycpIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtYWluIC5jb250YWluZXInKTsKICAgIGlmIChrYXAyKSB7CiAgICAgIGthcDIuaW5zZXJ0QmVmb3JlKGJhbnQoJ1NpcGFyacWfICYga2FyZ28nLCAnS2FyZ28gVGFraWJpJywKICAgICAgICAnS2FyZ28gbnVtYXJhbsSxesSxIHZlIGZpcm1hecSxIHNlw6dpcCBzb3JndWxhecSxbi4gTnVtYXJhbsSxeiB5b2tzYSBzaXBhcmnFnyBudW1hcmFuxLF6bGEgJyArCiAgICAgICAgJzxhIGhyZWY9Imh0dHBzOi8vd2EubWUvOTA1NTUwMDU5OTg0IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+V2hhdHNBcHDigJl0YW48L2E+IHlhesSxbiwgJyArCiAgICAgICAgJ3NldmtpeWF0IGR1cnVtdW51IGJpeiBpbGV0ZWxpbS4nKSwga2FwMi5maXJzdENoaWxkKTsKICAgIH0KICB9Cn0pKCk7PC9zY3JpcHQ+CgoKCjxzY3JpcHQ+Ci8qIEFSQU1BIMOWTkVSxLBTxLBOREUgTUFSS0EgTE9HT1NVIChrdWxsYW7EsWPEsSBpc3RlxJ9pLCAyMDI2LTA5LTIyKS4KICAgw5xyw7xuIMO2bmVyaXNpbmRlIGvDvMOnw7xrIGfDtnJzZWwgdmFyZMSxLCBNQVJLQSDDtm5lcmlzaSB5YWxuxLF6IG1ldGluZGkuCiAgIExvZ29sYXIgemF0ZW4gdGVtYSB2YXJsxLHEn8SxIG9sYXJhayBkdXJ1eW9yIChhc3NldHMvdXBsb2Fkcy9udi1tYXJrYS08c2x1Zz4ucG5nKS4KICAg4pqgIEJ1cmFkYSBBWVJJIELEsFIgU0xVRyBMxLBTVEVTxLAgVFVUVUxNVVlPUjogbG9nb3N1IG9sbWF5YW4gbWFya2FkYSBpbWcKICAgb25lcnJvciBpbGUga3V0dSBrZW5kaW5pIHNpbGl5b3IsIHNhdMSxciBlc2tpIGjDomxpbmUgZMO2bsO8eW9yLiBCw7Z5bGVjZSB5ZW5pCiAgIG1hcmthIGVrbGVuaW5jZSBpa2luY2kgYmlyIGxpc3RleWkgZ8O8bmNlbGxlbWUgecO8a8O8IGRvxJ9tdXlvcgogICAoZmlsdHJlZGVraSBsaXN0ZSB6YXRlbiBidSB5w7x6ZGVuIHVudXR1bG1heWEgYcOnxLFrKS4gKi8KKGZ1bmN0aW9uICgpIHsKICB2YXIga29rID0gbnVsbCwgY2FsaXNpeW9yID0gZmFsc2U7CiAgZnVuY3Rpb24gdGVtYUtvaygpIHsKICAgIGlmIChrb2sgIT09IG51bGwpIHJldHVybiBrb2s7CiAgICB2YXIgbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZio9Ii90aGVtZXMvIl1baHJlZio9Ii5jc3MiXScpOwogICAgdmFyIG0gPSBsICYmIGwuZ2V0QXR0cmlidXRlKCdocmVmJykubWF0Y2goL14oLipcL3RoZW1lc1wvW15cL10rXC8pLyk7CiAgICBrb2sgPSBtID8gbVsxXSArICdhc3NldHMvdXBsb2Fkcy9udi1tYXJrYS0nIDogJyc7CiAgICByZXR1cm4ga29rOwogIH0KICBmdW5jdGlvbiBiYXMoKSB7CiAgICB2YXIgdCA9IHRlbWFLb2soKTsgaWYgKCF0IHx8IGNhbGlzaXlvcikgcmV0dXJuOwogICAgdmFyIHNhdGlybGFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmF1dG9jb21wbGV0ZS1zdWdnZXN0aW9uID4gYVtocmVmXj0iL21hcmthLyJdJyk7CiAgICBpZiAoIXNhdGlybGFyLmxlbmd0aCkgcmV0dXJuOwogICAgY2FsaXNpeW9yID0gdHJ1ZTsKICAgIHNhdGlybGFyLmZvckVhY2goZnVuY3Rpb24gKGEpIHsKICAgICAgaWYgKGEucXVlcnlTZWxlY3RvcignLm52LW1zdWcnKSkgcmV0dXJuOwogICAgICB2YXIgc2x1ZyA9IGEuZ2V0QXR0cmlidXRlKCdocmVmJykucmVwbGFjZSgnL21hcmthLycsICcnKS5yZXBsYWNlKC9cLyQvLCAnJyk7CiAgICAgIGlmICghc2x1ZykgcmV0dXJuOwogICAgICB2YXIgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBkLmNsYXNzTmFtZSA9ICdzdWdnZXN0aW9uLWltYWdlIG52LW1zdWcnOwogICAgICB2YXIgaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwogICAgICBpLmFsdCA9ICcnOwogICAgICBpLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IGQucmVtb3ZlKCk7IH07CiAgICAgIGkuc3JjID0gdCArIHNsdWcgKyAnLnBuZyc7CiAgICAgIGQuYXBwZW5kQ2hpbGQoaSk7CiAgICAgIGEuaW5zZXJ0QmVmb3JlKGQsIGEuZmlyc3RDaGlsZCk7CiAgICB9KTsKICAgIGNhbGlzaXlvciA9IGZhbHNlOwogIH0KICBmdW5jdGlvbiBub3BpYygpIHsKICAgIHZhciB0ID0gdGVtYUtvaygpOyBpZiAoIXQpIHJldHVybjsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZ1tzcmMqPSJub3BpY19pbWFnZSJdJykuZm9yRWFjaChmdW5jdGlvbiAoaSkgewogICAgICBpZiAoaS5kYXRhc2V0Lm52Tm9waWMpIHJldHVybjsKICAgICAgdmFyIGEgPSBpLmNsb3Nlc3QoJ2FbaHJlZl49Ii9tYXJrYS8iXScpOwogICAgICBpZiAoIWEpIHJldHVybjsKICAgICAgaS5kYXRhc2V0Lm52Tm9waWMgPSAnMSc7CiAgICAgIHZhciBzbHVnID0gYS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5yZXBsYWNlKCcvbWFya2EvJywgJycpLnJlcGxhY2UoL1wvJC8sICcnKTsKICAgICAgdmFyIGQgPSBuZXcgSW1hZ2UoKTsKICAgICAgZC5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7IGkuc3JjID0gZC5zcmM7IH07CiAgICAgIGQuc3JjID0gdCArIHNsdWcgKyAnLnBuZyc7CiAgICB9KTsKICB9CiAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIobm9waWMpLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgbm9waWMpOwogIG5vcGljKCk7CiAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoYmFzKS5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGJhcyk7Cn0pKCk7Cjwvc2NyaXB0PgoKeyMgPT09PSBOT1ZVUyDigJQgUFAtUiBCT1JVOiBNxLBOxLBNVU0gNCBtLCA0J8OcTiBLQVRMQVJJIChrdWxsYW7EsWPEsSBrdXJhbMSxIDIzLjA5LjIwMjYpID09PT0KICAgQm9ydSBmYWJyaWthZGFuIDQgbSBib3kgZ2VsaXlvcjsgYXJhIG1ldHJhaiBrZXNpbSB2ZSBmaXJlIGRlbWVrLgogICDimqAgS2Fwc2FtIFNMVUcgbGlzdGVzaXlsZSBzxLFuxLFybMSxOiB5YWxuxLF6IEdGL0hha2FuIEFxdWFzeXN0ZW0gYm9ydWxhcsSxLgogICAgICBIYXVzdGhlcm0gYm9ydWxhcsSxIGRhIG1ldHJlIGJpcmltbGkgYW1hIGt1cmFsYSBEQUjEsEwgREXEnsSwTC4KICAg4pqgIEJ1IGJpciDDnFLDnE4gU0FZRkFTSSBrdXJhbMSxZMSxcjsgc2VwZXR0ZSBtaWt0YXIgZWxsZSBkZcSfacWfdGlyaWxpcnNlIGnFn2xlbWV6LgogICAgICBJZGVhU29mdCDDvHLDvG4gbW9kZWxpbmRlIG1pbmltdW0gc2lwYXJpxZ8gLyBrYXQgYWxhbsSxIFlPSywgbyB5w7x6ZGVuIEpTLiAjfQo8c2NyaXB0PgooZnVuY3Rpb24oKXsKICB2YXIgQk9SVSA9IFsncHAtci1zdGFuZGFydC1ib3J1LXNkcjYnLCdwcC1yLXV2LWRheWFuaW1saS1zdGFuZGFydC1ib3J1LXNkcjYnLAogICAgJ3BwLXItY2FtLWVseWFmLXRha3ZpeWVsaS1ib3J1LXNkcjctNCcsJ3BwLXItY2FtLWVseWFmLXRha3ZpeWVsaS1ib3J1LXNkcjYnLAogICAgJ3BwLXItbWFyaW4tYm9ydS1zZHI3LTQnLCdwcC1yY3QtY2FtLWVseWFmLXRha3ZpeWVsaS1ib3J1LXNkcjctNCcsCiAgICAncHAtcmN0LWNhbS1lbHlhZi10YWt2aXllbGktYm9ydS1zZHI5J107CiAgdmFyIEFESU0gPSA0OwogIGZ1bmN0aW9uIGthcHNhbWRhKCl7CiAgICB2YXIgeSA9IGxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1wvKyQvLCcnKS5zcGxpdCgnLycpLnBvcCgpOwogICAgcmV0dXJuIEJPUlUuaW5kZXhPZih5KSA+PSAwOwogIH0KICBmdW5jdGlvbiBrdXR1KCl7IHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXR5LWlucHV0Jyk7IH0KICBmdW5jdGlvbiBva3UoaSl7IHZhciB2ID0gcGFyc2VJbnQoU3RyaW5nKGkudmFsdWUpLnJlcGxhY2UoL1teMC05XS9nLCcnKSwxMCk7IHJldHVybiBpc05hTih2KT9BRElNOnY7IH0KICBmdW5jdGlvbiB5YXooaSx2KXsKICAgIGlmKHYgPCBBRElNKSB2ID0gQURJTTsKICAgIHYgPSBNYXRoLnJvdW5kKHYvQURJTSkqQURJTTsKICAgIGlmKHYgPCBBRElNKSB2ID0gQURJTTsKICAgIGkudmFsdWUgPSB2OwogICAgaS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnLHtidWJibGVzOnRydWV9KSk7CiAgICBpLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLHtidWJibGVzOnRydWV9KSk7CiAgfQogIGZ1bmN0aW9uIG5vdCgpewogICAgdmFyIGkgPSBrdXR1KCk7IGlmKCFpIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdudi1ib3J1LW5vdCcpKSByZXR1cm47CiAgICB2YXIga2FwID0gaS5jbG9zZXN0KCcucHJvZHVjdC1xdHknKSB8fCBpLnBhcmVudE5vZGU7IGlmKCFrYXApIHJldHVybjsKICAgIHZhciBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkLmlkID0gJ252LWJvcnUtbm90JzsKICAgIGQuc3R5bGUuY3NzVGV4dCA9ICdmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxLjQ7Y29sb3I6IzZiNzI4MDttYXJnaW4tdG9wOjZweCc7CiAgICBkLnRleHRDb250ZW50ID0gJ0J1IMO8csO8biBtZXRyZSBpbGUgc2F0xLFsxLFyLiBCb3J1IDQgbSBib3kgZ2VsZGnEn2kgacOnaW4gZW4gYXogNCBtIHZlIDRcdTIwMTnDvG4ga2F0bGFyxLEgb2xhcmFrIHNpcGFyacWfIGVkaWxpci4nOwogICAga2FwLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsIGthcC5uZXh0U2libGluZyk7CiAgfQogIGZ1bmN0aW9uIGt1cigpewogICAgaWYoIWthcHNhbWRhKCkpIHJldHVybjsKICAgIHZhciBpID0ga3V0dSgpOyBpZighaSkgcmV0dXJuOwogICAgaWYob2t1KGkpIDwgQURJTSkgeWF6KGksIEFESU0pOwogICAgbm90KCk7CiAgfQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSl7CiAgICBpZigha2Fwc2FtZGEoKSkgcmV0dXJuOwogICAgdmFyIGEgPSBlLnRhcmdldCAmJiBlLnRhcmdldC5jbG9zZXN0ICYmIGUudGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLXNlbGVjdG9yPSJpbmNyZWFzZS1xdHkiXSxbZGF0YS1zZWxlY3Rvcj0iZGVjcmVhc2UtcXR5Il0nKTsKICAgIGlmKCFhKSByZXR1cm47CiAgICB2YXIgaSA9IGt1dHUoKTsgaWYoIWkpIHJldHVybjsKICAgIGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIGlmKGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKSBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgeWF6KGksIG9rdShpKSArIChhLmdldEF0dHJpYnV0ZSgnZGF0YS1zZWxlY3RvcicpID09PSAnaW5jcmVhc2UtcXR5JyA/IEFESU0gOiAtQURJTSkpOwogIH0sIHRydWUpOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uKGUpewogICAgaWYoIWthcHNhbWRhKCkpIHJldHVybjsKICAgIGlmKGUudGFyZ2V0ICYmIGUudGFyZ2V0LmlkID09PSAncXR5LWlucHV0JykgeWF6KGUudGFyZ2V0LCBva3UoZS50YXJnZXQpKTsKICB9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgZnVuY3Rpb24oZSl7CiAgICBpZigha2Fwc2FtZGEoKSkgcmV0dXJuOwogICAgaWYoZS50YXJnZXQgJiYgZS50YXJnZXQuaWQgPT09ICdxdHktaW5wdXQnKSB5YXooZS50YXJnZXQsIG9rdShlLnRhcmdldCkpOwogIH0sIHRydWUpOwogIG5ldyBNdXRhdGlvbk9ic2VydmVyKGt1cikub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHtjaGlsZExpc3Q6dHJ1ZSwgc3VidHJlZTp0cnVlfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGt1cik7CiAga3VyKCk7Cn0pKCk7Cjwvc2NyaXB0Pgo=
ideasoft e-ticaret paketleri ile hazırlandı.