Server : Apache/2.4.43 (Win64) OpenSSL/1.1.1g PHP/7.4.6 System : Windows NT USER-PC 6.1 build 7601 (Windows 7 Professional Edition Service Pack 1) AMD64 User : User ( 0) PHP Version : 7.4.6 Disable Function : NONE Directory : C:/Program Files/Avast Software/Avast/gui_resources/default_av/ |
//{"name":"Kin","version":"1.2.316","created":"2021-03-04T10:18:15.008Z"} var __nitro_module_import__ = (function (exports) { 'use strict'; function noop() {} function assign(tar, src) { for (var k in src) tar[k] = src[k]; return tar; } function assignTrue(tar, src) { for (var k in src) tar[k] = 1; return tar; } function append(target, node) { target.appendChild(node); } function insert(target, node, anchor) { target.insertBefore(node, anchor); } function detachNode(node) { node.parentNode.removeChild(node); } function destroyEach(iterations, detach) { for (var i = 0; i < iterations.length; i += 1) { if (iterations[i]) iterations[i].d(detach); } } function createElement(name) { return document.createElement(name); } function createSvgElement(name) { return document.createElementNS('http://www.w3.org/2000/svg', name); } function createText(data) { return document.createTextNode(data); } function createComment() { return document.createComment(''); } function addListener(node, event, handler, options) { node.addEventListener(event, handler, options); } function removeListener(node, event, handler, options) { node.removeEventListener(event, handler, options); } function setAttribute(node, attribute, value) { if (value == null) node.removeAttribute(attribute); else node.setAttribute(attribute, value); } function setCustomElementData(node, prop, value) { if (prop in node) { node[prop] = value; } else { setAttribute(node, prop, value); } } function setXlinkAttribute(node, attribute, value) { node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value); } function setData(text, data) { text.data = '' + data; } function setStyle(node, key, value) { node.style.setProperty(key, value); } function toggleClass(element, name, toggle) { element.classList[toggle ? 'add' : 'remove'](name); } function blankObject() { return Object.create(null); } function destroy(detach) { this.destroy = noop; this.fire('destroy'); this.set = noop; this._fragment.d(detach !== false); this._fragment = null; this._state = {}; } function _differs(a, b) { return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function'); } function fire(eventName, data) { var handlers = eventName in this._handlers && this._handlers[eventName].slice(); if (!handlers) return; for (var i = 0; i < handlers.length; i += 1) { var handler = handlers[i]; if (!handler.__calling) { try { handler.__calling = true; handler.call(this, data); } finally { handler.__calling = false; } } } } function flush(component) { component._lock = true; callAll(component._beforecreate); callAll(component._oncreate); callAll(component._aftercreate); component._lock = false; } function get() { return this._state; } function init(component, options) { component._handlers = blankObject(); component._slots = blankObject(); component._bind = options._bind; component._staged = {}; component.options = options; component.root = options.root || component; component.store = options.store || component.root.store; if (!options.root) { component._beforecreate = []; component._oncreate = []; component._aftercreate = []; } } function on(eventName, handler) { var handlers = this._handlers[eventName] || (this._handlers[eventName] = []); handlers.push(handler); return { cancel: function() { var index = handlers.indexOf(handler); if (~index) handlers.splice(index, 1); } }; } function set(newState) { this._set(assign({}, newState)); if (this.root._lock) return; flush(this.root); } function _set(newState) { var oldState = this._state, changed = {}, dirty = false; newState = assign(this._staged, newState); this._staged = {}; for (var key in newState) { if (this._differs(newState[key], oldState[key])) changed[key] = dirty = true; } if (!dirty) return; this._state = assign(assign({}, oldState), newState); this._recompute(changed, this._state); if (this._bind) this._bind(changed, this._state); if (this._fragment) { this.fire("state", { changed: changed, current: this._state, previous: oldState }); this._fragment.p(changed, this._state); this.fire("update", { changed: changed, current: this._state, previous: oldState }); } } function _stage(newState) { assign(this._staged, newState); } function callAll(fns) { while (fns && fns.length) fns.shift()(); } function _mount(target, anchor) { this._fragment[this._fragment.i ? 'i' : 'm'](target, anchor || null); } var proto = { destroy, get, fire, on, set, _recompute: noop, _set, _stage, _mount, _differs }; /* components/page/app/Page.svelte generated by Svelte v2.16.1 */ function data() { return { dir: 'ltr', heading: '', csscls: '', settingsurl: '', settingslabel: 'Settings', upsell: false, inactive: false, inactivemsg: '', layout: '', back: true, backevent: false, backhash: '', backlabel: 'Back', loading: false, loadinglabel: null, elemetsState: null, contentHeight: 0, datatest: '', } } var methods = { goBack: (e) => { // emit event }, backClickEvent() { const backClickEvent = new CustomEvent('backClick', { detail: 'backClick', bubbles: true, cancelable: true, composed: true // makes the event jump shadow DOM boundary }); this.dispatchEvent(backClickEvent); }, getOffsetHeight() { return this.refs.content ? this.refs.content.offsetHeight : 0 } }; function oncreate() { this.set({ dir: document.body.dir }); } function create_main_fragment(component, ctx) { var div, div_class_value; function select_block_type(ctx) { if (ctx.loading === 'true' || ctx.loading === true) return create_if_block; return create_else_block_1; } var current_block_type = select_block_type(ctx); var if_block = current_block_type(component, ctx); return { c() { div = createElement("div"); if_block.c(); this.c = noop; div.className = div_class_value = "kin_page " + (ctx.dir != 'ltr' ? '-' + ctx.dir : '') + " " + (ctx.layout ? '-'+ctx.layout : '') + " " + ctx.csscls; div.dataset.test = ctx.datatest; }, m(target, anchor) { insert(target, div, anchor); if_block.m(div, null); component.refs.page = div; }, p(changed, ctx) { if (current_block_type === (current_block_type = select_block_type(ctx)) && if_block) { if_block.p(changed, ctx); } else { if_block.d(1); if_block = current_block_type(component, ctx); if_block.c(); if_block.m(div, null); } if ((changed.dir || changed.layout || changed.csscls) && div_class_value !== (div_class_value = "kin_page " + (ctx.dir != 'ltr' ? '-' + ctx.dir : '') + " " + (ctx.layout ? '-'+ctx.layout : '') + " " + ctx.csscls)) { div.className = div_class_value; } if (changed.datatest) { div.dataset.test = ctx.datatest; } }, d(detach) { if (detach) { detachNode(div); } if_block.d(); if (component.refs.page === div) component.refs.page = null; } }; } // (15:1) {:else} function create_else_block_1(component, ctx) { var header, div0, text0, div1, text1, text2, text3, text4, if_block4_anchor; function select_block_type_2(ctx) { if (ctx.heading != '') return create_if_block_8; return create_else_block_3; } var current_block_type = select_block_type_2(ctx); var if_block0 = current_block_type(component, ctx); var if_block1 = (!(ctx.upsell === 'true' || ctx.upsell === true)) && create_if_block_6(component, ctx); function select_block_type_3(ctx) { if (ctx.back != 'false' && ctx.backevent != 'true') return create_if_block_4; if (ctx.backevent == 'true') return create_if_block_5; } var current_block_type_1 = select_block_type_3(ctx); var if_block2 = current_block_type_1 && current_block_type_1(component, ctx); var if_block3 = (ctx.settingsurl && !(ctx.upsell === 'true' || ctx.upsell === true)) && create_if_block_3(component, ctx); function select_block_type_4(ctx) { if (ctx.upsell === 'true' || ctx.upsell === true) return create_if_block_2; return create_else_block_2; } var current_block_type_2 = select_block_type_4(ctx); var if_block4 = current_block_type_2(component, ctx); return { c() { header = createElement("header"); div0 = createElement("div"); div0.innerHTML = `<slot name="breadcrumbs"></slot>`; text0 = createText("\n\n\t\t\t"); div1 = createElement("div"); if_block0.c(); text1 = createText("\n\n\t\t\t\t\n\t\t\t\t"); if (if_block1) if_block1.c(); text2 = createText("\n\n\t\t\t\n\t\t\t"); if (if_block2) if_block2.c(); text3 = createText("\n\n\t\t\t\n\t\t\t"); if (if_block3) if_block3.c(); text4 = createText("\n\n\t\t"); if_block4.c(); if_block4_anchor = createComment(); div0.className = "kin_header__crumbs crumbs"; div1.className = "kin_header__content"; header.className = "kin_header"; }, m(target, anchor) { insert(target, header, anchor); append(header, div0); append(header, text0); append(header, div1); if_block0.m(div1, null); append(div1, text1); if (if_block1) if_block1.m(div1, null); append(header, text2); if (if_block2) if_block2.m(header, null); append(header, text3); if (if_block3) if_block3.m(header, null); insert(target, text4, anchor); if_block4.m(target, anchor); insert(target, if_block4_anchor, anchor); }, p(changed, ctx) { if (current_block_type === (current_block_type = select_block_type_2(ctx)) && if_block0) { if_block0.p(changed, ctx); } else { if_block0.d(1); if_block0 = current_block_type(component, ctx); if_block0.c(); if_block0.m(div1, text1); } if (!(ctx.upsell === 'true' || ctx.upsell === true)) { if (if_block1) { if_block1.p(changed, ctx); } else { if_block1 = create_if_block_6(component, ctx); if_block1.c(); if_block1.m(div1, null); } } else if (if_block1) { if_block1.d(1); if_block1 = null; } if (current_block_type_1 === (current_block_type_1 = select_block_type_3(ctx)) && if_block2) { if_block2.p(changed, ctx); } else { if (if_block2) if_block2.d(1); if_block2 = current_block_type_1 && current_block_type_1(component, ctx); if (if_block2) if_block2.c(); if (if_block2) if_block2.m(header, text3); } if (ctx.settingsurl && !(ctx.upsell === 'true' || ctx.upsell === true)) { if (if_block3) { if_block3.p(changed, ctx); } else { if_block3 = create_if_block_3(component, ctx); if_block3.c(); if_block3.m(header, null); } } else if (if_block3) { if_block3.d(1); if_block3 = null; } if (current_block_type_2 === (current_block_type_2 = select_block_type_4(ctx)) && if_block4) { if_block4.p(changed, ctx); } else { if_block4.d(1); if_block4 = current_block_type_2(component, ctx); if_block4.c(); if_block4.m(if_block4_anchor.parentNode, if_block4_anchor); } }, d(detach) { if (detach) { detachNode(header); } if_block0.d(); if (if_block1) if_block1.d(); if (if_block2) if_block2.d(); if (if_block3) if_block3.d(); if (detach) { detachNode(text4); } if_block4.d(detach); if (detach) { detachNode(if_block4_anchor); } } }; } // (3:1) {#if loading === 'true' || loading === true} function create_if_block(component, ctx) { var text, kin_loading; function select_block_type_1(ctx) { if (ctx.heading != '') return create_if_block_1; return create_else_block; } var current_block_type = select_block_type_1(ctx); var if_block = current_block_type(component, ctx); return { c() { if_block.c(); text = createText("\n\n\t\t"); kin_loading = createElement("kin-loading"); setCustomElementData(kin_loading, "fullscreen", "true"); setCustomElementData(kin_loading, "label", ctx.loadinglabel); }, m(target, anchor) { if_block.m(target, anchor); insert(target, text, anchor); insert(target, kin_loading, anchor); }, p(changed, ctx) { if (current_block_type === (current_block_type = select_block_type_1(ctx)) && if_block) { if_block.p(changed, ctx); } else { if_block.d(1); if_block = current_block_type(component, ctx); if_block.c(); if_block.m(text.parentNode, text); } if (changed.loadinglabel) { setCustomElementData(kin_loading, "label", ctx.loadinglabel); } }, d(detach) { if_block.d(detach); if (detach) { detachNode(text); detachNode(kin_loading); } } }; } // (30:4) {:else} function create_else_block_3(component, ctx) { var div; return { c() { div = createElement("div"); div.innerHTML = `<slot name="page-title"></slot>`; div.className = "kin_header__title"; }, m(target, anchor) { insert(target, div, anchor); }, p: noop, d(detach) { if (detach) { detachNode(div); } } }; } // (28:4) {#if heading != ''} function create_if_block_8(component, ctx) { var h1; return { c() { h1 = createElement("h1"); h1.className = "kin_header__title"; }, m(target, anchor) { insert(target, h1, anchor); h1.innerHTML = ctx.heading; }, p(changed, ctx) { if (changed.heading) { h1.innerHTML = ctx.heading; } }, d(detach) { if (detach) { detachNode(h1); } } }; } // (37:4) {#if !(upsell === 'true' || upsell === true)} function create_if_block_6(component, ctx) { var div, slot, text; var if_block = ((ctx.inactive === 'true' || ctx.inactive === true) && ctx.inactivemsg != '') && create_if_block_7(component, ctx); return { c() { div = createElement("div"); slot = createElement("slot"); text = createText("\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t"); if (if_block) if_block.c(); setAttribute(slot, "name", "controls"); div.className = "kin_header__controls"; }, m(target, anchor) { insert(target, div, anchor); append(div, slot); component.refs.controls = slot; append(div, text); if (if_block) if_block.m(div, null); }, p(changed, ctx) { if ((ctx.inactive === 'true' || ctx.inactive === true) && ctx.inactivemsg != '') { if (if_block) { if_block.p(changed, ctx); } else { if_block = create_if_block_7(component, ctx); if_block.c(); if_block.m(div, null); } } else if (if_block) { if_block.d(1); if_block = null; } }, d(detach) { if (detach) { detachNode(div); } if (component.refs.controls === slot) component.refs.controls = null; if (if_block) if_block.d(); } }; } // (43:6) {#if (inactive === 'true' || inactive === true) && inactivemsg != ''} function create_if_block_7(component, ctx) { var div, text; return { c() { div = createElement("div"); text = createText(ctx.inactivemsg); div.className = "kin_header__tooltip -arrow-top"; }, m(target, anchor) { insert(target, div, anchor); append(div, text); }, p(changed, ctx) { if (changed.inactivemsg) { setData(text, ctx.inactivemsg); } }, d(detach) { if (detach) { detachNode(div); } } }; } // (60:32) function create_if_block_5(component, ctx) { var button, kin_icon; function click_handler(event) { component.backClickEvent(); } return { c() { button = createElement("button"); kin_icon = createElement("kin-icon"); setCustomElementData(kin_icon, "name", "icon-s-controls-arrow-left"); setCustomElementData(kin_icon, "size", "20"); addListener(button, "click", click_handler); button.className = "kin_back-btn"; button.title = ctx.backlabel; }, m(target, anchor) { insert(target, button, anchor); append(button, kin_icon); }, p(changed, ctx) { if (changed.backlabel) { button.title = ctx.backlabel; } }, d(detach) { if (detach) { detachNode(button); } removeListener(button, "click", click_handler); } }; } // (56:3) {#if back != 'false' && backevent != 'true'} function create_if_block_4(component, ctx) { var a, kin_icon, a_href_value; return { c() { a = createElement("a"); kin_icon = createElement("kin-icon"); setCustomElementData(kin_icon, "name", "icon-s-controls-arrow-left"); setCustomElementData(kin_icon, "size", "20"); a.className = "kin_back-btn"; a.href = a_href_value = ctx.backhash != '' ? ctx.backhash : '#Dashboard'; a.title = ctx.backlabel; }, m(target, anchor) { insert(target, a, anchor); append(a, kin_icon); }, p(changed, ctx) { if ((changed.backhash) && a_href_value !== (a_href_value = ctx.backhash != '' ? ctx.backhash : '#Dashboard')) { a.href = a_href_value; } if (changed.backlabel) { a.title = ctx.backlabel; } }, d(detach) { if (detach) { detachNode(a); } } }; } // (67:3) {#if settingsurl && !(upsell === 'true' || upsell === true)} function create_if_block_3(component, ctx) { var a, kin_icon; return { c() { a = createElement("a"); kin_icon = createElement("kin-icon"); setCustomElementData(kin_icon, "name", "icon-s-settings-button"); setCustomElementData(kin_icon, "size", "20"); a.className = "kin_settings-btn"; a.href = ctx.settingsurl; a.title = ctx.settingslabel; }, m(target, anchor) { insert(target, a, anchor); append(a, kin_icon); }, p(changed, ctx) { if (changed.settingsurl) { a.href = ctx.settingsurl; } if (changed.settingslabel) { a.title = ctx.settingslabel; } }, d(detach) { if (detach) { detachNode(a); } } }; } // (82:2) {:else} function create_else_block_2(component, ctx) { var div, slot, div_class_value; return { c() { div = createElement("div"); slot = createElement("slot"); setAttribute(slot, "name", "page-content"); div.className = div_class_value = "kin_page__content " + (ctx.inactive === 'true' || ctx.inactive === true ? '-disabled' : ''); }, m(target, anchor) { insert(target, div, anchor); append(div, slot); component.refs.content = div; }, p(changed, ctx) { if ((changed.inactive) && div_class_value !== (div_class_value = "kin_page__content " + (ctx.inactive === 'true' || ctx.inactive === true ? '-disabled' : ''))) { div.className = div_class_value; } }, d(detach) { if (detach) { detachNode(div); } if (component.refs.content === div) component.refs.content = null; } }; } // (75:2) {#if upsell === 'true' || upsell === true} function create_if_block_2(component, ctx) { var div; return { c() { div = createElement("div"); div.innerHTML = `<slot name="upsell"></slot>`; div.className = "kin_page__content"; }, m(target, anchor) { insert(target, div, anchor); }, p: noop, d(detach) { if (detach) { detachNode(div); } } }; } // (7:2) {:else} function create_else_block(component, ctx) { var div; return { c() { div = createElement("div"); div.innerHTML = `<slot name="page-title"></slot>`; div.className = "kin_loading__title"; }, m(target, anchor) { insert(target, div, anchor); }, p: noop, d(detach) { if (detach) { detachNode(div); } } }; } // (5:2) {#if heading != ''} function create_if_block_1(component, ctx) { var h1; return { c() { h1 = createElement("h1"); h1.className = "kin_loading__title"; }, m(target, anchor) { insert(target, h1, anchor); h1.innerHTML = ctx.heading; }, p(changed, ctx) { if (changed.heading) { h1.innerHTML = ctx.heading; } }, d(detach) { if (detach) { detachNode(h1); } } }; } class Page extends HTMLElement { constructor(options = {}) { super(); init(this, options); this.refs = {}; this._state = assign(data(), options.data); this._intro = true; this._slotted = options.slots || {}; this.attachShadow({ mode: 'open' }); this.shadowRoot.innerHTML = `<style>*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.kin_page{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--page-background);overflow:hidden}.kin_loading__title{position:absolute;opacity:0.01}.kin_header{padding:1.5rem var(--page-padding) 0;height:var(--header-height);position:relative;text-align:var(--page-header-align)}.kin_header__crumbs,.kin_header__content{position:absolute;left:var(--page-padding);right:var(--page-padding)}.kin_header__crumbs{display:var(--breadcrumbs-vis)}.kin_header__content{bottom:1.1rem}.kin_header__title,.kin_header__controls{display:inline-block;vertical-align:middle;position:relative}.kin_header__title{margin-top:0;margin-bottom:0;padding:0;line-height:1.1;font-size:var(--font-size-header);font-weight:var(--font-weight-h1);max-width:100%}.kin_header__title .color-ok{color:var(--color-ok)}.kin_header__title .color-critical{color:var(--color-critical)}.kin_header__title .color-attention{color:var(--color-attention)}.kin_header__tooltip{position:absolute;width:24rem;margin-top:1.5rem;padding:0.8rem 1.2rem;background-color:var(--tooltip-color-onboarding);color:#fff;font-size:var(--font-size-small);border:none;box-shadow:0 6px 20px rgba(0,0,0,0.3);border-radius:var(--cube-radius);z-index:20;transform:translateX(-50%);left:50%}.kin_header__tooltip.-arrow-top:after{bottom:100%;left:50%;border:solid transparent;content:'';height:0;width:0;position:absolute;color:var(--tooltip-color-onboarding);pointer-events:none;border-color:transparent;border-bottom-color:currentColor;border-width:8px;margin-left:-8px;z-index:1}.kin_back-btn,.kin_settings-btn{position:absolute;left:0;top:var(--back-button-top);border:0;background-color:rgba(213,211,230,0.1);transition:background-color 0.2s;cursor:pointer;color:inherit;text-decoration:none;width:4rem;height:var(--back-button-height);border-radius:0 var(--back-button-height) var(--back-button-height) 0;display:flex;align-items:center;justify-content:center;z-index:9}.kin_back-btn kin-icon,.kin_settings-btn kin-icon{opacity:0.8}.kin_back-btn:focus,.kin_settings-btn:focus,.kin_back-btn:hover,.kin_settings-btn:hover{transform:scale(1.1);background-color:rgba(213,211,230,0.3);outline:0}.kin_back-btn:focus kin-icon,.kin_settings-btn:focus kin-icon,.kin_back-btn:hover kin-icon,.kin_settings-btn:hover kin-icon{opacity:1}.kin_settings-btn{left:auto;right:0;border-radius:var(--back-button-height) 0 0 var(--back-button-height)}.kin_settings-btn:hover .kin_settings-btn__tooltip{display:block}.kin_settings-btn__tooltip{display:none;position:absolute;right:105%}.kin_back-btn{display:var(--back-btn-vis)}.kin_back-btn.-static{position:fixed;top:6.4rem}.kin_page__content{position:absolute;top:var(--header-height);right:0;bottom:0;left:0;display:block}.kin_page__content.-disabled{opacity:0.2;pointer-events:none}.kin_upsell{top:var(--header-height);bottom:0;left:0;right:0;position:absolute;display:flex;flex-direction:column;justify-content:center;align-items:center}.kin_upsell__icon{font-size:18rem;margin-bottom:2rem}.kin_upsell__cta{margin-top:1rem}.kin_page.-no-header .kin_header{display:none}.kin_page.-no-header .kin_page__content{top:0}.kin_page.-cover-header .kin_header{position:absolute;width:100%;z-index:1}.kin_page.-cover-header .kin_page__content{top:0}.kin_page.-large-header .kin_header{height:var(--header-height-large)}.kin_page.-large-header .kin_header__title{display:block}.kin_page.-large-header .kin_page__content{top:var(--header-height-large)}.kin_page.-medium-header .kin_header{height:var(--header-height-medium)}.kin_page.-medium-header .kin_header__title{display:block}.kin_page.-medium-header .kin_page__content{top:var(--header-height-medium)}.kin_page.-tabs-page .kin_header{height:var(--header-height-tabs);text-align:center}.kin_page.-tabs-page .kin_header__title{display:block;text-align:center}.kin_page.-tabs-page .kin_header__controls{display:block;text-align:center;padding:0}.kin_page.-tabs-page .kin_page__content{top:var(--header-height-tabs);text-align:center}.kin_page.-center-header .kin_header__controls,.kin_page.-center-header .kin_header__title{display:block;text-align:center}.kin_page.-center,.kin_page.-center-all{text-align:center}.kin_page.-center .kin_header__controls,.kin_page.-center-all .kin_header__controls{display:none}.kin_page.-center .kin_header__title,.kin_page.-center-all .kin_header__title{display:block}.kin_page.-center-all .kin_page__content{display:flex;align-items:center;justify-content:center;text-align:center}.kin_page.-flex-between .kin_header__controls{display:none}.kin_page.-flex-between .kin_header__title{display:block}.kin_page.-flex-between .kin_page__content{display:flex;align-items:center;justify-content:space-between;text-align:center}.kin_page.-profile .kin_header{position:static;height:auto;text-align:start}.kin_page.-profile .kin_header__content{position:static}.kin_page.-profile .kin_header__controls{position:static;display:block;padding:0;max-height:none}.kin_page.-profile .kin_header__title{max-height:none;max-width:100%}.kin_page.-profile .kin_page__content{top:calc(var(--header-height) + 6rem)}.kin_page.-detail .kin_header{text-align:center;height:calc(var(--header-height-large) + 4rem)}.kin_page.-detail .kin_header__content{display:block}.kin_page.-detail .kin_header__title{max-height:none;display:block;font-weight:var(--font-weight-h1);padding:0 8%}.kin_page.-detail .kin_header__controls{padding:1rem 0 0;position:static;display:block;max-height:none}.kin_page.-detail .kin_page__content{top:calc(var(--header-height-large) + 4rem)}:global(.tabbed) .kin_back-btn:focus,:global(.tabbed) .kin_settings-btn:focus{box-shadow:0 0 0 1px #000, 0 0 0 2px var(--color-focus)}.kin_page.-rtl .kin_header__tooltip{transform:translateX(50%);left:auto;right:50%}.kin_page.-rtl .kin_back-btn,.kin_page.-rtl .kin_settings-btn{transform:scale(-1)}.kin_page.-rtl .kin_back-btn:focus,.kin_page.-rtl .kin_settings-btn:focus,.kin_page.-rtl .kin_back-btn:hover,.kin_page.-rtl .kin_settings-btn:hover{transform:scale(-1.1)}.kin_page.-rtl .kin_back-btn{left:auto;right:0}.kin_page.-rtl .kin_settings-btn{right:auto;left:0}</style>`; this._fragment = create_main_fragment(this, this._state); this.root._oncreate.push(() => { oncreate.call(this); this.fire("update", { changed: assignTrue({}, this._state), current: this._state }); }); this._fragment.c(); this._fragment.m(this.shadowRoot, null); if (options.target) this._mount(options.target, options.anchor); } static get observedAttributes() { return ["heading","settingsurl","csscls","upsell","inactive","inactivemsg","layout","back","backevent","backhash","loading","loadinglabel","datatest"]; } get heading() { return this.get().heading; } set heading(value) { this.set({ heading: value }); } get settingsurl() { return this.get().settingsurl; } set settingsurl(value) { this.set({ settingsurl: value }); } get csscls() { return this.get().csscls; } set csscls(value) { this.set({ csscls: value }); } get upsell() { return this.get().upsell; } set upsell(value) { this.set({ upsell: value }); } get inactive() { return this.get().inactive; } set inactive(value) { this.set({ inactive: value }); } get inactivemsg() { return this.get().inactivemsg; } set inactivemsg(value) { this.set({ inactivemsg: value }); } get layout() { return this.get().layout; } set layout(value) { this.set({ layout: value }); } get back() { return this.get().back; } set back(value) { this.set({ back: value }); } get backevent() { return this.get().backevent; } set backevent(value) { this.set({ backevent: value }); } get backhash() { return this.get().backhash; } set backhash(value) { this.set({ backhash: value }); } get loading() { return this.get().loading; } set loading(value) { this.set({ loading: value }); } get loadinglabel() { return this.get().loadinglabel; } set loadinglabel(value) { this.set({ loadinglabel: value }); } get datatest() { return this.get().datatest; } set datatest(value) { this.set({ datatest: value }); } connectedCallback() { Object.keys(this._slotted).forEach(key => { this.appendChild(this._slotted[key]); }); } attributeChangedCallback(attr, oldValue, newValue) { this.set({ [attr]: newValue }); } connectedCallback() { flush(this); } } assign(Page.prototype, proto); assign(Page.prototype, methods); assign(Page.prototype, { _mount(target, anchor) { target.insertBefore(this, anchor); } }); customElements.define("kin-page", Page); /* components/table/app/App.html generated by Svelte v2.16.1 */ /* TODO - make svelte version of plugin nitro-ui/ractiveAdapter/app/nitro/ui/plugins/kinTableScrollable.js - kill MainCss.css import - do action bar AV-21774 */ /* RULES 1) Rows .kin_table__row in slot name="table-body" must have same height to get proper calculation 2) use slot name="table-body-heading" to put something before data rows 3) use slot name="table-action-row" to put something after data rows 4) most used scrollrootselector's : .sve_one-page__content, kin, .overlay__contents 5) if you have more tables on page and need smartscroll then lower MIN_ROWS_TO_SCROLL (as default every table could have up to 60 rows in DOM) 6) to check if smartscroll really works, just check if you see in DOM max of 60 rows (MIN_ROWS_TO_SCROLL) */ /* EXAMPLES 1) show more/less in all frameworks <kin-table showmorelimit=5 txtshowless="some text" txtshowmore={nls('global.show.more', someData.length - 5)}> 2) show more/less with data in ractive (texts handled by plugin) onrender => NAPI.nitro.ui.plugins.kinTableScrollable.initRactive(this); <kin-table showmorelimit=5 dataname="hop" datalength="17"> 3) show more/less + smartscroll with data in ractive onrender => NAPI.nitro.ui.plugins.kinTableScrollable.initRactive(this); <kin-table showmorelimit=5 dataname="hop" datalength="66" scrollrootselector="kin-view"> 4) smartscroll in ractive onrender => NAPI.nitro.ui.plugins.kinTableScrollable.initRactive(this); <kin-table dataname="hop" datalength="66" scrollrootselector=".overlay__contents"> 5) smartscroll in svelte svelte plugin not ready yet 6) watchscroll + loading animation watchscrollpos starts firing scrollPos events on which you start listening <kin-table watchscrollpos={bool} bottomloading={bool} on:scrollPos={onScrollPos} scrollrootselector=".sve_one-page__content"> */ const getPositiveOrBase = (value, base = 0, min = 0) => { if (value == null) { return base; } const intValue = parseInt(value, 10); return Number.isInteger(intValue) && intValue >= min ? intValue : base; }; function dataLengthNum({ datalength }) { return getPositiveOrBase(datalength); } function selectedItemsNum({ selecteditems }) { return getPositiveOrBase(selecteditems); } function MIN_ROWS_TO_SCROLL({ minrowstoscroll }) { return getPositiveOrBase(minrowstoscroll, 60); } function PAGES_IN_WRAP({ pagesinwrap }) { return getPositiveOrBase(pagesinwrap, 2, 2); } function showMoreLimitNum({ showmorelimit }) { return getPositiveOrBase(showmorelimit); } function data$1() { return { anyselected: 'false', csscls: '', customemptyicon: '', datalength: null, dataname: '', inactive: false, groupid: null,// TODO action bar AV-21774 keepposition: true, loading: false, minrowstoscroll: null, name: '',// TODO action bar AV-21774 noactions: false,// TODO action bar AV-21774 pagesinwrap: null, scrollrootselector: null, selecteditems: null, tablesections: 1, showmorelimit: null, collapse: null, txtshowless: '', txtshowmore: '', watchscrollpos: false, bottomloading: false } } var methods$1 = { deselect(e) { const { selectedItemsNum, groupid, name } = this.get(); if ((e.key === 'Escape' || e.keyCode === 27) && selectedItemsNum) { const deselectEvent = new CustomEvent('kin-deselectAll', { detail: { // groupId: groupid, // name: name }, bubbles: true, cancelable: true, composed: true, }); this.dispatchEvent(deselectEvent); return false } }, expand() { const { collapse } = this.get(); if (collapse) { this.set({ collapse: false }); this._delayedRenderState(); } }, collapse() { const { collapse } = this.get(); if (!collapse) { this.set({ collapse: true }); this._delayedRenderState(); this.scrollScrollRoot(this.offsetTop); } }, _addScrolling() { return this._findDimensions() .then(() => { this._adjustAllRowsHeight(Number.POSITIVE_INFINITY); this._lastTop = -1; this._actualRow = -100; this._listenToRootScroll(); this._scrollable = true; }) .catch(() => {}); }, _removeScrolling() { if (this._scrollable) { const { keepposition } = this.get(); this._adjustAllRowsHeight(); this.refs.tableScrollPane.style.top = 0; if (!keepposition) { this.scrollScrollRoot(this.offsetTop); } this._scrollable = false; this._unListenToRootScroll();// dont move } }, _listenToRootScroll() { if (!this._listeningToRootScroll) { this._scrollRoot.addEventListener(this._rootScrollEventName, this._onRootScroll); this._listeningToRootScroll = true; } }, _unListenToRootScroll(ondestroy) { if (this._listeningToRootScroll) { const { watchscrollpos } = this.get(); if (ondestroy || (!watchscrollpos && !this._scrollable)) { this._scrollRoot.removeEventListener(this._rootScrollEventName, this._onRootScroll); this._listeningToRootScroll = false; } } }, // detect if we need to preload next or previous rows page to have smooth scrolling showRows(row = 0, next = true, reload = false) { if (next) { if (reload || row + this._rowsPerPage > this._actualRow + this._rowsPerWrap) { this._loadScrolledRows(row + this._rowsPerPage, reload); } } else if (reload || row < this._actualRow) { this._loadScrolledRows(row, reload); } }, // preload range of rows for smooth scrolling _loadScrolledRows(startFromRow, reload = false) { const { dataLengthNum } = this.get(); let startRow = startFromRow - this._rowsPerPage; if (startRow + this._rowsPerWrap > dataLengthNum) { startRow = dataLengthNum - this._rowsPerWrap; } if (startRow < 0) { startRow = 0; } if (!reload && this._actualRow === startRow) return; const endRow = dataLengthNum >= startRow + this._rowsPerWrap ? startRow + this._rowsPerWrap : dataLengthNum; if (this.refs.tableScrollPane) { this.refs.tableScrollPane.style.top = (startRow * this._rowHeight) + 'px'; } this._actualRow = startRow; this._loadRows(startRow, endRow); }, // notify owner component by event to load specified range of rows to table-content slot _loadRows(startRow, endRow, hideResult) { const { dataname } = this.get(); if (hideResult) { this.refs.tableScrollPane.style.visibility = 'hidden'; this._resultHidden = true; } this.dispatchEvent(new CustomEvent('kin-table:showrows', { detail: { start: startRow, end: endRow, dataname: dataname }, bubbles: true })); if (!hideResult && this._resultHidden) { this._timerHideResult = setTimeout(() => { this.refs.tableScrollPane.style.visibility = 'visible'; this._resultHidden = false; }, 0); } }, scrollScrollRoot(y) { if (!this._scrollRoot) { return; } if (this._isInKinView) { this._scrollRoot.dispatchEvent(new CustomEvent('content-scrollto', { detail: { scrollTo: y } })); } else { this._scrollRoot.scrollTo = y; } }, // adjust height of wrapper which contains scrollable rows // example: we shows 30 rows in DOM of 1000 records then we adjust height to 1000 rows to adjust scroll root node height and its scrollbar _adjustAllRowsHeight(rows) { let height; const { dataLengthNum } = this.get(); if (rows == undefined) { height = 'auto'; } else { height = Math.min(rows, dataLengthNum) * this._rowHeight + 'px'; } this.refs.allRowsHeight.style.height = height; }, _handleScroll(top, event) { const { watchscrollpos } = this.get(); if (this._scrollable) { const next = top > this._lastTop; const startRow = top > 0 ? Math.floor(top / this._rowHeight) : 0; this._lastTop = top; this.showRows(startRow, next); } if (watchscrollpos) { const rect = this.getBoundingClientRect(); const bottomScrollPos = rect.bottom - document.body.clientHeight + this._scrollRoot.getScrollTop(); if (bottomScrollPos > 0) { const scrollPosEvent = new CustomEvent('scrollPos', { detail: { current: event.detail.scrollPos, max: bottomScrollPos, scrollTo: this.scrollScrollRootBinded } }); this.dispatchEvent(scrollPosEvent); } } }, _getRowHeight() { if (this._rowHeight) { return this._rowHeight; } const rowEl = this.querySelector('.kin_table__row'); if (rowEl) { return this._rowHeight = rowEl.offsetHeight; } return 0; }, // cached promise which returns success if we knows height of row and view port in which we scrolls... // if content slot is empty then we notify owner component by event to put one row into content slot _findDimensions() { if (this._findDimensionsPromise) { return this._findDimensionsPromise; } return this._findDimensionsPromise = new Promise((resolve, reject) => { if (this._scrollRoot) { if (!this._getRowHeight()) { this._loadRows(0, 1, true); } } this._timerRowDimensions = setTimeout(() => { if (this._scrollRoot) { if (!this._getRowHeight()) { this._findDimensionsPromise = false; reject('no rows in data'); return; } if (this._isInKinView) { this._viewHeight = this.closest('.kin_page__content').offsetHeight; } else { this._viewHeight = this._scrollRoot.offsetHeight; } this._rowsPerPage = Math.ceil(this._viewHeight / this._rowHeight); this._rowsPerWrap = this._rowsPerPage * this.get().PAGES_IN_WRAP; this._findDimensionsPromise = Promise.resolve(); resolve(); } else { if (this._getRowHeight()) { this._findDimensionsPromise = Promise.resolve(); resolve(); } else { this._findDimensionsPromise = false; reject('no rows in data'); } } }, 0); }); }, // async called by data changes in onupdate() or when oncreate() finally appended to DOM (if feature requires it) // never call it directly instead use _delayedRenderState() // _renderedInSlot - now we can get dimensions or traverse DOM // _findDimensions() - promise which gets row dimensions _renderState() { if (!this._componentReady) { return; } const { dataname, dataLengthNum, MIN_ROWS_TO_SCROLL, showMoreLimitNum, collapse, keepposition, isInKinPage } = this.get(); if (this._scrollRoot) {// smart scroll supported if (!dataname) { return; } if (showMoreLimitNum && collapse) {// collapsed this._removeScrolling(); this._loadRows(0, dataLengthNum < showMoreLimitNum ? dataLengthNum : showMoreLimitNum); } else {// expanded if (dataLengthNum > MIN_ROWS_TO_SCROLL) {// many rows -> apply smart scroll this._addScrolling().then(() => { let startRow; if (keepposition) { if (isInKinPage) { startRow = Math.floor(this._scrollRoot.getScrollTop() / this._rowHeight); } else { startRow = Math.floor((this._scrollRoot.scrollTop - this.offsetTop) / this._rowHeight); } this.showRows(startRow, false, true); } else { this.showRows(); this.scrollScrollRoot(this.offsetTop); } }); } else {// render all rows without smart scroll this._removeScrolling(); this._loadRows(0, dataLengthNum); } } } else {// basic styled table // if ractiveAdapter/app/nitro/ui/plugins/kinTableScrollable.js used... files VS files_rows in content slot if (dataname) { this._loadRows(0, dataLengthNum); } // non-smartscroll or no-data variant just uses overflow to do expand/collapse if (showMoreLimitNum) { if (collapse) { this._findDimensions() .then(() => { this.refs.allRowsHeight.style.overflow = 'hidden'; this._adjustAllRowsHeight(showMoreLimitNum); }) .catch(error => { console.error(error); }); } else { this._adjustAllRowsHeight(); this.refs.allRowsHeight.style.overflow = 'visible'; } } } }, // aggregate all onupdate changes to one render cycle _delayedRenderState() { this._timerDelayRender && clearTimeout(this._timerDelayRender); this._timerDelayRender = setTimeout(() => { this._renderState(); }, 0); }, // oncreate happens before props are set (init logic is driven by these props) _initWithProps() { const { scrollrootselector } = this.get(); this._componentReady = false; // features that needs dimensions or be able to traverse dom if (scrollrootselector) { // workaround to have state when component is render in slot let loopCounter = 0; const maxLoops = 16; const loopInterval = 250; this._timerInSlot = setInterval(() => { loopCounter++; if (loopCounter > maxLoops || this.refs.allRowsHeight) { this._timerInSlot = clearInterval(this._timerInSlot); } if (!this.refs.allRowsHeight) {// check if component is rendered and appended to DOM return; } // find parent component in which we scroll if (scrollrootselector) { this._isInKinView = scrollrootselector.indexOf('kin-view') !== -1; this._scrollRoot = this.closest(scrollrootselector); if (this._scrollRoot) { // handle scroll from shadow dom of kin-view or classic dom node if (this._isInKinView) { this._rootScrollEventName = 'kinview-scroll'; this._onRootScroll = event => { this._handleScroll(event.detail.scrollPos - event.detail.slotPos - this.offsetTop, event); }; // notify kin-view to start dispatching kin-view:scroll event to propagate scrolling to this component this._scrollRoot.dispatchEvent(new CustomEvent('kin-view:fire-scrolling')); } else { this._rootScrollEventName = 'scroll'; this._onRootScroll = event => { this._handleScroll(event.target.scrollTop - this.offsetTop, event); }; } } else { console.error('kin table cant find scrolling wrap "' + scrollrootselector + '"'); } } this._componentIsReady(); }, loopInterval); } else { // basic styled table this._componentIsReady(); } }, _componentIsReady() { this._componentReady = true; this._delayedRenderState(); this.handleWatchScroll(); }, handleWatchScroll() { if (this._componentReady) { this.get().watchscrollpos ? this._listenToRootScroll() : this._unListenToRootScroll(); } } }; function oncreate$1() { this.scrollScrollRootBinded = this.scrollScrollRoot.bind(this); } function ondestroy() { this._timerComponentReady && clearTimeout(this._timerComponentReady); this._timerInSlot && clearTimeout(this._timerInSlot); this._timerHideResult && clearTimeout(this._timerHideResult); this._timerDelayRender && clearTimeout(this._timerDelayRender); this._timerRowDimensions && clearTimeout(this._timerRowDimensions); this._unListenToRootScroll(true); } function onupdate({ changed, current, previous }) { if (this._componentReady == null && Object.values(changed)[0] === 1) {// finally svelte will set props this._timerComponentReady = setTimeout(() => { this._initWithProps(); }, 0); } if (changed.dataname || changed.datalength) { this._delayedRenderState(); } if (changed.showmorelimit === true) { this.set({ collapse: Boolean(current.showMoreLimitNum) }); this._delayedRenderState(); } if (changed.watchscrollpos === true) { this.handleWatchScroll(); } if (changed.selectedItemsNum) { const deselectEvent = new CustomEvent('kin-isActionBarVisible', { detail: { isVisible: current.selectedItemsNum > 0 // groupId: current.groupid, // name: current.name }, bubbles: true, cancelable: true, composed: true }); if (current.selectedItemsNum === 0) { this.removeAttribute('anyselected'); this.dispatchEvent(deselectEvent); } if (current.selectedItemsNum > 0 && previous.selectedItemsNum === 0) { this.setAttribute('anyselected', ''); this.dispatchEvent(deselectEvent); } } } function create_main_fragment$1(component, ctx) { var div1, div0, text, div1_class_value; function onwindowkeydown(event) { component.deselect({ key: event.key, keyCode: event.keyCode }); } window.addEventListener("keydown", onwindowkeydown); function select_block_type(ctx) { if (ctx.loading === 'true' || ctx.loading === true) return create_if_block$1; if (ctx.datalength != null && ctx.dataLengthNum === 0) return create_if_block_1$1; return create_else_block$1; } var current_block_type = select_block_type(ctx); var if_block = current_block_type(component, ctx); return { c() { div1 = createElement("div"); div0 = createElement("div"); div0.innerHTML = `<slot name="table-modals"></slot>`; text = createText("\n\n\t"); if_block.c(); this.c = noop; div1.className = div1_class_value = "kin_table " + ctx.csscls + " " + (ctx.datalength != null && ctx.dataLengthNum === 0 ? '-empty' : '') + " " + (ctx.inactive === 'true' ? '-disabled' : ''); setAttribute(div1, "role", "table"); }, m(target, anchor) { insert(target, div1, anchor); append(div1, div0); append(div1, text); if_block.m(div1, null); }, p(changed, ctx) { if (current_block_type === (current_block_type = select_block_type(ctx)) && if_block) { if_block.p(changed, ctx); } else { if_block.d(1); if_block = current_block_type(component, ctx); if_block.c(); if_block.m(div1, null); } if ((changed.csscls || changed.datalength || changed.dataLengthNum || changed.inactive) && div1_class_value !== (div1_class_value = "kin_table " + ctx.csscls + " " + (ctx.datalength != null && ctx.dataLengthNum === 0 ? '-empty' : '') + " " + (ctx.inactive === 'true' ? '-disabled' : ''))) { div1.className = div1_class_value; } }, d(detach) { window.removeEventListener("keydown", onwindowkeydown); if (detach) { detachNode(div1); } if_block.d(); } }; } // (23:1) {:else} function create_else_block$1(component, ctx) { var slot0, text0, text1, slot1, text2, div1, div0, text3, text4, text5, text6, if_block4_anchor; var if_block0 = (ctx.selectedItemsNum > 0) && create_if_block_7$1(); var if_block1 = (!(ctx.collapse && ctx.dataLengthNum > ctx.showMoreLimitNum)) && create_if_block_6$1(); var if_block2 = (ctx.showMoreLimitNum && ctx.dataLengthNum > ctx.showMoreLimitNum) && create_if_block_4$1(component, ctx); var if_block3 = (ctx.tablesections === '2') && create_if_block_3$1(); var if_block4 = (ctx.bottomloading) && create_if_block_2$1(); return { c() { slot0 = createElement("slot"); text0 = createText("\n\n\t\t\n\t\t"); if (if_block0) if_block0.c(); text1 = createText("\n\n\t\t"); slot1 = createElement("slot"); text2 = createText("\n\n\t\t\n\t\t"); div1 = createElement("div"); div0 = createElement("div"); div0.innerHTML = `<slot name="table-body"></slot>`; text3 = createText("\n\n\t\t"); if (if_block1) if_block1.c(); text4 = createText("\n\n\t\t"); if (if_block2) if_block2.c(); text5 = createText("\n\n\t\t\n\t\t"); if (if_block3) if_block3.c(); text6 = createText("\n\n\t\t"); if (if_block4) if_block4.c(); if_block4_anchor = createComment(); setAttribute(slot0, "name", "table-header"); setAttribute(slot1, "name", "table-body-heading"); div0.className = "kin_table__scroll-pane"; div1.className = "kin_table__body"; }, m(target, anchor) { insert(target, slot0, anchor); insert(target, text0, anchor); if (if_block0) if_block0.m(target, anchor); insert(target, text1, anchor); insert(target, slot1, anchor); insert(target, text2, anchor); insert(target, div1, anchor); append(div1, div0); component.refs.tableScrollPane = div0; component.refs.allRowsHeight = div1; insert(target, text3, anchor); if (if_block1) if_block1.m(target, anchor); insert(target, text4, anchor); if (if_block2) if_block2.m(target, anchor); insert(target, text5, anchor); if (if_block3) if_block3.m(target, anchor); insert(target, text6, anchor); if (if_block4) if_block4.m(target, anchor); insert(target, if_block4_anchor, anchor); }, p(changed, ctx) { if (ctx.selectedItemsNum > 0) { if (!if_block0) { if_block0 = create_if_block_7$1(); if_block0.c(); if_block0.m(text1.parentNode, text1); } } else if (if_block0) { if_block0.d(1); if_block0 = null; } if (!(ctx.collapse && ctx.dataLengthNum > ctx.showMoreLimitNum)) { if (!if_block1) { if_block1 = create_if_block_6$1(); if_block1.c(); if_block1.m(text4.parentNode, text4); } } else if (if_block1) { if_block1.d(1); if_block1 = null; } if (ctx.showMoreLimitNum && ctx.dataLengthNum > ctx.showMoreLimitNum) { if (if_block2) { if_block2.p(changed, ctx); } else { if_block2 = create_if_block_4$1(component, ctx); if_block2.c(); if_block2.m(text5.parentNode, text5); } } else if (if_block2) { if_block2.d(1); if_block2 = null; } if (ctx.tablesections === '2') { if (!if_block3) { if_block3 = create_if_block_3$1(); if_block3.c(); if_block3.m(text6.parentNode, text6); } } else if (if_block3) { if_block3.d(1); if_block3 = null; } if (ctx.bottomloading) { if (!if_block4) { if_block4 = create_if_block_2$1(); if_block4.c(); if_block4.m(if_block4_anchor.parentNode, if_block4_anchor); } } else if (if_block4) { if_block4.d(1); if_block4 = null; } }, d(detach) { if (detach) { detachNode(slot0); detachNode(text0); } if (if_block0) if_block0.d(detach); if (detach) { detachNode(text1); detachNode(slot1); detachNode(text2); detachNode(div1); } if (component.refs.tableScrollPane === div0) component.refs.tableScrollPane = null; if (component.refs.allRowsHeight === div1) component.refs.allRowsHeight = null; if (detach) { detachNode(text3); } if (if_block1) if_block1.d(detach); if (detach) { detachNode(text4); } if (if_block2) if_block2.d(detach); if (detach) { detachNode(text5); } if (if_block3) if_block3.d(detach); if (detach) { detachNode(text6); } if (if_block4) if_block4.d(detach); if (detach) { detachNode(if_block4_anchor); } } }; } // (13:52) function create_if_block_1$1(component, ctx) { var div_1; return { c() { div_1 = createElement("div"); div_1.innerHTML = `<div class="kin_table__empty__icon"><slot name="table-empty-icon"></slot></div> <slot name="table-empty"></slot>`; div_1.className = "kin_table__empty"; }, m(target, anchor) { insert(target, div_1, anchor); }, p: noop, d(detach) { if (detach) { detachNode(div_1); } } }; } // (9:1) {#if loading === 'true' || loading === true} function create_if_block$1(component, ctx) { var kin_loading; return { c() { kin_loading = createElement("kin-loading"); setCustomElementData(kin_loading, "fullscreen", "true"); }, m(target, anchor) { insert(target, kin_loading, anchor); }, p: noop, d(detach) { if (detach) { detachNode(kin_loading); } } }; } // (29:2) {#if selectedItemsNum > 0} function create_if_block_7$1(component, ctx) { var slot; return { c() { slot = createElement("slot"); setAttribute(slot, "name", "table-actions"); }, m(target, anchor) { insert(target, slot, anchor); }, d(detach) { if (detach) { detachNode(slot); } } }; } // (42:2) {#if !(collapse && dataLengthNum > showMoreLimitNum)} function create_if_block_6$1(component, ctx) { var slot; return { c() { slot = createElement("slot"); setAttribute(slot, "name", "table-action-row"); }, m(target, anchor) { insert(target, slot, anchor); }, d(detach) { if (detach) { detachNode(slot); } } }; } // (52:2) {#if showMoreLimitNum && dataLengthNum > showMoreLimitNum} function create_if_block_4$1(component, ctx) { var link, text, div; function select_block_type_1(ctx) { if (ctx.collapse) return create_if_block_5$1; return create_else_block_1$1; } var current_block_type = select_block_type_1(ctx); var if_block = current_block_type(component, ctx); return { c() { link = createElement("link"); text = createText("\n\t\t\t"); div = createElement("div"); if_block.c(); link.rel = "stylesheet"; link.href = "/MainCss.css"; div.className = "kin_table__expand avs"; }, m(target, anchor) { insert(target, link, anchor); insert(target, text, anchor); insert(target, div, anchor); if_block.m(div, null); }, p(changed, ctx) { if (current_block_type === (current_block_type = select_block_type_1(ctx)) && if_block) { if_block.p(changed, ctx); } else { if_block.d(1); if_block = current_block_type(component, ctx); if_block.c(); if_block.m(div, null); } }, d(detach) { if (detach) { detachNode(link); detachNode(text); detachNode(div); } if_block.d(); } }; } // (57:4) {:else} function create_else_block_1$1(component, ctx) { var button, text; function click_handler(event) { component.collapse(); } return { c() { button = createElement("button"); text = createText(ctx.txtshowless); addListener(button, "click", click_handler); button.className = "btn -secondary"; }, m(target, anchor) { insert(target, button, anchor); append(button, text); }, p(changed, ctx) { if (changed.txtshowless) { setData(text, ctx.txtshowless); } }, d(detach) { if (detach) { detachNode(button); } removeListener(button, "click", click_handler); } }; } // (55:4) {#if collapse} function create_if_block_5$1(component, ctx) { var button, text; function click_handler(event) { component.expand(); } return { c() { button = createElement("button"); text = createText(ctx.txtshowmore); addListener(button, "click", click_handler); button.className = "btn -secondary"; }, m(target, anchor) { insert(target, button, anchor); append(button, text); }, p(changed, ctx) { if (changed.txtshowmore) { setData(text, ctx.txtshowmore); } }, d(detach) { if (detach) { detachNode(button); } removeListener(button, "click", click_handler); } }; } // (64:2) {#if tablesections === '2'} function create_if_block_3$1(component, ctx) { var slot0, text, slot1; return { c() { slot0 = createElement("slot"); text = createText("\n\n\t\t\t"); slot1 = createElement("slot"); setAttribute(slot0, "name", "table-header-2"); setAttribute(slot1, "name", "table-body-2"); }, m(target, anchor) { insert(target, slot0, anchor); insert(target, text, anchor); insert(target, slot1, anchor); }, d(detach) { if (detach) { detachNode(slot0); detachNode(text); detachNode(slot1); } } }; } // (70:2) {#if bottomloading} function create_if_block_2$1(component, ctx) { var kin_progress; return { c() { kin_progress = createElement("kin-progress"); setCustomElementData(kin_progress, "percentage", "-1"); }, m(target, anchor) { insert(target, kin_progress, anchor); }, d(detach) { if (detach) { detachNode(kin_progress); } } }; } class App extends HTMLElement { constructor(options = {}) { super(); init(this, options); this.refs = {}; this._state = assign(data$1(), options.data); this._recompute({ datalength: 1, selecteditems: 1, minrowstoscroll: 1, pagesinwrap: 1, showmorelimit: 1 }, this._state); this._intro = true; this._handlers.update = [onupdate]; this._handlers.destroy = [ondestroy]; this._slotted = options.slots || {}; this.attachShadow({ mode: 'open' }); this.shadowRoot.innerHTML = `<style>*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.kin_table{position:relative;text-align:start}.kin_table__empty{padding:26rem 3rem 0;margin-top:4%;text-align:center;font-size:var(--font-size-large);color:var(--color-text-secondary);position:relative}.kin_table__empty__icon{position:absolute;top:0rem;left:0;right:0;font-size:44rem}.kin_table.-empty{pointer-events:none}.kin_table.-disabled{pointer-events:none;opacity:0.3}.kin_table__body{position:relative;padding-left:var(--table-checkbox-size);padding-right:var(--table-checkbox-size);margin-left:calc(var(--table-checkbox-size) * -1);margin-right:calc(var(--table-checkbox-size) * -1)}.kin_table__scroll-pane{position:relative}.kin_table__expand{text-align:center;margin:2rem auto 0 !important}</style>`; this._fragment = create_main_fragment$1(this, this._state); this.root._oncreate.push(() => { oncreate$1.call(this); this.fire("update", { changed: assignTrue({}, this._state), current: this._state }); }); this._fragment.c(); this._fragment.m(this.shadowRoot, null); if (options.target) this._mount(options.target, options.anchor); } static get observedAttributes() { return ["anyselected","csscls","customemptyicon","datalength","dataname","groupid","inactive","keepposition","loading","minrowstoscroll","name","noactions","pagesinwrap","scrollrootselector","selecteditems","tablesections","watchscrollpos","bottomloading","showmorelimit","txtshowless","txtshowmore"]; } get anyselected() { return this.get().anyselected; } set anyselected(value) { this.set({ anyselected: value }); } get csscls() { return this.get().csscls; } set csscls(value) { this.set({ csscls: value }); } get customemptyicon() { return this.get().customemptyicon; } set customemptyicon(value) { this.set({ customemptyicon: value }); } get datalength() { return this.get().datalength; } set datalength(value) { this.set({ datalength: value }); } get dataname() { return this.get().dataname; } set dataname(value) { this.set({ dataname: value }); } get groupid() { return this.get().groupid; } set groupid(value) { this.set({ groupid: value }); } get inactive() { return this.get().inactive; } set inactive(value) { this.set({ inactive: value }); } get keepposition() { return this.get().keepposition; } set keepposition(value) { this.set({ keepposition: value }); } get loading() { return this.get().loading; } set loading(value) { this.set({ loading: value }); } get minrowstoscroll() { return this.get().minrowstoscroll; } set minrowstoscroll(value) { this.set({ minrowstoscroll: value }); } get name() { return this.get().name; } set name(value) { this.set({ name: value }); } get noactions() { return this.get().noactions; } set noactions(value) { this.set({ noactions: value }); } get pagesinwrap() { return this.get().pagesinwrap; } set pagesinwrap(value) { this.set({ pagesinwrap: value }); } get scrollrootselector() { return this.get().scrollrootselector; } set scrollrootselector(value) { this.set({ scrollrootselector: value }); } get selecteditems() { return this.get().selecteditems; } set selecteditems(value) { this.set({ selecteditems: value }); } get tablesections() { return this.get().tablesections; } set tablesections(value) { this.set({ tablesections: value }); } get watchscrollpos() { return this.get().watchscrollpos; } set watchscrollpos(value) { this.set({ watchscrollpos: value }); } get bottomloading() { return this.get().bottomloading; } set bottomloading(value) { this.set({ bottomloading: value }); } get showmorelimit() { return this.get().showmorelimit; } set showmorelimit(value) { this.set({ showmorelimit: value }); } get txtshowless() { return this.get().txtshowless; } set txtshowless(value) { this.set({ txtshowless: value }); } get txtshowmore() { return this.get().txtshowmore; } set txtshowmore(value) { this.set({ txtshowmore: value }); } connectedCallback() { Object.keys(this._slotted).forEach(key => { this.appendChild(this._slotted[key]); }); } attributeChangedCallback(attr, oldValue, newValue) { this.set({ [attr]: newValue }); } connectedCallback() { flush(this); } } assign(App.prototype, proto); assign(App.prototype, methods$1); assign(App.prototype, { _mount(target, anchor) { target.insertBefore(this, anchor); } }); App.prototype._recompute = function _recompute(changed, state) { if (changed.datalength) { if (this._differs(state.dataLengthNum, (state.dataLengthNum = dataLengthNum(state)))) changed.dataLengthNum = true; } if (changed.selecteditems) { if (this._differs(state.selectedItemsNum, (state.selectedItemsNum = selectedItemsNum(state)))) changed.selectedItemsNum = true; } if (changed.minrowstoscroll) { if (this._differs(state.MIN_ROWS_TO_SCROLL, (state.MIN_ROWS_TO_SCROLL = MIN_ROWS_TO_SCROLL(state)))) changed.MIN_ROWS_TO_SCROLL = true; } if (changed.pagesinwrap) { if (this._differs(state.PAGES_IN_WRAP, (state.PAGES_IN_WRAP = PAGES_IN_WRAP(state)))) changed.PAGES_IN_WRAP = true; } if (changed.showmorelimit) { if (this._differs(state.showMoreLimitNum, (state.showMoreLimitNum = showMoreLimitNum(state)))) changed.showMoreLimitNum = true; } }; customElements.define("kin-table", App); /* components/view/app/App.html generated by Svelte v2.16.1 */ function alwaysShowActionbar({ actionbar }) { return actionbar === true || actionbar === 'true'; } function alwaysHideActionbar({ actionbar }) { return actionbar === false || actionbar === 'false'; } function data$2() { return { dir: 'ltr', csscls: '', descOpacity: 1, ctaOpacity: 1, isAction: false, loading: false, actionbar: null } } var methods$2 = { scrolling() { var elPos = this.refs.scrollEl ? this.refs.scrollEl.offsetTop : 0; var scrollPos = this.getScrollTop(); if (scrollPos > elPos ) { this.set({descOpacity: 0}); this.set({ctaOpacity: 0}); } else { this.set({descOpacity: (100 - scrollPos * 4) * 0.01}); this.set({ctaOpacity: (100 - scrollPos * 1.5) * 0.01}); } if (this._dispatchScroll) { this.dispatchEvent(new CustomEvent('kinview-scroll', { detail: { scrollPos: scrollPos, slotPos: elPos } })); } }, getScrollTop() { return this.refs.pane ? this.refs.pane.scrollTop : 0; } }; function oncreate$2() { this.set({ dir: document.body.dir }); const {alwaysShowActionbar, alwaysHideActionbar} = this.get(); if (!alwaysShowActionbar && !alwaysHideActionbar) { this._onKinIsActionBarVisible = (event) => { this.set({isAction: event.detail.isVisible}); }; window.addEventListener('kin-isActionBarVisible', this._onKinIsActionBarVisible); } this._onScrollTo = (event) => { this.refs.pane.scrollTo({ top: event.detail.scrollTo, left: 0, behavior: 'smooth' }); }; this.addEventListener('content-scrollto', this._onScrollTo); this._onFireScrolling = () => { this._dispatchScroll = true; }; this.addEventListener('kin-view:fire-scrolling', this._onFireScrolling); } function ondestroy$1() { const { alwaysShowActionbar, alwaysHideActionbar} = this.get(); if (!alwaysShowActionbar && !alwaysHideActionbar) { window.removeEventListener('kin-isActionBarVisible', this._onKinIsActionBarVisible); } this.removeEventListener('kin-view:fire-scrolling', this._onFireScrolling); this.removeEventListener('content-scrollto', this._onScrollTo); } function create_main_fragment$2(component, ctx) { var div, div_class_value, text, if_block1_anchor; function select_block_type(ctx) { if (ctx.loading === 'true' || ctx.loading === true) return create_if_block_1$2; return create_else_block$2; } var current_block_type = select_block_type(ctx); var if_block0 = current_block_type(component, ctx); function scroll_handler(event) { component.scrolling(); } var if_block1 = (!ctx.alwaysHideActionbar && (ctx.isAction === true || ctx.alwaysShowActionbar)) && create_if_block$2(); return { c() { div = createElement("div"); if_block0.c(); text = createText("\n\n\n"); if (if_block1) if_block1.c(); if_block1_anchor = createComment(); this.c = noop; addListener(div, "scroll", scroll_handler); div.className = div_class_value = "kin_view " + (ctx.dir != 'ltr' ? '-' + ctx.dir : '') + " " + ((ctx.isAction === true || ctx.alwaysShowActionbar) ? '-actions' : '') + " " + ctx.csscls; }, m(target, anchor) { insert(target, div, anchor); if_block0.m(div, null); component.refs.pane = div; insert(target, text, anchor); if (if_block1) if_block1.m(target, anchor); insert(target, if_block1_anchor, anchor); }, p(changed, ctx) { if (current_block_type === (current_block_type = select_block_type(ctx)) && if_block0) { if_block0.p(changed, ctx); } else { if_block0.d(1); if_block0 = current_block_type(component, ctx); if_block0.c(); if_block0.m(div, null); } if ((changed.dir || changed.isAction || changed.alwaysShowActionbar || changed.csscls) && div_class_value !== (div_class_value = "kin_view " + (ctx.dir != 'ltr' ? '-' + ctx.dir : '') + " " + ((ctx.isAction === true || ctx.alwaysShowActionbar) ? '-actions' : '') + " " + ctx.csscls)) { div.className = div_class_value; } if (!ctx.alwaysHideActionbar && (ctx.isAction === true || ctx.alwaysShowActionbar)) { if (!if_block1) { if_block1 = create_if_block$2(); if_block1.c(); if_block1.m(if_block1_anchor.parentNode, if_block1_anchor); } } else if (if_block1) { if_block1.d(1); if_block1 = null; } }, d(detach) { if (detach) { detachNode(div); } if_block0.d(); removeListener(div, "scroll", scroll_handler); if (component.refs.pane === div) component.refs.pane = null; if (detach) { detachNode(text); } if (if_block1) if_block1.d(detach); if (detach) { detachNode(if_block1_anchor); } } }; } // (12:1) {:else} function create_else_block$2(component, ctx) { var div0, slot0, div0_class_value, text0, div1, slot1, div1_class_value, text1, div2; return { c() { div0 = createElement("div"); slot0 = createElement("slot"); text0 = createText("\n\n\t\t\n\t\t"); div1 = createElement("div"); slot1 = createElement("slot"); text1 = createText("\n\n\t\t\n\t\t"); div2 = createElement("div"); div2.innerHTML = `<slot name="view-content"></slot>`; setAttribute(slot0, "name", "description"); div0.className = div0_class_value = "kin_description " + (ctx.descOpacity < .1 ? '-no-events' : ''); setStyle(div0, "opacity", ctx.descOpacity); setAttribute(slot1, "name", "cta"); div1.className = div1_class_value = "kin_cta " + (ctx.ctaOpacity < .1 ? '-no-events' : ''); setStyle(div1, "opacity", ctx.ctaOpacity); div2.className = "kin_view__content"; }, m(target, anchor) { insert(target, div0, anchor); append(div0, slot0); insert(target, text0, anchor); insert(target, div1, anchor); append(div1, slot1); insert(target, text1, anchor); insert(target, div2, anchor); component.refs.scrollEl = div2; }, p(changed, ctx) { if ((changed.descOpacity) && div0_class_value !== (div0_class_value = "kin_description " + (ctx.descOpacity < .1 ? '-no-events' : ''))) { div0.className = div0_class_value; } if (changed.descOpacity) { setStyle(div0, "opacity", ctx.descOpacity); } if ((changed.ctaOpacity) && div1_class_value !== (div1_class_value = "kin_cta " + (ctx.ctaOpacity < .1 ? '-no-events' : ''))) { div1.className = div1_class_value; } if (changed.ctaOpacity) { setStyle(div1, "opacity", ctx.ctaOpacity); } }, d(detach) { if (detach) { detachNode(div0); detachNode(text0); detachNode(div1); detachNode(text1); detachNode(div2); } if (component.refs.scrollEl === div2) component.refs.scrollEl = null; } }; } // (8:1) {#if loading === 'true' || loading === true} function create_if_block_1$2(component, ctx) { var kin_loading; return { c() { kin_loading = createElement("kin-loading"); setCustomElementData(kin_loading, "fullscreen", "true"); }, m(target, anchor) { insert(target, kin_loading, anchor); }, p: noop, d(detach) { if (detach) { detachNode(kin_loading); } } }; } // (34:0) {#if !alwaysHideActionbar && (isAction === true || alwaysShowActionbar)} function create_if_block$2(component, ctx) { var div; return { c() { div = createElement("div"); div.innerHTML = `<slot name="view-actions"></slot>`; div.className = "kin_actions"; }, m(target, anchor) { insert(target, div, anchor); }, d(detach) { if (detach) { detachNode(div); } } }; } class App$1 extends HTMLElement { constructor(options = {}) { super(); init(this, options); this.refs = {}; this._state = assign(data$2(), options.data); this._recompute({ actionbar: 1 }, this._state); this._intro = true; this._handlers.destroy = [ondestroy$1]; this._slotted = options.slots || {}; this.attachShadow({ mode: 'open' }); this.shadowRoot.innerHTML = `<style>*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.kin_description{display:block;position:sticky;top:0;z-index:9;text-align:var(--page-header-align)}.kin_description.-no-events{pointer-events:none}.kin_cta{display:block;text-align:var(--page-header-align)}.kin_cta.-no-events{pointer-events:none}.kin_cta__links{position:absolute;right:0;top:50%;transform:translateY(-50%)}.kin_cta__links>.a,.kin_cta__links>.btn{margin-left:1rem}.kin_view{display:block;position:absolute;top:0;right:0;bottom:0;left:0;padding:0 calc(var(--page-padding) - var(--page-scrollbar-width)) 2rem var(--page-padding);overflow-y:scroll;overflow-x:hidden}.kin_view__content{position:relative}.kin_view__icon{font-size:20rem;width:100%;margin-top:14vh;text-align:center;color:var(--color-graphics)}.kin_view.-actions{bottom:var(--action-bar-height);-webkit-mask-image:none}.kin_view.-center{text-align:center}.kin_view.-center .kin_description,.kin_view.-center .kin_cta,.kin_view.-center .kin_view__content{text-align:center}.kin_view.-center .kin_description{margin-left:auto;margin-right:auto}.kin_view.-tab-pane{padding-top:2rem}.kin_view.-detail{transform:scale(1)}.kin_view.-detail .kin_cta,.kin_view.-detail .kin_description{text-align:center}.kin_view.-detail .kin_view__content{padding-left:10%;padding-right:10%}.kin_actions{position:absolute;right:0;bottom:0;left:0;height:var(--action-bar-height);padding:1rem var(--page-padding);background-color:var(--action-bar-background);border-top:solid 1px var(--action-bar-border);box-shadow:var(--action-bar-shadow);font-size:var(--action-bar-font);z-index:9}*::-webkit-scrollbar{background:transparent;width:var(--scrollbar-width)}*::-webkit-scrollbar-thumb{background-color:var(--scrollbar-bg);background-image:var(--scrollbar-img);background-size:contain;background-repeat:no-repeat;background-position:center;opacity:0.1;border-radius:var(--scrollbar-radius);border:var(--scrollbar-border-width) solid rgba(255,255,255,0);background-clip:padding-box}*::-webkit-scrollbar-thumb:hover{background-color:var(--scrollbar-bg-hover)}*::-webkit-scrollbar-thumb:window-inactive{background-color:var(--scrollbar-bg)}*::-webkit-scrollbar-track{background:transparent}*::-webkit-scrollbar-button{display:none;width:0;height:0}*::-webkit-scrollbar-track-piece,*::-webkit-scrollbar-corner,*::-webkit-resizer{display:none}.kin_view.-rtl{padding-left:calc(var(--page-padding) - var(--page-scrollbar-width));padding-right:var(--page-padding)}</style>`; this._fragment = create_main_fragment$2(this, this._state); this.root._oncreate.push(() => { oncreate$2.call(this); this.fire("update", { changed: assignTrue({}, this._state), current: this._state }); }); this._fragment.c(); this._fragment.m(this.shadowRoot, null); if (options.target) this._mount(options.target, options.anchor); } static get observedAttributes() { return ["csscls","loading","actionbar"]; } get csscls() { return this.get().csscls; } set csscls(value) { this.set({ csscls: value }); } get loading() { return this.get().loading; } set loading(value) { this.set({ loading: value }); } get actionbar() { return this.get().actionbar; } set actionbar(value) { this.set({ actionbar: value }); } connectedCallback() { Object.keys(this._slotted).forEach(key => { this.appendChild(this._slotted[key]); }); } attributeChangedCallback(attr, oldValue, newValue) { this.set({ [attr]: newValue }); } connectedCallback() { flush(this); } } assign(App$1.prototype, proto); assign(App$1.prototype, methods$2); assign(App$1.prototype, { _mount(target, anchor) { target.insertBefore(this, anchor); } }); App$1.prototype._recompute = function _recompute(changed, state) { if (changed.actionbar) { if (this._differs(state.alwaysShowActionbar, (state.alwaysShowActionbar = alwaysShowActionbar(state)))) changed.alwaysShowActionbar = true; if (this._differs(state.alwaysHideActionbar, (state.alwaysHideActionbar = alwaysHideActionbar(state)))) changed.alwaysHideActionbar = true; } }; customElements.define("kin-view", App$1); /* components/circles/app/App.html generated by Svelte v2.16.1 */ function data$3() { return { dir: 'ltr', csscls: '', state: '', } } function oncreate$3() { this.set({ dir: document.body.dir }); } function create_main_fragment$3(component, ctx) { var div5, div0, text0, div1, text1, div2, text2, div3, text3, div4, div5_class_value; return { c() { div5 = createElement("div"); div0 = createElement("div"); text0 = createText("\n\t"); div1 = createElement("div"); text1 = createText("\n\t"); div2 = createElement("div"); text2 = createText("\n\t"); div3 = createElement("div"); text3 = createText("\n\t"); div4 = createElement("div"); this.c = noop; div5.className = div5_class_value = "kin_circles " + (ctx.dir != 'ltr' ? '-' + ctx.dir : '') + " " + (ctx.state ? '-' + ctx.state : ''); }, m(target, anchor) { insert(target, div5, anchor); append(div5, div0); append(div5, text0); append(div5, div1); append(div5, text1); append(div5, div2); append(div5, text2); append(div5, div3); append(div5, text3); append(div5, div4); }, p(changed, ctx) { if ((changed.dir || changed.state) && div5_class_value !== (div5_class_value = "kin_circles " + (ctx.dir != 'ltr' ? '-' + ctx.dir : '') + " " + (ctx.state ? '-' + ctx.state : ''))) { div5.className = div5_class_value; } }, d(detach) { if (detach) { detachNode(div5); } } }; } class App$2 extends HTMLElement { constructor(options = {}) { super(); init(this, options); this._state = assign(data$3(), options.data); this._intro = true; this.attachShadow({ mode: 'open' }); this.shadowRoot.innerHTML = `<style>*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.kin_circles{position:fixed;z-index:-1;opacity:0;width:65.6rem;height:65.6rem;left:calc(var(--navbar-width-visible) * 0.5 + 50%);top:calc(50% + 2.4rem);margin:-32.8rem;transition:all 0.3s;display:var(--circles);pointer-events:none;transform:scale(0), opacity;will-change:transform, left, top, opacity}.kin_circles div{width:11.2rem;height:11.2rem;border-radius:150rem;box-shadow:0 20px 60px 0 rgba(0,0,0,0.12), inset 0 0px 110px 0 rgba(152,221,255,0.3);border:solid 1px #53a0fe;position:absolute;opacity:0.4;margin:27.2rem}.kin_circles div:nth-child(2){width:22.4rem;height:22.4rem;opacity:0.32;margin:21.6rem}.kin_circles div:nth-child(3){width:35.2rem;height:35.2rem;opacity:0.32;margin:15.2rem}.kin_circles div:nth-child(4){width:49.6rem;height:49.6rem;opacity:0.2;margin:8rem}.kin_circles div:nth-child(5){width:65.6rem;height:65.6rem;opacity:0.12;margin:0}.kin_circles.-center{opacity:0.15;transform:scale(2.2);left:50%;top:50%;transition-delay:0.6s}.kin_circles.-landing-page{opacity:0.3;left:100%;top:90%;transform:scale(2.2);transition-delay:0.6s}.kin_circles.-map-fetch,.kin_circles.-map{transform:scale(1);opacity:1;transition-delay:0.6s}.kin_circles.-map-fetch div:nth-child(5):after,.kin_circles.-center-fetch div:nth-child(4):after{content:'';position:absolute;display:block;box-shadow:inset 0 0 20rem 0 #fff;border-radius:100%;opacity:1;width:100%;height:100%;animation:fetching 4s ease-in-out 0.3s 10;z-index:5;transform:scale(0);transition-delay:0.6s;will-change:transform, opacity}.kin_circles.-center-fetch{opacity:0.3;transform:scale(2.2);left:50%;top:50%;transition-delay:0.6s}.kin_circles.-center-fetch div:nth-child(4):after{animation-iteration-count:20}.kin_circles.-rtl{left:auto;right:calc(var(--navbar-width-visible) * 0.5 + 50%)}@-moz-keyframes fetching{0%{transform:scale(0);opacity:1}30%{transform:scale(2.2);opacity:1}50%{transform:scale(2.2);opacity:0}100%{opacity:0;transform:scale(2.2)}}@-webkit-keyframes fetching{0%{transform:scale(0);opacity:1}30%{transform:scale(2.2);opacity:1}50%{transform:scale(2.2);opacity:0}100%{opacity:0;transform:scale(2.2)}}@-o-keyframes fetching{0%{transform:scale(0);opacity:1}30%{transform:scale(2.2);opacity:1}50%{transform:scale(2.2);opacity:0}100%{opacity:0;transform:scale(2.2)}}@keyframes fetching{0%{transform:scale(0);opacity:1}30%{transform:scale(2.2);opacity:1}50%{transform:scale(2.2);opacity:0}100%{opacity:0;transform:scale(2.2)}}</style>`; this._fragment = create_main_fragment$3(this, this._state); this.root._oncreate.push(() => { oncreate$3.call(this); this.fire("update", { changed: assignTrue({}, this._state), current: this._state }); }); this._fragment.c(); this._fragment.m(this.shadowRoot, null); if (options.target) this._mount(options.target, options.anchor); } static get observedAttributes() { return ["csscls","state"]; } get csscls() { return this.get().csscls; } set csscls(value) { this.set({ csscls: value }); } get state() { return this.get().state; } set state(value) { this.set({ state: value }); } attributeChangedCallback(attr, oldValue, newValue) { this.set({ [attr]: newValue }); } connectedCallback() { flush(this); } } assign(App$2.prototype, proto); assign(App$2.prototype, { _mount(target, anchor) { target.insertBefore(this, anchor); } }); customElements.define("kin-circles", App$2); /* components/progress/app/Progress.svelte generated by Svelte v2.16.1 */ function data$4() { return { dir: 'ltr', percentage: 0, size: null, // small|large dotted: false, // Dotted style for AVG/Avast scan progress csscls: '', asymptotic: false, // progress slowly moves to 100%, but never reaches it. Using for fake progresses progresslabel: false, // Show label with progress inheritcolors: false, customcolor: null } } var methods$3 = { clearAsymptoticProgress() { if (this.fakeProgessInterval) { clearInterval(this.fakeProgessInterval); this.fakeProgessInterval = undefined; } }, startAsymptoticProgress() { console.log('start asymptotic'); let step = 0.5; const {percentage} = this.get(); let currentProgress = parseInt(percentage); this.fakeProgessInterval = setInterval(() => { currentProgress += step; const progress = Math.round(Math.atan(currentProgress) / (Math.PI / 2) * 100 * 1000) / 1000; if (progress >= 100) { this.clearAsymptoticProgress(); } else if (progress >= 70) { step = 0.1; } this.set({percentage: progress}); }, 100); } }; function oncreate$4() { this.set({dir: document.body.dir}); } function ondestroy$2() { this.clearAsymptoticProgress(); } function onstate({changed, current, previous}) { // Observe if percentage comes as param with value 100, // If so, end the progress if (changed.asymptotic) { const {asymptotic} = this.get(); if (asymptotic === true || asymptotic === 'true') { // Svelte vs Ractive this.startAsymptoticProgress(); } else { this.clearAsymptoticProgress(); } } if (changed.percentage) { const {percentage} = this.get(); if (parseInt(percentage) >= 100) { this.clearAsymptoticProgress(); } } } function create_main_fragment$4(component, ctx) { var div, div_class_value, text, if_block1_anchor; function select_block_type(ctx) { if (ctx.dotted) return create_if_block_1$3; return create_else_block$3; } var current_block_type = select_block_type(ctx); var if_block0 = current_block_type(component, ctx); var if_block1 = (!ctx.dotted && ctx.progresslabel) && create_if_block$3(component, ctx); return { c() { div = createElement("div"); if_block0.c(); text = createText("\n\n"); if (if_block1) if_block1.c(); if_block1_anchor = createComment(); this.c = noop; div.className = div_class_value = "kin_progress " + (ctx.dir != 'ltr' ? '-' + ctx.dir : '') + " " + ctx.csscls + " " + (ctx.size ? '-' + ctx.size + ' size' : ''); toggleClass(div, "-unknown", !(ctx.percentage >= 0)); toggleClass(div, "-inherit", ctx.inheritcolors); toggleClass(div, "-dotted", ctx.dotted); }, m(target, anchor) { insert(target, div, anchor); if_block0.m(div, null); insert(target, text, anchor); if (if_block1) if_block1.m(target, anchor); insert(target, if_block1_anchor, anchor); }, p(changed, ctx) { if (current_block_type === (current_block_type = select_block_type(ctx)) && if_block0) { if_block0.p(changed, ctx); } else { if_block0.d(1); if_block0 = current_block_type(component, ctx); if_block0.c(); if_block0.m(div, null); } if ((changed.dir || changed.csscls || changed.size) && div_class_value !== (div_class_value = "kin_progress " + (ctx.dir != 'ltr' ? '-' + ctx.dir : '') + " " + ctx.csscls + " " + (ctx.size ? '-' + ctx.size + ' size' : ''))) { div.className = div_class_value; } if ((changed.dir || changed.csscls || changed.size || changed.percentage)) { toggleClass(div, "-unknown", !(ctx.percentage >= 0)); } if ((changed.dir || changed.csscls || changed.size || changed.inheritcolors)) { toggleClass(div, "-inherit", ctx.inheritcolors); } if ((changed.dir || changed.csscls || changed.size || changed.dotted)) { toggleClass(div, "-dotted", ctx.dotted); } if (!ctx.dotted && ctx.progresslabel) { if (if_block1) { if_block1.p(changed, ctx); } else { if_block1 = create_if_block$3(component, ctx); if_block1.c(); if_block1.m(if_block1_anchor.parentNode, if_block1_anchor); } } else if (if_block1) { if_block1.d(1); if_block1 = null; } }, d(detach) { if (detach) { detachNode(div); } if_block0.d(); if (detach) { detachNode(text); } if (if_block1) if_block1.d(detach); if (detach) { detachNode(if_block1_anchor); } } }; } // (19:1) {:else} function create_else_block$3(component, ctx) { var div, div_style_value; return { c() { div = createElement("div"); div.className = "kin_progress__bar"; div.style.cssText = div_style_value = "" + (ctx.percentage >= 0 ? 'width:' + ctx.percentage + '%;' : '') + (ctx.customcolor ? 'background-color:' + ctx.customcolor + ';' : ''); }, m(target, anchor) { insert(target, div, anchor); }, p(changed, ctx) { if ((changed.percentage || changed.customcolor) && div_style_value !== (div_style_value = "" + (ctx.percentage >= 0 ? 'width:' + ctx.percentage + '%;' : '') + (ctx.customcolor ? 'background-color:' + ctx.customcolor + ';' : ''))) { div.style.cssText = div_style_value; } }, d(detach) { if (detach) { detachNode(div); } } }; } // (7:1) {#if dotted} function create_if_block_1$3(component, ctx) { var div0, div0_class_value, text0, div4, div1, text1, div2, div2_style_value, text2, div3, div3_style_value, text3, div5, div5_class_value, text4, div6, text5_value = ctx.Math.floor(ctx.percentage), text5, text6; return { c() { div0 = createElement("div"); text0 = createText("\n\n\t\t"); div4 = createElement("div"); div1 = createElement("div"); text1 = createText("\n\t\t\t"); div2 = createElement("div"); text2 = createText("\n\t\t\t"); div3 = createElement("div"); text3 = createText("\n\n\t\t"); div5 = createElement("div"); text4 = createText("\n\n\t\t"); div6 = createElement("div"); text5 = createText(text5_value); text6 = createText("%"); div0.className = div0_class_value = "kin_progress__circle " + (ctx.percentage == 0 ? '' : '-green'); div1.className = "kin_progress__dots"; div2.className = "kin_progress__bar"; div2.style.cssText = div2_style_value = ctx.percentage >= 0 ? 'width:' + ctx.percentage + '%' : ''; div3.className = "kin_progress__droplet"; div3.style.cssText = div3_style_value = ctx.percentage > 0 && ctx.percentage < 100 ? 'left:' + ctx.percentage + '%' : 'opacity: 0'; div4.className = "kin_progress__wrap"; div5.className = div5_class_value = "kin_progress__circle -end -" + (ctx.percentage == 100 ? 'green' : 'grey'); div6.className = "kin_progress__percentage"; }, m(target, anchor) { insert(target, div0, anchor); insert(target, text0, anchor); insert(target, div4, anchor); append(div4, div1); append(div4, text1); append(div4, div2); append(div4, text2); append(div4, div3); insert(target, text3, anchor); insert(target, div5, anchor); insert(target, text4, anchor); insert(target, div6, anchor); append(div6, text5); append(div6, text6); }, p(changed, ctx) { if ((changed.percentage) && div0_class_value !== (div0_class_value = "kin_progress__circle " + (ctx.percentage == 0 ? '' : '-green'))) { div0.className = div0_class_value; } if ((changed.percentage) && div2_style_value !== (div2_style_value = ctx.percentage >= 0 ? 'width:' + ctx.percentage + '%' : '')) { div2.style.cssText = div2_style_value; } if ((changed.percentage) && div3_style_value !== (div3_style_value = ctx.percentage > 0 && ctx.percentage < 100 ? 'left:' + ctx.percentage + '%' : 'opacity: 0')) { div3.style.cssText = div3_style_value; } if ((changed.percentage) && div5_class_value !== (div5_class_value = "kin_progress__circle -end -" + (ctx.percentage == 100 ? 'green' : 'grey'))) { div5.className = div5_class_value; } if ((changed.Math || changed.percentage) && text5_value !== (text5_value = ctx.Math.floor(ctx.percentage))) { setData(text5, text5_value); } }, d(detach) { if (detach) { detachNode(div0); detachNode(text0); detachNode(div4); detachNode(text3); detachNode(div5); detachNode(text4); detachNode(div6); } } }; } // (25:0) {#if !dotted && progresslabel} function create_if_block$3(component, ctx) { var div, text0_value = ctx.Math.floor(ctx.percentage), text0, text1; return { c() { div = createElement("div"); text0 = createText(text0_value); text1 = createText("%"); div.className = "kin_progress__percentage"; }, m(target, anchor) { insert(target, div, anchor); append(div, text0); append(div, text1); }, p(changed, ctx) { if ((changed.Math || changed.percentage) && text0_value !== (text0_value = ctx.Math.floor(ctx.percentage))) { setData(text0, text0_value); } }, d(detach) { if (detach) { detachNode(div); } } }; } class Progress extends HTMLElement { constructor(options = {}) { super(); init(this, options); this._state = assign(assign({ Math : Math }, data$4()), options.data); this._intro = true; this._handlers.state = [onstate]; this._handlers.destroy = [ondestroy$2]; this.attachShadow({ mode: 'open' }); this.shadowRoot.innerHTML = `<style>.kin_progress{height:0.4rem;display:block;width:100%;position:relative;margin:0;overflow:hidden}.kin_progress::before{content:'';position:absolute;top:0;right:0;bottom:0;left:0;background-color:currentColor;border-radius:var(--progress-radius);opacity:0.18}.kin_progress__percentage{width:100%;padding-top:0.5rem;text-align:end;direction:ltr;color:var(--color-text-secondary);height:2.5rem;margin-bottom:-2.5rem;box-sizing:border-box}.kin_progress__bar{position:absolute;width:0%;height:100%;left:0;background-color:var(--progress-color);transition:width 0.5s ease-out;border-radius:var(--progress-radius)}.kin_progress.-ok .kin_progress__bar{background-color:var(--color-ok)}.kin_progress.-critical .kin_progress__bar{background-color:var(--color-critical)}.kin_progress.-attention .kin_progress__bar{background-color:var(--color-attention)}.kin_progress.-inherit .kin_progress__bar{background-color:currentColor}.kin_progress.-unknown .kin_progress__bar{width:50%;left:0;animation:progress 2.5s linear infinite}.kin_progress.-small{height:0.2rem}.kin_progress.-large{height:0.6rem}.kin_progress.-dotted{padding-top:0.4rem;background-color:inherit;overflow:visible}.kin_progress.-dotted::before{display:none}.kin_progress.-dotted .kin_progress__wrap{margin-right:2.5rem;margin-left:2.5rem;position:relative}.kin_progress.-dotted .kin_progress__bar{height:0.2rem}.kin_progress.-dotted .kin_progress__percentage{width:100%;padding-top:0.8rem;position:absolute;text-align:end;direction:ltr}.kin_progress.-dotted .kin_progress__circle{background-color:var(--progress-color);width:1rem;height:1rem;left:0;top:0;position:absolute;border-radius:7rem;opacity:0.18;background-color:currentColor}.kin_progress.-dotted .kin_progress__circle.-end{right:0;left:auto}.kin_progress.-dotted .kin_progress__circle.-green{background-color:var(--progress-color);opacity:1}.kin_progress.-dotted .kin_progress__droplet{background-color:var(--progress-color);width:1rem;height:1rem;left:0;position:absolute;margin-top:-0.4rem;border-radius:7rem;border-radius:0 7rem 7rem;transform:rotate(-45deg);margin-left:0.1rem;opacity:1;transition:left 0.5s ease-out}.kin_progress.-dotted .kin_progress__dots{background-attachment:fixed;position:absolute;width:100%;background-color:inherit;border-top:dotted currentColor 0.2rem;opacity:0.18}.kin_progress.-rtl{transform:scaleX(-1)}.kin_progress.-rtl.-dotted .kin_progress__percentage{transform:scaleX(-1)}@-moz-keyframes progress{0%{transform:translateX(100%)}50%{transform:translateX(0%)}100%{transform:translateX(100%)}}@-webkit-keyframes progress{0%{transform:translateX(100%)}50%{transform:translateX(0%)}100%{transform:translateX(100%)}}@-o-keyframes progress{0%{transform:translateX(100%)}50%{transform:translateX(0%)}100%{transform:translateX(100%)}}@keyframes progress{0%{transform:translateX(100%)}50%{transform:translateX(0%)}100%{transform:translateX(100%)}}</style>`; onstate.call(this, { changed: assignTrue({}, this._state), current: this._state }); this._fragment = create_main_fragment$4(this, this._state); this.root._oncreate.push(() => { oncreate$4.call(this); this.fire("update", { changed: assignTrue({}, this._state), current: this._state }); }); this._fragment.c(); this._fragment.m(this.shadowRoot, null); if (options.target) this._mount(options.target, options.anchor); } static get observedAttributes() { return ["percentage","size","dotted","csscls","asymptotic","progresslabel","inheritcolors","customcolor"]; } get percentage() { return this.get().percentage; } set percentage(value) { this.set({ percentage: value }); } get size() { return this.get().size; } set size(value) { this.set({ size: value }); } get dotted() { return this.get().dotted; } set dotted(value) { this.set({ dotted: value }); } get csscls() { return this.get().csscls; } set csscls(value) { this.set({ csscls: value }); } get asymptotic() { return this.get().asymptotic; } set asymptotic(value) { this.set({ asymptotic: value }); } get progresslabel() { return this.get().progresslabel; } set progresslabel(value) { this.set({ progresslabel: value }); } get inheritcolors() { return this.get().inheritcolors; } set inheritcolors(value) { this.set({ inheritcolors: value }); } get customcolor() { return this.get().customcolor; } set customcolor(value) { this.set({ customcolor: value }); } attributeChangedCallback(attr, oldValue, newValue) { this.set({ [attr]: newValue }); } connectedCallback() { flush(this); } } assign(Progress.prototype, proto); assign(Progress.prototype, methods$3); assign(Progress.prototype, { _mount(target, anchor) { target.insertBefore(this, anchor); } }); customElements.define("kin-progress", Progress); /* components/icon/app/App.html generated by Svelte v2.16.1 */ function data$5() { return { dir: 'ltr', name: '', size: '48', width: '', csscls: '', title: '', rtlflip: '', } } var methods$4 = { setDir() { this.set({ dir: document.body.getAttribute('dir') }); } }; function oncreate$5() { this.setDir(); this.dirObserver = new MutationObserver(() => this.setDir()); this.dirObserver.observe(document.body, {attributes: true, attributeFilter: ['dir']}); } function ondestroy$3() { this.dirObserver.disconnect(); } function create_main_fragment$5(component, ctx) { var svg, use, use_xlink_href_value, svg_class_value; return { c() { svg = createSvgElement("svg"); use = createSvgElement("use"); this.c = noop; setXlinkAttribute(use, "xlink:href", use_xlink_href_value = "SvgInline.svg#" + ctx.name); setStyle(svg, "height", "" + ctx.size + "px"); setStyle(svg, "width", "" + (ctx.width ? ctx.width : ctx.size) + "px"); setAttribute(svg, "class", svg_class_value = "kin_icon " + (ctx.dir != 'ltr' ? '-' + ctx.dir : '') + " " + (ctx.rtlflip == 'true' ? '-flip' : '') + " " + ctx.csscls + " " + (ctx.size < 30 ? '-small' : '') + " " + (ctx.size > 60 ? '-large' : '')); setAttribute(svg, "xmlns", "http://www.w3.org/2000/svg"); setAttribute(svg, "xmlns:xlink", "http://www.w3.org/1999/xlink"); }, m(target, anchor) { insert(target, svg, anchor); append(svg, use); }, p(changed, ctx) { if ((changed.name) && use_xlink_href_value !== (use_xlink_href_value = "SvgInline.svg#" + ctx.name)) { setXlinkAttribute(use, "xlink:href", use_xlink_href_value); } if (changed.size) { setStyle(svg, "height", "" + ctx.size + "px"); } if (changed.width || changed.size) { setStyle(svg, "width", "" + (ctx.width ? ctx.width : ctx.size) + "px"); } if ((changed.dir || changed.rtlflip || changed.csscls || changed.size) && svg_class_value !== (svg_class_value = "kin_icon " + (ctx.dir != 'ltr' ? '-' + ctx.dir : '') + " " + (ctx.rtlflip == 'true' ? '-flip' : '') + " " + ctx.csscls + " " + (ctx.size < 30 ? '-small' : '') + " " + (ctx.size > 60 ? '-large' : ''))) { setAttribute(svg, "class", svg_class_value); } }, d(detach) { if (detach) { detachNode(svg); } } }; } class App$3 extends HTMLElement { constructor(options = {}) { super(); init(this, options); this._state = assign(data$5(), options.data); this._intro = true; this._handlers.destroy = [ondestroy$3]; this.attachShadow({ mode: 'open' }); this.shadowRoot.innerHTML = `<style>*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.kin_icon{stroke:currentColor;fill:transparent;stroke-width:var(--icon-stroke);stroke-linecap:round;stroke-linejoin:round}.kin_icon.-small{stroke-width:var(--icon-stroke-small)}.kin_icon.-large{stroke-width:var(--icon-stroke-large)}.kin_icon.-flip.-rtl{transform:scaleX(-1)}</style>`; this._fragment = create_main_fragment$5(this, this._state); this.root._oncreate.push(() => { oncreate$5.call(this); this.fire("update", { changed: assignTrue({}, this._state), current: this._state }); }); this._fragment.c(); this._fragment.m(this.shadowRoot, null); if (options.target) this._mount(options.target, options.anchor); } static get observedAttributes() { return ["name","size","width","csscls","title","rtlflip"]; } get name() { return this.get().name; } set name(value) { this.set({ name: value }); } get size() { return this.get().size; } set size(value) { this.set({ size: value }); } get width() { return this.get().width; } set width(value) { this.set({ width: value }); } get csscls() { return this.get().csscls; } set csscls(value) { this.set({ csscls: value }); } get title() { return this.get().title; } set title(value) { this.set({ title: value }); } get rtlflip() { return this.get().rtlflip; } set rtlflip(value) { this.set({ rtlflip: value }); } attributeChangedCallback(attr, oldValue, newValue) { this.set({ [attr]: newValue }); } connectedCallback() { flush(this); } } assign(App$3.prototype, proto); assign(App$3.prototype, methods$4); assign(App$3.prototype, { _mount(target, anchor) { target.insertBefore(this, anchor); } }); customElements.define("kin-icon", App$3); /* components/loading/app/Loading.svelte generated by Svelte v2.16.1 */ function data$6() { return { label: null, inline: false, size: null, // default|small fullscreen: false, inverted: false, } } function create_main_fragment$6(component, ctx) { var div1, div0, div0_class_value, text, div1_class_value; var if_block = (ctx.label) && create_if_block$4(component, ctx); return { c() { div1 = createElement("div"); div0 = createElement("div"); text = createText("\n\t"); if (if_block) if_block.c(); this.c = noop; div0.className = div0_class_value = "kin_loading__spinner " + (ctx.inline ? '-inline' : '') + " " + (ctx.inverted ? '-inverted' : '') + " " + (ctx.size ? '-' + ctx.size : ''); div1.className = div1_class_value = "kin_loading " + (ctx.fullscreen === 'true' ? '-fullscreen' : ''); }, m(target, anchor) { insert(target, div1, anchor); append(div1, div0); append(div1, text); if (if_block) if_block.m(div1, null); }, p(changed, ctx) { if ((changed.inline || changed.inverted || changed.size) && div0_class_value !== (div0_class_value = "kin_loading__spinner " + (ctx.inline ? '-inline' : '') + " " + (ctx.inverted ? '-inverted' : '') + " " + (ctx.size ? '-' + ctx.size : ''))) { div0.className = div0_class_value; } if (ctx.label) { if (if_block) { if_block.p(changed, ctx); } else { if_block = create_if_block$4(component, ctx); if_block.c(); if_block.m(div1, null); } } else if (if_block) { if_block.d(1); if_block = null; } if ((changed.fullscreen) && div1_class_value !== (div1_class_value = "kin_loading " + (ctx.fullscreen === 'true' ? '-fullscreen' : ''))) { div1.className = div1_class_value; } }, d(detach) { if (detach) { detachNode(div1); } if (if_block) if_block.d(); } }; } // (3:1) {#if label} function create_if_block$4(component, ctx) { var span, text; return { c() { span = createElement("span"); text = createText(ctx.label); span.className = "kin_loading__label"; }, m(target, anchor) { insert(target, span, anchor); append(span, text); }, p(changed, ctx) { if (changed.label) { setData(text, ctx.label); } }, d(detach) { if (detach) { detachNode(span); } } }; } class Loading extends HTMLElement { constructor(options = {}) { super(); init(this, options); this._state = assign(data$6(), options.data); this._intro = true; this.attachShadow({ mode: 'open' }); this.shadowRoot.innerHTML = `<style>.kin_loading{display:inline-block;vertical-align:middle;text-align:center}.kin_loading.-fullscreen{display:flex;flex-flow:column;align-items:center;justify-content:center;height:100%}.kin_loading__spinner{width:3rem;height:3rem;background:center center/100% no-repeat;position:relative;flex-shrink:0;margin:0 auto;border-radius:5rem;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAOXRFWHRTb2Z0d2FyZQBBbmltYXRlZCBQTkcgQ3JlYXRvciB2MS42LjIgKHd3dy5waHBjbGFzc2VzLm9yZyl0zchKAAAAOXRFWHRUZWNobmljYWwgaW5mb3JtYXRpb25zADUuNi4yMTsgYnVuZGxlZCAoMi4xLjAgY29tcGF0aWJsZSk8s47IAAAACGFjVEwAAAAIAAAAALk9i9EAAAAaZmNUTAAAAAAAAAAwAAAAMAAAAAAAAAAAAGQD6AAAJAbUsgAABZFJREFUaIHtmsFqW0cYhb8zXIQxJhhjjCkmhFCMCW0JIYtS6Car0kUXJS/QRekD9AlCl32A0kWfoMtu203XXZQQijGhiGBCEMaIIIwQZk4Xd0a5vr5X98qSs+oBoeHqzsz5Z/75/5kzEmuC7QLYSJ9NYCzpbfrtC+AeMAROgaGkyTr6LW5a0TbAwPaOpB3gDlDYDgCSToBswOeSnqaqM2Bs+4XtPyT9CYwkvT8DbG8CB8CupCIZQxuJ2vMBsAc8kfTE9ljS77Z/kfTvslzCksQ3YoxHth/Z3k9usxIkbQNPgd9s/2j7g2Xq9zLAdogx7gMPJe1JCpLmI9tWXhIF8JXtX21/HWPsNTidBiSf/lDSoe1BdhfbdJVvAkm7tn+Q9Mz2xsoGJAyWJbWiEQWlWz3LQaENrT9WFma0fQyc93GbJhe6oTGvgJ8kxaUNSFYf5ikMIVxKOgbOq2T6lKE9OnWQ/07SMPNpm4lrLWeft70PTCW9kHRRaeiBpJ1q6KyUZ7YnKUmNKvUeA58BHwMPgN0F5Ic18oXtI0kz4KQ+GE0G7AOHlUdT4LmkaW4QOAJ2Ku9MgNMU02dtI54GZwf4FPgmGVMd2VfAt1Xy1b5sn4QQ3rQakFzmoe0BXBndizQTU4AYYyHpyPZW6mzU5asNxgyAL4HvKRNbdpt/s7G2HwA7eUBszyT9nXlcMyDGeJQao2YAqdIVdwKKNLU3hu3dZMTPdbfh6ixnjEIIx9cMSNuDxx39TW0/DyFMO95bCjHGEEKIiUeTi9bxVx7IkCoBHPRIUhvA3VVifBMq5ANwZHsR+Stc8wLaSFPZFbNnkoY33Tn2QAFsZR4LPruU2/a5AduSipyEFiSp4ao+vwip7WGdR8OnALarBuz22NtMgNFtka9glPrqwi5ASCt+Kz9tcyHbp8uGypsg9XHa4ULY3rJdFMBmmpK2BgFmtse3Tb6CcXKnwYJ3CmAzUC6GsMiFgMlt+n4DZnS7UQA2CsoINH/a5EK234aw1OFtJUgixviWxbkAkgETypUfgGg7ZF+3nV3o/FYZN0BS7jMAsaW8FmXjf6wCpbR9h+vTVP0+W5cQ1Rcxxq2kN7XC9iSn7rvpwTzr5nL6jrxnf0vk73W8NgyUB5Yr5GsNAdxZ9wZuEVIYv9P1nqRpNmBhhk2ZelFSWTcGkrY6tjfR9jQAF7Yvq4eXGnkoyW+/N/plX4MO5eMSuAipMOlwIYCDGOOtZ7N0JugjL05CCJdZST7rUWFL0iI1YV3Yzf7fsb05g3fb6bGkywUulHE/H/hvAy6ly/s9xLNLYFw1YGr7rMOFoFwL924xIl32yTe2z0jRM7sQkl73qDgFTtd9pKwoHxGYK4BtLiTpdeYwX5RZTWtrnGaVbmV3Sm3MZczkHseS2rTYUXWW6lFlSLkXnyNVvOCqJlRQqmr5omPp6OTyzmEPeATsA58kaScb8Q/Xd8GzxPEdv3rD6SLjMJO3XR/5gor0kUZlQnl5N6ZULtpIw7uccpCUvbp4dk3GrPR1IqldWswjQxJ3m9Q4d4i7yZiJ7VEIIdfbBrYT4a6snme7rsXOgJf1c3njUCUjDoFX1ZF3qRJ3nZIyjiWNUt0rkmUPNMmY1MlDy/1AjgZ18sBOD7VgkbLRJd3k8gbwUWVhxzZFpHXxVbbVoT7yVR9vK7e12SNJ5XIvGbPvNemsL/E15og3lD6/8KVOA1Tekb20/ZbygNEr9jd13LLwr5R5Fyp73Tn0moHU0BvbY9v3VF6FzrN4E5kuoxrKkXKDNlTlAmMtBlQ6mgLHrvzVgPKSo5FYH6SzyBnlFuViqcrc8L8Ski5sn1BO9Q6lIVspZs9npoFsns1L2xNKseCcBcmvk8uNajUg3ZtV/25znvcstvfS84uU2adpu7Ay/gMT3w3X00gIqAAAABpmY1RMAAAAAQAAADAAAAAwAAAAAAAAAAAAZAPoAAC/dT5mAAAFlGZkQVQAAAACaIHtms9qJEcSxn9f0jRiaAYhhBiMMI0xgxgWs5g9G2O8D7AHP4Cfwic/gfHJD7BvsOxpj3ve28KwGDH4IIbBDEIIMTSiaZr8fMhIqbpU1VUatXTaD4oOqvPPF5mRkZGRJXYE2xNgL55nwJWkD/HfYby7BpbAUtJ6F/1OPraibYCp7QNJB8BzYGI7AUh6A3yI4gfAi5AzsLb9AbiMZyXp6RSw/Qw4Bg4lTUIZxpCwnSRNgcOYmbWkC9vvJF3fl8u9FLC9Z3seHdeRHlsXSUhqyxPK7BzlnC8knUla7lQB28n2ETCP0dtAU4k+hfrKNOQk6QjYzzmfSTqXlIe4pTHkgc8lvbQ9reZimyG5p70heQq8BD6v62kbxprQdBupLrTLjyDell9ISrZPt5lpr4aNhZltnwKX1W7j/aDcRH0/9qG427dDa6xTgZi6l7b3AFJKa0mnwOV9R/JjYHsp6X/VK4Xp7o1SoNq87Re2vwiXSWw8v1L8dh/hle1LSW/rJhZ4D7yNuqu6Troe4LpFfmb7F+DH8FgbuDM/tl9QFlHFEnhdXVs0ckLZnCoWwDvbV5J6N6XG5rcPHEuatf7fGPmc80zST7a/iQH8UdI/ehWIafqz7Slw47Mbo7KMhieSTmzPJJ0Bo1xeEznn6jbnodQdswF+sf11Y0DOge8kve9UIOd8Ahzd/HmrAEG+2UECJpJW9yHeRhCdA++aZgP8DHzdUeWfkn64o0DY+l8G+lvafp1SGr1TjkHOmZRS5TEDfgK+6Sm+Bv4WsVZZxDHKxyM2qT3g04d6mTYa5Ke2f95CHkrA+H3lUL3QXsQ3Qy5wFbHKg0n3YCbp1VAhSd8S0W1VYF/SpGMzactnD7X5AWKXMQNDZ4Xntr+CWwUOR8Q2C4oXeFRI+hdwOqLcXwGS7UksHKDfhCJev5er/BjEDP99RNFXOefnCXjWZT4tE1oBV4/Iu43/ABcDZfYlzRPlDJu2mRCweEzb78Alw2Y0sV0UGArEbH94RM9zB2Gq/x1R7nhCWZxnkhKQ48ya4fYYSARwT4x/DxWw/fopiPwf2yDbNadTXWQKufl7IWnxlMQilD7YVsb2YgLMgE/jxY37rHL8ZspaeTIE+flAsbNEObBskG81BGXr3jHFfoQbfz5UTtKyKrB1h42d+k4+6BExlTQbCG+y7WUCrm2vm4eXFnko5PefjH7pazqQ+VgD1ymExYAJARznnAcTTQ9FnPQ+GVF0kVJa1/zmUNwBJVY/fBC7cTis9j8Q3lzAbTh9JWm9xYQqPqsH/sdAnMg+G5E8WxPBZVVgaftiwISgrIX5I3qk9Zj9xvYF4T1vUuSSfh9RcUnJHjyUaLtdgkemRKGXrWTXhizp98rhZlGG5ndOXI3Rbudt0i7MKdq4SWOGeZxK6svFnjdnqe1VzoCNuD8qXrOZE5oAr4AvIwV5b+9kO+Wcj4AvKQf03jRmA6vgeMuv3XDO+Sa1GHtDe+QnwEnEUHVUFsA7ysIaTC1S/PxxZPbaybM7acxGX2+aWblOBdxI7nZl42y/knTQ6LRJYBXKLGyfp5RqvX1gPwgP7ep1ttu52BXwW/tc3jlUocRLSn7+ZuRtnwxFiA2cSjqPuhspyxHoSmPSJg899wPVG7TJAwdN77Dt6cKI1E2V94A/NRZ27suI9C6+Rlid2iPftPE+ua/NEZtUlUelMcfeka3GEt/hHvGeYvNbCw0qoHJH9pvLzfqckWF1V8c9C39D5tZVjrpzGDUD0dB721e255IOGwurk8yQUh1ypgRou7/obnS0BE7d+NSAcsnRSWwM4ixyQeOC4z74qG8lJF3bfkOZ6gOKIrPw2b2fIDTO12vbC0qy4EEfe+xsxcW9WfNzm8sas7h8prBHOf0tJe3sc5s/AOgxC+l3No8nAAAAGmZjVEwAAAADAAAAMAAAADAAAAAAAAAAAABkA+gAAFLj7Y8AAAWaZmRBVAAAAARoge2aP2usRRTGf8+whOUSQgjL5RZBgsgliKCFhZWFlV/A0o9gJWLlB7CwED+A38DSRrGwthARCReLIEEuIVyWsIQlLPNYzMze2TfvvySbVD7wksm78+ecmTPnnHnmFVuC7Qkwzc8TYC7pMv82y++ugCWwlLTaxriTuza0DbBj+0DSAbAHTGwHAEkvgMtc/QB4lssRWNm+BF7l51rS4ylg+wlwCMwkTbIyjBHCdpC0A8zyyqwkXdg+k3R1W1lupYDtqe2jPHCZ6bFtkYSkZnlCWp2nMcYLSaeSlltVwHaw/RQ4yrO3gVqJLoW66lTlIOkpsB9jPJV0LikOyRbGCA+8Jem57Z1iLrYZKnf0N1TeAZ4Db5X91IexJrTTJ1QbmvVHCN4sP5MUbJ/0mWmnhtXGjLZPgFfFbvP7wXKN8n7sQ3K3/wztsVYF8tI9tz0FCCGsJJ0Ar247k3eB7aWkP4tXynuwVdYb6hWbt/2MFHCaHb0t6aB2nVX52vZC0gI4r9rtkWLBLrBr+4YjWAuU2vxVtZ3YPpZ0DbxorkibAs9Im6hgCfxRXFt2e8dZoIIFcGZ7LqkzKFXBbx84lLTb+L05YRtj2X4RQnjZqUA2mffKDFWze5U7XgLEGCeSjm3vSjolzfagy6sRYyxu8ygr1brawEGZENvXkn6v44QanR4DT9c/bprHEtgYAJjkpb0z8mQdAWdNs2FzlQvOQwgnNxTI6cH7A+Mtbf8RQhgdKccgxkgIocjRZqJN/FaUDbkRwOGIIDUF3rivl2miEj4Ax7b7hN+Qtbimac5vhlzgdc5V7iVwDyYkT7WeuI5nRkrb1wrsS5q0BJNm+fS+Nt+H3PfpiEA3AfZrBWYjcpsFcP5Qwlc4z2MNYQYQ8o5f++MuE8r5+q1c5V2QxzgbMCFs79qeTIAneUm6OgS4tj1/aOErzLM5dUZs0n55EkibIfSZELB4SNtvwTXDZhSA6YTkgdZv20zI9mVxdY8BScQYL+mPBZAVWJB2fgBiPrNGeH0MJB28HxWSypiBRAS0lcds9v/xoFAO23vcXKb670XO8R8NORP9qDJjWsq/l9D9RkeF8jfy+Pb2EfBZH5th+9tAOrBsCF8jv9vbdgLXh5zUvTui6llRoDfC5kjdF1S2jQPg7Tx2LUddZwWcBuDK9qo+vNQox0By8vRI+ICc6/SQZnNJ/wQllngxYEIAhzHGB49mMcYd4NOherb/kjQv/ObFiL53Jc3uK+AQJH1s+53yf5cJSfoJXqfTc0mrHhMqeLOPErkvMlvxRZ1cdpjQJfArvFZgaftiwIQg7YWjB/RIS+BksBb8DLyEiiKX9O9QK9tLEntwHyHb+iXLsbT9OfBL87dStr0Cvi8yrDdlYdO6Oqedpbu3OeU+ahrzEviSbCJNE5L0o9LtT3rX6GwKvEdmo6vGN+g+EvWxC5xyB2IrT8BM0psk02zyTlPgO+DDqs25pE8krdm5G7YQY1xTizk2tNJ9hfrISi6AM2BOz31XI6YcZmavSZ6tacwY456kr0k50UrSV5J+qPvsJXfb2DgPkLtZmYXt8xBCabcP7GeBh6L6VR6zpDh7wDfABfCVGrebrVOVlXhO4uebLPHQKangRNJ5brtBWY5AmzmVFdpAO+ee7PmkjascwRb0MRtD1E0pT4F3asHbhO9UIDcqHYbmzPeluH3oIczayqNozLF3ZNdjBd9ijHgJ/D3U36ACSndkfzvdrB8xMq1uG7hj42+USZN1ykjXPGoFckcvbc9tH0ma+fUnBa3CDCnVUo4kT7P9i+5qoCVw4upTA9IlR6tgY5D9+wXVBcdtcKdvJSRd2X5BWuoDkiK7Och1foJQna9XthcksuBeH3tsbcfle7P6c5tXhclw+kxhSjr9LbNb3MrnNv8BdhoTnef+UwsAAAAaZmNUTAAAAAUAAAAwAAAAMAAAAAAAAAAAAGQD6AAAvymf9QAABaJmZEFUAAAABmiB7ZrPamRFFMZ/X9GEMDQhhCYEGUIYhhAGBBER8RlExBdw4UJ8DBcuXIlLF/MMigtXunHtQoZhCEGGMIRhCGEIoQlN09Tnoqp6bm7uv/xd+cGlD7dvVZ1TdeqcU9+94pZgewSs5usBcCrpLP83yffOgRkwk7S4jXFH121oG2DF9oakDWANGNkOAJIOgLP8+AawleUILGyfAW/zNZd0fwbYfgA8BCaSRtkYhihhO0haASZ5ZRaSTmwfSTq/qi5XMsD2qu2dPHCZ6aFtkYSkujwirc5mjPFE0qGk2a0aYDvY3gR28uxdQNWINoPanqnIQdImsB5jPJR0LCn26RaGKA88lrRre6W4i2365Jb++uQVYBd4XPZTF4a60EqXUk2oPz9A8bq8JSnY3u9y01YLKxsz2t4H3ha/zfd75SrK/aEXKdy+6ttjjQbkpdu1vQoQQlhI2gfeXnUmrwPbM0nPS1TKe7BR10vmFZ+3vUVKOPWOnkjaqIbOijy3PZU0BY4r7dZIuWAMjG1fCgRLhVKbF5W2I9t7kubAQX1FmgzYIm2ighnwrIS2HPb2skIFU+DI9qmk1qRUSX7rwENJ49r/9Qm7MJbtgxDCm1YDsst8UGaoMrvnueMZQIxxJGnP9ljSIWm2e0NeFTHGEjZ3slGNqw1slAmxPZf0TzVPqNbpHrC5/POie8yACwMAo7y010aerB3gqO42XFzlguMQwv4lA3J58FHPeDPbz0IIgzPlEMQYCSEUPZpctI6/i7EhNwJ4OCBJrQLbN40ydVSUD8Ce7S7lL+haQtNqrm/6QuA81yo3UrgDI1KkWk5cyzUhle1LA9YljRqSSV0+vKnPdyH3fTgg0Y2A9aoBkwG1zRQ4vivlKzjOY/VhAhDyjl/G4zYXyvX6lULldZDHOOpxIWyPbY9GwIO8JG0dAsxtn9618hWcZndqzdik/fIgkDZD6HIhYHqXvt+AOf1uFIDVESkCLe82uZDtsxLq7gOSiDGe0Z0LIBswJe38AMR8Zo3w7hhIOnjfKySVMQOJCGiSh2z2/3GnUE7ba1xepurvSa7x7w0xxnHmm1phe1pS93a+scy6Rc6/kXv2t6z8Ts9jh4F0YLmgfK0jgLXbLuC6kMP4Wt9zkmbFgM4MmzN1V1K5baxIGveUN9H2LADnthfVw0tNeUjKr9+b+mmslR7mYwGchyxMe1wI4GGM8c6zWT4TvDfg0WkIYVH4zZMBDcaSJjfSbhgmxf97ypsTeFdOn0padLhQwaMuSuSmcKIuHw0gzxbAadWAme2THheCtBd27jAiLYbkG9sn5Oi5pMglvR7QcEZiD26qaL3fokcElgxgmwtJel10WG7KwqY1dF7EJt7mxu6Uz7ff297OeiyAfUltXOxxdZXqUeWQVIsvkRuec5ETGgFPgA9tb3kADV5HjHHF9ufAL8CXwFPbjypGvOByFTzPOr7Tr6HjJbWYc0Mj3VeojzwrU+CItLG6qMVAivGfAl858ayj/B+SXgFf59+msQ4ktVOLlUEeO/Hzl9g495C72Zip7eMQQmn3MfAJ8D5p5brC8Uvgm7oRpNn/t34ub5yqbMQuiZ+vs8R9p6SCfUnHue0PwBcD2wG8yka8rOhDXXloeT9QokETVzmALegkx9qOrzV5G/i5srFjGyPSuvkqZXWoz3zVx9vkvn4HyNvAt30BYug7svkVB78RcnH5G/BdHxfVa4DSO7J/nd6s7zCwrO6IRJcOTTX5RNKPwK8a8DnCoBXIs/DG9qntHUmTysaqRqE+crhr5RbA77Z/CiEcDdFrsAGVQWbAviufGpBecjQqNRCnwB/A0xJ1roJrfSsh6dz2ASkrbpAMGeeY3fcJwpyk9HPgT+AvUnlwHVWa88B1kN+bVT+3eVtqFtufkaLKSyeS+PC2WI7/ABP1FhWfu7zqAAAAGmZjVEwAAAAHAAAAMAAAADAAAAAAAAAAAABkA+gAAFK/TBwAAAWZZmRBVAAAAAhoge2azWocRxSFv1MMgzCDEEIIE4QRxhgRTAgh6xCSdSC7PEnIIvgJjBfBT5B9CImfIWQVgnGMESIEEYQxQhghBjEMQ50sqmrc0+qebmkkrXKgUamnq+reqvtXp1tcE2wPgLV83QFOJZ3l37byvXNgAkwkza5j3sFVO9oGGNrelLQJrAMD2wFA0gFwlh/fBO7mdgRmts+Ad/maSro9BWzfAXaALUmDrAx9hLAdJA2BrbwzM0knto8knV9WlkspYHvN9m6euKx0375IQlK9PSDtznaM8UTSoaTJtSpgO9jeBnbz6i2gqkSbQm3PVNpB0jawEWM8lHQsKXbJFvoIDzyQ9ND2sJiLbbraLeN1tYfAQ+BB8adl6GtCw2VCNaH+fA/B6+27koLt/WVm2qphxTGj7X3gXbHbfL+zXUW53/cihdt/u3ysUYG8dQ9trwGEEGaS9oF3l13Jq8D2RNKrEpWyDzbKekG9YvO275ISTn2gDyVtVkNnpT21PZY0Bo4r/dZJuWAEjGxfCARzgVKf15W+A9t7kqbAQX1HmhS4S3KiggnwsoS2HPb2skAFY+DI9qmk1qRUSX4bwI6kUe33+oItzGX7IITwtlWBbDIflxWqrO55HngCEGMcSNqzPZJ0SFrtzpBXRYyxhM3drFTjbgObZUFsTyW9qOYJ1QbdA7bnPy6axwRYmAAY5K29MvJi7QJHdbNhcZcLjkMI+xcUyOXBpx3zTWy/DCH0zpR9EGMkhFDkaDLROv4oyobcCWCnR5JaA+6tGmXqqAgfgD3by4RfkLWEprVc33SFwGmuVVYSeAkGpEg1X7iWa4tUts8V2JA0aEgm9fbhqja/DHnswx6JbgBsVBXY6lHbjIHjmxK+guM8Vxe2AEL2+Hk8bjOhXK9fKlReBXmOow4TwvbI9mAA3Mlb0jYgwNT26U0LX8FpNqfWjE3ylzuB5AxhmQkB45u0/QZM6TajAKwNSBFofrfJhGyflVB3G5BEjPGM5bkAsgJjkucHIOYza4T3x0DSwftWIanMGUhEQFO7j7P/jxuFctpe5+I2Vf+e5Br/1hBjHGW+qRW2xyV138s35lm3tPPfyC3bWxZ+t+Oxw0A6sCwIXxsIYP26C7hlyGF8ves5SZOiwNIMmzP1sqRy3RhKGnWUN9H2JADntmfVw0tNeEjCb9ya+GmuYQfzMQPOQ26MO0wIYCfGeOPZLJ8JPujx6DiEMCv85kmPDiNJWytJ1w9bxf47ypsTeF9On0qaLTGhgvvLKJFV4URd3u9Bns2A06oCE9snHSYEyRd2bzAizfrkG9sn5Og5p8glvenRcUJiD1YVtD4uWY4IzBnANhOS9KbIMHfKwqa1Dc5Flm7Y4/DdR/ghFRozm8e+pDYu9ri6S/WockiqxefIHc9Z5IRGtp8Bv9r+OsZ4ab+wHWKM28AnpBccH2VqpyjxmotV8DTL+F6++sAxxjm1mHNDfeVHwBPgi/z/TNJr4Efgd1JAaEyMtZyyk5m9Onl2gcYsOy3pQFI7tVhWhkzuNrBxQ+AZ8HmTgMCJ7deS/gKeZ9oRJy50IwvcldXLbte52Cnwd31xGr0xK/GQxM+fQ6oOgaeS2oSvj/FdCOGX3F6gLHugicakaWebOfccDapmI+lJX+Hb0IO6Ke014FHFsWObWbaWBpWyegg8tf3FKsKXMXskqdLuRWP2qW0C6fXStbxZvwTekmx+6UOdCmRnemz7Mbn+uCr6mBDJWQ9ocNgm9KouJc1CCD8D3wDPgSvtRofZRFIifSHpbV8W8FLlsaQjSd8CXwE/kQuqVWB7RjKXPyXt6xJv6eGK30pI+ifG+D3wA/CZpC9tP5K0wZIYXzlfz2yPSWTBSh97XFtVljP0LukjkF3gN0mv8m/bpKhynjP7tX1u8x8ys/uFEISCdwAAABpmY1RMAAAACQAAADAAAAAwAAAAAAAAAAAAZAPoAAC/zH1AAAAFjGZkQVQAAAAKaIHtms9qZEUUxn9f0YQQmiGEJgQJEoZhCLPQWbhw4RO49AVciStX4gPIPIS48gHcu1FcuHYhgwwhDNIMQYYQQghNaJrmfi6qbqf69v3XSScrP2hSubf+nHPq1Dl1vyqxIdgeANvptwNcSbpO70bp2Q0wBaaS5psYd3DXhrYBtmzvSdoDngAD2wFA0ilwnarvAQepXABz29fAZfrNJD2eArZ3gENgJGmQlKGPELaDpC1glGZmLunC9pmkm3VlWUsB29u2j9LApaX7tkUSkqrlAXF29ouiuJA0ljTdqAK2g+194ChZbwm5Ek0KNdXJykHSPrBbFMVY0rmkoku20Ed44Jmk57a3SnexTVe5ob+u8hbwHHhWrqc29HWhrTah6lCt30PwavlAUrB90uamjRpmC7OwfQJcln6bnneWc5TP+/6I4fZd1xqrVSBN3XPb2wAhhLmkE+ByXUveBbankv4uo1Jag7WyrqhX+rztA2LCqXb0QtJeHjqz8sz2RNIEOM/aPSHmgiEwtL0SCBYCxTZvsrYD28eSZsBpdUbqFDggLqISU+B1GdpS2DtOApWYAGe2ryQ1JqUs+e0Ch5KGlfdVgy2NZfs0hPC+UYHkMi9LC2XWvUkdTwGKohhIOrY9lDQmWrsz5OUoiqIMm0dJqdrZBvZKg9ieSforzxOqdHoM7C9eLrvHFFgaABikqb0zkrGOgLOq27A8yyXOQwgnKwqk7cEnHeNNbb8OIfTOlH1QFAUhhFKOOhet4s9S2ZAaARz2SFLbwIf3jTJVZMIH4Nh2m/BLspahaTvtb7pC4CztVe4lcAsGxEi1MFzDb0Tcti8U2JU0qEkm1fL4vj7fhtT3uEeiGwC7uQKjHnubCXD+UMJnOE9jdWEEENKKX8TjJhdK+/W1QuVdkMY463AhbA9tDwbATpqSpg4BZravHlr4DFfJnRozNnG97ATiYghtLgRMHtL3azCj240CsD0gRqDF0zoXsn1dhrrHgCSKorimPRdAUmBCXPkBKNI3awG3n4HED+9HhaRyzEAkAurKfRb7/3hQyPZnwMvqi9J90t/fJb15TMGKohgmvqkRticD2x9J+qb6Ms/ECY+qQBL+qKPaOABnPfr7uA9DsCmkMP6kq56kaQDGtld4yko4fdFjh7hJbEkadmxvCttRAUkrWbay4xxJ+vQRBC+xS1SijfmYAzchhHBNP//+siiKttS+ESRX/aBH1UkIYV769a81HS2VExvx+WbEbMWo9P+O7c0F3G6n/+CWCgdW+cu04fv2IdeCI3X5tAd5NgeucgXeA7/1GGMf+O4BI9I8cUqtsH1BpHuWKPKf8mjUsMF7B/y46e+CjPkogAUD2ORCkv4tZ2NhSUmnkn7J/qdSfgd8nXigkre596JOfSxozOQeJ5KauNjzfJaqxNYB8DMZN5QwrghfUh/D9G5tYisZYCTpKfHDpY53esHylnoGNBNbqeEXtl8RSSuIlv+qKny5mFOdCTGjX9Fy3pVcYIsY5w8Ts1clz1ZozGysU0nN1CIsaMNXwBfcus0/mdVayd2kzMT2eQihtOYusJsEHtL+qXhDnIkqFzsD3lZnutZUyR+/B37ILe/IEvcNoyeSzlPbJcqyB+rciTo3bWSoKl9mbVxlLSStKNAwa03lJXdqQmM8z4QPVcvXRKiVckOf65zw9KIx+56RzfoK3qXEGnhP9PnWSp0KKJ6RvXU8WT+ifQHm7Vae9XEhorHG9AzNvWYgdfTe9pXtI0mjbGHVCtOlVE25IG7QNn/QnQ00BU6cXTXgNl+sCNYHtueSLsgOONbBne5KSLqxfUqc6j2iIsMUsxuvICSCoLzsMQEuEv9z58seG1txKQHm120uyz2L4zWFbeDG8SxsY9dt/gORMvRHzKyfRAAAABpmY1RMAAAACwAAADAAAAAwAAAAAAAAAAAAZAPoAABSWq6pAAAFkWZkQVQAAAAMaIHtmj1rXEcYhZ8zLEKYxQghhAhCCGOEMSGFf0CqpA/+ByGFyY9IFVKkcJU6ReoU6VKmThFIMMEIY4wQwhixCCGEWMQyJ8XMrK/u3q+1Vq5y4LLD3Tsz5515P2beGbEi2B4B6/m5B5xLusj/beV3V8AUmEqaraLf0YdWtA2wZntT0iZwHxjZDgCSXgEX+fNNYCeXIzCzfQGc5eda0scTwPY9YBfYkjTKwjCEhO0gaQ3YyjMzkzSxfSLpalkuSwlge932fu64jPTQukhCUr08Is3OdoxxIulI0nSlAtgOtreB/Tx6N1AVok2gtm8q5SBpG9iIMR5JOpUU+7iFIeSBh5IObK8VdbFNX7mlvb7yGnAAPCz21IWhKrTWRaoJ9e8HEK+XdyQF24ddatoqYcWbRNuHwFnR2/y+t1xFeT/0Ibnb4z4baxTA9jrwg+09gBDCTNIhcLbsSH4IbE8l/Vu8UrbBRq4LL7NX+A54avtn2w8AcuB5SfLbbYSvbZ9JOi5BLOMdcJzrXhc7aXqAqxr5ke3HJJtYEGBhfmKMTyV9T7YP28eSvpF0XBHwESk4FVwCJ7bPJbUGpUrw2wB2JY1r/9dH/kZftl+FEN61CmB7B/gV2K71/QZ4VoSIMY4kPbI9lnQEDHJ5VcQYi9vcz0I1qc1jYLMMiO1rSf9U40RdgB+Br5o6zDPxTNKb0gEwknS9DPGGdteyECc1tanPcsFpCOFwQQDbB8BvdLvWY2CuTqtCjJEQQuHRpKJ1/FWEDbkSwNf0x4U94NsYY2+AWQYV8gF4ZLuLPMBuMehCZAf4YkBfp8DzEMJS+r4ERsAYaPVS+dkiLdvnAnxOWg53YWb7uaTJHZEn29PRgEA3AjbmAtj+ckD7LyX9flfkKzglueU+bAEE2/clPR5Q4ZfbepwhyO74pEeFsD22PRqRXNhGV6O2J5L+vGvyFZznwVpYulcwAu4FkgCd3qesg1ZGrx/X9KtRANZHpK1hH/5eNtLeBpKIMV7QHQsA1ke2X0j6qefDP1bEbTAklRkPpERAU3mIsf+PO4Vy2L7P4jRVfyeSPup0xRjHOd/UCtuXJXTv5Rfz7WAp59/IR9a3TH6/57OjQNp73iBfawjg/m23icsgB6q+pQ2SpkWAThdpe0x3UFk11iSNe1I30fY0AFe2Z0VdGshDIt8ZrVeMDZIQXZmPGXAVcuGyR4UAdle9D2hC3hN8MuDTyxDCrOR+hiyRx5K2bsVuGLaK/nepEDCB9/uBc0mzDhUqeJD3sHeCnLp8MCB5NgPOqwJM84pzodHauzVg/w490mxIvLE9IXvPeYpc0tsBFaek7MFtidbbJfOIwDwD2KZCkt4WDnOjzJKftjVOOhaq521urU65jYOczizqcSipLRd7Wp2lulc5Iq3F58gVr4B6xuwx8MT2Tlvesod4iDFuA09ISYXPnE5+FtKYFVxnju/51RuOMe6Q8vNlKdGY7iupjzwql8AJybB6U4skP7+bM3tV1ZgCL0rmraGvV5LaU4tlZEiJ1J3c0EK6T9JmpdMqgbKTurR9GkIo9TaAjUy4L6qX2b4hBGn0X9c3Vo1DlYU4IOXnb6T7+laIFRxKOs11H7GYb+3CwsDB3MhvoFF3izdoylUOyBa0ng/0rG2q5XXg04phx7YtbavxVZbVoT7yVR1vK7e1OSBIlfI6sNcXc4aekV0PJb7CGPGOpPOdH/UKoHRG9trpZH2fgcvqpo5bDP9GmfeuctCZw6AZyA29s31ue1/SVsWwGsn0CdVQjqQF2uoPuisdTYFDV64akA45GokNQd6LTKgccCyDD7orIenK9ivSVG+SBBlnn916BaGyv57ZviQlC2512WNlFpfPzarXbc7KmsXpmsI6afc3lbSy6zb/Acev6alX/MPmAAAAGmZjVEwAAAANAAAAMAAAADAAAAAAAAAAAABkA+gAAL+Q3NMAAAWaZmRBVAAAAA5oge2av2pkyRXGf1/RCCGaoRmEEItYxGCGYViMWRxvYG/kwPgd/ATLBo78AA428gP4JYxDBw6MAwdmbAYxLEYYsQyiEWJoRCOa+jaoU5rbt+/tezVqKfIHjUrddau+U3X+1akrdoSc81TSKXBi+1TS3yW9AbB9CBwAN8ASWEpa7WLeyac+aBvgCPjK9i8lfWF7JmlPErbnwJvo/hw4jnYGVrY/AFfxuZX0dALYfgH8FvgamNXJx5CwnSTtAYexMytJc9sXkm7uy+VeAuScPwO+AX419GxbGNtIInan2Z5Qduco5zyXdC5puVMBYpJf2/5W0uHYwZtoCtTTTpKOgFnO+VzSpaQ8NO6gALb3gd/b/o2k0TsWNtL5fSXd094DXgLPbH8/JMRYQkf3IQ/dKnTP9rGkZPtsm22lvh/qYKGP3wJ/Hc2+A1Xnx34o7vZ/Q46hUwDbCXgZ6oOkD8DvgL89RIixsL2U9J/qlWyn4LSBDfGi409sH1MCTnOgfdt/lPRVz9xz4C3wb+DPkv4bzz2jxIIpMLW910c+5nrbmHNi+5WkW+Bde0e6BDimGFHFEnhTXVuQ+QPwi/g/S3oL/Mn2PyRd9RleqOWe7RlwImna+r29YBPgVQiP7Xcppfe9AoTK/KyuUPXZwE0M3BTiuxj8O+AvsUKjkXOubvM0hOpSm9fA84anupX0r2acUGvQV5T0gJYA1ZjX1AmYSprfh3gbsVinwEVbbYiVb+EypXS2IYDtA+DnA/Mtbb9JKY2OlGOQcyalVHmsqU0P/lmFTfEQlCyyDkJPex/4vC9IfSoa5BPwyvY28mtcq2vaj8SqN4IGbiNXeRDhLZhQPNXdwvV8DoH9pgAzSZOOYNJun9/XWO+DGPt8RKCbALOmAIdb1Ka2F8DlY5Fv4DLmGsIhQAqLv/PHW5KwizHZ4UMRc1wMqBC2p7YnE+BgW6IW6nNr+/qxyTdwHerUG7Ep9nKQKMaQtqkQsHhM3e/ALcNqlID9CcUD3X3bpUK2P1RX9xSQRM75A9tjAYQAC4rlJyDHmTXD2iHj6lEZd0BSnTNRCgFd7THG/n88KhRh+xmb29T8O5f0pNsVhbKtNmB7UUP35/HFxiE7/maeWN+C/OlAt/NEObCskW8NBKVCsGOK/Qg3/myon6RlFWBrhI1IvS2o7Bp7kqYD6U22vUzAje1V8/DSIg+F/OzJ6Je59rYklagUh29SNBYDKgRwknN+9GgWZ4LPRnRdpJRWCWDksXD6qWXFe+Kw6v9AejOHj+n0taTVFhWqeLGtJPJQ2N6z/WKL2tT2CrhuCrC0PR9QISi2cPqIHmk1Jt643D0sIQQI6X4Y8eCSUj14KNH2uASPDJwBV83cv/Zp9PuhcrgzypB848TVWO2uus2D1SnGaJYxV8BZFMi6VOiyuUttr3JOycXvEA/esF4TmgCvgS9tH7unbjlAPOWcj4AvKRccP43SThXiLZtZ8G1w/MivPXDO+a60GLGhs9xXSx+xKgvggmJYvfddrZhyYnvaUTxrljHbc72T1F9arCtDFHc7qnHJ9mtJzxuTNgnUk9TC9mVKqT43A2ZBeCiq191eE4Ky+hsXHp1LFUK8pNTn21XioVNSxZmky3h2rWQ5AhsLB3dGvobumnt4g65a5YhqwbbKxlDpprb3gS8ahp37KiK9xtdIq1N75Zs63tfuG3NEkKrtUWXMsfdet2OJ7zBGvKfo/NZOgwJIyra/d7lZP2VkWt01cY/hr7X56Cp3c80aA2fgve1rl/cgDhuG1UlmSKiOdqYkaLu/6G5MtATOIuCcUOqTk4eoUJxF5jQuOO6DT3pXQtKN7XeUrX5OEWQaPvtuZzrI1t1c2V5QigUPetljZxaXc55I2qd4jwPgquYsto/i+5uI7Dt73eZH/yn4sWKtQVoAAAAASUVORK5CYIJZQ2NyU3cyeExhdjd4L1N5RU1OeHlRRmdTNjAyQVJNVzNtbDhNSzdGTTdENmhWaTdDWDhuaUdLZVhLaXdwb1Jo")}.kin_loading__spinner.-small{width:2rem;height:2rem}.kin_loading__spinner.-inline{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.kin_loading__spinner.-inverted{background-color:rgba(0,0,0,0.3);box-shadow:0 0 0 0.4em rgba(0,0,0,0.3)}.kin_loading__label{margin:0.5rem;display:inline-block;vertical-align:middle}@-moz-keyframes spin{100%{transform:rotate(360deg)}}@-webkit-keyframes spin{100%{transform:rotate(360deg)}}@-o-keyframes spin{100%{transform:rotate(360deg)}}@keyframes spin{100%{transform:rotate(360deg)}}</style>`; this._fragment = create_main_fragment$6(this, this._state); this._fragment.c(); this._fragment.m(this.shadowRoot, null); if (options.target) this._mount(options.target, options.anchor); } static get observedAttributes() { return ["label","inline","size","fullscreen","inverted"]; } get label() { return this.get().label; } set label(value) { this.set({ label: value }); } get inline() { return this.get().inline; } set inline(value) { this.set({ inline: value }); } get size() { return this.get().size; } set size(value) { this.set({ size: value }); } get fullscreen() { return this.get().fullscreen; } set fullscreen(value) { this.set({ fullscreen: value }); } get inverted() { return this.get().inverted; } set inverted(value) { this.set({ inverted: value }); } attributeChangedCallback(attr, oldValue, newValue) { this.set({ [attr]: newValue }); } } assign(Loading.prototype, proto); assign(Loading.prototype, { _mount(target, anchor) { target.insertBefore(this, anchor); } }); customElements.define("kin-loading", Loading); class KinElement extends HTMLElement { constructor() { super(); this.initialized = false; this.initTimeoutId = null; this.initDone = null; this.initFinished = new Promise((resolve) => { this.initDone = resolve; }); } connectedCallback() { this.init(); } disconnectedCallback() { if (this.initTimeoutId != null) { this.initTimeoutId = window.clearTimeout(this.initTimeoutId); } this.elemDestroyed && this.elemDestroyed(); } attributeChangedCallback(name) { if (this.constructor.observedAttributes) { this.initFinished.then(() => { this.handleAttr(name); if (this.updateElem) {// TODO: remove in future, only for input.js this.updateElem(); } }); } } handleAttr(name) { const cfg = this.constructor.attrCfg[name]; if (!cfg || !cfg.updateFn) { return; } const attrValue = this.getAttribute(name); if (attrValue !== this.attrState[name]) { if (Array.isArray(cfg.updateFn)) { cfg.updateFn.forEach((fn, idx) => { this[fn](name, attrValue, cfg.updateCfg[idx]); }); } else { this[cfg.updateFn](name, attrValue, cfg.updateCfg); } this.attrState[name] = attrValue; } } initAttrs() { if (this.constructor.attrCfg) { this.attrState = {}; if (this.constructor.observedAttributes) { // getAttribute returns null for undefined attribute this.constructor.observedAttributes.forEach(attr => this.attrState[attr] = null); } Object.keys(this.constructor.attrCfg).forEach(name => { this.handleAttr(name); }); } if (this.updateElem) {// TODO: remove in future, only for input.js this.updateElem(); } } init(finalTry) { if (this.initialized) { return; } this._orgStyle = this._orgStyle || {position: this.style.position, visibility: this.style.visibility}; // The elem is made inivisible before it's fully initialized. Otherwise it may cause glitches. this.style.position = 'absolute'; this.style.visibility = 'hidden'; if (!finalTry && !this.childNodes.length) { // The connectedCallback may be called before the child nodes gets to the element // ..if so, postpone the initialization. this.initTimeoutId = window.setTimeout(this.init.bind(this, true), 0); return; } this.initElem(); this.initAttrs(); this.initSlots(); this.elemInited && this.elemInited(); this.appendChild(this.elTpl); this.elemRendered && this.elemRendered(); this.style.position = this._orgStyle.position; this.style.visibility = this._orgStyle.visibility; delete this._orgStyle; this.initialized = true; this.initDone(); } initSlots() { const mainSlot = this.elTpl.querySelector('slot:not([name])'); const namedSlots = this.elTpl.querySelectorAll('slot[name]'); const namedSlotsMap = {}; const mainSlotNodes = []; const namedSlotNodes = []; namedSlots.forEach(slot => { namedSlotsMap[slot.name] = slot; }); this.childNodes.forEach(child => { if (child.slot) { namedSlotNodes.push(child); } else { mainSlotNodes.push(child); } }); if (mainSlot) { mainSlotNodes.forEach((node, index)=>{ node = this.removeChild(node); if (index) { mainSlotNodes[index - 1].after(node); } else { mainSlot.replaceWith(node); } }); } namedSlotNodes.forEach(node => { const slot = namedSlotsMap[node.slot]; node = this.removeChild(node); if (slot) { node.removeAttribute('slot'); slot.replaceWith(node); } }); } focus() { this.initFinished.then(() => { if (this.focusableElem) { this.focusableElem.focus(); } else { this.elTpl.focus(); } }); } blur() { this.initFinished.then(() => { if (this.focusableElem) { this.focusableElem.blur(); } else { this.elTpl.blur(); } }); } dispatchCustomEvent(name, detail) { const customEvent = new CustomEvent(name, { detail: detail, bubbles: true, cancelable: true, composed: true, }); this.dispatchEvent(customEvent); } getDomParser() { if (!this.domParser) { this.domParser = new DOMParser(); } return this.domParser; } fireEvent(name, detail) { const customEvent = new CustomEvent(name, { detail: detail, bubbles: true, cancelable: true, composed: true, }); this.dispatchEvent(customEvent); } toggleClass(attrName, attrValue, cfg = {}) { const el = cfg.el ? this[cfg.el] : this.elTpl; if (attrValue !== 'false') { el.classList.add(cfg.cssCls); } else { el.classList.remove(cfg.cssCls); } } updateClass(attrName, attrValue, cfg = {}) { if (cfg.values && !cfg.values.includes(attrValue)) { return; } const el = cfg.el ? this[cfg.el] : this.elTpl; if (this.attrState[attrName]) { el.classList.remove('-'+ this.attrState[attrName]); } if (attrValue) { el.classList.add('-'+ attrValue); } } toggleAttr(attrName, attrValue, cfg = {}) { const el = cfg.el ? this[cfg.el] : this.elTpl; if (attrValue !== 'false') { el.setAttribute(cfg.attrName, cfg.attrValue); } else { el.removeAttribute(cfg.attrName); } } updateAttr(attrName, attrValue, cfg = {}) { const el = cfg.el ? this[cfg.el] : this.elTpl; if (attrValue) { el.setAttribute(cfg.name, cfg.valueFn ? cfg.valueFn.call(this, attrValue) : attrValue); } else { el.removeAttribute(cfg.name); } } component(attrName, attrValue, cfg = {}) { if (attrValue) { if (!this[cfg.el]) { cfg.create.call(this); this.elTpl.appendChild(this[cfg.el]); } cfg.set.call(this, attrValue); } else if (this[cfg.el]) { this.elTpl.removeChild(cfg.el); } } updateProp(attrName, attrValue, cfg = {}) { this.data[attrName] = attrValue; } } function styleInject(css, ref) { if ( ref === void 0 ) ref = {}; var insertAt = ref.insertAt; if (!css || typeof document === 'undefined') { return; } var head = document.head || document.getElementsByTagName('head')[0]; var style = document.createElement('style'); style.type = 'text/css'; if (insertAt === 'top') { if (head.firstChild) { head.insertBefore(style, head.firstChild); } else { head.appendChild(style); } } else { head.appendChild(style); } if (style.styleSheet) { style.styleSheet.cssText = css; } else { style.appendChild(document.createTextNode(css)); } } var css_248z = ".kin_ipm {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n}\n.kin_ipm iframe {\n width: 100%;\n height: 100%;\n border: 0;\n}\n"; styleInject(css_248z); // FIXME This is too complicated that it shouldn't be a kin component. // Moreover there are NAPI dependecies. // Move it to nitro-ui to svelteComponents. const LOAD_TIMEOUT = 7000; const FAILED_TIME = 666; // if IPM fails to load, send this value as loadTime to GA. AV-16108 let OVERRIDE = {}; let LOCAL_STORAGE = undefined; class Ipm extends KinElement { static get attrCfg() { return { params: 'updateProp', id: { updateFn: ['updateAttr', 'updateProp'], updateCfg: [{ el: 'elIpm', name: 'data-test', valueFn: function (value) { return 'ipm-elm-' + value; } }] }, hash: 'updateProp', src: 'updateProp' } } static get observedAttributes() { return Object.keys(Ipm.attrCfg).filter(name => Ipm.attrCfg[name]); } constructor() { super(); this.listeners = []; this.data = (function (scope) { const data = { error: (navigator.onLine) ? null : 'offline' }; return { loaded: false, srcElmId: null, get id() { return data.id; }, set id(val) { data.id = val; scope.updateIpmUrl(); scope.updateFrame(); }, get url() { return data.url; }, set url(val) { data.url = val; scope.updateIpmUrl(); }, get src() { return data.src; }, set src(val) { data.src = val; scope.updateIpmUrl(); }, get error() { return data.error; }, set error(val) { data.error = val; scope.elTpl.style.display = data.error ? 'none' : 'block'; }, set hash(val) { if (data.hash) { scope.updateFrame(); } data.hash = val; }, set params(val) { if (data.params && (data.id || data.hash)) { console.error('kin-ipm error - params have to come before id or hash, eq. <kin-ipm params="{params}" id="' + data.id + '" />'); } data.params = val; }, get ipmUrl() { let url = ''; if (OVERRIDE[data.id]) { url = OVERRIDE[data.id]; } else if (data.src) { url = data.src; } else if (data.url) { url = data.url; } return url; } }; })(this); } initElem() { /* <div ref:elTpl class="kin_ipm"> <iframe ref:elIpm src="{ipmUrl}" data-test="ipm-elm-{id}" /> </div> */ if (localStorage.getItem('automationDisableIpm') === 'true') { return; } this.elTpl = document.createElement('div'); this.elTpl.classList.add('kin_ipm'); this.elIpm = document.createElement('iframe'); this.elTpl.appendChild(this.elIpm); } elemInited() { this.updateStorage(); this.loadElmIdFromURL(); this.listen(); this.checkErrors(); } elemDestroyed() { this.listeners.forEach(off => off()); this.listeners.length = 0; this.timeout && clearTimeout(this.timeout); window.removeEventListener('online', this._onlineStateRef); window.removeEventListener('message', this._processMessageRef, false); } fire(evnName, evnValue) {// emulating ractive fire method // TODO where is this coming from? // https://git.int.avast.com/ff/spawn/commit/673f85add123d42153f47477c05c892673d33a15 // Found in module-avast-recommendations // this.ipmCompo.fire('route' ... // Is this needed in kin? if (evnName === 'route') { if (this.elIpm && this.elIpm.contentWindow && this.elIpm.contentWindow.postMessage) { this.elIpm.contentWindow.postMessage('route:' + evnValue, '*'); } } } updateIpmUrl() { this.elIpm.setAttribute('src', this.data.ipmUrl); } loadElmIdFromURL() { if (!this.data.srcElmId) { const P_ELM_REGEX = /p_elm=(\d+)/; const matches = this.data.src && this.data.src.match(P_ELM_REGEX); if (matches) { this.data.srcElmId = matches[1]; } } } // TODO was overridden in ui-core extendRactive // overridden in ui-core extendRactive listen() { this._processMessageRef = this._processMessage.bind(this); // create function reference so it can be eventRemoved afterwards window.addEventListener('message', this._processMessageRef, false); this._onlineStateRef = this._onlineState.bind(this); // create function reference so it can be eventRemoved afterwards window.addEventListener('online', this._onlineStateRef); this.listeners.push(NAPI.on('ASW_NOTIF_RELOAD_IPM', () => { this.updateFrame(); })); this.listeners.push(NAPI.on('ipm.reload.' + this.attrState.id, ()=>{ this.updateFrame(); })); } _onlineState() { this.data.error = null; setTimeout(() => { this.updateFrame(); this.checkErrors(); }, 1); } /** * Process postMessage sent from IPM iframe. data format {action: string, sourceUrl: string} */ _processMessage(event) { if (!event || !event.data) { return; } this.loadElmIdFromURL(); let id = parseInt(this.attrState.id); // check if in message is 'windowLoaded' and if the message was sent from same element as this listener is attached to const isThisIpmLoaded = event.data.action === 'windowLoaded' && (+event.data.elmId === id || +event.data.elmId === parseInt(this.data.srcElmId)); if (isThisIpmLoaded) { this.timeout && clearTimeout(this.timeout); this.trackIpmGaLoadtime(this._getTimerValue()); this.data.error = null; this.data.loaded = true; this.fireEvent('success', { id: id, }); this.fireEvent('done', { id: id, }); NAPI.request('app.ipm_tracking.track', {'elem_id': id, 'response_time': -1}); } } // TODO was overridden in ui-core extendRactive // overridden in ui-core extendRactive trackIpmGaLoadtime(loadTime) { if (loadTime === FAILED_TIME) {// AV-17059 - track only failed loads NAPI.track.event('Loading', 'Timeout', parseInt(this.data.id)); } } _getTimerValue() { return Math.round((performance.now() - this._timerStart) / 1000); } /** * Render Proper iframe URL */ updateFrame() { this.getUrl() .then(url => { if (this.data.src) { url = this.data.src; } this._timerStart = performance.now(); // start timer when we got IPM URL if (this.elIpm) { this.elIpm.onload = () => { this.fireEvent('success'); }; this.elIpm.setAttribute('src', 'about:blank'); setTimeout(() => { // AV-16565 - override the url only in testing environment, to prevent // dialog windows from being automatically closed due to cancelled // network request, may require additional changes if it's reproducible // in AV // WTF?! url is set to about:blank has to be overriden if (this.data.ipmUrl !== url || this.elIpm.getAttribute('src') === 'about:blank') { this.data.url = url; } }, 1); } else { this.data.url = url; } }); } checkErrors() { // CEF is offline - fallback and emit errors this.timeout && clearTimeout(this.timeout); if (!navigator.onLine) { this.data.error = 'offline'; this.fireEvent('error', { code: 0, message: 'offline', id: parseInt(this.data.id) }); } else { // observe timeout of the frame.onload event this.timeout = setTimeout(() => { this.trackIpmGaLoadtime(FAILED_TIME); this.data.error = 'timeout'; this.fireEvent('error', { code: 0, message: 'timeout', id: parseInt(this.data.id) }); }, LOAD_TIMEOUT); } } // TODO was overridden in ui-core extendRactive // overridden in ui-core extendRactive getUrl() { const hash = location.hash.replace('#', ''); return (this.data.id == null) ? Promise.resolve('about:blank') : NAPI.request('app.utils.GetUrlParameters', parseInt(this.data.id)) .then(url => { let p = ''; if (this.attrState.params) { const params = JSON.parse(this.attrState.params); p += Object.keys(params).map(function(key) { return key + '=' + encodeURIComponent(params[key]); }).join('&'); p = '&' + p; } return url + '&p_scr='+ hash.toLowerCase().replace(/\//g, '_') + p + ((this.attrState.hash !== '/') ? '#' + this.attrState.hash : ''); }); } updateStorage(){ if (localStorage['IPM_OVERRIDE'] && LOCAL_STORAGE != localStorage['IPM_OVERRIDE'] ) { try { LOCAL_STORAGE = localStorage['IPM_OVERRIDE']; OVERRIDE = JSON.parse(localStorage['IPM_OVERRIDE']); } catch (e) { console.log('Failed to parse localStorage.IPM_OVERRIDE'); } } } } customElements.define('kin-ipm', Ipm); var css_248z$1 = "kin-tooltip {\n display: inline-block;\n position: relative;\n max-width: 100%;\n}\nkin-tooltip .kin_tooltip .kin_dropdown__activator::before {\n content: '';\n position: absolute;\n top: -0.5rem;\n right: -0.5rem;\n bottom: -0.5rem;\n left: -0.5rem;\n}\nkin-tooltip .kin_tooltip.-ellipsis {\n max-width: 100%;\n}\nkin-tooltip .kin_tooltip.-ellipsis .kin_dropdown__activator {\n max-width: 100%;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\nkin-tooltip .kin_tooltip.-ellipsis .kin_dropdown__activator > div,\nkin-tooltip .kin_tooltip.-ellipsis .kin_dropdown__activator > div > div {\n display: inline;\n}\n"; styleInject(css_248z$1); class Tooltip extends KinElement { static get attrCfg() { return { ellipsis: null // boolean; static (the value is not supposed to change) } } static get observedAttributes() { return Object.keys(Tooltip.attrCfg).filter(name => Tooltip.attrCfg[name]); } constructor() { super(); } /** * Creates this.elTpl like this: * <kin-dropdown ref:elTpl type="tooltip" class="kin_tooltip {ellipsis ? '-ellipsis' : ''}"> * <div slot="dropdown-activator"> * <slot name="tooltip-activator" /> * </div> * <slot name="tooltip" /> *</kin-dropdown> * * REMEMBER if you change something in this function, update the HTML description above. */ initElem() { this.elTpl = document.createElement('kin-dropdown'); this.elTpl.setAttribute('type', 'tooltip'); this.elTpl.className = 'kin_tooltip'; const dropdownActivator = document.createElement('div'); dropdownActivator.setAttribute('slot', 'dropdown-activator'); const activatorSlot = document.createElement('slot'); activatorSlot.setAttribute('name', 'tooltip-activator'); dropdownActivator.appendChild(activatorSlot); this.elTpl.appendChild(dropdownActivator); const tooltipSlot = document.createElement('slot'); tooltipSlot.setAttribute('name', 'tooltip'); this.elTpl.appendChild(tooltipSlot); // remove Tooltip in case the text doesn't overflow the parent container if (this.hasAttribute('ellipsis')) { this.elTpl.classList.add('-ellipsis'); setTimeout(()=>{ if ( this.elTpl.getBoundingClientRect().width == dropdownActivator.getBoundingClientRect().width ) { this.elTpl.classList.add('-inactive'); this.elTpl.querySelector('.kin_dropdown.-tooltip').remove(); this.elTpl.querySelector('.kin_dropdown__activator').removeAttribute('aria-labelledby'); } }, 100); } } } customElements.define('kin-tooltip', Tooltip); var css_248z$2 = "kin-button {\n display: inline-block;\n}\nkin-button[kin-disabled='true'] {\n pointer-events: none;\n}\nkin-button .kin_button {\n box-sizing: border-box;\n display: inline-flex;\n position: relative;\n justify-content: center;\n align-items: center;\n min-height: var(--button-height);\n width: 100%;\n min-width: var(--button-height);\n max-width: 100%;\n vertical-align: middle;\n padding: 0.1rem 1.5em 0;\n border: hidden 1px currentColor;\n border-radius: var(--button-radius);\n line-height: 1.1;\n color: var(--button-color);\n font-family: var(--font);\n font-size: var(--button-font-size);\n font-weight: var(--button-font-weight);\n text-transform: uppercase;\n text-decoration: none;\n background-color: var(--button-bg);\n cursor: pointer;\n overflow: hidden;\n}\nkin-button .kin_button:disabled {\n pointer-events: none;\n}\nkin-button .kin_button.-small {\n min-height: var(--button-height-small);\n min-width: var(--button-height-small);\n padding-left: 1.2rem;\n padding-right: 1.2rem;\n font-size: var(--button-font-size-small);\n}\nkin-button .kin_button.-large {\n font-size: var(--button-font-size-large);\n min-height: var(--button-height-large);\n min-width: var(--button-height-large);\n}\nkin-button .kin_button.-secondary {\n background-color: transparent;\n border-style: solid;\n color: currentColor;\n}\nkin-button .kin_button.-blank {\n background-color: transparent;\n color: currentColor;\n border-color: transparent;\n}\nkin-button .kin_button.-upsell {\n background: var(--color-upsell);\n color: var(--color-upsell-text);\n}\nkin-button .kin_button.-upsell:hover {\n border-color: currentColor;\n}\nkin-button .kin_button.-attention {\n background-color: var(--button-bg-attention);\n color: var(--color-attention-text);\n}\nkin-button .kin_button.-critical {\n background-color: var(--color-critical);\n color: var(--color-critical-text);\n}\nkin-button .kin_button.-icon-only {\n padding-left: 0;\n padding-right: 0;\n font-size: 0;\n}\nkin-button .kin_button:disabled {\n opacity: 0.3;\n cursor: default;\n pointer-events: none;\n}\nkin-button .kin_button:hover,\nkin-button .kin_button:focus {\n transform: scale(1.07);\n z-index: 2;\n}\nkin-button .kin_button:hover,\nkin-button .kin_button:active,\nkin-button .kin_button:focus {\n outline: 0;\n}\nkin-button .kin_button:hover::after,\nkin-button .kin_button:active::after,\nkin-button .kin_button:focus::after {\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n pointer-events: none;\n transition: background 0.4s linear 0s;\n}\nkin-button .kin_button:focus::after {\n background: var(--button-bg-focus-layer);\n}\nkin-button .kin_button:hover::after {\n background: var(--button-bg-hover-layer) radial-gradient(circle, transparent 1%, var(--button-bg-hover-layer) 1%) center/15000%;\n}\nkin-button .kin_button:active::after {\n background-color: var(--button-bg-hover-layer);\n background-size: 100%;\n transition: background 0s;\n}\nkin-button .kin_button.-processing::after {\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: 20%;\n pointer-events: none;\n background-color: var(--button-bg-focus-layer);\n animation: processing 2.5s linear infinite;\n}\n@-moz-keyframes processing {\n 0% {\n left: 0;\n width: 20%;\n }\n 25% {\n left: 20%;\n width: 80%;\n }\n 50% {\n left: 80%;\n width: 20%;\n }\n 75% {\n width: 80%;\n left: 0;\n }\n 100% {\n width: 20%;\n left: 0;\n }\n}\n@-webkit-keyframes processing {\n 0% {\n left: 0;\n width: 20%;\n }\n 25% {\n left: 20%;\n width: 80%;\n }\n 50% {\n left: 80%;\n width: 20%;\n }\n 75% {\n width: 80%;\n left: 0;\n }\n 100% {\n width: 20%;\n left: 0;\n }\n}\n@-o-keyframes processing {\n 0% {\n left: 0;\n width: 20%;\n }\n 25% {\n left: 20%;\n width: 80%;\n }\n 50% {\n left: 80%;\n width: 20%;\n }\n 75% {\n width: 80%;\n left: 0;\n }\n 100% {\n width: 20%;\n left: 0;\n }\n}\n@keyframes processing {\n 0% {\n left: 0;\n width: 20%;\n }\n 25% {\n left: 20%;\n width: 80%;\n }\n 50% {\n left: 80%;\n width: 20%;\n }\n 75% {\n width: 80%;\n left: 0;\n }\n 100% {\n width: 20%;\n left: 0;\n }\n}\nkin-button-group .kin_button {\n height: 100%;\n}\nkin-button-group .kin_button:hover,\nkin-button-group .kin_button:focus {\n transform: scale(1.04);\n}\nkin-button-group *:not(:first-child) .kin_button {\n border-radius: 0;\n border-left: solid 1px;\n}\nkin-button-group *:first-child .kin_button {\n border-radius: var(--button-radius) 0 0 var(--button-radius);\n transform-origin: right;\n}\nkin-button-group *:last-child .kin_button {\n border-radius: 0 var(--button-radius) var(--button-radius) 0;\n transform-origin: left;\n}\n[dir='rtl'] kin-button-group *:not(:first-child) .kin_button {\n border-radius: 0;\n border-right: solid 1px;\n border-left: 0;\n}\n[dir='rtl'] kin-button-group *:first-child .kin_button {\n border-radius: 0 var(--button-radius) var(--button-radius) 0;\n transform-origin: left;\n}\n[dir='rtl'] kin-button-group *:last-child .kin_button {\n border-radius: var(--button-radius) 0 0 var(--button-radius);\n transform-origin: right;\n}\n"; styleInject(css_248z$2); class Button extends KinElement { static get attrCfg() { return { size: { // tile size large|small|huge updateFn: 'updateClass' }, type: { // severity style/color: (default)|secondary|critical|attention|blank updateFn: 'updateClass', values: ['secondary', 'critical', 'attention', 'blank', 'upsell'], }, link: { // button with link - <a href="{link}"> updateFn: 'updateAttr', updateCfg: { name: 'href' } }, 'kin-disabled': { // need to prefix because 'disabled' is reserved for focusable elements updateFn: 'toggleAttr', updateCfg: { attrName: 'disabled', attrValue: true } }, icononly: { // button displays only icon (can contain text for accessibility) updateFn: 'toggleClass', updateCfg: { cssCls: '-icon-only' } }, processing: { // action in progress, visual progress updateFn: 'toggleClass', updateCfg: { cssCls: '-processing' } }, title: { // title updateFn: 'updateAttr', updateCfg: { name: 'title' } }, 'data-test': null, // automation locator fake: null // rendered as <div>, not focusable (inside kin-tile or other focusable/clickable el.) } } static get observedAttributes() { return Object.keys(Button.attrCfg).filter(name => Button.attrCfg[name]); } constructor() { super(); } initElem() { if (this.hasAttribute('link')) { this.elTpl = document.createElement('a'); this.elTpl.setAttribute('href', this.getAttribute('link')); } else if (this.hasAttribute('fake')) { this.elTpl = document.createElement('div'); } else { this.elTpl = document.createElement('button'); } if (this.hasAttribute('data-test')) { this.elTpl.setAttribute('data-test', this.getAttribute('data-test')); this.removeAttribute('data-test'); } this.elTpl.classList.add('kin_button'); this.elTpl.appendChild(document.createElement('slot')); // if (this.hasAttribute('title')) { // this.elTooltip = document.createElement('kin-tooltip'); // this.elTooltipText = document.createElement('span'); // this.elTooltipText.innerText = this.getAttribute('title'); // this.elTpl.setAttribute('slot', 'tooltip-activator'); // this.elTooltipText.setAttribute('slot', 'tooltip'); // // this.elTooltip.appendChild(this); // this.elTpl.appendChild(this.elTooltip); // } else { // this.elTpl.appendChild(document.createElement('slot')); // } } } customElements.define('kin-button', Button); // incrementaly generate unique id let uidvalue = 0; function uid(){ return ++uidvalue; } const POSITIONS = { top: 'top', right: 'right', bottom: 'bottom', left: 'left' }; const ALIGNMENTS = { top: 'top', right: 'right', bottom: 'bottom', left: 'left', center: 'center' }; const POSITIONS_ALIGNMENTS = { top: [ALIGNMENTS.left, ALIGNMENTS.right, ALIGNMENTS.center], right: [ALIGNMENTS.top, ALIGNMENTS.bottom, ALIGNMENTS.center], bottom: [ALIGNMENTS.left, ALIGNMENTS.right, ALIGNMENTS.center], left: [ALIGNMENTS.top, ALIGNMENTS.bottom, ALIGNMENTS.center] }; const MARGIN = 0; const log = (function() {// TODO: remove on refactoring if (localStorage.getItem('DEBUG_DROPLIB')) { return function () { console.log.apply(null, ['DROP_LIB'].concat(Array.prototype.slice.call(arguments))); } } else { return function () {} } })(); class DropAgent { constructor() { this.POSITIONS = POSITIONS; this.ALIGNMENTS = ALIGNMENTS; this.DOESNT_FIT_CLS = '-fit-large-dropdown'; this.drops = {}; this.hideOnClick = () => { log('hide on click'); Object.keys(this.drops).forEach(type => { this.hide(type); }); }; } show(cmp, type, activator, drop, position, scrollableElement) { if(!type) { log('DROP - show - empty type'); return; } log('DROP - show - '+ type); if (this.drops[type]) { this.hide(type); } this.drops[type] = { cmp: cmp, activator: activator, drop: drop, position: position || POSITIONS.bottom, alignment: /*alignment ||*/ ALIGNMENTS.center, margin: /*margin ||*/ MARGIN, scrollableElement: scrollableElement }; this._setPositionsAndAlignments(type); this._countAndSetPosition(type) .catch(() => { log('DropAgent - does not fit'); }) .finally(() => { if (this.drops[type].scrollableElement) { this.drops[type].onScroll = (function(DropAgent, type){ return function () { DropAgent.hide(type); } })(this, type); this.drops[type].scrollableElement.addEventListener('scroll', this.drops[type].onScroll); } setTimeout(() => {// quick fix - attach after click event bubbles up to document.body document.body.addEventListener('click', this.hideOnClick); }, 0); this.drops[type].cmp.show(); }); } hide(type) { if(!type || !this.drops[type]) { log('DROP - hide - empty type'); return; } log('DROP - hide - '+ type, this.drops); document.body.removeEventListener('click', this.hideOnClick); if (this.drops[type].doesntFit) { this.drops[type].drop.classList.remove(this.DOESNT_FIT_CLS); } if (this.drops[type].scrollableElement) { this.drops[type].scrollableElement.removeEventListener('scroll', this.drops[type].onScroll); } this.drops[type].cmp.hide(); delete this.drops[type]; } /** * Sets dropWrap's position at one side * and cancels the postion on the other side. * @param {String} side - one of top, right, bottom or left * @param {Int} value - position in px or null */ _setDropWrapPosition(type, side, value) { switch (side) { case 'top': this.drops[type].drop.style.bottom = null; break; case 'right': this.drops[type].drop.style.left = null; break; case 'bottom': this.drops[type].drop.style.top = null; break; case 'left': this.drops[type].drop.style.right = null; break; } return this.drops[type].drop.style[side] = value ? value + 'px' : value; } _getViewportRect() { return { width: window.innerWidth, height: window.innerHeight, top: window.pageYOffset, right: window.pageXOffset + window.innerWidth, bottom: window.pageYOffset + window.innerHeight, left: window.pageXOffset }; } _getRectWithOffset(elem) { const rect = elem.getBoundingClientRect(); return { width: rect.width, height: rect.height, top: rect.top + window.pageYOffset, right: rect.right + window.pageXOffset, bottom: rect.bottom + window.pageYOffset, left: rect.left + window.pageXOffset }; } _doesItFit(type, drop, position) { this.drops[type].drop.style.visibility = 'hidden'; this.drops[type].drop.style.display = 'block'; this.drops[type].drop.style.position = 'fixed'; const dropWrapRect = this._getRectWithOffset(this.drops[type].drop); const viewportRect = this._getViewportRect(); this.drops[type].drop.style.visibility = null; this.drops[type].drop.style.display = null; this.drops[type].drop.style.position = null; if ((this.drops[type].position === POSITIONS.left || this.drops[type].position === POSITIONS.right) // && dropWrapRect.width < this.dropConfig.minWidth && (dropWrapRect.left <= viewportRect.left || dropWrapRect.right >= viewportRect.right)) { return false; } return dropWrapRect.top >= viewportRect.top && dropWrapRect.right <= viewportRect.right && dropWrapRect.bottom <= viewportRect.bottom && dropWrapRect.left >= viewportRect.left; } _getActivatorRect(type) { return this._getRectWithOffset(this.drops[type].activator); } _getDropWrapRect(type) { switch (this.drops[type].position) { case POSITIONS.top: case POSITIONS.bottom: this._setDropWrapPosition(type, this.drops[type].drop, 'left', 0); break; case POSITIONS.right: case POSITIONS.left: this._setDropWrapPosition(type, this.drops[type].drop, 'top', 0); break; } this.drops[type].drop.style.visibility = 'hidden'; this.drops[type].drop.style.display = 'block'; this.drops[type].drop.style.position = 'fixed'; let dropWrapRect = this._getRectWithOffset(this.drops[type].drop); this.drops[type].drop.style.visibility = null; this.drops[type].drop.style.display = null; this.drops[type].drop.style.position = null; return dropWrapRect; } _countAndSetPosition(type, positionIndex = 0, alignmentIndex = 0, forcePosition = false) { let activatorRect = this._getActivatorRect(type), viewportRect = this._getViewportRect(), dropWrapRect = this._getDropWrapRect(type), positionObj = this.drops[type].positions[positionIndex], position = positionObj.id, alignment = positionObj.alignments[alignmentIndex], margin = this.drops[type].margin; let countCenterPosition = () => { let dropWrapRect; // give the drop the most space it may have at the current position // to find it its width or height... switch (position) { case POSITIONS.top: case POSITIONS.bottom: this._setDropWrapPosition(type,'left', 0); break; case POSITIONS.right: case POSITIONS.left: this._setDropWrapPosition(type,'top', 0); break; } // ...then get rect... dropWrapRect = this._getDropWrapRect(type); // ...and set the position accordingly switch (position) { case POSITIONS.top: case POSITIONS.bottom: this._setDropWrapPosition(type,'left', activatorRect.left + (activatorRect.width / 2) - (dropWrapRect.width / 2)); break; case POSITIONS.right: case POSITIONS.left: this._setDropWrapPosition(type,'top', activatorRect.top + (activatorRect.height / 2) - (dropWrapRect.height / 2)); break; } }; //log('DropAgent._countAndSetPosition: position ' + position + ', alignment ' + alignment) switch (position) { case POSITIONS.top: this._setDropWrapPosition(type,'bottom', viewportRect.bottom - activatorRect.top + 1 + margin); break; case POSITIONS.right: this._setDropWrapPosition(type,'left', activatorRect.right + 1 + margin); break; case POSITIONS.bottom: this._setDropWrapPosition(type,'top', activatorRect.bottom + 1 + margin); break; case POSITIONS.left: this._setDropWrapPosition(type,'right', viewportRect.right - activatorRect.left + 1 + margin); break; } switch (alignment) { case ALIGNMENTS.top: case ALIGNMENTS.left: this._setDropWrapPosition(type, alignment, activatorRect[alignment]); break; case ALIGNMENTS.bottom: case ALIGNMENTS.right: this._setDropWrapPosition(type, alignment, viewportRect[alignment] - activatorRect[alignment]); break; case ALIGNMENTS.center: countCenterPosition(); break; } // in the end when the drop is placed // check if the width is no bigger the required max width // if (this.dropConfig.maxWidth != null) { // dropWrapRect = this._getDropWrapRect(type); // if (dropWrapRect.width > this.dropConfig.maxWidth) { // this.dropWrap.style.width = this.dropConfig.maxWidth + 'px'; // // since the center alignment is specially counted, // // it needs to be recounted when the width changes // if (alignment === ALIGNMENTS.center) { // countCenterPosition(); // } // } // } if (this._doesItFit(type, position)) { return Promise.resolve(); // suitable position found } else { if (forcePosition) { this.drops[type].doesntFit = true; this.drops[type].drop.classList.add(this.DOESNT_FIT_CLS); return Promise.reject(); } else if (positionIndex === this.drops[type].positions.length - 1 && alignmentIndex === positionObj.alignments.length - 1) { //log('DropAgent._countAndSetPosition: no position found') return this._countAndSetPosition(type,0, 0, true); // no suitable position found, set the preferred one } else { //log('DropAgent._countAndSetPosition: does not fit') if (alignmentIndex === positionObj.alignments.length - 1) { return this._countAndSetPosition(type, ++positionIndex, 0); } else { return this._countAndSetPosition(type, positionIndex, ++alignmentIndex); } } } } _setPositionsAndAlignments(type) { this.drops[type].positions = []; // crate and push the position object const addPosition = (position) => { const alignments = [], preferredAlignment = this.drops[type].alignment, possibleAlignments = POSITIONS_ALIGNMENTS[position]; if (preferredAlignment && possibleAlignments.indexOf(preferredAlignment) > -1) { alignments.push(preferredAlignment); } possibleAlignments.forEach(function(alignment) { if (alignments.indexOf(alignment) === -1) { alignments.push(alignment); } }); this.drops[type].positions.push({ id: position, alignments: alignments }); }; addPosition(this.drops[type].position); // set the order of position fallbacks according to the preferred one switch (this.drops[type].position) { case POSITIONS.top: addPosition(POSITIONS.bottom); addPosition(POSITIONS.right); addPosition(POSITIONS.left); break; case POSITIONS.right: addPosition(POSITIONS.left); addPosition(POSITIONS.top); addPosition(POSITIONS.bottom); break; case POSITIONS.bottom: addPosition(POSITIONS.top); addPosition(POSITIONS.right); addPosition(POSITIONS.left); break; case POSITIONS.left: addPosition(POSITIONS.right); addPosition(POSITIONS.top); addPosition(POSITIONS.bottom); break; } } } var DropAgent$1 = new DropAgent(); class TrapTabNavigationDecorator { constructor() { this.wrapper = null; this.focusableElems = null; this.firstElem = null; this.lastElem = null; this.initFocus = null; this._onFirstElemKeydown = { handleEvent: (event) => { if (event.key === 'Tab' && event.shiftKey) { event.preventDefault(); this.lastElem.focus(); } } }; this._onLastElemKeydown = { handleEvent: (event) => { if (event.key === 'Tab' && !event.shiftKey) { event.preventDefault(); this.firstElem.focus(); } } }; } init(node, args) { if (!(node instanceof HTMLElement)) return { teardown : ()=>{} }; this.wrapper = node; const mutationObserver = new MutationObserver(() => this.trapTabNavigation()); mutationObserver.observe(node, { attributes: true, childList: true, characterData: true, subtree: true }); this.trapTabNavigation(); return { teardown:() => { mutationObserver && mutationObserver.disconnect(); this.untrapTabNavigation(); } }; } trapTabNavigation() { const FOCUSABLE_ELEMENTS = [ 'a[href]', // 'area[href]', 'button:not([disabled])', 'input:not([disabled])', 'select:not([disabled])', 'textarea:not([disabled])' // 'iframe', // 'object', // 'embed', // '*[tabindex]', // '*[contenteditable]', ]; this.focusableElems = this.wrapper.querySelectorAll(FOCUSABLE_ELEMENTS.join(',')); this.untrapTabNavigation(); if (this.focusableElems.length) { this.firstElem = this.focusableElems[0]; this.lastElem = this.focusableElems[this.focusableElems.length-1]; this.firstElem.addEventListener('keydown', this._onFirstElemKeydown, false); this.lastElem.addEventListener('keydown', this._onLastElemKeydown, false); if (this.initFocus === null) { this.initFocus = true; this.setInitFocus(); } } } untrapTabNavigation() { this.firstElem && this.firstElem.removeEventListener('keydown', this._onFirstElemKeydown, false); this.lastElem && this.lastElem.removeEventListener('keydown', this._onLastElemKeydown, false); } setInitFocus() { const isSomeElemFocused = Array.from(this.focusableElems).includes(document.activeElement); if (!isSomeElemFocused) { if (this.focusableElems.length > 1) { this.focusableElems[1].focus(); } else { this.firstElem.focus(); } } } } var trapTabNavigation = (node, args) => { const trapTabNavigationDecorator = new TrapTabNavigationDecorator; return trapTabNavigationDecorator.init(node, args); }; var css_248z$3 = "kin-dropdown {\n display: inline-block;\n position: relative;\n}\nkin-dropdown .kin_dropdown {\n display: none;\n position: fixed;\n background-color: var(--drop-bg);\n color: var(--drop-color);\n min-width: 15rem;\n max-width: 30rem;\n margin: 2px 0;\n padding-top: 1.2rem;\n padding-bottom: 1.2rem;\n padding-left: calc(var(--drop-item-radius) / 10);\n padding-right: calc(var(--drop-item-radius) / 10);\n border-radius: var(--drop-radius);\n z-index: 999999999;\n border: solid 1px rgba(213,211,230,0.15);\n box-shadow: 0 6px 12px 0 rgba(0,0,0,0.25);\n text-overflow: ellipsis;\n text-transform: none;\n text-align: start;\n letter-spacing: initial;\n font-weight: initial;\n cursor: default;\n}\nkin-dropdown .kin_dropdown.-visible {\n display: block;\n}\nkin-dropdown .kin_dropdown.-fit-large-dropdown {\n bottom: 0;\n max-height: 100%;\n overflow-y: auto;\n top: auto !important;\n}\nkin-dropdown .kin_dropdown.-tooltip {\n min-width: 0;\n padding: 1.2rem 1.6rem;\n text-align: start;\n font-size: var(--font-size-small);\n word-break: break-word;\n white-space: normal;\n}\nkin-dropdown .kin_dropdown.-timepicker {\n height: 20.5rem;\n overflow: scroll;\n grid-template-columns: auto auto;\n}\nkin-dropdown .kin_dropdown.-timepicker.-visible {\n display: grid;\n}\nkin-dropdown .kin_dropdown__overlay {\n position: fixed;\n z-index: 999999998;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: none;\n}\nkin-dropdown .kin_dropdown__overlay.-visible {\n display: block;\n}\n"; styleInject(css_248z$3); class Dropdown extends KinElement { static get attrCfg() { return { type: null, // dropdown|tooltip position: null // bottom|top|right|left }; } static get observedAttributes() { return Object.keys(Dropdown.attrCfg).filter(name => Dropdown.attrCfg[name]); } constructor() { super(); } initElem() { /* <div ref:elTpl class="kin_dropdown__wrap -{type}" on:mouseenter on:mouseleave> <div ref:elActivator class="kin_dropdown__activator" on:click="toggle()"> <slot name="dropdown-activator" /> </div> <div ref:elDrop class:-visible {visible} class="kin_dropdown {type !== 'dropdown' ? `-${type}` : ''}" style="top: {dropTop}px; left: {dropLeft}px;"> <slot /> </div> <div class="kin_dropdown__overlay" /> </div> */ // static attributes this._type = this.getAttribute('type') || 'dropdown'; this._position = this.getAttribute('position') || 'bottom'; this._id = this.getAttribute('tooltip-id') || 'tooltip-' + uid(); // nodes let node; this.elTpl = document.createElement('div'); this.elTpl.className = 'kin_dropdown__wrap'; if (this._type !== 'dropdown') { this.elTpl.classList.add('-' + this._type); } const _dropEsc = (evn) => { if (evn.code === 'Escape' || evn.keyCode === 27) { this.dropHide(); evn.preventDefault(); evn.stopPropagation(); } }; this._dropEscBind = _dropEsc.bind(this); if (this._type === 'tooltip') { this.elTpl.addEventListener('mouseenter', () => { clearTimeout(this._timerToggle); this._timerToggle = setTimeout(() => { this.dropShow(); }, 300); }); this.elTpl.addEventListener('mouseleave', () => { this._timerToggle = clearTimeout(this._timerToggle); this.dropHide(); }); window.addEventListener('keydown', this._dropEscBind); } else { this.elTpl.addEventListener('keydown', this._dropEscBind); } this.elActivator = document.createElement('div'); this.elActivator.className = 'kin_dropdown__activator'; if (this._type !== 'tooltip') { this.elActivator.addEventListener('click', () => { this._isVisible ? this.dropHide() : this.dropShow(); }); } node = document.createElement('slot'); node.setAttribute('name', 'dropdown-activator'); this.elActivator.appendChild(node); this.elTpl.appendChild(this.elActivator); this.elDrop = document.createElement('div'); this.elDrop.className = 'kin_dropdown'; if (this._type !== 'dropdown') { this.elDrop.classList.add('-' + this._type); } if (this._type === 'tooltip') { this.elActivator.setAttribute('aria-labelledby', this._id); this.elDrop.setAttribute('role', 'tooltip'); this.elDrop.setAttribute('id', this._id); } this.elDrop.appendChild(document.createElement('slot')); this.elTpl.appendChild(this.elDrop); // create an overlay element to prevent scrolling while active dropdown if (this._type !== 'tooltip') { this.elOverlay = document.createElement('div'); this.elOverlay.className = 'kin_dropdown__overlay'; this.elTpl.appendChild(this.elOverlay); } } elemRendered() { this._hideOnScrollOfElem = this.closest('kin-table'); } show() { this.elDrop.classList.add('-visible'); this._isVisible = true; if (this._type !== 'tooltip') { this.elOverlay.addEventListener('wheel', (e) => { e.preventDefault(); }); this.elOverlay.classList.add('-visible'); } else { this.elActivator.addEventListener('wheel', (e) => { e.preventDefault(); }); } } dropShow() { DropAgent$1.show( this, this._type, this.elActivator, this.elDrop, this._position, this._hideOnScrollOfElem ); this.show(); // focus the first focusable el. in dropdown // lock focus on dropdown if (this._type !== 'tooltip') { this.focusFirstItem(); this._trapTabNavigation = trapTabNavigation(this); } } hide() { this.elDrop.classList.remove('-visible'); this._isVisible = false; // disable wheel according to _type to enable click on the tooltip-activator if (this._type !== 'tooltip') { this.elOverlay.removeEventListener('wheel', (e) => { e.preventDefault(); }); this.elOverlay.classList.remove('-visible'); } else { this.elActivator.removeEventListener('wheel', (e) => { e.preventDefault(); }); } } dropHide() { DropAgent$1.hide(this._type); this.hide(); if (this._trapTabNavigation) { this._trapTabNavigation.teardown(); delete this._trapTabNavigation; } } elemDestroyed() { window.removeEventListener('keyup', this._dropEscBind); } focusFirstItem() { var focusItem = this.elDrop.getElementsByTagName('button', 'a')[0]; if (focusItem) { focusItem.focus(); } } } customElements.define('kin-dropdown', Dropdown); var css_248z$4 = "kin-dropdown-item {\n position: relative;\n display: block;\n}\nkin-dropdown-item .kin_dropdown__item {\n background-color: transparent;\n padding: 0.8rem 2rem;\n color: var(--drop-color);\n box-sizing: border-box;\n word-break: break-word;\n text-transform: initial;\n text-align: start;\n letter-spacing: initial;\n font-family: var(--font);\n font-size: var(--font-size);\n}\nkin-dropdown-item .kin_dropdown__item.-button,\nkin-dropdown-item .kin_dropdown__item.-link {\n display: block;\n text-decoration: none;\n cursor: pointer;\n border: 0;\n border-radius: var(--drop-item-radius);\n width: 100%;\n}\nkin-dropdown-item .kin_dropdown__item.-button:focus,\nkin-dropdown-item .kin_dropdown__item.-link:focus,\nkin-dropdown-item .kin_dropdown__item.-button:hover,\nkin-dropdown-item .kin_dropdown__item.-link:hover {\n background-color: rgba(255,255,255,0.1);\n outline: none;\n}\nkin-dropdown-item .kin_dropdown__item.-button[disabled=\"true\"],\nkin-dropdown-item .kin_dropdown__item.-link[disabled=\"true\"] {\n opacity: 0.3;\n cursor: default;\n pointer-events: none;\n}\nkin-dropdown-item .kin_dropdown__item.-small {\n font-size: var(--font-size-small);\n padding-top: 0.4rem;\n padding-bottom: 0.4rem;\n}\nkin-dropdown-item .kin_dropdown__item.-hr {\n border: 0;\n border-top: solid 1px;\n opacity: 0.15;\n padding: 0;\n margin: 0.8rem 2rem;\n}\nkin-dropdown-item .kin_dropdown__item.-title {\n font-weight: normal;\n font-size: var(--font-size-tiny);\n text-transform: uppercase;\n margin: 1rem 0 0;\n opacity: 0.7;\n letter-spacing: 2px;\n}\nkin-dropdown-item .kin_dropdown__item.-time {\n text-align: end;\n white-space: nowrap;\n}\n"; styleInject(css_248z$4); class DropdownItem extends KinElement { static get attrCfg() { return { type: null, // hr|custom|title|button link: { // button with link - <a href="{link}"> updateFn: 'updateAttr', updateCfg: { name: 'href' } }, 'kin-disabled': { // need to prefix because 'disabled' is reserved for focusable elements updateFn: 'toggleAttr', updateCfg: { attrName: 'disabled', attrValue: true } }, 'data-test': null }; } static get observedAttributes() { return Object.keys(DropdownItem.attrCfg).filter(name => DropdownItem.attrCfg[name]); } constructor() { super(); } initElem() { const type = this.getAttribute('type'); if (this.hasAttribute('link')) { this.elTpl = document.createElement('a'); this.elTpl.setAttribute('href', this.getAttribute('link')); this.elTpl.classList.add('-link'); this.elTpl.appendChild(document.createElement('slot')); } else if (type === 'hr') { this.elTpl = document.createElement('hr'); this.elTpl.classList.add('-hr'); } else if (type === 'title') { this.elTpl = document.createElement('h5'); this.elTpl.appendChild(document.createElement('slot')); this.elTpl.classList.add('-title'); } else if (type === 'custom') { this.elTpl = document.createElement('div'); this.elTpl.appendChild(document.createElement('slot')); this.elTpl.classList.add('-custom'); } else { this.elTpl = document.createElement('button'); this.elTpl.appendChild(document.createElement('slot')); this.elTpl.classList.add('-' + (type ? type : 'button')); } if (this.hasAttribute('data-test')) { this.elTpl.setAttribute('data-test', this.getAttribute('data-test')); this.removeAttribute('data-test'); } this.elTpl.classList.add('kin_dropdown__item'); } } customElements.define('kin-dropdown-item', DropdownItem); var css_248z$5 = "kin-select,\nkin-input {\n display: block;\n vertical-align: middle;\n}\nkin-select[inline],\nkin-input[inline] {\n display: inline-block;\n}\nkin-select .kin_input,\nkin-input .kin_input,\nkin-select .kin_select,\nkin-input .kin_select {\n font-family: var(--font);\n font-size: var(--font-size);\n height: var(--input-height);\n border-radius: var(--input-radius);\n background-color: var(--input-bg);\n color: var(--color-text);\n border: solid 1px var(--input-border);\n padding: 0 1rem;\n display: block;\n width: 100%;\n text-align: start;\n}\nkin-select .kin_input[type='search']::-webkit-search-cancel-button,\nkin-input .kin_input[type='search']::-webkit-search-cancel-button,\nkin-select .kin_select[type='search']::-webkit-search-cancel-button,\nkin-input .kin_select[type='search']::-webkit-search-cancel-button {\n -webkit-appearance: none;\n appearance: none;\n width: 1.6rem;\n height: 1.6rem;\n position: relative;\n background-color: var(--input-border);\n -webkit-mask-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAHlBMVEUAAAADAwQDAwQDAwQDAwQDAwQDAwQDAwQDAwQDAwRG0XY1AAAACXRSTlMAMFBgcI+fv+80x9rAAAAAfElEQVR42u3UQQoCMAwF0dpoau5/YVGQAWNhwKX9276hu4yzf9wlRl/E3t8ruq+Kva+K7rfFrOeu3X8NeE3rKayn0J7CegrpKfCyWHhX4E2Bl8uXX1LzQ3qvC3yqAh/vznp+sp7CegrrKYR3xcR/FLffroa/S/7yiZ2dPQCOFwkSiBgObwAAAABJRU5ErkJggg==\");\n -webkit-mask-size: 100%;\n cursor: pointer;\n}\nkin-select .kin_input[type='search']::-webkit-search-cancel-button:hover,\nkin-input .kin_input[type='search']::-webkit-search-cancel-button:hover,\nkin-select .kin_select[type='search']::-webkit-search-cancel-button:hover,\nkin-input .kin_select[type='search']::-webkit-search-cancel-button:hover {\n background-color: var(--color-text);\n}\nkin-select .kin_input:focus,\nkin-input .kin_input:focus,\nkin-select .kin_select:focus,\nkin-input .kin_select:focus {\n outline: none;\n border-color: var(--input-border-focus);\n}\nkin-select .kin_input.-error,\nkin-input .kin_input.-error,\nkin-select .kin_select.-error,\nkin-input .kin_select.-error {\n border-color: var(--color-critical);\n}\nkin-select .kin_input.-large,\nkin-input .kin_input.-large,\nkin-select .kin_select.-large,\nkin-input .kin_select.-large {\n height: 5.6rem;\n font-size: var(--font-size-large);\n}\nkin-select .kin_input.-small,\nkin-input .kin_input.-small,\nkin-select .kin_select.-small,\nkin-input .kin_select.-small {\n height: 3rem;\n font-size: var(--font-size-small);\n}\nkin-select .kin_input__label,\nkin-input .kin_input__label,\nkin-select .kin_select__label,\nkin-input .kin_select__label {\n font-size: var(--input-label-size);\n line-height: var(--input-label-size);\n text-transform: var(--input-label-transform);\n color: var(--color-text-secondary);\n padding: 0 1rem 0.2rem;\n display: block;\n}\nkin-select .kin_input__label.-focused,\nkin-input .kin_input__label.-focused,\nkin-select .kin_select__label.-focused,\nkin-input .kin_select__label.-focused {\n color: var(--input-border-focus);\n}\nkin-select .kin_input__label.-error,\nkin-input .kin_input__label.-error,\nkin-select .kin_select__label.-error,\nkin-input .kin_select__label.-error {\n color: var(--color-critical);\n}\nkin-select .kin_input__label.-inline,\nkin-input .kin_input__label.-inline,\nkin-select .kin_select__label.-inline,\nkin-input .kin_select__label.-inline {\n display: inline-block;\n padding: 0;\n vertical-align: middle;\n}\nkin-select .kin_input__error,\nkin-input .kin_input__error,\nkin-select .kin_select__error,\nkin-input .kin_select__error {\n padding: 0 3rem;\n margin-bottom: -2.5rem;\n min-height: 2.5rem;\n font-size: var(--font-size-small);\n}\nkin-select .kin_input__error kin-icon,\nkin-input .kin_input__error kin-icon,\nkin-select .kin_select__error kin-icon,\nkin-input .kin_select__error kin-icon {\n position: absolute;\n margin: 1px -2rem 0;\n}\nkin-select .kin_input__hint,\nkin-input .kin_input__hint,\nkin-select .kin_select__hint,\nkin-input .kin_select__hint {\n width: 3rem;\n position: absolute;\n height: var(--input-height);\n display: flex;\n justify-content: center;\n align-items: center;\n margin: calc(var(--input-height) * -1) 100% 0;\n}\nkin-select .kin_input.-large ~ .kin_select__hint,\nkin-input .kin_input.-large ~ .kin_select__hint,\nkin-select .kin_select.-large ~ .kin_select__hint,\nkin-input .kin_select.-large ~ .kin_select__hint,\nkin-select .kin_input.-large ~ .kin_input__hint,\nkin-input .kin_input.-large ~ .kin_input__hint,\nkin-select .kin_select.-large ~ .kin_input__hint,\nkin-input .kin_select.-large ~ .kin_input__hint {\n height: 5.6rem;\n margin-top: -5.6rem;\n}\nkin-select .kin_input.-small ~ .kin_select__hint,\nkin-input .kin_input.-small ~ .kin_select__hint,\nkin-select .kin_select.-small ~ .kin_select__hint,\nkin-input .kin_select.-small ~ .kin_select__hint,\nkin-select .kin_input.-small ~ .kin_input__hint,\nkin-input .kin_input.-small ~ .kin_input__hint,\nkin-select .kin_select.-small ~ .kin_input__hint,\nkin-input .kin_select.-small ~ .kin_input__hint {\n height: 3rem;\n margin-top: -3rem;\n}\nkin-select .kin_input__wrap,\nkin-input .kin_input__wrap,\nkin-select .kin_select__wrap,\nkin-input .kin_select__wrap {\n box-sizing: border-box;\n position: relative;\n text-align: start;\n display: block;\n}\nkin-select .kin_input__wrap.-disabled,\nkin-input .kin_input__wrap.-disabled,\nkin-select .kin_select__wrap.-disabled,\nkin-input .kin_select__wrap.-disabled {\n pointer-events: none;\n opacity: 0.5;\n}\nkin-select .kin_input__wrap.-formrow,\nkin-input .kin_input__wrap.-formrow,\nkin-select .kin_select__wrap.-formrow,\nkin-input .kin_select__wrap.-formrow {\n padding: 1rem 0 2.5rem;\n margin: 0 3rem;\n}\nkin-select .kin_input__wrap.-inline,\nkin-input .kin_input__wrap.-inline,\nkin-select .kin_select__wrap.-inline,\nkin-input .kin_select__wrap.-inline {\n min-height: 0;\n display: inline-flex;\n flex-flow: row;\n vertical-align: middle;\n align-items: center;\n}\nkin-select .kin_input__wrap.-simplerow,\nkin-input .kin_input__wrap.-simplerow,\nkin-select .kin_select__wrap.-simplerow,\nkin-input .kin_select__wrap.-simplerow {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex-wrap: wrap;\n padding: 0.6rem 0;\n}\nkin-select .kin_input__wrap.-simplerow .kin_input,\nkin-input .kin_input__wrap.-simplerow .kin_input,\nkin-select .kin_select__wrap.-simplerow .kin_input,\nkin-input .kin_select__wrap.-simplerow .kin_input,\nkin-select .kin_input__wrap.-simplerow .kin_select,\nkin-input .kin_input__wrap.-simplerow .kin_select,\nkin-select .kin_select__wrap.-simplerow .kin_select,\nkin-input .kin_select__wrap.-simplerow .kin_select {\n width: 50%;\n}\nkin-select .kin_input__wrap.-simplerow .kin_input__label,\nkin-input .kin_input__wrap.-simplerow .kin_input__label,\nkin-select .kin_select__wrap.-simplerow .kin_input__label,\nkin-input .kin_select__wrap.-simplerow .kin_input__label,\nkin-select .kin_input__wrap.-simplerow .kin_select__label,\nkin-input .kin_input__wrap.-simplerow .kin_select__label,\nkin-select .kin_select__wrap.-simplerow .kin_select__label,\nkin-input .kin_select__wrap.-simplerow .kin_select__label {\n width: 25%;\n text-align: end;\n}\nkin-select .kin_input__wrap.-simplerow .kin_input__error,\nkin-input .kin_input__wrap.-simplerow .kin_input__error,\nkin-select .kin_select__wrap.-simplerow .kin_input__error,\nkin-input .kin_select__wrap.-simplerow .kin_input__error,\nkin-select .kin_input__wrap.-simplerow .kin_select__error,\nkin-input .kin_input__wrap.-simplerow .kin_select__error,\nkin-select .kin_select__wrap.-simplerow .kin_select__error,\nkin-input .kin_select__wrap.-simplerow .kin_select__error {\n min-height: 0;\n margin: 0 25%;\n}\nkin-select .kin_input__wrap.-simplerow .kin_input__hint,\nkin-input .kin_input__wrap.-simplerow .kin_input__hint,\nkin-select .kin_select__wrap.-simplerow .kin_input__hint,\nkin-input .kin_select__wrap.-simplerow .kin_input__hint,\nkin-select .kin_input__wrap.-simplerow .kin_select__hint,\nkin-input .kin_input__wrap.-simplerow .kin_select__hint,\nkin-select .kin_select__wrap.-simplerow .kin_select__hint,\nkin-input .kin_select__wrap.-simplerow .kin_select__hint {\n position: static;\n left: auto;\n right: auto;\n margin: 0;\n}\nkin-select .kin_input__chevron,\nkin-input .kin_input__chevron,\nkin-select .kin_select__chevron,\nkin-input .kin_select__chevron,\nkin-select .kin_input__eye,\nkin-input .kin_input__eye,\nkin-select .kin_select__eye,\nkin-input .kin_select__eye {\n position: absolute;\n right: 0;\n width: 3rem;\n height: var(--input-height);\n border-radius: var(--input-radius);\n display: flex;\n justify-content: center;\n align-items: center;\n pointer-events: none;\n transform: translateY(-100%);\n z-index: 0;\n}\nkin-select .kin_input.-large ~ .kin_input__eye,\nkin-input .kin_input.-large ~ .kin_input__eye,\nkin-select .kin_select.-large ~ .kin_input__eye,\nkin-input .kin_select.-large ~ .kin_input__eye,\nkin-select .kin_input.-large ~ .kin_select__chevron,\nkin-input .kin_input.-large ~ .kin_select__chevron,\nkin-select .kin_select.-large ~ .kin_select__chevron,\nkin-input .kin_select.-large ~ .kin_select__chevron {\n height: 5.6rem;\n}\nkin-select .kin_input.-small ~ .kin_input__eye,\nkin-input .kin_input.-small ~ .kin_input__eye,\nkin-select .kin_select.-small ~ .kin_input__eye,\nkin-input .kin_select.-small ~ .kin_input__eye,\nkin-select .kin_input.-small ~ .kin_select__chevron,\nkin-input .kin_input.-small ~ .kin_select__chevron,\nkin-select .kin_select.-small ~ .kin_select__chevron,\nkin-input .kin_select.-small ~ .kin_select__chevron {\n height: 3rem;\n}\nkin-select .kin_input__wrap.-inline .kin_input__eye,\nkin-input .kin_input__wrap.-inline .kin_input__eye,\nkin-select .kin_select__wrap.-inline .kin_input__eye,\nkin-input .kin_select__wrap.-inline .kin_input__eye,\nkin-select .kin_input__wrap.-inline .kin_select__chevron,\nkin-input .kin_input__wrap.-inline .kin_select__chevron,\nkin-select .kin_select__wrap.-inline .kin_select__chevron,\nkin-input .kin_select__wrap.-inline .kin_select__chevron {\n transform: none;\n}\nkin-select .kin_input:hover ~ .kin_select__chevron,\nkin-input .kin_input:hover ~ .kin_select__chevron,\nkin-select .kin_select:hover ~ .kin_select__chevron,\nkin-input .kin_select:hover ~ .kin_select__chevron {\n background-color: var(--input-border);\n}\nkin-select .kin_input__wrap,\nkin-input .kin_input__wrap,\nkin-select .kin_select__wrap,\nkin-input .kin_select__wrap {\n position: relative;\n}\nkin-select .kin_input__wrap.-simplerow .kin_input__eye,\nkin-input .kin_input__wrap.-simplerow .kin_input__eye,\nkin-select .kin_select__wrap.-simplerow .kin_input__eye,\nkin-input .kin_select__wrap.-simplerow .kin_input__eye,\nkin-select .kin_input__wrap.-simplerow .kin_select__chevron,\nkin-input .kin_input__wrap.-simplerow .kin_select__chevron,\nkin-select .kin_select__wrap.-simplerow .kin_select__chevron,\nkin-input .kin_select__wrap.-simplerow .kin_select__chevron {\n transform: none;\n right: 25%;\n align-self: flex-start;\n}\nkin-select .kin_input__eye,\nkin-input .kin_input__eye,\nkin-select .kin_select__eye,\nkin-input .kin_select__eye {\n z-index: 2;\n cursor: pointer;\n pointer-events: all;\n}\nkin-select .kin_input__eye input[type='checkbox'],\nkin-input .kin_input__eye input[type='checkbox'],\nkin-select .kin_select__eye input[type='checkbox'],\nkin-input .kin_select__eye input[type='checkbox'] {\n width: 2.2rem;\n height: 2.2rem;\n line-height: 2.2rem;\n margin: 0;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n border-radius: 5rem;\n cursor: pointer;\n}\nkin-select .kin_input__eye input[type='checkbox']:hover,\nkin-input .kin_input__eye input[type='checkbox']:hover,\nkin-select .kin_select__eye input[type='checkbox']:hover,\nkin-input .kin_select__eye input[type='checkbox']:hover {\n background: var(--input-border);\n}\nkin-select .kin_input__eye span,\nkin-input .kin_input__eye span,\nkin-select .kin_select__eye span,\nkin-input .kin_select__eye span {\n width: 0;\n height: 0;\n overflow: hidden;\n}\nkin-select .kin_input__eye kin-icon,\nkin-input .kin_input__eye kin-icon,\nkin-select .kin_select__eye kin-icon,\nkin-input .kin_select__eye kin-icon {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n pointer-events: none;\n display: flex;\n justify-content: center;\n align-items: center;\n}\nkin-select .kin_select,\nkin-input .kin_select {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n cursor: pointer;\n z-index: 1;\n}\nkin-select .kin_select option,\nkin-input .kin_select option {\n color: initial;\n}\nkin-select .kin_select,\nkin-input .kin_select,\nkin-select .kin_input.-eye,\nkin-input .kin_input.-eye {\n padding-right: 3rem;\n}\nbody[dir='rtl'] kin-input .kin_input.-eye,\nbody[dir='rtl'] kin-select .kin_input.-eye,\nbody[dir='rtl'] kin-input .kin_select,\nbody[dir='rtl'] kin-select .kin_select {\n padding-right: 1rem;\n padding-left: 3rem;\n}\nbody[dir='rtl'] kin-input .kin_input.-eye ~ .kin_select__chevron,\nbody[dir='rtl'] kin-select .kin_input.-eye ~ .kin_select__chevron,\nbody[dir='rtl'] kin-input .kin_select ~ .kin_select__chevron,\nbody[dir='rtl'] kin-select .kin_select ~ .kin_select__chevron,\nbody[dir='rtl'] kin-input .kin_input.-eye ~ .kin_input__eye,\nbody[dir='rtl'] kin-select .kin_input.-eye ~ .kin_input__eye,\nbody[dir='rtl'] kin-input .kin_select ~ .kin_input__eye,\nbody[dir='rtl'] kin-select .kin_select ~ .kin_input__eye {\n right: auto;\n left: 0;\n}\nbody[dir='rtl'] kin-input .kin_input.-eye__wrap.-simplerow .kin_select__chevron,\nbody[dir='rtl'] kin-select .kin_input.-eye__wrap.-simplerow .kin_select__chevron,\nbody[dir='rtl'] kin-input .kin_select__wrap.-simplerow .kin_select__chevron,\nbody[dir='rtl'] kin-select .kin_select__wrap.-simplerow .kin_select__chevron,\nbody[dir='rtl'] kin-input .kin_input.-eye__wrap.-simplerow .kin_input__eye,\nbody[dir='rtl'] kin-select .kin_input.-eye__wrap.-simplerow .kin_input__eye,\nbody[dir='rtl'] kin-input .kin_select__wrap.-simplerow .kin_input__eye,\nbody[dir='rtl'] kin-select .kin_select__wrap.-simplerow .kin_input__eye {\n right: auto;\n left: 25%;\n}\nkin-input .kin_input[type='datetime-local']::-webkit-calendar-picker-indicator,\nkin-input .kin_input[type='time']::-webkit-calendar-picker-indicator,\nkin-input .kin_input[type='date']::-webkit-calendar-picker-indicator {\n background-color: #fff;\n border-radius: 5px;\n padding: 3px;\n cursor: pointer;\n}\nkin-input .kin_input.-textarea {\n height: auto;\n min-height: 10rem;\n padding-top: 0.8rem;\n padding-bottom: 0.8rem;\n}\n"; styleInject(css_248z$5); class Input extends KinElement { static get attrCfg() { return { value: null, label: null, id: null, type: null, inline : { updateFn: 'toggleClass', updateCfg: { cssCls: '-inline' } }, error: { updateFn: 'toggleAttr', }, placeholder: null, 'kin-disabled': { // need to prefix because 'disabled' is reserved for focusable elements updateFn: ['toggleAttr', 'toggleClass'], updateCfg: [{ attrName: 'disabled', attrValue: true, el: 'inputElem' }, { cssCls: '-disabled' }] }, formrow: { updateFn: 'toggleClass', updateCfg: { cssCls: '-formrow' } }, simplerow: { updateFn: 'toggleClass', updateCfg: { cssCls: '-simplerow' } }, size: { updateFn: 'updateClass' }, title: { // title updateFn: 'updateAttr', updateCfg: { name: 'title' } }, }; } static get observedAttributes() { return Object.keys(Input.attrCfg).filter(name => Input.attrCfg[name]); } constructor() { super(); } initElem() { const eye = this.getAttribute('eye'); const hint = this.getAttribute('hint'); this.elTpl = document.createElement('div'); this.elTpl.classList.add('kin_input__wrap'); this.initInputElem(); if (hint) { this.initHint(); } if (eye) { this.initEye(); } this.focusableElem = this.inputElem; } updateElem() { // TODO: rozebrat a pouzit dependece attributu this.updateInputElem(); this.updateLabelElem(); this.updateErrorElem(); } initInputElem() { if (this.getAttribute('type') === 'textarea') { this.inputElem = document.createElement('textarea'); } else { this.inputElem = document.createElement('input'); } this.inputElem.classList.add('kin_input'); this.elTpl.appendChild(this.inputElem); } updateInputElem() { this.inputElem.setAttribute('id', this.getAttribute('id') || uid()); if (this.getAttribute('type') !== 'textarea') { this.inputElem.type = this.getAttribute('type') || 'text'; } if (this.getAttribute('type') === 'textarea') { this.inputElem.classList.add('-textarea'); } if (this.hasAttribute('size')) { this.inputElem.classList.add('-' + this.getAttribute('size')); } else { this.inputElem.classList.remove('-' + this.getAttribute('size')); } this.inputElem.value = this.getAttribute('value') || ''; this.inputElem.placeholder = this.getAttribute('placeholder') || ''; if (this.getAttribute('error')) { this.inputElem.classList.add('-error'); this.inputElem.setAttribute('aria-invalid', 'true'); const errId = this.inputElem.getAttribute('id')+"_error"; this.inputElem.setAttribute('aria-errormessage', errId); } else { this.inputElem.classList.remove('-error'); this.inputElem.removeAttribute('aria-invalid'); this.inputElem.removeAttribute('aria-errormessage'); } } getLabelElem() { if (this.labelElem) { return this.labelElem; } this.labelElem = document.createElement('label'); this.labelElem.classList.add('kin_input__label'); this.inputElem.addEventListener('focus', event => { this.labelElem.classList.add('-focused'); }); this.inputElem.addEventListener('blur', event => { this.labelElem.classList.remove('-focused'); }); return this.labelElem; } updateLabelElem() { const label = this.getAttribute('label'); const labelElem = this.getLabelElem(); const elemAdded = this.elTpl.contains(labelElem); if (label) { this.labelElem.setAttribute('for', this.inputElem.getAttribute('id')); if (this.getAttribute('error')) { this.labelElem.classList.add('-error'); } else { this.labelElem.classList.remove('-error'); } this.labelElem.innerText = label; if (!elemAdded) { this.inputElem.before(labelElem); } } else if (elemAdded) { this.elTpl.removeChild(labelElem); } } getErrorElem() { if (this.errorElem) { return this.errorElem; } const errorElemStr = '<p class="kin_input__error" role="alert"><kin-icon name="badge-critical" size="15"></kin-icon> ' + this.getAttribute('error') + '</p>'; this.errorElem = this.getDomParser() .parseFromString(errorElemStr, 'text/html') .querySelector('p'); return this.errorElem; } updateErrorElem() { const error = this.getAttribute('error'); const errorElem = this.getErrorElem(); const elemAdded = this.elTpl.contains(errorElem); if (error) { const errId = this.inputElem.getAttribute('id')+"_error"; errorElem.setAttribute('id', errId); errorElem.innerHTML = '<kin-icon name="badge-critical" size="15"></kin-icon> ' + error; if (!elemAdded) { this.elTpl.appendChild(errorElem); } } else if (elemAdded) { this.elTpl.removeChild(errorElem); } } initHint() { this.hintElem = document.createElement('kin-tooltip'); this.hintElem.classList.add('kin_input__hint'); this.hintElem.innerHTML = '<kin-icon name="icon-m-action-info" size="20" slot="tooltip-activator"></kin-icon><div slot="tooltip">' + this.getAttribute('hint') + '</div>'; this.elTpl.appendChild(this.hintElem); } // create 'eye' button for revealing password initEye() { const eye = this.getAttribute('eye'); let pwdVisible = false; this.eyeElem = document.createElement('label'); this.eyeElem.classList.add('kin_input__eye'); this.eyeElem.innerHTML = '<input type="checkbox" /><span>' + `${eye != 'true' ? eye : 'Show password'}` + '</span><kin-icon name="icon-m-eye" size="16" />'; this.eyeElemBtn = this.eyeElem.querySelector('input[type="checkbox"]'); // change input type this.eyeElemBtn.addEventListener('change', event => { pwdVisible = !pwdVisible; let icon = this.eyeElem.querySelector('kin-icon'); if (pwdVisible) { this.inputElem.setAttribute('type', 'text'); icon.setAttribute('name', 'icon-m-eye-striked'); } else { this.inputElem.setAttribute('type', 'password'); icon.setAttribute('name', 'icon-m-eye'); } }); this.inputElem.classList.add('-eye'); this.elTpl.appendChild(this.eyeElem); } } customElements.define('kin-input', Input); var css_248z$6 = "kin-select,\nkin-input {\n display: block;\n vertical-align: middle;\n}\nkin-select[inline],\nkin-input[inline] {\n display: inline-block;\n}\nkin-select .kin_input,\nkin-input .kin_input,\nkin-select .kin_select,\nkin-input .kin_select {\n font-family: var(--font);\n font-size: var(--font-size);\n height: var(--input-height);\n border-radius: var(--input-radius);\n background-color: var(--input-bg);\n color: var(--color-text);\n border: solid 1px var(--input-border);\n padding: 0 1rem;\n display: block;\n width: 100%;\n text-align: start;\n}\nkin-select .kin_input[type='search']::-webkit-search-cancel-button,\nkin-input .kin_input[type='search']::-webkit-search-cancel-button,\nkin-select .kin_select[type='search']::-webkit-search-cancel-button,\nkin-input .kin_select[type='search']::-webkit-search-cancel-button {\n -webkit-appearance: none;\n appearance: none;\n width: 1.6rem;\n height: 1.6rem;\n position: relative;\n background-color: var(--input-border);\n -webkit-mask-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAHlBMVEUAAAADAwQDAwQDAwQDAwQDAwQDAwQDAwQDAwQDAwRG0XY1AAAACXRSTlMAMFBgcI+fv+80x9rAAAAAfElEQVR42u3UQQoCMAwF0dpoau5/YVGQAWNhwKX9276hu4yzf9wlRl/E3t8ruq+Kva+K7rfFrOeu3X8NeE3rKayn0J7CegrpKfCyWHhX4E2Bl8uXX1LzQ3qvC3yqAh/vznp+sp7CegrrKYR3xcR/FLffroa/S/7yiZ2dPQCOFwkSiBgObwAAAABJRU5ErkJggg==\");\n -webkit-mask-size: 100%;\n cursor: pointer;\n}\nkin-select .kin_input[type='search']::-webkit-search-cancel-button:hover,\nkin-input .kin_input[type='search']::-webkit-search-cancel-button:hover,\nkin-select .kin_select[type='search']::-webkit-search-cancel-button:hover,\nkin-input .kin_select[type='search']::-webkit-search-cancel-button:hover {\n background-color: var(--color-text);\n}\nkin-select .kin_input:focus,\nkin-input .kin_input:focus,\nkin-select .kin_select:focus,\nkin-input .kin_select:focus {\n outline: none;\n border-color: var(--input-border-focus);\n}\nkin-select .kin_input.-error,\nkin-input .kin_input.-error,\nkin-select .kin_select.-error,\nkin-input .kin_select.-error {\n border-color: var(--color-critical);\n}\nkin-select .kin_input.-large,\nkin-input .kin_input.-large,\nkin-select .kin_select.-large,\nkin-input .kin_select.-large {\n height: 5.6rem;\n font-size: var(--font-size-large);\n}\nkin-select .kin_input.-small,\nkin-input .kin_input.-small,\nkin-select .kin_select.-small,\nkin-input .kin_select.-small {\n height: 3rem;\n font-size: var(--font-size-small);\n}\nkin-select .kin_input__label,\nkin-input .kin_input__label,\nkin-select .kin_select__label,\nkin-input .kin_select__label {\n font-size: var(--input-label-size);\n line-height: var(--input-label-size);\n text-transform: var(--input-label-transform);\n color: var(--color-text-secondary);\n padding: 0 1rem 0.2rem;\n display: block;\n}\nkin-select .kin_input__label.-focused,\nkin-input .kin_input__label.-focused,\nkin-select .kin_select__label.-focused,\nkin-input .kin_select__label.-focused {\n color: var(--input-border-focus);\n}\nkin-select .kin_input__label.-error,\nkin-input .kin_input__label.-error,\nkin-select .kin_select__label.-error,\nkin-input .kin_select__label.-error {\n color: var(--color-critical);\n}\nkin-select .kin_input__label.-inline,\nkin-input .kin_input__label.-inline,\nkin-select .kin_select__label.-inline,\nkin-input .kin_select__label.-inline {\n display: inline-block;\n padding: 0;\n vertical-align: middle;\n}\nkin-select .kin_input__error,\nkin-input .kin_input__error,\nkin-select .kin_select__error,\nkin-input .kin_select__error {\n padding: 0 3rem;\n margin-bottom: -2.5rem;\n min-height: 2.5rem;\n font-size: var(--font-size-small);\n}\nkin-select .kin_input__error kin-icon,\nkin-input .kin_input__error kin-icon,\nkin-select .kin_select__error kin-icon,\nkin-input .kin_select__error kin-icon {\n position: absolute;\n margin: 1px -2rem 0;\n}\nkin-select .kin_input__hint,\nkin-input .kin_input__hint,\nkin-select .kin_select__hint,\nkin-input .kin_select__hint {\n width: 3rem;\n position: absolute;\n height: var(--input-height);\n display: flex;\n justify-content: center;\n align-items: center;\n margin: calc(var(--input-height) * -1) 100% 0;\n}\nkin-select .kin_input.-large ~ .kin_select__hint,\nkin-input .kin_input.-large ~ .kin_select__hint,\nkin-select .kin_select.-large ~ .kin_select__hint,\nkin-input .kin_select.-large ~ .kin_select__hint,\nkin-select .kin_input.-large ~ .kin_input__hint,\nkin-input .kin_input.-large ~ .kin_input__hint,\nkin-select .kin_select.-large ~ .kin_input__hint,\nkin-input .kin_select.-large ~ .kin_input__hint {\n height: 5.6rem;\n margin-top: -5.6rem;\n}\nkin-select .kin_input.-small ~ .kin_select__hint,\nkin-input .kin_input.-small ~ .kin_select__hint,\nkin-select .kin_select.-small ~ .kin_select__hint,\nkin-input .kin_select.-small ~ .kin_select__hint,\nkin-select .kin_input.-small ~ .kin_input__hint,\nkin-input .kin_input.-small ~ .kin_input__hint,\nkin-select .kin_select.-small ~ .kin_input__hint,\nkin-input .kin_select.-small ~ .kin_input__hint {\n height: 3rem;\n margin-top: -3rem;\n}\nkin-select .kin_input__wrap,\nkin-input .kin_input__wrap,\nkin-select .kin_select__wrap,\nkin-input .kin_select__wrap {\n box-sizing: border-box;\n position: relative;\n text-align: start;\n display: block;\n}\nkin-select .kin_input__wrap.-disabled,\nkin-input .kin_input__wrap.-disabled,\nkin-select .kin_select__wrap.-disabled,\nkin-input .kin_select__wrap.-disabled {\n pointer-events: none;\n opacity: 0.5;\n}\nkin-select .kin_input__wrap.-formrow,\nkin-input .kin_input__wrap.-formrow,\nkin-select .kin_select__wrap.-formrow,\nkin-input .kin_select__wrap.-formrow {\n padding: 1rem 0 2.5rem;\n margin: 0 3rem;\n}\nkin-select .kin_input__wrap.-inline,\nkin-input .kin_input__wrap.-inline,\nkin-select .kin_select__wrap.-inline,\nkin-input .kin_select__wrap.-inline {\n min-height: 0;\n display: inline-flex;\n flex-flow: row;\n vertical-align: middle;\n align-items: center;\n}\nkin-select .kin_input__wrap.-simplerow,\nkin-input .kin_input__wrap.-simplerow,\nkin-select .kin_select__wrap.-simplerow,\nkin-input .kin_select__wrap.-simplerow {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex-wrap: wrap;\n padding: 0.6rem 0;\n}\nkin-select .kin_input__wrap.-simplerow .kin_input,\nkin-input .kin_input__wrap.-simplerow .kin_input,\nkin-select .kin_select__wrap.-simplerow .kin_input,\nkin-input .kin_select__wrap.-simplerow .kin_input,\nkin-select .kin_input__wrap.-simplerow .kin_select,\nkin-input .kin_input__wrap.-simplerow .kin_select,\nkin-select .kin_select__wrap.-simplerow .kin_select,\nkin-input .kin_select__wrap.-simplerow .kin_select {\n width: 50%;\n}\nkin-select .kin_input__wrap.-simplerow .kin_input__label,\nkin-input .kin_input__wrap.-simplerow .kin_input__label,\nkin-select .kin_select__wrap.-simplerow .kin_input__label,\nkin-input .kin_select__wrap.-simplerow .kin_input__label,\nkin-select .kin_input__wrap.-simplerow .kin_select__label,\nkin-input .kin_input__wrap.-simplerow .kin_select__label,\nkin-select .kin_select__wrap.-simplerow .kin_select__label,\nkin-input .kin_select__wrap.-simplerow .kin_select__label {\n width: 25%;\n text-align: end;\n}\nkin-select .kin_input__wrap.-simplerow .kin_input__error,\nkin-input .kin_input__wrap.-simplerow .kin_input__error,\nkin-select .kin_select__wrap.-simplerow .kin_input__error,\nkin-input .kin_select__wrap.-simplerow .kin_input__error,\nkin-select .kin_input__wrap.-simplerow .kin_select__error,\nkin-input .kin_input__wrap.-simplerow .kin_select__error,\nkin-select .kin_select__wrap.-simplerow .kin_select__error,\nkin-input .kin_select__wrap.-simplerow .kin_select__error {\n min-height: 0;\n margin: 0 25%;\n}\nkin-select .kin_input__wrap.-simplerow .kin_input__hint,\nkin-input .kin_input__wrap.-simplerow .kin_input__hint,\nkin-select .kin_select__wrap.-simplerow .kin_input__hint,\nkin-input .kin_select__wrap.-simplerow .kin_input__hint,\nkin-select .kin_input__wrap.-simplerow .kin_select__hint,\nkin-input .kin_input__wrap.-simplerow .kin_select__hint,\nkin-select .kin_select__wrap.-simplerow .kin_select__hint,\nkin-input .kin_select__wrap.-simplerow .kin_select__hint {\n position: static;\n left: auto;\n right: auto;\n margin: 0;\n}\nkin-select .kin_input__chevron,\nkin-input .kin_input__chevron,\nkin-select .kin_select__chevron,\nkin-input .kin_select__chevron,\nkin-select .kin_input__eye,\nkin-input .kin_input__eye,\nkin-select .kin_select__eye,\nkin-input .kin_select__eye {\n position: absolute;\n right: 0;\n width: 3rem;\n height: var(--input-height);\n border-radius: var(--input-radius);\n display: flex;\n justify-content: center;\n align-items: center;\n pointer-events: none;\n transform: translateY(-100%);\n z-index: 0;\n}\nkin-select .kin_input.-large ~ .kin_input__eye,\nkin-input .kin_input.-large ~ .kin_input__eye,\nkin-select .kin_select.-large ~ .kin_input__eye,\nkin-input .kin_select.-large ~ .kin_input__eye,\nkin-select .kin_input.-large ~ .kin_select__chevron,\nkin-input .kin_input.-large ~ .kin_select__chevron,\nkin-select .kin_select.-large ~ .kin_select__chevron,\nkin-input .kin_select.-large ~ .kin_select__chevron {\n height: 5.6rem;\n}\nkin-select .kin_input.-small ~ .kin_input__eye,\nkin-input .kin_input.-small ~ .kin_input__eye,\nkin-select .kin_select.-small ~ .kin_input__eye,\nkin-input .kin_select.-small ~ .kin_input__eye,\nkin-select .kin_input.-small ~ .kin_select__chevron,\nkin-input .kin_input.-small ~ .kin_select__chevron,\nkin-select .kin_select.-small ~ .kin_select__chevron,\nkin-input .kin_select.-small ~ .kin_select__chevron {\n height: 3rem;\n}\nkin-select .kin_input__wrap.-inline .kin_input__eye,\nkin-input .kin_input__wrap.-inline .kin_input__eye,\nkin-select .kin_select__wrap.-inline .kin_input__eye,\nkin-input .kin_select__wrap.-inline .kin_input__eye,\nkin-select .kin_input__wrap.-inline .kin_select__chevron,\nkin-input .kin_input__wrap.-inline .kin_select__chevron,\nkin-select .kin_select__wrap.-inline .kin_select__chevron,\nkin-input .kin_select__wrap.-inline .kin_select__chevron {\n transform: none;\n}\nkin-select .kin_input:hover ~ .kin_select__chevron,\nkin-input .kin_input:hover ~ .kin_select__chevron,\nkin-select .kin_select:hover ~ .kin_select__chevron,\nkin-input .kin_select:hover ~ .kin_select__chevron {\n background-color: var(--input-border);\n}\nkin-select .kin_input__wrap,\nkin-input .kin_input__wrap,\nkin-select .kin_select__wrap,\nkin-input .kin_select__wrap {\n position: relative;\n}\nkin-select .kin_input__wrap.-simplerow .kin_input__eye,\nkin-input .kin_input__wrap.-simplerow .kin_input__eye,\nkin-select .kin_select__wrap.-simplerow .kin_input__eye,\nkin-input .kin_select__wrap.-simplerow .kin_input__eye,\nkin-select .kin_input__wrap.-simplerow .kin_select__chevron,\nkin-input .kin_input__wrap.-simplerow .kin_select__chevron,\nkin-select .kin_select__wrap.-simplerow .kin_select__chevron,\nkin-input .kin_select__wrap.-simplerow .kin_select__chevron {\n transform: none;\n right: 25%;\n align-self: flex-start;\n}\nkin-select .kin_input__eye,\nkin-input .kin_input__eye,\nkin-select .kin_select__eye,\nkin-input .kin_select__eye {\n z-index: 2;\n cursor: pointer;\n pointer-events: all;\n}\nkin-select .kin_input__eye input[type='checkbox'],\nkin-input .kin_input__eye input[type='checkbox'],\nkin-select .kin_select__eye input[type='checkbox'],\nkin-input .kin_select__eye input[type='checkbox'] {\n width: 2.2rem;\n height: 2.2rem;\n line-height: 2.2rem;\n margin: 0;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n border-radius: 5rem;\n cursor: pointer;\n}\nkin-select .kin_input__eye input[type='checkbox']:hover,\nkin-input .kin_input__eye input[type='checkbox']:hover,\nkin-select .kin_select__eye input[type='checkbox']:hover,\nkin-input .kin_select__eye input[type='checkbox']:hover {\n background: var(--input-border);\n}\nkin-select .kin_input__eye span,\nkin-input .kin_input__eye span,\nkin-select .kin_select__eye span,\nkin-input .kin_select__eye span {\n width: 0;\n height: 0;\n overflow: hidden;\n}\nkin-select .kin_input__eye kin-icon,\nkin-input .kin_input__eye kin-icon,\nkin-select .kin_select__eye kin-icon,\nkin-input .kin_select__eye kin-icon {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n pointer-events: none;\n display: flex;\n justify-content: center;\n align-items: center;\n}\nkin-select .kin_select,\nkin-input .kin_select {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n cursor: pointer;\n z-index: 1;\n}\nkin-select .kin_select option,\nkin-input .kin_select option {\n color: initial;\n}\nkin-select .kin_select,\nkin-input .kin_select,\nkin-select .kin_input.-eye,\nkin-input .kin_input.-eye {\n padding-right: 3rem;\n}\nbody[dir='rtl'] kin-input .kin_input.-eye,\nbody[dir='rtl'] kin-select .kin_input.-eye,\nbody[dir='rtl'] kin-input .kin_select,\nbody[dir='rtl'] kin-select .kin_select {\n padding-right: 1rem;\n padding-left: 3rem;\n}\nbody[dir='rtl'] kin-input .kin_input.-eye ~ .kin_select__chevron,\nbody[dir='rtl'] kin-select .kin_input.-eye ~ .kin_select__chevron,\nbody[dir='rtl'] kin-input .kin_select ~ .kin_select__chevron,\nbody[dir='rtl'] kin-select .kin_select ~ .kin_select__chevron,\nbody[dir='rtl'] kin-input .kin_input.-eye ~ .kin_input__eye,\nbody[dir='rtl'] kin-select .kin_input.-eye ~ .kin_input__eye,\nbody[dir='rtl'] kin-input .kin_select ~ .kin_input__eye,\nbody[dir='rtl'] kin-select .kin_select ~ .kin_input__eye {\n right: auto;\n left: 0;\n}\nbody[dir='rtl'] kin-input .kin_input.-eye__wrap.-simplerow .kin_select__chevron,\nbody[dir='rtl'] kin-select .kin_input.-eye__wrap.-simplerow .kin_select__chevron,\nbody[dir='rtl'] kin-input .kin_select__wrap.-simplerow .kin_select__chevron,\nbody[dir='rtl'] kin-select .kin_select__wrap.-simplerow .kin_select__chevron,\nbody[dir='rtl'] kin-input .kin_input.-eye__wrap.-simplerow .kin_input__eye,\nbody[dir='rtl'] kin-select .kin_input.-eye__wrap.-simplerow .kin_input__eye,\nbody[dir='rtl'] kin-input .kin_select__wrap.-simplerow .kin_input__eye,\nbody[dir='rtl'] kin-select .kin_select__wrap.-simplerow .kin_input__eye {\n right: auto;\n left: 25%;\n}\n"; styleInject(css_248z$6); class Select extends KinElement { static get attrCfg() { return { value: null, label: null, id: null, type: null, inline : { updateFn: 'toggleClass', updateCfg: { cssCls: '-inline' } }, error: { updateFn: 'toggleAttr', updateCfg: { attrName: 'error', attrValue: '' } }, formrow: { updateFn: 'toggleClass', updateCfg: { cssCls: '-formrow' } }, simplerow: { updateFn: 'toggleClass', updateCfg: { cssCls: '-simplerow' } }, 'kin-disabled': { // need to prefix because 'disabled' is reserved for focusable elements updateFn: ['toggleAttr', 'toggleClass'], updateCfg: [{ attrName: 'disabled', attrValue: true, el: 'selectElem' }, { cssCls: '-disabled' }] }, size: { updateFn: 'updateClass' }, title: { // title updateFn: 'updateAttr', updateCfg: { name: 'title' } }, }; } static get observedAttributes() { return Object.keys(Select.attrCfg).filter(name => Select.attrCfg[name]); } constructor() { super(); } initElem() { this.elTpl = document.createElement('div'); this.elTpl.classList.add('kin_select__wrap'); this.initselectElem(); this.initChevron(); this.initHint(); this.appendOptions(); this.focusableElem = this.selectElem; } updateElem() { // TODO: rozebrat a pouzit dependece attributu this.updateselectElem(); this.updateLabelElem(); this.updateErrorElem(); } initselectElem() { this.selectElem = document.createElement('select'); this.selectElem.classList.add('kin_select'); this.elTpl.appendChild(this.selectElem); } appendOptions() { var options = this.innerHTML; this.selectElem.innerHTML = options; this.innerHTML = ''; } initChevron() { this.chevronElem = document.createElement('kin-icon'); this.chevronElem.classList.add('kin_select__chevron'); this.chevronElem.setAttribute('name', 'navigate'); this.chevronElem.setAttribute('size', '14'); this.elTpl.appendChild(this.chevronElem); } updateselectElem() { this.selectElem.setAttribute('id', this.getAttribute('id') || uid()); if (this.hasAttribute('size')) { this.selectElem.classList.add('-' + this.getAttribute('size')); } else { this.selectElem.classList.remove('-' + this.getAttribute('size')); } this.selectElem.value = this.getAttribute('value') || this.selectElem.querySelector('option').getAttribute('value'); if (this.getAttribute('error')) { this.selectElem.classList.add('-error'); } else { this.selectElem.classList.remove('-error'); } } getLabelElem() { if (this.labelElem) { return this.labelElem; } this.labelElem = document.createElement('label'); this.labelElem.classList.add('kin_select__label'); this.selectElem.addEventListener('focus', event => { this.labelElem.classList.add('-focused'); }); this.selectElem.addEventListener('blur', event => { this.labelElem.classList.remove('-focused'); }); return this.labelElem; } updateLabelElem() { const label = this.getAttribute('label'); const labelElem = this.getLabelElem(); const elemAdded = this.elTpl.contains(labelElem); if (label) { this.labelElem.setAttribute('for', this.selectElem.getAttribute('id')); if (this.getAttribute('error')) { this.labelElem.classList.add('-error'); } else { this.labelElem.classList.remove('-error'); } this.labelElem.innerText = label; if (!elemAdded) { this.selectElem.before(labelElem); } } else if (elemAdded) { this.elTpl.removeChild(labelElem); } } getErrorElem() { if (this.errorElem) { return this.errorElem; } const errorElemStr = '<p class="kin_select__error"><kin-icon name="badge-critical" size="15"></kin-icon> ' + this.getAttribute('error') + '</p>'; this.errorElem = this.getDomParser() .parseFromString(errorElemStr, 'text/html') .querySelector('p'); return this.errorElem; } updateErrorElem() { const error = this.getAttribute('error'); const errorElem = this.getErrorElem(); const elemAdded = this.elTpl.contains(errorElem); if (error) { errorElem.innerHTML = '<kin-icon name="badge-critical" size="15"></kin-icon> ' + error; if (!elemAdded) { this.elTpl.appendChild(errorElem); } } else if (elemAdded) { this.elTpl.removeChild(errorElem); } } initHint() { const hint = this.getAttribute('hint'); if (hint) { this.hintElem = document.createElement('kin-tooltip'); this.hintElem.classList.add('kin_input__hint'); this.hintElem.innerHTML = '<kin-icon name="icon-m-action-info" size="20" slot="tooltip-activator"></kin-icon><div slot="tooltip">' + this.getAttribute('hint') + '</div>'; this.elTpl.appendChild(this.hintElem); } } } customElements.define('kin-select', Select); var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; function commonjsRequire () { throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs'); } function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } var moment = createCommonjsModule(function (module, exports) { (function (global, factory) { module.exports = factory() ; }(commonjsGlobal, (function () { var hookCallback; function hooks() { return hookCallback.apply(null, arguments); } // This is done to register the method called with moment() // without creating circular dependencies. function setHookCallback(callback) { hookCallback = callback; } function isArray(input) { return ( input instanceof Array || Object.prototype.toString.call(input) === '[object Array]' ); } function isObject(input) { // IE8 will treat undefined and null as object if it wasn't for // input != null return ( input != null && Object.prototype.toString.call(input) === '[object Object]' ); } function hasOwnProp(a, b) { return Object.prototype.hasOwnProperty.call(a, b); } function isObjectEmpty(obj) { if (Object.getOwnPropertyNames) { return Object.getOwnPropertyNames(obj).length === 0; } else { var k; for (k in obj) { if (hasOwnProp(obj, k)) { return false; } } return true; } } function isUndefined(input) { return input === void 0; } function isNumber(input) { return ( typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]' ); } function isDate(input) { return ( input instanceof Date || Object.prototype.toString.call(input) === '[object Date]' ); } function map(arr, fn) { var res = [], i; for (i = 0; i < arr.length; ++i) { res.push(fn(arr[i], i)); } return res; } function extend(a, b) { for (var i in b) { if (hasOwnProp(b, i)) { a[i] = b[i]; } } if (hasOwnProp(b, 'toString')) { a.toString = b.toString; } if (hasOwnProp(b, 'valueOf')) { a.valueOf = b.valueOf; } return a; } function createUTC(input, format, locale, strict) { return createLocalOrUTC(input, format, locale, strict, true).utc(); } function defaultParsingFlags() { // We need to deep clone this object. return { empty: false, unusedTokens: [], unusedInput: [], overflow: -2, charsLeftOver: 0, nullInput: false, invalidEra: null, invalidMonth: null, invalidFormat: false, userInvalidated: false, iso: false, parsedDateParts: [], era: null, meridiem: null, rfc2822: false, weekdayMismatch: false, }; } function getParsingFlags(m) { if (m._pf == null) { m._pf = defaultParsingFlags(); } return m._pf; } var some; if (Array.prototype.some) { some = Array.prototype.some; } else { some = function (fun) { var t = Object(this), len = t.length >>> 0, i; for (i = 0; i < len; i++) { if (i in t && fun.call(this, t[i], i, t)) { return true; } } return false; }; } function isValid(m) { if (m._isValid == null) { var flags = getParsingFlags(m), parsedParts = some.call(flags.parsedDateParts, function (i) { return i != null; }), isNowValid = !isNaN(m._d.getTime()) && flags.overflow < 0 && !flags.empty && !flags.invalidEra && !flags.invalidMonth && !flags.invalidWeekday && !flags.weekdayMismatch && !flags.nullInput && !flags.invalidFormat && !flags.userInvalidated && (!flags.meridiem || (flags.meridiem && parsedParts)); if (m._strict) { isNowValid = isNowValid && flags.charsLeftOver === 0 && flags.unusedTokens.length === 0 && flags.bigHour === undefined; } if (Object.isFrozen == null || !Object.isFrozen(m)) { m._isValid = isNowValid; } else { return isNowValid; } } return m._isValid; } function createInvalid(flags) { var m = createUTC(NaN); if (flags != null) { extend(getParsingFlags(m), flags); } else { getParsingFlags(m).userInvalidated = true; } return m; } // Plugins that add properties should also add the key here (null value), // so we can properly clone ourselves. var momentProperties = (hooks.momentProperties = []), updateInProgress = false; function copyConfig(to, from) { var i, prop, val; if (!isUndefined(from._isAMomentObject)) { to._isAMomentObject = from._isAMomentObject; } if (!isUndefined(from._i)) { to._i = from._i; } if (!isUndefined(from._f)) { to._f = from._f; } if (!isUndefined(from._l)) { to._l = from._l; } if (!isUndefined(from._strict)) { to._strict = from._strict; } if (!isUndefined(from._tzm)) { to._tzm = from._tzm; } if (!isUndefined(from._isUTC)) { to._isUTC = from._isUTC; } if (!isUndefined(from._offset)) { to._offset = from._offset; } if (!isUndefined(from._pf)) { to._pf = getParsingFlags(from); } if (!isUndefined(from._locale)) { to._locale = from._locale; } if (momentProperties.length > 0) { for (i = 0; i < momentProperties.length; i++) { prop = momentProperties[i]; val = from[prop]; if (!isUndefined(val)) { to[prop] = val; } } } return to; } // Moment prototype object function Moment(config) { copyConfig(this, config); this._d = new Date(config._d != null ? config._d.getTime() : NaN); if (!this.isValid()) { this._d = new Date(NaN); } // Prevent infinite loop in case updateOffset creates new moment // objects. if (updateInProgress === false) { updateInProgress = true; hooks.updateOffset(this); updateInProgress = false; } } function isMoment(obj) { return ( obj instanceof Moment || (obj != null && obj._isAMomentObject != null) ); } function warn(msg) { if ( hooks.suppressDeprecationWarnings === false && typeof console !== 'undefined' && console.warn ) { console.warn('Deprecation warning: ' + msg); } } function deprecate(msg, fn) { var firstTime = true; return extend(function () { if (hooks.deprecationHandler != null) { hooks.deprecationHandler(null, msg); } if (firstTime) { var args = [], arg, i, key; for (i = 0; i < arguments.length; i++) { arg = ''; if (typeof arguments[i] === 'object') { arg += '\n[' + i + '] '; for (key in arguments[0]) { if (hasOwnProp(arguments[0], key)) { arg += key + ': ' + arguments[0][key] + ', '; } } arg = arg.slice(0, -2); // Remove trailing comma and space } else { arg = arguments[i]; } args.push(arg); } warn( msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + new Error().stack ); firstTime = false; } return fn.apply(this, arguments); }, fn); } var deprecations = {}; function deprecateSimple(name, msg) { if (hooks.deprecationHandler != null) { hooks.deprecationHandler(name, msg); } if (!deprecations[name]) { warn(msg); deprecations[name] = true; } } hooks.suppressDeprecationWarnings = false; hooks.deprecationHandler = null; function isFunction(input) { return ( (typeof Function !== 'undefined' && input instanceof Function) || Object.prototype.toString.call(input) === '[object Function]' ); } function set(config) { var prop, i; for (i in config) { if (hasOwnProp(config, i)) { prop = config[i]; if (isFunction(prop)) { this[i] = prop; } else { this['_' + i] = prop; } } } this._config = config; // Lenient ordinal parsing accepts just a number in addition to // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. // TODO: Remove "ordinalParse" fallback in next major release. this._dayOfMonthOrdinalParseLenient = new RegExp( (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + '|' + /\d{1,2}/.source ); } function mergeConfigs(parentConfig, childConfig) { var res = extend({}, parentConfig), prop; for (prop in childConfig) { if (hasOwnProp(childConfig, prop)) { if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { res[prop] = {}; extend(res[prop], parentConfig[prop]); extend(res[prop], childConfig[prop]); } else if (childConfig[prop] != null) { res[prop] = childConfig[prop]; } else { delete res[prop]; } } } for (prop in parentConfig) { if ( hasOwnProp(parentConfig, prop) && !hasOwnProp(childConfig, prop) && isObject(parentConfig[prop]) ) { // make sure changes to properties don't modify parent config res[prop] = extend({}, res[prop]); } } return res; } function Locale(config) { if (config != null) { this.set(config); } } var keys; if (Object.keys) { keys = Object.keys; } else { keys = function (obj) { var i, res = []; for (i in obj) { if (hasOwnProp(obj, i)) { res.push(i); } } return res; }; } var defaultCalendar = { sameDay: '[Today at] LT', nextDay: '[Tomorrow at] LT', nextWeek: 'dddd [at] LT', lastDay: '[Yesterday at] LT', lastWeek: '[Last] dddd [at] LT', sameElse: 'L', }; function calendar(key, mom, now) { var output = this._calendar[key] || this._calendar['sameElse']; return isFunction(output) ? output.call(mom, now) : output; } function zeroFill(number, targetLength, forceSign) { var absNumber = '' + Math.abs(number), zerosToFill = targetLength - absNumber.length, sign = number >= 0; return ( (sign ? (forceSign ? '+' : '') : '-') + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber ); } var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, formatFunctions = {}, formatTokenFunctions = {}; // token: 'M' // padded: ['MM', 2] // ordinal: 'Mo' // callback: function () { this.month() + 1 } function addFormatToken(token, padded, ordinal, callback) { var func = callback; if (typeof callback === 'string') { func = function () { return this[callback](); }; } if (token) { formatTokenFunctions[token] = func; } if (padded) { formatTokenFunctions[padded[0]] = function () { return zeroFill(func.apply(this, arguments), padded[1], padded[2]); }; } if (ordinal) { formatTokenFunctions[ordinal] = function () { return this.localeData().ordinal( func.apply(this, arguments), token ); }; } } function removeFormattingTokens(input) { if (input.match(/\[[\s\S]/)) { return input.replace(/^\[|\]$/g, ''); } return input.replace(/\\/g, ''); } function makeFormatFunction(format) { var array = format.match(formattingTokens), i, length; for (i = 0, length = array.length; i < length; i++) { if (formatTokenFunctions[array[i]]) { array[i] = formatTokenFunctions[array[i]]; } else { array[i] = removeFormattingTokens(array[i]); } } return function (mom) { var output = '', i; for (i = 0; i < length; i++) { output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; } return output; }; } // format date using native date object function formatMoment(m, format) { if (!m.isValid()) { return m.localeData().invalidDate(); } format = expandFormat(format, m.localeData()); formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); return formatFunctions[format](m); } function expandFormat(format, locale) { var i = 5; function replaceLongDateFormatTokens(input) { return locale.longDateFormat(input) || input; } localFormattingTokens.lastIndex = 0; while (i >= 0 && localFormattingTokens.test(format)) { format = format.replace( localFormattingTokens, replaceLongDateFormatTokens ); localFormattingTokens.lastIndex = 0; i -= 1; } return format; } var defaultLongDateFormat = { LTS: 'h:mm:ss A', LT: 'h:mm A', L: 'MM/DD/YYYY', LL: 'MMMM D, YYYY', LLL: 'MMMM D, YYYY h:mm A', LLLL: 'dddd, MMMM D, YYYY h:mm A', }; function longDateFormat(key) { var format = this._longDateFormat[key], formatUpper = this._longDateFormat[key.toUpperCase()]; if (format || !formatUpper) { return format; } this._longDateFormat[key] = formatUpper .match(formattingTokens) .map(function (tok) { if ( tok === 'MMMM' || tok === 'MM' || tok === 'DD' || tok === 'dddd' ) { return tok.slice(1); } return tok; }) .join(''); return this._longDateFormat[key]; } var defaultInvalidDate = 'Invalid date'; function invalidDate() { return this._invalidDate; } var defaultOrdinal = '%d', defaultDayOfMonthOrdinalParse = /\d{1,2}/; function ordinal(number) { return this._ordinal.replace('%d', number); } var defaultRelativeTime = { future: 'in %s', past: '%s ago', s: 'a few seconds', ss: '%d seconds', m: 'a minute', mm: '%d minutes', h: 'an hour', hh: '%d hours', d: 'a day', dd: '%d days', w: 'a week', ww: '%d weeks', M: 'a month', MM: '%d months', y: 'a year', yy: '%d years', }; function relativeTime(number, withoutSuffix, string, isFuture) { var output = this._relativeTime[string]; return isFunction(output) ? output(number, withoutSuffix, string, isFuture) : output.replace(/%d/i, number); } function pastFuture(diff, output) { var format = this._relativeTime[diff > 0 ? 'future' : 'past']; return isFunction(format) ? format(output) : format.replace(/%s/i, output); } var aliases = {}; function addUnitAlias(unit, shorthand) { var lowerCase = unit.toLowerCase(); aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; } function normalizeUnits(units) { return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; } function normalizeObjectUnits(inputObject) { var normalizedInput = {}, normalizedProp, prop; for (prop in inputObject) { if (hasOwnProp(inputObject, prop)) { normalizedProp = normalizeUnits(prop); if (normalizedProp) { normalizedInput[normalizedProp] = inputObject[prop]; } } } return normalizedInput; } var priorities = {}; function addUnitPriority(unit, priority) { priorities[unit] = priority; } function getPrioritizedUnits(unitsObj) { var units = [], u; for (u in unitsObj) { if (hasOwnProp(unitsObj, u)) { units.push({ unit: u, priority: priorities[u] }); } } units.sort(function (a, b) { return a.priority - b.priority; }); return units; } function isLeapYear(year) { return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; } function absFloor(number) { if (number < 0) { // -0 -> 0 return Math.ceil(number) || 0; } else { return Math.floor(number); } } function toInt(argumentForCoercion) { var coercedNumber = +argumentForCoercion, value = 0; if (coercedNumber !== 0 && isFinite(coercedNumber)) { value = absFloor(coercedNumber); } return value; } function makeGetSet(unit, keepTime) { return function (value) { if (value != null) { set$1(this, unit, value); hooks.updateOffset(this, keepTime); return this; } else { return get(this, unit); } }; } function get(mom, unit) { return mom.isValid() ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; } function set$1(mom, unit, value) { if (mom.isValid() && !isNaN(value)) { if ( unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29 ) { value = toInt(value); mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit]( value, mom.month(), daysInMonth(value, mom.month()) ); } else { mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); } } } // MOMENTS function stringGet(units) { units = normalizeUnits(units); if (isFunction(this[units])) { return this[units](); } return this; } function stringSet(units, value) { if (typeof units === 'object') { units = normalizeObjectUnits(units); var prioritized = getPrioritizedUnits(units), i; for (i = 0; i < prioritized.length; i++) { this[prioritized[i].unit](units[prioritized[i].unit]); } } else { units = normalizeUnits(units); if (isFunction(this[units])) { return this[units](value); } } return this; } var match1 = /\d/, // 0 - 9 match2 = /\d\d/, // 00 - 99 match3 = /\d{3}/, // 000 - 999 match4 = /\d{4}/, // 0000 - 9999 match6 = /[+-]?\d{6}/, // -999999 - 999999 match1to2 = /\d\d?/, // 0 - 99 match3to4 = /\d\d\d\d?/, // 999 - 9999 match5to6 = /\d\d\d\d\d\d?/, // 99999 - 999999 match1to3 = /\d{1,3}/, // 0 - 999 match1to4 = /\d{1,4}/, // 0 - 9999 match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999 matchUnsigned = /\d+/, // 0 - inf matchSigned = /[+-]?\d+/, // -inf - inf matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 // any word (or two) characters or numbers including two/three word month in arabic. // includes scottish gaelic two word and hyphenated months matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, regexes; regexes = {}; function addRegexToken(token, regex, strictRegex) { regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { return isStrict && strictRegex ? strictRegex : regex; }; } function getParseRegexForToken(token, config) { if (!hasOwnProp(regexes, token)) { return new RegExp(unescapeFormat(token)); } return regexes[token](config._strict, config._locale); } // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript function unescapeFormat(s) { return regexEscape( s .replace('\\', '') .replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function ( matched, p1, p2, p3, p4 ) { return p1 || p2 || p3 || p4; }) ); } function regexEscape(s) { return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); } var tokens = {}; function addParseToken(token, callback) { var i, func = callback; if (typeof token === 'string') { token = [token]; } if (isNumber(callback)) { func = function (input, array) { array[callback] = toInt(input); }; } for (i = 0; i < token.length; i++) { tokens[token[i]] = func; } } function addWeekParseToken(token, callback) { addParseToken(token, function (input, array, config, token) { config._w = config._w || {}; callback(input, config._w, config, token); }); } function addTimeToArrayFromToken(token, input, config) { if (input != null && hasOwnProp(tokens, token)) { tokens[token](input, config._a, config, token); } } var YEAR = 0, MONTH = 1, DATE = 2, HOUR = 3, MINUTE = 4, SECOND = 5, MILLISECOND = 6, WEEK = 7, WEEKDAY = 8; function mod(n, x) { return ((n % x) + x) % x; } var indexOf; if (Array.prototype.indexOf) { indexOf = Array.prototype.indexOf; } else { indexOf = function (o) { // I know var i; for (i = 0; i < this.length; ++i) { if (this[i] === o) { return i; } } return -1; }; } function daysInMonth(year, month) { if (isNaN(year) || isNaN(month)) { return NaN; } var modMonth = mod(month, 12); year += (month - modMonth) / 12; return modMonth === 1 ? isLeapYear(year) ? 29 : 28 : 31 - ((modMonth % 7) % 2); } // FORMATTING addFormatToken('M', ['MM', 2], 'Mo', function () { return this.month() + 1; }); addFormatToken('MMM', 0, 0, function (format) { return this.localeData().monthsShort(this, format); }); addFormatToken('MMMM', 0, 0, function (format) { return this.localeData().months(this, format); }); // ALIASES addUnitAlias('month', 'M'); // PRIORITY addUnitPriority('month', 8); // PARSING addRegexToken('M', match1to2); addRegexToken('MM', match1to2, match2); addRegexToken('MMM', function (isStrict, locale) { return locale.monthsShortRegex(isStrict); }); addRegexToken('MMMM', function (isStrict, locale) { return locale.monthsRegex(isStrict); }); addParseToken(['M', 'MM'], function (input, array) { array[MONTH] = toInt(input) - 1; }); addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { var month = config._locale.monthsParse(input, token, config._strict); // if we didn't find a month name, mark the date as invalid. if (month != null) { array[MONTH] = month; } else { getParsingFlags(config).invalidMonth = input; } }); // LOCALES var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split( '_' ), defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split( '_' ), MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/, defaultMonthsShortRegex = matchWord, defaultMonthsRegex = matchWord; function localeMonths(m, format) { if (!m) { return isArray(this._months) ? this._months : this._months['standalone']; } return isArray(this._months) ? this._months[m.month()] : this._months[ (this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone' ][m.month()]; } function localeMonthsShort(m, format) { if (!m) { return isArray(this._monthsShort) ? this._monthsShort : this._monthsShort['standalone']; } return isArray(this._monthsShort) ? this._monthsShort[m.month()] : this._monthsShort[ MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone' ][m.month()]; } function handleStrictParse(monthName, format, strict) { var i, ii, mom, llc = monthName.toLocaleLowerCase(); if (!this._monthsParse) { // this is not used this._monthsParse = []; this._longMonthsParse = []; this._shortMonthsParse = []; for (i = 0; i < 12; ++i) { mom = createUTC([2000, i]); this._shortMonthsParse[i] = this.monthsShort( mom, '' ).toLocaleLowerCase(); this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); } } if (strict) { if (format === 'MMM') { ii = indexOf.call(this._shortMonthsParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._longMonthsParse, llc); return ii !== -1 ? ii : null; } } else { if (format === 'MMM') { ii = indexOf.call(this._shortMonthsParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._longMonthsParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._longMonthsParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortMonthsParse, llc); return ii !== -1 ? ii : null; } } } function localeMonthsParse(monthName, format, strict) { var i, mom, regex; if (this._monthsParseExact) { return handleStrictParse.call(this, monthName, format, strict); } if (!this._monthsParse) { this._monthsParse = []; this._longMonthsParse = []; this._shortMonthsParse = []; } // TODO: add sorting // Sorting makes sure if one month (or abbr) is a prefix of another // see sorting in computeMonthsParse for (i = 0; i < 12; i++) { // make the regex if we don't have it already mom = createUTC([2000, i]); if (strict && !this._longMonthsParse[i]) { this._longMonthsParse[i] = new RegExp( '^' + this.months(mom, '').replace('.', '') + '$', 'i' ); this._shortMonthsParse[i] = new RegExp( '^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i' ); } if (!strict && !this._monthsParse[i]) { regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); } // test the regex if ( strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName) ) { return i; } else if ( strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName) ) { return i; } else if (!strict && this._monthsParse[i].test(monthName)) { return i; } } } // MOMENTS function setMonth(mom, value) { var dayOfMonth; if (!mom.isValid()) { // No op return mom; } if (typeof value === 'string') { if (/^\d+$/.test(value)) { value = toInt(value); } else { value = mom.localeData().monthsParse(value); // TODO: Another silent failure? if (!isNumber(value)) { return mom; } } } dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); return mom; } function getSetMonth(value) { if (value != null) { setMonth(this, value); hooks.updateOffset(this, true); return this; } else { return get(this, 'Month'); } } function getDaysInMonth() { return daysInMonth(this.year(), this.month()); } function monthsShortRegex(isStrict) { if (this._monthsParseExact) { if (!hasOwnProp(this, '_monthsRegex')) { computeMonthsParse.call(this); } if (isStrict) { return this._monthsShortStrictRegex; } else { return this._monthsShortRegex; } } else { if (!hasOwnProp(this, '_monthsShortRegex')) { this._monthsShortRegex = defaultMonthsShortRegex; } return this._monthsShortStrictRegex && isStrict ? this._monthsShortStrictRegex : this._monthsShortRegex; } } function monthsRegex(isStrict) { if (this._monthsParseExact) { if (!hasOwnProp(this, '_monthsRegex')) { computeMonthsParse.call(this); } if (isStrict) { return this._monthsStrictRegex; } else { return this._monthsRegex; } } else { if (!hasOwnProp(this, '_monthsRegex')) { this._monthsRegex = defaultMonthsRegex; } return this._monthsStrictRegex && isStrict ? this._monthsStrictRegex : this._monthsRegex; } } function computeMonthsParse() { function cmpLenRev(a, b) { return b.length - a.length; } var shortPieces = [], longPieces = [], mixedPieces = [], i, mom; for (i = 0; i < 12; i++) { // make the regex if we don't have it already mom = createUTC([2000, i]); shortPieces.push(this.monthsShort(mom, '')); longPieces.push(this.months(mom, '')); mixedPieces.push(this.months(mom, '')); mixedPieces.push(this.monthsShort(mom, '')); } // Sorting makes sure if one month (or abbr) is a prefix of another it // will match the longer piece. shortPieces.sort(cmpLenRev); longPieces.sort(cmpLenRev); mixedPieces.sort(cmpLenRev); for (i = 0; i < 12; i++) { shortPieces[i] = regexEscape(shortPieces[i]); longPieces[i] = regexEscape(longPieces[i]); } for (i = 0; i < 24; i++) { mixedPieces[i] = regexEscape(mixedPieces[i]); } this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._monthsShortRegex = this._monthsRegex; this._monthsStrictRegex = new RegExp( '^(' + longPieces.join('|') + ')', 'i' ); this._monthsShortStrictRegex = new RegExp( '^(' + shortPieces.join('|') + ')', 'i' ); } // FORMATTING addFormatToken('Y', 0, 0, function () { var y = this.year(); return y <= 9999 ? zeroFill(y, 4) : '+' + y; }); addFormatToken(0, ['YY', 2], 0, function () { return this.year() % 100; }); addFormatToken(0, ['YYYY', 4], 0, 'year'); addFormatToken(0, ['YYYYY', 5], 0, 'year'); addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); // ALIASES addUnitAlias('year', 'y'); // PRIORITIES addUnitPriority('year', 1); // PARSING addRegexToken('Y', matchSigned); addRegexToken('YY', match1to2, match2); addRegexToken('YYYY', match1to4, match4); addRegexToken('YYYYY', match1to6, match6); addRegexToken('YYYYYY', match1to6, match6); addParseToken(['YYYYY', 'YYYYYY'], YEAR); addParseToken('YYYY', function (input, array) { array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); }); addParseToken('YY', function (input, array) { array[YEAR] = hooks.parseTwoDigitYear(input); }); addParseToken('Y', function (input, array) { array[YEAR] = parseInt(input, 10); }); // HELPERS function daysInYear(year) { return isLeapYear(year) ? 366 : 365; } // HOOKS hooks.parseTwoDigitYear = function (input) { return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); }; // MOMENTS var getSetYear = makeGetSet('FullYear', true); function getIsLeapYear() { return isLeapYear(this.year()); } function createDate(y, m, d, h, M, s, ms) { // can't just apply() to create a date: // https://stackoverflow.com/q/181348 var date; // the date constructor remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0) { // preserve leap years using a full 400 year cycle, then reset date = new Date(y + 400, m, d, h, M, s, ms); if (isFinite(date.getFullYear())) { date.setFullYear(y); } } else { date = new Date(y, m, d, h, M, s, ms); } return date; } function createUTCDate(y) { var date, args; // the Date.UTC function remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0) { args = Array.prototype.slice.call(arguments); // preserve leap years using a full 400 year cycle, then reset args[0] = y + 400; date = new Date(Date.UTC.apply(null, args)); if (isFinite(date.getUTCFullYear())) { date.setUTCFullYear(y); } } else { date = new Date(Date.UTC.apply(null, arguments)); } return date; } // start-of-first-week - start-of-year function firstWeekOffset(year, dow, doy) { var // first-week day -- which january is always in the first week (4 for iso, 1 for other) fwd = 7 + dow - doy, // first-week day local weekday -- which local weekday is fwd fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; return -fwdlw + fwd - 1; } // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday function dayOfYearFromWeeks(year, week, weekday, dow, doy) { var localWeekday = (7 + weekday - dow) % 7, weekOffset = firstWeekOffset(year, dow, doy), dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, resYear, resDayOfYear; if (dayOfYear <= 0) { resYear = year - 1; resDayOfYear = daysInYear(resYear) + dayOfYear; } else if (dayOfYear > daysInYear(year)) { resYear = year + 1; resDayOfYear = dayOfYear - daysInYear(year); } else { resYear = year; resDayOfYear = dayOfYear; } return { year: resYear, dayOfYear: resDayOfYear, }; } function weekOfYear(mom, dow, doy) { var weekOffset = firstWeekOffset(mom.year(), dow, doy), week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, resWeek, resYear; if (week < 1) { resYear = mom.year() - 1; resWeek = week + weeksInYear(resYear, dow, doy); } else if (week > weeksInYear(mom.year(), dow, doy)) { resWeek = week - weeksInYear(mom.year(), dow, doy); resYear = mom.year() + 1; } else { resYear = mom.year(); resWeek = week; } return { week: resWeek, year: resYear, }; } function weeksInYear(year, dow, doy) { var weekOffset = firstWeekOffset(year, dow, doy), weekOffsetNext = firstWeekOffset(year + 1, dow, doy); return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; } // FORMATTING addFormatToken('w', ['ww', 2], 'wo', 'week'); addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); // ALIASES addUnitAlias('week', 'w'); addUnitAlias('isoWeek', 'W'); // PRIORITIES addUnitPriority('week', 5); addUnitPriority('isoWeek', 5); // PARSING addRegexToken('w', match1to2); addRegexToken('ww', match1to2, match2); addRegexToken('W', match1to2); addRegexToken('WW', match1to2, match2); addWeekParseToken(['w', 'ww', 'W', 'WW'], function ( input, week, config, token ) { week[token.substr(0, 1)] = toInt(input); }); // HELPERS // LOCALES function localeWeek(mom) { return weekOfYear(mom, this._week.dow, this._week.doy).week; } var defaultLocaleWeek = { dow: 0, // Sunday is the first day of the week. doy: 6, // The week that contains Jan 6th is the first week of the year. }; function localeFirstDayOfWeek() { return this._week.dow; } function localeFirstDayOfYear() { return this._week.doy; } // MOMENTS function getSetWeek(input) { var week = this.localeData().week(this); return input == null ? week : this.add((input - week) * 7, 'd'); } function getSetISOWeek(input) { var week = weekOfYear(this, 1, 4).week; return input == null ? week : this.add((input - week) * 7, 'd'); } // FORMATTING addFormatToken('d', 0, 'do', 'day'); addFormatToken('dd', 0, 0, function (format) { return this.localeData().weekdaysMin(this, format); }); addFormatToken('ddd', 0, 0, function (format) { return this.localeData().weekdaysShort(this, format); }); addFormatToken('dddd', 0, 0, function (format) { return this.localeData().weekdays(this, format); }); addFormatToken('e', 0, 0, 'weekday'); addFormatToken('E', 0, 0, 'isoWeekday'); // ALIASES addUnitAlias('day', 'd'); addUnitAlias('weekday', 'e'); addUnitAlias('isoWeekday', 'E'); // PRIORITY addUnitPriority('day', 11); addUnitPriority('weekday', 11); addUnitPriority('isoWeekday', 11); // PARSING addRegexToken('d', match1to2); addRegexToken('e', match1to2); addRegexToken('E', match1to2); addRegexToken('dd', function (isStrict, locale) { return locale.weekdaysMinRegex(isStrict); }); addRegexToken('ddd', function (isStrict, locale) { return locale.weekdaysShortRegex(isStrict); }); addRegexToken('dddd', function (isStrict, locale) { return locale.weekdaysRegex(isStrict); }); addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { var weekday = config._locale.weekdaysParse(input, token, config._strict); // if we didn't get a weekday name, mark the date as invalid if (weekday != null) { week.d = weekday; } else { getParsingFlags(config).invalidWeekday = input; } }); addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { week[token] = toInt(input); }); // HELPERS function parseWeekday(input, locale) { if (typeof input !== 'string') { return input; } if (!isNaN(input)) { return parseInt(input, 10); } input = locale.weekdaysParse(input); if (typeof input === 'number') { return input; } return null; } function parseIsoWeekday(input, locale) { if (typeof input === 'string') { return locale.weekdaysParse(input) % 7 || 7; } return isNaN(input) ? null : input; } // LOCALES function shiftWeekdays(ws, n) { return ws.slice(n, 7).concat(ws.slice(0, n)); } var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split( '_' ), defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), defaultWeekdaysRegex = matchWord, defaultWeekdaysShortRegex = matchWord, defaultWeekdaysMinRegex = matchWord; function localeWeekdays(m, format) { var weekdays = isArray(this._weekdays) ? this._weekdays : this._weekdays[ m && m !== true && this._weekdays.isFormat.test(format) ? 'format' : 'standalone' ]; return m === true ? shiftWeekdays(weekdays, this._week.dow) : m ? weekdays[m.day()] : weekdays; } function localeWeekdaysShort(m) { return m === true ? shiftWeekdays(this._weekdaysShort, this._week.dow) : m ? this._weekdaysShort[m.day()] : this._weekdaysShort; } function localeWeekdaysMin(m) { return m === true ? shiftWeekdays(this._weekdaysMin, this._week.dow) : m ? this._weekdaysMin[m.day()] : this._weekdaysMin; } function handleStrictParse$1(weekdayName, format, strict) { var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); if (!this._weekdaysParse) { this._weekdaysParse = []; this._shortWeekdaysParse = []; this._minWeekdaysParse = []; for (i = 0; i < 7; ++i) { mom = createUTC([2000, 1]).day(i); this._minWeekdaysParse[i] = this.weekdaysMin( mom, '' ).toLocaleLowerCase(); this._shortWeekdaysParse[i] = this.weekdaysShort( mom, '' ).toLocaleLowerCase(); this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); } } if (strict) { if (format === 'dddd') { ii = indexOf.call(this._weekdaysParse, llc); return ii !== -1 ? ii : null; } else if (format === 'ddd') { ii = indexOf.call(this._shortWeekdaysParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } } else { if (format === 'dddd') { ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } else if (format === 'ddd') { ii = indexOf.call(this._shortWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._minWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortWeekdaysParse, llc); return ii !== -1 ? ii : null; } } } function localeWeekdaysParse(weekdayName, format, strict) { var i, mom, regex; if (this._weekdaysParseExact) { return handleStrictParse$1.call(this, weekdayName, format, strict); } if (!this._weekdaysParse) { this._weekdaysParse = []; this._minWeekdaysParse = []; this._shortWeekdaysParse = []; this._fullWeekdaysParse = []; } for (i = 0; i < 7; i++) { // make the regex if we don't have it already mom = createUTC([2000, 1]).day(i); if (strict && !this._fullWeekdaysParse[i]) { this._fullWeekdaysParse[i] = new RegExp( '^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i' ); this._shortWeekdaysParse[i] = new RegExp( '^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i' ); this._minWeekdaysParse[i] = new RegExp( '^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i' ); } if (!this._weekdaysParse[i]) { regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); } // test the regex if ( strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName) ) { return i; } else if ( strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName) ) { return i; } else if ( strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName) ) { return i; } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { return i; } } } // MOMENTS function getSetDayOfWeek(input) { if (!this.isValid()) { return input != null ? this : NaN; } var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); if (input != null) { input = parseWeekday(input, this.localeData()); return this.add(input - day, 'd'); } else { return day; } } function getSetLocaleDayOfWeek(input) { if (!this.isValid()) { return input != null ? this : NaN; } var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; return input == null ? weekday : this.add(input - weekday, 'd'); } function getSetISODayOfWeek(input) { if (!this.isValid()) { return input != null ? this : NaN; } // behaves the same as moment#day except // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) // as a setter, sunday should belong to the previous week. if (input != null) { var weekday = parseIsoWeekday(input, this.localeData()); return this.day(this.day() % 7 ? weekday : weekday - 7); } else { return this.day() || 7; } } function weekdaysRegex(isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysStrictRegex; } else { return this._weekdaysRegex; } } else { if (!hasOwnProp(this, '_weekdaysRegex')) { this._weekdaysRegex = defaultWeekdaysRegex; } return this._weekdaysStrictRegex && isStrict ? this._weekdaysStrictRegex : this._weekdaysRegex; } } function weekdaysShortRegex(isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysShortStrictRegex; } else { return this._weekdaysShortRegex; } } else { if (!hasOwnProp(this, '_weekdaysShortRegex')) { this._weekdaysShortRegex = defaultWeekdaysShortRegex; } return this._weekdaysShortStrictRegex && isStrict ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex; } } function weekdaysMinRegex(isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysMinStrictRegex; } else { return this._weekdaysMinRegex; } } else { if (!hasOwnProp(this, '_weekdaysMinRegex')) { this._weekdaysMinRegex = defaultWeekdaysMinRegex; } return this._weekdaysMinStrictRegex && isStrict ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex; } } function computeWeekdaysParse() { function cmpLenRev(a, b) { return b.length - a.length; } var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], i, mom, minp, shortp, longp; for (i = 0; i < 7; i++) { // make the regex if we don't have it already mom = createUTC([2000, 1]).day(i); minp = regexEscape(this.weekdaysMin(mom, '')); shortp = regexEscape(this.weekdaysShort(mom, '')); longp = regexEscape(this.weekdays(mom, '')); minPieces.push(minp); shortPieces.push(shortp); longPieces.push(longp); mixedPieces.push(minp); mixedPieces.push(shortp); mixedPieces.push(longp); } // Sorting makes sure if one weekday (or abbr) is a prefix of another it // will match the longer piece. minPieces.sort(cmpLenRev); shortPieces.sort(cmpLenRev); longPieces.sort(cmpLenRev); mixedPieces.sort(cmpLenRev); this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._weekdaysShortRegex = this._weekdaysRegex; this._weekdaysMinRegex = this._weekdaysRegex; this._weekdaysStrictRegex = new RegExp( '^(' + longPieces.join('|') + ')', 'i' ); this._weekdaysShortStrictRegex = new RegExp( '^(' + shortPieces.join('|') + ')', 'i' ); this._weekdaysMinStrictRegex = new RegExp( '^(' + minPieces.join('|') + ')', 'i' ); } // FORMATTING function hFormat() { return this.hours() % 12 || 12; } function kFormat() { return this.hours() || 24; } addFormatToken('H', ['HH', 2], 0, 'hour'); addFormatToken('h', ['hh', 2], 0, hFormat); addFormatToken('k', ['kk', 2], 0, kFormat); addFormatToken('hmm', 0, 0, function () { return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); }); addFormatToken('hmmss', 0, 0, function () { return ( '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2) ); }); addFormatToken('Hmm', 0, 0, function () { return '' + this.hours() + zeroFill(this.minutes(), 2); }); addFormatToken('Hmmss', 0, 0, function () { return ( '' + this.hours() + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2) ); }); function meridiem(token, lowercase) { addFormatToken(token, 0, 0, function () { return this.localeData().meridiem( this.hours(), this.minutes(), lowercase ); }); } meridiem('a', true); meridiem('A', false); // ALIASES addUnitAlias('hour', 'h'); // PRIORITY addUnitPriority('hour', 13); // PARSING function matchMeridiem(isStrict, locale) { return locale._meridiemParse; } addRegexToken('a', matchMeridiem); addRegexToken('A', matchMeridiem); addRegexToken('H', match1to2); addRegexToken('h', match1to2); addRegexToken('k', match1to2); addRegexToken('HH', match1to2, match2); addRegexToken('hh', match1to2, match2); addRegexToken('kk', match1to2, match2); addRegexToken('hmm', match3to4); addRegexToken('hmmss', match5to6); addRegexToken('Hmm', match3to4); addRegexToken('Hmmss', match5to6); addParseToken(['H', 'HH'], HOUR); addParseToken(['k', 'kk'], function (input, array, config) { var kInput = toInt(input); array[HOUR] = kInput === 24 ? 0 : kInput; }); addParseToken(['a', 'A'], function (input, array, config) { config._isPm = config._locale.isPM(input); config._meridiem = input; }); addParseToken(['h', 'hh'], function (input, array, config) { array[HOUR] = toInt(input); getParsingFlags(config).bigHour = true; }); addParseToken('hmm', function (input, array, config) { var pos = input.length - 2; array[HOUR] = toInt(input.substr(0, pos)); array[MINUTE] = toInt(input.substr(pos)); getParsingFlags(config).bigHour = true; }); addParseToken('hmmss', function (input, array, config) { var pos1 = input.length - 4, pos2 = input.length - 2; array[HOUR] = toInt(input.substr(0, pos1)); array[MINUTE] = toInt(input.substr(pos1, 2)); array[SECOND] = toInt(input.substr(pos2)); getParsingFlags(config).bigHour = true; }); addParseToken('Hmm', function (input, array, config) { var pos = input.length - 2; array[HOUR] = toInt(input.substr(0, pos)); array[MINUTE] = toInt(input.substr(pos)); }); addParseToken('Hmmss', function (input, array, config) { var pos1 = input.length - 4, pos2 = input.length - 2; array[HOUR] = toInt(input.substr(0, pos1)); array[MINUTE] = toInt(input.substr(pos1, 2)); array[SECOND] = toInt(input.substr(pos2)); }); // LOCALES function localeIsPM(input) { // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays // Using charAt should be more compatible. return (input + '').toLowerCase().charAt(0) === 'p'; } var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i, // Setting the hour should keep the time, because the user explicitly // specified which hour they want. So trying to maintain the same hour (in // a new timezone) makes sense. Adding/subtracting hours does not follow // this rule. getSetHour = makeGetSet('Hours', true); function localeMeridiem(hours, minutes, isLower) { if (hours > 11) { return isLower ? 'pm' : 'PM'; } else { return isLower ? 'am' : 'AM'; } } var baseConfig = { calendar: defaultCalendar, longDateFormat: defaultLongDateFormat, invalidDate: defaultInvalidDate, ordinal: defaultOrdinal, dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, relativeTime: defaultRelativeTime, months: defaultLocaleMonths, monthsShort: defaultLocaleMonthsShort, week: defaultLocaleWeek, weekdays: defaultLocaleWeekdays, weekdaysMin: defaultLocaleWeekdaysMin, weekdaysShort: defaultLocaleWeekdaysShort, meridiemParse: defaultLocaleMeridiemParse, }; // internal storage for locale config files var locales = {}, localeFamilies = {}, globalLocale; function commonPrefix(arr1, arr2) { var i, minl = Math.min(arr1.length, arr2.length); for (i = 0; i < minl; i += 1) { if (arr1[i] !== arr2[i]) { return i; } } return minl; } function normalizeLocale(key) { return key ? key.toLowerCase().replace('_', '-') : key; } // pick the locale from the array // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root function chooseLocale(names) { var i = 0, j, next, locale, split; while (i < names.length) { split = normalizeLocale(names[i]).split('-'); j = split.length; next = normalizeLocale(names[i + 1]); next = next ? next.split('-') : null; while (j > 0) { locale = loadLocale(split.slice(0, j).join('-')); if (locale) { return locale; } if ( next && next.length >= j && commonPrefix(split, next) >= j - 1 ) { //the next array item is better than a shallower substring of this one break; } j--; } i++; } return globalLocale; } function loadLocale(name) { var oldLocale = null, aliasedRequire; // TODO: Find a better way to register and load all the locales in Node if ( locales[name] === undefined && 'object' !== 'undefined' && module && module.exports ) { try { oldLocale = globalLocale._abbr; aliasedRequire = commonjsRequire; aliasedRequire('./locale/' + name); getSetGlobalLocale(oldLocale); } catch (e) { // mark as not found to avoid repeating expensive file require call causing high CPU // when trying to find en-US, en_US, en-us for every format call locales[name] = null; // null means not found } } return locales[name]; } // This function will load locale and then set the global locale. If // no arguments are passed in, it will simply return the current global // locale key. function getSetGlobalLocale(key, values) { var data; if (key) { if (isUndefined(values)) { data = getLocale(key); } else { data = defineLocale(key, values); } if (data) { // moment.duration._locale = moment._locale = data; globalLocale = data; } else { if (typeof console !== 'undefined' && console.warn) { //warn user if arguments are passed but the locale could not be set console.warn( 'Locale ' + key + ' not found. Did you forget to load it?' ); } } } return globalLocale._abbr; } function defineLocale(name, config) { if (config !== null) { var locale, parentConfig = baseConfig; config.abbr = name; if (locales[name] != null) { deprecateSimple( 'defineLocaleOverride', 'use moment.updateLocale(localeName, config) to change ' + 'an existing locale. moment.defineLocale(localeName, ' + 'config) should only be used for creating a new locale ' + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.' ); parentConfig = locales[name]._config; } else if (config.parentLocale != null) { if (locales[config.parentLocale] != null) { parentConfig = locales[config.parentLocale]._config; } else { locale = loadLocale(config.parentLocale); if (locale != null) { parentConfig = locale._config; } else { if (!localeFamilies[config.parentLocale]) { localeFamilies[config.parentLocale] = []; } localeFamilies[config.parentLocale].push({ name: name, config: config, }); return null; } } } locales[name] = new Locale(mergeConfigs(parentConfig, config)); if (localeFamilies[name]) { localeFamilies[name].forEach(function (x) { defineLocale(x.name, x.config); }); } // backwards compat for now: also set the locale // make sure we set the locale AFTER all child locales have been // created, so we won't end up with the child locale set. getSetGlobalLocale(name); return locales[name]; } else { // useful for testing delete locales[name]; return null; } } function updateLocale(name, config) { if (config != null) { var locale, tmpLocale, parentConfig = baseConfig; if (locales[name] != null && locales[name].parentLocale != null) { // Update existing child locale in-place to avoid memory-leaks locales[name].set(mergeConfigs(locales[name]._config, config)); } else { // MERGE tmpLocale = loadLocale(name); if (tmpLocale != null) { parentConfig = tmpLocale._config; } config = mergeConfigs(parentConfig, config); if (tmpLocale == null) { // updateLocale is called for creating a new locale // Set abbr so it will have a name (getters return // undefined otherwise). config.abbr = name; } locale = new Locale(config); locale.parentLocale = locales[name]; locales[name] = locale; } // backwards compat for now: also set the locale getSetGlobalLocale(name); } else { // pass null for config to unupdate, useful for tests if (locales[name] != null) { if (locales[name].parentLocale != null) { locales[name] = locales[name].parentLocale; if (name === getSetGlobalLocale()) { getSetGlobalLocale(name); } } else if (locales[name] != null) { delete locales[name]; } } } return locales[name]; } // returns locale data function getLocale(key) { var locale; if (key && key._locale && key._locale._abbr) { key = key._locale._abbr; } if (!key) { return globalLocale; } if (!isArray(key)) { //short-circuit everything else locale = loadLocale(key); if (locale) { return locale; } key = [key]; } return chooseLocale(key); } function listLocales() { return keys(locales); } function checkOverflow(m) { var overflow, a = m._a; if (a && getParsingFlags(m).overflow === -2) { overflow = a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : -1; if ( getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE) ) { overflow = DATE; } if (getParsingFlags(m)._overflowWeeks && overflow === -1) { overflow = WEEK; } if (getParsingFlags(m)._overflowWeekday && overflow === -1) { overflow = WEEKDAY; } getParsingFlags(m).overflow = overflow; } return m; } // iso 8601 regex // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, tzRegex = /Z|[+-]\d\d(?::?\d\d)?/, isoDates = [ ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], ['GGGG-[W]WW', /\d{4}-W\d\d/, false], ['YYYY-DDD', /\d{4}-\d{3}/], ['YYYY-MM', /\d{4}-\d\d/, false], ['YYYYYYMMDD', /[+-]\d{10}/], ['YYYYMMDD', /\d{8}/], ['GGGG[W]WWE', /\d{4}W\d{3}/], ['GGGG[W]WW', /\d{4}W\d{2}/, false], ['YYYYDDD', /\d{7}/], ['YYYYMM', /\d{6}/, false], ['YYYY', /\d{4}/, false], ], // iso time formats and regexes isoTimes = [ ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], ['HH:mm:ss', /\d\d:\d\d:\d\d/], ['HH:mm', /\d\d:\d\d/], ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], ['HHmmss', /\d\d\d\d\d\d/], ['HHmm', /\d\d\d\d/], ['HH', /\d\d/], ], aspNetJsonRegex = /^\/?Date\((-?\d+)/i, // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/, obsOffsets = { UT: 0, GMT: 0, EDT: -4 * 60, EST: -5 * 60, CDT: -5 * 60, CST: -6 * 60, MDT: -6 * 60, MST: -7 * 60, PDT: -7 * 60, PST: -8 * 60, }; // date from iso format function configFromISO(config) { var i, l, string = config._i, match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), allowTime, dateFormat, timeFormat, tzFormat; if (match) { getParsingFlags(config).iso = true; for (i = 0, l = isoDates.length; i < l; i++) { if (isoDates[i][1].exec(match[1])) { dateFormat = isoDates[i][0]; allowTime = isoDates[i][2] !== false; break; } } if (dateFormat == null) { config._isValid = false; return; } if (match[3]) { for (i = 0, l = isoTimes.length; i < l; i++) { if (isoTimes[i][1].exec(match[3])) { // match[2] should be 'T' or space timeFormat = (match[2] || ' ') + isoTimes[i][0]; break; } } if (timeFormat == null) { config._isValid = false; return; } } if (!allowTime && timeFormat != null) { config._isValid = false; return; } if (match[4]) { if (tzRegex.exec(match[4])) { tzFormat = 'Z'; } else { config._isValid = false; return; } } config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); configFromStringAndFormat(config); } else { config._isValid = false; } } function extractFromRFC2822Strings( yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr ) { var result = [ untruncateYear(yearStr), defaultLocaleMonthsShort.indexOf(monthStr), parseInt(dayStr, 10), parseInt(hourStr, 10), parseInt(minuteStr, 10), ]; if (secondStr) { result.push(parseInt(secondStr, 10)); } return result; } function untruncateYear(yearStr) { var year = parseInt(yearStr, 10); if (year <= 49) { return 2000 + year; } else if (year <= 999) { return 1900 + year; } return year; } function preprocessRFC2822(s) { // Remove comments and folding whitespace and replace multiple-spaces with a single space return s .replace(/\([^)]*\)|[\n\t]/g, ' ') .replace(/(\s\s+)/g, ' ') .replace(/^\s\s*/, '') .replace(/\s\s*$/, ''); } function checkWeekday(weekdayStr, parsedInput, config) { if (weekdayStr) { // TODO: Replace the vanilla JS Date object with an independent day-of-week check. var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), weekdayActual = new Date( parsedInput[0], parsedInput[1], parsedInput[2] ).getDay(); if (weekdayProvided !== weekdayActual) { getParsingFlags(config).weekdayMismatch = true; config._isValid = false; return false; } } return true; } function calculateOffset(obsOffset, militaryOffset, numOffset) { if (obsOffset) { return obsOffsets[obsOffset]; } else if (militaryOffset) { // the only allowed military tz is Z return 0; } else { var hm = parseInt(numOffset, 10), m = hm % 100, h = (hm - m) / 100; return h * 60 + m; } } // date and time from ref 2822 format function configFromRFC2822(config) { var match = rfc2822.exec(preprocessRFC2822(config._i)), parsedArray; if (match) { parsedArray = extractFromRFC2822Strings( match[4], match[3], match[2], match[5], match[6], match[7] ); if (!checkWeekday(match[1], parsedArray, config)) { return; } config._a = parsedArray; config._tzm = calculateOffset(match[8], match[9], match[10]); config._d = createUTCDate.apply(null, config._a); config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); getParsingFlags(config).rfc2822 = true; } else { config._isValid = false; } } // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict function configFromString(config) { var matched = aspNetJsonRegex.exec(config._i); if (matched !== null) { config._d = new Date(+matched[1]); return; } configFromISO(config); if (config._isValid === false) { delete config._isValid; } else { return; } configFromRFC2822(config); if (config._isValid === false) { delete config._isValid; } else { return; } if (config._strict) { config._isValid = false; } else { // Final attempt, use Input Fallback hooks.createFromInputFallback(config); } } hooks.createFromInputFallback = deprecate( 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + 'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.', function (config) { config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); } ); // Pick the first defined of two or three arguments. function defaults(a, b, c) { if (a != null) { return a; } if (b != null) { return b; } return c; } function currentDateArray(config) { // hooks is actually the exported moment object var nowValue = new Date(hooks.now()); if (config._useUTC) { return [ nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate(), ]; } return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; } // convert an array to a date. // the array should mirror the parameters below // note: all values past the year are optional and will default to the lowest possible value. // [year, month, day , hour, minute, second, millisecond] function configFromArray(config) { var i, date, input = [], currentDate, expectedWeekday, yearToUse; if (config._d) { return; } currentDate = currentDateArray(config); //compute day of the year from weeks and weekdays if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { dayOfYearFromWeekInfo(config); } //if the day of the year is set, figure out what it is if (config._dayOfYear != null) { yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); if ( config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0 ) { getParsingFlags(config)._overflowDayOfYear = true; } date = createUTCDate(yearToUse, 0, config._dayOfYear); config._a[MONTH] = date.getUTCMonth(); config._a[DATE] = date.getUTCDate(); } // Default to current date. // * if no year, month, day of month are given, default to today // * if day of month is given, default month and year // * if month is given, default only year // * if year is given, don't default anything for (i = 0; i < 3 && config._a[i] == null; ++i) { config._a[i] = input[i] = currentDate[i]; } // Zero out whatever was not defaulted, including time for (; i < 7; i++) { config._a[i] = input[i] = config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i]; } // Check for 24:00:00.000 if ( config._a[HOUR] === 24 && config._a[MINUTE] === 0 && config._a[SECOND] === 0 && config._a[MILLISECOND] === 0 ) { config._nextDay = true; config._a[HOUR] = 0; } config._d = (config._useUTC ? createUTCDate : createDate).apply( null, input ); expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); // Apply timezone offset from input. The actual utcOffset can be changed // with parseZone. if (config._tzm != null) { config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); } if (config._nextDay) { config._a[HOUR] = 24; } // check for mismatching day of week if ( config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday ) { getParsingFlags(config).weekdayMismatch = true; } } function dayOfYearFromWeekInfo(config) { var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek; w = config._w; if (w.GG != null || w.W != null || w.E != null) { dow = 1; doy = 4; // TODO: We need to take the current isoWeekYear, but that depends on // how we interpret now (local, utc, fixed offset). So create // a now version of current config (take local/utc/offset flags, and // create now). weekYear = defaults( w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year ); week = defaults(w.W, 1); weekday = defaults(w.E, 1); if (weekday < 1 || weekday > 7) { weekdayOverflow = true; } } else { dow = config._locale._week.dow; doy = config._locale._week.doy; curWeek = weekOfYear(createLocal(), dow, doy); weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); // Default to current week. week = defaults(w.w, curWeek.week); if (w.d != null) { // weekday -- low day numbers are considered next week weekday = w.d; if (weekday < 0 || weekday > 6) { weekdayOverflow = true; } } else if (w.e != null) { // local weekday -- counting starts from beginning of week weekday = w.e + dow; if (w.e < 0 || w.e > 6) { weekdayOverflow = true; } } else { // default to beginning of week weekday = dow; } } if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { getParsingFlags(config)._overflowWeeks = true; } else if (weekdayOverflow != null) { getParsingFlags(config)._overflowWeekday = true; } else { temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); config._a[YEAR] = temp.year; config._dayOfYear = temp.dayOfYear; } } // constant that refers to the ISO standard hooks.ISO_8601 = function () {}; // constant that refers to the RFC 2822 form hooks.RFC_2822 = function () {}; // date from string and format string function configFromStringAndFormat(config) { // TODO: Move this to another part of the creation flow to prevent circular deps if (config._f === hooks.ISO_8601) { configFromISO(config); return; } if (config._f === hooks.RFC_2822) { configFromRFC2822(config); return; } config._a = []; getParsingFlags(config).empty = true; // This array is used to make a Date, either with `new Date` or `Date.UTC` var string = '' + config._i, i, parsedInput, tokens, token, skipped, stringLength = string.length, totalParsedInputLength = 0, era; tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; for (i = 0; i < tokens.length; i++) { token = tokens[i]; parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; if (parsedInput) { skipped = string.substr(0, string.indexOf(parsedInput)); if (skipped.length > 0) { getParsingFlags(config).unusedInput.push(skipped); } string = string.slice( string.indexOf(parsedInput) + parsedInput.length ); totalParsedInputLength += parsedInput.length; } // don't parse if it's not a known token if (formatTokenFunctions[token]) { if (parsedInput) { getParsingFlags(config).empty = false; } else { getParsingFlags(config).unusedTokens.push(token); } addTimeToArrayFromToken(token, parsedInput, config); } else if (config._strict && !parsedInput) { getParsingFlags(config).unusedTokens.push(token); } } // add remaining unparsed input length to the string getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; if (string.length > 0) { getParsingFlags(config).unusedInput.push(string); } // clear _12h flag if hour is <= 12 if ( config._a[HOUR] <= 12 && getParsingFlags(config).bigHour === true && config._a[HOUR] > 0 ) { getParsingFlags(config).bigHour = undefined; } getParsingFlags(config).parsedDateParts = config._a.slice(0); getParsingFlags(config).meridiem = config._meridiem; // handle meridiem config._a[HOUR] = meridiemFixWrap( config._locale, config._a[HOUR], config._meridiem ); // handle era era = getParsingFlags(config).era; if (era !== null) { config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]); } configFromArray(config); checkOverflow(config); } function meridiemFixWrap(locale, hour, meridiem) { var isPm; if (meridiem == null) { // nothing to do return hour; } if (locale.meridiemHour != null) { return locale.meridiemHour(hour, meridiem); } else if (locale.isPM != null) { // Fallback isPm = locale.isPM(meridiem); if (isPm && hour < 12) { hour += 12; } if (!isPm && hour === 12) { hour = 0; } return hour; } else { // this is not supposed to happen return hour; } } // date from string and array of format strings function configFromStringAndArray(config) { var tempConfig, bestMoment, scoreToBeat, i, currentScore, validFormatFound, bestFormatIsValid = false; if (config._f.length === 0) { getParsingFlags(config).invalidFormat = true; config._d = new Date(NaN); return; } for (i = 0; i < config._f.length; i++) { currentScore = 0; validFormatFound = false; tempConfig = copyConfig({}, config); if (config._useUTC != null) { tempConfig._useUTC = config._useUTC; } tempConfig._f = config._f[i]; configFromStringAndFormat(tempConfig); if (isValid(tempConfig)) { validFormatFound = true; } // if there is any input that was not parsed add a penalty for that format currentScore += getParsingFlags(tempConfig).charsLeftOver; //or tokens currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; getParsingFlags(tempConfig).score = currentScore; if (!bestFormatIsValid) { if ( scoreToBeat == null || currentScore < scoreToBeat || validFormatFound ) { scoreToBeat = currentScore; bestMoment = tempConfig; if (validFormatFound) { bestFormatIsValid = true; } } } else { if (currentScore < scoreToBeat) { scoreToBeat = currentScore; bestMoment = tempConfig; } } } extend(config, bestMoment || tempConfig); } function configFromObject(config) { if (config._d) { return; } var i = normalizeObjectUnits(config._i), dayOrDate = i.day === undefined ? i.date : i.day; config._a = map( [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond], function (obj) { return obj && parseInt(obj, 10); } ); configFromArray(config); } function createFromConfig(config) { var res = new Moment(checkOverflow(prepareConfig(config))); if (res._nextDay) { // Adding is smart enough around DST res.add(1, 'd'); res._nextDay = undefined; } return res; } function prepareConfig(config) { var input = config._i, format = config._f; config._locale = config._locale || getLocale(config._l); if (input === null || (format === undefined && input === '')) { return createInvalid({ nullInput: true }); } if (typeof input === 'string') { config._i = input = config._locale.preparse(input); } if (isMoment(input)) { return new Moment(checkOverflow(input)); } else if (isDate(input)) { config._d = input; } else if (isArray(format)) { configFromStringAndArray(config); } else if (format) { configFromStringAndFormat(config); } else { configFromInput(config); } if (!isValid(config)) { config._d = null; } return config; } function configFromInput(config) { var input = config._i; if (isUndefined(input)) { config._d = new Date(hooks.now()); } else if (isDate(input)) { config._d = new Date(input.valueOf()); } else if (typeof input === 'string') { configFromString(config); } else if (isArray(input)) { config._a = map(input.slice(0), function (obj) { return parseInt(obj, 10); }); configFromArray(config); } else if (isObject(input)) { configFromObject(config); } else if (isNumber(input)) { // from milliseconds config._d = new Date(input); } else { hooks.createFromInputFallback(config); } } function createLocalOrUTC(input, format, locale, strict, isUTC) { var c = {}; if (format === true || format === false) { strict = format; format = undefined; } if (locale === true || locale === false) { strict = locale; locale = undefined; } if ( (isObject(input) && isObjectEmpty(input)) || (isArray(input) && input.length === 0) ) { input = undefined; } // object construction must be done this way. // https://github.com/moment/moment/issues/1423 c._isAMomentObject = true; c._useUTC = c._isUTC = isUTC; c._l = locale; c._i = input; c._f = format; c._strict = strict; return createFromConfig(c); } function createLocal(input, format, locale, strict) { return createLocalOrUTC(input, format, locale, strict, false); } var prototypeMin = deprecate( 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', function () { var other = createLocal.apply(null, arguments); if (this.isValid() && other.isValid()) { return other < this ? this : other; } else { return createInvalid(); } } ), prototypeMax = deprecate( 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', function () { var other = createLocal.apply(null, arguments); if (this.isValid() && other.isValid()) { return other > this ? this : other; } else { return createInvalid(); } } ); // Pick a moment m from moments so that m[fn](other) is true for all // other. This relies on the function fn to be transitive. // // moments should either be an array of moment objects or an array, whose // first element is an array of moment objects. function pickBy(fn, moments) { var res, i; if (moments.length === 1 && isArray(moments[0])) { moments = moments[0]; } if (!moments.length) { return createLocal(); } res = moments[0]; for (i = 1; i < moments.length; ++i) { if (!moments[i].isValid() || moments[i][fn](res)) { res = moments[i]; } } return res; } // TODO: Use [].sort instead? function min() { var args = [].slice.call(arguments, 0); return pickBy('isBefore', args); } function max() { var args = [].slice.call(arguments, 0); return pickBy('isAfter', args); } var now = function () { return Date.now ? Date.now() : +new Date(); }; var ordering = [ 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond', ]; function isDurationValid(m) { var key, unitHasDecimal = false, i; for (key in m) { if ( hasOwnProp(m, key) && !( indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])) ) ) { return false; } } for (i = 0; i < ordering.length; ++i) { if (m[ordering[i]]) { if (unitHasDecimal) { return false; // only allow non-integers for smallest unit } if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { unitHasDecimal = true; } } } return true; } function isValid$1() { return this._isValid; } function createInvalid$1() { return createDuration(NaN); } function Duration(duration) { var normalizedInput = normalizeObjectUnits(duration), years = normalizedInput.year || 0, quarters = normalizedInput.quarter || 0, months = normalizedInput.month || 0, weeks = normalizedInput.week || normalizedInput.isoWeek || 0, days = normalizedInput.day || 0, hours = normalizedInput.hour || 0, minutes = normalizedInput.minute || 0, seconds = normalizedInput.second || 0, milliseconds = normalizedInput.millisecond || 0; this._isValid = isDurationValid(normalizedInput); // representation for dateAddRemove this._milliseconds = +milliseconds + seconds * 1e3 + // 1000 minutes * 6e4 + // 1000 * 60 hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 // Because of dateAddRemove treats 24 hours as different from a // day when working around DST, we need to store them separately this._days = +days + weeks * 7; // It is impossible to translate months into days without knowing // which months you are are talking about, so we have to store // it separately. this._months = +months + quarters * 3 + years * 12; this._data = {}; this._locale = getLocale(); this._bubble(); } function isDuration(obj) { return obj instanceof Duration; } function absRound(number) { if (number < 0) { return Math.round(-1 * number) * -1; } else { return Math.round(number); } } // compare two arrays, return the number of differences function compareArrays(array1, array2, dontConvert) { var len = Math.min(array1.length, array2.length), lengthDiff = Math.abs(array1.length - array2.length), diffs = 0, i; for (i = 0; i < len; i++) { if ( (dontConvert && array1[i] !== array2[i]) || (!dontConvert && toInt(array1[i]) !== toInt(array2[i])) ) { diffs++; } } return diffs + lengthDiff; } // FORMATTING function offset(token, separator) { addFormatToken(token, 0, 0, function () { var offset = this.utcOffset(), sign = '+'; if (offset < 0) { offset = -offset; sign = '-'; } return ( sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~offset % 60, 2) ); }); } offset('Z', ':'); offset('ZZ', ''); // PARSING addRegexToken('Z', matchShortOffset); addRegexToken('ZZ', matchShortOffset); addParseToken(['Z', 'ZZ'], function (input, array, config) { config._useUTC = true; config._tzm = offsetFromString(matchShortOffset, input); }); // HELPERS // timezone chunker // '+10:00' > ['10', '00'] // '-1530' > ['-15', '30'] var chunkOffset = /([\+\-]|\d\d)/gi; function offsetFromString(matcher, string) { var matches = (string || '').match(matcher), chunk, parts, minutes; if (matches === null) { return null; } chunk = matches[matches.length - 1] || []; parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; minutes = +(parts[1] * 60) + toInt(parts[2]); return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes; } // Return a moment from input, that is local/utc/zone equivalent to model. function cloneWithOffset(input, model) { var res, diff; if (model._isUTC) { res = model.clone(); diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); // Use low-level api, because this fn is low-level api. res._d.setTime(res._d.valueOf() + diff); hooks.updateOffset(res, false); return res; } else { return createLocal(input).local(); } } function getDateOffset(m) { // On Firefox.24 Date#getTimezoneOffset returns a floating point. // https://github.com/moment/moment/pull/1871 return -Math.round(m._d.getTimezoneOffset()); } // HOOKS // This function will be called whenever a moment is mutated. // It is intended to keep the offset in sync with the timezone. hooks.updateOffset = function () {}; // MOMENTS // keepLocalTime = true means only change the timezone, without // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset // +0200, so we adjust the time as needed, to be valid. // // Keeping the time actually adds/subtracts (one hour) // from the actual represented time. That is why we call updateOffset // a second time. In case it wants us to change the offset again // _changeInProgress == true case, then we have to adjust, because // there is no such time in the given timezone. function getSetOffset(input, keepLocalTime, keepMinutes) { var offset = this._offset || 0, localAdjust; if (!this.isValid()) { return input != null ? this : NaN; } if (input != null) { if (typeof input === 'string') { input = offsetFromString(matchShortOffset, input); if (input === null) { return this; } } else if (Math.abs(input) < 16 && !keepMinutes) { input = input * 60; } if (!this._isUTC && keepLocalTime) { localAdjust = getDateOffset(this); } this._offset = input; this._isUTC = true; if (localAdjust != null) { this.add(localAdjust, 'm'); } if (offset !== input) { if (!keepLocalTime || this._changeInProgress) { addSubtract( this, createDuration(input - offset, 'm'), 1, false ); } else if (!this._changeInProgress) { this._changeInProgress = true; hooks.updateOffset(this, true); this._changeInProgress = null; } } return this; } else { return this._isUTC ? offset : getDateOffset(this); } } function getSetZone(input, keepLocalTime) { if (input != null) { if (typeof input !== 'string') { input = -input; } this.utcOffset(input, keepLocalTime); return this; } else { return -this.utcOffset(); } } function setOffsetToUTC(keepLocalTime) { return this.utcOffset(0, keepLocalTime); } function setOffsetToLocal(keepLocalTime) { if (this._isUTC) { this.utcOffset(0, keepLocalTime); this._isUTC = false; if (keepLocalTime) { this.subtract(getDateOffset(this), 'm'); } } return this; } function setOffsetToParsedOffset() { if (this._tzm != null) { this.utcOffset(this._tzm, false, true); } else if (typeof this._i === 'string') { var tZone = offsetFromString(matchOffset, this._i); if (tZone != null) { this.utcOffset(tZone); } else { this.utcOffset(0, true); } } return this; } function hasAlignedHourOffset(input) { if (!this.isValid()) { return false; } input = input ? createLocal(input).utcOffset() : 0; return (this.utcOffset() - input) % 60 === 0; } function isDaylightSavingTime() { return ( this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset() ); } function isDaylightSavingTimeShifted() { if (!isUndefined(this._isDSTShifted)) { return this._isDSTShifted; } var c = {}, other; copyConfig(c, this); c = prepareConfig(c); if (c._a) { other = c._isUTC ? createUTC(c._a) : createLocal(c._a); this._isDSTShifted = this.isValid() && compareArrays(c._a, other.toArray()) > 0; } else { this._isDSTShifted = false; } return this._isDSTShifted; } function isLocal() { return this.isValid() ? !this._isUTC : false; } function isUtcOffset() { return this.isValid() ? this._isUTC : false; } function isUtc() { return this.isValid() ? this._isUTC && this._offset === 0 : false; } // ASP.NET json date format regex var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/, // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere // and further modified to allow for strings containing both week and day isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; function createDuration(input, key) { var duration = input, // matching against regexp is expensive, do it on demand match = null, sign, ret, diffRes; if (isDuration(input)) { duration = { ms: input._milliseconds, d: input._days, M: input._months, }; } else if (isNumber(input) || !isNaN(+input)) { duration = {}; if (key) { duration[key] = +input; } else { duration.milliseconds = +input; } } else if ((match = aspNetRegex.exec(input))) { sign = match[1] === '-' ? -1 : 1; duration = { y: 0, d: toInt(match[DATE]) * sign, h: toInt(match[HOUR]) * sign, m: toInt(match[MINUTE]) * sign, s: toInt(match[SECOND]) * sign, ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match }; } else if ((match = isoRegex.exec(input))) { sign = match[1] === '-' ? -1 : 1; duration = { y: parseIso(match[2], sign), M: parseIso(match[3], sign), w: parseIso(match[4], sign), d: parseIso(match[5], sign), h: parseIso(match[6], sign), m: parseIso(match[7], sign), s: parseIso(match[8], sign), }; } else if (duration == null) { // checks for null or undefined duration = {}; } else if ( typeof duration === 'object' && ('from' in duration || 'to' in duration) ) { diffRes = momentsDifference( createLocal(duration.from), createLocal(duration.to) ); duration = {}; duration.ms = diffRes.milliseconds; duration.M = diffRes.months; } ret = new Duration(duration); if (isDuration(input) && hasOwnProp(input, '_locale')) { ret._locale = input._locale; } if (isDuration(input) && hasOwnProp(input, '_isValid')) { ret._isValid = input._isValid; } return ret; } createDuration.fn = Duration.prototype; createDuration.invalid = createInvalid$1; function parseIso(inp, sign) { // We'd normally use ~~inp for this, but unfortunately it also // converts floats to ints. // inp may be undefined, so careful calling replace on it. var res = inp && parseFloat(inp.replace(',', '.')); // apply sign while we're at it return (isNaN(res) ? 0 : res) * sign; } function positiveMomentsDifference(base, other) { var res = {}; res.months = other.month() - base.month() + (other.year() - base.year()) * 12; if (base.clone().add(res.months, 'M').isAfter(other)) { --res.months; } res.milliseconds = +other - +base.clone().add(res.months, 'M'); return res; } function momentsDifference(base, other) { var res; if (!(base.isValid() && other.isValid())) { return { milliseconds: 0, months: 0 }; } other = cloneWithOffset(other, base); if (base.isBefore(other)) { res = positiveMomentsDifference(base, other); } else { res = positiveMomentsDifference(other, base); res.milliseconds = -res.milliseconds; res.months = -res.months; } return res; } // TODO: remove 'name' arg after deprecation is removed function createAdder(direction, name) { return function (val, period) { var dur, tmp; //invert the arguments, but complain about it if (period !== null && !isNaN(+period)) { deprecateSimple( name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.' ); tmp = val; val = period; period = tmp; } dur = createDuration(val, period); addSubtract(this, dur, direction); return this; }; } function addSubtract(mom, duration, isAdding, updateOffset) { var milliseconds = duration._milliseconds, days = absRound(duration._days), months = absRound(duration._months); if (!mom.isValid()) { // No op return; } updateOffset = updateOffset == null ? true : updateOffset; if (months) { setMonth(mom, get(mom, 'Month') + months * isAdding); } if (days) { set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); } if (milliseconds) { mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); } if (updateOffset) { hooks.updateOffset(mom, days || months); } } var add = createAdder(1, 'add'), subtract = createAdder(-1, 'subtract'); function isString(input) { return typeof input === 'string' || input instanceof String; } // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined function isMomentInput(input) { return ( isMoment(input) || isDate(input) || isString(input) || isNumber(input) || isNumberOrStringArray(input) || isMomentInputObject(input) || input === null || input === undefined ); } function isMomentInputObject(input) { var objectTest = isObject(input) && !isObjectEmpty(input), propertyTest = false, properties = [ 'years', 'year', 'y', 'months', 'month', 'M', 'days', 'day', 'd', 'dates', 'date', 'D', 'hours', 'hour', 'h', 'minutes', 'minute', 'm', 'seconds', 'second', 's', 'milliseconds', 'millisecond', 'ms', ], i, property; for (i = 0; i < properties.length; i += 1) { property = properties[i]; propertyTest = propertyTest || hasOwnProp(input, property); } return objectTest && propertyTest; } function isNumberOrStringArray(input) { var arrayTest = isArray(input), dataTypeTest = false; if (arrayTest) { dataTypeTest = input.filter(function (item) { return !isNumber(item) && isString(input); }).length === 0; } return arrayTest && dataTypeTest; } function isCalendarSpec(input) { var objectTest = isObject(input) && !isObjectEmpty(input), propertyTest = false, properties = [ 'sameDay', 'nextDay', 'lastDay', 'nextWeek', 'lastWeek', 'sameElse', ], i, property; for (i = 0; i < properties.length; i += 1) { property = properties[i]; propertyTest = propertyTest || hasOwnProp(input, property); } return objectTest && propertyTest; } function getCalendarFormat(myMoment, now) { var diff = myMoment.diff(now, 'days', true); return diff < -6 ? 'sameElse' : diff < -1 ? 'lastWeek' : diff < 0 ? 'lastDay' : diff < 1 ? 'sameDay' : diff < 2 ? 'nextDay' : diff < 7 ? 'nextWeek' : 'sameElse'; } function calendar$1(time, formats) { // Support for single parameter, formats only overload to the calendar function if (arguments.length === 1) { if (!arguments[0]) { time = undefined; formats = undefined; } else if (isMomentInput(arguments[0])) { time = arguments[0]; formats = undefined; } else if (isCalendarSpec(arguments[0])) { formats = arguments[0]; time = undefined; } } // We want to compare the start of today, vs this. // Getting start-of-today depends on whether we're local/utc/offset or not. var now = time || createLocal(), sod = cloneWithOffset(now, this).startOf('day'), format = hooks.calendarFormat(this, sod) || 'sameElse', output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); return this.format( output || this.localeData().calendar(format, this, createLocal(now)) ); } function clone() { return new Moment(this); } function isAfter(input, units) { var localInput = isMoment(input) ? input : createLocal(input); if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(units) || 'millisecond'; if (units === 'millisecond') { return this.valueOf() > localInput.valueOf(); } else { return localInput.valueOf() < this.clone().startOf(units).valueOf(); } } function isBefore(input, units) { var localInput = isMoment(input) ? input : createLocal(input); if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(units) || 'millisecond'; if (units === 'millisecond') { return this.valueOf() < localInput.valueOf(); } else { return this.clone().endOf(units).valueOf() < localInput.valueOf(); } } function isBetween(from, to, units, inclusivity) { var localFrom = isMoment(from) ? from : createLocal(from), localTo = isMoment(to) ? to : createLocal(to); if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) { return false; } inclusivity = inclusivity || '()'; return ( (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) && (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units)) ); } function isSame(input, units) { var localInput = isMoment(input) ? input : createLocal(input), inputMs; if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(units) || 'millisecond'; if (units === 'millisecond') { return this.valueOf() === localInput.valueOf(); } else { inputMs = localInput.valueOf(); return ( this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf() ); } } function isSameOrAfter(input, units) { return this.isSame(input, units) || this.isAfter(input, units); } function isSameOrBefore(input, units) { return this.isSame(input, units) || this.isBefore(input, units); } function diff(input, units, asFloat) { var that, zoneDelta, output; if (!this.isValid()) { return NaN; } that = cloneWithOffset(input, this); if (!that.isValid()) { return NaN; } zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; units = normalizeUnits(units); switch (units) { case 'year': output = monthDiff(this, that) / 12; break; case 'month': output = monthDiff(this, that); break; case 'quarter': output = monthDiff(this, that) / 3; break; case 'second': output = (this - that) / 1e3; break; // 1000 case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst default: output = this - that; } return asFloat ? output : absFloor(output); } function monthDiff(a, b) { if (a.date() < b.date()) { // end-of-month calculations work correct when the start month has more // days than the end month. return -monthDiff(b, a); } // difference in months var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()), // b is in (anchor - 1 month, anchor + 1 month) anchor = a.clone().add(wholeMonthDiff, 'months'), anchor2, adjust; if (b - anchor < 0) { anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); // linear across the month adjust = (b - anchor) / (anchor - anchor2); } else { anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); // linear across the month adjust = (b - anchor) / (anchor2 - anchor); } //check for negative zero, return zero if negative zero return -(wholeMonthDiff + adjust) || 0; } hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; function toString() { return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); } function toISOString(keepOffset) { if (!this.isValid()) { return null; } var utc = keepOffset !== true, m = utc ? this.clone().utc() : this; if (m.year() < 0 || m.year() > 9999) { return formatMoment( m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ' ); } if (isFunction(Date.prototype.toISOString)) { // native implementation is ~50x faster, use it when we can if (utc) { return this.toDate().toISOString(); } else { return new Date(this.valueOf() + this.utcOffset() * 60 * 1000) .toISOString() .replace('Z', formatMoment(m, 'Z')); } } return formatMoment( m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ' ); } /** * Return a human readable representation of a moment that can * also be evaluated to get a new moment which is the same * * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects */ function inspect() { if (!this.isValid()) { return 'moment.invalid(/* ' + this._i + ' */)'; } var func = 'moment', zone = '', prefix, year, datetime, suffix; if (!this.isLocal()) { func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; zone = 'Z'; } prefix = '[' + func + '("]'; year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY'; datetime = '-MM-DD[T]HH:mm:ss.SSS'; suffix = zone + '[")]'; return this.format(prefix + year + datetime + suffix); } function format(inputString) { if (!inputString) { inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; } var output = formatMoment(this, inputString); return this.localeData().postformat(output); } function from(time, withoutSuffix) { if ( this.isValid() && ((isMoment(time) && time.isValid()) || createLocal(time).isValid()) ) { return createDuration({ to: this, from: time }) .locale(this.locale()) .humanize(!withoutSuffix); } else { return this.localeData().invalidDate(); } } function fromNow(withoutSuffix) { return this.from(createLocal(), withoutSuffix); } function to(time, withoutSuffix) { if ( this.isValid() && ((isMoment(time) && time.isValid()) || createLocal(time).isValid()) ) { return createDuration({ from: this, to: time }) .locale(this.locale()) .humanize(!withoutSuffix); } else { return this.localeData().invalidDate(); } } function toNow(withoutSuffix) { return this.to(createLocal(), withoutSuffix); } // If passed a locale key, it will set the locale for this // instance. Otherwise, it will return the locale configuration // variables for this instance. function locale(key) { var newLocaleData; if (key === undefined) { return this._locale._abbr; } else { newLocaleData = getLocale(key); if (newLocaleData != null) { this._locale = newLocaleData; } return this; } } var lang = deprecate( 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', function (key) { if (key === undefined) { return this.localeData(); } else { return this.locale(key); } } ); function localeData() { return this._locale; } var MS_PER_SECOND = 1000, MS_PER_MINUTE = 60 * MS_PER_SECOND, MS_PER_HOUR = 60 * MS_PER_MINUTE, MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; // actual modulo - handles negative numbers (for dates before 1970): function mod$1(dividend, divisor) { return ((dividend % divisor) + divisor) % divisor; } function localStartOfDate(y, m, d) { // the date constructor remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0) { // preserve leap years using a full 400 year cycle, then reset return new Date(y + 400, m, d) - MS_PER_400_YEARS; } else { return new Date(y, m, d).valueOf(); } } function utcStartOfDate(y, m, d) { // Date.UTC remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0) { // preserve leap years using a full 400 year cycle, then reset return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS; } else { return Date.UTC(y, m, d); } } function startOf(units) { var time, startOfDate; units = normalizeUnits(units); if (units === undefined || units === 'millisecond' || !this.isValid()) { return this; } startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; switch (units) { case 'year': time = startOfDate(this.year(), 0, 1); break; case 'quarter': time = startOfDate( this.year(), this.month() - (this.month() % 3), 1 ); break; case 'month': time = startOfDate(this.year(), this.month(), 1); break; case 'week': time = startOfDate( this.year(), this.month(), this.date() - this.weekday() ); break; case 'isoWeek': time = startOfDate( this.year(), this.month(), this.date() - (this.isoWeekday() - 1) ); break; case 'day': case 'date': time = startOfDate(this.year(), this.month(), this.date()); break; case 'hour': time = this._d.valueOf(); time -= mod$1( time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR ); break; case 'minute': time = this._d.valueOf(); time -= mod$1(time, MS_PER_MINUTE); break; case 'second': time = this._d.valueOf(); time -= mod$1(time, MS_PER_SECOND); break; } this._d.setTime(time); hooks.updateOffset(this, true); return this; } function endOf(units) { var time, startOfDate; units = normalizeUnits(units); if (units === undefined || units === 'millisecond' || !this.isValid()) { return this; } startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; switch (units) { case 'year': time = startOfDate(this.year() + 1, 0, 1) - 1; break; case 'quarter': time = startOfDate( this.year(), this.month() - (this.month() % 3) + 3, 1 ) - 1; break; case 'month': time = startOfDate(this.year(), this.month() + 1, 1) - 1; break; case 'week': time = startOfDate( this.year(), this.month(), this.date() - this.weekday() + 7 ) - 1; break; case 'isoWeek': time = startOfDate( this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7 ) - 1; break; case 'day': case 'date': time = startOfDate(this.year(), this.month(), this.date() + 1) - 1; break; case 'hour': time = this._d.valueOf(); time += MS_PER_HOUR - mod$1( time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR ) - 1; break; case 'minute': time = this._d.valueOf(); time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1; break; case 'second': time = this._d.valueOf(); time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1; break; } this._d.setTime(time); hooks.updateOffset(this, true); return this; } function valueOf() { return this._d.valueOf() - (this._offset || 0) * 60000; } function unix() { return Math.floor(this.valueOf() / 1000); } function toDate() { return new Date(this.valueOf()); } function toArray() { var m = this; return [ m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond(), ]; } function toObject() { var m = this; return { years: m.year(), months: m.month(), date: m.date(), hours: m.hours(), minutes: m.minutes(), seconds: m.seconds(), milliseconds: m.milliseconds(), }; } function toJSON() { // new Date(NaN).toJSON() === null return this.isValid() ? this.toISOString() : null; } function isValid$2() { return isValid(this); } function parsingFlags() { return extend({}, getParsingFlags(this)); } function invalidAt() { return getParsingFlags(this).overflow; } function creationData() { return { input: this._i, format: this._f, locale: this._locale, isUTC: this._isUTC, strict: this._strict, }; } addFormatToken('N', 0, 0, 'eraAbbr'); addFormatToken('NN', 0, 0, 'eraAbbr'); addFormatToken('NNN', 0, 0, 'eraAbbr'); addFormatToken('NNNN', 0, 0, 'eraName'); addFormatToken('NNNNN', 0, 0, 'eraNarrow'); addFormatToken('y', ['y', 1], 'yo', 'eraYear'); addFormatToken('y', ['yy', 2], 0, 'eraYear'); addFormatToken('y', ['yyy', 3], 0, 'eraYear'); addFormatToken('y', ['yyyy', 4], 0, 'eraYear'); addRegexToken('N', matchEraAbbr); addRegexToken('NN', matchEraAbbr); addRegexToken('NNN', matchEraAbbr); addRegexToken('NNNN', matchEraName); addRegexToken('NNNNN', matchEraNarrow); addParseToken(['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], function ( input, array, config, token ) { var era = config._locale.erasParse(input, token, config._strict); if (era) { getParsingFlags(config).era = era; } else { getParsingFlags(config).invalidEra = input; } }); addRegexToken('y', matchUnsigned); addRegexToken('yy', matchUnsigned); addRegexToken('yyy', matchUnsigned); addRegexToken('yyyy', matchUnsigned); addRegexToken('yo', matchEraYearOrdinal); addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR); addParseToken(['yo'], function (input, array, config, token) { var match; if (config._locale._eraYearOrdinalRegex) { match = input.match(config._locale._eraYearOrdinalRegex); } if (config._locale.eraYearOrdinalParse) { array[YEAR] = config._locale.eraYearOrdinalParse(input, match); } else { array[YEAR] = parseInt(input, 10); } }); function localeEras(m, format) { var i, l, date, eras = this._eras || getLocale('en')._eras; for (i = 0, l = eras.length; i < l; ++i) { switch (typeof eras[i].since) { case 'string': // truncate time date = hooks(eras[i].since).startOf('day'); eras[i].since = date.valueOf(); break; } switch (typeof eras[i].until) { case 'undefined': eras[i].until = +Infinity; break; case 'string': // truncate time date = hooks(eras[i].until).startOf('day').valueOf(); eras[i].until = date.valueOf(); break; } } return eras; } function localeErasParse(eraName, format, strict) { var i, l, eras = this.eras(), name, abbr, narrow; eraName = eraName.toUpperCase(); for (i = 0, l = eras.length; i < l; ++i) { name = eras[i].name.toUpperCase(); abbr = eras[i].abbr.toUpperCase(); narrow = eras[i].narrow.toUpperCase(); if (strict) { switch (format) { case 'N': case 'NN': case 'NNN': if (abbr === eraName) { return eras[i]; } break; case 'NNNN': if (name === eraName) { return eras[i]; } break; case 'NNNNN': if (narrow === eraName) { return eras[i]; } break; } } else if ([name, abbr, narrow].indexOf(eraName) >= 0) { return eras[i]; } } } function localeErasConvertYear(era, year) { var dir = era.since <= era.until ? +1 : -1; if (year === undefined) { return hooks(era.since).year(); } else { return hooks(era.since).year() + (year - era.offset) * dir; } } function getEraName() { var i, l, val, eras = this.localeData().eras(); for (i = 0, l = eras.length; i < l; ++i) { // truncate time val = this.clone().startOf('day').valueOf(); if (eras[i].since <= val && val <= eras[i].until) { return eras[i].name; } if (eras[i].until <= val && val <= eras[i].since) { return eras[i].name; } } return ''; } function getEraNarrow() { var i, l, val, eras = this.localeData().eras(); for (i = 0, l = eras.length; i < l; ++i) { // truncate time val = this.clone().startOf('day').valueOf(); if (eras[i].since <= val && val <= eras[i].until) { return eras[i].narrow; } if (eras[i].until <= val && val <= eras[i].since) { return eras[i].narrow; } } return ''; } function getEraAbbr() { var i, l, val, eras = this.localeData().eras(); for (i = 0, l = eras.length; i < l; ++i) { // truncate time val = this.clone().startOf('day').valueOf(); if (eras[i].since <= val && val <= eras[i].until) { return eras[i].abbr; } if (eras[i].until <= val && val <= eras[i].since) { return eras[i].abbr; } } return ''; } function getEraYear() { var i, l, dir, val, eras = this.localeData().eras(); for (i = 0, l = eras.length; i < l; ++i) { dir = eras[i].since <= eras[i].until ? +1 : -1; // truncate time val = this.clone().startOf('day').valueOf(); if ( (eras[i].since <= val && val <= eras[i].until) || (eras[i].until <= val && val <= eras[i].since) ) { return ( (this.year() - hooks(eras[i].since).year()) * dir + eras[i].offset ); } } return this.year(); } function erasNameRegex(isStrict) { if (!hasOwnProp(this, '_erasNameRegex')) { computeErasParse.call(this); } return isStrict ? this._erasNameRegex : this._erasRegex; } function erasAbbrRegex(isStrict) { if (!hasOwnProp(this, '_erasAbbrRegex')) { computeErasParse.call(this); } return isStrict ? this._erasAbbrRegex : this._erasRegex; } function erasNarrowRegex(isStrict) { if (!hasOwnProp(this, '_erasNarrowRegex')) { computeErasParse.call(this); } return isStrict ? this._erasNarrowRegex : this._erasRegex; } function matchEraAbbr(isStrict, locale) { return locale.erasAbbrRegex(isStrict); } function matchEraName(isStrict, locale) { return locale.erasNameRegex(isStrict); } function matchEraNarrow(isStrict, locale) { return locale.erasNarrowRegex(isStrict); } function matchEraYearOrdinal(isStrict, locale) { return locale._eraYearOrdinalRegex || matchUnsigned; } function computeErasParse() { var abbrPieces = [], namePieces = [], narrowPieces = [], mixedPieces = [], i, l, eras = this.eras(); for (i = 0, l = eras.length; i < l; ++i) { namePieces.push(regexEscape(eras[i].name)); abbrPieces.push(regexEscape(eras[i].abbr)); narrowPieces.push(regexEscape(eras[i].narrow)); mixedPieces.push(regexEscape(eras[i].name)); mixedPieces.push(regexEscape(eras[i].abbr)); mixedPieces.push(regexEscape(eras[i].narrow)); } this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i'); this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i'); this._erasNarrowRegex = new RegExp( '^(' + narrowPieces.join('|') + ')', 'i' ); } // FORMATTING addFormatToken(0, ['gg', 2], 0, function () { return this.weekYear() % 100; }); addFormatToken(0, ['GG', 2], 0, function () { return this.isoWeekYear() % 100; }); function addWeekYearFormatToken(token, getter) { addFormatToken(0, [token, token.length], 0, getter); } addWeekYearFormatToken('gggg', 'weekYear'); addWeekYearFormatToken('ggggg', 'weekYear'); addWeekYearFormatToken('GGGG', 'isoWeekYear'); addWeekYearFormatToken('GGGGG', 'isoWeekYear'); // ALIASES addUnitAlias('weekYear', 'gg'); addUnitAlias('isoWeekYear', 'GG'); // PRIORITY addUnitPriority('weekYear', 1); addUnitPriority('isoWeekYear', 1); // PARSING addRegexToken('G', matchSigned); addRegexToken('g', matchSigned); addRegexToken('GG', match1to2, match2); addRegexToken('gg', match1to2, match2); addRegexToken('GGGG', match1to4, match4); addRegexToken('gggg', match1to4, match4); addRegexToken('GGGGG', match1to6, match6); addRegexToken('ggggg', match1to6, match6); addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function ( input, week, config, token ) { week[token.substr(0, 2)] = toInt(input); }); addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { week[token] = hooks.parseTwoDigitYear(input); }); // MOMENTS function getSetWeekYear(input) { return getSetWeekYearHelper.call( this, input, this.week(), this.weekday(), this.localeData()._week.dow, this.localeData()._week.doy ); } function getSetISOWeekYear(input) { return getSetWeekYearHelper.call( this, input, this.isoWeek(), this.isoWeekday(), 1, 4 ); } function getISOWeeksInYear() { return weeksInYear(this.year(), 1, 4); } function getISOWeeksInISOWeekYear() { return weeksInYear(this.isoWeekYear(), 1, 4); } function getWeeksInYear() { var weekInfo = this.localeData()._week; return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); } function getWeeksInWeekYear() { var weekInfo = this.localeData()._week; return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy); } function getSetWeekYearHelper(input, week, weekday, dow, doy) { var weeksTarget; if (input == null) { return weekOfYear(this, dow, doy).year; } else { weeksTarget = weeksInYear(input, dow, doy); if (week > weeksTarget) { week = weeksTarget; } return setWeekAll.call(this, input, week, weekday, dow, doy); } } function setWeekAll(weekYear, week, weekday, dow, doy) { var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); this.year(date.getUTCFullYear()); this.month(date.getUTCMonth()); this.date(date.getUTCDate()); return this; } // FORMATTING addFormatToken('Q', 0, 'Qo', 'quarter'); // ALIASES addUnitAlias('quarter', 'Q'); // PRIORITY addUnitPriority('quarter', 7); // PARSING addRegexToken('Q', match1); addParseToken('Q', function (input, array) { array[MONTH] = (toInt(input) - 1) * 3; }); // MOMENTS function getSetQuarter(input) { return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + (this.month() % 3)); } // FORMATTING addFormatToken('D', ['DD', 2], 'Do', 'date'); // ALIASES addUnitAlias('date', 'D'); // PRIORITY addUnitPriority('date', 9); // PARSING addRegexToken('D', match1to2); addRegexToken('DD', match1to2, match2); addRegexToken('Do', function (isStrict, locale) { // TODO: Remove "ordinalParse" fallback in next major release. return isStrict ? locale._dayOfMonthOrdinalParse || locale._ordinalParse : locale._dayOfMonthOrdinalParseLenient; }); addParseToken(['D', 'DD'], DATE); addParseToken('Do', function (input, array) { array[DATE] = toInt(input.match(match1to2)[0]); }); // MOMENTS var getSetDayOfMonth = makeGetSet('Date', true); // FORMATTING addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); // ALIASES addUnitAlias('dayOfYear', 'DDD'); // PRIORITY addUnitPriority('dayOfYear', 4); // PARSING addRegexToken('DDD', match1to3); addRegexToken('DDDD', match3); addParseToken(['DDD', 'DDDD'], function (input, array, config) { config._dayOfYear = toInt(input); }); // HELPERS // MOMENTS function getSetDayOfYear(input) { var dayOfYear = Math.round( (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5 ) + 1; return input == null ? dayOfYear : this.add(input - dayOfYear, 'd'); } // FORMATTING addFormatToken('m', ['mm', 2], 0, 'minute'); // ALIASES addUnitAlias('minute', 'm'); // PRIORITY addUnitPriority('minute', 14); // PARSING addRegexToken('m', match1to2); addRegexToken('mm', match1to2, match2); addParseToken(['m', 'mm'], MINUTE); // MOMENTS var getSetMinute = makeGetSet('Minutes', false); // FORMATTING addFormatToken('s', ['ss', 2], 0, 'second'); // ALIASES addUnitAlias('second', 's'); // PRIORITY addUnitPriority('second', 15); // PARSING addRegexToken('s', match1to2); addRegexToken('ss', match1to2, match2); addParseToken(['s', 'ss'], SECOND); // MOMENTS var getSetSecond = makeGetSet('Seconds', false); // FORMATTING addFormatToken('S', 0, 0, function () { return ~~(this.millisecond() / 100); }); addFormatToken(0, ['SS', 2], 0, function () { return ~~(this.millisecond() / 10); }); addFormatToken(0, ['SSS', 3], 0, 'millisecond'); addFormatToken(0, ['SSSS', 4], 0, function () { return this.millisecond() * 10; }); addFormatToken(0, ['SSSSS', 5], 0, function () { return this.millisecond() * 100; }); addFormatToken(0, ['SSSSSS', 6], 0, function () { return this.millisecond() * 1000; }); addFormatToken(0, ['SSSSSSS', 7], 0, function () { return this.millisecond() * 10000; }); addFormatToken(0, ['SSSSSSSS', 8], 0, function () { return this.millisecond() * 100000; }); addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { return this.millisecond() * 1000000; }); // ALIASES addUnitAlias('millisecond', 'ms'); // PRIORITY addUnitPriority('millisecond', 16); // PARSING addRegexToken('S', match1to3, match1); addRegexToken('SS', match1to3, match2); addRegexToken('SSS', match1to3, match3); var token, getSetMillisecond; for (token = 'SSSS'; token.length <= 9; token += 'S') { addRegexToken(token, matchUnsigned); } function parseMs(input, array) { array[MILLISECOND] = toInt(('0.' + input) * 1000); } for (token = 'S'; token.length <= 9; token += 'S') { addParseToken(token, parseMs); } getSetMillisecond = makeGetSet('Milliseconds', false); // FORMATTING addFormatToken('z', 0, 0, 'zoneAbbr'); addFormatToken('zz', 0, 0, 'zoneName'); // MOMENTS function getZoneAbbr() { return this._isUTC ? 'UTC' : ''; } function getZoneName() { return this._isUTC ? 'Coordinated Universal Time' : ''; } var proto = Moment.prototype; proto.add = add; proto.calendar = calendar$1; proto.clone = clone; proto.diff = diff; proto.endOf = endOf; proto.format = format; proto.from = from; proto.fromNow = fromNow; proto.to = to; proto.toNow = toNow; proto.get = stringGet; proto.invalidAt = invalidAt; proto.isAfter = isAfter; proto.isBefore = isBefore; proto.isBetween = isBetween; proto.isSame = isSame; proto.isSameOrAfter = isSameOrAfter; proto.isSameOrBefore = isSameOrBefore; proto.isValid = isValid$2; proto.lang = lang; proto.locale = locale; proto.localeData = localeData; proto.max = prototypeMax; proto.min = prototypeMin; proto.parsingFlags = parsingFlags; proto.set = stringSet; proto.startOf = startOf; proto.subtract = subtract; proto.toArray = toArray; proto.toObject = toObject; proto.toDate = toDate; proto.toISOString = toISOString; proto.inspect = inspect; if (typeof Symbol !== 'undefined' && Symbol.for != null) { proto[Symbol.for('nodejs.util.inspect.custom')] = function () { return 'Moment<' + this.format() + '>'; }; } proto.toJSON = toJSON; proto.toString = toString; proto.unix = unix; proto.valueOf = valueOf; proto.creationData = creationData; proto.eraName = getEraName; proto.eraNarrow = getEraNarrow; proto.eraAbbr = getEraAbbr; proto.eraYear = getEraYear; proto.year = getSetYear; proto.isLeapYear = getIsLeapYear; proto.weekYear = getSetWeekYear; proto.isoWeekYear = getSetISOWeekYear; proto.quarter = proto.quarters = getSetQuarter; proto.month = getSetMonth; proto.daysInMonth = getDaysInMonth; proto.week = proto.weeks = getSetWeek; proto.isoWeek = proto.isoWeeks = getSetISOWeek; proto.weeksInYear = getWeeksInYear; proto.weeksInWeekYear = getWeeksInWeekYear; proto.isoWeeksInYear = getISOWeeksInYear; proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear; proto.date = getSetDayOfMonth; proto.day = proto.days = getSetDayOfWeek; proto.weekday = getSetLocaleDayOfWeek; proto.isoWeekday = getSetISODayOfWeek; proto.dayOfYear = getSetDayOfYear; proto.hour = proto.hours = getSetHour; proto.minute = proto.minutes = getSetMinute; proto.second = proto.seconds = getSetSecond; proto.millisecond = proto.milliseconds = getSetMillisecond; proto.utcOffset = getSetOffset; proto.utc = setOffsetToUTC; proto.local = setOffsetToLocal; proto.parseZone = setOffsetToParsedOffset; proto.hasAlignedHourOffset = hasAlignedHourOffset; proto.isDST = isDaylightSavingTime; proto.isLocal = isLocal; proto.isUtcOffset = isUtcOffset; proto.isUtc = isUtc; proto.isUTC = isUtc; proto.zoneAbbr = getZoneAbbr; proto.zoneName = getZoneName; proto.dates = deprecate( 'dates accessor is deprecated. Use date instead.', getSetDayOfMonth ); proto.months = deprecate( 'months accessor is deprecated. Use month instead', getSetMonth ); proto.years = deprecate( 'years accessor is deprecated. Use year instead', getSetYear ); proto.zone = deprecate( 'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone ); proto.isDSTShifted = deprecate( 'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted ); function createUnix(input) { return createLocal(input * 1000); } function createInZone() { return createLocal.apply(null, arguments).parseZone(); } function preParsePostFormat(string) { return string; } var proto$1 = Locale.prototype; proto$1.calendar = calendar; proto$1.longDateFormat = longDateFormat; proto$1.invalidDate = invalidDate; proto$1.ordinal = ordinal; proto$1.preparse = preParsePostFormat; proto$1.postformat = preParsePostFormat; proto$1.relativeTime = relativeTime; proto$1.pastFuture = pastFuture; proto$1.set = set; proto$1.eras = localeEras; proto$1.erasParse = localeErasParse; proto$1.erasConvertYear = localeErasConvertYear; proto$1.erasAbbrRegex = erasAbbrRegex; proto$1.erasNameRegex = erasNameRegex; proto$1.erasNarrowRegex = erasNarrowRegex; proto$1.months = localeMonths; proto$1.monthsShort = localeMonthsShort; proto$1.monthsParse = localeMonthsParse; proto$1.monthsRegex = monthsRegex; proto$1.monthsShortRegex = monthsShortRegex; proto$1.week = localeWeek; proto$1.firstDayOfYear = localeFirstDayOfYear; proto$1.firstDayOfWeek = localeFirstDayOfWeek; proto$1.weekdays = localeWeekdays; proto$1.weekdaysMin = localeWeekdaysMin; proto$1.weekdaysShort = localeWeekdaysShort; proto$1.weekdaysParse = localeWeekdaysParse; proto$1.weekdaysRegex = weekdaysRegex; proto$1.weekdaysShortRegex = weekdaysShortRegex; proto$1.weekdaysMinRegex = weekdaysMinRegex; proto$1.isPM = localeIsPM; proto$1.meridiem = localeMeridiem; function get$1(format, index, field, setter) { var locale = getLocale(), utc = createUTC().set(setter, index); return locale[field](utc, format); } function listMonthsImpl(format, index, field) { if (isNumber(format)) { index = format; format = undefined; } format = format || ''; if (index != null) { return get$1(format, index, field, 'month'); } var i, out = []; for (i = 0; i < 12; i++) { out[i] = get$1(format, i, field, 'month'); } return out; } // () // (5) // (fmt, 5) // (fmt) // (true) // (true, 5) // (true, fmt, 5) // (true, fmt) function listWeekdaysImpl(localeSorted, format, index, field) { if (typeof localeSorted === 'boolean') { if (isNumber(format)) { index = format; format = undefined; } format = format || ''; } else { format = localeSorted; index = format; localeSorted = false; if (isNumber(format)) { index = format; format = undefined; } format = format || ''; } var locale = getLocale(), shift = localeSorted ? locale._week.dow : 0, i, out = []; if (index != null) { return get$1(format, (index + shift) % 7, field, 'day'); } for (i = 0; i < 7; i++) { out[i] = get$1(format, (i + shift) % 7, field, 'day'); } return out; } function listMonths(format, index) { return listMonthsImpl(format, index, 'months'); } function listMonthsShort(format, index) { return listMonthsImpl(format, index, 'monthsShort'); } function listWeekdays(localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); } function listWeekdaysShort(localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); } function listWeekdaysMin(localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); } getSetGlobalLocale('en', { eras: [ { since: '0001-01-01', until: +Infinity, offset: 1, name: 'Anno Domini', narrow: 'AD', abbr: 'AD', }, { since: '0000-12-31', until: -Infinity, offset: 1, name: 'Before Christ', narrow: 'BC', abbr: 'BC', }, ], dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, ordinal: function (number) { var b = number % 10, output = toInt((number % 100) / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th'; return number + output; }, }); // Side effect imports hooks.lang = deprecate( 'moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale ); hooks.langData = deprecate( 'moment.langData is deprecated. Use moment.localeData instead.', getLocale ); var mathAbs = Math.abs; function abs() { var data = this._data; this._milliseconds = mathAbs(this._milliseconds); this._days = mathAbs(this._days); this._months = mathAbs(this._months); data.milliseconds = mathAbs(data.milliseconds); data.seconds = mathAbs(data.seconds); data.minutes = mathAbs(data.minutes); data.hours = mathAbs(data.hours); data.months = mathAbs(data.months); data.years = mathAbs(data.years); return this; } function addSubtract$1(duration, input, value, direction) { var other = createDuration(input, value); duration._milliseconds += direction * other._milliseconds; duration._days += direction * other._days; duration._months += direction * other._months; return duration._bubble(); } // supports only 2.0-style add(1, 's') or add(duration) function add$1(input, value) { return addSubtract$1(this, input, value, 1); } // supports only 2.0-style subtract(1, 's') or subtract(duration) function subtract$1(input, value) { return addSubtract$1(this, input, value, -1); } function absCeil(number) { if (number < 0) { return Math.floor(number); } else { return Math.ceil(number); } } function bubble() { var milliseconds = this._milliseconds, days = this._days, months = this._months, data = this._data, seconds, minutes, hours, years, monthsFromDays; // if we have a mix of positive and negative values, bubble down first // check: https://github.com/moment/moment/issues/2166 if ( !( (milliseconds >= 0 && days >= 0 && months >= 0) || (milliseconds <= 0 && days <= 0 && months <= 0) ) ) { milliseconds += absCeil(monthsToDays(months) + days) * 864e5; days = 0; months = 0; } // The following code bubbles up values, see the tests for // examples of what that means. data.milliseconds = milliseconds % 1000; seconds = absFloor(milliseconds / 1000); data.seconds = seconds % 60; minutes = absFloor(seconds / 60); data.minutes = minutes % 60; hours = absFloor(minutes / 60); data.hours = hours % 24; days += absFloor(hours / 24); // convert days to months monthsFromDays = absFloor(daysToMonths(days)); months += monthsFromDays; days -= absCeil(monthsToDays(monthsFromDays)); // 12 months -> 1 year years = absFloor(months / 12); months %= 12; data.days = days; data.months = months; data.years = years; return this; } function daysToMonths(days) { // 400 years have 146097 days (taking into account leap year rules) // 400 years have 12 months === 4800 return (days * 4800) / 146097; } function monthsToDays(months) { // the reverse of daysToMonths return (months * 146097) / 4800; } function as(units) { if (!this.isValid()) { return NaN; } var days, months, milliseconds = this._milliseconds; units = normalizeUnits(units); if (units === 'month' || units === 'quarter' || units === 'year') { days = this._days + milliseconds / 864e5; months = this._months + daysToMonths(days); switch (units) { case 'month': return months; case 'quarter': return months / 3; case 'year': return months / 12; } } else { // handle milliseconds separately because of floating point math errors (issue #1867) days = this._days + Math.round(monthsToDays(this._months)); switch (units) { case 'week': return days / 7 + milliseconds / 6048e5; case 'day': return days + milliseconds / 864e5; case 'hour': return days * 24 + milliseconds / 36e5; case 'minute': return days * 1440 + milliseconds / 6e4; case 'second': return days * 86400 + milliseconds / 1000; // Math.floor prevents floating point math errors here case 'millisecond': return Math.floor(days * 864e5) + milliseconds; default: throw new Error('Unknown unit ' + units); } } } // TODO: Use this.as('ms')? function valueOf$1() { if (!this.isValid()) { return NaN; } return ( this._milliseconds + this._days * 864e5 + (this._months % 12) * 2592e6 + toInt(this._months / 12) * 31536e6 ); } function makeAs(alias) { return function () { return this.as(alias); }; } var asMilliseconds = makeAs('ms'), asSeconds = makeAs('s'), asMinutes = makeAs('m'), asHours = makeAs('h'), asDays = makeAs('d'), asWeeks = makeAs('w'), asMonths = makeAs('M'), asQuarters = makeAs('Q'), asYears = makeAs('y'); function clone$1() { return createDuration(this); } function get$2(units) { units = normalizeUnits(units); return this.isValid() ? this[units + 's']() : NaN; } function makeGetter(name) { return function () { return this.isValid() ? this._data[name] : NaN; }; } var milliseconds = makeGetter('milliseconds'), seconds = makeGetter('seconds'), minutes = makeGetter('minutes'), hours = makeGetter('hours'), days = makeGetter('days'), months = makeGetter('months'), years = makeGetter('years'); function weeks() { return absFloor(this.days() / 7); } var round = Math.round, thresholds = { ss: 44, // a few seconds to seconds s: 45, // seconds to minute m: 45, // minutes to hour h: 22, // hours to day d: 26, // days to month/week w: null, // weeks to month M: 11, // months to year }; // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); } function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) { var duration = createDuration(posNegDuration).abs(), seconds = round(duration.as('s')), minutes = round(duration.as('m')), hours = round(duration.as('h')), days = round(duration.as('d')), months = round(duration.as('M')), weeks = round(duration.as('w')), years = round(duration.as('y')), a = (seconds <= thresholds.ss && ['s', seconds]) || (seconds < thresholds.s && ['ss', seconds]) || (minutes <= 1 && ['m']) || (minutes < thresholds.m && ['mm', minutes]) || (hours <= 1 && ['h']) || (hours < thresholds.h && ['hh', hours]) || (days <= 1 && ['d']) || (days < thresholds.d && ['dd', days]); if (thresholds.w != null) { a = a || (weeks <= 1 && ['w']) || (weeks < thresholds.w && ['ww', weeks]); } a = a || (months <= 1 && ['M']) || (months < thresholds.M && ['MM', months]) || (years <= 1 && ['y']) || ['yy', years]; a[2] = withoutSuffix; a[3] = +posNegDuration > 0; a[4] = locale; return substituteTimeAgo.apply(null, a); } // This function allows you to set the rounding function for relative time strings function getSetRelativeTimeRounding(roundingFunction) { if (roundingFunction === undefined) { return round; } if (typeof roundingFunction === 'function') { round = roundingFunction; return true; } return false; } // This function allows you to set a threshold for relative time strings function getSetRelativeTimeThreshold(threshold, limit) { if (thresholds[threshold] === undefined) { return false; } if (limit === undefined) { return thresholds[threshold]; } thresholds[threshold] = limit; if (threshold === 's') { thresholds.ss = limit - 1; } return true; } function humanize(argWithSuffix, argThresholds) { if (!this.isValid()) { return this.localeData().invalidDate(); } var withSuffix = false, th = thresholds, locale, output; if (typeof argWithSuffix === 'object') { argThresholds = argWithSuffix; argWithSuffix = false; } if (typeof argWithSuffix === 'boolean') { withSuffix = argWithSuffix; } if (typeof argThresholds === 'object') { th = Object.assign({}, thresholds, argThresholds); if (argThresholds.s != null && argThresholds.ss == null) { th.ss = argThresholds.s - 1; } } locale = this.localeData(); output = relativeTime$1(this, !withSuffix, th, locale); if (withSuffix) { output = locale.pastFuture(+this, output); } return locale.postformat(output); } var abs$1 = Math.abs; function sign(x) { return (x > 0) - (x < 0) || +x; } function toISOString$1() { // for ISO strings we do not use the normal bubbling rules: // * milliseconds bubble up until they become hours // * days do not bubble at all // * months bubble up until they become years // This is because there is no context-free conversion between hours and days // (think of clock changes) // and also not between days and months (28-31 days per month) if (!this.isValid()) { return this.localeData().invalidDate(); } var seconds = abs$1(this._milliseconds) / 1000, days = abs$1(this._days), months = abs$1(this._months), minutes, hours, years, s, total = this.asSeconds(), totalSign, ymSign, daysSign, hmsSign; if (!total) { // this is the same as C#'s (Noda) and python (isodate)... // but not other JS (goog.date) return 'P0D'; } // 3600 seconds -> 60 minutes -> 1 hour minutes = absFloor(seconds / 60); hours = absFloor(minutes / 60); seconds %= 60; minutes %= 60; // 12 months -> 1 year years = absFloor(months / 12); months %= 12; // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; totalSign = total < 0 ? '-' : ''; ymSign = sign(this._months) !== sign(total) ? '-' : ''; daysSign = sign(this._days) !== sign(total) ? '-' : ''; hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; return ( totalSign + 'P' + (years ? ymSign + years + 'Y' : '') + (months ? ymSign + months + 'M' : '') + (days ? daysSign + days + 'D' : '') + (hours || minutes || seconds ? 'T' : '') + (hours ? hmsSign + hours + 'H' : '') + (minutes ? hmsSign + minutes + 'M' : '') + (seconds ? hmsSign + s + 'S' : '') ); } var proto$2 = Duration.prototype; proto$2.isValid = isValid$1; proto$2.abs = abs; proto$2.add = add$1; proto$2.subtract = subtract$1; proto$2.as = as; proto$2.asMilliseconds = asMilliseconds; proto$2.asSeconds = asSeconds; proto$2.asMinutes = asMinutes; proto$2.asHours = asHours; proto$2.asDays = asDays; proto$2.asWeeks = asWeeks; proto$2.asMonths = asMonths; proto$2.asQuarters = asQuarters; proto$2.asYears = asYears; proto$2.valueOf = valueOf$1; proto$2._bubble = bubble; proto$2.clone = clone$1; proto$2.get = get$2; proto$2.milliseconds = milliseconds; proto$2.seconds = seconds; proto$2.minutes = minutes; proto$2.hours = hours; proto$2.days = days; proto$2.weeks = weeks; proto$2.months = months; proto$2.years = years; proto$2.humanize = humanize; proto$2.toISOString = toISOString$1; proto$2.toString = toISOString$1; proto$2.toJSON = toISOString$1; proto$2.locale = locale; proto$2.localeData = localeData; proto$2.toIsoString = deprecate( 'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1 ); proto$2.lang = lang; // FORMATTING addFormatToken('X', 0, 0, 'unix'); addFormatToken('x', 0, 0, 'valueOf'); // PARSING addRegexToken('x', matchSigned); addRegexToken('X', matchTimestamp); addParseToken('X', function (input, array, config) { config._d = new Date(parseFloat(input) * 1000); }); addParseToken('x', function (input, array, config) { config._d = new Date(toInt(input)); }); //! moment.js hooks.version = '2.29.1'; setHookCallback(createLocal); hooks.fn = proto; hooks.min = min; hooks.max = max; hooks.now = now; hooks.utc = createUTC; hooks.unix = createUnix; hooks.months = listMonths; hooks.isDate = isDate; hooks.locale = getSetGlobalLocale; hooks.invalid = createInvalid; hooks.duration = createDuration; hooks.isMoment = isMoment; hooks.weekdays = listWeekdays; hooks.parseZone = createInZone; hooks.localeData = getLocale; hooks.isDuration = isDuration; hooks.monthsShort = listMonthsShort; hooks.weekdaysMin = listWeekdaysMin; hooks.defineLocale = defineLocale; hooks.updateLocale = updateLocale; hooks.locales = listLocales; hooks.weekdaysShort = listWeekdaysShort; hooks.normalizeUnits = normalizeUnits; hooks.relativeTimeRounding = getSetRelativeTimeRounding; hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; hooks.calendarFormat = getCalendarFormat; hooks.prototype = proto; // currently HTML5 input type only supports 24-hour formats hooks.HTML5_FMT = { DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" /> DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" /> DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" /> DATE: 'YYYY-MM-DD', // <input type="date" /> TIME: 'HH:mm', // <input type="time" /> TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" /> TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" /> WEEK: 'GGGG-[W]WW', // <input type="week" /> MONTH: 'YYYY-MM', // <input type="month" /> }; return hooks; }))); }); /* components/timepicker/app/TimePicker.svelte generated by Svelte v2.16.1 */ let times = [], i; for(i=0; i<24; i++) { times.push( moment( {hour: i} ) ); times.push( moment( {hour: i, minute: 30} ) ); } function data$7() { return { times: times, twelvehour: true, } } function formatTime(t) { return moment(t).format('h:mm a'); } function formatTime24(t) { return moment(t).format('HH:mm'); } var methods$5 = { setTime(t) { }, }; function oncreate$6() { this.tabIndex = 0; } function click_handler(event) { const { component, ctx } = this._svelte; component.setTime(ctx.time); } function get_each_context(ctx, list, i) { const child_ctx = Object.create(ctx); child_ctx.time = list[i]; return child_ctx; } function create_main_fragment$7(component, ctx) { var kin_dropdown, div, text; var each_value = ctx.times; var each_blocks = []; for (var i_1 = 0; i_1 < each_value.length; i_1 += 1) { each_blocks[i_1] = create_each_block(component, get_each_context(ctx, each_value, i_1)); } return { c() { kin_dropdown = createElement("kin-dropdown"); div = createElement("div"); div.innerHTML = `<slot></slot>`; text = createText("\n\n\t"); for (var i_1 = 0; i_1 < each_blocks.length; i_1 += 1) { each_blocks[i_1].c(); } this.c = noop; setAttribute(div, "slot", "dropdown-activator"); setCustomElementData(kin_dropdown, "type", "timepicker"); }, m(target, anchor) { insert(target, kin_dropdown, anchor); append(kin_dropdown, div); append(kin_dropdown, text); for (var i_1 = 0; i_1 < each_blocks.length; i_1 += 1) { each_blocks[i_1].m(kin_dropdown, null); } }, p(changed, ctx) { if (changed.times || changed.twelvehour) { each_value = ctx.times; for (var i_1 = 0; i_1 < each_value.length; i_1 += 1) { const child_ctx = get_each_context(ctx, each_value, i_1); if (each_blocks[i_1]) { each_blocks[i_1].p(changed, child_ctx); } else { each_blocks[i_1] = create_each_block(component, child_ctx); each_blocks[i_1].c(); each_blocks[i_1].m(kin_dropdown, null); } } for (; i_1 < each_blocks.length; i_1 += 1) { each_blocks[i_1].d(1); } each_blocks.length = each_value.length; } }, d(detach) { if (detach) { detachNode(kin_dropdown); } destroyEach(each_blocks, detach); } }; } // (7:1) {#each times as time} function create_each_block(component, ctx) { var kin_dropdown_item, text0_value = ctx.twelvehour === true ? formatTime(ctx.time) : formatTime24(ctx.time), text0, text1; return { c() { kin_dropdown_item = createElement("kin-dropdown-item"); text0 = createText(text0_value); text1 = createText("\n\t\t"); kin_dropdown_item._svelte = { component, ctx }; addListener(kin_dropdown_item, "click", click_handler); setCustomElementData(kin_dropdown_item, "csscls", "-time"); }, m(target, anchor) { insert(target, kin_dropdown_item, anchor); append(kin_dropdown_item, text0); append(kin_dropdown_item, text1); }, p(changed, _ctx) { ctx = _ctx; if ((changed.twelvehour || changed.times) && text0_value !== (text0_value = ctx.twelvehour === true ? formatTime(ctx.time) : formatTime24(ctx.time))) { setData(text0, text0_value); } kin_dropdown_item._svelte.ctx = ctx; }, d(detach) { if (detach) { detachNode(kin_dropdown_item); } removeListener(kin_dropdown_item, "click", click_handler); } }; } class TimePicker extends HTMLElement { constructor(options = {}) { super(); init(this, options); this._state = assign(data$7(), options.data); this._intro = true; this.attachShadow({ mode: 'open' }); this.shadowRoot.innerHTML = `<style>:host{display:inline-block}</style>`; this._fragment = create_main_fragment$7(this, this._state); this.root._oncreate.push(() => { oncreate$6.call(this); this.fire("update", { changed: assignTrue({}, this._state), current: this._state }); }); this._fragment.c(); this._fragment.m(this.shadowRoot, null); if (options.target) this._mount(options.target, options.anchor); } static get observedAttributes() { return ["twelvehour"]; } get twelvehour() { return this.get().twelvehour; } set twelvehour(value) { this.set({ twelvehour: value }); } attributeChangedCallback(attr, oldValue, newValue) { this.set({ [attr]: newValue }); } connectedCallback() { flush(this); } } assign(TimePicker.prototype, proto); assign(TimePicker.prototype, methods$5); assign(TimePicker.prototype, { _mount(target, anchor) { target.insertBefore(this, anchor); } }); customElements.define("kin-timepicker", TimePicker); var css_248z$7 = "kin-crumbs {\n display: block;\n}\nkin-crumbs .kin_crumbs {\n font-size: var(--font-size-small);\n color: inherit;\n text-align: start;\n}\nkin-crumbs .kin_crumbs__item {\n padding: 5px 0;\n color: var(--color-text-secondary);\n text-decoration: none;\n display: inline-block;\n transition: opacity 0.2s linear;\n}\nkin-crumbs .kin_crumbs__item[href]:hover,\nkin-crumbs .kin_crumbs__item:focus {\n cursor: pointer;\n text-decoration: underline;\n color: var(--color-text);\n}\nkin-crumbs .kin_crumbs__item:after {\n content: '\\203A';\n display: inline-block;\n padding: 0 5px 0 6px;\n}\nkin-crumbs .kin_crumbs__item.-back:after,\nkin-crumbs .kin_crumbs__item:last-child:after {\n content: '';\n display: none;\n}\nkin-crumbs .kin_crumbs.-rtl .kin_crumbs__item:after {\n display: inline-block;\n padding: 0 6px 0 5px;\n}\n"; styleInject(css_248z$7); class Crumbs extends KinElement { static get attrCfg() { return { section: null, sectionlabel: null, modulelabel: null, title: null } } static get observedAttributes() { return Object.keys(Crumbs.attrCfg).filter(name => Crumbs.attrCfg[name]); } constructor() { super(); } initElem() { this.elTpl = document.createElement('div'); this.elTpl.classList.add('kin_crumbs'); const title = this.getAttribute('title'); if (title) { this.setTitle(title); } if (this.hasAttribute('section')) { const sectionLabel = this.getAttribute('sectionlabel'); const section = this.getAttribute('section'); const sectionItem = document.createElement('a'); sectionItem.classList.add('kin_crumbs__item'); sectionItem.setAttribute('href', '#' + section); sectionItem.appendChild(document.createTextNode(sectionLabel || section)); this.elTpl.appendChild(sectionItem); const moduleLabel = this.getAttribute('modulelabel'); if (moduleLabel) { this.setTitle(moduleLabel); } } } setTitle(title) { const titleItem = document.createElement('span'); titleItem.classList.add('kin_crumbs__item'); titleItem.appendChild(document.createTextNode(title)); this.elTpl.appendChild(titleItem); } } customElements.define('kin-crumbs', Crumbs); var css_248z$8 = "kin-tile {\n display: inline-block;\n width: inherit;\n pointer-events: none;\n}\nkin-tile .kin_tile {\n box-sizing: border-box;\n display: inline-flex;\n position: relative;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: 17rem;\n width: 21rem;\n margin: 1rem;\n vertical-align: top;\n padding: 1rem 1rem 2rem;\n border: 0;\n border-radius: var(--cube-radius);\n color: var(--color-text);\n font-size: var(--font-size);\n text-decoration: none;\n text-align: center;\n background-color: var(--cube-bg);\n box-shadow: 0px 6px 15px 0 rgba(0,0,0,0.1), 0 20px 30px -15px rgba(0,0,0,0.3);\n cursor: pointer;\n pointer-events: auto;\n transition: background-color 0.2s;\n}\nkin-tile .kin_tile:disabled {\n opacity: 0.3;\n cursor: default;\n pointer-events: none;\n}\nkin-tile .kin_tile:hover,\nkin-tile .kin_tile:focus {\n background-color: var(--cube-bg-hover);\n transform: scale(1.03);\n}\nkin-tile .kin_tile:hover .kin_button,\nkin-tile .kin_tile:focus .kin_button {\n background-color: var(--button-bg);\n border: 0;\n color: var(--button-color);\n pointer-events: none;\n}\nkin-tile .kin_tile__icon {\n margin: 0 0 1rem;\n}\nkin-tile .kin_tile__label {\n font-weight: var(--cube-label-weight);\n}\nkin-tile .kin_tile__desc {\n color: var(--color-text-secondary);\n font-size: var(--font-size-small);\n}\nkin-tile .kin_tile__label,\nkin-tile .kin_tile__btn,\nkin-tile .kin_tile__icon {\n margin: 0.5rem 0;\n}\nkin-tile .kin_tile.-ok .kin_tile__desc {\n color: var(--color-ok);\n}\nkin-tile .kin_tile.-critical .kin_tile__desc {\n color: var(--color-critical);\n}\nkin-tile .kin_tile.-processing:after {\n content: '';\n position: absolute;\n height: 0.5rem;\n right: 5%;\n bottom: 0.8rem;\n width: 20%;\n/* border-radius 1rem */\n pointer-events: none;\n background-color: rgba(255,255,255,0.2);\n animation: processing 2.5s linear infinite;\n}\nkin-tile .kin_tile.-large {\n height: 22rem;\n}\nkin-tile .kin_tile.-fluid {\n width: 100%;\n height: 100%;\n margin: 0;\n}\n@-moz-keyframes processing {\n 0% {\n left: 5%;\n width: 20%;\n }\n 25% {\n left: 20%;\n width: 75%;\n }\n 50% {\n left: 75%;\n width: 20%;\n }\n 75% {\n width: 75%;\n left: 5%;\n }\n 100% {\n width: 20%;\n left: 5%;\n }\n}\n@-webkit-keyframes processing {\n 0% {\n left: 5%;\n width: 20%;\n }\n 25% {\n left: 20%;\n width: 75%;\n }\n 50% {\n left: 75%;\n width: 20%;\n }\n 75% {\n width: 75%;\n left: 5%;\n }\n 100% {\n width: 20%;\n left: 5%;\n }\n}\n@-o-keyframes processing {\n 0% {\n left: 5%;\n width: 20%;\n }\n 25% {\n left: 20%;\n width: 75%;\n }\n 50% {\n left: 75%;\n width: 20%;\n }\n 75% {\n width: 75%;\n left: 5%;\n }\n 100% {\n width: 20%;\n left: 5%;\n }\n}\n@keyframes processing {\n 0% {\n left: 5%;\n width: 20%;\n }\n 25% {\n left: 20%;\n width: 75%;\n }\n 50% {\n left: 75%;\n width: 20%;\n }\n 75% {\n width: 75%;\n left: 5%;\n }\n 100% {\n width: 20%;\n left: 5%;\n }\n}\n"; styleInject(css_248z$8); class Tile extends KinElement { static get attrCfg() { return { link: { // tile with link - <a href="{link}"> updateFn: 'updateAttr', updateCfg: { name: 'href' } }, processing: { // action in progress, visual progress updateFn: 'toggleClass', updateCfg: { cssCls: '-processing' } }, label: { // primary label updateFn: 'component', updateCfg: { el: 'elLabel', set: function (attrValue) { this.elLabel.innerText = attrValue; }, create: function () { this.elLabel = document.createElement('h4'); this.elLabel.classList.add('kin_tile__label'); } } }, desc: { // secondary text updateFn: 'component', updateCfg: { el: 'elDesc', set: function (attrValue) { this.elDesc.innerText = attrValue; }, create: function () { this.elDesc = document.createElement('p'); this.elDesc.classList.add('kin_tile__desc'); } } }, status: { // description color updateFn: 'updateClass' }, icon: { // tile icon updateFn: 'component', updateCfg: { el: 'elIcon', set: function (attrValue) { this.elIcon.setAttribute('name', attrValue); }, create: function () { this.elIcon = document.createElement('kin-icon'); this.elIcon.classList.add('kin_tile__icon'); } } }, 'kin-disabled': { // need to prefix because 'disabled' is reserved for focusable elements updateFn: 'toggleAttr', updateCfg: { attrName: 'disabled', attrValue: true } }, title: { // title updateFn: 'updateAttr', updateCfg: { name: 'title' } }, size: { // tile size large|small|huge updateFn: 'updateClass' }, fluid: { // sets the size (w/h) according to the wrapping el updateFn: 'toggleClass', updateCfg: { cssCls: '-fluid' } }, 'tile-button': { updateFn: 'component', updateCfg: { el: 'elButton', set: function (attrValue) { this.elButton.innerText = attrValue; }, create: function () { this.elButton = document.createElement('kin-button'); this.elButton.setAttribute('type', 'secondary'); this.elButton.classList.add('kin_tile__btn'); } } } }; } static get observedAttributes() { return Object.keys(Tile.attrCfg).filter(name => Tile.attrCfg[name]); } constructor() { super(); } initElem() { if (this.hasAttribute('link')) { this.elTpl = document.createElement('a'); } else { this.elTpl = document.createElement('button'); } this.elTpl.classList.add('kin_tile'); } } customElements.define('kin-tile', Tile); var css_248z$9 = "kin-switch {\n display: inline-block;\n position: relative;\n width: var(--switch-width);\n height: var(--switch-height);\n}\nkin-switch[size=\"large\"] {\n width: var(--switch-width-large);\n height: var(--switch-height-large);\n}\nkin-switch[size=\"small\"] {\n width: var(--switch-width-small);\n height: var(--switch-height-small);\n}\nkin-switch[kin-disabled=\"true\"] {\n pointer-events: none;\n}\nkin-switch .kin_switch {\n height: var(--switch-height);\n width: var(--switch-width);\n border-radius: 5rem;\n border: 0;\n position: relative;\n background-color: var(--switch-bg);\n overflow: hidden;\n cursor: pointer;\n padding: 0;\n margin: 0;\n transition: background-color 1s;\n -webkit-appearance: initial;\n appearance: initial;\n}\nkin-switch .kin_switch:focus,\nkin-switch .kin_switch:hover {\n transform: scale(1.08);\n}\nkin-switch .kin_switch__handle {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: var(--switch-height);\n display: flex;\n justify-content: center;\n align-items: center;\n transition: left 0.2s, background-color 1s;\n color: var(--switch-color);\n pointer-events: none;\n}\nkin-switch .kin_switch__handle:before {\n content: '';\n position: absolute;\n top: var(--switch-handle-padding);\n right: var(--switch-handle-padding);\n bottom: var(--switch-handle-padding);\n left: var(--switch-handle-padding);\n border-radius: 50px;\n background-color: var(--switch-handle-bg);\n box-shadow: var(--switch-handle-shadow);\n}\nkin-switch .kin_switch__handle .kin_switch__icon {\n --icon-stroke-small: 3px;\n position: relative;\n}\nkin-switch .kin_switch.-checked {\n background-color: var(--switch-bg-checked);\n}\nkin-switch .kin_switch.-checked + .kin_switch__handle {\n left: calc(100% - var(--switch-height));\n color: var(--switch-color-checked);\n}\nkin-switch .kin_switch.-checked + .kin_switch__handle:before {\n background-color: var(--switch-handle-bg-checked);\n}\nkin-switch .kin_switch.-locked {\n background-color: var(--app-bg-darker);\n}\nkin-switch .kin_switch.-locked + .kin_switch__handle:before {\n background: var(--color-upsell);\n}\nkin-switch .kin_switch.-processing {\n pointer-events: none;\n cursor: default;\n}\nkin-switch .kin_switch.-processing + .kin_switch__handle:after {\n content: '';\n position: absolute;\n top: 6px;\n right: 6px;\n bottom: 6px;\n left: 6px;\n border-radius: 50%;\n border: 0.12em solid;\n border-left-color: transparent;\n animation: spinner 1s linear infinite;\n animation-direction: reverse;\n -webkit-mask-image: -webkit-gradient(linear, center top, center bottom, color-stop(0.3, #000), color-stop(0.8, rgba(0,0,0,0)));\n}\nkin-switch .kin_switch.-processing + .kin_switch__handle .kin_switch__icon {\n display: none;\n}\nkin-switch .kin_switch.-disabled {\n opacity: 0.5;\n pointer-events: none;\n cursor: default;\n}\nkin-switch .kin_switch.-disabled + .kin_switch__handle {\n opacity: 0.5;\n}\nkin-switch .kin_switch.-trivial:not(.-checked) {\n background-color: var(--switch-bg-trivial);\n}\nkin-switch .kin_switch.-trivial:not(.-checked) + .kin_switch__handle {\n color: var(--switch-color-trivial);\n}\nkin-switch .kin_switch.-trivial:not(.-checked) + .kin_switch__handle:before {\n background-color: var(--switch-handle-bg-trivial);\n}\nkin-switch .kin_switch.-small {\n height: var(--switch-height-small);\n width: var(--switch-width-small);\n}\nkin-switch .kin_switch.-small + .kin_switch__handle {\n width: var(--switch-height-small);\n font-size: var(--font-size-small);\n}\nkin-switch .kin_switch.-small + .kin_switch__handle .kin_switch__icon {\n transform: scale(0.8);\n}\nkin-switch .kin_switch.-small.-checked + .kin_switch__handle {\n left: calc(100% - var(--switch-height-small));\n}\nkin-switch .kin_switch.-large {\n height: var(--switch-height-large);\n width: var(--switch-width-large);\n}\nkin-switch .kin_switch.-large + .kin_switch__handle {\n width: var(--switch-height-large);\n font-size: var(--font-size-large);\n}\nkin-switch .kin_switch.-large + .kin_switch__handle .kin_switch__icon {\n transform: scale(1.3);\n}\nkin-switch .kin_switch.-large.-checked + .kin_switch__handle {\n left: calc(100% - var(--switch-height-large));\n}\n@-moz-keyframes spinner {\n 100% {\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spinner {\n 100% {\n transform: rotate(360deg);\n }\n}\n@-o-keyframes spinner {\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes spinner {\n 100% {\n transform: rotate(360deg);\n }\n}\n"; styleInject(css_248z$9); class Switch extends KinElement { static get attrCfg() { return { 'kin-disabled': { // need to prefix because 'disabled' is reserved for focusable elements updateFn: ['toggleAttr', 'toggleClass'], updateCfg: [{ attrName: 'disabled', attrValue: true, el: 'elSwitch' }, { cssCls: '-disabled', el: 'elSwitch' }] }, checked: { updateFn: ['toggleAttr', 'toggleClass'], updateCfg: [{ attrName: 'checked', attrValue: true, el: 'elSwitch' }, { cssCls: '-checked', el: 'elSwitch' }] }, processing: { // action in progress, visual progress updateFn: ['toggleAttr', 'toggleClass'], updateCfg: [{ attrName: 'disabled', attrValue: true, el: 'elSwitch' }, { cssCls: '-processing', el: 'elSwitch' }] }, locked: { // locked feature switch updateFn: ['toggleAttr', 'toggleClass'], updateCfg: [{ attrName: 'locked', attrValue: true, el: 'elSwitch' }, { cssCls: '-locked', el: 'elSwitch' }] }, title: { // title updateFn: 'updateAttr', updateCfg: { name: 'title', el: 'elSwitch' } }, 'data-test': null, // automation locator trivial: { updateFn: 'toggleClass', updateCfg: { cssCls: '-trivial', el: 'elSwitch' } }, size: { updateFn: 'updateClass', updateCfg: { el: 'elSwitch' } } } } static get observedAttributes() { return Object.keys(Switch.attrCfg).filter(name => Switch.attrCfg[name]); } constructor() { super(); } initElem() { this.elTpl = document.createElement('div'); this.elSwitch = document.createElement('input'); this.elSwitchHandle = document.createElement('div'); this.elSwitchIcon = document.createElement('kin-icon'); this.elTpl.appendChild(this.elSwitch); this.elTpl.appendChild(this.elSwitchHandle); this.elSwitchIcon.setAttribute('size', '12'); this.elSwitchIcon.classList.add('kin_switch__icon'); this.elSwitchHandle.appendChild(this.elSwitchIcon); if (this.hasAttribute('data-test')) { this.elSwitch.setAttribute('data-test', this.getAttribute('data-test')); this.removeAttribute('data-test'); } this.elSwitch.classList.add('kin_switch'); this.elSwitch.setAttribute('type', 'checkbox'); this.elSwitchHandle.classList.add('kin_switch__handle'); } updateIcon() { const checked = this.getAttribute('checked') === 'true' || this.getAttribute('checked') === ''; const locked = this.getAttribute('locked') === 'true'; let icon = checked ? 'switch-ok' : 'switch-x'; icon = locked ? 'icon-s-fill-lock' : icon; this.elSwitchIcon.setAttribute('name', icon); } updateElem() { // TODO: rozebrat update icon this.updateIcon(); } } customElements.define('kin-switch', Switch); var index = {}; exports.default = index; return exports; }({})); (function (encoded, words, link) { link.setAttribute('rel', 'stylesheet'); link.setAttribute('href', URL.createObjectURL( new Blob( encoded.map(function (index) { return words[index]; }), {type: 'text/css'} ) )); URL.revokeObjectURL(link.getAttribute('href')); }( [], [], document.head.appendChild(document.createElement('link')) )); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvc3ZlbHRlL3NoYXJlZC5qcyIsIi4uL2NvbXBvbmVudHMvcGFnZS9hcHAvUGFnZS5zdmVsdGUiLCIuLi9jb21wb25lbnRzL3RhYmxlL2FwcC9BcHAuaHRtbCIsIi4uL2NvbXBvbmVudHMvdmlldy9hcHAvQXBwLmh0bWwiLCIuLi9jb21wb25lbnRzL2NpcmNsZXMvYXBwL0FwcC5odG1sIiwiLi4vY29tcG9uZW50cy9wcm9ncmVzcy9hcHAvUHJvZ3Jlc3Muc3ZlbHRlIiwiLi4vY29tcG9uZW50cy9pY29uL2FwcC9BcHAuaHRtbCIsIi4uL2NvbXBvbmVudHMvbG9hZGluZy9hcHAvTG9hZGluZy5zdmVsdGUiLCIuLi9jb21wb25lbnRzL0tpbkVsZW1lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvc3R5bGUtaW5qZWN0L2Rpc3Qvc3R5bGUtaW5qZWN0LmVzLmpzIiwiLi4vY29tcG9uZW50cy9pcG0vaXBtLmpzIiwiLi4vY29tcG9uZW50cy90b29sdGlwL3Rvb2x0aXAuanMiLCIuLi9jb21wb25lbnRzL2J1dHRvbi9idXR0b24uanMiLCIuLi9saWJzL0NvbXBvTWl4aW4uanMiLCIuLi9saWJzL0Ryb3BMaWIuanMiLCIuLi9saWJzL3RyYXBUYWJOYXZpZ2F0aW9uLmpzIiwiLi4vY29tcG9uZW50cy9kcm9wZG93bi9kcm9wZG93bi5qcyIsIi4uL2NvbXBvbmVudHMvZHJvcGRvd24taXRlbS9kcm9wZG93bkl0ZW0uanMiLCIuLi9jb21wb25lbnRzL2lucHV0L2lucHV0LmpzIiwiLi4vY29tcG9uZW50cy9zZWxlY3Qvc2VsZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL21vbWVudC9tb21lbnQuanMiLCIuLi9jb21wb25lbnRzL3RpbWVwaWNrZXIvYXBwL1RpbWVQaWNrZXIuc3ZlbHRlIiwiLi4vY29tcG9uZW50cy9jcnVtYnMvY3J1bWJzLmpzIiwiLi4vY29tcG9uZW50cy90aWxlL3RpbGUuanMiLCIuLi9jb21wb25lbnRzL3N3aXRjaC9zd2l0Y2guanMiLCIuLi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gYXNzaWduKHRhciwgc3JjKSB7XG5cdGZvciAodmFyIGsgaW4gc3JjKSB0YXJba10gPSBzcmNba107XG5cdHJldHVybiB0YXI7XG59XG5cbmZ1bmN0aW9uIGFzc2lnblRydWUodGFyLCBzcmMpIHtcblx0Zm9yICh2YXIgayBpbiBzcmMpIHRhcltrXSA9IDE7XG5cdHJldHVybiB0YXI7XG59XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZSh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGNhbGxBZnRlcihmbiwgaSkge1xuXHRpZiAoaSA9PT0gMCkgZm4oKTtcblx0cmV0dXJuICgpID0+IHtcblx0XHRpZiAoIS0taSkgZm4oKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gYWRkTG9jKGVsZW1lbnQsIGZpbGUsIGxpbmUsIGNvbHVtbiwgY2hhcikge1xuXHRlbGVtZW50Ll9fc3ZlbHRlX21ldGEgPSB7XG5cdFx0bG9jOiB7IGZpbGUsIGxpbmUsIGNvbHVtbiwgY2hhciB9XG5cdH07XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGUoc3JjLCBwcm9wKSB7XG5cdGNvbnN0IHRhciA9IHt9O1xuXHRmb3IgKGNvbnN0IGsgaW4gc3JjKSBrID09PSBwcm9wIHx8ICh0YXJba10gPSBzcmNba10pO1xuXHRyZXR1cm4gdGFyO1xufVxuXG5mdW5jdGlvbiBydW4oZm4pIHtcblx0Zm4oKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kKHRhcmdldCwgbm9kZSkge1xuXHR0YXJnZXQuYXBwZW5kQ2hpbGQobm9kZSk7XG59XG5cbmZ1bmN0aW9uIGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuXHR0YXJnZXQuaW5zZXJ0QmVmb3JlKG5vZGUsIGFuY2hvcik7XG59XG5cbmZ1bmN0aW9uIGRldGFjaE5vZGUobm9kZSkge1xuXHRub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG59XG5cbmZ1bmN0aW9uIGRldGFjaEJldHdlZW4oYmVmb3JlLCBhZnRlcikge1xuXHR3aGlsZSAoYmVmb3JlLm5leHRTaWJsaW5nICYmIGJlZm9yZS5uZXh0U2libGluZyAhPT0gYWZ0ZXIpIHtcblx0XHRiZWZvcmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiZWZvcmUubmV4dFNpYmxpbmcpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGRldGFjaEJlZm9yZShhZnRlcikge1xuXHR3aGlsZSAoYWZ0ZXIucHJldmlvdXNTaWJsaW5nKSB7XG5cdFx0YWZ0ZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhZnRlci5wcmV2aW91c1NpYmxpbmcpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGRldGFjaEFmdGVyKGJlZm9yZSkge1xuXHR3aGlsZSAoYmVmb3JlLm5leHRTaWJsaW5nKSB7XG5cdFx0YmVmb3JlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYmVmb3JlLm5leHRTaWJsaW5nKTtcblx0fVxufVxuXG5mdW5jdGlvbiByZWluc2VydEJldHdlZW4oYmVmb3JlLCBhZnRlciwgdGFyZ2V0KSB7XG5cdHdoaWxlIChiZWZvcmUubmV4dFNpYmxpbmcgJiYgYmVmb3JlLm5leHRTaWJsaW5nICE9PSBhZnRlcikge1xuXHRcdHRhcmdldC5hcHBlbmRDaGlsZChiZWZvcmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiZWZvcmUubmV4dFNpYmxpbmcpKTtcblx0fVxufVxuXG5mdW5jdGlvbiByZWluc2VydENoaWxkcmVuKHBhcmVudCwgdGFyZ2V0KSB7XG5cdHdoaWxlIChwYXJlbnQuZmlyc3RDaGlsZCkgdGFyZ2V0LmFwcGVuZENoaWxkKHBhcmVudC5maXJzdENoaWxkKTtcbn1cblxuZnVuY3Rpb24gcmVpbnNlcnRBZnRlcihiZWZvcmUsIHRhcmdldCkge1xuXHR3aGlsZSAoYmVmb3JlLm5leHRTaWJsaW5nKSB0YXJnZXQuYXBwZW5kQ2hpbGQoYmVmb3JlLm5leHRTaWJsaW5nKTtcbn1cblxuZnVuY3Rpb24gcmVpbnNlcnRCZWZvcmUoYWZ0ZXIsIHRhcmdldCkge1xuXHR2YXIgcGFyZW50ID0gYWZ0ZXIucGFyZW50Tm9kZTtcblx0d2hpbGUgKHBhcmVudC5maXJzdENoaWxkICE9PSBhZnRlcikgdGFyZ2V0LmFwcGVuZENoaWxkKHBhcmVudC5maXJzdENoaWxkKTtcbn1cblxuZnVuY3Rpb24gZGVzdHJveUVhY2goaXRlcmF0aW9ucywgZGV0YWNoKSB7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgaXRlcmF0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdGlmIChpdGVyYXRpb25zW2ldKSBpdGVyYXRpb25zW2ldLmQoZGV0YWNoKTtcblx0fVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudCgpIHtcblx0cmV0dXJuIGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudChuYW1lKSB7XG5cdHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTdmdFbGVtZW50KG5hbWUpIHtcblx0cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGV4dChkYXRhKSB7XG5cdHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkYXRhKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29tbWVudCgpIHtcblx0cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJycpO1xufVxuXG5mdW5jdGlvbiBhZGRMaXN0ZW5lcihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuXHRub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuXHRub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGUobm9kZSwgYXR0cmlidXRlLCB2YWx1ZSkge1xuXHRpZiAodmFsdWUgPT0gbnVsbCkgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcblx0ZWxzZSBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gc2V0QXR0cmlidXRlcyhub2RlLCBhdHRyaWJ1dGVzKSB7XG5cdGZvciAodmFyIGtleSBpbiBhdHRyaWJ1dGVzKSB7XG5cdFx0aWYgKGtleSA9PT0gJ3N0eWxlJykge1xuXHRcdFx0bm9kZS5zdHlsZS5jc3NUZXh0ID0gYXR0cmlidXRlc1trZXldO1xuXHRcdH0gZWxzZSBpZiAoa2V5IGluIG5vZGUpIHtcblx0XHRcdG5vZGVba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c2V0QXR0cmlidXRlKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gc2V0Q3VzdG9tRWxlbWVudERhdGEobm9kZSwgcHJvcCwgdmFsdWUpIHtcblx0aWYgKHByb3AgaW4gbm9kZSkge1xuXHRcdG5vZGVbcHJvcF0gPSB2YWx1ZTtcblx0fSBlbHNlIHtcblx0XHRzZXRBdHRyaWJ1dGUobm9kZSwgcHJvcCwgdmFsdWUpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHNldFhsaW5rQXR0cmlidXRlKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcblx0bm9kZS5zZXRBdHRyaWJ1dGVOUygnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsIGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBnZXRCaW5kaW5nR3JvdXBWYWx1ZShncm91cCkge1xuXHR2YXIgdmFsdWUgPSBbXTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBncm91cC5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdGlmIChncm91cFtpXS5jaGVja2VkKSB2YWx1ZS5wdXNoKGdyb3VwW2ldLl9fdmFsdWUpO1xuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlID09PSAnJyA/IHVuZGVmaW5lZCA6ICt2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdGltZVJhbmdlc1RvQXJyYXkocmFuZ2VzKSB7XG5cdHZhciBhcnJheSA9IFtdO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdGFycmF5LnB1c2goeyBzdGFydDogcmFuZ2VzLnN0YXJ0KGkpLCBlbmQ6IHJhbmdlcy5lbmQoaSkgfSk7XG5cdH1cblx0cmV0dXJuIGFycmF5O1xufVxuXG5mdW5jdGlvbiBjaGlsZHJlbiAoZWxlbWVudCkge1xuXHRyZXR1cm4gQXJyYXkuZnJvbShlbGVtZW50LmNoaWxkTm9kZXMpO1xufVxuXG5mdW5jdGlvbiBjbGFpbUVsZW1lbnQgKG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzLCBzdmcpIHtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdHZhciBub2RlID0gbm9kZXNbaV07XG5cdFx0aWYgKG5vZGUubm9kZU5hbWUgPT09IG5hbWUpIHtcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgbm9kZS5hdHRyaWJ1dGVzLmxlbmd0aDsgaiArPSAxKSB7XG5cdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBub2RlLmF0dHJpYnV0ZXNbal07XG5cdFx0XHRcdGlmICghYXR0cmlidXRlc1thdHRyaWJ1dGUubmFtZV0pIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZS5uYW1lKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBub2Rlcy5zcGxpY2UoaSwgMSlbMF07IC8vIFRPRE8gc3RyaXAgdW53YW50ZWQgYXR0cmlidXRlc1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBzdmcgPyBjcmVhdGVTdmdFbGVtZW50KG5hbWUpIDogY3JlYXRlRWxlbWVudChuYW1lKTtcbn1cblxuZnVuY3Rpb24gY2xhaW1UZXh0IChub2RlcywgZGF0YSkge1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0dmFyIG5vZGUgPSBub2Rlc1tpXTtcblx0XHRpZiAobm9kZS5ub2RlVHlwZSA9PT0gMykge1xuXHRcdFx0bm9kZS5kYXRhID0gZGF0YTtcblx0XHRcdHJldHVybiBub2Rlcy5zcGxpY2UoaSwgMSlbMF07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNyZWF0ZVRleHQoZGF0YSk7XG59XG5cbmZ1bmN0aW9uIHNldERhdGEodGV4dCwgZGF0YSkge1xuXHR0ZXh0LmRhdGEgPSAnJyArIGRhdGE7XG59XG5cbmZ1bmN0aW9uIHNldElucHV0VHlwZShpbnB1dCwgdHlwZSkge1xuXHR0cnkge1xuXHRcdGlucHV0LnR5cGUgPSB0eXBlO1xuXHR9IGNhdGNoIChlKSB7fVxufVxuXG5mdW5jdGlvbiBzZXRTdHlsZShub2RlLCBrZXksIHZhbHVlKSB7XG5cdG5vZGUuc3R5bGUuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdE9wdGlvbihzZWxlY3QsIHZhbHVlKSB7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0Lm9wdGlvbnMubGVuZ3RoOyBpICs9IDEpIHtcblx0XHR2YXIgb3B0aW9uID0gc2VsZWN0Lm9wdGlvbnNbaV07XG5cblx0XHRpZiAob3B0aW9uLl9fdmFsdWUgPT09IHZhbHVlKSB7XG5cdFx0XHRvcHRpb24uc2VsZWN0ZWQgPSB0cnVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBzZWxlY3RPcHRpb25zKHNlbGVjdCwgdmFsdWUpIHtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdHZhciBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcblx0XHRvcHRpb24uc2VsZWN0ZWQgPSB+dmFsdWUuaW5kZXhPZihvcHRpb24uX192YWx1ZSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gc2VsZWN0VmFsdWUoc2VsZWN0KSB7XG5cdHZhciBzZWxlY3RlZE9wdGlvbiA9IHNlbGVjdC5xdWVyeVNlbGVjdG9yKCc6Y2hlY2tlZCcpIHx8IHNlbGVjdC5vcHRpb25zWzBdO1xuXHRyZXR1cm4gc2VsZWN0ZWRPcHRpb24gJiYgc2VsZWN0ZWRPcHRpb24uX192YWx1ZTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0TXVsdGlwbGVWYWx1ZShzZWxlY3QpIHtcblx0cmV0dXJuIFtdLm1hcC5jYWxsKHNlbGVjdC5xdWVyeVNlbGVjdG9yQWxsKCc6Y2hlY2tlZCcpLCBmdW5jdGlvbihvcHRpb24pIHtcblx0XHRyZXR1cm4gb3B0aW9uLl9fdmFsdWU7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBhZGRSZXNpemVMaXN0ZW5lcihlbGVtZW50LCBmbikge1xuXHRpZiAoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcblx0XHRlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcblx0fVxuXG5cdGNvbnN0IG9iamVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29iamVjdCcpO1xuXHRvYmplY3Quc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5OiBibG9jazsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IGxlZnQ6IDA7IGhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7IG92ZXJmbG93OiBoaWRkZW47IHBvaW50ZXItZXZlbnRzOiBub25lOyB6LWluZGV4OiAtMTsnKTtcblx0b2JqZWN0LnR5cGUgPSAndGV4dC9odG1sJztcblxuXHRsZXQgd2luO1xuXG5cdG9iamVjdC5vbmxvYWQgPSAoKSA9PiB7XG5cdFx0d2luID0gb2JqZWN0LmNvbnRlbnREb2N1bWVudC5kZWZhdWx0Vmlldztcblx0XHR3aW4uYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZm4pO1xuXHR9O1xuXG5cdGlmICgvVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkge1xuXHRcdGVsZW1lbnQuYXBwZW5kQ2hpbGQob2JqZWN0KTtcblx0XHRvYmplY3QuZGF0YSA9ICdhYm91dDpibGFuayc7XG5cdH0gZWxzZSB7XG5cdFx0b2JqZWN0LmRhdGEgPSAnYWJvdXQ6YmxhbmsnO1xuXHRcdGVsZW1lbnQuYXBwZW5kQ2hpbGQob2JqZWN0KTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Y2FuY2VsOiAoKSA9PiB7XG5cdFx0XHR3aW4gJiYgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIgJiYgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZuKTtcblx0XHRcdGVsZW1lbnQucmVtb3ZlQ2hpbGQob2JqZWN0KTtcblx0XHR9XG5cdH07XG59XG5cbmZ1bmN0aW9uIHRvZ2dsZUNsYXNzKGVsZW1lbnQsIG5hbWUsIHRvZ2dsZSkge1xuXHRlbGVtZW50LmNsYXNzTGlzdFt0b2dnbGUgPyAnYWRkJyA6ICdyZW1vdmUnXShuYW1lKTtcbn1cblxuZnVuY3Rpb24gbGluZWFyKHQpIHtcblx0cmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUnVsZSh7IGEsIGIsIGRlbHRhLCBkdXJhdGlvbiB9LCBlYXNlLCBmbikge1xuXHRjb25zdCBzdGVwID0gMTYuNjY2IC8gZHVyYXRpb247XG5cdGxldCBrZXlmcmFtZXMgPSAne1xcbic7XG5cblx0Zm9yIChsZXQgcCA9IDA7IHAgPD0gMTsgcCArPSBzdGVwKSB7XG5cdFx0Y29uc3QgdCA9IGEgKyBkZWx0YSAqIGVhc2UocCk7XG5cdFx0a2V5ZnJhbWVzICs9IHAgKiAxMDAgKyBgJXske2ZuKHQsIDEgLSB0KX19XFxuYDtcblx0fVxuXG5cdHJldHVybiBrZXlmcmFtZXMgKyBgMTAwJSB7JHtmbihiLCAxIC0gYil9fVxcbn1gO1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGFya3NreWFwcC9zdHJpbmctaGFzaC9ibG9iL21hc3Rlci9pbmRleC5qc1xuZnVuY3Rpb24gaGFzaChzdHIpIHtcblx0bGV0IGhhc2ggPSA1MzgxO1xuXHRsZXQgaSA9IHN0ci5sZW5ndGg7XG5cblx0d2hpbGUgKGktLSkgaGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpIF4gc3RyLmNoYXJDb2RlQXQoaSk7XG5cdHJldHVybiBoYXNoID4+PiAwO1xufVxuXG5mdW5jdGlvbiB3cmFwVHJhbnNpdGlvbihjb21wb25lbnQsIG5vZGUsIGZuLCBwYXJhbXMsIGludHJvKSB7XG5cdGxldCBvYmogPSBmbi5jYWxsKGNvbXBvbmVudCwgbm9kZSwgcGFyYW1zKTtcblx0bGV0IGR1cmF0aW9uO1xuXHRsZXQgZWFzZTtcblx0bGV0IGNzc1RleHQ7XG5cblx0bGV0IGluaXRpYWxpc2VkID0gZmFsc2U7XG5cblx0cmV0dXJuIHtcblx0XHR0OiBpbnRybyA/IDAgOiAxLFxuXHRcdHJ1bm5pbmc6IGZhbHNlLFxuXHRcdHByb2dyYW06IG51bGwsXG5cdFx0cGVuZGluZzogbnVsbCxcblxuXHRcdHJ1bihiLCBjYWxsYmFjaykge1xuXHRcdFx0aWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0dHJhbnNpdGlvbk1hbmFnZXIud2FpdCgpLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdG9iaiA9IG9iaigpO1xuXHRcdFx0XHRcdHRoaXMuX3J1bihiLCBjYWxsYmFjayk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fcnVuKGIsIGNhbGxiYWNrKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0X3J1bihiLCBjYWxsYmFjaykge1xuXHRcdFx0ZHVyYXRpb24gPSBvYmouZHVyYXRpb24gfHwgMzAwO1xuXHRcdFx0ZWFzZSA9IG9iai5lYXNpbmcgfHwgbGluZWFyO1xuXG5cdFx0XHRjb25zdCBwcm9ncmFtID0ge1xuXHRcdFx0XHRzdGFydDogd2luZG93LnBlcmZvcm1hbmNlLm5vdygpICsgKG9iai5kZWxheSB8fCAwKSxcblx0XHRcdFx0Yixcblx0XHRcdFx0Y2FsbGJhY2s6IGNhbGxiYWNrIHx8IG5vb3Bcblx0XHRcdH07XG5cblx0XHRcdGlmIChpbnRybyAmJiAhaW5pdGlhbGlzZWQpIHtcblx0XHRcdFx0aWYgKG9iai5jc3MgJiYgb2JqLmRlbGF5KSB7XG5cdFx0XHRcdFx0Y3NzVGV4dCA9IG5vZGUuc3R5bGUuY3NzVGV4dDtcblx0XHRcdFx0XHRub2RlLnN0eWxlLmNzc1RleHQgKz0gb2JqLmNzcygwLCAxKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvYmoudGljaykgb2JqLnRpY2soMCwgMSk7XG5cdFx0XHRcdGluaXRpYWxpc2VkID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFiKSB7XG5cdFx0XHRcdHByb2dyYW0uZ3JvdXAgPSBvdXRyb3MuY3VycmVudDtcblx0XHRcdFx0b3V0cm9zLmN1cnJlbnQucmVtYWluaW5nICs9IDE7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvYmouZGVsYXkpIHtcblx0XHRcdFx0dGhpcy5wZW5kaW5nID0gcHJvZ3JhbTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuc3RhcnQocHJvZ3JhbSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghdGhpcy5ydW5uaW5nKSB7XG5cdFx0XHRcdHRoaXMucnVubmluZyA9IHRydWU7XG5cdFx0XHRcdHRyYW5zaXRpb25NYW5hZ2VyLmFkZCh0aGlzKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c3RhcnQocHJvZ3JhbSkge1xuXHRcdFx0Y29tcG9uZW50LmZpcmUoYCR7cHJvZ3JhbS5iID8gJ2ludHJvJyA6ICdvdXRybyd9LnN0YXJ0YCwgeyBub2RlIH0pO1xuXG5cdFx0XHRwcm9ncmFtLmEgPSB0aGlzLnQ7XG5cdFx0XHRwcm9ncmFtLmRlbHRhID0gcHJvZ3JhbS5iIC0gcHJvZ3JhbS5hO1xuXHRcdFx0cHJvZ3JhbS5kdXJhdGlvbiA9IGR1cmF0aW9uICogTWF0aC5hYnMocHJvZ3JhbS5iIC0gcHJvZ3JhbS5hKTtcblx0XHRcdHByb2dyYW0uZW5kID0gcHJvZ3JhbS5zdGFydCArIHByb2dyYW0uZHVyYXRpb247XG5cblx0XHRcdGlmIChvYmouY3NzKSB7XG5cdFx0XHRcdGlmIChvYmouZGVsYXkpIG5vZGUuc3R5bGUuY3NzVGV4dCA9IGNzc1RleHQ7XG5cblx0XHRcdFx0Y29uc3QgcnVsZSA9IGdlbmVyYXRlUnVsZShwcm9ncmFtLCBlYXNlLCBvYmouY3NzKTtcblx0XHRcdFx0dHJhbnNpdGlvbk1hbmFnZXIuYWRkUnVsZShydWxlLCBwcm9ncmFtLm5hbWUgPSAnX19zdmVsdGVfJyArIGhhc2gocnVsZSkpO1xuXG5cdFx0XHRcdG5vZGUuc3R5bGUuYW5pbWF0aW9uID0gKG5vZGUuc3R5bGUuYW5pbWF0aW9uIHx8ICcnKVxuXHRcdFx0XHRcdC5zcGxpdCgnLCAnKVxuXHRcdFx0XHRcdC5maWx0ZXIoYW5pbSA9PiBhbmltICYmIChwcm9ncmFtLmRlbHRhIDwgMCB8fCAhL19fc3ZlbHRlLy50ZXN0KGFuaW0pKSlcblx0XHRcdFx0XHQuY29uY2F0KGAke3Byb2dyYW0ubmFtZX0gJHtwcm9ncmFtLmR1cmF0aW9ufW1zIGxpbmVhciAxIGZvcndhcmRzYClcblx0XHRcdFx0XHQuam9pbignLCAnKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5wcm9ncmFtID0gcHJvZ3JhbTtcblx0XHRcdHRoaXMucGVuZGluZyA9IG51bGw7XG5cdFx0fSxcblxuXHRcdHVwZGF0ZShub3cpIHtcblx0XHRcdGNvbnN0IHByb2dyYW0gPSB0aGlzLnByb2dyYW07XG5cdFx0XHRpZiAoIXByb2dyYW0pIHJldHVybjtcblxuXHRcdFx0Y29uc3QgcCA9IG5vdyAtIHByb2dyYW0uc3RhcnQ7XG5cdFx0XHR0aGlzLnQgPSBwcm9ncmFtLmEgKyBwcm9ncmFtLmRlbHRhICogZWFzZShwIC8gcHJvZ3JhbS5kdXJhdGlvbik7XG5cdFx0XHRpZiAob2JqLnRpY2spIG9iai50aWNrKHRoaXMudCwgMSAtIHRoaXMudCk7XG5cdFx0fSxcblxuXHRcdGRvbmUoKSB7XG5cdFx0XHRjb25zdCBwcm9ncmFtID0gdGhpcy5wcm9ncmFtO1xuXHRcdFx0dGhpcy50ID0gcHJvZ3JhbS5iO1xuXG5cdFx0XHRpZiAob2JqLnRpY2spIG9iai50aWNrKHRoaXMudCwgMSAtIHRoaXMudCk7XG5cblx0XHRcdGNvbXBvbmVudC5maXJlKGAke3Byb2dyYW0uYiA/ICdpbnRybycgOiAnb3V0cm8nfS5lbmRgLCB7IG5vZGUgfSk7XG5cblx0XHRcdGlmICghcHJvZ3JhbS5iICYmICFwcm9ncmFtLmludmFsaWRhdGVkKSB7XG5cdFx0XHRcdHByb2dyYW0uZ3JvdXAuY2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuXHRcdFx0XHRcdHByb2dyYW0uY2FsbGJhY2soKTtcblx0XHRcdFx0XHRpZiAob2JqLmNzcykgdHJhbnNpdGlvbk1hbmFnZXIuZGVsZXRlUnVsZShub2RlLCBwcm9ncmFtLm5hbWUpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAoLS1wcm9ncmFtLmdyb3VwLnJlbWFpbmluZyA9PT0gMCkge1xuXHRcdFx0XHRcdHByb2dyYW0uZ3JvdXAuY2FsbGJhY2tzLmZvckVhY2gocnVuKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKG9iai5jc3MpIHRyYW5zaXRpb25NYW5hZ2VyLmRlbGV0ZVJ1bGUobm9kZSwgcHJvZ3JhbS5uYW1lKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5ydW5uaW5nID0gISF0aGlzLnBlbmRpbmc7XG5cdFx0fSxcblxuXHRcdGFib3J0KHJlc2V0KSB7XG5cdFx0XHRpZiAodGhpcy5wcm9ncmFtKSB7XG5cdFx0XHRcdGlmIChyZXNldCAmJiBvYmoudGljaykgb2JqLnRpY2soMSwgMCk7XG5cdFx0XHRcdGlmIChvYmouY3NzKSB0cmFuc2l0aW9uTWFuYWdlci5kZWxldGVSdWxlKG5vZGUsIHRoaXMucHJvZ3JhbS5uYW1lKTtcblx0XHRcdFx0dGhpcy5wcm9ncmFtID0gdGhpcy5wZW5kaW5nID0gbnVsbDtcblx0XHRcdFx0dGhpcy5ydW5uaW5nID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGludmFsaWRhdGUoKSB7XG5cdFx0XHRpZiAodGhpcy5wcm9ncmFtKSB7XG5cdFx0XHRcdHRoaXMucHJvZ3JhbS5pbnZhbGlkYXRlZCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5sZXQgb3V0cm9zID0ge307XG5cbmZ1bmN0aW9uIGdyb3VwT3V0cm9zKCkge1xuXHRvdXRyb3MuY3VycmVudCA9IHtcblx0XHRyZW1haW5pbmc6IDAsXG5cdFx0Y2FsbGJhY2tzOiBbXVxuXHR9O1xufVxuXG52YXIgdHJhbnNpdGlvbk1hbmFnZXIgPSB7XG5cdHJ1bm5pbmc6IGZhbHNlLFxuXHR0cmFuc2l0aW9uczogW10sXG5cdGJvdW5kOiBudWxsLFxuXHRzdHlsZXNoZWV0OiBudWxsLFxuXHRhY3RpdmVSdWxlczoge30sXG5cdHByb21pc2U6IG51bGwsXG5cblx0YWRkKHRyYW5zaXRpb24pIHtcblx0XHR0aGlzLnRyYW5zaXRpb25zLnB1c2godHJhbnNpdGlvbik7XG5cblx0XHRpZiAoIXRoaXMucnVubmluZykge1xuXHRcdFx0dGhpcy5ydW5uaW5nID0gdHJ1ZTtcblx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmJvdW5kIHx8ICh0aGlzLmJvdW5kID0gdGhpcy5uZXh0LmJpbmQodGhpcykpKTtcblx0XHR9XG5cdH0sXG5cblx0YWRkUnVsZShydWxlLCBuYW1lKSB7XG5cdFx0aWYgKCF0aGlzLnN0eWxlc2hlZXQpIHtcblx0XHRcdGNvbnN0IHN0eWxlID0gY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcblx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXHRcdFx0dHJhbnNpdGlvbk1hbmFnZXIuc3R5bGVzaGVldCA9IHN0eWxlLnNoZWV0O1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5hY3RpdmVSdWxlc1tuYW1lXSkge1xuXHRcdFx0dGhpcy5hY3RpdmVSdWxlc1tuYW1lXSA9IHRydWU7XG5cdFx0XHR0aGlzLnN0eWxlc2hlZXQuaW5zZXJ0UnVsZShgQGtleWZyYW1lcyAke25hbWV9ICR7cnVsZX1gLCB0aGlzLnN0eWxlc2hlZXQuY3NzUnVsZXMubGVuZ3RoKTtcblx0XHR9XG5cdH0sXG5cblx0bmV4dCgpIHtcblx0XHR0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcblxuXHRcdGNvbnN0IG5vdyA9IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTtcblx0XHRsZXQgaSA9IHRoaXMudHJhbnNpdGlvbnMubGVuZ3RoO1xuXG5cdFx0d2hpbGUgKGktLSkge1xuXHRcdFx0Y29uc3QgdHJhbnNpdGlvbiA9IHRoaXMudHJhbnNpdGlvbnNbaV07XG5cblx0XHRcdGlmICh0cmFuc2l0aW9uLnByb2dyYW0gJiYgbm93ID49IHRyYW5zaXRpb24ucHJvZ3JhbS5lbmQpIHtcblx0XHRcdFx0dHJhbnNpdGlvbi5kb25lKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0cmFuc2l0aW9uLnBlbmRpbmcgJiYgbm93ID49IHRyYW5zaXRpb24ucGVuZGluZy5zdGFydCkge1xuXHRcdFx0XHR0cmFuc2l0aW9uLnN0YXJ0KHRyYW5zaXRpb24ucGVuZGluZyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0cmFuc2l0aW9uLnJ1bm5pbmcpIHtcblx0XHRcdFx0dHJhbnNpdGlvbi51cGRhdGUobm93KTtcblx0XHRcdFx0dGhpcy5ydW5uaW5nID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAoIXRyYW5zaXRpb24ucGVuZGluZykge1xuXHRcdFx0XHR0aGlzLnRyYW5zaXRpb25zLnNwbGljZShpLCAxKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5ydW5uaW5nKSB7XG5cdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5ib3VuZCk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLnN0eWxlc2hlZXQpIHtcblx0XHRcdGxldCBpID0gdGhpcy5zdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aDtcblx0XHRcdHdoaWxlIChpLS0pIHRoaXMuc3R5bGVzaGVldC5kZWxldGVSdWxlKGkpO1xuXHRcdFx0dGhpcy5hY3RpdmVSdWxlcyA9IHt9O1xuXHRcdH1cblx0fSxcblxuXHRkZWxldGVSdWxlKG5vZGUsIG5hbWUpIHtcblx0XHRub2RlLnN0eWxlLmFuaW1hdGlvbiA9IG5vZGUuc3R5bGUuYW5pbWF0aW9uXG5cdFx0XHQuc3BsaXQoJywgJylcblx0XHRcdC5maWx0ZXIoYW5pbSA9PiBhbmltICYmIGFuaW0uaW5kZXhPZihuYW1lKSA9PT0gLTEpXG5cdFx0XHQuam9pbignLCAnKTtcblx0fSxcblxuXHR3YWl0KCkge1xuXHRcdGlmICghdHJhbnNpdGlvbk1hbmFnZXIucHJvbWlzZSkge1xuXHRcdFx0dHJhbnNpdGlvbk1hbmFnZXIucHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0dHJhbnNpdGlvbk1hbmFnZXIucHJvbWlzZS50aGVuKCgpID0+IHtcblx0XHRcdFx0dHJhbnNpdGlvbk1hbmFnZXIucHJvbWlzZSA9IG51bGw7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJhbnNpdGlvbk1hbmFnZXIucHJvbWlzZTtcblx0fVxufTtcblxuZnVuY3Rpb24gd3JhcEFuaW1hdGlvbihub2RlLCBmcm9tLCBmbiwgcGFyYW1zKSB7XG5cdGlmICghZnJvbSkgcmV0dXJuO1xuXG5cdGNvbnN0IHRvID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0aWYgKGZyb20ubGVmdCA9PT0gdG8ubGVmdCAmJiBmcm9tLnJpZ2h0ID09PSB0by5yaWdodCAmJiBmcm9tLnRvcCA9PT0gdG8udG9wICYmIGZyb20uYm90dG9tID09PSB0by5ib3R0b20pIHJldHVybjtcblxuXHRjb25zdCBpbmZvID0gZm4obm9kZSwgeyBmcm9tLCB0byB9LCBwYXJhbXMpO1xuXG5cdGNvbnN0IGR1cmF0aW9uID0gJ2R1cmF0aW9uJyBpbiBpbmZvID8gaW5mby5kdXJhdGlvbiA6IDMwMDtcblx0Y29uc3QgZGVsYXkgPSAnZGVsYXknIGluIGluZm8gPyBpbmZvLmRlbGF5IDogMDtcblx0Y29uc3QgZWFzZSA9IGluZm8uZWFzaW5nIHx8IGxpbmVhcjtcblx0Y29uc3Qgc3RhcnQgPSB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCkgKyBkZWxheTtcblx0Y29uc3QgZW5kID0gc3RhcnQgKyBkdXJhdGlvbjtcblxuXHRjb25zdCBwcm9ncmFtID0ge1xuXHRcdGE6IDAsXG5cdFx0dDogMCxcblx0XHRiOiAxLFxuXHRcdGRlbHRhOiAxLFxuXHRcdGR1cmF0aW9uLFxuXHRcdHN0YXJ0LFxuXHRcdGVuZFxuXHR9O1xuXG5cdGNvbnN0IGNzc1RleHQgPSBub2RlLnN0eWxlLmNzc1RleHQ7XG5cblx0Y29uc3QgYW5pbWF0aW9uID0ge1xuXHRcdHBlbmRpbmc6IGRlbGF5ID8gcHJvZ3JhbSA6IG51bGwsXG5cdFx0cHJvZ3JhbTogZGVsYXkgPyBudWxsIDogcHJvZ3JhbSxcblx0XHRydW5uaW5nOiB0cnVlLFxuXG5cdFx0c3RhcnQoKSB7XG5cdFx0XHRpZiAoaW5mby5jc3MpIHtcblx0XHRcdFx0aWYgKGRlbGF5KSBub2RlLnN0eWxlLmNzc1RleHQgPSBjc3NUZXh0O1xuXG5cdFx0XHRcdGNvbnN0IHJ1bGUgPSBnZW5lcmF0ZVJ1bGUocHJvZ3JhbSwgZWFzZSwgaW5mby5jc3MpO1xuXHRcdFx0XHRwcm9ncmFtLm5hbWUgPSBgX19zdmVsdGVfJHtoYXNoKHJ1bGUpfWA7XG5cblx0XHRcdFx0dHJhbnNpdGlvbk1hbmFnZXIuYWRkUnVsZShydWxlLCBwcm9ncmFtLm5hbWUpO1xuXG5cdFx0XHRcdG5vZGUuc3R5bGUuYW5pbWF0aW9uID0gKG5vZGUuc3R5bGUuYW5pbWF0aW9uIHx8ICcnKVxuXHRcdFx0XHRcdC5zcGxpdCgnLCAnKVxuXHRcdFx0XHRcdC5maWx0ZXIoYW5pbSA9PiBhbmltICYmIChwcm9ncmFtLmRlbHRhIDwgMCB8fCAhL19fc3ZlbHRlLy50ZXN0KGFuaW0pKSlcblx0XHRcdFx0XHQuY29uY2F0KGAke3Byb2dyYW0ubmFtZX0gJHtwcm9ncmFtLmR1cmF0aW9ufW1zIGxpbmVhciAxIGZvcndhcmRzYClcblx0XHRcdFx0XHQuam9pbignLCAnKTtcblx0XHRcdH1cblxuXHRcdFx0YW5pbWF0aW9uLnByb2dyYW0gPSBwcm9ncmFtO1xuXHRcdFx0YW5pbWF0aW9uLnBlbmRpbmcgPSBudWxsO1xuXHRcdH0sXG5cblx0XHR1cGRhdGU6IG5vdyA9PiB7XG5cdFx0XHRjb25zdCBwID0gbm93IC0gcHJvZ3JhbS5zdGFydDtcblx0XHRcdGNvbnN0IHQgPSBwcm9ncmFtLmEgKyBwcm9ncmFtLmRlbHRhICogZWFzZShwIC8gcHJvZ3JhbS5kdXJhdGlvbik7XG5cdFx0XHRpZiAoaW5mby50aWNrKSBpbmZvLnRpY2sodCwgMSAtIHQpO1xuXHRcdH0sXG5cblx0XHRkb25lKCkge1xuXHRcdFx0aWYgKGluZm8udGljaykgaW5mby50aWNrKDEsIDApO1xuXHRcdFx0YW5pbWF0aW9uLnN0b3AoKTtcblx0XHR9LFxuXG5cdFx0c3RvcCgpIHtcblx0XHRcdGlmIChpbmZvLmNzcykgdHJhbnNpdGlvbk1hbmFnZXIuZGVsZXRlUnVsZShub2RlLCBwcm9ncmFtLm5hbWUpO1xuXHRcdFx0YW5pbWF0aW9uLnJ1bm5pbmcgPSBmYWxzZTtcblx0XHR9XG5cdH07XG5cblx0dHJhbnNpdGlvbk1hbmFnZXIuYWRkKGFuaW1hdGlvbik7XG5cblx0aWYgKGluZm8udGljaykgaW5mby50aWNrKDAsIDEpO1xuXG5cdGlmIChkZWxheSkge1xuXHRcdGlmIChpbmZvLmNzcykgbm9kZS5zdHlsZS5jc3NUZXh0ICs9IGluZm8uY3NzKDAsIDEpO1xuXHR9IGVsc2Uge1xuXHRcdGFuaW1hdGlvbi5zdGFydCgpO1xuXHR9XG5cblx0cmV0dXJuIGFuaW1hdGlvbjtcbn1cblxuZnVuY3Rpb24gZml4UG9zaXRpb24obm9kZSkge1xuXHRjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG5cblx0aWYgKHN0eWxlLnBvc2l0aW9uICE9PSAnYWJzb2x1dGUnICYmIHN0eWxlLnBvc2l0aW9uICE9PSAnZml4ZWQnKSB7XG5cdFx0Y29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBzdHlsZTtcblx0XHRjb25zdCBhID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRub2RlLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblx0XHRub2RlLnN0eWxlLndpZHRoID0gd2lkdGg7XG5cdFx0bm9kZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQ7XG5cdFx0Y29uc3QgYiA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHRpZiAoYS5sZWZ0ICE9PSBiLmxlZnQgfHwgYS50b3AgIT09IGIudG9wKSB7XG5cdFx0XHRjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG5cdFx0XHRjb25zdCB0cmFuc2Zvcm0gPSBzdHlsZS50cmFuc2Zvcm0gPT09ICdub25lJyA/ICcnIDogc3R5bGUudHJhbnNmb3JtO1xuXG5cdFx0XHRub2RlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RyYW5zZm9ybX0gdHJhbnNsYXRlKCR7YS5sZWZ0IC0gYi5sZWZ0fXB4LCAke2EudG9wIC0gYi50b3B9cHgpYDtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlUHJvbWlzZShwcm9taXNlLCBpbmZvKSB7XG5cdHZhciB0b2tlbiA9IGluZm8udG9rZW4gPSB7fTtcblxuXHRmdW5jdGlvbiB1cGRhdGUodHlwZSwgaW5kZXgsIGtleSwgdmFsdWUpIHtcblx0XHRpZiAoaW5mby50b2tlbiAhPT0gdG9rZW4pIHJldHVybjtcblxuXHRcdGluZm8ucmVzb2x2ZWQgPSBrZXkgJiYgeyBba2V5XTogdmFsdWUgfTtcblxuXHRcdGNvbnN0IGNoaWxkX2N0eCA9IGFzc2lnbihhc3NpZ24oe30sIGluZm8uY3R4KSwgaW5mby5yZXNvbHZlZCk7XG5cdFx0Y29uc3QgYmxvY2sgPSB0eXBlICYmIChpbmZvLmN1cnJlbnQgPSB0eXBlKShpbmZvLmNvbXBvbmVudCwgY2hpbGRfY3R4KTtcblxuXHRcdGlmIChpbmZvLmJsb2NrKSB7XG5cdFx0XHRpZiAoaW5mby5ibG9ja3MpIHtcblx0XHRcdFx0aW5mby5ibG9ja3MuZm9yRWFjaCgoYmxvY2ssIGkpID0+IHtcblx0XHRcdFx0XHRpZiAoaSAhPT0gaW5kZXggJiYgYmxvY2spIHtcblx0XHRcdFx0XHRcdGdyb3VwT3V0cm9zKCk7XG5cdFx0XHRcdFx0XHRibG9jay5vKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0YmxvY2suZCgxKTtcblx0XHRcdFx0XHRcdFx0aW5mby5ibG9ja3NbaV0gPSBudWxsO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGluZm8uYmxvY2suZCgxKTtcblx0XHRcdH1cblxuXHRcdFx0YmxvY2suYygpO1xuXHRcdFx0YmxvY2tbYmxvY2suaSA/ICdpJyA6ICdtJ10oaW5mby5tb3VudCgpLCBpbmZvLmFuY2hvcik7XG5cblx0XHRcdGluZm8uY29tcG9uZW50LnJvb3Quc2V0KHt9KTsgLy8gZmx1c2ggYW55IGhhbmRsZXJzIHRoYXQgd2VyZSBjcmVhdGVkXG5cdFx0fVxuXG5cdFx0aW5mby5ibG9jayA9IGJsb2NrO1xuXHRcdGlmIChpbmZvLmJsb2NrcykgaW5mby5ibG9ja3NbaW5kZXhdID0gYmxvY2s7XG5cdH1cblxuXHRpZiAoaXNQcm9taXNlKHByb21pc2UpKSB7XG5cdFx0cHJvbWlzZS50aGVuKHZhbHVlID0+IHtcblx0XHRcdHVwZGF0ZShpbmZvLnRoZW4sIDEsIGluZm8udmFsdWUsIHZhbHVlKTtcblx0XHR9LCBlcnJvciA9PiB7XG5cdFx0XHR1cGRhdGUoaW5mby5jYXRjaCwgMiwgaW5mby5lcnJvciwgZXJyb3IpO1xuXHRcdH0pO1xuXG5cdFx0Ly8gaWYgd2UgcHJldmlvdXNseSBoYWQgYSB0aGVuL2NhdGNoIGJsb2NrLCBkZXN0cm95IGl0XG5cdFx0aWYgKGluZm8uY3VycmVudCAhPT0gaW5mby5wZW5kaW5nKSB7XG5cdFx0XHR1cGRhdGUoaW5mby5wZW5kaW5nLCAwKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRpZiAoaW5mby5jdXJyZW50ICE9PSBpbmZvLnRoZW4pIHtcblx0XHRcdHVwZGF0ZShpbmZvLnRoZW4sIDEsIGluZm8udmFsdWUsIHByb21pc2UpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aW5mby5yZXNvbHZlZCA9IHsgW2luZm8udmFsdWVdOiBwcm9taXNlIH07XG5cdH1cbn1cblxuZnVuY3Rpb24gZGVzdHJveUJsb2NrKGJsb2NrLCBsb29rdXApIHtcblx0YmxvY2suZCgxKTtcblx0bG9va3VwW2Jsb2NrLmtleV0gPSBudWxsO1xufVxuXG5mdW5jdGlvbiBvdXRyb0FuZERlc3Ryb3lCbG9jayhibG9jaywgbG9va3VwKSB7XG5cdGJsb2NrLm8oZnVuY3Rpb24oKSB7XG5cdFx0ZGVzdHJveUJsb2NrKGJsb2NrLCBsb29rdXApO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gZml4QW5kT3V0cm9BbmREZXN0cm95QmxvY2soYmxvY2ssIGxvb2t1cCkge1xuXHRibG9jay5mKCk7XG5cdG91dHJvQW5kRGVzdHJveUJsb2NrKGJsb2NrLCBsb29rdXApO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVLZXllZEVhY2gob2xkX2Jsb2NrcywgY29tcG9uZW50LCBjaGFuZ2VkLCBnZXRfa2V5LCBkeW5hbWljLCBjdHgsIGxpc3QsIGxvb2t1cCwgbm9kZSwgZGVzdHJveSwgY3JlYXRlX2VhY2hfYmxvY2ssIGludHJvX21ldGhvZCwgbmV4dCwgZ2V0X2NvbnRleHQpIHtcblx0dmFyIG8gPSBvbGRfYmxvY2tzLmxlbmd0aDtcblx0dmFyIG4gPSBsaXN0Lmxlbmd0aDtcblxuXHR2YXIgaSA9IG87XG5cdHZhciBvbGRfaW5kZXhlcyA9IHt9O1xuXHR3aGlsZSAoaS0tKSBvbGRfaW5kZXhlc1tvbGRfYmxvY2tzW2ldLmtleV0gPSBpO1xuXG5cdHZhciBuZXdfYmxvY2tzID0gW107XG5cdHZhciBuZXdfbG9va3VwID0ge307XG5cdHZhciBkZWx0YXMgPSB7fTtcblxuXHR2YXIgaSA9IG47XG5cdHdoaWxlIChpLS0pIHtcblx0XHR2YXIgY2hpbGRfY3R4ID0gZ2V0X2NvbnRleHQoY3R4LCBsaXN0LCBpKTtcblx0XHR2YXIga2V5ID0gZ2V0X2tleShjaGlsZF9jdHgpO1xuXHRcdHZhciBibG9jayA9IGxvb2t1cFtrZXldO1xuXG5cdFx0aWYgKCFibG9jaykge1xuXHRcdFx0YmxvY2sgPSBjcmVhdGVfZWFjaF9ibG9jayhjb21wb25lbnQsIGtleSwgY2hpbGRfY3R4KTtcblx0XHRcdGJsb2NrLmMoKTtcblx0XHR9IGVsc2UgaWYgKGR5bmFtaWMpIHtcblx0XHRcdGJsb2NrLnAoY2hhbmdlZCwgY2hpbGRfY3R4KTtcblx0XHR9XG5cblx0XHRuZXdfYmxvY2tzW2ldID0gbmV3X2xvb2t1cFtrZXldID0gYmxvY2s7XG5cblx0XHRpZiAoa2V5IGluIG9sZF9pbmRleGVzKSBkZWx0YXNba2V5XSA9IE1hdGguYWJzKGkgLSBvbGRfaW5kZXhlc1trZXldKTtcblx0fVxuXG5cdHZhciB3aWxsX21vdmUgPSB7fTtcblx0dmFyIGRpZF9tb3ZlID0ge307XG5cblx0ZnVuY3Rpb24gaW5zZXJ0KGJsb2NrKSB7XG5cdFx0YmxvY2tbaW50cm9fbWV0aG9kXShub2RlLCBuZXh0KTtcblx0XHRsb29rdXBbYmxvY2sua2V5XSA9IGJsb2NrO1xuXHRcdG5leHQgPSBibG9jay5maXJzdDtcblx0XHRuLS07XG5cdH1cblxuXHR3aGlsZSAobyAmJiBuKSB7XG5cdFx0dmFyIG5ld19ibG9jayA9IG5ld19ibG9ja3NbbiAtIDFdO1xuXHRcdHZhciBvbGRfYmxvY2sgPSBvbGRfYmxvY2tzW28gLSAxXTtcblx0XHR2YXIgbmV3X2tleSA9IG5ld19ibG9jay5rZXk7XG5cdFx0dmFyIG9sZF9rZXkgPSBvbGRfYmxvY2sua2V5O1xuXG5cdFx0aWYgKG5ld19ibG9jayA9PT0gb2xkX2Jsb2NrKSB7XG5cdFx0XHQvLyBkbyBub3RoaW5nXG5cdFx0XHRuZXh0ID0gbmV3X2Jsb2NrLmZpcnN0O1xuXHRcdFx0by0tO1xuXHRcdFx0bi0tO1xuXHRcdH1cblxuXHRcdGVsc2UgaWYgKCFuZXdfbG9va3VwW29sZF9rZXldKSB7XG5cdFx0XHQvLyByZW1vdmUgb2xkIGJsb2NrXG5cdFx0XHRkZXN0cm95KG9sZF9ibG9jaywgbG9va3VwKTtcblx0XHRcdG8tLTtcblx0XHR9XG5cblx0XHRlbHNlIGlmICghbG9va3VwW25ld19rZXldIHx8IHdpbGxfbW92ZVtuZXdfa2V5XSkge1xuXHRcdFx0aW5zZXJ0KG5ld19ibG9jayk7XG5cdFx0fVxuXG5cdFx0ZWxzZSBpZiAoZGlkX21vdmVbb2xkX2tleV0pIHtcblx0XHRcdG8tLTtcblxuXHRcdH0gZWxzZSBpZiAoZGVsdGFzW25ld19rZXldID4gZGVsdGFzW29sZF9rZXldKSB7XG5cdFx0XHRkaWRfbW92ZVtuZXdfa2V5XSA9IHRydWU7XG5cdFx0XHRpbnNlcnQobmV3X2Jsb2NrKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHR3aWxsX21vdmVbb2xkX2tleV0gPSB0cnVlO1xuXHRcdFx0by0tO1xuXHRcdH1cblx0fVxuXG5cdHdoaWxlIChvLS0pIHtcblx0XHR2YXIgb2xkX2Jsb2NrID0gb2xkX2Jsb2Nrc1tvXTtcblx0XHRpZiAoIW5ld19sb29rdXBbb2xkX2Jsb2NrLmtleV0pIGRlc3Ryb3kob2xkX2Jsb2NrLCBsb29rdXApO1xuXHR9XG5cblx0d2hpbGUgKG4pIGluc2VydChuZXdfYmxvY2tzW24gLSAxXSk7XG5cblx0cmV0dXJuIG5ld19ibG9ja3M7XG59XG5cbmZ1bmN0aW9uIG1lYXN1cmUoYmxvY2tzKSB7XG5cdGNvbnN0IHJlY3RzID0ge307XG5cdGxldCBpID0gYmxvY2tzLmxlbmd0aDtcblx0d2hpbGUgKGktLSkgcmVjdHNbYmxvY2tzW2ldLmtleV0gPSBibG9ja3NbaV0ubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0cmV0dXJuIHJlY3RzO1xufVxuXG5mdW5jdGlvbiBhbmltYXRlKGJsb2NrcywgcmVjdHMsIGZuLCBwYXJhbXMpIHtcblx0bGV0IGkgPSBibG9ja3MubGVuZ3RoO1xuXHR3aGlsZSAoaS0tKSB7XG5cdFx0Y29uc3QgYmxvY2sgPSBibG9ja3NbaV07XG5cdFx0Y29uc3QgZnJvbSA9IHJlY3RzW2Jsb2NrLmtleV07XG5cblx0XHRpZiAoIWZyb20pIGNvbnRpbnVlO1xuXHRcdGNvbnN0IHRvID0gYmxvY2subm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdGlmIChmcm9tLmxlZnQgPT09IHRvLmxlZnQgJiYgZnJvbS5yaWdodCA9PT0gdG8ucmlnaHQgJiYgZnJvbS50b3AgPT09IHRvLnRvcCAmJiBmcm9tLmJvdHRvbSA9PT0gdG8uYm90dG9tKSBjb250aW51ZTtcblxuXG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0U3ByZWFkVXBkYXRlKGxldmVscywgdXBkYXRlcykge1xuXHR2YXIgdXBkYXRlID0ge307XG5cblx0dmFyIHRvX251bGxfb3V0ID0ge307XG5cdHZhciBhY2NvdW50ZWRfZm9yID0ge307XG5cblx0dmFyIGkgPSBsZXZlbHMubGVuZ3RoO1xuXHR3aGlsZSAoaS0tKSB7XG5cdFx0dmFyIG8gPSBsZXZlbHNbaV07XG5cdFx0dmFyIG4gPSB1cGRhdGVzW2ldO1xuXG5cdFx0aWYgKG4pIHtcblx0XHRcdGZvciAodmFyIGtleSBpbiBvKSB7XG5cdFx0XHRcdGlmICghKGtleSBpbiBuKSkgdG9fbnVsbF9vdXRba2V5XSA9IDE7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAodmFyIGtleSBpbiBuKSB7XG5cdFx0XHRcdGlmICghYWNjb3VudGVkX2ZvcltrZXldKSB7XG5cdFx0XHRcdFx0dXBkYXRlW2tleV0gPSBuW2tleV07XG5cdFx0XHRcdFx0YWNjb3VudGVkX2ZvcltrZXldID0gMTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRsZXZlbHNbaV0gPSBuO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKHZhciBrZXkgaW4gbykge1xuXHRcdFx0XHRhY2NvdW50ZWRfZm9yW2tleV0gPSAxO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZvciAodmFyIGtleSBpbiB0b19udWxsX291dCkge1xuXHRcdGlmICghKGtleSBpbiB1cGRhdGUpKSB1cGRhdGVba2V5XSA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdHJldHVybiB1cGRhdGU7XG59XG5cbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2F0dHJpYnV0ZXMtMlxuLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI25vbmNoYXJhY3RlclxuY29uc3QgaW52YWxpZEF0dHJpYnV0ZU5hbWVDaGFyYWN0ZXIgPSAvW1xccydcIj5cXC89XFx1e0ZERDB9LVxcdXtGREVGfVxcdXtGRkZFfVxcdXtGRkZGfVxcdXsxRkZGRX1cXHV7MUZGRkZ9XFx1ezJGRkZFfVxcdXsyRkZGRn1cXHV7M0ZGRkV9XFx1ezNGRkZGfVxcdXs0RkZGRX1cXHV7NEZGRkZ9XFx1ezVGRkZFfVxcdXs1RkZGRn1cXHV7NkZGRkV9XFx1ezZGRkZGfVxcdXs3RkZGRX1cXHV7N0ZGRkZ9XFx1ezhGRkZFfVxcdXs4RkZGRn1cXHV7OUZGRkV9XFx1ezlGRkZGfVxcdXtBRkZGRX1cXHV7QUZGRkZ9XFx1e0JGRkZFfVxcdXtCRkZGRn1cXHV7Q0ZGRkV9XFx1e0NGRkZGfVxcdXtERkZGRX1cXHV7REZGRkZ9XFx1e0VGRkZFfVxcdXtFRkZGRn1cXHV7RkZGRkV9XFx1e0ZGRkZGfVxcdXsxMEZGRkV9XFx1ezEwRkZGRn1dL3U7XG5cbmZ1bmN0aW9uIHNwcmVhZChhcmdzKSB7XG5cdGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5hcmdzKTtcblx0bGV0IHN0ciA9ICcnO1xuXG5cdE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2gobmFtZSA9PiB7XG5cdFx0aWYgKGludmFsaWRBdHRyaWJ1dGVOYW1lQ2hhcmFjdGVyLnRlc3QobmFtZSkpIHJldHVybjtcblxuXHRcdGNvbnN0IHZhbHVlID0gYXR0cmlidXRlc1tuYW1lXTtcblx0XHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXHRcdGlmICh2YWx1ZSA9PT0gdHJ1ZSkgc3RyICs9IFwiIFwiICsgbmFtZTtcblxuXHRcdGNvbnN0IGVzY2FwZWQgPSBTdHJpbmcodmFsdWUpXG5cdFx0XHQucmVwbGFjZSgvXCIvZywgJyYjMzQ7Jylcblx0XHRcdC5yZXBsYWNlKC8nL2csICcmIzM5OycpO1xuXG5cdFx0c3RyICs9IFwiIFwiICsgbmFtZSArIFwiPVwiICsgSlNPTi5zdHJpbmdpZnkoZXNjYXBlZCk7XG5cdH0pO1xuXG5cdHJldHVybiBzdHI7XG59XG5cbmNvbnN0IGVzY2FwZWQgPSB7XG5cdCdcIic6ICcmcXVvdDsnLFxuXHRcIidcIjogJyYjMzk7Jyxcblx0JyYnOiAnJmFtcDsnLFxuXHQnPCc6ICcmbHQ7Jyxcblx0Jz4nOiAnJmd0Oydcbn07XG5cbmZ1bmN0aW9uIGVzY2FwZShodG1sKSB7XG5cdHJldHVybiBTdHJpbmcoaHRtbCkucmVwbGFjZSgvW1wiJyY8Pl0vZywgbWF0Y2ggPT4gZXNjYXBlZFttYXRjaF0pO1xufVxuXG5mdW5jdGlvbiBlYWNoKGl0ZW1zLCBhc3NpZ24sIGZuKSB7XG5cdGxldCBzdHIgPSAnJztcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdHN0ciArPSBmbihhc3NpZ24oaXRlbXNbaV0sIGkpKTtcblx0fVxuXHRyZXR1cm4gc3RyO1xufVxuXG5jb25zdCBtaXNzaW5nQ29tcG9uZW50ID0ge1xuXHRfcmVuZGVyOiAoKSA9PiAnJ1xufTtcblxuZnVuY3Rpb24gdmFsaWRhdGVTc3JDb21wb25lbnQoY29tcG9uZW50LCBuYW1lKSB7XG5cdGlmICghY29tcG9uZW50IHx8ICFjb21wb25lbnQuX3JlbmRlcikge1xuXHRcdGlmIChuYW1lID09PSAnc3ZlbHRlOmNvbXBvbmVudCcpIG5hbWUgKz0gJyB0aGlzPXsuLi59Jztcblx0XHR0aHJvdyBuZXcgRXJyb3IoYDwke25hbWV9PiBpcyBub3QgYSB2YWxpZCBTU1IgY29tcG9uZW50LiBZb3UgbWF5IG5lZWQgdG8gcmV2aWV3IHlvdXIgYnVpbGQgY29uZmlnIHRvIGVuc3VyZSB0aGF0IGRlcGVuZGVuY2llcyBhcmUgY29tcGlsZWQsIHJhdGhlciB0aGFuIGltcG9ydGVkIGFzIHByZS1jb21waWxlZCBtb2R1bGVzYCk7XG5cdH1cblxuXHRyZXR1cm4gY29tcG9uZW50O1xufVxuXG5mdW5jdGlvbiBkZWJ1ZyhmaWxlLCBsaW5lLCBjb2x1bW4sIHZhbHVlcykge1xuXHRjb25zb2xlLmxvZyhge0BkZWJ1Z30gJHtmaWxlID8gZmlsZSArICcgJyA6ICcnfSgke2xpbmV9OiR7Y29sdW1ufSlgKTtcblx0Y29uc29sZS5sb2codmFsdWVzKTtcblx0cmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBibGFua09iamVjdCgpIHtcblx0cmV0dXJuIE9iamVjdC5jcmVhdGUobnVsbCk7XG59XG5cbmZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoKSB7XG5cdHRoaXMuZGVzdHJveSA9IG5vb3A7XG5cdHRoaXMuZmlyZSgnZGVzdHJveScpO1xuXHR0aGlzLnNldCA9IG5vb3A7XG5cblx0dGhpcy5fZnJhZ21lbnQuZChkZXRhY2ggIT09IGZhbHNlKTtcblx0dGhpcy5fZnJhZ21lbnQgPSBudWxsO1xuXHR0aGlzLl9zdGF0ZSA9IHt9O1xufVxuXG5mdW5jdGlvbiBkZXN0cm95RGV2KGRldGFjaCkge1xuXHRkZXN0cm95LmNhbGwodGhpcywgZGV0YWNoKTtcblx0dGhpcy5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG5cdFx0Y29uc29sZS53YXJuKCdDb21wb25lbnQgd2FzIGFscmVhZHkgZGVzdHJveWVkJyk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIF9kaWZmZXJzKGEsIGIpIHtcblx0cmV0dXJuIGEgIT0gYSA/IGIgPT0gYiA6IGEgIT09IGIgfHwgKChhICYmIHR5cGVvZiBhID09PSAnb2JqZWN0JykgfHwgdHlwZW9mIGEgPT09ICdmdW5jdGlvbicpO1xufVxuXG5mdW5jdGlvbiBfZGlmZmVyc0ltbXV0YWJsZShhLCBiKSB7XG5cdHJldHVybiBhICE9IGEgPyBiID09IGIgOiBhICE9PSBiO1xufVxuXG5mdW5jdGlvbiBmaXJlKGV2ZW50TmFtZSwgZGF0YSkge1xuXHR2YXIgaGFuZGxlcnMgPVxuXHRcdGV2ZW50TmFtZSBpbiB0aGlzLl9oYW5kbGVycyAmJiB0aGlzLl9oYW5kbGVyc1tldmVudE5hbWVdLnNsaWNlKCk7XG5cdGlmICghaGFuZGxlcnMpIHJldHVybjtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0dmFyIGhhbmRsZXIgPSBoYW5kbGVyc1tpXTtcblxuXHRcdGlmICghaGFuZGxlci5fX2NhbGxpbmcpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGhhbmRsZXIuX19jYWxsaW5nID0gdHJ1ZTtcblx0XHRcdFx0aGFuZGxlci5jYWxsKHRoaXMsIGRhdGEpO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0aGFuZGxlci5fX2NhbGxpbmcgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZmx1c2goY29tcG9uZW50KSB7XG5cdGNvbXBvbmVudC5fbG9jayA9IHRydWU7XG5cdGNhbGxBbGwoY29tcG9uZW50Ll9iZWZvcmVjcmVhdGUpO1xuXHRjYWxsQWxsKGNvbXBvbmVudC5fb25jcmVhdGUpO1xuXHRjYWxsQWxsKGNvbXBvbmVudC5fYWZ0ZXJjcmVhdGUpO1xuXHRjb21wb25lbnQuX2xvY2sgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0KCkge1xuXHRyZXR1cm4gdGhpcy5fc3RhdGU7XG59XG5cbmZ1bmN0aW9uIGluaXQoY29tcG9uZW50LCBvcHRpb25zKSB7XG5cdGNvbXBvbmVudC5faGFuZGxlcnMgPSBibGFua09iamVjdCgpO1xuXHRjb21wb25lbnQuX3Nsb3RzID0gYmxhbmtPYmplY3QoKTtcblx0Y29tcG9uZW50Ll9iaW5kID0gb3B0aW9ucy5fYmluZDtcblx0Y29tcG9uZW50Ll9zdGFnZWQgPSB7fTtcblxuXHRjb21wb25lbnQub3B0aW9ucyA9IG9wdGlvbnM7XG5cdGNvbXBvbmVudC5yb290ID0gb3B0aW9ucy5yb290IHx8IGNvbXBvbmVudDtcblx0Y29tcG9uZW50LnN0b3JlID0gb3B0aW9ucy5zdG9yZSB8fCBjb21wb25lbnQucm9vdC5zdG9yZTtcblxuXHRpZiAoIW9wdGlvbnMucm9vdCkge1xuXHRcdGNvbXBvbmVudC5fYmVmb3JlY3JlYXRlID0gW107XG5cdFx0Y29tcG9uZW50Ll9vbmNyZWF0ZSA9IFtdO1xuXHRcdGNvbXBvbmVudC5fYWZ0ZXJjcmVhdGUgPSBbXTtcblx0fVxufVxuXG5mdW5jdGlvbiBvbihldmVudE5hbWUsIGhhbmRsZXIpIHtcblx0dmFyIGhhbmRsZXJzID0gdGhpcy5faGFuZGxlcnNbZXZlbnROYW1lXSB8fCAodGhpcy5faGFuZGxlcnNbZXZlbnROYW1lXSA9IFtdKTtcblx0aGFuZGxlcnMucHVzaChoYW5kbGVyKTtcblxuXHRyZXR1cm4ge1xuXHRcdGNhbmNlbDogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaW5kZXggPSBoYW5kbGVycy5pbmRleE9mKGhhbmRsZXIpO1xuXHRcdFx0aWYgKH5pbmRleCkgaGFuZGxlcnMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHR9XG5cdH07XG59XG5cbmZ1bmN0aW9uIHNldChuZXdTdGF0ZSkge1xuXHR0aGlzLl9zZXQoYXNzaWduKHt9LCBuZXdTdGF0ZSkpO1xuXHRpZiAodGhpcy5yb290Ll9sb2NrKSByZXR1cm47XG5cdGZsdXNoKHRoaXMucm9vdCk7XG59XG5cbmZ1bmN0aW9uIF9zZXQobmV3U3RhdGUpIHtcblx0dmFyIG9sZFN0YXRlID0gdGhpcy5fc3RhdGUsXG5cdFx0Y2hhbmdlZCA9IHt9LFxuXHRcdGRpcnR5ID0gZmFsc2U7XG5cblx0bmV3U3RhdGUgPSBhc3NpZ24odGhpcy5fc3RhZ2VkLCBuZXdTdGF0ZSk7XG5cdHRoaXMuX3N0YWdlZCA9IHt9O1xuXG5cdGZvciAodmFyIGtleSBpbiBuZXdTdGF0ZSkge1xuXHRcdGlmICh0aGlzLl9kaWZmZXJzKG5ld1N0YXRlW2tleV0sIG9sZFN0YXRlW2tleV0pKSBjaGFuZ2VkW2tleV0gPSBkaXJ0eSA9IHRydWU7XG5cdH1cblx0aWYgKCFkaXJ0eSkgcmV0dXJuO1xuXG5cdHRoaXMuX3N0YXRlID0gYXNzaWduKGFzc2lnbih7fSwgb2xkU3RhdGUpLCBuZXdTdGF0ZSk7XG5cdHRoaXMuX3JlY29tcHV0ZShjaGFuZ2VkLCB0aGlzLl9zdGF0ZSk7XG5cdGlmICh0aGlzLl9iaW5kKSB0aGlzLl9iaW5kKGNoYW5nZWQsIHRoaXMuX3N0YXRlKTtcblxuXHRpZiAodGhpcy5fZnJhZ21lbnQpIHtcblx0XHR0aGlzLmZpcmUoXCJzdGF0ZVwiLCB7IGNoYW5nZWQ6IGNoYW5nZWQsIGN1cnJlbnQ6IHRoaXMuX3N0YXRlLCBwcmV2aW91czogb2xkU3RhdGUgfSk7XG5cdFx0dGhpcy5fZnJhZ21lbnQucChjaGFuZ2VkLCB0aGlzLl9zdGF0ZSk7XG5cdFx0dGhpcy5maXJlKFwidXBkYXRlXCIsIHsgY2hhbmdlZDogY2hhbmdlZCwgY3VycmVudDogdGhpcy5fc3RhdGUsIHByZXZpb3VzOiBvbGRTdGF0ZSB9KTtcblx0fVxufVxuXG5mdW5jdGlvbiBfc3RhZ2UobmV3U3RhdGUpIHtcblx0YXNzaWduKHRoaXMuX3N0YWdlZCwgbmV3U3RhdGUpO1xufVxuXG5mdW5jdGlvbiBzZXREZXYobmV3U3RhdGUpIHtcblx0aWYgKHR5cGVvZiBuZXdTdGF0ZSAhPT0gJ29iamVjdCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHR0aGlzLl9kZWJ1Z05hbWUgKyAnLnNldCB3YXMgY2FsbGVkIHdpdGhvdXQgYW4gb2JqZWN0IG9mIGRhdGEga2V5LXZhbHVlcyB0byB1cGRhdGUuJ1xuXHRcdCk7XG5cdH1cblxuXHR0aGlzLl9jaGVja1JlYWRPbmx5KG5ld1N0YXRlKTtcblx0c2V0LmNhbGwodGhpcywgbmV3U3RhdGUpO1xufVxuXG5mdW5jdGlvbiBjYWxsQWxsKGZucykge1xuXHR3aGlsZSAoZm5zICYmIGZucy5sZW5ndGgpIGZucy5zaGlmdCgpKCk7XG59XG5cbmZ1bmN0aW9uIF9tb3VudCh0YXJnZXQsIGFuY2hvcikge1xuXHR0aGlzLl9mcmFnbWVudFt0aGlzLl9mcmFnbWVudC5pID8gJ2knIDogJ20nXSh0YXJnZXQsIGFuY2hvciB8fCBudWxsKTtcbn1cblxudmFyIFBFTkRJTkcgPSB7fTtcbnZhciBTVUNDRVNTID0ge307XG52YXIgRkFJTFVSRSA9IHt9O1xuXG5mdW5jdGlvbiByZW1vdmVGcm9tU3RvcmUoKSB7XG5cdHRoaXMuc3RvcmUuX3JlbW92ZSh0aGlzKTtcbn1cblxudmFyIHByb3RvID0ge1xuXHRkZXN0cm95LFxuXHRnZXQsXG5cdGZpcmUsXG5cdG9uLFxuXHRzZXQsXG5cdF9yZWNvbXB1dGU6IG5vb3AsXG5cdF9zZXQsXG5cdF9zdGFnZSxcblx0X21vdW50LFxuXHRfZGlmZmVyc1xufTtcblxudmFyIHByb3RvRGV2ID0ge1xuXHRkZXN0cm95OiBkZXN0cm95RGV2LFxuXHRnZXQsXG5cdGZpcmUsXG5cdG9uLFxuXHRzZXQ6IHNldERldixcblx0X3JlY29tcHV0ZTogbm9vcCxcblx0X3NldCxcblx0X3N0YWdlLFxuXHRfbW91bnQsXG5cdF9kaWZmZXJzXG59O1xuXG5leHBvcnQgeyBibGFua09iamVjdCwgZGVzdHJveSwgZGVzdHJveURldiwgX2RpZmZlcnMsIF9kaWZmZXJzSW1tdXRhYmxlLCBmaXJlLCBmbHVzaCwgZ2V0LCBpbml0LCBvbiwgc2V0LCBfc2V0LCBfc3RhZ2UsIHNldERldiwgY2FsbEFsbCwgX21vdW50LCBQRU5ESU5HLCBTVUNDRVNTLCBGQUlMVVJFLCByZW1vdmVGcm9tU3RvcmUsIHByb3RvLCBwcm90b0Rldiwgd3JhcEFuaW1hdGlvbiwgZml4UG9zaXRpb24sIGhhbmRsZVByb21pc2UsIGFwcGVuZCwgaW5zZXJ0LCBkZXRhY2hOb2RlLCBkZXRhY2hCZXR3ZWVuLCBkZXRhY2hCZWZvcmUsIGRldGFjaEFmdGVyLCByZWluc2VydEJldHdlZW4sIHJlaW5zZXJ0Q2hpbGRyZW4sIHJlaW5zZXJ0QWZ0ZXIsIHJlaW5zZXJ0QmVmb3JlLCBkZXN0cm95RWFjaCwgY3JlYXRlRnJhZ21lbnQsIGNyZWF0ZUVsZW1lbnQsIGNyZWF0ZVN2Z0VsZW1lbnQsIGNyZWF0ZVRleHQsIGNyZWF0ZUNvbW1lbnQsIGFkZExpc3RlbmVyLCByZW1vdmVMaXN0ZW5lciwgc2V0QXR0cmlidXRlLCBzZXRBdHRyaWJ1dGVzLCBzZXRDdXN0b21FbGVtZW50RGF0YSwgc2V0WGxpbmtBdHRyaWJ1dGUsIGdldEJpbmRpbmdHcm91cFZhbHVlLCB0b051bWJlciwgdGltZVJhbmdlc1RvQXJyYXksIGNoaWxkcmVuLCBjbGFpbUVsZW1lbnQsIGNsYWltVGV4dCwgc2V0RGF0YSwgc2V0SW5wdXRUeXBlLCBzZXRTdHlsZSwgc2VsZWN0T3B0aW9uLCBzZWxlY3RPcHRpb25zLCBzZWxlY3RWYWx1ZSwgc2VsZWN0TXVsdGlwbGVWYWx1ZSwgYWRkUmVzaXplTGlzdGVuZXIsIHRvZ2dsZUNsYXNzLCBkZXN0cm95QmxvY2ssIG91dHJvQW5kRGVzdHJveUJsb2NrLCBmaXhBbmRPdXRyb0FuZERlc3Ryb3lCbG9jaywgdXBkYXRlS2V5ZWRFYWNoLCBtZWFzdXJlLCBhbmltYXRlLCBnZXRTcHJlYWRVcGRhdGUsIGludmFsaWRBdHRyaWJ1dGVOYW1lQ2hhcmFjdGVyLCBzcHJlYWQsIGVzY2FwZWQsIGVzY2FwZSwgZWFjaCwgbWlzc2luZ0NvbXBvbmVudCwgdmFsaWRhdGVTc3JDb21wb25lbnQsIGRlYnVnLCBsaW5lYXIsIGdlbmVyYXRlUnVsZSwgaGFzaCwgd3JhcFRyYW5zaXRpb24sIG91dHJvcywgZ3JvdXBPdXRyb3MsIHRyYW5zaXRpb25NYW5hZ2VyLCBub29wLCBhc3NpZ24sIGFzc2lnblRydWUsIGlzUHJvbWlzZSwgY2FsbEFmdGVyLCBhZGRMb2MsIGV4Y2x1ZGUsIHJ1biB9O1xuIiwiPGRpdiByZWY6cGFnZSBjbGFzcz1cImtpbl9wYWdlIHtkaXIgIT0gJ2x0cicgPyAnLScgKyBkaXIgOiAnJ30ge2xheW91dCA/ICctJytsYXlvdXQgOiAnJ30ge2Nzc2Nsc31cIiBkYXRhLXRlc3Q9e2RhdGF0ZXN0fT5cblxuXHR7I2lmIGxvYWRpbmcgPT09ICd0cnVlJyB8fCBsb2FkaW5nID09PSB0cnVlfVxuXG5cdFx0eyNpZiBoZWFkaW5nICE9ICcnfVxuXHRcdFx0PGgxIGNsYXNzPVwia2luX2xvYWRpbmdfX3RpdGxlXCI+e0BodG1sIGhlYWRpbmd9PC9oMT5cblx0XHR7OmVsc2V9XG5cdFx0XHQ8ZGl2IGNsYXNzPVwia2luX2xvYWRpbmdfX3RpdGxlXCI+XG5cdFx0XHRcdDxzbG90IG5hbWU9XCJwYWdlLXRpdGxlXCIgLz5cblx0XHRcdDwvZGl2PlxuXHRcdHsvaWZ9XG5cblx0XHQ8a2luLWxvYWRpbmcgZnVsbHNjcmVlbj1cInRydWVcIiBsYWJlbD1cIntsb2FkaW5nbGFiZWx9XCIgLz5cblxuXHR7OmVsc2V9XG5cblx0XHQ8IS0tIE1vZHVsZSBoZWFkZXIgLS0+XG5cdFx0PGhlYWRlciBjbGFzcz1cImtpbl9oZWFkZXJcIj5cblxuXHRcdFx0PCEtLSBCcmVhZGNydW1icyAoJ2N1cnJlbnQnIEFWIEdVSSkgLS0+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwia2luX2hlYWRlcl9fY3J1bWJzIGNydW1ic1wiPlxuXHRcdFx0XHQ8c2xvdCBuYW1lPVwiYnJlYWRjcnVtYnNcIi8+XG5cdFx0XHQ8L2Rpdj5cblxuXHRcdFx0PGRpdiBjbGFzcz1cImtpbl9oZWFkZXJfX2NvbnRlbnRcIj5cblxuXHRcdFx0XHQ8IS0tIE1vZHVsZSB0aXRsZSAtIGN1c3RvbSB2cy4gZ2VuZXJhdGVkIC0tPlxuXHRcdFx0XHR7I2lmIGhlYWRpbmcgIT0gJyd9XG5cdFx0XHRcdFx0PGgxIGNsYXNzPVwia2luX2hlYWRlcl9fdGl0bGVcIj57QGh0bWwgaGVhZGluZ308L2gxPlxuXHRcdFx0XHR7OmVsc2V9XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImtpbl9oZWFkZXJfX3RpdGxlXCI+XG5cdFx0XHRcdFx0XHQ8c2xvdCBuYW1lPVwicGFnZS10aXRsZVwiIC8+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdHsvaWZ9XG5cblx0XHRcdFx0PCEtLSBNb2R1bGUgY29udHJvbHMgLS0+XG5cdFx0XHRcdHsjaWYgISh1cHNlbGwgPT09ICd0cnVlJyB8fCB1cHNlbGwgPT09IHRydWUpfVxuXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImtpbl9oZWFkZXJfX2NvbnRyb2xzXCI+XG5cdFx0XHRcdFx0XHQ8c2xvdCByZWY6Y29udHJvbHMgbmFtZT1cImNvbnRyb2xzXCIgLz5cblxuXHRcdFx0XHRcdFx0PCEtLSBUb29sdGlwIGZvciBkaXNhYmxlZC9pbmN0aXZlIG1vZHVsZSAtLT5cblx0XHRcdFx0XHRcdHsjaWYgKGluYWN0aXZlID09PSAndHJ1ZScgfHwgaW5hY3RpdmUgPT09IHRydWUpICYmIGluYWN0aXZlbXNnICE9ICcnfVxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwia2luX2hlYWRlcl9fdG9vbHRpcCAtYXJyb3ctdG9wXCI+XG5cdFx0XHRcdFx0XHRcdFx0e2luYWN0aXZlbXNnfVxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdHsvaWZ9XG5cblx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHR7L2lmfVxuXG5cdFx0XHQ8L2Rpdj5cblxuXHRcdFx0PCEtLSBCYWNrIGJ1dHRvbiAoJ25ldycgU21hcnRIb21lIEdVSSkgLS0+XG5cdFx0XHR7I2lmIGJhY2sgIT0gJ2ZhbHNlJyAmJiBiYWNrZXZlbnQgIT0gJ3RydWUnfVxuXHRcdFx0XHQ8YSBjbGFzcz1cImtpbl9iYWNrLWJ0blwiIGhyZWY9XCJ7YmFja2hhc2ggIT0gJycgPyBiYWNraGFzaCA6ICcjRGFzaGJvYXJkJ31cIiB0aXRsZT1cIntiYWNrbGFiZWx9XCI+XG5cdFx0XHRcdFx0PGtpbi1pY29uIG5hbWU9XCJpY29uLXMtY29udHJvbHMtYXJyb3ctbGVmdFwiIHNpemU9XCIyMFwiIC8+XG5cdFx0XHRcdDwvYT5cblx0XHRcdHs6ZWxzZWlmIGJhY2tldmVudCA9PSAndHJ1ZSd9XG5cdFx0XHRcdDxidXR0b24gY2xhc3M9XCJraW5fYmFjay1idG5cIiBvbjpjbGljaz1cImJhY2tDbGlja0V2ZW50KClcIiB0aXRsZT1cIntiYWNrbGFiZWx9XCI+XG5cdFx0XHRcdFx0PGtpbi1pY29uIG5hbWU9XCJpY29uLXMtY29udHJvbHMtYXJyb3ctbGVmdFwiIHNpemU9XCIyMFwiIC8+XG5cdFx0XHRcdDwvYnV0dG9uPlxuXHRcdFx0ey9pZn1cblxuXHRcdFx0PCEtLSBTZXR0aW5ncyBidXR0b24gLS0+XG5cdFx0XHR7I2lmIHNldHRpbmdzdXJsICYmICEodXBzZWxsID09PSAndHJ1ZScgfHwgdXBzZWxsID09PSB0cnVlKX1cblx0XHRcdFx0PGEgY2xhc3M9XCJraW5fc2V0dGluZ3MtYnRuXCIgaHJlZj17c2V0dGluZ3N1cmx9IHRpdGxlPVwie3NldHRpbmdzbGFiZWx9XCI+XG5cdFx0XHRcdFx0PGtpbi1pY29uIG5hbWU9XCJpY29uLXMtc2V0dGluZ3MtYnV0dG9uXCIgc2l6ZT1cIjIwXCIgLz5cblx0XHRcdFx0PC9hPlxuXHRcdFx0ey9pZn1cblxuXHRcdDwvaGVhZGVyPlxuXG5cdFx0eyNpZiB1cHNlbGwgPT09ICd0cnVlJyB8fCB1cHNlbGwgPT09IHRydWV9XG5cblx0XHRcdDwhLS0gVXBzZWxsIC0tPlxuXHRcdFx0PGRpdiBjbGFzcz1cImtpbl9wYWdlX19jb250ZW50XCI+XG5cdFx0XHRcdDxzbG90IG5hbWU9XCJ1cHNlbGxcIiAvPlxuXHRcdFx0PC9kaXY+XG5cblx0XHR7OmVsc2V9XG5cblx0XHRcdDwhLS0gQ29udGVudCBob2xkZXIgLS0+XG5cdFx0XHQ8ZGl2IHJlZjpjb250ZW50IGNsYXNzPVwia2luX3BhZ2VfX2NvbnRlbnQge2luYWN0aXZlID09PSAndHJ1ZScgfHwgaW5hY3RpdmUgPT09IHRydWUgPyAnLWRpc2FibGVkJyA6ICcnfVwiPlxuXHRcdFx0XHQ8c2xvdCBuYW1lPVwicGFnZS1jb250ZW50XCIgLz5cblx0XHRcdDwvZGl2PlxuXG5cdFx0ey9pZn1cblxuXHR7L2lmfVxuXG48L2Rpdj5cblxuPHNjcmlwdD5cbiAgICBleHBvcnQgZGVmYXVsdCB7XG4gICAgICAgIHRhZzogJ2tpbi1wYWdlJyxcbiAgICAgICAgcHJvcHM6IFsnaGVhZGluZycsICdzZXR0aW5nc3VybCcsICdjc3NjbHMnLCAndXBzZWxsJywgJ2luYWN0aXZlJywgJ2luYWN0aXZlbXNnJywgJ2xheW91dCcsICdiYWNrJywgJ2JhY2tldmVudCcsICdiYWNraGFzaCcsICdsb2FkaW5nJywgJ2xvYWRpbmdsYWJlbCcsICdkYXRhdGVzdCddLFxuICAgICAgICBkYXRhKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkaXI6ICdsdHInLFxuICAgICAgICAgICAgICAgIGhlYWRpbmc6ICcnLFxuICAgICAgICAgICAgICAgIGNzc2NsczogJycsXG4gICAgICAgICAgICAgICAgc2V0dGluZ3N1cmw6ICcnLFxuICAgICAgICAgICAgICAgIHNldHRpbmdzbGFiZWw6ICdTZXR0aW5ncycsXG4gICAgICAgICAgICAgICAgdXBzZWxsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpbmFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgaW5hY3RpdmVtc2c6ICcnLFxuICAgICAgICAgICAgICAgIGxheW91dDogJycsXG4gICAgICAgICAgICAgICAgYmFjazogdHJ1ZSxcbiAgICAgICAgICAgICAgICBiYWNrZXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGJhY2toYXNoOiAnJyxcbiAgICAgICAgICAgICAgICBiYWNrbGFiZWw6ICdCYWNrJyxcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsb2FkaW5nbGFiZWw6IG51bGwsXG4gICAgICAgICAgICAgICAgZWxlbWV0c1N0YXRlOiBudWxsLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRIZWlnaHQ6IDAsXG5cdFx0ZGF0YXRlc3Q6ICcnLFxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICBnb0JhY2s6IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZW1pdCBldmVudFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJhY2tDbGlja0V2ZW50KCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tDbGlja0V2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdiYWNrQ2xpY2snLCB7XG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDogJ2JhY2tDbGljaycsXG4gICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlIC8vIG1ha2VzIHRoZSBldmVudCBqdW1wIHNoYWRvdyBET00gYm91bmRhcnlcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChiYWNrQ2xpY2tFdmVudCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0T2Zmc2V0SGVpZ2h0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZnMuY29udGVudCA/IHRoaXMucmVmcy5jb250ZW50Lm9mZnNldEhlaWdodCA6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25jcmVhdGUoKSB7XG4gICAgICAgICAgICB0aGlzLnNldCh7IGRpcjogZG9jdW1lbnQuYm9keS5kaXIgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuPC9zY3JpcHQ+XG5cblxuPHN0eWxlIHR5cGU9XCJ0ZXh0L3N0eWx1c1wiPlxuXG4qXG4qOmJlZm9yZVxuKjphZnRlclxuXHQtbW96LWJveC1zaXppbmcgYm9yZGVyLWJveFxuXHQtd2Via2l0LWJveC1zaXppbmcgYm9yZGVyLWJveFxuXHRib3gtc2l6aW5nIGJvcmRlci1ib3hcblxuLmtpbl9wYWdlXG5cdHBvc2l0aW9uIGFic29sdXRlXG5cdHRvcCAwXG5cdHJpZ2h0IDBcblx0Ym90dG9tIDBcblx0bGVmdCAwXG5cdGJhY2tncm91bmQgdmFyKC0tcGFnZS1iYWNrZ3JvdW5kKVxuXHRvdmVyZmxvdyBoaWRkZW5cblxuLmtpbl9sb2FkaW5nX190aXRsZVxuXHRwb3NpdGlvbiBhYnNvbHV0ZVxuXHRvcGFjaXR5IC4wMVxuXG4vLyBoZWFkZXJcbi5raW5faGVhZGVyXG5cdHBhZGRpbmcgMS41cmVtIHZhcigtLXBhZ2UtcGFkZGluZykgMFxuXHRoZWlnaHQgdmFyKC0taGVhZGVyLWhlaWdodClcblx0cG9zaXRpb24gcmVsYXRpdmVcblx0dGV4dC1hbGlnbiB2YXIoLS1wYWdlLWhlYWRlci1hbGlnbilcblxuXHQmX19jcnVtYnNcblx0Jl9fY29udGVudFxuXHRcdHBvc2l0aW9uIGFic29sdXRlXG5cdFx0bGVmdCB2YXIoLS1wYWdlLXBhZGRpbmcpXG5cdFx0cmlnaHQgdmFyKC0tcGFnZS1wYWRkaW5nKVxuXG5cdCZfX2NydW1ic1xuXHRcdGRpc3BsYXkgdmFyKC0tYnJlYWRjcnVtYnMtdmlzKVxuXG5cdCZfX2NvbnRlbnRcblx0XHRib3R0b20gMS4xcmVtXG5cblx0Jl9fdGl0bGVcblx0Jl9fY29udHJvbHNcblx0XHRkaXNwbGF5IGlubGluZS1ibG9ja1xuXHRcdHZlcnRpY2FsLWFsaWduIG1pZGRsZVxuXHRcdHBvc2l0aW9uIHJlbGF0aXZlXG5cblx0Jl9fdGl0bGVcblx0XHRtYXJnaW4tdG9wIDBcblx0XHRtYXJnaW4tYm90dG9tIDBcblx0XHRwYWRkaW5nIDBcblx0XHRsaW5lLWhlaWdodCAxLjFcblx0XHRmb250LXNpemUgdmFyKC0tZm9udC1zaXplLWhlYWRlcilcblx0XHRmb250LXdlaWdodCB2YXIoLS1mb250LXdlaWdodC1oMSlcblx0XHRtYXgtd2lkdGggMTAwJVxuXG5cdFx0LmNvbG9yLW9rXG5cdFx0XHRjb2xvciB2YXIoLS1jb2xvci1vaylcblxuXHRcdC5jb2xvci1jcml0aWNhbFxuXHRcdFx0Y29sb3IgdmFyKC0tY29sb3ItY3JpdGljYWwpXG5cblx0XHQuY29sb3ItYXR0ZW50aW9uXG5cdFx0XHRjb2xvciB2YXIoLS1jb2xvci1hdHRlbnRpb24pXG5cblx0Jl9fdG9vbHRpcFxuXHRcdHBvc2l0aW9uIGFic29sdXRlXG5cdFx0d2lkdGggMjRyZW1cblx0XHRtYXJnaW4tdG9wIDEuNXJlbVxuXHRcdHBhZGRpbmcgLjhyZW0gMS4ycmVtXG5cdFx0YmFja2dyb3VuZC1jb2xvciB2YXIoLS10b29sdGlwLWNvbG9yLW9uYm9hcmRpbmcpXG5cdFx0Y29sb3IgI2ZmZlxuXHRcdGZvbnQtc2l6ZSB2YXIoLS1mb250LXNpemUtc21hbGwpXG5cdFx0Ym9yZGVyIG5vbmVcblx0XHRib3gtc2hhZG93IDAgNnB4IDIwcHggcmdiYSgjMDAwLCAuMylcblx0XHRib3JkZXItcmFkaXVzIHZhcigtLWN1YmUtcmFkaXVzKVxuXHRcdHotaW5kZXggMjBcblx0XHR0cmFuc2Zvcm0gdHJhbnNsYXRlWCgtNTAlKVxuXHRcdGxlZnQgNTAlXG5cblx0XHQmLi1hcnJvdy10b3BcblxuXHRcdFx0JjphZnRlclxuXHRcdFx0XHRib3R0b20gMTAwJVxuXHRcdFx0XHRsZWZ0IDUwJVxuXHRcdFx0XHRib3JkZXIgc29saWQgdHJhbnNwYXJlbnRcblx0XHRcdFx0Y29udGVudCAnJ1xuXHRcdFx0XHRoZWlnaHQgMFxuXHRcdFx0XHR3aWR0aCAwXG5cdFx0XHRcdHBvc2l0aW9uIGFic29sdXRlXG5cdFx0XHRcdGNvbG9yIHZhcigtLXRvb2x0aXAtY29sb3Itb25ib2FyZGluZylcblx0XHRcdFx0cG9pbnRlci1ldmVudHMgbm9uZVxuXHRcdFx0XHRib3JkZXItY29sb3IgdHJhbnNwYXJlbnRcblx0XHRcdFx0Ym9yZGVyLWJvdHRvbS1jb2xvciBjdXJyZW50Q29sb3Jcblx0XHRcdFx0Ym9yZGVyLXdpZHRoIDhweFxuXHRcdFx0XHRtYXJnaW4tbGVmdCAtOHB4XG5cdFx0XHRcdHotaW5kZXggMVxuXG4vLyBwYWdlIG5hdmlnYXRpb25cbi5raW5fYmFjay1idG5cbi5raW5fc2V0dGluZ3MtYnRuXG5cdHBvc2l0aW9uIGFic29sdXRlXG5cdGxlZnQgMFxuXHR0b3AgdmFyKC0tYmFjay1idXR0b24tdG9wKVxuXHRib3JkZXIgMFxuXHRiYWNrZ3JvdW5kLWNvbG9yIHJnYmEoI2Q1ZDNlNiwgLjEpXG5cdHRyYW5zaXRpb24gYmFja2dyb3VuZC1jb2xvciAuMnNcblx0Y3Vyc29yIHBvaW50ZXJcblx0Y29sb3IgaW5oZXJpdFxuXHR0ZXh0LWRlY29yYXRpb24gbm9uZVxuXHR3aWR0aCA0cmVtXG5cdGhlaWdodCB2YXIoLS1iYWNrLWJ1dHRvbi1oZWlnaHQpXG5cdGJvcmRlci1yYWRpdXMgMCB2YXIoLS1iYWNrLWJ1dHRvbi1oZWlnaHQpIHZhcigtLWJhY2stYnV0dG9uLWhlaWdodCkgMFxuXHRkaXNwbGF5IGZsZXhcblx0YWxpZ24taXRlbXMgY2VudGVyXG5cdGp1c3RpZnktY29udGVudCBjZW50ZXJcblx0ei1pbmRleCA5XG5cblx0a2luLWljb25cblx0XHRvcGFjaXR5IC44XG5cblx0Jjpmb2N1c1xuXHQmOmhvdmVyXG5cdFx0dHJhbnNmb3JtIHNjYWxlKDEuMSlcblx0XHRiYWNrZ3JvdW5kLWNvbG9yIHJnYmEoI2Q1ZDNlNiwgLjMpXG5cdFx0b3V0bGluZSAwXG5cblx0XHRraW4taWNvblxuXHRcdFx0b3BhY2l0eSAxXG5cbi5raW5fc2V0dGluZ3MtYnRuXG5cdGxlZnQgYXV0b1xuXHRyaWdodCAwXG5cdGJvcmRlci1yYWRpdXMgdmFyKC0tYmFjay1idXR0b24taGVpZ2h0KSAwIDAgdmFyKC0tYmFjay1idXR0b24taGVpZ2h0KVxuXG5cdCY6aG92ZXIgLmtpbl9zZXR0aW5ncy1idG5fX3Rvb2x0aXBcblx0XHRkaXNwbGF5IGJsb2NrXG5cblx0Jl9fdG9vbHRpcFxuXHRcdGRpc3BsYXkgbm9uZVxuXHRcdHBvc2l0aW9uIGFic29sdXRlXG5cdFx0cmlnaHQgMTA1JVxuXG4ua2luX2JhY2stYnRuXG5cdGRpc3BsYXkgdmFyKC0tYmFjay1idG4tdmlzKVxuXG5cdCYuLXN0YXRpY1xuXHRcdHBvc2l0aW9uIGZpeGVkXG5cdFx0dG9wIDYuNHJlbVxuXG4vLyBwYWdlIGNvbnRlbnRcbi5raW5fcGFnZV9fY29udGVudFxuXHRwb3NpdGlvbiBhYnNvbHV0ZVxuXHR0b3AgdmFyKC0taGVhZGVyLWhlaWdodClcblx0cmlnaHQgMFxuXHRib3R0b20gMFxuXHRsZWZ0IDBcblx0ZGlzcGxheSBibG9ja1xuXHQvLyAtd2Via2l0LW1hc2staW1hZ2UgLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCByZ2JhKCMwMDAsIDApIDAlLCByZ2JhKCMwMDAsIDEpIDUlLCByZ2JhKCMwMDAsIDEpIDk1JSxyZ2JhKCMwMDAsIDApIDEwMCUpXG5cblx0Ly8gZGlzYWJsZWQgbW9kdWxlXG5cdCYuLWRpc2FibGVkXG5cdFx0b3BhY2l0eSAuMlxuXHRcdHBvaW50ZXItZXZlbnRzIG5vbmVcblxuLy8gdXBzZWxsIGxheW91dFxuLmtpbl91cHNlbGxcblx0dG9wIHZhcigtLWhlYWRlci1oZWlnaHQpXG5cdGJvdHRvbSAwXG5cdGxlZnQgMFxuXHRyaWdodCAwXG5cdHBvc2l0aW9uIGFic29sdXRlXG5cdGRpc3BsYXkgZmxleFxuXHRmbGV4LWRpcmVjdGlvbiBjb2x1bW5cblx0anVzdGlmeS1jb250ZW50IGNlbnRlclxuXHRhbGlnbi1pdGVtcyBjZW50ZXJcblxuXHQmX19pY29uXG5cdFx0Zm9udC1zaXplIDE4cmVtXG5cdFx0bWFyZ2luLWJvdHRvbSAycmVtXG5cblx0Jl9fY3RhXG5cdFx0bWFyZ2luLXRvcCAxcmVtXG5cblxuLy8gcGFnZSBtb2RpZmljYXRpb25zXG4ua2luX3BhZ2VcblxuXHQmLi1uby1oZWFkZXJcblxuXHRcdC5raW5faGVhZGVyXG5cdFx0XHRkaXNwbGF5IG5vbmVcblxuXHRcdC5raW5fcGFnZV9fY29udGVudFxuXHRcdFx0dG9wIDBcblxuXHQmLi1jb3Zlci1oZWFkZXJcblx0XHQua2luX2hlYWRlclxuXHRcdFx0cG9zaXRpb24gYWJzb2x1dGVcblx0XHRcdHdpZHRoIDEwMCVcblx0XHRcdHotaW5kZXggMVxuXG5cdFx0Lmtpbl9wYWdlX19jb250ZW50XG5cdFx0XHR0b3AgMFxuXG5cdCYuLWxhcmdlLWhlYWRlclxuXG5cdFx0Lmtpbl9oZWFkZXJcblx0XHRcdGhlaWdodCB2YXIoLS1oZWFkZXItaGVpZ2h0LWxhcmdlKVxuXG5cdFx0Lmtpbl9oZWFkZXJfX3RpdGxlXG5cdFx0XHRkaXNwbGF5IGJsb2NrXG5cblx0XHQua2luX3BhZ2VfX2NvbnRlbnRcblx0XHRcdHRvcCB2YXIoLS1oZWFkZXItaGVpZ2h0LWxhcmdlKVxuXG5cdCYuLW1lZGl1bS1oZWFkZXJcblxuXHRcdC5raW5faGVhZGVyXG5cdFx0XHRoZWlnaHQgdmFyKC0taGVhZGVyLWhlaWdodC1tZWRpdW0pXG5cblx0XHQua2luX2hlYWRlcl9fdGl0bGVcblx0XHRcdGRpc3BsYXkgYmxvY2tcblxuXHRcdC5raW5fcGFnZV9fY29udGVudFxuXHRcdFx0dG9wIHZhcigtLWhlYWRlci1oZWlnaHQtbWVkaXVtKVxuXG5cdCYuLXRhYnMtcGFnZVxuXG5cdFx0Lmtpbl9oZWFkZXJcblx0XHRcdGhlaWdodCB2YXIoLS1oZWFkZXItaGVpZ2h0LXRhYnMpXG5cdFx0XHR0ZXh0LWFsaWduIGNlbnRlclxuXG5cdFx0Lmtpbl9oZWFkZXJfX3RpdGxlXG5cdFx0XHRkaXNwbGF5IGJsb2NrXG5cdFx0XHR0ZXh0LWFsaWduIGNlbnRlclxuXG5cdFx0Lmtpbl9oZWFkZXJfX2NvbnRyb2xzXG5cdFx0XHRkaXNwbGF5IGJsb2NrXG5cdFx0XHR0ZXh0LWFsaWduIGNlbnRlclxuXHRcdFx0cGFkZGluZyAwXG5cblx0XHQua2luX3BhZ2VfX2NvbnRlbnRcblx0XHRcdHRvcCB2YXIoLS1oZWFkZXItaGVpZ2h0LXRhYnMpXG5cdFx0XHR0ZXh0LWFsaWduIGNlbnRlclxuXG5cdCYuLWNlbnRlci1oZWFkZXJcblxuXHRcdC5raW5faGVhZGVyX19jb250cm9sc1xuXHRcdC5raW5faGVhZGVyX190aXRsZVxuXHRcdFx0ZGlzcGxheSBibG9ja1xuXHRcdFx0dGV4dC1hbGlnbiBjZW50ZXJcblxuXHQmLi1jZW50ZXJcblx0Ji4tY2VudGVyLWFsbFxuXHRcdHRleHQtYWxpZ24gY2VudGVyXG5cblx0XHQua2luX2hlYWRlcl9fY29udHJvbHNcblx0XHRcdGRpc3BsYXkgbm9uZVxuXG5cdFx0Lmtpbl9oZWFkZXJfX3RpdGxlXG5cdFx0XHRkaXNwbGF5IGJsb2NrXG5cblx0Ji4tY2VudGVyLWFsbFxuXHRcdC5raW5fcGFnZV9fY29udGVudFxuXHRcdFx0ZGlzcGxheSBmbGV4XG5cdFx0XHRhbGlnbi1pdGVtcyBjZW50ZXJcblx0XHRcdGp1c3RpZnktY29udGVudCBjZW50ZXJcblx0XHRcdHRleHQtYWxpZ24gY2VudGVyXG5cblx0Ji4tZmxleC1iZXR3ZWVuXG5cblx0XHQua2luX2hlYWRlcl9fY29udHJvbHNcblx0XHRcdGRpc3BsYXkgbm9uZVxuXG5cdFx0Lmtpbl9oZWFkZXJfX3RpdGxlXG5cdFx0XHRkaXNwbGF5IGJsb2NrXG5cblx0XHQua2luX3BhZ2VfX2NvbnRlbnRcblx0XHRcdGRpc3BsYXkgZmxleFxuXHRcdFx0YWxpZ24taXRlbXMgY2VudGVyXG5cdFx0XHRqdXN0aWZ5LWNvbnRlbnQgc3BhY2UtYmV0d2VlblxuXHRcdFx0dGV4dC1hbGlnbiBjZW50ZXJcblxuXHQmLi1wcm9maWxlXG5cblx0XHQua2luX2hlYWRlclxuXHRcdFx0cG9zaXRpb24gc3RhdGljXG5cdFx0XHRoZWlnaHQgYXV0b1xuXHRcdFx0dGV4dC1hbGlnbiBzdGFydFxuXG5cdFx0XHQmX19jb250ZW50XG5cdFx0XHRcdHBvc2l0aW9uIHN0YXRpY1xuXG5cdFx0XHQmX19jb250cm9sc1xuXHRcdFx0XHRwb3NpdGlvbiBzdGF0aWNcblx0XHRcdFx0ZGlzcGxheSBibG9ja1xuXHRcdFx0XHRwYWRkaW5nIDBcblx0XHRcdFx0bWF4LWhlaWdodCBub25lXG5cblx0XHRcdCZfX3RpdGxlXG5cdFx0XHRcdG1heC1oZWlnaHQgbm9uZVxuXHRcdFx0XHRtYXgtd2lkdGggMTAwJVxuXG5cdFx0Lmtpbl9wYWdlX19jb250ZW50XG5cdFx0XHR0b3AgY2FsYyggdmFyKC0taGVhZGVyLWhlaWdodCkgKyA2cmVtKVxuXG5cdCYuLWRldGFpbFxuXG5cdFx0Lmtpbl9oZWFkZXJcblx0XHRcdHRleHQtYWxpZ24gY2VudGVyXG5cdFx0XHRoZWlnaHQgY2FsYyggdmFyKC0taGVhZGVyLWhlaWdodC1sYXJnZSkgKyA0cmVtKVxuXG5cdFx0XHQmX19jb250ZW50XG5cdFx0XHRcdGRpc3BsYXkgYmxvY2tcblxuXHRcdFx0Jl9fdGl0bGVcblx0XHRcdFx0bWF4LWhlaWdodCBub25lXG5cdFx0XHRcdGRpc3BsYXkgYmxvY2tcblx0XHRcdFx0Zm9udC13ZWlnaHQgdmFyKC0tZm9udC13ZWlnaHQtaDEpXG5cdFx0XHRcdHBhZGRpbmcgMCA4JVxuXG5cdFx0XHQmX19jb250cm9sc1xuXHRcdFx0XHRwYWRkaW5nIDFyZW0gMCAwXG5cdFx0XHRcdHBvc2l0aW9uIHN0YXRpY1xuXHRcdFx0XHRkaXNwbGF5IGJsb2NrXG5cdFx0XHRcdG1heC1oZWlnaHQgbm9uZVxuXG5cdFx0Lmtpbl9wYWdlX19jb250ZW50XG5cdFx0XHR0b3AgY2FsYyggdmFyKC0taGVhZGVyLWhlaWdodC1sYXJnZSkgKyA0cmVtKVxuXG5cbjpnbG9iYWwoLnRhYmJlZClcblxuXHQua2luX2JhY2stYnRuOmZvY3VzXG5cdC5raW5fc2V0dGluZ3MtYnRuOmZvY3VzXG5cdFx0Ym94LXNoYWRvdyAwIDAgMCAxcHggIzAwMCwgMCAwIDAgMnB4IHZhcigtLWNvbG9yLWZvY3VzKVxuXG4vLyBSVExcbi5raW5fcGFnZS4tcnRsXG5cblx0Lmtpbl9oZWFkZXJfX3Rvb2x0aXBcblx0XHR0cmFuc2Zvcm0gdHJhbnNsYXRlWCg1MCUpXG5cdFx0bGVmdCBhdXRvXG5cdFx0cmlnaHQgNTAlXG5cblx0Lmtpbl9iYWNrLWJ0blxuXHQua2luX3NldHRpbmdzLWJ0blxuXHRcdHRyYW5zZm9ybSBzY2FsZSgtMSlcblxuXHRcdCY6Zm9jdXNcblx0XHQmOmhvdmVyXG5cdFx0XHR0cmFuc2Zvcm0gc2NhbGUoLTEuMSlcblxuXHQua2luX2JhY2stYnRuXG5cdFx0bGVmdCBhdXRvXG5cdFx0cmlnaHQgMFxuXG5cdC5raW5fc2V0dGluZ3MtYnRuXG5cdFx0cmlnaHQgYXV0b1xuXHRcdGxlZnQgMFxuXG48L3N0eWxlPlxuIiwiPHN2ZWx0ZTp3aW5kb3cgb246a2V5ZG93bj1cImRlc2VsZWN0KHsga2V5OiBldmVudC5rZXksIGtleUNvZGU6IGV2ZW50LmtleUNvZGUgfSlcIi8+XG5cbjxkaXYgY2xhc3M9XCJraW5fdGFibGUge2Nzc2Nsc30ge2RhdGFsZW5ndGggIT0gbnVsbCAmJiBkYXRhTGVuZ3RoTnVtID09PSAwID8gJy1lbXB0eScgOiAnJ30ge2luYWN0aXZlID09PSAndHJ1ZScgPyAnLWRpc2FibGVkJyA6ICcnfVwiIHJvbGU9XCJ0YWJsZVwiPlxuXG5cdDxkaXY+XG5cdFx0PHNsb3QgbmFtZT1cInRhYmxlLW1vZGFsc1wiIC8+XG5cdDwvZGl2PlxuXG5cdHsjaWYgbG9hZGluZyA9PT0gJ3RydWUnIHx8IGxvYWRpbmcgPT09IHRydWV9XG5cblx0XHQ8a2luLWxvYWRpbmcgZnVsbHNjcmVlbj1cInRydWVcIiAvPlxuXG5cdHs6ZWxzZWlmIGRhdGFsZW5ndGggIT0gbnVsbCAmJiBkYXRhTGVuZ3RoTnVtID09PSAwfVxuXG5cdFx0PCEtLSBUYWJsZSBlbXB0eSAtLT5cblx0XHQ8ZGl2IGNsYXNzPVwia2luX3RhYmxlX19lbXB0eVwiPlxuXHRcdFx0PGRpdiBjbGFzcz1cImtpbl90YWJsZV9fZW1wdHlfX2ljb25cIj5cblx0XHRcdFx0PHNsb3QgbmFtZT1cInRhYmxlLWVtcHR5LWljb25cIiAvPlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8c2xvdCBuYW1lPVwidGFibGUtZW1wdHlcIiAvPlxuXHRcdDwvZGl2PlxuXG5cdHs6ZWxzZX1cblxuXHRcdDwhLS0gVGFibGUgaGVhZGVyIChzdGlja3kpIC0tPlxuXHRcdDxzbG90IG5hbWU9XCJ0YWJsZS1oZWFkZXJcIi8+XG5cblx0XHQ8IS0tIFRhYmxlIGFjdGlvbmJhciAtLT5cblx0XHR7I2lmIHNlbGVjdGVkSXRlbXNOdW0gPiAwfVxuXHRcdFx0PHNsb3QgbmFtZT1cInRhYmxlLWFjdGlvbnNcIiAvPlxuXHRcdHsvaWZ9XG5cblx0XHQ8c2xvdCBuYW1lPVwidGFibGUtYm9keS1oZWFkaW5nXCIgLz5cblxuXHRcdDwhLS0gVGFibGUgYm9keSAtLT5cblx0XHQ8ZGl2IGNsYXNzPVwia2luX3RhYmxlX19ib2R5XCIgcmVmOmFsbFJvd3NIZWlnaHQ+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwia2luX3RhYmxlX19zY3JvbGwtcGFuZVwiIHJlZjp0YWJsZVNjcm9sbFBhbmU+XG5cdFx0XHRcdDxzbG90IG5hbWU9XCJ0YWJsZS1ib2R5XCIgLz5cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PlxuXG5cdFx0eyNpZiAhKGNvbGxhcHNlICYmIGRhdGFMZW5ndGhOdW0gPiBzaG93TW9yZUxpbWl0TnVtKX1cblx0XHRcdDxzbG90IG5hbWU9XCJ0YWJsZS1hY3Rpb24tcm93XCIgLz5cblx0XHRcdDwhLS0gRXhhbXBsZSBvZiBhZGQgcm93IGluIHNsb3Rcblx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cImtpbl90YWJsZV9fcm93IC1idXR0b25cIj5cblx0XHRcdFx0XHQ8a2luLWljb24gbmFtZT1cImljb24tcy1hZGRcIiBzaXplPVwiMjRcIiAvPlxuXHRcdFx0XHRcdEFkZCBzb21ldGhpbmdcblx0XHRcdFx0PC9idXR0b24+XG5cdFx0XHQtLT5cblx0XHR7L2lmfVxuXG5cdFx0eyNpZiBzaG93TW9yZUxpbWl0TnVtICYmIGRhdGFMZW5ndGhOdW0gPiBzaG93TW9yZUxpbWl0TnVtfVxuXHRcdFx0PGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCIvTWFpbkNzcy5jc3NcIiAvPlxuXHRcdFx0PGRpdiBjbGFzcz1cImtpbl90YWJsZV9fZXhwYW5kIGF2c1wiPlxuXHRcdFx0XHR7I2lmIGNvbGxhcHNlfVxuXHRcdFx0XHRcdDxidXR0b24gb246Y2xpY2s9XCJleHBhbmQoKVwiIGNsYXNzPVwiYnRuIC1zZWNvbmRhcnlcIj57dHh0c2hvd21vcmV9PC9idXR0b24+XG5cdFx0XHRcdHs6ZWxzZX1cblx0XHRcdFx0XHQ8YnV0dG9uIG9uOmNsaWNrPVwiY29sbGFwc2UoKVwiIGNsYXNzPVwiYnRuIC1zZWNvbmRhcnlcIj57dHh0c2hvd2xlc3N9PC9idXR0b24+XG5cdFx0XHRcdHsvaWZ9XG5cdFx0XHQ8L2Rpdj5cblx0XHR7L2lmfVxuXG5cdFx0PCEtLSBTZWNvbmQgdGFibGUgc2VjdGlvbiAtLT5cblx0XHR7I2lmIHRhYmxlc2VjdGlvbnMgPT09ICcyJ31cblx0XHRcdDxzbG90IG5hbWU9XCJ0YWJsZS1oZWFkZXItMlwiLz5cblxuXHRcdFx0PHNsb3QgbmFtZT1cInRhYmxlLWJvZHktMlwiIC8+XG5cdFx0ey9pZn1cblxuXHRcdHsjaWYgYm90dG9tbG9hZGluZ31cblx0XHRcdDxraW4tcHJvZ3Jlc3MgcGVyY2VudGFnZT1cIi0xXCI+PC9raW4tcHJvZ3Jlc3M+XG5cdFx0ey9pZn1cblxuXHR7L2lmfVxuXG48L2Rpdj5cblxuPHNjcmlwdD5cblx0LyogVE9ET1xuXHRcdC0gbWFrZSBzdmVsdGUgdmVyc2lvbiBvZiBwbHVnaW4gbml0cm8tdWkvcmFjdGl2ZUFkYXB0ZXIvYXBwL25pdHJvL3VpL3BsdWdpbnMva2luVGFibGVTY3JvbGxhYmxlLmpzXG5cdFx0LSBraWxsIE1haW5Dc3MuY3NzIGltcG9ydFxuXHRcdC0gZG8gYWN0aW9uIGJhciBBVi0yMTc3NFxuXHQqL1xuXG5cdC8qIFJVTEVTXG5cdFx0MSkgUm93cyAua2luX3RhYmxlX19yb3cgaW4gc2xvdCBuYW1lPVwidGFibGUtYm9keVwiIG11c3QgaGF2ZSBzYW1lIGhlaWdodCB0byBnZXQgcHJvcGVyIGNhbGN1bGF0aW9uXG5cdFx0MikgdXNlIHNsb3QgbmFtZT1cInRhYmxlLWJvZHktaGVhZGluZ1wiIHRvIHB1dCBzb21ldGhpbmcgYmVmb3JlIGRhdGEgcm93c1xuXHRcdDMpIHVzZSBzbG90IG5hbWU9XCJ0YWJsZS1hY3Rpb24tcm93XCIgdG8gcHV0IHNvbWV0aGluZyBhZnRlciBkYXRhIHJvd3Ncblx0XHQ0KSBtb3N0IHVzZWQgc2Nyb2xscm9vdHNlbGVjdG9yJ3MgOiAuc3ZlX29uZS1wYWdlX19jb250ZW50LCBraW4sIC5vdmVybGF5X19jb250ZW50c1xuXHRcdDUpIGlmIHlvdSBoYXZlIG1vcmUgdGFibGVzIG9uIHBhZ2UgYW5kIG5lZWQgc21hcnRzY3JvbGwgdGhlbiBsb3dlciBNSU5fUk9XU19UT19TQ1JPTExcblx0XHRcdChhcyBkZWZhdWx0IGV2ZXJ5IHRhYmxlIGNvdWxkIGhhdmUgdXAgdG8gNjAgcm93cyBpbiBET00pXG5cdFx0NikgdG8gY2hlY2sgaWYgc21hcnRzY3JvbGwgcmVhbGx5IHdvcmtzLCBqdXN0IGNoZWNrIGlmIHlvdSBzZWUgaW4gRE9NIG1heCBvZiA2MCByb3dzIChNSU5fUk9XU19UT19TQ1JPTEwpXG5cdCovXG5cblx0LyogRVhBTVBMRVNcblx0XHQxKSBzaG93IG1vcmUvbGVzcyBpbiBhbGwgZnJhbWV3b3Jrc1xuXHRcdDxraW4tdGFibGUgc2hvd21vcmVsaW1pdD01IHR4dHNob3dsZXNzPVwic29tZSB0ZXh0XCIgdHh0c2hvd21vcmU9e25scygnZ2xvYmFsLnNob3cubW9yZScsIHNvbWVEYXRhLmxlbmd0aCAtIDUpfT5cblxuXHRcdDIpIHNob3cgbW9yZS9sZXNzIHdpdGggZGF0YSBpbiByYWN0aXZlICh0ZXh0cyBoYW5kbGVkIGJ5IHBsdWdpbilcblx0XHRvbnJlbmRlciA9PiBOQVBJLm5pdHJvLnVpLnBsdWdpbnMua2luVGFibGVTY3JvbGxhYmxlLmluaXRSYWN0aXZlKHRoaXMpO1xuXHRcdDxraW4tdGFibGUgc2hvd21vcmVsaW1pdD01IGRhdGFuYW1lPVwiaG9wXCIgZGF0YWxlbmd0aD1cIjE3XCI+XG5cblx0XHQzKSBzaG93IG1vcmUvbGVzcyArIHNtYXJ0c2Nyb2xsIHdpdGggZGF0YSBpbiByYWN0aXZlXG5cdFx0b25yZW5kZXIgPT4gTkFQSS5uaXRyby51aS5wbHVnaW5zLmtpblRhYmxlU2Nyb2xsYWJsZS5pbml0UmFjdGl2ZSh0aGlzKTtcblx0XHQ8a2luLXRhYmxlIHNob3dtb3JlbGltaXQ9NSBkYXRhbmFtZT1cImhvcFwiIGRhdGFsZW5ndGg9XCI2NlwiIHNjcm9sbHJvb3RzZWxlY3Rvcj1cImtpbi12aWV3XCI+XG5cblx0XHQ0KSBzbWFydHNjcm9sbCBpbiByYWN0aXZlXG5cdFx0b25yZW5kZXIgPT4gTkFQSS5uaXRyby51aS5wbHVnaW5zLmtpblRhYmxlU2Nyb2xsYWJsZS5pbml0UmFjdGl2ZSh0aGlzKTtcblx0XHQ8a2luLXRhYmxlIGRhdGFuYW1lPVwiaG9wXCIgZGF0YWxlbmd0aD1cIjY2XCIgc2Nyb2xscm9vdHNlbGVjdG9yPVwiLm92ZXJsYXlfX2NvbnRlbnRzXCI+XG5cblx0XHQ1KSBzbWFydHNjcm9sbCBpbiBzdmVsdGVcblx0XHRcdHN2ZWx0ZSBwbHVnaW4gbm90IHJlYWR5IHlldFxuXG5cdFx0Nikgd2F0Y2hzY3JvbGwgKyBsb2FkaW5nIGFuaW1hdGlvblxuXHRcdFx0d2F0Y2hzY3JvbGxwb3Mgc3RhcnRzIGZpcmluZyBzY3JvbGxQb3MgZXZlbnRzIG9uIHdoaWNoIHlvdSBzdGFydCBsaXN0ZW5pbmdcblx0XHQ8a2luLXRhYmxlIHdhdGNoc2Nyb2xscG9zPXtib29sfSBib3R0b21sb2FkaW5nPXtib29sfSBvbjpzY3JvbGxQb3M9e29uU2Nyb2xsUG9zfSBzY3JvbGxyb290c2VsZWN0b3I9XCIuc3ZlX29uZS1wYWdlX19jb250ZW50XCI+XG5cblx0ICovXG5cblx0Y29uc3QgZ2V0UG9zaXRpdmVPckJhc2UgPSAodmFsdWUsIGJhc2UgPSAwLCBtaW4gPSAwKSA9PiB7XG5cdFx0aWYgKHZhbHVlID09IG51bGwpIHtcblx0XHRcdHJldHVybiBiYXNlO1xuXHRcdH1cblx0XHRjb25zdCBpbnRWYWx1ZSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG5cdFx0cmV0dXJuIE51bWJlci5pc0ludGVnZXIoaW50VmFsdWUpICYmIGludFZhbHVlID49IG1pbiA/IGludFZhbHVlIDogYmFzZTtcblx0fVxuXG5cdGV4cG9ydCBkZWZhdWx0IHtcblx0XHR0YWc6ICdraW4tdGFibGUnLFxuXHRcdHByb3BzOiBbJ2FueXNlbGVjdGVkJywgJ2Nzc2NscycsICdjdXN0b21lbXB0eWljb24nLCAnZGF0YWxlbmd0aCcsICdkYXRhbmFtZScsICdncm91cGlkJywgJ2luYWN0aXZlJywgJ2tlZXBwb3NpdGlvbicsXG5cdFx0XHQnbG9hZGluZycsICdtaW5yb3dzdG9zY3JvbGwnLCAnbmFtZScsICdub2FjdGlvbnMnLCAncGFnZXNpbndyYXAnLCAnc2Nyb2xscm9vdHNlbGVjdG9yJywgJ3NlbGVjdGVkaXRlbXMnLCAndGFibGVzZWN0aW9ucycsXG5cdFx0XHQnd2F0Y2hzY3JvbGxwb3MnLCAnYm90dG9tbG9hZGluZycsICdzaG93bW9yZWxpbWl0JywgJ3R4dHNob3dsZXNzJywgJ3R4dHNob3dtb3JlJ1xuXHRcdF0sXG5cdFx0Ly8gZ3JvdXBpZCAtIHRhYmxlcyBncm91cCBpZCBmb3IgZXh0ZXJuYWwgYWN0aW9uIGJhciAoVE9ETyBhY3Rpb24gYmFyIEFWLTIxNzc0KVxuXHRcdC8vIGRhdGFuYW1lIC0gbmFtZSBvZiBkYXRhIHByb3BlcnR5IGZyb20gd2hpY2ggc2Nyb2xsZXIgdGFrZXMgZGF0YSBhbmQgY2xvbmUgdGhlbSB0byByb3dzXyRkYXRhbmFtZSBpbiB0aGF0IGNvbXBvbmVudCAocmVxdWlyZWQgZm9yIHNtYXJ0IHNjcm9sbCBmZWF0dXJlKVxuXHRcdC8vIGtlZXBwb3NpdGlvbiAtIG9uIGRhdGEgY2hhbmdlIChuZXcsIGRlbGV0ZS4uLikga2VlcCBzY3JvbGxpbmcgcG9zaXRpb24gb3IgZ28gdG8gc3RhcnQ/XG5cdFx0Ly8gc2Nyb2xscm9vdHNlbGVjdG9yIC0gcGFyZW50IGNzcyBzZWxlY3RvciAocmVxdWlyZWQgZm9yIHNtYXJ0IHNjcm9sbCBmZWF0dXJlKVxuXHRcdC8vIG1pbnJvd3N0b3Njcm9sbCAtIGhvdyBtYW55IHJvd3MgbmVlZGVkIHRvIGFwcGx5IHNjcm9sbGluZyBmdW5jdGlvbmFsaXR5LCBkZWZhdWx0IGlzIDYwIChyZXF1aXJlZCBmb3Igc21hcnQgc2Nyb2xsIGZlYXR1cmUpXG5cdFx0Ly8gcGFnZXNpbndyYXAgLSBob3cgbWFueSBwYWdlcyBhcmUgcmVuZGVyZWQsIGRlZmF1bHQgaXMgMiAocmVxdWlyZWQgZm9yIHNtYXJ0IHNjcm9sbCBmZWF0dXJlKVxuXHRcdC8vIG5vYWN0aW9ucyAtIGRvbnQgc2hvdyBhY3Rpb24gYmFyICh1c2VkIGZvciBleHRlcm5hbCBhY3Rpb24gYmFyIHRoYXRzIHNoYXJlZCBmb3IgbXVsdGlwbGUgdGFibGVzKSAoVE9ETyBhY3Rpb24gYmFyIEFWLTIxNzc0KVxuXHRcdC8vIHNob3dtb3JlbGltaXQgLSBvbiBjcmVhdGUgb3IgY29sbGFwc2Ugc2hvdyBvbmx5IHRoaXMgbnVtYmVyIG9mIHJvd3MgKHJlcXVpcmVkIGZvciBleHBhbmQvY29sbGFwc2UgZmVhdHVyZSlcblx0XHQvLyB0eHRzaG93bGVzcyAtIHRleHQgZm9yIHNob3cgbGVzcyBidXR0b24gKHJlcXVpcmVkIGZvciBleHBhbmQvY29sbGFwc2UgZmVhdHVyZSlcblx0XHQvLyB0eHRzaG93bW9yZSAtIHRleHQgZm9yIHNob3cgbW9yZSBidXR0b24gKHJlcXVpcmVkIGZvciBleHBhbmQvY29sbGFwc2UgZmVhdHVyZSlcblx0XHQvLyB3YXRjaHNjcm9sbHBvcyAoYm9vbClcblx0XHQvLyAtIElmIHRydWUsIGl0IGRpc3BhdGNoZXMgZXZlbnQgd2hlbiB0aGUgdGFibGUgYm90dG9tIGlzIHJlYWNoZWQgYWZ0ZXIgc2Nyb2xsaW5nLlxuXHRcdC8vIC0gSWYgdGhlcmUgaXMgbm8gc2Nyb2xsaW5nLCB0aGUgZXZlbnQgaXMgZGlzcGF0Y2hlZCBpbW1lZGlhdGVseS5cblx0XHQvLyAtIFVzZWQgZm9yIGxvYWRpbmcgbW9yZSBpdGVtcyB3aGVuIHRoZSBib3R0b20gaXMgcmVhY2hlZC5cblx0XHQvLyAtIFNvIGZhciBpdCBzdXBwb3J0ZWQgb25seSBpbiBjb21tYmluYXRpb24gd2l0aCBraW4tdmlldy5cblx0XHQvLyBib3R0b21sb2FkaW5nIChib29sKVxuXHRcdC8vIC0gU2hvd3MgcHJvZ3Jlc3MgYXQgdGhlIGJvdHRvbSBvZiB0aGUgdGFibGUuXG5cdFx0Ly8gLSBVc2VkIGluIGNvbWJpbmF0aW9uIHdpdGggd2F0Y2hzY3JvbGxwb3MgZm9yIGluZGlhY2F0aW9uIHRoYXQgbW9yZSBpdGVtcyBhcmUgYmVpbmcgbG9hZGVkLlxuXHRcdGRhdGEoKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRhbnlzZWxlY3RlZDogJ2ZhbHNlJyxcblx0XHRcdFx0Y3NzY2xzOiAnJyxcblx0XHRcdFx0Y3VzdG9tZW1wdHlpY29uOiAnJyxcblx0XHRcdFx0ZGF0YWxlbmd0aDogbnVsbCxcblx0XHRcdFx0ZGF0YW5hbWU6ICcnLFxuXHRcdFx0XHRpbmFjdGl2ZTogZmFsc2UsXG5cdFx0XHRcdGdyb3VwaWQ6IG51bGwsLy8gVE9ETyBhY3Rpb24gYmFyIEFWLTIxNzc0XG5cdFx0XHRcdGtlZXBwb3NpdGlvbjogdHJ1ZSxcblx0XHRcdFx0bG9hZGluZzogZmFsc2UsXG5cdFx0XHRcdG1pbnJvd3N0b3Njcm9sbDogbnVsbCxcblx0XHRcdFx0bmFtZTogJycsLy8gVE9ETyBhY3Rpb24gYmFyIEFWLTIxNzc0XG5cdFx0XHRcdG5vYWN0aW9uczogZmFsc2UsLy8gVE9ETyBhY3Rpb24gYmFyIEFWLTIxNzc0XG5cdFx0XHRcdHBhZ2VzaW53cmFwOiBudWxsLFxuXHRcdFx0XHRzY3JvbGxyb290c2VsZWN0b3I6IG51bGwsXG5cdFx0XHRcdHNlbGVjdGVkaXRlbXM6IG51bGwsXG5cdFx0XHRcdHRhYmxlc2VjdGlvbnM6IDEsXG5cdFx0XHRcdHNob3dtb3JlbGltaXQ6IG51bGwsXG5cdFx0XHRcdGNvbGxhcHNlOiBudWxsLFxuXHRcdFx0XHR0eHRzaG93bGVzczogJycsXG5cdFx0XHRcdHR4dHNob3dtb3JlOiAnJyxcblx0XHRcdFx0d2F0Y2hzY3JvbGxwb3M6IGZhbHNlLFxuXHRcdFx0XHRib3R0b21sb2FkaW5nOiBmYWxzZVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Y29tcHV0ZWQ6IHtcblx0XHRcdGRhdGFMZW5ndGhOdW06ICh7IGRhdGFsZW5ndGggfSkgPT4gZ2V0UG9zaXRpdmVPckJhc2UoZGF0YWxlbmd0aCksXG5cdFx0XHRzZWxlY3RlZEl0ZW1zTnVtOiAoeyBzZWxlY3RlZGl0ZW1zIH0pID0+IGdldFBvc2l0aXZlT3JCYXNlKHNlbGVjdGVkaXRlbXMpLFxuXHRcdFx0TUlOX1JPV1NfVE9fU0NST0xMOiAoeyBtaW5yb3dzdG9zY3JvbGwgfSkgPT4gZ2V0UG9zaXRpdmVPckJhc2UobWlucm93c3Rvc2Nyb2xsLCA2MCksXG5cdFx0XHRQQUdFU19JTl9XUkFQOiAoeyBwYWdlc2lud3JhcCB9KSA9PiBnZXRQb3NpdGl2ZU9yQmFzZShwYWdlc2lud3JhcCwgMiwgMiksXG5cdFx0XHRzaG93TW9yZUxpbWl0TnVtOiAoeyBzaG93bW9yZWxpbWl0IH0pID0+IGdldFBvc2l0aXZlT3JCYXNlKHNob3dtb3JlbGltaXQpXG5cdFx0fSxcblx0XHRtZXRob2RzOiB7XG5cdFx0XHRkZXNlbGVjdChlKSB7XG5cdFx0XHRcdGNvbnN0IHsgc2VsZWN0ZWRJdGVtc051bSwgZ3JvdXBpZCwgbmFtZSB9ID0gdGhpcy5nZXQoKTtcblxuXHRcdFx0XHRpZiAoKGUua2V5ID09PSAnRXNjYXBlJyB8fCBlLmtleUNvZGUgPT09IDI3KSAmJiBzZWxlY3RlZEl0ZW1zTnVtKSB7XG5cdFx0XHRcdFx0Y29uc3QgZGVzZWxlY3RFdmVudCA9IG5ldyBDdXN0b21FdmVudCgna2luLWRlc2VsZWN0QWxsJywge1xuXHRcdFx0XHRcdFx0ZGV0YWlsOiB7XG5cdFx0XHRcdFx0XHRcdC8vIGdyb3VwSWQ6IGdyb3VwaWQsXG5cdFx0XHRcdFx0XHRcdC8vIG5hbWU6IG5hbWVcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRidWJibGVzOiB0cnVlLFxuXHRcdFx0XHRcdFx0Y2FuY2VsYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGNvbXBvc2VkOiB0cnVlLFxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KGRlc2VsZWN0RXZlbnQpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZXhwYW5kKCkge1xuXHRcdFx0XHRjb25zdCB7IGNvbGxhcHNlIH0gPSB0aGlzLmdldCgpO1xuXHRcdFx0XHRpZiAoY29sbGFwc2UpIHtcblx0XHRcdFx0XHR0aGlzLnNldCh7IGNvbGxhcHNlOiBmYWxzZSB9KTtcblx0XHRcdFx0XHR0aGlzLl9kZWxheWVkUmVuZGVyU3RhdGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGNvbGxhcHNlKCkge1xuXHRcdFx0XHRjb25zdCB7IGNvbGxhcHNlIH0gPSB0aGlzLmdldCgpO1xuXHRcdFx0XHRpZiAoIWNvbGxhcHNlKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXQoeyBjb2xsYXBzZTogdHJ1ZSB9KTtcblx0XHRcdFx0XHR0aGlzLl9kZWxheWVkUmVuZGVyU3RhdGUoKTtcblx0XHRcdFx0XHR0aGlzLnNjcm9sbFNjcm9sbFJvb3QodGhpcy5vZmZzZXRUb3ApO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0X2FkZFNjcm9sbGluZygpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2ZpbmREaW1lbnNpb25zKClcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLl9hZGp1c3RBbGxSb3dzSGVpZ2h0KE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG5cdFx0XHRcdFx0XHR0aGlzLl9sYXN0VG9wID0gLTE7XG5cdFx0XHRcdFx0XHR0aGlzLl9hY3R1YWxSb3cgPSAtMTAwO1xuXHRcdFx0XHRcdFx0dGhpcy5fbGlzdGVuVG9Sb290U2Nyb2xsKCk7XG5cdFx0XHRcdFx0XHR0aGlzLl9zY3JvbGxhYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgoKSA9PiB7fSk7XG5cdFx0XHR9LFxuXHRcdFx0X3JlbW92ZVNjcm9sbGluZygpIHtcblx0XHRcdFx0aWYgKHRoaXMuX3Njcm9sbGFibGUpIHtcblx0XHRcdFx0XHRjb25zdCB7IGtlZXBwb3NpdGlvbiB9ID0gdGhpcy5nZXQoKTtcblx0XHRcdFx0XHR0aGlzLl9hZGp1c3RBbGxSb3dzSGVpZ2h0KCk7XG5cblx0XHRcdFx0XHR0aGlzLnJlZnMudGFibGVTY3JvbGxQYW5lLnN0eWxlLnRvcCA9IDA7XG5cdFx0XHRcdFx0aWYgKCFrZWVwcG9zaXRpb24pIHtcblx0XHRcdFx0XHRcdHRoaXMuc2Nyb2xsU2Nyb2xsUm9vdCh0aGlzLm9mZnNldFRvcCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuX3Njcm9sbGFibGUgPSBmYWxzZTtcblx0XHRcdFx0XHR0aGlzLl91bkxpc3RlblRvUm9vdFNjcm9sbCgpOy8vIGRvbnQgbW92ZVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0X2xpc3RlblRvUm9vdFNjcm9sbCgpIHtcblx0XHRcdFx0aWYgKCF0aGlzLl9saXN0ZW5pbmdUb1Jvb3RTY3JvbGwpIHtcblx0XHRcdFx0XHR0aGlzLl9zY3JvbGxSb290LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5fcm9vdFNjcm9sbEV2ZW50TmFtZSwgdGhpcy5fb25Sb290U2Nyb2xsKTtcblx0XHRcdFx0XHR0aGlzLl9saXN0ZW5pbmdUb1Jvb3RTY3JvbGwgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0X3VuTGlzdGVuVG9Sb290U2Nyb2xsKG9uZGVzdHJveSkge1xuXHRcdFx0XHRpZiAodGhpcy5fbGlzdGVuaW5nVG9Sb290U2Nyb2xsKSB7XG5cdFx0XHRcdFx0Y29uc3QgeyB3YXRjaHNjcm9sbHBvcyB9ID0gdGhpcy5nZXQoKTtcblx0XHRcdFx0XHRpZiAob25kZXN0cm95IHx8ICghd2F0Y2hzY3JvbGxwb3MgJiYgIXRoaXMuX3Njcm9sbGFibGUpKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9zY3JvbGxSb290LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5fcm9vdFNjcm9sbEV2ZW50TmFtZSwgdGhpcy5fb25Sb290U2Nyb2xsKTtcblx0XHRcdFx0XHRcdHRoaXMuX2xpc3RlbmluZ1RvUm9vdFNjcm9sbCA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdC8vIGRldGVjdCBpZiB3ZSBuZWVkIHRvIHByZWxvYWQgbmV4dCBvciBwcmV2aW91cyByb3dzIHBhZ2UgdG8gaGF2ZSBzbW9vdGggc2Nyb2xsaW5nXG5cdFx0XHRzaG93Um93cyhyb3cgPSAwLCBuZXh0ID0gdHJ1ZSwgcmVsb2FkID0gZmFsc2UpIHtcblx0XHRcdFx0aWYgKG5leHQpIHtcblx0XHRcdFx0XHRpZiAocmVsb2FkIHx8IHJvdyArIHRoaXMuX3Jvd3NQZXJQYWdlID4gdGhpcy5fYWN0dWFsUm93ICsgdGhpcy5fcm93c1BlcldyYXApIHtcblx0XHRcdFx0XHRcdHRoaXMuX2xvYWRTY3JvbGxlZFJvd3Mocm93ICsgdGhpcy5fcm93c1BlclBhZ2UsIHJlbG9hZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHJlbG9hZCB8fCByb3cgPCB0aGlzLl9hY3R1YWxSb3cpIHtcblx0XHRcdFx0XHR0aGlzLl9sb2FkU2Nyb2xsZWRSb3dzKHJvdywgcmVsb2FkKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdC8vIHByZWxvYWQgcmFuZ2Ugb2Ygcm93cyBmb3Igc21vb3RoIHNjcm9sbGluZ1xuXHRcdFx0X2xvYWRTY3JvbGxlZFJvd3Moc3RhcnRGcm9tUm93LCByZWxvYWQgPSBmYWxzZSkge1xuXHRcdFx0XHRjb25zdCB7IGRhdGFMZW5ndGhOdW0gfSA9IHRoaXMuZ2V0KCk7XG5cdFx0XHRcdGxldCBzdGFydFJvdyA9IHN0YXJ0RnJvbVJvdyAtIHRoaXMuX3Jvd3NQZXJQYWdlO1xuXHRcdFx0XHRpZiAoc3RhcnRSb3cgKyB0aGlzLl9yb3dzUGVyV3JhcCA+IGRhdGFMZW5ndGhOdW0pIHtcblx0XHRcdFx0XHRzdGFydFJvdyA9IGRhdGFMZW5ndGhOdW0gLSB0aGlzLl9yb3dzUGVyV3JhcDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoc3RhcnRSb3cgPCAwKSB7XG5cdFx0XHRcdFx0c3RhcnRSb3cgPSAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghcmVsb2FkICYmIHRoaXMuX2FjdHVhbFJvdyA9PT0gc3RhcnRSb3cpIHJldHVybjtcblx0XHRcdFx0Y29uc3QgZW5kUm93ID0gZGF0YUxlbmd0aE51bSA+PSBzdGFydFJvdyArIHRoaXMuX3Jvd3NQZXJXcmFwID8gc3RhcnRSb3cgKyB0aGlzLl9yb3dzUGVyV3JhcCA6IGRhdGFMZW5ndGhOdW07XG5cdFx0XHRcdGlmICh0aGlzLnJlZnMudGFibGVTY3JvbGxQYW5lKSB7XG5cdFx0XHRcdFx0dGhpcy5yZWZzLnRhYmxlU2Nyb2xsUGFuZS5zdHlsZS50b3AgPSAoc3RhcnRSb3cgKiB0aGlzLl9yb3dIZWlnaHQpICsgJ3B4Jztcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9hY3R1YWxSb3cgPSBzdGFydFJvdztcblx0XHRcdFx0dGhpcy5fbG9hZFJvd3Moc3RhcnRSb3csIGVuZFJvdyk7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gbm90aWZ5IG93bmVyIGNvbXBvbmVudCBieSBldmVudCB0byBsb2FkIHNwZWNpZmllZCByYW5nZSBvZiByb3dzIHRvIHRhYmxlLWNvbnRlbnQgc2xvdFxuXHRcdFx0X2xvYWRSb3dzKHN0YXJ0Um93LCBlbmRSb3csIGhpZGVSZXN1bHQpIHtcblx0XHRcdFx0Y29uc3QgeyBkYXRhbmFtZSB9ID0gdGhpcy5nZXQoKTtcblx0XHRcdFx0aWYgKGhpZGVSZXN1bHQpIHtcblx0XHRcdFx0XHR0aGlzLnJlZnMudGFibGVTY3JvbGxQYW5lLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcblx0XHRcdFx0XHR0aGlzLl9yZXN1bHRIaWRkZW4gPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2tpbi10YWJsZTpzaG93cm93cycsIHtcblx0XHRcdFx0XHRkZXRhaWw6IHtcblx0XHRcdFx0XHRcdHN0YXJ0OiBzdGFydFJvdyxcblx0XHRcdFx0XHRcdGVuZDogZW5kUm93LFxuXHRcdFx0XHRcdFx0ZGF0YW5hbWU6IGRhdGFuYW1lXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRidWJibGVzOiB0cnVlXG5cdFx0XHRcdH0pKTtcblx0XHRcdFx0aWYgKCFoaWRlUmVzdWx0ICYmIHRoaXMuX3Jlc3VsdEhpZGRlbikge1xuXHRcdFx0XHRcdHRoaXMuX3RpbWVySGlkZVJlc3VsdCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5yZWZzLnRhYmxlU2Nyb2xsUGFuZS5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuXHRcdFx0XHRcdFx0dGhpcy5fcmVzdWx0SGlkZGVuID0gZmFsc2U7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRzY3JvbGxTY3JvbGxSb290KHkpIHtcblx0XHRcdFx0aWYgKCF0aGlzLl9zY3JvbGxSb290KSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuX2lzSW5LaW5WaWV3KSB7XG5cdFx0XHRcdFx0dGhpcy5fc2Nyb2xsUm9vdC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY29udGVudC1zY3JvbGx0bycsIHtcblx0XHRcdFx0XHRcdGRldGFpbDoge1xuXHRcdFx0XHRcdFx0XHRzY3JvbGxUbzogeVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLl9zY3JvbGxSb290LnNjcm9sbFRvID0geTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdC8vIGFkanVzdCBoZWlnaHQgb2Ygd3JhcHBlciB3aGljaCBjb250YWlucyBzY3JvbGxhYmxlIHJvd3Ncblx0XHRcdC8vIGV4YW1wbGU6IHdlIHNob3dzIDMwIHJvd3MgaW4gRE9NIG9mIDEwMDAgcmVjb3JkcyB0aGVuIHdlIGFkanVzdCBoZWlnaHQgdG8gMTAwMCByb3dzIHRvIGFkanVzdCBzY3JvbGwgcm9vdCBub2RlIGhlaWdodCBhbmQgaXRzIHNjcm9sbGJhclxuXHRcdFx0X2FkanVzdEFsbFJvd3NIZWlnaHQocm93cykge1xuXHRcdFx0XHRsZXQgaGVpZ2h0O1xuXHRcdFx0XHRjb25zdCB7IGRhdGFMZW5ndGhOdW0gfSA9IHRoaXMuZ2V0KCk7XG5cdFx0XHRcdGlmIChyb3dzID09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGhlaWdodCA9ICdhdXRvJztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRoZWlnaHQgPSBNYXRoLm1pbihyb3dzLCBkYXRhTGVuZ3RoTnVtKSAqIHRoaXMuX3Jvd0hlaWdodCArICdweCc7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5yZWZzLmFsbFJvd3NIZWlnaHQuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuXHRcdFx0fSxcblx0XHRcdF9oYW5kbGVTY3JvbGwodG9wLCBldmVudCkge1xuXHRcdFx0XHRjb25zdCB7IHdhdGNoc2Nyb2xscG9zIH0gPSB0aGlzLmdldCgpO1xuXG5cdFx0XHRcdGlmICh0aGlzLl9zY3JvbGxhYmxlKSB7XG5cdFx0XHRcdFx0Y29uc3QgbmV4dCA9IHRvcCA+IHRoaXMuX2xhc3RUb3A7XG5cdFx0XHRcdFx0Y29uc3Qgc3RhcnRSb3cgPSB0b3AgPiAwID8gTWF0aC5mbG9vcih0b3AgLyB0aGlzLl9yb3dIZWlnaHQpIDogMDtcblx0XHRcdFx0XHR0aGlzLl9sYXN0VG9wID0gdG9wO1xuXHRcdFx0XHRcdHRoaXMuc2hvd1Jvd3Moc3RhcnRSb3csIG5leHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHdhdGNoc2Nyb2xscG9zKSB7XG5cdFx0XHRcdFx0Y29uc3QgcmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0XHRcdFx0Y29uc3QgYm90dG9tU2Nyb2xsUG9zID0gcmVjdC5ib3R0b20gLSBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCArIHRoaXMuX3Njcm9sbFJvb3QuZ2V0U2Nyb2xsVG9wKCk7XG5cblx0XHRcdFx0XHRpZiAoYm90dG9tU2Nyb2xsUG9zID4gMCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2Nyb2xsUG9zRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3Njcm9sbFBvcycsIHtcblx0XHRcdFx0XHRcdFx0ZGV0YWlsOiB7XG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudDogZXZlbnQuZGV0YWlsLnNjcm9sbFBvcyxcblx0XHRcdFx0XHRcdFx0XHRtYXg6IGJvdHRvbVNjcm9sbFBvcyxcblx0XHRcdFx0XHRcdFx0XHRzY3JvbGxUbzogdGhpcy5zY3JvbGxTY3JvbGxSb290QmluZGVkXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KHNjcm9sbFBvc0V2ZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRfZ2V0Um93SGVpZ2h0KCkge1xuXHRcdFx0XHRpZiAodGhpcy5fcm93SGVpZ2h0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX3Jvd0hlaWdodDtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCByb3dFbCA9IHRoaXMucXVlcnlTZWxlY3RvcignLmtpbl90YWJsZV9fcm93Jyk7XG5cdFx0XHRcdGlmIChyb3dFbCkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLl9yb3dIZWlnaHQgPSByb3dFbC5vZmZzZXRIZWlnaHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHR9LFxuXHRcdFx0Ly8gY2FjaGVkIHByb21pc2Ugd2hpY2ggcmV0dXJucyBzdWNjZXNzIGlmIHdlIGtub3dzIGhlaWdodCBvZiByb3cgYW5kIHZpZXcgcG9ydCBpbiB3aGljaCB3ZSBzY3JvbGxzLi4uXG5cdFx0XHQvLyBpZiBjb250ZW50IHNsb3QgaXMgZW1wdHkgdGhlbiB3ZSBub3RpZnkgb3duZXIgY29tcG9uZW50IGJ5IGV2ZW50IHRvIHB1dCBvbmUgcm93IGludG8gY29udGVudCBzbG90XG5cdFx0XHRfZmluZERpbWVuc2lvbnMoKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9maW5kRGltZW5zaW9uc1Byb21pc2UpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5fZmluZERpbWVuc2lvbnNQcm9taXNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMuX2ZpbmREaW1lbnNpb25zUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0XHRpZiAodGhpcy5fc2Nyb2xsUm9vdCkge1xuXHRcdFx0XHRcdFx0aWYgKCF0aGlzLl9nZXRSb3dIZWlnaHQoKSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9sb2FkUm93cygwLCAxLCB0cnVlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLl90aW1lclJvd0RpbWVuc2lvbnMgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLl9zY3JvbGxSb290KSB7XG5cdFx0XHRcdFx0XHRcdGlmICghdGhpcy5fZ2V0Um93SGVpZ2h0KCkpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9maW5kRGltZW5zaW9uc1Byb21pc2UgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRyZWplY3QoJ25vIHJvd3MgaW4gZGF0YScpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc0luS2luVmlldykge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX3ZpZXdIZWlnaHQgPSB0aGlzLmNsb3Nlc3QoJy5raW5fcGFnZV9fY29udGVudCcpLm9mZnNldEhlaWdodDtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl92aWV3SGVpZ2h0ID0gdGhpcy5fc2Nyb2xsUm9vdC5vZmZzZXRIZWlnaHQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGhpcy5fcm93c1BlclBhZ2UgPSBNYXRoLmNlaWwodGhpcy5fdmlld0hlaWdodCAvIHRoaXMuX3Jvd0hlaWdodCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX3Jvd3NQZXJXcmFwID0gdGhpcy5fcm93c1BlclBhZ2UgKiB0aGlzLmdldCgpLlBBR0VTX0lOX1dSQVA7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2ZpbmREaW1lbnNpb25zUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5fZ2V0Um93SGVpZ2h0KCkpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9maW5kRGltZW5zaW9uc1Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fZmluZERpbWVuc2lvbnNQcm9taXNlID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0cmVqZWN0KCdubyByb3dzIGluIGRhdGEnKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHQvLyBhc3luYyBjYWxsZWQgYnkgZGF0YSBjaGFuZ2VzIGluIG9udXBkYXRlKCkgb3Igd2hlbiBvbmNyZWF0ZSgpIGZpbmFsbHkgYXBwZW5kZWQgdG8gRE9NIChpZiBmZWF0dXJlIHJlcXVpcmVzIGl0KVxuXHRcdFx0Ly8gbmV2ZXIgY2FsbCBpdCBkaXJlY3RseSBpbnN0ZWFkIHVzZSBfZGVsYXllZFJlbmRlclN0YXRlKClcblx0XHRcdC8vIF9yZW5kZXJlZEluU2xvdCAtIG5vdyB3ZSBjYW4gZ2V0IGRpbWVuc2lvbnMgb3IgdHJhdmVyc2UgRE9NXG5cdFx0XHQvLyBfZmluZERpbWVuc2lvbnMoKSAtIHByb21pc2Ugd2hpY2ggZ2V0cyByb3cgZGltZW5zaW9uc1xuXHRcdFx0X3JlbmRlclN0YXRlKCkge1xuXHRcdFx0XHRpZiAoIXRoaXMuX2NvbXBvbmVudFJlYWR5KSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgeyBkYXRhbmFtZSwgZGF0YUxlbmd0aE51bSwgTUlOX1JPV1NfVE9fU0NST0xMLCBzaG93TW9yZUxpbWl0TnVtLCBjb2xsYXBzZSwga2VlcHBvc2l0aW9uLCBpc0luS2luUGFnZSB9ID0gdGhpcy5nZXQoKTtcblx0XHRcdFx0aWYgKHRoaXMuX3Njcm9sbFJvb3QpIHsvLyBzbWFydCBzY3JvbGwgc3VwcG9ydGVkXG5cdFx0XHRcdFx0aWYgKCFkYXRhbmFtZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChzaG93TW9yZUxpbWl0TnVtICYmIGNvbGxhcHNlKSB7Ly8gY29sbGFwc2VkXG5cdFx0XHRcdFx0XHR0aGlzLl9yZW1vdmVTY3JvbGxpbmcoKTtcblx0XHRcdFx0XHRcdHRoaXMuX2xvYWRSb3dzKDAsIGRhdGFMZW5ndGhOdW0gPCBzaG93TW9yZUxpbWl0TnVtID8gZGF0YUxlbmd0aE51bSA6IHNob3dNb3JlTGltaXROdW0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7Ly8gZXhwYW5kZWRcblx0XHRcdFx0XHRcdGlmIChkYXRhTGVuZ3RoTnVtID4gTUlOX1JPV1NfVE9fU0NST0xMKSB7Ly8gbWFueSByb3dzIC0+IGFwcGx5IHNtYXJ0IHNjcm9sbFxuXHRcdFx0XHRcdFx0XHR0aGlzLl9hZGRTY3JvbGxpbmcoKS50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgc3RhcnRSb3dcblx0XHRcdFx0XHRcdFx0XHRpZiAoa2VlcHBvc2l0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoaXNJbktpblBhZ2UpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRSb3cgPSBNYXRoLmZsb29yKHRoaXMuX3Njcm9sbFJvb3QuZ2V0U2Nyb2xsVG9wKCkgLyB0aGlzLl9yb3dIZWlnaHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRSb3cgPSBNYXRoLmZsb29yKCh0aGlzLl9zY3JvbGxSb290LnNjcm9sbFRvcCAtIHRoaXMub2Zmc2V0VG9wKSAvIHRoaXMuX3Jvd0hlaWdodCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnNob3dSb3dzKHN0YXJ0Um93LCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuc2hvd1Jvd3MoKTtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuc2Nyb2xsU2Nyb2xsUm9vdCh0aGlzLm9mZnNldFRvcCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7Ly8gcmVuZGVyIGFsbCByb3dzIHdpdGhvdXQgc21hcnQgc2Nyb2xsXG5cdFx0XHRcdFx0XHRcdHRoaXMuX3JlbW92ZVNjcm9sbGluZygpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9sb2FkUm93cygwLCBkYXRhTGVuZ3RoTnVtKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHsvLyBiYXNpYyBzdHlsZWQgdGFibGVcblx0XHRcdFx0XHQvLyBpZiByYWN0aXZlQWRhcHRlci9hcHAvbml0cm8vdWkvcGx1Z2lucy9raW5UYWJsZVNjcm9sbGFibGUuanMgdXNlZC4uLiBmaWxlcyBWUyBmaWxlc19yb3dzIGluIGNvbnRlbnQgc2xvdFxuXHRcdFx0XHRcdGlmIChkYXRhbmFtZSkge1xuXHRcdFx0XHRcdFx0dGhpcy5fbG9hZFJvd3MoMCwgZGF0YUxlbmd0aE51bSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gbm9uLXNtYXJ0c2Nyb2xsIG9yIG5vLWRhdGEgdmFyaWFudCBqdXN0IHVzZXMgb3ZlcmZsb3cgdG8gZG8gZXhwYW5kL2NvbGxhcHNlXG5cdFx0XHRcdFx0aWYgKHNob3dNb3JlTGltaXROdW0pIHtcblx0XHRcdFx0XHRcdGlmIChjb2xsYXBzZSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9maW5kRGltZW5zaW9ucygpXG5cdFx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5yZWZzLmFsbFJvd3NIZWlnaHQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX2FkanVzdEFsbFJvd3NIZWlnaHQoc2hvd01vcmVMaW1pdE51bSk7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZXJyb3IgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcihlcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9hZGp1c3RBbGxSb3dzSGVpZ2h0KCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMucmVmcy5hbGxSb3dzSGVpZ2h0LnN0eWxlLm92ZXJmbG93ID0gJ3Zpc2libGUnO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdC8vIGFnZ3JlZ2F0ZSBhbGwgb251cGRhdGUgY2hhbmdlcyB0byBvbmUgcmVuZGVyIGN5Y2xlXG5cdFx0XHRfZGVsYXllZFJlbmRlclN0YXRlKCkge1xuXHRcdFx0XHR0aGlzLl90aW1lckRlbGF5UmVuZGVyICYmIGNsZWFyVGltZW91dCh0aGlzLl90aW1lckRlbGF5UmVuZGVyKTtcblx0XHRcdFx0dGhpcy5fdGltZXJEZWxheVJlbmRlciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX3JlbmRlclN0YXRlKCk7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fSxcblx0XHRcdC8vIG9uY3JlYXRlIGhhcHBlbnMgYmVmb3JlIHByb3BzIGFyZSBzZXQgKGluaXQgbG9naWMgaXMgZHJpdmVuIGJ5IHRoZXNlIHByb3BzKVxuXHRcdFx0X2luaXRXaXRoUHJvcHMoKSB7XG5cdFx0XHRcdGNvbnN0IHsgc2Nyb2xscm9vdHNlbGVjdG9yIH0gPSB0aGlzLmdldCgpO1xuXHRcdFx0XHR0aGlzLl9jb21wb25lbnRSZWFkeSA9IGZhbHNlO1xuXHRcdFx0XHQvLyBmZWF0dXJlcyB0aGF0IG5lZWRzIGRpbWVuc2lvbnMgb3IgYmUgYWJsZSB0byB0cmF2ZXJzZSBkb21cblx0XHRcdFx0aWYgKHNjcm9sbHJvb3RzZWxlY3Rvcikge1xuXHRcdFx0XHRcdC8vIHdvcmthcm91bmQgdG8gaGF2ZSBzdGF0ZSB3aGVuIGNvbXBvbmVudCBpcyByZW5kZXIgaW4gc2xvdFxuXHRcdFx0XHRcdGxldCBsb29wQ291bnRlciA9IDA7XG5cdFx0XHRcdFx0Y29uc3QgbWF4TG9vcHMgPSAxNjtcblx0XHRcdFx0XHRjb25zdCBsb29wSW50ZXJ2YWwgPSAyNTA7XG5cdFx0XHRcdFx0dGhpcy5fdGltZXJJblNsb3QgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRsb29wQ291bnRlcisrO1xuXHRcdFx0XHRcdFx0aWYgKGxvb3BDb3VudGVyID4gbWF4TG9vcHMgfHwgdGhpcy5yZWZzLmFsbFJvd3NIZWlnaHQpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fdGltZXJJblNsb3QgPSBjbGVhckludGVydmFsKHRoaXMuX3RpbWVySW5TbG90KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICghdGhpcy5yZWZzLmFsbFJvd3NIZWlnaHQpIHsvLyBjaGVjayBpZiBjb21wb25lbnQgaXMgcmVuZGVyZWQgYW5kIGFwcGVuZGVkIHRvIERPTVxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIGZpbmQgcGFyZW50IGNvbXBvbmVudCBpbiB3aGljaCB3ZSBzY3JvbGxcblx0XHRcdFx0XHRcdGlmIChzY3JvbGxyb290c2VsZWN0b3IpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5faXNJbktpblZpZXcgPSBzY3JvbGxyb290c2VsZWN0b3IuaW5kZXhPZigna2luLXZpZXcnKSAhPT0gLTE7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX3Njcm9sbFJvb3QgPSB0aGlzLmNsb3Nlc3Qoc2Nyb2xscm9vdHNlbGVjdG9yKTtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX3Njcm9sbFJvb3QpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBoYW5kbGUgc2Nyb2xsIGZyb20gc2hhZG93IGRvbSBvZiBraW4tdmlldyBvciBjbGFzc2ljIGRvbSBub2RlXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzSW5LaW5WaWV3KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9yb290U2Nyb2xsRXZlbnROYW1lID0gJ2tpbnZpZXctc2Nyb2xsJztcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX29uUm9vdFNjcm9sbCA9IGV2ZW50ID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5faGFuZGxlU2Nyb2xsKGV2ZW50LmRldGFpbC5zY3JvbGxQb3MgLSBldmVudC5kZXRhaWwuc2xvdFBvcyAtIHRoaXMub2Zmc2V0VG9wLCBldmVudCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gbm90aWZ5IGtpbi12aWV3IHRvIHN0YXJ0IGRpc3BhdGNoaW5nIGtpbi12aWV3OnNjcm9sbCBldmVudCB0byBwcm9wYWdhdGUgc2Nyb2xsaW5nIHRvIHRoaXMgY29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zY3JvbGxSb290LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdraW4tdmlldzpmaXJlLXNjcm9sbGluZycpKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fcm9vdFNjcm9sbEV2ZW50TmFtZSA9ICdzY3JvbGwnO1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fb25Sb290U2Nyb2xsID0gZXZlbnQgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9oYW5kbGVTY3JvbGwoZXZlbnQudGFyZ2V0LnNjcm9sbFRvcCAtIHRoaXMub2Zmc2V0VG9wLCBldmVudCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCdraW4gdGFibGUgY2FudCBmaW5kIHNjcm9sbGluZyB3cmFwIFwiJyArIHNjcm9sbHJvb3RzZWxlY3RvciArICdcIicpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLl9jb21wb25lbnRJc1JlYWR5KCk7XG5cdFx0XHRcdFx0fSwgbG9vcEludGVydmFsKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBiYXNpYyBzdHlsZWQgdGFibGVcblx0XHRcdFx0XHR0aGlzLl9jb21wb25lbnRJc1JlYWR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRfY29tcG9uZW50SXNSZWFkeSgpIHtcblx0XHRcdFx0dGhpcy5fY29tcG9uZW50UmVhZHkgPSB0cnVlO1xuXHRcdFx0XHR0aGlzLl9kZWxheWVkUmVuZGVyU3RhdGUoKTtcblx0XHRcdFx0dGhpcy5oYW5kbGVXYXRjaFNjcm9sbCgpO1xuXHRcdFx0fSxcblx0XHRcdGhhbmRsZVdhdGNoU2Nyb2xsKCkge1xuXHRcdFx0XHRpZiAodGhpcy5fY29tcG9uZW50UmVhZHkpIHtcblx0XHRcdFx0XHR0aGlzLmdldCgpLndhdGNoc2Nyb2xscG9zID8gdGhpcy5fbGlzdGVuVG9Sb290U2Nyb2xsKCkgOiB0aGlzLl91bkxpc3RlblRvUm9vdFNjcm9sbCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvbmNyZWF0ZSgpIHtcblx0XHRcdHRoaXMuc2Nyb2xsU2Nyb2xsUm9vdEJpbmRlZCA9IHRoaXMuc2Nyb2xsU2Nyb2xsUm9vdC5iaW5kKHRoaXMpO1xuXHRcdH0sXG5cdFx0b25kZXN0cm95KCkge1xuXHRcdFx0dGhpcy5fdGltZXJDb21wb25lbnRSZWFkeSAmJiBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJDb21wb25lbnRSZWFkeSk7XG5cdFx0XHR0aGlzLl90aW1lckluU2xvdCAmJiBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJJblNsb3QpO1xuXHRcdFx0dGhpcy5fdGltZXJIaWRlUmVzdWx0ICYmIGNsZWFyVGltZW91dCh0aGlzLl90aW1lckhpZGVSZXN1bHQpO1xuXHRcdFx0dGhpcy5fdGltZXJEZWxheVJlbmRlciAmJiBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJEZWxheVJlbmRlcik7XG5cdFx0XHR0aGlzLl90aW1lclJvd0RpbWVuc2lvbnMgJiYgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyUm93RGltZW5zaW9ucyk7XG5cdFx0XHR0aGlzLl91bkxpc3RlblRvUm9vdFNjcm9sbCh0cnVlKTtcblx0XHR9LFxuXHRcdG9udXBkYXRlKHsgY2hhbmdlZCwgY3VycmVudCwgcHJldmlvdXMgfSkge1xuXHRcdFx0aWYgKHRoaXMuX2NvbXBvbmVudFJlYWR5ID09IG51bGwgJiYgT2JqZWN0LnZhbHVlcyhjaGFuZ2VkKVswXSA9PT0gMSkgey8vIGZpbmFsbHkgc3ZlbHRlIHdpbGwgc2V0IHByb3BzXG5cdFx0XHRcdHRoaXMuX3RpbWVyQ29tcG9uZW50UmVhZHkgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9pbml0V2l0aFByb3BzKCk7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2hhbmdlZC5kYXRhbmFtZSB8fCBjaGFuZ2VkLmRhdGFsZW5ndGgpIHtcblx0XHRcdFx0dGhpcy5fZGVsYXllZFJlbmRlclN0YXRlKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjaGFuZ2VkLnNob3dtb3JlbGltaXQgPT09IHRydWUpIHtcblx0XHRcdFx0dGhpcy5zZXQoeyBjb2xsYXBzZTogQm9vbGVhbihjdXJyZW50LnNob3dNb3JlTGltaXROdW0pIH0pO1xuXHRcdFx0XHR0aGlzLl9kZWxheWVkUmVuZGVyU3RhdGUoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNoYW5nZWQud2F0Y2hzY3JvbGxwb3MgPT09IHRydWUpIHtcblx0XHRcdFx0dGhpcy5oYW5kbGVXYXRjaFNjcm9sbCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2hhbmdlZC5zZWxlY3RlZEl0ZW1zTnVtKSB7XG5cdFx0XHRcdGNvbnN0IGRlc2VsZWN0RXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2tpbi1pc0FjdGlvbkJhclZpc2libGUnLCB7XG5cdFx0XHRcdFx0ZGV0YWlsOiB7XG5cdFx0XHRcdFx0XHRpc1Zpc2libGU6IGN1cnJlbnQuc2VsZWN0ZWRJdGVtc051bSA+IDBcblx0XHRcdFx0XHRcdC8vIGdyb3VwSWQ6IGN1cnJlbnQuZ3JvdXBpZCxcblx0XHRcdFx0XHRcdC8vIG5hbWU6IGN1cnJlbnQubmFtZVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0YnViYmxlczogdHJ1ZSxcblx0XHRcdFx0XHRjYW5jZWxhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdGNvbXBvc2VkOiB0cnVlXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChjdXJyZW50LnNlbGVjdGVkSXRlbXNOdW0gPT09IDApIHtcblx0XHRcdFx0XHR0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnYW55c2VsZWN0ZWQnKTtcblx0XHRcdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoZGVzZWxlY3RFdmVudCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY3VycmVudC5zZWxlY3RlZEl0ZW1zTnVtID4gMCAmJiBwcmV2aW91cy5zZWxlY3RlZEl0ZW1zTnVtID09PSAwKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoJ2FueXNlbGVjdGVkJywgJycpO1xuXHRcdFx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudChkZXNlbGVjdEV2ZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbjwvc2NyaXB0PlxuXG5cbjxzdHlsZSB0eXBlPVwidGV4dC9zdHlsdXNcIj5cblxuKlxuKjpiZWZvcmVcbio6YWZ0ZXJcblx0LW1vei1ib3gtc2l6aW5nIGJvcmRlci1ib3hcblx0LXdlYmtpdC1ib3gtc2l6aW5nIGJvcmRlci1ib3hcblx0Ym94LXNpemluZyBib3JkZXItYm94XG5cbi8vIGxpc3QvdGFibGVcbi5raW5fdGFibGVcblx0cG9zaXRpb24gcmVsYXRpdmVcblx0dGV4dC1hbGlnbiBzdGFydFxuXG5cdCZfX2VtcHR5XG5cdFx0cGFkZGluZyAyNnJlbSAzcmVtIDBcblx0XHRtYXJnaW4tdG9wIDQlXG5cdFx0dGV4dC1hbGlnbiBjZW50ZXJcblx0XHRmb250LXNpemUgdmFyKC0tZm9udC1zaXplLWxhcmdlKVxuXHRcdGNvbG9yIHZhcigtLWNvbG9yLXRleHQtc2Vjb25kYXJ5KVxuXHRcdHBvc2l0aW9uIHJlbGF0aXZlXG5cblx0XHQmX19pY29uXG5cdFx0a2luLWljb25cblx0XHRcdHBvc2l0aW9uIGFic29sdXRlXG5cdFx0XHR0b3AgMHJlbVxuXHRcdFx0bGVmdCAwXG5cdFx0XHRyaWdodCAwXG5cdFx0XHRmb250LXNpemUgNDRyZW1cblxuXHRcdGtpbi1pY29uXG5cdFx0XHR0cmFuc2Zvcm0gc2NhbGUoMilcblxuXHQmLi1lbXB0eVxuXHRcdHBvaW50ZXItZXZlbnRzIG5vbmVcblxuXHRcdC5raW5fdGFibGVfX2hlYWRlclxuXHRcdFx0b3BhY2l0eSAuNVxuXG5cdCYuLWRpc2FibGVkXG5cdFx0cG9pbnRlci1ldmVudHMgbm9uZVxuXHRcdG9wYWNpdHkgLjNcblxuXHQmX19ib2R5XG5cdFx0cG9zaXRpb24gcmVsYXRpdmVcblx0XHRwYWRkaW5nLWxlZnQgdmFyKC0tdGFibGUtY2hlY2tib3gtc2l6ZSlcblx0XHRwYWRkaW5nLXJpZ2h0IHZhcigtLXRhYmxlLWNoZWNrYm94LXNpemUpXG5cdFx0bWFyZ2luLWxlZnQgY2FsYyggdmFyKC0tdGFibGUtY2hlY2tib3gtc2l6ZSkgKiAtMSApXG5cdFx0bWFyZ2luLXJpZ2h0IGNhbGMoIHZhcigtLXRhYmxlLWNoZWNrYm94LXNpemUpICogLTEgKVxuXG5cdCZfX3Njcm9sbC1wYW5lXG5cdFx0cG9zaXRpb24gcmVsYXRpdmVcblxuXHQmX19leHBhbmRcblx0XHR0ZXh0LWFsaWduIGNlbnRlclxuXHRcdG1hcmdpbiAycmVtIGF1dG8gMCAhaW1wb3J0YW50XG5cbjwvc3R5bGU+XG4iLCI8c3ZlbHRlOndpbmRvdy8+XG5cbjxkaXZcblx0Y2xhc3M9XCJraW5fdmlldyB7ZGlyICE9ICdsdHInID8gJy0nICsgZGlyIDogJyd9IHsoaXNBY3Rpb24gPT09IHRydWUgfHwgYWx3YXlzU2hvd0FjdGlvbmJhcikgPyAnLWFjdGlvbnMnIDogJyd9IHtjc3NjbHN9XCJcblx0b246c2Nyb2xsPVwic2Nyb2xsaW5nKClcIlxuXHRyZWY6cGFuZT5cblxuXHR7I2lmIGxvYWRpbmcgPT09ICd0cnVlJyB8fCBsb2FkaW5nID09PSB0cnVlfVxuXG5cdFx0PGtpbi1sb2FkaW5nIGZ1bGxzY3JlZW49XCJ0cnVlXCIgLz5cblxuXHR7OmVsc2V9XG5cblx0XHQ8IS0tIE1vZHVsZSBkZXNjcmlwdGlvbiAtLT5cblx0XHQ8ZGl2IGNsYXNzPVwia2luX2Rlc2NyaXB0aW9uIHtkZXNjT3BhY2l0eSA8IC4xID8gJy1uby1ldmVudHMnIDogJyd9XCIgc3R5bGU9XCJvcGFjaXR5OntkZXNjT3BhY2l0eX07XCI+XG5cdFx0XHQ8c2xvdCBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuXHRcdDwvZGl2PlxuXG5cdFx0PCEtLSBNb2R1bGUgQ1RBcyAtLT5cblx0XHQ8ZGl2IGNsYXNzPVwia2luX2N0YSB7Y3RhT3BhY2l0eSA8IC4xID8gJy1uby1ldmVudHMnIDogJyd9XCIgc3R5bGU9XCJvcGFjaXR5OntjdGFPcGFjaXR5fTtcIj5cblx0XHRcdDxzbG90IG5hbWU9XCJjdGFcIiAvPlxuXHRcdDwvZGl2PlxuXG5cdFx0PCEtLSBNb2R1bGUgY3VzdG9tIGNvbnRlbnQgLS0+XG5cdFx0PGRpdiBjbGFzcz1cImtpbl92aWV3X19jb250ZW50XCIgcmVmOnNjcm9sbEVsPlxuXHRcdFx0PHNsb3QgbmFtZT1cInZpZXctY29udGVudFwiIC8+XG5cdFx0PC9kaXY+XG5cblx0ey9pZn1cblxuPC9kaXY+XG5cbjwhLS0gVGFibGUgYWN0aW9uYmFyIC0tPlxueyNpZiAhYWx3YXlzSGlkZUFjdGlvbmJhciAmJiAoaXNBY3Rpb24gPT09IHRydWUgfHwgYWx3YXlzU2hvd0FjdGlvbmJhcil9XG5cdDxkaXYgY2xhc3M9XCJraW5fYWN0aW9uc1wiPlxuXHRcdDxzbG90IG5hbWU9XCJ2aWV3LWFjdGlvbnNcIiAvPlxuXHQ8L2Rpdj5cbnsvaWZ9XG5cbjxzY3JpcHQ+XG5cdGV4cG9ydCBkZWZhdWx0IHtcblx0XHR0YWc6ICdraW4tdmlldycsXG5cdFx0cHJvcHM6IFsnY3NzY2xzJywgJ2xvYWRpbmcnLCAnYWN0aW9uYmFyJ10sXG5cdFx0ZGF0YSgpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRpcjogJ2x0cicsXG5cdFx0XHRcdGNzc2NsczogJycsXG5cdFx0XHRcdGRlc2NPcGFjaXR5OiAxLFxuXHRcdFx0XHRjdGFPcGFjaXR5OiAxLFxuXHRcdFx0XHRpc0FjdGlvbjogZmFsc2UsXG5cdFx0XHRcdGxvYWRpbmc6IGZhbHNlLFxuXHRcdFx0XHRhY3Rpb25iYXI6IG51bGxcblx0XHRcdH1cblx0XHR9LFxuXHRcdGNvbXB1dGVkOiB7XG5cdFx0XHRhbHdheXNTaG93QWN0aW9uYmFyOiAoeyBhY3Rpb25iYXIgfSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYWN0aW9uYmFyID09PSB0cnVlIHx8IGFjdGlvbmJhciA9PT0gJ3RydWUnO1xuXHRcdFx0fSxcblx0XHRcdGFsd2F5c0hpZGVBY3Rpb25iYXI6ICh7IGFjdGlvbmJhciB9KSA9PiB7XG5cdFx0XHRcdHJldHVybiBhY3Rpb25iYXIgPT09IGZhbHNlIHx8IGFjdGlvbmJhciA9PT0gJ2ZhbHNlJztcblx0XHRcdH1cblx0XHR9LFxuXHRcdG1ldGhvZHM6IHtcblx0XHRcdHNjcm9sbGluZygpIHtcblx0XHRcdFx0dmFyIGVsUG9zID0gdGhpcy5yZWZzLnNjcm9sbEVsID8gdGhpcy5yZWZzLnNjcm9sbEVsLm9mZnNldFRvcCA6IDA7XG5cdFx0XHRcdHZhciBzY3JvbGxQb3MgPSB0aGlzLmdldFNjcm9sbFRvcCgpO1xuXG5cdFx0XHRcdGlmIChzY3JvbGxQb3MgPiBlbFBvcyApIHtcblx0XHRcdFx0XHR0aGlzLnNldCh7ZGVzY09wYWNpdHk6IDB9KTtcblx0XHRcdFx0XHR0aGlzLnNldCh7Y3RhT3BhY2l0eTogMH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuc2V0KHtkZXNjT3BhY2l0eTogKDEwMCAtIHNjcm9sbFBvcyAqIDQpICogMC4wMX0pO1xuXHRcdFx0XHRcdHRoaXMuc2V0KHtjdGFPcGFjaXR5OiAoMTAwIC0gc2Nyb2xsUG9zICogMS41KSAqIDAuMDF9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGhpcy5fZGlzcGF0Y2hTY3JvbGwpIHtcblx0XHRcdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdraW52aWV3LXNjcm9sbCcsIHtcblx0XHRcdFx0XHRcdGRldGFpbDoge1xuXHRcdFx0XHRcdFx0XHRzY3JvbGxQb3M6IHNjcm9sbFBvcyxcblx0XHRcdFx0XHRcdFx0c2xvdFBvczogZWxQb3Ncblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRnZXRTY3JvbGxUb3AoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnJlZnMucGFuZSA/IHRoaXMucmVmcy5wYW5lLnNjcm9sbFRvcCA6IDA7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvbmNyZWF0ZSgpIHtcblx0XHRcdHRoaXMuc2V0KHsgZGlyOiBkb2N1bWVudC5ib2R5LmRpciB9KTtcblxuXHRcdFx0Y29uc3Qge2Fsd2F5c1Nob3dBY3Rpb25iYXIsIGFsd2F5c0hpZGVBY3Rpb25iYXJ9ID0gdGhpcy5nZXQoKTtcblxuXHRcdFx0aWYgKCFhbHdheXNTaG93QWN0aW9uYmFyICYmICFhbHdheXNIaWRlQWN0aW9uYmFyKSB7XG5cdFx0XHRcdHRoaXMuX29uS2luSXNBY3Rpb25CYXJWaXNpYmxlID0gKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5zZXQoe2lzQWN0aW9uOiBldmVudC5kZXRhaWwuaXNWaXNpYmxlfSk7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tpbi1pc0FjdGlvbkJhclZpc2libGUnLCB0aGlzLl9vbktpbklzQWN0aW9uQmFyVmlzaWJsZSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX29uU2Nyb2xsVG8gPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0dGhpcy5yZWZzLnBhbmUuc2Nyb2xsVG8oe1xuXHRcdFx0XHRcdHRvcDogZXZlbnQuZGV0YWlsLnNjcm9sbFRvLFxuXHRcdFx0XHRcdGxlZnQ6IDAsXG5cdFx0XHRcdFx0YmVoYXZpb3I6ICdzbW9vdGgnXG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblx0XHRcdHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY29udGVudC1zY3JvbGx0bycsIHRoaXMuX29uU2Nyb2xsVG8pO1xuXG5cdFx0XHR0aGlzLl9vbkZpcmVTY3JvbGxpbmcgPSAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuX2Rpc3BhdGNoU2Nyb2xsID0gdHJ1ZTtcblx0XHRcdH07XG5cdFx0XHR0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tpbi12aWV3OmZpcmUtc2Nyb2xsaW5nJywgdGhpcy5fb25GaXJlU2Nyb2xsaW5nKTtcblx0XHR9LFxuXG5cdFx0b25kZXN0cm95KCkge1xuXHRcdFx0Y29uc3QgeyBhbHdheXNTaG93QWN0aW9uYmFyLCBhbHdheXNIaWRlQWN0aW9uYmFyfSA9IHRoaXMuZ2V0KCk7XG5cdFx0XHRpZiAoIWFsd2F5c1Nob3dBY3Rpb25iYXIgJiYgIWFsd2F5c0hpZGVBY3Rpb25iYXIpIHtcblx0XHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tpbi1pc0FjdGlvbkJhclZpc2libGUnLCB0aGlzLl9vbktpbklzQWN0aW9uQmFyVmlzaWJsZSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tpbi12aWV3OmZpcmUtc2Nyb2xsaW5nJywgdGhpcy5fb25GaXJlU2Nyb2xsaW5nKTtcblx0XHRcdHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGVudC1zY3JvbGx0bycsIHRoaXMuX29uU2Nyb2xsVG8pO1xuXHRcdH1cblx0fTtcbjwvc2NyaXB0PlxuXG5cbjxzdHlsZSB0eXBlPVwidGV4dC9zdHlsdXNcIj5cbipcbio6YmVmb3JlXG4qOmFmdGVyXG5cdC1tb3otYm94LXNpemluZyBib3JkZXItYm94XG5cdC13ZWJraXQtYm94LXNpemluZyBib3JkZXItYm94XG5cdGJveC1zaXppbmcgYm9yZGVyLWJveFxuXG4vLyBjb250ZW50IGVsZW1lbnRzXG4ua2luX2Rlc2NyaXB0aW9uXG5cdGRpc3BsYXkgYmxvY2tcblx0cG9zaXRpb24gc3RpY2t5XG5cdHRvcCAwXG5cdHotaW5kZXggOVxuXHR0ZXh0LWFsaWduIHZhcigtLXBhZ2UtaGVhZGVyLWFsaWduKVxuXG5cdCYuLW5vLWV2ZW50c1xuXHRcdHBvaW50ZXItZXZlbnRzIG5vbmVcblxuLy8gQ1RBIGFyZWFcbi5raW5fY3RhXG5cdGRpc3BsYXkgYmxvY2tcblx0dGV4dC1hbGlnbiB2YXIoLS1wYWdlLWhlYWRlci1hbGlnbilcblxuXHQmLi1uby1ldmVudHNcblx0XHRwb2ludGVyLWV2ZW50cyBub25lXG5cbi5raW5fY3RhX19saW5rc1xuXHRwb3NpdGlvbiBhYnNvbHV0ZVxuXHRyaWdodCAwXG5cdHRvcCA1MCVcblx0dHJhbnNmb3JtIHRyYW5zbGF0ZVkoLTUwJSlcblxuXHQmID4gLmFcblx0JiA+IC5idG5cblx0XHRtYXJnaW4tbGVmdCAxcmVtXG5cbi8vIHZpZXcgY29udGFpbmVyXG4ua2luX3ZpZXdcblx0ZGlzcGxheSBibG9ja1xuXHRwb3NpdGlvbiBhYnNvbHV0ZVxuXHR0b3AgMFxuXHRyaWdodCAwXG5cdGJvdHRvbSAwXG5cdGxlZnQgMFxuXHRwYWRkaW5nIDAgY2FsYyggdmFyKC0tcGFnZS1wYWRkaW5nKSAtIHZhcigtLXBhZ2Utc2Nyb2xsYmFyLXdpZHRoKSApIDJyZW0gdmFyKC0tcGFnZS1wYWRkaW5nKVxuXHRvdmVyZmxvdy15IHNjcm9sbFxuXHRvdmVyZmxvdy14IGhpZGRlblxuXG5cdC8vIHZpZXcgY29udGVudFxuXHQmX19jb250ZW50XG5cdFx0cG9zaXRpb24gcmVsYXRpdmVcblxuXHQmX19pY29uXG5cdFx0Zm9udC1zaXplIDIwcmVtXG5cdFx0d2lkdGggMTAwJVxuXHRcdG1hcmdpbi10b3AgMTR2aFxuXHRcdHRleHQtYWxpZ24gY2VudGVyXG5cdFx0Y29sb3IgdmFyKC0tY29sb3ItZ3JhcGhpY3MpXG5cblx0Ly8gdmlldyBoZWlnaHQgd2l0aCBhY3Rpb25iYXJcblx0Ji4tYWN0aW9uc1xuXHRcdGJvdHRvbSB2YXIoLS1hY3Rpb24tYmFyLWhlaWdodClcblx0XHQtd2Via2l0LW1hc2staW1hZ2Ugbm9uZVxuXG5cdC8vIGNlbnRlcmVkXG5cdCYuLWNlbnRlclxuXHRcdHRleHQtYWxpZ24gY2VudGVyXG5cblx0XHQua2luX2Rlc2NyaXB0aW9uXG5cdFx0Lmtpbl9jdGFcblx0XHQua2luX3ZpZXdfX2NvbnRlbnRcblx0XHRcdHRleHQtYWxpZ24gY2VudGVyXG5cblx0XHQua2luX2Rlc2NyaXB0aW9uXG5cdFx0XHRtYXJnaW4tbGVmdCBhdXRvXG5cdFx0XHRtYXJnaW4tcmlnaHQgYXV0b1xuXG5cdC8vIHRhYnBhbmVcblx0Ji4tdGFiLXBhbmVcblx0XHRwYWRkaW5nLXRvcCAycmVtXG5cblx0Ly8gZGV0YWlsXG5cdCYuLWRldGFpbFxuXHRcdHRyYW5zZm9ybSBzY2FsZSgxKVxuXG5cdFx0Lmtpbl9jdGFcblx0XHQua2luX2Rlc2NyaXB0aW9uXG5cdFx0XHR0ZXh0LWFsaWduIGNlbnRlclxuXG5cdFx0Lmtpbl92aWV3X19jb250ZW50XG5cdFx0XHRwYWRkaW5nLWxlZnQgMTAlXG5cdFx0XHRwYWRkaW5nLXJpZ2h0IDEwJVxuXG4vLyBhY3Rpb25zIHBhbmVsIHdoZW4gc2VsZWN0ZWQgaXRlbVxuLmtpbl9hY3Rpb25zXG5cdHBvc2l0aW9uIGFic29sdXRlXG5cdHJpZ2h0IDBcblx0Ym90dG9tIDBcblx0bGVmdCAwXG5cdGhlaWdodCB2YXIoLS1hY3Rpb24tYmFyLWhlaWdodClcblx0cGFkZGluZyAxcmVtIHZhcigtLXBhZ2UtcGFkZGluZylcblx0YmFja2dyb3VuZC1jb2xvciB2YXIoLS1hY3Rpb24tYmFyLWJhY2tncm91bmQpXG5cdGJvcmRlci10b3Agc29saWQgMXB4IHZhcigtLWFjdGlvbi1iYXItYm9yZGVyKVxuXHRib3gtc2hhZG93IHZhcigtLWFjdGlvbi1iYXItc2hhZG93KVxuXHRmb250LXNpemUgdmFyKC0tYWN0aW9uLWJhci1mb250KVxuXHR6LWluZGV4IDlcblxuXG4qOjotd2Via2l0LXNjcm9sbGJhclxuXHRiYWNrZ3JvdW5kIHRyYW5zcGFyZW50XG5cdHdpZHRoIHZhcigtLXNjcm9sbGJhci13aWR0aClcblxuKjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJcblx0YmFja2dyb3VuZC1jb2xvciB2YXIoLS1zY3JvbGxiYXItYmcpXG5cdGJhY2tncm91bmQtaW1hZ2UgdmFyKC0tc2Nyb2xsYmFyLWltZylcblx0YmFja2dyb3VuZC1zaXplIGNvbnRhaW5cblx0YmFja2dyb3VuZC1yZXBlYXQgbm8tcmVwZWF0XG5cdGJhY2tncm91bmQtcG9zaXRpb24gY2VudGVyXG5cdG9wYWNpdHkgLjFcblx0Ym9yZGVyLXJhZGl1cyB2YXIoLS1zY3JvbGxiYXItcmFkaXVzKVxuXHRib3JkZXIgdmFyKC0tc2Nyb2xsYmFyLWJvcmRlci13aWR0aCkgc29saWQgcmdiYSgjZmZmLCAwKVxuXHRiYWNrZ3JvdW5kLWNsaXAgcGFkZGluZy1ib3hcblxuKjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXJcblx0YmFja2dyb3VuZC1jb2xvciB2YXIoLS1zY3JvbGxiYXItYmctaG92ZXIpXG5cbio6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOndpbmRvdy1pbmFjdGl2ZVxuXHRiYWNrZ3JvdW5kLWNvbG9yIHZhcigtLXNjcm9sbGJhci1iZylcblxuKjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2tcblx0YmFja2dyb3VuZCB0cmFuc3BhcmVudFxuXG4qOjotd2Via2l0LXNjcm9sbGJhci1idXR0b25cblx0ZGlzcGxheSBub25lXG5cdHdpZHRoIDBcblx0aGVpZ2h0IDBcblxuKjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2stcGllY2Vcbio6Oi13ZWJraXQtc2Nyb2xsYmFyLWNvcm5lclxuKjo6LXdlYmtpdC1yZXNpemVyXG5cdGRpc3BsYXkgbm9uZVxuXG4vLyBSVExcbi5raW5fdmlldy4tcnRsXG5cdHBhZGRpbmctbGVmdCBjYWxjKCB2YXIoLS1wYWdlLXBhZGRpbmcpIC0gdmFyKC0tcGFnZS1zY3JvbGxiYXItd2lkdGgpIClcblx0cGFkZGluZy1yaWdodCB2YXIoLS1wYWdlLXBhZGRpbmcpXG5cblxuPC9zdHlsZT5cbiIsIjxkaXYgY2xhc3M9XCJraW5fY2lyY2xlcyB7ZGlyICE9ICdsdHInID8gJy0nICsgZGlyIDogJyd9IHtzdGF0ZSA/ICctJyArIHN0YXRlIDogJyd9XCI+XG5cdDxkaXY+PC9kaXY+XG5cdDxkaXY+PC9kaXY+XG5cdDxkaXY+PC9kaXY+XG5cdDxkaXY+PC9kaXY+XG5cdDxkaXY+PC9kaXY+XG48L2Rpdj5cblxuPHNjcmlwdD5cblxuXHRjb25zdCB0b0Jvb2wgPSAodmFsdWUpID0+IHZhbHVlID09PSAndHJ1ZSc7XG5cblx0ZXhwb3J0IGRlZmF1bHQge1xuXHRcdHRhZzogJ2tpbi1jaXJjbGVzJyxcblx0XHRwcm9wczogWydjc3NjbHMnLCAnc3RhdGUnXSxcblx0XHRkYXRhKCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGlyOiAnbHRyJyxcblx0XHRcdFx0Y3NzY2xzOiAnJyxcblx0XHRcdFx0c3RhdGU6ICcnLFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0b25jcmVhdGUoKSB7XG4gICAgXHR0aGlzLnNldCh7IGRpcjogZG9jdW1lbnQuYm9keS5kaXIgfSk7XG5cdFx0fSxcblx0fTtcbjwvc2NyaXB0PlxuXG5cbjxzdHlsZSB0eXBlPVwidGV4dC9zdHlsdXNcIj5cbipcbio6YmVmb3JlXG4qOmFmdGVyXG5cdC1tb3otYm94LXNpemluZyBib3JkZXItYm94XG5cdC13ZWJraXQtYm94LXNpemluZyBib3JkZXItYm94XG5cdGJveC1zaXppbmcgYm9yZGVyLWJveFxuXG4ua2luX2NpcmNsZXNcblx0cG9zaXRpb24gZml4ZWRcblx0ei1pbmRleCAtMVxuXHRvcGFjaXR5IDBcblx0d2lkdGggNjUuNnJlbVxuXHRoZWlnaHQgQHdpZHRoXG5cdGxlZnQgY2FsYyggdmFyKC0tbmF2YmFyLXdpZHRoLXZpc2libGUpICogLjUgKyA1MCUgKVxuXHR0b3AgY2FsYyggNTAlICsgMi40cmVtIClcblx0bWFyZ2luICggQHdpZHRoICogLTAuNSApXG5cdHRyYW5zaXRpb24gYWxsIC4zc1xuXHRkaXNwbGF5IHZhcigtLWNpcmNsZXMpXG5cdHBvaW50ZXItZXZlbnRzIG5vbmVcblx0dHJhbnNmb3JtIHNjYWxlKDApLCBvcGFjaXR5XG5cdHdpbGwtY2hhbmdlIHRyYW5zZm9ybSwgbGVmdCwgdG9wLCBvcGFjaXR5XG5cblx0ZGl2XG5cdFx0d2lkdGggMTEuMnJlbVxuXHRcdGhlaWdodCBAd2lkdGhcblx0XHRib3JkZXItcmFkaXVzIDE1MHJlbVxuXHRcdGJveC1zaGFkb3cgMCAyMHB4IDYwcHggMCByZ2JhKCMwMDAsIC4xMiksIGluc2V0IDAgMHB4IDExMHB4IDAgcmdiYSgxNTIsIDIyMSwgMjU1LCAuMylcblx0XHRib3JkZXIgc29saWQgMXB4IHJnYig4MywgMTYwLCAyNTQpXG5cdFx0cG9zaXRpb24gYWJzb2x1dGVcblx0XHRvcGFjaXR5IC40XG5cdFx0bWFyZ2luIDI3LjJyZW1cblxuXHRkaXY6bnRoLWNoaWxkKDIpXG5cdFx0d2lkdGggMjIuNHJlbVxuXHRcdGhlaWdodCBAd2lkdGhcblx0XHRvcGFjaXR5IC4zMlxuXHRcdG1hcmdpbiAyMS42cmVtXG5cblx0ZGl2Om50aC1jaGlsZCgzKVxuXHRcdHdpZHRoIDM1LjJyZW1cblx0XHRoZWlnaHQgQHdpZHRoXG5cdFx0b3BhY2l0eSAuMzJcblx0XHRtYXJnaW4gMTUuMnJlbVxuXG5cdGRpdjpudGgtY2hpbGQoNClcblx0XHR3aWR0aCA0OS42cmVtXG5cdFx0aGVpZ2h0IEB3aWR0aFxuXHRcdG9wYWNpdHkgLjJcblx0XHRtYXJnaW4gOHJlbVxuXG5cdGRpdjpudGgtY2hpbGQoNSlcblx0XHR3aWR0aCA2NS42cmVtXG5cdFx0aGVpZ2h0IEB3aWR0aFxuXHRcdG9wYWNpdHkgLjEyXG5cdFx0bWFyZ2luIDBcblxuXHQmLi1jZW50ZXJcblx0XHRvcGFjaXR5IC4xNVxuXHRcdHRyYW5zZm9ybSBzY2FsZSgyLjIpXG5cdFx0bGVmdCA1MCVcblx0XHR0b3AgNTAlXG5cdFx0dHJhbnNpdGlvbi1kZWxheSAuNnNcblxuXHQmLi1sYW5kaW5nLXBhZ2Vcblx0XHRvcGFjaXR5IC4zXG5cdFx0bGVmdCAxMDAlXG5cdFx0dG9wIDkwJVxuXHRcdHRyYW5zZm9ybSBzY2FsZSgyLjIpXG5cdFx0dHJhbnNpdGlvbi1kZWxheSAuNnNcblxuXHQmLi1tYXAtZmV0Y2hcblx0Ji4tbWFwXG5cdFx0dHJhbnNmb3JtIHNjYWxlKDEpXG5cdFx0b3BhY2l0eSAxXG5cdFx0dHJhbnNpdGlvbi1kZWxheSAuNnNcblxuXHQmLi1tYXAtZmV0Y2ggZGl2Om50aC1jaGlsZCg1KTphZnRlclxuXHQmLi1jZW50ZXItZmV0Y2ggZGl2Om50aC1jaGlsZCg0KTphZnRlclxuXHRcdGNvbnRlbnQgJydcblx0XHRwb3NpdGlvbiBhYnNvbHV0ZVxuXHRcdGRpc3BsYXkgYmxvY2tcblx0XHRib3gtc2hhZG93IGluc2V0IDAgMCAyMHJlbSAwICNmZmZcblx0XHRib3JkZXItcmFkaXVzIDEwMCVcblx0XHRvcGFjaXR5IDFcblx0XHR3aWR0aCAxMDAlXG5cdFx0aGVpZ2h0IDEwMCVcblx0XHRhbmltYXRpb24gZmV0Y2hpbmcgNHMgZWFzZS1pbi1vdXQgLjNzIDEwXG5cdFx0ei1pbmRleCA1XG5cdFx0dHJhbnNmb3JtIHNjYWxlKDApXG5cdFx0dHJhbnNpdGlvbi1kZWxheSAuNnNcblx0XHR3aWxsLWNoYW5nZSB0cmFuc2Zvcm0sIG9wYWNpdHlcblxuXHQmLi1jZW50ZXItZmV0Y2hcblx0XHRvcGFjaXR5IC4zXG5cdFx0dHJhbnNmb3JtIHNjYWxlKDIuMilcblx0XHRsZWZ0IDUwJVxuXHRcdHRvcCA1MCVcblx0XHR0cmFuc2l0aW9uLWRlbGF5IC42c1xuXG5cdFx0ZGl2Om50aC1jaGlsZCg0KTphZnRlclxuXHRcdFx0YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCAyMFxuXG5cbkBrZXlmcmFtZXMgZmV0Y2hpbmdcblx0MCVcblx0XHR0cmFuc2Zvcm0gc2NhbGUoMClcblx0XHRvcGFjaXR5IDFcblx0MzAlXG5cdFx0dHJhbnNmb3JtIHNjYWxlKDIuMilcblx0XHRvcGFjaXR5IDFcblx0NTAlXG5cdFx0dHJhbnNmb3JtIHNjYWxlKDIuMilcblx0XHRvcGFjaXR5IDBcblx0MTAwJVxuXHRcdG9wYWNpdHkgMFxuXHRcdHRyYW5zZm9ybSBzY2FsZSgyLjIpXG5cblxuLmtpbl9jaXJjbGVzLi1ydGxcblx0bGVmdCBhdXRvXG5cdHJpZ2h0IGNhbGMoIHZhcigtLW5hdmJhci13aWR0aC12aXNpYmxlKSAqIC41ICsgNTAlIClcblxuPC9zdHlsZT5cbiIsIjxkaXYgY2xhc3M9XCJraW5fcHJvZ3Jlc3Mge2RpciAhPSAnbHRyJyA/ICctJyArIGRpciA6ICcnfSB7Y3NzY2xzfSB7c2l6ZSA/ICctJyArIHNpemUgKyAnIHNpemUnIDogJyd9XCJcblx0Y2xhc3M6LXVua25vd249XCIhKHBlcmNlbnRhZ2UgPj0gMClcIlxuXHRjbGFzczotaW5oZXJpdD1cImluaGVyaXRjb2xvcnNcIlxuXHRjbGFzczotZG90dGVkPVwiZG90dGVkXCJcbj5cblxuXHR7I2lmIGRvdHRlZH1cblx0XHQ8ZGl2IGNsYXNzPVwia2luX3Byb2dyZXNzX19jaXJjbGUge3BlcmNlbnRhZ2UgPT0gMCA/ICcnIDogJy1ncmVlbid9XCI+PC9kaXY+XG5cblx0XHQ8ZGl2IGNsYXNzPVwia2luX3Byb2dyZXNzX193cmFwXCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwia2luX3Byb2dyZXNzX19kb3RzXCIvPlxuXHRcdFx0PGRpdiBjbGFzcz1cImtpbl9wcm9ncmVzc19fYmFyXCIgc3R5bGU9XCJ7cGVyY2VudGFnZSA+PSAwID8gJ3dpZHRoOicgKyBwZXJjZW50YWdlICsgJyUnIDogJyd9XCIgLz5cblx0XHRcdDxkaXYgY2xhc3M9XCJraW5fcHJvZ3Jlc3NfX2Ryb3BsZXRcIiBzdHlsZT1cIntwZXJjZW50YWdlID4gMCAmJiBwZXJjZW50YWdlIDwgMTAwID8gJ2xlZnQ6JyArIHBlcmNlbnRhZ2UgKyAnJScgOiAnb3BhY2l0eTogMCd9XCIgPjwvZGl2PlxuXHRcdDwvZGl2PlxuXG5cdFx0PGRpdiBjbGFzcz1cImtpbl9wcm9ncmVzc19fY2lyY2xlIC1lbmQgLXtwZXJjZW50YWdlID09IDEwMCA/ICdncmVlbicgOiAnZ3JleSd9XCI+PC9kaXY+XG5cblx0XHQ8ZGl2IGNsYXNzPVwia2luX3Byb2dyZXNzX19wZXJjZW50YWdlXCI+e01hdGguZmxvb3IocGVyY2VudGFnZSl9JTwvZGl2PlxuXHR7OmVsc2V9XG5cdFx0PGRpdiBjbGFzcz1cImtpbl9wcm9ncmVzc19fYmFyXCIgc3R5bGU9XCJ7cGVyY2VudGFnZSA+PSAwID8gJ3dpZHRoOicgKyBwZXJjZW50YWdlICsgJyU7JyA6ICcnfXtjdXN0b21jb2xvciA/ICdiYWNrZ3JvdW5kLWNvbG9yOicgKyBjdXN0b21jb2xvciArICc7JyA6ICcnIH1cIiAvPlxuXHR7L2lmfVxuXG48L2Rpdj5cblxueyNpZiAhZG90dGVkICYmIHByb2dyZXNzbGFiZWx9XG5cdDxkaXYgY2xhc3M9XCJraW5fcHJvZ3Jlc3NfX3BlcmNlbnRhZ2VcIj57TWF0aC5mbG9vcihwZXJjZW50YWdlKX0lPC9kaXY+XG57L2lmfVxuXG48c2NyaXB0PlxuXG5leHBvcnQgZGVmYXVsdCB7XG5cdHRhZzogJ2tpbi1wcm9ncmVzcycsXG5cdHByb3BzOiBbJ3BlcmNlbnRhZ2UnLCAnc2l6ZScsICdkb3R0ZWQnLCAnY3NzY2xzJywgJ2FzeW1wdG90aWMnLCAncHJvZ3Jlc3NsYWJlbCcsICdpbmhlcml0Y29sb3JzJywgJ2N1c3RvbWNvbG9yJ10sXG5cdGRhdGEoKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGRpcjogJ2x0cicsXG5cdFx0XHRwZXJjZW50YWdlOiAwLFxuXHRcdFx0c2l6ZTogbnVsbCwgLy8gc21hbGx8bGFyZ2Vcblx0XHRcdGRvdHRlZDogZmFsc2UsIC8vIERvdHRlZCBzdHlsZSBmb3IgQVZHL0F2YXN0IHNjYW4gcHJvZ3Jlc3Ncblx0XHRcdGNzc2NsczogJycsXG5cdFx0XHRhc3ltcHRvdGljOiBmYWxzZSwgLy8gcHJvZ3Jlc3Mgc2xvd2x5IG1vdmVzIHRvIDEwMCUsIGJ1dCBuZXZlciByZWFjaGVzIGl0LiBVc2luZyBmb3IgZmFrZSBwcm9ncmVzc2VzXG5cdFx0XHRwcm9ncmVzc2xhYmVsOiBmYWxzZSwgLy8gU2hvdyBsYWJlbCB3aXRoIHByb2dyZXNzXG5cdFx0XHRpbmhlcml0Y29sb3JzOiBmYWxzZSxcblx0XHRcdGN1c3RvbWNvbG9yOiBudWxsXG5cdFx0fVxuXHR9LFxuXG5cdG1ldGhvZHM6IHtcblx0XHRjbGVhckFzeW1wdG90aWNQcm9ncmVzcygpIHtcblx0XHRcdGlmICh0aGlzLmZha2VQcm9nZXNzSW50ZXJ2YWwpIHtcblx0XHRcdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLmZha2VQcm9nZXNzSW50ZXJ2YWwpO1xuXHRcdFx0XHR0aGlzLmZha2VQcm9nZXNzSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHN0YXJ0QXN5bXB0b3RpY1Byb2dyZXNzKCkge1xuXHRcdFx0Y29uc29sZS5sb2coJ3N0YXJ0IGFzeW1wdG90aWMnKVxuXHRcdFx0bGV0IHN0ZXAgPSAwLjU7XG5cdFx0XHRjb25zdCB7cGVyY2VudGFnZX0gPSB0aGlzLmdldCgpXG5cdFx0XHRsZXQgY3VycmVudFByb2dyZXNzID0gcGFyc2VJbnQocGVyY2VudGFnZSk7XG5cblx0XHRcdHRoaXMuZmFrZVByb2dlc3NJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcblx0XHRcdFx0Y3VycmVudFByb2dyZXNzICs9IHN0ZXA7XG5cdFx0XHRcdGNvbnN0IHByb2dyZXNzID0gTWF0aC5yb3VuZChNYXRoLmF0YW4oY3VycmVudFByb2dyZXNzKSAvIChNYXRoLlBJIC8gMikgKiAxMDAgKiAxMDAwKSAvIDEwMDA7XG5cdFx0XHRcdGlmIChwcm9ncmVzcyA+PSAxMDApIHtcblx0XHRcdFx0XHR0aGlzLmNsZWFyQXN5bXB0b3RpY1Byb2dyZXNzKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAocHJvZ3Jlc3MgPj0gNzApIHtcblx0XHRcdFx0XHRzdGVwID0gMC4xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuc2V0KHtwZXJjZW50YWdlOiBwcm9ncmVzc30pO1xuXHRcdFx0fSwgMTAwKTtcblx0XHR9XG5cdH0sXG5cblx0b25jcmVhdGUoKSB7XG5cdFx0dGhpcy5zZXQoe2RpcjogZG9jdW1lbnQuYm9keS5kaXJ9KTtcblx0fSxcblxuXHRvbnN0YXRlKHtjaGFuZ2VkLCBjdXJyZW50LCBwcmV2aW91c30pIHtcblx0XHQvLyBPYnNlcnZlIGlmIHBlcmNlbnRhZ2UgY29tZXMgYXMgcGFyYW0gd2l0aCB2YWx1ZSAxMDAsXG5cdFx0Ly8gSWYgc28sIGVuZCB0aGUgcHJvZ3Jlc3NcblxuXHRcdGlmIChjaGFuZ2VkLmFzeW1wdG90aWMpIHtcblx0XHRcdGNvbnN0IHthc3ltcHRvdGljfSA9IHRoaXMuZ2V0KClcblx0XHRcdGlmIChhc3ltcHRvdGljID09PSB0cnVlIHx8IGFzeW1wdG90aWMgPT09ICd0cnVlJykgeyAvLyBTdmVsdGUgdnMgUmFjdGl2ZVxuXHRcdFx0XHR0aGlzLnN0YXJ0QXN5bXB0b3RpY1Byb2dyZXNzKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmNsZWFyQXN5bXB0b3RpY1Byb2dyZXNzKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGNoYW5nZWQucGVyY2VudGFnZSkge1xuXHRcdFx0Y29uc3Qge3BlcmNlbnRhZ2V9ID0gdGhpcy5nZXQoKVxuXG5cdFx0XHRpZiAocGFyc2VJbnQocGVyY2VudGFnZSkgPj0gMTAwKSB7XG5cdFx0XHRcdHRoaXMuY2xlYXJBc3ltcHRvdGljUHJvZ3Jlc3MoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0b25kZXN0cm95KCkge1xuXHRcdHRoaXMuY2xlYXJBc3ltcHRvdGljUHJvZ3Jlc3MoKTtcblx0fVxufTtcblxuPC9zY3JpcHQ+XG5cbjxzdHlsZSB0eXBlPVwidGV4dC9zdHlsdXNcIj5cblxuJGJnLW9wYWNpdHkgPSAuMThcblxuLmtpbl9wcm9ncmVzc1xuXHRoZWlnaHQgLjRyZW1cblx0ZGlzcGxheSBibG9ja1xuXHR3aWR0aCAxMDAlXG5cdHBvc2l0aW9uIHJlbGF0aXZlXG5cdG1hcmdpbiAwXG5cdG92ZXJmbG93IGhpZGRlblxuXG5cdCY6OmJlZm9yZVxuXHRcdGNvbnRlbnQgJydcblx0XHRwb3NpdGlvbiBhYnNvbHV0ZVxuXHRcdHRvcCAwXG5cdFx0cmlnaHQgMFxuXHRcdGJvdHRvbSAwXG5cdFx0bGVmdCAwXG5cdFx0YmFja2dyb3VuZC1jb2xvciBjdXJyZW50Q29sb3Jcblx0XHRib3JkZXItcmFkaXVzIHZhcigtLXByb2dyZXNzLXJhZGl1cylcblx0XHRvcGFjaXR5ICRiZy1vcGFjaXR5XG5cblx0Jl9fcGVyY2VudGFnZVxuXHRcdHdpZHRoIDEwMCVcblx0XHRwYWRkaW5nLXRvcCAuNXJlbVxuXHRcdHRleHQtYWxpZ24gZW5kXG5cdFx0ZGlyZWN0aW9uIGx0clxuXHRcdGNvbG9yIHZhcigtLWNvbG9yLXRleHQtc2Vjb25kYXJ5KVxuXHRcdGhlaWdodCAyLjVyZW1cblx0XHRtYXJnaW4tYm90dG9tIEBoZWlnaHQgKiAtMVxuXHRcdGJveC1zaXppbmcgYm9yZGVyLWJveFxuXG5cdCZfX2JhclxuXHRcdHBvc2l0aW9uIGFic29sdXRlXG5cdFx0d2lkdGggMCVcblx0XHRoZWlnaHQgMTAwJVxuXHRcdGxlZnQgMFxuXHRcdGJhY2tncm91bmQtY29sb3IgdmFyKC0tcHJvZ3Jlc3MtY29sb3IpXG5cdFx0dHJhbnNpdGlvbiB3aWR0aCAuNXMgZWFzZS1vdXRcblx0XHRib3JkZXItcmFkaXVzIHZhcigtLXByb2dyZXNzLXJhZGl1cylcblxuXHQmLi1vayAmX19iYXJcblx0XHRiYWNrZ3JvdW5kLWNvbG9yIHZhcigtLWNvbG9yLW9rKVxuXG5cdCYuLWNyaXRpY2FsICZfX2JhclxuXHRcdGJhY2tncm91bmQtY29sb3IgdmFyKC0tY29sb3ItY3JpdGljYWwpXG5cblx0Ji4tYXR0ZW50aW9uICZfX2JhclxuXHRcdGJhY2tncm91bmQtY29sb3IgdmFyKC0tY29sb3ItYXR0ZW50aW9uKVxuXG5cdCYuLWluaGVyaXQgJl9fYmFyXG5cdFx0YmFja2dyb3VuZC1jb2xvciBjdXJyZW50Q29sb3JcblxuXHQmLi11bmtub3duXG5cblx0XHQua2luX3Byb2dyZXNzX19iYXJcblx0XHRcdHdpZHRoIDUwJVxuXHRcdFx0bGVmdCAwXG5cdFx0XHRhbmltYXRpb24gcHJvZ3Jlc3MgMi41cyBsaW5lYXIgaW5maW5pdGVcblxuXHQmLi1zbWFsbFxuXHRcdGhlaWdodCAuMnJlbVxuXG5cdCYuLWxhcmdlXG5cdFx0aGVpZ2h0IC42cmVtXG5cblx0Ly8gc2NhblxuXHQmLi1kb3R0ZWRcblx0XHRwYWRkaW5nLXRvcCAuNHJlbVxuXHRcdGJhY2tncm91bmQtY29sb3IgaW5oZXJpdFxuXHRcdG92ZXJmbG93IHZpc2libGVcblxuXHRcdCY6OmJlZm9yZVxuXHRcdFx0ZGlzcGxheSBub25lXG5cblx0XHQua2luX3Byb2dyZXNzX193cmFwXG5cdFx0XHRtYXJnaW4tcmlnaHQgMi41cmVtXG5cdFx0XHRtYXJnaW4tbGVmdCAyLjVyZW1cblx0XHRcdHBvc2l0aW9uIHJlbGF0aXZlXG5cblx0XHQua2luX3Byb2dyZXNzX19iYXJcblx0XHRcdGhlaWdodCAuMnJlbVxuXG5cdFx0Lmtpbl9wcm9ncmVzc19fcGVyY2VudGFnZVxuXHRcdFx0d2lkdGggMTAwJVxuXHRcdFx0cGFkZGluZy10b3AgLjhyZW1cblx0XHRcdHBvc2l0aW9uIGFic29sdXRlXG5cdFx0XHR0ZXh0LWFsaWduIGVuZFxuXHRcdFx0ZGlyZWN0aW9uIGx0clxuXG5cdFx0Lmtpbl9wcm9ncmVzc19fY2lyY2xlXG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yIHZhcigtLXByb2dyZXNzLWNvbG9yKVxuXHRcdFx0d2lkdGggMXJlbVxuXHRcdFx0aGVpZ2h0IDFyZW1cblx0XHRcdGxlZnQgMFxuXHRcdFx0dG9wIDBcblx0XHRcdHBvc2l0aW9uIGFic29sdXRlXG5cdFx0XHRib3JkZXItcmFkaXVzIDdyZW1cblx0XHRcdG9wYWNpdHkgJGJnLW9wYWNpdHlcblx0XHRcdGJhY2tncm91bmQtY29sb3IgY3VycmVudENvbG9yXG5cblx0XHRcdCYuLWVuZFxuXHRcdFx0XHRyaWdodCAwXG5cdFx0XHRcdGxlZnQgYXV0b1xuXG5cdFx0XHQmLi1ncmVlblxuXHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yIHZhcigtLXByb2dyZXNzLWNvbG9yKVxuXHRcdFx0XHRvcGFjaXR5IDFcblxuXHRcdC5raW5fcHJvZ3Jlc3NfX2Ryb3BsZXRcblx0XHRcdGJhY2tncm91bmQtY29sb3IgdmFyKC0tcHJvZ3Jlc3MtY29sb3IpXG5cdFx0XHR3aWR0aCAxcmVtXG5cdFx0XHRoZWlnaHQgMXJlbVxuXHRcdFx0bGVmdCAwXG5cdFx0XHRwb3NpdGlvbiBhYnNvbHV0ZVxuXHRcdFx0bWFyZ2luLXRvcCAtLjRyZW1cblx0XHRcdGJvcmRlci1yYWRpdXMgN3JlbVxuXHRcdFx0Ym9yZGVyLXJhZGl1cyAwIDdyZW0gN3JlbVxuXHRcdFx0dHJhbnNmb3JtIHJvdGF0ZSgtNDVkZWcpXG5cdFx0XHRtYXJnaW4tbGVmdCAuMXJlbVxuXHRcdFx0b3BhY2l0eSAxXG5cdFx0XHR0cmFuc2l0aW9uIGxlZnQgLjVzIGVhc2Utb3V0XG5cblx0XHQua2luX3Byb2dyZXNzX19kb3RzXG5cdFx0XHRiYWNrZ3JvdW5kLWF0dGFjaG1lbnQgZml4ZWRcblx0XHRcdHBvc2l0aW9uIGFic29sdXRlXG5cdFx0XHR3aWR0aCAxMDAlXG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yIGluaGVyaXRcblx0XHRcdGJvcmRlci10b3AgZG90dGVkIGN1cnJlbnRDb2xvciAuMnJlbVxuXHRcdFx0b3BhY2l0eSAkYmctb3BhY2l0eVxuXG5cdCYuLXJ0bFxuXHRcdHRyYW5zZm9ybSBzY2FsZVgoLTEpXG5cblx0XHQmLi1kb3R0ZWRcblxuXHRcdFx0Lmtpbl9wcm9ncmVzc19fcGVyY2VudGFnZVxuXHRcdFx0XHR0cmFuc2Zvcm0gc2NhbGVYKC0xKVxuXG5cdEBrZXlmcmFtZXMgcHJvZ3Jlc3Ncblx0XHQwJVxuXHRcdFx0dHJhbnNmb3JtIHRyYW5zbGF0ZVgoMTAwJSlcblxuXHRcdDUwJVxuXHRcdFx0dHJhbnNmb3JtIHRyYW5zbGF0ZVgoMCUpXG5cblx0XHQxMDAlXG5cdFx0XHR0cmFuc2Zvcm0gdHJhbnNsYXRlWCgxMDAlKVxuXG48L3N0eWxlPlxuIiwiPHN2Z1xuXHRzdHlsZT1cImhlaWdodDp7c2l6ZX1weDt3aWR0aDp7d2lkdGggPyB3aWR0aCA6IHNpemV9cHg7XCJcblx0Y2xhc3M9XCJraW5faWNvbiB7ZGlyICE9ICdsdHInID8gJy0nICsgZGlyIDogJyd9IHtydGxmbGlwID09ICd0cnVlJyA/ICctZmxpcCcgOiAnJ30ge2Nzc2Nsc30ge3NpemUgPCAzMCA/ICctc21hbGwnIDogJyd9IHtzaXplID4gNjAgPyAnLWxhcmdlJyA6ICcnfVwiXG5cdHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBcblx0eG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcbj5cblx0PHVzZSB4bGluazpocmVmPVwiU3ZnSW5saW5lLnN2ZyN7bmFtZX1cIiAvPlxuPC9zdmc+XG5cbjxzY3JpcHQ+XG5cblx0Y29uc3QgdG9Cb29sID0gKHZhbHVlKSA9PiB2YWx1ZSA9PT0gJ3RydWUnO1xuXG5cdGV4cG9ydCBkZWZhdWx0IHtcblx0XHR0YWc6ICdraW4taWNvbicsXG5cdFx0cHJvcHM6IFsnbmFtZScsICdzaXplJywgJ3dpZHRoJywgJ2Nzc2NscycsICd0aXRsZScsICdydGxmbGlwJ10sXG5cdFx0ZGF0YSgpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRpcjogJ2x0cicsXG5cdFx0XHRcdG5hbWU6ICcnLFxuXHRcdFx0XHRzaXplOiAnNDgnLFxuXHRcdFx0XHR3aWR0aDogJycsXG5cdFx0XHRcdGNzc2NsczogJycsXG5cdFx0XHRcdHRpdGxlOiAnJyxcblx0XHRcdFx0cnRsZmxpcDogJycsXG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvbmNyZWF0ZSgpIHtcblx0XHRcdHRoaXMuc2V0RGlyKCk7XG5cblx0XHRcdHRoaXMuZGlyT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB0aGlzLnNldERpcigpKTtcblxuXHRcdFx0dGhpcy5kaXJPYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHthdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnZGlyJ119KTtcblx0XHR9LFxuXHRcdG9uZGVzdHJveSgpIHtcblx0XHRcdHRoaXMuZGlyT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuXHRcdH0sXG5cdFx0bWV0aG9kczoge1xuXHRcdFx0c2V0RGlyKCkge1xuXHRcdFx0XHR0aGlzLnNldCh7IGRpcjogZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RpcicpIH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgdHlwZT1cInRleHQvc3R5bHVzXCI+XG4qXG4qOmJlZm9yZVxuKjphZnRlclxuXHQtbW96LWJveC1zaXppbmcgYm9yZGVyLWJveFxuXHQtd2Via2l0LWJveC1zaXppbmcgYm9yZGVyLWJveFxuXHRib3gtc2l6aW5nIGJvcmRlci1ib3hcblxuLmtpbl9pY29uXG5cdHN0cm9rZSBjdXJyZW50Q29sb3Jcblx0ZmlsbCB0cmFuc3BhcmVudFxuXHRzdHJva2Utd2lkdGggdmFyKC0taWNvbi1zdHJva2UpXG5cdHN0cm9rZS1saW5lY2FwIHJvdW5kXG5cdHN0cm9rZS1saW5lam9pbiByb3VuZFxuXG5cdCYuLXNtYWxsXG5cdFx0c3Ryb2tlLXdpZHRoIHZhcigtLWljb24tc3Ryb2tlLXNtYWxsKVxuXG5cdCYuLWxhcmdlXG5cdFx0c3Ryb2tlLXdpZHRoIHZhcigtLWljb24tc3Ryb2tlLWxhcmdlKVxuXG5cdCYuLWZsaXAuLXJ0bFxuXHRcdHRyYW5zZm9ybSBzY2FsZVgoLTEpXG5cbjwvc3R5bGU+XG4iLCI8ZGl2IGNsYXNzPVwia2luX2xvYWRpbmcge2Z1bGxzY3JlZW4gPT09ICd0cnVlJyA/ICctZnVsbHNjcmVlbicgOiAnJ31cIj5cblx0PGRpdiBjbGFzcz1cImtpbl9sb2FkaW5nX19zcGlubmVyIHtpbmxpbmUgPyAnLWlubGluZScgOiAnJ30ge2ludmVydGVkID8gJy1pbnZlcnRlZCcgOiAnJ30ge3NpemUgPyAnLScgKyBzaXplIDogJyd9XCIgLz5cblx0eyNpZiBsYWJlbH1cblx0XHQ8c3BhbiBjbGFzcz1cImtpbl9sb2FkaW5nX19sYWJlbFwiPntsYWJlbH08L3NwYW4+XG5cdHsvaWZ9XG48L2Rpdj5cblxuPHNjcmlwdD5cblxuXHRleHBvcnQgZGVmYXVsdCB7XG5cdFx0dGFnOiAna2luLWxvYWRpbmcnLFxuXHRcdHByb3BzOiBbJ2xhYmVsJywgJ2lubGluZScsICdzaXplJywgJ2Z1bGxzY3JlZW4nLCAnaW52ZXJ0ZWQnXSxcblx0XHRkYXRhKCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bGFiZWw6IG51bGwsXG5cdFx0XHRcdGlubGluZTogZmFsc2UsXG5cdFx0XHRcdHNpemU6IG51bGwsIC8vIGRlZmF1bHR8c21hbGxcblx0XHRcdFx0ZnVsbHNjcmVlbjogZmFsc2UsXG5cdFx0XHRcdGludmVydGVkOiBmYWxzZSxcblx0XHRcdH1cblx0XHR9LFxuXHR9O1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSB0eXBlPVwidGV4dC9zdHlsdXNcIj5cbi5raW5fbG9hZGluZ1xuXHRkaXNwbGF5IGlubGluZS1ibG9ja1xuXHR2ZXJ0aWNhbC1hbGlnbiBtaWRkbGVcblx0dGV4dC1hbGlnbiBjZW50ZXJcblxuXHQmLi1mdWxsc2NyZWVuXG5cdFx0ZGlzcGxheSBmbGV4XG5cdFx0ZmxleC1mbG93IGNvbHVtblxuXHRcdGFsaWduLWl0ZW1zIGNlbnRlclxuXHRcdGp1c3RpZnktY29udGVudCBjZW50ZXJcblx0XHRoZWlnaHQgMTAwJVxuXG4ua2luX2xvYWRpbmdfX3NwaW5uZXJcblx0d2lkdGggM3JlbVxuXHRoZWlnaHQgM3JlbVxuXHRiYWNrZ3JvdW5kIGNlbnRlciBjZW50ZXIgLyAxMDAlIG5vLXJlcGVhdFxuXHRwb3NpdGlvbiByZWxhdGl2ZVxuXHRmbGV4LXNocmluayAwXG5cdG1hcmdpbiAwIGF1dG9cblx0Ym9yZGVyLXJhZGl1cyA1cmVtXG5cdGJhY2tncm91bmQtaW1hZ2UgdXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdDQVlBQUFCWEF2bUhBQUFBT1hSRldIUlRiMlowZDJGeVpRQkJibWx0WVhSbFpDQlFUa2NnUTNKbFlYUnZjaUIyTVM0MkxqSWdLSGQzZHk1d2FIQmpiR0Z6YzJWekxtOXlaeWwwemNoS0FBQUFPWFJGV0hSVVpXTm9ibWxqWVd3Z2FXNW1iM0p0WVhScGIyNXpBRFV1Tmk0eU1Uc2dZblZ1Wkd4bFpDQW9NaTR4TGpBZ1kyOXRjR0YwYVdKc1pTazhzNDdJQUFBQUNHRmpWRXdBQUFBSUFBQUFBTGs5aTlFQUFBQWFabU5VVEFBQUFBQUFBQUF3QUFBQU1BQUFBQUFBQUFBQUFHUUQ2QUFBSkFiVXNnQUFCWkZKUkVGVWFJSHRtc0ZxVzBjWWhiOHpYSVF4SmhoampDa21oRkNNQ1cwSklZdFM2Q2FyMGtVWEpTL1FSZWtEOUFsQ2wzMkEwa1dmb010dTIwM1hYWlFRaWpHaGlHQkNFTWFJSUl3UVprNFhkMGE1dnI1WDk4cVNzK29Cb2VIcXpzejVaLzc1LzVrekVtdUM3UUxZU0o5TllDenBiZnJ0QytBZU1BUk9nYUdreVRyNkxXNWEwVGJBd1BhT3BCM2dEbERZRGdDU1RvQnN3T2VTbnFhcU0yQnMrNFh0UHlUOUNZd2t2VDhEYkc4Q0I4Q3VwQ0laUXh1SjJ2TUJzQWM4a2ZURTlsalM3N1ova2ZUdnNsekNrc1EzWW94SHRoL1ozazl1c3hJa2JRTlBnZDlzLzJqN2cyWHE5ekxBZG9neDdnTVBKZTFKQ3BMbUk5dFdYaElGOEpYdFgyMS9IV1BzTlRpZEJpU2YvbERTb2UxQmRoZmJkSlZ2QWttN3RuK1E5TXoyeHNvR0pBeVdKYldpRVFXbFd6M0xRYUVOclQ5V0ZtYTBmUXljOTNHYkpoZTZvVEd2Z0o4a3hhVU5TRllmNWlrTUlWeEtPZ2JPcTJUNmxLRTlPbldRLzA3U01QTnBtNGxyTFdlZnQ3MFBUQ1c5a0hSUmFlaUJwSjFxNkt5VVo3WW5LVW1OS3ZVZUE1OEJId01QZ04wRjVJYzE4b1h0STBrejRLUStHRTBHN0FPSGxVZFQ0TG1rYVc0UU9BSjJLdTlNZ05NVTAyZHRJNTRHWndmNEZQZ21HVk1kMlZmQXQxWHkxYjVzbjRRUTNyUWFrRnptb2UwQlhCbmRpelFUVTRBWVl5SHB5UFpXNm16VTVhc054Z3lBTDRIdktSTmJkcHQvczdHMkh3QTdlVUJzenlUOW5YbGNNeURHZUpRYW8yWUFxZElWZHdLS05MVTNodTNkWk1UUGRiZmg2aXhuakVJSXg5Y01TTnVEeHgzOVRXMC9EeUZNTzk1YkNqSEdFRUtJaVVlVGk5YnhWeDdJa0NvQkhQUklVaHZBM1ZWaWZCTXE1QU53WkhzUitTdGM4d0xhU0ZQWkZiTm5rb1kzM1RuMlFBRnNaUjRMUHJ1VTIvYTVBZHVTaXB5RUZpU3A0YW8rdndpcDdXR2RSOE9uQUxhckJ1ejIyTnRNZ05GdGthOWdsUHJxd2k1QVNDdCtLejl0Y3lIYnA4dUd5cHNnOVhIYTRVTFkzckpkRk1CbW1wSzJCZ0ZtdHNlM1RiNkNjWEtud1lKM0NtQXpVQzZHc01pRmdNbHQrbjREWm5TN1VRQTJDc29JTkgvYTVFSzIzNGF3MU9GdEpVZ2l4dmlXeGJrQWtnRVR5cFVmZ0dnN1pGKzNuVjNvL0ZZWk4wQlM3ak1Bc2FXOEZtWGpmNndDcGJSOWgrdlRWUDArVzVjUTFSY3h4cTJrTjdYQzlpU243cnZwd1R6cjVuTDZqcnhuZjB2azczVzhOZ3lVQjVZcjVHc05BZHhaOXdadUVWSVl2OVAxbnFScE5tQmhoazJaZWxGU1dUY0drclk2dGpmUjlqUUFGN1l2cTRlWEdua295VysvTi9wbFg0TU81ZU1TdUFpcE1PbHdJWUNER09PdFo3TjBKdWdqTDA1Q0NKZFpTVDdyVVdGTDBpSTFZVjNZemY3ZnNiMDVnM2ZiNmJHa3l3VXVsSEUvSC9odkF5Nmx5L3M5eExOTFlGdzFZR3I3ck1PRm9Gd0w5MjR4SWwzMnlUZTJ6MGpSTTdzUWtsNzNxRGdGVHRkOXBLd29IeEdZSzRCdExpVHBkZVl3WDVSWlRXdHJuR2FWYm1WM1NtM01aY3prSHNlUzJyVFlVWFdXNmxGbFNMa1hueU5Wdk9DcUpsUlFxbXI1b21QcDZPVHl6bUVQZUFUc0E1OGthU2NiOFEvWGQ4R3p4UEVkdjNyRDZTTGpNSk8zWFIvNWdvcjBrVVpsUW5sNU42WlVMdHBJdzd1Y2NwQ1V2YnA0ZGszR3JQUjFJcWxkV3N3alF4SjNtOVE0ZDRpN3laaUo3VkVJSWRmYkJyWVQ0YTZzbm1lN3JzWE9nSmYxYzNualVDVWpEb0ZYMVpGM3FSSjNuWkl5amlXTlV0MHJrbVVQTk1tWTFNbER5LzFBamdaMThzQk9EN1Zna2JMUkpkM2s4Z2J3VVdWaHh6WkZwSFh4VmJiVm9UN3lWUjl2SzdlMTJTTko1WEl2R2JQdk5lbXNML0UxNW9nM2xENi84S1ZPQTFUZWtiMjAvWmJ5Z05FcjlqZDEzTEx3cjVSNUZ5cDczVG4wbW9IVTBCdmJZOXYzVkY2RnpyTjRFNWt1b3hyS2tYS0RObFRsQW1NdEJsUTZtZ0xIcnZ6VmdQS1NvNUZZSDZTenlCbmxGdVZpcWNyYzhMOFNraTVzbjFCTzlRNmxJVnNwWnM5bnBvRnNuczFMMnhOS3NlQ2NCY212azh1TmFqVWczWnRWLzI1em52Y3N0dmZTODR1VTJhZHB1N0F5L2dNVDN3M1gwMGdJcUFBQUFCcG1ZMVJNQUFBQUFRQUFBREFBQUFBd0FBQUFBQUFBQUFBQVpBUG9BQUMvZFQ1bUFBQUZsR1prUVZRQUFBQUNhSUh0bXM5cUpFY1N4bjlmMGpSaWFBWWhoQmlNTUkweGd4Z1dzNWc5RzJPOEQ3QUhQNENmd2ljL2dmSEpEN0J2c094cGozdmUyOEt3R0RINElJYkJERUlJTVRTaWFacjhmTWhJcWJwVTFWVWF0WFRhRDRvT3F2UFBGNW1Sa1pHUkpYWUUyeE5nTDU1bndKV2tEL0hmWWJ5N0JwYkFVdEo2Ri8xT1ByYWliWUNwN1FOSkI4QnpZR0k3QVVoNkEzeUk0Z2ZBaTVBenNMYjlBYmlNWnlYcDZSU3cvUXc0Qmc0bFRVSVp4cEN3blNSTmdjT1ltYldrQzl2dkpGM2ZsOHU5RkxDOVozc2VIZGVSSGxzWFNVaHF5eFBLN0J6bG5DOGtuVWxhN2xRQjI4bjJFVENQMGR0QVU0aytoZnJLTk9RazZRall6em1mU1RxWGxJZTRwVEhrZ2M4bHZiUTlyZVppbXlHNXA3MGhlUXE4QkQ2djYya2J4cHJRZEJ1cExyVExqeURlbGw5SVNyWlB0NWxwcjRhTmhabHRud0tYMVc3ai9hRGNSSDAvOXFHNDI3ZERhNnhUZ1ppNmw3YjNBRkpLYTBtbndPVjlSL0pqWUhzcDZYL1ZLNFhwN28xU29OcTg3UmUydndpWFNXdzh2MUw4ZGgvaGxlMUxTVy9ySmhaNEQ3eU51cXU2VHJvZTRMcEZmbWI3RitESDhGZ2J1RE0vdGw5UUZsSEZFbmhkWFZzMGNrTFpuQ29Xd0R2YlY1SjZONlhHNXJjUEhFdWF0ZjdmR1BtYzgwelNUN2EvaVFIOFVkSS9laFdJYWZxejdTbHc0N01ibzdLTWhpZVNUbXpQSkowQm8xeGVFem5uNmpibm9kUWRzd0Yrc2YxMVkwRE9nZThrdmU5VUlPZDhBaHpkL0htckFFRysyVUVDSnBKVzl5SGVSaENkQSsrYVpnUDhESHpkVWVXZmtuNjRvMERZK2w4RytsdmFmcDFTR3IxVGprSE9tWlJTNVRFRGZnSys2U20rQnY0V3NWWlp4REhLeHlNMnFUM2cwNGQ2bVRZYTVLZTJmOTVDSGtyQStIM2xVTDNRWHNRM1F5NXdGYkhLZzBuM1lDYnAxVkFoU2Q4UzBXMVZZRi9TcEdNemFjdG5EN1g1QVdLWE1RTkRaNFhudHIrQ1d3VU9SOFEyQzRvWGVGUkkraGR3T3FMY1h3R1M3VWtzSEtEZmhDSmV2NWVyL0JqRURQOTlSTkZYT2VmbkNYaldaVDR0RTFvQlY0L0l1NDMvQUJjRFpmWWx6UlBsREp1Mm1SQ3dlRXpiNzhBbHcyWTBzVjBVR0FyRWJIOTRSTTl6QjJHcS94MVI3bmhDV1p4bmtoS1E0OHlhNGZZWVNBUndUNHgvRHhXdy9mb3BpUHdmMnlEYk5hZFRYV1FLdWZsN0lXbnhsTVFpbEQ3WVZzYjJZZ0xNZ0UvanhZMzdySEw4WnNwYWVUSUUrZmxBc2JORU9iQnNrRzgxQkdYcjNqSEZmb1FiZno1VVR0S3lLckIxaDQyZCtrNCs2QkV4bFRRYkNHK3k3V1VDcm0ydm00ZVhGbmtvNVBlZmpIN3BhenFRK1ZnRDF5bUV4WUFKQVJ6bm5BY1RUUTlGblBRK0dWRjBrVkphMS96bVVOd0JKVlkvZkJDN2NUaXM5ajhRM2x6QWJUaDlKV205eFlRcVBxc0gvc2RBbk1nK0c1RThXeFBCWlZWZ2FmdGl3SVNncklYNUkzcWs5Wmo5eHZZRjRUMXZVdVNTZmg5UmNVbkpIanlVYUx0ZGdrZW1SS0dYcldUWGhpenA5OHJoWmxHRzVuZE9YSTNSYnVkdDBpN01LZHE0U1dPR2VaeEs2c3ZGbmpkbnFlMVZ6b0NOdUQ4cVhyT1pFNW9BcjRBdkl3VjViKzlrTytXY2o0QXZLUWYwM2pSbUE2dmdlTXV2M1hETytTYTFHSHREZStRbndFbkVVSFZVRnNBN3lzSWFUQzFTL1B4eFpQYmF5Yk03YWN4R1gyK2FXYmxPQmR4STduWmw0Mnkva25UUTZMUkpZQlhLTEd5ZnA1UnF2WDFnUHdnUDdlcDF0dHU1MkJYd1cvdGMzamxVb2NSTFNuNytadVJ0bnd4RmlBMmNTanFQdWhzcHl4SG9TbVBTSmc4OTl3UFZHN1RKQXdkTjc3RHQ2Y0tJMUUyVjk0QS9OUloyN3N1STlDNitSbGlkMmlQZnRQRSt1YS9ORVp0VWxVZWxNY2Zla2EzR0V0L2hIdkdlWXZOYkN3MHFvSEpIOXB2THpmcWNrV0YxVjhjOUMzOUQ1dFpWanJwekdEVUQwZEI3MjFlMjU1SU9Hd3Vyazh5UVVoMXlwZ1JvdTcvb2JuUzBCRTdkK05TQWNzblJTV3dNNGl4eVFlT0M0ejc0cUc4bEpGM2Jma09aNmdPS0lyUHcyYjJmSURUTzEydmJDMHF5NEVFZmUreHN4Y1c5V2ZOem04c2FzN2g4cHJCSE9mMHRKZTNzYzVzL0FPZ3hDK2wzTm84bkFBQUFHbVpqVkV3QUFBQURBQUFBTUFBQUFEQUFBQUFBQUFBQUFBQmtBK2dBQUZMajdZOEFBQVdhWm1SQlZBQUFBQVJvZ2UyYVAydXNSUlRHZjgrd2hPVVNRZ2pMNVJaQmdzZ2xpS0NGaFpXRmxWL0EwbzlnSldMbEI3Q3dFRCtBMzhEU1JyR3d0aEFSQ1JlTElFRXVJVnlXc0lRbExQTll6TXplMlRmdnZ5U2JWRDd3a3NtNzgrZWNtVFBubkhubUZWdUM3UWt3emM4VFlDN3BNdjgyeSsrdWdDV3dsTFRheHJpVHV6YTBEYkJqKzBEU0FiQUhUR3dIQUVrdmdNdGMvUUI0bHNzUldObStCRjdsNTFyUzR5bGcrd2x3Q013a1RiSXlqQkhDZHBDMEE4enl5cXdrWGRnK2szUjFXMWx1cFlEdHFlMmpQSENaNmJGdGtZU2tabmxDV3Aybk1jWUxTYWVTbGx0VndIYXcvUlE0eXJPM2dWcUpMb1c2NmxUbElPa3BzQjlqUEpWMExpa095UmJHQ0ErOEplbTU3WjFpTHJZWktuZjBOMVRlQVo0RGI1WDkxSWV4SnJUVEoxUWJtdlZIQ040c1A1TVViSi8wbVdtbmh0WEdqTFpQZ0ZmRmJ2UDd3WEtOOG43c1EzSzMvd3p0c1ZZRjh0STl0ejBGQ0NHc0pKMEFyMjQ3azNlQjdhV2tQNHRYeW51d1ZkWWI2aFdidC8yTUZIQ2FIYjB0NmFCMm5WWDUydlpDMGdJNHI5cnRrV0xCTHJCcis0WWpXQXVVMnZ4VnRaM1lQcFowRGJ4b3JraWJBczlJbTZoZ0NmeFJYRnQyZThkWm9JSUZjR1o3THFrektGWEJieDg0bExUYitMMDVZUnRqMlg0UlFualpxVUEybWZmS0RGV3plNVU3WGdMRUdDZVNqbTN2U2pvbHpmYWd5NnNSWXl4dTh5Z3IxYnJhd0VHWkVOdlhrbjZ2NDRRYW5SNERUOWMvYnBySEV0Z1lBSmprcGIwejhtUWRBV2ROczJGemxRdk9Rd2duTnhUSTZjSDdBK010YmY4UlFoZ2RLY2NneGtnSW9jalJacUpOL0ZhVURia1J3T0dJSURVRjNyaXZsMm1pRWo0QXg3YjdoTitRdGJpbWFjNXZobHpnZGM1VjdpVndEeVlrVDdXZXVJNW5Sa3JiMXdyc1M1cTBCSk5tK2ZTK050K0gzUGZwaUVBM0FmWnJCV1lqY3BzRmNQNVF3bGM0ejJNTllRWVE4bzVmKytNdUU4cjUrcTFjNVYyUXh6Z2JNQ0ZzNzlxZVRJQW5lVW02T2dTNHRqMS9hT0VyekxNNWRVWnMwbjU1RWtpYklmU1pFTEI0U050dndUWERaaFNBNllUa2dkWnYyMHpJOW1WeGRZOEJTY1FZTCttUEJaQVZXSkIyZmdCaVByTkdlSDBNSkIyOEh4V1N5cGlCUkFTMGxjZHM5di94b0ZBTzIzdmNYS2I2NzBYTzhSOE5PUlA5cURKaldzcS9sOUQ5UmtlRjhqZnkrUGIyRWZCWkg1dGgrOXRBT3JCc0NGOGp2OXZiZGdMWGg1elV2VHVpNmxsUm9EZkM1a2pkRjFTMmpRUGc3VHgyTFVkZFp3V2NCdURLOXFvK3ZOUW94MEJ5OHZSSStJQ2M2L1NRWm5OSi93UWxsbmd4WUVJQWh6SEdCNDltTWNZZDROT2hlcmIva2pRdi9PYkZpTDUzSmMzdUsrQVFKSDFzKzUzeWY1Y0pTZm9KWHFmVGMwbXJIaE1xZUxPUEVya3ZNbHZ4UloxY2RwalFKZkFydkZaZ2FmdGl3SVFnN1lXakIvUklTK0Jrc0JiOERMeUVpaUtYOU85UUs5dExFbnR3SHlIYitpWExzYlQ5T2ZCTDg3ZFN0cjBDdmk4eXJEZGxZZE82T3FlZHBidTNPZVUrYWhyekV2aVNiQ0pORTVMMG85THRUM3JYNkd3S3ZFZG1vNnZHTitnK0V2V3hDNXh5QjJJclQ4Qk0wcHNrMDJ6eVRsUGdPK0REcXMyNXBFOGtyZG01RzdZUVkxeFRpemsydE5KOWhmcklTaTZBTTJCT3ozMVhJNlljWm1hdlNaNnRhY3dZNDU2a3IwazUwVXJTVjVKK3FQdnNKWGZiMkRnUGtMdFptWVh0OHhCQ2FiY1A3R2VCaDZMNlZSNnpwRGg3d0RmQUJmQ1ZHcmViclZPVmxYaE80dWViTFBIUUthbmdSTko1YnJ0QldZNUFtem1WRmRwQU8rZWU3UG1ramFzY3dSYjBNUnREMUUwcFQ0RjNhc0hiaE85VUlEY3FIWWJtelBlbHVIM29JY3pheXFOb3pMRjNaTmRqQmQ5aWpIZ0ovRDNVMzZBQ1NuZGtmenZkckI4eE1xMXVHN2hqNDIrVVNaTjF5a2pYUEdvRmNrY3ZiYzl0SDBtYStmVW5CYTNDRENuVlVvNGtUN1A5aSs1cW9DVnc0dXBUQTlJbFI2dGdZNUQ5K3dYVkJjZHRjS2R2SlNSZDJYNUJXdW9Ea2lLN09jaDFmb0pRbmE5WHRoY2tzdUJlSDN0c2JjZmxlN1A2YzV0WGhjbHcra3hoU2pyOUxiTmIzTXJuTnY4QmRob1RuZWYrVXdzQUFBQWFabU5VVEFBQUFBVUFBQUF3QUFBQU1BQUFBQUFBQUFBQUFHUUQ2QUFBdnltZjlRQUFCYUptWkVGVUFBQUFCbWlCN1pyUGFtUkZGTVovWDlHRU1EUWhoQ1lFR1VJWWhoQUdCQkVSOFJsRXhCZHc0VUo4REJjdVhJbExGL01NaWd0WHVuSHRRb1poQ0VHR01JUmhDR0VJb1FsTjA5VG5vcXA2Ym03dXYveGQrY0dsRDdkdlZaMVRkZXFjVTkrOTRwWmdld1NzNXVzQmNDcnBMUDgzeWZmT2dSa3drN1M0alhGSDEyMW9HMkRGOW9ha0RXQU5HTmtPQUpJT2dMUDgrQWF3bGVVSUxHeWZBVy96TlpkMGZ3YllmZ0E4QkNhU1J0a1loaWhoTzBoYUFTWjVaUmFTVG13ZlNUcS9xaTVYTXNEMnF1MmRQSENaNmFGdGtZU2t1andpcmM1bWpQRkUwcUdrMmEwYVlEdlkzZ1IyOHV4ZFFOV0lOb1BhbnFuSVFkSW1zQjVqUEpSMExDbjI2UmFHS0E4OGxyUnJlNlc0aTIzNjVKYisrdVFWWUJkNFhQWlRGNGE2MEVxWFVrMm9QejlBOGJxOEpTblkzdTl5MDFZTEt4c3oydDRIM2hhL3pmZDc1U3JLL2FFWEtkeSs2dHRqalFia3BkdTF2UW9RUWxoSTJnZmVYblVtcndQYk0wblBTMVRLZTdCUjEwdm1GWiszdlVWS09QV09ua2phcUliT2lqeTNQWlUwQlk0cjdkWkl1V0FNakcxZkNnUkxoVktiRjVXMkk5dDdrdWJBUVgxRm1nellJbTJpZ2hud3JJUzJIUGIyc2tJRlUrREk5cW1rMXFSVVNYN3J3RU5KNDlyLzlRbTdNSmJ0Z3hEQ20xWURzc3Q4VUdhb01ydm51ZU1aUUl4eEpHblA5bGpTSVdtMmUwTmVGVEhHRWpaM3NsR05xdzFzbEFteFBaZjBUelZQcU5icEhyQzUvUE9pZTh5QUN3TUFvN3kwMTBhZXJCM2dxTzQyWEZ6bGd1TVF3djRsQTNKNThGSFBlRFBiejBJSWd6UGxFTVFZQ1NFVVBacGN0STYvaTdFaE53SjRPQ0JKclFMYk40MHlkVlNVRDhDZTdTN2xMK2hhUXROcXJtLzZRdUE4MXlvM1VyZ0RJMUtrV2s1Y3l6VWhsZTFMQTlZbGpScVNTVjArdktuUGR5SDNmVGdnMFkyQTlhb0Jrd0cxelJRNHZpdmxLempPWS9WaEFoRHlqbC9HNHpZWHl2WDZsVUxsZFpESE9PcHhJV3lQYlk5R3dJTzhKRzBkQXN4dG45NjE4aFdjWm5kcXpkaWsvZklna0RaRDZISWhZSHFYdnQrQU9mMXVGSURWRVNrQ0xlODJ1WkR0c3hMcTdnT1NpREdlMFowTElCc3dKZTM4QU1SOFpvM3c3aGhJT25qZkt5U1ZNUU9KQ0dpU2gyejIvM0duVUU3YmExeGVwdXJ2U2E3eDd3MHh4bkhtbTFwaGUxcFM5M2Erc2N5NlJjNi9rWHYydDZ6OFRzOWpoNEYwWUxtZ2ZLMGpnTFhiTHVDNmtNUDRXdDl6a21iRmdNNE1tek4xVjFLNWJheElHdmVVTjlIMkxBRG50aGZWdzB0TmVVaktyOStiK21tc2xSN21Zd0djaHl4TWUxd0k0R0dNOGM2eldUNFR2RGZnMFdrSVlWSDR6Wk1CRGNhU0pqZlNiaGdteGY5N3lwc1RlRmRPbjBwYWRMaFF3YU11U3VTbWNLSXVIdzBnenhiQWFkV0FtZTJUSGhlQ3RCZDI3akFpTFlia0c5c241T2k1cE1nbHZSN1FjRVppRDI2cWFMM2Zva2NFbGd4Z213dEplbDEwV0c3S3dxWTFkRjdFSnQ3bXh1NlV6N2ZmMjk3T2VpeUFmVWx0WE94eGRaWHFVZVdRVklzdmtSdWVjNUVUR2dGUGdBOXRiM2tBRFY1SGpISEY5dWZBTDhDWHdGUGJqeXBHdk9CeUZUelBPcjdUcjZIakpiV1ljME1qM1Zlb2p6d3JVK0NJdExHNnFNVkFpdkdmQWw4NThheWovQitTWGdGZjU5K21zUTRrdFZPTGxVRWVPL0h6bDlnNDk1QzcyWmlwN2VNUVFtbjNNZkFKOEQ1cDVickM4VXZnbTdvUnBObi90MzR1YjV5cWJNUXVpWit2czhSOXA2U0NmVW5IdWUwUHdCY0Qyd0c4eWthOHJPaERYWGxvZVQ5UW9rRVRWem1BTGVna3g5cU9yelY1Ry9pNXNyRmpHeVBTdXZrcVpYV296M3pWeDl2a3ZuNEh5TnZBdDMwQll1ZzdzdmtWQjc4UmNuSDVHL0JkSHhmVmE0RFNPN0ovbmQ2czd6Q3dyTzZJUkpjT1RUWDVSTktQd0s4YThEbkNvQlhJcy9ERzlxbnRIVW1UeXNhcVJxRStjcmhyNVJiQTc3Wi9DaUVjRGRGcnNBR1ZRV2JBdml1ZkdwQmVjalFxTlJDbndCL0EweEoxcm9KcmZTc2g2ZHoyQVNrcmJwQU1HZWVZM2ZjSndweWs5SFBnVCtBdlVubHdIVldhODhCMWtOK2JWVCszZVZ0cUZ0dWZrYUxLU3llUytQQzJXSTcvQUJQMUZoV2Z1N3pxQUFBQUdtWmpWRXdBQUFBSEFBQUFNQUFBQURBQUFBQUFBQUFBQUFCa0ErZ0FBRksvVEJ3QUFBV1pabVJCVkFBQUFBaG9nZTJheldvY1J4U0Z2MU1NZ3pDREVFSUlFNFFSeGhnUlRBZ2g2eENTZFNDN1BFbklJdmdKakJmQlQ1QjlDSW1mSVdRVmduR01FU0lFRVlReFFoZ2hCakVNUTUwc3FtcmMwK3FlYm1ra3JYS2dVYW1ucStyZXF2dFhwMXRjRTJ3UGdMVjgzUUZPSlozbDM3Ynl2WE5nQWt3a3phNWozc0ZWTzlvR0dOcmVsTFFKckFNRDJ3RkEwZ0Z3bGgvZkJPN21kZ1JtdHMrQWQvbWFTcm85Qld6ZkFYYUFMVW1EckF4OWhMQWRKQTJCcmJ3ek0wa250bzhrblY5V2xrc3BZSHZOOW02ZXVLeDAzNzVJUWxLOVBTRHR6bmFNOFVUU29hVEp0U3BnTzlqZUJuYno2aTJncWtTYlFtM1BWTnBCMGphd0VXTThsSFFzS1hiSkZ2b0lEenlROU5EMnNKaUxiYnJhTGVOMXRZZkFRK0JCOGFkbDZHdEN3MlZDTmFIK2ZBL0I2KzI3a29MdC9XVm0ycXBoeFRHajdYM2dYYkhiZkwrelhVVzUzL2NpaGR0L3UzeXNVWUc4ZFE5dHJ3R0VFR2FTOW9GM2wxM0pxOEQyUk5LckVwV3lEemJLZWtHOVl2TzI3NUlTVG4yZ0R5VnRWa05ucFQyMVBaWTBCbzRyL2RaSnVXQUVqR3hmQ0FSemdWS2YxNVcrQTl0N2txYkFRWDFIbWhTNFMzS2lnZ253c29TMkhQYjJza0FGWStESTlxbWsxcVJVU1g0YndJNmtVZTMzK29JdHpHWDdJSVR3dGxXQmJESWZseFdxck81NUhuZ0NFR01jU05xelBaSjBTRnJ0enBCWFJZeXhoTTNkckZUamJnT2JaVUZzVHlXOXFPWUoxUWJkQTdiblB5NmF4d1JZbUFBWTVLMjlNdkppN1FKSGRiTmhjWmNMamtNSSt4Y1V5T1hCcHgzelRXeS9EQ0gwenBSOUVHTWtoRkRrYURMUk92NG95b2JjQ1dDblI1SmFBKzZ0R21YcXFBZ2ZnRDNieTRSZmtMV0VwclZjMzNTRndHbXVWVllTZUFrR3BFZzFYN2lXYTR0VXRzOFYySkEwYUVnbTlmYmhxamEvREhuc3d4NkpiZ0JzVkJYWTZsSGJqSUhqbXhLK2d1TThWeGUyQUVMMitIazhiak9oWEs5ZktsUmVCWG1Pb3c0VHd2Ykk5bUFBM01sYjBqWWd3TlQyNlUwTFg4RnBOcWZXakUzeWx6dUI1QXhobVFrQjQ1dTAvUVpNNlRhakFLd05TQkZvZnJmSmhHeWZsVkIzRzVCRWpQR001YmtBc2dKamt1Y0hJT1l6YTRUM3gwRFN3ZnRXSWFuTUdVaEVRRk83ajdQL2p4dUZjdHBlNStJMlZmK2U1QnIvMWhCakhHVytxUlcyeHlWMTM4czM1bG0zdFBQZnlDM2JXeFordCtPeHcwQTZzQ3dJWHhzSVlQMjZDN2hseUdGOHZlczVTWk9pd05JTW16UDFzcVJ5M1JoS0duV1VOOUgySkFEbnRtZlZ3MHROZUVqQ2I5eWErR211WVFmek1RUE9RMjZNTzB3SVlDZkdlT1BaTEo4SlB1ang2RGlFTUN2ODVrbVBEaU5KV3l0SjF3OWJ4ZjQ3eXBzVGVGOU9uMHFhTFRHaGd2dkxLSkZWNFVSZDN1OUJuczJBMDZvQ0U5c25IU1lFeVJkMmJ6QWl6ZnJrRzlzbjVPZzVwOGdsdmVuUmNVSmlEMVlWdEQ0dVdZNEl6Qm5BTmhPUzlLYklNSGZLd3FhMURjNUZsbTdZNC9EZFIvZ2hGUm96bThlK3BEWXU5cmk2Uy9Xb2NraXF4ZWZJSGM5WjVJUkd0cDhCdjlyK09zWjRhYit3SFdLTTI4QW5wQmNjSDJWcXB5anhtb3RWOERUTCtGNisrc0F4eGptMW1ITkRmZVZId0JQZ2kvei9UTkpyNEVmZ2QxSkFhRXlNdFp5eWs1bTlPbmwyZ2NZc095M3BRRkk3dFZoV2hrenVOckJ4UStBWjhIbVRnTUNKN2RlUy9nS2VaOW9SSnk1MEl3dmNsZFhMYnRlNTJDbndkMzF4R3IweEsvR1F4TStmUTZvT2dhZVMyb1N2ai9GZENPR1gzRjZnTEh1Z2ljYWthV2ViT2ZjY0RhcG1JK2xKWCtIYjBJTzZLZTAxNEZIRnNXT2JXYmFXQnBXeWVnZzh0ZjNGS3NLWE1Yc2txZEx1UldQMnFXMEM2ZlhTdGJ4WnZ3VGVrbXgrNlVPZENtUm5lbXo3TWJuK3VDcjZtQkRKV1E5b2NOZ205S291SmMxQ0NEOEQzd0RQZ1N2dFJvZlpSRklpZlNIcGJWOFc4Rkxsc2FRalNkOENYd0Uva1F1cVZXQjdSaktYUHlYdDZ4SnY2ZUdLMzBwSStpZkcrRDN3QS9DWnBDOXRQNUswd1pJWVh6bGZ6MnlQU1dUQlNoOTdYRnRWbGpQMEx1a2prRjNnTjBtdjhtL2JwS2h5bmpQN3RYMXU4eDh5cy91RkVJU0Nkd0FBQUJwbVkxUk1BQUFBQ1FBQUFEQUFBQUF3QUFBQUFBQUFBQUFBWkFQb0FBQy96SDFBQUFBRmpHWmtRVlFBQUFBS2FJSHRtczlxWkVVVXhuOWYwWVFRbWlHRUpnUUpFb1poQ0xQUVdiaHc0Uk80OUFWY2lTdFg0Z1BJUElTNDhnSGN1MUZjdUhZaGd3d2hETklNUVlZUVFnaE5hSnJtZmk2cWJxZjY5djNYU1NjclAyaFN1YmYrbkhQcTFEbDF2eXF4SWRnZUFOdnB0d05jU2JwTzcwYnAyUTB3QmFhUzVwc1lkM0RYaHJZQnRtenZTZG9EbmdBRDJ3RkEwaWx3bmFydkFRZXBYQUJ6MjlmQVpmck5KRDJlQXJaM2dFTmdKR21RbEtHUEVMYURwQzFnbEdabUx1bkM5cG1rbTNWbFdVc0IyOXUyajlMQXBhWDd0a1VTa3FybEFYRjI5b3VpdUpBMGxqVGRxQUsyZysxOTRDaFpid201RWswS05kWEp5a0hTUHJCYkZNVlkwcm1rb2t1MjBFZDQ0Sm1rNTdhM1NuZXhUVmU1b2IrdThoYndISGhXcnFjMjlIV2hyVGFoNmxDdDMwUHdhdmxBVXJCOTB1YW1qUnBtQzdPd2ZRSmNsbjZibm5lV2M1VFArLzZJNGZaZDF4cXJWU0JOM1hQYjJ3QWhoTG1rRStCeVhVdmVCYmFua3Y0dW8xSmFnN1d5cnFoWCtyenRBMkxDcVhiMFF0SmVIanF6OHN6MlJOSUVPTS9hUFNIbWdpRXd0TDBTQ0JZQ3hUWnZzcllEMjhlU1pzQnBkVWJxRkRnZ0xxSVNVK0IxR2RwUzJEdE9BcFdZQUdlMnJ5UTFKcVVzK2UwQ2g1S0dsZmRWZ3kyTlpmczBoUEMrVVlIa01pOUxDMlhXdlVrZFR3R0tvaGhJT3JZOWxEUW1XcnN6NU9Vb2lxSU1tMGRKcWRyWkJ2WktnOWllU2Zvcnp4T3FkSG9NN0M5ZUxydkhGRmdhQUJpa3FiMHprckdPZ0xPcTI3QTh5eVhPUXdnbkt3cWs3Y0VuSGVOTmJiOE9JZlRPbEgxUUZBVWhoRktPT2hldDRzOVMyWkFhQVJ6MlNGTGJ3SWYzalRKVlpNSUg0TmgybS9CTHNwYWhhVHZ0YjdwQzRDenRWZTRsY0FzR3hFaTFNRnpEYjBUY3RpOFUySlUwcUVrbTFmTDR2ajdmaHRUM3VFZWlHd0M3dVFLakhudWJDWEQrVU1Kbk9FOWpkV0VFRU5LS1g4VGpKaGRLKy9XMVF1VmRrTVk0NjNBaGJBOXREd2JBVHBxU3BnNEJacmF2SGxyNERGZkpuUm96Tm5HOTdBVGlZZ2h0TGdSTUh0TDNhekNqMjQwQ3NEMGdScURGMHpvWHNuMWRocnJIZ0NTS29yaW1QUmRBVW1CQ1hQa0JLTkkzYXdHM240SEVEKzlIaGFSeXpFQWtBdXJLZlJiNy8zaFF5UFpud012cWk5SjkwdC9mSmIxNVRNR0tvaGdtdnFrUnRpY0QyeDlKK3FiNk1zL0VDWStxUUJMK3FLUGFPQUJuUGZyN3VBOURzQ21rTVA2a3E1NmthUURHdGxkNHlrbzRmZEZqaDdoSmJFa2FkbXh2Q3R0UkFVa3JXYmF5NHh4Sit2UVJCQyt4UzFTaWpmbVlBemNoaEhCTlAvLytzaWlLdHRTK0VTUlgvYUJIMVVrSVlWNzY5YTgxSFMyVkV4dngrV2JFYk1XbzlQK083YzBGM0c2bi8rQ1dDZ2RXK2N1MDRmdjJJZGVDSTNYNXRBZDVOZ2V1Y2dYZUE3LzFHR01mK080Qkk5SThjVXF0c0gxQnBIdVdLUEtmOG1qVXNNRjdCL3k0NmUrQ2pQa29nQVVEMk9SQ2t2NHRaMk5oU1VtbmtuN0ovcWRTZmdkOG5YaWdrcmU1OTZKT2ZTeG96T1FlSjVLYXVOanpmSmFxeE5ZQjhETVpONVF3cmdoZlVoL0Q5RzV0WWlzWllDVHBLZkhEcFk1M2VzSHlsbm9HTkJOYnFlRVh0bDhSU1N1SWx2K3FLbnk1bUZPZENUR2pYOUZ5M3BWY1lJc1k1dzhUczFjbHoxWm96R3lzVTBuTjFDSXNhTU5Yd0JmY3VzMC9tZFZheWQya3pNVDJlUWlodE9ZdXNKc0VIdEwrcVhoRG5Ja3FGenNEM2xabnV0WlV5UisvQjM3SUxlL0lFdmNOb3llU3psUGJKY3F5QityY2lUbzNiV1NvS2w5bWJWeGxMU1N0S05Bd2EwM2xKWGRxUW1NOHo0UVBWY3ZYUktpVmNrT2Y2NXp3OUtJeCs1NlJ6Zm9LM3FYRUduaFA5UG5XU3AwS0tKNlJ2WFU4V1QraWZRSG03VmFlOVhFaG9ySEc5QXpOdldZZ2RmVGU5cFh0STBtamJHSFZDdE9sVkUyNUlHN1FObi9RblEwMEJVNmNYVFhnTmwrc0NOWUh0dWVTTHNnT09OYkJuZTVLU0xxeGZVcWM2ajJpSXNNVXN4dXZJQ1NDb0x6c01RRXVFdjl6NThzZUcxdHhLUUhtMTIwdXl6Mkw0eldGYmVERzhTeHNZOWR0L2dPUk12Ukh6S3lmUkFBQUFCcG1ZMVJNQUFBQUN3QUFBREFBQUFBd0FBQUFBQUFBQUFBQVpBUG9BQUJTV3E2cEFBQUZrV1prUVZRQUFBQU1hSUh0bWoxclhFY1loWjh6TEVLWXhRZ2hoQWhDQ0dPRU1TR0ZmMENxcEEvK0J5R0Z5WTlJRlZLa2NKVTZSZW9VNlZLbVRoRklNTUVJWTR3UXdoaXhDQ0dFV01ReUo4WE1ySy91M3ErMVZxNXk0TExEM1RzejU1MTVQMmJlR2JFaTJCNEI2L201QjV4THVzai9iZVYzVjhBVW1FcWFyYUxmMFlkV3RBMndabnRUMGlad0h4alpEZ0NTWGdFWCtmTk5ZQ2VYSXpDemZRR2M1ZWRhMHNjVHdQWTlZQmZZa2pUS3dqQ0VoTzBnYVEzWXlqTXprelN4ZlNMcGFsa3VTd2xnZTkzMmZ1NjRqUFRRdWtoQ1VyMDhJczNPZG94eEl1bEkwblNsQXRnT3RyZUIvVHg2TjFBVm9rMmd0bThxNVNCcEc5aUlNUjVKT3BVVSs3aUZJZVNCaDVJT2JLOFZkYkZOWDdtbHZiN3lHbkFBUEN6MjFJV2hLclRXUmFvSjllOEhFSytYZHlRRjI0ZGRhdG9xWWNXYlJOdUh3Rm5SMi95K3QxeEZlVC8wSWJuYjR6NGJheFRBOWpyd2crMDlnQkRDVE5JaGNMYnNTSDRJYkU4bC9WdThVcmJCUnE0TEw3TlgrQTU0YXZ0bjJ3OEFjdUI1U2ZMYmJZU3ZiWjlKT2k1QkxPTWRjSnpyWGhjN2FYcUFxeHI1a2UzSEpKdFlFR0JoZm1LTVR5VjlUN1lQMjhlU3ZwRjBYQkh3RVNrNEZWd0NKN2JQSmJVR3BVcncyd0IySlkxci85ZEgva1pmdGwrRkVONjFDbUI3Qi9nVjJLNzEvUVo0Vm9TSU1ZNGtQYkk5bG5RRURISjVWY1FZaTl2Y3owSTFxYzFqWUxNTWlPMXJTZjlVNDBSZGdCK0JyNW82ekRQeFROS2IwZ0V3a25TOURQR0dkdGV5RUNjMXRhblBjc0ZwQ09Gd1FRRGJCOEJ2ZEx2V1kyQ3VUcXRDakpFUVF1SFJwS0oxL0ZXRURia1N3TmYweDRVOTROc1lZMitBV1FZVjhnRjRaTHVMUE1CdU1laENaQWY0WWtCZnA4RHpFTUpTK3I0RVJzQVlhUFZTK2RraUxkdm5BbnhPV2c1M1lXYjd1YVRKSFpFbjI5UFJnRUEzQWpibUF0aitja0Q3THlYOWZsZmtLemdsdWVVK2JBRUUyL2NsUFI1UTRaZmJlcHdoeU83NHBFZUZzRDIyUFJxUlhOaEdWNk8ySjVMK3ZHdnlGWnpud1ZwWXVsY3dBdTRGa2dDZDNxZXNnMVpHcngvWDlLdFJBTlpIcEsxaEgvNWVOdExlQnBLSU1WN1FIUXNBMWtlMlgwajZxZWZEUDFiRWJUQWtsUmtQcEVSQVUzbUlzZitQTzRWeTJMN1A0alJWZnllU1B1cDB4UmpIT2QvVUN0dVhKWFR2NVJmejdXQXA1OS9JUjlhM1RINi81N09qUU5wNzNpQmZhd2pnL20yM2ljc2dCNnErcFEyU3BrV0FUaGRwZTB4M1VGazExaVNOZTFJMzBmWTBBRmUyWjBWZEdzaERJdDhaclZlTURaSVFYWm1QR1hBVmN1R3lSNFVBZGxlOUQyaEMzaE44TXVEVHl4RENyT1IraGl5Ung1SzJic1Z1R0xhSy9uZXBFRENCOS91QmMwbXpEaFVxZUpEM3NIZUNuTHA4TUNCNU5nUE9xd0pNODRwem9kSGF1elZnL3c0OTBteEl2TEU5SVh2UGVZcGMwdHNCRmFlazdNRnRpZGJiSmZPSXdEd0QyS1pDa3Q0V0RuT2p6SktmdGpWT09oYXE1MjF1clU2NWpZT2N6aXpxY1NpcExSZDdXcDJsdWxjNUlxM0Y1OGdWcjRCNnh1d3g4TVQyVGx2ZXNvZDRpREZ1QTA5SVNZWFBuRTUrRnRLWUZWeG5qdS81MVJ1T01lNlE4dk5sS2RHWTdpdXBqendxbDhBSnliQjZVNHNrUDcrYk0zdFYxWmdDTDBybXJhR3ZWNUxhVTR0bFpFaUoxSjNjMEVLNlQ5Sm1wZE1xZ2JLVHVyUjlHa0lvOVRhQWpVeTRMNnFYMmI0aEJHbjBYOWMzVm8xRGxZVTRJT1huYjZUNytsYUlGUnhLT3MxMUg3R1liKzNDd3NEQjNNaHZvRkYzaXpkb3lsVU95QmEwbmcvMHJHMnE1WFhnMDRwaHg3WXRiYXZ4VlpiVm9UN3lWUjF2SzdlMU9TQklsZkk2c05jWGM0YWVrVjBQSmI3Q0dQR09wUE9kSC9VS29IUkc5dHJwWkgyZmdjdnFwbzViRFA5R21mZXVjdENadzZBWnlBMjlzMzF1ZTEvU1ZzV3dHc24wQ2RWUWpxUUYydW9QdWlzZFRZRkRWNjRha0E0NUdva05RZDZMVEtnY2NDeUREN29ySWVuSzlpdlNWRytTQkJsbm45MTZCYUd5djU3WnZpUWxDMjUxMldObEZwZlB6YXJYYmM3S21zWHBtc0k2YWZjM2xiU3k2emIvQWNldjZhbFgvTVBtQUFBQUdtWmpWRXdBQUFBTkFBQUFNQUFBQURBQUFBQUFBQUFBQUFCa0ErZ0FBTCtRM05NQUFBV2FabVJCVkFBQUFBNW9nZTJhdjJwa3lSWEdmMS9SQ0NHYW9SbUVFSXRZeEdDR1lWaU1XUnh2WUcva3dQZ2QvQVRMQm83OEFBNDI4Z1A0Sll4REJ3Nk1Bd2RtYkFZeExFWVlzUXlpRVdKb1JDT2EramFvVTVyYnQrL3RlelZxS2ZJSGpVcmRkYXUrVTNYKzFha3Jkb1NjODFUU0tYQmkrMVRTM3lXOUFiQjlDQndBTjhBU1dFcGE3V0xleWFjK2FCdmdDUGpLOWk4bGZXRjdKbWxQRXJibndKdm8vaHc0am5ZR1ZyWS9BRmZ4dVpYMGRBTFlmZ0g4RnZnYW1OWEp4NUN3blNUdEFZZXhNeXRKYzlzWGttN3V5K1ZlQXVTY1B3TytBWDQxOUd4YkdOdElJbmFuMlo1UWR1Y281enlYZEM1cHVWTUJZcEpmMi81VzB1SFl3WnRvQ3RUVFRwS09nRm5PK1Z6U3BhUThOTzZnQUxiM2dkL2IvbzJrMFRzV050TDVmU1hkMDk0RFhnTFBiSDgvSk1SWVFrZjNJUS9kS25UUDlyR2taUHRzbTIybHZoL3FZS0dQM3dKL0hjMitBMVhueDM0bzd2Wi9RNDZoVXdEYkNYZ1o2b09rRDhEdmdMODlSSWl4c0wyVTlKL3FsV3luNExTQkRmR2k0MDlzSDFNQ1RuT2dmZHQvbFBSVno5eHo0QzN3YitEUGt2NGJ6ejJqeElJcE1MVzkxMGMrNW5yYm1ITmkrNVdrVytCZGUwZTZCRGltR0ZIRkVuaFRYVnVRK1FQd2kvZy9TM29ML01uMlB5UmQ5UmxlcU9XZTdSbHdJbW5hK3IyOVlCUGdWUWlQN1hjcHBmZTlBb1RLL0t5dVVQWFp3RTBNM0JUaXV4ajhPK0F2c1VLamtYT3Vidk0waE9wU205ZkE4NGFudXBYMHIyYWNVR3ZRVjVUMGdKWUExWmpYMUFtWVNwcmZoM2dic1ZpbndFVmJiWWlWYitFeXBYUzJJWUR0QStEbkEvTXRiYjlKS1kyT2xHT1FjeWFsVkhtc3FVMFAvbG1GVGZFUWxDeXlEa0pQZXgvNHZDOUlmU29hNUJQd3l2WTI4bXRjcTJ2YWo4U3FONElHYmlOWGVSRGhMWmhRUE5YZHd2VjhEb0g5cGdBelNaT09ZTkp1bjkvWFdPK0RHUHQ4UktDYkFMT21BSWRiMUthMkY4RGxZNUZ2NERMbUdzSWhRQXFMdi9QSFc1S3dpekhaNFVNUmMxd01xQkMycDdZbkUrQmdXNklXNm5OcisvcXh5VGR3SGVyVUc3RXA5bktRS01hUXRxa1FzSGhNM2UvQUxjTnFsSUQ5Q2NVRDNYM2JwVUsyUDFSWDl4U1FSTTc1QTl0akFZUUFDNHJsSnlESG1UWEQyaUhqNmxFWmQwQlNuVE5SQ2dGZDdUSEcvbjg4S2hSaCt4bWIyOVQ4TzVmMHBOc1ZoYkt0Tm1CN1VVUDM1L0hGeGlFNy9tYWVXTitDL09sQXQvTkVPYkNza1c4TkJLVkNzR09LL1FnMy9teW9uNlJsRldCcmhJMUl2UzJvN0JwN2txWUQ2VTIydlV6QWplMVY4L0RTSWcrRi9Peko2SmU1OXJZa2xhZ1VoMjlTTkJZREtnUndrbk4rOUdnV1o0TFBSblJkcEpSV0NXRGtzWEQ2cVdYRmUrS3c2djlBZWpPSGorbjB0YVRWRmhXcWVMR3RKUEpRMk42ei9XS0wydFQyQ3JodUNyQzBQUjlRSVNpMmNQcUlIbWsxSnQ2NDNEMHNJUVFJNlg0WThlQ1NVajE0S05IMnVBU1BESndCVjgzY3YvWnA5UHVoY3JnenlwQjg0OFRWV08ydXVzMkQxU25HYUpZeFY4QlpGTWk2Vk9peXVVdHRyM0pPeWNYdkVBL2VzRjRUbWdDdmdTOXRIN3VuYmpsQVBPV2NqNEF2S1JjY1A0M1NUaFhpTFp0WjhHMXcvTWl2UFhETythNjBHTEdoczl4WFN4K3hLZ3ZnZ21KWXZmZGRyWmh5WW52YVVUeHJsakhiYzcyVDFGOWFyQ3RERkhjN3FuSEo5bXRKenh1VE5nblVrOVRDOW1WS3FUNDNBMlpCZUNpcTE5MWVFNEt5K2hzWEhwMUxGVUs4cE5UbjIxWGlvVk5TeFpta3kzaDJyV1E1QWhzTEIzZEd2b2J1bW50NGc2NWE1WWhxd2JiS3hsRHBwcmIzZ1M4YWhwMzdLaUs5eHRkSXExTjc1WnM2M3RmdUczTkVrS3J0VVdYTXNmZGV0Mk9KN3pCR3ZLZm8vTlpPZ3dKSXlyYS9kN2xaUDJWa1d0MDFjWS9ocjdYNTZDcDNjODBhQTJmZ3ZlMXJsL2NnRGh1RzFVbG1TS2lPZHFZa2FMdS82RzVNdEFUT0l1Q2NVT3FUazRlb1VKeEY1alF1T082RFQzcFhRdEtON1hlVXJYNU9FV1FhUHZ0dVp6ckkxdDFjMlY1UWlnVVBldGxqWnhhWGM1NUkycWQ0andQZ3F1WXN0by9pKzV1STdEdDczZVpIL3luNHNXS3RRVm9BQUFBQVNVVk9SSzVDWUlKWlEyTnlVM2N5ZUV4aGRqZDRMMU41UlUxT2VIbFJSbWRUTmpBeVFWSk5Wek50YkRoTlN6ZEdUVGRFTm1oV2FUZERXRGh1YVVkTFpWaExhWGR3YjFKbycpXG5cblx0Ji4tc21hbGxcblx0XHR3aWR0aCAycmVtXG5cdFx0aGVpZ2h0IDJyZW1cblxuXHQmLi1pbmxpbmVcblx0XHRkaXNwbGF5IGlubGluZS1ibG9ja1xuXHRcdG1hcmdpbi10b3AgMFxuXHRcdG1hcmdpbi1ib3R0b20gMFxuXHRcdHZlcnRpY2FsLWFsaWduIG1pZGRsZVxuXG5cdCYuLWludmVydGVkXG5cdFx0YmFja2dyb3VuZC1jb2xvciByZ2JhKCMwMDAsIC4zKVxuXHRcdGJveC1zaGFkb3cgMCAwIDAgLjRlbSByZ2JhKCMwMDAsIC4zKVxuXG4ua2luX2xvYWRpbmdfX2xhYmVsXG5cdG1hcmdpbiAuNXJlbVxuXHRkaXNwbGF5IGlubGluZS1ibG9ja1xuXHR2ZXJ0aWNhbC1hbGlnbiBtaWRkbGVcblxuQGtleWZyYW1lcyBzcGluXG5cdDEwMCVcblx0XHR0cmFuc2Zvcm0gcm90YXRlKDM2MGRlZylcblxuPC9zdHlsZT4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBLaW5FbGVtZW50IGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuXHRcdHRoaXMuaW5pdFRpbWVvdXRJZCA9IG51bGw7XG5cblx0XHR0aGlzLmluaXREb25lID0gbnVsbDtcblx0XHR0aGlzLmluaXRGaW5pc2hlZCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHR0aGlzLmluaXREb25lID0gcmVzb2x2ZTtcblx0XHR9KTtcblx0fVxuXG5cdGNvbm5lY3RlZENhbGxiYWNrKCkge1xuXHRcdHRoaXMuaW5pdCgpO1xuXHR9XG5cblx0ZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG5cdFx0aWYgKHRoaXMuaW5pdFRpbWVvdXRJZCAhPSBudWxsKSB7XG5cdFx0XHR0aGlzLmluaXRUaW1lb3V0SWQgPSB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuaW5pdFRpbWVvdXRJZCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5lbGVtRGVzdHJveWVkICYmIHRoaXMuZWxlbURlc3Ryb3llZCgpO1xuXHR9XG5cblx0YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUpIHtcblx0XHRpZiAodGhpcy5jb25zdHJ1Y3Rvci5vYnNlcnZlZEF0dHJpYnV0ZXMpIHtcblx0XHRcdHRoaXMuaW5pdEZpbmlzaGVkLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmhhbmRsZUF0dHIobmFtZSk7XG5cdFx0XHRcdGlmICh0aGlzLnVwZGF0ZUVsZW0pIHsvLyBUT0RPOiByZW1vdmUgaW4gZnV0dXJlLCBvbmx5IGZvciBpbnB1dC5qc1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRWxlbSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRoYW5kbGVBdHRyKG5hbWUpIHtcblx0XHRjb25zdCBjZmcgPSB0aGlzLmNvbnN0cnVjdG9yLmF0dHJDZmdbbmFtZV07XG5cdFx0aWYgKCFjZmcgfHwgIWNmZy51cGRhdGVGbikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGF0dHJWYWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuXHRcdGlmIChhdHRyVmFsdWUgIT09IHRoaXMuYXR0clN0YXRlW25hbWVdKSB7XG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShjZmcudXBkYXRlRm4pKSB7XG5cdFx0XHRcdGNmZy51cGRhdGVGbi5mb3JFYWNoKChmbiwgaWR4KSA9PiB7XG5cdFx0XHRcdFx0dGhpc1tmbl0obmFtZSwgYXR0clZhbHVlLCBjZmcudXBkYXRlQ2ZnW2lkeF0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXNbY2ZnLnVwZGF0ZUZuXShuYW1lLCBhdHRyVmFsdWUsIGNmZy51cGRhdGVDZmcpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmF0dHJTdGF0ZVtuYW1lXSA9IGF0dHJWYWx1ZTtcblx0XHR9XG5cdH1cblxuXHRpbml0QXR0cnMoKSB7XG5cdFx0aWYgKHRoaXMuY29uc3RydWN0b3IuYXR0ckNmZykge1xuXHRcdFx0dGhpcy5hdHRyU3RhdGUgPSB7fTtcblx0XHRcdGlmICh0aGlzLmNvbnN0cnVjdG9yLm9ic2VydmVkQXR0cmlidXRlcykge1xuXHRcdFx0XHQvLyBnZXRBdHRyaWJ1dGUgcmV0dXJucyBudWxsIGZvciB1bmRlZmluZWQgYXR0cmlidXRlXG5cdFx0XHRcdHRoaXMuY29uc3RydWN0b3Iub2JzZXJ2ZWRBdHRyaWJ1dGVzLmZvckVhY2goYXR0ciA9PiB0aGlzLmF0dHJTdGF0ZVthdHRyXSA9IG51bGwpO1xuXHRcdFx0fVxuXG5cdFx0XHRPYmplY3Qua2V5cyh0aGlzLmNvbnN0cnVjdG9yLmF0dHJDZmcpLmZvckVhY2gobmFtZSA9PiB7XG5cdFx0XHRcdHRoaXMuaGFuZGxlQXR0cihuYW1lKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnVwZGF0ZUVsZW0pIHsvLyBUT0RPOiByZW1vdmUgaW4gZnV0dXJlLCBvbmx5IGZvciBpbnB1dC5qc1xuXHRcdFx0dGhpcy51cGRhdGVFbGVtKCk7XG5cdFx0fVxuXHR9XG5cblx0aW5pdChmaW5hbFRyeSkge1xuXHRcdGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fb3JnU3R5bGUgPSB0aGlzLl9vcmdTdHlsZSB8fCB7cG9zaXRpb246IHRoaXMuc3R5bGUucG9zaXRpb24sIHZpc2liaWxpdHk6IHRoaXMuc3R5bGUudmlzaWJpbGl0eX07XG5cblx0XHQvLyBUaGUgZWxlbSBpcyBtYWRlIGluaXZpc2libGUgYmVmb3JlIGl0J3MgZnVsbHkgaW5pdGlhbGl6ZWQuIE90aGVyd2lzZSBpdCBtYXkgY2F1c2UgZ2xpdGNoZXMuXG5cdFx0dGhpcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0dGhpcy5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG5cblx0XHRpZiAoIWZpbmFsVHJ5ICYmICF0aGlzLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG5cdFx0XHQvLyBUaGUgY29ubmVjdGVkQ2FsbGJhY2sgbWF5IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNoaWxkIG5vZGVzIGdldHMgdG8gdGhlIGVsZW1lbnRcblx0XHRcdC8vIC4uaWYgc28sIHBvc3Rwb25lIHRoZSBpbml0aWFsaXphdGlvbi5cblx0XHRcdHRoaXMuaW5pdFRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaW5pdC5iaW5kKHRoaXMsIHRydWUpLCAwKTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuaW5pdEVsZW0oKTtcblx0XHR0aGlzLmluaXRBdHRycygpO1xuXHRcdHRoaXMuaW5pdFNsb3RzKCk7XG5cdFx0dGhpcy5lbGVtSW5pdGVkICYmIHRoaXMuZWxlbUluaXRlZCgpO1xuXHRcdHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5lbFRwbCk7XG5cdFx0dGhpcy5lbGVtUmVuZGVyZWQgJiYgdGhpcy5lbGVtUmVuZGVyZWQoKTtcblxuXHRcdHRoaXMuc3R5bGUucG9zaXRpb24gPSB0aGlzLl9vcmdTdHlsZS5wb3NpdGlvbjtcblx0XHR0aGlzLnN0eWxlLnZpc2liaWxpdHkgPSB0aGlzLl9vcmdTdHlsZS52aXNpYmlsaXR5O1xuXHRcdGRlbGV0ZSB0aGlzLl9vcmdTdHlsZTtcblxuXHRcdHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdHRoaXMuaW5pdERvbmUoKTtcblx0fVxuXG5cdGluaXRTbG90cygpIHtcblx0XHRjb25zdCBtYWluU2xvdCA9IHRoaXMuZWxUcGwucXVlcnlTZWxlY3Rvcignc2xvdDpub3QoW25hbWVdKScpO1xuXHRcdGNvbnN0IG5hbWVkU2xvdHMgPSB0aGlzLmVsVHBsLnF1ZXJ5U2VsZWN0b3JBbGwoJ3Nsb3RbbmFtZV0nKTtcblxuXHRcdGNvbnN0IG5hbWVkU2xvdHNNYXAgPSB7fTtcblx0XHRjb25zdCBtYWluU2xvdE5vZGVzID0gW107XG5cdFx0Y29uc3QgbmFtZWRTbG90Tm9kZXMgPSBbXTtcblxuXHRcdG5hbWVkU2xvdHMuZm9yRWFjaChzbG90ID0+IHtcblx0XHRcdG5hbWVkU2xvdHNNYXBbc2xvdC5uYW1lXSA9IHNsb3Q7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmNoaWxkTm9kZXMuZm9yRWFjaChjaGlsZCA9PiB7XG5cdFx0XHRpZiAoY2hpbGQuc2xvdCkge1xuXHRcdFx0XHRuYW1lZFNsb3ROb2Rlcy5wdXNoKGNoaWxkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1haW5TbG90Tm9kZXMucHVzaChjaGlsZCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRpZiAobWFpblNsb3QpIHtcblx0XHRcdG1haW5TbG90Tm9kZXMuZm9yRWFjaCgobm9kZSwgaW5kZXgpPT57XG5cdFx0XHRcdG5vZGUgPSB0aGlzLnJlbW92ZUNoaWxkKG5vZGUpO1xuXG5cdFx0XHRcdGlmIChpbmRleCkge1xuXHRcdFx0XHRcdG1haW5TbG90Tm9kZXNbaW5kZXggLSAxXS5hZnRlcihub2RlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtYWluU2xvdC5yZXBsYWNlV2l0aChub2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0bmFtZWRTbG90Tm9kZXMuZm9yRWFjaChub2RlID0+IHtcblx0XHRcdGNvbnN0IHNsb3QgPSBuYW1lZFNsb3RzTWFwW25vZGUuc2xvdF07XG5cblx0XHRcdG5vZGUgPSB0aGlzLnJlbW92ZUNoaWxkKG5vZGUpO1xuXG5cdFx0XHRpZiAoc2xvdCkge1xuXHRcdFx0XHRub2RlLnJlbW92ZUF0dHJpYnV0ZSgnc2xvdCcpO1xuXHRcdFx0XHRzbG90LnJlcGxhY2VXaXRoKG5vZGUpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Zm9jdXMoKSB7XG5cdFx0dGhpcy5pbml0RmluaXNoZWQudGhlbigoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5mb2N1c2FibGVFbGVtKSB7XG5cdFx0XHRcdHRoaXMuZm9jdXNhYmxlRWxlbS5mb2N1cygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5lbFRwbC5mb2N1cygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Ymx1cigpIHtcblx0XHR0aGlzLmluaXRGaW5pc2hlZC50aGVuKCgpID0+IHtcblx0XHRcdGlmICh0aGlzLmZvY3VzYWJsZUVsZW0pIHtcblx0XHRcdFx0dGhpcy5mb2N1c2FibGVFbGVtLmJsdXIoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZWxUcGwuYmx1cigpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0ZGlzcGF0Y2hDdXN0b21FdmVudChuYW1lLCBkZXRhaWwpIHtcblx0XHRjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChuYW1lLCB7XG5cdFx0XHRkZXRhaWw6IGRldGFpbCxcblx0XHRcdGJ1YmJsZXM6IHRydWUsXG5cdFx0XHRjYW5jZWxhYmxlOiB0cnVlLFxuXHRcdFx0Y29tcG9zZWQ6IHRydWUsXG5cdFx0fSk7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xuXHR9XG5cblx0Z2V0RG9tUGFyc2VyKCkge1xuXHRcdGlmICghdGhpcy5kb21QYXJzZXIpIHtcblx0XHRcdHRoaXMuZG9tUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmRvbVBhcnNlcjtcblx0fVxuXG5cdGZpcmVFdmVudChuYW1lLCBkZXRhaWwpIHtcblx0XHRjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChuYW1lLCB7XG5cdFx0XHRkZXRhaWw6IGRldGFpbCxcblx0XHRcdGJ1YmJsZXM6IHRydWUsXG5cdFx0XHRjYW5jZWxhYmxlOiB0cnVlLFxuXHRcdFx0Y29tcG9zZWQ6IHRydWUsXG5cdFx0fSk7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xuXHR9XG5cblx0dG9nZ2xlQ2xhc3MoYXR0ck5hbWUsIGF0dHJWYWx1ZSwgY2ZnID0ge30pIHtcblx0XHRjb25zdCBlbCA9IGNmZy5lbCA/IHRoaXNbY2ZnLmVsXSA6IHRoaXMuZWxUcGw7XG5cdFx0aWYgKGF0dHJWYWx1ZSAhPT0gJ2ZhbHNlJykge1xuXHRcdFx0ZWwuY2xhc3NMaXN0LmFkZChjZmcuY3NzQ2xzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWwuY2xhc3NMaXN0LnJlbW92ZShjZmcuY3NzQ2xzKTtcblx0XHR9XG5cdH1cblxuXHR1cGRhdGVDbGFzcyhhdHRyTmFtZSwgYXR0clZhbHVlLCBjZmcgPSB7fSkge1xuXHRcdGlmIChjZmcudmFsdWVzICYmICFjZmcudmFsdWVzLmluY2x1ZGVzKGF0dHJWYWx1ZSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBlbCA9IGNmZy5lbCA/IHRoaXNbY2ZnLmVsXSA6IHRoaXMuZWxUcGw7XG5cdFx0aWYgKHRoaXMuYXR0clN0YXRlW2F0dHJOYW1lXSkge1xuXHRcdFx0ZWwuY2xhc3NMaXN0LnJlbW92ZSgnLScrIHRoaXMuYXR0clN0YXRlW2F0dHJOYW1lXSk7XG5cdFx0fVxuXHRcdGlmIChhdHRyVmFsdWUpIHtcblx0XHRcdGVsLmNsYXNzTGlzdC5hZGQoJy0nKyBhdHRyVmFsdWUpO1xuXHRcdH1cblx0fVxuXG5cdHRvZ2dsZUF0dHIoYXR0ck5hbWUsIGF0dHJWYWx1ZSwgY2ZnID0ge30pIHtcblx0XHRjb25zdCBlbCA9IGNmZy5lbCA/IHRoaXNbY2ZnLmVsXSA6IHRoaXMuZWxUcGw7XG5cdFx0aWYgKGF0dHJWYWx1ZSAhPT0gJ2ZhbHNlJykge1xuXHRcdFx0ZWwuc2V0QXR0cmlidXRlKGNmZy5hdHRyTmFtZSwgY2ZnLmF0dHJWYWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGVsLnJlbW92ZUF0dHJpYnV0ZShjZmcuYXR0ck5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdHVwZGF0ZUF0dHIoYXR0ck5hbWUsIGF0dHJWYWx1ZSwgY2ZnID0ge30pIHtcblx0XHRjb25zdCBlbCA9IGNmZy5lbCA/IHRoaXNbY2ZnLmVsXSA6IHRoaXMuZWxUcGw7XG5cdFx0aWYgKGF0dHJWYWx1ZSkge1xuXHRcdFx0ZWwuc2V0QXR0cmlidXRlKGNmZy5uYW1lLCBjZmcudmFsdWVGbiA/IGNmZy52YWx1ZUZuLmNhbGwodGhpcywgYXR0clZhbHVlKSA6IGF0dHJWYWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGVsLnJlbW92ZUF0dHJpYnV0ZShjZmcubmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0Y29tcG9uZW50KGF0dHJOYW1lLCBhdHRyVmFsdWUsIGNmZyA9IHt9KSB7XG5cdFx0aWYgKGF0dHJWYWx1ZSkge1xuXHRcdFx0aWYgKCF0aGlzW2NmZy5lbF0pIHtcblx0XHRcdFx0Y2ZnLmNyZWF0ZS5jYWxsKHRoaXMpO1xuXHRcdFx0XHR0aGlzLmVsVHBsLmFwcGVuZENoaWxkKHRoaXNbY2ZnLmVsXSk7XG5cdFx0XHR9XG5cdFx0XHRjZmcuc2V0LmNhbGwodGhpcywgYXR0clZhbHVlKTtcblx0XHR9IGVsc2UgaWYgKHRoaXNbY2ZnLmVsXSkge1xuXHRcdFx0dGhpcy5lbFRwbC5yZW1vdmVDaGlsZChjZmcuZWwpO1xuXHRcdH1cblx0fVxuXG5cdHVwZGF0ZVByb3AoYXR0ck5hbWUsIGF0dHJWYWx1ZSwgY2ZnID0ge30pIHtcblx0XHR0aGlzLmRhdGFbYXR0ck5hbWVdID0gYXR0clZhbHVlO1xuXHR9XG59XG4iLCJmdW5jdGlvbiBzdHlsZUluamVjdChjc3MsIHJlZikge1xuICBpZiAoIHJlZiA9PT0gdm9pZCAwICkgcmVmID0ge307XG4gIHZhciBpbnNlcnRBdCA9IHJlZi5pbnNlcnRBdDtcblxuICBpZiAoIWNzcyB8fCB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybjsgfVxuXG4gIHZhciBoZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdO1xuICB2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICBzdHlsZS50eXBlID0gJ3RleHQvY3NzJztcblxuICBpZiAoaW5zZXJ0QXQgPT09ICd0b3AnKSB7XG4gICAgaWYgKGhlYWQuZmlyc3RDaGlsZCkge1xuICAgICAgaGVhZC5pbnNlcnRCZWZvcmUoc3R5bGUsIGhlYWQuZmlyc3RDaGlsZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBoZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgfVxuXG4gIGlmIChzdHlsZS5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0eWxlSW5qZWN0O1xuIiwiaW1wb3J0IEtpbkVsZW1lbnQgZnJvbSAnLi4vS2luRWxlbWVudC5qcyc7XG5pbXBvcnQgJy4vaXBtLnN0eWwnO1xuXG4vLyBGSVhNRSBUaGlzIGlzIHRvbyBjb21wbGljYXRlZCB0aGF0IGl0IHNob3VsZG4ndCBiZSBhIGtpbiBjb21wb25lbnQuXG4vLyBNb3Jlb3ZlciB0aGVyZSBhcmUgTkFQSSBkZXBlbmRlY2llcy5cbi8vIE1vdmUgaXQgdG8gbml0cm8tdWkgdG8gc3ZlbHRlQ29tcG9uZW50cy5cblxuY29uc3QgTE9BRF9USU1FT1VUID0gNzAwMDtcbmNvbnN0IEZBSUxFRF9USU1FID0gNjY2OyAvLyBpZiBJUE0gZmFpbHMgdG8gbG9hZCwgc2VuZCB0aGlzIHZhbHVlIGFzIGxvYWRUaW1lIHRvIEdBLiBBVi0xNjEwOFxuXG5sZXQgT1ZFUlJJREUgPSB7fTtcbmxldCBMT0NBTF9TVE9SQUdFID0gdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiB1cGRhdGVTdG9yYWdlKCkge1xuXHRpZiAobG9jYWxTdG9yYWdlWydJUE1fT1ZFUlJJREUnXSAmJiBMT0NBTF9TVE9SQUdFICE9IGxvY2FsU3RvcmFnZVsnSVBNX09WRVJSSURFJ10gKSB7XG5cdFx0dHJ5IHtcblx0XHRcdExPQ0FMX1NUT1JBR0UgPSBsb2NhbFN0b3JhZ2VbJ0lQTV9PVkVSUklERSddO1xuXHRcdFx0T1ZFUlJJREUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZVsnSVBNX09WRVJSSURFJ10pO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGNvbnNvbGUubG9nKCdGYWlsZWQgdG8gcGFyc2UgbG9jYWxTdG9yYWdlLklQTV9PVkVSUklERScpO1xuXHRcdH1cblx0fVxufVxuXG5jbGFzcyBJcG0gZXh0ZW5kcyBLaW5FbGVtZW50IHtcblx0c3RhdGljIGdldCBhdHRyQ2ZnKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRwYXJhbXM6ICd1cGRhdGVQcm9wJyxcblx0XHRcdGlkOiB7XG5cdFx0XHRcdHVwZGF0ZUZuOiBbJ3VwZGF0ZUF0dHInLCAndXBkYXRlUHJvcCddLFxuXHRcdFx0XHR1cGRhdGVDZmc6IFt7XG5cdFx0XHRcdFx0ZWw6ICdlbElwbScsXG5cdFx0XHRcdFx0bmFtZTogJ2RhdGEtdGVzdCcsXG5cdFx0XHRcdFx0dmFsdWVGbjogZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJ2lwbS1lbG0tJyArIHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fV1cblx0XHRcdH0sXG5cdFx0XHRoYXNoOiAndXBkYXRlUHJvcCcsXG5cdFx0XHRzcmM6ICd1cGRhdGVQcm9wJ1xuXHRcdH1cblx0fVxuXG5cdHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuXHRcdHJldHVybiBPYmplY3Qua2V5cyhJcG0uYXR0ckNmZykuZmlsdGVyKG5hbWUgPT4gSXBtLmF0dHJDZmdbbmFtZV0pO1xuXHR9XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMubGlzdGVuZXJzID0gW107XG5cdFx0dGhpcy5kYXRhID0gKGZ1bmN0aW9uIChzY29wZSkge1xuXHRcdFx0Y29uc3QgZGF0YSA9IHtcblx0XHRcdFx0ZXJyb3I6IChuYXZpZ2F0b3Iub25MaW5lKSA/IG51bGwgOiAnb2ZmbGluZSdcblx0XHRcdH07XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0XHRcdHNyY0VsbUlkOiBudWxsLFxuXHRcdFx0XHRnZXQgaWQoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGEuaWQ7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNldCBpZCh2YWwpIHtcblx0XHRcdFx0XHRjb25zdCBvbGQgPSBkYXRhLmlkO1xuXHRcdFx0XHRcdGRhdGEuaWQgPSB2YWw7XG5cdFx0XHRcdFx0c2NvcGUudXBkYXRlSXBtVXJsKCk7XG5cdFx0XHRcdFx0c2NvcGUudXBkYXRlRnJhbWUoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0Z2V0IHVybCgpIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YS51cmw7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNldCB1cmwodmFsKSB7XG5cdFx0XHRcdFx0ZGF0YS51cmwgPSB2YWw7XG5cdFx0XHRcdFx0c2NvcGUudXBkYXRlSXBtVXJsKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGdldCBzcmMoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGEuc3JjO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRzZXQgc3JjKHZhbCkge1xuXHRcdFx0XHRcdGRhdGEuc3JjID0gdmFsO1xuXHRcdFx0XHRcdHNjb3BlLnVwZGF0ZUlwbVVybCgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZXQgZXJyb3IoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGEuZXJyb3I7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNldCBlcnJvcih2YWwpIHtcblx0XHRcdFx0XHRkYXRhLmVycm9yID0gdmFsO1xuXHRcdFx0XHRcdHNjb3BlLmVsVHBsLnN0eWxlLmRpc3BsYXkgPSBkYXRhLmVycm9yID8gJ25vbmUnIDogJ2Jsb2NrJztcblx0XHRcdFx0fSxcblx0XHRcdFx0c2V0IGhhc2godmFsKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGEuaGFzaCkge1xuXHRcdFx0XHRcdFx0c2NvcGUudXBkYXRlRnJhbWUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGF0YS5oYXNoID0gdmFsO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRzZXQgcGFyYW1zKHZhbCkge1xuXHRcdFx0XHRcdGlmIChkYXRhLnBhcmFtcyAmJiAoZGF0YS5pZCB8fCBkYXRhLmhhc2gpKSB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCdraW4taXBtIGVycm9yIC0gcGFyYW1zIGhhdmUgdG8gY29tZSBiZWZvcmUgaWQgb3IgaGFzaCwgZXEuIDxraW4taXBtIHBhcmFtcz1cIntwYXJhbXN9XCIgaWQ9XCInICsgZGF0YS5pZCArICdcIiAvPicpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRhdGEucGFyYW1zID0gdmFsO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZXQgaXBtVXJsKCkge1xuXHRcdFx0XHRcdGxldCB1cmwgPSAnJztcblx0XHRcdFx0XHRpZiAoT1ZFUlJJREVbZGF0YS5pZF0pIHtcblx0XHRcdFx0XHRcdHVybCA9IE9WRVJSSURFW2RhdGEuaWRdO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoZGF0YS5zcmMpIHtcblx0XHRcdFx0XHRcdHVybCA9IGRhdGEuc3JjO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoZGF0YS51cmwpIHtcblx0XHRcdFx0XHRcdHVybCA9IGRhdGEudXJsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdXJsO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH0pKHRoaXMpO1xuXHR9XG5cblx0aW5pdEVsZW0oKSB7XG5cdC8qXG5cdFx0PGRpdiByZWY6ZWxUcGwgY2xhc3M9XCJraW5faXBtXCI+XG5cdFx0XHQ8aWZyYW1lIHJlZjplbElwbSBzcmM9XCJ7aXBtVXJsfVwiIGRhdGEtdGVzdD1cImlwbS1lbG0te2lkfVwiIC8+XG5cdFx0PC9kaXY+XG5cdCovXG5cdFx0aWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdhdXRvbWF0aW9uRGlzYWJsZUlwbScpID09PSAndHJ1ZScpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmVsVHBsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0dGhpcy5lbFRwbC5jbGFzc0xpc3QuYWRkKCdraW5faXBtJyk7XG5cdFx0dGhpcy5lbElwbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuXHRcdHRoaXMuZWxUcGwuYXBwZW5kQ2hpbGQodGhpcy5lbElwbSk7XG5cdH1cblxuXHRlbGVtSW5pdGVkKCkge1xuXHRcdHRoaXMudXBkYXRlU3RvcmFnZSgpO1xuXHRcdHRoaXMubG9hZEVsbUlkRnJvbVVSTCgpO1xuXHRcdHRoaXMubGlzdGVuKCk7XG5cdFx0dGhpcy5jaGVja0Vycm9ycygpO1xuXHR9XG5cblx0ZWxlbURlc3Ryb3llZCgpIHtcblx0XHR0aGlzLmxpc3RlbmVycy5mb3JFYWNoKG9mZiA9PiBvZmYoKSk7XG5cdFx0dGhpcy5saXN0ZW5lcnMubGVuZ3RoID0gMDtcblx0XHR0aGlzLnRpbWVvdXQgJiYgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG5cdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29ubGluZScsIHRoaXMuX29ubGluZVN0YXRlUmVmKTtcblx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuX3Byb2Nlc3NNZXNzYWdlUmVmLCBmYWxzZSk7XG5cdH1cblxuXHRmaXJlKGV2bk5hbWUsIGV2blZhbHVlKSB7Ly8gZW11bGF0aW5nIHJhY3RpdmUgZmlyZSBtZXRob2Rcblx0XHQvLyBUT0RPIHdoZXJlIGlzIHRoaXMgY29taW5nIGZyb20/XG5cdFx0Ly8gaHR0cHM6Ly9naXQuaW50LmF2YXN0LmNvbS9mZi9zcGF3bi9jb21taXQvNjczZjg1YWRkMTIzZDQyMTUzZjQ3NDc3YzA1Yzg5MjY3M2QzM2ExNVxuXHRcdC8vIEZvdW5kIGluIG1vZHVsZS1hdmFzdC1yZWNvbW1lbmRhdGlvbnNcblx0XHQvLyB0aGlzLmlwbUNvbXBvLmZpcmUoJ3JvdXRlJyAuLi5cblx0XHQvLyBJcyB0aGlzIG5lZWRlZCBpbiBraW4/XG5cdFx0aWYgKGV2bk5hbWUgPT09ICdyb3V0ZScpIHtcblx0XHRcdGlmICh0aGlzLmVsSXBtICYmIHRoaXMuZWxJcG0uY29udGVudFdpbmRvdyAmJiB0aGlzLmVsSXBtLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UpIHtcblx0XHRcdFx0dGhpcy5lbElwbS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCdyb3V0ZTonICsgZXZuVmFsdWUsICcqJyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0dXBkYXRlSXBtVXJsKCkge1xuXHRcdHRoaXMuZWxJcG0uc2V0QXR0cmlidXRlKCdzcmMnLCB0aGlzLmRhdGEuaXBtVXJsKTtcblx0fVxuXG5cdGxvYWRFbG1JZEZyb21VUkwoKSB7XG5cdFx0aWYgKCF0aGlzLmRhdGEuc3JjRWxtSWQpIHtcblx0XHRcdGNvbnN0IFBfRUxNX1JFR0VYID0gL3BfZWxtPShcXGQrKS87XG5cdFx0XHRjb25zdCBtYXRjaGVzID0gdGhpcy5kYXRhLnNyYyAmJiB0aGlzLmRhdGEuc3JjLm1hdGNoKFBfRUxNX1JFR0VYKTtcblx0XHRcdGlmIChtYXRjaGVzKSB7XG5cdFx0XHRcdHRoaXMuZGF0YS5zcmNFbG1JZCA9IG1hdGNoZXNbMV07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gVE9ETyB3YXMgb3ZlcnJpZGRlbiBpbiB1aS1jb3JlIGV4dGVuZFJhY3RpdmVcblx0Ly8gb3ZlcnJpZGRlbiBpbiB1aS1jb3JlIGV4dGVuZFJhY3RpdmVcblx0bGlzdGVuKCkge1xuXHRcdHRoaXMuX3Byb2Nlc3NNZXNzYWdlUmVmID0gdGhpcy5fcHJvY2Vzc01lc3NhZ2UuYmluZCh0aGlzKTsgLy8gY3JlYXRlIGZ1bmN0aW9uIHJlZmVyZW5jZSBzbyBpdCBjYW4gYmUgZXZlbnRSZW1vdmVkIGFmdGVyd2FyZHNcblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuX3Byb2Nlc3NNZXNzYWdlUmVmLCBmYWxzZSk7XG5cblx0XHR0aGlzLl9vbmxpbmVTdGF0ZVJlZiA9IHRoaXMuX29ubGluZVN0YXRlLmJpbmQodGhpcyk7IC8vIGNyZWF0ZSBmdW5jdGlvbiByZWZlcmVuY2Ugc28gaXQgY2FuIGJlIGV2ZW50UmVtb3ZlZCBhZnRlcndhcmRzXG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29ubGluZScsIHRoaXMuX29ubGluZVN0YXRlUmVmKTtcblxuXHRcdHRoaXMubGlzdGVuZXJzLnB1c2goTkFQSS5vbignQVNXX05PVElGX1JFTE9BRF9JUE0nLCAoKSA9PiB7XG5cdFx0XHR0aGlzLnVwZGF0ZUZyYW1lKCk7XG5cdFx0fSkpO1xuXG5cdFx0dGhpcy5saXN0ZW5lcnMucHVzaChOQVBJLm9uKCdpcG0ucmVsb2FkLicgKyB0aGlzLmF0dHJTdGF0ZS5pZCwgKCk9Pntcblx0XHRcdHRoaXMudXBkYXRlRnJhbWUoKTtcblx0XHR9KSk7XG5cdH1cblxuXHRfb25saW5lU3RhdGUoKSB7XG5cdFx0dGhpcy5kYXRhLmVycm9yID0gbnVsbDtcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHRoaXMudXBkYXRlRnJhbWUoKTtcblx0XHRcdHRoaXMuY2hlY2tFcnJvcnMoKTtcblx0XHR9LCAxKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIHBvc3RNZXNzYWdlIHNlbnQgZnJvbSBJUE0gaWZyYW1lLiBkYXRhIGZvcm1hdCB7YWN0aW9uOiBzdHJpbmcsIHNvdXJjZVVybDogc3RyaW5nfVxuXHQgKi9cblx0X3Byb2Nlc3NNZXNzYWdlKGV2ZW50KSB7XG5cdFx0aWYgKCFldmVudCB8fCAhZXZlbnQuZGF0YSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMubG9hZEVsbUlkRnJvbVVSTCgpO1xuXHRcdGxldCBpZCA9IHBhcnNlSW50KHRoaXMuYXR0clN0YXRlLmlkKTtcblxuXHRcdC8vIGNoZWNrIGlmIGluIG1lc3NhZ2UgaXMgJ3dpbmRvd0xvYWRlZCcgYW5kIGlmIHRoZSBtZXNzYWdlIHdhcyBzZW50IGZyb20gc2FtZSBlbGVtZW50IGFzIHRoaXMgbGlzdGVuZXIgaXMgYXR0YWNoZWQgdG9cblx0XHRjb25zdCBpc1RoaXNJcG1Mb2FkZWQgPSBldmVudC5kYXRhLmFjdGlvbiA9PT0gJ3dpbmRvd0xvYWRlZCdcblx0XHRcdCYmICgrZXZlbnQuZGF0YS5lbG1JZCA9PT0gaWQgfHwgK2V2ZW50LmRhdGEuZWxtSWQgPT09IHBhcnNlSW50KHRoaXMuZGF0YS5zcmNFbG1JZCkpO1xuXG5cdFx0aWYgKGlzVGhpc0lwbUxvYWRlZCkge1xuXHRcdFx0dGhpcy50aW1lb3V0ICYmIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuXHRcdFx0dGhpcy50cmFja0lwbUdhTG9hZHRpbWUodGhpcy5fZ2V0VGltZXJWYWx1ZSgpKTtcblx0XHRcdHRoaXMuZGF0YS5lcnJvciA9IG51bGw7XG5cdFx0XHR0aGlzLmRhdGEubG9hZGVkID0gdHJ1ZTtcblxuXHRcdFx0dGhpcy5maXJlRXZlbnQoJ3N1Y2Nlc3MnLCB7XG5cdFx0XHRcdGlkOiBpZCxcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmZpcmVFdmVudCgnZG9uZScsIHtcblx0XHRcdFx0aWQ6IGlkLFxuXHRcdFx0fSk7XG5cblx0XHRcdE5BUEkucmVxdWVzdCgnYXBwLmlwbV90cmFja2luZy50cmFjaycsIHsnZWxlbV9pZCc6IGlkLCAncmVzcG9uc2VfdGltZSc6IC0xfSk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVE9ETyB3YXMgb3ZlcnJpZGRlbiBpbiB1aS1jb3JlIGV4dGVuZFJhY3RpdmVcblx0Ly8gb3ZlcnJpZGRlbiBpbiB1aS1jb3JlIGV4dGVuZFJhY3RpdmVcblx0dHJhY2tJcG1HYUxvYWR0aW1lKGxvYWRUaW1lKSB7XG5cdFx0aWYgKGxvYWRUaW1lID09PSBGQUlMRURfVElNRSkgey8vIEFWLTE3MDU5IC0gdHJhY2sgb25seSBmYWlsZWQgbG9hZHNcblx0XHRcdE5BUEkudHJhY2suZXZlbnQoJ0xvYWRpbmcnLCAnVGltZW91dCcsIHBhcnNlSW50KHRoaXMuZGF0YS5pZCkpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRUaW1lclZhbHVlKCkge1xuXHRcdHJldHVybiBNYXRoLnJvdW5kKChwZXJmb3JtYW5jZS5ub3coKSAtIHRoaXMuX3RpbWVyU3RhcnQpIC8gMTAwMCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVuZGVyIFByb3BlciBpZnJhbWUgVVJMXG5cdCAqL1xuXHR1cGRhdGVGcmFtZSgpIHtcblx0XHR0aGlzLmdldFVybCgpXG5cdFx0XHQudGhlbih1cmwgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5kYXRhLnNyYykge1xuXHRcdFx0XHRcdHVybCA9IHRoaXMuZGF0YS5zcmM7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl90aW1lclN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7IC8vIHN0YXJ0IHRpbWVyIHdoZW4gd2UgZ290IElQTSBVUkxcblxuXHRcdFx0XHRpZiAodGhpcy5lbElwbSkge1xuXHRcdFx0XHRcdHRoaXMuZWxJcG0ub25sb2FkID0gKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5maXJlRXZlbnQoJ3N1Y2Nlc3MnKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdHRoaXMuZWxJcG0uc2V0QXR0cmlidXRlKCdzcmMnLCAnYWJvdXQ6YmxhbmsnKTtcblx0XHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdC8vIEFWLTE2NTY1IC0gb3ZlcnJpZGUgdGhlIHVybCBvbmx5IGluIHRlc3RpbmcgZW52aXJvbm1lbnQsIHRvIHByZXZlbnRcblx0XHRcdFx0XHRcdC8vIGRpYWxvZyB3aW5kb3dzIGZyb20gYmVpbmcgYXV0b21hdGljYWxseSBjbG9zZWQgZHVlIHRvIGNhbmNlbGxlZFxuXHRcdFx0XHRcdFx0Ly8gbmV0d29yayByZXF1ZXN0LCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNoYW5nZXMgaWYgaXQncyByZXByb2R1Y2libGVcblx0XHRcdFx0XHRcdC8vIGluIEFWXG5cblx0XHRcdFx0XHRcdC8vIFdURj8hIHVybCBpcyBzZXQgdG8gYWJvdXQ6YmxhbmsgaGFzIHRvIGJlIG92ZXJyaWRlblxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuZGF0YS5pcG1VcmwgIT09IHVybCB8fCB0aGlzLmVsSXBtLmdldEF0dHJpYnV0ZSgnc3JjJykgPT09ICdhYm91dDpibGFuaycpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5kYXRhLnVybCA9IHVybDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0sIDEpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZGF0YS51cmwgPSB1cmw7XG5cdFx0XHRcdH1cblxuXHRcdFx0fSk7XG5cdH1cblxuXHRjaGVja0Vycm9ycygpIHtcblx0XHQvLyBDRUYgaXMgb2ZmbGluZSAtIGZhbGxiYWNrIGFuZCBlbWl0IGVycm9yc1xuXHRcdHRoaXMudGltZW91dCAmJiBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcblx0XHRpZiAoIW5hdmlnYXRvci5vbkxpbmUpIHtcblx0XHRcdHRoaXMuZGF0YS5lcnJvciA9ICdvZmZsaW5lJztcblxuXHRcdFx0dGhpcy5maXJlRXZlbnQoJ2Vycm9yJywge1xuXHRcdFx0XHRjb2RlOiAwLFxuXHRcdFx0XHRtZXNzYWdlOiAnb2ZmbGluZScsXG5cdFx0XHRcdGlkOiBwYXJzZUludCh0aGlzLmRhdGEuaWQpXG5cdFx0XHR9KTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBvYnNlcnZlIHRpbWVvdXQgb2YgdGhlIGZyYW1lLm9ubG9hZCBldmVudFxuXHRcdFx0dGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMudHJhY2tJcG1HYUxvYWR0aW1lKEZBSUxFRF9USU1FKTtcblx0XHRcdFx0dGhpcy5kYXRhLmVycm9yID0gJ3RpbWVvdXQnO1xuXG5cdFx0XHRcdHRoaXMuZmlyZUV2ZW50KCdlcnJvcicsIHtcblx0XHRcdFx0XHRjb2RlOiAwLFxuXHRcdFx0XHRcdG1lc3NhZ2U6ICd0aW1lb3V0Jyxcblx0XHRcdFx0XHRpZDogcGFyc2VJbnQodGhpcy5kYXRhLmlkKVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0fSwgTE9BRF9USU1FT1VUKTtcblx0XHR9XG5cdH1cblxuXHQvLyBUT0RPIHdhcyBvdmVycmlkZGVuIGluIHVpLWNvcmUgZXh0ZW5kUmFjdGl2ZVxuXHQvLyBvdmVycmlkZGVuIGluIHVpLWNvcmUgZXh0ZW5kUmFjdGl2ZVxuXHRnZXRVcmwoKSB7XG5cdFx0Y29uc3QgaGFzaCA9IGxvY2F0aW9uLmhhc2gucmVwbGFjZSgnIycsICcnKTtcblx0XHRyZXR1cm4gKHRoaXMuZGF0YS5pZCA9PSBudWxsKSA/IFByb21pc2UucmVzb2x2ZSgnYWJvdXQ6YmxhbmsnKSA6ICBOQVBJLnJlcXVlc3QoJ2FwcC51dGlscy5HZXRVcmxQYXJhbWV0ZXJzJywgcGFyc2VJbnQodGhpcy5kYXRhLmlkKSlcblx0XHRcdC50aGVuKHVybCA9PiB7XG5cdFx0XHRcdGxldCBwID0gJyc7XG5cdFx0XHRcdGlmICh0aGlzLmF0dHJTdGF0ZS5wYXJhbXMpIHtcblx0XHRcdFx0XHRjb25zdCBwYXJhbXMgPSBKU09OLnBhcnNlKHRoaXMuYXR0clN0YXRlLnBhcmFtcyk7XG5cdFx0XHRcdFx0cCArPSBPYmplY3Qua2V5cyhwYXJhbXMpLm1hcChmdW5jdGlvbihrZXkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBrZXkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zW2tleV0pO1xuXHRcdFx0XHRcdH0pLmpvaW4oJyYnKTtcblx0XHRcdFx0XHRwID0gJyYnICsgcDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB1cmwgKyAnJnBfc2NyPScrIGhhc2gudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXC8vZywgJ18nKVxuXHRcdFx0XHRcdCsgcCArICgodGhpcy5hdHRyU3RhdGUuaGFzaCAhPT0gJy8nKSA/ICcjJyArIHRoaXMuYXR0clN0YXRlLmhhc2ggOiAnJyk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdHVwZGF0ZVN0b3JhZ2UoKXtcblx0XHRpZiAobG9jYWxTdG9yYWdlWydJUE1fT1ZFUlJJREUnXSAmJiBMT0NBTF9TVE9SQUdFICE9IGxvY2FsU3RvcmFnZVsnSVBNX09WRVJSSURFJ10gKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRMT0NBTF9TVE9SQUdFID0gbG9jYWxTdG9yYWdlWydJUE1fT1ZFUlJJREUnXTtcblx0XHRcdFx0T1ZFUlJJREUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZVsnSVBNX09WRVJSSURFJ10pO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRjb25zb2xlLmxvZygnRmFpbGVkIHRvIHBhcnNlIGxvY2FsU3RvcmFnZS5JUE1fT1ZFUlJJREUnKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdraW4taXBtJywgSXBtKTtcbiIsImltcG9ydCBLaW5FbGVtZW50IGZyb20gJy4uL0tpbkVsZW1lbnQuanMnO1xuaW1wb3J0ICcuL3Rvb2x0aXAuc3R5bCc7XG5cbmNsYXNzIFRvb2x0aXAgZXh0ZW5kcyBLaW5FbGVtZW50IHtcblx0c3RhdGljIGdldCBhdHRyQ2ZnKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRlbGxpcHNpczogbnVsbCAvLyBib29sZWFuOyBzdGF0aWMgKHRoZSB2YWx1ZSBpcyBub3Qgc3VwcG9zZWQgdG8gY2hhbmdlKVxuXHRcdH1cblx0fVxuXG5cdHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuXHRcdHJldHVybiBPYmplY3Qua2V5cyhUb29sdGlwLmF0dHJDZmcpLmZpbHRlcihuYW1lID0+IFRvb2x0aXAuYXR0ckNmZ1tuYW1lXSk7XG5cdH1cblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhpcy5lbFRwbCBsaWtlIHRoaXM6XG5cdCAqIDxraW4tZHJvcGRvd24gcmVmOmVsVHBsIHR5cGU9XCJ0b29sdGlwXCIgY2xhc3M9XCJraW5fdG9vbHRpcCB7ZWxsaXBzaXMgPyAnLWVsbGlwc2lzJyA6ICcnfVwiPlxuXHQgKlx0PGRpdiBzbG90PVwiZHJvcGRvd24tYWN0aXZhdG9yXCI+XG5cdCAqXHRcdDxzbG90IG5hbWU9XCJ0b29sdGlwLWFjdGl2YXRvclwiIC8+XG5cdCAqXHQ8L2Rpdj5cblxuXHQgKlx0PHNsb3QgbmFtZT1cInRvb2x0aXBcIiAvPlxuXHQgKjwva2luLWRyb3Bkb3duPlxuXHQgKlxuXHQgKiBSRU1FTUJFUiBpZiB5b3UgY2hhbmdlIHNvbWV0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLCB1cGRhdGUgdGhlIEhUTUwgZGVzY3JpcHRpb24gYWJvdmUuXG5cdCAqL1xuXHRpbml0RWxlbSgpIHtcblx0XHR0aGlzLmVsVHBsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgna2luLWRyb3Bkb3duJyk7XG5cdFx0dGhpcy5lbFRwbC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndG9vbHRpcCcpO1xuXHRcdHRoaXMuZWxUcGwuY2xhc3NOYW1lID0gJ2tpbl90b29sdGlwJztcblxuXHRcdGNvbnN0IGRyb3Bkb3duQWN0aXZhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0ZHJvcGRvd25BY3RpdmF0b3Iuc2V0QXR0cmlidXRlKCdzbG90JywgJ2Ryb3Bkb3duLWFjdGl2YXRvcicpO1xuXG5cdFx0Y29uc3QgYWN0aXZhdG9yU2xvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Nsb3QnKTtcblx0XHRhY3RpdmF0b3JTbG90LnNldEF0dHJpYnV0ZSgnbmFtZScsICd0b29sdGlwLWFjdGl2YXRvcicpO1xuXHRcdGRyb3Bkb3duQWN0aXZhdG9yLmFwcGVuZENoaWxkKGFjdGl2YXRvclNsb3QpO1xuXHRcdHRoaXMuZWxUcGwuYXBwZW5kQ2hpbGQoZHJvcGRvd25BY3RpdmF0b3IpO1xuXG5cdFx0Y29uc3QgdG9vbHRpcFNsb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzbG90Jyk7XG5cdFx0dG9vbHRpcFNsb3Quc2V0QXR0cmlidXRlKCduYW1lJywgJ3Rvb2x0aXAnKTtcblx0XHR0aGlzLmVsVHBsLmFwcGVuZENoaWxkKHRvb2x0aXBTbG90KTtcblxuXHRcdC8vIHJlbW92ZSBUb29sdGlwIGluIGNhc2UgdGhlIHRleHQgZG9lc24ndCBvdmVyZmxvdyB0aGUgcGFyZW50IGNvbnRhaW5lclxuXHRcdGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnZWxsaXBzaXMnKSkge1xuXHRcdFx0dGhpcy5lbFRwbC5jbGFzc0xpc3QuYWRkKCctZWxsaXBzaXMnKTtcblx0XHRcdHNldFRpbWVvdXQoKCk9Pntcblx0XHRcdFx0aWYgKCB0aGlzLmVsVHBsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoID09IGRyb3Bkb3duQWN0aXZhdG9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICkge1xuXHRcdFx0XHRcdHRoaXMuZWxUcGwuY2xhc3NMaXN0LmFkZCgnLWluYWN0aXZlJyk7XG5cdFx0XHRcdFx0dGhpcy5lbFRwbC5xdWVyeVNlbGVjdG9yKCcua2luX2Ryb3Bkb3duLi10b29sdGlwJykucmVtb3ZlKCk7XG5cdFx0XHRcdFx0dGhpcy5lbFRwbC5xdWVyeVNlbGVjdG9yKCcua2luX2Ryb3Bkb3duX19hY3RpdmF0b3InKS5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScpXG5cdFx0XHRcdH1cblx0XHRcdH0sIDEwMCk7XG5cdFx0fVxuXG5cdH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdraW4tdG9vbHRpcCcsIFRvb2x0aXApO1xuIiwiaW1wb3J0IEtpbkVsZW1lbnQgZnJvbSAnLi4vS2luRWxlbWVudC5qcyc7XG5pbXBvcnQgJy4vYnV0dG9uLnN0eWwnO1xuXG5jbGFzcyBCdXR0b24gZXh0ZW5kcyBLaW5FbGVtZW50IHtcblx0c3RhdGljIGdldCBhdHRyQ2ZnKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzaXplOiB7IC8vIHRpbGUgc2l6ZSBsYXJnZXxzbWFsbHxodWdlXG5cdFx0XHRcdHVwZGF0ZUZuOiAndXBkYXRlQ2xhc3MnXG5cdFx0XHR9LFxuXHRcdFx0dHlwZTogeyAvLyBzZXZlcml0eSBzdHlsZS9jb2xvcjogKGRlZmF1bHQpfHNlY29uZGFyeXxjcml0aWNhbHxhdHRlbnRpb258Ymxhbmtcblx0XHRcdFx0dXBkYXRlRm46ICd1cGRhdGVDbGFzcycsXG5cdFx0XHRcdHZhbHVlczogWydzZWNvbmRhcnknLCAnY3JpdGljYWwnLCAnYXR0ZW50aW9uJywgJ2JsYW5rJywgJ3Vwc2VsbCddLFxuXHRcdFx0fSxcblx0XHRcdGxpbms6IHsgLy8gYnV0dG9uIHdpdGggbGluayAtIDxhIGhyZWY9XCJ7bGlua31cIj5cblx0XHRcdFx0dXBkYXRlRm46ICd1cGRhdGVBdHRyJyxcblx0XHRcdFx0dXBkYXRlQ2ZnOiB7XG5cdFx0XHRcdFx0bmFtZTogJ2hyZWYnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQna2luLWRpc2FibGVkJzogeyAvLyBuZWVkIHRvIHByZWZpeCBiZWNhdXNlICdkaXNhYmxlZCcgaXMgcmVzZXJ2ZWQgZm9yIGZvY3VzYWJsZSBlbGVtZW50c1xuXHRcdFx0XHR1cGRhdGVGbjogJ3RvZ2dsZUF0dHInLFxuXHRcdFx0XHR1cGRhdGVDZmc6IHtcblx0XHRcdFx0XHRhdHRyTmFtZTogJ2Rpc2FibGVkJyxcblx0XHRcdFx0XHRhdHRyVmFsdWU6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGljb25vbmx5OiB7IC8vIGJ1dHRvbiBkaXNwbGF5cyBvbmx5IGljb24gKGNhbiBjb250YWluIHRleHQgZm9yIGFjY2Vzc2liaWxpdHkpXG5cdFx0XHRcdHVwZGF0ZUZuOiAndG9nZ2xlQ2xhc3MnLFxuXHRcdFx0XHR1cGRhdGVDZmc6IHtcblx0XHRcdFx0XHRjc3NDbHM6ICctaWNvbi1vbmx5J1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0cHJvY2Vzc2luZzogeyAvLyBhY3Rpb24gaW4gcHJvZ3Jlc3MsIHZpc3VhbCBwcm9ncmVzc1xuXHRcdFx0XHR1cGRhdGVGbjogJ3RvZ2dsZUNsYXNzJyxcblx0XHRcdFx0dXBkYXRlQ2ZnOiB7XG5cdFx0XHRcdFx0Y3NzQ2xzOiAnLXByb2Nlc3NpbmcnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR0aXRsZTogeyAvLyB0aXRsZVxuXHRcdFx0XHR1cGRhdGVGbjogJ3VwZGF0ZUF0dHInLFxuXHRcdFx0XHR1cGRhdGVDZmc6IHtcblx0XHRcdFx0XHRuYW1lOiAndGl0bGUnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnZGF0YS10ZXN0JzogbnVsbCwgLy8gYXV0b21hdGlvbiBsb2NhdG9yXG5cdFx0XHRmYWtlOiBudWxsIC8vIHJlbmRlcmVkIGFzIDxkaXY+LCBub3QgZm9jdXNhYmxlIChpbnNpZGUga2luLXRpbGUgb3Igb3RoZXIgZm9jdXNhYmxlL2NsaWNrYWJsZSBlbC4pXG5cdFx0fVxuXHR9XG5cblx0c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5rZXlzKEJ1dHRvbi5hdHRyQ2ZnKS5maWx0ZXIobmFtZSA9PiBCdXR0b24uYXR0ckNmZ1tuYW1lXSk7XG5cdH1cblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0aW5pdEVsZW0oKSB7XG5cdFx0aWYgKHRoaXMuaGFzQXR0cmlidXRlKCdsaW5rJykpIHtcblx0XHRcdHRoaXMuZWxUcGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cdFx0XHR0aGlzLmVsVHBsLnNldEF0dHJpYnV0ZSgnaHJlZicsIHRoaXMuZ2V0QXR0cmlidXRlKCdsaW5rJykpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2Zha2UnKSkge1xuXHRcdFx0dGhpcy5lbFRwbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmVsVHBsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXRlc3QnKSkge1xuXHRcdFx0dGhpcy5lbFRwbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGVzdCcsIHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLXRlc3QnKSk7XG5cdFx0XHR0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS10ZXN0Jyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5lbFRwbC5jbGFzc0xpc3QuYWRkKCdraW5fYnV0dG9uJyk7XG5cblx0XHR0aGlzLmVsVHBsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Nsb3QnKSk7XG5cblx0XHQvLyBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ3RpdGxlJykpIHtcblx0XHQvLyBcdHRoaXMuZWxUb29sdGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgna2luLXRvb2x0aXAnKTtcblx0XHQvLyBcdHRoaXMuZWxUb29sdGlwVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblx0XHQvLyBcdHRoaXMuZWxUb29sdGlwVGV4dC5pbm5lclRleHQgPSB0aGlzLmdldEF0dHJpYnV0ZSgndGl0bGUnKTtcblx0XHQvLyBcdHRoaXMuZWxUcGwuc2V0QXR0cmlidXRlKCdzbG90JywgJ3Rvb2x0aXAtYWN0aXZhdG9yJyk7XG5cdFx0Ly8gXHR0aGlzLmVsVG9vbHRpcFRleHQuc2V0QXR0cmlidXRlKCdzbG90JywgJ3Rvb2x0aXAnKTtcblx0XHQvL1xuXHRcdC8vIFx0dGhpcy5lbFRvb2x0aXAuYXBwZW5kQ2hpbGQodGhpcyk7XG5cdFx0Ly8gXHR0aGlzLmVsVHBsLmFwcGVuZENoaWxkKHRoaXMuZWxUb29sdGlwKTtcblx0XHQvLyB9IGVsc2Uge1xuXHRcdC8vIFx0dGhpcy5lbFRwbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzbG90JykpO1xuXHRcdC8vIH1cblx0fVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2tpbi1idXR0b24nLCBCdXR0b24pO1xuIiwiLy8gaW5jcmVtZW50YWx5IGdlbmVyYXRlIHVuaXF1ZSBpZFxubGV0IHVpZHZhbHVlID0gMDtcbmV4cG9ydCBmdW5jdGlvbiB1aWQoKXtcblx0cmV0dXJuICsrdWlkdmFsdWU7XG59XG5cbi8vIGdldCBlbGVtZW50IG9mZnNldFxuLy8gLSBkb250IHN1cHBvcnQgaWZyYW1lcyBhbmQgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIERPTVxuZXhwb3J0IGZ1bmN0aW9uIG9mZnNldChlbCl7XG5cdHZhciBib3ggPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0cmV0dXJuIHtcblx0XHR0OiBib3gudG9wICsgd2luZG93LnBhZ2VZT2Zmc2V0LFxuXHRcdGw6IGJveC5sZWZ0ICsgd2luZG93LnBhZ2VYT2Zmc2V0XG5cdH07XG59XG5cbi8vIGFkZCBjc3MgY2xhc3Nlc1xuZXhwb3J0IGZ1bmN0aW9uIGFkZENzc0NscyhjbHMsIGFkZENscyl7XG5cdHZhciB0bXAgPSBhZGRDbHMuc3BsaXQoJyAnKTtcblx0dG1wLmZvckVhY2goZnVuY3Rpb24odmFsKXtcblx0XHRpZiAoY2xzLmluZGV4T2YodmFsKSA9PT0gLTEpIGNscys9IChjbHMgPyAnICc6ICcnKSArdmFsO1xuXHR9KTtcblx0cmV0dXJuIGNscztcbn1cbi8vIHJlbW92ZSBjc3MgY2xhc3Nlc1xuZXhwb3J0IGZ1bmN0aW9uIHJlbUNzc0NscyhjbHMsIHJlbUNscyl7XG5cdHJldHVybiBjbHMucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxccyooJysgcmVtQ2xzLnJlcGxhY2UoLyAvZywgJ3wnKSArJyknKSwgJycpO1xufVxuXG4vLyBnZXQgYm9keSBjaGlsZHMgYmlnZ2VzdCB6aW5kZXhcbmV4cG9ydCBmdW5jdGlvbiBnZXRUb3BaaW5kZXgoKXtcblx0dmFyIHosXG5cdFx0XHR6TWF4ID0gMCxcblx0XHRcdGVscyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0uY2hpbGRyZW47XG5cdGZvciAobGV0IGk9MCwgbGVuPWVscy5sZW5ndGg7IGk8bGVuOyBpKyspe1xuXHRcdHogPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbHNbaV0pLnpJbmRleCwgMTApO1xuXHRcdGlmICh6ID4gek1heCl6TWF4ID0gejtcblx0fVxuXHRyZXR1cm4gek1heDtcbn1cblxuXG4vLyBjb21wb25lbnRzIGV4dGVuZHNcbmV4cG9ydCBmdW5jdGlvbiBodG1sQXR0cigpe1xuXHR2YXIgcHJvcCA9ICcnLFxuXHRcdFx0YXR0ciA9IHRoaXMuZ2V0KCdhdHRyJyk7XG5cdGlmIChhdHRyKXtcblx0XHRmb3IgKGNvbnN0IGkgaW4gYXR0cil7XG5cdFx0XHRwcm9wICs9ICcgJysgaSArJz1cIicrIGF0dHJbaV0gKydcIic7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwcm9wO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGh0bWxDc3NDbHMoKXtcblx0dmFyIGNzc0NscyA9IHRoaXMuZ2V0KCdjc3NDbHMnKTtcblx0cmV0dXJuIGNzc0NscyA/ICcgJysgY3NzQ2xzIDogJyc7XG59XG5cbi8vIGRlbGF5IGNvbXBvIHNwZWNpZmljIGV2ZW50XG5leHBvcnQgZnVuY3Rpb24gZGVsYXlFdmVudChpbnN0LCBuYW1lLCBkZWxheSwgZXZuKXtcblx0Ly8gY3VyZW50IHRpbWUgYW5kIHByZXZpb3VzIGNsaWNrIHRpbWVcblx0Y29uc3Qgbm93ID0gKG5ldyBEYXRlKCkpLnZhbHVlT2YoKTtcblx0Y29uc3QgcHJldiA9IGluc3QuY2xpY2tlZEF0IHx8IDA7XG5cdC8vIGlnbm9yZSBtdWx0aXBsZSBjbGlja3Ncblx0aWYgKGluc3QuY2xpY2tlZEF0ICsgZGVsYXkgPiBub3cpIHJldHVybjtcblx0Ly8gc2F2ZSBjbGlja2VkIHRpbWVkXG5cdGluc3QuY2xpY2tlZEF0ID0gbm93O1xuXHRyZXR1cm4gaW5zdC5maXJlKG5hbWUsIGV2bik7XG5cblx0LyppZihpbnN0LnRpbWVyKSBjbGVhclRpbWVvdXQoaW5zdC50aW1lcik7XG5cdGlmKGRlbGF5KXtcblx0XHRpbnN0LnRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuXHRcdFx0aW5zdC5maXJlKG5hbWUsIGV2bik7XG5cdFx0fSwgZGVsYXkpO1xuXHR9IGVsc2Uge1xuXHRcdGluc3QuZmlyZShuYW1lLCBldm4pO1xuXHR9XG5cdCovXG59XG5cbi8vIGRlbGF5IGNvbXBvIHNwZWNpZmljIGV2ZW50XG5leHBvcnQgZnVuY3Rpb24gZGVsYXlEaXNwYXRjaEV2ZW50KGluc3QsIGV2ZW50LCBkZWxheSl7XG5cdC8vIGN1cmVudCB0aW1lIGFuZCBwcmV2aW91cyBjbGljayB0aW1lXG5cdGNvbnN0IG5vdyA9IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCk7XG5cdC8vIGlnbm9yZSBtdWx0aXBsZSBjbGlja3Ncblx0aWYgKGluc3QuY2xpY2tlZEF0ICsgZGVsYXkgPiBub3cpIHJldHVybjtcblx0Ly8gc2F2ZSBjbGlja2VkIHRpbWVkXG5cdGluc3QuY2xpY2tlZEF0ID0gbm93O1xuXG5cdHJldHVybiBpbnN0LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xufVxuIiwiY29uc3QgUE9TSVRJT05TID0ge1xuXHR0b3A6ICd0b3AnLFxuXHRyaWdodDogJ3JpZ2h0Jyxcblx0Ym90dG9tOiAnYm90dG9tJyxcblx0bGVmdDogJ2xlZnQnXG59O1xuXG5jb25zdCBBTElHTk1FTlRTID0ge1xuXHR0b3A6ICd0b3AnLFxuXHRyaWdodDogJ3JpZ2h0Jyxcblx0Ym90dG9tOiAnYm90dG9tJyxcblx0bGVmdDogJ2xlZnQnLFxuXHRjZW50ZXI6ICdjZW50ZXInXG59O1xuXG5jb25zdCBQT1NJVElPTlNfQUxJR05NRU5UUyA9IHtcblx0dG9wOiBbQUxJR05NRU5UUy5sZWZ0LCBBTElHTk1FTlRTLnJpZ2h0LCBBTElHTk1FTlRTLmNlbnRlcl0sXG5cdHJpZ2h0OiBbQUxJR05NRU5UUy50b3AsIEFMSUdOTUVOVFMuYm90dG9tLCBBTElHTk1FTlRTLmNlbnRlcl0sXG5cdGJvdHRvbTogW0FMSUdOTUVOVFMubGVmdCwgQUxJR05NRU5UUy5yaWdodCwgQUxJR05NRU5UUy5jZW50ZXJdLFxuXHRsZWZ0OiBbQUxJR05NRU5UUy50b3AsIEFMSUdOTUVOVFMuYm90dG9tLCBBTElHTk1FTlRTLmNlbnRlcl1cbn07XG5cbmNvbnN0IE1JTl9XSURUSCA9IDEwMDtcbmNvbnN0IE1BUkdJTiA9IDA7XG5jb25zdCBsb2cgPSAoZnVuY3Rpb24oKSB7Ly8gVE9ETzogcmVtb3ZlIG9uIHJlZmFjdG9yaW5nXG5cdGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnREVCVUdfRFJPUExJQicpKSB7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRcdGNvbnNvbGUubG9nLmFwcGx5KG51bGwsIFsnRFJPUF9MSUInXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24gKCkge31cblx0fVxufSkoKTtcblxuY2xhc3MgRHJvcEFnZW50IHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5QT1NJVElPTlMgPSBQT1NJVElPTlM7XG5cdFx0dGhpcy5BTElHTk1FTlRTID0gQUxJR05NRU5UUztcblx0XHR0aGlzLkRPRVNOVF9GSVRfQ0xTID0gJy1maXQtbGFyZ2UtZHJvcGRvd24nO1xuXG5cdFx0dGhpcy5kcm9wcyA9IHt9O1xuXHRcdHRoaXMuaGlkZU9uQ2xpY2sgPSAoKSA9PiB7XG5cdFx0XHRsb2coJ2hpZGUgb24gY2xpY2snKTtcblx0XHRcdE9iamVjdC5rZXlzKHRoaXMuZHJvcHMpLmZvckVhY2godHlwZSA9PiB7XG5cdFx0XHRcdHRoaXMuaGlkZSh0eXBlKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHNob3coY21wLCB0eXBlLCBhY3RpdmF0b3IsIGRyb3AsIHBvc2l0aW9uLCBzY3JvbGxhYmxlRWxlbWVudCkge1xuXHRcdGlmKCF0eXBlKSB7XG5cdFx0XHRsb2coJ0RST1AgLSBzaG93IC0gZW1wdHkgdHlwZScpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRsb2coJ0RST1AgLSBzaG93IC0gJysgdHlwZSk7XG5cblx0XHRpZiAodGhpcy5kcm9wc1t0eXBlXSkge1xuXHRcdFx0dGhpcy5oaWRlKHR5cGUpO1xuXHRcdH1cblxuXHRcdHRoaXMuZHJvcHNbdHlwZV0gPSB7XG5cdFx0XHRjbXA6IGNtcCxcblx0XHRcdGFjdGl2YXRvcjogYWN0aXZhdG9yLFxuXHRcdFx0ZHJvcDogZHJvcCxcblx0XHRcdHBvc2l0aW9uOiBwb3NpdGlvbiB8fCBQT1NJVElPTlMuYm90dG9tLFxuXHRcdFx0YWxpZ25tZW50OiAvKmFsaWdubWVudCB8fCovIEFMSUdOTUVOVFMuY2VudGVyLFxuXHRcdFx0bWFyZ2luOiAvKm1hcmdpbiB8fCovIE1BUkdJTixcblx0XHRcdHNjcm9sbGFibGVFbGVtZW50OiBzY3JvbGxhYmxlRWxlbWVudFxuXHRcdH07XG5cblx0XHR0aGlzLl9zZXRQb3NpdGlvbnNBbmRBbGlnbm1lbnRzKHR5cGUpO1xuXHRcdHRoaXMuX2NvdW50QW5kU2V0UG9zaXRpb24odHlwZSlcblx0XHRcdC5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdGxvZygnRHJvcEFnZW50IC0gZG9lcyBub3QgZml0Jyk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5kcm9wc1t0eXBlXS5zY3JvbGxhYmxlRWxlbWVudCkge1xuXHRcdFx0XHRcdHRoaXMuZHJvcHNbdHlwZV0ub25TY3JvbGwgPSAoZnVuY3Rpb24oRHJvcEFnZW50LCB0eXBlKXtcblx0XHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdERyb3BBZ2VudC5oaWRlKHR5cGUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pKHRoaXMsIHR5cGUpO1xuXHRcdFx0XHRcdHRoaXMuZHJvcHNbdHlwZV0uc2Nyb2xsYWJsZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5kcm9wc1t0eXBlXS5vblNjcm9sbCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7Ly8gcXVpY2sgZml4IC0gYXR0YWNoIGFmdGVyIGNsaWNrIGV2ZW50IGJ1YmJsZXMgdXAgdG8gZG9jdW1lbnQuYm9keVxuXHRcdFx0XHRcdGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhpZGVPbkNsaWNrKTtcblx0XHRcdFx0fSwgMCk7XG5cblx0XHRcdFx0dGhpcy5kcm9wc1t0eXBlXS5jbXAuc2hvdygpXG5cdFx0XHR9KTtcblx0fVxuXG5cdGhpZGUodHlwZSkge1xuXHRcdGlmKCF0eXBlIHx8ICF0aGlzLmRyb3BzW3R5cGVdKSB7XG5cdFx0XHRsb2coJ0RST1AgLSBoaWRlIC0gZW1wdHkgdHlwZScpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRsb2coJ0RST1AgLSBoaWRlIC0gJysgdHlwZSwgdGhpcy5kcm9wcyk7XG5cdFx0ZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGlkZU9uQ2xpY2spO1xuXG5cdFx0aWYgKHRoaXMuZHJvcHNbdHlwZV0uZG9lc250Rml0KSB7XG5cdFx0XHR0aGlzLmRyb3BzW3R5cGVdLmRyb3AuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLkRPRVNOVF9GSVRfQ0xTKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5kcm9wc1t0eXBlXS5zY3JvbGxhYmxlRWxlbWVudCkge1xuXHRcdFx0dGhpcy5kcm9wc1t0eXBlXS5zY3JvbGxhYmxlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmRyb3BzW3R5cGVdLm9uU2Nyb2xsKTtcblx0XHR9XG5cblx0XHR0aGlzLmRyb3BzW3R5cGVdLmNtcC5oaWRlKCk7XG5cdFx0ZGVsZXRlIHRoaXMuZHJvcHNbdHlwZV07XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBkcm9wV3JhcCdzIHBvc2l0aW9uIGF0IG9uZSBzaWRlXG5cdCAqIGFuZCBjYW5jZWxzIHRoZSBwb3N0aW9uIG9uIHRoZSBvdGhlciBzaWRlLlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc2lkZSAtIG9uZSBvZiB0b3AsIHJpZ2h0LCBib3R0b20gb3IgbGVmdFxuXHQgKiBAcGFyYW0ge0ludH0gdmFsdWUgLSBwb3NpdGlvbiBpbiBweCBvciBudWxsXG5cdCAqL1xuXHRfc2V0RHJvcFdyYXBQb3NpdGlvbih0eXBlLCBzaWRlLCB2YWx1ZSkge1xuXHRcdHN3aXRjaCAoc2lkZSkge1xuXHRcdFx0Y2FzZSAndG9wJzogdGhpcy5kcm9wc1t0eXBlXS5kcm9wLnN0eWxlLmJvdHRvbSA9IG51bGw7IGJyZWFrO1xuXHRcdFx0Y2FzZSAncmlnaHQnOiB0aGlzLmRyb3BzW3R5cGVdLmRyb3Auc3R5bGUubGVmdCA9IG51bGw7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnYm90dG9tJzogdGhpcy5kcm9wc1t0eXBlXS5kcm9wLnN0eWxlLnRvcCA9IG51bGw7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnbGVmdCc6IHRoaXMuZHJvcHNbdHlwZV0uZHJvcC5zdHlsZS5yaWdodCA9IG51bGw7IGJyZWFrO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmRyb3BzW3R5cGVdLmRyb3Auc3R5bGVbc2lkZV0gPSB2YWx1ZSA/IHZhbHVlICsgJ3B4JyA6IHZhbHVlO1xuXHR9XG5cblx0X2dldFZpZXdwb3J0UmVjdCgpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0d2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuXHRcdFx0aGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG5cdFx0XHR0b3A6IHdpbmRvdy5wYWdlWU9mZnNldCxcblx0XHRcdHJpZ2h0OiB3aW5kb3cucGFnZVhPZmZzZXQgKyB3aW5kb3cuaW5uZXJXaWR0aCxcblx0XHRcdGJvdHRvbTogd2luZG93LnBhZ2VZT2Zmc2V0ICsgd2luZG93LmlubmVySGVpZ2h0LFxuXHRcdFx0bGVmdDogd2luZG93LnBhZ2VYT2Zmc2V0XG5cdFx0fTtcblx0fVxuXG5cdF9nZXRSZWN0V2l0aE9mZnNldChlbGVtKSB7XG5cdFx0Y29uc3QgcmVjdCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0d2lkdGg6IHJlY3Qud2lkdGgsXG5cdFx0XHRoZWlnaHQ6IHJlY3QuaGVpZ2h0LFxuXHRcdFx0dG9wOiByZWN0LnRvcCArIHdpbmRvdy5wYWdlWU9mZnNldCxcblx0XHRcdHJpZ2h0OiByZWN0LnJpZ2h0ICsgd2luZG93LnBhZ2VYT2Zmc2V0LFxuXHRcdFx0Ym90dG9tOiByZWN0LmJvdHRvbSArIHdpbmRvdy5wYWdlWU9mZnNldCxcblx0XHRcdGxlZnQ6IHJlY3QubGVmdCArIHdpbmRvdy5wYWdlWE9mZnNldFxuXHRcdH07XG5cdH1cblxuXHRfZG9lc0l0Rml0KHR5cGUsIGRyb3AsIHBvc2l0aW9uKSB7XG5cdFx0dGhpcy5kcm9wc1t0eXBlXS5kcm9wLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcblx0XHR0aGlzLmRyb3BzW3R5cGVdLmRyb3Auc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cdFx0dGhpcy5kcm9wc1t0eXBlXS5kcm9wLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcblxuXHRcdGNvbnN0IGRyb3BXcmFwUmVjdCA9IHRoaXMuX2dldFJlY3RXaXRoT2Zmc2V0KHRoaXMuZHJvcHNbdHlwZV0uZHJvcCk7XG5cdFx0Y29uc3Qgdmlld3BvcnRSZWN0ID0gdGhpcy5fZ2V0Vmlld3BvcnRSZWN0KCk7XG5cblx0XHR0aGlzLmRyb3BzW3R5cGVdLmRyb3Auc3R5bGUudmlzaWJpbGl0eSA9IG51bGw7XG5cdFx0dGhpcy5kcm9wc1t0eXBlXS5kcm9wLnN0eWxlLmRpc3BsYXkgPSBudWxsO1xuXHRcdHRoaXMuZHJvcHNbdHlwZV0uZHJvcC5zdHlsZS5wb3NpdGlvbiA9IG51bGw7XG5cblx0XHRpZiAoKHRoaXMuZHJvcHNbdHlwZV0ucG9zaXRpb24gPT09IFBPU0lUSU9OUy5sZWZ0IHx8IHRoaXMuZHJvcHNbdHlwZV0ucG9zaXRpb24gPT09IFBPU0lUSU9OUy5yaWdodClcblx0XHRcdC8vICYmIGRyb3BXcmFwUmVjdC53aWR0aCA8IHRoaXMuZHJvcENvbmZpZy5taW5XaWR0aFxuXHRcdFx0JiYgKGRyb3BXcmFwUmVjdC5sZWZ0IDw9IHZpZXdwb3J0UmVjdC5sZWZ0XG5cdFx0XHRcdHx8IGRyb3BXcmFwUmVjdC5yaWdodCA+PSB2aWV3cG9ydFJlY3QucmlnaHQpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdHJldHVybiBkcm9wV3JhcFJlY3QudG9wID49IHZpZXdwb3J0UmVjdC50b3Bcblx0XHRcdCYmIGRyb3BXcmFwUmVjdC5yaWdodCA8PSB2aWV3cG9ydFJlY3QucmlnaHRcblx0XHRcdCYmIGRyb3BXcmFwUmVjdC5ib3R0b20gPD0gdmlld3BvcnRSZWN0LmJvdHRvbVxuXHRcdFx0JiYgZHJvcFdyYXBSZWN0LmxlZnQgPj0gdmlld3BvcnRSZWN0LmxlZnQ7XG5cdH1cblxuXHRfZ2V0QWN0aXZhdG9yUmVjdCh0eXBlKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2dldFJlY3RXaXRoT2Zmc2V0KHRoaXMuZHJvcHNbdHlwZV0uYWN0aXZhdG9yKTtcblx0fVxuXHRfZ2V0RHJvcFdyYXBSZWN0KHR5cGUpIHtcblx0XHRzd2l0Y2ggKHRoaXMuZHJvcHNbdHlwZV0ucG9zaXRpb24pIHtcblx0XHRcdGNhc2UgUE9TSVRJT05TLnRvcDpcblx0XHRcdGNhc2UgUE9TSVRJT05TLmJvdHRvbTpcblx0XHRcdFx0dGhpcy5fc2V0RHJvcFdyYXBQb3NpdGlvbih0eXBlLCB0aGlzLmRyb3BzW3R5cGVdLmRyb3AsICdsZWZ0JywgMCk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFBPU0lUSU9OUy5yaWdodDpcblx0XHRcdGNhc2UgUE9TSVRJT05TLmxlZnQ6XG5cdFx0XHRcdHRoaXMuX3NldERyb3BXcmFwUG9zaXRpb24odHlwZSwgdGhpcy5kcm9wc1t0eXBlXS5kcm9wLCAndG9wJywgMCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdHRoaXMuZHJvcHNbdHlwZV0uZHJvcC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG5cdFx0dGhpcy5kcm9wc1t0eXBlXS5kcm9wLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXHRcdHRoaXMuZHJvcHNbdHlwZV0uZHJvcC5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG5cdFx0bGV0IGRyb3BXcmFwUmVjdCA9IHRoaXMuX2dldFJlY3RXaXRoT2Zmc2V0KHRoaXMuZHJvcHNbdHlwZV0uZHJvcCk7XG5cdFx0dGhpcy5kcm9wc1t0eXBlXS5kcm9wLnN0eWxlLnZpc2liaWxpdHkgPSBudWxsO1xuXHRcdHRoaXMuZHJvcHNbdHlwZV0uZHJvcC5zdHlsZS5kaXNwbGF5ID0gbnVsbDtcblx0XHR0aGlzLmRyb3BzW3R5cGVdLmRyb3Auc3R5bGUucG9zaXRpb24gPSBudWxsO1xuXG5cdFx0cmV0dXJuIGRyb3BXcmFwUmVjdDtcblx0fVxuXG5cdF9jb3VudEFuZFNldFBvc2l0aW9uKHR5cGUsIHBvc2l0aW9uSW5kZXggPSAwLCBhbGlnbm1lbnRJbmRleCA9IDAsIGZvcmNlUG9zaXRpb24gPSBmYWxzZSkge1xuXHRcdGxldCBhY3RpdmF0b3JSZWN0ID0gdGhpcy5fZ2V0QWN0aXZhdG9yUmVjdCh0eXBlKSxcblx0XHRcdHZpZXdwb3J0UmVjdCA9IHRoaXMuX2dldFZpZXdwb3J0UmVjdCgpLFxuXHRcdFx0ZHJvcFdyYXBSZWN0ID0gdGhpcy5fZ2V0RHJvcFdyYXBSZWN0KHR5cGUpLFxuXHRcdFx0cG9zaXRpb25PYmogPSB0aGlzLmRyb3BzW3R5cGVdLnBvc2l0aW9uc1twb3NpdGlvbkluZGV4XSxcblx0XHRcdHBvc2l0aW9uID0gcG9zaXRpb25PYmouaWQsXG5cdFx0XHRhbGlnbm1lbnQgPSBwb3NpdGlvbk9iai5hbGlnbm1lbnRzW2FsaWdubWVudEluZGV4XSxcblx0XHRcdG1hcmdpbiA9IHRoaXMuZHJvcHNbdHlwZV0ubWFyZ2luO1xuXG5cdFx0bGV0IGNvdW50Q2VudGVyUG9zaXRpb24gPSAoKSA9PiB7XG5cdFx0XHRsZXQgZHJvcFdyYXBSZWN0O1xuXG5cdFx0XHQvLyBnaXZlIHRoZSBkcm9wIHRoZSBtb3N0IHNwYWNlIGl0IG1heSBoYXZlIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uXG5cdFx0XHQvLyB0byBmaW5kIGl0IGl0cyB3aWR0aCBvciBoZWlnaHQuLi5cblx0XHRcdHN3aXRjaCAocG9zaXRpb24pIHtcblx0XHRcdFx0Y2FzZSBQT1NJVElPTlMudG9wOlxuXHRcdFx0XHRjYXNlIFBPU0lUSU9OUy5ib3R0b206XG5cdFx0XHRcdFx0dGhpcy5fc2V0RHJvcFdyYXBQb3NpdGlvbih0eXBlLCdsZWZ0JywgMCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgUE9TSVRJT05TLnJpZ2h0OlxuXHRcdFx0XHRjYXNlIFBPU0lUSU9OUy5sZWZ0OlxuXHRcdFx0XHRcdHRoaXMuX3NldERyb3BXcmFwUG9zaXRpb24odHlwZSwndG9wJywgMCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdC8vIC4uLnRoZW4gZ2V0IHJlY3QuLi5cblx0XHRcdGRyb3BXcmFwUmVjdCA9IHRoaXMuX2dldERyb3BXcmFwUmVjdCh0eXBlKTtcblxuXHRcdFx0Ly8gLi4uYW5kIHNldCB0aGUgcG9zaXRpb24gYWNjb3JkaW5nbHlcblx0XHRcdHN3aXRjaCAocG9zaXRpb24pIHtcblx0XHRcdFx0Y2FzZSBQT1NJVElPTlMudG9wOlxuXHRcdFx0XHRjYXNlIFBPU0lUSU9OUy5ib3R0b206XG5cdFx0XHRcdFx0dGhpcy5fc2V0RHJvcFdyYXBQb3NpdGlvbih0eXBlLCdsZWZ0JywgYWN0aXZhdG9yUmVjdC5sZWZ0ICsgKGFjdGl2YXRvclJlY3Qud2lkdGggLyAyKSAtIChkcm9wV3JhcFJlY3Qud2lkdGggLyAyKSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgUE9TSVRJT05TLnJpZ2h0OlxuXHRcdFx0XHRjYXNlIFBPU0lUSU9OUy5sZWZ0OlxuXHRcdFx0XHRcdHRoaXMuX3NldERyb3BXcmFwUG9zaXRpb24odHlwZSwndG9wJywgYWN0aXZhdG9yUmVjdC50b3AgKyAoYWN0aXZhdG9yUmVjdC5oZWlnaHQgLyAyKSAtIChkcm9wV3JhcFJlY3QuaGVpZ2h0IC8gMikpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvL2xvZygnRHJvcEFnZW50Ll9jb3VudEFuZFNldFBvc2l0aW9uOiBwb3NpdGlvbiAnICsgcG9zaXRpb24gKyAnLCBhbGlnbm1lbnQgJyArIGFsaWdubWVudClcblxuXHRcdHN3aXRjaCAocG9zaXRpb24pIHtcblx0XHRcdGNhc2UgUE9TSVRJT05TLnRvcDpcblx0XHRcdFx0dGhpcy5fc2V0RHJvcFdyYXBQb3NpdGlvbih0eXBlLCdib3R0b20nLCB2aWV3cG9ydFJlY3QuYm90dG9tIC0gYWN0aXZhdG9yUmVjdC50b3AgKyAxICsgbWFyZ2luKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFBPU0lUSU9OUy5yaWdodDpcblx0XHRcdFx0dGhpcy5fc2V0RHJvcFdyYXBQb3NpdGlvbih0eXBlLCdsZWZ0JywgYWN0aXZhdG9yUmVjdC5yaWdodCArIDEgKyBtYXJnaW4pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgUE9TSVRJT05TLmJvdHRvbTpcblx0XHRcdFx0dGhpcy5fc2V0RHJvcFdyYXBQb3NpdGlvbih0eXBlLCd0b3AnLCBhY3RpdmF0b3JSZWN0LmJvdHRvbSArIDEgKyBtYXJnaW4pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgUE9TSVRJT05TLmxlZnQ6XG5cdFx0XHRcdHRoaXMuX3NldERyb3BXcmFwUG9zaXRpb24odHlwZSwncmlnaHQnLCB2aWV3cG9ydFJlY3QucmlnaHQgLSBhY3RpdmF0b3JSZWN0LmxlZnQgKyAxICsgbWFyZ2luKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChhbGlnbm1lbnQpIHtcblx0XHRcdGNhc2UgQUxJR05NRU5UUy50b3A6XG5cdFx0XHRjYXNlIEFMSUdOTUVOVFMubGVmdDpcblx0XHRcdFx0dGhpcy5fc2V0RHJvcFdyYXBQb3NpdGlvbih0eXBlLCBhbGlnbm1lbnQsIGFjdGl2YXRvclJlY3RbYWxpZ25tZW50XSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBBTElHTk1FTlRTLmJvdHRvbTpcblx0XHRcdGNhc2UgQUxJR05NRU5UUy5yaWdodDpcblx0XHRcdFx0dGhpcy5fc2V0RHJvcFdyYXBQb3NpdGlvbih0eXBlLCBhbGlnbm1lbnQsIHZpZXdwb3J0UmVjdFthbGlnbm1lbnRdIC0gYWN0aXZhdG9yUmVjdFthbGlnbm1lbnRdKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIEFMSUdOTUVOVFMuY2VudGVyOlxuXHRcdFx0XHRjb3VudENlbnRlclBvc2l0aW9uKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdC8vIGluIHRoZSBlbmQgd2hlbiB0aGUgZHJvcCBpcyBwbGFjZWRcblx0XHQvLyBjaGVjayBpZiB0aGUgd2lkdGggaXMgbm8gYmlnZ2VyIHRoZSByZXF1aXJlZCBtYXggd2lkdGhcblx0XHQvLyBpZiAodGhpcy5kcm9wQ29uZmlnLm1heFdpZHRoICE9IG51bGwpIHtcblx0XHQvLyBcdGRyb3BXcmFwUmVjdCA9IHRoaXMuX2dldERyb3BXcmFwUmVjdCh0eXBlKTtcblxuXHRcdC8vIFx0aWYgKGRyb3BXcmFwUmVjdC53aWR0aCA+IHRoaXMuZHJvcENvbmZpZy5tYXhXaWR0aCkge1xuXHRcdC8vIFx0XHR0aGlzLmRyb3BXcmFwLnN0eWxlLndpZHRoID0gdGhpcy5kcm9wQ29uZmlnLm1heFdpZHRoICsgJ3B4JztcblxuXHRcdC8vIFx0XHQvLyBzaW5jZSB0aGUgY2VudGVyIGFsaWdubWVudCBpcyBzcGVjaWFsbHkgY291bnRlZCxcblx0XHQvLyBcdFx0Ly8gaXQgbmVlZHMgdG8gYmUgcmVjb3VudGVkIHdoZW4gdGhlIHdpZHRoIGNoYW5nZXNcblx0XHQvLyBcdFx0aWYgKGFsaWdubWVudCA9PT0gQUxJR05NRU5UUy5jZW50ZXIpIHtcblx0XHQvLyBcdFx0XHRjb3VudENlbnRlclBvc2l0aW9uKCk7XG5cdFx0Ly8gXHRcdH1cblx0XHQvLyBcdH1cblx0XHQvLyB9XG5cblxuXHRcdGlmICh0aGlzLl9kb2VzSXRGaXQodHlwZSwgcG9zaXRpb24pKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIHN1aXRhYmxlIHBvc2l0aW9uIGZvdW5kXG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGZvcmNlUG9zaXRpb24pIHtcblx0XHRcdFx0dGhpcy5kcm9wc1t0eXBlXS5kb2VzbnRGaXQgPSB0cnVlO1xuXHRcdFx0XHR0aGlzLmRyb3BzW3R5cGVdLmRyb3AuY2xhc3NMaXN0LmFkZCh0aGlzLkRPRVNOVF9GSVRfQ0xTKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG5cdFx0XHR9IGVsc2UgaWYgKHBvc2l0aW9uSW5kZXggPT09IHRoaXMuZHJvcHNbdHlwZV0ucG9zaXRpb25zLmxlbmd0aCAtIDEgJiYgYWxpZ25tZW50SW5kZXggPT09IHBvc2l0aW9uT2JqLmFsaWdubWVudHMubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHQvL2xvZygnRHJvcEFnZW50Ll9jb3VudEFuZFNldFBvc2l0aW9uOiBubyBwb3NpdGlvbiBmb3VuZCcpXG5cblx0XHRcdFx0cmV0dXJuIHRoaXMuX2NvdW50QW5kU2V0UG9zaXRpb24odHlwZSwwLCAwLCB0cnVlKTsgLy8gbm8gc3VpdGFibGUgcG9zaXRpb24gZm91bmQsIHNldCB0aGUgcHJlZmVycmVkIG9uZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly9sb2coJ0Ryb3BBZ2VudC5fY291bnRBbmRTZXRQb3NpdGlvbjogZG9lcyBub3QgZml0JylcblxuXHRcdFx0XHRpZiAoYWxpZ25tZW50SW5kZXggPT09IHBvc2l0aW9uT2JqLmFsaWdubWVudHMubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLl9jb3VudEFuZFNldFBvc2l0aW9uKHR5cGUsICsrcG9zaXRpb25JbmRleCwgMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX2NvdW50QW5kU2V0UG9zaXRpb24odHlwZSwgcG9zaXRpb25JbmRleCwgKythbGlnbm1lbnRJbmRleCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH1cblx0fVxuXG5cdF9zZXRQb3NpdGlvbnNBbmRBbGlnbm1lbnRzKHR5cGUpIHtcblx0XHR0aGlzLmRyb3BzW3R5cGVdLnBvc2l0aW9ucyA9IFtdO1xuXG5cdFx0Ly8gY3JhdGUgYW5kIHB1c2ggdGhlIHBvc2l0aW9uIG9iamVjdFxuXHRcdGNvbnN0IGFkZFBvc2l0aW9uID0gKHBvc2l0aW9uKSA9PiB7XG5cdFx0XHRjb25zdCBhbGlnbm1lbnRzID0gW10sXG5cdFx0XHRcdHByZWZlcnJlZEFsaWdubWVudCA9IHRoaXMuZHJvcHNbdHlwZV0uYWxpZ25tZW50LFxuXHRcdFx0XHRwb3NzaWJsZUFsaWdubWVudHMgPSBQT1NJVElPTlNfQUxJR05NRU5UU1twb3NpdGlvbl07XG5cblx0XHRcdGlmIChwcmVmZXJyZWRBbGlnbm1lbnQgJiYgcG9zc2libGVBbGlnbm1lbnRzLmluZGV4T2YocHJlZmVycmVkQWxpZ25tZW50KSA+IC0xKSB7XG5cdFx0XHRcdGFsaWdubWVudHMucHVzaChwcmVmZXJyZWRBbGlnbm1lbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHRwb3NzaWJsZUFsaWdubWVudHMuZm9yRWFjaChmdW5jdGlvbihhbGlnbm1lbnQpIHtcblx0XHRcdFx0aWYgKGFsaWdubWVudHMuaW5kZXhPZihhbGlnbm1lbnQpID09PSAtMSkge1xuXHRcdFx0XHRcdGFsaWdubWVudHMucHVzaChhbGlnbm1lbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5kcm9wc1t0eXBlXS5wb3NpdGlvbnMucHVzaCh7XG5cdFx0XHRcdGlkOiBwb3NpdGlvbixcblx0XHRcdFx0YWxpZ25tZW50czogYWxpZ25tZW50c1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdGFkZFBvc2l0aW9uKHRoaXMuZHJvcHNbdHlwZV0ucG9zaXRpb24pO1xuXG5cdFx0Ly8gc2V0IHRoZSBvcmRlciBvZiBwb3NpdGlvbiBmYWxsYmFja3MgYWNjb3JkaW5nIHRvIHRoZSBwcmVmZXJyZWQgb25lXG5cdFx0c3dpdGNoICh0aGlzLmRyb3BzW3R5cGVdLnBvc2l0aW9uKSB7XG5cdFx0XHRjYXNlIFBPU0lUSU9OUy50b3A6XG5cdFx0XHRcdGFkZFBvc2l0aW9uKFBPU0lUSU9OUy5ib3R0b20pO1xuXHRcdFx0XHRhZGRQb3NpdGlvbihQT1NJVElPTlMucmlnaHQpO1xuXHRcdFx0XHRhZGRQb3NpdGlvbihQT1NJVElPTlMubGVmdCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBQT1NJVElPTlMucmlnaHQ6XG5cdFx0XHRcdGFkZFBvc2l0aW9uKFBPU0lUSU9OUy5sZWZ0KTtcblx0XHRcdFx0YWRkUG9zaXRpb24oUE9TSVRJT05TLnRvcCk7XG5cdFx0XHRcdGFkZFBvc2l0aW9uKFBPU0lUSU9OUy5ib3R0b20pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgUE9TSVRJT05TLmJvdHRvbTpcblx0XHRcdFx0YWRkUG9zaXRpb24oUE9TSVRJT05TLnRvcCk7XG5cdFx0XHRcdGFkZFBvc2l0aW9uKFBPU0lUSU9OUy5yaWdodCk7XG5cdFx0XHRcdGFkZFBvc2l0aW9uKFBPU0lUSU9OUy5sZWZ0KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFBPU0lUSU9OUy5sZWZ0OlxuXHRcdFx0XHRhZGRQb3NpdGlvbihQT1NJVElPTlMucmlnaHQpO1xuXHRcdFx0XHRhZGRQb3NpdGlvbihQT1NJVElPTlMudG9wKTtcblx0XHRcdFx0YWRkUG9zaXRpb24oUE9TSVRJT05TLmJvdHRvbSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBEcm9wQWdlbnQoKTtcbiIsImNsYXNzIFRyYXBUYWJOYXZpZ2F0aW9uRGVjb3JhdG9yIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy53cmFwcGVyID0gbnVsbDtcblx0XHR0aGlzLmZvY3VzYWJsZUVsZW1zID0gbnVsbDtcblx0XHR0aGlzLmZpcnN0RWxlbSA9IG51bGw7XG5cdFx0dGhpcy5sYXN0RWxlbSA9IG51bGw7XG5cdFx0dGhpcy5pbml0Rm9jdXMgPSBudWxsO1xuXG5cdFx0dGhpcy5fb25GaXJzdEVsZW1LZXlkb3duID0ge1xuXHRcdFx0aGFuZGxlRXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRpZiAoZXZlbnQua2V5ID09PSAnVGFiJyAmJiBldmVudC5zaGlmdEtleSkge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0dGhpcy5sYXN0RWxlbS5mb2N1cygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRoaXMuX29uTGFzdEVsZW1LZXlkb3duID0ge1xuXHRcdFx0aGFuZGxlRXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRpZiAoZXZlbnQua2V5ID09PSAnVGFiJyAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdHRoaXMuZmlyc3RFbGVtLmZvY3VzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0aW5pdChub2RlLCBhcmdzKSB7XG5cdFx0aWYgKCEobm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkgcmV0dXJuIHsgdGVhcmRvd24gOiAoKT0+e30gfTtcblx0XHR0aGlzLndyYXBwZXIgPSBub2RlO1xuXG5cdFx0Y29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHRoaXMudHJhcFRhYk5hdmlnYXRpb24oKSk7XG5cdFx0bXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKG5vZGUsIHsgYXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xuXG5cdFx0dGhpcy50cmFwVGFiTmF2aWdhdGlvbigpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRlYXJkb3duOigpID0+IHtcblx0XHRcdFx0bXV0YXRpb25PYnNlcnZlciAmJiBtdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0dGhpcy51bnRyYXBUYWJOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdHRyYXBUYWJOYXZpZ2F0aW9uKCkge1xuXHRcdGNvbnN0IEZPQ1VTQUJMRV9FTEVNRU5UUyA9IFtcblx0XHRcdCdhW2hyZWZdJyxcblx0XHRcdC8vICdhcmVhW2hyZWZdJyxcblx0XHRcdCdidXR0b246bm90KFtkaXNhYmxlZF0pJyxcblx0XHRcdCdpbnB1dDpub3QoW2Rpc2FibGVkXSknLFxuXHRcdFx0J3NlbGVjdDpub3QoW2Rpc2FibGVkXSknLFxuXHRcdFx0J3RleHRhcmVhOm5vdChbZGlzYWJsZWRdKSdcblx0XHRcdC8vICdpZnJhbWUnLFxuXHRcdFx0Ly8gJ29iamVjdCcsXG5cdFx0XHQvLyAnZW1iZWQnLFxuXHRcdFx0Ly8gJypbdGFiaW5kZXhdJyxcblx0XHRcdC8vICcqW2NvbnRlbnRlZGl0YWJsZV0nLFxuXHRcdF07XG5cblx0XHR0aGlzLmZvY3VzYWJsZUVsZW1zID0gdGhpcy53cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoRk9DVVNBQkxFX0VMRU1FTlRTLmpvaW4oJywnKSk7XG5cblx0XHR0aGlzLnVudHJhcFRhYk5hdmlnYXRpb24oKTtcblxuXHRcdGlmICh0aGlzLmZvY3VzYWJsZUVsZW1zLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5maXJzdEVsZW0gPSB0aGlzLmZvY3VzYWJsZUVsZW1zWzBdO1xuXHRcdFx0dGhpcy5sYXN0RWxlbSA9IHRoaXMuZm9jdXNhYmxlRWxlbXNbdGhpcy5mb2N1c2FibGVFbGVtcy5sZW5ndGgtMV07XG5cblx0XHRcdHRoaXMuZmlyc3RFbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9vbkZpcnN0RWxlbUtleWRvd24sIGZhbHNlKTtcblx0XHRcdHRoaXMubGFzdEVsZW0uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX29uTGFzdEVsZW1LZXlkb3duLCBmYWxzZSk7XG5cblx0XHRcdGlmICh0aGlzLmluaXRGb2N1cyA9PT0gbnVsbCkge1xuXHRcdFx0XHR0aGlzLmluaXRGb2N1cyA9IHRydWU7XG5cdFx0XHRcdHRoaXMuc2V0SW5pdEZvY3VzKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0dW50cmFwVGFiTmF2aWdhdGlvbigpIHtcblx0XHR0aGlzLmZpcnN0RWxlbSAmJiB0aGlzLmZpcnN0RWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25GaXJzdEVsZW1LZXlkb3duLCBmYWxzZSk7XG5cdFx0dGhpcy5sYXN0RWxlbSAmJiB0aGlzLmxhc3RFbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9vbkxhc3RFbGVtS2V5ZG93biwgZmFsc2UpO1xuXHR9XG5cblx0c2V0SW5pdEZvY3VzKCkge1xuXHRcdGNvbnN0IGlzU29tZUVsZW1Gb2N1c2VkID0gQXJyYXkuZnJvbSh0aGlzLmZvY3VzYWJsZUVsZW1zKS5pbmNsdWRlcyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcblxuXHRcdGlmICghaXNTb21lRWxlbUZvY3VzZWQpIHtcblx0XHRcdGlmICh0aGlzLmZvY3VzYWJsZUVsZW1zLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0dGhpcy5mb2N1c2FibGVFbGVtc1sxXS5mb2N1cygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5maXJzdEVsZW0uZm9jdXMoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCAobm9kZSwgYXJncykgPT4ge1xuXHRjb25zdCB0cmFwVGFiTmF2aWdhdGlvbkRlY29yYXRvciA9IG5ldyBUcmFwVGFiTmF2aWdhdGlvbkRlY29yYXRvcjtcblx0cmV0dXJuIHRyYXBUYWJOYXZpZ2F0aW9uRGVjb3JhdG9yLmluaXQobm9kZSwgYXJncyk7XG59O1xuIiwiaW1wb3J0IEtpbkVsZW1lbnQgZnJvbSAnLi4vS2luRWxlbWVudC5qcyc7XG5pbXBvcnQge3VpZH0gZnJvbSAnLi4vLi4vbGlicy9Db21wb01peGluLmpzJztcbmltcG9ydCBEcm9wQWdlbnQgZnJvbSAnLi4vLi4vbGlicy9Ecm9wTGliLmpzJztcbmltcG9ydCB0cmFwVGFiTmF2aWdhdGlvbiBmcm9tICcuLi8uLi9saWJzL3RyYXBUYWJOYXZpZ2F0aW9uLmpzJztcbmltcG9ydCAnLi9kcm9wZG93bi5zdHlsJztcblxuY2xhc3MgRHJvcGRvd24gZXh0ZW5kcyBLaW5FbGVtZW50IHtcblx0c3RhdGljIGdldCBhdHRyQ2ZnKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0eXBlOiBudWxsLCAvLyBkcm9wZG93bnx0b29sdGlwXG5cdFx0XHRwb3NpdGlvbjogbnVsbCAvLyBib3R0b218dG9wfHJpZ2h0fGxlZnRcblx0XHR9O1xuXHR9XG5cblx0c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5rZXlzKERyb3Bkb3duLmF0dHJDZmcpLmZpbHRlcihuYW1lID0+IERyb3Bkb3duLmF0dHJDZmdbbmFtZV0pO1xuXHR9XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdGluaXRFbGVtKCkge1xuXHQvKlxuXHRcdDxkaXYgcmVmOmVsVHBsIGNsYXNzPVwia2luX2Ryb3Bkb3duX193cmFwIC17dHlwZX1cIiBvbjptb3VzZWVudGVyIG9uOm1vdXNlbGVhdmU+XG5cdFx0XHQ8ZGl2IHJlZjplbEFjdGl2YXRvciBjbGFzcz1cImtpbl9kcm9wZG93bl9fYWN0aXZhdG9yXCIgb246Y2xpY2s9XCJ0b2dnbGUoKVwiPlxuXHRcdFx0XHQ8c2xvdCBuYW1lPVwiZHJvcGRvd24tYWN0aXZhdG9yXCIgLz5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGRpdiByZWY6ZWxEcm9wIGNsYXNzOi12aXNpYmxlIHt2aXNpYmxlfSBjbGFzcz1cImtpbl9kcm9wZG93biB7dHlwZSAhPT0gJ2Ryb3Bkb3duJyA/IGAtJHt0eXBlfWAgOiAnJ31cIiBzdHlsZT1cInRvcDoge2Ryb3BUb3B9cHg7IGxlZnQ6IHtkcm9wTGVmdH1weDtcIj5cblx0XHRcdFx0PHNsb3QgLz5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGRpdiBjbGFzcz1cImtpbl9kcm9wZG93bl9fb3ZlcmxheVwiIC8+XG5cdFx0PC9kaXY+XG5cdCovXG5cdFx0Ly8gc3RhdGljIGF0dHJpYnV0ZXNcblx0XHR0aGlzLl90eXBlID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSB8fCAnZHJvcGRvd24nO1xuXHRcdHRoaXMuX3Bvc2l0aW9uID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJykgfHwgJ2JvdHRvbSc7XG5cdFx0dGhpcy5faWQgPSB0aGlzLmdldEF0dHJpYnV0ZSgndG9vbHRpcC1pZCcpIHx8ICd0b29sdGlwLScgKyB1aWQoKTtcblxuXHRcdC8vIG5vZGVzXG5cdFx0bGV0IG5vZGU7XG5cdFx0dGhpcy5lbFRwbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdHRoaXMuZWxUcGwuY2xhc3NOYW1lID0gJ2tpbl9kcm9wZG93bl9fd3JhcCc7XG5cdFx0aWYgKHRoaXMuX3R5cGUgIT09ICdkcm9wZG93bicpIHtcblx0XHRcdHRoaXMuZWxUcGwuY2xhc3NMaXN0LmFkZCgnLScgKyB0aGlzLl90eXBlKTtcblx0XHR9XG5cblx0XHRjb25zdCBfZHJvcEVzYyA9IChldm4pID0+IHtcblx0XHRcdGlmIChldm4uY29kZSA9PT0gJ0VzY2FwZScgfHwgZXZuLmtleUNvZGUgPT09IDI3KSB7XG5cdFx0XHRcdHRoaXMuZHJvcEhpZGUoKTtcblx0XHRcdFx0ZXZuLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdGV2bi5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGhpcy5fZHJvcEVzY0JpbmQgPSBfZHJvcEVzYy5iaW5kKHRoaXMpO1xuXG5cdFx0aWYgKHRoaXMuX3R5cGUgPT09ICd0b29sdGlwJykge1xuXHRcdFx0dGhpcy5lbFRwbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKCkgPT4ge1xuXHRcdFx0XHRjbGVhclRpbWVvdXQodGhpcy5fdGltZXJUb2dnbGUpO1xuXHRcdFx0XHR0aGlzLl90aW1lclRvZ2dsZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuZHJvcFNob3coKTtcblx0XHRcdFx0fSwgMzAwKTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5lbFRwbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl90aW1lclRvZ2dsZSA9IGNsZWFyVGltZW91dCh0aGlzLl90aW1lclRvZ2dsZSk7XG5cdFx0XHRcdHRoaXMuZHJvcEhpZGUoKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2Ryb3BFc2NCaW5kKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmVsVHBsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9kcm9wRXNjQmluZCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5lbEFjdGl2YXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdHRoaXMuZWxBY3RpdmF0b3IuY2xhc3NOYW1lID0gJ2tpbl9kcm9wZG93bl9fYWN0aXZhdG9yJztcblx0XHRpZiAodGhpcy5fdHlwZSAhPT0gJ3Rvb2x0aXAnKSB7XG5cdFx0XHR0aGlzLmVsQWN0aXZhdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9pc1Zpc2libGUgPyB0aGlzLmRyb3BIaWRlKCkgOiB0aGlzLmRyb3BTaG93KCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0bm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Nsb3QnKTtcblx0XHRub2RlLnNldEF0dHJpYnV0ZSgnbmFtZScsICdkcm9wZG93bi1hY3RpdmF0b3InKTtcblx0XHR0aGlzLmVsQWN0aXZhdG9yLmFwcGVuZENoaWxkKG5vZGUpO1xuXHRcdHRoaXMuZWxUcGwuYXBwZW5kQ2hpbGQodGhpcy5lbEFjdGl2YXRvcik7XG5cblx0XHR0aGlzLmVsRHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdHRoaXMuZWxEcm9wLmNsYXNzTmFtZSA9ICdraW5fZHJvcGRvd24nO1xuXHRcdGlmICh0aGlzLl90eXBlICE9PSAnZHJvcGRvd24nKSB7XG5cdFx0XHR0aGlzLmVsRHJvcC5jbGFzc0xpc3QuYWRkKCctJyArIHRoaXMuX3R5cGUpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5fdHlwZSA9PT0gJ3Rvb2x0aXAnKSB7XG5cdFx0XHR0aGlzLmVsQWN0aXZhdG9yLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JywgdGhpcy5faWQpO1xuXHRcdFx0dGhpcy5lbERyb3Auc2V0QXR0cmlidXRlKCdyb2xlJywgJ3Rvb2x0aXAnKTtcblx0XHRcdHRoaXMuZWxEcm9wLnNldEF0dHJpYnV0ZSgnaWQnLCB0aGlzLl9pZCk7XG5cdFx0fVxuXHRcdHRoaXMuZWxEcm9wLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Nsb3QnKSk7XG5cdFx0dGhpcy5lbFRwbC5hcHBlbmRDaGlsZCh0aGlzLmVsRHJvcCk7XG5cblx0XHQvLyBjcmVhdGUgYW4gb3ZlcmxheSBlbGVtZW50IHRvIHByZXZlbnQgc2Nyb2xsaW5nIHdoaWxlIGFjdGl2ZSBkcm9wZG93blxuXHRcdGlmICh0aGlzLl90eXBlICE9PSAndG9vbHRpcCcpIHtcblx0XHRcdHRoaXMuZWxPdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0XHR0aGlzLmVsT3ZlcmxheS5jbGFzc05hbWUgPSAna2luX2Ryb3Bkb3duX19vdmVybGF5Jztcblx0XHRcdHRoaXMuZWxUcGwuYXBwZW5kQ2hpbGQodGhpcy5lbE92ZXJsYXkpO1xuXHRcdH1cblxuXHR9XG5cblx0ZWxlbVJlbmRlcmVkKCkge1xuXHRcdHRoaXMuX2hpZGVPblNjcm9sbE9mRWxlbSA9IHRoaXMuY2xvc2VzdCgna2luLXRhYmxlJyk7XG5cdH1cblxuXHRzaG93KCkge1xuXHRcdHRoaXMuZWxEcm9wLmNsYXNzTGlzdC5hZGQoJy12aXNpYmxlJyk7XG5cdFx0dGhpcy5faXNWaXNpYmxlID0gdHJ1ZTtcblxuXHRcdGlmICh0aGlzLl90eXBlICE9PSAndG9vbHRpcCcpIHtcblx0XHRcdHRoaXMuZWxPdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgKGUpID0+IHtcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmVsT3ZlcmxheS5jbGFzc0xpc3QuYWRkKCctdmlzaWJsZScpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmVsQWN0aXZhdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgKGUpID0+IHtcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdH1cblxuXHRkcm9wU2hvdygpIHtcblx0XHREcm9wQWdlbnQuc2hvdyhcblx0XHRcdHRoaXMsXG5cdFx0XHR0aGlzLl90eXBlLFxuXHRcdFx0dGhpcy5lbEFjdGl2YXRvcixcblx0XHRcdHRoaXMuZWxEcm9wLFxuXHRcdFx0dGhpcy5fcG9zaXRpb24sXG5cdFx0XHR0aGlzLl9oaWRlT25TY3JvbGxPZkVsZW1cblx0XHQpO1xuXHRcdHRoaXMuc2hvdygpO1xuXG5cdFx0Ly8gZm9jdXMgdGhlIGZpcnN0IGZvY3VzYWJsZSBlbC4gaW4gZHJvcGRvd25cblx0XHQvLyBsb2NrIGZvY3VzIG9uIGRyb3Bkb3duXG5cdFx0aWYgKHRoaXMuX3R5cGUgIT09ICd0b29sdGlwJykge1xuXHRcdFx0dGhpcy5mb2N1c0ZpcnN0SXRlbSgpO1xuXHRcdFx0dGhpcy5fdHJhcFRhYk5hdmlnYXRpb24gPSB0cmFwVGFiTmF2aWdhdGlvbih0aGlzKTtcblx0XHR9XG5cdH1cblxuXHRoaWRlKCkge1xuXHRcdHRoaXMuZWxEcm9wLmNsYXNzTGlzdC5yZW1vdmUoJy12aXNpYmxlJyk7XG5cdFx0dGhpcy5faXNWaXNpYmxlID0gZmFsc2U7XG5cblx0XHQvLyBkaXNhYmxlIHdoZWVsIGFjY29yZGluZyB0byBfdHlwZSB0byBlbmFibGUgY2xpY2sgb24gdGhlIHRvb2x0aXAtYWN0aXZhdG9yXG5cdFx0aWYgKHRoaXMuX3R5cGUgIT09ICd0b29sdGlwJykge1xuXHRcdFx0dGhpcy5lbE92ZXJsYXkucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCAoZSkgPT4ge1xuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuZWxPdmVybGF5LmNsYXNzTGlzdC5yZW1vdmUoJy12aXNpYmxlJyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZWxBY3RpdmF0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCAoZSkgPT4ge1xuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRkcm9wSGlkZSgpIHtcblx0XHREcm9wQWdlbnQuaGlkZSh0aGlzLl90eXBlKTtcblx0XHR0aGlzLmhpZGUoKTtcblx0XHRpZiAodGhpcy5fdHJhcFRhYk5hdmlnYXRpb24pIHtcblx0XHRcdHRoaXMuX3RyYXBUYWJOYXZpZ2F0aW9uLnRlYXJkb3duKCk7XG5cdFx0XHRkZWxldGUgdGhpcy5fdHJhcFRhYk5hdmlnYXRpb247XG5cdFx0fVxuXHR9XG5cblx0ZWxlbURlc3Ryb3llZCgpIHtcblx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLl9kcm9wRXNjQmluZCk7XG5cdH1cblxuXHRmb2N1c0ZpcnN0SXRlbSgpIHtcblx0XHR2YXIgZm9jdXNJdGVtID0gdGhpcy5lbERyb3AuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicsICdhJylbMF07XG5cdFx0aWYgKGZvY3VzSXRlbSkge1xuXHRcdFx0Zm9jdXNJdGVtLmZvY3VzKCk7XG5cdFx0fVxuXHR9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgna2luLWRyb3Bkb3duJywgRHJvcGRvd24pO1xuIiwiaW1wb3J0IEtpbkVsZW1lbnQgZnJvbSAnLi4vS2luRWxlbWVudC5qcyc7XG5pbXBvcnQgJy4vZHJvcGRvd25JdGVtLnN0eWwnO1xuXG5jbGFzcyBEcm9wZG93bkl0ZW0gZXh0ZW5kcyBLaW5FbGVtZW50IHtcblx0c3RhdGljIGdldCBhdHRyQ2ZnKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0eXBlOiBudWxsLCAvLyBocnxjdXN0b218dGl0bGV8YnV0dG9uXG5cdFx0XHRsaW5rOiB7IC8vIGJ1dHRvbiB3aXRoIGxpbmsgLSA8YSBocmVmPVwie2xpbmt9XCI+XG5cdFx0XHRcdHVwZGF0ZUZuOiAndXBkYXRlQXR0cicsXG5cdFx0XHRcdHVwZGF0ZUNmZzoge1xuXHRcdFx0XHRcdG5hbWU6ICdocmVmJ1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J2tpbi1kaXNhYmxlZCc6IHsgLy8gbmVlZCB0byBwcmVmaXggYmVjYXVzZSAnZGlzYWJsZWQnIGlzIHJlc2VydmVkIGZvciBmb2N1c2FibGUgZWxlbWVudHNcblx0XHRcdFx0dXBkYXRlRm46ICd0b2dnbGVBdHRyJyxcblx0XHRcdFx0dXBkYXRlQ2ZnOiB7XG5cdFx0XHRcdFx0YXR0ck5hbWU6ICdkaXNhYmxlZCcsXG5cdFx0XHRcdFx0YXR0clZhbHVlOiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnZGF0YS10ZXN0JzogbnVsbFxuXHRcdH07XG5cdH1cblxuXHRzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcblx0XHRyZXR1cm4gT2JqZWN0LmtleXMoRHJvcGRvd25JdGVtLmF0dHJDZmcpLmZpbHRlcihuYW1lID0+IERyb3Bkb3duSXRlbS5hdHRyQ2ZnW25hbWVdKTtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdH1cblxuXHRpbml0RWxlbSgpIHtcblx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3R5cGUnKTtcblxuXHRcdGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnbGluaycpKSB7XG5cdFx0XHR0aGlzLmVsVHBsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdFx0dGhpcy5lbFRwbC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB0aGlzLmdldEF0dHJpYnV0ZSgnbGluaycpKTtcblx0XHRcdHRoaXMuZWxUcGwuY2xhc3NMaXN0LmFkZCgnLWxpbmsnKTtcblx0XHRcdHRoaXMuZWxUcGwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2xvdCcpKTtcblx0XHR9IGVsc2UgaWYgKHR5cGUgPT09ICdocicpIHtcblx0XHRcdHRoaXMuZWxUcGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdocicpO1xuXHRcdFx0dGhpcy5lbFRwbC5jbGFzc0xpc3QuYWRkKCctaHInKTtcblx0XHR9IGVsc2UgaWYgKHR5cGUgPT09ICd0aXRsZScpIHtcblx0XHRcdHRoaXMuZWxUcGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoNScpO1xuXHRcdFx0dGhpcy5lbFRwbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzbG90JykpO1xuXHRcdFx0dGhpcy5lbFRwbC5jbGFzc0xpc3QuYWRkKCctdGl0bGUnKTtcblx0XHR9IGVsc2UgaWYgKHR5cGUgPT09ICdjdXN0b20nKSB7XG5cdFx0XHR0aGlzLmVsVHBsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0XHR0aGlzLmVsVHBsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Nsb3QnKSk7XG5cdFx0XHR0aGlzLmVsVHBsLmNsYXNzTGlzdC5hZGQoJy1jdXN0b20nKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5lbFRwbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuXHRcdFx0dGhpcy5lbFRwbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzbG90JykpO1xuXHRcdFx0dGhpcy5lbFRwbC5jbGFzc0xpc3QuYWRkKCctJyArICh0eXBlID8gdHlwZSA6ICdidXR0b24nKSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXRlc3QnKSkge1xuXHRcdFx0dGhpcy5lbFRwbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGVzdCcsIHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLXRlc3QnKSk7XG5cdFx0XHR0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS10ZXN0Jyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5lbFRwbC5jbGFzc0xpc3QuYWRkKCdraW5fZHJvcGRvd25fX2l0ZW0nKTtcblx0fVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2tpbi1kcm9wZG93bi1pdGVtJywgRHJvcGRvd25JdGVtKTtcbiIsImltcG9ydCBLaW5FbGVtZW50IGZyb20gJy4uL0tpbkVsZW1lbnQuanMnO1xuaW1wb3J0IHt1aWR9IGZyb20gJy4uLy4uL2xpYnMvQ29tcG9NaXhpbi5qcyc7XG5pbXBvcnQgJy4vaW5wdXQuc3R5bCc7XG5cbmNsYXNzIElucHV0IGV4dGVuZHMgS2luRWxlbWVudCB7XG5cdHN0YXRpYyBnZXQgYXR0ckNmZygpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dmFsdWU6IG51bGwsXG5cdFx0XHRsYWJlbDogbnVsbCxcblx0XHRcdGlkOiBudWxsLFxuXHRcdFx0dHlwZTogbnVsbCxcblx0XHRcdGlubGluZSA6IHtcblx0XHRcdFx0dXBkYXRlRm46ICd0b2dnbGVDbGFzcycsXG5cdFx0XHRcdHVwZGF0ZUNmZzoge1xuXHRcdFx0XHRcdGNzc0NsczogJy1pbmxpbmUnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRlcnJvcjoge1xuXHRcdFx0XHR1cGRhdGVGbjogJ3RvZ2dsZUF0dHInLFxuXHRcdFx0fSxcblx0XHRcdHBsYWNlaG9sZGVyOiBudWxsLFxuXHRcdFx0J2tpbi1kaXNhYmxlZCc6IHsgLy8gbmVlZCB0byBwcmVmaXggYmVjYXVzZSAnZGlzYWJsZWQnIGlzIHJlc2VydmVkIGZvciBmb2N1c2FibGUgZWxlbWVudHNcblx0XHRcdFx0dXBkYXRlRm46IFsndG9nZ2xlQXR0cicsICd0b2dnbGVDbGFzcyddLFxuXHRcdFx0XHR1cGRhdGVDZmc6IFt7XG5cdFx0XHRcdFx0YXR0ck5hbWU6ICdkaXNhYmxlZCcsXG5cdFx0XHRcdFx0YXR0clZhbHVlOiB0cnVlLFxuXHRcdFx0XHRcdGVsOiAnaW5wdXRFbGVtJ1xuXHRcdFx0XHR9LCB7XG5cdFx0XHRcdFx0Y3NzQ2xzOiAnLWRpc2FibGVkJ1xuXHRcdFx0XHR9XVxuXHRcdFx0fSxcblx0XHRcdGZvcm1yb3c6IHtcblx0XHRcdFx0dXBkYXRlRm46ICd0b2dnbGVDbGFzcycsXG5cdFx0XHRcdHVwZGF0ZUNmZzoge1xuXHRcdFx0XHRcdGNzc0NsczogJy1mb3Jtcm93J1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0c2ltcGxlcm93OiB7XG5cdFx0XHRcdHVwZGF0ZUZuOiAndG9nZ2xlQ2xhc3MnLFxuXHRcdFx0XHR1cGRhdGVDZmc6IHtcblx0XHRcdFx0XHRjc3NDbHM6ICctc2ltcGxlcm93J1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0c2l6ZToge1xuXHRcdFx0XHR1cGRhdGVGbjogJ3VwZGF0ZUNsYXNzJ1xuXHRcdFx0fSxcblx0XHRcdHRpdGxlOiB7IC8vIHRpdGxlXG5cdFx0XHRcdHVwZGF0ZUZuOiAndXBkYXRlQXR0cicsXG5cdFx0XHRcdHVwZGF0ZUNmZzoge1xuXHRcdFx0XHRcdG5hbWU6ICd0aXRsZSdcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHR9O1xuXHR9XG5cblx0c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5rZXlzKElucHV0LmF0dHJDZmcpLmZpbHRlcihuYW1lID0+IElucHV0LmF0dHJDZmdbbmFtZV0pO1xuXHR9XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdGluaXRFbGVtKCkge1xuXHRcdGNvbnN0IGV5ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCdleWUnKTtcblx0XHRjb25zdCBoaW50ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2hpbnQnKTtcblxuXHRcdHRoaXMuZWxUcGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHR0aGlzLmVsVHBsLmNsYXNzTGlzdC5hZGQoJ2tpbl9pbnB1dF9fd3JhcCcpO1xuXG5cdFx0dGhpcy5pbml0SW5wdXRFbGVtKCk7XG5cblx0XHRpZiAoaGludCkge1xuXHRcdFx0dGhpcy5pbml0SGludCgpO1xuXHRcdH1cblx0XHRpZiAoZXllKSB7XG5cdFx0XHR0aGlzLmluaXRFeWUoKTtcblx0XHR9XG5cblx0XHR0aGlzLmZvY3VzYWJsZUVsZW0gPSB0aGlzLmlucHV0RWxlbTtcblx0fVxuXG5cdHVwZGF0ZUVsZW0oKSB7XG5cdFx0Ly8gVE9ETzogcm96ZWJyYXQgYSBwb3V6aXQgZGVwZW5kZWNlIGF0dHJpYnV0dVxuXHRcdHRoaXMudXBkYXRlSW5wdXRFbGVtKCk7XG5cdFx0dGhpcy51cGRhdGVMYWJlbEVsZW0oKTtcblx0XHR0aGlzLnVwZGF0ZUVycm9yRWxlbSgpO1xuXHR9XG5cblx0aW5pdElucHV0RWxlbSgpIHtcblx0XHRpZiAodGhpcy5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSA9PT0gJ3RleHRhcmVhJykge1xuXHRcdFx0dGhpcy5pbnB1dEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmlucHV0RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5pbnB1dEVsZW0uY2xhc3NMaXN0LmFkZCgna2luX2lucHV0Jyk7XG5cblx0XHR0aGlzLmVsVHBsLmFwcGVuZENoaWxkKHRoaXMuaW5wdXRFbGVtKTtcblx0fVxuXG5cdHVwZGF0ZUlucHV0RWxlbSgpIHtcblx0XHR0aGlzLmlucHV0RWxlbS5zZXRBdHRyaWJ1dGUoJ2lkJywgdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkJykgfHwgdWlkKCkpO1xuXG5cdFx0aWYgKHRoaXMuZ2V0QXR0cmlidXRlKCd0eXBlJykgIT09ICd0ZXh0YXJlYScpIHtcblx0XHRcdHRoaXMuaW5wdXRFbGVtLnR5cGUgPSB0aGlzLmdldEF0dHJpYnV0ZSgndHlwZScpIHx8ICd0ZXh0Jztcblx0XHR9XG5cblx0XHRpZiAodGhpcy5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSA9PT0gJ3RleHRhcmVhJykge1xuXHRcdFx0dGhpcy5pbnB1dEVsZW0uY2xhc3NMaXN0LmFkZCgnLXRleHRhcmVhJyk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaGFzQXR0cmlidXRlKCdzaXplJykpIHtcblx0XHRcdHRoaXMuaW5wdXRFbGVtLmNsYXNzTGlzdC5hZGQoJy0nICsgdGhpcy5nZXRBdHRyaWJ1dGUoJ3NpemUnKSk7XG5cdFx0fVx0ZWxzZSB7XG5cdFx0XHR0aGlzLmlucHV0RWxlbS5jbGFzc0xpc3QucmVtb3ZlKCctJyArIHRoaXMuZ2V0QXR0cmlidXRlKCdzaXplJykpO1xuXHRcdH1cblxuXHRcdHRoaXMuaW5wdXRFbGVtLnZhbHVlID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykgfHwgJyc7XG5cdFx0dGhpcy5pbnB1dEVsZW0ucGxhY2Vob2xkZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgncGxhY2Vob2xkZXInKSB8fCAnJztcblxuXHRcdGlmICh0aGlzLmdldEF0dHJpYnV0ZSgnZXJyb3InKSkge1xuXHRcdFx0dGhpcy5pbnB1dEVsZW0uY2xhc3NMaXN0LmFkZCgnLWVycm9yJyk7XG5cdFx0XHR0aGlzLmlucHV0RWxlbS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcsICd0cnVlJyk7XG5cdFx0XHRjb25zdCBlcnJJZCA9IHRoaXMuaW5wdXRFbGVtLmdldEF0dHJpYnV0ZSgnaWQnKStcIl9lcnJvclwiO1xuXHRcdFx0dGhpcy5pbnB1dEVsZW0uc2V0QXR0cmlidXRlKCdhcmlhLWVycm9ybWVzc2FnZScsIGVycklkKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5pbnB1dEVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnLWVycm9yJyk7XG5cdFx0XHR0aGlzLmlucHV0RWxlbS5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcpO1xuXHRcdFx0dGhpcy5pbnB1dEVsZW0ucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWVycm9ybWVzc2FnZScpO1xuXHRcdH1cblx0fVxuXG5cdGdldExhYmVsRWxlbSgpIHtcblx0XHRpZiAodGhpcy5sYWJlbEVsZW0pIHtcblx0XHRcdHJldHVybiB0aGlzLmxhYmVsRWxlbTtcblx0XHR9XG5cblx0XHR0aGlzLmxhYmVsRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG5cdFx0dGhpcy5sYWJlbEVsZW0uY2xhc3NMaXN0LmFkZCgna2luX2lucHV0X19sYWJlbCcpO1xuXG5cdFx0dGhpcy5pbnB1dEVsZW0uYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCBldmVudCA9PiB7XG5cdFx0XHR0aGlzLmxhYmVsRWxlbS5jbGFzc0xpc3QuYWRkKCctZm9jdXNlZCcpO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5pbnB1dEVsZW0uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGV2ZW50ID0+IHtcblx0XHRcdHRoaXMubGFiZWxFbGVtLmNsYXNzTGlzdC5yZW1vdmUoJy1mb2N1c2VkJyk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gdGhpcy5sYWJlbEVsZW07XG5cdH1cblxuXHR1cGRhdGVMYWJlbEVsZW0oKSB7XG5cdFx0Y29uc3QgbGFiZWwgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbGFiZWwnKTtcblx0XHRjb25zdCBsYWJlbEVsZW0gPSB0aGlzLmdldExhYmVsRWxlbSgpO1xuXHRcdGNvbnN0IGVsZW1BZGRlZCA9IHRoaXMuZWxUcGwuY29udGFpbnMobGFiZWxFbGVtKTtcblxuXHRcdGlmIChsYWJlbCkge1xuXHRcdFx0dGhpcy5sYWJlbEVsZW0uc2V0QXR0cmlidXRlKCdmb3InLCB0aGlzLmlucHV0RWxlbS5nZXRBdHRyaWJ1dGUoJ2lkJykpO1xuXG5cdFx0XHRpZiAodGhpcy5nZXRBdHRyaWJ1dGUoJ2Vycm9yJykpIHtcblx0XHRcdFx0dGhpcy5sYWJlbEVsZW0uY2xhc3NMaXN0LmFkZCgnLWVycm9yJyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmxhYmVsRWxlbS5jbGFzc0xpc3QucmVtb3ZlKCctZXJyb3InKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5sYWJlbEVsZW0uaW5uZXJUZXh0ID0gbGFiZWw7XG5cblx0XHRcdGlmICghZWxlbUFkZGVkKSB7XG5cdFx0XHRcdHRoaXMuaW5wdXRFbGVtLmJlZm9yZShsYWJlbEVsZW0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoZWxlbUFkZGVkKSB7XG5cdFx0XHR0aGlzLmVsVHBsLnJlbW92ZUNoaWxkKGxhYmVsRWxlbSk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0RXJyb3JFbGVtKCkge1xuXHRcdGlmICh0aGlzLmVycm9yRWxlbSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JFbGVtO1xuXHRcdH1cblxuXHRcdGNvbnN0IGVycm9yRWxlbVN0ciA9ICc8cCBjbGFzcz1cImtpbl9pbnB1dF9fZXJyb3JcIiByb2xlPVwiYWxlcnRcIj48a2luLWljb24gbmFtZT1cImJhZGdlLWNyaXRpY2FsXCIgc2l6ZT1cIjE1XCI+PC9raW4taWNvbj4gJyArIHRoaXMuZ2V0QXR0cmlidXRlKCdlcnJvcicpICsgJzwvcD4nO1xuXG5cdFx0dGhpcy5lcnJvckVsZW0gPSB0aGlzLmdldERvbVBhcnNlcigpXG5cdFx0XHQucGFyc2VGcm9tU3RyaW5nKGVycm9yRWxlbVN0ciwgJ3RleHQvaHRtbCcpXG5cdFx0XHQucXVlcnlTZWxlY3RvcigncCcpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZXJyb3JFbGVtO1xuXHR9XG5cblx0dXBkYXRlRXJyb3JFbGVtKCkge1xuXHRcdGNvbnN0IGVycm9yID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2Vycm9yJyk7XG5cdFx0Y29uc3QgZXJyb3JFbGVtID0gdGhpcy5nZXRFcnJvckVsZW0oKTtcblx0XHRjb25zdCBlbGVtQWRkZWQgPSB0aGlzLmVsVHBsLmNvbnRhaW5zKGVycm9yRWxlbSk7XG5cblx0XHRpZiAoZXJyb3IpIHtcblx0XHRcdGNvbnN0IGVycklkID0gdGhpcy5pbnB1dEVsZW0uZ2V0QXR0cmlidXRlKCdpZCcpK1wiX2Vycm9yXCI7XG5cdFx0XHRlcnJvckVsZW0uc2V0QXR0cmlidXRlKCdpZCcsIGVycklkKTtcblxuXHRcdFx0ZXJyb3JFbGVtLmlubmVySFRNTCA9ICc8a2luLWljb24gbmFtZT1cImJhZGdlLWNyaXRpY2FsXCIgc2l6ZT1cIjE1XCI+PC9raW4taWNvbj4gJyArIGVycm9yO1xuXG5cdFx0XHRpZiAoIWVsZW1BZGRlZCkge1xuXHRcdFx0XHR0aGlzLmVsVHBsLmFwcGVuZENoaWxkKGVycm9yRWxlbSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChlbGVtQWRkZWQpIHtcblx0XHRcdHRoaXMuZWxUcGwucmVtb3ZlQ2hpbGQoZXJyb3JFbGVtKTtcblx0XHR9XG5cdH1cblxuXHRpbml0SGludCgpIHtcblx0XHR0aGlzLmhpbnRFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgna2luLXRvb2x0aXAnKTtcblx0XHR0aGlzLmhpbnRFbGVtLmNsYXNzTGlzdC5hZGQoJ2tpbl9pbnB1dF9faGludCcpO1xuXHRcdHRoaXMuaGludEVsZW0uaW5uZXJIVE1MID0gJzxraW4taWNvbiBuYW1lPVwiaWNvbi1tLWFjdGlvbi1pbmZvXCIgc2l6ZT1cIjIwXCIgc2xvdD1cInRvb2x0aXAtYWN0aXZhdG9yXCI+PC9raW4taWNvbj48ZGl2IHNsb3Q9XCJ0b29sdGlwXCI+JyArIHRoaXMuZ2V0QXR0cmlidXRlKCdoaW50JykgKyAnPC9kaXY+J1xuXHRcdHRoaXMuZWxUcGwuYXBwZW5kQ2hpbGQodGhpcy5oaW50RWxlbSk7XG5cdH1cblxuXHQvLyBjcmVhdGUgJ2V5ZScgYnV0dG9uIGZvciByZXZlYWxpbmcgcGFzc3dvcmRcblx0aW5pdEV5ZSgpIHtcblx0XHRjb25zdCBleWUgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZXllJyk7XG5cblx0XHRsZXQgcHdkVmlzaWJsZSA9IGZhbHNlO1xuXG5cdFx0dGhpcy5leWVFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcblx0XHR0aGlzLmV5ZUVsZW0uY2xhc3NMaXN0LmFkZCgna2luX2lucHV0X19leWUnKTtcblx0XHR0aGlzLmV5ZUVsZW0uaW5uZXJIVE1MID0gJzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAvPjxzcGFuPicgKyBgJHtleWUgIT0gJ3RydWUnID8gZXllIDogJ1Nob3cgcGFzc3dvcmQnfWAgKyAnPC9zcGFuPjxraW4taWNvbiBuYW1lPVwiaWNvbi1tLWV5ZVwiIHNpemU9XCIxNlwiIC8+JztcblxuXHRcdHRoaXMuZXllRWxlbUJ0biA9IHRoaXMuZXllRWxlbS5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKTtcblxuXHRcdC8vIGNoYW5nZSBpbnB1dCB0eXBlXG5cdFx0dGhpcy5leWVFbGVtQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGV2ZW50ID0+IHtcblx0XHRcdHB3ZFZpc2libGUgPSAhcHdkVmlzaWJsZTtcblx0XHRcdGxldCBpY29uID0gdGhpcy5leWVFbGVtLnF1ZXJ5U2VsZWN0b3IoJ2tpbi1pY29uJyk7XG5cdFx0XHRpZiAocHdkVmlzaWJsZSkge1xuXHRcdFx0XHR0aGlzLmlucHV0RWxlbS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dCcpO1xuXHRcdFx0XHRpY29uLnNldEF0dHJpYnV0ZSgnbmFtZScsICdpY29uLW0tZXllLXN0cmlrZWQnKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuaW5wdXRFbGVtLnNldEF0dHJpYnV0ZSgndHlwZScsICdwYXNzd29yZCcpO1xuXHRcdFx0XHRpY29uLnNldEF0dHJpYnV0ZSgnbmFtZScsICdpY29uLW0tZXllJyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR0aGlzLmlucHV0RWxlbS5jbGFzc0xpc3QuYWRkKCctZXllJyk7XG5cdFx0dGhpcy5lbFRwbC5hcHBlbmRDaGlsZCh0aGlzLmV5ZUVsZW0pO1xuXHR9XG5cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdraW4taW5wdXQnLCBJbnB1dCk7XG4iLCJpbXBvcnQgS2luRWxlbWVudCBmcm9tICcuLi9LaW5FbGVtZW50LmpzJztcbmltcG9ydCB7dWlkfSBmcm9tICcuLi8uLi9saWJzL0NvbXBvTWl4aW4uanMnO1xuaW1wb3J0ICcuL3NlbGVjdC5zdHlsJztcblxuY2xhc3MgU2VsZWN0IGV4dGVuZHMgS2luRWxlbWVudCB7XG5cdHN0YXRpYyBnZXQgYXR0ckNmZygpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dmFsdWU6IG51bGwsXG5cdFx0XHRsYWJlbDogbnVsbCxcblx0XHRcdGlkOiBudWxsLFxuXHRcdFx0dHlwZTogbnVsbCxcblx0XHRcdGlubGluZSA6IHtcblx0XHRcdFx0dXBkYXRlRm46ICd0b2dnbGVDbGFzcycsXG5cdFx0XHRcdHVwZGF0ZUNmZzoge1xuXHRcdFx0XHRcdGNzc0NsczogJy1pbmxpbmUnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRlcnJvcjoge1xuXHRcdFx0XHR1cGRhdGVGbjogJ3RvZ2dsZUF0dHInLFxuXHRcdFx0XHR1cGRhdGVDZmc6IHtcblx0XHRcdFx0XHRhdHRyTmFtZTogJ2Vycm9yJyxcblx0XHRcdFx0XHRhdHRyVmFsdWU6ICcnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRmb3Jtcm93OiB7XG5cdFx0XHRcdHVwZGF0ZUZuOiAndG9nZ2xlQ2xhc3MnLFxuXHRcdFx0XHR1cGRhdGVDZmc6IHtcblx0XHRcdFx0XHRjc3NDbHM6ICctZm9ybXJvdydcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHNpbXBsZXJvdzoge1xuXHRcdFx0XHR1cGRhdGVGbjogJ3RvZ2dsZUNsYXNzJyxcblx0XHRcdFx0dXBkYXRlQ2ZnOiB7XG5cdFx0XHRcdFx0Y3NzQ2xzOiAnLXNpbXBsZXJvdydcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdraW4tZGlzYWJsZWQnOiB7IC8vIG5lZWQgdG8gcHJlZml4IGJlY2F1c2UgJ2Rpc2FibGVkJyBpcyByZXNlcnZlZCBmb3IgZm9jdXNhYmxlIGVsZW1lbnRzXG5cdFx0XHRcdHVwZGF0ZUZuOiBbJ3RvZ2dsZUF0dHInLCAndG9nZ2xlQ2xhc3MnXSxcblx0XHRcdFx0dXBkYXRlQ2ZnOiBbe1xuXHRcdFx0XHRcdGF0dHJOYW1lOiAnZGlzYWJsZWQnLFxuXHRcdFx0XHRcdGF0dHJWYWx1ZTogdHJ1ZSxcblx0XHRcdFx0XHRlbDogJ3NlbGVjdEVsZW0nXG5cdFx0XHRcdH0sIHtcblx0XHRcdFx0XHRjc3NDbHM6ICctZGlzYWJsZWQnXG5cdFx0XHRcdH1dXG5cdFx0XHR9LFxuXHRcdFx0c2l6ZToge1xuXHRcdFx0XHR1cGRhdGVGbjogJ3VwZGF0ZUNsYXNzJ1xuXHRcdFx0fSxcblx0XHRcdHRpdGxlOiB7IC8vIHRpdGxlXG5cdFx0XHRcdHVwZGF0ZUZuOiAndXBkYXRlQXR0cicsXG5cdFx0XHRcdHVwZGF0ZUNmZzoge1xuXHRcdFx0XHRcdG5hbWU6ICd0aXRsZSdcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHR9O1xuXHR9XG5cblx0c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5rZXlzKFNlbGVjdC5hdHRyQ2ZnKS5maWx0ZXIobmFtZSA9PiBTZWxlY3QuYXR0ckNmZ1tuYW1lXSk7XG5cdH1cblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0aW5pdEVsZW0oKSB7XG5cdFx0dGhpcy5lbFRwbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdHRoaXMuZWxUcGwuY2xhc3NMaXN0LmFkZCgna2luX3NlbGVjdF9fd3JhcCcpO1xuXG5cdFx0dGhpcy5pbml0c2VsZWN0RWxlbSgpO1xuXHRcdHRoaXMuaW5pdENoZXZyb24oKTtcblx0XHR0aGlzLmluaXRIaW50KCk7XG5cdFx0dGhpcy5hcHBlbmRPcHRpb25zKCk7XG5cdFx0dGhpcy5mb2N1c2FibGVFbGVtID0gdGhpcy5zZWxlY3RFbGVtO1xuXHR9XG5cblx0dXBkYXRlRWxlbSgpIHtcblx0XHQvLyBUT0RPOiByb3plYnJhdCBhIHBvdXppdCBkZXBlbmRlY2UgYXR0cmlidXR1XG5cdFx0dGhpcy51cGRhdGVzZWxlY3RFbGVtKCk7XG5cdFx0dGhpcy51cGRhdGVMYWJlbEVsZW0oKTtcblx0XHR0aGlzLnVwZGF0ZUVycm9yRWxlbSgpO1xuXHR9XG5cblx0aW5pdHNlbGVjdEVsZW0oKSB7XG5cdFx0dGhpcy5zZWxlY3RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VsZWN0Jyk7XG5cblx0XHR0aGlzLnNlbGVjdEVsZW0uY2xhc3NMaXN0LmFkZCgna2luX3NlbGVjdCcpO1xuXG5cdFx0dGhpcy5lbFRwbC5hcHBlbmRDaGlsZCh0aGlzLnNlbGVjdEVsZW0pO1xuXHR9XG5cblx0YXBwZW5kT3B0aW9ucygpIHtcblx0XHR2YXIgb3B0aW9ucyA9IHRoaXMuaW5uZXJIVE1MO1xuXG5cdFx0dGhpcy5zZWxlY3RFbGVtLmlubmVySFRNTCA9IG9wdGlvbnM7XG5cblx0XHR0aGlzLmlubmVySFRNTCA9ICcnO1xuXHR9XG5cblx0aW5pdENoZXZyb24oKSB7XG5cdFx0dGhpcy5jaGV2cm9uRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2tpbi1pY29uJyk7XG5cblx0XHR0aGlzLmNoZXZyb25FbGVtLmNsYXNzTGlzdC5hZGQoJ2tpbl9zZWxlY3RfX2NoZXZyb24nKTtcblx0XHR0aGlzLmNoZXZyb25FbGVtLnNldEF0dHJpYnV0ZSgnbmFtZScsICduYXZpZ2F0ZScpO1xuXHRcdHRoaXMuY2hldnJvbkVsZW0uc2V0QXR0cmlidXRlKCdzaXplJywgJzE0Jyk7XG5cblx0XHR0aGlzLmVsVHBsLmFwcGVuZENoaWxkKHRoaXMuY2hldnJvbkVsZW0pO1xuXHR9XG5cblx0dXBkYXRlc2VsZWN0RWxlbSgpIHtcblx0XHR0aGlzLnNlbGVjdEVsZW0uc2V0QXR0cmlidXRlKCdpZCcsIHRoaXMuZ2V0QXR0cmlidXRlKCdpZCcpIHx8IHVpZCgpKTtcblxuXHRcdGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnc2l6ZScpKSB7XG5cdFx0XHR0aGlzLnNlbGVjdEVsZW0uY2xhc3NMaXN0LmFkZCgnLScgKyB0aGlzLmdldEF0dHJpYnV0ZSgnc2l6ZScpKTtcblx0XHR9XHRlbHNlIHtcblx0XHRcdHRoaXMuc2VsZWN0RWxlbS5jbGFzc0xpc3QucmVtb3ZlKCctJyArIHRoaXMuZ2V0QXR0cmlidXRlKCdzaXplJykpO1xuXHRcdH1cblxuXHRcdHRoaXMuc2VsZWN0RWxlbS52YWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCd2YWx1ZScpIHx8IHRoaXMuc2VsZWN0RWxlbS5xdWVyeVNlbGVjdG9yKCdvcHRpb24nKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG5cblx0XHRpZiAodGhpcy5nZXRBdHRyaWJ1dGUoJ2Vycm9yJykpIHtcblx0XHRcdHRoaXMuc2VsZWN0RWxlbS5jbGFzc0xpc3QuYWRkKCctZXJyb3InKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZWxlY3RFbGVtLmNsYXNzTGlzdC5yZW1vdmUoJy1lcnJvcicpO1xuXHRcdH1cblx0fVxuXG5cdGdldExhYmVsRWxlbSgpIHtcblx0XHRpZiAodGhpcy5sYWJlbEVsZW0pIHtcblx0XHRcdHJldHVybiB0aGlzLmxhYmVsRWxlbTtcblx0XHR9XG5cblx0XHR0aGlzLmxhYmVsRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG5cdFx0dGhpcy5sYWJlbEVsZW0uY2xhc3NMaXN0LmFkZCgna2luX3NlbGVjdF9fbGFiZWwnKTtcblxuXHRcdHRoaXMuc2VsZWN0RWxlbS5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGV2ZW50ID0+IHtcblx0XHRcdHRoaXMubGFiZWxFbGVtLmNsYXNzTGlzdC5hZGQoJy1mb2N1c2VkJyk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnNlbGVjdEVsZW0uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGV2ZW50ID0+IHtcblx0XHRcdHRoaXMubGFiZWxFbGVtLmNsYXNzTGlzdC5yZW1vdmUoJy1mb2N1c2VkJyk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gdGhpcy5sYWJlbEVsZW07XG5cdH1cblxuXHR1cGRhdGVMYWJlbEVsZW0oKSB7XG5cdFx0Y29uc3QgbGFiZWwgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbGFiZWwnKTtcblx0XHRjb25zdCBsYWJlbEVsZW0gPSB0aGlzLmdldExhYmVsRWxlbSgpO1xuXHRcdGNvbnN0IGVsZW1BZGRlZCA9IHRoaXMuZWxUcGwuY29udGFpbnMobGFiZWxFbGVtKTtcblxuXHRcdGlmIChsYWJlbCkge1xuXHRcdFx0dGhpcy5sYWJlbEVsZW0uc2V0QXR0cmlidXRlKCdmb3InLCB0aGlzLnNlbGVjdEVsZW0uZ2V0QXR0cmlidXRlKCdpZCcpKTtcblxuXHRcdFx0aWYgKHRoaXMuZ2V0QXR0cmlidXRlKCdlcnJvcicpKSB7XG5cdFx0XHRcdHRoaXMubGFiZWxFbGVtLmNsYXNzTGlzdC5hZGQoJy1lcnJvcicpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5sYWJlbEVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnLWVycm9yJyk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubGFiZWxFbGVtLmlubmVyVGV4dCA9IGxhYmVsO1xuXG5cdFx0XHRpZiAoIWVsZW1BZGRlZCkge1xuXHRcdFx0XHR0aGlzLnNlbGVjdEVsZW0uYmVmb3JlKGxhYmVsRWxlbSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChlbGVtQWRkZWQpIHtcblx0XHRcdHRoaXMuZWxUcGwucmVtb3ZlQ2hpbGQobGFiZWxFbGVtKTtcblx0XHR9XG5cdH1cblxuXHRnZXRFcnJvckVsZW0oKSB7XG5cdFx0aWYgKHRoaXMuZXJyb3JFbGVtKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lcnJvckVsZW07XG5cdFx0fVxuXG5cdFx0Y29uc3QgZXJyb3JFbGVtU3RyID0gJzxwIGNsYXNzPVwia2luX3NlbGVjdF9fZXJyb3JcIj48a2luLWljb24gbmFtZT1cImJhZGdlLWNyaXRpY2FsXCIgc2l6ZT1cIjE1XCI+PC9raW4taWNvbj4gJyArIHRoaXMuZ2V0QXR0cmlidXRlKCdlcnJvcicpICsgJzwvcD4nO1xuXG5cdFx0dGhpcy5lcnJvckVsZW0gPSB0aGlzLmdldERvbVBhcnNlcigpXG5cdFx0XHQucGFyc2VGcm9tU3RyaW5nKGVycm9yRWxlbVN0ciwgJ3RleHQvaHRtbCcpXG5cdFx0XHQucXVlcnlTZWxlY3RvcigncCcpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZXJyb3JFbGVtO1xuXHR9XG5cblx0dXBkYXRlRXJyb3JFbGVtKCkge1xuXHRcdGNvbnN0IGVycm9yID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2Vycm9yJyk7XG5cdFx0Y29uc3QgZXJyb3JFbGVtID0gdGhpcy5nZXRFcnJvckVsZW0oKTtcblx0XHRjb25zdCBlbGVtQWRkZWQgPSB0aGlzLmVsVHBsLmNvbnRhaW5zKGVycm9yRWxlbSk7XG5cblx0XHRpZiAoZXJyb3IpIHtcblx0XHRcdGVycm9yRWxlbS5pbm5lckhUTUwgPSAnPGtpbi1pY29uIG5hbWU9XCJiYWRnZS1jcml0aWNhbFwiIHNpemU9XCIxNVwiPjwva2luLWljb24+ICcgKyBlcnJvcjtcblxuXHRcdFx0aWYgKCFlbGVtQWRkZWQpIHtcblx0XHRcdFx0dGhpcy5lbFRwbC5hcHBlbmRDaGlsZChlcnJvckVsZW0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoZWxlbUFkZGVkKSB7XG5cdFx0XHR0aGlzLmVsVHBsLnJlbW92ZUNoaWxkKGVycm9yRWxlbSk7XG5cdFx0fVxuXHR9XG5cblx0aW5pdEhpbnQoKSB7XG5cdFx0Y29uc3QgaGludCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdoaW50Jyk7XG5cblx0XHRpZiAoaGludCkge1xuXHRcdFx0dGhpcy5oaW50RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2tpbi10b29sdGlwJyk7XG5cdFx0XHR0aGlzLmhpbnRFbGVtLmNsYXNzTGlzdC5hZGQoJ2tpbl9pbnB1dF9faGludCcpO1xuXHRcdFx0dGhpcy5oaW50RWxlbS5pbm5lckhUTUwgPSAnPGtpbi1pY29uIG5hbWU9XCJpY29uLW0tYWN0aW9uLWluZm9cIiBzaXplPVwiMjBcIiBzbG90PVwidG9vbHRpcC1hY3RpdmF0b3JcIj48L2tpbi1pY29uPjxkaXYgc2xvdD1cInRvb2x0aXBcIj4nICsgdGhpcy5nZXRBdHRyaWJ1dGUoJ2hpbnQnKSArICc8L2Rpdj4nXG5cdFx0XHR0aGlzLmVsVHBsLmFwcGVuZENoaWxkKHRoaXMuaGludEVsZW0pO1xuXHRcdH1cblx0fVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2tpbi1zZWxlY3QnLCBTZWxlY3QpO1xuIiwiLy8hIG1vbWVudC5qc1xuLy8hIHZlcnNpb24gOiAyLjI5LjFcbi8vISBhdXRob3JzIDogVGltIFdvb2QsIElza3JlbiBDaGVybmV2LCBNb21lbnQuanMgY29udHJpYnV0b3JzXG4vLyEgbGljZW5zZSA6IE1JVFxuLy8hIG1vbWVudGpzLmNvbVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG4gICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgICBnbG9iYWwubW9tZW50ID0gZmFjdG9yeSgpXG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBob29rQ2FsbGJhY2s7XG5cbiAgICBmdW5jdGlvbiBob29rcygpIHtcbiAgICAgICAgcmV0dXJuIGhvb2tDYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgZG9uZSB0byByZWdpc3RlciB0aGUgbWV0aG9kIGNhbGxlZCB3aXRoIG1vbWVudCgpXG4gICAgLy8gd2l0aG91dCBjcmVhdGluZyBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gICAgZnVuY3Rpb24gc2V0SG9va0NhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgICAgIGhvb2tDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQXJyYXkoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlucHV0IGluc3RhbmNlb2YgQXJyYXkgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEFycmF5XSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09iamVjdChpbnB1dCkge1xuICAgICAgICAvLyBJRTggd2lsbCB0cmVhdCB1bmRlZmluZWQgYW5kIG51bGwgYXMgb2JqZWN0IGlmIGl0IHdhc24ndCBmb3JcbiAgICAgICAgLy8gaW5wdXQgIT0gbnVsbFxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaW5wdXQgIT0gbnVsbCAmJlxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNPd25Qcm9wKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09iamVjdEVtcHR5KG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBrO1xuICAgICAgICAgICAgZm9yIChrIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKG9iaiwgaykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVbmRlZmluZWQoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09PSB2b2lkIDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNOdW1iZXIoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IE51bWJlcl0nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXRlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IERhdGVdJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hcChhcnIsIGZuKSB7XG4gICAgICAgIHZhciByZXMgPSBbXSxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKGZuKGFycltpXSwgaSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXh0ZW5kKGEsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBiKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChiLCBpKSkge1xuICAgICAgICAgICAgICAgIGFbaV0gPSBiW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093blByb3AoYiwgJ3RvU3RyaW5nJykpIHtcbiAgICAgICAgICAgIGEudG9TdHJpbmcgPSBiLnRvU3RyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093blByb3AoYiwgJ3ZhbHVlT2YnKSkge1xuICAgICAgICAgICAgYS52YWx1ZU9mID0gYi52YWx1ZU9mO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCB0cnVlKS51dGMoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZhdWx0UGFyc2luZ0ZsYWdzKCkge1xuICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZXAgY2xvbmUgdGhpcyBvYmplY3QuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbXB0eTogZmFsc2UsXG4gICAgICAgICAgICB1bnVzZWRUb2tlbnM6IFtdLFxuICAgICAgICAgICAgdW51c2VkSW5wdXQ6IFtdLFxuICAgICAgICAgICAgb3ZlcmZsb3c6IC0yLFxuICAgICAgICAgICAgY2hhcnNMZWZ0T3ZlcjogMCxcbiAgICAgICAgICAgIG51bGxJbnB1dDogZmFsc2UsXG4gICAgICAgICAgICBpbnZhbGlkRXJhOiBudWxsLFxuICAgICAgICAgICAgaW52YWxpZE1vbnRoOiBudWxsLFxuICAgICAgICAgICAgaW52YWxpZEZvcm1hdDogZmFsc2UsXG4gICAgICAgICAgICB1c2VySW52YWxpZGF0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgaXNvOiBmYWxzZSxcbiAgICAgICAgICAgIHBhcnNlZERhdGVQYXJ0czogW10sXG4gICAgICAgICAgICBlcmE6IG51bGwsXG4gICAgICAgICAgICBtZXJpZGllbTogbnVsbCxcbiAgICAgICAgICAgIHJmYzI4MjI6IGZhbHNlLFxuICAgICAgICAgICAgd2Vla2RheU1pc21hdGNoOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRQYXJzaW5nRmxhZ3MobSkge1xuICAgICAgICBpZiAobS5fcGYgPT0gbnVsbCkge1xuICAgICAgICAgICAgbS5fcGYgPSBkZWZhdWx0UGFyc2luZ0ZsYWdzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG0uX3BmO1xuICAgIH1cblxuICAgIHZhciBzb21lO1xuICAgIGlmIChBcnJheS5wcm90b3R5cGUuc29tZSkge1xuICAgICAgICBzb21lID0gQXJyYXkucHJvdG90eXBlLnNvbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc29tZSA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICAgICAgICAgIHZhciB0ID0gT2JqZWN0KHRoaXMpLFxuICAgICAgICAgICAgICAgIGxlbiA9IHQubGVuZ3RoID4+PiAwLFxuICAgICAgICAgICAgICAgIGk7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHQgJiYgZnVuLmNhbGwodGhpcywgdFtpXSwgaSwgdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZChtKSB7XG4gICAgICAgIGlmIChtLl9pc1ZhbGlkID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBmbGFncyA9IGdldFBhcnNpbmdGbGFncyhtKSxcbiAgICAgICAgICAgICAgICBwYXJzZWRQYXJ0cyA9IHNvbWUuY2FsbChmbGFncy5wYXJzZWREYXRlUGFydHMsIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpICE9IG51bGw7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgaXNOb3dWYWxpZCA9XG4gICAgICAgICAgICAgICAgICAgICFpc05hTihtLl9kLmdldFRpbWUoKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3Mub3ZlcmZsb3cgPCAwICYmXG4gICAgICAgICAgICAgICAgICAgICFmbGFncy5lbXB0eSAmJlxuICAgICAgICAgICAgICAgICAgICAhZmxhZ3MuaW52YWxpZEVyYSAmJlxuICAgICAgICAgICAgICAgICAgICAhZmxhZ3MuaW52YWxpZE1vbnRoICYmXG4gICAgICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkV2Vla2RheSAmJlxuICAgICAgICAgICAgICAgICAgICAhZmxhZ3Mud2Vla2RheU1pc21hdGNoICYmXG4gICAgICAgICAgICAgICAgICAgICFmbGFncy5udWxsSW5wdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRGb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAgICAgIWZsYWdzLnVzZXJJbnZhbGlkYXRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAoIWZsYWdzLm1lcmlkaWVtIHx8IChmbGFncy5tZXJpZGllbSAmJiBwYXJzZWRQYXJ0cykpO1xuXG4gICAgICAgICAgICBpZiAobS5fc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgaXNOb3dWYWxpZCA9XG4gICAgICAgICAgICAgICAgICAgIGlzTm93VmFsaWQgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY2hhcnNMZWZ0T3ZlciA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy51bnVzZWRUb2tlbnMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmJpZ0hvdXIgPT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbiA9PSBudWxsIHx8ICFPYmplY3QuaXNGcm96ZW4obSkpIHtcbiAgICAgICAgICAgICAgICBtLl9pc1ZhbGlkID0gaXNOb3dWYWxpZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTm93VmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG0uX2lzVmFsaWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSW52YWxpZChmbGFncykge1xuICAgICAgICB2YXIgbSA9IGNyZWF0ZVVUQyhOYU4pO1xuICAgICAgICBpZiAoZmxhZ3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgZXh0ZW5kKGdldFBhcnNpbmdGbGFncyhtKSwgZmxhZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLnVzZXJJbnZhbGlkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICAvLyBQbHVnaW5zIHRoYXQgYWRkIHByb3BlcnRpZXMgc2hvdWxkIGFsc28gYWRkIHRoZSBrZXkgaGVyZSAobnVsbCB2YWx1ZSksXG4gICAgLy8gc28gd2UgY2FuIHByb3Blcmx5IGNsb25lIG91cnNlbHZlcy5cbiAgICB2YXIgbW9tZW50UHJvcGVydGllcyA9IChob29rcy5tb21lbnRQcm9wZXJ0aWVzID0gW10pLFxuICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBjb3B5Q29uZmlnKHRvLCBmcm9tKSB7XG4gICAgICAgIHZhciBpLCBwcm9wLCB2YWw7XG5cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pc0FNb21lbnRPYmplY3QpKSB7XG4gICAgICAgICAgICB0by5faXNBTW9tZW50T2JqZWN0ID0gZnJvbS5faXNBTW9tZW50T2JqZWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5faSkpIHtcbiAgICAgICAgICAgIHRvLl9pID0gZnJvbS5faTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2YpKSB7XG4gICAgICAgICAgICB0by5fZiA9IGZyb20uX2Y7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sKSkge1xuICAgICAgICAgICAgdG8uX2wgPSBmcm9tLl9sO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fc3RyaWN0KSkge1xuICAgICAgICAgICAgdG8uX3N0cmljdCA9IGZyb20uX3N0cmljdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3R6bSkpIHtcbiAgICAgICAgICAgIHRvLl90em0gPSBmcm9tLl90em07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pc1VUQykpIHtcbiAgICAgICAgICAgIHRvLl9pc1VUQyA9IGZyb20uX2lzVVRDO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fb2Zmc2V0KSkge1xuICAgICAgICAgICAgdG8uX29mZnNldCA9IGZyb20uX29mZnNldDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3BmKSkge1xuICAgICAgICAgICAgdG8uX3BmID0gZ2V0UGFyc2luZ0ZsYWdzKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fbG9jYWxlKSkge1xuICAgICAgICAgICAgdG8uX2xvY2FsZSA9IGZyb20uX2xvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb21lbnRQcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtb21lbnRQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcHJvcCA9IG1vbWVudFByb3BlcnRpZXNbaV07XG4gICAgICAgICAgICAgICAgdmFsID0gZnJvbVtwcm9wXTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKHZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9bcHJvcF0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRvO1xuICAgIH1cblxuICAgIC8vIE1vbWVudCBwcm90b3R5cGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gTW9tZW50KGNvbmZpZykge1xuICAgICAgICBjb3B5Q29uZmlnKHRoaXMsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShjb25maWcuX2QgIT0gbnVsbCA/IGNvbmZpZy5fZC5nZXRUaW1lKCkgOiBOYU4pO1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcmV2ZW50IGluZmluaXRlIGxvb3AgaW4gY2FzZSB1cGRhdGVPZmZzZXQgY3JlYXRlcyBuZXcgbW9tZW50XG4gICAgICAgIC8vIG9iamVjdHMuXG4gICAgICAgIGlmICh1cGRhdGVJblByb2dyZXNzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc01vbWVudChvYmopIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG9iaiBpbnN0YW5jZW9mIE1vbWVudCB8fCAob2JqICE9IG51bGwgJiYgb2JqLl9pc0FNb21lbnRPYmplY3QgIT0gbnVsbClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3YXJuKG1zZykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPT09IGZhbHNlICYmXG4gICAgICAgICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIGNvbnNvbGUud2FyblxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRGVwcmVjYXRpb24gd2FybmluZzogJyArIG1zZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGUobXNnLCBmbikge1xuICAgICAgICB2YXIgZmlyc3RUaW1lID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlcihudWxsLCBtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpcnN0VGltZSkge1xuICAgICAgICAgICAgICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgICAgICAgICAgICAgIGFyZyxcbiAgICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgICAga2V5O1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2ldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnICs9ICdcXG5bJyArIGkgKyAnXSAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gYXJndW1lbnRzWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc093blByb3AoYXJndW1lbnRzWzBdLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZyArPSBrZXkgKyAnOiAnICsgYXJndW1lbnRzWzBdW2tleV0gKyAnLCAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5zbGljZSgwLCAtMik7IC8vIFJlbW92ZSB0cmFpbGluZyBjb21tYSBhbmQgc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2goYXJnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgICAgICAgbXNnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdcXG5Bcmd1bWVudHM6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncykuam9pbignJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVycm9yKCkuc3RhY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0sIGZuKTtcbiAgICB9XG5cbiAgICB2YXIgZGVwcmVjYXRpb25zID0ge307XG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGVTaW1wbGUobmFtZSwgbXNnKSB7XG4gICAgICAgIGlmIChob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG5hbWUsIG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZXByZWNhdGlvbnNbbmFtZV0pIHtcbiAgICAgICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPSBmYWxzZTtcbiAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgPSBudWxsO1xuXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHR5cGVvZiBGdW5jdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgaW5wdXQgaW5zdGFuY2VvZiBGdW5jdGlvbikgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXQoY29uZmlnKSB7XG4gICAgICAgIHZhciBwcm9wLCBpO1xuICAgICAgICBmb3IgKGkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChjb25maWcsIGkpKSB7XG4gICAgICAgICAgICAgICAgcHJvcCA9IGNvbmZpZ1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW2ldID0gcHJvcDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzWydfJyArIGldID0gcHJvcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICAvLyBMZW5pZW50IG9yZGluYWwgcGFyc2luZyBhY2NlcHRzIGp1c3QgYSBudW1iZXIgaW4gYWRkaXRpb24gdG9cbiAgICAgICAgLy8gbnVtYmVyICsgKHBvc3NpYmx5KSBzdHVmZiBjb21pbmcgZnJvbSBfZGF5T2ZNb250aE9yZGluYWxQYXJzZS5cbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIFwib3JkaW5hbFBhcnNlXCIgZmFsbGJhY2sgaW4gbmV4dCBtYWpvciByZWxlYXNlLlxuICAgICAgICB0aGlzLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAodGhpcy5fZGF5T2ZNb250aE9yZGluYWxQYXJzZS5zb3VyY2UgfHwgdGhpcy5fb3JkaW5hbFBhcnNlLnNvdXJjZSkgK1xuICAgICAgICAgICAgICAgICd8JyArXG4gICAgICAgICAgICAgICAgL1xcZHsxLDJ9Ly5zb3VyY2VcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZUNvbmZpZ3MocGFyZW50Q29uZmlnLCBjaGlsZENvbmZpZykge1xuICAgICAgICB2YXIgcmVzID0gZXh0ZW5kKHt9LCBwYXJlbnRDb25maWcpLFxuICAgICAgICAgICAgcHJvcDtcbiAgICAgICAgZm9yIChwcm9wIGluIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChjaGlsZENvbmZpZywgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QocGFyZW50Q29uZmlnW3Byb3BdKSAmJiBpc09iamVjdChjaGlsZENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW3Byb3BdID0ge307XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZChyZXNbcHJvcF0sIHBhcmVudENvbmZpZ1twcm9wXSk7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZChyZXNbcHJvcF0sIGNoaWxkQ29uZmlnW3Byb3BdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkQ29uZmlnW3Byb3BdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW3Byb3BdID0gY2hpbGRDb25maWdbcHJvcF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc1twcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChwcm9wIGluIHBhcmVudENvbmZpZykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGhhc093blByb3AocGFyZW50Q29uZmlnLCBwcm9wKSAmJlxuICAgICAgICAgICAgICAgICFoYXNPd25Qcm9wKGNoaWxkQ29uZmlnLCBwcm9wKSAmJlxuICAgICAgICAgICAgICAgIGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBjaGFuZ2VzIHRvIHByb3BlcnRpZXMgZG9uJ3QgbW9kaWZ5IHBhcmVudCBjb25maWdcbiAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSBleHRlbmQoe30sIHJlc1twcm9wXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBMb2NhbGUoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZXQoY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlzO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKSB7XG4gICAgICAgIGtleXMgPSBPYmplY3Qua2V5cztcbiAgICB9IGVsc2Uge1xuICAgICAgICBrZXlzID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgdmFyIGksXG4gICAgICAgICAgICAgICAgcmVzID0gW107XG4gICAgICAgICAgICBmb3IgKGkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc093blByb3Aob2JqLCBpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXMucHVzaChpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0Q2FsZW5kYXIgPSB7XG4gICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGNhbGVuZGFyKGtleSwgbW9tLCBub3cpIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX2NhbGVuZGFyW2tleV0gfHwgdGhpcy5fY2FsZW5kYXJbJ3NhbWVFbHNlJ107XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKG91dHB1dCkgPyBvdXRwdXQuY2FsbChtb20sIG5vdykgOiBvdXRwdXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gemVyb0ZpbGwobnVtYmVyLCB0YXJnZXRMZW5ndGgsIGZvcmNlU2lnbikge1xuICAgICAgICB2YXIgYWJzTnVtYmVyID0gJycgKyBNYXRoLmFicyhudW1iZXIpLFxuICAgICAgICAgICAgemVyb3NUb0ZpbGwgPSB0YXJnZXRMZW5ndGggLSBhYnNOdW1iZXIubGVuZ3RoLFxuICAgICAgICAgICAgc2lnbiA9IG51bWJlciA+PSAwO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHNpZ24gPyAoZm9yY2VTaWduID8gJysnIDogJycpIDogJy0nKSArXG4gICAgICAgICAgICBNYXRoLnBvdygxMCwgTWF0aC5tYXgoMCwgemVyb3NUb0ZpbGwpKS50b1N0cmluZygpLnN1YnN0cigxKSArXG4gICAgICAgICAgICBhYnNOdW1iZXJcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgZm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhbSGhdbW0oc3MpP3xNb3xNTT9NP00/fERvfERERG98REQ/RD9EP3xkZGQ/ZD98ZG8/fHdbb3x3XT98V1tvfFddP3xRbz98TnsxLDV9fFlZWVlZWXxZWVlZWXxZWVlZfFlZfHl7Miw0fXx5bz98Z2coZ2dnPyk/fEdHKEdHRz8pP3xlfEV8YXxBfGhoP3xISD98a2s/fG1tP3xzcz98U3sxLDl9fHh8WHx6ej98Wlo/fC4pL2csXG4gICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhMVFN8TFR8TEw/TD9MP3xsezEsNH0pL2csXG4gICAgICAgIGZvcm1hdEZ1bmN0aW9ucyA9IHt9LFxuICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9ucyA9IHt9O1xuXG4gICAgLy8gdG9rZW46ICAgICdNJ1xuICAgIC8vIHBhZGRlZDogICBbJ01NJywgMl1cbiAgICAvLyBvcmRpbmFsOiAgJ01vJ1xuICAgIC8vIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7IHRoaXMubW9udGgoKSArIDEgfVxuICAgIGZ1bmN0aW9uIGFkZEZvcm1hdFRva2VuKHRva2VuLCBwYWRkZWQsIG9yZGluYWwsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBmdW5jID0gY2FsbGJhY2s7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmdW5jID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW2NhbGxiYWNrXSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW3Rva2VuXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZGRlZCkge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbcGFkZGVkWzBdXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gemVyb0ZpbGwoZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBwYWRkZWRbMV0sIHBhZGRlZFsyXSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcmRpbmFsKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1tvcmRpbmFsXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkub3JkaW5hbChcbiAgICAgICAgICAgICAgICAgICAgZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgICAgICAgICAgICB0b2tlblxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhpbnB1dCkge1xuICAgICAgICBpZiAoaW5wdXQubWF0Y2goL1xcW1tcXHNcXFNdLykpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9eXFxbfFxcXSQvZywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9cXFxcL2csICcnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlRm9ybWF0RnVuY3Rpb24oZm9ybWF0KSB7XG4gICAgICAgIHZhciBhcnJheSA9IGZvcm1hdC5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBsZW5ndGg7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXRUb2tlbkZ1bmN0aW9uc1thcnJheVtpXV0pIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSByZW1vdmVGb3JtYXR0aW5nVG9rZW5zKGFycmF5W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAobW9tKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gJycsXG4gICAgICAgICAgICAgICAgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG91dHB1dCArPSBpc0Z1bmN0aW9uKGFycmF5W2ldKVxuICAgICAgICAgICAgICAgICAgICA/IGFycmF5W2ldLmNhbGwobW9tLCBmb3JtYXQpXG4gICAgICAgICAgICAgICAgICAgIDogYXJyYXlbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIGZvcm1hdCBkYXRlIHVzaW5nIG5hdGl2ZSBkYXRlIG9iamVjdFxuICAgIGZ1bmN0aW9uIGZvcm1hdE1vbWVudChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG0ubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXQgPSBleHBhbmRGb3JtYXQoZm9ybWF0LCBtLmxvY2FsZURhdGEoKSk7XG4gICAgICAgIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdID1cbiAgICAgICAgICAgIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdIHx8IG1ha2VGb3JtYXRGdW5jdGlvbihmb3JtYXQpO1xuXG4gICAgICAgIHJldHVybiBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XShtKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHBhbmRGb3JtYXQoZm9ybWF0LCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGkgPSA1O1xuXG4gICAgICAgIGZ1bmN0aW9uIHJlcGxhY2VMb25nRGF0ZUZvcm1hdFRva2VucyhpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS5sb25nRGF0ZUZvcm1hdChpbnB1dCkgfHwgaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMubGFzdEluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPj0gMCAmJiBsb2NhbEZvcm1hdHRpbmdUb2tlbnMudGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQucmVwbGFjZShcbiAgICAgICAgICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMsXG4gICAgICAgICAgICAgICAgcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICBpIC09IDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQgPSB7XG4gICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgTDogJ01NL0REL1lZWVknLFxuICAgICAgICBMTDogJ01NTU0gRCwgWVlZWScsXG4gICAgICAgIExMTDogJ01NTU0gRCwgWVlZWSBoOm1tIEEnLFxuICAgICAgICBMTExMOiAnZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQScsXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxvbmdEYXRlRm9ybWF0KGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XSxcbiAgICAgICAgICAgIGZvcm1hdFVwcGVyID0gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5LnRvVXBwZXJDYXNlKCldO1xuXG4gICAgICAgIGlmIChmb3JtYXQgfHwgIWZvcm1hdFVwcGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XSA9IGZvcm1hdFVwcGVyXG4gICAgICAgICAgICAubWF0Y2goZm9ybWF0dGluZ1Rva2VucylcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHRvaykge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdG9rID09PSAnTU1NTScgfHxcbiAgICAgICAgICAgICAgICAgICAgdG9rID09PSAnTU0nIHx8XG4gICAgICAgICAgICAgICAgICAgIHRvayA9PT0gJ0REJyB8fFxuICAgICAgICAgICAgICAgICAgICB0b2sgPT09ICdkZGRkJ1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKCcnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdEludmFsaWREYXRlID0gJ0ludmFsaWQgZGF0ZSc7XG5cbiAgICBmdW5jdGlvbiBpbnZhbGlkRGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludmFsaWREYXRlO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0T3JkaW5hbCA9ICclZCcsXG4gICAgICAgIGRlZmF1bHREYXlPZk1vbnRoT3JkaW5hbFBhcnNlID0gL1xcZHsxLDJ9LztcblxuICAgIGZ1bmN0aW9uIG9yZGluYWwobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRpbmFsLnJlcGxhY2UoJyVkJywgbnVtYmVyKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFJlbGF0aXZlVGltZSA9IHtcbiAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgczogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICBkOiAnYSBkYXknLFxuICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICB3OiAnYSB3ZWVrJyxcbiAgICAgICAgd3c6ICclZCB3ZWVrcycsXG4gICAgICAgIE06ICdhIG1vbnRoJyxcbiAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgeXk6ICclZCB5ZWFycycsXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX3JlbGF0aXZlVGltZVtzdHJpbmddO1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihvdXRwdXQpXG4gICAgICAgICAgICA/IG91dHB1dChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpXG4gICAgICAgICAgICA6IG91dHB1dC5yZXBsYWNlKC8lZC9pLCBudW1iZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhc3RGdXR1cmUoZGlmZiwgb3V0cHV0KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB0aGlzLl9yZWxhdGl2ZVRpbWVbZGlmZiA+IDAgPyAnZnV0dXJlJyA6ICdwYXN0J107XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKGZvcm1hdCkgPyBmb3JtYXQob3V0cHV0KSA6IGZvcm1hdC5yZXBsYWNlKC8lcy9pLCBvdXRwdXQpO1xuICAgIH1cblxuICAgIHZhciBhbGlhc2VzID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRVbml0QWxpYXModW5pdCwgc2hvcnRoYW5kKSB7XG4gICAgICAgIHZhciBsb3dlckNhc2UgPSB1bml0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGFsaWFzZXNbbG93ZXJDYXNlXSA9IGFsaWFzZXNbbG93ZXJDYXNlICsgJ3MnXSA9IGFsaWFzZXNbc2hvcnRoYW5kXSA9IHVuaXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplVW5pdHModW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB1bml0cyA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gYWxpYXNlc1t1bml0c10gfHwgYWxpYXNlc1t1bml0cy50b0xvd2VyQ2FzZSgpXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplT2JqZWN0VW5pdHMoaW5wdXRPYmplY3QpIHtcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dCA9IHt9LFxuICAgICAgICAgICAgbm9ybWFsaXplZFByb3AsXG4gICAgICAgICAgICBwcm9wO1xuXG4gICAgICAgIGZvciAocHJvcCBpbiBpbnB1dE9iamVjdCkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoaW5wdXRPYmplY3QsIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZFByb3AgPSBub3JtYWxpemVVbml0cyhwcm9wKTtcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZElucHV0W25vcm1hbGl6ZWRQcm9wXSA9IGlucHV0T2JqZWN0W3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub3JtYWxpemVkSW5wdXQ7XG4gICAgfVxuXG4gICAgdmFyIHByaW9yaXRpZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFVuaXRQcmlvcml0eSh1bml0LCBwcmlvcml0eSkge1xuICAgICAgICBwcmlvcml0aWVzW3VuaXRdID0gcHJpb3JpdHk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UHJpb3JpdGl6ZWRVbml0cyh1bml0c09iaikge1xuICAgICAgICB2YXIgdW5pdHMgPSBbXSxcbiAgICAgICAgICAgIHU7XG4gICAgICAgIGZvciAodSBpbiB1bml0c09iaikge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AodW5pdHNPYmosIHUpKSB7XG4gICAgICAgICAgICAgICAgdW5pdHMucHVzaCh7IHVuaXQ6IHUsIHByaW9yaXR5OiBwcmlvcml0aWVzW3VdIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHVuaXRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBhLnByaW9yaXR5IC0gYi5wcmlvcml0eTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB1bml0cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgICAgICAgcmV0dXJuICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB8fCB5ZWFyICUgNDAwID09PSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0Zsb29yKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgLy8gLTAgLT4gMFxuICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChudW1iZXIpIHx8IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JbnQoYXJndW1lbnRGb3JDb2VyY2lvbikge1xuICAgICAgICB2YXIgY29lcmNlZE51bWJlciA9ICthcmd1bWVudEZvckNvZXJjaW9uLFxuICAgICAgICAgICAgdmFsdWUgPSAwO1xuXG4gICAgICAgIGlmIChjb2VyY2VkTnVtYmVyICE9PSAwICYmIGlzRmluaXRlKGNvZXJjZWROdW1iZXIpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGFic0Zsb29yKGNvZXJjZWROdW1iZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXRTZXQodW5pdCwga2VlcFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzZXQkMSh0aGlzLCB1bml0LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIGtlZXBUaW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXQobW9tLCB1bml0KSB7XG4gICAgICAgIHJldHVybiBtb20uaXNWYWxpZCgpXG4gICAgICAgICAgICA/IG1vbS5fZFsnZ2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyB1bml0XSgpXG4gICAgICAgICAgICA6IE5hTjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXQkMShtb20sIHVuaXQsIHZhbHVlKSB7XG4gICAgICAgIGlmIChtb20uaXNWYWxpZCgpICYmICFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB1bml0ID09PSAnRnVsbFllYXInICYmXG4gICAgICAgICAgICAgICAgaXNMZWFwWWVhcihtb20ueWVhcigpKSAmJlxuICAgICAgICAgICAgICAgIG1vbS5tb250aCgpID09PSAxICYmXG4gICAgICAgICAgICAgICAgbW9tLmRhdGUoKSA9PT0gMjlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdG9JbnQodmFsdWUpO1xuICAgICAgICAgICAgICAgIG1vbS5fZFsnc2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyB1bml0XShcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG1vbS5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICBkYXlzSW5Nb250aCh2YWx1ZSwgbW9tLm1vbnRoKCkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIHN0cmluZ0dldCh1bml0cykge1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpc1t1bml0c10pKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1t1bml0c10oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdHJpbmdTZXQodW5pdHMsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdW5pdHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIHZhciBwcmlvcml0aXplZCA9IGdldFByaW9yaXRpemVkVW5pdHModW5pdHMpLFxuICAgICAgICAgICAgICAgIGk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJpb3JpdGl6ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzW3ByaW9yaXRpemVkW2ldLnVuaXRdKHVuaXRzW3ByaW9yaXRpemVkW2ldLnVuaXRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpc1t1bml0c10pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2gxID0gL1xcZC8sIC8vICAgICAgIDAgLSA5XG4gICAgICAgIG1hdGNoMiA9IC9cXGRcXGQvLCAvLyAgICAgIDAwIC0gOTlcbiAgICAgICAgbWF0Y2gzID0gL1xcZHszfS8sIC8vICAgICAwMDAgLSA5OTlcbiAgICAgICAgbWF0Y2g0ID0gL1xcZHs0fS8sIC8vICAgIDAwMDAgLSA5OTk5XG4gICAgICAgIG1hdGNoNiA9IC9bKy1dP1xcZHs2fS8sIC8vIC05OTk5OTkgLSA5OTk5OTlcbiAgICAgICAgbWF0Y2gxdG8yID0gL1xcZFxcZD8vLCAvLyAgICAgICAwIC0gOTlcbiAgICAgICAgbWF0Y2gzdG80ID0gL1xcZFxcZFxcZFxcZD8vLCAvLyAgICAgOTk5IC0gOTk5OVxuICAgICAgICBtYXRjaDV0bzYgPSAvXFxkXFxkXFxkXFxkXFxkXFxkPy8sIC8vICAgOTk5OTkgLSA5OTk5OTlcbiAgICAgICAgbWF0Y2gxdG8zID0gL1xcZHsxLDN9LywgLy8gICAgICAgMCAtIDk5OVxuICAgICAgICBtYXRjaDF0bzQgPSAvXFxkezEsNH0vLCAvLyAgICAgICAwIC0gOTk5OVxuICAgICAgICBtYXRjaDF0bzYgPSAvWystXT9cXGR7MSw2fS8sIC8vIC05OTk5OTkgLSA5OTk5OTlcbiAgICAgICAgbWF0Y2hVbnNpZ25lZCA9IC9cXGQrLywgLy8gICAgICAgMCAtIGluZlxuICAgICAgICBtYXRjaFNpZ25lZCA9IC9bKy1dP1xcZCsvLCAvLyAgICAtaW5mIC0gaW5mXG4gICAgICAgIG1hdGNoT2Zmc2V0ID0gL1p8WystXVxcZFxcZDo/XFxkXFxkL2dpLCAvLyArMDA6MDAgLTAwOjAwICswMDAwIC0wMDAwIG9yIFpcbiAgICAgICAgbWF0Y2hTaG9ydE9mZnNldCA9IC9afFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/L2dpLCAvLyArMDAgLTAwICswMDowMCAtMDA6MDAgKzAwMDAgLTAwMDAgb3IgWlxuICAgICAgICBtYXRjaFRpbWVzdGFtcCA9IC9bKy1dP1xcZCsoXFwuXFxkezEsM30pPy8sIC8vIDEyMzQ1Njc4OSAxMjM0NTY3ODkuMTIzXG4gICAgICAgIC8vIGFueSB3b3JkIChvciB0d28pIGNoYXJhY3RlcnMgb3IgbnVtYmVycyBpbmNsdWRpbmcgdHdvL3RocmVlIHdvcmQgbW9udGggaW4gYXJhYmljLlxuICAgICAgICAvLyBpbmNsdWRlcyBzY290dGlzaCBnYWVsaWMgdHdvIHdvcmQgYW5kIGh5cGhlbmF0ZWQgbW9udGhzXG4gICAgICAgIG1hdGNoV29yZCA9IC9bMC05XXswLDI1Nn1bJ2EtelxcdTAwQTAtXFx1MDVGRlxcdTA3MDAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkYwN1xcdUZGMTAtXFx1RkZFRl17MSwyNTZ9fFtcXHUwNjAwLVxcdTA2RkZcXC9dezEsMjU2fShcXHMqP1tcXHUwNjAwLVxcdTA2RkZdezEsMjU2fSl7MSwyfS9pLFxuICAgICAgICByZWdleGVzO1xuXG4gICAgcmVnZXhlcyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gYWRkUmVnZXhUb2tlbih0b2tlbiwgcmVnZXgsIHN0cmljdFJlZ2V4KSB7XG4gICAgICAgIHJlZ2V4ZXNbdG9rZW5dID0gaXNGdW5jdGlvbihyZWdleClcbiAgICAgICAgICAgID8gcmVnZXhcbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGVEYXRhKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gaXNTdHJpY3QgJiYgc3RyaWN0UmVnZXggPyBzdHJpY3RSZWdleCA6IHJlZ2V4O1xuICAgICAgICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcChyZWdleGVzLCB0b2tlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHVuZXNjYXBlRm9ybWF0KHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVnZXhlc1t0b2tlbl0oY29uZmlnLl9zdHJpY3QsIGNvbmZpZy5fbG9jYWxlKTtcbiAgICB9XG5cbiAgICAvLyBDb2RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTYxNDkzL2lzLXRoZXJlLWEtcmVnZXhwLWVzY2FwZS1mdW5jdGlvbi1pbi1qYXZhc2NyaXB0XG4gICAgZnVuY3Rpb24gdW5lc2NhcGVGb3JtYXQocykge1xuICAgICAgICByZXR1cm4gcmVnZXhFc2NhcGUoXG4gICAgICAgICAgICBzXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJ1xcXFwnLCAnJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXChcXFspfFxcXFwoXFxdKXxcXFsoW15cXF1cXFtdKilcXF18XFxcXCguKS9nLCBmdW5jdGlvbiAoXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWQsXG4gICAgICAgICAgICAgICAgICAgIHAxLFxuICAgICAgICAgICAgICAgICAgICBwMixcbiAgICAgICAgICAgICAgICAgICAgcDMsXG4gICAgICAgICAgICAgICAgICAgIHA0XG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwMSB8fCBwMiB8fCBwMyB8fCBwNDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlZ2V4RXNjYXBlKHMpIHtcbiAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy1cXC9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyk7XG4gICAgfVxuXG4gICAgdmFyIHRva2VucyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gYWRkUGFyc2VUb2tlbih0b2tlbiwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBmdW5jID0gY2FsbGJhY2s7XG4gICAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0b2tlbiA9IFt0b2tlbl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTnVtYmVyKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgZnVuYyA9IGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBhcnJheVtjYWxsYmFja10gPSB0b0ludChpbnB1dCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdG9rZW5zW3Rva2VuW2ldXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRXZWVrUGFyc2VUb2tlbih0b2tlbiwgY2FsbGJhY2spIHtcbiAgICAgICAgYWRkUGFyc2VUb2tlbih0b2tlbiwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICAgICAgY29uZmlnLl93ID0gY29uZmlnLl93IHx8IHt9O1xuICAgICAgICAgICAgY2FsbGJhY2soaW5wdXQsIGNvbmZpZy5fdywgY29uZmlnLCB0b2tlbik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBpbnB1dCwgY29uZmlnKSB7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGhhc093blByb3AodG9rZW5zLCB0b2tlbikpIHtcbiAgICAgICAgICAgIHRva2Vuc1t0b2tlbl0oaW5wdXQsIGNvbmZpZy5fYSwgY29uZmlnLCB0b2tlbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgWUVBUiA9IDAsXG4gICAgICAgIE1PTlRIID0gMSxcbiAgICAgICAgREFURSA9IDIsXG4gICAgICAgIEhPVVIgPSAzLFxuICAgICAgICBNSU5VVEUgPSA0LFxuICAgICAgICBTRUNPTkQgPSA1LFxuICAgICAgICBNSUxMSVNFQ09ORCA9IDYsXG4gICAgICAgIFdFRUsgPSA3LFxuICAgICAgICBXRUVLREFZID0gODtcblxuICAgIGZ1bmN0aW9uIG1vZChuLCB4KSB7XG4gICAgICAgIHJldHVybiAoKG4gJSB4KSArIHgpICUgeDtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXhPZjtcblxuICAgIGlmIChBcnJheS5wcm90b3R5cGUuaW5kZXhPZikge1xuICAgICAgICBpbmRleE9mID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2Y7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZXhPZiA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICAvLyBJIGtub3dcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpc1tpXSA9PT0gbykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgICAgICAgaWYgKGlzTmFOKHllYXIpIHx8IGlzTmFOKG1vbnRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbW9kTW9udGggPSBtb2QobW9udGgsIDEyKTtcbiAgICAgICAgeWVhciArPSAobW9udGggLSBtb2RNb250aCkgLyAxMjtcbiAgICAgICAgcmV0dXJuIG1vZE1vbnRoID09PSAxXG4gICAgICAgICAgICA/IGlzTGVhcFllYXIoeWVhcilcbiAgICAgICAgICAgICAgICA/IDI5XG4gICAgICAgICAgICAgICAgOiAyOFxuICAgICAgICAgICAgOiAzMSAtICgobW9kTW9udGggJSA3KSAlIDIpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNJywgWydNTScsIDJdLCAnTW8nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vbnRoKCkgKyAxO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ01NTScsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRoc1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignTU1NTScsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRocyh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdtb250aCcsICdNJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdtb250aCcsIDgpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignTScsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignTU0nLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5tb250aHNTaG9ydFJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcbiAgICBhZGRSZWdleFRva2VuKCdNTU1NJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5tb250aHNSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnTScsICdNTSddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W01PTlRIXSA9IHRvSW50KGlucHV0KSAtIDE7XG4gICAgfSk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnTU1NJywgJ01NTU0nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB2YXIgbW9udGggPSBjb25maWcuX2xvY2FsZS5tb250aHNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgLy8gaWYgd2UgZGlkbid0IGZpbmQgYSBtb250aCBuYW1lLCBtYXJrIHRoZSBkYXRlIGFzIGludmFsaWQuXG4gICAgICAgIGlmIChtb250aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBhcnJheVtNT05USF0gPSBtb250aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRNb250aCA9IGlucHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMT0NBTEVTXG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZU1vbnRocyA9ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQgPSAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIE1PTlRIU19JTl9GT1JNQVQgPSAvRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NPy8sXG4gICAgICAgIGRlZmF1bHRNb250aHNTaG9ydFJlZ2V4ID0gbWF0Y2hXb3JkLFxuICAgICAgICBkZWZhdWx0TW9udGhzUmVnZXggPSBtYXRjaFdvcmQ7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHMobSwgZm9ybWF0KSB7XG4gICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzKVxuICAgICAgICAgICAgICAgID8gdGhpcy5fbW9udGhzXG4gICAgICAgICAgICAgICAgOiB0aGlzLl9tb250aHNbJ3N0YW5kYWxvbmUnXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHMpXG4gICAgICAgICAgICA/IHRoaXMuX21vbnRoc1ttLm1vbnRoKCldXG4gICAgICAgICAgICA6IHRoaXMuX21vbnRoc1tcbiAgICAgICAgICAgICAgICAgICh0aGlzLl9tb250aHMuaXNGb3JtYXQgfHwgTU9OVEhTX0lOX0ZPUk1BVCkudGVzdChmb3JtYXQpXG4gICAgICAgICAgICAgICAgICAgICAgPyAnZm9ybWF0J1xuICAgICAgICAgICAgICAgICAgICAgIDogJ3N0YW5kYWxvbmUnXG4gICAgICAgICAgICAgIF1bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHNTaG9ydChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydClcbiAgICAgICAgICAgICAgICA/IHRoaXMuX21vbnRoc1Nob3J0XG4gICAgICAgICAgICAgICAgOiB0aGlzLl9tb250aHNTaG9ydFsnc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRoc1Nob3J0KVxuICAgICAgICAgICAgPyB0aGlzLl9tb250aHNTaG9ydFttLm1vbnRoKCldXG4gICAgICAgICAgICA6IHRoaXMuX21vbnRoc1Nob3J0W1xuICAgICAgICAgICAgICAgICAgTU9OVEhTX0lOX0ZPUk1BVC50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ1xuICAgICAgICAgICAgICBdW20ubW9udGgoKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGlpLFxuICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgbGxjID0gbW9udGhOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHVzZWRcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgKytpKSB7XG4gICAgICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzU2hvcnQoXG4gICAgICAgICAgICAgICAgICAgIG1vbSxcbiAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICApLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldID0gdGhpcy5tb250aHMobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdHJpY3QpIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdNTU0nKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdNTU0nKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlTW9udGhzUGFyc2UobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSwgbW9tLCByZWdleDtcblxuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlLmNhbGwodGhpcywgbW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBhZGQgc29ydGluZ1xuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyXG4gICAgICAgIC8vIHNlZSBzb3J0aW5nIGluIGNvbXB1dGVNb250aHNQYXJzZVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICdeJyArIHRoaXMubW9udGhzKG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnJykgKyAnJCcsXG4gICAgICAgICAgICAgICAgICAgICdpJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICdeJyArIHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc3RyaWN0ICYmICF0aGlzLl9tb250aHNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHJlZ2V4ID1cbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykgKyAnfF4nICsgdGhpcy5tb250aHNTaG9ydChtb20sICcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAocmVnZXgucmVwbGFjZSgnLicsICcnKSwgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRlc3QgdGhlIHJlZ2V4XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgc3RyaWN0ICYmXG4gICAgICAgICAgICAgICAgZm9ybWF0ID09PSAnTU1NTScgJiZcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgc3RyaWN0ICYmXG4gICAgICAgICAgICAgICAgZm9ybWF0ID09PSAnTU1NJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmljdCAmJiB0aGlzLl9tb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIHNldE1vbnRoKG1vbSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGRheU9mTW9udGg7XG5cbiAgICAgICAgaWYgKCFtb20uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBObyBvcFxuICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoL15cXGQrJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvSW50KHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBtb20ubG9jYWxlRGF0YSgpLm1vbnRoc1BhcnNlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBBbm90aGVyIHNpbGVudCBmYWlsdXJlP1xuICAgICAgICAgICAgICAgIGlmICghaXNOdW1iZXIodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb207XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGF5T2ZNb250aCA9IE1hdGgubWluKG1vbS5kYXRlKCksIGRheXNJbk1vbnRoKG1vbS55ZWFyKCksIHZhbHVlKSk7XG4gICAgICAgIG1vbS5fZFsnc2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyAnTW9udGgnXSh2YWx1ZSwgZGF5T2ZNb250aCk7XG4gICAgICAgIHJldHVybiBtb207XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0TW9udGgodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCAnTW9udGgnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERheXNJbk1vbnRoKCkge1xuICAgICAgICByZXR1cm4gZGF5c0luTW9udGgodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhzU2hvcnRSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzU2hvcnRSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IGRlZmF1bHRNb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggJiYgaXNTdHJpY3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXhcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21vbnRoc1Nob3J0UmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb250aHNSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBkZWZhdWx0TW9udGhzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggJiYgaXNTdHJpY3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4XG4gICAgICAgICAgICAgICAgOiB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNb250aHNQYXJzZSgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNob3J0UGllY2VzID0gW10sXG4gICAgICAgICAgICBsb25nUGllY2VzID0gW10sXG4gICAgICAgICAgICBtaXhlZFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIG1vbTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICBzaG9ydFBpZWNlcy5wdXNoKHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykpO1xuICAgICAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKHRoaXMubW9udGhzKG1vbSwgJycpKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2godGhpcy5tb250aHMobW9tLCAnJykpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaCh0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgc2hvcnRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShzaG9ydFBpZWNlc1tpXSk7XG4gICAgICAgICAgICBsb25nUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobG9uZ1BpZWNlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICAgICAgICAgIG1peGVkUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobWl4ZWRQaWVjZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX21vbnRoc1Nob3J0UmVnZXggPSB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIGxvbmdQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJyxcbiAgICAgICAgICAgICdpJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdZJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgeSA9IHRoaXMueWVhcigpO1xuICAgICAgICByZXR1cm4geSA8PSA5OTk5ID8gemVyb0ZpbGwoeSwgNCkgOiAnKycgKyB5O1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWScsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnllYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWScsIDRdLCAwLCAneWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWVknLCA1XSwgMCwgJ3llYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVlZWScsIDYsIHRydWVdLCAwLCAneWVhcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd5ZWFyJywgJ3knKTtcblxuICAgIC8vIFBSSU9SSVRJRVNcblxuICAgIGFkZFVuaXRQcmlvcml0eSgneWVhcicsIDEpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignWScsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdZWScsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdZWVlZJywgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVlZJywgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVlZWScsIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydZWVlZWScsICdZWVlZWVknXSwgWUVBUik7XG4gICAgYWRkUGFyc2VUb2tlbignWVlZWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPVxuICAgICAgICAgICAgaW5wdXQubGVuZ3RoID09PSAyID8gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpIDogdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1lZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9IHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICBmdW5jdGlvbiBkYXlzSW5ZZWFyKHllYXIpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIoeWVhcikgPyAzNjYgOiAzNjU7XG4gICAgfVxuXG4gICAgLy8gSE9PS1NcblxuICAgIGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0b0ludChpbnB1dCkgKyAodG9JbnQoaW5wdXQpID4gNjggPyAxOTAwIDogMjAwMCk7XG4gICAgfTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRZZWFyID0gbWFrZUdldFNldCgnRnVsbFllYXInLCB0cnVlKTtcblxuICAgIGZ1bmN0aW9uIGdldElzTGVhcFllYXIoKSB7XG4gICAgICAgIHJldHVybiBpc0xlYXBZZWFyKHRoaXMueWVhcigpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVEYXRlKHksIG0sIGQsIGgsIE0sIHMsIG1zKSB7XG4gICAgICAgIC8vIGNhbid0IGp1c3QgYXBwbHkoKSB0byBjcmVhdGUgYSBkYXRlOlxuICAgICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3EvMTgxMzQ4XG4gICAgICAgIHZhciBkYXRlO1xuICAgICAgICAvLyB0aGUgZGF0ZSBjb25zdHJ1Y3RvciByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBwcmVzZXJ2ZSBsZWFwIHllYXJzIHVzaW5nIGEgZnVsbCA0MDAgeWVhciBjeWNsZSwgdGhlbiByZXNldFxuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHkgKyA0MDAsIG0sIGQsIGgsIE0sIHMsIG1zKTtcbiAgICAgICAgICAgIGlmIChpc0Zpbml0ZShkYXRlLmdldEZ1bGxZZWFyKCkpKSB7XG4gICAgICAgICAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcih5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh5LCBtLCBkLCBoLCBNLCBzLCBtcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVVENEYXRlKHkpIHtcbiAgICAgICAgdmFyIGRhdGUsIGFyZ3M7XG4gICAgICAgIC8vIHRoZSBEYXRlLlVUQyBmdW5jdGlvbiByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwKSB7XG4gICAgICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIC8vIHByZXNlcnZlIGxlYXAgeWVhcnMgdXNpbmcgYSBmdWxsIDQwMCB5ZWFyIGN5Y2xlLCB0aGVuIHJlc2V0XG4gICAgICAgICAgICBhcmdzWzBdID0geSArIDQwMDtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLCBhcmdzKSk7XG4gICAgICAgICAgICBpZiAoaXNGaW5pdGUoZGF0ZS5nZXRVVENGdWxsWWVhcigpKSkge1xuICAgICAgICAgICAgICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICAvLyBzdGFydC1vZi1maXJzdC13ZWVrIC0gc3RhcnQtb2YteWVhclxuICAgIGZ1bmN0aW9uIGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgLy8gZmlyc3Qtd2VlayBkYXkgLS0gd2hpY2ggamFudWFyeSBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgKDQgZm9yIGlzbywgMSBmb3Igb3RoZXIpXG4gICAgICAgICAgICBmd2QgPSA3ICsgZG93IC0gZG95LFxuICAgICAgICAgICAgLy8gZmlyc3Qtd2VlayBkYXkgbG9jYWwgd2Vla2RheSAtLSB3aGljaCBsb2NhbCB3ZWVrZGF5IGlzIGZ3ZFxuICAgICAgICAgICAgZndkbHcgPSAoNyArIGNyZWF0ZVVUQ0RhdGUoeWVhciwgMCwgZndkKS5nZXRVVENEYXkoKSAtIGRvdykgJSA3O1xuXG4gICAgICAgIHJldHVybiAtZndkbHcgKyBmd2QgLSAxO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGUjQ2FsY3VsYXRpbmdfYV9kYXRlX2dpdmVuX3RoZV95ZWFyLjJDX3dlZWtfbnVtYmVyX2FuZF93ZWVrZGF5XG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtzKHllYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciBsb2NhbFdlZWtkYXkgPSAoNyArIHdlZWtkYXkgLSBkb3cpICUgNyxcbiAgICAgICAgICAgIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpLFxuICAgICAgICAgICAgZGF5T2ZZZWFyID0gMSArIDcgKiAod2VlayAtIDEpICsgbG9jYWxXZWVrZGF5ICsgd2Vla09mZnNldCxcbiAgICAgICAgICAgIHJlc1llYXIsXG4gICAgICAgICAgICByZXNEYXlPZlllYXI7XG5cbiAgICAgICAgaWYgKGRheU9mWWVhciA8PSAwKSB7XG4gICAgICAgICAgICByZXNZZWFyID0geWVhciAtIDE7XG4gICAgICAgICAgICByZXNEYXlPZlllYXIgPSBkYXlzSW5ZZWFyKHJlc1llYXIpICsgZGF5T2ZZZWFyO1xuICAgICAgICB9IGVsc2UgaWYgKGRheU9mWWVhciA+IGRheXNJblllYXIoeWVhcikpIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyICsgMTtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheU9mWWVhciAtIGRheXNJblllYXIoeWVhcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNZZWFyID0geWVhcjtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheU9mWWVhcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5ZWFyOiByZXNZZWFyLFxuICAgICAgICAgICAgZGF5T2ZZZWFyOiByZXNEYXlPZlllYXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Vla09mWWVhcihtb20sIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KG1vbS55ZWFyKCksIGRvdywgZG95KSxcbiAgICAgICAgICAgIHdlZWsgPSBNYXRoLmZsb29yKChtb20uZGF5T2ZZZWFyKCkgLSB3ZWVrT2Zmc2V0IC0gMSkgLyA3KSArIDEsXG4gICAgICAgICAgICByZXNXZWVrLFxuICAgICAgICAgICAgcmVzWWVhcjtcblxuICAgICAgICBpZiAod2VlayA8IDEpIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpIC0gMTtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrICsgd2Vla3NJblllYXIocmVzWWVhciwgZG93LCBkb3kpO1xuICAgICAgICB9IGVsc2UgaWYgKHdlZWsgPiB3ZWVrc0luWWVhcihtb20ueWVhcigpLCBkb3csIGRveSkpIHtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrIC0gd2Vla3NJblllYXIobW9tLnllYXIoKSwgZG93LCBkb3kpO1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCkgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCk7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3ZWVrOiByZXNXZWVrLFxuICAgICAgICAgICAgeWVhcjogcmVzWWVhcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrc0luWWVhcih5ZWFyLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSksXG4gICAgICAgICAgICB3ZWVrT2Zmc2V0TmV4dCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyICsgMSwgZG93LCBkb3kpO1xuICAgICAgICByZXR1cm4gKGRheXNJblllYXIoeWVhcikgLSB3ZWVrT2Zmc2V0ICsgd2Vla09mZnNldE5leHQpIC8gNztcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigndycsIFsnd3cnLCAyXSwgJ3dvJywgJ3dlZWsnKTtcbiAgICBhZGRGb3JtYXRUb2tlbignVycsIFsnV1cnLCAyXSwgJ1dvJywgJ2lzb1dlZWsnKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnd2VlaycsICd3Jyk7XG4gICAgYWRkVW5pdEFsaWFzKCdpc29XZWVrJywgJ1cnKTtcblxuICAgIC8vIFBSSU9SSVRJRVNcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnd2VlaycsIDUpO1xuICAgIGFkZFVuaXRQcmlvcml0eSgnaXNvV2VlaycsIDUpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigndycsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignd3cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignVycsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignV1cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ3cnLCAnd3cnLCAnVycsICdXVyddLCBmdW5jdGlvbiAoXG4gICAgICAgIGlucHV0LFxuICAgICAgICB3ZWVrLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHRva2VuXG4gICAgKSB7XG4gICAgICAgIHdlZWtbdG9rZW4uc3Vic3RyKDAsIDEpXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIExPQ0FMRVNcblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWsobW9tKSB7XG4gICAgICAgIHJldHVybiB3ZWVrT2ZZZWFyKG1vbSwgdGhpcy5fd2Vlay5kb3csIHRoaXMuX3dlZWsuZG95KS53ZWVrO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2VlayA9IHtcbiAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZUZpcnN0RGF5T2ZXZWVrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2Vlay5kb3c7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlRmlyc3REYXlPZlllYXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrLmRveTtcbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrKGlucHV0KSB7XG4gICAgICAgIHZhciB3ZWVrID0gdGhpcy5sb2NhbGVEYXRhKCkud2Vlayh0aGlzKTtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT1dlZWsoaW5wdXQpIHtcbiAgICAgICAgdmFyIHdlZWsgPSB3ZWVrT2ZZZWFyKHRoaXMsIDEsIDQpLndlZWs7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2VlayA6IHRoaXMuYWRkKChpbnB1dCAtIHdlZWspICogNywgJ2QnKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignZCcsIDAsICdkbycsICdkYXknKTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzTWluKHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGRkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNTaG9ydCh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5cyh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2UnLCAwLCAwLCAnd2Vla2RheScpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdFJywgMCwgMCwgJ2lzb1dlZWtkYXknKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnZGF5JywgJ2QnKTtcbiAgICBhZGRVbml0QWxpYXMoJ3dlZWtkYXknLCAnZScpO1xuICAgIGFkZFVuaXRBbGlhcygnaXNvV2Vla2RheScsICdFJyk7XG5cbiAgICAvLyBQUklPUklUWVxuICAgIGFkZFVuaXRQcmlvcml0eSgnZGF5JywgMTEpO1xuICAgIGFkZFVuaXRQcmlvcml0eSgnd2Vla2RheScsIDExKTtcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2lzb1dlZWtkYXknLCAxMSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdkJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdlJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdFJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdkZCcsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNNaW5SZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1Nob3J0UmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkZGQnLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydkZCcsICdkZGQnLCAnZGRkZCddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgdmFyIHdlZWtkYXkgPSBjb25maWcuX2xvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0LCB0b2tlbiwgY29uZmlnLl9zdHJpY3QpO1xuICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZ2V0IGEgd2Vla2RheSBuYW1lLCBtYXJrIHRoZSBkYXRlIGFzIGludmFsaWRcbiAgICAgICAgaWYgKHdlZWtkYXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgd2Vlay5kID0gd2Vla2RheTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRXZWVrZGF5ID0gaW5wdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZCcsICdlJywgJ0UnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW5dID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgZnVuY3Rpb24gcGFyc2VXZWVrZGF5KGlucHV0LCBsb2NhbGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNOYU4oaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0ID0gbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQpO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VJc29XZWVrZGF5KGlucHV0LCBsb2NhbGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCkgJSA3IHx8IDc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzTmFOKGlucHV0KSA/IG51bGwgOiBpbnB1dDtcbiAgICB9XG5cbiAgICAvLyBMT0NBTEVTXG4gICAgZnVuY3Rpb24gc2hpZnRXZWVrZGF5cyh3cywgbikge1xuICAgICAgICByZXR1cm4gd3Muc2xpY2UobiwgNykuY29uY2F0KHdzLnNsaWNlKDAsIG4pKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZVdlZWtkYXlzID0gJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCA9ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIGRlZmF1bHRMb2NhbGVXZWVrZGF5c01pbiA9ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgZGVmYXVsdFdlZWtkYXlzUmVnZXggPSBtYXRjaFdvcmQsXG4gICAgICAgIGRlZmF1bHRXZWVrZGF5c1Nob3J0UmVnZXggPSBtYXRjaFdvcmQsXG4gICAgICAgIGRlZmF1bHRXZWVrZGF5c01pblJlZ2V4ID0gbWF0Y2hXb3JkO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXMobSwgZm9ybWF0KSB7XG4gICAgICAgIHZhciB3ZWVrZGF5cyA9IGlzQXJyYXkodGhpcy5fd2Vla2RheXMpXG4gICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzXG4gICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzW1xuICAgICAgICAgICAgICAgICAgbSAmJiBtICE9PSB0cnVlICYmIHRoaXMuX3dlZWtkYXlzLmlzRm9ybWF0LnRlc3QoZm9ybWF0KVxuICAgICAgICAgICAgICAgICAgICAgID8gJ2Zvcm1hdCdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdzdGFuZGFsb25lJ1xuICAgICAgICAgICAgICBdO1xuICAgICAgICByZXR1cm4gbSA9PT0gdHJ1ZVxuICAgICAgICAgICAgPyBzaGlmdFdlZWtkYXlzKHdlZWtkYXlzLCB0aGlzLl93ZWVrLmRvdylcbiAgICAgICAgICAgIDogbVxuICAgICAgICAgICAgPyB3ZWVrZGF5c1ttLmRheSgpXVxuICAgICAgICAgICAgOiB3ZWVrZGF5cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c1Nob3J0KG0pIHtcbiAgICAgICAgcmV0dXJuIG0gPT09IHRydWVcbiAgICAgICAgICAgID8gc2hpZnRXZWVrZGF5cyh0aGlzLl93ZWVrZGF5c1Nob3J0LCB0aGlzLl93ZWVrLmRvdylcbiAgICAgICAgICAgIDogbVxuICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c1Nob3J0W20uZGF5KCldXG4gICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzU2hvcnQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNNaW4obSkge1xuICAgICAgICByZXR1cm4gbSA9PT0gdHJ1ZVxuICAgICAgICAgICAgPyBzaGlmdFdlZWtkYXlzKHRoaXMuX3dlZWtkYXlzTWluLCB0aGlzLl93ZWVrLmRvdylcbiAgICAgICAgICAgIDogbVxuICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c01pblttLmRheSgpXVxuICAgICAgICAgICAgOiB0aGlzLl93ZWVrZGF5c01pbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVTdHJpY3RQYXJzZSQxKHdlZWtkYXlOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGlpLFxuICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgbGxjID0gd2Vla2RheU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2UgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7ICsraSkge1xuICAgICAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5c01pbihcbiAgICAgICAgICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzU2hvcnQoXG4gICAgICAgICAgICAgICAgICAgIG1vbSxcbiAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICApLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXMobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdHJpY3QpIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdkZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAnZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnZGRkZCcpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAnZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzUGFyc2Uod2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVTdHJpY3RQYXJzZSQxLmNhbGwodGhpcywgd2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG5cbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLndlZWtkYXlzKG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnXFxcXC4/JykgKyAnJCcsXG4gICAgICAgICAgICAgICAgICAgICdpJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy53ZWVrZGF5c1Nob3J0KG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnXFxcXC4/JykgKyAnJCcsXG4gICAgICAgICAgICAgICAgICAgICdpJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICdeJyArIHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHJlZ2V4ID1cbiAgICAgICAgICAgICAgICAgICAgJ14nICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWVrZGF5cyhtb20sICcnKSArXG4gICAgICAgICAgICAgICAgICAgICd8XicgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykgK1xuICAgICAgICAgICAgICAgICAgICAnfF4nICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChyZWdleC5yZXBsYWNlKCcuJywgJycpLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdkZGRkJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgc3RyaWN0ICYmXG4gICAgICAgICAgICAgICAgZm9ybWF0ID09PSAnZGRkJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHN0cmljdCAmJlxuICAgICAgICAgICAgICAgIGZvcm1hdCA9PT0gJ2RkJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyaWN0ICYmIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldERheU9mV2VlayhpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRheSA9IHRoaXMuX2lzVVRDID8gdGhpcy5fZC5nZXRVVENEYXkoKSA6IHRoaXMuX2QuZ2V0RGF5KCk7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbnB1dCA9IHBhcnNlV2Vla2RheShpbnB1dCwgdGhpcy5sb2NhbGVEYXRhKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkKGlucHV0IC0gZGF5LCAnZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGRheTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldExvY2FsZURheU9mV2VlayhpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdlZWtkYXkgPSAodGhpcy5kYXkoKSArIDcgLSB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3cpICUgNztcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrZGF5IDogdGhpcy5hZGQoaW5wdXQgLSB3ZWVrZGF5LCAnZCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT0RheU9mV2VlayhpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBiZWhhdmVzIHRoZSBzYW1lIGFzIG1vbWVudCNkYXkgZXhjZXB0XG4gICAgICAgIC8vIGFzIGEgZ2V0dGVyLCByZXR1cm5zIDcgaW5zdGVhZCBvZiAwICgxLTcgcmFuZ2UgaW5zdGVhZCBvZiAwLTYpXG4gICAgICAgIC8vIGFzIGEgc2V0dGVyLCBzdW5kYXkgc2hvdWxkIGJlbG9uZyB0byB0aGUgcHJldmlvdXMgd2Vlay5cblxuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHdlZWtkYXkgPSBwYXJzZUlzb1dlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSh0aGlzLmRheSgpICUgNyA/IHdlZWtkYXkgOiB3ZWVrZGF5IC0gNyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXkoKSB8fCA3O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Vla2RheXNSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlV2Vla2RheXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNSZWdleCA9IGRlZmF1bHRXZWVrZGF5c1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXggJiYgaXNTdHJpY3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXhcbiAgICAgICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrZGF5c1Nob3J0UmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1Nob3J0UmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleCA9IGRlZmF1bHRXZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXhcbiAgICAgICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtkYXlzTWluUmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzTWluUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzTWluUmVnZXggPSBkZWZhdWx0V2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4XG4gICAgICAgICAgICAgICAgOiB0aGlzLl93ZWVrZGF5c01pblJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZVdlZWtkYXlzUGFyc2UoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGNtcExlblJldihhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYi5sZW5ndGggLSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtaW5QaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIHNob3J0UGllY2VzID0gW10sXG4gICAgICAgICAgICBsb25nUGllY2VzID0gW10sXG4gICAgICAgICAgICBtaXhlZFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIG1vbSxcbiAgICAgICAgICAgIG1pbnAsXG4gICAgICAgICAgICBzaG9ydHAsXG4gICAgICAgICAgICBsb25ncDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICBtaW5wID0gcmVnZXhFc2NhcGUodGhpcy53ZWVrZGF5c01pbihtb20sICcnKSk7XG4gICAgICAgICAgICBzaG9ydHAgPSByZWdleEVzY2FwZSh0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykpO1xuICAgICAgICAgICAgbG9uZ3AgPSByZWdleEVzY2FwZSh0aGlzLndlZWtkYXlzKG1vbSwgJycpKTtcbiAgICAgICAgICAgIG1pblBpZWNlcy5wdXNoKG1pbnApO1xuICAgICAgICAgICAgc2hvcnRQaWVjZXMucHVzaChzaG9ydHApO1xuICAgICAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKGxvbmdwKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2gobWlucCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHNob3J0cCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKGxvbmdwKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIHdlZWtkYXkgKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXIgaXRcbiAgICAgICAgLy8gd2lsbCBtYXRjaCB0aGUgbG9uZ2VyIHBpZWNlLlxuICAgICAgICBtaW5QaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBzaG9ydFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGxvbmdQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBtaXhlZFBpZWNlcy5zb3J0KGNtcExlblJldik7XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5SZWdleCA9IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgbG9uZ1BpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKCcgKyBzaG9ydFBpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgbWluUGllY2VzLmpvaW4oJ3wnKSArICcpJyxcbiAgICAgICAgICAgICdpJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIGhGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCkgJSAxMiB8fCAxMjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBrRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpIHx8IDI0O1xuICAgIH1cblxuICAgIGFkZEZvcm1hdFRva2VuKCdIJywgWydISCcsIDJdLCAwLCAnaG91cicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdoJywgWydoaCcsIDJdLCAwLCBoRm9ybWF0KTtcbiAgICBhZGRGb3JtYXRUb2tlbignaycsIFsna2snLCAyXSwgMCwga0Zvcm1hdCk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignaG1tJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgJycgK1xuICAgICAgICAgICAgaEZvcm1hdC5hcHBseSh0aGlzKSArXG4gICAgICAgICAgICB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMikgK1xuICAgICAgICAgICAgemVyb0ZpbGwodGhpcy5zZWNvbmRzKCksIDIpXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignSG1tJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyB0aGlzLmhvdXJzKCkgKyB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMik7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignSG1tc3MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAnJyArXG4gICAgICAgICAgICB0aGlzLmhvdXJzKCkgK1xuICAgICAgICAgICAgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gbWVyaWRpZW0odG9rZW4sIGxvd2VyY2FzZSkge1xuICAgICAgICBhZGRGb3JtYXRUb2tlbih0b2tlbiwgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1lcmlkaWVtKFxuICAgICAgICAgICAgICAgIHRoaXMuaG91cnMoKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgICAgICBsb3dlcmNhc2VcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG1lcmlkaWVtKCdhJywgdHJ1ZSk7XG4gICAgbWVyaWRpZW0oJ0EnLCBmYWxzZSk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2hvdXInLCAnaCcpO1xuXG4gICAgLy8gUFJJT1JJVFlcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2hvdXInLCAxMyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBmdW5jdGlvbiBtYXRjaE1lcmlkaWVtKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5fbWVyaWRpZW1QYXJzZTtcbiAgICB9XG5cbiAgICBhZGRSZWdleFRva2VuKCdhJywgbWF0Y2hNZXJpZGllbSk7XG4gICAgYWRkUmVnZXhUb2tlbignQScsIG1hdGNoTWVyaWRpZW0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0gnLCBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2gnLCBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2snLCBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0hIJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2hoJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2trJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuXG4gICAgYWRkUmVnZXhUb2tlbignaG1tJywgbWF0Y2gzdG80KTtcbiAgICBhZGRSZWdleFRva2VuKCdobW1zcycsIG1hdGNoNXRvNik7XG4gICAgYWRkUmVnZXhUb2tlbignSG1tJywgbWF0Y2gzdG80KTtcbiAgICBhZGRSZWdleFRva2VuKCdIbW1zcycsIG1hdGNoNXRvNik7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnSCcsICdISCddLCBIT1VSKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnaycsICdrayddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIGtJbnB1dCA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSBrSW5wdXQgPT09IDI0ID8gMCA6IGtJbnB1dDtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKFsnYScsICdBJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2lzUG0gPSBjb25maWcuX2xvY2FsZS5pc1BNKGlucHV0KTtcbiAgICAgICAgY29uZmlnLl9tZXJpZGllbSA9IGlucHV0O1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oWydoJywgJ2hoJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignaG1tJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MpKTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignaG1tc3MnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0LFxuICAgICAgICAgICAgcG9zMiA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvczEpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgICAgIGFycmF5W1NFQ09ORF0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMikpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdIbW0nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvcyA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvcykpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0htbXNzJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MxID0gaW5wdXQubGVuZ3RoIC0gNCxcbiAgICAgICAgICAgIHBvczIgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MxKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMSwgMikpO1xuICAgICAgICBhcnJheVtTRUNPTkRdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczIpKTtcbiAgICB9KTtcblxuICAgIC8vIExPQ0FMRVNcblxuICAgIGZ1bmN0aW9uIGxvY2FsZUlzUE0oaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IFF1aXJrcyBNb2RlICYgSUU3IFN0YW5kYXJkcyBNb2RlIGRvIG5vdCBhbGxvdyBhY2Nlc3Npbmcgc3RyaW5ncyBsaWtlIGFycmF5c1xuICAgICAgICAvLyBVc2luZyBjaGFyQXQgc2hvdWxkIGJlIG1vcmUgY29tcGF0aWJsZS5cbiAgICAgICAgcmV0dXJuIChpbnB1dCArICcnKS50b0xvd2VyQ2FzZSgpLmNoYXJBdCgwKSA9PT0gJ3AnO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlTWVyaWRpZW1QYXJzZSA9IC9bYXBdXFwuP20/XFwuPy9pLFxuICAgICAgICAvLyBTZXR0aW5nIHRoZSBob3VyIHNob3VsZCBrZWVwIHRoZSB0aW1lLCBiZWNhdXNlIHRoZSB1c2VyIGV4cGxpY2l0bHlcbiAgICAgICAgLy8gc3BlY2lmaWVkIHdoaWNoIGhvdXIgdGhleSB3YW50LiBTbyB0cnlpbmcgdG8gbWFpbnRhaW4gdGhlIHNhbWUgaG91ciAoaW5cbiAgICAgICAgLy8gYSBuZXcgdGltZXpvbmUpIG1ha2VzIHNlbnNlLiBBZGRpbmcvc3VidHJhY3RpbmcgaG91cnMgZG9lcyBub3QgZm9sbG93XG4gICAgICAgIC8vIHRoaXMgcnVsZS5cbiAgICAgICAgZ2V0U2V0SG91ciA9IG1ha2VHZXRTZXQoJ0hvdXJzJywgdHJ1ZSk7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNZXJpZGllbShob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICBpZiAoaG91cnMgPiAxMSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAncG0nIDogJ1BNJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ2FtJyA6ICdBTSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYmFzZUNvbmZpZyA9IHtcbiAgICAgICAgY2FsZW5kYXI6IGRlZmF1bHRDYWxlbmRhcixcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IGRlZmF1bHRMb25nRGF0ZUZvcm1hdCxcbiAgICAgICAgaW52YWxpZERhdGU6IGRlZmF1bHRJbnZhbGlkRGF0ZSxcbiAgICAgICAgb3JkaW5hbDogZGVmYXVsdE9yZGluYWwsXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IGRlZmF1bHREYXlPZk1vbnRoT3JkaW5hbFBhcnNlLFxuICAgICAgICByZWxhdGl2ZVRpbWU6IGRlZmF1bHRSZWxhdGl2ZVRpbWUsXG5cbiAgICAgICAgbW9udGhzOiBkZWZhdWx0TG9jYWxlTW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0LFxuXG4gICAgICAgIHdlZWs6IGRlZmF1bHRMb2NhbGVXZWVrLFxuXG4gICAgICAgIHdlZWtkYXlzOiBkZWZhdWx0TG9jYWxlV2Vla2RheXMsXG4gICAgICAgIHdlZWtkYXlzTWluOiBkZWZhdWx0TG9jYWxlV2Vla2RheXNNaW4sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6IGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0LFxuXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlLFxuICAgIH07XG5cbiAgICAvLyBpbnRlcm5hbCBzdG9yYWdlIGZvciBsb2NhbGUgY29uZmlnIGZpbGVzXG4gICAgdmFyIGxvY2FsZXMgPSB7fSxcbiAgICAgICAgbG9jYWxlRmFtaWxpZXMgPSB7fSxcbiAgICAgICAgZ2xvYmFsTG9jYWxlO1xuXG4gICAgZnVuY3Rpb24gY29tbW9uUHJlZml4KGFycjEsIGFycjIpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBtaW5sID0gTWF0aC5taW4oYXJyMS5sZW5ndGgsIGFycjIubGVuZ3RoKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG1pbmw7IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKGFycjFbaV0gIT09IGFycjJbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWlubDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVMb2NhbGUoa2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgPyBrZXkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdfJywgJy0nKSA6IGtleTtcbiAgICB9XG5cbiAgICAvLyBwaWNrIHRoZSBsb2NhbGUgZnJvbSB0aGUgYXJyYXlcbiAgICAvLyB0cnkgWydlbi1hdScsICdlbi1nYiddIGFzICdlbi1hdScsICdlbi1nYicsICdlbicsIGFzIGluIG1vdmUgdGhyb3VnaCB0aGUgbGlzdCB0cnlpbmcgZWFjaFxuICAgIC8vIHN1YnN0cmluZyBmcm9tIG1vc3Qgc3BlY2lmaWMgdG8gbGVhc3QsIGJ1dCBtb3ZlIHRvIHRoZSBuZXh0IGFycmF5IGl0ZW0gaWYgaXQncyBhIG1vcmUgc3BlY2lmaWMgdmFyaWFudCB0aGFuIHRoZSBjdXJyZW50IHJvb3RcbiAgICBmdW5jdGlvbiBjaG9vc2VMb2NhbGUobmFtZXMpIHtcbiAgICAgICAgdmFyIGkgPSAwLFxuICAgICAgICAgICAgaixcbiAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICBzcGxpdDtcblxuICAgICAgICB3aGlsZSAoaSA8IG5hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgc3BsaXQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaV0pLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBqID0gc3BsaXQubGVuZ3RoO1xuICAgICAgICAgICAgbmV4dCA9IG5vcm1hbGl6ZUxvY2FsZShuYW1lc1tpICsgMV0pO1xuICAgICAgICAgICAgbmV4dCA9IG5leHQgPyBuZXh0LnNwbGl0KCctJykgOiBudWxsO1xuICAgICAgICAgICAgd2hpbGUgKGogPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShzcGxpdC5zbGljZSgwLCBqKS5qb2luKCctJykpO1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBuZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgIG5leHQubGVuZ3RoID49IGogJiZcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uUHJlZml4KHNwbGl0LCBuZXh0KSA+PSBqIC0gMVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvL3RoZSBuZXh0IGFycmF5IGl0ZW0gaXMgYmV0dGVyIHRoYW4gYSBzaGFsbG93ZXIgc3Vic3RyaW5nIG9mIHRoaXMgb25lXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkTG9jYWxlKG5hbWUpIHtcbiAgICAgICAgdmFyIG9sZExvY2FsZSA9IG51bGwsXG4gICAgICAgICAgICBhbGlhc2VkUmVxdWlyZTtcbiAgICAgICAgLy8gVE9ETzogRmluZCBhIGJldHRlciB3YXkgdG8gcmVnaXN0ZXIgYW5kIGxvYWQgYWxsIHRoZSBsb2NhbGVzIGluIE5vZGVcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgbW9kdWxlICYmXG4gICAgICAgICAgICBtb2R1bGUuZXhwb3J0c1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgb2xkTG9jYWxlID0gZ2xvYmFsTG9jYWxlLl9hYmJyO1xuICAgICAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlID0gcmVxdWlyZTtcbiAgICAgICAgICAgICAgICBhbGlhc2VkUmVxdWlyZSgnLi9sb2NhbGUvJyArIG5hbWUpO1xuICAgICAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShvbGRMb2NhbGUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIG1hcmsgYXMgbm90IGZvdW5kIHRvIGF2b2lkIHJlcGVhdGluZyBleHBlbnNpdmUgZmlsZSByZXF1aXJlIGNhbGwgY2F1c2luZyBoaWdoIENQVVxuICAgICAgICAgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGZpbmQgZW4tVVMsIGVuX1VTLCBlbi11cyBmb3IgZXZlcnkgZm9ybWF0IGNhbGxcbiAgICAgICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbnVsbDsgLy8gbnVsbCBtZWFucyBub3QgZm91bmRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgbG9hZCBsb2NhbGUgYW5kIHRoZW4gc2V0IHRoZSBnbG9iYWwgbG9jYWxlLiAgSWZcbiAgICAvLyBubyBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiwgaXQgd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBjdXJyZW50IGdsb2JhbFxuICAgIC8vIGxvY2FsZSBrZXkuXG4gICAgZnVuY3Rpb24gZ2V0U2V0R2xvYmFsTG9jYWxlKGtleSwgdmFsdWVzKSB7XG4gICAgICAgIHZhciBkYXRhO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQodmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBnZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGRlZmluZUxvY2FsZShrZXksIHZhbHVlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gbW9tZW50LmR1cmF0aW9uLl9sb2NhbGUgPSBtb21lbnQuX2xvY2FsZSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgZ2xvYmFsTG9jYWxlID0gZGF0YTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLndhcm4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy93YXJuIHVzZXIgaWYgYXJndW1lbnRzIGFyZSBwYXNzZWQgYnV0IHRoZSBsb2NhbGUgY291bGQgbm90IGJlIHNldFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAnTG9jYWxlICcgKyBrZXkgKyAnIG5vdCBmb3VuZC4gRGlkIHlvdSBmb3JnZXQgdG8gbG9hZCBpdD8nXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZpbmVMb2NhbGUobmFtZSwgY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbGUsXG4gICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gYmFzZUNvbmZpZztcbiAgICAgICAgICAgIGNvbmZpZy5hYmJyID0gbmFtZTtcbiAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGVTaW1wbGUoXG4gICAgICAgICAgICAgICAgICAgICdkZWZpbmVMb2NhbGVPdmVycmlkZScsXG4gICAgICAgICAgICAgICAgICAgICd1c2UgbW9tZW50LnVwZGF0ZUxvY2FsZShsb2NhbGVOYW1lLCBjb25maWcpIHRvIGNoYW5nZSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdhbiBleGlzdGluZyBsb2NhbGUuIG1vbWVudC5kZWZpbmVMb2NhbGUobG9jYWxlTmFtZSwgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlnKSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjcmVhdGluZyBhIG5ldyBsb2NhbGUgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvZGVmaW5lLWxvY2FsZS8gZm9yIG1vcmUgaW5mby4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGVzW25hbWVdLl9jb25maWc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5wYXJlbnRMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gbG9jYWxlc1tjb25maWcucGFyZW50TG9jYWxlXS5fY29uZmlnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoY29uZmlnLnBhcmVudExvY2FsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gbG9jYWxlLl9jb25maWc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZUZhbWlsaWVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZUZhbWlsaWVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IG5ldyBMb2NhbGUobWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY29uZmlnKSk7XG5cbiAgICAgICAgICAgIGlmIChsb2NhbGVGYW1pbGllc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIGxvY2FsZUZhbWlsaWVzW25hbWVdLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5lTG9jYWxlKHgubmFtZSwgeC5jb25maWcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0IGZvciBub3c6IGFsc28gc2V0IHRoZSBsb2NhbGVcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGxvY2FsZSBBRlRFUiBhbGwgY2hpbGQgbG9jYWxlcyBoYXZlIGJlZW5cbiAgICAgICAgICAgIC8vIGNyZWF0ZWQsIHNvIHdlIHdvbid0IGVuZCB1cCB3aXRoIHRoZSBjaGlsZCBsb2NhbGUgc2V0LlxuICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG5hbWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHVzZWZ1bCBmb3IgdGVzdGluZ1xuICAgICAgICAgICAgZGVsZXRlIGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZUxvY2FsZShuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxlLFxuICAgICAgICAgICAgICAgIHRtcExvY2FsZSxcbiAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBiYXNlQ29uZmlnO1xuXG4gICAgICAgICAgICBpZiAobG9jYWxlc1tuYW1lXSAhPSBudWxsICYmIGxvY2FsZXNbbmFtZV0ucGFyZW50TG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXhpc3RpbmcgY2hpbGQgbG9jYWxlIGluLXBsYWNlIHRvIGF2b2lkIG1lbW9yeS1sZWFrc1xuICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0uc2V0KG1lcmdlQ29uZmlncyhsb2NhbGVzW25hbWVdLl9jb25maWcsIGNvbmZpZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBNRVJHRVxuICAgICAgICAgICAgICAgIHRtcExvY2FsZSA9IGxvYWRMb2NhbGUobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRtcExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IHRtcExvY2FsZS5fY29uZmlnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25maWcgPSBtZXJnZUNvbmZpZ3MocGFyZW50Q29uZmlnLCBjb25maWcpO1xuICAgICAgICAgICAgICAgIGlmICh0bXBMb2NhbGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVMb2NhbGUgaXMgY2FsbGVkIGZvciBjcmVhdGluZyBhIG5ldyBsb2NhbGVcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGFiYnIgc28gaXQgd2lsbCBoYXZlIGEgbmFtZSAoZ2V0dGVycyByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkIG90aGVyd2lzZSkuXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hYmJyID0gbmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZShjb25maWcpO1xuICAgICAgICAgICAgICAgIGxvY2FsZS5wYXJlbnRMb2NhbGUgPSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXQgZm9yIG5vdzogYWxzbyBzZXQgdGhlIGxvY2FsZVxuICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFzcyBudWxsIGZvciBjb25maWcgdG8gdW51cGRhdGUsIHVzZWZ1bCBmb3IgdGVzdHNcbiAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWxlc1tuYW1lXS5wYXJlbnRMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbG9jYWxlc1tuYW1lXS5wYXJlbnRMb2NhbGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSBnZXRTZXRHbG9iYWxMb2NhbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgIH1cblxuICAgIC8vIHJldHVybnMgbG9jYWxlIGRhdGFcbiAgICBmdW5jdGlvbiBnZXRMb2NhbGUoa2V5KSB7XG4gICAgICAgIHZhciBsb2NhbGU7XG5cbiAgICAgICAgaWYgKGtleSAmJiBrZXkuX2xvY2FsZSAmJiBrZXkuX2xvY2FsZS5fYWJicikge1xuICAgICAgICAgICAga2V5ID0ga2V5Ll9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgICAvL3Nob3J0LWNpcmN1aXQgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobG9jYWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtleSA9IFtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNob29zZUxvY2FsZShrZXkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RMb2NhbGVzKCkge1xuICAgICAgICByZXR1cm4ga2V5cyhsb2NhbGVzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja092ZXJmbG93KG0pIHtcbiAgICAgICAgdmFyIG92ZXJmbG93LFxuICAgICAgICAgICAgYSA9IG0uX2E7XG5cbiAgICAgICAgaWYgKGEgJiYgZ2V0UGFyc2luZ0ZsYWdzKG0pLm92ZXJmbG93ID09PSAtMikge1xuICAgICAgICAgICAgb3ZlcmZsb3cgPVxuICAgICAgICAgICAgICAgIGFbTU9OVEhdIDwgMCB8fCBhW01PTlRIXSA+IDExXG4gICAgICAgICAgICAgICAgICAgID8gTU9OVEhcbiAgICAgICAgICAgICAgICAgICAgOiBhW0RBVEVdIDwgMSB8fCBhW0RBVEVdID4gZGF5c0luTW9udGgoYVtZRUFSXSwgYVtNT05USF0pXG4gICAgICAgICAgICAgICAgICAgID8gREFURVxuICAgICAgICAgICAgICAgICAgICA6IGFbSE9VUl0gPCAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgYVtIT1VSXSA+IDI0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgKGFbSE9VUl0gPT09IDI0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChhW01JTlVURV0gIT09IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbU0VDT05EXSAhPT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtNSUxMSVNFQ09ORF0gIT09IDApKVxuICAgICAgICAgICAgICAgICAgICA/IEhPVVJcbiAgICAgICAgICAgICAgICAgICAgOiBhW01JTlVURV0gPCAwIHx8IGFbTUlOVVRFXSA+IDU5XG4gICAgICAgICAgICAgICAgICAgID8gTUlOVVRFXG4gICAgICAgICAgICAgICAgICAgIDogYVtTRUNPTkRdIDwgMCB8fCBhW1NFQ09ORF0gPiA1OVxuICAgICAgICAgICAgICAgICAgICA/IFNFQ09ORFxuICAgICAgICAgICAgICAgICAgICA6IGFbTUlMTElTRUNPTkRdIDwgMCB8fCBhW01JTExJU0VDT05EXSA+IDk5OVxuICAgICAgICAgICAgICAgICAgICA/IE1JTExJU0VDT05EXG4gICAgICAgICAgICAgICAgICAgIDogLTE7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93RGF5T2ZZZWFyICYmXG4gICAgICAgICAgICAgICAgKG92ZXJmbG93IDwgWUVBUiB8fCBvdmVyZmxvdyA+IERBVEUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IERBVEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd1dlZWtzICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gV0VFSztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla2RheSAmJiBvdmVyZmxvdyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IFdFRUtEQVk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9IG92ZXJmbG93O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgLy8gaXNvIDg2MDEgcmVnZXhcbiAgICAvLyAwMDAwLTAwLTAwIDAwMDAtVzAwIG9yIDAwMDAtVzAwLTAgKyBUICsgMDAgb3IgMDA6MDAgb3IgMDA6MDA6MDAgb3IgMDA6MDA6MDAuMDAwICsgKzAwOjAwIG9yICswMDAwIG9yICswMClcbiAgICB2YXIgZXh0ZW5kZWRJc29SZWdleCA9IC9eXFxzKigoPzpbKy1dXFxkezZ9fFxcZHs0fSktKD86XFxkXFxkLVxcZFxcZHxXXFxkXFxkLVxcZHxXXFxkXFxkfFxcZFxcZFxcZHxcXGRcXGQpKSg/OihUfCApKFxcZFxcZCg/OjpcXGRcXGQoPzo6XFxkXFxkKD86Wy4sXVxcZCspPyk/KT8pKFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvLFxuICAgICAgICBiYXNpY0lzb1JlZ2V4ID0gL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KSg/OlxcZFxcZFxcZFxcZHxXXFxkXFxkXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZHwpKSg/OihUfCApKFxcZFxcZCg/OlxcZFxcZCg/OlxcZFxcZCg/OlsuLF1cXGQrKT8pPyk/KShbKy1dXFxkXFxkKD86Oj9cXGRcXGQpP3xcXHMqWik/KT8kLyxcbiAgICAgICAgdHpSZWdleCA9IC9afFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/LyxcbiAgICAgICAgaXNvRGF0ZXMgPSBbXG4gICAgICAgICAgICBbJ1lZWVlZWS1NTS1ERCcsIC9bKy1dXFxkezZ9LVxcZFxcZC1cXGRcXGQvXSxcbiAgICAgICAgICAgIFsnWVlZWS1NTS1ERCcsIC9cXGR7NH0tXFxkXFxkLVxcZFxcZC9dLFxuICAgICAgICAgICAgWydHR0dHLVtXXVdXLUUnLCAvXFxkezR9LVdcXGRcXGQtXFxkL10sXG4gICAgICAgICAgICBbJ0dHR0ctW1ddV1cnLCAvXFxkezR9LVdcXGRcXGQvLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ1lZWVktREREJywgL1xcZHs0fS1cXGR7M30vXSxcbiAgICAgICAgICAgIFsnWVlZWS1NTScsIC9cXGR7NH0tXFxkXFxkLywgZmFsc2VdLFxuICAgICAgICAgICAgWydZWVlZWVlNTUREJywgL1srLV1cXGR7MTB9L10sXG4gICAgICAgICAgICBbJ1lZWVlNTUREJywgL1xcZHs4fS9dLFxuICAgICAgICAgICAgWydHR0dHW1ddV1dFJywgL1xcZHs0fVdcXGR7M30vXSxcbiAgICAgICAgICAgIFsnR0dHR1tXXVdXJywgL1xcZHs0fVdcXGR7Mn0vLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ1lZWVlEREQnLCAvXFxkezd9L10sXG4gICAgICAgICAgICBbJ1lZWVlNTScsIC9cXGR7Nn0vLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ1lZWVknLCAvXFxkezR9LywgZmFsc2VdLFxuICAgICAgICBdLFxuICAgICAgICAvLyBpc28gdGltZSBmb3JtYXRzIGFuZCByZWdleGVzXG4gICAgICAgIGlzb1RpbWVzID0gW1xuICAgICAgICAgICAgWydISDptbTpzcy5TU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkKy9dLFxuICAgICAgICAgICAgWydISDptbTpzcyxTU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkLFxcZCsvXSxcbiAgICAgICAgICAgIFsnSEg6bW06c3MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQvXSxcbiAgICAgICAgICAgIFsnSEg6bW0nLCAvXFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICAgICAgWydISG1tc3MuU1NTUycsIC9cXGRcXGRcXGRcXGRcXGRcXGRcXC5cXGQrL10sXG4gICAgICAgICAgICBbJ0hIbW1zcyxTU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZCxcXGQrL10sXG4gICAgICAgICAgICBbJ0hIbW1zcycsIC9cXGRcXGRcXGRcXGRcXGRcXGQvXSxcbiAgICAgICAgICAgIFsnSEhtbScsIC9cXGRcXGRcXGRcXGQvXSxcbiAgICAgICAgICAgIFsnSEgnLCAvXFxkXFxkL10sXG4gICAgICAgIF0sXG4gICAgICAgIGFzcE5ldEpzb25SZWdleCA9IC9eXFwvP0RhdGVcXCgoLT9cXGQrKS9pLFxuICAgICAgICAvLyBSRkMgMjgyMiByZWdleDogRm9yIGRldGFpbHMgc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyODIyI3NlY3Rpb24tMy4zXG4gICAgICAgIHJmYzI4MjIgPSAvXig/OihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pLD9cXHMpPyhcXGR7MSwyfSlcXHMoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpXFxzKFxcZHsyLDR9KVxccyhcXGRcXGQpOihcXGRcXGQpKD86OihcXGRcXGQpKT9cXHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KFsrLV1cXGR7NH0pKSQvLFxuICAgICAgICBvYnNPZmZzZXRzID0ge1xuICAgICAgICAgICAgVVQ6IDAsXG4gICAgICAgICAgICBHTVQ6IDAsXG4gICAgICAgICAgICBFRFQ6IC00ICogNjAsXG4gICAgICAgICAgICBFU1Q6IC01ICogNjAsXG4gICAgICAgICAgICBDRFQ6IC01ICogNjAsXG4gICAgICAgICAgICBDU1Q6IC02ICogNjAsXG4gICAgICAgICAgICBNRFQ6IC02ICogNjAsXG4gICAgICAgICAgICBNU1Q6IC03ICogNjAsXG4gICAgICAgICAgICBQRFQ6IC03ICogNjAsXG4gICAgICAgICAgICBQU1Q6IC04ICogNjAsXG4gICAgICAgIH07XG5cbiAgICAvLyBkYXRlIGZyb20gaXNvIGZvcm1hdFxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21JU08oY29uZmlnKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIHN0cmluZyA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIG1hdGNoID0gZXh0ZW5kZWRJc29SZWdleC5leGVjKHN0cmluZykgfHwgYmFzaWNJc29SZWdleC5leGVjKHN0cmluZyksXG4gICAgICAgICAgICBhbGxvd1RpbWUsXG4gICAgICAgICAgICBkYXRlRm9ybWF0LFxuICAgICAgICAgICAgdGltZUZvcm1hdCxcbiAgICAgICAgICAgIHR6Rm9ybWF0O1xuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaXNvID0gdHJ1ZTtcblxuICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb0RhdGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc29EYXRlc1tpXVsxXS5leGVjKG1hdGNoWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0ID0gaXNvRGF0ZXNbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGFsbG93VGltZSA9IGlzb0RhdGVzW2ldWzJdICE9PSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGVGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBpc29UaW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzb1RpbWVzW2ldWzFdLmV4ZWMobWF0Y2hbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaFsyXSBzaG91bGQgYmUgJ1QnIG9yIHNwYWNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lRm9ybWF0ID0gKG1hdGNoWzJdIHx8ICcgJykgKyBpc29UaW1lc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aW1lRm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFsbG93VGltZSAmJiB0aW1lRm9ybWF0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbNF0pIHtcbiAgICAgICAgICAgICAgICBpZiAodHpSZWdleC5leGVjKG1hdGNoWzRdKSkge1xuICAgICAgICAgICAgICAgICAgICB0ekZvcm1hdCA9ICdaJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZy5fZiA9IGRhdGVGb3JtYXQgKyAodGltZUZvcm1hdCB8fCAnJykgKyAodHpGb3JtYXQgfHwgJycpO1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRyYWN0RnJvbVJGQzI4MjJTdHJpbmdzKFxuICAgICAgICB5ZWFyU3RyLFxuICAgICAgICBtb250aFN0cixcbiAgICAgICAgZGF5U3RyLFxuICAgICAgICBob3VyU3RyLFxuICAgICAgICBtaW51dGVTdHIsXG4gICAgICAgIHNlY29uZFN0clxuICAgICkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW1xuICAgICAgICAgICAgdW50cnVuY2F0ZVllYXIoeWVhclN0ciksXG4gICAgICAgICAgICBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQuaW5kZXhPZihtb250aFN0ciksXG4gICAgICAgICAgICBwYXJzZUludChkYXlTdHIsIDEwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KGhvdXJTdHIsIDEwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KG1pbnV0ZVN0ciwgMTApLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChzZWNvbmRTdHIpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlSW50KHNlY29uZFN0ciwgMTApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW50cnVuY2F0ZVllYXIoeWVhclN0cikge1xuICAgICAgICB2YXIgeWVhciA9IHBhcnNlSW50KHllYXJTdHIsIDEwKTtcbiAgICAgICAgaWYgKHllYXIgPD0gNDkpIHtcbiAgICAgICAgICAgIHJldHVybiAyMDAwICsgeWVhcjtcbiAgICAgICAgfSBlbHNlIGlmICh5ZWFyIDw9IDk5OSkge1xuICAgICAgICAgICAgcmV0dXJuIDE5MDAgKyB5ZWFyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5ZWFyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZXByb2Nlc3NSRkMyODIyKHMpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBmb2xkaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgbXVsdGlwbGUtc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgICAgICAgcmV0dXJuIHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXChbXildKlxcKXxbXFxuXFx0XS9nLCAnICcpXG4gICAgICAgICAgICAucmVwbGFjZSgvKFxcc1xccyspL2csICcgJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXFxzXFxzKi8sICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcc1xccyokLywgJycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrV2Vla2RheSh3ZWVrZGF5U3RyLCBwYXJzZWRJbnB1dCwgY29uZmlnKSB7XG4gICAgICAgIGlmICh3ZWVrZGF5U3RyKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBSZXBsYWNlIHRoZSB2YW5pbGxhIEpTIERhdGUgb2JqZWN0IHdpdGggYW4gaW5kZXBlbmRlbnQgZGF5LW9mLXdlZWsgY2hlY2suXG4gICAgICAgICAgICB2YXIgd2Vla2RheVByb3ZpZGVkID0gZGVmYXVsdExvY2FsZVdlZWtkYXlzU2hvcnQuaW5kZXhPZih3ZWVrZGF5U3RyKSxcbiAgICAgICAgICAgICAgICB3ZWVrZGF5QWN0dWFsID0gbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZElucHV0WzBdLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRJbnB1dFsxXSxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkSW5wdXRbMl1cbiAgICAgICAgICAgICAgICApLmdldERheSgpO1xuICAgICAgICAgICAgaWYgKHdlZWtkYXlQcm92aWRlZCAhPT0gd2Vla2RheUFjdHVhbCkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLndlZWtkYXlNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZU9mZnNldChvYnNPZmZzZXQsIG1pbGl0YXJ5T2Zmc2V0LCBudW1PZmZzZXQpIHtcbiAgICAgICAgaWYgKG9ic09mZnNldCkge1xuICAgICAgICAgICAgcmV0dXJuIG9ic09mZnNldHNbb2JzT2Zmc2V0XTtcbiAgICAgICAgfSBlbHNlIGlmIChtaWxpdGFyeU9mZnNldCkge1xuICAgICAgICAgICAgLy8gdGhlIG9ubHkgYWxsb3dlZCBtaWxpdGFyeSB0eiBpcyBaXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBobSA9IHBhcnNlSW50KG51bU9mZnNldCwgMTApLFxuICAgICAgICAgICAgICAgIG0gPSBobSAlIDEwMCxcbiAgICAgICAgICAgICAgICBoID0gKGhtIC0gbSkgLyAxMDA7XG4gICAgICAgICAgICByZXR1cm4gaCAqIDYwICsgbTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgYW5kIHRpbWUgZnJvbSByZWYgMjgyMiBmb3JtYXRcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tUkZDMjgyMihjb25maWcpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gcmZjMjgyMi5leGVjKHByZXByb2Nlc3NSRkMyODIyKGNvbmZpZy5faSkpLFxuICAgICAgICAgICAgcGFyc2VkQXJyYXk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgcGFyc2VkQXJyYXkgPSBleHRyYWN0RnJvbVJGQzI4MjJTdHJpbmdzKFxuICAgICAgICAgICAgICAgIG1hdGNoWzRdLFxuICAgICAgICAgICAgICAgIG1hdGNoWzNdLFxuICAgICAgICAgICAgICAgIG1hdGNoWzJdLFxuICAgICAgICAgICAgICAgIG1hdGNoWzVdLFxuICAgICAgICAgICAgICAgIG1hdGNoWzZdLFxuICAgICAgICAgICAgICAgIG1hdGNoWzddXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFjaGVja1dlZWtkYXkobWF0Y2hbMV0sIHBhcnNlZEFycmF5LCBjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25maWcuX2EgPSBwYXJzZWRBcnJheTtcbiAgICAgICAgICAgIGNvbmZpZy5fdHptID0gY2FsY3VsYXRlT2Zmc2V0KG1hdGNoWzhdLCBtYXRjaFs5XSwgbWF0Y2hbMTBdKTtcblxuICAgICAgICAgICAgY29uZmlnLl9kID0gY3JlYXRlVVRDRGF0ZS5hcHBseShudWxsLCBjb25maWcuX2EpO1xuICAgICAgICAgICAgY29uZmlnLl9kLnNldFVUQ01pbnV0ZXMoY29uZmlnLl9kLmdldFVUQ01pbnV0ZXMoKSAtIGNvbmZpZy5fdHptKTtcblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykucmZjMjgyMiA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgZnJvbSAxKSBBU1AuTkVULCAyKSBJU08sIDMpIFJGQyAyODIyIGZvcm1hdHMsIG9yIDQpIG9wdGlvbmFsIGZhbGxiYWNrIGlmIHBhcnNpbmcgaXNuJ3Qgc3RyaWN0XG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZyhjb25maWcpIHtcbiAgICAgICAgdmFyIG1hdGNoZWQgPSBhc3BOZXRKc29uUmVnZXguZXhlYyhjb25maWcuX2kpO1xuICAgICAgICBpZiAobWF0Y2hlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoK21hdGNoZWRbMV0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnRnJvbUlTTyhjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLl9pc1ZhbGlkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5faXNWYWxpZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuX2lzVmFsaWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLl9pc1ZhbGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fc3RyaWN0KSB7XG4gICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZpbmFsIGF0dGVtcHQsIHVzZSBJbnB1dCBGYWxsYmFja1xuICAgICAgICAgICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2soY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrID0gZGVwcmVjYXRlKFxuICAgICAgICAndmFsdWUgcHJvdmlkZWQgaXMgbm90IGluIGEgcmVjb2duaXplZCBSRkMyODIyIG9yIElTTyBmb3JtYXQuIG1vbWVudCBjb25zdHJ1Y3Rpb24gZmFsbHMgYmFjayB0byBqcyBEYXRlKCksICcgK1xuICAgICAgICAgICAgJ3doaWNoIGlzIG5vdCByZWxpYWJsZSBhY3Jvc3MgYWxsIGJyb3dzZXJzIGFuZCB2ZXJzaW9ucy4gTm9uIFJGQzI4MjIvSVNPIGRhdGUgZm9ybWF0cyBhcmUgJyArXG4gICAgICAgICAgICAnZGlzY291cmFnZWQuIFBsZWFzZSByZWZlciB0byBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2pzLWRhdGUvIGZvciBtb3JlIGluZm8uJyxcbiAgICAgICAgZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoY29uZmlnLl9pICsgKGNvbmZpZy5fdXNlVVRDID8gJyBVVEMnIDogJycpKTtcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBQaWNrIHRoZSBmaXJzdCBkZWZpbmVkIG9mIHR3byBvciB0aHJlZSBhcmd1bWVudHMuXG4gICAgZnVuY3Rpb24gZGVmYXVsdHMoYSwgYiwgYykge1xuICAgICAgICBpZiAoYSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjdXJyZW50RGF0ZUFycmF5KGNvbmZpZykge1xuICAgICAgICAvLyBob29rcyBpcyBhY3R1YWxseSB0aGUgZXhwb3J0ZWQgbW9tZW50IG9iamVjdFxuICAgICAgICB2YXIgbm93VmFsdWUgPSBuZXcgRGF0ZShob29rcy5ub3coKSk7XG4gICAgICAgIGlmIChjb25maWcuX3VzZVVUQykge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBub3dWYWx1ZS5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgICAgICAgICAgIG5vd1ZhbHVlLmdldFVUQ01vbnRoKCksXG4gICAgICAgICAgICAgICAgbm93VmFsdWUuZ2V0VVRDRGF0ZSgpLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW25vd1ZhbHVlLmdldEZ1bGxZZWFyKCksIG5vd1ZhbHVlLmdldE1vbnRoKCksIG5vd1ZhbHVlLmdldERhdGUoKV07XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBhbiBhcnJheSB0byBhIGRhdGUuXG4gICAgLy8gdGhlIGFycmF5IHNob3VsZCBtaXJyb3IgdGhlIHBhcmFtZXRlcnMgYmVsb3dcbiAgICAvLyBub3RlOiBhbGwgdmFsdWVzIHBhc3QgdGhlIHllYXIgYXJlIG9wdGlvbmFsIGFuZCB3aWxsIGRlZmF1bHQgdG8gdGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cbiAgICAvLyBbeWVhciwgbW9udGgsIGRheSAsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF1cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tQXJyYXkoY29uZmlnKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGlucHV0ID0gW10sXG4gICAgICAgICAgICBjdXJyZW50RGF0ZSxcbiAgICAgICAgICAgIGV4cGVjdGVkV2Vla2RheSxcbiAgICAgICAgICAgIHllYXJUb1VzZTtcblxuICAgICAgICBpZiAoY29uZmlnLl9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlQXJyYXkoY29uZmlnKTtcblxuICAgICAgICAvL2NvbXB1dGUgZGF5IG9mIHRoZSB5ZWFyIGZyb20gd2Vla3MgYW5kIHdlZWtkYXlzXG4gICAgICAgIGlmIChjb25maWcuX3cgJiYgY29uZmlnLl9hW0RBVEVdID09IG51bGwgJiYgY29uZmlnLl9hW01PTlRIXSA9PSBudWxsKSB7XG4gICAgICAgICAgICBkYXlPZlllYXJGcm9tV2Vla0luZm8oY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vaWYgdGhlIGRheSBvZiB0aGUgeWVhciBpcyBzZXQsIGZpZ3VyZSBvdXQgd2hhdCBpdCBpc1xuICAgICAgICBpZiAoY29uZmlnLl9kYXlPZlllYXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgeWVhclRvVXNlID0gZGVmYXVsdHMoY29uZmlnLl9hW1lFQVJdLCBjdXJyZW50RGF0ZVtZRUFSXSk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjb25maWcuX2RheU9mWWVhciA+IGRheXNJblllYXIoeWVhclRvVXNlKSB8fFxuICAgICAgICAgICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID09PSAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dEYXlPZlllYXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRlID0gY3JlYXRlVVRDRGF0ZSh5ZWFyVG9Vc2UsIDAsIGNvbmZpZy5fZGF5T2ZZZWFyKTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtNT05USF0gPSBkYXRlLmdldFVUQ01vbnRoKCk7XG4gICAgICAgICAgICBjb25maWcuX2FbREFURV0gPSBkYXRlLmdldFVUQ0RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHQgdG8gY3VycmVudCBkYXRlLlxuICAgICAgICAvLyAqIGlmIG5vIHllYXIsIG1vbnRoLCBkYXkgb2YgbW9udGggYXJlIGdpdmVuLCBkZWZhdWx0IHRvIHRvZGF5XG4gICAgICAgIC8vICogaWYgZGF5IG9mIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG1vbnRoIGFuZCB5ZWFyXG4gICAgICAgIC8vICogaWYgbW9udGggaXMgZ2l2ZW4sIGRlZmF1bHQgb25seSB5ZWFyXG4gICAgICAgIC8vICogaWYgeWVhciBpcyBnaXZlbiwgZG9uJ3QgZGVmYXVsdCBhbnl0aGluZ1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMyAmJiBjb25maWcuX2FbaV0gPT0gbnVsbDsgKytpKSB7XG4gICAgICAgICAgICBjb25maWcuX2FbaV0gPSBpbnB1dFtpXSA9IGN1cnJlbnREYXRlW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWmVybyBvdXQgd2hhdGV2ZXIgd2FzIG5vdCBkZWZhdWx0ZWQsIGluY2x1ZGluZyB0aW1lXG4gICAgICAgIGZvciAoOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBjb25maWcuX2FbaV0gPSBpbnB1dFtpXSA9XG4gICAgICAgICAgICAgICAgY29uZmlnLl9hW2ldID09IG51bGwgPyAoaSA9PT0gMiA/IDEgOiAwKSA6IGNvbmZpZy5fYVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGZvciAyNDowMDowMC4wMDBcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID09PSAyNCAmJlxuICAgICAgICAgICAgY29uZmlnLl9hW01JTlVURV0gPT09IDAgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtTRUNPTkRdID09PSAwICYmXG4gICAgICAgICAgICBjb25maWcuX2FbTUlMTElTRUNPTkRdID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uZmlnLl9uZXh0RGF5ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWcuX2QgPSAoY29uZmlnLl91c2VVVEMgPyBjcmVhdGVVVENEYXRlIDogY3JlYXRlRGF0ZSkuYXBwbHkoXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgaW5wdXRcbiAgICAgICAgKTtcbiAgICAgICAgZXhwZWN0ZWRXZWVrZGF5ID0gY29uZmlnLl91c2VVVENcbiAgICAgICAgICAgID8gY29uZmlnLl9kLmdldFVUQ0RheSgpXG4gICAgICAgICAgICA6IGNvbmZpZy5fZC5nZXREYXkoKTtcblxuICAgICAgICAvLyBBcHBseSB0aW1lem9uZSBvZmZzZXQgZnJvbSBpbnB1dC4gVGhlIGFjdHVhbCB1dGNPZmZzZXQgY2FuIGJlIGNoYW5nZWRcbiAgICAgICAgLy8gd2l0aCBwYXJzZVpvbmUuXG4gICAgICAgIGlmIChjb25maWcuX3R6bSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2Quc2V0VVRDTWludXRlcyhjb25maWcuX2QuZ2V0VVRDTWludXRlcygpIC0gY29uZmlnLl90em0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fbmV4dERheSkge1xuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gMjQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBmb3IgbWlzbWF0Y2hpbmcgZGF5IG9mIHdlZWtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29uZmlnLl93ICYmXG4gICAgICAgICAgICB0eXBlb2YgY29uZmlnLl93LmQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICBjb25maWcuX3cuZCAhPT0gZXhwZWN0ZWRXZWVrZGF5XG4gICAgICAgICkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykud2Vla2RheU1pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpIHtcbiAgICAgICAgdmFyIHcsIHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSwgdGVtcCwgd2Vla2RheU92ZXJmbG93LCBjdXJXZWVrO1xuXG4gICAgICAgIHcgPSBjb25maWcuX3c7XG4gICAgICAgIGlmICh3LkdHICE9IG51bGwgfHwgdy5XICE9IG51bGwgfHwgdy5FICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRvdyA9IDE7XG4gICAgICAgICAgICBkb3kgPSA0O1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBXZSBuZWVkIHRvIHRha2UgdGhlIGN1cnJlbnQgaXNvV2Vla1llYXIsIGJ1dCB0aGF0IGRlcGVuZHMgb25cbiAgICAgICAgICAgIC8vIGhvdyB3ZSBpbnRlcnByZXQgbm93IChsb2NhbCwgdXRjLCBmaXhlZCBvZmZzZXQpLiBTbyBjcmVhdGVcbiAgICAgICAgICAgIC8vIGEgbm93IHZlcnNpb24gb2YgY3VycmVudCBjb25maWcgKHRha2UgbG9jYWwvdXRjL29mZnNldCBmbGFncywgYW5kXG4gICAgICAgICAgICAvLyBjcmVhdGUgbm93KS5cbiAgICAgICAgICAgIHdlZWtZZWFyID0gZGVmYXVsdHMoXG4gICAgICAgICAgICAgICAgdy5HRyxcbiAgICAgICAgICAgICAgICBjb25maWcuX2FbWUVBUl0sXG4gICAgICAgICAgICAgICAgd2Vla09mWWVhcihjcmVhdGVMb2NhbCgpLCAxLCA0KS55ZWFyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgd2VlayA9IGRlZmF1bHRzKHcuVywgMSk7XG4gICAgICAgICAgICB3ZWVrZGF5ID0gZGVmYXVsdHMody5FLCAxKTtcbiAgICAgICAgICAgIGlmICh3ZWVrZGF5IDwgMSB8fCB3ZWVrZGF5ID4gNykge1xuICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkb3cgPSBjb25maWcuX2xvY2FsZS5fd2Vlay5kb3c7XG4gICAgICAgICAgICBkb3kgPSBjb25maWcuX2xvY2FsZS5fd2Vlay5kb3k7XG5cbiAgICAgICAgICAgIGN1cldlZWsgPSB3ZWVrT2ZZZWFyKGNyZWF0ZUxvY2FsKCksIGRvdywgZG95KTtcblxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LmdnLCBjb25maWcuX2FbWUVBUl0sIGN1cldlZWsueWVhcik7XG5cbiAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gY3VycmVudCB3ZWVrLlxuICAgICAgICAgICAgd2VlayA9IGRlZmF1bHRzKHcudywgY3VyV2Vlay53ZWVrKTtcblxuICAgICAgICAgICAgaWYgKHcuZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gd2Vla2RheSAtLSBsb3cgZGF5IG51bWJlcnMgYXJlIGNvbnNpZGVyZWQgbmV4dCB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZDtcbiAgICAgICAgICAgICAgICBpZiAod2Vla2RheSA8IDAgfHwgd2Vla2RheSA+IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHcuZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gbG9jYWwgd2Vla2RheSAtLSBjb3VudGluZyBzdGFydHMgZnJvbSBiZWdpbm5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSB3LmUgKyBkb3c7XG4gICAgICAgICAgICAgICAgaWYgKHcuZSA8IDAgfHwgdy5lID4gNikge1xuICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBiZWdpbm5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSBkb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdlZWsgPCAxIHx8IHdlZWsgPiB3ZWVrc0luWWVhcih3ZWVrWWVhciwgZG93LCBkb3kpKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAod2Vla2RheU92ZXJmbG93ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd1dlZWtkYXkgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGVtcCA9IGRheU9mWWVhckZyb21XZWVrcyh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpO1xuICAgICAgICAgICAgY29uZmlnLl9hW1lFQVJdID0gdGVtcC55ZWFyO1xuICAgICAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0ZW1wLmRheU9mWWVhcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0YW50IHRoYXQgcmVmZXJzIHRvIHRoZSBJU08gc3RhbmRhcmRcbiAgICBob29rcy5JU09fODYwMSA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gY29uc3RhbnQgdGhhdCByZWZlcnMgdG8gdGhlIFJGQyAyODIyIGZvcm1cbiAgICBob29rcy5SRkNfMjgyMiA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gZGF0ZSBmcm9tIHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZ1xuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyB0byBhbm90aGVyIHBhcnQgb2YgdGhlIGNyZWF0aW9uIGZsb3cgdG8gcHJldmVudCBjaXJjdWxhciBkZXBzXG4gICAgICAgIGlmIChjb25maWcuX2YgPT09IGhvb2tzLklTT184NjAxKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5fZiA9PT0gaG9va3MuUkZDXzI4MjIpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uZmlnLl9hID0gW107XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVtcHR5ID0gdHJ1ZTtcblxuICAgICAgICAvLyBUaGlzIGFycmF5IGlzIHVzZWQgdG8gbWFrZSBhIERhdGUsIGVpdGhlciB3aXRoIGBuZXcgRGF0ZWAgb3IgYERhdGUuVVRDYFxuICAgICAgICB2YXIgc3RyaW5nID0gJycgKyBjb25maWcuX2ksXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgcGFyc2VkSW5wdXQsXG4gICAgICAgICAgICB0b2tlbnMsXG4gICAgICAgICAgICB0b2tlbixcbiAgICAgICAgICAgIHNraXBwZWQsXG4gICAgICAgICAgICBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxQYXJzZWRJbnB1dExlbmd0aCA9IDAsXG4gICAgICAgICAgICBlcmE7XG5cbiAgICAgICAgdG9rZW5zID1cbiAgICAgICAgICAgIGV4cGFuZEZvcm1hdChjb25maWcuX2YsIGNvbmZpZy5fbG9jYWxlKS5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKSB8fCBbXTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1tpXTtcbiAgICAgICAgICAgIHBhcnNlZElucHV0ID0gKHN0cmluZy5tYXRjaChnZXRQYXJzZVJlZ2V4Rm9yVG9rZW4odG9rZW4sIGNvbmZpZykpIHx8XG4gICAgICAgICAgICAgICAgW10pWzBdO1xuICAgICAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgc2tpcHBlZCA9IHN0cmluZy5zdWJzdHIoMCwgc3RyaW5nLmluZGV4T2YocGFyc2VkSW5wdXQpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcHBlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZElucHV0LnB1c2goc2tpcHBlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nLmluZGV4T2YocGFyc2VkSW5wdXQpICsgcGFyc2VkSW5wdXQubGVuZ3RoXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoICs9IHBhcnNlZElucHV0Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGRvbid0IHBhcnNlIGlmIGl0J3Mgbm90IGEga25vd24gdG9rZW5cbiAgICAgICAgICAgIGlmIChmb3JtYXRUb2tlbkZ1bmN0aW9uc1t0b2tlbl0pIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZW1wdHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBwYXJzZWRJbnB1dCwgY29uZmlnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLl9zdHJpY3QgJiYgIXBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkVG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIHJlbWFpbmluZyB1bnBhcnNlZCBpbnB1dCBsZW5ndGggdG8gdGhlIHN0cmluZ1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5jaGFyc0xlZnRPdmVyID1cbiAgICAgICAgICAgIHN0cmluZ0xlbmd0aCAtIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGg7XG4gICAgICAgIGlmIChzdHJpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkSW5wdXQucHVzaChzdHJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xlYXIgXzEyaCBmbGFnIGlmIGhvdXIgaXMgPD0gMTJcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdIDw9IDEyICYmXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID09PSB0cnVlICYmXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPiAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnBhcnNlZERhdGVQYXJ0cyA9IGNvbmZpZy5fYS5zbGljZSgwKTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykubWVyaWRpZW0gPSBjb25maWcuX21lcmlkaWVtO1xuICAgICAgICAvLyBoYW5kbGUgbWVyaWRpZW1cbiAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gbWVyaWRpZW1GaXhXcmFwKFxuICAgICAgICAgICAgY29uZmlnLl9sb2NhbGUsXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0sXG4gICAgICAgICAgICBjb25maWcuX21lcmlkaWVtXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gaGFuZGxlIGVyYVxuICAgICAgICBlcmEgPSBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lcmE7XG4gICAgICAgIGlmIChlcmEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtZRUFSXSA9IGNvbmZpZy5fbG9jYWxlLmVyYXNDb252ZXJ0WWVhcihlcmEsIGNvbmZpZy5fYVtZRUFSXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICAgICAgY2hlY2tPdmVyZmxvdyhjb25maWcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtRml4V3JhcChsb2NhbGUsIGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgIHZhciBpc1BtO1xuXG4gICAgICAgIGlmIChtZXJpZGllbSA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvXG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxlLm1lcmlkaWVtSG91ciAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLm1lcmlkaWVtSG91cihob3VyLCBtZXJpZGllbSk7XG4gICAgICAgIH0gZWxzZSBpZiAobG9jYWxlLmlzUE0gIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2tcbiAgICAgICAgICAgIGlzUG0gPSBsb2NhbGUuaXNQTShtZXJpZGllbSk7XG4gICAgICAgICAgICBpZiAoaXNQbSAmJiBob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyICs9IDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc1BtICYmIGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlblxuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBhcnJheSBvZiBmb3JtYXQgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmdBbmRBcnJheShjb25maWcpIHtcbiAgICAgICAgdmFyIHRlbXBDb25maWcsXG4gICAgICAgICAgICBiZXN0TW9tZW50LFxuICAgICAgICAgICAgc2NvcmVUb0JlYXQsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgY3VycmVudFNjb3JlLFxuICAgICAgICAgICAgdmFsaWRGb3JtYXRGb3VuZCxcbiAgICAgICAgICAgIGJlc3RGb3JtYXRJc1ZhbGlkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fZi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRGb3JtYXQgPSB0cnVlO1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWcuX2YubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSA9IDA7XG4gICAgICAgICAgICB2YWxpZEZvcm1hdEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICB0ZW1wQ29uZmlnID0gY29weUNvbmZpZyh7fSwgY29uZmlnKTtcbiAgICAgICAgICAgIGlmIChjb25maWcuX3VzZVVUQyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGVtcENvbmZpZy5fdXNlVVRDID0gY29uZmlnLl91c2VVVEM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZW1wQ29uZmlnLl9mID0gY29uZmlnLl9mW2ldO1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdCh0ZW1wQ29uZmlnKTtcblxuICAgICAgICAgICAgaWYgKGlzVmFsaWQodGVtcENvbmZpZykpIHtcbiAgICAgICAgICAgICAgICB2YWxpZEZvcm1hdEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW55IGlucHV0IHRoYXQgd2FzIG5vdCBwYXJzZWQgYWRkIGEgcGVuYWx0eSBmb3IgdGhhdCBmb3JtYXRcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykuY2hhcnNMZWZ0T3ZlcjtcblxuICAgICAgICAgICAgLy9vciB0b2tlbnNcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykudW51c2VkVG9rZW5zLmxlbmd0aCAqIDEwO1xuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykuc2NvcmUgPSBjdXJyZW50U2NvcmU7XG5cbiAgICAgICAgICAgIGlmICghYmVzdEZvcm1hdElzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHNjb3JlVG9CZWF0ID09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNjb3JlIDwgc2NvcmVUb0JlYXQgfHxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRGb3JtYXRGb3VuZFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBzY29yZVRvQmVhdCA9IGN1cnJlbnRTY29yZTtcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vbWVudCA9IHRlbXBDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZEZvcm1hdEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0Rm9ybWF0SXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U2NvcmUgPCBzY29yZVRvQmVhdCkge1xuICAgICAgICAgICAgICAgICAgICBzY29yZVRvQmVhdCA9IGN1cnJlbnRTY29yZTtcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vbWVudCA9IHRlbXBDb25maWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZXh0ZW5kKGNvbmZpZywgYmVzdE1vbWVudCB8fCB0ZW1wQ29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tT2JqZWN0KGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnLl9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGNvbmZpZy5faSksXG4gICAgICAgICAgICBkYXlPckRhdGUgPSBpLmRheSA9PT0gdW5kZWZpbmVkID8gaS5kYXRlIDogaS5kYXk7XG4gICAgICAgIGNvbmZpZy5fYSA9IG1hcChcbiAgICAgICAgICAgIFtpLnllYXIsIGkubW9udGgsIGRheU9yRGF0ZSwgaS5ob3VyLCBpLm1pbnV0ZSwgaS5zZWNvbmQsIGkubWlsbGlzZWNvbmRdLFxuICAgICAgICAgICAgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmogJiYgcGFyc2VJbnQob2JqLCAxMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlRnJvbUNvbmZpZyhjb25maWcpIHtcbiAgICAgICAgdmFyIHJlcyA9IG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhwcmVwYXJlQ29uZmlnKGNvbmZpZykpKTtcbiAgICAgICAgaWYgKHJlcy5fbmV4dERheSkge1xuICAgICAgICAgICAgLy8gQWRkaW5nIGlzIHNtYXJ0IGVub3VnaCBhcm91bmQgRFNUXG4gICAgICAgICAgICByZXMuYWRkKDEsICdkJyk7XG4gICAgICAgICAgICByZXMuX25leHREYXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZXBhcmVDb25maWcoY29uZmlnKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIGZvcm1hdCA9IGNvbmZpZy5fZjtcblxuICAgICAgICBjb25maWcuX2xvY2FsZSA9IGNvbmZpZy5fbG9jYWxlIHx8IGdldExvY2FsZShjb25maWcuX2wpO1xuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCAoZm9ybWF0ID09PSB1bmRlZmluZWQgJiYgaW5wdXQgPT09ICcnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoeyBudWxsSW5wdXQ6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uZmlnLl9pID0gaW5wdXQgPSBjb25maWcuX2xvY2FsZS5wcmVwYXJzZShpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNNb21lbnQoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vbWVudChjaGVja092ZXJmbG93KGlucHV0KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gaW5wdXQ7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShmb3JtYXQpKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kQXJyYXkoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21JbnB1dChjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkKGNvbmZpZykpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21JbnB1dChjb25maWcpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gY29uZmlnLl9pO1xuICAgICAgICBpZiAoaXNVbmRlZmluZWQoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShob29rcy5ub3coKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaW5wdXQudmFsdWVPZigpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nKGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IG1hcChpbnB1dC5zbGljZSgwKSwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChvYmosIDEwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tT2JqZWN0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICAvLyBmcm9tIG1pbGxpc2Vjb25kc1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2soY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIGlzVVRDKSB7XG4gICAgICAgIHZhciBjID0ge307XG5cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gdHJ1ZSB8fCBmb3JtYXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBzdHJpY3QgPSBmb3JtYXQ7XG4gICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9jYWxlID09PSB0cnVlIHx8IGxvY2FsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHN0cmljdCA9IGxvY2FsZTtcbiAgICAgICAgICAgIGxvY2FsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChpc09iamVjdChpbnB1dCkgJiYgaXNPYmplY3RFbXB0eShpbnB1dCkpIHx8XG4gICAgICAgICAgICAoaXNBcnJheShpbnB1dCkgJiYgaW5wdXQubGVuZ3RoID09PSAwKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlucHV0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIG9iamVjdCBjb25zdHJ1Y3Rpb24gbXVzdCBiZSBkb25lIHRoaXMgd2F5LlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTQyM1xuICAgICAgICBjLl9pc0FNb21lbnRPYmplY3QgPSB0cnVlO1xuICAgICAgICBjLl91c2VVVEMgPSBjLl9pc1VUQyA9IGlzVVRDO1xuICAgICAgICBjLl9sID0gbG9jYWxlO1xuICAgICAgICBjLl9pID0gaW5wdXQ7XG4gICAgICAgIGMuX2YgPSBmb3JtYXQ7XG4gICAgICAgIGMuX3N0cmljdCA9IHN0cmljdDtcblxuICAgICAgICByZXR1cm4gY3JlYXRlRnJvbUNvbmZpZyhjKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVMb2NhbChpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWxPclVUQyhpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHZhciBwcm90b3R5cGVNaW4gPSBkZXByZWNhdGUoXG4gICAgICAgICAgICAnbW9tZW50KCkubWluIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWF4IGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC8nLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIgPCB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBwcm90b3R5cGVNYXggPSBkZXByZWNhdGUoXG4gICAgICAgICAgICAnbW9tZW50KCkubWF4IGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWluIGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC8nLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIgPiB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgLy8gUGljayBhIG1vbWVudCBtIGZyb20gbW9tZW50cyBzbyB0aGF0IG1bZm5dKG90aGVyKSBpcyB0cnVlIGZvciBhbGxcbiAgICAvLyBvdGhlci4gVGhpcyByZWxpZXMgb24gdGhlIGZ1bmN0aW9uIGZuIHRvIGJlIHRyYW5zaXRpdmUuXG4gICAgLy9cbiAgICAvLyBtb21lbnRzIHNob3VsZCBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgbW9tZW50IG9iamVjdHMgb3IgYW4gYXJyYXksIHdob3NlXG4gICAgLy8gZmlyc3QgZWxlbWVudCBpcyBhbiBhcnJheSBvZiBtb21lbnQgb2JqZWN0cy5cbiAgICBmdW5jdGlvbiBwaWNrQnkoZm4sIG1vbWVudHMpIHtcbiAgICAgICAgdmFyIHJlcywgaTtcbiAgICAgICAgaWYgKG1vbWVudHMubGVuZ3RoID09PSAxICYmIGlzQXJyYXkobW9tZW50c1swXSkpIHtcbiAgICAgICAgICAgIG1vbWVudHMgPSBtb21lbnRzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW9tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVMb2NhbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJlcyA9IG1vbWVudHNbMF07XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBtb21lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoIW1vbWVudHNbaV0uaXNWYWxpZCgpIHx8IG1vbWVudHNbaV1bZm5dKHJlcykpIHtcbiAgICAgICAgICAgICAgICByZXMgPSBtb21lbnRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogVXNlIFtdLnNvcnQgaW5zdGVhZD9cbiAgICBmdW5jdGlvbiBtaW4oKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgICAgIHJldHVybiBwaWNrQnkoJ2lzQmVmb3JlJywgYXJncyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF4KCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgICAgICByZXR1cm4gcGlja0J5KCdpc0FmdGVyJywgYXJncyk7XG4gICAgfVxuXG4gICAgdmFyIG5vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIERhdGUubm93ID8gRGF0ZS5ub3coKSA6ICtuZXcgRGF0ZSgpO1xuICAgIH07XG5cbiAgICB2YXIgb3JkZXJpbmcgPSBbXG4gICAgICAgICd5ZWFyJyxcbiAgICAgICAgJ3F1YXJ0ZXInLFxuICAgICAgICAnbW9udGgnLFxuICAgICAgICAnd2VlaycsXG4gICAgICAgICdkYXknLFxuICAgICAgICAnaG91cicsXG4gICAgICAgICdtaW51dGUnLFxuICAgICAgICAnc2Vjb25kJyxcbiAgICAgICAgJ21pbGxpc2Vjb25kJyxcbiAgICBdO1xuXG4gICAgZnVuY3Rpb24gaXNEdXJhdGlvblZhbGlkKG0pIHtcbiAgICAgICAgdmFyIGtleSxcbiAgICAgICAgICAgIHVuaXRIYXNEZWNpbWFsID0gZmFsc2UsXG4gICAgICAgICAgICBpO1xuICAgICAgICBmb3IgKGtleSBpbiBtKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaGFzT3duUHJvcChtLCBrZXkpICYmXG4gICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhPZi5jYWxsKG9yZGVyaW5nLCBrZXkpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAobVtrZXldID09IG51bGwgfHwgIWlzTmFOKG1ba2V5XSkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG9yZGVyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAobVtvcmRlcmluZ1tpXV0pIHtcbiAgICAgICAgICAgICAgICBpZiAodW5pdEhhc0RlY2ltYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBvbmx5IGFsbG93IG5vbi1pbnRlZ2VycyBmb3Igc21hbGxlc3QgdW5pdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChtW29yZGVyaW5nW2ldXSkgIT09IHRvSW50KG1bb3JkZXJpbmdbaV1dKSkge1xuICAgICAgICAgICAgICAgICAgICB1bml0SGFzRGVjaW1hbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZCQxKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNWYWxpZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkJDEoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbihOYU4pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIER1cmF0aW9uKGR1cmF0aW9uKSB7XG4gICAgICAgIHZhciBub3JtYWxpemVkSW5wdXQgPSBub3JtYWxpemVPYmplY3RVbml0cyhkdXJhdGlvbiksXG4gICAgICAgICAgICB5ZWFycyA9IG5vcm1hbGl6ZWRJbnB1dC55ZWFyIHx8IDAsXG4gICAgICAgICAgICBxdWFydGVycyA9IG5vcm1hbGl6ZWRJbnB1dC5xdWFydGVyIHx8IDAsXG4gICAgICAgICAgICBtb250aHMgPSBub3JtYWxpemVkSW5wdXQubW9udGggfHwgMCxcbiAgICAgICAgICAgIHdlZWtzID0gbm9ybWFsaXplZElucHV0LndlZWsgfHwgbm9ybWFsaXplZElucHV0Lmlzb1dlZWsgfHwgMCxcbiAgICAgICAgICAgIGRheXMgPSBub3JtYWxpemVkSW5wdXQuZGF5IHx8IDAsXG4gICAgICAgICAgICBob3VycyA9IG5vcm1hbGl6ZWRJbnB1dC5ob3VyIHx8IDAsXG4gICAgICAgICAgICBtaW51dGVzID0gbm9ybWFsaXplZElucHV0Lm1pbnV0ZSB8fCAwLFxuICAgICAgICAgICAgc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5zZWNvbmQgfHwgMCxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5taWxsaXNlY29uZCB8fCAwO1xuXG4gICAgICAgIHRoaXMuX2lzVmFsaWQgPSBpc0R1cmF0aW9uVmFsaWQobm9ybWFsaXplZElucHV0KTtcblxuICAgICAgICAvLyByZXByZXNlbnRhdGlvbiBmb3IgZGF0ZUFkZFJlbW92ZVxuICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgPVxuICAgICAgICAgICAgK21pbGxpc2Vjb25kcyArXG4gICAgICAgICAgICBzZWNvbmRzICogMWUzICsgLy8gMTAwMFxuICAgICAgICAgICAgbWludXRlcyAqIDZlNCArIC8vIDEwMDAgKiA2MFxuICAgICAgICAgICAgaG91cnMgKiAxMDAwICogNjAgKiA2MDsgLy91c2luZyAxMDAwICogNjAgKiA2MCBpbnN0ZWFkIG9mIDM2ZTUgdG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3JzIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yOTc4XG4gICAgICAgIC8vIEJlY2F1c2Ugb2YgZGF0ZUFkZFJlbW92ZSB0cmVhdHMgMjQgaG91cnMgYXMgZGlmZmVyZW50IGZyb20gYVxuICAgICAgICAvLyBkYXkgd2hlbiB3b3JraW5nIGFyb3VuZCBEU1QsIHdlIG5lZWQgdG8gc3RvcmUgdGhlbSBzZXBhcmF0ZWx5XG4gICAgICAgIHRoaXMuX2RheXMgPSArZGF5cyArIHdlZWtzICogNztcbiAgICAgICAgLy8gSXQgaXMgaW1wb3NzaWJsZSB0byB0cmFuc2xhdGUgbW9udGhzIGludG8gZGF5cyB3aXRob3V0IGtub3dpbmdcbiAgICAgICAgLy8gd2hpY2ggbW9udGhzIHlvdSBhcmUgYXJlIHRhbGtpbmcgYWJvdXQsIHNvIHdlIGhhdmUgdG8gc3RvcmVcbiAgICAgICAgLy8gaXQgc2VwYXJhdGVseS5cbiAgICAgICAgdGhpcy5fbW9udGhzID0gK21vbnRocyArIHF1YXJ0ZXJzICogMyArIHllYXJzICogMTI7XG5cbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuXG4gICAgICAgIHRoaXMuX2xvY2FsZSA9IGdldExvY2FsZSgpO1xuXG4gICAgICAgIHRoaXMuX2J1YmJsZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRHVyYXRpb24ob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEdXJhdGlvbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNSb3VuZChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKC0xICogbnVtYmVyKSAqIC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbXBhcmUgdHdvIGFycmF5cywgcmV0dXJuIHRoZSBudW1iZXIgb2YgZGlmZmVyZW5jZXNcbiAgICBmdW5jdGlvbiBjb21wYXJlQXJyYXlzKGFycmF5MSwgYXJyYXkyLCBkb250Q29udmVydCkge1xuICAgICAgICB2YXIgbGVuID0gTWF0aC5taW4oYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCksXG4gICAgICAgICAgICBsZW5ndGhEaWZmID0gTWF0aC5hYnMoYXJyYXkxLmxlbmd0aCAtIGFycmF5Mi5sZW5ndGgpLFxuICAgICAgICAgICAgZGlmZnMgPSAwLFxuICAgICAgICAgICAgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKGRvbnRDb252ZXJ0ICYmIGFycmF5MVtpXSAhPT0gYXJyYXkyW2ldKSB8fFxuICAgICAgICAgICAgICAgICghZG9udENvbnZlcnQgJiYgdG9JbnQoYXJyYXkxW2ldKSAhPT0gdG9JbnQoYXJyYXkyW2ldKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGRpZmZzKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpZmZzICsgbGVuZ3RoRGlmZjtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBmdW5jdGlvbiBvZmZzZXQodG9rZW4sIHNlcGFyYXRvcikge1xuICAgICAgICBhZGRGb3JtYXRUb2tlbih0b2tlbiwgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMudXRjT2Zmc2V0KCksXG4gICAgICAgICAgICAgICAgc2lnbiA9ICcrJztcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDtcbiAgICAgICAgICAgICAgICBzaWduID0gJy0nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBzaWduICtcbiAgICAgICAgICAgICAgICB6ZXJvRmlsbCh+fihvZmZzZXQgLyA2MCksIDIpICtcbiAgICAgICAgICAgICAgICBzZXBhcmF0b3IgK1xuICAgICAgICAgICAgICAgIHplcm9GaWxsKH5+b2Zmc2V0ICUgNjAsIDIpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvZmZzZXQoJ1onLCAnOicpO1xuICAgIG9mZnNldCgnWlonLCAnJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdaJywgbWF0Y2hTaG9ydE9mZnNldCk7XG4gICAgYWRkUmVnZXhUb2tlbignWlonLCBtYXRjaFNob3J0T2Zmc2V0KTtcbiAgICBhZGRQYXJzZVRva2VuKFsnWicsICdaWiddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl91c2VVVEMgPSB0cnVlO1xuICAgICAgICBjb25maWcuX3R6bSA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hTaG9ydE9mZnNldCwgaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gdGltZXpvbmUgY2h1bmtlclxuICAgIC8vICcrMTA6MDAnID4gWycxMCcsICAnMDAnXVxuICAgIC8vICctMTUzMCcgID4gWyctMTUnLCAnMzAnXVxuICAgIHZhciBjaHVua09mZnNldCA9IC8oW1xcK1xcLV18XFxkXFxkKS9naTtcblxuICAgIGZ1bmN0aW9uIG9mZnNldEZyb21TdHJpbmcobWF0Y2hlciwgc3RyaW5nKSB7XG4gICAgICAgIHZhciBtYXRjaGVzID0gKHN0cmluZyB8fCAnJykubWF0Y2gobWF0Y2hlciksXG4gICAgICAgICAgICBjaHVuayxcbiAgICAgICAgICAgIHBhcnRzLFxuICAgICAgICAgICAgbWludXRlcztcblxuICAgICAgICBpZiAobWF0Y2hlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjaHVuayA9IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXSB8fCBbXTtcbiAgICAgICAgcGFydHMgPSAoY2h1bmsgKyAnJykubWF0Y2goY2h1bmtPZmZzZXQpIHx8IFsnLScsIDAsIDBdO1xuICAgICAgICBtaW51dGVzID0gKyhwYXJ0c1sxXSAqIDYwKSArIHRvSW50KHBhcnRzWzJdKTtcblxuICAgICAgICByZXR1cm4gbWludXRlcyA9PT0gMCA/IDAgOiBwYXJ0c1swXSA9PT0gJysnID8gbWludXRlcyA6IC1taW51dGVzO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBhIG1vbWVudCBmcm9tIGlucHV0LCB0aGF0IGlzIGxvY2FsL3V0Yy96b25lIGVxdWl2YWxlbnQgdG8gbW9kZWwuXG4gICAgZnVuY3Rpb24gY2xvbmVXaXRoT2Zmc2V0KGlucHV0LCBtb2RlbCkge1xuICAgICAgICB2YXIgcmVzLCBkaWZmO1xuICAgICAgICBpZiAobW9kZWwuX2lzVVRDKSB7XG4gICAgICAgICAgICByZXMgPSBtb2RlbC5jbG9uZSgpO1xuICAgICAgICAgICAgZGlmZiA9XG4gICAgICAgICAgICAgICAgKGlzTW9tZW50KGlucHV0KSB8fCBpc0RhdGUoaW5wdXQpXG4gICAgICAgICAgICAgICAgICAgID8gaW5wdXQudmFsdWVPZigpXG4gICAgICAgICAgICAgICAgICAgIDogY3JlYXRlTG9jYWwoaW5wdXQpLnZhbHVlT2YoKSkgLSByZXMudmFsdWVPZigpO1xuICAgICAgICAgICAgLy8gVXNlIGxvdy1sZXZlbCBhcGksIGJlY2F1c2UgdGhpcyBmbiBpcyBsb3ctbGV2ZWwgYXBpLlxuICAgICAgICAgICAgcmVzLl9kLnNldFRpbWUocmVzLl9kLnZhbHVlT2YoKSArIGRpZmYpO1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHJlcywgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVMb2NhbChpbnB1dCkubG9jYWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERhdGVPZmZzZXQobSkge1xuICAgICAgICAvLyBPbiBGaXJlZm94LjI0IERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyBhIGZsb2F0aW5nIHBvaW50LlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9wdWxsLzE4NzFcbiAgICAgICAgcmV0dXJuIC1NYXRoLnJvdW5kKG0uX2QuZ2V0VGltZXpvbmVPZmZzZXQoKSk7XG4gICAgfVxuXG4gICAgLy8gSE9PS1NcblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBtb21lbnQgaXMgbXV0YXRlZC5cbiAgICAvLyBJdCBpcyBpbnRlbmRlZCB0byBrZWVwIHRoZSBvZmZzZXQgaW4gc3luYyB3aXRoIHRoZSB0aW1lem9uZS5cbiAgICBob29rcy51cGRhdGVPZmZzZXQgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIC8vIGtlZXBMb2NhbFRpbWUgPSB0cnVlIG1lYW5zIG9ubHkgY2hhbmdlIHRoZSB0aW1lem9uZSwgd2l0aG91dFxuICAgIC8vIGFmZmVjdGluZyB0aGUgbG9jYWwgaG91ci4gU28gNTozMToyNiArMDMwMCAtLVt1dGNPZmZzZXQoMiwgdHJ1ZSldLS0+XG4gICAgLy8gNTozMToyNiArMDIwMCBJdCBpcyBwb3NzaWJsZSB0aGF0IDU6MzE6MjYgZG9lc24ndCBleGlzdCB3aXRoIG9mZnNldFxuICAgIC8vICswMjAwLCBzbyB3ZSBhZGp1c3QgdGhlIHRpbWUgYXMgbmVlZGVkLCB0byBiZSB2YWxpZC5cbiAgICAvL1xuICAgIC8vIEtlZXBpbmcgdGhlIHRpbWUgYWN0dWFsbHkgYWRkcy9zdWJ0cmFjdHMgKG9uZSBob3VyKVxuICAgIC8vIGZyb20gdGhlIGFjdHVhbCByZXByZXNlbnRlZCB0aW1lLiBUaGF0IGlzIHdoeSB3ZSBjYWxsIHVwZGF0ZU9mZnNldFxuICAgIC8vIGEgc2Vjb25kIHRpbWUuIEluIGNhc2UgaXQgd2FudHMgdXMgdG8gY2hhbmdlIHRoZSBvZmZzZXQgYWdhaW5cbiAgICAvLyBfY2hhbmdlSW5Qcm9ncmVzcyA9PSB0cnVlIGNhc2UsIHRoZW4gd2UgaGF2ZSB0byBhZGp1c3QsIGJlY2F1c2VcbiAgICAvLyB0aGVyZSBpcyBubyBzdWNoIHRpbWUgaW4gdGhlIGdpdmVuIHRpbWV6b25lLlxuICAgIGZ1bmN0aW9uIGdldFNldE9mZnNldChpbnB1dCwga2VlcExvY2FsVGltZSwga2VlcE1pbnV0ZXMpIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMuX29mZnNldCB8fCAwLFxuICAgICAgICAgICAgbG9jYWxBZGp1c3Q7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hTaG9ydE9mZnNldCwgaW5wdXQpO1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGlucHV0KSA8IDE2ICYmICFrZWVwTWludXRlcykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQgKiA2MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5faXNVVEMgJiYga2VlcExvY2FsVGltZSkge1xuICAgICAgICAgICAgICAgIGxvY2FsQWRqdXN0ID0gZ2V0RGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX29mZnNldCA9IGlucHV0O1xuICAgICAgICAgICAgdGhpcy5faXNVVEMgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGxvY2FsQWRqdXN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZChsb2NhbEFkanVzdCwgJ20nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvZmZzZXQgIT09IGlucHV0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZWVwTG9jYWxUaW1lIHx8IHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkU3VidHJhY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRHVyYXRpb24oaW5wdXQgLSBvZmZzZXQsICdtJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9jaGFuZ2VJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gb2Zmc2V0IDogZ2V0RGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldFpvbmUoaW5wdXQsIGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSAtaW5wdXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KGlucHV0LCBrZWVwTG9jYWxUaW1lKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gLXRoaXMudXRjT2Zmc2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb1VUQyhrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb0xvY2FsKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzVVRDKSB7XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbiAgICAgICAgICAgIHRoaXMuX2lzVVRDID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJ0cmFjdChnZXREYXRlT2Zmc2V0KHRoaXMpLCAnbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvUGFyc2VkT2Zmc2V0KCkge1xuICAgICAgICBpZiAodGhpcy5fdHptICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KHRoaXMuX3R6bSwgZmFsc2UsIHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9pID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFyIHRab25lID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaE9mZnNldCwgdGhpcy5faSk7XG4gICAgICAgICAgICBpZiAodFpvbmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KHRab25lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoMCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFzQWxpZ25lZEhvdXJPZmZzZXQoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0ID0gaW5wdXQgPyBjcmVhdGVMb2NhbChpbnB1dCkudXRjT2Zmc2V0KCkgOiAwO1xuXG4gICAgICAgIHJldHVybiAodGhpcy51dGNPZmZzZXQoKSAtIGlucHV0KSAlIDYwID09PSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRGF5bGlnaHRTYXZpbmdUaW1lKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoKSA+IHRoaXMuY2xvbmUoKS5tb250aCgwKS51dGNPZmZzZXQoKSB8fFxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoKSA+IHRoaXMuY2xvbmUoKS5tb250aCg1KS51dGNPZmZzZXQoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRGF5bGlnaHRTYXZpbmdUaW1lU2hpZnRlZCgpIHtcbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9pc0RTVFNoaWZ0ZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGMgPSB7fSxcbiAgICAgICAgICAgIG90aGVyO1xuXG4gICAgICAgIGNvcHlDb25maWcoYywgdGhpcyk7XG4gICAgICAgIGMgPSBwcmVwYXJlQ29uZmlnKGMpO1xuXG4gICAgICAgIGlmIChjLl9hKSB7XG4gICAgICAgICAgICBvdGhlciA9IGMuX2lzVVRDID8gY3JlYXRlVVRDKGMuX2EpIDogY3JlYXRlTG9jYWwoYy5fYSk7XG4gICAgICAgICAgICB0aGlzLl9pc0RTVFNoaWZ0ZWQgPVxuICAgICAgICAgICAgICAgIHRoaXMuaXNWYWxpZCgpICYmIGNvbXBhcmVBcnJheXMoYy5fYSwgb3RoZXIudG9BcnJheSgpKSA+IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pc0RTVFNoaWZ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNMb2NhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gIXRoaXMuX2lzVVRDIDogZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVdGNPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMuX2lzVVRDIDogZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVdGMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMuX2lzVVRDICYmIHRoaXMuX29mZnNldCA9PT0gMCA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEFTUC5ORVQganNvbiBkYXRlIGZvcm1hdCByZWdleFxuICAgIHZhciBhc3BOZXRSZWdleCA9IC9eKC18XFwrKT8oPzooXFxkKilbLiBdKT8oXFxkKyk6KFxcZCspKD86OihcXGQrKShcXC5cXGQqKT8pPyQvLFxuICAgICAgICAvLyBmcm9tIGh0dHA6Ly9kb2NzLmNsb3N1cmUtbGlicmFyeS5nb29nbGVjb2RlLmNvbS9naXQvY2xvc3VyZV9nb29nX2RhdGVfZGF0ZS5qcy5zb3VyY2UuaHRtbFxuICAgICAgICAvLyBzb21ld2hhdCBtb3JlIGluIGxpbmUgd2l0aCA0LjQuMy4yIDIwMDQgc3BlYywgYnV0IGFsbG93cyBkZWNpbWFsIGFueXdoZXJlXG4gICAgICAgIC8vIGFuZCBmdXJ0aGVyIG1vZGlmaWVkIHRvIGFsbG93IGZvciBzdHJpbmdzIGNvbnRhaW5pbmcgYm90aCB3ZWVrIGFuZCBkYXlcbiAgICAgICAgaXNvUmVnZXggPSAvXigtfFxcKyk/UCg/OihbLStdP1swLTksLl0qKVkpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVcpPyg/OihbLStdP1swLTksLl0qKUQpPyg/OlQoPzooWy0rXT9bMC05LC5dKilIKT8oPzooWy0rXT9bMC05LC5dKilNKT8oPzooWy0rXT9bMC05LC5dKilTKT8pPyQvO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlRHVyYXRpb24oaW5wdXQsIGtleSkge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBpbnB1dCxcbiAgICAgICAgICAgIC8vIG1hdGNoaW5nIGFnYWluc3QgcmVnZXhwIGlzIGV4cGVuc2l2ZSwgZG8gaXQgb24gZGVtYW5kXG4gICAgICAgICAgICBtYXRjaCA9IG51bGwsXG4gICAgICAgICAgICBzaWduLFxuICAgICAgICAgICAgcmV0LFxuICAgICAgICAgICAgZGlmZlJlcztcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkpIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIG1zOiBpbnB1dC5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgICAgIGQ6IGlucHV0Ll9kYXlzLFxuICAgICAgICAgICAgICAgIE06IGlucHV0Ll9tb250aHMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSB8fCAhaXNOYU4oK2lucHV0KSkge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbltrZXldID0gK2lucHV0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbi5taWxsaXNlY29uZHMgPSAraW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoKG1hdGNoID0gYXNwTmV0UmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgICAgICBzaWduID0gbWF0Y2hbMV0gPT09ICctJyA/IC0xIDogMTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICAgICAgZDogdG9JbnQobWF0Y2hbREFURV0pICogc2lnbixcbiAgICAgICAgICAgICAgICBoOiB0b0ludChtYXRjaFtIT1VSXSkgKiBzaWduLFxuICAgICAgICAgICAgICAgIG06IHRvSW50KG1hdGNoW01JTlVURV0pICogc2lnbixcbiAgICAgICAgICAgICAgICBzOiB0b0ludChtYXRjaFtTRUNPTkRdKSAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbXM6IHRvSW50KGFic1JvdW5kKG1hdGNoW01JTExJU0VDT05EXSAqIDEwMDApKSAqIHNpZ24sIC8vIHRoZSBtaWxsaXNlY29uZCBkZWNpbWFsIHBvaW50IGlzIGluY2x1ZGVkIGluIHRoZSBtYXRjaFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICgobWF0Y2ggPSBpc29SZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgICAgIHNpZ24gPSBtYXRjaFsxXSA9PT0gJy0nID8gLTEgOiAxO1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeTogcGFyc2VJc28obWF0Y2hbMl0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIE06IHBhcnNlSXNvKG1hdGNoWzNdLCBzaWduKSxcbiAgICAgICAgICAgICAgICB3OiBwYXJzZUlzbyhtYXRjaFs0XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgZDogcGFyc2VJc28obWF0Y2hbNV0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIGg6IHBhcnNlSXNvKG1hdGNoWzZdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBtOiBwYXJzZUlzbyhtYXRjaFs3XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgczogcGFyc2VJc28obWF0Y2hbOF0sIHNpZ24pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChkdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGR1cmF0aW9uID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgKCdmcm9tJyBpbiBkdXJhdGlvbiB8fCAndG8nIGluIGR1cmF0aW9uKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGRpZmZSZXMgPSBtb21lbnRzRGlmZmVyZW5jZShcbiAgICAgICAgICAgICAgICBjcmVhdGVMb2NhbChkdXJhdGlvbi5mcm9tKSxcbiAgICAgICAgICAgICAgICBjcmVhdGVMb2NhbChkdXJhdGlvbi50bylcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgICAgICBkdXJhdGlvbi5tcyA9IGRpZmZSZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgZHVyYXRpb24uTSA9IGRpZmZSZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0ID0gbmV3IER1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkgJiYgaGFzT3duUHJvcChpbnB1dCwgJ19sb2NhbGUnKSkge1xuICAgICAgICAgICAgcmV0Ll9sb2NhbGUgPSBpbnB1dC5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpICYmIGhhc093blByb3AoaW5wdXQsICdfaXNWYWxpZCcpKSB7XG4gICAgICAgICAgICByZXQuX2lzVmFsaWQgPSBpbnB1dC5faXNWYWxpZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgY3JlYXRlRHVyYXRpb24uZm4gPSBEdXJhdGlvbi5wcm90b3R5cGU7XG4gICAgY3JlYXRlRHVyYXRpb24uaW52YWxpZCA9IGNyZWF0ZUludmFsaWQkMTtcblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvKGlucCwgc2lnbikge1xuICAgICAgICAvLyBXZSdkIG5vcm1hbGx5IHVzZSB+fmlucCBmb3IgdGhpcywgYnV0IHVuZm9ydHVuYXRlbHkgaXQgYWxzb1xuICAgICAgICAvLyBjb252ZXJ0cyBmbG9hdHMgdG8gaW50cy5cbiAgICAgICAgLy8gaW5wIG1heSBiZSB1bmRlZmluZWQsIHNvIGNhcmVmdWwgY2FsbGluZyByZXBsYWNlIG9uIGl0LlxuICAgICAgICB2YXIgcmVzID0gaW5wICYmIHBhcnNlRmxvYXQoaW5wLnJlcGxhY2UoJywnLCAnLicpKTtcbiAgICAgICAgLy8gYXBwbHkgc2lnbiB3aGlsZSB3ZSdyZSBhdCBpdFxuICAgICAgICByZXR1cm4gKGlzTmFOKHJlcykgPyAwIDogcmVzKSAqIHNpZ247XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcikge1xuICAgICAgICB2YXIgcmVzID0ge307XG5cbiAgICAgICAgcmVzLm1vbnRocyA9XG4gICAgICAgICAgICBvdGhlci5tb250aCgpIC0gYmFzZS5tb250aCgpICsgKG90aGVyLnllYXIoKSAtIGJhc2UueWVhcigpKSAqIDEyO1xuICAgICAgICBpZiAoYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpLmlzQWZ0ZXIob3RoZXIpKSB7XG4gICAgICAgICAgICAtLXJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXMubWlsbGlzZWNvbmRzID0gK290aGVyIC0gK2Jhc2UuY2xvbmUoKS5hZGQocmVzLm1vbnRocywgJ00nKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXM7XG4gICAgICAgIGlmICghKGJhc2UuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1pbGxpc2Vjb25kczogMCwgbW9udGhzOiAwIH07XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlciA9IGNsb25lV2l0aE9mZnNldChvdGhlciwgYmFzZSk7XG4gICAgICAgIGlmIChiYXNlLmlzQmVmb3JlKG90aGVyKSkge1xuICAgICAgICAgICAgcmVzID0gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKG90aGVyLCBiYXNlKTtcbiAgICAgICAgICAgIHJlcy5taWxsaXNlY29uZHMgPSAtcmVzLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIHJlcy5tb250aHMgPSAtcmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogcmVtb3ZlICduYW1lJyBhcmcgYWZ0ZXIgZGVwcmVjYXRpb24gaXMgcmVtb3ZlZFxuICAgIGZ1bmN0aW9uIGNyZWF0ZUFkZGVyKGRpcmVjdGlvbiwgbmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbCwgcGVyaW9kKSB7XG4gICAgICAgICAgICB2YXIgZHVyLCB0bXA7XG4gICAgICAgICAgICAvL2ludmVydCB0aGUgYXJndW1lbnRzLCBidXQgY29tcGxhaW4gYWJvdXQgaXRcbiAgICAgICAgICAgIGlmIChwZXJpb2QgIT09IG51bGwgJiYgIWlzTmFOKCtwZXJpb2QpKSB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRlU2ltcGxlKFxuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAnbW9tZW50KCkuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcocGVyaW9kLCBudW1iZXIpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgbW9tZW50KCkuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcobnVtYmVyLCBwZXJpb2QpLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9hZGQtaW52ZXJ0ZWQtcGFyYW0vIGZvciBtb3JlIGluZm8uJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdG1wID0gdmFsO1xuICAgICAgICAgICAgICAgIHZhbCA9IHBlcmlvZDtcbiAgICAgICAgICAgICAgICBwZXJpb2QgPSB0bXA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGR1ciA9IGNyZWF0ZUR1cmF0aW9uKHZhbCwgcGVyaW9kKTtcbiAgICAgICAgICAgIGFkZFN1YnRyYWN0KHRoaXMsIGR1ciwgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFN1YnRyYWN0KG1vbSwgZHVyYXRpb24sIGlzQWRkaW5nLCB1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IGR1cmF0aW9uLl9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICBkYXlzID0gYWJzUm91bmQoZHVyYXRpb24uX2RheXMpLFxuICAgICAgICAgICAgbW9udGhzID0gYWJzUm91bmQoZHVyYXRpb24uX21vbnRocyk7XG5cbiAgICAgICAgaWYgKCFtb20uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBObyBvcFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlT2Zmc2V0ID0gdXBkYXRlT2Zmc2V0ID09IG51bGwgPyB0cnVlIDogdXBkYXRlT2Zmc2V0O1xuXG4gICAgICAgIGlmIChtb250aHMpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKG1vbSwgZ2V0KG1vbSwgJ01vbnRoJykgKyBtb250aHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheXMpIHtcbiAgICAgICAgICAgIHNldCQxKG1vbSwgJ0RhdGUnLCBnZXQobW9tLCAnRGF0ZScpICsgZGF5cyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWlsbGlzZWNvbmRzKSB7XG4gICAgICAgICAgICBtb20uX2Quc2V0VGltZShtb20uX2QudmFsdWVPZigpICsgbWlsbGlzZWNvbmRzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldChtb20sIGRheXMgfHwgbW9udGhzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhZGQgPSBjcmVhdGVBZGRlcigxLCAnYWRkJyksXG4gICAgICAgIHN1YnRyYWN0ID0gY3JlYXRlQWRkZXIoLTEsICdzdWJ0cmFjdCcpO1xuXG4gICAgZnVuY3Rpb24gaXNTdHJpbmcoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gdHlwZSBNb21lbnRJbnB1dCA9IE1vbWVudCB8IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCAobnVtYmVyIHwgc3RyaW5nKVtdIHwgTW9tZW50SW5wdXRPYmplY3QgfCB2b2lkOyAvLyBudWxsIHwgdW5kZWZpbmVkXG4gICAgZnVuY3Rpb24gaXNNb21lbnRJbnB1dChpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaXNNb21lbnQoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc0RhdGUoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc1N0cmluZyhpbnB1dCkgfHxcbiAgICAgICAgICAgIGlzTnVtYmVyKGlucHV0KSB8fFxuICAgICAgICAgICAgaXNOdW1iZXJPclN0cmluZ0FycmF5KGlucHV0KSB8fFxuICAgICAgICAgICAgaXNNb21lbnRJbnB1dE9iamVjdChpbnB1dCkgfHxcbiAgICAgICAgICAgIGlucHV0ID09PSBudWxsIHx8XG4gICAgICAgICAgICBpbnB1dCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNNb21lbnRJbnB1dE9iamVjdChpbnB1dCkge1xuICAgICAgICB2YXIgb2JqZWN0VGVzdCA9IGlzT2JqZWN0KGlucHV0KSAmJiAhaXNPYmplY3RFbXB0eShpbnB1dCksXG4gICAgICAgICAgICBwcm9wZXJ0eVRlc3QgPSBmYWxzZSxcbiAgICAgICAgICAgIHByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAgICAgJ3llYXJzJyxcbiAgICAgICAgICAgICAgICAneWVhcicsXG4gICAgICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgICAgICdtb250aHMnLFxuICAgICAgICAgICAgICAgICdtb250aCcsXG4gICAgICAgICAgICAgICAgJ00nLFxuICAgICAgICAgICAgICAgICdkYXlzJyxcbiAgICAgICAgICAgICAgICAnZGF5JyxcbiAgICAgICAgICAgICAgICAnZCcsXG4gICAgICAgICAgICAgICAgJ2RhdGVzJyxcbiAgICAgICAgICAgICAgICAnZGF0ZScsXG4gICAgICAgICAgICAgICAgJ0QnLFxuICAgICAgICAgICAgICAgICdob3VycycsXG4gICAgICAgICAgICAgICAgJ2hvdXInLFxuICAgICAgICAgICAgICAgICdoJyxcbiAgICAgICAgICAgICAgICAnbWludXRlcycsXG4gICAgICAgICAgICAgICAgJ21pbnV0ZScsXG4gICAgICAgICAgICAgICAgJ20nLFxuICAgICAgICAgICAgICAgICdzZWNvbmRzJyxcbiAgICAgICAgICAgICAgICAnc2Vjb25kJyxcbiAgICAgICAgICAgICAgICAncycsXG4gICAgICAgICAgICAgICAgJ21pbGxpc2Vjb25kcycsXG4gICAgICAgICAgICAgICAgJ21pbGxpc2Vjb25kJyxcbiAgICAgICAgICAgICAgICAnbXMnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBwcm9wZXJ0eTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgcHJvcGVydHlUZXN0ID0gcHJvcGVydHlUZXN0IHx8IGhhc093blByb3AoaW5wdXQsIHByb3BlcnR5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvYmplY3RUZXN0ICYmIHByb3BlcnR5VGVzdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc051bWJlck9yU3RyaW5nQXJyYXkoaW5wdXQpIHtcbiAgICAgICAgdmFyIGFycmF5VGVzdCA9IGlzQXJyYXkoaW5wdXQpLFxuICAgICAgICAgICAgZGF0YVR5cGVUZXN0ID0gZmFsc2U7XG4gICAgICAgIGlmIChhcnJheVRlc3QpIHtcbiAgICAgICAgICAgIGRhdGFUeXBlVGVzdCA9XG4gICAgICAgICAgICAgICAgaW5wdXQuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhaXNOdW1iZXIoaXRlbSkgJiYgaXNTdHJpbmcoaW5wdXQpO1xuICAgICAgICAgICAgICAgIH0pLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXlUZXN0ICYmIGRhdGFUeXBlVGVzdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0NhbGVuZGFyU3BlYyhpbnB1dCkge1xuICAgICAgICB2YXIgb2JqZWN0VGVzdCA9IGlzT2JqZWN0KGlucHV0KSAmJiAhaXNPYmplY3RFbXB0eShpbnB1dCksXG4gICAgICAgICAgICBwcm9wZXJ0eVRlc3QgPSBmYWxzZSxcbiAgICAgICAgICAgIHByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAgICAgJ3NhbWVEYXknLFxuICAgICAgICAgICAgICAgICduZXh0RGF5JyxcbiAgICAgICAgICAgICAgICAnbGFzdERheScsXG4gICAgICAgICAgICAgICAgJ25leHRXZWVrJyxcbiAgICAgICAgICAgICAgICAnbGFzdFdlZWsnLFxuICAgICAgICAgICAgICAgICdzYW1lRWxzZScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHByb3BlcnR5O1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV07XG4gICAgICAgICAgICBwcm9wZXJ0eVRlc3QgPSBwcm9wZXJ0eVRlc3QgfHwgaGFzT3duUHJvcChpbnB1dCwgcHJvcGVydHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9iamVjdFRlc3QgJiYgcHJvcGVydHlUZXN0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldENhbGVuZGFyRm9ybWF0KG15TW9tZW50LCBub3cpIHtcbiAgICAgICAgdmFyIGRpZmYgPSBteU1vbWVudC5kaWZmKG5vdywgJ2RheXMnLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGRpZmYgPCAtNlxuICAgICAgICAgICAgPyAnc2FtZUVsc2UnXG4gICAgICAgICAgICA6IGRpZmYgPCAtMVxuICAgICAgICAgICAgPyAnbGFzdFdlZWsnXG4gICAgICAgICAgICA6IGRpZmYgPCAwXG4gICAgICAgICAgICA/ICdsYXN0RGF5J1xuICAgICAgICAgICAgOiBkaWZmIDwgMVxuICAgICAgICAgICAgPyAnc2FtZURheSdcbiAgICAgICAgICAgIDogZGlmZiA8IDJcbiAgICAgICAgICAgID8gJ25leHREYXknXG4gICAgICAgICAgICA6IGRpZmYgPCA3XG4gICAgICAgICAgICA/ICduZXh0V2VlaydcbiAgICAgICAgICAgIDogJ3NhbWVFbHNlJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxlbmRhciQxKHRpbWUsIGZvcm1hdHMpIHtcbiAgICAgICAgLy8gU3VwcG9ydCBmb3Igc2luZ2xlIHBhcmFtZXRlciwgZm9ybWF0cyBvbmx5IG92ZXJsb2FkIHRvIHRoZSBjYWxlbmRhciBmdW5jdGlvblxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKCFhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICB0aW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvcm1hdHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzTW9tZW50SW5wdXQoYXJndW1lbnRzWzBdKSkge1xuICAgICAgICAgICAgICAgIHRpbWUgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICAgICAgZm9ybWF0cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDYWxlbmRhclNwZWMoYXJndW1lbnRzWzBdKSkge1xuICAgICAgICAgICAgICAgIGZvcm1hdHMgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICAgICAgdGltZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBXZSB3YW50IHRvIGNvbXBhcmUgdGhlIHN0YXJ0IG9mIHRvZGF5LCB2cyB0aGlzLlxuICAgICAgICAvLyBHZXR0aW5nIHN0YXJ0LW9mLXRvZGF5IGRlcGVuZHMgb24gd2hldGhlciB3ZSdyZSBsb2NhbC91dGMvb2Zmc2V0IG9yIG5vdC5cbiAgICAgICAgdmFyIG5vdyA9IHRpbWUgfHwgY3JlYXRlTG9jYWwoKSxcbiAgICAgICAgICAgIHNvZCA9IGNsb25lV2l0aE9mZnNldChub3csIHRoaXMpLnN0YXJ0T2YoJ2RheScpLFxuICAgICAgICAgICAgZm9ybWF0ID0gaG9va3MuY2FsZW5kYXJGb3JtYXQodGhpcywgc29kKSB8fCAnc2FtZUVsc2UnLFxuICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICBmb3JtYXRzICYmXG4gICAgICAgICAgICAgICAgKGlzRnVuY3Rpb24oZm9ybWF0c1tmb3JtYXRdKVxuICAgICAgICAgICAgICAgICAgICA/IGZvcm1hdHNbZm9ybWF0XS5jYWxsKHRoaXMsIG5vdylcbiAgICAgICAgICAgICAgICAgICAgOiBmb3JtYXRzW2Zvcm1hdF0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChcbiAgICAgICAgICAgIG91dHB1dCB8fCB0aGlzLmxvY2FsZURhdGEoKS5jYWxlbmRhcihmb3JtYXQsIHRoaXMsIGNyZWF0ZUxvY2FsKG5vdykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9tZW50KHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQWZ0ZXIoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpID4gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxJbnB1dC52YWx1ZU9mKCkgPCB0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNCZWZvcmUoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpIDwgbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmVuZE9mKHVuaXRzKS52YWx1ZU9mKCkgPCBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQmV0d2Vlbihmcm9tLCB0bywgdW5pdHMsIGluY2x1c2l2aXR5KSB7XG4gICAgICAgIHZhciBsb2NhbEZyb20gPSBpc01vbWVudChmcm9tKSA/IGZyb20gOiBjcmVhdGVMb2NhbChmcm9tKSxcbiAgICAgICAgICAgIGxvY2FsVG8gPSBpc01vbWVudCh0bykgPyB0byA6IGNyZWF0ZUxvY2FsKHRvKTtcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxGcm9tLmlzVmFsaWQoKSAmJiBsb2NhbFRvLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpbmNsdXNpdml0eSA9IGluY2x1c2l2aXR5IHx8ICcoKSc7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoaW5jbHVzaXZpdHlbMF0gPT09ICcoJ1xuICAgICAgICAgICAgICAgID8gdGhpcy5pc0FmdGVyKGxvY2FsRnJvbSwgdW5pdHMpXG4gICAgICAgICAgICAgICAgOiAhdGhpcy5pc0JlZm9yZShsb2NhbEZyb20sIHVuaXRzKSkgJiZcbiAgICAgICAgICAgIChpbmNsdXNpdml0eVsxXSA9PT0gJyknXG4gICAgICAgICAgICAgICAgPyB0aGlzLmlzQmVmb3JlKGxvY2FsVG8sIHVuaXRzKVxuICAgICAgICAgICAgICAgIDogIXRoaXMuaXNBZnRlcihsb2NhbFRvLCB1bml0cykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpLFxuICAgICAgICAgICAgaW5wdXRNcztcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cykgfHwgJ21pbGxpc2Vjb25kJztcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPT09IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXRNcyA9IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykudmFsdWVPZigpIDw9IGlucHV0TXMgJiZcbiAgICAgICAgICAgICAgICBpbnB1dE1zIDw9IHRoaXMuY2xvbmUoKS5lbmRPZih1bml0cykudmFsdWVPZigpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lT3JBZnRlcihpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTYW1lKGlucHV0LCB1bml0cykgfHwgdGhpcy5pc0FmdGVyKGlucHV0LCB1bml0cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lT3JCZWZvcmUoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNCZWZvcmUoaW5wdXQsIHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkaWZmKGlucHV0LCB1bml0cywgYXNGbG9hdCkge1xuICAgICAgICB2YXIgdGhhdCwgem9uZURlbHRhLCBvdXRwdXQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoYXQgPSBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIHRoaXMpO1xuXG4gICAgICAgIGlmICghdGhhdC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB6b25lRGVsdGEgPSAodGhhdC51dGNPZmZzZXQoKSAtIHRoaXMudXRjT2Zmc2V0KCkpICogNmU0O1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KSAvIDEyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KSAvIDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyAxZTM7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIDEwMDBcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDZlNDtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gMzZlNTtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gMTAwMCAqIDYwICogNjBcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRoaXMgLSB0aGF0IC0gem9uZURlbHRhKSAvIDg2NGU1O1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyAxMDAwICogNjAgKiA2MCAqIDI0LCBuZWdhdGUgZHN0XG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodGhpcyAtIHRoYXQgLSB6b25lRGVsdGEpIC8gNjA0OGU1O1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyAxMDAwICogNjAgKiA2MCAqIDI0ICogNywgbmVnYXRlIGRzdFxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSB0aGlzIC0gdGhhdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhc0Zsb2F0ID8gb3V0cHV0IDogYWJzRmxvb3Iob3V0cHV0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb250aERpZmYoYSwgYikge1xuICAgICAgICBpZiAoYS5kYXRlKCkgPCBiLmRhdGUoKSkge1xuICAgICAgICAgICAgLy8gZW5kLW9mLW1vbnRoIGNhbGN1bGF0aW9ucyB3b3JrIGNvcnJlY3Qgd2hlbiB0aGUgc3RhcnQgbW9udGggaGFzIG1vcmVcbiAgICAgICAgICAgIC8vIGRheXMgdGhhbiB0aGUgZW5kIG1vbnRoLlxuICAgICAgICAgICAgcmV0dXJuIC1tb250aERpZmYoYiwgYSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGlmZmVyZW5jZSBpbiBtb250aHNcbiAgICAgICAgdmFyIHdob2xlTW9udGhEaWZmID0gKGIueWVhcigpIC0gYS55ZWFyKCkpICogMTIgKyAoYi5tb250aCgpIC0gYS5tb250aCgpKSxcbiAgICAgICAgICAgIC8vIGIgaXMgaW4gKGFuY2hvciAtIDEgbW9udGgsIGFuY2hvciArIDEgbW9udGgpXG4gICAgICAgICAgICBhbmNob3IgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmLCAnbW9udGhzJyksXG4gICAgICAgICAgICBhbmNob3IyLFxuICAgICAgICAgICAgYWRqdXN0O1xuXG4gICAgICAgIGlmIChiIC0gYW5jaG9yIDwgMCkge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgLSAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvciAtIGFuY2hvcjIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgKyAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvcjIgLSBhbmNob3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBmb3IgbmVnYXRpdmUgemVybywgcmV0dXJuIHplcm8gaWYgbmVnYXRpdmUgemVyb1xuICAgICAgICByZXR1cm4gLSh3aG9sZU1vbnRoRGlmZiArIGFkanVzdCkgfHwgMDtcbiAgICB9XG5cbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0ID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0VXRjID0gJ1lZWVktTU0tRERUSEg6bW06c3NbWl0nO1xuXG4gICAgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkubG9jYWxlKCdlbicpLmZvcm1hdCgnZGRkIE1NTSBERCBZWVlZIEhIOm1tOnNzIFtHTVRdWlonKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0lTT1N0cmluZyhrZWVwT2Zmc2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciB1dGMgPSBrZWVwT2Zmc2V0ICE9PSB0cnVlLFxuICAgICAgICAgICAgbSA9IHV0YyA/IHRoaXMuY2xvbmUoKS51dGMoKSA6IHRoaXM7XG4gICAgICAgIGlmIChtLnllYXIoKSA8IDAgfHwgbS55ZWFyKCkgPiA5OTk5KSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KFxuICAgICAgICAgICAgICAgIG0sXG4gICAgICAgICAgICAgICAgdXRjXG4gICAgICAgICAgICAgICAgICAgID8gJ1lZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXSdcbiAgICAgICAgICAgICAgICAgICAgOiAnWVlZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTWidcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpKSB7XG4gICAgICAgICAgICAvLyBuYXRpdmUgaW1wbGVtZW50YXRpb24gaXMgfjUweCBmYXN0ZXIsIHVzZSBpdCB3aGVuIHdlIGNhblxuICAgICAgICAgICAgaWYgKHV0Yykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSArIHRoaXMudXRjT2Zmc2V0KCkgKiA2MCAqIDEwMDApXG4gICAgICAgICAgICAgICAgICAgIC50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCdaJywgZm9ybWF0TW9tZW50KG0sICdaJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtYXRNb21lbnQoXG4gICAgICAgICAgICBtLFxuICAgICAgICAgICAgdXRjID8gJ1lZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nIDogJ1lZWVktTU0tRERbVF1ISDptbTpzcy5TU1NaJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9tZW50IHRoYXQgY2FuXG4gICAgICogYWxzbyBiZSBldmFsdWF0ZWQgdG8gZ2V0IGEgbmV3IG1vbWVudCB3aGljaCBpcyB0aGUgc2FtZVxuICAgICAqXG4gICAgICogQGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0L2RvY3MvYXBpL3V0aWwuaHRtbCN1dGlsX2N1c3RvbV9pbnNwZWN0X2Z1bmN0aW9uX29uX29iamVjdHNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ21vbWVudC5pbnZhbGlkKC8qICcgKyB0aGlzLl9pICsgJyAqLyknO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmdW5jID0gJ21vbWVudCcsXG4gICAgICAgICAgICB6b25lID0gJycsXG4gICAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgICB5ZWFyLFxuICAgICAgICAgICAgZGF0ZXRpbWUsXG4gICAgICAgICAgICBzdWZmaXg7XG4gICAgICAgIGlmICghdGhpcy5pc0xvY2FsKCkpIHtcbiAgICAgICAgICAgIGZ1bmMgPSB0aGlzLnV0Y09mZnNldCgpID09PSAwID8gJ21vbWVudC51dGMnIDogJ21vbWVudC5wYXJzZVpvbmUnO1xuICAgICAgICAgICAgem9uZSA9ICdaJztcbiAgICAgICAgfVxuICAgICAgICBwcmVmaXggPSAnWycgKyBmdW5jICsgJyhcIl0nO1xuICAgICAgICB5ZWFyID0gMCA8PSB0aGlzLnllYXIoKSAmJiB0aGlzLnllYXIoKSA8PSA5OTk5ID8gJ1lZWVknIDogJ1lZWVlZWSc7XG4gICAgICAgIGRhdGV0aW1lID0gJy1NTS1ERFtUXUhIOm1tOnNzLlNTUyc7XG4gICAgICAgIHN1ZmZpeCA9IHpvbmUgKyAnW1wiKV0nO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChwcmVmaXggKyB5ZWFyICsgZGF0ZXRpbWUgKyBzdWZmaXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZvcm1hdChpbnB1dFN0cmluZykge1xuICAgICAgICBpZiAoIWlucHV0U3RyaW5nKSB7XG4gICAgICAgICAgICBpbnB1dFN0cmluZyA9IHRoaXMuaXNVdGMoKVxuICAgICAgICAgICAgICAgID8gaG9va3MuZGVmYXVsdEZvcm1hdFV0Y1xuICAgICAgICAgICAgICAgIDogaG9va3MuZGVmYXVsdEZvcm1hdDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3V0cHV0ID0gZm9ybWF0TW9tZW50KHRoaXMsIGlucHV0U3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLnBvc3Rmb3JtYXQob3V0cHV0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmcm9tKHRpbWUsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8IGNyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oeyB0bzogdGhpcywgZnJvbTogdGltZSB9KVxuICAgICAgICAgICAgICAgIC5sb2NhbGUodGhpcy5sb2NhbGUoKSlcbiAgICAgICAgICAgICAgICAuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmcm9tTm93KHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbShjcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0byh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCgpICYmXG4gICAgICAgICAgICAoKGlzTW9tZW50KHRpbWUpICYmIHRpbWUuaXNWYWxpZCgpKSB8fCBjcmVhdGVMb2NhbCh0aW1lKS5pc1ZhbGlkKCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKHsgZnJvbTogdGhpcywgdG86IHRpbWUgfSlcbiAgICAgICAgICAgICAgICAubG9jYWxlKHRoaXMubG9jYWxlKCkpXG4gICAgICAgICAgICAgICAgLmh1bWFuaXplKCF3aXRob3V0U3VmZml4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9Ob3cod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy50byhjcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG5cbiAgICAvLyBJZiBwYXNzZWQgYSBsb2NhbGUga2V5LCBpdCB3aWxsIHNldCB0aGUgbG9jYWxlIGZvciB0aGlzXG4gICAgLy8gaW5zdGFuY2UuICBPdGhlcndpc2UsIGl0IHdpbGwgcmV0dXJuIHRoZSBsb2NhbGUgY29uZmlndXJhdGlvblxuICAgIC8vIHZhcmlhYmxlcyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICBmdW5jdGlvbiBsb2NhbGUoa2V5KSB7XG4gICAgICAgIHZhciBuZXdMb2NhbGVEYXRhO1xuXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZS5fYWJicjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0xvY2FsZURhdGEgPSBnZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChuZXdMb2NhbGVEYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSBuZXdMb2NhbGVEYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbGFuZyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudCgpLmxhbmcoKSBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgbW9tZW50KCkubG9jYWxlRGF0YSgpIHRvIGdldCB0aGUgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbi4gVXNlIG1vbWVudCgpLmxvY2FsZSgpIHRvIGNoYW5nZSBsYW5ndWFnZXMuJyxcbiAgICAgICAgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICAgIH1cblxuICAgIHZhciBNU19QRVJfU0VDT05EID0gMTAwMCxcbiAgICAgICAgTVNfUEVSX01JTlVURSA9IDYwICogTVNfUEVSX1NFQ09ORCxcbiAgICAgICAgTVNfUEVSX0hPVVIgPSA2MCAqIE1TX1BFUl9NSU5VVEUsXG4gICAgICAgIE1TX1BFUl80MDBfWUVBUlMgPSAoMzY1ICogNDAwICsgOTcpICogMjQgKiBNU19QRVJfSE9VUjtcblxuICAgIC8vIGFjdHVhbCBtb2R1bG8gLSBoYW5kbGVzIG5lZ2F0aXZlIG51bWJlcnMgKGZvciBkYXRlcyBiZWZvcmUgMTk3MCk6XG4gICAgZnVuY3Rpb24gbW9kJDEoZGl2aWRlbmQsIGRpdmlzb3IpIHtcbiAgICAgICAgcmV0dXJuICgoZGl2aWRlbmQgJSBkaXZpc29yKSArIGRpdmlzb3IpICUgZGl2aXNvcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbFN0YXJ0T2ZEYXRlKHksIG0sIGQpIHtcbiAgICAgICAgLy8gdGhlIGRhdGUgY29uc3RydWN0b3IgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh5ICsgNDAwLCBtLCBkKSAtIE1TX1BFUl80MDBfWUVBUlM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeSwgbSwgZCkudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXRjU3RhcnRPZkRhdGUoeSwgbSwgZCkge1xuICAgICAgICAvLyBEYXRlLlVUQyByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBwcmVzZXJ2ZSBsZWFwIHllYXJzIHVzaW5nIGEgZnVsbCA0MDAgeWVhciBjeWNsZSwgdGhlbiByZXNldFxuICAgICAgICAgICAgcmV0dXJuIERhdGUuVVRDKHkgKyA0MDAsIG0sIGQpIC0gTVNfUEVSXzQwMF9ZRUFSUztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBEYXRlLlVUQyh5LCBtLCBkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0YXJ0T2YodW5pdHMpIHtcbiAgICAgICAgdmFyIHRpbWUsIHN0YXJ0T2ZEYXRlO1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSB1bmRlZmluZWQgfHwgdW5pdHMgPT09ICdtaWxsaXNlY29uZCcgfHwgIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0T2ZEYXRlID0gdGhpcy5faXNVVEMgPyB1dGNTdGFydE9mRGF0ZSA6IGxvY2FsU3RhcnRPZkRhdGU7XG5cbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCAwLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSAtICh0aGlzLm1vbnRoKCkgJSAzKSxcbiAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCksIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGUoKSAtIHRoaXMud2Vla2RheSgpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlKCkgLSAodGhpcy5pc29XZWVrZGF5KCkgLSAxKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCksIHRoaXMuZGF0ZSgpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lIC09IG1vZCQxKFxuICAgICAgICAgICAgICAgICAgICB0aW1lICsgKHRoaXMuX2lzVVRDID8gMCA6IHRoaXMudXRjT2Zmc2V0KCkgKiBNU19QRVJfTUlOVVRFKSxcbiAgICAgICAgICAgICAgICAgICAgTVNfUEVSX0hPVVJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSAtPSBtb2QkMSh0aW1lLCBNU19QRVJfTUlOVVRFKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgLT0gbW9kJDEodGltZSwgTVNfUEVSX1NFQ09ORCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kLnNldFRpbWUodGltZSk7XG4gICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW5kT2YodW5pdHMpIHtcbiAgICAgICAgdmFyIHRpbWUsIHN0YXJ0T2ZEYXRlO1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSB1bmRlZmluZWQgfHwgdW5pdHMgPT09ICdtaWxsaXNlY29uZCcgfHwgIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0T2ZEYXRlID0gdGhpcy5faXNVVEMgPyB1dGNTdGFydE9mRGF0ZSA6IGxvY2FsU3RhcnRPZkRhdGU7XG5cbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpICsgMSwgMCwgMSkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgICAgICAgICAgdGltZSA9XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCkgLSAodGhpcy5tb250aCgpICUgMykgKyAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICApIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSArIDEsIDEpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPVxuICAgICAgICAgICAgICAgICAgICBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlKCkgLSB0aGlzLndlZWtkYXkoKSArIDdcbiAgICAgICAgICAgICAgICAgICAgKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpc29XZWVrJzpcbiAgICAgICAgICAgICAgICB0aW1lID1cbiAgICAgICAgICAgICAgICAgICAgc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgpIC0gKHRoaXMuaXNvV2Vla2RheSgpIC0gMSkgKyA3XG4gICAgICAgICAgICAgICAgICAgICkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSArIDEpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9XG4gICAgICAgICAgICAgICAgICAgIE1TX1BFUl9IT1VSIC1cbiAgICAgICAgICAgICAgICAgICAgbW9kJDEoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lICsgKHRoaXMuX2lzVVRDID8gMCA6IHRoaXMudXRjT2Zmc2V0KCkgKiBNU19QRVJfTUlOVVRFKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE1TX1BFUl9IT1VSXG4gICAgICAgICAgICAgICAgICAgICkgLVxuICAgICAgICAgICAgICAgICAgICAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSArPSBNU19QRVJfTUlOVVRFIC0gbW9kJDEodGltZSwgTVNfUEVSX01JTlVURSkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSArPSBNU19QRVJfU0VDT05EIC0gbW9kJDEodGltZSwgTVNfUEVSX1NFQ09ORCkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZC5zZXRUaW1lKHRpbWUpO1xuICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbHVlT2YoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kLnZhbHVlT2YoKSAtICh0aGlzLl9vZmZzZXQgfHwgMCkgKiA2MDAwMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bml4KCkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKSAvIDEwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvRGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0FycmF5KCkge1xuICAgICAgICB2YXIgbSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBtLnllYXIoKSxcbiAgICAgICAgICAgIG0ubW9udGgoKSxcbiAgICAgICAgICAgIG0uZGF0ZSgpLFxuICAgICAgICAgICAgbS5ob3VyKCksXG4gICAgICAgICAgICBtLm1pbnV0ZSgpLFxuICAgICAgICAgICAgbS5zZWNvbmQoKSxcbiAgICAgICAgICAgIG0ubWlsbGlzZWNvbmQoKSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b09iamVjdCgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeWVhcnM6IG0ueWVhcigpLFxuICAgICAgICAgICAgbW9udGhzOiBtLm1vbnRoKCksXG4gICAgICAgICAgICBkYXRlOiBtLmRhdGUoKSxcbiAgICAgICAgICAgIGhvdXJzOiBtLmhvdXJzKCksXG4gICAgICAgICAgICBtaW51dGVzOiBtLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHNlY29uZHM6IG0uc2Vjb25kcygpLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzOiBtLm1pbGxpc2Vjb25kcygpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgICAgLy8gbmV3IERhdGUoTmFOKS50b0pTT04oKSA9PT0gbnVsbFxuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVmFsaWQkMigpIHtcbiAgICAgICAgcmV0dXJuIGlzVmFsaWQodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2luZ0ZsYWdzKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBnZXRQYXJzaW5nRmxhZ3ModGhpcykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGludmFsaWRBdCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFBhcnNpbmdGbGFncyh0aGlzKS5vdmVyZmxvdztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGlvbkRhdGEoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbnB1dDogdGhpcy5faSxcbiAgICAgICAgICAgIGZvcm1hdDogdGhpcy5fZixcbiAgICAgICAgICAgIGxvY2FsZTogdGhpcy5fbG9jYWxlLFxuICAgICAgICAgICAgaXNVVEM6IHRoaXMuX2lzVVRDLFxuICAgICAgICAgICAgc3RyaWN0OiB0aGlzLl9zdHJpY3QsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ04nLCAwLCAwLCAnZXJhQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdOTicsIDAsIDAsICdlcmFBYmJyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ05OTicsIDAsIDAsICdlcmFBYmJyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ05OTk4nLCAwLCAwLCAnZXJhTmFtZScpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdOTk5OTicsIDAsIDAsICdlcmFOYXJyb3cnKTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCd5JywgWyd5JywgMV0sICd5bycsICdlcmFZZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3knLCBbJ3l5JywgMl0sIDAsICdlcmFZZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3knLCBbJ3l5eScsIDNdLCAwLCAnZXJhWWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd5JywgWyd5eXl5JywgNF0sIDAsICdlcmFZZWFyJyk7XG5cbiAgICBhZGRSZWdleFRva2VuKCdOJywgbWF0Y2hFcmFBYmJyKTtcbiAgICBhZGRSZWdleFRva2VuKCdOTicsIG1hdGNoRXJhQWJicik7XG4gICAgYWRkUmVnZXhUb2tlbignTk5OJywgbWF0Y2hFcmFBYmJyKTtcbiAgICBhZGRSZWdleFRva2VuKCdOTk5OJywgbWF0Y2hFcmFOYW1lKTtcbiAgICBhZGRSZWdleFRva2VuKCdOTk5OTicsIG1hdGNoRXJhTmFycm93KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydOJywgJ05OJywgJ05OTicsICdOTk5OJywgJ05OTk5OJ10sIGZ1bmN0aW9uIChcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIGFycmF5LFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHRva2VuXG4gICAgKSB7XG4gICAgICAgIHZhciBlcmEgPSBjb25maWcuX2xvY2FsZS5lcmFzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIGlmIChlcmEpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVyYSA9IGVyYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRFcmEgPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgYWRkUmVnZXhUb2tlbigneScsIG1hdGNoVW5zaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3l5JywgbWF0Y2hVbnNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbigneXl5JywgbWF0Y2hVbnNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbigneXl5eScsIG1hdGNoVW5zaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3lvJywgbWF0Y2hFcmFZZWFyT3JkaW5hbCk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsneScsICd5eScsICd5eXknLCAneXl5eSddLCBZRUFSKTtcbiAgICBhZGRQYXJzZVRva2VuKFsneW8nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB2YXIgbWF0Y2g7XG4gICAgICAgIGlmIChjb25maWcuX2xvY2FsZS5fZXJhWWVhck9yZGluYWxSZWdleCkge1xuICAgICAgICAgICAgbWF0Y2ggPSBpbnB1dC5tYXRjaChjb25maWcuX2xvY2FsZS5fZXJhWWVhck9yZGluYWxSZWdleCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLl9sb2NhbGUuZXJhWWVhck9yZGluYWxQYXJzZSkge1xuICAgICAgICAgICAgYXJyYXlbWUVBUl0gPSBjb25maWcuX2xvY2FsZS5lcmFZZWFyT3JkaW5hbFBhcnNlKGlucHV0LCBtYXRjaCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcnJheVtZRUFSXSA9IHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZUVyYXMobSwgZm9ybWF0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5fZXJhcyB8fCBnZXRMb2NhbGUoJ2VuJykuX2VyYXM7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgZXJhc1tpXS5zaW5jZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgIC8vIHRydW5jYXRlIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IGhvb2tzKGVyYXNbaV0uc2luY2UpLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgICAgICAgICAgICAgICBlcmFzW2ldLnNpbmNlID0gZGF0ZS52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBlcmFzW2ldLnVudGlsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgICAgICAgICAgICAgZXJhc1tpXS51bnRpbCA9ICtJbmZpbml0eTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgICAgICAgICBkYXRlID0gaG9va3MoZXJhc1tpXS51bnRpbCkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgICAgICBlcmFzW2ldLnVudGlsID0gZGF0ZS52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcmFzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZUVyYXNQYXJzZShlcmFOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5lcmFzKCksXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgYWJicixcbiAgICAgICAgICAgIG5hcnJvdztcbiAgICAgICAgZXJhTmFtZSA9IGVyYU5hbWUudG9VcHBlckNhc2UoKTtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIG5hbWUgPSBlcmFzW2ldLm5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGFiYnIgPSBlcmFzW2ldLmFiYnIudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIG5hcnJvdyA9IGVyYXNbaV0ubmFycm93LnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmIChzdHJpY3QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdOJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTk4nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdOTk4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFiYnIgPT09IGVyYU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ05OTk4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IGVyYU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ05OTk5OJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYXJyb3cgPT09IGVyYU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoW25hbWUsIGFiYnIsIG5hcnJvd10uaW5kZXhPZihlcmFOYW1lKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVFcmFzQ29udmVydFllYXIoZXJhLCB5ZWFyKSB7XG4gICAgICAgIHZhciBkaXIgPSBlcmEuc2luY2UgPD0gZXJhLnVudGlsID8gKzEgOiAtMTtcbiAgICAgICAgaWYgKHllYXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGhvb2tzKGVyYS5zaW5jZSkueWVhcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhvb2tzKGVyYS5zaW5jZSkueWVhcigpICsgKHllYXIgLSBlcmEub2Zmc2V0KSAqIGRpcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEVyYU5hbWUoKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmxvY2FsZURhdGEoKS5lcmFzKCk7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgdmFsID0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcblxuICAgICAgICAgICAgaWYgKGVyYXNbaV0uc2luY2UgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnVudGlsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0ubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnVudGlsIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS5zaW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RXJhTmFycm93KCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5sb2NhbGVEYXRhKCkuZXJhcygpO1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIC8vIHRydW5jYXRlIHRpbWVcbiAgICAgICAgICAgIHZhbCA9IHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKS52YWx1ZU9mKCk7XG5cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnNpbmNlIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS51bnRpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLm5hcnJvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnVudGlsIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS5zaW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLm5hcnJvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRFcmFBYmJyKCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5sb2NhbGVEYXRhKCkuZXJhcygpO1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIC8vIHRydW5jYXRlIHRpbWVcbiAgICAgICAgICAgIHZhbCA9IHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKS52YWx1ZU9mKCk7XG5cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnNpbmNlIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS51bnRpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLmFiYnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJhc1tpXS51bnRpbCA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0uc2luY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXS5hYmJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEVyYVllYXIoKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIGRpcixcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmxvY2FsZURhdGEoKS5lcmFzKCk7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgZGlyID0gZXJhc1tpXS5zaW5jZSA8PSBlcmFzW2ldLnVudGlsID8gKzEgOiAtMTtcblxuICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgdmFsID0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChlcmFzW2ldLnNpbmNlIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS51bnRpbCkgfHxcbiAgICAgICAgICAgICAgICAoZXJhc1tpXS51bnRpbCA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0uc2luY2UpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAodGhpcy55ZWFyKCkgLSBob29rcyhlcmFzW2ldLnNpbmNlKS55ZWFyKCkpICogZGlyICtcbiAgICAgICAgICAgICAgICAgICAgZXJhc1tpXS5vZmZzZXRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMueWVhcigpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVyYXNOYW1lUmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfZXJhc05hbWVSZWdleCcpKSB7XG4gICAgICAgICAgICBjb21wdXRlRXJhc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0ID8gdGhpcy5fZXJhc05hbWVSZWdleCA6IHRoaXMuX2VyYXNSZWdleDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcmFzQWJiclJlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX2VyYXNBYmJyUmVnZXgnKSkge1xuICAgICAgICAgICAgY29tcHV0ZUVyYXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1N0cmljdCA/IHRoaXMuX2VyYXNBYmJyUmVnZXggOiB0aGlzLl9lcmFzUmVnZXg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXJhc05hcnJvd1JlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX2VyYXNOYXJyb3dSZWdleCcpKSB7XG4gICAgICAgICAgICBjb21wdXRlRXJhc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0ID8gdGhpcy5fZXJhc05hcnJvd1JlZ2V4IDogdGhpcy5fZXJhc1JlZ2V4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdGNoRXJhQWJicihpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuZXJhc0FiYnJSZWdleChpc1N0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hFcmFOYW1lKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5lcmFzTmFtZVJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXRjaEVyYU5hcnJvdyhpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuZXJhc05hcnJvd1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXRjaEVyYVllYXJPcmRpbmFsKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5fZXJhWWVhck9yZGluYWxSZWdleCB8fCBtYXRjaFVuc2lnbmVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVFcmFzUGFyc2UoKSB7XG4gICAgICAgIHZhciBhYmJyUGllY2VzID0gW10sXG4gICAgICAgICAgICBuYW1lUGllY2VzID0gW10sXG4gICAgICAgICAgICBuYXJyb3dQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmVyYXMoKTtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIG5hbWVQaWVjZXMucHVzaChyZWdleEVzY2FwZShlcmFzW2ldLm5hbWUpKTtcbiAgICAgICAgICAgIGFiYnJQaWVjZXMucHVzaChyZWdleEVzY2FwZShlcmFzW2ldLmFiYnIpKTtcbiAgICAgICAgICAgIG5hcnJvd1BpZWNlcy5wdXNoKHJlZ2V4RXNjYXBlKGVyYXNbaV0ubmFycm93KSk7XG5cbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2gocmVnZXhFc2NhcGUoZXJhc1tpXS5uYW1lKSk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHJlZ2V4RXNjYXBlKGVyYXNbaV0uYWJicikpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChyZWdleEVzY2FwZShlcmFzW2ldLm5hcnJvdykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZXJhc1JlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbWl4ZWRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl9lcmFzTmFtZVJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbmFtZVBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX2VyYXNBYmJyUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBhYmJyUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fZXJhc05hcnJvd1JlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKCcgKyBuYXJyb3dQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydnZycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndlZWtZZWFyKCkgJSAxMDA7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ0dHJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNvV2Vla1llYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4odG9rZW4sIGdldHRlcikge1xuICAgICAgICBhZGRGb3JtYXRUb2tlbigwLCBbdG9rZW4sIHRva2VuLmxlbmd0aF0sIDAsIGdldHRlcik7XG4gICAgfVxuXG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignZ2dnZycsICd3ZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ2dnZ2dnJywgJ3dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignR0dHRycsICdpc29XZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ0dHR0dHJywgJ2lzb1dlZWtZZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3dlZWtZZWFyJywgJ2dnJyk7XG4gICAgYWRkVW5pdEFsaWFzKCdpc29XZWVrWWVhcicsICdHRycpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnd2Vla1llYXInLCAxKTtcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2lzb1dlZWtZZWFyJywgMSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdHJywgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2cnLCBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignR0cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignZ2cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignR0dHRycsIG1hdGNoMXRvNCwgbWF0Y2g0KTtcbiAgICBhZGRSZWdleFRva2VuKCdnZ2dnJywgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHR0dHJywgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnZ2dnJywgbWF0Y2gxdG82LCBtYXRjaDYpO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydnZ2dnJywgJ2dnZ2dnJywgJ0dHR0cnLCAnR0dHR0cnXSwgZnVuY3Rpb24gKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgd2VlayxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICB0b2tlblxuICAgICkge1xuICAgICAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAyKV0gPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2dnJywgJ0dHJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWtZZWFyKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRTZXRXZWVrWWVhckhlbHBlci5jYWxsKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgdGhpcy53ZWVrKCksXG4gICAgICAgICAgICB0aGlzLndlZWtkYXkoKSxcbiAgICAgICAgICAgIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyxcbiAgICAgICAgICAgIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRveVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT1dlZWtZZWFyKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRTZXRXZWVrWWVhckhlbHBlci5jYWxsKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgdGhpcy5pc29XZWVrKCksXG4gICAgICAgICAgICB0aGlzLmlzb1dlZWtkYXkoKSxcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICA0XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SVNPV2Vla3NJblllYXIoKSB7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgMSwgNCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SVNPV2Vla3NJbklTT1dlZWtZZWFyKCkge1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy5pc29XZWVrWWVhcigpLCAxLCA0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRXZWVrc0luWWVhcigpIHtcbiAgICAgICAgdmFyIHdlZWtJbmZvID0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWs7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgd2Vla0luZm8uZG93LCB3ZWVrSW5mby5kb3kpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFdlZWtzSW5XZWVrWWVhcigpIHtcbiAgICAgICAgdmFyIHdlZWtJbmZvID0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWs7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLndlZWtZZWFyKCksIHdlZWtJbmZvLmRvdywgd2Vla0luZm8uZG95KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrWWVhckhlbHBlcihpbnB1dCwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtzVGFyZ2V0O1xuICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIodGhpcywgZG93LCBkb3kpLnllYXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3ZWVrc1RhcmdldCA9IHdlZWtzSW5ZZWFyKGlucHV0LCBkb3csIGRveSk7XG4gICAgICAgICAgICBpZiAod2VlayA+IHdlZWtzVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgd2VlayA9IHdlZWtzVGFyZ2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNldFdlZWtBbGwuY2FsbCh0aGlzLCBpbnB1dCwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0V2Vla0FsbCh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIGRheU9mWWVhckRhdGEgPSBkYXlPZlllYXJGcm9tV2Vla3Mod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSxcbiAgICAgICAgICAgIGRhdGUgPSBjcmVhdGVVVENEYXRlKGRheU9mWWVhckRhdGEueWVhciwgMCwgZGF5T2ZZZWFyRGF0YS5kYXlPZlllYXIpO1xuXG4gICAgICAgIHRoaXMueWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpO1xuICAgICAgICB0aGlzLm1vbnRoKGRhdGUuZ2V0VVRDTW9udGgoKSk7XG4gICAgICAgIHRoaXMuZGF0ZShkYXRlLmdldFVUQ0RhdGUoKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdRJywgMCwgJ1FvJywgJ3F1YXJ0ZXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygncXVhcnRlcicsICdRJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdxdWFydGVyJywgNyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdRJywgbWF0Y2gxKTtcbiAgICBhZGRQYXJzZVRva2VuKCdRJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSAodG9JbnQoaW5wdXQpIC0gMSkgKiAzO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0UXVhcnRlcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbFxuICAgICAgICAgICAgPyBNYXRoLmNlaWwoKHRoaXMubW9udGgoKSArIDEpIC8gMylcbiAgICAgICAgICAgIDogdGhpcy5tb250aCgoaW5wdXQgLSAxKSAqIDMgKyAodGhpcy5tb250aCgpICUgMykpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdEJywgWydERCcsIDJdLCAnRG8nLCAnZGF0ZScpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdkYXRlJywgJ0QnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdkYXRlJywgOSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdEJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdERCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdEbycsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBcIm9yZGluYWxQYXJzZVwiIGZhbGxiYWNrIGluIG5leHQgbWFqb3IgcmVsZWFzZS5cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0XG4gICAgICAgICAgICA/IGxvY2FsZS5fZGF5T2ZNb250aE9yZGluYWxQYXJzZSB8fCBsb2NhbGUuX29yZGluYWxQYXJzZVxuICAgICAgICAgICAgOiBsb2NhbGUuX2RheU9mTW9udGhPcmRpbmFsUGFyc2VMZW5pZW50O1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ0QnLCAnREQnXSwgREFURSk7XG4gICAgYWRkUGFyc2VUb2tlbignRG8nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W0RBVEVdID0gdG9JbnQoaW5wdXQubWF0Y2gobWF0Y2gxdG8yKVswXSk7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0RGF5T2ZNb250aCA9IG1ha2VHZXRTZXQoJ0RhdGUnLCB0cnVlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdEREQnLCBbJ0REREQnLCAzXSwgJ0RERG8nLCAnZGF5T2ZZZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2RheU9mWWVhcicsICdEREQnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdkYXlPZlllYXInLCA0KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0RERCcsIG1hdGNoMXRvMyk7XG4gICAgYWRkUmVnZXhUb2tlbignRERERCcsIG1hdGNoMyk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ0RERCcsICdEREREJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2RheU9mWWVhciA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldERheU9mWWVhcihpbnB1dCkge1xuICAgICAgICB2YXIgZGF5T2ZZZWFyID1cbiAgICAgICAgICAgIE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgKHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKSAtIHRoaXMuY2xvbmUoKS5zdGFydE9mKCd5ZWFyJykpIC8gODY0ZTVcbiAgICAgICAgICAgICkgKyAxO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IGRheU9mWWVhciA6IHRoaXMuYWRkKGlucHV0IC0gZGF5T2ZZZWFyLCAnZCcpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdtJywgWydtbScsIDJdLCAwLCAnbWludXRlJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ21pbnV0ZScsICdtJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdtaW51dGUnLCAxNCk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdtJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdtbScsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnbScsICdtbSddLCBNSU5VVEUpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldE1pbnV0ZSA9IG1ha2VHZXRTZXQoJ01pbnV0ZXMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigncycsIFsnc3MnLCAyXSwgMCwgJ3NlY29uZCcpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdzZWNvbmQnLCAncycpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnc2Vjb25kJywgMTUpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigncycsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignc3MnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ3MnLCAnc3MnXSwgU0VDT05EKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRTZWNvbmQgPSBtYWtlR2V0U2V0KCdTZWNvbmRzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB+fih0aGlzLm1pbGxpc2Vjb25kKCkgLyAxMDApO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTUycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB+fih0aGlzLm1pbGxpc2Vjb25kKCkgLyAxMCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTUycsIDNdLCAwLCAnbWlsbGlzZWNvbmQnKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1MnLCA0XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTUycsIDVdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1MnLCA2XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1MnLCA3XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTUycsIDhdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTU1MnLCA5XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDAwMDtcbiAgICB9KTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnbWlsbGlzZWNvbmQnLCAnbXMnKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ21pbGxpc2Vjb25kJywgMTYpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignUycsIG1hdGNoMXRvMywgbWF0Y2gxKTtcbiAgICBhZGRSZWdleFRva2VuKCdTUycsIG1hdGNoMXRvMywgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdTU1MnLCBtYXRjaDF0bzMsIG1hdGNoMyk7XG5cbiAgICB2YXIgdG9rZW4sIGdldFNldE1pbGxpc2Vjb25kO1xuICAgIGZvciAodG9rZW4gPSAnU1NTUyc7IHRva2VuLmxlbmd0aCA8PSA5OyB0b2tlbiArPSAnUycpIHtcbiAgICAgICAgYWRkUmVnZXhUb2tlbih0b2tlbiwgbWF0Y2hVbnNpZ25lZCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VNcyhpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTUlMTElTRUNPTkRdID0gdG9JbnQoKCcwLicgKyBpbnB1dCkgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBmb3IgKHRva2VuID0gJ1MnOyB0b2tlbi5sZW5ndGggPD0gOTsgdG9rZW4gKz0gJ1MnKSB7XG4gICAgICAgIGFkZFBhcnNlVG9rZW4odG9rZW4sIHBhcnNlTXMpO1xuICAgIH1cblxuICAgIGdldFNldE1pbGxpc2Vjb25kID0gbWFrZUdldFNldCgnTWlsbGlzZWNvbmRzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3onLCAwLCAwLCAnem9uZUFiYnInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignenonLCAwLCAwLCAnem9uZU5hbWUnKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFpvbmVBYmJyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnVVRDJyA6ICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFpvbmVOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUnIDogJyc7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvID0gTW9tZW50LnByb3RvdHlwZTtcblxuICAgIHByb3RvLmFkZCA9IGFkZDtcbiAgICBwcm90by5jYWxlbmRhciA9IGNhbGVuZGFyJDE7XG4gICAgcHJvdG8uY2xvbmUgPSBjbG9uZTtcbiAgICBwcm90by5kaWZmID0gZGlmZjtcbiAgICBwcm90by5lbmRPZiA9IGVuZE9mO1xuICAgIHByb3RvLmZvcm1hdCA9IGZvcm1hdDtcbiAgICBwcm90by5mcm9tID0gZnJvbTtcbiAgICBwcm90by5mcm9tTm93ID0gZnJvbU5vdztcbiAgICBwcm90by50byA9IHRvO1xuICAgIHByb3RvLnRvTm93ID0gdG9Ob3c7XG4gICAgcHJvdG8uZ2V0ID0gc3RyaW5nR2V0O1xuICAgIHByb3RvLmludmFsaWRBdCA9IGludmFsaWRBdDtcbiAgICBwcm90by5pc0FmdGVyID0gaXNBZnRlcjtcbiAgICBwcm90by5pc0JlZm9yZSA9IGlzQmVmb3JlO1xuICAgIHByb3RvLmlzQmV0d2VlbiA9IGlzQmV0d2VlbjtcbiAgICBwcm90by5pc1NhbWUgPSBpc1NhbWU7XG4gICAgcHJvdG8uaXNTYW1lT3JBZnRlciA9IGlzU2FtZU9yQWZ0ZXI7XG4gICAgcHJvdG8uaXNTYW1lT3JCZWZvcmUgPSBpc1NhbWVPckJlZm9yZTtcbiAgICBwcm90by5pc1ZhbGlkID0gaXNWYWxpZCQyO1xuICAgIHByb3RvLmxhbmcgPSBsYW5nO1xuICAgIHByb3RvLmxvY2FsZSA9IGxvY2FsZTtcbiAgICBwcm90by5sb2NhbGVEYXRhID0gbG9jYWxlRGF0YTtcbiAgICBwcm90by5tYXggPSBwcm90b3R5cGVNYXg7XG4gICAgcHJvdG8ubWluID0gcHJvdG90eXBlTWluO1xuICAgIHByb3RvLnBhcnNpbmdGbGFncyA9IHBhcnNpbmdGbGFncztcbiAgICBwcm90by5zZXQgPSBzdHJpbmdTZXQ7XG4gICAgcHJvdG8uc3RhcnRPZiA9IHN0YXJ0T2Y7XG4gICAgcHJvdG8uc3VidHJhY3QgPSBzdWJ0cmFjdDtcbiAgICBwcm90by50b0FycmF5ID0gdG9BcnJheTtcbiAgICBwcm90by50b09iamVjdCA9IHRvT2JqZWN0O1xuICAgIHByb3RvLnRvRGF0ZSA9IHRvRGF0ZTtcbiAgICBwcm90by50b0lTT1N0cmluZyA9IHRvSVNPU3RyaW5nO1xuICAgIHByb3RvLmluc3BlY3QgPSBpbnNwZWN0O1xuICAgIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuZm9yICE9IG51bGwpIHtcbiAgICAgICAgcHJvdG9bU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gJ01vbWVudDwnICsgdGhpcy5mb3JtYXQoKSArICc+JztcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHJvdG8udG9KU09OID0gdG9KU09OO1xuICAgIHByb3RvLnRvU3RyaW5nID0gdG9TdHJpbmc7XG4gICAgcHJvdG8udW5peCA9IHVuaXg7XG4gICAgcHJvdG8udmFsdWVPZiA9IHZhbHVlT2Y7XG4gICAgcHJvdG8uY3JlYXRpb25EYXRhID0gY3JlYXRpb25EYXRhO1xuICAgIHByb3RvLmVyYU5hbWUgPSBnZXRFcmFOYW1lO1xuICAgIHByb3RvLmVyYU5hcnJvdyA9IGdldEVyYU5hcnJvdztcbiAgICBwcm90by5lcmFBYmJyID0gZ2V0RXJhQWJicjtcbiAgICBwcm90by5lcmFZZWFyID0gZ2V0RXJhWWVhcjtcbiAgICBwcm90by55ZWFyID0gZ2V0U2V0WWVhcjtcbiAgICBwcm90by5pc0xlYXBZZWFyID0gZ2V0SXNMZWFwWWVhcjtcbiAgICBwcm90by53ZWVrWWVhciA9IGdldFNldFdlZWtZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtZZWFyID0gZ2V0U2V0SVNPV2Vla1llYXI7XG4gICAgcHJvdG8ucXVhcnRlciA9IHByb3RvLnF1YXJ0ZXJzID0gZ2V0U2V0UXVhcnRlcjtcbiAgICBwcm90by5tb250aCA9IGdldFNldE1vbnRoO1xuICAgIHByb3RvLmRheXNJbk1vbnRoID0gZ2V0RGF5c0luTW9udGg7XG4gICAgcHJvdG8ud2VlayA9IHByb3RvLndlZWtzID0gZ2V0U2V0V2VlaztcbiAgICBwcm90by5pc29XZWVrID0gcHJvdG8uaXNvV2Vla3MgPSBnZXRTZXRJU09XZWVrO1xuICAgIHByb3RvLndlZWtzSW5ZZWFyID0gZ2V0V2Vla3NJblllYXI7XG4gICAgcHJvdG8ud2Vla3NJbldlZWtZZWFyID0gZ2V0V2Vla3NJbldlZWtZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtzSW5ZZWFyID0gZ2V0SVNPV2Vla3NJblllYXI7XG4gICAgcHJvdG8uaXNvV2Vla3NJbklTT1dlZWtZZWFyID0gZ2V0SVNPV2Vla3NJbklTT1dlZWtZZWFyO1xuICAgIHByb3RvLmRhdGUgPSBnZXRTZXREYXlPZk1vbnRoO1xuICAgIHByb3RvLmRheSA9IHByb3RvLmRheXMgPSBnZXRTZXREYXlPZldlZWs7XG4gICAgcHJvdG8ud2Vla2RheSA9IGdldFNldExvY2FsZURheU9mV2VlaztcbiAgICBwcm90by5pc29XZWVrZGF5ID0gZ2V0U2V0SVNPRGF5T2ZXZWVrO1xuICAgIHByb3RvLmRheU9mWWVhciA9IGdldFNldERheU9mWWVhcjtcbiAgICBwcm90by5ob3VyID0gcHJvdG8uaG91cnMgPSBnZXRTZXRIb3VyO1xuICAgIHByb3RvLm1pbnV0ZSA9IHByb3RvLm1pbnV0ZXMgPSBnZXRTZXRNaW51dGU7XG4gICAgcHJvdG8uc2Vjb25kID0gcHJvdG8uc2Vjb25kcyA9IGdldFNldFNlY29uZDtcbiAgICBwcm90by5taWxsaXNlY29uZCA9IHByb3RvLm1pbGxpc2Vjb25kcyA9IGdldFNldE1pbGxpc2Vjb25kO1xuICAgIHByb3RvLnV0Y09mZnNldCA9IGdldFNldE9mZnNldDtcbiAgICBwcm90by51dGMgPSBzZXRPZmZzZXRUb1VUQztcbiAgICBwcm90by5sb2NhbCA9IHNldE9mZnNldFRvTG9jYWw7XG4gICAgcHJvdG8ucGFyc2Vab25lID0gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQ7XG4gICAgcHJvdG8uaGFzQWxpZ25lZEhvdXJPZmZzZXQgPSBoYXNBbGlnbmVkSG91ck9mZnNldDtcbiAgICBwcm90by5pc0RTVCA9IGlzRGF5bGlnaHRTYXZpbmdUaW1lO1xuICAgIHByb3RvLmlzTG9jYWwgPSBpc0xvY2FsO1xuICAgIHByb3RvLmlzVXRjT2Zmc2V0ID0gaXNVdGNPZmZzZXQ7XG4gICAgcHJvdG8uaXNVdGMgPSBpc1V0YztcbiAgICBwcm90by5pc1VUQyA9IGlzVXRjO1xuICAgIHByb3RvLnpvbmVBYmJyID0gZ2V0Wm9uZUFiYnI7XG4gICAgcHJvdG8uem9uZU5hbWUgPSBnZXRab25lTmFtZTtcbiAgICBwcm90by5kYXRlcyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ2RhdGVzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBkYXRlIGluc3RlYWQuJyxcbiAgICAgICAgZ2V0U2V0RGF5T2ZNb250aFxuICAgICk7XG4gICAgcHJvdG8ubW9udGhzID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9udGhzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb250aCBpbnN0ZWFkJyxcbiAgICAgICAgZ2V0U2V0TW9udGhcbiAgICApO1xuICAgIHByb3RvLnllYXJzID0gZGVwcmVjYXRlKFxuICAgICAgICAneWVhcnMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIHllYXIgaW5zdGVhZCcsXG4gICAgICAgIGdldFNldFllYXJcbiAgICApO1xuICAgIHByb3RvLnpvbmUgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS56b25lIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQoKS51dGNPZmZzZXQgaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy96b25lLycsXG4gICAgICAgIGdldFNldFpvbmVcbiAgICApO1xuICAgIHByb3RvLmlzRFNUU2hpZnRlZCA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ2lzRFNUU2hpZnRlZCBpcyBkZXByZWNhdGVkLiBTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kc3Qtc2hpZnRlZC8gZm9yIG1vcmUgaW5mb3JtYXRpb24nLFxuICAgICAgICBpc0RheWxpZ2h0U2F2aW5nVGltZVNoaWZ0ZWRcbiAgICApO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlVW5peChpbnB1dCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoaW5wdXQgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJblpvbmUoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpLnBhcnNlWm9uZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZVBhcnNlUG9zdEZvcm1hdChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8kMSA9IExvY2FsZS5wcm90b3R5cGU7XG5cbiAgICBwcm90byQxLmNhbGVuZGFyID0gY2FsZW5kYXI7XG4gICAgcHJvdG8kMS5sb25nRGF0ZUZvcm1hdCA9IGxvbmdEYXRlRm9ybWF0O1xuICAgIHByb3RvJDEuaW52YWxpZERhdGUgPSBpbnZhbGlkRGF0ZTtcbiAgICBwcm90byQxLm9yZGluYWwgPSBvcmRpbmFsO1xuICAgIHByb3RvJDEucHJlcGFyc2UgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG4gICAgcHJvdG8kMS5wb3N0Zm9ybWF0ID0gcHJlUGFyc2VQb3N0Rm9ybWF0O1xuICAgIHByb3RvJDEucmVsYXRpdmVUaW1lID0gcmVsYXRpdmVUaW1lO1xuICAgIHByb3RvJDEucGFzdEZ1dHVyZSA9IHBhc3RGdXR1cmU7XG4gICAgcHJvdG8kMS5zZXQgPSBzZXQ7XG4gICAgcHJvdG8kMS5lcmFzID0gbG9jYWxlRXJhcztcbiAgICBwcm90byQxLmVyYXNQYXJzZSA9IGxvY2FsZUVyYXNQYXJzZTtcbiAgICBwcm90byQxLmVyYXNDb252ZXJ0WWVhciA9IGxvY2FsZUVyYXNDb252ZXJ0WWVhcjtcbiAgICBwcm90byQxLmVyYXNBYmJyUmVnZXggPSBlcmFzQWJiclJlZ2V4O1xuICAgIHByb3RvJDEuZXJhc05hbWVSZWdleCA9IGVyYXNOYW1lUmVnZXg7XG4gICAgcHJvdG8kMS5lcmFzTmFycm93UmVnZXggPSBlcmFzTmFycm93UmVnZXg7XG5cbiAgICBwcm90byQxLm1vbnRocyA9IGxvY2FsZU1vbnRocztcbiAgICBwcm90byQxLm1vbnRoc1Nob3J0ID0gbG9jYWxlTW9udGhzU2hvcnQ7XG4gICAgcHJvdG8kMS5tb250aHNQYXJzZSA9IGxvY2FsZU1vbnRoc1BhcnNlO1xuICAgIHByb3RvJDEubW9udGhzUmVnZXggPSBtb250aHNSZWdleDtcbiAgICBwcm90byQxLm1vbnRoc1Nob3J0UmVnZXggPSBtb250aHNTaG9ydFJlZ2V4O1xuICAgIHByb3RvJDEud2VlayA9IGxvY2FsZVdlZWs7XG4gICAgcHJvdG8kMS5maXJzdERheU9mWWVhciA9IGxvY2FsZUZpcnN0RGF5T2ZZZWFyO1xuICAgIHByb3RvJDEuZmlyc3REYXlPZldlZWsgPSBsb2NhbGVGaXJzdERheU9mV2VlaztcblxuICAgIHByb3RvJDEud2Vla2RheXMgPSBsb2NhbGVXZWVrZGF5cztcbiAgICBwcm90byQxLndlZWtkYXlzTWluID0gbG9jYWxlV2Vla2RheXNNaW47XG4gICAgcHJvdG8kMS53ZWVrZGF5c1Nob3J0ID0gbG9jYWxlV2Vla2RheXNTaG9ydDtcbiAgICBwcm90byQxLndlZWtkYXlzUGFyc2UgPSBsb2NhbGVXZWVrZGF5c1BhcnNlO1xuXG4gICAgcHJvdG8kMS53ZWVrZGF5c1JlZ2V4ID0gd2Vla2RheXNSZWdleDtcbiAgICBwcm90byQxLndlZWtkYXlzU2hvcnRSZWdleCA9IHdlZWtkYXlzU2hvcnRSZWdleDtcbiAgICBwcm90byQxLndlZWtkYXlzTWluUmVnZXggPSB3ZWVrZGF5c01pblJlZ2V4O1xuXG4gICAgcHJvdG8kMS5pc1BNID0gbG9jYWxlSXNQTTtcbiAgICBwcm90byQxLm1lcmlkaWVtID0gbG9jYWxlTWVyaWRpZW07XG5cbiAgICBmdW5jdGlvbiBnZXQkMShmb3JtYXQsIGluZGV4LCBmaWVsZCwgc2V0dGVyKSB7XG4gICAgICAgIHZhciBsb2NhbGUgPSBnZXRMb2NhbGUoKSxcbiAgICAgICAgICAgIHV0YyA9IGNyZWF0ZVVUQygpLnNldChzZXR0ZXIsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIGxvY2FsZVtmaWVsZF0odXRjLCBmb3JtYXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsIGZpZWxkKSB7XG4gICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcblxuICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldCQxKGZvcm1hdCwgaW5kZXgsIGZpZWxkLCAnbW9udGgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgb3V0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICBvdXRbaV0gPSBnZXQkMShmb3JtYXQsIGksIGZpZWxkLCAnbW9udGgnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIC8vICgpXG4gICAgLy8gKDUpXG4gICAgLy8gKGZtdCwgNSlcbiAgICAvLyAoZm10KVxuICAgIC8vICh0cnVlKVxuICAgIC8vICh0cnVlLCA1KVxuICAgIC8vICh0cnVlLCBmbXQsIDUpXG4gICAgLy8gKHRydWUsIGZtdClcbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbGVTb3J0ZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGxvY2FsZVNvcnRlZDtcbiAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgbG9jYWxlU29ydGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG9jYWxlID0gZ2V0TG9jYWxlKCksXG4gICAgICAgICAgICBzaGlmdCA9IGxvY2FsZVNvcnRlZCA/IGxvY2FsZS5fd2Vlay5kb3cgOiAwLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIG91dCA9IFtdO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0JDEoZm9ybWF0LCAoaW5kZXggKyBzaGlmdCkgJSA3LCBmaWVsZCwgJ2RheScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgb3V0W2ldID0gZ2V0JDEoZm9ybWF0LCAoaSArIHNoaWZ0KSAlIDcsIGZpZWxkLCAnZGF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzKGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsICdtb250aHMnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzU2hvcnQoZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgJ21vbnRoc1Nob3J0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5cycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c1Nob3J0KGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c1Nob3J0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzTWluKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c01pbicpO1xuICAgIH1cblxuICAgIGdldFNldEdsb2JhbExvY2FsZSgnZW4nLCB7XG4gICAgICAgIGVyYXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzAwMDEtMDEtMDEnLFxuICAgICAgICAgICAgICAgIHVudGlsOiArSW5maW5pdHksXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdBbm5vIERvbWluaScsXG4gICAgICAgICAgICAgICAgbmFycm93OiAnQUQnLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdBRCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMDAwMC0xMi0zMScsXG4gICAgICAgICAgICAgICAgdW50aWw6IC1JbmZpbml0eSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0JlZm9yZSBDaHJpc3QnLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ0JDJyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnQkMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHRofHN0fG5kfHJkKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgdG9JbnQoKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFNpZGUgZWZmZWN0IGltcG9ydHNcblxuICAgIGhvb2tzLmxhbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQubGFuZyBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZSBpbnN0ZWFkLicsXG4gICAgICAgIGdldFNldEdsb2JhbExvY2FsZVxuICAgICk7XG4gICAgaG9va3MubGFuZ0RhdGEgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQubGFuZ0RhdGEgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGVEYXRhIGluc3RlYWQuJyxcbiAgICAgICAgZ2V0TG9jYWxlXG4gICAgKTtcblxuICAgIHZhciBtYXRoQWJzID0gTWF0aC5hYnM7XG5cbiAgICBmdW5jdGlvbiBhYnMoKSB7XG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblxuICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgPSBtYXRoQWJzKHRoaXMuX21pbGxpc2Vjb25kcyk7XG4gICAgICAgIHRoaXMuX2RheXMgPSBtYXRoQWJzKHRoaXMuX2RheXMpO1xuICAgICAgICB0aGlzLl9tb250aHMgPSBtYXRoQWJzKHRoaXMuX21vbnRocyk7XG5cbiAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgPSBtYXRoQWJzKGRhdGEubWlsbGlzZWNvbmRzKTtcbiAgICAgICAgZGF0YS5zZWNvbmRzID0gbWF0aEFicyhkYXRhLnNlY29uZHMpO1xuICAgICAgICBkYXRhLm1pbnV0ZXMgPSBtYXRoQWJzKGRhdGEubWludXRlcyk7XG4gICAgICAgIGRhdGEuaG91cnMgPSBtYXRoQWJzKGRhdGEuaG91cnMpO1xuICAgICAgICBkYXRhLm1vbnRocyA9IG1hdGhBYnMoZGF0YS5tb250aHMpO1xuICAgICAgICBkYXRhLnllYXJzID0gbWF0aEFicyhkYXRhLnllYXJzKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRTdWJ0cmFjdCQxKGR1cmF0aW9uLCBpbnB1dCwgdmFsdWUsIGRpcmVjdGlvbikge1xuICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVEdXJhdGlvbihpbnB1dCwgdmFsdWUpO1xuXG4gICAgICAgIGR1cmF0aW9uLl9taWxsaXNlY29uZHMgKz0gZGlyZWN0aW9uICogb3RoZXIuX21pbGxpc2Vjb25kcztcbiAgICAgICAgZHVyYXRpb24uX2RheXMgKz0gZGlyZWN0aW9uICogb3RoZXIuX2RheXM7XG4gICAgICAgIGR1cmF0aW9uLl9tb250aHMgKz0gZGlyZWN0aW9uICogb3RoZXIuX21vbnRocztcblxuICAgICAgICByZXR1cm4gZHVyYXRpb24uX2J1YmJsZSgpO1xuICAgIH1cblxuICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIGFkZCgxLCAncycpIG9yIGFkZChkdXJhdGlvbilcbiAgICBmdW5jdGlvbiBhZGQkMShpbnB1dCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFkZFN1YnRyYWN0JDEodGhpcywgaW5wdXQsIHZhbHVlLCAxKTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0cyBvbmx5IDIuMC1zdHlsZSBzdWJ0cmFjdCgxLCAncycpIG9yIHN1YnRyYWN0KGR1cmF0aW9uKVxuICAgIGZ1bmN0aW9uIHN1YnRyYWN0JDEoaW5wdXQsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBhZGRTdWJ0cmFjdCQxKHRoaXMsIGlucHV0LCB2YWx1ZSwgLTEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0NlaWwobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnViYmxlKCkge1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgZGF5cyA9IHRoaXMuX2RheXMsXG4gICAgICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMsXG4gICAgICAgICAgICBkYXRhID0gdGhpcy5fZGF0YSxcbiAgICAgICAgICAgIHNlY29uZHMsXG4gICAgICAgICAgICBtaW51dGVzLFxuICAgICAgICAgICAgaG91cnMsXG4gICAgICAgICAgICB5ZWFycyxcbiAgICAgICAgICAgIG1vbnRoc0Zyb21EYXlzO1xuXG4gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBtaXggb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHZhbHVlcywgYnViYmxlIGRvd24gZmlyc3RcbiAgICAgICAgLy8gY2hlY2s6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yMTY2XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgKG1pbGxpc2Vjb25kcyA+PSAwICYmIGRheXMgPj0gMCAmJiBtb250aHMgPj0gMCkgfHxcbiAgICAgICAgICAgICAgICAobWlsbGlzZWNvbmRzIDw9IDAgJiYgZGF5cyA8PSAwICYmIG1vbnRocyA8PSAwKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyArPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHMpICsgZGF5cykgKiA4NjRlNTtcbiAgICAgICAgICAgIGRheXMgPSAwO1xuICAgICAgICAgICAgbW9udGhzID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBidWJibGVzIHVwIHZhbHVlcywgc2VlIHRoZSB0ZXN0cyBmb3JcbiAgICAgICAgLy8gZXhhbXBsZXMgb2Ygd2hhdCB0aGF0IG1lYW5zLlxuICAgICAgICBkYXRhLm1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAlIDEwMDA7XG5cbiAgICAgICAgc2Vjb25kcyA9IGFic0Zsb29yKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICAgICAgICBkYXRhLnNlY29uZHMgPSBzZWNvbmRzICUgNjA7XG5cbiAgICAgICAgbWludXRlcyA9IGFic0Zsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgICAgIGRhdGEubWludXRlcyA9IG1pbnV0ZXMgJSA2MDtcblxuICAgICAgICBob3VycyA9IGFic0Zsb29yKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgIGRhdGEuaG91cnMgPSBob3VycyAlIDI0O1xuXG4gICAgICAgIGRheXMgKz0gYWJzRmxvb3IoaG91cnMgLyAyNCk7XG5cbiAgICAgICAgLy8gY29udmVydCBkYXlzIHRvIG1vbnRoc1xuICAgICAgICBtb250aHNGcm9tRGF5cyA9IGFic0Zsb29yKGRheXNUb01vbnRocyhkYXlzKSk7XG4gICAgICAgIG1vbnRocyArPSBtb250aHNGcm9tRGF5cztcbiAgICAgICAgZGF5cyAtPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHNGcm9tRGF5cykpO1xuXG4gICAgICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICAgICAgeWVhcnMgPSBhYnNGbG9vcihtb250aHMgLyAxMik7XG4gICAgICAgIG1vbnRocyAlPSAxMjtcblxuICAgICAgICBkYXRhLmRheXMgPSBkYXlzO1xuICAgICAgICBkYXRhLm1vbnRocyA9IG1vbnRocztcbiAgICAgICAgZGF0YS55ZWFycyA9IHllYXJzO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNUb01vbnRocyhkYXlzKSB7XG4gICAgICAgIC8vIDQwMCB5ZWFycyBoYXZlIDE0NjA5NyBkYXlzICh0YWtpbmcgaW50byBhY2NvdW50IGxlYXAgeWVhciBydWxlcylcbiAgICAgICAgLy8gNDAwIHllYXJzIGhhdmUgMTIgbW9udGhzID09PSA0ODAwXG4gICAgICAgIHJldHVybiAoZGF5cyAqIDQ4MDApIC8gMTQ2MDk3O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc1RvRGF5cyhtb250aHMpIHtcbiAgICAgICAgLy8gdGhlIHJldmVyc2Ugb2YgZGF5c1RvTW9udGhzXG4gICAgICAgIHJldHVybiAobW9udGhzICogMTQ2MDk3KSAvIDQ4MDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXModW5pdHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF5cyxcbiAgICAgICAgICAgIG1vbnRocyxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IHRoaXMuX21pbGxpc2Vjb25kcztcblxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcblxuICAgICAgICBpZiAodW5pdHMgPT09ICdtb250aCcgfHwgdW5pdHMgPT09ICdxdWFydGVyJyB8fCB1bml0cyA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICBkYXlzID0gdGhpcy5fZGF5cyArIG1pbGxpc2Vjb25kcyAvIDg2NGU1O1xuICAgICAgICAgICAgbW9udGhzID0gdGhpcy5fbW9udGhzICsgZGF5c1RvTW9udGhzKGRheXMpO1xuICAgICAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRocztcbiAgICAgICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRocyAvIDM7XG4gICAgICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb250aHMgLyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBtaWxsaXNlY29uZHMgc2VwYXJhdGVseSBiZWNhdXNlIG9mIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIChpc3N1ZSAjMTg2NylcbiAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgTWF0aC5yb3VuZChtb250aHNUb0RheXModGhpcy5fbW9udGhzKSk7XG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXlzIC8gNyArIG1pbGxpc2Vjb25kcyAvIDYwNDhlNTtcbiAgICAgICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyArIG1pbGxpc2Vjb25kcyAvIDg2NGU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyAqIDI0ICsgbWlsbGlzZWNvbmRzIC8gMzZlNTtcbiAgICAgICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyAqIDE0NDAgKyBtaWxsaXNlY29uZHMgLyA2ZTQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRheXMgKiA4NjQwMCArIG1pbGxpc2Vjb25kcyAvIDEwMDA7XG4gICAgICAgICAgICAgICAgLy8gTWF0aC5mbG9vciBwcmV2ZW50cyBmbG9hdGluZyBwb2ludCBtYXRoIGVycm9ycyBoZXJlXG4gICAgICAgICAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihkYXlzICogODY0ZTUpICsgbWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biB1bml0ICcgKyB1bml0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBVc2UgdGhpcy5hcygnbXMnKT9cbiAgICBmdW5jdGlvbiB2YWx1ZU9mJDEoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyArXG4gICAgICAgICAgICB0aGlzLl9kYXlzICogODY0ZTUgK1xuICAgICAgICAgICAgKHRoaXMuX21vbnRocyAlIDEyKSAqIDI1OTJlNiArXG4gICAgICAgICAgICB0b0ludCh0aGlzLl9tb250aHMgLyAxMikgKiAzMTUzNmU2XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcyhhbGlhcyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGFzTWlsbGlzZWNvbmRzID0gbWFrZUFzKCdtcycpLFxuICAgICAgICBhc1NlY29uZHMgPSBtYWtlQXMoJ3MnKSxcbiAgICAgICAgYXNNaW51dGVzID0gbWFrZUFzKCdtJyksXG4gICAgICAgIGFzSG91cnMgPSBtYWtlQXMoJ2gnKSxcbiAgICAgICAgYXNEYXlzID0gbWFrZUFzKCdkJyksXG4gICAgICAgIGFzV2Vla3MgPSBtYWtlQXMoJ3cnKSxcbiAgICAgICAgYXNNb250aHMgPSBtYWtlQXMoJ00nKSxcbiAgICAgICAgYXNRdWFydGVycyA9IG1ha2VBcygnUScpLFxuICAgICAgICBhc1llYXJzID0gbWFrZUFzKCd5Jyk7XG5cbiAgICBmdW5jdGlvbiBjbG9uZSQxKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24odGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0JDIodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXNbdW5pdHMgKyAncyddKCkgOiBOYU47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUdldHRlcihuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9kYXRhW25hbWVdIDogTmFOO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBtaWxsaXNlY29uZHMgPSBtYWtlR2V0dGVyKCdtaWxsaXNlY29uZHMnKSxcbiAgICAgICAgc2Vjb25kcyA9IG1ha2VHZXR0ZXIoJ3NlY29uZHMnKSxcbiAgICAgICAgbWludXRlcyA9IG1ha2VHZXR0ZXIoJ21pbnV0ZXMnKSxcbiAgICAgICAgaG91cnMgPSBtYWtlR2V0dGVyKCdob3VycycpLFxuICAgICAgICBkYXlzID0gbWFrZUdldHRlcignZGF5cycpLFxuICAgICAgICBtb250aHMgPSBtYWtlR2V0dGVyKCdtb250aHMnKSxcbiAgICAgICAgeWVhcnMgPSBtYWtlR2V0dGVyKCd5ZWFycycpO1xuXG4gICAgZnVuY3Rpb24gd2Vla3MoKSB7XG4gICAgICAgIHJldHVybiBhYnNGbG9vcih0aGlzLmRheXMoKSAvIDcpO1xuICAgIH1cblxuICAgIHZhciByb3VuZCA9IE1hdGgucm91bmQsXG4gICAgICAgIHRocmVzaG9sZHMgPSB7XG4gICAgICAgICAgICBzczogNDQsIC8vIGEgZmV3IHNlY29uZHMgdG8gc2Vjb25kc1xuICAgICAgICAgICAgczogNDUsIC8vIHNlY29uZHMgdG8gbWludXRlXG4gICAgICAgICAgICBtOiA0NSwgLy8gbWludXRlcyB0byBob3VyXG4gICAgICAgICAgICBoOiAyMiwgLy8gaG91cnMgdG8gZGF5XG4gICAgICAgICAgICBkOiAyNiwgLy8gZGF5cyB0byBtb250aC93ZWVrXG4gICAgICAgICAgICB3OiBudWxsLCAvLyB3ZWVrcyB0byBtb250aFxuICAgICAgICAgICAgTTogMTEsIC8vIG1vbnRocyB0byB5ZWFyXG4gICAgICAgIH07XG5cbiAgICAvLyBoZWxwZXIgZnVuY3Rpb24gZm9yIG1vbWVudC5mbi5mcm9tLCBtb21lbnQuZm4uZnJvbU5vdywgYW5kIG1vbWVudC5kdXJhdGlvbi5mbi5odW1hbml6ZVxuICAgIGZ1bmN0aW9uIHN1YnN0aXR1dGVUaW1lQWdvKHN0cmluZywgbnVtYmVyLCB3aXRob3V0U3VmZml4LCBpc0Z1dHVyZSwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUucmVsYXRpdmVUaW1lKG51bWJlciB8fCAxLCAhIXdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZSQxKHBvc05lZ0R1cmF0aW9uLCB3aXRob3V0U3VmZml4LCB0aHJlc2hvbGRzLCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb24ocG9zTmVnRHVyYXRpb24pLmFicygpLFxuICAgICAgICAgICAgc2Vjb25kcyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdzJykpLFxuICAgICAgICAgICAgbWludXRlcyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdtJykpLFxuICAgICAgICAgICAgaG91cnMgPSByb3VuZChkdXJhdGlvbi5hcygnaCcpKSxcbiAgICAgICAgICAgIGRheXMgPSByb3VuZChkdXJhdGlvbi5hcygnZCcpKSxcbiAgICAgICAgICAgIG1vbnRocyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdNJykpLFxuICAgICAgICAgICAgd2Vla3MgPSByb3VuZChkdXJhdGlvbi5hcygndycpKSxcbiAgICAgICAgICAgIHllYXJzID0gcm91bmQoZHVyYXRpb24uYXMoJ3knKSksXG4gICAgICAgICAgICBhID1cbiAgICAgICAgICAgICAgICAoc2Vjb25kcyA8PSB0aHJlc2hvbGRzLnNzICYmIFsncycsIHNlY29uZHNdKSB8fFxuICAgICAgICAgICAgICAgIChzZWNvbmRzIDwgdGhyZXNob2xkcy5zICYmIFsnc3MnLCBzZWNvbmRzXSkgfHxcbiAgICAgICAgICAgICAgICAobWludXRlcyA8PSAxICYmIFsnbSddKSB8fFxuICAgICAgICAgICAgICAgIChtaW51dGVzIDwgdGhyZXNob2xkcy5tICYmIFsnbW0nLCBtaW51dGVzXSkgfHxcbiAgICAgICAgICAgICAgICAoaG91cnMgPD0gMSAmJiBbJ2gnXSkgfHxcbiAgICAgICAgICAgICAgICAoaG91cnMgPCB0aHJlc2hvbGRzLmggJiYgWydoaCcsIGhvdXJzXSkgfHxcbiAgICAgICAgICAgICAgICAoZGF5cyA8PSAxICYmIFsnZCddKSB8fFxuICAgICAgICAgICAgICAgIChkYXlzIDwgdGhyZXNob2xkcy5kICYmIFsnZGQnLCBkYXlzXSk7XG5cbiAgICAgICAgaWYgKHRocmVzaG9sZHMudyAhPSBudWxsKSB7XG4gICAgICAgICAgICBhID1cbiAgICAgICAgICAgICAgICBhIHx8XG4gICAgICAgICAgICAgICAgKHdlZWtzIDw9IDEgJiYgWyd3J10pIHx8XG4gICAgICAgICAgICAgICAgKHdlZWtzIDwgdGhyZXNob2xkcy53ICYmIFsnd3cnLCB3ZWVrc10pO1xuICAgICAgICB9XG4gICAgICAgIGEgPSBhIHx8XG4gICAgICAgICAgICAobW9udGhzIDw9IDEgJiYgWydNJ10pIHx8XG4gICAgICAgICAgICAobW9udGhzIDwgdGhyZXNob2xkcy5NICYmIFsnTU0nLCBtb250aHNdKSB8fFxuICAgICAgICAgICAgKHllYXJzIDw9IDEgJiYgWyd5J10pIHx8IFsneXknLCB5ZWFyc107XG5cbiAgICAgICAgYVsyXSA9IHdpdGhvdXRTdWZmaXg7XG4gICAgICAgIGFbM10gPSArcG9zTmVnRHVyYXRpb24gPiAwO1xuICAgICAgICBhWzRdID0gbG9jYWxlO1xuICAgICAgICByZXR1cm4gc3Vic3RpdHV0ZVRpbWVBZ28uYXBwbHkobnVsbCwgYSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHNldCB0aGUgcm91bmRpbmcgZnVuY3Rpb24gZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nKHJvdW5kaW5nRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKHJvdW5kaW5nRnVuY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygcm91bmRpbmdGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcm91bmQgPSByb3VuZGluZ0Z1bmN0aW9uO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgYSB0aHJlc2hvbGQgZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZCh0aHJlc2hvbGQsIGxpbWl0KSB7XG4gICAgICAgIGlmICh0aHJlc2hvbGRzW3RocmVzaG9sZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW1pdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyZXNob2xkc1t0aHJlc2hvbGRdO1xuICAgICAgICB9XG4gICAgICAgIHRocmVzaG9sZHNbdGhyZXNob2xkXSA9IGxpbWl0O1xuICAgICAgICBpZiAodGhyZXNob2xkID09PSAncycpIHtcbiAgICAgICAgICAgIHRocmVzaG9sZHMuc3MgPSBsaW1pdCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaHVtYW5pemUoYXJnV2l0aFN1ZmZpeCwgYXJnVGhyZXNob2xkcykge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB3aXRoU3VmZml4ID0gZmFsc2UsXG4gICAgICAgICAgICB0aCA9IHRocmVzaG9sZHMsXG4gICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdXaXRoU3VmZml4ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgYXJnVGhyZXNob2xkcyA9IGFyZ1dpdGhTdWZmaXg7XG4gICAgICAgICAgICBhcmdXaXRoU3VmZml4ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdXaXRoU3VmZml4ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHdpdGhTdWZmaXggPSBhcmdXaXRoU3VmZml4O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXJnVGhyZXNob2xkcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRoID0gT2JqZWN0LmFzc2lnbih7fSwgdGhyZXNob2xkcywgYXJnVGhyZXNob2xkcyk7XG4gICAgICAgICAgICBpZiAoYXJnVGhyZXNob2xkcy5zICE9IG51bGwgJiYgYXJnVGhyZXNob2xkcy5zcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGguc3MgPSBhcmdUaHJlc2hvbGRzLnMgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbG9jYWxlID0gdGhpcy5sb2NhbGVEYXRhKCk7XG4gICAgICAgIG91dHB1dCA9IHJlbGF0aXZlVGltZSQxKHRoaXMsICF3aXRoU3VmZml4LCB0aCwgbG9jYWxlKTtcblxuICAgICAgICBpZiAod2l0aFN1ZmZpeCkge1xuICAgICAgICAgICAgb3V0cHV0ID0gbG9jYWxlLnBhc3RGdXR1cmUoK3RoaXMsIG91dHB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbG9jYWxlLnBvc3Rmb3JtYXQob3V0cHV0KTtcbiAgICB9XG5cbiAgICB2YXIgYWJzJDEgPSBNYXRoLmFicztcblxuICAgIGZ1bmN0aW9uIHNpZ24oeCkge1xuICAgICAgICByZXR1cm4gKHggPiAwKSAtICh4IDwgMCkgfHwgK3g7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmckMSgpIHtcbiAgICAgICAgLy8gZm9yIElTTyBzdHJpbmdzIHdlIGRvIG5vdCB1c2UgdGhlIG5vcm1hbCBidWJibGluZyBydWxlczpcbiAgICAgICAgLy8gICogbWlsbGlzZWNvbmRzIGJ1YmJsZSB1cCB1bnRpbCB0aGV5IGJlY29tZSBob3Vyc1xuICAgICAgICAvLyAgKiBkYXlzIGRvIG5vdCBidWJibGUgYXQgYWxsXG4gICAgICAgIC8vICAqIG1vbnRocyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgeWVhcnNcbiAgICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbnRleHQtZnJlZSBjb252ZXJzaW9uIGJldHdlZW4gaG91cnMgYW5kIGRheXNcbiAgICAgICAgLy8gKHRoaW5rIG9mIGNsb2NrIGNoYW5nZXMpXG4gICAgICAgIC8vIGFuZCBhbHNvIG5vdCBiZXR3ZWVuIGRheXMgYW5kIG1vbnRocyAoMjgtMzEgZGF5cyBwZXIgbW9udGgpXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlY29uZHMgPSBhYnMkMSh0aGlzLl9taWxsaXNlY29uZHMpIC8gMTAwMCxcbiAgICAgICAgICAgIGRheXMgPSBhYnMkMSh0aGlzLl9kYXlzKSxcbiAgICAgICAgICAgIG1vbnRocyA9IGFicyQxKHRoaXMuX21vbnRocyksXG4gICAgICAgICAgICBtaW51dGVzLFxuICAgICAgICAgICAgaG91cnMsXG4gICAgICAgICAgICB5ZWFycyxcbiAgICAgICAgICAgIHMsXG4gICAgICAgICAgICB0b3RhbCA9IHRoaXMuYXNTZWNvbmRzKCksXG4gICAgICAgICAgICB0b3RhbFNpZ24sXG4gICAgICAgICAgICB5bVNpZ24sXG4gICAgICAgICAgICBkYXlzU2lnbixcbiAgICAgICAgICAgIGhtc1NpZ247XG5cbiAgICAgICAgaWYgKCF0b3RhbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBDIydzIChOb2RhKSBhbmQgcHl0aG9uIChpc29kYXRlKS4uLlxuICAgICAgICAgICAgLy8gYnV0IG5vdCBvdGhlciBKUyAoZ29vZy5kYXRlKVxuICAgICAgICAgICAgcmV0dXJuICdQMEQnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMzYwMCBzZWNvbmRzIC0+IDYwIG1pbnV0ZXMgLT4gMSBob3VyXG4gICAgICAgIG1pbnV0ZXMgPSBhYnNGbG9vcihzZWNvbmRzIC8gNjApO1xuICAgICAgICBob3VycyA9IGFic0Zsb29yKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgIHNlY29uZHMgJT0gNjA7XG4gICAgICAgIG1pbnV0ZXMgJT0gNjA7XG5cbiAgICAgICAgLy8gMTIgbW9udGhzIC0+IDEgeWVhclxuICAgICAgICB5ZWFycyA9IGFic0Zsb29yKG1vbnRocyAvIDEyKTtcbiAgICAgICAgbW9udGhzICU9IDEyO1xuXG4gICAgICAgIC8vIGluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9kb3JkaWxsZS9tb21lbnQtaXNvZHVyYXRpb24vYmxvYi9tYXN0ZXIvbW9tZW50Lmlzb2R1cmF0aW9uLmpzXG4gICAgICAgIHMgPSBzZWNvbmRzID8gc2Vjb25kcy50b0ZpeGVkKDMpLnJlcGxhY2UoL1xcLj8wKyQvLCAnJykgOiAnJztcblxuICAgICAgICB0b3RhbFNpZ24gPSB0b3RhbCA8IDAgPyAnLScgOiAnJztcbiAgICAgICAgeW1TaWduID0gc2lnbih0aGlzLl9tb250aHMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICBkYXlzU2lnbiA9IHNpZ24odGhpcy5fZGF5cykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG4gICAgICAgIGhtc1NpZ24gPSBzaWduKHRoaXMuX21pbGxpc2Vjb25kcykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRvdGFsU2lnbiArXG4gICAgICAgICAgICAnUCcgK1xuICAgICAgICAgICAgKHllYXJzID8geW1TaWduICsgeWVhcnMgKyAnWScgOiAnJykgK1xuICAgICAgICAgICAgKG1vbnRocyA/IHltU2lnbiArIG1vbnRocyArICdNJyA6ICcnKSArXG4gICAgICAgICAgICAoZGF5cyA/IGRheXNTaWduICsgZGF5cyArICdEJyA6ICcnKSArXG4gICAgICAgICAgICAoaG91cnMgfHwgbWludXRlcyB8fCBzZWNvbmRzID8gJ1QnIDogJycpICtcbiAgICAgICAgICAgIChob3VycyA/IGhtc1NpZ24gKyBob3VycyArICdIJyA6ICcnKSArXG4gICAgICAgICAgICAobWludXRlcyA/IGhtc1NpZ24gKyBtaW51dGVzICsgJ00nIDogJycpICtcbiAgICAgICAgICAgIChzZWNvbmRzID8gaG1zU2lnbiArIHMgKyAnUycgOiAnJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8kMiA9IER1cmF0aW9uLnByb3RvdHlwZTtcblxuICAgIHByb3RvJDIuaXNWYWxpZCA9IGlzVmFsaWQkMTtcbiAgICBwcm90byQyLmFicyA9IGFicztcbiAgICBwcm90byQyLmFkZCA9IGFkZCQxO1xuICAgIHByb3RvJDIuc3VidHJhY3QgPSBzdWJ0cmFjdCQxO1xuICAgIHByb3RvJDIuYXMgPSBhcztcbiAgICBwcm90byQyLmFzTWlsbGlzZWNvbmRzID0gYXNNaWxsaXNlY29uZHM7XG4gICAgcHJvdG8kMi5hc1NlY29uZHMgPSBhc1NlY29uZHM7XG4gICAgcHJvdG8kMi5hc01pbnV0ZXMgPSBhc01pbnV0ZXM7XG4gICAgcHJvdG8kMi5hc0hvdXJzID0gYXNIb3VycztcbiAgICBwcm90byQyLmFzRGF5cyA9IGFzRGF5cztcbiAgICBwcm90byQyLmFzV2Vla3MgPSBhc1dlZWtzO1xuICAgIHByb3RvJDIuYXNNb250aHMgPSBhc01vbnRocztcbiAgICBwcm90byQyLmFzUXVhcnRlcnMgPSBhc1F1YXJ0ZXJzO1xuICAgIHByb3RvJDIuYXNZZWFycyA9IGFzWWVhcnM7XG4gICAgcHJvdG8kMi52YWx1ZU9mID0gdmFsdWVPZiQxO1xuICAgIHByb3RvJDIuX2J1YmJsZSA9IGJ1YmJsZTtcbiAgICBwcm90byQyLmNsb25lID0gY2xvbmUkMTtcbiAgICBwcm90byQyLmdldCA9IGdldCQyO1xuICAgIHByb3RvJDIubWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzO1xuICAgIHByb3RvJDIuc2Vjb25kcyA9IHNlY29uZHM7XG4gICAgcHJvdG8kMi5taW51dGVzID0gbWludXRlcztcbiAgICBwcm90byQyLmhvdXJzID0gaG91cnM7XG4gICAgcHJvdG8kMi5kYXlzID0gZGF5cztcbiAgICBwcm90byQyLndlZWtzID0gd2Vla3M7XG4gICAgcHJvdG8kMi5tb250aHMgPSBtb250aHM7XG4gICAgcHJvdG8kMi55ZWFycyA9IHllYXJzO1xuICAgIHByb3RvJDIuaHVtYW5pemUgPSBodW1hbml6ZTtcbiAgICBwcm90byQyLnRvSVNPU3RyaW5nID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvU3RyaW5nID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvSlNPTiA9IHRvSVNPU3RyaW5nJDE7XG4gICAgcHJvdG8kMi5sb2NhbGUgPSBsb2NhbGU7XG4gICAgcHJvdG8kMi5sb2NhbGVEYXRhID0gbG9jYWxlRGF0YTtcblxuICAgIHByb3RvJDIudG9Jc29TdHJpbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICd0b0lzb1N0cmluZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdG9JU09TdHJpbmcoKSBpbnN0ZWFkIChub3RpY2UgdGhlIGNhcGl0YWxzKScsXG4gICAgICAgIHRvSVNPU3RyaW5nJDFcbiAgICApO1xuICAgIHByb3RvJDIubGFuZyA9IGxhbmc7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignWCcsIDAsIDAsICd1bml4Jyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3gnLCAwLCAwLCAndmFsdWVPZicpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigneCcsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdYJywgbWF0Y2hUaW1lc3RhbXApO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUocGFyc2VGbG9hdChpbnB1dCkgKiAxMDAwKTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCd4JywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHRvSW50KGlucHV0KSk7XG4gICAgfSk7XG5cbiAgICAvLyEgbW9tZW50LmpzXG5cbiAgICBob29rcy52ZXJzaW9uID0gJzIuMjkuMSc7XG5cbiAgICBzZXRIb29rQ2FsbGJhY2soY3JlYXRlTG9jYWwpO1xuXG4gICAgaG9va3MuZm4gPSBwcm90bztcbiAgICBob29rcy5taW4gPSBtaW47XG4gICAgaG9va3MubWF4ID0gbWF4O1xuICAgIGhvb2tzLm5vdyA9IG5vdztcbiAgICBob29rcy51dGMgPSBjcmVhdGVVVEM7XG4gICAgaG9va3MudW5peCA9IGNyZWF0ZVVuaXg7XG4gICAgaG9va3MubW9udGhzID0gbGlzdE1vbnRocztcbiAgICBob29rcy5pc0RhdGUgPSBpc0RhdGU7XG4gICAgaG9va3MubG9jYWxlID0gZ2V0U2V0R2xvYmFsTG9jYWxlO1xuICAgIGhvb2tzLmludmFsaWQgPSBjcmVhdGVJbnZhbGlkO1xuICAgIGhvb2tzLmR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb247XG4gICAgaG9va3MuaXNNb21lbnQgPSBpc01vbWVudDtcbiAgICBob29rcy53ZWVrZGF5cyA9IGxpc3RXZWVrZGF5cztcbiAgICBob29rcy5wYXJzZVpvbmUgPSBjcmVhdGVJblpvbmU7XG4gICAgaG9va3MubG9jYWxlRGF0YSA9IGdldExvY2FsZTtcbiAgICBob29rcy5pc0R1cmF0aW9uID0gaXNEdXJhdGlvbjtcbiAgICBob29rcy5tb250aHNTaG9ydCA9IGxpc3RNb250aHNTaG9ydDtcbiAgICBob29rcy53ZWVrZGF5c01pbiA9IGxpc3RXZWVrZGF5c01pbjtcbiAgICBob29rcy5kZWZpbmVMb2NhbGUgPSBkZWZpbmVMb2NhbGU7XG4gICAgaG9va3MudXBkYXRlTG9jYWxlID0gdXBkYXRlTG9jYWxlO1xuICAgIGhvb2tzLmxvY2FsZXMgPSBsaXN0TG9jYWxlcztcbiAgICBob29rcy53ZWVrZGF5c1Nob3J0ID0gbGlzdFdlZWtkYXlzU2hvcnQ7XG4gICAgaG9va3Mubm9ybWFsaXplVW5pdHMgPSBub3JtYWxpemVVbml0cztcbiAgICBob29rcy5yZWxhdGl2ZVRpbWVSb3VuZGluZyA9IGdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVRocmVzaG9sZCA9IGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZDtcbiAgICBob29rcy5jYWxlbmRhckZvcm1hdCA9IGdldENhbGVuZGFyRm9ybWF0O1xuICAgIGhvb2tzLnByb3RvdHlwZSA9IHByb3RvO1xuXG4gICAgLy8gY3VycmVudGx5IEhUTUw1IGlucHV0IHR5cGUgb25seSBzdXBwb3J0cyAyNC1ob3VyIGZvcm1hdHNcbiAgICBob29rcy5IVE1MNV9GTVQgPSB7XG4gICAgICAgIERBVEVUSU1FX0xPQ0FMOiAnWVlZWS1NTS1ERFRISDptbScsIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiAvPlxuICAgICAgICBEQVRFVElNRV9MT0NBTF9TRUNPTkRTOiAnWVlZWS1NTS1ERFRISDptbTpzcycsIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBzdGVwPVwiMVwiIC8+XG4gICAgICAgIERBVEVUSU1FX0xPQ0FMX01TOiAnWVlZWS1NTS1ERFRISDptbTpzcy5TU1MnLCAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgREFURTogJ1lZWVktTU0tREQnLCAvLyA8aW5wdXQgdHlwZT1cImRhdGVcIiAvPlxuICAgICAgICBUSU1FOiAnSEg6bW0nLCAvLyA8aW5wdXQgdHlwZT1cInRpbWVcIiAvPlxuICAgICAgICBUSU1FX1NFQ09ORFM6ICdISDptbTpzcycsIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgVElNRV9NUzogJ0hIOm1tOnNzLlNTUycsIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIHN0ZXA9XCIwLjAwMVwiIC8+XG4gICAgICAgIFdFRUs6ICdHR0dHLVtXXVdXJywgLy8gPGlucHV0IHR5cGU9XCJ3ZWVrXCIgLz5cbiAgICAgICAgTU9OVEg6ICdZWVlZLU1NJywgLy8gPGlucHV0IHR5cGU9XCJtb250aFwiIC8+XG4gICAgfTtcblxuICAgIHJldHVybiBob29rcztcblxufSkpKTtcbiIsIjxraW4tZHJvcGRvd24gdHlwZT1cInRpbWVwaWNrZXJcIj5cblxuXHQ8ZGl2IHNsb3Q9XCJkcm9wZG93bi1hY3RpdmF0b3JcIj5cblx0XHQ8c2xvdCAvPlxuXHQ8L2Rpdj5cblxuXHR7I2VhY2ggdGltZXMgYXMgdGltZX1cblx0XHQ8a2luLWRyb3Bkb3duLWl0ZW1cblx0XHRcdG9uOmNsaWNrPVwic2V0VGltZSh0aW1lKVwiXG5cdFx0XHRjc3NjbHM9XCItdGltZVwiXG5cdFx0PlxuXHRcdFx0eyB0d2VsdmVob3VyID09PSB0cnVlID8gZm9ybWF0VGltZSh0aW1lKSA6IGZvcm1hdFRpbWUyNCh0aW1lKSB9XG5cdFx0PC9raW4tZHJvcGRvd24taXRlbT5cblx0ey9lYWNofVxuXG48L2tpbi1kcm9wZG93bj5cblxuPHNjcmlwdD5cblxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnXG5cbmxldCB0aW1lcyA9IFtdLCBpXG5cbmZvcihpPTA7IGk8MjQ7IGkrKykge1xuXHR0aW1lcy5wdXNoKCBtb21lbnQoIHtob3VyOiBpfSApIClcblx0dGltZXMucHVzaCggbW9tZW50KCB7aG91cjogaSwgbWludXRlOiAzMH0gKSApXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcblx0dGFnOiAna2luLXRpbWVwaWNrZXInLFxuXHRwcm9wczogWyd0d2VsdmVob3VyJ10sXG5cdGRhdGEoKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRpbWVzOiB0aW1lcyxcblx0XHRcdHR3ZWx2ZWhvdXI6IHRydWUsXG5cdFx0fVxuXHR9LFxuXHRvbmNyZWF0ZSgpIHtcblx0XHR0aGlzLnRhYkluZGV4ID0gMDtcblx0fSxcblx0aGVscGVyczoge1xuXHRcdGZvcm1hdFRpbWU6ICh0KSA9PiBtb21lbnQodCkuZm9ybWF0KCdoOm1tIGEnKSxcblx0XHRmb3JtYXRUaW1lMjQ6ICh0KSA9PiBtb21lbnQodCkuZm9ybWF0KCdISDptbScpLFxuXHR9LFxuXHRtZXRob2RzOiB7XG5cdFx0c2V0VGltZSh0KSB7XG5cdFx0fSxcblx0fVxufTtcblxuPC9zY3JpcHQ+XG5cbjxzdHlsZSB0eXBlPVwidGV4dC9zdHlsdXNcIj5cblxuOmhvc3Rcblx0ZGlzcGxheSBpbmxpbmUtYmxvY2tcblxuPC9zdHlsZT5cbiIsImltcG9ydCBLaW5FbGVtZW50IGZyb20gJy4uL0tpbkVsZW1lbnQuanMnO1xuaW1wb3J0ICcuL2NydW1icy5zdHlsJztcblxuY2xhc3MgQ3J1bWJzIGV4dGVuZHMgS2luRWxlbWVudCB7XG5cdHN0YXRpYyBnZXQgYXR0ckNmZygpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VjdGlvbjogbnVsbCxcblx0XHRcdHNlY3Rpb25sYWJlbDogbnVsbCxcblx0XHRcdG1vZHVsZWxhYmVsOiBudWxsLFxuXHRcdFx0dGl0bGU6IG51bGxcblx0XHR9XG5cdH1cblxuXHRzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcblx0XHRyZXR1cm4gT2JqZWN0LmtleXMoQ3J1bWJzLmF0dHJDZmcpLmZpbHRlcihuYW1lID0+IENydW1icy5hdHRyQ2ZnW25hbWVdKTtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdH1cblxuXHRpbml0RWxlbSgpIHtcblx0XHR0aGlzLmVsVHBsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0dGhpcy5lbFRwbC5jbGFzc0xpc3QuYWRkKCdraW5fY3J1bWJzJyk7XG5cblx0XHRjb25zdCB0aXRsZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCd0aXRsZScpXG5cdFx0aWYgKHRpdGxlKSB7XG5cdFx0XHR0aGlzLnNldFRpdGxlKHRpdGxlKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ3NlY3Rpb24nKSkge1xuXHRcdFx0Y29uc3Qgc2VjdGlvbkxhYmVsID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3NlY3Rpb25sYWJlbCcpXG5cdFx0XHRjb25zdCBzZWN0aW9uID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3NlY3Rpb24nKVxuXG5cdFx0XHRjb25zdCBzZWN0aW9uSXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRcdHNlY3Rpb25JdGVtLmNsYXNzTGlzdC5hZGQoJ2tpbl9jcnVtYnNfX2l0ZW0nKTtcblx0XHRcdHNlY3Rpb25JdGVtLnNldEF0dHJpYnV0ZSgnaHJlZicsICcjJyArIHNlY3Rpb24pO1xuXHRcdFx0c2VjdGlvbkl0ZW0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc2VjdGlvbkxhYmVsIHx8IHNlY3Rpb24pKTtcblxuXHRcdFx0dGhpcy5lbFRwbC5hcHBlbmRDaGlsZChzZWN0aW9uSXRlbSk7XG5cblx0XHRcdGNvbnN0IG1vZHVsZUxhYmVsID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ21vZHVsZWxhYmVsJylcblx0XHRcdGlmIChtb2R1bGVMYWJlbCkge1xuXHRcdFx0XHR0aGlzLnNldFRpdGxlKG1vZHVsZUxhYmVsKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRzZXRUaXRsZSh0aXRsZSkge1xuXHRcdGNvbnN0IHRpdGxlSXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblx0XHR0aXRsZUl0ZW0uY2xhc3NMaXN0LmFkZCgna2luX2NydW1ic19faXRlbScpO1xuXHRcdHRpdGxlSXRlbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aXRsZSkpO1xuXHRcdHRoaXMuZWxUcGwuYXBwZW5kQ2hpbGQodGl0bGVJdGVtKTtcblx0fVxuXG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgna2luLWNydW1icycsIENydW1icyk7XG4iLCJpbXBvcnQgS2luRWxlbWVudCBmcm9tICcuLi9LaW5FbGVtZW50LmpzJztcbmltcG9ydCAnLi90aWxlLnN0eWwnO1xuXG5jbGFzcyBUaWxlIGV4dGVuZHMgS2luRWxlbWVudCB7XG5cdHN0YXRpYyBnZXQgYXR0ckNmZygpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bGluazogeyAvLyB0aWxlIHdpdGggbGluayAtIDxhIGhyZWY9XCJ7bGlua31cIj5cblx0XHRcdFx0dXBkYXRlRm46ICd1cGRhdGVBdHRyJyxcblx0XHRcdFx0dXBkYXRlQ2ZnOiB7XG5cdFx0XHRcdFx0bmFtZTogJ2hyZWYnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRwcm9jZXNzaW5nOiB7IC8vIGFjdGlvbiBpbiBwcm9ncmVzcywgdmlzdWFsIHByb2dyZXNzXG5cdFx0XHRcdHVwZGF0ZUZuOiAndG9nZ2xlQ2xhc3MnLFxuXHRcdFx0XHR1cGRhdGVDZmc6IHtcblx0XHRcdFx0XHRjc3NDbHM6ICctcHJvY2Vzc2luZydcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGxhYmVsOiB7IC8vIHByaW1hcnkgbGFiZWxcblx0XHRcdFx0dXBkYXRlRm46ICdjb21wb25lbnQnLFxuXHRcdFx0XHR1cGRhdGVDZmc6IHtcblx0XHRcdFx0XHRlbDogJ2VsTGFiZWwnLFxuXHRcdFx0XHRcdHNldDogZnVuY3Rpb24gKGF0dHJWYWx1ZSkge1xuXHRcdFx0XHRcdFx0dGhpcy5lbExhYmVsLmlubmVyVGV4dCA9IGF0dHJWYWx1ZTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGNyZWF0ZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0dGhpcy5lbExhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDQnKTtcblx0XHRcdFx0XHRcdHRoaXMuZWxMYWJlbC5jbGFzc0xpc3QuYWRkKCdraW5fdGlsZV9fbGFiZWwnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZXNjOiB7IC8vIHNlY29uZGFyeSB0ZXh0XG5cdFx0XHRcdHVwZGF0ZUZuOiAnY29tcG9uZW50Jyxcblx0XHRcdFx0dXBkYXRlQ2ZnOiB7XG5cdFx0XHRcdFx0ZWw6ICdlbERlc2MnLFxuXHRcdFx0XHRcdHNldDogZnVuY3Rpb24gKGF0dHJWYWx1ZSkge1xuXHRcdFx0XHRcdFx0dGhpcy5lbERlc2MuaW5uZXJUZXh0ID0gYXR0clZhbHVlO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Y3JlYXRlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmVsRGVzYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcblx0XHRcdFx0XHRcdHRoaXMuZWxEZXNjLmNsYXNzTGlzdC5hZGQoJ2tpbl90aWxlX19kZXNjJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0c3RhdHVzOiB7IC8vIGRlc2NyaXB0aW9uIGNvbG9yXG5cdFx0XHRcdHVwZGF0ZUZuOiAndXBkYXRlQ2xhc3MnXG5cdFx0XHR9LFxuXHRcdFx0aWNvbjogeyAvLyB0aWxlIGljb25cblx0XHRcdFx0dXBkYXRlRm46ICdjb21wb25lbnQnLFxuXHRcdFx0XHR1cGRhdGVDZmc6IHtcblx0XHRcdFx0XHRlbDogJ2VsSWNvbicsXG5cdFx0XHRcdFx0c2V0OiBmdW5jdGlvbiAoYXR0clZhbHVlKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmVsSWNvbi5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBhdHRyVmFsdWUpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Y3JlYXRlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmVsSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2tpbi1pY29uJyk7XG5cdFx0XHRcdFx0XHR0aGlzLmVsSWNvbi5jbGFzc0xpc3QuYWRkKCdraW5fdGlsZV9faWNvbicpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdraW4tZGlzYWJsZWQnOiB7IC8vIG5lZWQgdG8gcHJlZml4IGJlY2F1c2UgJ2Rpc2FibGVkJyBpcyByZXNlcnZlZCBmb3IgZm9jdXNhYmxlIGVsZW1lbnRzXG5cdFx0XHRcdHVwZGF0ZUZuOiAndG9nZ2xlQXR0cicsXG5cdFx0XHRcdHVwZGF0ZUNmZzoge1xuXHRcdFx0XHRcdGF0dHJOYW1lOiAnZGlzYWJsZWQnLFxuXHRcdFx0XHRcdGF0dHJWYWx1ZTogdHJ1ZVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0dGl0bGU6IHsgLy8gdGl0bGVcblx0XHRcdFx0dXBkYXRlRm46ICd1cGRhdGVBdHRyJyxcblx0XHRcdFx0dXBkYXRlQ2ZnOiB7XG5cdFx0XHRcdFx0bmFtZTogJ3RpdGxlJ1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0c2l6ZTogeyAvLyB0aWxlIHNpemUgbGFyZ2V8c21hbGx8aHVnZVxuXHRcdFx0XHR1cGRhdGVGbjogJ3VwZGF0ZUNsYXNzJ1xuXHRcdFx0fSxcblx0XHRcdGZsdWlkOiB7IC8vIHNldHMgdGhlIHNpemUgKHcvaCkgYWNjb3JkaW5nIHRvIHRoZSB3cmFwcGluZyBlbFxuXHRcdFx0XHR1cGRhdGVGbjogJ3RvZ2dsZUNsYXNzJyxcblx0XHRcdFx0dXBkYXRlQ2ZnOiB7XG5cdFx0XHRcdFx0Y3NzQ2xzOiAnLWZsdWlkJ1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3RpbGUtYnV0dG9uJzoge1xuXHRcdFx0XHR1cGRhdGVGbjogJ2NvbXBvbmVudCcsXG5cdFx0XHRcdHVwZGF0ZUNmZzoge1xuXHRcdFx0XHRcdGVsOiAnZWxCdXR0b24nLFxuXHRcdFx0XHRcdHNldDogZnVuY3Rpb24gKGF0dHJWYWx1ZSkge1xuXHRcdFx0XHRcdFx0dGhpcy5lbEJ1dHRvbi5pbm5lclRleHQgPSBhdHRyVmFsdWU7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRjcmVhdGU6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHRoaXMuZWxCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdraW4tYnV0dG9uJyk7XG5cdFx0XHRcdFx0XHR0aGlzLmVsQnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdzZWNvbmRhcnknKTtcblx0XHRcdFx0XHRcdHRoaXMuZWxCdXR0b24uY2xhc3NMaXN0LmFkZCgna2luX3RpbGVfX2J0bicpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHRzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcblx0XHRyZXR1cm4gT2JqZWN0LmtleXMoVGlsZS5hdHRyQ2ZnKS5maWx0ZXIobmFtZSA9PiBUaWxlLmF0dHJDZmdbbmFtZV0pO1xuXHR9XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdGluaXRFbGVtKCkge1xuXHRcdGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnbGluaycpKSB7XG5cdFx0XHR0aGlzLmVsVHBsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmVsVHBsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5lbFRwbC5jbGFzc0xpc3QuYWRkKCdraW5fdGlsZScpO1xuXHR9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgna2luLXRpbGUnLCBUaWxlKTtcbiIsImltcG9ydCBLaW5FbGVtZW50IGZyb20gJy4uL0tpbkVsZW1lbnQuanMnO1xuaW1wb3J0ICcuL3N3aXRjaC5zdHlsJztcblxuY2xhc3MgU3dpdGNoIGV4dGVuZHMgS2luRWxlbWVudCB7XG5cdHN0YXRpYyBnZXQgYXR0ckNmZygpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0J2tpbi1kaXNhYmxlZCc6IHsgLy8gbmVlZCB0byBwcmVmaXggYmVjYXVzZSAnZGlzYWJsZWQnIGlzIHJlc2VydmVkIGZvciBmb2N1c2FibGUgZWxlbWVudHNcblx0XHRcdFx0dXBkYXRlRm46IFsndG9nZ2xlQXR0cicsICd0b2dnbGVDbGFzcyddLFxuXHRcdFx0XHR1cGRhdGVDZmc6IFt7XG5cdFx0XHRcdFx0YXR0ck5hbWU6ICdkaXNhYmxlZCcsXG5cdFx0XHRcdFx0YXR0clZhbHVlOiB0cnVlLFxuXHRcdFx0XHRcdGVsOiAnZWxTd2l0Y2gnXG5cdFx0XHRcdH0sIHtcblx0XHRcdFx0XHRjc3NDbHM6ICctZGlzYWJsZWQnLFxuXHRcdFx0XHRcdGVsOiAnZWxTd2l0Y2gnXG5cdFx0XHRcdH1dXG5cdFx0XHR9LFxuXHRcdFx0Y2hlY2tlZDoge1xuXHRcdFx0XHR1cGRhdGVGbjogWyd0b2dnbGVBdHRyJywgJ3RvZ2dsZUNsYXNzJ10sXG5cdFx0XHRcdHVwZGF0ZUNmZzogW3tcblx0XHRcdFx0XHRhdHRyTmFtZTogJ2NoZWNrZWQnLFxuXHRcdFx0XHRcdGF0dHJWYWx1ZTogdHJ1ZSxcblx0XHRcdFx0XHRlbDogJ2VsU3dpdGNoJ1xuXHRcdFx0XHR9LCB7XG5cdFx0XHRcdFx0Y3NzQ2xzOiAnLWNoZWNrZWQnLFxuXHRcdFx0XHRcdGVsOiAnZWxTd2l0Y2gnXG5cdFx0XHRcdH1dXG5cdFx0XHR9LFxuXHRcdFx0cHJvY2Vzc2luZzogeyAvLyBhY3Rpb24gaW4gcHJvZ3Jlc3MsIHZpc3VhbCBwcm9ncmVzc1xuXHRcdFx0XHR1cGRhdGVGbjogWyd0b2dnbGVBdHRyJywgJ3RvZ2dsZUNsYXNzJ10sXG5cdFx0XHRcdHVwZGF0ZUNmZzogW3tcblx0XHRcdFx0XHRhdHRyTmFtZTogJ2Rpc2FibGVkJyxcblx0XHRcdFx0XHRhdHRyVmFsdWU6IHRydWUsXG5cdFx0XHRcdFx0ZWw6ICdlbFN3aXRjaCdcblx0XHRcdFx0fSwge1xuXHRcdFx0XHRcdGNzc0NsczogJy1wcm9jZXNzaW5nJyxcblx0XHRcdFx0XHRlbDogJ2VsU3dpdGNoJ1xuXHRcdFx0XHR9XVxuXHRcdFx0fSxcblx0XHRcdGxvY2tlZDogeyAvLyBsb2NrZWQgZmVhdHVyZSBzd2l0Y2hcblx0XHRcdFx0dXBkYXRlRm46IFsndG9nZ2xlQXR0cicsICd0b2dnbGVDbGFzcyddLFxuXHRcdFx0XHR1cGRhdGVDZmc6IFt7XG5cdFx0XHRcdFx0YXR0ck5hbWU6ICdsb2NrZWQnLFxuXHRcdFx0XHRcdGF0dHJWYWx1ZTogdHJ1ZSxcblx0XHRcdFx0XHRlbDogJ2VsU3dpdGNoJ1xuXHRcdFx0XHR9LCB7XG5cdFx0XHRcdFx0Y3NzQ2xzOiAnLWxvY2tlZCcsXG5cdFx0XHRcdFx0ZWw6ICdlbFN3aXRjaCdcblx0XHRcdFx0fV1cblx0XHRcdH0sXG5cdFx0XHR0aXRsZTogeyAvLyB0aXRsZVxuXHRcdFx0XHR1cGRhdGVGbjogJ3VwZGF0ZUF0dHInLFxuXHRcdFx0XHR1cGRhdGVDZmc6IHtcblx0XHRcdFx0XHRuYW1lOiAndGl0bGUnLFxuXHRcdFx0XHRcdGVsOiAnZWxTd2l0Y2gnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnZGF0YS10ZXN0JzogbnVsbCwgLy8gYXV0b21hdGlvbiBsb2NhdG9yXG5cdFx0XHR0cml2aWFsOiB7XG5cdFx0XHRcdHVwZGF0ZUZuOiAndG9nZ2xlQ2xhc3MnLFxuXHRcdFx0XHR1cGRhdGVDZmc6IHtcblx0XHRcdFx0XHRjc3NDbHM6ICctdHJpdmlhbCcsXG5cdFx0XHRcdFx0ZWw6ICdlbFN3aXRjaCdcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHNpemU6IHtcblx0XHRcdFx0dXBkYXRlRm46ICd1cGRhdGVDbGFzcycsXG5cdFx0XHRcdHVwZGF0ZUNmZzoge1xuXHRcdFx0XHRcdGVsOiAnZWxTd2l0Y2gnXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcblx0XHRyZXR1cm4gT2JqZWN0LmtleXMoU3dpdGNoLmF0dHJDZmcpLmZpbHRlcihuYW1lID0+IFN3aXRjaC5hdHRyQ2ZnW25hbWVdKTtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdH1cblxuXHRpbml0RWxlbSgpIHtcblx0XHR0aGlzLmVsVHBsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0dGhpcy5lbFN3aXRjaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG5cdFx0dGhpcy5lbFN3aXRjaEhhbmRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdHRoaXMuZWxTd2l0Y2hJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgna2luLWljb24nKTtcblxuXHRcdHRoaXMuZWxUcGwuYXBwZW5kQ2hpbGQodGhpcy5lbFN3aXRjaCk7XG5cdFx0dGhpcy5lbFRwbC5hcHBlbmRDaGlsZCh0aGlzLmVsU3dpdGNoSGFuZGxlKTtcblxuXHRcdHRoaXMuZWxTd2l0Y2hJY29uLnNldEF0dHJpYnV0ZSgnc2l6ZScsICcxMicpO1xuXHRcdHRoaXMuZWxTd2l0Y2hJY29uLmNsYXNzTGlzdC5hZGQoJ2tpbl9zd2l0Y2hfX2ljb24nKTtcblx0XHR0aGlzLmVsU3dpdGNoSGFuZGxlLmFwcGVuZENoaWxkKHRoaXMuZWxTd2l0Y2hJY29uKTtcblxuXHRcdGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS10ZXN0JykpIHtcblx0XHRcdHRoaXMuZWxTd2l0Y2guc2V0QXR0cmlidXRlKCdkYXRhLXRlc3QnLCB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS10ZXN0JykpO1xuXHRcdFx0dGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtdGVzdCcpO1xuXHRcdH1cblxuXHRcdHRoaXMuZWxTd2l0Y2guY2xhc3NMaXN0LmFkZCgna2luX3N3aXRjaCcpO1xuXHRcdHRoaXMuZWxTd2l0Y2guc2V0QXR0cmlidXRlKCd0eXBlJywgJ2NoZWNrYm94Jyk7XG5cdFx0dGhpcy5lbFN3aXRjaEhhbmRsZS5jbGFzc0xpc3QuYWRkKCdraW5fc3dpdGNoX19oYW5kbGUnKTtcblx0fVxuXG5cdHVwZGF0ZUljb24oKSB7XG5cdFx0Y29uc3QgY2hlY2tlZCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdjaGVja2VkJykgPT09ICd0cnVlJyB8fCB0aGlzLmdldEF0dHJpYnV0ZSgnY2hlY2tlZCcpID09PSAnJztcblx0XHRjb25zdCBsb2NrZWQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbG9ja2VkJykgPT09ICd0cnVlJztcblx0XHRsZXQgaWNvbiA9IGNoZWNrZWQgPyAnc3dpdGNoLW9rJyA6ICdzd2l0Y2gteCc7XG5cdFx0aWNvbiA9IGxvY2tlZCA/ICdpY29uLXMtZmlsbC1sb2NrJyA6IGljb247XG5cblx0XHR0aGlzLmVsU3dpdGNoSWNvbi5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBpY29uKTtcblx0fVxuXG5cdHVwZGF0ZUVsZW0oKSB7XG5cdFx0Ly8gVE9ETzogcm96ZWJyYXQgdXBkYXRlIGljb25cblx0XHR0aGlzLnVwZGF0ZUljb24oKTtcblx0fVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2tpbi1zd2l0Y2gnLCBTd2l0Y2gpO1xuIiwiaW1wb3J0ICcuL2NvbXBvbmVudHMvcGFnZS9pbmRleCc7XG5pbXBvcnQgJy4vY29tcG9uZW50cy90YWJsZS9pbmRleCc7XG5pbXBvcnQgJy4vY29tcG9uZW50cy92aWV3L2luZGV4JztcbmltcG9ydCAnLi9jb21wb25lbnRzL2NpcmNsZXMvaW5kZXgnO1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvcHJvZ3Jlc3MvaW5kZXgnO1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvaWNvbi9pbmRleCc7XG5pbXBvcnQgJy4vY29tcG9uZW50cy9sb2FkaW5nL2luZGV4JztcbmltcG9ydCAnLi9jb21wb25lbnRzL2lwbS9pcG0uanMnO1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvdG9vbHRpcC90b29sdGlwLmpzJztcbmltcG9ydCAnLi9jb21wb25lbnRzL2J1dHRvbi9idXR0b24uanMnO1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvZHJvcGRvd24vZHJvcGRvd24uanMnO1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvZHJvcGRvd24taXRlbS9kcm9wZG93bkl0ZW0uanMnO1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvaW5wdXQvaW5wdXQuanMnO1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvc2VsZWN0L3NlbGVjdC5qcyc7XG5pbXBvcnQgJy4vY29tcG9uZW50cy90aW1lcGlja2VyL2luZGV4JztcbmltcG9ydCAnLi9jb21wb25lbnRzL2NydW1icy9jcnVtYnMuanMnO1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvdGlsZS90aWxlLmpzJztcbmltcG9ydCAnLi9jb21wb25lbnRzL3N3aXRjaC9zd2l0Y2guanMnO1xuXG5pbXBvcnQgeyBnZXRUb3BaaW5kZXgsIGRlbGF5RXZlbnQsIHVpZCB9IGZyb20gJy4vbGlicy9Db21wb01peGluLmpzJztcbmltcG9ydCB0cmFwVGFiTmF2aWdhdGlvbiBmcm9tICcuL2xpYnMvdHJhcFRhYk5hdmlnYXRpb24uanMnO1xuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiJdLCJuYW1lcyI6WyJEcm9wQWdlbnQiLCJ0aGlzIiwicmVxdWlyZSJdLCJtYXBwaW5ncyI6Ijs7OztDQUFBLFNBQVMsSUFBSSxHQUFHLEVBQUU7QUFDbEI7Q0FDQSxTQUFTLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0NBQzFCLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNwQyxDQUFDLE9BQU8sR0FBRyxDQUFDO0NBQ1osQ0FBQztBQUNEO0NBQ0EsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtDQUM5QixDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDL0IsQ0FBQyxPQUFPLEdBQUcsQ0FBQztDQUNaLENBQUM7QUE0QkQ7Q0FDQSxTQUFTLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFO0NBQzlCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUMxQixDQUFDO0FBQ0Q7Q0FDQSxTQUFTLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtDQUN0QyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0NBQ25DLENBQUM7QUFDRDtDQUNBLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRTtDQUMxQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ25DLENBQUM7QUFzQ0Q7Q0FDQSxTQUFTLFdBQVcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFO0NBQ3pDLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtDQUNoRCxFQUFFLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7Q0FDN0MsRUFBRTtDQUNGLENBQUM7QUFLRDtDQUNBLFNBQVMsYUFBYSxDQUFDLElBQUksRUFBRTtDQUM3QixDQUFDLE9BQU8sUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNyQyxDQUFDO0FBQ0Q7Q0FDQSxTQUFTLGdCQUFnQixDQUFDLElBQUksRUFBRTtDQUNoQyxDQUFDLE9BQU8sUUFBUSxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUNyRSxDQUFDO0FBQ0Q7Q0FDQSxTQUFTLFVBQVUsQ0FBQyxJQUFJLEVBQUU7Q0FDMUIsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDdEMsQ0FBQztBQUNEO0NBQ0EsU0FBUyxhQUFhLEdBQUc7Q0FDekIsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7Q0FDbkMsQ0FBQztBQUNEO0NBQ0EsU0FBUyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFO0NBQ3BELENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7Q0FDaEQsQ0FBQztBQUNEO0NBQ0EsU0FBUyxjQUFjLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFO0NBQ3ZELENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7Q0FDbkQsQ0FBQztBQUNEO0NBQ0EsU0FBUyxZQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUU7Q0FDOUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztDQUNwRCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0NBQzFDLENBQUM7QUFhRDtDQUNBLFNBQVMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7Q0FDakQsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7Q0FDbkIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0NBQ3JCLEVBQUUsTUFBTTtDQUNSLEVBQUUsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Q0FDbEMsRUFBRTtDQUNGLENBQUM7QUFDRDtDQUNBLFNBQVMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUU7Q0FDbkQsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLDhCQUE4QixFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztDQUN2RSxDQUFDO0FBb0REO0NBQ0EsU0FBUyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRTtDQUM3QixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztDQUN2QixDQUFDO0FBT0Q7Q0FDQSxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtDQUNwQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztDQUNwQyxDQUFDO0FBOEREO0NBQ0EsU0FBUyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7Q0FDNUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDcEQsQ0FBQztBQWdvQkQ7Q0FDQSxTQUFTLFdBQVcsR0FBRztDQUN2QixDQUFDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUM1QixDQUFDO0FBQ0Q7Q0FDQSxTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUU7Q0FDekIsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztDQUNyQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Q0FDdEIsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztBQUNqQjtDQUNBLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDO0NBQ3BDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Q0FDdkIsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztDQUNsQixDQUFDO0FBUUQ7Q0FDQSxTQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0NBQ3hCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEtBQUssT0FBTyxDQUFDLEtBQUssVUFBVSxDQUFDLENBQUM7Q0FDL0YsQ0FBQztBQUtEO0NBQ0EsU0FBUyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRTtDQUMvQixDQUFDLElBQUksUUFBUTtDQUNiLEVBQUUsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztDQUNuRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTztBQUN2QjtDQUNBLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtDQUM5QyxFQUFFLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QjtDQUNBLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7Q0FDMUIsR0FBRyxJQUFJO0NBQ1AsSUFBSSxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztDQUM3QixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQzdCLElBQUksU0FBUztDQUNiLElBQUksT0FBTyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Q0FDOUIsSUFBSTtDQUNKLEdBQUc7Q0FDSCxFQUFFO0NBQ0YsQ0FBQztBQUNEO0NBQ0EsU0FBUyxLQUFLLENBQUMsU0FBUyxFQUFFO0NBQzFCLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7Q0FDeEIsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0NBQ2xDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztDQUM5QixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7Q0FDakMsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztDQUN6QixDQUFDO0FBQ0Q7Q0FDQSxTQUFTLEdBQUcsR0FBRztDQUNmLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0NBQ3BCLENBQUM7QUFDRDtDQUNBLFNBQVMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUU7Q0FDbEMsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLFdBQVcsRUFBRSxDQUFDO0NBQ3JDLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxXQUFXLEVBQUUsQ0FBQztDQUNsQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztDQUNqQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQ3hCO0NBQ0EsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztDQUM3QixDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUM7Q0FDNUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDekQ7Q0FDQSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO0NBQ3BCLEVBQUUsU0FBUyxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7Q0FDL0IsRUFBRSxTQUFTLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztDQUMzQixFQUFFLFNBQVMsQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO0NBQzlCLEVBQUU7Q0FDRixDQUFDO0FBQ0Q7Q0FDQSxTQUFTLEVBQUUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFO0NBQ2hDLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0NBQzlFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN4QjtDQUNBLENBQUMsT0FBTztDQUNSLEVBQUUsTUFBTSxFQUFFLFdBQVc7Q0FDckIsR0FBRyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztDQUN6QyxHQUFHO0NBQ0gsRUFBRSxDQUFDO0NBQ0gsQ0FBQztBQUNEO0NBQ0EsU0FBUyxHQUFHLENBQUMsUUFBUSxFQUFFO0NBQ3ZCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7Q0FDakMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU87Q0FDN0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ2xCLENBQUM7QUFDRDtDQUNBLFNBQVMsSUFBSSxDQUFDLFFBQVEsRUFBRTtDQUN4QixDQUFDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNO0NBQzNCLEVBQUUsT0FBTyxHQUFHLEVBQUU7Q0FDZCxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDaEI7Q0FDQSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztDQUMzQyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQ25CO0NBQ0EsQ0FBQyxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsRUFBRTtDQUMzQixFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUM7Q0FDL0UsRUFBRTtDQUNGLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPO0FBQ3BCO0NBQ0EsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0NBQ3RELENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0NBQ3ZDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNsRDtDQUNBLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO0NBQ3JCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0NBQ3JGLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztDQUN6QyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztDQUN0RixFQUFFO0NBQ0YsQ0FBQztBQUNEO0NBQ0EsU0FBUyxNQUFNLENBQUMsUUFBUSxFQUFFO0NBQzFCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7Q0FDaEMsQ0FBQztBQVlEO0NBQ0EsU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFO0NBQ3RCLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztDQUN6QyxDQUFDO0FBQ0Q7Q0FDQSxTQUFTLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFO0NBQ2hDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQztDQUN0RSxDQUFDO0FBU0Q7Q0FDQSxJQUFJLEtBQUssR0FBRztDQUNaLENBQUMsT0FBTztDQUNSLENBQUMsR0FBRztDQUNKLENBQUMsSUFBSTtDQUNMLENBQUMsRUFBRTtDQUNILENBQUMsR0FBRztDQUNKLENBQUMsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQyxJQUFJO0NBQ0wsQ0FBQyxNQUFNO0NBQ1AsQ0FBQyxNQUFNO0NBQ1AsQ0FBQyxRQUFRO0NBQ1QsQ0FBQzs7OztjQ3Y5QlcsR0FBRztDQUNQLElBQUksT0FBTztDQUNuQixRQUFnQixHQUFHLEVBQUUsS0FBSztDQUMxQixRQUFnQixPQUFPLEVBQUUsRUFBRTtDQUMzQixRQUFnQixNQUFNLEVBQUUsRUFBRTtDQUMxQixRQUFnQixXQUFXLEVBQUUsRUFBRTtDQUMvQixRQUFnQixhQUFhLEVBQUUsVUFBVTtDQUN6QyxRQUFnQixNQUFNLEVBQUUsS0FBSztDQUM3QixRQUFnQixRQUFRLEVBQUUsS0FBSztDQUMvQixRQUFnQixXQUFXLEVBQUUsRUFBRTtDQUMvQixRQUFnQixNQUFNLEVBQUUsRUFBRTtDQUMxQixRQUFnQixJQUFJLEVBQUUsSUFBSTtDQUMxQixRQUFnQixTQUFTLEVBQUUsS0FBSztDQUNoQyxRQUFnQixRQUFRLEVBQUUsRUFBRTtDQUM1QixRQUFnQixTQUFTLEVBQUUsTUFBTTtDQUNqQyxRQUFnQixPQUFPLEVBQUUsS0FBSztDQUM5QixRQUFnQixZQUFZLEVBQUUsSUFBSTtDQUNsQyxRQUFnQixZQUFZLEVBQUUsSUFBSTtDQUNsQyxRQUFnQixhQUFhLEVBQUUsQ0FBQztHQUM5QixRQUFRLEVBQUUsRUFBRTtDQUNOLEtBQUs7Q0FDTCxDQUFDO2VBQ1E7Q0FDVCxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSztDQUMzQjtDQUNRLEtBQUs7Q0FDYixJQUFZLGNBQWMsR0FBRztDQUM3QixRQUFnQixNQUFNLGNBQWMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxXQUFXLEVBQUU7Q0FDcEUsWUFBb0IsTUFBTSxFQUFFLFdBQVc7Q0FDdkMsWUFBb0IsT0FBTyxFQUFFLElBQUk7Q0FDakMsWUFBb0IsVUFBVSxFQUFFLElBQUk7Q0FDcEMsWUFBb0IsUUFBUSxFQUFFLElBQUk7Q0FDbEMsU0FBaUIsQ0FBQyxDQUFDOztDQUVYLFFBQVEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztDQUMzQyxLQUFLO0NBQ2IsSUFBWSxlQUFlLEdBQUc7Q0FDdEIsUUFBUSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxDQUFDO0NBQ3JFLEtBQUs7Q0FDTCxDQUFDOztrQkFDTyxHQUFHO0NBQ1gsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztDQUN6QyxDQUFDOzs7OztXQTFJSCxPQUFPLEtBQUssTUFBTSxRQUFJLE9BQU8sS0FBSyxJQUFJOzs7Ozs7Ozs7Ozs7eURBRmIsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLE9BQUcsR0FBRyxHQUFHLEVBQUUsZUFBRyxNQUFNLEdBQUcsR0FBRyxLQUFDLE1BQU0sR0FBRyxFQUFFLGNBQUcsTUFBTTsyQkFBYyxRQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7O3VIQUF2RixHQUFHLElBQUksS0FBSyxHQUFHLEdBQUcsT0FBRyxHQUFHLEdBQUcsRUFBRSxlQUFHLE1BQU0sR0FBRyxHQUFHLEtBQUMsTUFBTSxHQUFHLEVBQUUsY0FBRyxNQUFNOzs7Ozs0QkFBYyxRQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztXQTJCN0csT0FBTyxJQUFJLEVBQUU7Ozs7Ozs7bUJBU2IsTUFBRSxNQUFNLEtBQUssTUFBTSxRQUFJLE1BQU0sS0FBSyxJQUFJLENBQUM7OztXQW1CeEMsSUFBSSxJQUFJLE9BQU8sUUFBSSxTQUFTLElBQUksTUFBTTtXQUlsQyxTQUFTLElBQUksTUFBTTs7Ozs7O3VCQU92QixXQUFXLElBQUksTUFBRSxNQUFNLEtBQUssTUFBTSxRQUFJLE1BQU0sS0FBSyxJQUFJLENBQUM7OztXQVF2RCxNQUFNLEtBQUssTUFBTSxRQUFJLE1BQU0sS0FBSyxJQUFJOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQXRDbEMsTUFBRSxNQUFNLEtBQUssTUFBTSxRQUFJLE1BQU0sS0FBSyxJQUFJLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WUE4QnhDLFdBQVcsSUFBSSxNQUFFLE1BQU0sS0FBSyxNQUFNLFFBQUksTUFBTSxLQUFLLElBQUksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztXQTlEdkQsT0FBTyxJQUFJLEVBQUU7Ozs7Ozs7Ozs7Ozs7bURBUXFCLFlBQVk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29EQUFaLFlBQVk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt1QkFnQlgsT0FBTzs7Ozs7d0JBQVAsT0FBTzs7Ozs7Ozs7Ozs7Ozs7OztrQkFjdEMsS0FBQyxRQUFRLEtBQUssTUFBTSxRQUFJLFFBQVEsS0FBSyxJQUFJLFNBQUssV0FBVyxJQUFJLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQUEvRCxLQUFDLFFBQVEsS0FBSyxNQUFNLFFBQUksUUFBUSxLQUFLLElBQUksU0FBSyxXQUFXLElBQUksRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBRWpFLFdBQVc7Ozs7Ozs7Ozs7O3VCQUFYLFdBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7O2FBZ0J1QixnQkFBZ0I7Ozs7Ozs7Ozs7O3VCQUFVLFNBQVM7Ozs7Ozs7Ozs7d0JBQVQsU0FBUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztnQ0FKM0MsUUFBUSxJQUFJLEVBQUUsT0FBRyxRQUFRLEdBQUcsWUFBWTtrQkFBVyxTQUFTOzs7Ozs7Ozs7bUVBQTVELFFBQVEsSUFBSSxFQUFFLE9BQUcsUUFBUSxHQUFHLFlBQVk7Ozs7O21CQUFXLFNBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lCQVd6RCxXQUFXO2tCQUFVLGFBQWE7Ozs7Ozs7Ozs7a0JBQWxDLFdBQVc7Ozs7bUJBQVUsYUFBYTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tFQWlCMUIsUUFBUSxLQUFLLE1BQU0sUUFBSSxRQUFRLEtBQUssSUFBSSxHQUFHLFdBQVcsR0FBRyxFQUFFOzs7Ozs7Ozs7O2lHQUEzRCxRQUFRLEtBQUssTUFBTSxRQUFJLFFBQVEsS0FBSyxJQUFJLEdBQUcsV0FBVyxHQUFHLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3VCQS9FaEUsT0FBTzs7Ozs7d0JBQVAsT0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQ3lFL0M7Q0FDRDtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0NBRUE7Q0FDQTtDQUNBOztDQUVBO0NBQ0E7Q0FDQTs7Q0FFQTtDQUNBO0NBQ0E7O0NBRUE7Q0FDQTtDQUNBOztDQUVBO0NBQ0E7O0NBRUE7Q0FDQTtDQUNBOztDQUVBOztDQUVDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLO0NBQ3hELENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO0NBQ3JCLEVBQUcsT0FBTyxJQUFJLENBQUM7Q0FDZCxFQUFFO0NBQ0gsQ0FBRSxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0NBQ3RDLENBQUMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsSUFBSSxHQUFHLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQztDQUN4RSxFQUFDOztDQUVGLHVCQW1EbUIsRUFBRSxVQUFVLEVBQUU7U0FBSyxpQkFBaUIsQ0FBQyxVQUFVLENBQUM7OzsyQkFDN0MsRUFBRSxhQUFhLEVBQUU7U0FBSyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7Ozs2QkFDcEQsRUFBRSxlQUFlLEVBQUU7U0FBSyxpQkFBaUIsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDOzs7d0JBQ25FLEVBQUUsV0FBVyxFQUFFO1NBQUssaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7OzsyQkFDckQsRUFBRSxhQUFhLEVBQUU7U0FBSyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7OztnQkEvQnRFLEdBQUc7Q0FDUCxDQUFDLE9BQU87Q0FDVixFQUFJLFdBQVcsRUFBRSxPQUFPO0NBQ3hCLEVBQUksTUFBTSxFQUFFLEVBQUU7Q0FDZCxFQUFJLGVBQWUsRUFBRSxFQUFFO0NBQ3ZCLEVBQUksVUFBVSxFQUFFLElBQUk7Q0FDcEIsRUFBSSxRQUFRLEVBQUUsRUFBRTtDQUNoQixFQUFJLFFBQVEsRUFBRSxLQUFLO0NBQ25CLEVBQUksT0FBTyxFQUFFLElBQUk7Q0FDakIsRUFBSSxZQUFZLEVBQUUsSUFBSTtDQUN0QixFQUFJLE9BQU8sRUFBRSxLQUFLO0NBQ2xCLEVBQUksZUFBZSxFQUFFLElBQUk7Q0FDekIsRUFBSSxJQUFJLEVBQUUsRUFBRTtDQUNaLEVBQUksU0FBUyxFQUFFLEtBQUs7Q0FDcEIsRUFBSSxXQUFXLEVBQUUsSUFBSTtDQUNyQixFQUFJLGtCQUFrQixFQUFFLElBQUk7Q0FDNUIsRUFBSSxhQUFhLEVBQUUsSUFBSTtDQUN2QixFQUFJLGFBQWEsRUFBRSxDQUFDO0NBQ3BCLEVBQUksYUFBYSxFQUFFLElBQUk7Q0FDdkIsRUFBSSxRQUFRLEVBQUUsSUFBSTtDQUNsQixFQUFJLFdBQVcsRUFBRSxFQUFFO0NBQ25CLEVBQUksV0FBVyxFQUFFLEVBQUU7Q0FDbkIsRUFBSSxjQUFjLEVBQUUsS0FBSztDQUN6QixFQUFJLGFBQWEsRUFBRSxLQUFLO0NBQ3RCLEVBQUU7Q0FDRixDQUFDO2lCQVFRO0NBQ1QsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFO0NBQ2IsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFekQsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxFQUFFLEtBQUssZ0JBQWdCLEVBQUU7Q0FDdEUsR0FBSyxNQUFNLGFBQWEsR0FBRyxJQUFJLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRTtDQUM5RCxJQUFNLE1BQU0sRUFBRTtDQUNkO0NBQ0E7Q0FDRSxLQUFLO0NBQ1AsSUFBTSxPQUFPLEVBQUUsSUFBSTtDQUNuQixJQUFNLFVBQVUsRUFBRSxJQUFJO0NBQ3RCLElBQU0sUUFBUSxFQUFFLElBQUk7Q0FDcEIsSUFBTSxDQUFDLENBQUM7O0NBRU4sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0NBQ3ZDLEdBQUssT0FBTyxLQUFLO0NBQ2YsR0FBRztDQUNILEVBQUU7Q0FDSixDQUFHLE1BQU0sR0FBRztDQUNaLEVBQUksTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUNwQyxFQUFJLElBQUksUUFBUSxFQUFFO0NBQ2xCLEdBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0NBQ2pDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Q0FDOUIsR0FBRztDQUNILEVBQUU7Q0FDSixDQUFHLFFBQVEsR0FBRztDQUNkLEVBQUksTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUNsQyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7Q0FDbkIsR0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Q0FDaEMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztDQUNoQyxHQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Q0FDekMsR0FBRztDQUNILEVBQUU7Q0FDSixDQUFHLGFBQWEsR0FBRztDQUNqQixFQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRTtDQUNqQyxJQUFNLElBQUksQ0FBQyxNQUFNO0NBQ2pCLElBQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0NBQ3hELElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUN2QixJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUM7Q0FDM0IsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztDQUMvQixJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0NBQzVCLElBQUksQ0FBQztDQUNMLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Q0FDcEIsRUFBRTtDQUNKLENBQUcsZ0JBQWdCLEdBQUc7Q0FDcEIsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Q0FDMUIsR0FBSyxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3ZDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7O0NBRS9CLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7Q0FDM0MsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFO0NBQ3hCLElBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztDQUMxQyxJQUFJO0NBQ0osR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztDQUM1QixHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0NBQ2hDLEdBQUc7Q0FDSCxFQUFFO0NBQ0osQ0FBRyxtQkFBbUIsR0FBRztDQUN2QixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7Q0FDcEMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Q0FDcEYsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO0NBQ3RDLEdBQUc7Q0FDSCxFQUFFO0NBQ0YsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUU7Q0FDbEMsRUFBRSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtDQUNyQyxHQUFLLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLFNBQVMsS0FBSyxDQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRTtDQUM1RCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztDQUN4RixJQUFJLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7Q0FDeEMsSUFBSTtDQUNKLEdBQUc7Q0FDSCxFQUFFO0NBQ0o7Q0FDRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsTUFBTSxHQUFHLEtBQUssRUFBRTtDQUNsRCxFQUFJLElBQUksSUFBSSxFQUFFO0NBQ1osR0FBRyxJQUFJLE1BQU0sSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUU7Q0FDaEYsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7Q0FDNUQsSUFBSTtDQUNOLEdBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRTtDQUNoRCxHQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7Q0FDdkMsR0FBRztDQUNILEVBQUU7Q0FDSjtDQUNBLENBQUcsaUJBQWlCLENBQUMsWUFBWSxFQUFFLE1BQU0sR0FBRyxLQUFLLEVBQUU7Q0FDbkQsRUFBSSxNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEVBQUksSUFBSSxRQUFRLEdBQUcsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Q0FDcEQsRUFBSSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLGFBQWEsRUFBRTtDQUN0RCxHQUFLLFFBQVEsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztDQUNoRCxHQUFHO0NBQ0gsRUFBRSxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUU7Q0FDcEIsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0NBQ2hCLEdBQUc7Q0FDTCxFQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUUsT0FBTztDQUN0RCxFQUFFLE1BQU0sTUFBTSxHQUFHLGFBQWEsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUM7Q0FDOUcsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO0NBQ2pDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQztDQUM3RSxHQUFHO0NBQ0gsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztDQUMvQixFQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0NBQ25DLEVBQUU7Q0FDSjtDQUNBLENBQUcsU0FBUyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFO0NBQzNDLEVBQUksTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUNwQyxFQUFJLElBQUksVUFBVSxFQUFFO0NBQ2xCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7Q0FDekQsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztDQUM3QixHQUFHO0NBQ0wsRUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksV0FBVyxDQUFDLG9CQUFvQixFQUFFO0NBQzdELEdBQUssTUFBTSxFQUFFO0NBQ2IsSUFBTSxLQUFLLEVBQUUsUUFBUTtDQUNyQixJQUFNLEdBQUcsRUFBRSxNQUFNO0NBQ2pCLElBQU0sUUFBUSxFQUFFLFFBQVE7Q0FDdEIsSUFBSTtDQUNOLEdBQUssT0FBTyxFQUFFLElBQUk7Q0FDbEIsR0FBSyxDQUFDLENBQUMsQ0FBQztDQUNSLEVBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxNQUFNO0NBQzVDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7Q0FDM0QsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztDQUMvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDVCxHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFO0NBQ3JCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7Q0FDekIsR0FBRyxPQUFPO0NBQ1YsR0FBRzs7Q0FFSCxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtDQUMzQixHQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksV0FBVyxDQUFDLGtCQUFrQixFQUFFO0NBQ3hFLElBQU0sTUFBTSxFQUFFO0NBQ2QsS0FBTyxRQUFRLEVBQUUsQ0FBQztDQUNoQixLQUFLO0NBQ1AsSUFBTSxDQUFDLENBQUMsQ0FBQztDQUNQLEdBQUcsTUFBTTtDQUNYLEdBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0NBQ2pDLEdBQUc7Q0FDSCxFQUFFO0NBQ0o7Q0FDQTtDQUNFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFO0NBQzlCLEVBQUksSUFBSSxNQUFNLENBQUM7Q0FDZixFQUFJLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDdkMsRUFBRSxJQUFJLElBQUksSUFBSSxTQUFTLEVBQUU7Q0FDekIsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO0NBQ25CLEdBQUcsTUFBTTtDQUNULEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0NBQ25FLEdBQUc7Q0FDSCxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0NBQ2hELEVBQUU7Q0FDRixDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFO0NBQzdCLEVBQUksTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFeEMsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Q0FDMUIsR0FBSyxNQUFNLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUN0QyxHQUFLLE1BQU0sUUFBUSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNwRSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0NBQ3pCLEdBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDakMsR0FBRzs7Q0FFTCxFQUFJLElBQUksY0FBYyxFQUFFO0NBQ3hCLEdBQUssTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Q0FDL0MsR0FBSyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7O0NBRXRHLEdBQUcsSUFBSSxlQUFlLEdBQUcsQ0FBQyxFQUFFO0NBQzlCLElBQU0sTUFBTSxjQUFjLEdBQUcsSUFBSSxXQUFXLENBQUMsV0FBVyxFQUFFO0NBQzFELEtBQU8sTUFBTSxFQUFFO0NBQ2IsTUFBTSxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTO0NBQ3ZDLE1BQVEsR0FBRyxFQUFFLGVBQWU7Q0FDMUIsTUFBTSxRQUFRLEVBQUUsSUFBSSxDQUFDLHNCQUFzQjtDQUMzQyxNQUFNO0NBQ1IsS0FBTyxDQUFDLENBQUM7Q0FDUCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7Q0FDdkMsSUFBSTtDQUNKLEdBQUc7Q0FDSCxFQUFFO0NBQ0osQ0FBRyxhQUFhLEdBQUc7Q0FDakIsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Q0FDdkIsR0FBRyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7Q0FDMUIsR0FBRztDQUNMLEVBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0NBQ3hELEVBQUksSUFBSSxLQUFLLEVBQUU7Q0FDZixHQUFLLE9BQU8sSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO0NBQy9DLEdBQUc7Q0FDTCxFQUFJLE9BQU8sQ0FBQyxDQUFDO0NBQ1gsRUFBRTtDQUNKO0NBQ0E7Q0FDQSxDQUFHLGVBQWUsR0FBRztDQUNuQixFQUFFLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO0NBQ25DLEdBQUcsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7Q0FDdEMsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sS0FBSztDQUN4RSxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtDQUN6QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUU7Q0FDakMsS0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDaEMsS0FBSztDQUNMLElBQUk7O0NBRUosR0FBRyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxDQUFDLE1BQU07Q0FDL0MsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Q0FDMUIsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFO0NBQ2hDLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztDQUMxQyxNQUFNLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0NBQ2hDLE1BQU0sT0FBTztDQUNiLE1BQU07O0NBRU4sS0FBSyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Q0FDNUIsTUFBTSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxZQUFZLENBQUM7Q0FDekUsTUFBTSxNQUFNO0NBQ2QsTUFBUSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDO0NBQ3ZELE1BQU07Q0FDTixLQUFLLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztDQUN2RSxLQUFLLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO0NBQ3hFLEtBQU8sSUFBSSxDQUFDLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztDQUN2RCxLQUFPLE9BQU8sRUFBRSxDQUFDO0NBQ2YsS0FBSyxNQUFNO0NBQ1gsS0FBSyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRTtDQUNqQyxNQUFRLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Q0FDeEQsTUFBUSxPQUFPLEVBQUUsQ0FBQztDQUNoQixNQUFNLE1BQU07Q0FDWixNQUFNLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7Q0FDMUMsTUFBTSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztDQUNoQyxNQUFNO0NBQ04sS0FBSztDQUNMLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUNYLEdBQUssQ0FBQyxDQUFDO0NBQ0wsRUFBRTtDQUNKO0NBQ0E7Q0FDQTtDQUNBO0NBQ0EsQ0FBRyxZQUFZLEdBQUc7Q0FDaEIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtDQUM3QixHQUFHLE9BQU87Q0FDVixHQUFHOztDQUVMLEVBQUksTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDNUgsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Q0FDeEIsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFO0NBQ2xCLElBQUksT0FBTztDQUNYLElBQUk7O0NBRUosR0FBRyxJQUFJLGdCQUFnQixJQUFJLFFBQVEsRUFBRTtDQUNyQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0NBQzVCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxHQUFHLGdCQUFnQixHQUFHLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO0NBQzNGLElBQUksTUFBTTtDQUNWLElBQUksSUFBSSxhQUFhLEdBQUcsa0JBQWtCLEVBQUU7Q0FDOUMsS0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU07Q0FDdkMsTUFBUSxJQUFJLFNBQVE7Q0FDcEIsTUFBUSxJQUFJLFlBQVksRUFBRTtDQUMxQixPQUFTLElBQUksV0FBVyxFQUFFO0NBQ3hCLFFBQVEsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Q0FDakYsUUFBUSxNQUFNO0NBQ2hCLFFBQVUsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztDQUMvRixRQUFRO0NBQ1YsT0FBUyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDNUMsT0FBTyxNQUFNO0NBQ2IsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Q0FDekIsT0FBUyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0NBQzdDLE9BQU87Q0FDVCxNQUFRLENBQUMsQ0FBQztDQUNSLEtBQUssTUFBTTtDQUNYLEtBQUssSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Q0FDL0IsS0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztDQUN0QyxLQUFLO0NBQ0wsSUFBSTs7Q0FFSixHQUFHLE1BQU07Q0FDWDtDQUNBLEdBQUssSUFBSSxRQUFRLEVBQUU7Q0FDbkIsSUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztDQUNyQyxJQUFJOztDQUVOO0NBQ0EsR0FBSyxJQUFJLGdCQUFnQixFQUFFO0NBQzNCLElBQU0sSUFBSSxRQUFRLEVBQUU7Q0FDbEIsS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFO0NBQzdCLE9BQVMsSUFBSSxDQUFDLE1BQU07Q0FDbEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztDQUN6RCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0NBQ25ELE9BQU8sQ0FBQztDQUNSLE9BQU8sS0FBSyxDQUFDLEtBQUssSUFBSTtDQUN0QixPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Q0FDOUIsT0FBUyxDQUFDLENBQUM7Q0FDVCxLQUFLLE1BQU07Q0FDWCxLQUFLLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0NBQ2pDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7Q0FDeEQsS0FBSztDQUNMLElBQUk7Q0FDSixHQUFHO0NBQ0gsRUFBRTtDQUNKO0NBQ0EsQ0FBRyxtQkFBbUIsR0FBRztDQUN6QixFQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Q0FDakUsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLE1BQU07Q0FDNUMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Q0FDdkIsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQ1IsRUFBRTtDQUNKO0NBQ0EsQ0FBRyxjQUFjLEdBQUc7Q0FDcEIsRUFBSSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDNUMsRUFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztDQUNqQztDQUNBLEVBQUksSUFBSSxrQkFBa0IsRUFBRTtDQUM1QjtDQUNFLEdBQUcsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0NBQ3ZCLEdBQUcsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO0NBQ3ZCLEdBQUcsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDO0NBQzVCLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsTUFBTTtDQUMzQyxJQUFNLFdBQVcsRUFBRSxDQUFDO0NBQ3BCLElBQU0sSUFBSSxXQUFXLEdBQUcsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO0NBQzdELEtBQU8sSUFBSSxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0NBQzFELEtBQUs7Q0FDUCxJQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtDQUNsQyxLQUFLLE9BQU87Q0FDWixLQUFLOztDQUVQO0NBQ0EsSUFBTSxJQUFJLGtCQUFrQixFQUFFO0NBQzVCLEtBQUssSUFBSSxDQUFDLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FDekUsS0FBTyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztDQUN6RCxLQUFLLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtDQUM3QjtDQUNFLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO0NBQzdCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDO0NBQ3BELE9BQU8sSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLElBQUk7Q0FDdkMsUUFBVSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7Q0FDbEcsUUFBUSxDQUFDO0NBQ1g7Q0FDRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksV0FBVyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQztDQUNsRixPQUFPLE1BQU07Q0FDYixPQUFPLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxRQUFRLENBQUM7Q0FDNUMsT0FBTyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssSUFBSTtDQUNyQyxRQUFRLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztDQUMzRSxRQUFRLENBQUM7Q0FDVCxPQUFPO0NBQ1AsTUFBTSxNQUFNO0NBQ2QsTUFBUSxPQUFPLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxHQUFHLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxDQUFDO0NBQ3ZGLE1BQU07Q0FDTixLQUFLO0NBQ0wsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztDQUM3QixJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7Q0FDcEIsR0FBRyxNQUFNO0NBQ1g7Q0FDRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0NBQzVCLEdBQUc7Q0FDSCxFQUFFO0NBQ0osQ0FBRyxpQkFBaUIsR0FBRztDQUNyQixFQUFFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0NBQzlCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Q0FDN0IsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztDQUMzQixFQUFFO0NBQ0osQ0FBRyxpQkFBaUIsR0FBRztDQUNyQixFQUFFLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtDQUM1QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Q0FDekYsR0FBRztDQUNILEVBQUU7Q0FDRixDQUFDOztvQkFDTyxHQUFHO0NBQ1gsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNoRSxDQUFDO21CQUNRLEdBQUc7Q0FDZCxDQUFHLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7Q0FDeEUsQ0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Q0FDeEQsQ0FBRyxJQUFJLENBQUMsZ0JBQWdCLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0NBQ2hFLENBQUcsSUFBSSxDQUFDLGlCQUFpQixJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztDQUNsRSxDQUFHLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7Q0FDcEUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDbEMsQ0FBQztrQkFDTyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRTtDQUN6QyxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7Q0FDdEUsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsVUFBVSxDQUFDLE1BQU07Q0FDL0MsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Q0FDekIsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQ1IsRUFBRTs7Q0FFSixDQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO0NBQzdDLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Q0FDN0IsRUFBRTs7Q0FFRixDQUFDLElBQUksT0FBTyxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUU7Q0FDckMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7Q0FDNUQsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztDQUM3QixFQUFFOztDQUVGLENBQUMsSUFBSSxPQUFPLENBQUMsY0FBYyxLQUFLLElBQUksRUFBRTtDQUN0QyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0NBQzNCLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtDQUNqQyxFQUFJLE1BQU0sYUFBYSxHQUFHLElBQUksV0FBVyxDQUFDLHdCQUF3QixFQUFFO0NBQ3BFLEdBQUssTUFBTSxFQUFFO0NBQ1gsSUFBSSxTQUFTLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixHQUFHLENBQUM7Q0FDN0M7Q0FDQTtDQUNFLElBQUk7Q0FDTixHQUFLLE9BQU8sRUFBRSxJQUFJO0NBQ2xCLEdBQUssVUFBVSxFQUFFLElBQUk7Q0FDckIsR0FBSyxRQUFRLEVBQUUsSUFBSTtDQUNuQixHQUFLLENBQUMsQ0FBQzs7Q0FFTCxFQUFFLElBQUksT0FBTyxDQUFDLGdCQUFnQixLQUFLLENBQUMsRUFBRTtDQUN0QyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7Q0FDdkMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0NBQ3JDLEdBQUc7O0NBRUgsRUFBRSxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLGdCQUFnQixLQUFLLENBQUMsRUFBRTtDQUN6RSxHQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0NBQ3hDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztDQUNyQyxHQUFHO0NBQ0gsRUFBRTtDQUNGLENBQUM7Ozs7O2FBcmxCd0IsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7Ozs7V0FRekUsT0FBTyxLQUFLLE1BQU0sUUFBSSxPQUFPLEtBQUssSUFBSTtXQUlsQyxVQUFVLElBQUksSUFBSSxRQUFJLGFBQWEsS0FBSyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7MkRBVjVCLE1BQU0sY0FBRyxVQUFVLElBQUksSUFBSSxRQUFJLGFBQWEsS0FBSyxDQUFDLEdBQUcsUUFBUSxHQUFHLEVBQUUsZUFBRyxRQUFRLEtBQUssTUFBTSxHQUFHLFdBQVcsR0FBRyxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MkpBQTNHLE1BQU0sY0FBRyxVQUFVLElBQUksSUFBSSxRQUFJLGFBQWEsS0FBSyxDQUFDLEdBQUcsUUFBUSxHQUFHLEVBQUUsZUFBRyxRQUFRLEtBQUssTUFBTSxHQUFHLFdBQVcsR0FBRyxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7dUJBMEIzSCxnQkFBZ0IsR0FBRyxDQUFDOzttQkFhcEIsTUFBRSxRQUFRLFFBQUksYUFBYSxPQUFHLGdCQUFnQixDQUFDOzt1QkFVL0MsZ0JBQWdCLFFBQUksYUFBYSxPQUFHLGdCQUFnQjs7dUJBWXBELGFBQWEsS0FBSyxHQUFHOzt1QkFNckIsYUFBYTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBekNiLGdCQUFnQixHQUFHLENBQUM7Ozs7Ozs7Ozs7O1FBYXBCLE1BQUUsUUFBUSxRQUFJLGFBQWEsT0FBRyxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7WUFVL0MsZ0JBQWdCLFFBQUksYUFBYSxPQUFHLGdCQUFnQjs7Ozs7Ozs7Ozs7OztZQVlwRCxhQUFhLEtBQUssR0FBRzs7Ozs7Ozs7Ozs7WUFNckIsYUFBYTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztXQWZYLFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2FBR00sVUFBVTs7Ozs7OzBCQUEwQixXQUFXOzs7Ozs7Ozs7Ozs7dUJBQVgsV0FBVzs7Ozs7Ozs7Ozs7Ozs7Ozs7OzthQUYvQyxRQUFROzs7Ozs7MEJBQTBCLFdBQVc7Ozs7Ozs7Ozs7Ozt1QkFBWCxXQUFXOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs4QkNBM0MsRUFBRSxTQUFTLEVBQUUsRUFBSztDQUMzQyxDQUFJLE9BQU8sU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssTUFBTSxDQUFDO0NBQ25ELENBQUM7OzhCQUNxQixFQUFFLFNBQVMsRUFBRSxFQUFLO0NBQzNDLENBQUksT0FBTyxTQUFTLEtBQUssS0FBSyxJQUFJLFNBQVMsS0FBSyxPQUFPLENBQUM7Q0FDckQsQ0FBQzs7Z0JBakJFLEdBQUc7Q0FDUCxDQUFDLE9BQU87Q0FDVixFQUFJLEdBQUcsRUFBRSxLQUFLO0NBQ2QsRUFBSSxNQUFNLEVBQUUsRUFBRTtDQUNkLEVBQUksV0FBVyxFQUFFLENBQUM7Q0FDbEIsRUFBSSxVQUFVLEVBQUUsQ0FBQztDQUNqQixFQUFJLFFBQVEsRUFBRSxLQUFLO0NBQ25CLEVBQUksT0FBTyxFQUFFLEtBQUs7Q0FDbEIsRUFBSSxTQUFTLEVBQUUsSUFBSTtDQUNqQixFQUFFO0NBQ0YsQ0FBQztpQkFTUTtDQUNYLENBQUcsU0FBUyxHQUFHO0NBQ2IsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0NBQ3RFLEVBQUksSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDOztDQUV0QyxFQUFFLElBQUksU0FBUyxHQUFHLEtBQUssR0FBRztDQUM1QixHQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNoQyxHQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUM3QixHQUFHLE1BQU07Q0FDVCxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0NBQ3pELEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLEdBQUcsR0FBRyxTQUFTLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDMUQsR0FBRztDQUNILEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO0NBQzlCLEdBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRTtDQUMxRCxJQUFNLE1BQU0sRUFBRTtDQUNkLEtBQU8sU0FBUyxFQUFFLFNBQVM7Q0FDM0IsS0FBTyxPQUFPLEVBQUUsS0FBSztDQUNuQixLQUFLO0NBQ1AsSUFBTSxDQUFDLENBQUMsQ0FBQztDQUNQLEdBQUc7Q0FDSCxFQUFFO0NBQ0osQ0FBRyxZQUFZLEdBQUc7Q0FDaEIsRUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7Q0FDdkQsRUFBRTtDQUNGLENBQUM7O29CQUNPLEdBQUc7Q0FDWCxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDOztDQUV0QyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFL0QsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtDQUNuRCxFQUFFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLEtBQUssS0FBSztDQUM3QyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0NBQ2hELEdBQUcsQ0FBQzs7Q0FFTixFQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztDQUNuRixFQUFFOztDQUVGLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEtBQUssS0FBSztDQUNqQyxFQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUMxQixHQUFHLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVE7Q0FDL0IsR0FBSyxJQUFJLEVBQUUsQ0FBQztDQUNaLEdBQUssUUFBUSxFQUFFLFFBQVE7Q0FDdkIsR0FBSyxDQUFDLENBQUM7Q0FDTCxFQUFFLENBQUM7Q0FDTCxDQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7O0NBRTdELENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU07Q0FDL0IsRUFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztDQUM5QixFQUFFLENBQUM7Q0FDTCxDQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztDQUN6RSxDQUFDO3FCQUVRLEdBQUc7Q0FDWixDQUFDLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUNoRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFO0NBQ3JELEVBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0NBQ3RGLEVBQUU7Q0FDSixDQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztDQUM5RSxDQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Q0FDaEUsQ0FBQzs7Ozs7V0FuSEcsT0FBTyxLQUFLLE1BQU0sUUFBSSxPQUFPLEtBQUssSUFBSTs7Ozs7Ozs7YUFIaEMsV0FBVzs7O21CQTZCbEIsS0FBQyxtQkFBbUIsU0FBSyxRQUFRLEtBQUssSUFBSSxRQUFJLG1CQUFtQixDQUFDOzs7Ozs7Ozs7Ozt5REE5QnJELEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxPQUFHLEdBQUcsR0FBRyxFQUFFLFdBQUcsS0FBQyxRQUFRLEtBQUssSUFBSSxRQUFJLG1CQUFtQixJQUFJLFVBQVUsR0FBRyxFQUFFLGNBQUcsTUFBTTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt3SkFBckcsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLE9BQUcsR0FBRyxHQUFHLEVBQUUsV0FBRyxLQUFDLFFBQVEsS0FBSyxJQUFJLFFBQUksbUJBQW1CLElBQUksVUFBVSxHQUFHLEVBQUUsY0FBRyxNQUFNOzs7O1FBOEJsSCxLQUFDLG1CQUFtQixTQUFLLFFBQVEsS0FBSyxJQUFJLFFBQUksbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tFQW5CeEMsV0FBVyxHQUFHLEVBQUUsR0FBRyxZQUFZLEdBQUcsRUFBRTtrQ0FBbUIsV0FBVzs7MERBSzFFLFVBQVUsR0FBRyxFQUFFLEdBQUcsWUFBWSxHQUFHLEVBQUU7a0NBQW1CLFVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7b0dBTHhELFdBQVcsR0FBRyxFQUFFLEdBQUcsWUFBWSxHQUFHLEVBQUU7Ozs7O21DQUFtQixXQUFXOzs7MkZBSzFFLFVBQVUsR0FBRyxFQUFFLEdBQUcsWUFBWSxHQUFHLEVBQUU7Ozs7O21DQUFtQixVQUFVOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NDUHZGLGVBR00sR0FBRztDQUNQLENBQUMsT0FBTztDQUNWLEVBQUksR0FBRyxFQUFFLEtBQUs7Q0FDZCxFQUFJLE1BQU0sRUFBRSxFQUFFO0NBQ2QsRUFBSSxLQUFLLEVBQUUsRUFBRTtDQUNYLEVBQUU7Q0FDRixDQUFDO29CQUNPLEdBQUc7TUFDUixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztDQUN4QyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs4REF4QnNCLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxPQUFHLEdBQUcsR0FBRyxFQUFFLGVBQUcsS0FBSyxHQUFHLEdBQUcsT0FBRyxLQUFLLEdBQUcsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7eUdBQXhELEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxPQUFHLEdBQUcsR0FBRyxFQUFFLGVBQUcsS0FBSyxHQUFHLEdBQUcsT0FBRyxLQUFLLEdBQUcsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2dCQ2lDNUUsR0FBRztDQUNQLENBQUMsT0FBTztDQUNULEVBQUcsR0FBRyxFQUFFLEtBQUs7Q0FDYixFQUFHLFVBQVUsRUFBRSxDQUFDO0NBQ2hCLEVBQUcsSUFBSSxFQUFFLElBQUk7Q0FDYixFQUFHLE1BQU0sRUFBRSxLQUFLO0NBQ2hCLEVBQUcsTUFBTSxFQUFFLEVBQUU7Q0FDYixFQUFHLFVBQVUsRUFBRSxLQUFLO0NBQ3BCLEVBQUcsYUFBYSxFQUFFLEtBQUs7Q0FDdkIsRUFBRyxhQUFhLEVBQUUsS0FBSztDQUN2QixFQUFHLFdBQVcsRUFBRSxJQUFJO0NBQ25CLEVBQUU7Q0FDRixDQUFDO2lCQUVRO0NBQ1YsQ0FBRSx1QkFBdUIsR0FBRztDQUMzQixFQUFFLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO0NBQ2hDLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0NBQzNDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQztDQUN4QyxHQUFHO0NBQ0gsRUFBRTs7Q0FFSCxDQUFFLHVCQUF1QixHQUFHO0NBQzNCLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBQztDQUNqQyxFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztDQUNsQixFQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFFO0NBQ2xDLEVBQUcsSUFBSSxlQUFlLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDOztDQUU3QyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxXQUFXLENBQUMsTUFBTTtDQUMvQyxHQUFHLGVBQWUsSUFBSSxJQUFJLENBQUM7Q0FDM0IsR0FBRyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0NBQy9GLEdBQUcsSUFBSSxRQUFRLElBQUksR0FBRyxFQUFFO0NBQ3hCLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7Q0FDbkMsSUFBSSxNQUFNLElBQUksUUFBUSxJQUFJLEVBQUUsRUFBRTtDQUM5QixJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7Q0FDZixJQUFJO0NBQ0wsR0FBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7Q0FDcEMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ1YsRUFBRTtDQUNGLENBQUM7O29CQUVPLEdBQUc7Q0FDWCxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ3BDLENBQUM7cUJBd0JRLEdBQUc7Q0FDWixDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0NBQ2hDLENBQUM7aUJBeEJNLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFO0NBQ3ZDO0NBQ0E7O0NBRUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUU7Q0FDMUIsRUFBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRTtDQUNsQyxFQUFHLElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxVQUFVLEtBQUssTUFBTSxFQUFFO0NBQ3BELEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7Q0FDbEMsR0FBRyxNQUFNO0NBQ1QsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztDQUNsQyxHQUFHO0NBQ0gsRUFBRTs7Q0FFRixDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRTtDQUMxQixFQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFFOztDQUVsQyxFQUFHLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsRUFBRTtDQUNuQyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0NBQ2xDLEdBQUc7Q0FDSCxFQUFFO0NBQ0YsQ0FBQzs7Ozs7V0E1RkksTUFBTTs7Ozs7OzttQkFrQlAsS0FBQyxNQUFNLFFBQUksYUFBYTs7Ozs7Ozs7Ozs2REF4QkgsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLE9BQUcsR0FBRyxHQUFHLEVBQUUsY0FBRyxNQUFNLGNBQUcsSUFBSSxHQUFHLEdBQUcsT0FBRyxJQUFJLEdBQUcsT0FBTyxHQUFHLEVBQUU7aUNBQ2xGLE1BQUUsVUFBVSxJQUFJLENBQUMsQ0FBQztxQ0FDbEIsYUFBYTtvQ0FDZCxNQUFNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7eUhBSEksR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLE9BQUcsR0FBRyxHQUFHLEVBQUUsY0FBRyxNQUFNLGNBQUcsSUFBSSxHQUFHLEdBQUcsT0FBRyxJQUFJLEdBQUcsT0FBTyxHQUFHLEVBQUU7Ozs7O2tDQUNsRixNQUFFLFVBQVUsSUFBSSxDQUFDLENBQUM7Ozs7c0NBQ2xCLGFBQWE7Ozs7cUNBQ2QsTUFBTTs7O1FBcUJqQixLQUFDLE1BQU0sUUFBSSxhQUFhOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29EQUxZLFVBQVUsSUFBSSxDQUFDLEdBQUcsUUFBUSxPQUFHLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxTQUFFLFdBQVcsR0FBRyxtQkFBbUIsT0FBRyxXQUFXLEdBQUcsR0FBRyxHQUFHLEVBQUU7Ozs7Ozs7O3dHQUEvRyxVQUFVLElBQUksQ0FBQyxHQUFHLFFBQVEsT0FBRyxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQUUsU0FBRSxXQUFXLEdBQUcsbUJBQW1CLE9BQUcsV0FBVyxHQUFHLEdBQUcsR0FBRyxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7NktBRi9HLElBQUksQ0FBQyxLQUFLLEtBQUMsVUFBVSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7dUVBVjNCLFVBQVUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFFBQVE7OztnREFJekIsVUFBVSxJQUFJLENBQUMsR0FBRyxRQUFRLE9BQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxFQUFFOztnREFDOUMsVUFBVSxHQUFHLENBQUMsUUFBSSxVQUFVLEdBQUcsR0FBRyxHQUFHLE9BQU8sT0FBRyxVQUFVLEdBQUcsR0FBRyxHQUFHLFlBQVk7OzZFQUdsRixVQUFVLElBQUksR0FBRyxHQUFHLE9BQU8sR0FBRyxNQUFNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3dHQVIxQyxVQUFVLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFROzs7OzZFQUl6QixVQUFVLElBQUksQ0FBQyxHQUFHLFFBQVEsT0FBRyxVQUFVLEdBQUcsR0FBRyxHQUFHLEVBQUU7Ozs7NkVBQzlDLFVBQVUsR0FBRyxDQUFDLFFBQUksVUFBVSxHQUFHLEdBQUcsR0FBRyxPQUFPLE9BQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxZQUFZOzs7OzhHQUdsRixVQUFVLElBQUksR0FBRyxHQUFHLE9BQU8sR0FBRyxNQUFNOzs7O21GQUVyQyxJQUFJLENBQUMsS0FBSyxLQUFDLFVBQVUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzZCQVF2QixJQUFJLENBQUMsS0FBSyxLQUFDLFVBQVUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7bUZBQXRCLElBQUksQ0FBQyxLQUFLLEtBQUMsVUFBVSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NDWjlELGVBR00sR0FBRztDQUNQLENBQUMsT0FBTztDQUNWLEVBQUksR0FBRyxFQUFFLEtBQUs7Q0FDZCxFQUFJLElBQUksRUFBRSxFQUFFO0NBQ1osRUFBSSxJQUFJLEVBQUUsSUFBSTtDQUNkLEVBQUksS0FBSyxFQUFFLEVBQUU7Q0FDYixFQUFJLE1BQU0sRUFBRSxFQUFFO0NBQ2QsRUFBSSxLQUFLLEVBQUUsRUFBRTtDQUNiLEVBQUksT0FBTyxFQUFFLEVBQUU7Q0FDYixFQUFFO0NBQ0YsQ0FBQztpQkFXUTtDQUNYLENBQUcsTUFBTSxHQUFHO0NBQ1YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUN2RCxFQUFFO0NBQ0YsQ0FBQzs7b0JBZE8sR0FBRztDQUNYLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVmLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7O0NBRWhFLENBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ3ZGLENBQUM7cUJBQ1EsR0FBRztDQUNaLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztDQUMvQixDQUFDOzs7Ozs7Ozs7dUZBOUI4QixJQUFJO3FDQUxyQixJQUFJO3FDQUFXLEtBQUssT0FBRyxLQUFLLE9BQUcsSUFBSTtvRUFDakMsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLE9BQUcsR0FBRyxHQUFHLEVBQUUsZUFBRyxPQUFPLElBQUksTUFBTSxHQUFHLE9BQU8sR0FBRyxFQUFFLGNBQUcsTUFBTSxjQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsUUFBUSxHQUFHLEVBQUUsZUFBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLFFBQVEsR0FBRyxFQUFFOzs7Ozs7Ozs7OztrR0FJbEgsSUFBSTs7Ozs7c0NBTHJCLElBQUk7Ozs7c0NBQVcsS0FBSyxPQUFHLEtBQUssT0FBRyxJQUFJOzs7d0lBQ2pDLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxPQUFHLEdBQUcsR0FBRyxFQUFFLGVBQUcsT0FBTyxJQUFJLE1BQU0sR0FBRyxPQUFPLEdBQUcsRUFBRSxjQUFHLE1BQU0sY0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLFFBQVEsR0FBRyxFQUFFLGVBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxRQUFRLEdBQUcsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Z0JDVTdJLEdBQUc7Q0FDUCxDQUFDLE9BQU87Q0FDVixFQUFJLEtBQUssRUFBRSxJQUFJO0NBQ2YsRUFBSSxNQUFNLEVBQUUsS0FBSztDQUNqQixFQUFJLElBQUksRUFBRSxJQUFJO0NBQ2QsRUFBSSxVQUFVLEVBQUUsS0FBSztDQUNyQixFQUFJLFFBQVEsRUFBRSxLQUFLO0NBQ2pCLEVBQUU7Q0FDRixDQUFDOzs7O3NCQWxCRyxLQUFLOzs7Ozs7Ozs7dUVBRHdCLE1BQU0sR0FBRyxTQUFTLEdBQUcsRUFBRSxlQUFHLFFBQVEsR0FBRyxXQUFXLEdBQUcsRUFBRSxlQUFHLElBQUksR0FBRyxHQUFHLE9BQUcsSUFBSSxHQUFHLEVBQUU7OERBRHhGLFVBQVUsS0FBSyxNQUFNLEdBQUcsYUFBYSxHQUFHLEVBQUU7Ozs7Ozs7Ozs7O3dJQUNoQyxNQUFNLEdBQUcsU0FBUyxHQUFHLEVBQUUsZUFBRyxRQUFRLEdBQUcsV0FBVyxHQUFHLEVBQUUsZUFBRyxJQUFJLEdBQUcsR0FBRyxPQUFHLElBQUksR0FBRyxFQUFFOzs7O1lBQzNHLEtBQUs7Ozs7Ozs7Ozs7Ozs7K0ZBRmMsVUFBVSxLQUFLLE1BQU0sR0FBRyxhQUFhLEdBQUcsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQkFHL0IsS0FBSzs7Ozs7Ozs7Ozs7dUJBQUwsS0FBSzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NDSDFCLE1BQU0sVUFBVSxTQUFTLFdBQVcsQ0FBQztDQUNwRCxDQUFDLFdBQVcsR0FBRztDQUNmLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDVjtDQUNBLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7Q0FDM0IsRUFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztBQUM1QjtDQUNBLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Q0FDdkIsRUFBRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxLQUFLO0NBQy9DLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7Q0FDM0IsR0FBRyxDQUFDLENBQUM7Q0FDTCxFQUFFO0FBQ0Y7Q0FDQSxDQUFDLGlCQUFpQixHQUFHO0NBQ3JCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0NBQ2QsRUFBRTtBQUNGO0NBQ0EsQ0FBQyxvQkFBb0IsR0FBRztDQUN4QixFQUFFLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLEVBQUU7Q0FDbEMsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0NBQ2hFLEdBQUc7QUFDSDtDQUNBLEVBQUUsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Q0FDN0MsRUFBRTtBQUNGO0NBQ0EsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUU7Q0FDaEMsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEVBQUU7Q0FDM0MsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNO0NBQ2hDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUMxQixJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtDQUN6QixLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztDQUN2QixLQUFLO0NBQ0wsSUFBSSxDQUFDLENBQUM7Q0FDTixHQUFHO0NBQ0gsRUFBRTtBQUNGO0NBQ0EsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFO0NBQ2xCLEVBQUUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDN0MsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTtDQUM3QixHQUFHLE9BQU87Q0FDVixHQUFHO0FBQ0g7Q0FDQSxFQUFFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDNUMsRUFBRSxJQUFJLFNBQVMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO0NBQzFDLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtDQUNwQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSztDQUN0QyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUNuRCxLQUFLLENBQUMsQ0FBQztDQUNQLElBQUksTUFBTTtDQUNWLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztDQUN2RCxJQUFJO0FBQ0o7Q0FDQSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDO0NBQ3BDLEdBQUc7Q0FDSCxFQUFFO0FBQ0Y7Q0FDQSxDQUFDLFNBQVMsR0FBRztDQUNiLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTtDQUNoQyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0NBQ3ZCLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFO0NBQzVDO0NBQ0EsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztDQUNyRixJQUFJO0FBQ0o7Q0FDQSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJO0NBQ3pELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUMxQixJQUFJLENBQUMsQ0FBQztDQUNOLEdBQUc7QUFDSDtDQUNBLEVBQUUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO0NBQ3ZCLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0NBQ3JCLEdBQUc7Q0FDSCxFQUFFO0FBQ0Y7Q0FDQSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7Q0FDaEIsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Q0FDeEIsR0FBRyxPQUFPO0NBQ1YsR0FBRztBQUNIO0NBQ0EsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDeEc7Q0FDQTtDQUNBLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO0FBQ25DO0NBQ0EsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7Q0FDNUM7Q0FDQTtDQUNBLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6RTtDQUNBLEdBQUcsT0FBTztDQUNWLEdBQUc7QUFDSDtDQUNBLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0NBQ2xCLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQ25CLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQ25CLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Q0FDdkMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztDQUMvQixFQUFFLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQzNDO0NBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztDQUNoRCxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO0NBQ3BELEVBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0FBQ3hCO0NBQ0EsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztDQUMxQixFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztDQUNsQixFQUFFO0FBQ0Y7Q0FDQSxDQUFDLFNBQVMsR0FBRztDQUNiLEVBQUUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztDQUNoRSxFQUFFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDL0Q7Q0FDQSxFQUFFLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztDQUMzQixFQUFFLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztDQUMzQixFQUFFLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztBQUM1QjtDQUNBLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUk7Q0FDN0IsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztDQUNuQyxHQUFHLENBQUMsQ0FBQztBQUNMO0NBQ0EsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUk7Q0FDbkMsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7Q0FDbkIsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0NBQy9CLElBQUksTUFBTTtDQUNWLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztDQUM5QixJQUFJO0NBQ0osR0FBRyxDQUFDLENBQUM7QUFDTDtDQUNBLEVBQUUsSUFBSSxRQUFRLEVBQUU7Q0FDaEIsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRztDQUN4QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xDO0NBQ0EsSUFBSSxJQUFJLEtBQUssRUFBRTtDQUNmLEtBQUssYUFBYSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDMUMsS0FBSyxNQUFNO0NBQ1gsS0FBSyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ2hDLEtBQUs7Q0FDTCxJQUFJLENBQUMsQ0FBQztDQUNOLEdBQUc7QUFDSDtDQUNBLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUk7Q0FDakMsR0FBRyxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDO0NBQ0EsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqQztDQUNBLEdBQUcsSUFBSSxJQUFJLEVBQUU7Q0FDYixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7Q0FDakMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQzNCLElBQUk7Q0FDSixHQUFHLENBQUMsQ0FBQztDQUNMLEVBQUU7QUFDRjtDQUNBLENBQUMsS0FBSyxHQUFHO0NBQ1QsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNO0NBQy9CLEdBQUcsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO0NBQzNCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztDQUMvQixJQUFJLE1BQU07Q0FDVixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7Q0FDdkIsSUFBSTtDQUNKLEdBQUcsQ0FBQyxDQUFDO0NBQ0wsRUFBRTtBQUNGO0NBQ0EsQ0FBQyxJQUFJLEdBQUc7Q0FDUixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU07Q0FDL0IsR0FBRyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7Q0FDM0IsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO0NBQzlCLElBQUksTUFBTTtDQUNWLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztDQUN0QixJQUFJO0NBQ0osR0FBRyxDQUFDLENBQUM7Q0FDTCxFQUFFO0FBQ0Y7Q0FDQSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7Q0FDbkMsRUFBRSxNQUFNLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUU7Q0FDNUMsR0FBRyxNQUFNLEVBQUUsTUFBTTtDQUNqQixHQUFHLE9BQU8sRUFBRSxJQUFJO0NBQ2hCLEdBQUcsVUFBVSxFQUFFLElBQUk7Q0FDbkIsR0FBRyxRQUFRLEVBQUUsSUFBSTtDQUNqQixHQUFHLENBQUMsQ0FBQztBQUNMO0NBQ0EsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0NBQ2xDLEVBQUU7QUFDRjtDQUNBLENBQUMsWUFBWSxHQUFHO0NBQ2hCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7Q0FDdkIsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7Q0FDcEMsR0FBRztBQUNIO0NBQ0EsRUFBRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7Q0FDeEIsRUFBRTtBQUNGO0NBQ0EsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtDQUN6QixFQUFFLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksRUFBRTtDQUM1QyxHQUFHLE1BQU0sRUFBRSxNQUFNO0NBQ2pCLEdBQUcsT0FBTyxFQUFFLElBQUk7Q0FDaEIsR0FBRyxVQUFVLEVBQUUsSUFBSTtDQUNuQixHQUFHLFFBQVEsRUFBRSxJQUFJO0NBQ2pCLEdBQUcsQ0FBQyxDQUFDO0FBQ0w7Q0FDQSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7Q0FDbEMsRUFBRTtBQUNGO0NBQ0EsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFO0NBQzVDLEVBQUUsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Q0FDaEQsRUFBRSxJQUFJLFNBQVMsS0FBSyxPQUFPLEVBQUU7Q0FDN0IsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Q0FDaEMsR0FBRyxNQUFNO0NBQ1QsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Q0FDbkMsR0FBRztDQUNILEVBQUU7QUFDRjtDQUNBLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRTtDQUM1QyxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO0NBQ3JELEdBQUcsT0FBTztDQUNWLEdBQUc7QUFDSDtDQUNBLEVBQUUsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Q0FDaEQsRUFBRSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7Q0FDaEMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0NBQ3RELEdBQUc7Q0FDSCxFQUFFLElBQUksU0FBUyxFQUFFO0NBQ2pCLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0NBQ3BDLEdBQUc7Q0FDSCxFQUFFO0FBQ0Y7Q0FDQSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUU7Q0FDM0MsRUFBRSxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFB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ZUFBZSxFQUFFLENBQUM7Q0FDekIsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Q0FDekIsRUFBRTtBQUNGO0NBQ0EsQ0FBQyxhQUFhLEdBQUc7Q0FDakIsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssVUFBVSxFQUFFO0NBQ2hELEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0NBQ3ZELEdBQUcsTUFBTTtDQUNULEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0NBQ3BELEdBQUc7QUFDSDtDQUNBLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzVDO0NBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Q0FDekMsRUFBRTtBQUNGO0NBQ0EsQ0FBQyxlQUFlLEdBQUc7Q0FDbkIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3RFO0NBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssVUFBVSxFQUFFO0NBQ2hELEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUM7Q0FDN0QsR0FBRztBQUNIO0NBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssVUFBVSxFQUFFO0NBQ2hELEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0NBQzdDLEdBQUc7QUFDSDtD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Q0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0NBQ25DLFlBQVksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0NBQzVCLFNBQVM7Q0FDVCxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0NBQ25DLFlBQVksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0NBQzVCLFNBQVM7Q0FDVCxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO0NBQ3hDLFlBQVksRUFBRSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0NBQ3RDLFNBQVM7Q0FDVCxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO0NBQ3JDLFlBQVksRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0NBQ2hDLFNBQVM7Q0FDVCxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO0NBQ3ZDLFlBQVksRUFBRSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0NBQ3BDLFNBQVM7Q0FDVCxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO0NBQ3hDLFlBQVksRUFBRSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0NBQ3RDLFNBQVM7Q0FDVCxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0NBQ3BDLFlBQVksRUFBRSxDQUFDLEdBQUcsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDM0MsU0FBUztDQUNULFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7Q0FDeEMsWUFBWSxFQUFFLENBQUMsT0FBTyxHQUFHLElBQUks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Q0FBQyxDQUFDLENBQUM7Q0FDakQsUUFBUSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztDQUMvQyxLQUFLLENBQUMsQ0FBQztDQUNQLElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRSxVQUFVLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0NBQzNELFFBQVEsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO0NBQ25DLFlBQVksSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0NBQ3BDLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0NBQ25ELFFBQVEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ3JELFFBQVEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDbEQsUUFBUSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztDQUMvQyxLQUFLLENBQUMsQ0FBQztDQUNQLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxVQUFVLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0NBQ3pELFFBQVEsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Q0FDbkMsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDbEQsUUFBUSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FB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QU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUN4QyxLQUFLLENBQUMsQ0FBQztDQUNQLElBQUksY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWTtDQUNwRCxRQUFRLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQztDQUN6QyxLQUFLLENBQUMsQ0FBQztDQUNQLElBQUksY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWTtDQUNyRCxRQUFRLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQztDQUMxQyxLQUFLLENBQUMsQ0FBQztDQUNQLElBQUksY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWTtDQUN0RCxRQUFRLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQztDQUMzQyxLQUFLLENBQUMsQ0FBQztDQUNQLElBQUksY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWTtDQUN2RCxRQUFRLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQztDQUM1QyxLQUFLLENBQUMsQ0FBQztBQUNQO0NBQ0E7QUFDQTtDQUNBLElBQUksWUFBWSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0QztDQUNBO0FBQ0E7Q0FDQSxJQUFJLGVBQWUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdkM7Q0FDQTtBQUNBO0NBQ0EsSUFBSSxhQUFhLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztDQUMxQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0NBQzND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