{"id":2724,"date":"2025-04-24T11:45:28","date_gmt":"2025-04-24T11:45:28","guid":{"rendered":"https:\/\/rentamac.io\/?page_id=2724"},"modified":"2026-08-24T14:49:41","modified_gmt":"2026-08-24T14:49:41","slug":"demo","status":"publish","type":"page","link":"https:\/\/rentamac.io\/tr\/demo\/","title":{"rendered":"\u00dccretsiz Demo ile hizmetimizi deneyimleyin"},"content":{"rendered":"\n<link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700;800&#038;display=swap\">\n<style>\nbody{background:#000000}\n.ramac-live{--bg:#000000; --panel:#13131d;\n    --card:rgba(255,255,255,.03); --card-h:rgba(255,255,255,.05);\n    --stroke:rgba(255,255,255,.08); --stroke-h:rgba(255,255,255,.16);\n    --text:#f0f2f5; --text-2:#aab0bb; --muted:#7b818d;\n    --accent:#4a8fd4; --accent-2:#5a9de0;\n    --accent-soft:rgba(74,143,212,.14); --accent-ring:rgba(74,143,212,.30);\n    --live:#e82f2f; --ok:#43d15b; --warn:#e0533d;}\n.ramac-live *{box-sizing:border-box}\n.ramac-live, .ramac-live{margin:0;background:var(--bg)}\n.ramac-live{color:var(--text);font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased}\n.ramac-live .wrap{max-width:980px;margin:0 auto;padding:44px 24px 84px;position:relative}\n.ramac-live .glow{position:absolute;left:50%;top:230px;transform:translateX(-50%);width:820px;max-width:96vw;height:460px;border-radius:50%;\n    background:radial-gradient(closest-side,rgba(74,143,212,.13),transparent 70%);pointer-events:none}\n.ramac-live .inner{position:relative}\n.ramac-live .eyebrow{display:flex;align-items:center;justify-content:center;gap:8px;font-size:12px;font-weight:700;\n    letter-spacing:.08em;text-transform:uppercase;color:var(--text-2)}\n.ramac-live .eyebrow .reddot{width:9px;height:9px;border-radius:50%;background:var(--live);animation:rlpulse 1.6s ease-in-out infinite}\n@keyframes rlpulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.55;transform:scale(.85)}}\n@keyframes rlbreathe{0%,100%{opacity:1}50%{opacity:.55}}\n.ramac-live h1.title{font-size:clamp(27px,3.4vw,40px);font-weight:800;letter-spacing:-.025em;line-height:1.1;margin:12px 0 10px;text-align:center}\n.ramac-live .sub{color:var(--text-2);font-size:clamp(14.5px,1.6vw,16.5px);line-height:1.55;margin:0 auto 28px;max-width:560px;text-align:center}\n.ramac-live .player{position:relative;border:1px solid var(--stroke);border-radius:10px 10px 0 0;overflow:hidden;background:#0a0a10;aspect-ratio:16\/9}\n.ramac-live .player video{position:absolute;inset:0;width:100%;height:100%;display:block;object-fit:contain;background:#0a0a10}\n.ramac-live .overlay{position:absolute;inset:0;display:flex;flex-direction:column;gap:7px;align-items:center;justify-content:center;\n    text-align:center;background:rgba(5,6,10,.78);padding:20px}\n.ramac-live .overlay.hidden{display:none}\n.ramac-live .overlay .od{width:11px;height:11px;border-radius:50%;background:var(--muted);animation:rlbreathe 2.4s ease-in-out infinite;margin-bottom:4px}\n.ramac-live .overlay .big{font-size:16px;font-weight:700;letter-spacing:-.01em}\n.ramac-live .overlay .small{font-size:12.5px;color:var(--text-2);max-width:380px;line-height:1.5}\n\/* Idle auto-pause: the stream tears down after 60s of no interaction and this overlay invites a tap to resume. *\/\n.ramac-live .paused-ov{cursor:pointer;gap:10px;background:rgba(5,6,10,.82);transition:background .15s}\n.ramac-live .paused-ov:hover{background:rgba(5,6,10,.72)}\n.ramac-live .paused-ov:focus-visible{outline:2px solid var(--accent);outline-offset:-3px}\n.ramac-live .paused-ov .pic{width:54px;height:54px;border-radius:50%;background:var(--accent);display:grid;place-items:center;color:#fff;\n    box-shadow:0 8px 28px rgba(74,143,212,.45);transition:transform .15s,background .15s;margin-bottom:2px}\n.ramac-live .paused-ov:hover .pic{transform:scale(1.06);background:var(--accent-2)}\n.ramac-live .paused-ov .pic svg{width:22px;height:22px;margin-left:3px}\n.ramac-live .islandbar{position:relative;display:flex;align-items:center;min-height:32px;border:1px solid var(--stroke);border-top:none;\n    border-radius:0 0 10px 10px;background:var(--panel);padding:4px 12px}\n.ramac-live .coolline{position:absolute;top:-1px;left:0;height:2px;width:0%;background:var(--accent);pointer-events:none}\n.ramac-live .island{display:inline-flex;align-items:center;gap:8px;max-width:100%;border:1px solid transparent;border-radius:999px;\n    padding:3px 0;transition:border-color .3s,padding .3s,background .3s}\n.ramac-live .island.expanded{border-color:rgba(255,255,255,.12);background:rgba(255,255,255,.03);padding:3px 12px}\n.ramac-live .island .d{width:8px;height:8px;border-radius:50%;background:var(--live);animation:rlbreathe 2s ease-in-out infinite;flex-shrink:0}\n.ramac-live .island[data-state=\"connecting\"] .d{background:rgba(255,255,255,.5)}\n.ramac-live .island[data-state=\"offline\"] .d, .ramac-live .island[data-state=\"paused\"] .d{display:none}\n.ramac-live .island .w{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#fff;white-space:nowrap}\n.ramac-live .island[data-state=\"offline\"] .w, .ramac-live .island[data-state=\"paused\"] .w{color:rgba(255,255,255,.4)}\n.ramac-live .island .sfx{display:none;font-size:11px;font-weight:600;color:rgba(255,255,255,.5);white-space:nowrap}\n.ramac-live .island.paused .sfx{display:inline}\n.ramac-live .island .msg{font-size:12.5px;color:var(--text-2);max-width:0;overflow:hidden;white-space:nowrap;opacity:0;\n    transition:max-width .35s ease,opacity .3s ease}\n.ramac-live .island.expanded .msg{max-width:560px;opacity:1}\n.ramac-live .island .msg b{color:var(--accent-2);font-weight:600}\n.ramac-live .acthead{margin:34px 0 4px;text-align:center}\n.ramac-live .acthead h2{font-size:19px;font-weight:700;letter-spacing:-.015em;margin:0 0 6px}\n.ramac-live .acthead p{font-size:13.5px;color:var(--text-2);margin:0;line-height:1.5}\n.ramac-live .tiles{display:grid;grid-template-columns:repeat(6,1fr);gap:12px;margin-top:16px}\n.ramac-live .tiles .tile{grid-column:span 2;min-width:0}\n.ramac-live .tiles .tile:nth-last-child(-n+2){grid-column:span 3}\n.ramac-live .tile{position:relative;display:flex;align-items:center;gap:12px;text-align:left;cursor:pointer;font-family:inherit;\n    border:1px solid var(--stroke-h);border-radius:12px;background:var(--panel);padding:12px 14px;color:var(--text);min-height:64px;\n    transition:background .15s,border-color .15s,opacity .2s}\n.ramac-live .tile:hover{background:#181826;border-color:var(--accent-ring)}\n.ramac-live .tile:active{background:#101019}\n.ramac-live .tile:focus-visible{outline:2px solid var(--accent);outline-offset:2px}\n.ramac-live .tile .chip{flex-shrink:0;width:30px;height:30px;border-radius:8px;background:var(--accent-soft);display:grid;place-items:center;\n    color:var(--accent);transition:background .15s,color .15s}\n.ramac-live .tile:hover .chip{background:rgba(74,143,212,.24)}\n.ramac-live .tile:active .chip, .ramac-live .tile.running .chip{background:var(--accent);color:#fff}\n.ramac-live .tile .chip svg{width:15px;height:15px}\n.ramac-live .tile .chip .spin{display:none;width:14px;height:14px;border-radius:50%;border:2px solid rgba(255,255,255,.4);\n    border-top-color:#fff;animation:rlspin .8s linear infinite}\n@keyframes rlspin{to{transform:rotate(360deg)}}\n.ramac-live .tile.running .chip .gl{display:none}\n.ramac-live .tile.running .chip .spin{display:block}\n.ramac-live .tile .body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}\n.ramac-live .tile .t{font-size:14px;font-weight:600}\n.ramac-live .tile .s{font-size:11.5px;color:var(--muted);line-height:1.4}\n.ramac-live .kc{flex-shrink:0;display:inline-flex;align-items:center;gap:5px;font-size:10px;font-weight:700;letter-spacing:.06em;\n    text-transform:uppercase;color:var(--text-2);border:1px solid var(--stroke-h);border-radius:5px;padding:3px 8px;\n    box-shadow:0 1px 0 rgba(0,0,0,.9);transition:background .15s,color .15s,border-color .15s}\n.ramac-live .kc svg{width:9px;height:9px}\n.ramac-live .tile:hover .kc{background:var(--accent);color:#fff;border-color:var(--accent)}\n.ramac-live .tile:active .kc{box-shadow:none}\n.ramac-live .tile.running .kc{display:none}\n.ramac-live .kc.count{font-family:var(--mono);text-transform:none;letter-spacing:0}\n.ramac-live .tiles.cooling .tile, .ramac-live .tiles.paused .tile{opacity:.45}\n.ramac-live .tiles.cooling .tile:hover, .ramac-live .tiles.paused .tile:hover{background:var(--panel);border-color:var(--stroke-h)}\n.ramac-live .tiles.cooling .tile:hover .chip, .ramac-live .tiles.paused .tile:hover .chip{background:var(--accent-soft);color:var(--accent)}\n.ramac-live .tiles.cooling .tile:hover .kc, .ramac-live .tiles.paused .tile:hover .kc{background:transparent;color:var(--text-2);border-color:var(--stroke-h)}\n\/* Selected tile = the action currently on screen (shared across all viewers via SignalR). Accent-filled chip\n   with a check, highlighted + focus-ringed card. Persists until another action runs or the desktop resets. *\/\n.ramac-live .tile.active{background:#181826;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}\n.ramac-live .tile.active .chip{background:var(--accent);color:#fff}\n.ramac-live .tile.active .chip .gl, .ramac-live .tile.active .chip .spin{display:none}\n.ramac-live .tile.active .chip::after{content:\"\";display:block;width:6px;height:10px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg);margin-top:-2px}\n.ramac-live .tile.active .kc{display:none}\n\/* The running\/selected tile is never dimmed by the cooldown\/paused overlay \u2014 it stays the focus of attention. *\/\n.ramac-live .tiles.cooling .tile.running, .ramac-live .tiles.cooling .tile.active, .ramac-live .tiles.paused .tile.running, .ramac-live .tiles.paused .tile.active{opacity:1}\n\/* When ANOTHER viewer triggers a button, flash a tooltip above it so you can tell their action from your own. *\/\n.ramac-live .tile.tip{z-index:6}\n.ramac-live .tile.tip::after{content:attr(data-tip);position:absolute;left:50%;bottom:calc(100% + 9px);transform:translateX(-50%);white-space:nowrap;background:#0a0a10;color:var(--text);border:1px solid var(--accent-ring);border-radius:7px;padding:6px 10px;font-size:11px;font-weight:600;box-shadow:0 8px 24px rgba(0,0,0,.55);z-index:6;pointer-events:none;animation:rltip 3.2s ease forwards}\n.ramac-live .tile.tip::before{content:\"\";position:absolute;left:50%;bottom:calc(100% + 4px);transform:translateX(-50%);border:5px solid transparent;border-top-color:#0a0a10;z-index:6;pointer-events:none;animation:rltip 3.2s ease forwards}\n@keyframes rltip{0%{opacity:0;transform:translateX(-50%) translateY(5px)}10%{opacity:1;transform:translateX(-50%) translateY(0)}82%{opacity:1;transform:translateX(-50%) translateY(0)}100%{opacity:0;transform:translateX(-50%) translateY(0)}}\n.ramac-live .sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}\n.ramac-live .cta-panel{max-width:600px;margin:48px auto 0;background:var(--panel);border:1px solid var(--stroke);border-radius:20px;\n    padding:36px 32px;text-align:center;position:relative;overflow:hidden}\n.ramac-live .cta-panel::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,var(--accent),var(--accent-2))}\n.ramac-live .cta-panel h2{font-size:23px;font-weight:800;letter-spacing:-.02em;margin:0 0 10px;color:var(--text)}\n.ramac-live .cta-panel p{color:var(--text-2);font-size:14.5px;line-height:1.55;max-width:440px;margin:0 auto 24px}\n.ramac-live .cta-row{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}\n.ramac-live .cta-rent{display:inline-flex;align-items:center;justify-content:center;text-decoration:none !important;font-weight:700;\n    font-size:14.5px !important;color:#fff !important;background:var(--accent) !important;border-radius:12px;padding:13px 26px;\n    min-height:48px;transition:background .2s;transform:none !important;box-shadow:none !important}\n.ramac-live .cta-rent:hover, .ramac-live .cta-rent:focus{background:#4381bf !important;color:#fff !important}\n.ramac-live .cta-rent:visited{color:#fff !important}\n.ramac-live .cta-rent:focus-visible{outline:2px solid var(--accent);outline-offset:2px}\n.ramac-live .cta-faq{display:inline-flex;align-items:center;justify-content:center;text-decoration:none !important;font-weight:600;\n    font-size:14px !important;color:var(--text) !important;background:transparent;border:1.5px solid var(--accent-ring);\n    border-radius:12px;padding:12px 24px;min-height:48px;transition:background .15s,border-color .15s}\n.ramac-live .cta-faq:hover, .ramac-live .cta-faq:focus{background:var(--accent-soft);border-color:var(--accent-ring);color:var(--text) !important}\n@media(max-width:880px){.ramac-live .tiles{grid-template-columns:repeat(2,1fr)}.ramac-live .tiles .tile, .ramac-live .tiles .tile:nth-last-child(-n+2){grid-column:span 1}}\n@media(max-width:560px){.ramac-live .wrap{padding:30px 14px 60px}\n.ramac-live .tiles{grid-template-columns:1fr}.ramac-live .tiles .tile, .ramac-live .tiles .tile:nth-last-child(-n+2){grid-column:span 1}}\n@media (prefers-reduced-motion:reduce){.ramac-live .eyebrow .reddot, .ramac-live .island .d, .ramac-live .overlay .od, .ramac-live .tile .spin{animation:none}\n.ramac-live *{transition:none !important}}\n<\/style>\n<div class=\"ramac-live\">\n<div class=\"wrap\">\n  <div class=\"glow\" aria-hidden=\"true\"><\/div>\n  <div class=\"inner\">\n\n    <div class=\"eyebrow\"><span class=\"reddot\" aria-hidden=\"true\"><\/span> Mac mini M4, streaming live<\/div>\n    <h1 class=\"title\">Try a real Mac. Right now, in your browser.<\/h1>\n    <p class=\"sub\">This is a live machine. Pick an action below and watch it happen on screen.<\/p>\n\n    <div class=\"player\">\n      <video id=\"rl-video\" autoplay muted playsinline><\/video>\n      <div class=\"overlay\" id=\"rl-overlay\">\n        <span class=\"od\" aria-hidden=\"true\"><\/span>\n        <div class=\"big\" id=\"rl-ov-big\">Connecting to the live stream&#8230;<\/div>\n        <div class=\"small\" id=\"rl-ov-small\"><\/div>\n      <\/div>\n      <div class=\"overlay paused-ov hidden\" id=\"rl-paused\" role=\"button\" tabindex=\"0\" aria-label=\"Resume the live stream\">\n        <span class=\"pic\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M8 5v14l11-7z\"\/><\/svg><\/span>\n        <div class=\"big\">Stream paused<\/div>\n        <div class=\"small\">Tap to resume the live stream<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"islandbar\">\n      <div class=\"coolline\" id=\"rl-line\" aria-hidden=\"true\"><\/div>\n      <span class=\"island\" id=\"rl-island\" data-state=\"connecting\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n        <span class=\"d\" aria-hidden=\"true\"><\/span>\n        <span class=\"w\" id=\"rl-word\">Connecting<\/span>\n        <span class=\"sfx\" id=\"rl-sfx\">&middot; actions paused<\/span>\n        <span class=\"msg\" id=\"rl-msg\"><\/span>\n      <\/span>\n    <\/div>\n\n    <div class=\"acthead\">\n      <h2>Now run something on it<\/h2>\n      <p>These buttons send real commands to the Mac above.<\/p>\n    <\/div>\n    <div class=\"tiles\" id=\"rl-tiles\">\n      <button class=\"tile\" type=\"button\" data-action=\"simulator\">\n        <span class=\"chip\"><span class=\"gl\"><svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\"><rect x=\"7\" y=\"2\" width=\"10\" height=\"20\" rx=\"2.5\"\/><path stroke-linecap=\"round\" d=\"M11 18h2\"\/><\/svg><\/span><span class=\"spin\" aria-hidden=\"true\"><\/span><\/span>\n        <span class=\"body\"><span class=\"t\">Open iOS Simulator<\/span><span class=\"s\">Boot an iPhone on the Mac<\/span><\/span>\n        <span class=\"kc\"><svg viewBox=\"0 0 10 10\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M1.5 1l7 4-7 4z\"\/><\/svg> Run<\/span>\n      <\/button>\n      <button class=\"tile\" type=\"button\" data-action=\"speedtest\">\n        <span class=\"chip\"><span class=\"gl\"><svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" d=\"M4 14a8 8 0 1116 0M12 14l4-5\"\/><\/svg><\/span><span class=\"spin\" aria-hidden=\"true\"><\/span><\/span>\n        <span class=\"body\"><span class=\"t\">Run Speedtest<\/span><span class=\"s\">Latency, upload and download<\/span><\/span>\n        <span class=\"kc\"><svg viewBox=\"0 0 10 10\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M1.5 1l7 4-7 4z\"\/><\/svg> Run<\/span>\n      <\/button>\n      <button class=\"tile\" type=\"button\" data-action=\"xcode\">\n        <span class=\"chip\"><span class=\"gl\"><svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" d=\"M9 6l-5 6 5 6M15 6l5 6-5 6\"\/><\/svg><\/span><span class=\"spin\" aria-hidden=\"true\"><\/span><\/span>\n        <span class=\"body\"><span class=\"t\">Launch Xcode<\/span><span class=\"s\">Open the full IDE on screen<\/span><\/span>\n        <span class=\"kc\"><svg viewBox=\"0 0 10 10\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M1.5 1l7 4-7 4z\"\/><\/svg> Run<\/span>\n      <\/button>\n      <button class=\"tile\" type=\"button\" data-action=\"sysinfo\">\n        <span class=\"chip\"><span class=\"gl\"><svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"14\" rx=\"2\"\/><path stroke-linecap=\"round\" d=\"M7 9l3 2.5L7 14M12.5 14H17\"\/><\/svg><\/span><span class=\"spin\" aria-hidden=\"true\"><\/span><\/span>\n        <span class=\"body\"><span class=\"t\">Show System Info<\/span><span class=\"s\">Hardware specs via Terminal<\/span><\/span>\n        <span class=\"kc\"><svg viewBox=\"0 0 10 10\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M1.5 1l7 4-7 4z\"\/><\/svg> Run<\/span>\n      <\/button>\n      <button class=\"tile\" type=\"button\" data-action=\"reset\">\n        <span class=\"chip\"><span class=\"gl\"><svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" d=\"M4 10a8 8 0 1014-4M4 4v6h6\"\/><\/svg><\/span><span class=\"spin\" aria-hidden=\"true\"><\/span><\/span>\n        <span class=\"body\"><span class=\"t\">Reset Desktop<\/span><span class=\"s\">Close everything, fresh start<\/span><\/span>\n        <span class=\"kc\"><svg viewBox=\"0 0 10 10\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M1.5 1l7 4-7 4z\"\/><\/svg> Run<\/span>\n      <\/button>\n    <\/div>\n\n    <!-- CTA-START -->\n    <section class=\"cta-panel\" aria-label=\"Get your own Mac\">\n      <h2>Ready for your own Mac?<\/h2>\n      <p>Get a private Mac Mini M4 with full admin control and DeskIn, our faster remote connection. Or read the FAQ first.<\/p>\n      <div class=\"cta-row\">\n        <a class=\"cta-rent\" href=\"https:\/\/rentamac.io\/pricing\/\">Rent a Mac<\/a>\n        <a class=\"cta-faq\" href=\"https:\/\/rentamac.io\/faq\/\">Read the FAQ<\/a>\n      <\/div>\n    <\/section>\n    <!-- CTA-END -->\n\n  <\/div>\n<\/div>\n<\/div>\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/@microsoft\/signalr@8\/dist\/browser\/signalr.min.js\"><\/script>\n<script type=\"text\/plain\" data-ramac=\"player\">DQovLyBFZGl0YWJsZSBTT1VSQ0UgZm9yIHRoZSBkZW1vIFdlYlJUQyBwbGF5ZXIuIFRoZSBwdWJsaXNoZWQgcGFnZSAocmVudGFtYWMtZGVtby5odG1sLCBhbmQgdGhlIFdvcmRQcmVzcw0KLy8gL2RlbW8gcGFnZSkgZG9lcyBOT1QgbG9hZCB0aGlzIGZpbGUgZGlyZWN0bHkg4oCUIGEgYmFzZTY0IGNvcHkgaXMgZW1iZWRkZWQgaW5zaWRlIHRoZQ0KLy8gPHNjcmlwdCB0eXBlPSJ0ZXh0L3BsYWluIiBkYXRhLXJhbWFjPSJwbGF5ZXIiPuKApjwvc2NyaXB0PiBibG9jayBvZiByZW50YW1hYy1kZW1vLmh0bWwgYW5kIGRlY29kZWQrZXZhbCdkDQovLyBhdCBydW50aW1lIGJ5IHRoZSBTVkcvZGV0YWlscyBib290IGxvYWRlci4gQWZ0ZXIgZWRpdGluZyB0aGlzIGZpbGUsIHJ1biBgYnVpbGQtZGVtby1wbGF5ZXIucHlgIHRvDQovLyByZS1lbmNvZGUgaXQgaW50byByZW50YW1hYy1kZW1vLmh0bWwsIHRoZW4gZGVwbG95IHRoYXQgSFRNTCB0byBXb3JkUHJlc3MuIE5ldmVyIGhhbmQtZWRpdCB0aGUgYmFzZTY0Lg0KKGZ1bmN0aW9uKCl7DQogIGlmICh3aW5kb3cuX19yYW1hY19yYW5fcGxheWVyKSByZXR1cm47DQogIHdpbmRvdy5fX3JhbWFjX3Jhbl9wbGF5ZXIgPSB0cnVlOw0KICB2YXIgQ09ORklHID0gew0KICAgIHNyczogImh0dHA6Ly9zcnMtZGVtby1yZW50YW1hYy5nZXJtYW55d2VzdGNlbnRyYWwuYXp1cmVjb250YWluZXIuaW86MTk4NSIsDQogICAgYXBwOiAibGl2ZSIsDQogICAgc3RyZWFtOiAiY2FtIiwNCiAgICBiYWNrZW5kOiAiaHR0cHM6Ly9hcGkucmVudGFtYWMuaW8iDQogIH07DQogIHZhciBDT09MRE9XTl9NUyA9IDEwMDAwOw0KICAvLyBUaGUgT29rbGEgc3BlZWQgdGVzdCB0YWtlcyB+MjBzIHRvIGFjdHVhbGx5IHJ1biwgYW5kIHRoZSBORVhUIGFjdGlvbiBzdGFydHMgYnkga2lsbGluZyB0aGUgZGVtbyBhcHBzDQogIC8vIChraWxsYWxsIFNwZWVkdGVzdCkg4oCUIHNvIGEgMTBzIGdhdGUgd291bGQgbGV0IHNvbWVvbmUgY3V0IHRoZSB0ZXN0IG9mZiBtaWQtcnVuIGJlZm9yZSB0aGUgcmVzdWx0IHNob3dzLg0KICAvLyBLZWVwIHRoZSBidXR0b25zIChhbmQgdGhlIHBlci1NYWMgY29tbWFuZCBnYXRlKSBsb2NrZWQgMjBzIGFmdGVyIGEgc3BlZWR0ZXN0IHNvIGl0IGNhbiBmaW5pc2guDQogIHZhciBBQ1RJT05fQ09PTERPV05fTVMgPSB7IHNwZWVkdGVzdDogMjAwMDAgfTsNCiAgZnVuY3Rpb24gY29vbGRvd25Gb3IoYSl7IHJldHVybiBBQ1RJT05fQ09PTERPV05fTVNbYV0gfHwgQ09PTERPV05fTVM7IH0NCiAgdmFyIExBQkVMUyA9IHsgc2ltdWxhdG9yOiJ0aGUgaU9TIFNpbXVsYXRvciIsIHNwZWVkdGVzdDoiYSBzcGVlZHRlc3QiLCBjbGF1ZGU6InRoZSBDbGF1ZGUgYXBwIiwgeGNvZGU6Ilhjb2RlIiwgc3lzaW5mbzoidGhlIHN5c3RlbSBpbmZvIiwgcmVzZXQ6ImEgZGVza3RvcCByZXNldCIgfTsNCg0KICB2YXIgJCA9IGZ1bmN0aW9uKGlkKXsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsgfTsNCiAgdmFyIHZpZGVvPSQoInJsLXZpZGVvIiksIG92ZXJsYXk9JCgicmwtb3ZlcmxheSIpLCBvdkJpZz0kKCJybC1vdi1iaWciKSwgb3ZTbWFsbD0kKCJybC1vdi1zbWFsbCIpLCBwYXVzZWRPdj0kKCJybC1wYXVzZWQiKTsNCiAgdmFyIGlzbGFuZD0kKCJybC1pc2xhbmQiKSwgd29yZD0kKCJybC13b3JkIiksIG1zZz0kKCJybC1tc2ciKSwgbGluZT0kKCJybC1saW5lIiksIHRpbGVzRWw9JCgicmwtdGlsZXMiKTsNCg0KICAvKiAtLS0tLS0tLS0tIGlzbGFuZDogcmVzdHMgYXQgTElWRSwgZXhwYW5kcyB0byBzcGVhaywgY29sbGFwc2VzIC0tLS0tLS0tLS0gKi8NCiAgdmFyIG1zZ1RpbWVyPW51bGw7DQogIGZ1bmN0aW9uIHNwZWFrKGh0bWwsIG1zKXsNCiAgICBpZighbXMpew0KICAgICAgdmFyIHdvcmRzPShodG1sLnJlcGxhY2UoLzxbXj5dKz4vZywiIikuc3BsaXQoL1xzKy8pLmxlbmd0aCk7DQogICAgICBtcyA9IDMwMDAgKyBNYXRoLmNlaWwod29yZHMvMykqMTAwMDsNCiAgICB9DQogICAgbXNnLmlubmVySFRNTCA9IGh0bWw7DQogICAgaXNsYW5kLmNsYXNzTGlzdC5hZGQoImV4cGFuZGVkIik7DQogICAgaWYobXNnVGltZXIpIGNsZWFyVGltZW91dChtc2dUaW1lcik7DQogICAgbXNnVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IGlzbGFuZC5jbGFzc0xpc3QucmVtb3ZlKCJleHBhbmRlZCIpOyB9LCBtcyk7DQogIH0NCiAgZnVuY3Rpb24gc2V0U3RhdGUoc3RhdGUpew0KICAgIGlzbGFuZC5zZXRBdHRyaWJ1dGUoImRhdGEtc3RhdGUiLCBzdGF0ZSk7DQogICAgd29yZC50ZXh0Q29udGVudCA9IHN0YXRlPT09ImxpdmUiID8gIkxpdmUiIDogc3RhdGU9PT0iY29ubmVjdGluZyIgPyAiQ29ubmVjdGluZyIgOiBzdGF0ZT09PSJwYXVzZWQiID8gIlBhdXNlZCIgOiAiT2ZmbGluZSI7DQogIH0NCg0KICBmdW5jdGlvbiBzaG93T3ZlcmxheShiaWcsIHNtYWxsKXsgb3ZCaWcudGV4dENvbnRlbnQ9YmlnOyBvdlNtYWxsLnRleHRDb250ZW50PXNtYWxsfHwiIjsgb3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCJoaWRkZW4iKTsgfQ0KICBmdW5jdGlvbiBoaWRlT3ZlcmxheSgpeyBvdmVybGF5LmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpOyB9DQoNCiAgLyogLS0tLS0tLS0tLSBwcmVzZW5jZSAvIHRpbGVzIC0tLS0tLS0tLS0gKi8NCiAgdmFyIGFnZW50T25saW5lPWZhbHNlLCBzdHJlYW1VcD1mYWxzZSwgaWRsZVBhdXNlZD1mYWxzZTsNCiAgZnVuY3Rpb24gcmVmcmVzaFRpbGVzKCl7DQogICAgdmFyIGJsb2NrZWQgPSBpZGxlUGF1c2VkIHx8ICFhZ2VudE9ubGluZSB8fCBEYXRlLm5vdygpIDwgY29vbGRvd25VbnRpbDsNCiAgICB0aWxlc0VsLmNsYXNzTGlzdC50b2dnbGUoImNvb2xpbmciLCBEYXRlLm5vdygpIDwgY29vbGRvd25VbnRpbCk7DQogICAgdGlsZXNFbC5jbGFzc0xpc3QudG9nZ2xlKCJwYXVzZWQiLCBpZGxlUGF1c2VkIHx8ICFhZ2VudE9ubGluZSk7DQogICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0aWxlc0VsLnF1ZXJ5U2VsZWN0b3JBbGwoIi50aWxlIiksIGZ1bmN0aW9uKGIpew0KICAgICAgYi5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLCBibG9ja2VkID8gInRydWUiIDogImZhbHNlIik7DQogICAgfSk7DQogIH0NCiAgZnVuY3Rpb24gc2V0UHJlc2VuY2Uob25saW5lKXsNCiAgICB2YXIgd2FzID0gYWdlbnRPbmxpbmU7DQogICAgYWdlbnRPbmxpbmUgPSAhIW9ubGluZTsNCiAgICBpc2xhbmQuY2xhc3NMaXN0LnRvZ2dsZSgicGF1c2VkIiwgIWFnZW50T25saW5lKTsNCiAgICBpZighYWdlbnRPbmxpbmUpew0KICAgICAgY2xlYXJSdW5uaW5nKCk7ICAgLy8gdGhlIE1hYyBpcyBnb25lLCBzbyBub3RoaW5nIGlzIGxhdW5jaGluZyDigJQgbmV2ZXIgbGVhdmUgYSBzcGlubmVyIHR1cm5pbmcNCiAgICAgIGlmKHdhcykgc3BlYWsoIkFjdGlvbnMgYXJlIHBhdXNlZCBvbiB0aGlzIE1hYyByaWdodCBub3cuIik7DQogICAgfQ0KICAgIHJlZnJlc2hUaWxlcygpOw0KICB9DQoNCiAgLyogLS0tLS0tLS0tLSBzaGFyZWQgY29vbGRvd246IGEgMnB4IGxpbmUgdGhhdCBleGlzdHMgb25seSB3aGlsZSBkcmFpbmluZyAtLS0tLS0tLS0tICovDQogIHZhciBLQ19IVE1MID0gJzxzdmcgdmlld0JveD0iMCAwIDEwIDEwIiBmaWxsPSJjdXJyZW50Q29sb3IiIGFyaWEtaGlkZGVuPSJ0cnVlIj48cGF0aCBkPSJNMS41IDFsNyA0LTcgNHoiLz48L3N2Zz4gUnVuJzsNCiAgdmFyIGNvb2xkb3duVW50aWwgPSAwLCBjb29sZG93blNwYW4gPSBDT09MRE9XTl9NUywgcmFmT24gPSBmYWxzZSwgY2RLYyA9IG51bGw7DQogIGZ1bmN0aW9uIHJlc3RvcmVLYygpew0KICAgIGlmKGNkS2MpeyBjZEtjLmlubmVySFRNTCA9IEtDX0hUTUw7IGNkS2MuY2xhc3NMaXN0LnJlbW92ZSgiY291bnQiKTsgY2RLYyA9IG51bGw7IH0NCiAgfQ0KICBmdW5jdGlvbiBwYWludENvb2xkb3duKCl7DQogICAgdmFyIGxlZnQgPSBjb29sZG93blVudGlsIC0gRGF0ZS5ub3coKTsNCiAgICBpZihsZWZ0IDw9IDApeyBsaW5lLnN0eWxlLndpZHRoPSIwJSI7IHJhZk9uPWZhbHNlOyByZXN0b3JlS2MoKTsgcmVmcmVzaFRpbGVzKCk7IHJldHVybjsgfQ0KICAgIGxpbmUuc3R5bGUud2lkdGggPSAobGVmdCAvIGNvb2xkb3duU3BhbiAqIDEwMCkgKyAiJSI7DQogICAgaWYoY2RLYyl7IGNkS2MuY2xhc3NMaXN0LmFkZCgiY291bnQiKTsgY2RLYy50ZXh0Q29udGVudCA9IE1hdGguY2VpbChsZWZ0LzEwMDApICsgInMiOyB9DQogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHBhaW50Q29vbGRvd24pOw0KICB9DQogIGZ1bmN0aW9uIHN0YXJ0Q29vbGRvd24obXMpew0KICAgIGNvb2xkb3duU3BhbiA9IG1zIHx8IENPT0xET1dOX01TOw0KICAgIGNvb2xkb3duVW50aWwgPSBEYXRlLm5vdygpICsgY29vbGRvd25TcGFuOw0KICAgIGxpbmUuc3R5bGUud2lkdGggPSAiMTAwJSI7DQogICAgcmVmcmVzaFRpbGVzKCk7DQogICAgaWYoIXJhZk9uKXsgcmFmT249dHJ1ZTsgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHBhaW50Q29vbGRvd24pOyB9DQogIH0NCg0KICAvKiAtLS0tLS0tLS0tIGFjdGlvbnMgLS0tLS0tLS0tLSAqLw0KICAvLyBUaWxlIHN0YXRlIGlzIGRyaXZlbiBieSB0aGUgU2lnbmFsUiBDb21tYW5kU3RhdHVzIHN0cmVhbSBzbyBFVkVSWSB2aWV3ZXIgY29udmVyZ2VzIG9uIHRoZSBzYW1lIHBpY3R1cmU6DQogIC8vIGV4YWN0bHkgb25lIHRpbGUgaXMgInJ1bm5pbmciIChsYXVuY2hpbmcpIG9yICJhY3RpdmUiIChvbiBzY3JlZW4gbm93KSBhdCBhIHRpbWUuDQogIC8vDQogIC8vIEEgdGlsZSBvbmx5IGxlYXZlcyAicnVubmluZyIgd2hlbiBhIExBVEVSIG1lc3NhZ2UgYXJyaXZlcywgYW5kIGV2ZXJ5IG9uZSBvZiB0aG9zZSBjYW4gYmUgbG9zdDogdGhlIE1hYw0KICAvLyBhZ2VudCdzIExhdW5jaEFnZW50IHJlc3RhcnRzLCB3ZWJzb2NhdCByZWNvbm5lY3RzLCB0aGUgYmFja2VuZCByZWRlcGxveXMsIHRoZSBodWIgZHJvcHMgZnJhbWVzIHdoaWxlDQogIC8vIHJlY29ubmVjdGluZy4gVGhlIENTUyBhbHNvIGtlZXBzIGEgcnVubmluZyB0aWxlIGF0IGZ1bGwgb3BhY2l0eSB3aGlsZSB0aGUgZ3JpZCBpcyBkaW1tZWQsIHNvIGEgbG9zdA0KICAvLyBtZXNzYWdlIGlzIHZlcnkgdmlzaWJsZS4gSGVuY2U6IG9uZSB0cmFja2VkIG93bmVyIChydW5uaW5nQWN0aW9uKSwgYSB3YXRjaGRvZyB0aGF0IGdpdmVzIHVwIGFuZCByZS1yZWFkcw0KICAvLyB0aGUgc2VydmVyJ3MgdHJ1dGgsIGFuZCBjbGVhclJ1bm5pbmcoKSBndWFyZGVkIGJ5IGFjdGlvbiBzbyBhIHN0YWxlIGNhbGxiYWNrIGNhbid0IHdpcGUgYSBuZXdlciBzcGlubmVyLg0KICB2YXIgUlVOX1dBVENIRE9HX01TID0gMjUwMDA7ICAgLy8gZXZlcnkgYWN0aW9uIGFja3MgInN0YXJ0ZWQiIHdpdGhpbiBhIHNlY29uZCBvciB0d287IHRoaXMgaXMgdGhlIGNlaWxpbmcNCiAgdmFyIHBlbmRpbmdNaW5lID0gbnVsbCwgYWN0aXZlQWN0aW9uID0gbnVsbCwgcnVubmluZ0FjdGlvbiA9IG51bGwsIHJ1bm5pbmdTaW5jZSA9IDAsIHJ1bldhdGNoZG9nID0gbnVsbDsNCiAgZnVuY3Rpb24gdGlsZUZvcihhKXsgcmV0dXJuIHRpbGVzRWwucXVlcnlTZWxlY3RvcignLnRpbGVbZGF0YS1hY3Rpb249IicgKyBhICsgJyJdJyk7IH0NCiAgZnVuY3Rpb24gZGlzYXJtV2F0Y2hkb2coKXsgaWYocnVuV2F0Y2hkb2cpeyBjbGVhclRpbWVvdXQocnVuV2F0Y2hkb2cpOyBydW5XYXRjaGRvZyA9IG51bGw7IH0gfQ0KICAvLyBEcm9wcyB0aGUgc3Bpbm5lciBmcm9tIGV2ZXJ5IHRpbGUuIFBhc3MgYW4gYWN0aW9uIHRvIG5vLW9wIHdoZW4gYSBORVdFUiBhY3Rpb24gYWxyZWFkeSBvd25zIHRoZSB0aWxlcw0KICAvLyAoYSBsYXRlIFBPU1QgcmVqZWN0aW9uIG9yIGEgZmlyZWQgd2F0Y2hkb2cgbXVzdCBub3QgY2xlYXIgdGhlIHNwaW5uZXIgdGhhdCByZXBsYWNlZCBpdCkuDQogIGZ1bmN0aW9uIGNsZWFyUnVubmluZyhhY3Rpb24pew0KICAgIGlmKGFjdGlvbiAmJiBydW5uaW5nQWN0aW9uICYmIHJ1bm5pbmdBY3Rpb24gIT09IGFjdGlvbil7DQogICAgICB2YXIgc3RhbGUgPSB0aWxlRm9yKGFjdGlvbik7IGlmKHN0YWxlKSBzdGFsZS5jbGFzc0xpc3QucmVtb3ZlKCJydW5uaW5nIik7DQogICAgICByZXR1cm47DQogICAgfQ0KICAgIGRpc2FybVdhdGNoZG9nKCk7IHJ1bm5pbmdBY3Rpb24gPSBudWxsOyBydW5uaW5nU2luY2UgPSAwOw0KICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodGlsZXNFbC5xdWVyeVNlbGVjdG9yQWxsKCIudGlsZS5ydW5uaW5nIiksIGZ1bmN0aW9uKGIpeyBiLmNsYXNzTGlzdC5yZW1vdmUoInJ1bm5pbmciKTsgfSk7DQogIH0NCiAgZnVuY3Rpb24gY2xlYXJUaWxlU3RhdGVzKCl7DQogICAgZGlzYXJtV2F0Y2hkb2coKTsgcnVubmluZ0FjdGlvbiA9IG51bGw7IHJ1bm5pbmdTaW5jZSA9IDA7DQogICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0aWxlc0VsLnF1ZXJ5U2VsZWN0b3JBbGwoIi50aWxlLnJ1bm5pbmcsIC50aWxlLmFjdGl2ZSIpLCBmdW5jdGlvbihiKXsNCiAgICAgIGIuY2xhc3NMaXN0LnJlbW92ZSgicnVubmluZyIpOyBiLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpOw0KICAgIH0pOw0KICB9DQogIGZ1bmN0aW9uIHNldFJ1bm5pbmcoYSl7DQogICAgY2xlYXJUaWxlU3RhdGVzKCk7DQogICAgdmFyIHQgPSB0aWxlRm9yKGEpOyBpZih0KSB0LmNsYXNzTGlzdC5hZGQoInJ1bm5pbmciKTsNCiAgICBydW5uaW5nQWN0aW9uID0gYTsgcnVubmluZ1NpbmNlID0gRGF0ZS5ub3coKTsNCiAgICBydW5XYXRjaGRvZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICAgIC8vIE5vIHN0YXJ0ZWQvZmFpbGVkIGV2ZXIgY2FtZSBiYWNrLiBTdG9wIHNwaW5uaW5nIGFuZCBsZXQgL3N0YXR1cyBzYXkgd2hhdCBpcyByZWFsbHkgb24gc2NyZWVuIOKAlCB0aGUNCiAgICAgIC8vIGJhY2tlbmQgcmVjb3JkcyB0aGUgYWN0aXZlIGFjdGlvbiB3aGVuIGl0IGFjY2VwdHMgdGhlIGNvbW1hbmQsIHNvIGEgbG9zdCBhY2sgc3RpbGwgcmVzb2x2ZXMgY29ycmVjdGx5Lg0KICAgICAgY2xlYXJSdW5uaW5nKGEpOw0KICAgICAgaW5pdFN0YXR1cygpOw0KICAgIH0sIFJVTl9XQVRDSERPR19NUyk7DQogIH0NCiAgZnVuY3Rpb24gc2V0QWN0aXZlKGEpeyBjbGVhclRpbGVTdGF0ZXMoKTsgYWN0aXZlQWN0aW9uID0gYTsgdmFyIHQgPSB0aWxlRm9yKGEpOyBpZih0KSB0LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpOyB9DQogIC8vIEEgYnJpZWYgdG9vbHRpcCBhYm92ZSBhIHRpbGUgd2hlbiBBTk9USEVSIHZpZXdlciB0cmlnZ2VycyBpdCwgc28geW91IGNhbiB0ZWxsIHRoZWlyIGFjdGlvbiBmcm9tIHlvdXIgb3duLg0KICAvLyBDU1MgKC50aWxlLnRpcCkgZmFkZXMgaXQgaW4vb3V0IG92ZXIgfjMuMnM7IHdlIHJlc3RhcnQgdGhlIGFuaW1hdGlvbiB2aWEgYSByZWZsb3cgc28gaXQgcmVwbGF5cyBldmVuIHdoZW4NCiAgLy8gdGhlIHNhbWUgdGlsZSBmaXJlcyB0d2ljZSBpbiBhIHJvdy4NCiAgdmFyIHRpcFRpbWVyID0gbnVsbDsNCiAgZnVuY3Rpb24gc2hvd090aGVyVGlwKGEpew0KICAgIHZhciB0ID0gdGlsZUZvcihhKTsgaWYoIXQpIHJldHVybjsNCiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRpbGVzRWwucXVlcnlTZWxlY3RvckFsbCgiLnRpbGUudGlwIiksIGZ1bmN0aW9uKGIpeyBiLmNsYXNzTGlzdC5yZW1vdmUoInRpcCIpOyBiLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS10aXAiKTsgfSk7DQogICAgdC5zZXRBdHRyaWJ1dGUoImRhdGEtdGlwIiwgIlRyaWdnZXJlZCBieSBhbm90aGVyIHZpZXdlciIpOw0KICAgIHZvaWQgdC5vZmZzZXRXaWR0aDsgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIHJlZmxvdyBzbyB0aGUgQ1NTIGFuaW1hdGlvbiByZXBsYXlzDQogICAgdC5jbGFzc0xpc3QuYWRkKCJ0aXAiKTsNCiAgICBpZih0aXBUaW1lcikgY2xlYXJUaW1lb3V0KHRpcFRpbWVyKTsNCiAgICB0aXBUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgdC5jbGFzc0xpc3QucmVtb3ZlKCJ0aXAiKTsgdC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtdGlwIik7IH0sIDMyMDApOw0KICB9DQogIHRpbGVzRWwuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbihlKXsNCiAgICB2YXIgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgiLnRpbGUiKTsNCiAgICBpZighYnRuKSByZXR1cm47DQogICAgdmFyIGFjdGlvbiA9IGJ0bi5nZXRBdHRyaWJ1dGUoImRhdGEtYWN0aW9uIik7DQogICAgaWYoaWRsZVBhdXNlZCkgcmV0dXJuOyAgIC8vIHN0cmVhbSBpcyBpZGxlLXBhdXNlZDsgdGhlIGJ1dHRvbnMgYXJlIGRpc2FibGVkIHVudGlsIHRoZSB1c2VyIHRhcHMgdG8gcmVzdW1lDQogICAgaWYoRGF0ZS5ub3coKSA8IGNvb2xkb3duVW50aWwpew0KICAgICAgc3BlYWsoIk5leHQgYWN0aW9uIGluICIgKyBNYXRoLmNlaWwoKGNvb2xkb3duVW50aWwtRGF0ZS5ub3coKSkvMTAwMCkgKyAicy4iLCAzMDAwKTsNCiAgICAgIHJldHVybjsNCiAgICB9DQogICAgaWYoIWFnZW50T25saW5lKXsNCiAgICAgIHNwZWFrKCJUaGUgTWFjIGlzIG5vdCBhY2NlcHRpbmcgYWN0aW9ucyByaWdodCBub3cuIik7DQogICAgICByZXR1cm47DQogICAgfQ0KICAgIHJlc3RvcmVLYygpOw0KICAgIGNkS2MgPSBidG4ucXVlcnlTZWxlY3RvcigiLmtjIik7DQogICAgc3RhcnRDb29sZG93bihjb29sZG93bkZvcihhY3Rpb24pKTsNCiAgICBzZXRSdW5uaW5nKGFjdGlvbik7ICAgICAgICAgICAgICAgICAgICAvLyBpbnN0YW50IGxvY2FsIGZlZWRiYWNrLCBhbmQgY2xlYXJzIHdoYXRldmVyIHRpbGUgd2FzIGxpdCBiZWZvcmUNCiAgICBwZW5kaW5nTWluZSA9IHsgYWN0aW9uOiBhY3Rpb24sIHVudGlsOiBEYXRlLm5vdygpICsgMjAwMDAgfTsNCiAgICBzcGVhaygiPGI+WW91OjwvYj4gcnVubmluZyAiICsgTEFCRUxTW2FjdGlvbl0gKyAiLi4uIik7DQogICAgZmV0Y2goQ09ORklHLmJhY2tlbmQgKyAiL2FwaS9kZW1vLXN0cmVhbS9hY3Rpb25zLyIgKyBhY3Rpb24sIHsgbWV0aG9kOiJQT1NUIiB9KQ0KICAgICAgLnRoZW4oZnVuY3Rpb24ocil7DQogICAgICAgIGlmKHIuc3RhdHVzID09PSA0Mjkpew0KICAgICAgICAgIHNwZWFrKCJUaGUgTWFjIGlzIG5vdCBhY2NlcHRpbmcgYWN0aW9ucyByaWdodCBub3cg4oCUIHlvdSd2ZSBtYWRlIHRvbyBtYW55IGFjdGlvbnMgaW4gdGhlIHBhc3QgZmV3IG1pbnV0ZXMuIEl0IGZyZWVzIHVwIHNob3J0bHkuIik7DQogICAgICAgICAgY2xlYXJSdW5uaW5nKGFjdGlvbik7IHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICBpZighci5vayl7DQogICAgICAgICAgci5qc29uKCkudGhlbihmdW5jdGlvbihqKXsNCiAgICAgICAgICAgIHZhciBtPShqLmVycm9ycyYmai5lcnJvcnNbMF0pfHxqLmRldGFpbHx8ai50aXRsZXx8KCJFcnJvciAiK3Iuc3RhdHVzKTsNCiAgICAgICAgICAgIHNwZWFrKG0pOw0KICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCl7IHNwZWFrKCJFcnJvciAiICsgci5zdGF0dXMpOyB9KTsNCiAgICAgICAgICBjb29sZG93blVudGlsPTA7IGNsZWFyUnVubmluZyhhY3Rpb24pOyByZWZyZXNoVGlsZXMoKTsgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIHNwZWFrKCI8Yj5Zb3U6PC9iPiBydW5uaW5nICIgKyBMQUJFTFNbYWN0aW9uXSArICIsIHdhdGNoIHRoZSBzY3JlZW4uIik7DQogICAgICB9KQ0KICAgICAgLmNhdGNoKGZ1bmN0aW9uKCl7DQogICAgICAgIHNwZWFrKCJDb3VsZCBub3QgcmVhY2ggdGhlIGRlbW8gYmFja2VuZC4iKTsNCiAgICAgICAgY29vbGRvd25VbnRpbD0wOyBjbGVhclJ1bm5pbmcoYWN0aW9uKTsgcmVmcmVzaFRpbGVzKCk7DQogICAgICB9KTsNCiAgfSk7DQoNCiAgLyogLS0tLS0tLS0tLSBTaWduYWxSIC0tLS0tLS0tLS0gKi8NCiAgdmFyIGh1YlJldHJ5ID0gbnVsbDsNCiAgZnVuY3Rpb24gc2NoZWR1bGVIdWJSZXRyeSgpew0KICAgIGlmKGh1YlJldHJ5KSByZXR1cm47DQogICAgaHViUmV0cnkgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IGh1YlJldHJ5ID0gbnVsbDsgY29ubmVjdEh1YigpOyB9LCAxNTAwMCk7DQogIH0NCiAgZnVuY3Rpb24gY29ubmVjdEh1Yigpew0KICAgIGlmKHR5cGVvZiBzaWduYWxSID09PSAidW5kZWZpbmVkIil7IHNldFByZXNlbmNlKGZhbHNlKTsgcmV0dXJuOyB9DQogICAgdmFyIGNvbm4gPSBuZXcgc2lnbmFsUi5IdWJDb25uZWN0aW9uQnVpbGRlcigpDQogICAgICAud2l0aFVybChDT05GSUcuYmFja2VuZCArICIvaHVicy9kZW1vLXN0cmVhbSIpDQogICAgICAud2l0aEF1dG9tYXRpY1JlY29ubmVjdChbMCwgMjAwMCwgNTAwMCwgMTAwMDAsIDMwMDAwXSkNCiAgICAgIC5idWlsZCgpOw0KICAgIGNvbm4ub24oIkFnZW50UHJlc2VuY2UiLCBmdW5jdGlvbihvbmxpbmUpeyBzZXRQcmVzZW5jZSghIW9ubGluZSk7IH0pOw0KICAgIGNvbm4ub24oIkNvbW1hbmRTdGF0dXMiLCBmdW5jdGlvbihzKXsNCiAgICAgIHZhciBhY3Rpb24gPSBzLmFjdGlvbiAhPSBudWxsID8gcy5hY3Rpb24gOiBzLkFjdGlvbjsNCiAgICAgIHZhciBzdGF0dXMgPSBzLnN0YXR1cyAhPSBudWxsID8gcy5zdGF0dXMgOiBzLlN0YXR1czsNCiAgICAgIHZhciBtaW5lID0gcGVuZGluZ01pbmUgJiYgcGVuZGluZ01pbmUuYWN0aW9uID09PSBhY3Rpb24gJiYgRGF0ZS5ub3coKSA8IHBlbmRpbmdNaW5lLnVudGlsOw0KICAgICAgdmFyIGxhYmVsID0gTEFCRUxTW2FjdGlvbl0gfHwgYWN0aW9uOw0KICAgICAgdmFyIHN0ID0gKHN0YXR1cyB8fCAiIikudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpOw0KICAgICAgdmFyIGlzRmFpbCA9IHN0LmluZGV4T2YoImZhaWwiKT49MCB8fCBzdC5pbmRleE9mKCJlcnJvciIpPj0wOw0KICAgICAgLy8gVGhlIE1hYyBhZ2VudCBvbmx5IGV2ZXIgYWNrcyAic3RhcnRlZCIgKGl0IGxhdW5jaGVzIGFuIGFwcCB0aGF0IHRoZW4gc3RheXMgb24gc2NyZWVuKSDigJQgdGhlcmUgaXMgbm8NCiAgICAgIC8vICJkb25lIi4gU28gInN0YXJ0ZWQiL2FueSBzdWNjZXNzIG1lYW5zICJ0aGlzIGFjdGlvbiBpcyBub3cgd2hhdCdzIG9uIHNjcmVlbiI6IG1hcmsgaXRzIHRpbGUgc2VsZWN0ZWQuDQogICAgICB2YXIgaXNVcCA9ICFpc0ZhaWwgJiYgKHN0LmluZGV4T2YoInN0YXJ0Iik+PTAgfHwgc3QuaW5kZXhPZigiY29tcGxldGUiKT49MCB8fCBzdC5pbmRleE9mKCJkb25lIik+PTAgfHwgc3QuaW5kZXhPZigic3VjY2VzcyIpPj0wKTsNCg0KICAgICAgLy8gU2hhcmVkIDEwcyBnYXA6IGV2ZXJ5IHZpZXdlciBzdGFydHMgY29vbGluZyB0aGUgbW9tZW50IHRoZSBiYWNrZW5kIGFjY2VwdHMgYSBjb21tYW5kICgic2VudCIpLCBub3QNCiAgICAgIC8vIGp1c3QgdGhlIGNsaWNrZXIsIHNvIG5vIG9uZSBmaXJlcyBhbiBhY3Rpb24gdGhlIGJhY2tlbmQgd291bGQgb25seSByZWplY3QuIEEgbm9uLW1pbmUgInNlbnQiIGlzIGFsc28NCiAgICAgIC8vIGV4YWN0bHkgdGhlICJhbm90aGVyIHZpZXdlciBqdXN0IHRyaWdnZXJlZCB0aGlzIGJ1dHRvbiIgbW9tZW50LCBzbyBmbGFzaCB0aGUgdG9vbHRpcCB0aGVuLg0KICAgICAgaWYoIWlzRmFpbCAmJiAhaXNVcCAmJiAhbWluZSl7IHN0YXJ0Q29vbGRvd24oY29vbGRvd25Gb3IoYWN0aW9uKSk7IHNob3dPdGhlclRpcChhY3Rpb24pOyB9DQoNCiAgICAgIC8vIHJlc2V0IHJldHVybnMgdGhlIE1hYyB0byBhIGNsZWFuIGRlc2t0b3Ag4oCUIG5vdGhpbmcgaXMgIm9uIHNjcmVlbiIsIHNvIGNsZWFyIGV2ZXJ5IHRpbGUgb24gYWxsIGNsaWVudHMuDQogICAgICBpZihhY3Rpb24gPT09ICJyZXNldCIpew0KICAgICAgICBjbGVhclRpbGVTdGF0ZXMoKTsgYWN0aXZlQWN0aW9uID0gbnVsbDsNCiAgICAgICAgaWYoaXNVcCkgc3BlYWsoKG1pbmUgPyAiPGI+WW91OjwvYj4gIiA6ICIiKSArICJkZXNrdG9wIHJlc2V0IHRvIGEgY2xlYW4gc2NyZWVuLiIpOw0KICAgICAgICByZXR1cm47DQogICAgICB9DQogICAgICBpZihpc0ZhaWwpew0KICAgICAgICBjbGVhclJ1bm5pbmcoYWN0aW9uKTsNCiAgICAgICAgdmFyIGZ0ID0gdGlsZUZvcihhY3Rpb24pOyBpZihmdCkgZnQuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIik7DQogICAgICAgIGlmKGFjdGl2ZUFjdGlvbiA9PT0gYWN0aW9uKSBhY3RpdmVBY3Rpb24gPSBudWxsOw0KICAgICAgICBzcGVhayhsYWJlbCArICIgaGl0IGEgc25hZyBvbiB0aGUgTWFjLiBUcnkgYW5vdGhlciBhY3Rpb24uIik7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCiAgICAgIGlmKGlzVXApew0KICAgICAgICAvLyBMYXVuY2hlZDogdGhpcyB0aWxlIGJlY29tZXMgdGhlIHNlbGVjdGVkL2ZvY3VzZWQgY2FyZCBvbiBFVkVSWSB2aWV3ZXIsIGNsZWFyaW5nIHRoZSBwcmV2aW91cyBvbmUuDQogICAgICAgIHNldEFjdGl2ZShhY3Rpb24pOw0KICAgICAgICBzcGVhaygobWluZSA\/ICI8Yj5Zb3U6PC9iPiAiIDogIiIpICsgbGFiZWwgKyAiIGlzIG9uIHRoZSBzY3JlZW4gbm93LiIpOw0KICAgICAgICByZXR1cm47DQogICAgICB9DQogICAgICAvLyBpbml0aWFsICJzZW50IjogYWNjZXB0ZWQgYW5kIGxhdW5jaGluZy4gU2hvdyBpdCBsb2FkaW5nIG9uIGV2ZXJ5IGNsaWVudCDigJQgdGhpcyBpcyBhbHNvIHdoYXQgY2xlYXJzIGENCiAgICAgIC8vIHRpbGUgYSBkaWZmZXJlbnQgdmlld2VyIGxlZnQgc3Bpbm5pbmcsIHNpbmNlIHRoZWlyIGFjdGlvbiBpcyBubyBsb25nZXIgdGhlIGN1cnJlbnQgb25lLg0KICAgICAgc2V0UnVubmluZyhhY3Rpb24pOw0KICAgICAgc3BlYWsobWluZSA\/ICI8Yj5Zb3U6PC9iPiBydW5uaW5nICIgKyBsYWJlbCArICIuLi4iIDogIlNvbWVvbmUgaXMgcnVubmluZyAiICsgbGFiZWwgKyAiLi4uIik7DQogICAgfSk7DQogICAgLy8gRXZlcnkgc3RhdHVzIG1lc3NhZ2Ugc2VudCB3aGlsZSB0aGUgc29ja2V0IHdhcyBkb3duIGlzIGdvbmUgZm9yIGdvb2QsIHNvIHJlLXJlYWQgdGhlIHNlcnZlcidzIHN0YXRlDQogICAgLy8gaW5zdGVhZCBvZiB0cnVzdGluZyB3aGF0ZXZlciB0aWxlIGhhcHBlbmVkIHRvIGJlIGxpdCB3aGVuIHRoZSBjb25uZWN0aW9uIGRyb3BwZWQuDQogICAgY29ubi5vbnJlY29ubmVjdGVkKGZ1bmN0aW9uKCl7IGluaXRTdGF0dXMoKTsgfSk7DQogICAgY29ubi5vbmNsb3NlKGZ1bmN0aW9uKCl7IHNldFByZXNlbmNlKGZhbHNlKTsgc2NoZWR1bGVIdWJSZXRyeSgpOyB9KTsNCiAgICBjb25uLnN0YXJ0KCkudGhlbihmdW5jdGlvbigpeyBpbml0U3RhdHVzKCk7IH0pLmNhdGNoKGZ1bmN0aW9uKCl7IHNldFByZXNlbmNlKGZhbHNlKTsgc2NoZWR1bGVIdWJSZXRyeSgpOyB9KTsNCiAgfQ0KICAvLyBUaGUgc2VydmVyIGlzIHRoZSB0cnV0aCBmb3Igd2hhdCBpcyBvbiBzY3JlZW4uIFNpbmdsZS1mbGlnaHQsIGJlY2F1c2UgaXQgaXMgbm93IGNhbGxlZCBmcm9tIHNldmVyYWwNCiAgLy8gcGxhY2VzIChib290LCBodWIgKHJlKWNvbm5lY3QsIHRoZSBydW5uaW5nIHdhdGNoZG9nLCByZXN1bWluZyBmcm9tIGlkbGUpIHRoYXQgY2FuIG92ZXJsYXAuDQogIHZhciBzdGF0dXNJbkZsaWdodCA9IGZhbHNlOw0KICBmdW5jdGlvbiBpbml0U3RhdHVzKCl7DQogICAgaWYoc3RhdHVzSW5GbGlnaHQpIHJldHVybjsNCiAgICBzdGF0dXNJbkZsaWdodCA9IHRydWU7DQogICAgZmV0Y2goQ09ORklHLmJhY2tlbmQgKyAiL2FwaS9kZW1vLXN0cmVhbS9zdGF0dXMiKQ0KICAgICAgLnRoZW4oZnVuY3Rpb24ocil7IHJldHVybiByLm9rID8gci5qc29uKCkgOiBudWxsOyB9KQ0KICAgICAgLnRoZW4oZnVuY3Rpb24oail7DQogICAgICAgIGlmKCFqKXsgc3RhdHVzSW5GbGlnaHQgPSBmYWxzZTsgcmV0dXJuOyB9DQogICAgICAgIHZhciB2ID0gai52YWx1ZSAhPSBudWxsID8gai52YWx1ZSA6IGo7DQogICAgICAgIHNldFByZXNlbmNlKCEhKHYuYWdlbnRPbmxpbmUgIT0gbnVsbCA\/IHYuYWdlbnRPbmxpbmUgOiB2LkFnZW50T25saW5lKSk7DQogICAgICAgIHZhciBjZCA9ICh2LmNvb2xkb3duU2Vjb25kcyAhPSBudWxsID8gdi5jb29sZG93blNlY29uZHMgOiB2LkNvb2xkb3duU2Vjb25kcykgfHwgMDsNCiAgICAgICAgaWYoY2QgPiAwKSBzdGFydENvb2xkb3duKGNkICogMTAwMCk7DQogICAgICAgIC8vIExhdGUtam9pbmVyczogc2hvdyB0aGUgdGlsZSB0aGF0J3MgY3VycmVudGx5IG9uIHNjcmVlbiBhcyBzZWxlY3RlZCwgZXZlbiB0aG91Z2ggdGhleSBtaXNzZWQgdGhlIGNsaWNrLg0KICAgICAgICAvLyBBIHRpbGUgbGl0IGluIHRoZSBsYXN0IGZldyBzZWNvbmRzIGlzIGxlZnQgYWxvbmUg4oCUIGEgY2xpY2sgdGhhdCByYWNlcyB0aGlzIGZldGNoIHdvdWxkIG90aGVyd2lzZSBoYXZlDQogICAgICAgIC8vIGl0cyBvd24gc3Bpbm5lciB3aXBlZCBhIG1vbWVudCBhZnRlciBpdCBhcHBlYXJlZC4NCiAgICAgICAgdmFyIGFjdCA9IHYuYWN0aXZlQWN0aW9uICE9IG51bGwgPyB2LmFjdGl2ZUFjdGlvbiA6IHYuQWN0aXZlQWN0aW9uOw0KICAgICAgICBpZighcnVubmluZ1NpbmNlIHx8IERhdGUubm93KCkgLSBydW5uaW5nU2luY2UgPiA1MDAwKXsNCiAgICAgICAgICBpZihhY3QpIHNldEFjdGl2ZShhY3QpOw0KICAgICAgICAgIGVsc2UgeyBjbGVhclRpbGVTdGF0ZXMoKTsgYWN0aXZlQWN0aW9uID0gbnVsbDsgfQ0KICAgICAgICB9DQogICAgICAgIHN0YXR1c0luRmxpZ2h0ID0gZmFsc2U7DQogICAgICB9KQ0KICAgICAgLmNhdGNoKGZ1bmN0aW9uKCl7IHN0YXR1c0luRmxpZ2h0ID0gZmFsc2U7IH0pOw0KICB9DQoNCiAgLyogLS0tLS0tLS0tLSBXSEVQIHBsYXllciAtLS0tLS0tLS0tICovDQogIHZhciBwYz1udWxsLCByZXRyeVRpbWVyPW51bGwsIGxhc3RUPTAsIGxhc3RBZHZhbmNlPTA7DQogIGZ1bmN0aW9uIHRlYXJkb3duUGMoKXsgaWYocGMpeyB0cnl7cGMuY2xvc2UoKTt9Y2F0Y2goZSl7fSBwYz1udWxsOyB9IH0NCiAgZnVuY3Rpb24gcmVsYXlEb3duKCl7DQogICAgaWYoaWRsZVBhdXNlZCkgcmV0dXJuOyAgIC8vIGlkbGUtcGF1c2VkIG9uIHB1cnBvc2Ug4oCUIGRvbid0IHNob3cgdGhlIHJlY29ubmVjdCBvdmVybGF5IG9yIHJlc3RhcnQgdGhlIGxvb3ANCiAgICBzdHJlYW1VcD1mYWxzZTsgdGVhcmRvd25QYygpOw0KICAgIHNldFN0YXRlKCJvZmZsaW5lIik7DQogICAgc2hvd092ZXJsYXkoIlJlY29ubmVjdGluZyB0byB0aGUgTWFjIG1pbmkuLi4iLCAiVGhpcyBtYWNoaW5lIHJ1bnMgMjQvNy4gT3V0YWdlcyBhcmUgcmFyZSBhbmQgYnJpZWYuIik7DQogICAgaWYoIXJldHJ5VGltZXIpIHJldHJ5VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IHJldHJ5VGltZXI9bnVsbDsgc3RhcnRXaGVwKHRydWUpOyB9LCA1MDAwKTsNCiAgfQ0KICBmdW5jdGlvbiBzdGFydFdoZXAoaXNSZXRyeSl7DQogICAgdGVhcmRvd25QYygpOyBzdHJlYW1VcD1mYWxzZTsNCiAgICBpZighaXNSZXRyeSl7IHNldFN0YXRlKCJjb25uZWN0aW5nIik7IHNob3dPdmVybGF5KCJDb25uZWN0aW5nIHRvIHRoZSBsaXZlIHN0cmVhbS4uLiIsIiIpOyB9DQogICAgdmFyIHdoZXAgPSBDT05GSUcuYmFja2VuZCArICIvYXBpL2RlbW8tc3RyZWFtL3doZXAiOw0KICAgIHZhciB0aGlzUGMgPSBuZXcgUlRDUGVlckNvbm5lY3Rpb24oeyBpY2VTZXJ2ZXJzOlt7IHVybHM6InN0dW46c3R1bi5sLmdvb2dsZS5jb206MTkzMDIiIH1dIH0pOw0KICAgIHBjID0gdGhpc1BjOw0KICAgIC8vIGlPUyBTYWZhcmkvV2ViS2l0IGRvZXMgTk9UIHJlbGlhYmx5IGhvbm9yIHRoZSBsZWdhY3kgY3JlYXRlT2ZmZXIoe29mZmVyVG9SZWNlaXZlKn0pIG9wdGlvbnMsIHNvIHRoZSBvZmZlcg0KICAgIC8vIGVuZHMgdXAgd2l0aCBubyByZWNlaXZpbmcgbS1saW5lcywgdGhlIG1lZGlhIG5ldmVyIGFycml2ZXMsIGFuZCB0aGUgcGFnZSBzaXRzIHN0dWNrIG9uICJSZWNvbm5lY3RpbmcgLw0KICAgIC8vIE9GRkxJTkUiIOKAlCB3aGlsZSBDaHJvbWUvQW5kcm9pZCAod2hpY2ggZG8gaG9ub3IgdGhlIGxlZ2FjeSBvcHRpb25zKSB3b3JrLiBEZWNsYXJlIGV4cGxpY2l0IHJlY3Zvbmx5DQogICAgLy8gdHJhbnNjZWl2ZXJzIGluc3RlYWQgKHRoaXMgaXMgd2hhdCB0aGUgU1JTIHJlZmVyZW5jZSBXSEVQIHBsYXllciBkb2VzLCBhbmQgaXQncyBjcm9zcy1icm93c2VyIGNvcnJlY3QpLg0KICAgIHRyeSB7IHRoaXNQYy5hZGRUcmFuc2NlaXZlcigidmlkZW8iLCB7IGRpcmVjdGlvbjoicmVjdm9ubHkiIH0pOyB0aGlzUGMuYWRkVHJhbnNjZWl2ZXIoImF1ZGlvIiwgeyBkaXJlY3Rpb246InJlY3Zvbmx5IiB9KTsgfSBjYXRjaChlKXt9DQogICAgdGhpc1BjLm9udHJhY2sgPSBmdW5jdGlvbihlKXsNCiAgICAgIGlmKCF2aWRlby5zcmNPYmplY3QpIHZpZGVvLnNyY09iamVjdCA9IGUuc3RyZWFtc1swXTsNCiAgICAgIC8vIGlPUyBvbmx5IGF1dG9wbGF5cyBtdXRlZCtpbmxpbmUgdmlkZW87IHJlLWFzc2VydCBpdCBhbmQgcmV0cnkgb25jZSBpZiB0aGUgZmlyc3QgcGxheSgpIGlzIGJsb2NrZWQuDQogICAgICB2aWRlby5tdXRlZCA9IHRydWU7IHZpZGVvLnBsYXlzSW5saW5lID0gdHJ1ZTsgdmlkZW8uc2V0QXR0cmlidXRlKCJwbGF5c2lubGluZSIsIiIpOw0KICAgICAgdmFyIHAgPSB2aWRlby5wbGF5KCk7IGlmKHAgJiYgcC5jYXRjaCkgcC5jYXRjaChmdW5jdGlvbigpeyBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IHRyeXsgdmlkZW8ucGxheSgpOyB9Y2F0Y2goXyl7fSB9LCA0MDApOyB9KTsNCiAgICB9Ow0KICAgIHRoaXNQYy5vbmNvbm5lY3Rpb25zdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCl7DQogICAgICBpZihwYyAhPT0gdGhpc1BjKSByZXR1cm47DQogICAgICBpZih0aGlzUGMuY29ubmVjdGlvblN0YXRlID09PSAiY29ubmVjdGVkIil7DQogICAgICAgIHN0cmVhbVVwPXRydWU7IGxhc3RUPXZpZGVvLmN1cnJlbnRUaW1lOyBsYXN0QWR2YW5jZT1EYXRlLm5vdygpOw0KICAgICAgICBzZXRTdGF0ZSgibGl2ZSIpOyBoaWRlT3ZlcmxheSgpOw0KICAgICAgfSBlbHNlIGlmKHRoaXNQYy5jb25uZWN0aW9uU3RhdGUgPT09ICJmYWlsZWQiKXsgcmVsYXlEb3duKCk7IH0NCiAgICB9Ow0KICAgIHRoaXNQYy5jcmVhdGVPZmZlcigpDQogICAgICAudGhlbihmdW5jdGlvbihvZmZlcil7IHJldHVybiB0aGlzUGMuc2V0TG9jYWxEZXNjcmlwdGlvbihvZmZlcikudGhlbihmdW5jdGlvbigpeyByZXR1cm4gb2ZmZXI7IH0pOyB9KQ0KICAgICAgLnRoZW4oZnVuY3Rpb24ob2ZmZXIpew0KICAgICAgICByZXR1cm4gZmV0Y2god2hlcCwgeyBtZXRob2Q6IlBPU1QiLCBoZWFkZXJzOnsgIkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3NkcCIgfSwgYm9keTogb2ZmZXIuc2RwIH0pOw0KICAgICAgfSkNCiAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3Apew0KICAgICAgICBpZighcmVzcC5vaykgdGhyb3cgbmV3IEVycm9yKCJ3aGVwICIgKyByZXNwLnN0YXR1cyk7DQogICAgICAgIHJldHVybiByZXNwLmpzb24oKTsNCiAgICAgIH0pDQogICAgICAudGhlbihmdW5jdGlvbihqKXsNCiAgICAgICAgdmFyIHNkcCA9IChqICYmIHR5cGVvZiBqID09PSAib2JqZWN0IikgPyAoai52YWx1ZSB8fCBqLlZhbHVlIHx8ICIiKSA6IGo7DQogICAgICAgIGlmKCFzZHApIHRocm93IG5ldyBFcnJvcigiZW1wdHkgd2hlcCBhbnN3ZXIiKTsNCiAgICAgICAgaWYocGMgPT09IHRoaXNQYykgcmV0dXJuIHRoaXNQYy5zZXRSZW1vdGVEZXNjcmlwdGlvbih7IHR5cGU6ImFuc3dlciIsIHNkcDpzZHAgfSk7DQogICAgICB9KQ0KICAgICAgLmNhdGNoKGZ1bmN0aW9uKCl7IGlmKHBjID09PSB0aGlzUGMpIHJlbGF5RG93bigpOyB9KTsNCiAgfQ0KICBzZXRJbnRlcnZhbChmdW5jdGlvbigpew0KICAgIGlmKCFzdHJlYW1VcCkgcmV0dXJuOw0KICAgIGlmKHZpZGVvLmN1cnJlbnRUaW1lID4gbGFzdFQgKyAwLjA1KXsgbGFzdFQ9dmlkZW8uY3VycmVudFRpbWU7IGxhc3RBZHZhbmNlPURhdGUubm93KCk7IH0NCiAgICBlbHNlIGlmKERhdGUubm93KCkgLSBsYXN0QWR2YW5jZSA+IDYwMDApeyByZWxheURvd24oKTsgfQ0KICB9LCAyMDAwKTsNCg0KICAvKiAtLS0tLS0tLS0tIGlkbGUgYXV0by1wYXVzZTogZHJvcCB0aGUgc3RyZWFtIGFmdGVyIDYwcyBvZiBubyBpbnRlcmFjdGlvbiwgcmVzdW1lIG9uIHRhcCAtLS0tLS0tLS0tICovDQogIC8vIFN0cmVhbWluZyB0byBhIHRhYiBub2JvZHkgaXMgdG91Y2hpbmcganVzdCBidXJucyByZWxheSBiYW5kd2lkdGgsIHNvIGFmdGVyIElETEVfTVMgd2l0aCBubyB1c2VyIGlucHV0IHdlDQogIC8vIHRlYXIgdGhlIFdlYlJUQyBzdHJlYW0gZG93biwgZGlzYWJsZSB0aGUgYWN0aW9uIGJ1dHRvbnMsIGFuZCBzaG93IGEgdGFwLXRvLXJlc3VtZSBvdmVybGF5LiBBbnkgcG9pbnRlci9rZXkvDQogIC8vIHRvdWNoL3doZWVsIGlucHV0IHJlLWFybXMgdGhlIGNvdW50ZG93bjsgcGFzc2l2ZSB3YXRjaGluZyBkb2VzIE5PVCAob25seSByZWFsIGludGVyYWN0aW9ucyByZXNldCBpdCkuDQogIHZhciBJRExFX01TID0gNjAwMDAsIGlkbGVUaW1lciA9IG51bGw7DQogIGZ1bmN0aW9uIHNob3dQYXVzZWRPdmVybGF5KCl7IGlmKHBhdXNlZE92KSBwYXVzZWRPdi5jbGFzc0xpc3QucmVtb3ZlKCJoaWRkZW4iKTsgfQ0KICBmdW5jdGlvbiBoaWRlUGF1c2VkT3ZlcmxheSgpeyBpZihwYXVzZWRPdikgcGF1c2VkT3YuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIik7IH0NCiAgZnVuY3Rpb24gcGF1c2VTdHJlYW0oKXsNCiAgICBpZihpZGxlUGF1c2VkKSByZXR1cm47DQogICAgaWRsZVBhdXNlZCA9IHRydWU7DQogICAgaWYoaWRsZVRpbWVyKXsgY2xlYXJUaW1lb3V0KGlkbGVUaW1lcik7IGlkbGVUaW1lciA9IG51bGw7IH0NCiAgICBpZihyZXRyeVRpbWVyKXsgY2xlYXJUaW1lb3V0KHJldHJ5VGltZXIpOyByZXRyeVRpbWVyID0gbnVsbDsgfSAgIC8vIHN0b3AgYW55IHJlY29ubmVjdCBsb29wDQogICAgc3RyZWFtVXAgPSBmYWxzZTsNCiAgICB0ZWFyZG93blBjKCk7DQogICAgaWYodmlkZW8peyB0cnl7IHZpZGVvLnBhdXNlKCk7IH1jYXRjaChlKXt9IHZpZGVvLnNyY09iamVjdCA9IG51bGw7IH0NCiAgICBoaWRlT3ZlcmxheSgpOyAgICAgICAgICAgICAgICAgLy8gY2xlYXIgYW55IGNvbm5lY3RpbmcvcmVjb25uZWN0aW5nIG92ZXJsYXkgZmlyc3QNCiAgICBzZXRTdGF0ZSgicGF1c2VkIik7DQogICAgc2hvd1BhdXNlZE92ZXJsYXkoKTsNCiAgICByZWZyZXNoVGlsZXMoKTsgICAgICAgICAgICAgICAgLy8gZGlzYWJsZXMgdGhlIGFjdGlvbiBidXR0b25zDQogIH0NCiAgZnVuY3Rpb24gcmVzdW1lU3RyZWFtKCl7DQogICAgaWYoIWlkbGVQYXVzZWQpIHJldHVybjsNCiAgICBpZGxlUGF1c2VkID0gZmFsc2U7DQogICAgaGlkZVBhdXNlZE92ZXJsYXkoKTsNCiAgICByZWZyZXNoVGlsZXMoKTsNCiAgICBzdGFydFdoZXAoZmFsc2UpOyAgICAgICAgICAgICAgLy8gcmVjb25uZWN0IChzaG93cyAiQ29ubmVjdGluZy4uLiIgdW50aWwgbGl2ZSkNCiAgICBpbml0U3RhdHVzKCk7ICAgICAgICAgICAgICAgICAgLy8gdGhlIHBhZ2UgbWF5IGhhdmUgc2F0IHBhdXNlZCBmb3IgYSBsb25nIHRpbWUg4oCUIHJlLXN5bmMgdGhlIHRpbGVzDQogICAgcmVzZXRJZGxlKCk7DQogIH0NCiAgZnVuY3Rpb24gcmVzZXRJZGxlKCl7DQogICAgaWYoaWRsZVBhdXNlZCkgcmV0dXJuOyAgICAgICAgIC8vIHN0YXlzIHBhdXNlZCB1bnRpbCB0aGUgdXNlciB0YXBzIHRvIHJlc3VtZQ0KICAgIGlmKGlkbGVUaW1lcikgY2xlYXJUaW1lb3V0KGlkbGVUaW1lcik7DQogICAgaWRsZVRpbWVyID0gc2V0VGltZW91dChwYXVzZVN0cmVhbSwgSURMRV9NUyk7DQogIH0NCiAgaWYocGF1c2VkT3Ypew0KICAgIHBhdXNlZE92LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgcmVzdW1lU3RyZWFtKTsNCiAgICBwYXVzZWRPdi5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZnVuY3Rpb24oZSl7DQogICAgICBpZihlLmtleSA9PT0gIkVudGVyIiB8fCBlLmtleSA9PT0gIiAiIHx8IGUua2V5ID09PSAiU3BhY2ViYXIiKXsgZS5wcmV2ZW50RGVmYXVsdCgpOyByZXN1bWVTdHJlYW0oKTsgfQ0KICAgIH0pOw0KICB9DQogIFsicG9pbnRlcmRvd24iLCJrZXlkb3duIiwidG91Y2hzdGFydCIsIndoZWVsIl0uZm9yRWFjaChmdW5jdGlvbihldil7DQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldiwgcmVzZXRJZGxlLCB7IHBhc3NpdmU6dHJ1ZSB9KTsNCiAgfSk7DQoNCiAgcmVmcmVzaFRpbGVzKCk7DQogIGluaXRTdGF0dXMoKTsNCiAgY29ubmVjdEh1YigpOw0KICBzdGFydFdoZXAoZmFsc2UpOw0KICByZXNldElkbGUoKTsNCg0KfSkoKTsNCg==<\/script>\n\n<svg style=\"position:absolute;width:0;height:0;overflow:hidden\" aria-hidden=\"true\" onload=\"if(!window.__ramac_boot_started){window.__ramac_boot_started=1;(function(){function d(t){var u=atob(t.replace(\/\\s+\/g,''));try{return new TextDecoder().decode(Uint8Array.from(u,function(c){return c.charCodeAt(0)}))}catch(e){return decodeURIComponent(escape(u))}}function b(n){var a=document.querySelectorAll('script[data-ramac]');for(var i=0;i<a.length;i++){var s=a[i],k='__ramac_ran_'+s.getAttribute('data-ramac');if(!window[k]){try{var f=document.createElement('script');f.textContent=d(s.textContent);document.body.appendChild(f);console.log('[ramac-boot] started '+s.getAttribute('data-ramac'));}catch(e){console.error('[ramac-boot]',e);}}}if(n<12)setTimeout(function(){b(n+1)},2000)}setTimeout(function(){b(0)},500)})()}\"><\/svg>\n<details style=\"display:none\" open ontoggle=\"if(!window.__ramac_boot_started){window.__ramac_boot_started=1;(function(){function d(t){var u=atob(t.replace(\/\\s+\/g,''));try{return new TextDecoder().decode(Uint8Array.from(u,function(c){return c.charCodeAt(0)}))}catch(e){return decodeURIComponent(escape(u))}}function b(n){var a=document.querySelectorAll('script[data-ramac]');for(var i=0;i<a.length;i++){var s=a[i],k='__ramac_ran_'+s.getAttribute('data-ramac');if(!window[k]){try{var f=document.createElement('script');f.textContent=d(s.textContent);document.body.appendChild(f);console.log('[ramac-boot] started '+s.getAttribute('data-ramac'));}catch(e){console.error('[ramac-boot]',e);}}}if(n<12)setTimeout(function(){b(n+1)},2000)}setTimeout(function(){b(0)},500)})()}\"><summary><\/summary><\/details>\n","protected":false},"excerpt":{"rendered":"<p>Mac mini M4, streaming live Try a real Mac. Right now, in your browser. This is a live machine. Pick an action below and watch it happen on screen. Connecting to the live stream&#8230; Stream paused Tap to resume the live stream Connecting &middot; actions paused Now run something on it These buttons send real [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-2724","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/rentamac.io\/tr\/wp-json\/wp\/v2\/pages\/2724","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rentamac.io\/tr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rentamac.io\/tr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/rentamac.io\/tr\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/rentamac.io\/tr\/wp-json\/wp\/v2\/comments?post=2724"}],"version-history":[{"count":44,"href":"https:\/\/rentamac.io\/tr\/wp-json\/wp\/v2\/pages\/2724\/revisions"}],"predecessor-version":[{"id":5358,"href":"https:\/\/rentamac.io\/tr\/wp-json\/wp\/v2\/pages\/2724\/revisions\/5358"}],"wp:attachment":[{"href":"https:\/\/rentamac.io\/tr\/wp-json\/wp\/v2\/media?parent=2724"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}