Changeset 2746465
- Timestamp:
- 06/22/2022 01:45:35 PM (4 years ago)
- Location:
- shiptimize-for-woocommerce/trunk
- Files:
-
- 18 edited
-
assets/css/shiptimize-admin.css (modified) (1 diff)
-
assets/css/shiptimize.css (modified) (1 diff)
-
assets/js/shiptimize-admin.js (modified) (1 diff)
-
assets/js/shiptimize-dokan.js (modified) (1 diff)
-
assets/js/shiptimize-wcfm.js (modified) (1 diff)
-
assets/js/shiptimize.js (modified) (1 diff)
-
constants.php (modified) (1 diff)
-
includes/admin/class-shiptimize-order-ui.php (modified) (3 diffs)
-
includes/admin/class-shiptimize-shipping.php (modified) (17 diffs)
-
includes/class-woo-shiptimize-order.php (modified) (6 diffs)
-
includes/class-woo-shiptimize.php (modified) (17 diffs)
-
includes/core/class-shiptimize-api-v3.php (modified) (1 diff)
-
includes/core/class-shiptimize-order.php (modified) (1 diff)
-
includes/core/class-shiptimize.php (modified) (1 diff)
-
includes/core/lang/en.php (modified) (1 diff)
-
includes/core/lang/pt.php (modified) (1 diff)
-
readme.txt (modified) (1 diff)
-
shiptimize.php (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
shiptimize-for-woocommerce/trunk/assets/css/shiptimize-admin.css
r2724326 r2746465 1 .shiptimize-export__status{display:inline-block;margin-left:10px;margin-top:5px}.shiptimize-settings__key{min-width:350px}@font-face{font-family:shiptimize-icons;src:url(fonts/shiptimize.eot?v=2) format("embedded-opentype"),url(fonts/shiptimize.ttf?v=2) format("truetype"),url(fonts/shiptimize.woff?v=2) format("woff"),url(fonts/shiptimize.svg?v=2) format("svg");font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased}.shiptimize-ib,.shiptimize-icon{display:inline-block}.shiptimize-icon:before{display:inline-block;font-family:shiptimize-icons;font-size:25px}.shiptimize-icon-success:before{content:"\E905";color:#27ae60}.shiptimize-icon-not-exported:before{content:"\E906";color:#f39c12}.shiptimize-icon-error:before{content:"\E904";color:#e74c3c}.shiptimize-icon-test-successful:before{content:"\E905";color:#80e0a7}.shiptimize-icon-print-notprinted:before{content:"\E903";color:#f39c12}.shiptimize-icon-print-printed:before{content:"\E902";color:#27ae60}.shiptimize-icon-print-error:before{content:"\E901";color:#e74c3c}.shiptimize-btn-label-print{min-height:auto!important;line-height:1rem!important;padding:4px 3px 2px 4px!important}.shiptimize-btn-label-print:before{content:"\E903";font-size:20px}.shiptimize-message-large{min-width:300px}.shiptimize-list{margin-top:15px;margin-left:0}.shiptimize-tooltip__inner{display:inline-block;padding:10px 20px}.shiptimize-tooltip-wrapper{display:inline-block;text-align:center;padding:0 10px;vertical-align:top}.shiptimize-tooltip-message{display:inline-block;position:absolute;visibility:hidden;z-index:9999;background:#ececec;border:thin solid #ececec;box-shadow:0 3px 6.51px .49px rgba(0,0,0,.1);text-align:left}.shiptimize-tooltip-message__arrow{border-style:solid;position:absolute;z-index:9999;margin:-10px}.shiptimize-tooltip-message[x-placement^=left] .shiptimize-tooltip-message__arrow{border-width:10px 0 10px 10px;border-color:transparent transparent transparent #ececec;right:-10px;top:calc(50% - 10px);margin-left:0;margin-right:0}.shiptimize-status-list{margin-bottom:30px;margin-top:20px}.shiptimize-status-list li{display:inline-block;width:280px;margin-bottom:20px}.shiptimize-status-select{float:none}.shiptimize-export-btn{background-color:transparent}.shiptimize-export-btn.Shiptimize:before{font-family:shiptimize-icons;content:"\E900";background-size:100%;position:relative;left:-5px;top:0}.shiptimize-btn-print-label{background-color:transparent}.shiptimize-btn-print-label:before{font-family:shiptimize-icons;content:"\E903";background-size:100%;position:relative;left:-5px;top:0}.shiptimize-settings__section{margin:40px 0}.shiptimize-settings__field{margin-bottom:15px}.shiptimize-settings__label{display:inline-block;min-width:115px;text-align:right;margin-right:10px;vertical-align:top}.shiptimize-settings__label:after{content:":"}.shiptimize-settings__key{width:300px}.shiptimize-settings__maps_key{min-width:345px}.shiptimize-settings__checkbox-group{display:block;padding:15px 10px}.shiptimize-checkbox{display:inline-block;margin-right:20px}.shiptimize-warning{white-space:nowrap;display:block}.shiptimize__carrier-options{display:none}.shiptimize__carrier-options.active{display:inline-block}.shiptimize-errors{color:red;padding:20px 0}.shiptimize-account-btn{background-color:#f2a900}.shiptimize-loader-wrapper{display:inline-block;width:400px;min-height:200px;text-align:center;position:fixed;background-color:hsla(0,0%,100%,.8);top:50%;top:calc(50% - 150px);left:50%;left:calc(50% - 200px);z-index:99999;padding-bottom:40px;font-size:1rem}.shiptimize-loader{position:relative;width:80px;height:80px;margin:40px auto}.shiptimize-loader div{display:inline-block;position:absolute;left:8px;width:16px;background:#fdbc3b;animation:shiptimize-loader 1.2s cubic-bezier(0,.5,.5,1) infinite}.shiptimize-loader div:first-child{left:8px;animation-delay:-.24s}.shiptimize-loader div:nth-child(2){left:32px;animation-delay:-.12s}.shiptimize-loader div:nth-child(3){left:56px;animation-delay:0}@keyframes shiptimize-loader{0%{top:8px;height:64px}50%,to{top:24px;height:32px}}.shiptimize-tooltip-wrapper:hover .shiptimize-tooltip-message{visibility:visible}.column-shiptimize_status{text-align:center!important}.wbs-shiptimizeoptions{background:#f5f5f5;padding:20px;margin-bottom:20px}.wbs-shiptimize-option{margin-right:20px}.tab{display:none}.tab.active{display:block} 1 /*$orange: #ff585d; 2 $green: #80e0a7; 3 $red: #f2a900;*/ 4 .shiptimize-export__status { 5 display: inline-block; 6 margin-left: 10px; 7 margin-top: 5px; } 8 9 .shiptimize-settings__key { 10 min-width: 350px; } 11 12 @font-face { 13 font-family: 'shiptimize-icons'; 14 src: url("./fonts/shiptimize.eot?v=2") format("embedded-opentype"), url("./fonts/shiptimize.ttf?v=2") format("truetype"), url("./fonts/shiptimize.woff?v=2") format("woff"), url("./fonts/shiptimize.svg?v=2") format("svg"); 15 font-style: normal; 16 font-weight: normal; 17 font-variant: normal; 18 text-transform: none; 19 line-height: 1; 20 -webkit-font-smoothing: antialiased; } 21 22 .shiptimize-ib { 23 display: inline-block; } 24 25 .shiptimize-icon { 26 display: inline-block; } 27 .shiptimize-icon::before { 28 display: inline-block; 29 font-family: shiptimize-icons; 30 font-size: 25px; } 31 .shiptimize-icon-success::before { 32 content: "\E905"; 33 color: #27ae60; } 34 .shiptimize-icon-not-exported::before { 35 content: "\E906"; 36 color: #f39c12; } 37 .shiptimize-icon-error::before { 38 content: "\E904"; 39 color: #e74c3c; } 40 .shiptimize-icon-test-successful::before { 41 content: "\E905"; 42 color: #80e0a7; } 43 .shiptimize-icon-print-notprinted::before { 44 content: "\E903"; 45 color: #f39c12; } 46 .shiptimize-icon-print-printed::before { 47 content: "\E902"; 48 color: #27ae60; } 49 .shiptimize-icon-print-error::before { 50 content: "\E901"; 51 color: #e74c3c; } 52 53 .shiptimize-btn-label-print { 54 min-height: auto !important; 55 line-height: 1rem !important; 56 padding: 4px 3px 2px 4px !important; } 57 .shiptimize-btn-label-print::before { 58 content: "\E903"; 59 font-size: 20px; } 60 61 .shiptimize-message-large { 62 min-width: 300px; } 63 64 .shiptimize-list { 65 margin-top: 15px; 66 margin-left: 0; } 67 68 .shiptimize-tooltip__inner { 69 display: inline-block; 70 padding: 10px 20px; } 71 72 .shiptimize-tooltip-wrapper { 73 display: inline-block; 74 text-align: center; 75 padding: 0 10px; 76 vertical-align: top; } 77 78 .shiptimize-tooltip-message { 79 display: inline-block; 80 position: absolute; 81 visibility: hidden; 82 /** display none f* up the position calculation */ 83 z-index: 9999; 84 background: #ececec; 85 border: solid thin #ececec; 86 box-shadow: 0px 3px 6.51px 0.49px rgba(0, 0, 0, 0.1); 87 text-align: left; } 88 .shiptimize-tooltip-message__arrow { 89 border-style: solid; 90 position: absolute; 91 z-index: 9999; 92 margin: -10px; } 93 .shiptimize-tooltip-message[x-placement^="left"] .shiptimize-tooltip-message__arrow { 94 border-width: 10px 0 10px 10px; 95 border-color: transparent transparent transparent #ececec; 96 right: -10px; 97 top: calc(50% - 10px); 98 margin-left: 0; 99 margin-right: 0; } 100 101 .shiptimize-status-list { 102 margin-bottom: 30px; 103 margin-top: 20px; } 104 .shiptimize-status-list li { 105 display: inline-block; 106 width: 280px; 107 margin-bottom: 20px; } 108 109 .shiptimize-status-select { 110 float: none; } 111 112 .shiptimize-export-btn { 113 background-color: transparent; } 114 .shiptimize-export-btn.Shiptimize::before { 115 font-family: 'shiptimize-icons'; 116 content: '\E900'; 117 background-size: 100%; 118 position: relative; 119 left: -5px; 120 top: 0px; } 121 122 .shiptimize-btn-print-label { 123 background-color: transparent; } 124 .shiptimize-btn-print-label::before { 125 font-family: 'shiptimize-icons'; 126 content: '\E903'; 127 background-size: 100%; 128 position: relative; 129 left: -5px; 130 top: 0px; } 131 132 .shiptimize-settings__section { 133 margin: 40px 0; } 134 135 .shiptimize-settings__field { 136 margin-bottom: 15px; } 137 138 .shiptimize-settings__label { 139 display: inline-block; 140 min-width: 115px; 141 text-align: right; 142 margin-right: 10px; 143 vertical-align: top; } 144 .shiptimize-settings__label::after { 145 content: ':'; } 146 147 .shiptimize-settings__key { 148 width: 300px; } 149 150 .shiptimize-settings__maps_key { 151 min-width: 345px; } 152 153 .shiptimize-settings__checkbox-group { 154 display: block; 155 padding: 15px 10px; } 156 157 .shiptimize-checkbox { 158 display: inline-block; 159 margin-right: 20px; } 160 161 .shiptimize-warning { 162 white-space: nowrap; 163 display: block; } 164 165 .shiptimize__carrier-options { 166 display: none; } 167 .shiptimize__carrier-options.active { 168 display: inline-block; } 169 170 .shiptimize-errors { 171 color: red; 172 padding: 20px 0; } 173 174 .shiptimize-account-btn { 175 background-color: #f2a900; } 176 177 .shiptimize-loader-wrapper { 178 display: inline-block; 179 width: 400px; 180 min-height: 200px; 181 text-align: center; 182 position: fixed; 183 background-color: rgba(255, 255, 255, 0.8); 184 top: 50%; 185 top: calc(50% - 150px); 186 left: 50%; 187 left: calc(50% - 200px); 188 z-index: 99999; 189 padding-bottom: 40px; 190 font-size: 1rem; } 191 192 .shiptimize-loader { 193 position: relative; 194 width: 80px; 195 height: 80px; 196 margin: 40px auto; } 197 198 .shiptimize-loader div { 199 display: inline-block; 200 position: absolute; 201 left: 8px; 202 width: 16px; 203 background: #fdbc3b; 204 animation: shiptimize-loader 1.2s cubic-bezier(0, 0.5, 0.5, 1) infinite; } 205 206 .shiptimize-loader div:nth-child(1) { 207 left: 8px; 208 animation-delay: -0.24s; } 209 210 .shiptimize-loader div:nth-child(2) { 211 left: 32px; 212 animation-delay: -0.12s; } 213 214 .shiptimize-loader div:nth-child(3) { 215 left: 56px; 216 animation-delay: 0; } 217 218 @keyframes shiptimize-loader { 219 0% { 220 top: 8px; 221 height: 64px; } 222 50%, 100% { 223 top: 24px; 224 height: 32px; } } 225 226 .shiptimize-tooltip-wrapper:hover .shiptimize-tooltip-message { 227 visibility: visible; } 228 229 .column-shiptimize_status { 230 text-align: center !important; } 231 232 .wbs-shiptimizeoptions { 233 background: whitesmoke; 234 padding: 20px; 235 margin-bottom: 20px; } 236 237 .wbs-shiptimize-option { 238 margin-right: 20px; } 239 240 .tab { 241 display: none; } 242 .tab.active { 243 display: block; } 244 -
shiptimize-for-woocommerce/trunk/assets/css/shiptimize.css
r2724326 r2746465 1 .shiptimize-shipping-options,.shiptimize-shipping-options td{border:0}.shiptimize-marketplace-settings{padding:20px}.shiptimize-connect{padding:.6180469716em 1.41575em;color:#fff;background-color:#ffa300;display:inline-block}.shiptimize-pickup{display:none}.shiptimize-pickup.active{display:block}.shiptimize-pickup__overlay{position:fixed;height:100%;width:100%;z-index:9999;background:hsla(0,0%,100%,.9);top:0;left:0}.shiptimize-pickup__mapWrapper{z-index:99991;position:absolute;top:18%;left:7%;width:86%;min-height:50%;min-height:50vh;display:flex}.shiptimize-pickup__map-loader{width:62%;height:100%;display:none;z-index:99999;opacity:.9;margin:auto}.shiptimize-pickup__mapWrapper.loading{align-items:center}.shiptimize-pickup__mapWrapper.loading #shiptimizeMap,.shiptimize-pickup__mapWrapper.loading .shiptimize-pickup__options{display:none}.shiptimize-pickup__mapWrapper.loading .shiptimize-pickup__map-loader{display:inline-block}.shiptimize-pickup__map{position:absolute;right:0;top:0;display:inline-block;width:62%;height:100%;vertical-align:top}.shiptimize-pickup__title{font-size:2em;margin-bottom:1em}.shiptimize-pickup__options{display:inline-block;width:38%;min-height:100%;vertical-align:top;background:#f7f7f7;padding:20px 40px}.shiptimize-pickup__point{margin-bottom:2px;font-size:12px}.shiptimize-pickup__point input[type=radio]{width:auto!important;margin-top:0!important}.shiptimize-pickup__error{padding:40px 61px;position:fixed;background-color:#fff;color:#000;top:50%;left:50%;transform:translateX(-50%) translateY(-50%);z-index:9999;box-shadow:0 3px 6.51px .49px rgba(0,0,0,.1);font-size:25px;line-height:1.5em;display:none}.shiptimize-pickup__extended{margin-top:5px}.shiptimize-pickup__extended_label{margin-right:5px}.shiptimize-pickup__close{position:fixed;top:8%;left:88%;z-index:9999}.shiptimize-pickup__close:after{display:inline-block;content:"X";font-size:40px;font-weight:300;color:#9c9c9c;cursor:pointer}.shiptimize-pickup__validate{width:90%;margin-top:20px;text-align:center}.shiptimize-pickup__point_description{display:inline-block;margin-left:10px;vertical-align:top;max-width:calc(100% - 30px);cursor:pointer}.shiptimize-pickup__description{display:block;margin-top:20px;font-weight:600}.shiptimize-btn{background-color:#ffa300;color:#fff;border-radius:5px;line-height:1.3em;vertical-align:top}.shiptimize-wcfm-checkbox{margin-right:0!important}.shiptimize-request-account label{width:105px;text-align:right;margin-right:10px;display:inline-block}.shiptimize-request-account input[type=text]{width:500px}.shiptimize-request-account .form-item{margin-bottom:5px;display:flex;flex-direction:row}.shiptimize-loader{position:relative;width:80px;height:80px;z-index:99999;top:50%;top:calc(50% - 40px);left:50%;left:calc(50% - 40px)}.shiptimize-loader div{display:inline-block;position:absolute;left:8px;width:16px;background:#fdbc3b;animation:shiptimize-loader 1.2s cubic-bezier(0,.5,.5,1) infinite}.shiptimize-loader div:first-child{left:8px;animation-delay:-.24s}.shiptimize-loader div:nth-child(2){left:32px;animation-delay:-.12s}.shiptimize-loader div:nth-child(3){left:56px;animation-delay:0}@keyframes shiptimize-loader{0%{top:8px;height:64px}50%,to{top:24px;height:32px}}@media (max-width:1024px){.shiptimize-choose-pickup{width:100%;text-align:center}}@media (max-width:768px){.shiptimize-pickup__mapWrapper{display:inline-block;top:10%;left:5%;width:90%;min-height:0}.shiptimize-pickup__options{position:absolute;top:100%;top:45vh;width:100%;min-height:50%}.shiptimize-pickup__map{width:100%;height:45%;height:45vh}.shiptimize-pickup__close{top:2%;top:2vh}.shiptimize-pickup__error{padding:40px 20px;width:90%;left:5%;top:50%;font-size:16px;transform:translateY(-50%)}}.leaflet-image-layer,.leaflet-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane,.leaflet-pane>canvas,.leaflet-pane>svg,.leaflet-tile,.leaflet-tile-container,.leaflet-zoom-box{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-overlay-pane svg,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer{max-width:none!important;max-height:none!important}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom;touch-action:none;touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{-ms-touch-action:none;touch-action:none}.leaflet-container{-webkit-tap-highlight-color:transparent}.leaflet-container a{-webkit-tap-highlight-color:rgba(51,181,229,.4)}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-moz-box-sizing:border-box;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-bottom,.leaflet-top{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-tile{will-change:opacity}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.leaflet-zoom-anim .leaflet-zoom-animated{will-change:transform;-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1);-moz-transition:-moz-transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1)}.leaflet-pan-anim .leaflet-tile,.leaflet-zoom-anim .leaflet-tile{-webkit-transition:none;-moz-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-control,.leaflet-popup-pane{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.leaflet-image-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-image-layer.leaflet-interactive,.leaflet-marker-icon.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline:0}.leaflet-container a{color:#0078a8}.leaflet-container a.leaflet-active{outline:2px solid orange}.leaflet-zoom-box{border:2px dotted #38f;background:hsla(0,0%,100%,.5)}.leaflet-container{font:12px/1.5 Helvetica Neue,Arial,Helvetica,sans-serif}.leaflet-bar{box-shadow:0 1px 5px rgba(0,0,0,.65);border-radius:4px}.leaflet-bar a,.leaflet-bar a:hover{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:700 18px Lucida Console,Monaco,monospace;text-indent:1px}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out{font-size:22px}.leaflet-control-layers{box-shadow:0 1px 5px rgba(0,0,0,.4);background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(images/layers.png);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(images/layers-2x.png);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers-expanded .leaflet-control-layers-toggle,.leaflet-control-layers .leaflet-control-layers-list{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;overflow-x:hidden;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(images/marker-icon.png)}.leaflet-container .leaflet-control-attribution{background:#fff;background:hsla(0,0%,100%,.7);margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover{text-decoration:underline}.leaflet-container .leaflet-control-attribution,.leaflet-container .leaflet-control-scale{font-size:11px}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;font-size:11px;white-space:nowrap;overflow:hidden;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;background:hsla(0,0%,100%,.5)}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers{box-shadow:none}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-layers{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 19px;line-height:1.4}.leaflet-popup-content p{margin:18px 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px rgba(0,0,0,.4)}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;padding:4px 4px 0 0;border:none;text-align:center;width:18px;height:14px;font:16px/14px Tahoma,Verdana,sans-serif;color:#c3c3c3;text-decoration:none;font-weight:700;background:transparent}.leaflet-container a.leaflet-popup-close-button:hover{color:#999}.leaflet-popup-scrolled{overflow:auto;border-bottom:1px solid #ddd;border-top:1px solid #ddd}.leaflet-oldie .leaflet-popup-content-wrapper{zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";filter:progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678,M12=0.70710678,M21=-0.70710678,M22=0.70710678)}.leaflet-oldie .leaflet-popup-tip-container{margin-top:-1px}.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px rgba(0,0,0,.4)}.leaflet-tooltip.leaflet-clickable{cursor:pointer;pointer-events:auto}.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before,.leaflet-tooltip-top:before{position:absolute;pointer-events:none;border:6px solid transparent;background:transparent;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff} 1 .shiptimize-shipping-options { 2 border: 0; } 3 .shiptimize-shipping-options td { 4 border: 0; } 5 6 .shiptimize-marketplace-settings { 7 padding: 20px; } 8 9 .shiptimize-connect { 10 padding: 0.6180469716em 1.41575em; 11 color: white; 12 background-color: #FFA300; 13 display: inline-block; } 14 15 .shiptimize-pickup { 16 display: none; 17 /*** **/ 18 /** Points loading .. */ 19 /** 20 * It's absolute because The map won't display 21 * with min-height instead of height and we want to make 22 * sure that all points are visible 23 * so the container must be able to grow taller 24 */ } 25 .shiptimize-pickup.active { 26 display: block; } 27 .shiptimize-pickup__overlay { 28 position: fixed; 29 height: 100%; 30 width: 100%; 31 z-index: 9999; 32 background: rgba(255, 255, 255, 0.9); 33 top: 0; 34 left: 0; } 35 .shiptimize-pickup__mapWrapper { 36 z-index: 99991; 37 position: absolute; 38 top: 18%; 39 left: 7%; 40 width: 86%; 41 min-height: 50%; 42 min-height: 50vh; 43 display: flex; } 44 .shiptimize-pickup__map-loader { 45 width: 62%; 46 height: 100%; 47 display: none; 48 z-index: 99999; 49 opacity: 0.9; 50 margin: auto; } 51 .shiptimize-pickup__mapWrapper.loading { 52 align-items: center; } 53 .shiptimize-pickup__mapWrapper.loading #shiptimizeMap, 54 .shiptimize-pickup__mapWrapper.loading .shiptimize-pickup__options, 55 .shiptimize-pickup__mapWrapper.loading .shiptimize-pickup__options { 56 display: none; } 57 .shiptimize-pickup__mapWrapper.loading .shiptimize-pickup__map-loader { 58 display: inline-block; } 59 .shiptimize-pickup__map { 60 position: absolute; 61 right: 0; 62 top: 0; 63 display: inline-block; 64 width: 62%; 65 height: 100%; 66 vertical-align: top; } 67 .shiptimize-pickup__title { 68 font-size: 2em; 69 margin-bottom: 1em; } 70 .shiptimize-pickup__options { 71 display: inline-block; 72 width: 38%; 73 min-height: 100%; 74 vertical-align: top; 75 background: #f7f7f7; 76 padding: 20px 40px; } 77 .shiptimize-pickup__point { 78 margin-bottom: 2px; 79 font-size: 12px; 80 /** because of barsonsight.nl **/ } 81 .shiptimize-pickup__point input[type='radio'] { 82 width: auto !important; 83 margin-top: 0 !important; } 84 .shiptimize-pickup__error { 85 padding: 40px 61px; 86 position: fixed; 87 background-color: #fff; 88 color: #000000; 89 top: 50%; 90 left: 50%; 91 transform: translateX(-50%) translateY(-50%); 92 z-index: 9999; 93 box-shadow: 0px 3px 6.51px 0.49px rgba(0, 0, 0, 0.1); 94 font-size: 25px; 95 line-height: 1.5em; 96 display: none; } 97 .shiptimize-pickup__extended { 98 margin-top: 5px; } 99 .shiptimize-pickup__extended_label { 100 margin-right: 5px; } 101 .shiptimize-pickup__close { 102 position: fixed; 103 top: 8%; 104 left: 88%; 105 z-index: 9999; } 106 .shiptimize-pickup__close::after { 107 display: inline-block; 108 content: 'X'; 109 font-size: 40px; 110 font-weight: 300; 111 color: #9c9c9c; 112 cursor: pointer; } 113 .shiptimize-pickup__validate { 114 width: 90%; 115 margin-top: 20px; 116 text-align: center; } 117 .shiptimize-pickup__point_description { 118 display: inline-block; 119 margin-left: 10px; 120 vertical-align: top; 121 max-width: calc(100% - 30px); 122 cursor: pointer; } 123 .shiptimize-pickup__description { 124 display: block; 125 margin-top: 20px; 126 font-weight: 600; } 127 128 .shiptimize-btn { 129 background-color: #FFA300; 130 color: white; 131 border-radius: 5px; 132 line-height: 1.3em; 133 vertical-align: top; } 134 135 .shiptimize-wcfm-checkbox { 136 margin-right: 0 !important; } 137 138 .shiptimize-request-account label { 139 width: 105px; 140 text-align: right; 141 margin-right: 10px; 142 display: inline-block; } 143 144 .shiptimize-request-account input[type='text'] { 145 width: 500px; } 146 147 .shiptimize-request-account .form-item { 148 margin-bottom: 5px; 149 display: flex; 150 flex-direction: row; } 151 152 .shiptimize-loader { 153 position: relative; 154 width: 80px; 155 height: 80px; 156 z-index: 99999; 157 top: 50%; 158 top: calc(50% - 40px); 159 left: 50%; 160 left: calc(50% - 40px); } 161 162 .shiptimize-loader div { 163 display: inline-block; 164 position: absolute; 165 left: 8px; 166 width: 16px; 167 background: #fdbc3b; 168 animation: shiptimize-loader 1.2s cubic-bezier(0, 0.5, 0.5, 1) infinite; } 169 170 .shiptimize-loader div:nth-child(1) { 171 left: 8px; 172 animation-delay: -0.24s; } 173 174 .shiptimize-loader div:nth-child(2) { 175 left: 32px; 176 animation-delay: -0.12s; } 177 178 .shiptimize-loader div:nth-child(3) { 179 left: 56px; 180 animation-delay: 0; } 181 182 @keyframes shiptimize-loader { 183 0% { 184 top: 8px; 185 height: 64px; } 186 50%, 100% { 187 top: 24px; 188 height: 32px; } } 189 190 @media (max-width: 1024px) { 191 .shiptimize-choose-pickup { 192 width: 100%; 193 text-align: center; } } 194 195 @media (max-width: 768px) { 196 .shiptimize-pickup__mapWrapper { 197 display: inline-block; 198 top: 10%; 199 left: 5%; 200 width: 90%; 201 min-height: 0; } 202 .shiptimize-pickup__options { 203 position: absolute; 204 top: 100%; 205 top: 45vh; 206 width: 100%; 207 min-height: 50%; } 208 .shiptimize-pickup__map { 209 width: 100%; 210 height: 45%; 211 height: 45vh; } 212 .shiptimize-pickup__close { 213 top: 2%; 214 top: 2vh; } 215 .shiptimize-pickup__error { 216 padding: 40px 20px; 217 width: 90%; 218 left: 5%; 219 top: 50%; 220 font-size: 16px; 221 transform: translateY(-50%); } } 222 223 /* required styles */ 224 .leaflet-pane, 225 .leaflet-tile, 226 .leaflet-marker-icon, 227 .leaflet-marker-shadow, 228 .leaflet-tile-container, 229 .leaflet-pane > svg, 230 .leaflet-pane > canvas, 231 .leaflet-zoom-box, 232 .leaflet-image-layer, 233 .leaflet-layer { 234 position: absolute; 235 left: 0; 236 top: 0; } 237 238 .leaflet-container { 239 overflow: hidden; } 240 241 .leaflet-tile, 242 .leaflet-marker-icon, 243 .leaflet-marker-shadow { 244 -webkit-user-select: none; 245 -moz-user-select: none; 246 user-select: none; 247 -webkit-user-drag: none; } 248 249 /* Safari renders non-retina tile on retina better with this, but Chrome is worse */ 250 .leaflet-safari .leaflet-tile { 251 image-rendering: -webkit-optimize-contrast; } 252 253 /* hack that prevents hw layers "stretching" when loading new tiles */ 254 .leaflet-safari .leaflet-tile-container { 255 width: 1600px; 256 height: 1600px; 257 -webkit-transform-origin: 0 0; } 258 259 .leaflet-marker-icon, 260 .leaflet-marker-shadow { 261 display: block; } 262 263 /* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ 264 /* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ 265 .leaflet-container .leaflet-overlay-pane svg, 266 .leaflet-container .leaflet-marker-pane img, 267 .leaflet-container .leaflet-shadow-pane img, 268 .leaflet-container .leaflet-tile-pane img, 269 .leaflet-container img.leaflet-image-layer, 270 .leaflet-container .leaflet-tile { 271 max-width: none !important; 272 max-height: none !important; } 273 274 .leaflet-container.leaflet-touch-zoom { 275 -ms-touch-action: pan-x pan-y; 276 touch-action: pan-x pan-y; } 277 278 .leaflet-container.leaflet-touch-drag { 279 -ms-touch-action: pinch-zoom; 280 /* Fallback for FF which doesn't support pinch-zoom */ 281 touch-action: none; 282 touch-action: pinch-zoom; } 283 284 .leaflet-container.leaflet-touch-drag.leaflet-touch-zoom { 285 -ms-touch-action: none; 286 touch-action: none; } 287 288 .leaflet-container { 289 -webkit-tap-highlight-color: transparent; } 290 291 .leaflet-container a { 292 -webkit-tap-highlight-color: rgba(51, 181, 229, 0.4); } 293 294 .leaflet-tile { 295 filter: inherit; 296 visibility: hidden; } 297 298 .leaflet-tile-loaded { 299 visibility: inherit; } 300 301 .leaflet-zoom-box { 302 width: 0; 303 height: 0; 304 -moz-box-sizing: border-box; 305 box-sizing: border-box; 306 z-index: 800; } 307 308 /* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ 309 .leaflet-overlay-pane svg { 310 -moz-user-select: none; } 311 312 .leaflet-pane { 313 z-index: 400; } 314 315 .leaflet-tile-pane { 316 z-index: 200; } 317 318 .leaflet-overlay-pane { 319 z-index: 400; } 320 321 .leaflet-shadow-pane { 322 z-index: 500; } 323 324 .leaflet-marker-pane { 325 z-index: 600; } 326 327 .leaflet-tooltip-pane { 328 z-index: 650; } 329 330 .leaflet-popup-pane { 331 z-index: 700; } 332 333 .leaflet-map-pane canvas { 334 z-index: 100; } 335 336 .leaflet-map-pane svg { 337 z-index: 200; } 338 339 .leaflet-vml-shape { 340 width: 1px; 341 height: 1px; } 342 343 .lvml { 344 behavior: url(#default#VML); 345 display: inline-block; 346 position: absolute; } 347 348 /* control positioning */ 349 .leaflet-control { 350 position: relative; 351 z-index: 800; 352 pointer-events: visiblePainted; 353 /* IE 9-10 doesn't have auto */ 354 pointer-events: auto; } 355 356 .leaflet-top, 357 .leaflet-bottom { 358 position: absolute; 359 z-index: 1000; 360 pointer-events: none; } 361 362 .leaflet-top { 363 top: 0; } 364 365 .leaflet-right { 366 right: 0; } 367 368 .leaflet-bottom { 369 bottom: 0; } 370 371 .leaflet-left { 372 left: 0; } 373 374 .leaflet-control { 375 float: left; 376 clear: both; } 377 378 .leaflet-right .leaflet-control { 379 float: right; } 380 381 .leaflet-top .leaflet-control { 382 margin-top: 10px; } 383 384 .leaflet-bottom .leaflet-control { 385 margin-bottom: 10px; } 386 387 .leaflet-left .leaflet-control { 388 margin-left: 10px; } 389 390 .leaflet-right .leaflet-control { 391 margin-right: 10px; } 392 393 /* zoom and fade animations */ 394 .leaflet-fade-anim .leaflet-tile { 395 will-change: opacity; } 396 397 .leaflet-fade-anim .leaflet-popup { 398 opacity: 0; 399 -webkit-transition: opacity 0.2s linear; 400 -moz-transition: opacity 0.2s linear; 401 transition: opacity 0.2s linear; } 402 403 .leaflet-fade-anim .leaflet-map-pane .leaflet-popup { 404 opacity: 1; } 405 406 .leaflet-zoom-animated { 407 -webkit-transform-origin: 0 0; 408 -ms-transform-origin: 0 0; 409 transform-origin: 0 0; } 410 411 .leaflet-zoom-anim .leaflet-zoom-animated { 412 will-change: transform; } 413 414 .leaflet-zoom-anim .leaflet-zoom-animated { 415 -webkit-transition: -webkit-transform 0.25s cubic-bezier(0, 0, 0.25, 1); 416 -moz-transition: -moz-transform 0.25s cubic-bezier(0, 0, 0.25, 1); 417 transition: transform 0.25s cubic-bezier(0, 0, 0.25, 1); } 418 419 .leaflet-zoom-anim .leaflet-tile, 420 .leaflet-pan-anim .leaflet-tile { 421 -webkit-transition: none; 422 -moz-transition: none; 423 transition: none; } 424 425 .leaflet-zoom-anim .leaflet-zoom-hide { 426 visibility: hidden; } 427 428 /* cursors */ 429 .leaflet-interactive { 430 cursor: pointer; } 431 432 .leaflet-grab { 433 cursor: -webkit-grab; 434 cursor: -moz-grab; 435 cursor: grab; } 436 437 .leaflet-crosshair, 438 .leaflet-crosshair .leaflet-interactive { 439 cursor: crosshair; } 440 441 .leaflet-popup-pane, 442 .leaflet-control { 443 cursor: auto; } 444 445 .leaflet-dragging .leaflet-grab, 446 .leaflet-dragging .leaflet-grab .leaflet-interactive, 447 .leaflet-dragging .leaflet-marker-draggable { 448 cursor: move; 449 cursor: -webkit-grabbing; 450 cursor: -moz-grabbing; 451 cursor: grabbing; } 452 453 /* marker & overlays interactivity */ 454 .leaflet-marker-icon, 455 .leaflet-marker-shadow, 456 .leaflet-image-layer, 457 .leaflet-pane > svg path, 458 .leaflet-tile-container { 459 pointer-events: none; } 460 461 .leaflet-marker-icon.leaflet-interactive, 462 .leaflet-image-layer.leaflet-interactive, 463 .leaflet-pane > svg path.leaflet-interactive { 464 pointer-events: visiblePainted; 465 /* IE 9-10 doesn't have auto */ 466 pointer-events: auto; } 467 468 /* visual tweaks */ 469 .leaflet-container { 470 background: #ddd; 471 outline: 0; } 472 473 .leaflet-container a { 474 color: #0078A8; } 475 476 .leaflet-container a.leaflet-active { 477 outline: 2px solid orange; } 478 479 .leaflet-zoom-box { 480 border: 2px dotted #38f; 481 background: rgba(255, 255, 255, 0.5); } 482 483 /* general typography */ 484 .leaflet-container { 485 font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; } 486 487 /* general toolbar styles */ 488 .leaflet-bar { 489 box-shadow: 0 1px 5px rgba(0, 0, 0, 0.65); 490 border-radius: 4px; } 491 492 .leaflet-bar a, 493 .leaflet-bar a:hover { 494 background-color: #fff; 495 border-bottom: 1px solid #ccc; 496 width: 26px; 497 height: 26px; 498 line-height: 26px; 499 display: block; 500 text-align: center; 501 text-decoration: none; 502 color: black; } 503 504 .leaflet-bar a, 505 .leaflet-control-layers-toggle { 506 background-position: 50% 50%; 507 background-repeat: no-repeat; 508 display: block; } 509 510 .leaflet-bar a:hover { 511 background-color: #f4f4f4; } 512 513 .leaflet-bar a:first-child { 514 border-top-left-radius: 4px; 515 border-top-right-radius: 4px; } 516 517 .leaflet-bar a:last-child { 518 border-bottom-left-radius: 4px; 519 border-bottom-right-radius: 4px; 520 border-bottom: none; } 521 522 .leaflet-bar a.leaflet-disabled { 523 cursor: default; 524 background-color: #f4f4f4; 525 color: #bbb; } 526 527 .leaflet-touch .leaflet-bar a { 528 width: 30px; 529 height: 30px; 530 line-height: 30px; } 531 532 .leaflet-touch .leaflet-bar a:first-child { 533 border-top-left-radius: 2px; 534 border-top-right-radius: 2px; } 535 536 .leaflet-touch .leaflet-bar a:last-child { 537 border-bottom-left-radius: 2px; 538 border-bottom-right-radius: 2px; } 539 540 /* zoom control */ 541 .leaflet-control-zoom-in, 542 .leaflet-control-zoom-out { 543 font: bold 18px 'Lucida Console', Monaco, monospace; 544 text-indent: 1px; } 545 546 .leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out { 547 font-size: 22px; } 548 549 /* layers control */ 550 .leaflet-control-layers { 551 box-shadow: 0 1px 5px rgba(0, 0, 0, 0.4); 552 background: #fff; 553 border-radius: 5px; } 554 555 .leaflet-control-layers-toggle { 556 background-image: url(images/layers.png); 557 width: 36px; 558 height: 36px; } 559 560 .leaflet-retina .leaflet-control-layers-toggle { 561 background-image: url(images/layers-2x.png); 562 background-size: 26px 26px; } 563 564 .leaflet-touch .leaflet-control-layers-toggle { 565 width: 44px; 566 height: 44px; } 567 568 .leaflet-control-layers .leaflet-control-layers-list, 569 .leaflet-control-layers-expanded .leaflet-control-layers-toggle { 570 display: none; } 571 572 .leaflet-control-layers-expanded .leaflet-control-layers-list { 573 display: block; 574 position: relative; } 575 576 .leaflet-control-layers-expanded { 577 padding: 6px 10px 6px 6px; 578 color: #333; 579 background: #fff; } 580 581 .leaflet-control-layers-scrollbar { 582 overflow-y: scroll; 583 overflow-x: hidden; 584 padding-right: 5px; } 585 586 .leaflet-control-layers-selector { 587 margin-top: 2px; 588 position: relative; 589 top: 1px; } 590 591 .leaflet-control-layers label { 592 display: block; } 593 594 .leaflet-control-layers-separator { 595 height: 0; 596 border-top: 1px solid #ddd; 597 margin: 5px -10px 5px -6px; } 598 599 /* Default icon URLs */ 600 .leaflet-default-icon-path { 601 background-image: url(images/marker-icon.png); } 602 603 /* attribution and scale controls */ 604 .leaflet-container .leaflet-control-attribution { 605 background: #fff; 606 background: rgba(255, 255, 255, 0.7); 607 margin: 0; } 608 609 .leaflet-control-attribution, 610 .leaflet-control-scale-line { 611 padding: 0 5px; 612 color: #333; } 613 614 .leaflet-control-attribution a { 615 text-decoration: none; } 616 617 .leaflet-control-attribution a:hover { 618 text-decoration: underline; } 619 620 .leaflet-container .leaflet-control-attribution, 621 .leaflet-container .leaflet-control-scale { 622 font-size: 11px; } 623 624 .leaflet-left .leaflet-control-scale { 625 margin-left: 5px; } 626 627 .leaflet-bottom .leaflet-control-scale { 628 margin-bottom: 5px; } 629 630 .leaflet-control-scale-line { 631 border: 2px solid #777; 632 border-top: none; 633 line-height: 1.1; 634 padding: 2px 5px 1px; 635 font-size: 11px; 636 white-space: nowrap; 637 overflow: hidden; 638 -moz-box-sizing: border-box; 639 box-sizing: border-box; 640 background: #fff; 641 background: rgba(255, 255, 255, 0.5); } 642 643 .leaflet-control-scale-line:not(:first-child) { 644 border-top: 2px solid #777; 645 border-bottom: none; 646 margin-top: -2px; } 647 648 .leaflet-control-scale-line:not(:first-child):not(:last-child) { 649 border-bottom: 2px solid #777; } 650 651 .leaflet-touch .leaflet-control-attribution, 652 .leaflet-touch .leaflet-control-layers, 653 .leaflet-touch .leaflet-bar { 654 box-shadow: none; } 655 656 .leaflet-touch .leaflet-control-layers, 657 .leaflet-touch .leaflet-bar { 658 border: 2px solid rgba(0, 0, 0, 0.2); 659 background-clip: padding-box; } 660 661 /* popup */ 662 .leaflet-popup { 663 position: absolute; 664 text-align: center; 665 margin-bottom: 20px; } 666 667 .leaflet-popup-content-wrapper { 668 padding: 1px; 669 text-align: left; 670 border-radius: 12px; } 671 672 .leaflet-popup-content { 673 margin: 13px 19px; 674 line-height: 1.4; } 675 676 .leaflet-popup-content p { 677 margin: 18px 0; } 678 679 .leaflet-popup-tip-container { 680 width: 40px; 681 height: 20px; 682 position: absolute; 683 left: 50%; 684 margin-left: -20px; 685 overflow: hidden; 686 pointer-events: none; } 687 688 .leaflet-popup-tip { 689 width: 17px; 690 height: 17px; 691 padding: 1px; 692 margin: -10px auto 0; 693 -webkit-transform: rotate(45deg); 694 -moz-transform: rotate(45deg); 695 -ms-transform: rotate(45deg); 696 transform: rotate(45deg); } 697 698 .leaflet-popup-content-wrapper, 699 .leaflet-popup-tip { 700 background: white; 701 color: #333; 702 box-shadow: 0 3px 14px rgba(0, 0, 0, 0.4); } 703 704 .leaflet-container a.leaflet-popup-close-button { 705 position: absolute; 706 top: 0; 707 right: 0; 708 padding: 4px 4px 0 0; 709 border: none; 710 text-align: center; 711 width: 18px; 712 height: 14px; 713 font: 16px/14px Tahoma, Verdana, sans-serif; 714 color: #c3c3c3; 715 text-decoration: none; 716 font-weight: bold; 717 background: transparent; } 718 719 .leaflet-container a.leaflet-popup-close-button:hover { 720 color: #999; } 721 722 .leaflet-popup-scrolled { 723 overflow: auto; 724 border-bottom: 1px solid #ddd; 725 border-top: 1px solid #ddd; } 726 727 .leaflet-oldie .leaflet-popup-content-wrapper { 728 zoom: 1; } 729 730 .leaflet-oldie .leaflet-popup-tip { 731 width: 24px; 732 margin: 0 auto; 733 -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; 734 filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); } 735 736 .leaflet-oldie .leaflet-popup-tip-container { 737 margin-top: -1px; } 738 739 .leaflet-oldie .leaflet-control-zoom, 740 .leaflet-oldie .leaflet-control-layers, 741 .leaflet-oldie .leaflet-popup-content-wrapper, 742 .leaflet-oldie .leaflet-popup-tip { 743 border: 1px solid #999; } 744 745 /* div icon */ 746 .leaflet-div-icon { 747 background: #fff; 748 border: 1px solid #666; } 749 750 /* Tooltip */ 751 /* Base styles for the element that has a tooltip */ 752 .leaflet-tooltip { 753 position: absolute; 754 padding: 6px; 755 background-color: #fff; 756 border: 1px solid #fff; 757 border-radius: 3px; 758 color: #222; 759 white-space: nowrap; 760 -webkit-user-select: none; 761 -moz-user-select: none; 762 -ms-user-select: none; 763 user-select: none; 764 pointer-events: none; 765 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); } 766 767 .leaflet-tooltip.leaflet-clickable { 768 cursor: pointer; 769 pointer-events: auto; } 770 771 .leaflet-tooltip-top:before, 772 .leaflet-tooltip-bottom:before, 773 .leaflet-tooltip-left:before, 774 .leaflet-tooltip-right:before { 775 position: absolute; 776 pointer-events: none; 777 border: 6px solid transparent; 778 background: transparent; 779 content: ""; } 780 781 /* Directions */ 782 .leaflet-tooltip-bottom { 783 margin-top: 6px; } 784 785 .leaflet-tooltip-top { 786 margin-top: -6px; } 787 788 .leaflet-tooltip-bottom:before, 789 .leaflet-tooltip-top:before { 790 left: 50%; 791 margin-left: -6px; } 792 793 .leaflet-tooltip-top:before { 794 bottom: 0; 795 margin-bottom: -12px; 796 border-top-color: #fff; } 797 798 .leaflet-tooltip-bottom:before { 799 top: 0; 800 margin-top: -12px; 801 margin-left: -6px; 802 border-bottom-color: #fff; } 803 804 .leaflet-tooltip-left { 805 margin-left: -6px; } 806 807 .leaflet-tooltip-right { 808 margin-left: 6px; } 809 810 .leaflet-tooltip-left:before, 811 .leaflet-tooltip-right:before { 812 top: 50%; 813 margin-top: -6px; } 814 815 .leaflet-tooltip-left:before { 816 right: 0; 817 margin-right: -12px; 818 border-left-color: #fff; } 819 820 .leaflet-tooltip-right:before { 821 left: 0; 822 margin-left: -12px; 823 border-right-color: #fff; } 824 -
shiptimize-for-woocommerce/trunk/assets/js/shiptimize-admin.js
r2724326 r2746465 1 !function(e){var n={};function F(B){if(n[B])return n[B].exports;var Q=n[B]={i:B,l:!1,exports:{}};return e[B].call(Q.exports,Q,Q.exports,F),Q.l=!0,Q.exports}F.m=e,F.c=n,F.d=function(B,Q,e){F.o(B,Q)||Object.defineProperty(B,Q,{enumerable:!0,get:e})},F.r=function(B){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(B,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(B,"__esModule",{value:!0})},F.t=function(Q,B){if(1&B&&(Q=F(Q)),8&B)return Q;if(4&B&&"object"==typeof Q&&Q&&Q.__esModule)return Q;var e=Object.create(null);if(F.r(e),Object.defineProperty(e,"default",{enumerable:!0,value:Q}),2&B&&"string"!=typeof Q)for(var n in Q)F.d(e,n,function(B){return Q[B]}.bind(null,n));return e},F.n=function(B){var Q=B&&B.__esModule?function(){return B.default}:function(){return B};return F.d(Q,"a",Q),Q},F.o=function(B,Q){return Object.prototype.hasOwnProperty.call(B,Q)},F.p="/shiptimize-for-woocommerce/assets/js",F(F.s=7)}([function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\n/** \n * Singleton object we can use for platform independent stuff \n */\nvar ShiptimizeUtils = function () {\n function ShiptimizeUtils() {\n _classCallCheck(this, ShiptimizeUtils);\n }\n\n /** \n * Inject Script into the page \n * @param string src \n */\n\n\n _createClass(ShiptimizeUtils, [{\n key: "injectExternalScript",\n value: function injectExternalScript(src) {\n var s = document.createElement("script");\n s.setAttribute("src", src);\n document.body.appendChild(s);\n }\n\n /** \n * Inject a script string \n */\n\n }, {\n key: "injectScript",\n value: function injectScript(contents) {\n var e = document.createElement("script");\n e.value = contents;\n document.body.appendChild(e);\n }\n\n /** \n * Removes all not numeric chars from the string \n *\n * @param string string - the input string \n * @return the string without chars that are not numbers \n */\n\n }, {\n key: "removeNonNumeric",\n value: function removeNonNumeric(string) {\n return string.replace(/\\D/g, \'\');\n }\n\n /** \n * Check if the given url exists and is valid\n * We use this to check if the carrier icon exists given \n * a url path and the naming convention {carrier_id}.svg \n * Make sure the correct protocol is appended to the url http != https \n * \n * @return true it the url exists and is valid \n */\n\n }, {\n key: "isUrlValid",\n value: function isUrlValid(url) {\n var http = new XMLHttpRequest();\n http.open(\'HEAD\', url, false);\n http.send();\n return http.status == 200;\n }\n\n /** \n * Open a new window with the provided URL \n * @string url \n * @return bool if the window was opened, false if popup blocker enabled \n */\n\n }, {\n key: "openNewWindow",\n value: function openNewWindow(url, options) {\n var newWin = window.open(url, \'_blank\', options);\n var blocked = !newWin || newWin.closed || typeof newWin.closed == \'undefined\';\n\n return !blocked;\n }\n }]);\n\n return ShiptimizeUtils;\n}();\n\nvar utils = new ShiptimizeUtils();\nexports.default = utils;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXV0aWxzLmpzPzAwZDQiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZVV0aWxzIiwic3JjIiwicyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNvbnRlbnRzIiwiZSIsInZhbHVlIiwic3RyaW5nIiwicmVwbGFjZSIsInVybCIsImh0dHAiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJzZW5kIiwic3RhdHVzIiwib3B0aW9ucyIsIm5ld1dpbiIsIndpbmRvdyIsImJsb2NrZWQiLCJjbG9zZWQiLCJ1dGlscyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOzs7SUFHTUEsZTtBQUVGLDZCQUFjO0FBQUE7QUFFYjs7QUFHRDs7Ozs7Ozs7eUNBSXFCQyxHLEVBQUs7QUFDdEIsVUFBSUMsSUFBSUMsU0FBU0MsYUFBVCxDQUF1QixRQUF2QixDQUFSO0FBQ0FGLFFBQUVHLFlBQUYsQ0FBZSxLQUFmLEVBQXNCSixHQUF0QjtBQUNBRSxlQUFTRyxJQUFULENBQWNDLFdBQWQsQ0FBMEJMLENBQTFCO0FBQ0g7O0FBR0Q7Ozs7OztpQ0FHYU0sUSxFQUFVO0FBQ25CLFVBQUlDLElBQUlOLFNBQVNDLGFBQVQsQ0FBdUIsUUFBdkIsQ0FBUjtBQUNBSyxRQUFFQyxLQUFGLEdBQVVGLFFBQVY7QUFDQUwsZUFBU0csSUFBVCxDQUFjQyxXQUFkLENBQTBCRSxDQUExQjtBQUNIOztBQUVEOzs7Ozs7Ozs7cUNBTWlCRSxNLEVBQVE7QUFDckIsYUFBT0EsT0FBT0MsT0FBUCxDQUFlLEtBQWYsRUFBc0IsRUFBdEIsQ0FBUDtBQUNIOztBQUVEOzs7Ozs7Ozs7OzsrQkFRV0MsRyxFQUFLO0FBQ1osVUFBSUMsT0FBTyxJQUFJQyxjQUFKLEVBQVg7QUFDQUQsV0FBS0UsSUFBTCxDQUFVLE1BQVYsRUFBa0JILEdBQWxCLEVBQXVCLEtBQXZCO0FBQ0FDLFdBQUtHLElBQUw7QUFDQSxhQUFPSCxLQUFLSSxNQUFMLElBQWUsR0FBdEI7QUFDSDs7QUFFRDs7Ozs7Ozs7a0NBS2NMLEcsRUFBS00sTyxFQUFRO0FBQ3ZCLFVBQUlDLFNBQVNDLE9BQU9MLElBQVAsQ0FBWUgsR0FBWixFQUFpQixRQUFqQixFQUEyQk0sT0FBM0IsQ0FBYjtBQUNBLFVBQUlHLFVBQVUsQ0FBQ0YsTUFBRCxJQUFXQSxPQUFPRyxNQUFsQixJQUE0QixPQUFPSCxPQUFPRyxNQUFkLElBQXNCLFdBQWhFOztBQUVBLGFBQU8sQ0FBQ0QsT0FBUjtBQUNIOzs7Ozs7QUFJTCxJQUFJRSxRQUFRLElBQUl4QixlQUFKLEVBQVo7a0JBQ2V3QixLIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogXG4gKiBTaW5nbGV0b24gb2JqZWN0IHdlIGNhbiB1c2UgZm9yIHBsYXRmb3JtIGluZGVwZW5kZW50IHN0dWZmIFxuICovXG5jbGFzcyBTaGlwdGltaXplVXRpbHMge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG5cbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBJbmplY3QgU2NyaXB0IGludG8gdGhlIHBhZ2UgXG4gICAgICogQHBhcmFtIHN0cmluZyBzcmMgXG4gICAgICovXG4gICAgaW5qZWN0RXh0ZXJuYWxTY3JpcHQoc3JjKSB7XG4gICAgICAgIGxldCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgc3JjKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzKTtcbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBJbmplY3QgYSBzY3JpcHQgc3RyaW5nIFxuICAgICAqL1xuICAgIGluamVjdFNjcmlwdChjb250ZW50cykge1xuICAgICAgICBsZXQgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgIGUudmFsdWUgPSBjb250ZW50cztcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogUmVtb3ZlcyBhbGwgbm90IG51bWVyaWMgY2hhcnMgZnJvbSB0aGUgc3RyaW5nIFxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmluZyBzdHJpbmcgLSB0aGUgaW5wdXQgc3RyaW5nIFxuICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyB3aXRob3V0IGNoYXJzIHRoYXQgYXJlIG5vdCBudW1iZXJzIFxuICAgICAqL1xuICAgIHJlbW92ZU5vbk51bWVyaWMoc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIHVybCBleGlzdHMgYW5kIGlzIHZhbGlkXG4gICAgICogV2UgdXNlIHRoaXMgdG8gY2hlY2sgaWYgdGhlIGNhcnJpZXIgaWNvbiBleGlzdHMgZ2l2ZW4gXG4gICAgICogYSB1cmwgcGF0aCBhbmQgdGhlIG5hbWluZyBjb252ZW50aW9uIHtjYXJyaWVyX2lkfS5zdmcgXG4gICAgICogTWFrZSBzdXJlIHRoZSBjb3JyZWN0IHByb3RvY29sIGlzIGFwcGVuZGVkIHRvIHRoZSB1cmwgaHR0cCAhPSBodHRwcyBcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJuIHRydWUgaXQgdGhlIHVybCBleGlzdHMgYW5kIGlzIHZhbGlkIFxuICAgICAqLyBcbiAgICBpc1VybFZhbGlkKHVybCkge1xuICAgICAgICB2YXIgaHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBodHRwLm9wZW4oJ0hFQUQnLCB1cmwsIGZhbHNlKTtcbiAgICAgICAgaHR0cC5zZW5kKCk7XG4gICAgICAgIHJldHVybiBodHRwLnN0YXR1cyA9PSAyMDA7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIE9wZW4gYSBuZXcgd2luZG93IHdpdGggdGhlIHByb3ZpZGVkIFVSTCBcbiAgICAgKiBAc3RyaW5nIHVybCBcbiAgICAgKiBAcmV0dXJuIGJvb2wgaWYgdGhlIHdpbmRvdyB3YXMgb3BlbmVkLCBmYWxzZSBpZiBwb3B1cCBibG9ja2VyIGVuYWJsZWQgXG4gICAgICovICBcbiAgICBvcGVuTmV3V2luZG93KHVybCwgb3B0aW9ucyl7XG4gICAgICAgIGxldCBuZXdXaW4gPSB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnLCBvcHRpb25zKTsgXG4gICAgICAgIGxldCBibG9ja2VkID0gIW5ld1dpbiB8fCBuZXdXaW4uY2xvc2VkIHx8IHR5cGVvZiBuZXdXaW4uY2xvc2VkPT0ndW5kZWZpbmVkJzsgXG5cbiAgICAgICAgcmV0dXJuICFibG9ja2VkOyBcbiAgICB9XG59XG5cblxubGV0IHV0aWxzID0gbmV3IFNoaXB0aW1pemVVdGlscygpO1xuZXhwb3J0IGRlZmF1bHQgdXRpbHM7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///0\n')},,,,,,,function(module,exports,__webpack_require__){"use strict";eval("\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n__webpack_require__(8);\n\nvar _popper = __webpack_require__(9);\n\nvar _popper2 = _interopRequireDefault(_popper);\n\nvar _shiptimizeWooCommerceAdmin = __webpack_require__(11);\n\nvar _shiptimizeWooCommerceAdmin2 = _interopRequireDefault(_shiptimizeWooCommerceAdmin);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Shiptimize = function () {\n function Shiptimize() {\n _classCallCheck(this, Shiptimize);\n\n console.log(\"I'm alive!\");\n }\n\n /** \n * \n */\n\n\n _createClass(Shiptimize, [{\n key: 'bootstrap',\n value: function bootstrap() {\n this.tooltips();\n this.platform = new _shiptimizeWooCommerceAdmin2.default();\n\n this.loadAnalytics();\n if (typeof this.platform.bootstrap != 'undefined') {\n this.platform.bootstrap();\n }\n }\n }, {\n key: 'tooltips',\n value: function tooltips() {\n var toltip = jQuery(\".shiptimize-tooltip-message\");\n var container = jQuery('#wpcontent');\n\n if (toltip.size() == 0) {\n return;\n }\n\n var me = this;\n toltip.each(function (idx, elem) {\n me.attachPopper(elem, container);\n });\n }\n }, {\n key: 'attachPopper',\n value: function attachPopper(toltip, container) {\n var eToltip = jQuery(toltip);\n var toltipReference = eToltip.siblings(\".shiptimize-tooltip-reference\");\n var arrow = eToltip.children('.shiptimize-tooltip-message__arrow').get(0);\n\n var popper = new _popper2.default(toltipReference.get(0), toltip, {\n placement: 'left',\n modifiers: {\n flip: {\n behavior: ['top', 'left', 'bottom']\n },\n preventOverflow: {\n boundariesElement: container\n },\n offset: {\n enabled: true,\n offset: '10,10'\n },\n arrow: {\n enabled: true,\n element: arrow\n }\n }\n });\n setTimeout(function () {\n popper.update();\n }, 200);\n }\n }, {\n key: 'exportSuccess',\n value: function exportSuccess(appLink) {\n this.platform.exportSuccess(appLink);\n }\n\n /** \n * @param string category \n * @param string action \n * @param string label \n */\n\n }, {\n key: 'sendAnalyticsEvent',\n value: function sendAnalyticsEvent(category, action, label) {\n ga('shiptimize.send', 'event', category, action, label, { transport: 'beacon' });\n }\n }, {\n key: 'loadAnalytics',\n value: function loadAnalytics() {\n if (typeof ga == 'undefined') {\n (function (i, s, o, g, r, a, m) {\n i['GoogleAnalyticsObject'] = r;\n i[r] = i[r] || function () {\n (i[r].q = i[r].q || []).push(arguments);\n }, i[r].l = 1 * new Date();\n a = s.createElement(o), m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n console.log(\"inserting analytics \");\n }\n ga('create', 'UA-101485643-1', 'auto', 'shiptimize');\n ga('shiptimize.set', 'anonymizeIp', true);\n console.log(\"creating tracker\");\n }\n }, {\n key: 'printlabel',\n value: function printlabel(event, orderid) {\n var _this = this;\n\n event.stopPropagation();\n console.log(\"Printing label for orderid \", orderid);\n\n var data = {\n 'action': 'shiptimize_print_label',\n 'orderid': orderid\n };\n\n this.openLoader(shiptimize_label_request);\n\n jQuery.post(ajaxurl, data, function (data) {\n console.log(data);\n\n if (typeof data.response != 'undefined') {\n if (typeof data.response.Error != 'undefined' && data.response.Error.Id > 0) {\n _this.loaderMsg(data.response.Error.Info);\n\n setTimeout(function () {\n _this.closeLoader();\n }, 2000);\n }\n\n if (typeof data.response.CallbackURL != 'undefined') {\n _this.monitorLabelStatus(data.response.CallbackURL);\n }\n }\n\n if (typeof data.errors != 'undefined') {\n _this.loaderMsg(data.errors.join('<br/>'));\n setTimeout(function () {\n _this.closeLoader();\n }, 5000);\n }\n }, \"json\");\n }\n\n /**\n * Request the label status every 1s \n */\n\n }, {\n key: 'monitorLabelStatus',\n value: function monitorLabelStatus(callbackUrl) {\n var _this2 = this;\n\n var data = {\n 'action': 'shiptimize_label_status',\n 'callbackUrl': callbackUrl\n };\n\n jQuery.post(ajaxurl, data, function (data) {\n console.log(data);\n\n if (typeof data.response != 'undefined') {\n\n // Check for falta errors \n if (data.httpCode == '200') {\n _this2.loaderMsg(shiptimize_label_request + ' ' + data.response.Finished + '%');\n } else {\n _this2.loaderMsg(\"Fatal API error \" + data.httpCode);\n setTimeout(function () {\n _this2.closeLoader();\n }, 5000);\n return;\n }\n\n // Print API errors\n if (data.response.Error.Id > 0) {\n _this2.loaderMsg(data.response.Error.Info);\n }\n\n if (data.response.Error.Id == 902) {\n //No process running \n setTimeout(function () {\n _this2.closeLoader();\n }, 2000);\n }\n\n if (data.response.Finished == 100) {\n if (data.response.LabelFile.length > 0) {\n var labelinfo = shiptimize_label_click.replace('%', '<a href=\"' + data.response.LabelFile + '\" target=\\'_blank\\'>' + shiptimize_label_label + '</a>');\n var noticelist = jQuery(\"#wp__notice-list\");\n noticelist.removeClass('woocommerce-layout__notice-list-hide');\n noticelist.append('<div class=\"notice notice-info is-dismissible updated\">' + labelinfo + '</div>');\n window.open(data.response.LabelFile, '_blank');\n _this2.closeLoader();\n\n /** \n * Make sure the info is updated without the need to reload the page \n */\n for (var x = 0; x < data.response.ClientReferenceCodeList.length; ++x) {\n var labelresult = data.response.ClientReferenceCodeList[x];\n if (labelresult.Error.Id == 0) {\n jQuery(\"#shiptimize-label\" + labelresult.ReferenceCode).addClass('shiptimize-icon-print-printed');\n } else {\n jQuery(\"#shiptimize-label\" + labelresult.ReferenceCode).addClass(\"shiptimize-icon-print-error\");\n }\n\n jQuery(\"#shiptimize-tooltip\" + labelresult.ReferenceCode).html(labelresult.message);\n }\n } else {\n var msg = '';\n for (var x = 0; x < data.response.ClientReferenceCodeList.length; ++x) {\n var _labelresult = data.response.ClientReferenceCodeList[0];\n if (_labelresult.Error.Id > 0) {\n msg += \"<div class='shiptimize-label-error error'>\" + _labelresult.Error.Info + \"</div>\";\n }\n jQuery(\"#shiptimize-label\" + _labelresult.ReferenceCode).addClass(\"shiptimize-icon-print-error\");\n jQuery(\"#shiptimize-tooltip\" + _labelresult.ReferenceCode).html(_labelresult.message);\n }\n\n _this2.loaderMsg(msg);\n setTimeout(function () {\n _this2.closeLoader();\n }, 5000);\n }\n }\n\n if (data.response.Finished < 100) {\n setTimeout(function () {\n _this2.monitorLabelStatus(callbackUrl);\n }, 2000);\n }\n }\n }, \"json\");\n }\n }, {\n key: 'loaderMsg',\n value: function loaderMsg(message) {\n jQuery(\".shiptimize-loader-message\").html(message);\n }\n }, {\n key: 'openLoader',\n value: function openLoader(message) {\n jQuery('body').append('<div class=\"shiptimize-loader-wrapper\"><div class=\"shiptimize-loader\"><div></div><div></div><div></div></div><div class=\"shiptimize-loader-message\">' + message + '</div></div>');\n }\n }, {\n key: 'closeLoader',\n value: function closeLoader() {\n jQuery(\".shiptimize-loader-wrapper\").remove();\n }\n }]);\n\n return Shiptimize;\n}();\n\njQuery(function () {\n window.shiptimize = new Shiptimize();\n window.shiptimize.bootstrap();\n window.Popper = _popper2.default;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGlwdGltaXplLWFkbWluLmpzPzM4YTIiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZSIsImNvbnNvbGUiLCJsb2ciLCJ0b29sdGlwcyIsInBsYXRmb3JtIiwiV29vU2hpcHRpbWl6ZSIsImxvYWRBbmFseXRpY3MiLCJib290c3RyYXAiLCJ0b2x0aXAiLCJqUXVlcnkiLCJjb250YWluZXIiLCJzaXplIiwibWUiLCJlYWNoIiwiaWR4IiwiZWxlbSIsImF0dGFjaFBvcHBlciIsImVUb2x0aXAiLCJ0b2x0aXBSZWZlcmVuY2UiLCJzaWJsaW5ncyIsImFycm93IiwiY2hpbGRyZW4iLCJnZXQiLCJwb3BwZXIiLCJQb3BwZXIiLCJwbGFjZW1lbnQiLCJtb2RpZmllcnMiLCJmbGlwIiwiYmVoYXZpb3IiLCJwcmV2ZW50T3ZlcmZsb3ciLCJib3VuZGFyaWVzRWxlbWVudCIsIm9mZnNldCIsImVuYWJsZWQiLCJlbGVtZW50Iiwic2V0VGltZW91dCIsInVwZGF0ZSIsImFwcExpbmsiLCJleHBvcnRTdWNjZXNzIiwiY2F0ZWdvcnkiLCJhY3Rpb24iLCJsYWJlbCIsImdhIiwidHJhbnNwb3J0IiwiaSIsInMiLCJvIiwiZyIsInIiLCJhIiwibSIsInEiLCJwdXNoIiwiYXJndW1lbnRzIiwibCIsIkRhdGUiLCJjcmVhdGVFbGVtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJhc3luYyIsInNyYyIsInBhcmVudE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJ3aW5kb3ciLCJkb2N1bWVudCIsImV2ZW50Iiwib3JkZXJpZCIsInN0b3BQcm9wYWdhdGlvbiIsImRhdGEiLCJvcGVuTG9hZGVyIiwic2hpcHRpbWl6ZV9sYWJlbF9yZXF1ZXN0IiwicG9zdCIsImFqYXh1cmwiLCJyZXNwb25zZSIsIkVycm9yIiwiSWQiLCJsb2FkZXJNc2ciLCJJbmZvIiwiY2xvc2VMb2FkZXIiLCJDYWxsYmFja1VSTCIsIm1vbml0b3JMYWJlbFN0YXR1cyIsImVycm9ycyIsImpvaW4iLCJjYWxsYmFja1VybCIsImh0dHBDb2RlIiwiRmluaXNoZWQiLCJMYWJlbEZpbGUiLCJsZW5ndGgiLCJsYWJlbGluZm8iLCJzaGlwdGltaXplX2xhYmVsX2NsaWNrIiwicmVwbGFjZSIsInNoaXB0aW1pemVfbGFiZWxfbGFiZWwiLCJub3RpY2VsaXN0IiwicmVtb3ZlQ2xhc3MiLCJhcHBlbmQiLCJvcGVuIiwieCIsIkNsaWVudFJlZmVyZW5jZUNvZGVMaXN0IiwibGFiZWxyZXN1bHQiLCJSZWZlcmVuY2VDb2RlIiwiYWRkQ2xhc3MiLCJodG1sIiwibWVzc2FnZSIsIm1zZyIsInJlbW92ZSIsInNoaXB0aW1pemUiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTs7QUFDQTs7OztBQUVBOzs7Ozs7OztJQUVNQSxVO0FBRUosd0JBQWE7QUFBQTs7QUFDWEMsWUFBUUMsR0FBUixDQUFZLFlBQVo7QUFDRDs7QUFFRDs7Ozs7OztnQ0FHVztBQUNULFdBQUtDLFFBQUw7QUFDQSxXQUFLQyxRQUFMLEdBQWdCLElBQUlDLG9DQUFKLEVBQWhCOztBQUVBLFdBQUtDLGFBQUw7QUFDQSxVQUFHLE9BQU8sS0FBS0YsUUFBTCxDQUFjRyxTQUFyQixJQUFtQyxXQUF0QyxFQUFtRDtBQUNqRCxhQUFLSCxRQUFMLENBQWNHLFNBQWQ7QUFDRDtBQUNGOzs7K0JBRVU7QUFDVCxVQUFJQyxTQUFTQyxPQUFPLDZCQUFQLENBQWI7QUFDQSxVQUFJQyxZQUFZRCxPQUFPLFlBQVAsQ0FBaEI7O0FBRUEsVUFBS0QsT0FBT0csSUFBUCxNQUFpQixDQUF0QixFQUEwQjtBQUN4QjtBQUNEOztBQUVELFVBQUlDLEtBQUssSUFBVDtBQUNBSixhQUFPSyxJQUFQLENBQWEsVUFBV0MsR0FBWCxFQUFnQkMsSUFBaEIsRUFBdUI7QUFDbENILFdBQUdJLFlBQUgsQ0FBZ0JELElBQWhCLEVBQXFCTCxTQUFyQjtBQUNELE9BRkQ7QUFJRDs7O2lDQUVZRixNLEVBQVFFLFMsRUFBVTtBQUM3QixVQUFJTyxVQUFVUixPQUFPRCxNQUFQLENBQWQ7QUFDQSxVQUFJ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QWY7QUFDQW5FLHlCQUFXLFlBQU07QUFBRSx1QkFBSzBDLFdBQUw7QUFBcUIsZUFBeEMsRUFBMEMsSUFBMUM7QUFDRDtBQUNGOztBQUVELGNBQUdWLEtBQUtLLFFBQUwsQ0FBY1ksUUFBZCxHQUF5QixHQUE1QixFQUFpQztBQUMvQmpELHVCQUFZLFlBQU07QUFBRSxxQkFBSzRDLGtCQUFMLENBQXdCRyxXQUF4QjtBQUF1QyxhQUEzRCxFQUE2RCxJQUE3RDtBQUNEO0FBQ0Y7QUFFRixPQXZFRCxFQXVFRyxNQXZFSDtBQXdFRDs7OzhCQUVTbUIsTyxFQUFTO0FBQ2pCM0YsYUFBTyw0QkFBUCxFQUFxQzBGLElBQXJDLENBQTBDQyxPQUExQztBQUNEOzs7K0JBRVVBLE8sRUFBUztBQUNsQjNGLGFBQU8sTUFBUCxFQUFlbUYsTUFBZixDQUFzQix5SkFBeUpRLE9BQXpKLEdBQW9LLGNBQTFMO0FBQ0Q7OztrQ0FFWTtBQUNYM0YsYUFBTyw0QkFBUCxFQUFxQzZGLE1BQXJDO0FBQ0Q7Ozs7OztBQUdIN0YsT0FBTyxZQUFZO0FBQ2pCb0QsU0FBTzBDLFVBQVAsR0FBb0IsSUFBSXZHLFVBQUosRUFBcEI7QUFDQTZELFNBQU8wQyxVQUFQLENBQWtCaEcsU0FBbEI7QUFDQXNELFNBQU9yQyxNQUFQLEdBQWdCQSxnQkFBaEI7QUFDRCxDQUpEIiwiZmlsZSI6IjcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJy4vc2Nzcy9zaGlwdGltaXplLWFkbWluLnNjc3MnO1xuaW1wb3J0IFBvcHBlciBmcm9tICdwb3BwZXIuanMnOyBcblxuaW1wb3J0IFdvb1NoaXB0aW1pemUgIGZyb20gJy4vanMvc2hpcHRpbWl6ZS13b28tY29tbWVyY2UtYWRtaW4uanMnOyBcblxuY2xhc3MgU2hpcHRpbWl6ZSB7XG5cbiAgY29uc3RydWN0b3IoKXtcbiAgICBjb25zb2xlLmxvZyhcIkknbSBhbGl2ZSFcIik7IFxuICB9XG5cbiAgLyoqIFxuICAgKiAgXG4gICAqLyBcbiAgYm9vdHN0cmFwKCl7XG4gICAgdGhpcy50b29sdGlwcygpOyBcbiAgICB0aGlzLnBsYXRmb3JtID0gbmV3IFdvb1NoaXB0aW1pemUoKTsgXG5cbiAgICB0aGlzLmxvYWRBbmFseXRpY3MoKTsgXG4gICAgaWYodHlwZW9mKHRoaXMucGxhdGZvcm0uYm9vdHN0cmFwKSAhPSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5wbGF0Zm9ybS5ib290c3RyYXAoKTtcbiAgICB9XG4gIH1cblxuICB0b29sdGlwcyggKXtcbiAgICBsZXQgdG9sdGlwID0galF1ZXJ5KFwiLnNoaXB0aW1pemUtdG9vbHRpcC1tZXNzYWdlXCIpO1xuICAgIGxldCBjb250YWluZXIgPSBqUXVlcnkoJyN3cGNvbnRlbnQnKTsgXG5cbiAgICBpZiAoIHRvbHRpcC5zaXplKCkgPT0gMCApIHtcbiAgICAgIHJldHVybjsgXG4gICAgfVxuXG4gICAgbGV0IG1lID0gdGhpczsgXG4gICAgdG9sdGlwLmVhY2goIGZ1bmN0aW9uICggaWR4LCBlbGVtICkge1xuICAgICAgbWUuYXR0YWNoUG9wcGVyKGVsZW0sY29udGFpbmVyKTtcbiAgICB9KTsgICAgICBcblxuICB9XG5cbiAgYXR0YWNoUG9wcGVyKHRvbHRpcCwgY29udGFpbmVyKXsgIFxuICAgIGxldCBlVG9sdGlwID0galF1ZXJ5KHRvbHRpcCk7IFxuICAgIGxldCB0b2x0aXBSZWZlcmVuY2UgPSBlVG9sdGlwLnNpYmxpbmdzKFwiLnNoaXB0aW1pemUtdG9vbHRpcC1yZWZlcmVuY2VcIik7XG4gICAgbGV0IGFycm93ID0gZVRvbHRpcC5jaGlsZHJlbignLnNoaXB0aW1pemUtdG9vbHRpcC1tZXNzYWdlX19hcnJvdycpLmdldCgwKTsgXG5cbiAgICB2YXIgcG9wcGVyID0gbmV3IFBvcHBlcih0b2x0aXBSZWZlcmVuY2UuZ2V0KDApLCB0b2x0aXAsIHtcbiAgICAgIHBsYWNlbWVudDogJ2xlZnQnLFxuICAgICAgbW9kaWZpZXJzOiB7XG4gICAgICAgICAgZmxpcDoge1xuICAgICAgICAgICAgICBiZWhhdmlvcjogWyd0b3AnLCdsZWZ0JywgJ2JvdHRvbSddXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcmV2ZW50T3ZlcmZsb3c6IHtcbiAgICAgICAgICAgICAgYm91bmRhcmllc0VsZW1lbnQ6IGNvbnRhaW5lcixcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9mZnNldDogeyBcbiAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgb2Zmc2V0OiAnMTAsMTAnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcnJvdzoge1xuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIGVsZW1lbnQ6IGFycm93XG4gICAgICAgICAgfVxuICAgICAgfSwgXG4gICAgfSk7ICBcbiAgICBzZXRUaW1lb3V0ICggKCkgPT4geyBwb3BwZXIudXBkYXRlKCk7IH0gLCAyMDApOyAgICAgXG4gIH1cblxuICBleHBvcnRTdWNjZXNzKGFwcExpbmspe1xuICAgIHRoaXMucGxhdGZvcm0uZXhwb3J0U3VjY2VzcyhhcHBMaW5rKTtcbiAgfVxuXG4gIC8qKiBcbiAgICogQHBhcmFtIHN0cmluZyBjYXRlZ29yeSBcbiAgICogQHBhcmFtIHN0cmluZyBhY3Rpb24gXG4gICAqIEBwYXJhbSBzdHJpbmcgbGFiZWwgXG4gICAqL1xuICBzZW5kQW5hbHl0aWNzRXZlbnQoY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwpIHtcbiAgICAgIGdhKCdzaGlwdGltaXplLnNlbmQnLCAnZXZlbnQnLCBjYXRlZ29yeSwgYWN0aW9uLCBsYWJlbCwgeyB0cmFuc3BvcnQ6ICdiZWFjb24nIH0pO1xuICB9XG5cbiAgbG9hZEFuYWx5dGljcygpIHtcbiAgICAgIGlmICh0eXBlb2YoZ2EpID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgKGZ1bmN0aW9uKGksIHMsIG8sIGcsIHIsIGEsIG0pIHtcbiAgICAgICAgICAgICAgaVsnR29vZ2xlQW5hbHl0aWNzT2JqZWN0J10gPSByO1xuICAgICAgICAgICAgICBpW3JdID0gaVtyXSB8fCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgIChpW3JdLnEgPSBpW3JdLnEgfHwgW10pLnB1c2goYXJndW1lbnRzKVxuICAgICAgICAgICAgICB9LCBpW3JdLmwgPSAxICogbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgYSA9IHMuY3JlYXRlRWxlbWVudChvKSxcbiAgICAgICAgICAgICAgICAgIG0gPSBzLmdldEVsZW1lbnRzQnlUYWdOYW1lKG8pWzBdO1xuICAgICAgICAgICAgICBhLmFzeW5jID0gMTtcbiAgICAgICAgICAgICAgYS5zcmMgPSBnO1xuICAgICAgICAgICAgICBtLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsIG0pXG4gICAgICAgICAgfSkod2luZG93LCBkb2N1bWVudCwgJ3NjcmlwdCcsICdodHRwczovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9hbmFseXRpY3MuanMnLCAnZ2EnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcImluc2VydGluZyBhbmFseXRpY3MgXCIpO1xuICAgICAgfSBcbiAgICAgIGdhKCdjcmVhdGUnLCAnVUEtMTAxNDg1NjQzLTEnLCAnYXV0bycsICdzaGlwdGltaXplJyk7XG4gICAgICBnYSgnc2hpcHRpbWl6ZS5zZXQnLCAnYW5vbnltaXplSXAnLCB0cnVlKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiY3JlYXRpbmcgdHJhY2tlclwiKTtcbiAgfVxuXG4gIHByaW50bGFiZWwoZXZlbnQsIG9yZGVyaWQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgXG4gICAgY29uc29sZS5sb2cgKFwiUHJpbnRpbmcgbGFiZWwgZm9yIG9yZGVyaWQgXCIsIG9yZGVyaWQpO1xuXG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICAnYWN0aW9uJzogJ3NoaXB0aW1pemVfcHJpbnRfbGFiZWwnLCBcbiAgICAgICdvcmRlcmlkJzogb3JkZXJpZFxuICAgIH07IFxuXG4gICAgdGhpcy5vcGVuTG9hZGVyKHNoaXB0aW1pemVfbGFiZWxfcmVxdWVzdCk7IFxuXG4gICAgalF1ZXJ5LnBvc3QoYWpheHVybCwgZGF0YSwgKGRhdGEpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGRhdGEpOyBcblxuICAgICAgaWYgKHR5cGVvZihkYXRhLnJlc3BvbnNlKSAhPSAndW5kZWZpbmVkJyApIHtcbiAgICAgICAgICBpZih0eXBlb2YoZGF0YS5yZXNwb25zZS5FcnJvcikgIT0gJ3VuZGVmaW5lZCcgJiYgZGF0YS5yZXNwb25zZS5FcnJvci5JZCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGVyTXNnKGRhdGEucmVzcG9uc2UuRXJyb3IuSW5mbyk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmNsb3NlTG9hZGVyKCk7IH0sIDIwMDApOyAgXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYodHlwZW9mKGRhdGEucmVzcG9uc2UuQ2FsbGJhY2tVUkwpICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLm1vbml0b3JMYWJlbFN0YXR1cyhkYXRhLnJlc3BvbnNlLkNhbGxiYWNrVVJMKTsgICAgICAgICAgICAgXG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZih0eXBlb2YoZGF0YS5lcnJvcnMpICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRoaXMubG9hZGVyTXNnKGRhdGEuZXJyb3JzLmpvaW4oJzxici8+JykpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5jbG9zZUxvYWRlcigpOyB9LCA1MDAwKTsgIFxuICAgICAgfVxuICAgIH0sIFwianNvblwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRoZSBsYWJlbCBzdGF0dXMgZXZlcnkgMXMgXG4gICAqL1xuICBtb25pdG9yTGFiZWxTdGF0dXMoY2FsbGJhY2tVcmwpIHtcbiAgICB2YXIgZGF0YSA9IHtcbiAgICAgICdhY3Rpb24nOiAnc2hpcHRpbWl6ZV9sYWJlbF9zdGF0dXMnLFxuICAgICAgJ2NhbGxiYWNrVXJsJzogY2FsbGJhY2tVcmxcbiAgICB9OyBcblxuICAgIGpRdWVyeS5wb3N0KGFqYXh1cmwsIGRhdGEsIChkYXRhKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhkYXRhKTsgXG5cbiAgICAgIGlmKHR5cGVvZihkYXRhLnJlc3BvbnNlKSE9ICd1bmRlZmluZWQnKSB7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGZhbHRhIGVycm9ycyBcbiAgICAgICAgaWYoZGF0YS5odHRwQ29kZSA9PSAnMjAwJykge1xuICAgICAgICAgIHRoaXMubG9hZGVyTXNnKHNoaXB0aW1pemVfbGFiZWxfcmVxdWVzdCArICcgJyArIGRhdGEucmVzcG9uc2UuRmluaXNoZWQgKyAnJScpOyAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9hZGVyTXNnKFwiRmF0YWwgQVBJIGVycm9yIFwiICsgZGF0YS5odHRwQ29kZSk7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMuY2xvc2VMb2FkZXIoKTsgfSwgNTAwMCk7XG4gICAgICAgICAgcmV0dXJuOyBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByaW50IEFQSSBlcnJvcnNcbiAgICAgICAgaWYgKGRhdGEucmVzcG9uc2UuRXJyb3IuSWQgPiAwKSB7XG4gICAgICAgICAgdGhpcy5sb2FkZXJNc2coZGF0YS5yZXNwb25zZS5FcnJvci5JbmZvKTsgXG4gICAgICAgIH1cblxuICAgICAgICBpZihkYXRhLnJlc3BvbnNlLkVycm9yLklkID09IDkwMikgeyAvL05vIHByb2Nlc3MgcnVubmluZyBcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRlcigpXG4gICAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihkYXRhLnJlc3BvbnNlLkZpbmlzaGVkID09IDEwMCApIHtcbiAgICAgICAgICBpZiAoIGRhdGEucmVzcG9uc2UuTGFiZWxGaWxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBsYWJlbGluZm8gPSBzaGlwdGltaXplX2xhYmVsX2NsaWNrLnJlcGxhY2UoJyUnLGA8YSBocmVmPVwiJHtkYXRhLnJlc3BvbnNlLkxhYmVsRmlsZX1cIiB0YXJnZXQ9J19ibGFuayc+JHtzaGlwdGltaXplX2xhYmVsX2xhYmVsfTwvYT5gKTtcbiAgICAgICAgICAgIGxldCBub3RpY2VsaXN0ID0galF1ZXJ5KFwiI3dwX19ub3RpY2UtbGlzdFwiKTsgXG4gICAgICAgICAgICBub3RpY2VsaXN0LnJlbW92ZUNsYXNzKCd3b29jb21tZXJjZS1sYXlvdXRfX25vdGljZS1saXN0LWhpZGUnKTsgXG4gICAgICAgICAgICBub3RpY2VsaXN0LmFwcGVuZChgPGRpdiBjbGFzcz1cIm5vdGljZSBub3RpY2UtaW5mbyBpcy1kaXNtaXNzaWJsZSB1cGRhdGVkXCI+JHtsYWJlbGluZm99PC9kaXY+YCk7XG4gICAgICAgICAgICB3aW5kb3cub3BlbihkYXRhLnJlc3BvbnNlLkxhYmVsRmlsZSwnX2JsYW5rJyk7IFxuICAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRlcigpO1xuXG4gICAgICAgICAgICAvKiogXG4gICAgICAgICAgICAgKiBNYWtlIHN1cmUgdGhlIGluZm8gaXMgdXBkYXRlZCB3aXRob3V0IHRoZSBuZWVkIHRvIHJlbG9hZCB0aGUgcGFnZSBcbiAgICAgICAgICAgICAqLyBcbiAgICAgICAgICAgIGZvcih2YXIgeCA9MDsgeCA8IGRhdGEucmVzcG9uc2UuQ2xpZW50UmVmZXJlbmNlQ29kZUxpc3QubGVuZ3RoOyArK3gpIHtcbiAgICAgICAgICAgICAgdmFyIGxhYmVscmVzdWx0ID0gZGF0YS5yZXNwb25zZS5DbGllbnRSZWZlcmVuY2VDb2RlTGlzdFt4XTsgXG4gICAgICAgICAgICAgIGlmKGxhYmVscmVzdWx0LkVycm9yLklkID09IDApIHsgXG4gICAgICAgICAgICAgICAgalF1ZXJ5KFwiI3NoaXB0aW1pemUtbGFiZWxcIiArIGxhYmVscmVzdWx0LlJlZmVyZW5jZUNvZGUpLmFkZENsYXNzKCdzaGlwdGltaXplLWljb24tcHJpbnQtcHJpbnRlZCcpOyAgIFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGpRdWVyeShcIiNzaGlwdGltaXplLWxhYmVsXCIgKyBsYWJlbHJlc3VsdC5SZWZlcmVuY2VDb2RlKS5hZGRDbGFzcyhcInNoaXB0aW1pemUtaWNvbi1wcmludC1lcnJvclwiKTsgIFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS10b29sdGlwXCIgKyBsYWJlbHJlc3VsdC5SZWZlcmVuY2VDb2RlKS5odG1sKGxhYmVscmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtc2cgPSAnJzsgXG4gICAgICAgICAgICBmb3IgKCB2YXIgeD0wOyB4IDwgZGF0YS5yZXNwb25zZS5DbGllbnRSZWZlcmVuY2VDb2RlTGlzdC5sZW5ndGg7ICsreCApIHtcbiAgICAgICAgICAgICAgbGV0IGxhYmVscmVzdWx0ID0gZGF0YS5yZXNwb25zZS5DbGllbnRSZWZlcmVuY2VDb2RlTGlzdFswXTsgXG4gICAgICAgICAgICAgIGlmKGxhYmVscmVzdWx0LkVycm9yLklkID4gMCkge1xuICAgICAgICAgICAgICAgIG1zZyArPSBcIjxkaXYgY2xhc3M9J3NoaXB0aW1pemUtbGFiZWwtZXJyb3IgZXJyb3InPlwiICsgbGFiZWxyZXN1bHQuRXJyb3IuSW5mbyArIFwiPC9kaXY+XCI7IFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGpRdWVyeShcIiNzaGlwdGltaXplLWxhYmVsXCIgKyBsYWJlbHJlc3VsdC5SZWZlcmVuY2VDb2RlKS5hZGRDbGFzcyhcInNoaXB0aW1pemUtaWNvbi1wcmludC1lcnJvclwiKTsgIFxuICAgICAgICAgICAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS10b29sdGlwXCIgKyBsYWJlbHJlc3VsdC5SZWZlcmVuY2VDb2RlKS5odG1sKGxhYmVscmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvYWRlck1zZyhtc2cpOyBcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmNsb3NlTG9hZGVyKCk7IH0sIDUwMDApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGRhdGEucmVzcG9uc2UuRmluaXNoZWQgPCAxMDApIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7IHRoaXMubW9uaXRvckxhYmVsU3RhdHVzKGNhbGxiYWNrVXJsKTsgfSwgMjAwMCk7IFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9LCBcImpzb25cIik7XG4gIH1cblxuICBsb2FkZXJNc2cobWVzc2FnZSkge1xuICAgIGpRdWVyeShcIi5zaGlwdGltaXplLWxvYWRlci1tZXNzYWdlXCIpLmh0bWwobWVzc2FnZSk7IFxuICB9XG5cbiAgb3BlbkxvYWRlcihtZXNzYWdlKSB7XG4gICAgalF1ZXJ5KCdib2R5JykuYXBwZW5kKCc8ZGl2IGNsYXNzPVwic2hpcHRpbWl6ZS1sb2FkZXItd3JhcHBlclwiPjxkaXYgY2xhc3M9XCJzaGlwdGltaXplLWxvYWRlclwiPjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9XCJzaGlwdGltaXplLWxvYWRlci1tZXNzYWdlXCI+JyArIG1lc3NhZ2UgICsgJzwvZGl2PjwvZGl2PicpOyBcbiAgfVxuXG4gIGNsb3NlTG9hZGVyKCl7XG4gICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtbG9hZGVyLXdyYXBwZXJcIikucmVtb3ZlKCk7IFxuICB9XG59XG5cbmpRdWVyeShmdW5jdGlvbiAoKSB7XG4gIHdpbmRvdy5zaGlwdGltaXplID0gbmV3IFNoaXB0aW1pemUoKTtcbiAgd2luZG93LnNoaXB0aW1pemUuYm9vdHN0cmFwKCk7IFxuICB3aW5kb3cuUG9wcGVyID0gUG9wcGVyO1xufSk7XG5cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7\n")},function(module,exports,__webpack_require__){eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zY3NzL3NoaXB0aW1pemUtYWRtaW4uc2Nzcz82MGM5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6IjguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8\n")},function(module,exports,__webpack_require__){"use strict";eval("/* WEBPACK VAR INJECTION */(function(global) {\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n/**!\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version 1.16.1\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';\n\nvar timeoutDuration = function () {\n var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n return 1;\n }\n }\n return 0;\n}();\n\nfunction microtaskDebounce(fn) {\n var called = false;\n return function () {\n if (called) {\n return;\n }\n called = true;\n window.Promise.resolve().then(function () {\n called = false;\n fn();\n });\n };\n}\n\nfunction taskDebounce(fn) {\n var scheduled = false;\n return function () {\n if (!scheduled) {\n scheduled = true;\n setTimeout(function () {\n scheduled = false;\n fn();\n }, timeoutDuration);\n }\n };\n}\n\nvar supportsMicroTasks = isBrowser && window.Promise;\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nfunction isFunction(functionToCheck) {\n var getType = {};\n return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n}\n\n/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nfunction getStyleComputedProperty(element, property) {\n if (element.nodeType !== 1) {\n return [];\n }\n // NOTE: 1 DOM access here\n var window = element.ownerDocument.defaultView;\n var css = window.getComputedStyle(element, null);\n return property ? css[property] : css;\n}\n\n/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nfunction getParentNode(element) {\n if (element.nodeName === 'HTML') {\n return element;\n }\n return element.parentNode || element.host;\n}\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nfunction getScrollParent(element) {\n // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n if (!element) {\n return document.body;\n }\n\n switch (element.nodeName) {\n case 'HTML':\n case 'BODY':\n return element.ownerDocument.body;\n case '#document':\n return element.body;\n }\n\n // Firefox want us to check `-x` and `-y` variations as well\n\n var _getStyleComputedProp = getStyleComputedProperty(element),\n overflow = _getStyleComputedProp.overflow,\n overflowX = _getStyleComputedProp.overflowX,\n overflowY = _getStyleComputedProp.overflowY;\n\n if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n return element;\n }\n\n return getScrollParent(getParentNode(element));\n}\n\n/**\n * Returns the reference node of the reference object, or the reference object itself.\n * @method\n * @memberof Popper.Utils\n * @param {Element|Object} reference - the reference element (the popper will be relative to this)\n * @returns {Element} parent\n */\nfunction getReferenceNode(reference) {\n return reference && reference.referenceNode ? reference.referenceNode : reference;\n}\n\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nfunction isIE(version) {\n if (version === 11) {\n return isIE11;\n }\n if (version === 10) {\n return isIE10;\n }\n return isIE11 || isIE10;\n}\n\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nfunction getOffsetParent(element) {\n if (!element) {\n return document.documentElement;\n }\n\n var noOffsetParent = isIE(10) ? document.body : null;\n\n // NOTE: 1 DOM access here\n var offsetParent = element.offsetParent || null;\n // Skip hidden elements which don't have an offsetParent\n while (offsetParent === noOffsetParent && element.nextElementSibling) {\n offsetParent = (element = element.nextElementSibling).offsetParent;\n }\n\n var nodeName = offsetParent && offsetParent.nodeName;\n\n if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n return element ? element.ownerDocument.documentElement : document.documentElement;\n }\n\n // .offsetParent will return the closest TH, TD or TABLE in case\n // no offsetParent is present, I hate this job...\n if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n return getOffsetParent(offsetParent);\n }\n\n return offsetParent;\n}\n\nfunction isOffsetContainer(element) {\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY') {\n return false;\n }\n return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n}\n\n/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nfunction getRoot(node) {\n if (node.parentNode !== null) {\n return getRoot(node.parentNode);\n }\n\n return node;\n}\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nfunction findCommonOffsetParent(element1, element2) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n return document.documentElement;\n }\n\n // Here we make sure to give as \"start\" the element that comes first in the DOM\n var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n var start = order ? element1 : element2;\n var end = order ? element2 : element1;\n\n // Get common ancestor container\n var range = document.createRange();\n range.setStart(start, 0);\n range.setEnd(end, 0);\n var commonAncestorContainer = range.commonAncestorContainer;\n\n // Both nodes are inside #document\n\n if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n if (isOffsetContainer(commonAncestorContainer)) {\n return commonAncestorContainer;\n }\n\n return getOffsetParent(commonAncestorContainer);\n }\n\n // one of the nodes is inside shadowDOM, find which one\n var element1root = getRoot(element1);\n if (element1root.host) {\n return findCommonOffsetParent(element1root.host, element2);\n } else {\n return findCommonOffsetParent(element1, getRoot(element2).host);\n }\n}\n\n/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nfunction getScroll(element) {\n var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n var html = element.ownerDocument.documentElement;\n var scrollingElement = element.ownerDocument.scrollingElement || html;\n return scrollingElement[upperSide];\n }\n\n return element[upperSide];\n}\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nfunction includeScroll(rect, element) {\n var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n var modifier = subtract ? -1 : 1;\n rect.top += scrollTop * modifier;\n rect.bottom += scrollTop * modifier;\n rect.left += scrollLeft * modifier;\n rect.right += scrollLeft * modifier;\n return rect;\n}\n\n/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nfunction getBordersSize(styles, axis) {\n var sideA = axis === 'x' ? 'Left' : 'Top';\n var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n return parseFloat(styles['border' + sideA + 'Width']) + parseFloat(styles['border' + sideB + 'Width']);\n}\n\nfunction getSize(axis, body, html, computedStyle) {\n return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n}\n\nfunction getWindowSizes(document) {\n var body = document.body;\n var html = document.documentElement;\n var computedStyle = isIE(10) && getComputedStyle(html);\n\n return {\n height: getSize('Height', body, html, computedStyle),\n width: getSize('Width', body, html, computedStyle)\n };\n}\n\nvar classCallCheck = function classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nvar defineProperty = function defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n};\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\n/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nfunction getClientRect(offsets) {\n return _extends({}, offsets, {\n right: offsets.left + offsets.width,\n bottom: offsets.top + offsets.height\n });\n}\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nfunction getBoundingClientRect(element) {\n var rect = {};\n\n // IE10 10 FIX: Please, don't ask, the element isn't\n // considered in DOM in some circumstances...\n // This isn't reproducible in IE10 compatibility mode of IE11\n try {\n if (isIE(10)) {\n rect = element.getBoundingClientRect();\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n rect.top += scrollTop;\n rect.left += scrollLeft;\n rect.bottom += scrollTop;\n rect.right += scrollLeft;\n } else {\n rect = element.getBoundingClientRect();\n }\n } catch (e) {}\n\n var result = {\n left: rect.left,\n top: rect.top,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n\n // subtract scrollbar size from sizes\n var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n var width = sizes.width || element.clientWidth || result.width;\n var height = sizes.height || element.clientHeight || result.height;\n\n var horizScrollbar = element.offsetWidth - width;\n var vertScrollbar = element.offsetHeight - height;\n\n // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n // we make this check conditional for performance reasons\n if (horizScrollbar || vertScrollbar) {\n var styles = getStyleComputedProperty(element);\n horizScrollbar -= getBordersSize(styles, 'x');\n vertScrollbar -= getBordersSize(styles, 'y');\n\n result.width -= horizScrollbar;\n result.height -= vertScrollbar;\n }\n\n return getClientRect(result);\n}\n\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\n var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var isIE10 = isIE(10);\n var isHTML = parent.nodeName === 'HTML';\n var childrenRect = getBoundingClientRect(children);\n var parentRect = getBoundingClientRect(parent);\n var scrollParent = getScrollParent(children);\n\n var styles = getStyleComputedProperty(parent);\n var borderTopWidth = parseFloat(styles.borderTopWidth);\n var borderLeftWidth = parseFloat(styles.borderLeftWidth);\n\n // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n if (fixedPosition && isHTML) {\n parentRect.top = Math.max(parentRect.top, 0);\n parentRect.left = Math.max(parentRect.left, 0);\n }\n var offsets = getClientRect({\n top: childrenRect.top - parentRect.top - borderTopWidth,\n left: childrenRect.left - parentRect.left - borderLeftWidth,\n width: childrenRect.width,\n height: childrenRect.height\n });\n offsets.marginTop = 0;\n offsets.marginLeft = 0;\n\n // Subtract margins of documentElement in case it's being used as parent\n // we do this only on HTML because it's the only element that behaves\n // differently when margins are applied to it. The margins are included in\n // the box of the documentElement, in the other cases not.\n if (!isIE10 && isHTML) {\n var marginTop = parseFloat(styles.marginTop);\n var marginLeft = parseFloat(styles.marginLeft);\n\n offsets.top -= borderTopWidth - marginTop;\n offsets.bottom -= borderTopWidth - marginTop;\n offsets.left -= borderLeftWidth - marginLeft;\n offsets.right -= borderLeftWidth - marginLeft;\n\n // Attach marginTop and marginLeft because in some circumstances we may need them\n offsets.marginTop = marginTop;\n offsets.marginLeft = marginLeft;\n }\n\n if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n offsets = includeScroll(offsets, parent);\n }\n\n return offsets;\n}\n\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\n var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var html = element.ownerDocument.documentElement;\n var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n var width = Math.max(html.clientWidth, window.innerWidth || 0);\n var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n var scrollTop = !excludeScroll ? getScroll(html) : 0;\n var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n var offset = {\n top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n width: width,\n height: height\n };\n\n return getClientRect(offset);\n}\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nfunction isFixed(element) {\n var nodeName = element.nodeName;\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n return false;\n }\n if (getStyleComputedProperty(element, 'position') === 'fixed') {\n return true;\n }\n var parentNode = getParentNode(element);\n if (!parentNode) {\n return false;\n }\n return isFixed(parentNode);\n}\n\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nfunction getFixedPositionOffsetParent(element) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element || !element.parentElement || isIE()) {\n return document.documentElement;\n }\n var el = element.parentElement;\n while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n el = el.parentElement;\n }\n return el || document.documentElement;\n}\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\n var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n // NOTE: 1 DOM access here\n\n var boundaries = { top: 0, left: 0 };\n var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n\n // Handle viewport case\n if (boundariesElement === 'viewport') {\n boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n } else {\n // Handle other cases based on DOM element used as boundaries\n var boundariesNode = void 0;\n if (boundariesElement === 'scrollParent') {\n boundariesNode = getScrollParent(getParentNode(reference));\n if (boundariesNode.nodeName === 'BODY') {\n boundariesNode = popper.ownerDocument.documentElement;\n }\n } else if (boundariesElement === 'window') {\n boundariesNode = popper.ownerDocument.documentElement;\n } else {\n boundariesNode = boundariesElement;\n }\n\n var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n // In case of HTML, we need a different computation\n if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n height = _getWindowSizes.height,\n width = _getWindowSizes.width;\n\n boundaries.top += offsets.top - offsets.marginTop;\n boundaries.bottom = height + offsets.top;\n boundaries.left += offsets.left - offsets.marginLeft;\n boundaries.right = width + offsets.left;\n } else {\n // for all the other DOM elements, this one is good\n boundaries = offsets;\n }\n }\n\n // Add paddings\n padding = padding || 0;\n var isPaddingNumber = typeof padding === 'number';\n boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n\n return boundaries;\n}\n\nfunction getArea(_ref) {\n var width = _ref.width,\n height = _ref.height;\n\n return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n if (placement.indexOf('auto') === -1) {\n return placement;\n }\n\n var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n var rects = {\n top: {\n width: boundaries.width,\n height: refRect.top - boundaries.top\n },\n right: {\n width: boundaries.right - refRect.right,\n height: boundaries.height\n },\n bottom: {\n width: boundaries.width,\n height: boundaries.bottom - refRect.bottom\n },\n left: {\n width: refRect.left - boundaries.left,\n height: boundaries.height\n }\n };\n\n var sortedAreas = Object.keys(rects).map(function (key) {\n return _extends({\n key: key\n }, rects[key], {\n area: getArea(rects[key])\n });\n }).sort(function (a, b) {\n return b.area - a.area;\n });\n\n var filteredAreas = sortedAreas.filter(function (_ref2) {\n var width = _ref2.width,\n height = _ref2.height;\n return width >= popper.clientWidth && height >= popper.clientHeight;\n });\n\n var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n var variation = placement.split('-')[1];\n\n return computedPlacement + (variation ? '-' + variation : '');\n}\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nfunction getReferenceOffsets(state, popper, reference) {\n var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n\n/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nfunction getOuterSizes(element) {\n var window = element.ownerDocument.defaultView;\n var styles = window.getComputedStyle(element);\n var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n var result = {\n width: element.offsetWidth + y,\n height: element.offsetHeight + x\n };\n return result;\n}\n\n/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nfunction getOppositePlacement(placement) {\n var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\n placement = placement.split('-')[0];\n\n // Get popper node sizes\n var popperRect = getOuterSizes(popper);\n\n // Add position, width and height to our offsets object\n var popperOffsets = {\n width: popperRect.width,\n height: popperRect.height\n };\n\n // depending by the popper placement we have to compute its offsets slightly differently\n var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n var mainSide = isHoriz ? 'top' : 'left';\n var secondarySide = isHoriz ? 'left' : 'top';\n var measurement = isHoriz ? 'height' : 'width';\n var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n if (placement === secondarySide) {\n popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n } else {\n popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n }\n\n return popperOffsets;\n}\n\n/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction find(arr, check) {\n // use native find if supported\n if (Array.prototype.find) {\n return arr.find(check);\n }\n\n // use `filter` to obtain the same behavior of `find`\n return arr.filter(check)[0];\n}\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction findIndex(arr, prop, value) {\n // use native findIndex if supported\n if (Array.prototype.findIndex) {\n return arr.findIndex(function (cur) {\n return cur[prop] === value;\n });\n }\n\n // use `find` + `indexOf` if `findIndex` isn't supported\n var match = find(arr, function (obj) {\n return obj[prop] === value;\n });\n return arr.indexOf(match);\n}\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nfunction runModifiers(modifiers, data, ends) {\n var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n modifiersToRun.forEach(function (modifier) {\n if (modifier['function']) {\n // eslint-disable-line dot-notation\n console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n }\n var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n if (modifier.enabled && isFunction(fn)) {\n // Add properties to offsets to make them a complete clientRect object\n // we do this before each modifier to make sure the previous one doesn't\n // mess with these values\n data.offsets.popper = getClientRect(data.offsets.popper);\n data.offsets.reference = getClientRect(data.offsets.reference);\n\n data = fn(data, modifier);\n }\n });\n\n return data;\n}\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.<br />\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nfunction update() {\n // if popper is destroyed, don't perform any further update\n if (this.state.isDestroyed) {\n return;\n }\n\n var data = {\n instance: this,\n styles: {},\n arrowStyles: {},\n attributes: {},\n flipped: false,\n offsets: {}\n };\n\n // compute reference element offsets\n data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n // store the computed placement inside `originalPlacement`\n data.originalPlacement = data.placement;\n\n data.positionFixed = this.options.positionFixed;\n\n // compute the popper offsets\n data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n // run the modifiers\n data = runModifiers(this.modifiers, data);\n\n // the first `update` will call `onCreate` callback\n // the other ones will call `onUpdate` callback\n if (!this.state.isCreated) {\n this.state.isCreated = true;\n this.options.onCreate(data);\n } else {\n this.options.onUpdate(data);\n }\n}\n\n/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nfunction isModifierEnabled(modifiers, modifierName) {\n return modifiers.some(function (_ref) {\n var name = _ref.name,\n enabled = _ref.enabled;\n return enabled && name === modifierName;\n });\n}\n\n/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nfunction getSupportedPropertyName(property) {\n var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n for (var i = 0; i < prefixes.length; i++) {\n var prefix = prefixes[i];\n var toCheck = prefix ? '' + prefix + upperProp : property;\n if (typeof document.body.style[toCheck] !== 'undefined') {\n return toCheck;\n }\n }\n return null;\n}\n\n/**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\nfunction destroy() {\n this.state.isDestroyed = true;\n\n // touch DOM only if `applyStyle` modifier is enabled\n if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n this.popper.removeAttribute('x-placement');\n this.popper.style.position = '';\n this.popper.style.top = '';\n this.popper.style.left = '';\n this.popper.style.right = '';\n this.popper.style.bottom = '';\n this.popper.style.willChange = '';\n this.popper.style[getSupportedPropertyName('transform')] = '';\n }\n\n this.disableEventListeners();\n\n // remove the popper if user explicitly asked for the deletion on destroy\n // do not use `remove` because IE11 doesn't support it\n if (this.options.removeOnDestroy) {\n this.popper.parentNode.removeChild(this.popper);\n }\n return this;\n}\n\n/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nfunction getWindow(element) {\n var ownerDocument = element.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView : window;\n}\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n var isBody = scrollParent.nodeName === 'BODY';\n var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n target.addEventListener(event, callback, { passive: true });\n\n if (!isBody) {\n attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n }\n scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction setupEventListeners(reference, options, state, updateBound) {\n // Resize event listener on window\n state.updateBound = updateBound;\n getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n // Scroll event listener on scroll parents\n var scrollElement = getScrollParent(reference);\n attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n state.scrollElement = scrollElement;\n state.eventsEnabled = true;\n\n return state;\n}\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nfunction enableEventListeners() {\n if (!this.state.eventsEnabled) {\n this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n }\n}\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction removeEventListeners(reference, state) {\n // Remove resize event listener on window\n getWindow(reference).removeEventListener('resize', state.updateBound);\n\n // Remove scroll event listener on scroll parents\n state.scrollParents.forEach(function (target) {\n target.removeEventListener('scroll', state.updateBound);\n });\n\n // Reset state\n state.updateBound = null;\n state.scrollParents = [];\n state.scrollElement = null;\n state.eventsEnabled = false;\n return state;\n}\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nfunction disableEventListeners() {\n if (this.state.eventsEnabled) {\n cancelAnimationFrame(this.scheduleUpdate);\n this.state = removeEventListeners(this.reference, this.state);\n }\n}\n\n/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nfunction isNumeric(n) {\n return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setStyles(element, styles) {\n Object.keys(styles).forEach(function (prop) {\n var unit = '';\n // add unit if the value is numeric and is one of the following\n if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n unit = 'px';\n }\n element.style[prop] = styles[prop] + unit;\n });\n}\n\n/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setAttributes(element, attributes) {\n Object.keys(attributes).forEach(function (prop) {\n var value = attributes[prop];\n if (value !== false) {\n element.setAttribute(prop, attributes[prop]);\n } else {\n element.removeAttribute(prop);\n }\n });\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nfunction applyStyle(data) {\n // any property present in `data.styles` will be applied to the popper,\n // in this way we can make the 3rd party modifiers add custom styles to it\n // Be aware, modifiers could override the properties defined in the previous\n // lines of this modifier!\n setStyles(data.instance.popper, data.styles);\n\n // any property present in `data.attributes` will be applied to the popper,\n // they will be set as HTML attributes of the element\n setAttributes(data.instance.popper, data.attributes);\n\n // if arrowElement is defined and arrowStyles has some properties\n if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n setStyles(data.arrowElement, data.arrowStyles);\n }\n\n return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n // compute reference element offsets\n var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n popper.setAttribute('x-placement', placement);\n\n // Apply `position` to popper before anything else because\n // without the position applied we can't guarantee correct computations\n setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n return options;\n}\n\n/**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\nfunction getRoundedOffsets(data, shouldRound) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n var round = Math.round,\n floor = Math.floor;\n\n var noRound = function noRound(v) {\n return v;\n };\n\n var referenceWidth = round(reference.width);\n var popperWidth = round(popper.width);\n\n var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n var isVariation = data.placement.indexOf('-') !== -1;\n var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n var verticalToInteger = !shouldRound ? noRound : round;\n\n return {\n left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n top: verticalToInteger(popper.top),\n bottom: verticalToInteger(popper.bottom),\n right: horizontalToInteger(popper.right)\n };\n}\n\nvar isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeStyle(data, options) {\n var x = options.x,\n y = options.y;\n var popper = data.offsets.popper;\n\n // Remove this legacy support in Popper.js v2\n\n var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'applyStyle';\n }).gpuAcceleration;\n if (legacyGpuAccelerationOption !== undefined) {\n console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n }\n var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n var offsetParent = getOffsetParent(data.instance.popper);\n var offsetParentRect = getBoundingClientRect(offsetParent);\n\n // Styles\n var styles = {\n position: popper.position\n };\n\n var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n\n var sideA = x === 'bottom' ? 'top' : 'bottom';\n var sideB = y === 'right' ? 'left' : 'right';\n\n // if gpuAcceleration is set to `true` and transform is supported,\n // we use `translate3d` to apply the position to the popper we\n // automatically use the supported prefixed version if needed\n var prefixedProperty = getSupportedPropertyName('transform');\n\n // now, let's make a step back and look at this code closely (wtf?)\n // If the content of the popper grows once it's been positioned, it\n // may happen that the popper gets misplaced because of the new content\n // overflowing its reference element\n // To avoid this problem, we provide two options (x and y), which allow\n // the consumer to define the offset origin.\n // If we position a popper on top of a reference element, we can set\n // `x` to `top` to make the popper grow towards its top instead of\n // its bottom.\n var left = void 0,\n top = void 0;\n if (sideA === 'bottom') {\n // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n // and not the bottom of the html element\n if (offsetParent.nodeName === 'HTML') {\n top = -offsetParent.clientHeight + offsets.bottom;\n } else {\n top = -offsetParentRect.height + offsets.bottom;\n }\n } else {\n top = offsets.top;\n }\n if (sideB === 'right') {\n if (offsetParent.nodeName === 'HTML') {\n left = -offsetParent.clientWidth + offsets.right;\n } else {\n left = -offsetParentRect.width + offsets.right;\n }\n } else {\n left = offsets.left;\n }\n if (gpuAcceleration && prefixedProperty) {\n styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n styles[sideA] = 0;\n styles[sideB] = 0;\n styles.willChange = 'transform';\n } else {\n // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n var invertTop = sideA === 'bottom' ? -1 : 1;\n var invertLeft = sideB === 'right' ? -1 : 1;\n styles[sideA] = top * invertTop;\n styles[sideB] = left * invertLeft;\n styles.willChange = sideA + ', ' + sideB;\n }\n\n // Attributes\n var attributes = {\n 'x-placement': data.placement\n };\n\n // Update `data` attributes, styles and arrowStyles\n data.attributes = _extends({}, attributes, data.attributes);\n data.styles = _extends({}, styles, data.styles);\n data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n return data;\n}\n\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\n var requesting = find(modifiers, function (_ref) {\n var name = _ref.name;\n return name === requestingName;\n });\n\n var isRequired = !!requesting && modifiers.some(function (modifier) {\n return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n });\n\n if (!isRequired) {\n var _requesting = '`' + requestingName + '`';\n var requested = '`' + requestedName + '`';\n console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n }\n return isRequired;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction arrow(data, options) {\n var _data$offsets$arrow;\n\n // arrow depends on keepTogether in order to work\n if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n return data;\n }\n\n var arrowElement = options.element;\n\n // if arrowElement is a string, suppose it's a CSS selector\n if (typeof arrowElement === 'string') {\n arrowElement = data.instance.popper.querySelector(arrowElement);\n\n // if arrowElement is not found, don't run the modifier\n if (!arrowElement) {\n return data;\n }\n } else {\n // if the arrowElement isn't a query selector we must check that the\n // provided DOM node is child of its popper node\n if (!data.instance.popper.contains(arrowElement)) {\n console.warn('WARNING: `arrow.element` must be child of its popper element!');\n return data;\n }\n }\n\n var placement = data.placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n var len = isVertical ? 'height' : 'width';\n var sideCapitalized = isVertical ? 'Top' : 'Left';\n var side = sideCapitalized.toLowerCase();\n var altSide = isVertical ? 'left' : 'top';\n var opSide = isVertical ? 'bottom' : 'right';\n var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n //\n // extends keepTogether behavior making sure the popper and its\n // reference have enough pixels in conjunction\n //\n\n // top/left side\n if (reference[opSide] - arrowElementSize < popper[side]) {\n data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n }\n // bottom/right side\n if (reference[side] + arrowElementSize > popper[opSide]) {\n data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n }\n data.offsets.popper = getClientRect(data.offsets.popper);\n\n // compute center of the popper\n var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n // Compute the sideValue using the updated popper offsets\n // take popper margin in account because we don't have this info available\n var css = getStyleComputedProperty(data.instance.popper);\n var popperMarginSide = parseFloat(css['margin' + sideCapitalized]);\n var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width']);\n var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n // prevent arrowElement from being placed not contiguously to its popper\n sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n data.arrowElement = arrowElement;\n data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n return data;\n}\n\n/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nfunction getOppositeVariation(variation) {\n if (variation === 'end') {\n return 'start';\n } else if (variation === 'start') {\n return 'end';\n }\n return variation;\n}\n\n/**\n * List of accepted placements to use as values of the `placement` option.<br />\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.<br />\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n// Get rid of `auto` `auto-start` and `auto-end`\nvar validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nfunction clockwise(placement) {\n var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var index = validPlacements.indexOf(placement);\n var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n return counter ? arr.reverse() : arr;\n}\n\nvar BEHAVIORS = {\n FLIP: 'flip',\n CLOCKWISE: 'clockwise',\n COUNTERCLOCKWISE: 'counterclockwise'\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction flip(data, options) {\n // if `inner` modifier is enabled, we can't use the `flip` modifier\n if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n return data;\n }\n\n if (data.flipped && data.placement === data.originalPlacement) {\n // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n return data;\n }\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n var placement = data.placement.split('-')[0];\n var placementOpposite = getOppositePlacement(placement);\n var variation = data.placement.split('-')[1] || '';\n\n var flipOrder = [];\n\n switch (options.behavior) {\n case BEHAVIORS.FLIP:\n flipOrder = [placement, placementOpposite];\n break;\n case BEHAVIORS.CLOCKWISE:\n flipOrder = clockwise(placement);\n break;\n case BEHAVIORS.COUNTERCLOCKWISE:\n flipOrder = clockwise(placement, true);\n break;\n default:\n flipOrder = options.behavior;\n }\n\n flipOrder.forEach(function (step, index) {\n if (placement !== step || flipOrder.length === index + 1) {\n return data;\n }\n\n placement = data.placement.split('-')[0];\n placementOpposite = getOppositePlacement(placement);\n\n var popperOffsets = data.offsets.popper;\n var refOffsets = data.offsets.reference;\n\n // using floor because the reference offsets may contain decimals we are not going to consider here\n var floor = Math.floor;\n var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n // flip the variation if required\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n\n // flips variation if reference element overflows boundaries\n var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n // flips variation if popper content overflows boundaries\n var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);\n\n var flippedVariation = flippedVariationByRef || flippedVariationByContent;\n\n if (overlapsRef || overflowsBoundaries || flippedVariation) {\n // this boolean to detect any flip loop\n data.flipped = true;\n\n if (overlapsRef || overflowsBoundaries) {\n placement = flipOrder[index + 1];\n }\n\n if (flippedVariation) {\n variation = getOppositeVariation(variation);\n }\n\n data.placement = placement + (variation ? '-' + variation : '');\n\n // this object contains `position`, we want to preserve it along with\n // any additional property we may add in the future\n data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n data = runModifiers(data.instance.modifiers, data, 'flip');\n }\n });\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction keepTogether(data) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var placement = data.placement.split('-')[0];\n var floor = Math.floor;\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n var side = isVertical ? 'right' : 'bottom';\n var opSide = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n if (popper[side] < floor(reference[opSide])) {\n data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n }\n if (popper[opSide] > floor(reference[side])) {\n data.offsets.popper[opSide] = floor(reference[side]);\n }\n\n return data;\n}\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\n // separate value from unit\n var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n var value = +split[1];\n var unit = split[2];\n\n // If it's not a number it's an operator, I guess\n if (!value) {\n return str;\n }\n\n if (unit.indexOf('%') === 0) {\n var element = void 0;\n switch (unit) {\n case '%p':\n element = popperOffsets;\n break;\n case '%':\n case '%r':\n default:\n element = referenceOffsets;\n }\n\n var rect = getClientRect(element);\n return rect[measurement] / 100 * value;\n } else if (unit === 'vh' || unit === 'vw') {\n // if is a vh or vw, we calculate the size based on the viewport\n var size = void 0;\n if (unit === 'vh') {\n size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n } else {\n size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n }\n return size / 100 * value;\n } else {\n // if is an explicit pixel unit, we get rid of the unit and keep the value\n // if is an implicit unit, it's px, and we return just the value\n return value;\n }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n var offsets = [0, 0];\n\n // Use height if placement is left or right and index is 0 otherwise use width\n // in this way the first offset will use an axis and the second one\n // will use the other one\n var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n // Split the offset string to obtain a list of values and operands\n // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n return frag.trim();\n });\n\n // Detect if the offset string contains a pair of values or a single one\n // they could be separated by comma or space\n var divider = fragments.indexOf(find(fragments, function (frag) {\n return frag.search(/,|\\s/) !== -1;\n }));\n\n if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n }\n\n // If divider is found, we divide the list of values and operands to divide\n // them by ofset X and Y.\n var splitRegex = /\\s*,\\s*|\\s+/;\n var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n // Convert the values with units to absolute pixels to allow our computations\n ops = ops.map(function (op, index) {\n // Most of the units rely on the orientation of the popper\n var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n var mergeWithPrevious = false;\n return op\n // This aggregates any `+` or `-` sign that aren't considered operators\n // e.g.: 10 + +5 => [10, +, +5]\n .reduce(function (a, b) {\n if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n a[a.length - 1] = b;\n mergeWithPrevious = true;\n return a;\n } else if (mergeWithPrevious) {\n a[a.length - 1] += b;\n mergeWithPrevious = false;\n return a;\n } else {\n return a.concat(b);\n }\n }, [])\n // Here we convert the string values into number values (in px)\n .map(function (str) {\n return toValue(str, measurement, popperOffsets, referenceOffsets);\n });\n });\n\n // Loop trough the offsets arrays and execute the operations\n ops.forEach(function (op, index) {\n op.forEach(function (frag, index2) {\n if (isNumeric(frag)) {\n offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n }\n });\n });\n return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nfunction offset(data, _ref) {\n var offset = _ref.offset;\n var placement = data.placement,\n _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var basePlacement = placement.split('-')[0];\n\n var offsets = void 0;\n if (isNumeric(+offset)) {\n offsets = [+offset, 0];\n } else {\n offsets = parseOffset(offset, popper, reference, basePlacement);\n }\n\n if (basePlacement === 'left') {\n popper.top += offsets[0];\n popper.left -= offsets[1];\n } else if (basePlacement === 'right') {\n popper.top += offsets[0];\n popper.left += offsets[1];\n } else if (basePlacement === 'top') {\n popper.left += offsets[0];\n popper.top -= offsets[1];\n } else if (basePlacement === 'bottom') {\n popper.left += offsets[0];\n popper.top += offsets[1];\n }\n\n data.popper = popper;\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction preventOverflow(data, options) {\n var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n // If offsetParent is the reference element, we really want to\n // go one step up and use the next offsetParent as reference to\n // avoid to make this modifier completely useless and look like broken\n if (data.instance.reference === boundariesElement) {\n boundariesElement = getOffsetParent(boundariesElement);\n }\n\n // NOTE: DOM access here\n // resets the popper's position so that the document size can be calculated excluding\n // the size of the popper element itself\n var transformProp = getSupportedPropertyName('transform');\n var popperStyles = data.instance.popper.style; // assignment to help minification\n var top = popperStyles.top,\n left = popperStyles.left,\n transform = popperStyles[transformProp];\n\n popperStyles.top = '';\n popperStyles.left = '';\n popperStyles[transformProp] = '';\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n // NOTE: DOM access here\n // restores the original style properties after the offsets have been computed\n popperStyles.top = top;\n popperStyles.left = left;\n popperStyles[transformProp] = transform;\n\n options.boundaries = boundaries;\n\n var order = options.priority;\n var popper = data.offsets.popper;\n\n var check = {\n primary: function primary(placement) {\n var value = popper[placement];\n if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n value = Math.max(popper[placement], boundaries[placement]);\n }\n return defineProperty({}, placement, value);\n },\n secondary: function secondary(placement) {\n var mainSide = placement === 'right' ? 'left' : 'top';\n var value = popper[mainSide];\n if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n }\n return defineProperty({}, mainSide, value);\n }\n };\n\n order.forEach(function (placement) {\n var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n popper = _extends({}, popper, check[side](placement));\n });\n\n data.offsets.popper = popper;\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction shift(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var shiftvariation = placement.split('-')[1];\n\n // if shift shiftvariation is specified, run the modifier\n if (shiftvariation) {\n var _data$offsets = data.offsets,\n reference = _data$offsets.reference,\n popper = _data$offsets.popper;\n\n var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n var side = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n var shiftOffsets = {\n start: defineProperty({}, side, reference[side]),\n end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n };\n\n data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction hide(data) {\n if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n return data;\n }\n\n var refRect = data.offsets.reference;\n var bound = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'preventOverflow';\n }).boundaries;\n\n if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === true) {\n return data;\n }\n\n data.hide = true;\n data.attributes['x-out-of-boundaries'] = '';\n } else {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === false) {\n return data;\n }\n\n data.hide = false;\n data.attributes['x-out-of-boundaries'] = false;\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction inner(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n data.placement = getOppositePlacement(placement);\n data.offsets.popper = getClientRect(popper);\n\n return data;\n}\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.<br />\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nvar modifiers = {\n /**\n * Modifier used to shift the popper on the start or end of its reference\n * element.<br />\n * It will read the variation of the `placement` property.<br />\n * It can be one either `-end` or `-start`.\n * @memberof modifiers\n * @inner\n */\n shift: {\n /** @prop {number} order=100 - Index used to define the order of execution */\n order: 100,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: shift\n },\n\n /**\n * The `offset` modifier can shift your popper on both its axis.\n *\n * It accepts the following units:\n * - `px` or unit-less, interpreted as pixels\n * - `%` or `%r`, percentage relative to the length of the reference element\n * - `%p`, percentage relative to the length of the popper element\n * - `vw`, CSS viewport width unit\n * - `vh`, CSS viewport height unit\n *\n * For length is intended the main axis relative to the placement of the popper.<br />\n * This means that if the placement is `top` or `bottom`, the length will be the\n * `width`. In case of `left` or `right`, it will be the `height`.\n *\n * You can provide a single value (as `Number` or `String`), or a pair of values\n * as `String` divided by a comma or one (or more) white spaces.<br />\n * The latter is a deprecated method because it leads to confusion and will be\n * removed in v2.<br />\n * Additionally, it accepts additions and subtractions between different units.\n * Note that multiplications and divisions aren't supported.\n *\n * Valid examples are:\n * ```\n * 10\n * '10%'\n * '10, 10'\n * '10%, 10'\n * '10 + 10%'\n * '10 - 5vh + 3%'\n * '-10px + 5vh, 5px - 6%'\n * ```\n * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n *\n * @memberof modifiers\n * @inner\n */\n offset: {\n /** @prop {number} order=200 - Index used to define the order of execution */\n order: 200,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: offset,\n /** @prop {Number|String} offset=0\n * The offset value as described in the modifier description\n */\n offset: 0\n },\n\n /**\n * Modifier used to prevent the popper from being positioned outside the boundary.\n *\n * A scenario exists where the reference itself is not within the boundaries.<br />\n * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n * In this case we need to decide whether the popper should either:\n *\n * - detach from the reference and remain \"trapped\" in the boundaries, or\n * - if it should ignore the boundary and \"escape with its reference\"\n *\n * When `escapeWithReference` is set to`true` and reference is completely\n * outside its boundaries, the popper will overflow (or completely leave)\n * the boundaries in order to remain attached to the edge of the reference.\n *\n * @memberof modifiers\n * @inner\n */\n preventOverflow: {\n /** @prop {number} order=300 - Index used to define the order of execution */\n order: 300,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: preventOverflow,\n /**\n * @prop {Array} [priority=['left','right','top','bottom']]\n * Popper will try to prevent overflow following these priorities by default,\n * then, it could overflow on the left and on top of the `boundariesElement`\n */\n priority: ['left', 'right', 'top', 'bottom'],\n /**\n * @prop {number} padding=5\n * Amount of pixel used to define a minimum distance between the boundaries\n * and the popper. This makes sure the popper always has a little padding\n * between the edges of its container\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='scrollParent'\n * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n * `viewport` or any DOM element.\n */\n boundariesElement: 'scrollParent'\n },\n\n /**\n * Modifier used to make sure the reference and its popper stay near each other\n * without leaving any gap between the two. Especially useful when the arrow is\n * enabled and you want to ensure that it points to its reference element.\n * It cares only about the first axis. You can still have poppers with margin\n * between the popper and its reference element.\n * @memberof modifiers\n * @inner\n */\n keepTogether: {\n /** @prop {number} order=400 - Index used to define the order of execution */\n order: 400,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: keepTogether\n },\n\n /**\n * This modifier is used to move the `arrowElement` of the popper to make\n * sure it is positioned between the reference element and its popper element.\n * It will read the outer size of the `arrowElement` node to detect how many\n * pixels of conjunction are needed.\n *\n * It has no effect if no `arrowElement` is provided.\n * @memberof modifiers\n * @inner\n */\n arrow: {\n /** @prop {number} order=500 - Index used to define the order of execution */\n order: 500,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: arrow,\n /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n element: '[x-arrow]'\n },\n\n /**\n * Modifier used to flip the popper's placement when it starts to overlap its\n * reference element.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n *\n * **NOTE:** this modifier will interrupt the current update cycle and will\n * restart it if it detects the need to flip the placement.\n * @memberof modifiers\n * @inner\n */\n flip: {\n /** @prop {number} order=600 - Index used to define the order of execution */\n order: 600,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: flip,\n /**\n * @prop {String|Array} behavior='flip'\n * The behavior used to change the popper's placement. It can be one of\n * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n * placements (with optional variations)\n */\n behavior: 'flip',\n /**\n * @prop {number} padding=5\n * The popper will flip if it hits the edges of the `boundariesElement`\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='viewport'\n * The element which will define the boundaries of the popper position.\n * The popper will never be placed outside of the defined boundaries\n * (except if `keepTogether` is enabled)\n */\n boundariesElement: 'viewport',\n /**\n * @prop {Boolean} flipVariations=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the reference element overlaps its boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariations: false,\n /**\n * @prop {Boolean} flipVariationsByContent=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the popper element overlaps its reference boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariationsByContent: false\n },\n\n /**\n * Modifier used to make the popper flow toward the inner of the reference element.\n * By default, when this modifier is disabled, the popper will be placed outside\n * the reference element.\n * @memberof modifiers\n * @inner\n */\n inner: {\n /** @prop {number} order=700 - Index used to define the order of execution */\n order: 700,\n /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n enabled: false,\n /** @prop {ModifierFn} */\n fn: inner\n },\n\n /**\n * Modifier used to hide the popper when its reference element is outside of the\n * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n * be used to hide with a CSS selector the popper when its reference is\n * out of boundaries.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n * @memberof modifiers\n * @inner\n */\n hide: {\n /** @prop {number} order=800 - Index used to define the order of execution */\n order: 800,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: hide\n },\n\n /**\n * Computes the style that will be applied to the popper element to gets\n * properly positioned.\n *\n * Note that this modifier will not touch the DOM, it just prepares the styles\n * so that `applyStyle` modifier can apply it. This separation is useful\n * in case you need to replace `applyStyle` with a custom implementation.\n *\n * This modifier has `850` as `order` value to maintain backward compatibility\n * with previous versions of Popper.js. Expect the modifiers ordering method\n * to change in future major versions of the library.\n *\n * @memberof modifiers\n * @inner\n */\n computeStyle: {\n /** @prop {number} order=850 - Index used to define the order of execution */\n order: 850,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: computeStyle,\n /**\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: true,\n /**\n * @prop {string} [x='bottom']\n * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n * Change this if your popper should grow in a direction different from `bottom`\n */\n x: 'bottom',\n /**\n * @prop {string} [x='left']\n * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n * Change this if your popper should grow in a direction different from `right`\n */\n y: 'right'\n },\n\n /**\n * Applies the computed styles to the popper element.\n *\n * All the DOM manipulations are limited to this modifier. This is useful in case\n * you want to integrate Popper.js inside a framework or view library and you\n * want to delegate all the DOM manipulations to it.\n *\n * Note that if you disable this modifier, you must make sure the popper element\n * has its position set to `absolute` before Popper.js can do its work!\n *\n * Just disable this modifier and define your own to achieve the desired effect.\n *\n * @memberof modifiers\n * @inner\n */\n applyStyle: {\n /** @prop {number} order=900 - Index used to define the order of execution */\n order: 900,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: applyStyle,\n /** @prop {Function} */\n onLoad: applyStyleOnLoad,\n /**\n * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: undefined\n }\n};\n\n/**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n\n/**\n * Default options provided to Popper.js constructor.<br />\n * These can be overridden using the `options` argument of Popper.js.<br />\n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n * modifiers: {\n * preventOverflow: { enabled: false }\n * }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nvar Defaults = {\n /**\n * Popper's placement.\n * @prop {Popper.placements} placement='bottom'\n */\n placement: 'bottom',\n\n /**\n * Set this to true if you want popper to position it self in 'fixed' mode\n * @prop {Boolean} positionFixed=false\n */\n positionFixed: false,\n\n /**\n * Whether events (resize, scroll) are initially enabled.\n * @prop {Boolean} eventsEnabled=true\n */\n eventsEnabled: true,\n\n /**\n * Set to true if you want to automatically remove the popper when\n * you call the `destroy` method.\n * @prop {Boolean} removeOnDestroy=false\n */\n removeOnDestroy: false,\n\n /**\n * Callback called when the popper is created.<br />\n * By default, it is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onCreate}\n */\n onCreate: function onCreate() {},\n\n /**\n * Callback called when the popper is updated. This callback is not called\n * on the initialization/creation of the popper, but only on subsequent\n * updates.<br />\n * By default, it is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onUpdate}\n */\n onUpdate: function onUpdate() {},\n\n /**\n * List of modifiers used to modify the offsets before they are applied to the popper.\n * They provide most of the functionalities of Popper.js.\n * @prop {modifiers}\n */\n modifiers: modifiers\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n\n// Utils\n// Methods\nvar Popper = function () {\n /**\n * Creates a new Popper.js instance.\n * @class Popper\n * @param {Element|referenceObject} reference - The reference element used to position the popper\n * @param {Element} popper - The HTML / XML element used as the popper\n * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n * @return {Object} instance - The generated Popper.js instance\n */\n function Popper(reference, popper) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n classCallCheck(this, Popper);\n\n this.scheduleUpdate = function () {\n return requestAnimationFrame(_this.update);\n };\n\n // make update() debounced, so that it only runs at most once-per-tick\n this.update = debounce(this.update.bind(this));\n\n // with {} we create a new object with the options inside it\n this.options = _extends({}, Popper.Defaults, options);\n\n // init state\n this.state = {\n isDestroyed: false,\n isCreated: false,\n scrollParents: []\n };\n\n // get reference and popper elements (allow jQuery wrappers)\n this.reference = reference && reference.jquery ? reference[0] : reference;\n this.popper = popper && popper.jquery ? popper[0] : popper;\n\n // Deep merge modifiers options\n this.options.modifiers = {};\n Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n });\n\n // Refactoring modifiers' list (Object => Array)\n this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n return _extends({\n name: name\n }, _this.options.modifiers[name]);\n })\n // sort the modifiers by order\n .sort(function (a, b) {\n return a.order - b.order;\n });\n\n // modifiers have the ability to execute arbitrary code when Popper.js get inited\n // such code is executed in the same order of its modifier\n // they could add new properties to their options configuration\n // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n this.modifiers.forEach(function (modifierOptions) {\n if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n }\n });\n\n // fire the first update to position the popper in the right place\n this.update();\n\n var eventsEnabled = this.options.eventsEnabled;\n if (eventsEnabled) {\n // setup event listeners, they will take care of update the position in specific situations\n this.enableEventListeners();\n }\n\n this.state.eventsEnabled = eventsEnabled;\n }\n\n // We can't use class properties because they don't get listed in the\n // class prototype and break stuff like Sinon stubs\n\n\n createClass(Popper, [{\n key: 'update',\n value: function update$$1() {\n return update.call(this);\n }\n }, {\n key: 'destroy',\n value: function destroy$$1() {\n return destroy.call(this);\n }\n }, {\n key: 'enableEventListeners',\n value: function enableEventListeners$$1() {\n return enableEventListeners.call(this);\n }\n }, {\n key: 'disableEventListeners',\n value: function disableEventListeners$$1() {\n return disableEventListeners.call(this);\n }\n\n /**\n * Schedules an update. It will run on the next UI update available.\n * @method scheduleUpdate\n * @memberof Popper\n */\n\n /**\n * Collection of utilities useful when writing custom modifiers.\n * Starting from version 1.7, this method is available only if you\n * include `popper-utils.js` before `popper.js`.\n *\n * **DEPRECATION**: This way to access PopperUtils is deprecated\n * and will be removed in v2! Use the PopperUtils module directly instead.\n * Due to the high instability of the methods contained in Utils, we can't\n * guarantee them to follow semver. Use them at your own risk!\n * @static\n * @private\n * @type {Object}\n * @deprecated since version 1.8\n * @member Utils\n * @memberof Popper\n */\n\n }]);\n return Popper;\n}();\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.<br />\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\nPopper.placements = placements;\nPopper.Defaults = Defaults;\n\nexports.default = Popper;\n//# sourceMappingURL=popper.js.map\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(10)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcG9wcGVyLmpzL2Rpc3QvZXNtL3BvcHBlci5qcz9mMGJkIl0sIm5hbWVzIjpbImlzQnJvd3NlciIsIndpbmRvdyIsImRvY3VtZW50IiwibmF2aWdhdG9yIiwidGltZW91dER1cmF0aW9uIiwibG9uZ2VyVGltZW91dEJyb3dzZXJzIiwiaSIsImxlbmd0aCIsInVzZXJBZ2VudCIsImluZGV4T2YiLCJtaWNyb3Rhc2tEZWJvdW5jZSIsImZuIiwiY2FsbGVkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwidGFza0RlYm91bmNlIiwic2NoZWR1bGVkIiwic2V0VGltZW91dCIsInN1cHBvcnRzTWljcm9UYXNrcyIsImRlYm91bmNlIiwiaXNGdW5jdGlvbiIsImZ1bmN0aW9uVG9DaGVjayIsImdldFR5cGUiLCJ0b1N0cmluZyIsImNhbGwiLCJnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkiLCJlbGVtZW50IiwicHJvcGVydHkiLCJub2RlVHlwZSIsIm93bmVyRG9jdW1lbnQiLCJkZWZhdWx0VmlldyIsImNzcyIsImdldENvbXB1dGVkU3R5bGUiLCJnZXRQYXJlbnROb2RlIiwibm9kZU5hbWUiLCJwYXJlbnROb2RlIiwiaG9zdCIsImdldFNjcm9sbFBhcmVudCIsImJvZHkiLCJfZ2V0U3R5bGVDb21wdXRlZFByb3AiLCJvdmVyZmxvdyIsIm92ZXJmbG93WCIsIm92ZXJmbG93WSIsInRlc3QiLCJnZXRSZWZlcmVuY2VOb2RlIiwicmVmZXJlbmNlIiwicmVmZXJlbmNlTm9kZSIsImlzSUUxMSIsIk1TSW5wdXRNZXRob2RDb250ZXh0IiwiZG9jdW1lbnRNb2RlIiwiaXNJRTEwIiwiaXNJRSIsInZlcnNpb24iLCJnZXRPZmZzZXRQYXJlbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJub09mZnNldFBhcmVudCIsIm9mZnNldFBhcmVudCIsIm5leHRFbGVtZW50U2libGluZyIsImlzT2Zmc2V0Q29udGFpbmVyIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJnZXRSb290Iiwibm9kZSIsImZpbmRDb21tb25PZmZzZXRQYXJlbnQiLCJlbGVtZW50MSIsImVsZW1lbnQyIiwib3JkZXIiLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsIk5vZGUiLCJET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkciLCJzdGFydCIsImVuZCIsInJhbmdlIiwiY3JlYXRlUmFuZ2UiLCJzZXRTdGFydCIsInNldEVuZCIsImNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIiwiY29udGFpbnMiLCJlbGVtZW50MXJvb3QiLCJnZXRTY3JvbGwiLCJzaWRlIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwidXBwZXJTaWRlIiwiaHRtbCIsInNjcm9sbGluZ0VsZW1lbnQiLCJpbmNsdWRlU2Nyb2xsIiwicmVjdCIsInN1YnRyYWN0Iiwic2Nyb2xsVG9wIiwic2Nyb2xsTGVmdCIsIm1vZGlmaWVyIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwiZ2V0Qm9yZGVyc1NpemUiLCJzdHlsZXMiLCJheGlzIiwic2lkZUEiLCJzaWRlQiIsInBhcnNlRmxvYXQiLCJnZXRTaXplIiwiY29tcHV0ZWRTdHlsZSIsIk1hdGgiLCJtYXgiLCJwYXJzZUludCIsImdldFdpbmRvd1NpemVzIiwiaGVpZ2h0Iiwid2lkdGgiLCJjbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJjcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJ0YXJnZXQiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImtleSIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsInByb3RvdHlwZSIsIm9iaiIsInZhbHVlIiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJzb3VyY2UiLCJoYXNPd25Qcm9wZXJ0eSIsImdldENsaWVudFJlY3QiLCJvZmZzZXRzIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiZSIsInJlc3VsdCIsInNpemVzIiwiY2xpZW50V2lkdGgiLCJjbGllbnRIZWlnaHQiLCJob3JpelNjcm9sbGJhciIsIm9mZnNldFdpZHRoIiwidmVydFNjcm9sbGJhciIsIm9mZnNldEhlaWdodCIsImdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZSIsImNoaWxkcmVuIiwicGFyZW50IiwiZml4ZWRQb3NpdGlvbiIsImlzSFRNTCIsImNoaWxkcmVuUmVjdCIsInBhcmVudFJlY3QiLCJzY3JvbGxQYXJlbnQiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlckxlZnRXaWR0aCIsIm1hcmdpblRvcCIsIm1hcmdpbkxlZnQiLCJnZXRWaWV3cG9ydE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJ0Yml0cmFyeU5vZGUiLCJleGNsdWRlU2Nyb2xsIiwicmVsYXRpdmVPZmZzZXQiLCJpbm5lcldpZHRoIiwiaW5uZXJIZWlnaHQiLCJvZmZzZXQiLCJpc0ZpeGVkIiwiZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudCIsInBhcmVudEVsZW1lbnQiLCJlbCIsImdldEJvdW5kYXJpZXMiLCJwb3BwZXIiLCJwYWRkaW5nIiwiYm91bmRhcmllc0VsZW1lbnQiLCJib3VuZGFyaWVzIiwiYm91bmRhcmllc05vZGUiLCJfZ2V0V2luZG93U2l6ZXMiLCJpc1BhZGRpbmdOdW1iZXIiLCJnZXRBcmVhIiwiX3JlZiIsImNvbXB1dGVBdXRvUGxhY2VtZW50IiwicGxhY2VtZW50IiwicmVmUmVjdCIsInJlY3RzIiwic29ydGVkQXJlYXMiLCJrZXlzIiwibWFwIiwiYXJlYSIsInNvcnQiLCJhIiwiYiIsImZpbHRlcmVkQXJlYXMiLCJmaWx0ZXIiLCJfcmVmMiIsImNvbXB1dGVkUGxhY2VtZW50IiwidmFyaWF0aW9uIiwic3BsaXQiLCJnZXRSZWZlcmVuY2VPZmZzZXRzIiwic3RhdGUiLCJjb21tb25PZmZzZXRQYXJlbnQiLCJnZXRPdXRlclNpemVzIiwieCIsIm1hcmdpbkJvdHRvbSIsInkiLCJtYXJnaW5SaWdodCIsImdldE9wcG9zaXRlUGxhY2VtZW50IiwiaGFzaCIsInJlcGxhY2UiLCJtYXRjaGVkIiwiZ2V0UG9wcGVyT2Zmc2V0cyIsInJlZmVyZW5jZU9mZnNldHMiLCJwb3BwZXJSZWN0IiwicG9wcGVyT2Zmc2V0cyIsImlzSG9yaXoiLCJtYWluU2lkZSIsInNlY29uZGFyeVNpZGUiLCJtZWFzdXJlbWVudCIsInNlY29uZGFyeU1lYXN1cmVtZW50IiwiZmluZCIsImFyciIsImNoZWNrIiwiQXJyYXkiLCJmaW5kSW5kZXgiLCJwcm9wIiwiY3VyIiwibWF0Y2giLCJydW5Nb2RpZmllcnMiLCJtb2RpZmllcnMiLCJkYXRhIiwiZW5kcyIsIm1vZGlmaWVyc1RvUnVuIiwic2xpY2UiLCJmb3JFYWNoIiwiY29uc29sZSIsIndhcm4iLCJlbmFibGVkIiwidXBkYXRlIiwiaXNEZXN0cm95ZWQiLCJhcnJvd1N0eWxlcyIsImF0dHJpYnV0ZXMiLCJmbGlwcGVkIiwib3B0aW9ucyIsInBvc2l0aW9uRml4ZWQiLCJmbGlwIiwib3JpZ2luYWxQbGFjZW1lbnQiLCJwb3NpdGlvbiIsImlzQ3JlYXRlZCIsIm9uQ3JlYXRlIiwib25VcGRhdGUiLCJpc01vZGlmaWVyRW5hYmxlZCIsIm1vZGlmaWVyTmFtZSIsInNvbWUiLCJuYW1lIiwiZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lIiwicHJlZml4ZXMiLCJ1cHBlclByb3AiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInByZWZpeCIsInRvQ2hlY2siLCJzdHlsZSIsImRlc3Ryb3kiLCJyZW1vdmVBdHRyaWJ1dGUiLCJ3aWxsQ2hhbmdlIiwiZGlzYWJsZUV2ZW50TGlzdGVuZXJzIiwicmVtb3ZlT25EZXN0cm95IiwicmVtb3ZlQ2hpbGQiLCJnZXRXaW5kb3ciLCJhdHRhY2hUb1Njcm9sbFBhcmVudHMiLCJldmVudCIsImNhbGxiYWNrIiwic2Nyb2xsUGFyZW50cyIsImlzQm9keSIsImFkZEV2ZW50TGlzdGVuZXIiLCJwYXNzaXZlIiwicHVzaCIsInNldHVwRXZlbnRMaXN0ZW5lcnMiLCJ1cGRhdGVCb3VuZCIsInNjcm9sbEVsZW1lbnQiLCJldmVudHNFbmFibGVkIiwiZW5hYmxlRXZlbnRMaXN0ZW5lcnMiLCJzY2hlZHVsZVVwZGF0ZSIsInJlbW92ZUV2ZW50TGlzdGVuZXJzIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwiaXNOdW1lcmljIiwibiIsImlzTmFOIiwiaXNGaW5pdGUiLCJzZXRTdHlsZXMiLCJ1bml0Iiwic2V0QXR0cmlidXRlcyIsInNldEF0dHJpYnV0ZSIsImFwcGx5U3R5bGUiLCJhcnJvd0VsZW1lbnQiLCJhcHBseVN0eWxlT25Mb2FkIiwibW9kaWZpZXJPcHRpb25zIiwiZ2V0Um91bmRlZE9mZnNldHMiLCJzaG91bGRSb3VuZCIsIl9kYXRhJG9mZnNldHMiLCJyb3VuZCIsImZsb29yIiwibm9Sb3VuZCIsInYiLCJyZWZlcmVuY2VXaWR0aCIsInBvcHBlcldpZHRoIiwiaXNWZXJ0aWNhbCIsImlzVmFyaWF0aW9uIiwic2FtZVdpZHRoUGFyaXR5IiwiYm90aE9kZFdpZHRoIiwiaG9yaXpvbnRhbFRvSW50ZWdlciIsInZlcnRpY2FsVG9JbnRlZ2VyIiwiaXNGaXJlZm94IiwiY29tcHV0ZVN0eWxlIiwibGVnYWN5R3B1QWNjZWxlcmF0aW9uT3B0aW9uIiwiZ3B1QWNjZWxlcmF0aW9uIiwib2Zmc2V0UGFyZW50UmVjdCIsImRldmljZVBpeGVsUmF0aW8iLCJwcmVmaXhlZFByb3BlcnR5IiwiaW52ZXJ0VG9wIiwiaW52ZXJ0TGVmdCIsImFycm93IiwiaXNNb2RpZmllclJlcXVpcmVkIiwicmVxdWVzdGluZ05hbWUiLCJyZXF1ZXN0ZWROYW1lIiwicmVxdWVzdGluZyIsImlzUmVxdWlyZWQiLCJfcmVxdWVzdGluZyIsInJlcXVlc3RlZCIsIl9kYXRhJG9mZnNldHMkYXJyb3ciLCJxdWVyeVNlbGVjdG9yIiwibGVuIiwic2lkZUNhcGl0YWxpemVkIiwidG9Mb3dlckNhc2UiLCJhbHRTaWRlIiwib3BTaWRlIiwiYXJyb3dFbGVtZW50U2l6ZSIsImNlbnRlciIsInBvcHBlck1hcmdpblNpZGUiLCJwb3BwZXJCb3JkZXJTaWRlIiwic2lkZVZhbHVlIiwibWluIiwiZ2V0T3Bwb3NpdGVWYXJpYXRpb24iLCJwbGFjZW1lbnRzIiwidmFsaWRQbGFjZW1lbnRzIiwiY2xvY2t3aXNlIiwiY291bnRlciIsImluZGV4IiwiY29uY2F0IiwicmV2ZXJzZSIsIkJFSEFWSU9SUyIsIkZMSVAiLCJDTE9DS1dJU0UiLCJDT1VOVEVSQ0xPQ0tXSVNFIiwicGxhY2VtZW50T3Bwb3NpdGUiLCJmbGlwT3JkZXIiLCJiZWhhdmlvciIsInN0ZXAiLCJyZWZPZmZzZXRzIiwib3ZlcmxhcHNSZWYiLCJvdmVyZmxvd3NMZWZ0Iiwib3ZlcmZsb3dzUmlnaHQiLCJvdmVyZmxvd3NUb3AiLCJvdmVyZmxvd3NCb3R0b20iLCJvdmVyZmxvd3NCb3VuZGFyaWVzIiwiZmxpcHBlZFZhcmlhdGlvbkJ5UmVmIiwiZmxpcFZhcmlhdGlvbnMiLCJmbGlwcGVkVmFyaWF0aW9uQnlDb250ZW50IiwiZmxpcFZhcmlhdGlvbnNCeUNvbnRlbnQiLCJmbGlwcGVkVmFyaWF0aW9uIiwia2VlcFRvZ2V0aGVyIiwidG9WYWx1ZSIsInN0ciIsInNpemUiLCJwYXJzZU9mZnNldCIsImJhc2VQbGFjZW1lbnQiLCJ1c2VIZWlnaHQiLCJmcmFnbWVudHMiLCJmcmFnIiwidHJpbSIsImRpdmlkZXIiLCJzZWFyY2giLCJzcGxpdFJlZ2V4Iiwib3BzIiwib3AiLCJtZXJnZVdpdGhQcmV2aW91cyIsInJlZHVjZSIsImluZGV4MiIsInByZXZlbnRPdmVyZmxvdyIsInRyYW5zZm9ybVByb3AiLCJwb3BwZXJTdHlsZXMiLCJ0cmFuc2Zvcm0iLCJwcmlvcml0eSIsInByaW1hcnkiLCJlc2NhcGVXaXRoUmVmZXJlbmNlIiwic2Vjb25kYXJ5Iiwic2hpZnQiLCJzaGlmdHZhcmlhdGlvbiIsInNoaWZ0T2Zmc2V0cyIsImhpZGUiLCJib3VuZCIsImlubmVyIiwic3VidHJhY3RMZW5ndGgiLCJvbkxvYWQiLCJEZWZhdWx0cyIsIlBvcHBlciIsIl90aGlzIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiYmluZCIsImpxdWVyeSIsInVwZGF0ZSQkMSIsImRlc3Ryb3kkJDEiLCJlbmFibGVFdmVudExpc3RlbmVycyQkMSIsImRpc2FibGVFdmVudExpc3RlbmVycyQkMSIsIlV0aWxzIiwiZ2xvYmFsIiwiUG9wcGVyVXRpbHMiXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQSxJQUFJQSxZQUFZLE9BQU9DLE1BQVAsS0FBa0IsV0FBbEIsSUFBaUMsT0FBT0MsUUFBUCxLQUFvQixXQUFyRCxJQUFvRSxPQUFPQyxTQUFQLEtBQXFCLFdBQXpHOztBQUVBLElBQUlDLGtCQUFrQixZQUFZO0FBQ2hDLE1BQUlDLHdCQUF3QixDQUFDLE1BQUQsRUFBUyxTQUFULEVBQW9CLFNBQXBCLENBQTVCO0FBQ0EsT0FBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlELHNCQUFzQkUsTUFBMUMsRUFBa0RELEtBQUssQ0FBdkQsRUFBMEQ7QUFDeEQsUUFBSU4sYUFBYUcsVUFBVUssU0FBVixDQUFvQkMsT0FBcEIsQ0FBNEJKLHNCQUFzQkMsQ0FBdEIsQ0FBNUIsS0FBeUQsQ0FBMUUsRUFBNkU7QUFDM0UsYUFBTyxDQUFQO0FBQ0Q7QUFDRjtBQUNELFNBQU8sQ0FBUDtBQUNELENBUnFCLEVBQXRCOztBQVVBLFNBQVNJLGlCQUFULENBQTJCQyxFQUEzQixFQUErQjtBQUM3QixNQUFJQyxTQUFTLEtBQWI7QUFDQSxTQUFPLFlBQVk7QUFDakIsUUFBSUEsTUFBSixFQUFZO0FBQ1Y7QUFDRDtBQUNEQSxhQUFTLElBQVQ7QUFDQVgsV0FBT1ksT0FBUCxDQUFlQyxPQUFmLEdBQXlCQyxJQUF6QixDQUE4QixZQUFZO0FBQ3hDSCxlQUFTLEtBQVQ7QUFDQUQ7QUFDRCxLQUhEO0FBSUQsR0FURDtBQVVEOztBQUVELFNBQVNLLFlBQVQsQ0FBc0JMLEVBQXRCLEVBQTBCO0FBQ3hCLE1BQUlNLFlBQVks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KiBAZmlsZU92ZXJ2aWV3IEtpY2thc3MgbGlicmFyeSB0byBjcmVhdGUgYW5kIHBsYWNlIHBvcHBlcnMgbmVhciB0aGVpciByZWZlcmVuY2UgZWxlbWVudHMuXG4gKiBAdmVyc2lvbiAxLjE2LjFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgRmVkZXJpY28gWml2b2xvIGFuZCBjb250cmlidXRvcnNcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG52YXIgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJztcblxudmFyIHRpbWVvdXREdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxvbmdlclRpbWVvdXRCcm93c2VycyA9IFsnRWRnZScsICdUcmlkZW50JywgJ0ZpcmVmb3gnXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25nZXJUaW1lb3V0QnJvd3NlcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoaXNCcm93c2VyICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihsb25nZXJUaW1lb3V0QnJvd3NlcnNbaV0pID49IDApIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn0oKTtcblxuZnVuY3Rpb24gbWljcm90YXNrRGVib3VuY2UoZm4pIHtcbiAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FsbGVkID0gdHJ1ZTtcbiAgICB3aW5kb3cuUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsZWQgPSBmYWxzZTtcbiAgICAgIGZuKCk7XG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRhc2tEZWJvdW5jZShmbikge1xuICB2YXIgc2NoZWR1bGVkID0gZmFsc2U7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzY2hlZHVsZWQpIHtcbiAgICAgIHNjaGVkdWxlZCA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICAgIGZuKCk7XG4gICAgICB9LCB0aW1lb3V0RHVyYXRpb24pO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIHN1cHBvcnRzTWljcm9UYXNrcyA9IGlzQnJvd3NlciAmJiB3aW5kb3cuUHJvbWlzZTtcblxuLyoqXG4qIENyZWF0ZSBhIGRlYm91bmNlZCB2ZXJzaW9uIG9mIGEgbWV0aG9kLCB0aGF0J3MgYXN5bmNocm9ub3VzbHkgZGVmZXJyZWRcbiogYnV0IGNhbGxlZCBpbiB0aGUgbWluaW11bSB0aW1lIHBvc3NpYmxlLlxuKlxuKiBAbWV0aG9kXG4qIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiogQGFyZ3VtZW50IHtGdW5jdGlvbn0gZm5cbiogQHJldHVybnMge0Z1bmN0aW9ufVxuKi9cbnZhciBkZWJvdW5jZSA9IHN1cHBvcnRzTWljcm9UYXNrcyA/IG1pY3JvdGFza0RlYm91bmNlIDogdGFza0RlYm91bmNlO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhIGZ1bmN0aW9uXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0FueX0gZnVuY3Rpb25Ub0NoZWNrIC0gdmFyaWFibGUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtCb29sZWFufSBhbnN3ZXIgdG86IGlzIGEgZnVuY3Rpb24/XG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oZnVuY3Rpb25Ub0NoZWNrKSB7XG4gIHZhciBnZXRUeXBlID0ge307XG4gIHJldHVybiBmdW5jdGlvblRvQ2hlY2sgJiYgZ2V0VHlwZS50b1N0cmluZy5jYWxsKGZ1bmN0aW9uVG9DaGVjaykgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5cbi8qKlxuICogR2V0IENTUyBjb21wdXRlZCBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFZW1lbnR9IGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBwcm9wZXJ0eVxuICovXG5mdW5jdGlvbiBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkpIHtcbiAgaWYgKGVsZW1lbnQubm9kZVR5cGUgIT09IDEpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmVcbiAgdmFyIHdpbmRvdyA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgdmFyIGNzcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpO1xuICByZXR1cm4gcHJvcGVydHkgPyBjc3NbcHJvcGVydHldIDogY3NzO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhcmVudE5vZGUgb3IgdGhlIGhvc3Qgb2YgdGhlIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IHBhcmVudFxuICovXG5mdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIHJldHVybiBlbGVtZW50LnBhcmVudE5vZGUgfHwgZWxlbWVudC5ob3N0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHNjcm9sbGluZyBwYXJlbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IHNjcm9sbCBwYXJlbnRcbiAqL1xuZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KGVsZW1lbnQpIHtcbiAgLy8gUmV0dXJuIGJvZHksIGBnZXRTY3JvbGxgIHdpbGwgdGFrZSBjYXJlIHRvIGdldCB0aGUgY29ycmVjdCBgc2Nyb2xsVG9wYCBmcm9tIGl0XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgc3dpdGNoIChlbGVtZW50Lm5vZGVOYW1lKSB7XG4gICAgY2FzZSAnSFRNTCc6XG4gICAgY2FzZSAnQk9EWSc6XG4gICAgICByZXR1cm4gZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHk7XG4gICAgY2FzZSAnI2RvY3VtZW50JzpcbiAgICAgIHJldHVybiBlbGVtZW50LmJvZHk7XG4gIH1cblxuICAvLyBGaXJlZm94IHdhbnQgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcblxuICB2YXIgX2dldFN0eWxlQ29tcHV0ZWRQcm9wID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQpLFxuICAgICAgb3ZlcmZsb3cgPSBfZ2V0U3R5bGVDb21wdXRlZFByb3Aub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0U3R5bGVDb21wdXRlZFByb3Aub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldFN0eWxlQ29tcHV0ZWRQcm9wLm92ZXJmbG93WTtcblxuICBpZiAoLyhhdXRvfHNjcm9sbHxvdmVybGF5KS8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCkpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVmZXJlbmNlIG5vZGUgb2YgdGhlIHJlZmVyZW5jZSBvYmplY3QsIG9yIHRoZSByZWZlcmVuY2Ugb2JqZWN0IGl0c2VsZi5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IHJlZmVyZW5jZSAtIHRoZSByZWZlcmVuY2UgZWxlbWVudCAodGhlIHBvcHBlciB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXMpXG4gKiBAcmV0dXJucyB7RWxlbWVudH0gcGFyZW50XG4gKi9cbmZ1bmN0aW9uIGdldFJlZmVyZW5jZU5vZGUocmVmZXJlbmNlKSB7XG4gIHJldHVybiByZWZlcmVuY2UgJiYgcmVmZXJlbmNlLnJlZmVyZW5jZU5vZGUgPyByZWZlcmVuY2UucmVmZXJlbmNlTm9kZSA6IHJlZmVyZW5jZTtcbn1cblxudmFyIGlzSUUxMSA9IGlzQnJvd3NlciAmJiAhISh3aW5kb3cuTVNJbnB1dE1ldGhvZENvbnRleHQgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlKTtcbnZhciBpc0lFMTAgPSBpc0Jyb3dzZXIgJiYgL01TSUUgMTAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgYnJvd3NlciBpcyBJbnRlcm5ldCBFeHBsb3JlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtOdW1iZXJ9IHZlcnNpb24gdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtCb29sZWFufSBpc0lFXG4gKi9cbmZ1bmN0aW9uIGlzSUUodmVyc2lvbikge1xuICBpZiAodmVyc2lvbiA9PT0gMTEpIHtcbiAgICByZXR1cm4gaXNJRTExO1xuICB9XG4gIGlmICh2ZXJzaW9uID09PSAxMCkge1xuICAgIHJldHVybiBpc0lFMTA7XG4gIH1cbiAgcmV0dXJuIGlzSUUxMSB8fCBpc0lFMTA7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb2Zmc2V0IHBhcmVudCBvZiB0aGUgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7RWxlbWVudH0gb2Zmc2V0IHBhcmVudFxuICovXG5mdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG5cbiAgdmFyIG5vT2Zmc2V0UGFyZW50ID0gaXNJRSgxMCkgPyBkb2N1bWVudC5ib2R5IDogbnVsbDtcblxuICAvLyBOT1RFOiAxIERPTSBhY2Nlc3MgaGVyZVxuICB2YXIgb2Zmc2V0UGFyZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQgfHwgbnVsbDtcbiAgLy8gU2tpcCBoaWRkZW4gZWxlbWVudHMgd2hpY2ggZG9uJ3QgaGF2ZSBhbiBvZmZzZXRQYXJlbnRcbiAgd2hpbGUgKG9mZnNldFBhcmVudCA9PT0gbm9PZmZzZXRQYXJlbnQgJiYgZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpIHtcbiAgICBvZmZzZXRQYXJlbnQgPSAoZWxlbWVudCA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKS5vZmZzZXRQYXJlbnQ7XG4gIH1cblxuICB2YXIgbm9kZU5hbWUgPSBvZmZzZXRQYXJlbnQgJiYgb2Zmc2V0UGFyZW50Lm5vZGVOYW1lO1xuXG4gIGlmICghbm9kZU5hbWUgfHwgbm9kZU5hbWUgPT09ICdCT0RZJyB8fCBub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG5cbiAgLy8gLm9mZnNldFBhcmVudCB3aWxsIHJldHVybiB0aGUgY2xvc2VzdCBUSCwgVEQgb3IgVEFCTEUgaW4gY2FzZVxuICAvLyBubyBvZmZzZXRQYXJlbnQgaXMgcHJlc2VudCwgSSBoYXRlIHRoaXMgam9iLi4uXG4gIGlmIChbJ1RIJywgJ1REJywgJ1RBQkxFJ10uaW5kZXhPZihvZmZzZXRQYXJlbnQubm9kZU5hbWUpICE9PSAtMSAmJiBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkob2Zmc2V0UGFyZW50LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycpIHtcbiAgICByZXR1cm4gZ2V0T2Zmc2V0UGFyZW50KG9mZnNldFBhcmVudCk7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UGFyZW50O1xufVxuXG5mdW5jdGlvbiBpc09mZnNldENvbnRhaW5lcihlbGVtZW50KSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnQk9EWScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIG5vZGVOYW1lID09PSAnSFRNTCcgfHwgZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpID09PSBlbGVtZW50O1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSByb290IG5vZGUgKGRvY3VtZW50LCBzaGFkb3dET00gcm9vdCkgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gbm9kZVxuICogQHJldHVybnMge0VsZW1lbnR9IHJvb3Qgbm9kZVxuICovXG5mdW5jdGlvbiBnZXRSb290KG5vZGUpIHtcbiAgaWYgKG5vZGUucGFyZW50Tm9kZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBnZXRSb290KG5vZGUucGFyZW50Tm9kZSk7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgb2Zmc2V0IHBhcmVudCBjb21tb24gdG8gdGhlIHR3byBwcm92aWRlZCBub2Rlc1xuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50MVxuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50MlxuICogQHJldHVybnMge0VsZW1lbnR9IGNvbW1vbiBvZmZzZXQgcGFyZW50XG4gKi9cbmZ1bmN0aW9uIGZpbmRDb21tb25PZmZzZXRQYXJlbnQoZWxlbWVudDEsIGVsZW1lbnQyKSB7XG4gIC8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIHRvIGF2b2lkIGVycm9ycyBpbiBjYXNlIG9uZSBvZiB0aGUgZWxlbWVudHMgaXNuJ3QgZGVmaW5lZCBmb3IgYW55IHJlYXNvblxuICBpZiAoIWVsZW1lbnQxIHx8ICFlbGVtZW50MS5ub2RlVHlwZSB8fCAhZWxlbWVudDIgfHwgIWVsZW1lbnQyLm5vZGVUeXBlKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxuXG4gIC8vIEhlcmUgd2UgbWFrZSBzdXJlIHRvIGdpdmUgYXMgXCJzdGFydFwiIHRoZSBlbGVtZW50IHRoYXQgY29tZXMgZmlyc3QgaW4gdGhlIERPTVxuICB2YXIgb3JkZXIgPSBlbGVtZW50MS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlbGVtZW50MikgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORztcbiAgdmFyIHN0YXJ0ID0gb3JkZXIgPyBlbGVtZW50MSA6IGVsZW1lbnQyO1xuICB2YXIgZW5kID0gb3JkZXIgPyBlbGVtZW50MiA6IGVsZW1lbnQxO1xuXG4gIC8vIEdldCBjb21tb24gYW5jZXN0b3IgY29udGFpbmVyXG4gIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gIHJhbmdlLnNldFN0YXJ0KHN0YXJ0LCAwKTtcbiAgcmFuZ2Uuc2V0RW5kKGVuZCwgMCk7XG4gIHZhciBjb21tb25BbmNlc3RvckNvbnRhaW5lciA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gIC8vIEJvdGggbm9kZXMgYXJlIGluc2lkZSAjZG9jdW1lbnRcblxuICBpZiAoZWxlbWVudDEgIT09IGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyICYmIGVsZW1lbnQyICE9PSBjb21tb25BbmNlc3RvckNvbnRhaW5lciB8fCBzdGFydC5jb250YWlucyhlbmQpKSB7XG4gICAgaWYgKGlzT2Zmc2V0Q29udGFpbmVyKGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKSkge1xuICAgICAgcmV0dXJuIGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRPZmZzZXRQYXJlbnQoY29tbW9uQW5jZXN0b3JDb250YWluZXIpO1xuICB9XG5cbiAgLy8gb25lIG9mIHRoZSBub2RlcyBpcyBpbnNpZGUgc2hhZG93RE9NLCBmaW5kIHdoaWNoIG9uZVxuICB2YXIgZWxlbWVudDFyb290ID0gZ2V0Um9vdChlbGVtZW50MSk7XG4gIGlmIChlbGVtZW50MXJvb3QuaG9zdCkge1xuICAgIHJldHVybiBmaW5kQ29tbW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQxcm9vdC5ob3N0LCBlbGVtZW50Mik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZpbmRDb21tb25PZmZzZXRQYXJlbnQoZWxlbWVudDEsIGdldFJvb3QoZWxlbWVudDIpLmhvc3QpO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc2Nyb2xsIHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50IGluIHRoZSBnaXZlbiBzaWRlICh0b3AgYW5kIGxlZnQpXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBzaWRlIGB0b3BgIG9yIGBsZWZ0YFxuICogQHJldHVybnMge251bWJlcn0gYW1vdW50IG9mIHNjcm9sbGVkIHBpeGVsc1xuICovXG5mdW5jdGlvbiBnZXRTY3JvbGwoZWxlbWVudCkge1xuICB2YXIgc2lkZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJ3RvcCc7XG5cbiAgdmFyIHVwcGVyU2lkZSA9IHNpZGUgPT09ICd0b3AnID8gJ3Njcm9sbFRvcCcgOiAnc2Nyb2xsTGVmdCc7XG4gIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnQk9EWScgfHwgbm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgIHZhciBodG1sID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB2YXIgc2Nyb2xsaW5nRWxlbWVudCA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50IHx8IGh0bWw7XG4gICAgcmV0dXJuIHNjcm9sbGluZ0VsZW1lbnRbdXBwZXJTaWRlXTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50W3VwcGVyU2lkZV07XG59XG5cbi8qXG4gKiBTdW0gb3Igc3VidHJhY3QgdGhlIGVsZW1lbnQgc2Nyb2xsIHZhbHVlcyAobGVmdCBhbmQgdG9wKSBmcm9tIGEgZ2l2ZW4gcmVjdCBvYmplY3RcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWN0IC0gUmVjdCBvYmplY3QgeW91IHdhbnQgdG8gY2hhbmdlXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZnJvbSB0aGUgZnVuY3Rpb24gcmVhZHMgdGhlIHNjcm9sbCB2YWx1ZXNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc3VidHJhY3QgLSBzZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBzdWJ0cmFjdCB0aGUgc2Nyb2xsIHZhbHVlc1xuICogQHJldHVybiB7T2JqZWN0fSByZWN0IC0gVGhlIG1vZGlmaWVyIHJlY3Qgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGluY2x1ZGVTY3JvbGwocmVjdCwgZWxlbWVudCkge1xuICB2YXIgc3VidHJhY3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuXG4gIHZhciBzY3JvbGxUb3AgPSBnZXRTY3JvbGwoZWxlbWVudCwgJ3RvcCcpO1xuICB2YXIgc2Nyb2xsTGVmdCA9IGdldFNjcm9sbChlbGVtZW50LCAnbGVmdCcpO1xuICB2YXIgbW9kaWZpZXIgPSBzdWJ0cmFjdCA/IC0xIDogMTtcbiAgcmVjdC50b3AgKz0gc2Nyb2xsVG9wICogbW9kaWZpZXI7XG4gIHJlY3QuYm90dG9tICs9IHNjcm9sbFRvcCAqIG1vZGlmaWVyO1xuICByZWN0LmxlZnQgKz0gc2Nyb2xsTGVmdCAqIG1vZGlmaWVyO1xuICByZWN0LnJpZ2h0ICs9IHNjcm9sbExlZnQgKiBtb2RpZmllcjtcbiAgcmV0dXJuIHJlY3Q7XG59XG5cbi8qXG4gKiBIZWxwZXIgdG8gZGV0ZWN0IGJvcmRlcnMgb2YgYSBnaXZlbiBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0NTU1N0eWxlRGVjbGFyYXRpb259IHN0eWxlc1xuICogUmVzdWx0IG9mIGBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHlgIG9uIHRoZSBnaXZlbiBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gYXhpcyAtIGB4YCBvciBgeWBcbiAqIEByZXR1cm4ge251bWJlcn0gYm9yZGVycyAtIFRoZSBib3JkZXJzIHNpemUgb2YgdGhlIGdpdmVuIGF4aXNcbiAqL1xuXG5mdW5jdGlvbiBnZXRCb3JkZXJzU2l6ZShzdHlsZXMsIGF4aXMpIHtcbiAgdmFyIHNpZGVBID0gYXhpcyA9PT0gJ3gnID8gJ0xlZnQnIDogJ1RvcCc7XG4gIHZhciBzaWRlQiA9IHNpZGVBID09PSAnTGVmdCcgPyAnUmlnaHQnIDogJ0JvdHRvbSc7XG5cbiAgcmV0dXJuIHBhcnNlRmxvYXQoc3R5bGVzWydib3JkZXInICsgc2lkZUEgKyAnV2lkdGgnXSkgKyBwYXJzZUZsb2F0KHN0eWxlc1snYm9yZGVyJyArIHNpZGVCICsgJ1dpZHRoJ10pO1xufVxuXG5mdW5jdGlvbiBnZXRTaXplKGF4aXMsIGJvZHksIGh0bWwsIGNvbXB1dGVkU3R5bGUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KGJvZHlbJ29mZnNldCcgKyBheGlzXSwgYm9keVsnc2Nyb2xsJyArIGF4aXNdLCBodG1sWydjbGllbnQnICsgYXhpc10sIGh0bWxbJ29mZnNldCcgKyBheGlzXSwgaHRtbFsnc2Nyb2xsJyArIGF4aXNdLCBpc0lFKDEwKSA/IHBhcnNlSW50KGh0bWxbJ29mZnNldCcgKyBheGlzXSkgKyBwYXJzZUludChjb21wdXRlZFN0eWxlWydtYXJnaW4nICsgKGF4aXMgPT09ICdIZWlnaHQnID8gJ1RvcCcgOiAnTGVmdCcpXSkgKyBwYXJzZUludChjb21wdXRlZFN0eWxlWydtYXJnaW4nICsgKGF4aXMgPT09ICdIZWlnaHQnID8gJ0JvdHRvbScgOiAnUmlnaHQnKV0pIDogMCk7XG59XG5cbmZ1bmN0aW9uIGdldFdpbmRvd1NpemVzKGRvY3VtZW50KSB7XG4gIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcbiAgdmFyIGh0bWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIHZhciBjb21wdXRlZFN0eWxlID0gaXNJRSgxMCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShodG1sKTtcblxuICByZXR1cm4ge1xuICAgIGhlaWdodDogZ2V0U2l6ZSgnSGVpZ2h0JywgYm9keSwgaHRtbCwgY29tcHV0ZWRTdHlsZSksXG4gICAgd2lkdGg6IGdldFNpemUoJ1dpZHRoJywgYm9keSwgaHRtbCwgY29tcHV0ZWRTdHlsZSlcbiAgfTtcbn1cblxudmFyIGNsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cbnZhciBjcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTtcblxuXG5cblxuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG4vKipcbiAqIEdpdmVuIGVsZW1lbnQgb2Zmc2V0cywgZ2VuZXJhdGUgYW4gb3V0cHV0IHNpbWlsYXIgdG8gZ2V0Qm91bmRpbmdDbGllbnRSZWN0XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge09iamVjdH0gb2Zmc2V0c1xuICogQHJldHVybnMge09iamVjdH0gQ2xpZW50UmVjdCBsaWtlIG91dHB1dFxuICovXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0KG9mZnNldHMpIHtcbiAgcmV0dXJuIF9leHRlbmRzKHt9LCBvZmZzZXRzLCB7XG4gICAgcmlnaHQ6IG9mZnNldHMubGVmdCArIG9mZnNldHMud2lkdGgsXG4gICAgYm90dG9tOiBvZmZzZXRzLnRvcCArIG9mZnNldHMuaGVpZ2h0XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBib3VuZGluZyBjbGllbnQgcmVjdCBvZiBnaXZlbiBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJuIHtPYmplY3R9IGNsaWVudCByZWN0XG4gKi9cbmZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciByZWN0ID0ge307XG5cbiAgLy8gSUUxMCAxMCBGSVg6IFBsZWFzZSwgZG9uJ3QgYXNrLCB0aGUgZWxlbWVudCBpc24ndFxuICAvLyBjb25zaWRlcmVkIGluIERPTSBpbiBzb21lIGNpcmN1bXN0YW5jZXMuLi5cbiAgLy8gVGhpcyBpc24ndCByZXByb2R1Y2libGUgaW4gSUUxMCBjb21wYXRpYmlsaXR5IG1vZGUgb2YgSUUxMVxuICB0cnkge1xuICAgIGlmIChpc0lFKDEwKSkge1xuICAgICAgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB2YXIgc2Nyb2xsVG9wID0gZ2V0U2Nyb2xsKGVsZW1lbnQsICd0b3AnKTtcbiAgICAgIHZhciBzY3JvbGxMZWZ0ID0gZ2V0U2Nyb2xsKGVsZW1lbnQsICdsZWZ0Jyk7XG4gICAgICByZWN0LnRvcCArPSBzY3JvbGxUb3A7XG4gICAgICByZWN0LmxlZnQgKz0gc2Nyb2xsTGVmdDtcbiAgICAgIHJlY3QuYm90dG9tICs9IHNjcm9sbFRvcDtcbiAgICAgIHJlY3QucmlnaHQgKz0gc2Nyb2xsTGVmdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByZXN1bHQgPSB7XG4gICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgIHRvcDogcmVjdC50b3AsXG4gICAgd2lkdGg6IHJlY3QucmlnaHQgLSByZWN0LmxlZnQsXG4gICAgaGVpZ2h0OiByZWN0LmJvdHRvbSAtIHJlY3QudG9wXG4gIH07XG5cbiAgLy8gc3VidHJhY3Qgc2Nyb2xsYmFyIHNpemUgZnJvbSBzaXplc1xuICB2YXIgc2l6ZXMgPSBlbGVtZW50Lm5vZGVOYW1lID09PSAnSFRNTCcgPyBnZXRXaW5kb3dTaXplcyhlbGVtZW50Lm93bmVyRG9jdW1lbnQpIDoge307XG4gIHZhciB3aWR0aCA9IHNpemVzLndpZHRoIHx8IGVsZW1lbnQuY2xpZW50V2lkdGggfHwgcmVzdWx0LndpZHRoO1xuICB2YXIgaGVpZ2h0ID0gc2l6ZXMuaGVpZ2h0IHx8IGVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IHJlc3VsdC5oZWlnaHQ7XG5cbiAgdmFyIGhvcml6U2Nyb2xsYmFyID0gZWxlbWVudC5vZmZzZXRXaWR0aCAtIHdpZHRoO1xuICB2YXIgdmVydFNjcm9sbGJhciA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gaGVpZ2h0O1xuXG4gIC8vIGlmIGFuIGh5cG90aGV0aWNhbCBzY3JvbGxiYXIgaXMgZGV0ZWN0ZWQsIHdlIG11c3QgYmUgc3VyZSBpdCdzIG5vdCBhIGBib3JkZXJgXG4gIC8vIHdlIG1ha2UgdGhpcyBjaGVjayBjb25kaXRpb25hbCBmb3IgcGVyZm9ybWFuY2UgcmVhc29uc1xuICBpZiAoaG9yaXpTY3JvbGxiYXIgfHwgdmVydFNjcm9sbGJhcikge1xuICAgIHZhciBzdHlsZXMgPSBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZWxlbWVudCk7XG4gICAgaG9yaXpTY3JvbGxiYXIgLT0gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzLCAneCcpO1xuICAgIHZlcnRTY3JvbGxiYXIgLT0gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzLCAneScpO1xuXG4gICAgcmVzdWx0LndpZHRoIC09IGhvcml6U2Nyb2xsYmFyO1xuICAgIHJlc3VsdC5oZWlnaHQgLT0gdmVydFNjcm9sbGJhcjtcbiAgfVxuXG4gIHJldHVybiBnZXRDbGllbnRSZWN0KHJlc3VsdCk7XG59XG5cbmZ1bmN0aW9uIGdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZShjaGlsZHJlbiwgcGFyZW50KSB7XG4gIHZhciBmaXhlZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcblxuICB2YXIgaXNJRTEwID0gaXNJRSgxMCk7XG4gIHZhciBpc0hUTUwgPSBwYXJlbnQubm9kZU5hbWUgPT09ICdIVE1MJztcbiAgdmFyIGNoaWxkcmVuUmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChjaGlsZHJlbik7XG4gIHZhciBwYXJlbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHBhcmVudCk7XG4gIHZhciBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoY2hpbGRyZW4pO1xuXG4gIHZhciBzdHlsZXMgPSBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkocGFyZW50KTtcbiAgdmFyIGJvcmRlclRvcFdpZHRoID0gcGFyc2VGbG9hdChzdHlsZXMuYm9yZGVyVG9wV2lkdGgpO1xuICB2YXIgYm9yZGVyTGVmdFdpZHRoID0gcGFyc2VGbG9hdChzdHlsZXMuYm9yZGVyTGVmdFdpZHRoKTtcblxuICAvLyBJbiBjYXNlcyB3aGVyZSB0aGUgcGFyZW50IGlzIGZpeGVkLCB3ZSBtdXN0IGlnbm9yZSBuZWdhdGl2ZSBzY3JvbGwgaW4gb2Zmc2V0IGNhbGNcbiAgaWYgKGZpeGVkUG9zaXRpb24gJiYgaXNIVE1MKSB7XG4gICAgcGFyZW50UmVjdC50b3AgPSBNYXRoLm1heChwYXJlbnRSZWN0LnRvcCwgMCk7XG4gICAgcGFyZW50UmVjdC5sZWZ0ID0gTWF0aC5tYXgocGFyZW50UmVjdC5sZWZ0LCAwKTtcbiAgfVxuICB2YXIgb2Zmc2V0cyA9IGdldENsaWVudFJlY3Qoe1xuICAgIHRvcDogY2hpbGRyZW5SZWN0LnRvcCAtIHBhcmVudFJlY3QudG9wIC0gYm9yZGVyVG9wV2lkdGgsXG4gICAgbGVmdDogY2hpbGRyZW5SZWN0LmxlZnQgLSBwYXJlbnRSZWN0LmxlZnQgLSBib3JkZXJMZWZ0V2lkdGgsXG4gICAgd2lkdGg6IGNoaWxkcmVuUmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IGNoaWxkcmVuUmVjdC5oZWlnaHRcbiAgfSk7XG4gIG9mZnNldHMubWFyZ2luVG9wID0gMDtcbiAgb2Zmc2V0cy5tYXJnaW5MZWZ0ID0gMDtcblxuICAvLyBTdWJ0cmFjdCBtYXJnaW5zIG9mIGRvY3VtZW50RWxlbWVudCBpbiBjYXNlIGl0J3MgYmVpbmcgdXNlZCBhcyBwYXJlbnRcbiAgLy8gd2UgZG8gdGhpcyBvbmx5IG9uIEhUTUwgYmVjYXVzZSBpdCdzIHRoZSBvbmx5IGVsZW1lbnQgdGhhdCBiZWhhdmVzXG4gIC8vIGRpZmZlcmVudGx5IHdoZW4gbWFyZ2lucyBhcmUgYXBwbGllZCB0byBpdC4gVGhlIG1hcmdpbnMgYXJlIGluY2x1ZGVkIGluXG4gIC8vIHRoZSBib3ggb2YgdGhlIGRvY3VtZW50RWxlbWVudCwgaW4gdGhlIG90aGVyIGNhc2VzIG5vdC5cbiAgaWYgKCFpc0lFMTAgJiYgaXNIVE1MKSB7XG4gICAgdmFyIG1hcmdpblRvcCA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpblRvcCk7XG4gICAgdmFyIG1hcmdpbkxlZnQgPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5MZWZ0KTtcblxuICAgIG9mZnNldHMudG9wIC09IGJvcmRlclRvcFdpZHRoIC0gbWFyZ2luVG9wO1xuICAgIG9mZnNldHMuYm90dG9tIC09IGJvcmRlclRvcFdpZHRoIC0gbWFyZ2luVG9wO1xuICAgIG9mZnNldHMubGVmdCAtPSBib3JkZXJMZWZ0V2lkdGggLSBtYXJnaW5MZWZ0O1xuICAgIG9mZnNldHMucmlnaHQgLT0gYm9yZGVyTGVmdFdpZHRoIC0gbWFyZ2luTGVmdDtcblxuICAgIC8vIEF0dGFjaCBtYXJnaW5Ub3AgYW5kIG1hcmdpbkxlZnQgYmVjYXVzZSBpbiBzb21lIGNpcmN1bXN0YW5jZXMgd2UgbWF5IG5lZWQgdGhlbVxuICAgIG9mZnNldHMubWFyZ2luVG9wID0gbWFyZ2luVG9wO1xuICAgIG9mZnNldHMubWFyZ2luTGVmdCA9IG1hcmdpbkxlZnQ7XG4gIH1cblxuICBpZiAoaXNJRTEwICYmICFmaXhlZFBvc2l0aW9uID8gcGFyZW50LmNvbnRhaW5zKHNjcm9sbFBhcmVudCkgOiBwYXJlbnQgPT09IHNjcm9sbFBhcmVudCAmJiBzY3JvbGxQYXJlbnQubm9kZU5hbWUgIT09ICdCT0RZJykge1xuICAgIG9mZnNldHMgPSBpbmNsdWRlU2Nyb2xsKG9mZnNldHMsIHBhcmVudCk7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0cztcbn1cblxuZnVuY3Rpb24gZ2V0Vmlld3BvcnRPZmZzZXRSZWN0UmVsYXRpdmVUb0FydGJpdHJhcnlOb2RlKGVsZW1lbnQpIHtcbiAgdmFyIGV4Y2x1ZGVTY3JvbGwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIHZhciBodG1sID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgdmFyIHJlbGF0aXZlT2Zmc2V0ID0gZ2V0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcmJpdHJhcnlOb2RlKGVsZW1lbnQsIGh0bWwpO1xuICB2YXIgd2lkdGggPSBNYXRoLm1heChodG1sLmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcbiAgdmFyIGhlaWdodCA9IE1hdGgubWF4KGh0bWwuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XG5cbiAgdmFyIHNjcm9sbFRvcCA9ICFleGNsdWRlU2Nyb2xsID8gZ2V0U2Nyb2xsKGh0bWwpIDogMDtcbiAgdmFyIHNjcm9sbExlZnQgPSAhZXhjbHVkZVNjcm9sbCA/IGdldFNjcm9sbChodG1sLCAnbGVmdCcpIDogMDtcblxuICB2YXIgb2Zmc2V0ID0ge1xuICAgIHRvcDogc2Nyb2xsVG9wIC0gcmVsYXRpdmVPZmZzZXQudG9wICsgcmVsYXRpdmVPZmZzZXQubWFyZ2luVG9wLFxuICAgIGxlZnQ6IHNjcm9sbExlZnQgLSByZWxhdGl2ZU9mZnNldC5sZWZ0ICsgcmVsYXRpdmVPZmZzZXQubWFyZ2luTGVmdCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcblxuICByZXR1cm4gZ2V0Q2xpZW50UmVjdChvZmZzZXQpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIGZpeGVkIG9yIGlzIGluc2lkZSBhIGZpeGVkIHBhcmVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGN1c3RvbUNvbnRhaW5lclxuICogQHJldHVybnMge0Jvb2xlYW59IGFuc3dlciB0byBcImlzRml4ZWQ/XCJcbiAqL1xuZnVuY3Rpb24gaXNGaXhlZChlbGVtZW50KSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7XG4gIGlmIChub2RlTmFtZSA9PT0gJ0JPRFknIHx8IG5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShlbGVtZW50LCAncG9zaXRpb24nKSA9PT0gJ2ZpeGVkJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBwYXJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcbiAgaWYgKCFwYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBpc0ZpeGVkKHBhcmVudE5vZGUpO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBmaXJzdCBwYXJlbnQgb2YgYW4gZWxlbWVudCB0aGF0IGhhcyBhIHRyYW5zZm9ybWVkIHByb3BlcnR5IGRlZmluZWRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IGZpcnN0IHRyYW5zZm9ybWVkIHBhcmVudCBvciBkb2N1bWVudEVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBnZXRGaXhlZFBvc2l0aW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgLy8gVGhpcyBjaGVjayBpcyBuZWVkZWQgdG8gYXZvaWQgZXJyb3JzIGluIGNhc2Ugb25lIG9mIHRoZSBlbGVtZW50cyBpc24ndCBkZWZpbmVkIGZvciBhbnkgcmVhc29uXG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5wYXJlbnRFbGVtZW50IHx8IGlzSUUoKSkge1xuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cbiAgdmFyIGVsID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAoZWwgJiYgZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsLCAndHJhbnNmb3JtJykgPT09ICdub25lJykge1xuICAgIGVsID0gZWwucGFyZW50RWxlbWVudDtcbiAgfVxuICByZXR1cm4gZWwgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xufVxuXG4vKipcbiAqIENvbXB1dGVkIHRoZSBib3VuZGFyaWVzIGxpbWl0cyBhbmQgcmV0dXJuIHRoZW1cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBvcHBlclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcmVmZXJlbmNlXG4gKiBAcGFyYW0ge251bWJlcn0gcGFkZGluZ1xuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gYm91bmRhcmllc0VsZW1lbnQgLSBFbGVtZW50IHVzZWQgdG8gZGVmaW5lIHRoZSBib3VuZGFyaWVzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGZpeGVkUG9zaXRpb24gLSBJcyBpbiBmaXhlZCBwb3NpdGlvbiBtb2RlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBDb29yZGluYXRlcyBvZiB0aGUgYm91bmRhcmllc1xuICovXG5mdW5jdGlvbiBnZXRCb3VuZGFyaWVzKHBvcHBlciwgcmVmZXJlbmNlLCBwYWRkaW5nLCBib3VuZGFyaWVzRWxlbWVudCkge1xuICB2YXIgZml4ZWRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogZmFsc2U7XG5cbiAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmVcblxuICB2YXIgYm91bmRhcmllcyA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XG4gIHZhciBvZmZzZXRQYXJlbnQgPSBmaXhlZFBvc2l0aW9uID8gZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudChwb3BwZXIpIDogZmluZENvbW1vbk9mZnNldFBhcmVudChwb3BwZXIsIGdldFJlZmVyZW5jZU5vZGUocmVmZXJlbmNlKSk7XG5cbiAgLy8gSGFuZGxlIHZpZXdwb3J0IGNhc2VcbiAgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAndmlld3BvcnQnKSB7XG4gICAgYm91bmRhcmllcyA9IGdldFZpZXdwb3J0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcnRiaXRyYXJ5Tm9kZShvZmZzZXRQYXJlbnQsIGZpeGVkUG9zaXRpb24pO1xuICB9IGVsc2Uge1xuICAgIC8vIEhhbmRsZSBvdGhlciBjYXNlcyBiYXNlZCBvbiBET00gZWxlbWVudCB1c2VkIGFzIGJvdW5kYXJpZXNcbiAgICB2YXIgYm91bmRhcmllc05vZGUgPSB2b2lkIDA7XG4gICAgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAnc2Nyb2xsUGFyZW50Jykge1xuICAgICAgYm91bmRhcmllc05vZGUgPSBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShyZWZlcmVuY2UpKTtcbiAgICAgIGlmIChib3VuZGFyaWVzTm9kZS5ub2RlTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgICAgIGJvdW5kYXJpZXNOb2RlID0gcG9wcGVyLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYm91bmRhcmllc0VsZW1lbnQgPT09ICd3aW5kb3cnKSB7XG4gICAgICBib3VuZGFyaWVzTm9kZSA9IHBvcHBlci5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgYm91bmRhcmllc05vZGUgPSBib3VuZGFyaWVzRWxlbWVudDtcbiAgICB9XG5cbiAgICB2YXIgb2Zmc2V0cyA9IGdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZShib3VuZGFyaWVzTm9kZSwgb2Zmc2V0UGFyZW50LCBmaXhlZFBvc2l0aW9uKTtcblxuICAgIC8vIEluIGNhc2Ugb2YgSFRNTCwgd2UgbmVlZCBhIGRpZmZlcmVudCBjb21wdXRhdGlvblxuICAgIGlmIChib3VuZGFyaWVzTm9kZS5ub2RlTmFtZSA9PT0gJ0hUTUwnICYmICFpc0ZpeGVkKG9mZnNldFBhcmVudCkpIHtcbiAgICAgIHZhciBfZ2V0V2luZG93U2l6ZXMgPSBnZXRXaW5kb3dTaXplcyhwb3BwZXIub3duZXJEb2N1bWVudCksXG4gICAgICAgICAgaGVpZ2h0ID0gX2dldFdpbmRvd1NpemVzLmhlaWdodCxcbiAgICAgICAgICB3aWR0aCA9IF9nZXRXaW5kb3dTaXplcy53aWR0aDtcblxuICAgICAgYm91bmRhcmllcy50b3AgKz0gb2Zmc2V0cy50b3AgLSBvZmZzZXRzLm1hcmdpblRvcDtcbiAgICAgIGJvdW5kYXJpZXMuYm90dG9tID0gaGVpZ2h0ICsgb2Zmc2V0cy50b3A7XG4gICAgICBib3VuZGFyaWVzLmxlZnQgKz0gb2Zmc2V0cy5sZWZ0IC0gb2Zmc2V0cy5tYXJnaW5MZWZ0O1xuICAgICAgYm91bmRhcmllcy5yaWdodCA9IHdpZHRoICsgb2Zmc2V0cy5sZWZ0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmb3IgYWxsIHRoZSBvdGhlciBET00gZWxlbWVudHMsIHRoaXMgb25lIGlzIGdvb2RcbiAgICAgIGJvdW5kYXJpZXMgPSBvZmZzZXRzO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBwYWRkaW5nc1xuICBwYWRkaW5nID0gcGFkZGluZyB8fCAwO1xuICB2YXIgaXNQYWRkaW5nTnVtYmVyID0gdHlwZW9mIHBhZGRpbmcgPT09ICdudW1iZXInO1xuICBib3VuZGFyaWVzLmxlZnQgKz0gaXNQYWRkaW5nTnVtYmVyID8gcGFkZGluZyA6IHBhZGRpbmcubGVmdCB8fCAwO1xuICBib3VuZGFyaWVzLnRvcCArPSBpc1BhZGRpbmdOdW1iZXIgPyBwYWRkaW5nIDogcGFkZGluZy50b3AgfHwgMDtcbiAgYm91bmRhcmllcy5yaWdodCAtPSBpc1BhZGRpbmdOdW1iZXIgPyBwYWRkaW5nIDogcGFkZGluZy5yaWdodCB8fCAwO1xuICBib3VuZGFyaWVzLmJvdHRvbSAtPSBpc1BhZGRpbmdOdW1iZXIgPyBwYWRkaW5nIDogcGFkZGluZy5ib3R0b20gfHwgMDtcblxuICByZXR1cm4gYm91bmRhcmllcztcbn1cblxuZnVuY3Rpb24gZ2V0QXJlYShfcmVmKSB7XG4gIHZhciB3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICBoZWlnaHQgPSBfcmVmLmhlaWdodDtcblxuICByZXR1cm4gd2lkdGggKiBoZWlnaHQ7XG59XG5cbi8qKlxuICogVXRpbGl0eSB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgYGF1dG9gIHBsYWNlbWVudCB0byB0aGUgcGxhY2VtZW50IHdpdGggbW9yZVxuICogYXZhaWxhYmxlIHNwYWNlLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUF1dG9QbGFjZW1lbnQocGxhY2VtZW50LCByZWZSZWN0LCBwb3BwZXIsIHJlZmVyZW5jZSwgYm91bmRhcmllc0VsZW1lbnQpIHtcbiAgdmFyIHBhZGRpbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IDA7XG5cbiAgaWYgKHBsYWNlbWVudC5pbmRleE9mKCdhdXRvJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIHBsYWNlbWVudDtcbiAgfVxuXG4gIHZhciBib3VuZGFyaWVzID0gZ2V0Qm91bmRhcmllcyhwb3BwZXIsIHJlZmVyZW5jZSwgcGFkZGluZywgYm91bmRhcmllc0VsZW1lbnQpO1xuXG4gIHZhciByZWN0cyA9IHtcbiAgICB0b3A6IHtcbiAgICAgIHdpZHRoOiBib3VuZGFyaWVzLndpZHRoLFxuICAgICAgaGVpZ2h0OiByZWZSZWN0LnRvcCAtIGJvdW5kYXJpZXMudG9wXG4gICAgfSxcbiAgICByaWdodDoge1xuICAgICAgd2lkdGg6IGJvdW5kYXJpZXMucmlnaHQgLSByZWZSZWN0LnJpZ2h0LFxuICAgICAgaGVpZ2h0OiBib3VuZGFyaWVzLmhlaWdodFxuICAgIH0sXG4gICAgYm90dG9tOiB7XG4gICAgICB3aWR0aDogYm91bmRhcmllcy53aWR0aCxcbiAgICAgIGhlaWdodDogYm91bmRhcmllcy5ib3R0b20gLSByZWZSZWN0LmJvdHRvbVxuICAgIH0sXG4gICAgbGVmdDoge1xuICAgICAgd2lkdGg6IHJlZlJlY3QubGVmdCAtIGJvdW5kYXJpZXMubGVmdCxcbiAgICAgIGhlaWdodDogYm91bmRhcmllcy5oZWlnaHRcbiAgICB9XG4gIH07XG5cbiAgdmFyIHNvcnRlZEFyZWFzID0gT2JqZWN0LmtleXMocmVjdHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleToga2V5XG4gICAgfSwgcmVjdHNba2V5XSwge1xuICAgICAgYXJlYTogZ2V0QXJlYShyZWN0c1trZXldKVxuICAgIH0pO1xuICB9KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIuYXJlYSAtIGEuYXJlYTtcbiAgfSk7XG5cbiAgdmFyIGZpbHRlcmVkQXJlYXMgPSBzb3J0ZWRBcmVhcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgdmFyIHdpZHRoID0gX3JlZjIud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9yZWYyLmhlaWdodDtcbiAgICByZXR1cm4gd2lkdGggPj0gcG9wcGVyLmNsaWVudFdpZHRoICYmIGhlaWdodCA+PSBwb3BwZXIuY2xpZW50SGVpZ2h0O1xuICB9KTtcblxuICB2YXIgY29tcHV0ZWRQbGFjZW1lbnQgPSBmaWx0ZXJlZEFyZWFzLmxlbmd0aCA+IDAgPyBmaWx0ZXJlZEFyZWFzWzBdLmtleSA6IHNvcnRlZEFyZWFzWzBdLmtleTtcblxuICB2YXIgdmFyaWF0aW9uID0gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG5cbiAgcmV0dXJuIGNvbXB1dGVkUGxhY2VtZW50ICsgKHZhcmlhdGlvbiA/ICctJyArIHZhcmlhdGlvbiA6ICcnKTtcbn1cblxuLyoqXG4gKiBHZXQgb2Zmc2V0cyB0byB0aGUgcmVmZXJlbmNlIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtFbGVtZW50fSBwb3BwZXIgLSB0aGUgcG9wcGVyIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gcmVmZXJlbmNlIC0gdGhlIHJlZmVyZW5jZSBlbGVtZW50ICh0aGUgcG9wcGVyIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhpcylcbiAqIEBwYXJhbSB7RWxlbWVudH0gZml4ZWRQb3NpdGlvbiAtIGlzIGluIGZpeGVkIHBvc2l0aW9uIG1vZGVcbiAqIEByZXR1cm5zIHtPYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBvZmZzZXRzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyXG4gKi9cbmZ1bmN0aW9uIGdldFJlZmVyZW5jZU9mZnNldHMoc3RhdGUsIHBvcHBlciwgcmVmZXJlbmNlKSB7XG4gIHZhciBmaXhlZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBudWxsO1xuXG4gIHZhciBjb21tb25PZmZzZXRQYXJlbnQgPSBmaXhlZFBvc2l0aW9uID8gZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudChwb3BwZXIpIDogZmluZENvbW1vbk9mZnNldFBhcmVudChwb3BwZXIsIGdldFJlZmVyZW5jZU5vZGUocmVmZXJlbmNlKSk7XG4gIHJldHVybiBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUocmVmZXJlbmNlLCBjb21tb25PZmZzZXRQYXJlbnQsIGZpeGVkUG9zaXRpb24pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgb3V0ZXIgc2l6ZXMgb2YgdGhlIGdpdmVuIGVsZW1lbnQgKG9mZnNldCBzaXplICsgbWFyZ2lucylcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IGNvbnRhaW5pbmcgd2lkdGggYW5kIGhlaWdodCBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGdldE91dGVyU2l6ZXMoZWxlbWVudCkge1xuICB2YXIgd2luZG93ID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gIHZhciB4ID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luVG9wIHx8IDApICsgcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luQm90dG9tIHx8IDApO1xuICB2YXIgeSA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpbkxlZnQgfHwgMCkgKyBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5SaWdodCB8fCAwKTtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICB3aWR0aDogZWxlbWVudC5vZmZzZXRXaWR0aCArIHksXG4gICAgaGVpZ2h0OiBlbGVtZW50Lm9mZnNldEhlaWdodCArIHhcbiAgfTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG9wcG9zaXRlIHBsYWNlbWVudCBvZiB0aGUgZ2l2ZW4gb25lXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gcGxhY2VtZW50XG4gKiBAcmV0dXJucyB7U3RyaW5nfSBmbGlwcGVkIHBsYWNlbWVudFxuICovXG5mdW5jdGlvbiBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgdmFyIGhhc2ggPSB7IGxlZnQ6ICdyaWdodCcsIHJpZ2h0OiAnbGVmdCcsIGJvdHRvbTogJ3RvcCcsIHRvcDogJ2JvdHRvbScgfTtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IG9mZnNldHMgdG8gdGhlIHBvcHBlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtPYmplY3R9IHBvc2l0aW9uIC0gQ1NTIHBvc2l0aW9uIHRoZSBQb3BwZXIgd2lsbCBnZXQgYXBwbGllZFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcG9wcGVyIC0gdGhlIHBvcHBlciBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gcmVmZXJlbmNlT2Zmc2V0cyAtIHRoZSByZWZlcmVuY2Ugb2Zmc2V0cyAodGhlIHBvcHBlciB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXMpXG4gKiBAcGFyYW0ge1N0cmluZ30gcGxhY2VtZW50IC0gb25lIG9mIHRoZSB2YWxpZCBwbGFjZW1lbnQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gcG9wcGVyT2Zmc2V0cyAtIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBvZmZzZXRzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyXG4gKi9cbmZ1bmN0aW9uIGdldFBvcHBlck9mZnNldHMocG9wcGVyLCByZWZlcmVuY2VPZmZzZXRzLCBwbGFjZW1lbnQpIHtcbiAgcGxhY2VtZW50ID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG5cbiAgLy8gR2V0IHBvcHBlciBub2RlIHNpemVzXG4gIHZhciBwb3BwZXJSZWN0ID0gZ2V0T3V0ZXJTaXplcyhwb3BwZXIpO1xuXG4gIC8vIEFkZCBwb3NpdGlvbiwgd2lkdGggYW5kIGhlaWdodCB0byBvdXIgb2Zmc2V0cyBvYmplY3RcbiAgdmFyIHBvcHBlck9mZnNldHMgPSB7XG4gICAgd2lkdGg6IHBvcHBlclJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiBwb3BwZXJSZWN0LmhlaWdodFxuICB9O1xuXG4gIC8vIGRlcGVuZGluZyBieSB0aGUgcG9wcGVyIHBsYWNlbWVudCB3ZSBoYXZlIHRvIGNvbXB1dGUgaXRzIG9mZnNldHMgc2xpZ2h0bHkgZGlmZmVyZW50bHlcbiAgdmFyIGlzSG9yaXogPSBbJ3JpZ2h0JywgJ2xlZnQnXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xO1xuICB2YXIgbWFpblNpZGUgPSBpc0hvcml6ID8gJ3RvcCcgOiAnbGVmdCc7XG4gIHZhciBzZWNvbmRhcnlTaWRlID0gaXNIb3JpeiA/ICdsZWZ0JyA6ICd0b3AnO1xuICB2YXIgbWVhc3VyZW1lbnQgPSBpc0hvcml6ID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICB2YXIgc2Vjb25kYXJ5TWVhc3VyZW1lbnQgPSAhaXNIb3JpeiA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICBwb3BwZXJPZmZzZXRzW21haW5TaWRlXSA9IHJlZmVyZW5jZU9mZnNldHNbbWFpblNpZGVdICsgcmVmZXJlbmNlT2Zmc2V0c1ttZWFzdXJlbWVudF0gLyAyIC0gcG9wcGVyUmVjdFttZWFzdXJlbWVudF0gLyAyO1xuICBpZiAocGxhY2VtZW50ID09PSBzZWNvbmRhcnlTaWRlKSB7XG4gICAgcG9wcGVyT2Zmc2V0c1tzZWNvbmRhcnlTaWRlXSA9IHJlZmVyZW5jZU9mZnNldHNbc2Vjb25kYXJ5U2lkZV0gLSBwb3BwZXJSZWN0W3NlY29uZGFyeU1lYXN1cmVtZW50XTtcbiAgfSBlbHNlIHtcbiAgICBwb3BwZXJPZmZzZXRzW3NlY29uZGFyeVNpZGVdID0gcmVmZXJlbmNlT2Zmc2V0c1tnZXRPcHBvc2l0ZVBsYWNlbWVudChzZWNvbmRhcnlTaWRlKV07XG4gIH1cblxuICByZXR1cm4gcG9wcGVyT2Zmc2V0cztcbn1cblxuLyoqXG4gKiBNaW1pY3MgdGhlIGBmaW5kYCBtZXRob2Qgb2YgQXJyYXlcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7QXJyYXl9IGFyclxuICogQGFyZ3VtZW50IHByb3BcbiAqIEBhcmd1bWVudCB2YWx1ZVxuICogQHJldHVybnMgaW5kZXggb3IgLTFcbiAqL1xuZnVuY3Rpb24gZmluZChhcnIsIGNoZWNrKSB7XG4gIC8vIHVzZSBuYXRpdmUgZmluZCBpZiBzdXBwb3J0ZWRcbiAgaWYgKEFycmF5LnByb3RvdHlwZS5maW5kKSB7XG4gICAgcmV0dXJuIGFyci5maW5kKGNoZWNrKTtcbiAgfVxuXG4gIC8vIHVzZSBgZmlsdGVyYCB0byBvYnRhaW4gdGhlIHNhbWUgYmVoYXZpb3Igb2YgYGZpbmRgXG4gIHJldHVybiBhcnIuZmlsdGVyKGNoZWNrKVswXTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBtYXRjaGluZyBvYmplY3RcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7QXJyYXl9IGFyclxuICogQGFyZ3VtZW50IHByb3BcbiAqIEBhcmd1bWVudCB2YWx1ZVxuICogQHJldHVybnMgaW5kZXggb3IgLTFcbiAqL1xuZnVuY3Rpb24gZmluZEluZGV4KGFyciwgcHJvcCwgdmFsdWUpIHtcbiAgLy8gdXNlIG5hdGl2ZSBmaW5kSW5kZXggaWYgc3VwcG9ydGVkXG4gIGlmIChBcnJheS5wcm90b3R5cGUuZmluZEluZGV4KSB7XG4gICAgcmV0dXJuIGFyci5maW5kSW5kZXgoZnVuY3Rpb24gKGN1cikge1xuICAgICAgcmV0dXJuIGN1cltwcm9wXSA9PT0gdmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICAvLyB1c2UgYGZpbmRgICsgYGluZGV4T2ZgIGlmIGBmaW5kSW5kZXhgIGlzbid0IHN1cHBvcnRlZFxuICB2YXIgbWF0Y2ggPSBmaW5kKGFyciwgZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmpbcHJvcF0gPT09IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIGFyci5pbmRleE9mKG1hdGNoKTtcbn1cblxuLyoqXG4gKiBMb29wIHRyb3VnaCB0aGUgbGlzdCBvZiBtb2RpZmllcnMgYW5kIHJ1biB0aGVtIGluIG9yZGVyLFxuICogZWFjaCBvZiB0aGVtIHdpbGwgdGhlbiBlZGl0IHRoZSBkYXRhIG9iamVjdC5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7ZGF0YU9iamVjdH0gZGF0YVxuICogQHBhcmFtIHtBcnJheX0gbW9kaWZpZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gZW5kcyAtIE9wdGlvbmFsIG1vZGlmaWVyIG5hbWUgdXNlZCBhcyBzdG9wcGVyXG4gKiBAcmV0dXJucyB7ZGF0YU9iamVjdH1cbiAqL1xuZnVuY3Rpb24gcnVuTW9kaWZpZXJzKG1vZGlmaWVycywgZGF0YSwgZW5kcykge1xuICB2YXIgbW9kaWZpZXJzVG9SdW4gPSBlbmRzID09PSB1bmRlZmluZWQgPyBtb2RpZmllcnMgOiBtb2RpZmllcnMuc2xpY2UoMCwgZmluZEluZGV4KG1vZGlmaWVycywgJ25hbWUnLCBlbmRzKSk7XG5cbiAgbW9kaWZpZXJzVG9SdW4uZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBpZiAobW9kaWZpZXJbJ2Z1bmN0aW9uJ10pIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZG90LW5vdGF0aW9uXG4gICAgICBjb25zb2xlLndhcm4oJ2Btb2RpZmllci5mdW5jdGlvbmAgaXMgZGVwcmVjYXRlZCwgdXNlIGBtb2RpZmllci5mbmAhJyk7XG4gICAgfVxuICAgIHZhciBmbiA9IG1vZGlmaWVyWydmdW5jdGlvbiddIHx8IG1vZGlmaWVyLmZuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRvdC1ub3RhdGlvblxuICAgIGlmIChtb2RpZmllci5lbmFibGVkICYmIGlzRnVuY3Rpb24oZm4pKSB7XG4gICAgICAvLyBBZGQgcHJvcGVydGllcyB0byBvZmZzZXRzIHRvIG1ha2UgdGhlbSBhIGNvbXBsZXRlIGNsaWVudFJlY3Qgb2JqZWN0XG4gICAgICAvLyB3ZSBkbyB0aGlzIGJlZm9yZSBlYWNoIG1vZGlmaWVyIHRvIG1ha2Ugc3VyZSB0aGUgcHJldmlvdXMgb25lIGRvZXNuJ3RcbiAgICAgIC8vIG1lc3Mgd2l0aCB0aGVzZSB2YWx1ZXNcbiAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBnZXRDbGllbnRSZWN0KGRhdGEub2Zmc2V0cy5wb3BwZXIpO1xuICAgICAgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSA9IGdldENsaWVudFJlY3QoZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSk7XG5cbiAgICAgIGRhdGEgPSBmbihkYXRhLCBtb2RpZmllcik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgcG9wcGVyLCBjb21wdXRpbmcgdGhlIG5ldyBvZmZzZXRzIGFuZCBhcHBseWluZ1xuICogdGhlIG5ldyBzdHlsZS48YnIgLz5cbiAqIFByZWZlciBgc2NoZWR1bGVVcGRhdGVgIG92ZXIgYHVwZGF0ZWAgYmVjYXVzZSBvZiBwZXJmb3JtYW5jZSByZWFzb25zLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG5mdW5jdGlvbiB1cGRhdGUoKSB7XG4gIC8vIGlmIHBvcHBlciBpcyBkZXN0cm95ZWQsIGRvbid0IHBlcmZvcm0gYW55IGZ1cnRoZXIgdXBkYXRlXG4gIGlmICh0aGlzLnN0YXRlLmlzRGVzdHJveWVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGRhdGEgPSB7XG4gICAgaW5zdGFuY2U6IHRoaXMsXG4gICAgc3R5bGVzOiB7fSxcbiAgICBhcnJvd1N0eWxlczoge30sXG4gICAgYXR0cmlidXRlczoge30sXG4gICAgZmxpcHBlZDogZmFsc2UsXG4gICAgb2Zmc2V0czoge31cbiAgfTtcblxuICAvLyBjb21wdXRlIHJlZmVyZW5jZSBlbGVtZW50IG9mZnNldHNcbiAgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSA9IGdldFJlZmVyZW5jZU9mZnNldHModGhpcy5zdGF0ZSwgdGhpcy5wb3BwZXIsIHRoaXMucmVmZXJlbmNlLCB0aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZCk7XG5cbiAgLy8gY29tcHV0ZSBhdXRvIHBsYWNlbWVudCwgc3RvcmUgcGxhY2VtZW50IGluc2lkZSB0aGUgZGF0YSBvYmplY3QsXG4gIC8vIG1vZGlmaWVycyB3aWxsIGJlIGFibGUgdG8gZWRpdCBgcGxhY2VtZW50YCBpZiBuZWVkZWRcbiAgLy8gYW5kIHJlZmVyIHRvIG9yaWdpbmFsUGxhY2VtZW50IHRvIGtub3cgdGhlIG9yaWdpbmFsIHZhbHVlXG4gIGRhdGEucGxhY2VtZW50ID0gY29tcHV0ZUF1dG9QbGFjZW1lbnQodGhpcy5vcHRpb25zLnBsYWNlbWVudCwgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSwgdGhpcy5wb3BwZXIsIHRoaXMucmVmZXJlbmNlLCB0aGlzLm9wdGlvbnMubW9kaWZpZXJzLmZsaXAuYm91bmRhcmllc0VsZW1lbnQsIHRoaXMub3B0aW9ucy5tb2RpZmllcnMuZmxpcC5wYWRkaW5nKTtcblxuICAvLyBzdG9yZSB0aGUgY29tcHV0ZWQgcGxhY2VtZW50IGluc2lkZSBgb3JpZ2luYWxQbGFjZW1lbnRgXG4gIGRhdGEub3JpZ2luYWxQbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudDtcblxuICBkYXRhLnBvc2l0aW9uRml4ZWQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZDtcblxuICAvLyBjb21wdXRlIHRoZSBwb3BwZXIgb2Zmc2V0c1xuICBkYXRhLm9mZnNldHMucG9wcGVyID0gZ2V0UG9wcGVyT2Zmc2V0cyh0aGlzLnBvcHBlciwgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSwgZGF0YS5wbGFjZW1lbnQpO1xuXG4gIGRhdGEub2Zmc2V0cy5wb3BwZXIucG9zaXRpb24gPSB0aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZCA/ICdmaXhlZCcgOiAnYWJzb2x1dGUnO1xuXG4gIC8vIHJ1biB0aGUgbW9kaWZpZXJzXG4gIGRhdGEgPSBydW5Nb2RpZmllcnModGhpcy5tb2RpZmllcnMsIGRhdGEpO1xuXG4gIC8vIHRoZSBmaXJzdCBgdXBkYXRlYCB3aWxsIGNhbGwgYG9uQ3JlYXRlYCBjYWxsYmFja1xuICAvLyB0aGUgb3RoZXIgb25lcyB3aWxsIGNhbGwgYG9uVXBkYXRlYCBjYWxsYmFja1xuICBpZiAoIXRoaXMuc3RhdGUuaXNDcmVhdGVkKSB7XG4gICAgdGhpcy5zdGF0ZS5pc0NyZWF0ZWQgPSB0cnVlO1xuICAgIHRoaXMub3B0aW9ucy5vbkNyZWF0ZShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm9wdGlvbnMub25VcGRhdGUoZGF0YSk7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdXNlZCB0byBrbm93IGlmIHRoZSBnaXZlbiBtb2RpZmllciBpcyBlbmFibGVkLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTW9kaWZpZXJFbmFibGVkKG1vZGlmaWVycywgbW9kaWZpZXJOYW1lKSB7XG4gIHJldHVybiBtb2RpZmllcnMuc29tZShmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgICBlbmFibGVkID0gX3JlZi5lbmFibGVkO1xuICAgIHJldHVybiBlbmFibGVkICYmIG5hbWUgPT09IG1vZGlmaWVyTmFtZTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcmVmaXhlZCBzdXBwb3J0ZWQgcHJvcGVydHkgbmFtZVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtTdHJpbmd9IHByb3BlcnR5IChjYW1lbENhc2UpXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBwcmVmaXhlZCBwcm9wZXJ0eSAoY2FtZWxDYXNlIG9yIFBhc2NhbENhc2UsIGRlcGVuZGluZyBvbiB0aGUgdmVuZG9yIHByZWZpeClcbiAqL1xuZnVuY3Rpb24gZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lKHByb3BlcnR5KSB7XG4gIHZhciBwcmVmaXhlcyA9IFtmYWxzZSwgJ21zJywgJ1dlYmtpdCcsICdNb3onLCAnTyddO1xuICB2YXIgdXBwZXJQcm9wID0gcHJvcGVydHkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zbGljZSgxKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHByZWZpeCA9IHByZWZpeGVzW2ldO1xuICAgIHZhciB0b0NoZWNrID0gcHJlZml4ID8gJycgKyBwcmVmaXggKyB1cHBlclByb3AgOiBwcm9wZXJ0eTtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50LmJvZHkuc3R5bGVbdG9DaGVja10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdG9DaGVjaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogRGVzdHJveXMgdGhlIHBvcHBlci5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xuZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgdGhpcy5zdGF0ZS5pc0Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgLy8gdG91Y2ggRE9NIG9ubHkgaWYgYGFwcGx5U3R5bGVgIG1vZGlmaWVyIGlzIGVuYWJsZWRcbiAgaWYgKGlzTW9kaWZpZXJFbmFibGVkKHRoaXMubW9kaWZpZXJzLCAnYXBwbHlTdHlsZScpKSB7XG4gICAgdGhpcy5wb3BwZXIucmVtb3ZlQXR0cmlidXRlKCd4LXBsYWNlbWVudCcpO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlLnBvc2l0aW9uID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUudG9wID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUubGVmdCA9ICcnO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlLnJpZ2h0ID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUuYm90dG9tID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUud2lsbENoYW5nZSA9ICcnO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlW2dldFN1cHBvcnRlZFByb3BlcnR5TmFtZSgndHJhbnNmb3JtJyldID0gJyc7XG4gIH1cblxuICB0aGlzLmRpc2FibGVFdmVudExpc3RlbmVycygpO1xuXG4gIC8vIHJlbW92ZSB0aGUgcG9wcGVyIGlmIHVzZXIgZXhwbGljaXRseSBhc2tlZCBmb3IgdGhlIGRlbGV0aW9uIG9uIGRlc3Ryb3lcbiAgLy8gZG8gbm90IHVzZSBgcmVtb3ZlYCBiZWNhdXNlIElFMTEgZG9lc24ndCBzdXBwb3J0IGl0XG4gIGlmICh0aGlzLm9wdGlvbnMucmVtb3ZlT25EZXN0cm95KSB7XG4gICAgdGhpcy5wb3BwZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBvcHBlcik7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogR2V0IHRoZSB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50XG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtXaW5kb3d9XG4gKi9cbmZ1bmN0aW9uIGdldFdpbmRvdyhlbGVtZW50KSB7XG4gIHZhciBvd25lckRvY3VtZW50ID0gZWxlbWVudC5vd25lckRvY3VtZW50O1xuICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgOiB3aW5kb3c7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFRvU2Nyb2xsUGFyZW50cyhzY3JvbGxQYXJlbnQsIGV2ZW50LCBjYWxsYmFjaywgc2Nyb2xsUGFyZW50cykge1xuICB2YXIgaXNCb2R5ID0gc2Nyb2xsUGFyZW50Lm5vZGVOYW1lID09PSAnQk9EWSc7XG4gIHZhciB0YXJnZXQgPSBpc0JvZHkgPyBzY3JvbGxQYXJlbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyA6IHNjcm9sbFBhcmVudDtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGNhbGxiYWNrLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cbiAgaWYgKCFpc0JvZHkpIHtcbiAgICBhdHRhY2hUb1Njcm9sbFBhcmVudHMoZ2V0U2Nyb2xsUGFyZW50KHRhcmdldC5wYXJlbnROb2RlKSwgZXZlbnQsIGNhbGxiYWNrLCBzY3JvbGxQYXJlbnRzKTtcbiAgfVxuICBzY3JvbGxQYXJlbnRzLnB1c2godGFyZ2V0KTtcbn1cblxuLyoqXG4gKiBTZXR1cCBuZWVkZWQgZXZlbnQgbGlzdGVuZXJzIHVzZWQgdG8gdXBkYXRlIHRoZSBwb3BwZXIgcG9zaXRpb25cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNldHVwRXZlbnRMaXN0ZW5lcnMocmVmZXJlbmNlLCBvcHRpb25zLCBzdGF0ZSwgdXBkYXRlQm91bmQpIHtcbiAgLy8gUmVzaXplIGV2ZW50IGxpc3RlbmVyIG9uIHdpbmRvd1xuICBzdGF0ZS51cGRhdGVCb3VuZCA9IHVwZGF0ZUJvdW5kO1xuICBnZXRXaW5kb3cocmVmZXJlbmNlKS5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBzdGF0ZS51cGRhdGVCb3VuZCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gIC8vIFNjcm9sbCBldmVudCBsaXN0ZW5lciBvbiBzY3JvbGwgcGFyZW50c1xuICB2YXIgc2Nyb2xsRWxlbWVudCA9IGdldFNjcm9sbFBhcmVudChyZWZlcmVuY2UpO1xuICBhdHRhY2hUb1Njcm9sbFBhcmVudHMoc2Nyb2xsRWxlbWVudCwgJ3Njcm9sbCcsIHN0YXRlLnVwZGF0ZUJvdW5kLCBzdGF0ZS5zY3JvbGxQYXJlbnRzKTtcbiAgc3RhdGUuc2Nyb2xsRWxlbWVudCA9IHNjcm9sbEVsZW1lbnQ7XG4gIHN0YXRlLmV2ZW50c0VuYWJsZWQgPSB0cnVlO1xuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuLyoqXG4gKiBJdCB3aWxsIGFkZCByZXNpemUvc2Nyb2xsIGV2ZW50cyBhbmQgc3RhcnQgcmVjYWxjdWxhdGluZ1xuICogcG9zaXRpb24gb2YgdGhlIHBvcHBlciBlbGVtZW50IHdoZW4gdGhleSBhcmUgdHJpZ2dlcmVkLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG5mdW5jdGlvbiBlbmFibGVFdmVudExpc3RlbmVycygpIHtcbiAgaWYgKCF0aGlzLnN0YXRlLmV2ZW50c0VuYWJsZWQpIHtcbiAgICB0aGlzLnN0YXRlID0gc2V0dXBFdmVudExpc3RlbmVycyh0aGlzLnJlZmVyZW5jZSwgdGhpcy5vcHRpb25zLCB0aGlzLnN0YXRlLCB0aGlzLnNjaGVkdWxlVXBkYXRlKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXNlZCB0byB1cGRhdGUgdGhlIHBvcHBlciBwb3NpdGlvblxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcnMocmVmZXJlbmNlLCBzdGF0ZSkge1xuICAvLyBSZW1vdmUgcmVzaXplIGV2ZW50IGxpc3RlbmVyIG9uIHdpbmRvd1xuICBnZXRXaW5kb3cocmVmZXJlbmNlKS5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBzdGF0ZS51cGRhdGVCb3VuZCk7XG5cbiAgLy8gUmVtb3ZlIHNjcm9sbCBldmVudCBsaXN0ZW5lciBvbiBzY3JvbGwgcGFyZW50c1xuICBzdGF0ZS5zY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzdGF0ZS51cGRhdGVCb3VuZCk7XG4gIH0pO1xuXG4gIC8vIFJlc2V0IHN0YXRlXG4gIHN0YXRlLnVwZGF0ZUJvdW5kID0gbnVsbDtcbiAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IFtdO1xuICBzdGF0ZS5zY3JvbGxFbGVtZW50ID0gbnVsbDtcbiAgc3RhdGUuZXZlbnRzRW5hYmxlZCA9IGZhbHNlO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogSXQgd2lsbCByZW1vdmUgcmVzaXplL3Njcm9sbCBldmVudHMgYW5kIHdvbid0IHJlY2FsY3VsYXRlIHBvcHBlciBwb3NpdGlvblxuICogd2hlbiB0aGV5IGFyZSB0cmlnZ2VyZWQuIEl0IGFsc28gd29uJ3QgdHJpZ2dlciBgb25VcGRhdGVgIGNhbGxiYWNrIGFueW1vcmUsXG4gKiB1bmxlc3MgeW91IGNhbGwgYHVwZGF0ZWAgbWV0aG9kIG1hbnVhbGx5LlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG5mdW5jdGlvbiBkaXNhYmxlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gIGlmICh0aGlzLnN0YXRlLmV2ZW50c0VuYWJsZWQpIHtcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjaGVkdWxlVXBkYXRlKTtcbiAgICB0aGlzLnN0YXRlID0gcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5yZWZlcmVuY2UsIHRoaXMuc3RhdGUpO1xuICB9XG59XG5cbi8qKlxuICogVGVsbHMgaWYgYSBnaXZlbiBpbnB1dCBpcyBhIG51bWJlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHsqfSBpbnB1dCB0byBjaGVja1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOdW1lcmljKG4pIHtcbiAgcmV0dXJuIG4gIT09ICcnICYmICFpc05hTihwYXJzZUZsb2F0KG4pKSAmJiBpc0Zpbml0ZShuKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHN0eWxlIHRvIHRoZSBnaXZlbiBwb3BwZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gYXBwbHkgdGhlIHN0eWxlIHRvXG4gKiBAYXJndW1lbnQge09iamVjdH0gc3R5bGVzXG4gKiBPYmplY3Qgd2l0aCBhIGxpc3Qgb2YgcHJvcGVydGllcyBhbmQgdmFsdWVzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudFxuICovXG5mdW5jdGlvbiBzZXRTdHlsZXMoZWxlbWVudCwgc3R5bGVzKSB7XG4gIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgIHZhciB1bml0ID0gJyc7XG4gICAgLy8gYWRkIHVuaXQgaWYgdGhlIHZhbHVlIGlzIG51bWVyaWMgYW5kIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nXG4gICAgaWYgKFsnd2lkdGgnLCAnaGVpZ2h0JywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLmluZGV4T2YocHJvcCkgIT09IC0xICYmIGlzTnVtZXJpYyhzdHlsZXNbcHJvcF0pKSB7XG4gICAgICB1bml0ID0gJ3B4JztcbiAgICB9XG4gICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IHN0eWxlc1twcm9wXSArIHVuaXQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIFNldCB0aGUgYXR0cmlidXRlcyB0byB0aGUgZ2l2ZW4gcG9wcGVyXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFwcGx5IHRoZSBhdHRyaWJ1dGVzIHRvXG4gKiBAYXJndW1lbnQge09iamVjdH0gc3R5bGVzXG4gKiBPYmplY3Qgd2l0aCBhIGxpc3Qgb2YgcHJvcGVydGllcyBhbmQgdmFsdWVzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudFxuICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIGF0dHJpYnV0ZXMpIHtcbiAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbcHJvcF07XG4gICAgaWYgKHZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUocHJvcCwgYXR0cmlidXRlc1twcm9wXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHByb3ApO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YS5zdHlsZXMgLSBMaXN0IG9mIHN0eWxlIHByb3BlcnRpZXMgLSB2YWx1ZXMgdG8gYXBwbHkgdG8gcG9wcGVyIGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhLmF0dHJpYnV0ZXMgLSBMaXN0IG9mIGF0dHJpYnV0ZSBwcm9wZXJ0aWVzIC0gdmFsdWVzIHRvIGFwcGx5IHRvIHBvcHBlciBlbGVtZW50XG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgc2FtZSBkYXRhIG9iamVjdFxuICovXG5mdW5jdGlvbiBhcHBseVN0eWxlKGRhdGEpIHtcbiAgLy8gYW55IHByb3BlcnR5IHByZXNlbnQgaW4gYGRhdGEuc3R5bGVzYCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlcixcbiAgLy8gaW4gdGhpcyB3YXkgd2UgY2FuIG1ha2UgdGhlIDNyZCBwYXJ0eSBtb2RpZmllcnMgYWRkIGN1c3RvbSBzdHlsZXMgdG8gaXRcbiAgLy8gQmUgYXdhcmUsIG1vZGlmaWVycyBjb3VsZCBvdmVycmlkZSB0aGUgcHJvcGVydGllcyBkZWZpbmVkIGluIHRoZSBwcmV2aW91c1xuICAvLyBsaW5lcyBvZiB0aGlzIG1vZGlmaWVyIVxuICBzZXRTdHlsZXMoZGF0YS5pbnN0YW5jZS5wb3BwZXIsIGRhdGEuc3R5bGVzKTtcblxuICAvLyBhbnkgcHJvcGVydHkgcHJlc2VudCBpbiBgZGF0YS5hdHRyaWJ1dGVzYCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlcixcbiAgLy8gdGhleSB3aWxsIGJlIHNldCBhcyBIVE1MIGF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnRcbiAgc2V0QXR0cmlidXRlcyhkYXRhLmluc3RhbmNlLnBvcHBlciwgZGF0YS5hdHRyaWJ1dGVzKTtcblxuICAvLyBpZiBhcnJvd0VsZW1lbnQgaXMgZGVmaW5lZCBhbmQgYXJyb3dTdHlsZXMgaGFzIHNvbWUgcHJvcGVydGllc1xuICBpZiAoZGF0YS5hcnJvd0VsZW1lbnQgJiYgT2JqZWN0LmtleXMoZGF0YS5hcnJvd1N0eWxlcykubGVuZ3RoKSB7XG4gICAgc2V0U3R5bGVzKGRhdGEuYXJyb3dFbGVtZW50LCBkYXRhLmFycm93U3R5bGVzKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIFNldCB0aGUgeC1wbGFjZW1lbnQgYXR0cmlidXRlIGJlZm9yZSBldmVyeXRoaW5nIGVsc2UgYmVjYXVzZSBpdCBjb3VsZCBiZSB1c2VkXG4gKiB0byBhZGQgbWFyZ2lucyB0byB0aGUgcG9wcGVyIG1hcmdpbnMgbmVlZHMgdG8gYmUgY2FsY3VsYXRlZCB0byBnZXQgdGhlXG4gKiBjb3JyZWN0IHBvcHBlciBvZmZzZXRzLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5tb2RpZmllcnNcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlZmVyZW5jZSAtIFRoZSByZWZlcmVuY2UgZWxlbWVudCB1c2VkIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBvcHBlciAtIFRoZSBIVE1MIGVsZW1lbnQgdXNlZCBhcyBwb3BwZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gUG9wcGVyLmpzIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gYXBwbHlTdHlsZU9uTG9hZChyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucywgbW9kaWZpZXJPcHRpb25zLCBzdGF0ZSkge1xuICAvLyBjb21wdXRlIHJlZmVyZW5jZSBlbGVtZW50IG9mZnNldHNcbiAgdmFyIHJlZmVyZW5jZU9mZnNldHMgPSBnZXRSZWZlcmVuY2VPZmZzZXRzKHN0YXRlLCBwb3BwZXIsIHJlZmVyZW5jZSwgb3B0aW9ucy5wb3NpdGlvbkZpeGVkKTtcblxuICAvLyBjb21wdXRlIGF1dG8gcGxhY2VtZW50LCBzdG9yZSBwbGFjZW1lbnQgaW5zaWRlIHRoZSBkYXRhIG9iamVjdCxcbiAgLy8gbW9kaWZpZXJzIHdpbGwgYmUgYWJsZSB0byBlZGl0IGBwbGFjZW1lbnRgIGlmIG5lZWRlZFxuICAvLyBhbmQgcmVmZXIgdG8gb3JpZ2luYWxQbGFjZW1lbnQgdG8ga25vdyB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgdmFyIHBsYWNlbWVudCA9IGNvbXB1dGVBdXRvUGxhY2VtZW50KG9wdGlvbnMucGxhY2VtZW50LCByZWZlcmVuY2VPZmZzZXRzLCBwb3BwZXIsIHJlZmVyZW5jZSwgb3B0aW9ucy5tb2RpZmllcnMuZmxpcC5ib3VuZGFyaWVzRWxlbWVudCwgb3B0aW9ucy5tb2RpZmllcnMuZmxpcC5wYWRkaW5nKTtcblxuICBwb3BwZXIuc2V0QXR0cmlidXRlKCd4LXBsYWNlbWVudCcsIHBsYWNlbWVudCk7XG5cbiAgLy8gQXBwbHkgYHBvc2l0aW9uYCB0byBwb3BwZXIgYmVmb3JlIGFueXRoaW5nIGVsc2UgYmVjYXVzZVxuICAvLyB3aXRob3V0IHRoZSBwb3NpdGlvbiBhcHBsaWVkIHdlIGNhbid0IGd1YXJhbnRlZSBjb3JyZWN0IGNvbXB1dGF0aW9uc1xuICBzZXRTdHlsZXMocG9wcGVyLCB7IHBvc2l0aW9uOiBvcHRpb25zLnBvc2l0aW9uRml4ZWQgPyAnZml4ZWQnIDogJ2Fic29sdXRlJyB9KTtcblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7Qm9vbGVhbn0gc2hvdWxkUm91bmQgLSBJZiB0aGUgb2Zmc2V0cyBzaG91bGQgYmUgcm91bmRlZCBhdCBhbGxcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBwb3BwZXIncyBwb3NpdGlvbiBvZmZzZXRzIHJvdW5kZWRcbiAqXG4gKiBUaGUgdGFsZSBvZiBwaXhlbC1wZXJmZWN0IHBvc2l0aW9uaW5nLiBJdCdzIHN0aWxsIG5vdCAxMDAlIHBlcmZlY3QsIGJ1dCBhc1xuICogZ29vZCBhcyBpdCBjYW4gYmUgd2l0aGluIHJlYXNvbi5cbiAqIERpc2N1c3Npb24gaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL0ZlelZyYXN0YS9wb3BwZXIuanMvcHVsbC83MTVcbiAqXG4gKiBMb3cgRFBJIHNjcmVlbnMgY2F1c2UgYSBwb3BwZXIgdG8gYmUgYmx1cnJ5IGlmIG5vdCB1c2luZyBmdWxsIHBpeGVscyAoU2FmYXJpXG4gKiBhcyB3ZWxsIG9uIEhpZ2ggRFBJIHNjcmVlbnMpLlxuICpcbiAqIEZpcmVmb3ggcHJlZmVycyBubyByb3VuZGluZyBmb3IgcG9zaXRpb25pbmcgYW5kIGRvZXMgbm90IGhhdmUgYmx1cnJpbmVzcyBvblxuICogaGlnaCBEUEkgc2NyZWVucy5cbiAqXG4gKiBPbmx5IGhvcml6b250YWwgcGxhY2VtZW50IGFuZCBsZWZ0L3JpZ2h0IHZhbHVlcyBuZWVkIHRvIGJlIGNvbnNpZGVyZWQuXG4gKi9cbmZ1bmN0aW9uIGdldFJvdW5kZWRPZmZzZXRzKGRhdGEsIHNob3VsZFJvdW5kKSB7XG4gIHZhciBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXIsXG4gICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZTtcbiAgdmFyIHJvdW5kID0gTWF0aC5yb3VuZCxcbiAgICAgIGZsb29yID0gTWF0aC5mbG9vcjtcblxuICB2YXIgbm9Sb3VuZCA9IGZ1bmN0aW9uIG5vUm91bmQodikge1xuICAgIHJldHVybiB2O1xuICB9O1xuXG4gIHZhciByZWZlcmVuY2VXaWR0aCA9IHJvdW5kKHJlZmVyZW5jZS53aWR0aCk7XG4gIHZhciBwb3BwZXJXaWR0aCA9IHJvdW5kKHBvcHBlci53aWR0aCk7XG5cbiAgdmFyIGlzVmVydGljYWwgPSBbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKGRhdGEucGxhY2VtZW50KSAhPT0gLTE7XG4gIHZhciBpc1ZhcmlhdGlvbiA9IGRhdGEucGxhY2VtZW50LmluZGV4T2YoJy0nKSAhPT0gLTE7XG4gIHZhciBzYW1lV2lkdGhQYXJpdHkgPSByZWZlcmVuY2VXaWR0aCAlIDIgPT09IHBvcHBlcldpZHRoICUgMjtcbiAgdmFyIGJvdGhPZGRXaWR0aCA9IHJlZmVyZW5jZVdpZHRoICUgMiA9PT0gMSAmJiBwb3BwZXJXaWR0aCAlIDIgPT09IDE7XG5cbiAgdmFyIGhvcml6b250YWxUb0ludGVnZXIgPSAhc2hvdWxkUm91bmQgPyBub1JvdW5kIDogaXNWZXJ0aWNhbCB8fCBpc1ZhcmlhdGlvbiB8fCBzYW1lV2lkdGhQYXJpdHkgPyByb3VuZCA6IGZsb29yO1xuICB2YXIgdmVydGljYWxUb0ludGVnZXIgPSAhc2hvdWxkUm91bmQgPyBub1JvdW5kIDogcm91bmQ7XG5cbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiBob3Jpem9udGFsVG9JbnRlZ2VyKGJvdGhPZGRXaWR0aCAmJiAhaXNWYXJpYXRpb24gJiYgc2hvdWxkUm91bmQgPyBwb3BwZXIubGVmdCAtIDEgOiBwb3BwZXIubGVmdCksXG4gICAgdG9wOiB2ZXJ0aWNhbFRvSW50ZWdlcihwb3BwZXIudG9wKSxcbiAgICBib3R0b206IHZlcnRpY2FsVG9JbnRlZ2VyKHBvcHBlci5ib3R0b20pLFxuICAgIHJpZ2h0OiBob3Jpem9udGFsVG9JbnRlZ2VyKHBvcHBlci5yaWdodClcbiAgfTtcbn1cblxudmFyIGlzRmlyZWZveCA9IGlzQnJvd3NlciAmJiAvRmlyZWZveC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVTdHlsZShkYXRhLCBvcHRpb25zKSB7XG4gIHZhciB4ID0gb3B0aW9ucy54LFxuICAgICAgeSA9IG9wdGlvbnMueTtcbiAgdmFyIHBvcHBlciA9IGRhdGEub2Zmc2V0cy5wb3BwZXI7XG5cbiAgLy8gUmVtb3ZlIHRoaXMgbGVnYWN5IHN1cHBvcnQgaW4gUG9wcGVyLmpzIHYyXG5cbiAgdmFyIGxlZ2FjeUdwdUFjY2VsZXJhdGlvbk9wdGlvbiA9IGZpbmQoZGF0YS5pbnN0YW5jZS5tb2RpZmllcnMsIGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIHJldHVybiBtb2RpZmllci5uYW1lID09PSAnYXBwbHlTdHlsZSc7XG4gIH0pLmdwdUFjY2VsZXJhdGlvbjtcbiAgaWYgKGxlZ2FjeUdwdUFjY2VsZXJhdGlvbk9wdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBgZ3B1QWNjZWxlcmF0aW9uYCBvcHRpb24gbW92ZWQgdG8gYGNvbXB1dGVTdHlsZWAgbW9kaWZpZXIgYW5kIHdpbGwgbm90IGJlIHN1cHBvcnRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgUG9wcGVyLmpzIScpO1xuICB9XG4gIHZhciBncHVBY2NlbGVyYXRpb24gPSBsZWdhY3lHcHVBY2NlbGVyYXRpb25PcHRpb24gIT09IHVuZGVmaW5lZCA/IGxlZ2FjeUdwdUFjY2VsZXJhdGlvbk9wdGlvbiA6IG9wdGlvbnMuZ3B1QWNjZWxlcmF0aW9uO1xuXG4gIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoZGF0YS5pbnN0YW5jZS5wb3BwZXIpO1xuICB2YXIgb2Zmc2V0UGFyZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQpO1xuXG4gIC8vIFN0eWxlc1xuICB2YXIgc3R5bGVzID0ge1xuICAgIHBvc2l0aW9uOiBwb3BwZXIucG9zaXRpb25cbiAgfTtcblxuICB2YXIgb2Zmc2V0cyA9IGdldFJvdW5kZWRPZmZzZXRzKGRhdGEsIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIDwgMiB8fCAhaXNGaXJlZm94KTtcblxuICB2YXIgc2lkZUEgPSB4ID09PSAnYm90dG9tJyA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gIHZhciBzaWRlQiA9IHkgPT09ICdyaWdodCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuXG4gIC8vIGlmIGdwdUFjY2VsZXJhdGlvbiBpcyBzZXQgdG8gYHRydWVgIGFuZCB0cmFuc2Zvcm0gaXMgc3VwcG9ydGVkLFxuICAvLyAgd2UgdXNlIGB0cmFuc2xhdGUzZGAgdG8gYXBwbHkgdGhlIHBvc2l0aW9uIHRvIHRoZSBwb3BwZXIgd2VcbiAgLy8gYXV0b21hdGljYWxseSB1c2UgdGhlIHN1cHBvcnRlZCBwcmVmaXhlZCB2ZXJzaW9uIGlmIG5lZWRlZFxuICB2YXIgcHJlZml4ZWRQcm9wZXJ0eSA9IGdldFN1cHBvcnRlZFByb3BlcnR5TmFtZSgndHJhbnNmb3JtJyk7XG5cbiAgLy8gbm93LCBsZXQncyBtYWtlIGEgc3RlcCBiYWNrIGFuZCBsb29rIGF0IHRoaXMgY29kZSBjbG9zZWx5ICh3dGY/KVxuICAvLyBJZiB0aGUgY29udGVudCBvZiB0aGUgcG9wcGVyIGdyb3dzIG9uY2UgaXQncyBiZWVuIHBvc2l0aW9uZWQsIGl0XG4gIC8vIG1heSBoYXBwZW4gdGhhdCB0aGUgcG9wcGVyIGdldHMgbWlzcGxhY2VkIGJlY2F1c2Ugb2YgdGhlIG5ldyBjb250ZW50XG4gIC8vIG92ZXJmbG93aW5nIGl0cyByZWZlcmVuY2UgZWxlbWVudFxuICAvLyBUbyBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIHByb3ZpZGUgdHdvIG9wdGlvbnMgKHggYW5kIHkpLCB3aGljaCBhbGxvd1xuICAvLyB0aGUgY29uc3VtZXIgdG8gZGVmaW5lIHRoZSBvZmZzZXQgb3JpZ2luLlxuICAvLyBJZiB3ZSBwb3NpdGlvbiBhIHBvcHBlciBvbiB0b3Agb2YgYSByZWZlcmVuY2UgZWxlbWVudCwgd2UgY2FuIHNldFxuICAvLyBgeGAgdG8gYHRvcGAgdG8gbWFrZSB0aGUgcG9wcGVyIGdyb3cgdG93YXJkcyBpdHMgdG9wIGluc3RlYWQgb2ZcbiAgLy8gaXRzIGJvdHRvbS5cbiAgdmFyIGxlZnQgPSB2b2lkIDAsXG4gICAgICB0b3AgPSB2b2lkIDA7XG4gIGlmIChzaWRlQSA9PT0gJ2JvdHRvbScpIHtcbiAgICAvLyB3aGVuIG9mZnNldFBhcmVudCBpcyA8aHRtbD4gdGhlIHBvc2l0aW9uaW5nIGlzIHJlbGF0aXZlIHRvIHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiAoZXhjbHVkaW5nIHRoZSBzY3JvbGxiYXIpXG4gICAgLy8gYW5kIG5vdCB0aGUgYm90dG9tIG9mIHRoZSBodG1sIGVsZW1lbnRcbiAgICBpZiAob2Zmc2V0UGFyZW50Lm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgIHRvcCA9IC1vZmZzZXRQYXJlbnQuY2xpZW50SGVpZ2h0ICsgb2Zmc2V0cy5ib3R0b207XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvcCA9IC1vZmZzZXRQYXJlbnRSZWN0LmhlaWdodCArIG9mZnNldHMuYm90dG9tO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0b3AgPSBvZmZzZXRzLnRvcDtcbiAgfVxuICBpZiAoc2lkZUIgPT09ICdyaWdodCcpIHtcbiAgICBpZiAob2Zmc2V0UGFyZW50Lm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgIGxlZnQgPSAtb2Zmc2V0UGFyZW50LmNsaWVudFdpZHRoICsgb2Zmc2V0cy5yaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVmdCA9IC1vZmZzZXRQYXJlbnRSZWN0LndpZHRoICsgb2Zmc2V0cy5yaWdodDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGVmdCA9IG9mZnNldHMubGVmdDtcbiAgfVxuICBpZiAoZ3B1QWNjZWxlcmF0aW9uICYmIHByZWZpeGVkUHJvcGVydHkpIHtcbiAgICBzdHlsZXNbcHJlZml4ZWRQcm9wZXJ0eV0gPSAndHJhbnNsYXRlM2QoJyArIGxlZnQgKyAncHgsICcgKyB0b3AgKyAncHgsIDApJztcbiAgICBzdHlsZXNbc2lkZUFdID0gMDtcbiAgICBzdHlsZXNbc2lkZUJdID0gMDtcbiAgICBzdHlsZXMud2lsbENoYW5nZSA9ICd0cmFuc2Zvcm0nO1xuICB9IGVsc2Uge1xuICAgIC8vIG90aHdlcmlzZSwgd2UgdXNlIHRoZSBzdGFuZGFyZCBgdG9wYCwgYGxlZnRgLCBgYm90dG9tYCBhbmQgYHJpZ2h0YCBwcm9wZXJ0aWVzXG4gICAgdmFyIGludmVydFRvcCA9IHNpZGVBID09PSAnYm90dG9tJyA/IC0xIDogMTtcbiAgICB2YXIgaW52ZXJ0TGVmdCA9IHNpZGVCID09PSAncmlnaHQnID8gLTEgOiAxO1xuICAgIHN0eWxlc1tzaWRlQV0gPSB0b3AgKiBpbnZlcnRUb3A7XG4gICAgc3R5bGVzW3NpZGVCXSA9IGxlZnQgKiBpbnZlcnRMZWZ0O1xuICAgIHN0eWxlcy53aWxsQ2hhbmdlID0gc2lkZUEgKyAnLCAnICsgc2lkZUI7XG4gIH1cblxuICAvLyBBdHRyaWJ1dGVzXG4gIHZhciBhdHRyaWJ1dGVzID0ge1xuICAgICd4LXBsYWNlbWVudCc6IGRhdGEucGxhY2VtZW50XG4gIH07XG5cbiAgLy8gVXBkYXRlIGBkYXRhYCBhdHRyaWJ1dGVzLCBzdHlsZXMgYW5kIGFycm93U3R5bGVzXG4gIGRhdGEuYXR0cmlidXRlcyA9IF9leHRlbmRzKHt9LCBhdHRyaWJ1dGVzLCBkYXRhLmF0dHJpYnV0ZXMpO1xuICBkYXRhLnN0eWxlcyA9IF9leHRlbmRzKHt9LCBzdHlsZXMsIGRhdGEuc3R5bGVzKTtcbiAgZGF0YS5hcnJvd1N0eWxlcyA9IF9leHRlbmRzKHt9LCBkYXRhLm9mZnNldHMuYXJyb3csIGRhdGEuYXJyb3dTdHlsZXMpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEhlbHBlciB1c2VkIHRvIGtub3cgaWYgdGhlIGdpdmVuIG1vZGlmaWVyIGRlcGVuZHMgZnJvbSBhbm90aGVyIG9uZS48YnIgLz5cbiAqIEl0IGNoZWNrcyBpZiB0aGUgbmVlZGVkIG1vZGlmaWVyIGlzIGxpc3RlZCBhbmQgZW5hYmxlZC5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7QXJyYXl9IG1vZGlmaWVycyAtIGxpc3Qgb2YgbW9kaWZpZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdGluZ05hbWUgLSBuYW1lIG9mIHJlcXVlc3RpbmcgbW9kaWZpZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0ZWROYW1lIC0gbmFtZSBvZiByZXF1ZXN0ZWQgbW9kaWZpZXJcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc01vZGlmaWVyUmVxdWlyZWQobW9kaWZpZXJzLCByZXF1ZXN0aW5nTmFtZSwgcmVxdWVzdGVkTmFtZSkge1xuICB2YXIgcmVxdWVzdGluZyA9IGZpbmQobW9kaWZpZXJzLCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBuYW1lID0gX3JlZi5uYW1lO1xuICAgIHJldHVybiBuYW1lID09PSByZXF1ZXN0aW5nTmFtZTtcbiAgfSk7XG5cbiAgdmFyIGlzUmVxdWlyZWQgPSAhIXJlcXVlc3RpbmcgJiYgbW9kaWZpZXJzLnNvbWUoZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgcmV0dXJuIG1vZGlmaWVyLm5hbWUgPT09IHJlcXVlc3RlZE5hbWUgJiYgbW9kaWZpZXIuZW5hYmxlZCAmJiBtb2RpZmllci5vcmRlciA8IHJlcXVlc3Rpbmcub3JkZXI7XG4gIH0pO1xuXG4gIGlmICghaXNSZXF1aXJlZCkge1xuICAgIHZhciBfcmVxdWVzdGluZyA9ICdgJyArIHJlcXVlc3RpbmdOYW1lICsgJ2AnO1xuICAgIHZhciByZXF1ZXN0ZWQgPSAnYCcgKyByZXF1ZXN0ZWROYW1lICsgJ2AnO1xuICAgIGNvbnNvbGUud2FybihyZXF1ZXN0ZWQgKyAnIG1vZGlmaWVyIGlzIHJlcXVpcmVkIGJ5ICcgKyBfcmVxdWVzdGluZyArICcgbW9kaWZpZXIgaW4gb3JkZXIgdG8gd29yaywgYmUgc3VyZSB0byBpbmNsdWRlIGl0IGJlZm9yZSAnICsgX3JlcXVlc3RpbmcgKyAnIScpO1xuICB9XG4gIHJldHVybiBpc1JlcXVpcmVkO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gYXJyb3coZGF0YSwgb3B0aW9ucykge1xuICB2YXIgX2RhdGEkb2Zmc2V0cyRhcnJvdztcblxuICAvLyBhcnJvdyBkZXBlbmRzIG9uIGtlZXBUb2dldGhlciBpbiBvcmRlciB0byB3b3JrXG4gIGlmICghaXNNb2RpZmllclJlcXVpcmVkKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCAnYXJyb3cnLCAna2VlcFRvZ2V0aGVyJykpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHZhciBhcnJvd0VsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQ7XG5cbiAgLy8gaWYgYXJyb3dFbGVtZW50IGlzIGEgc3RyaW5nLCBzdXBwb3NlIGl0J3MgYSBDU1Mgc2VsZWN0b3JcbiAgaWYgKHR5cGVvZiBhcnJvd0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyb3dFbGVtZW50ID0gZGF0YS5pbnN0YW5jZS5wb3BwZXIucXVlcnlTZWxlY3RvcihhcnJvd0VsZW1lbnQpO1xuXG4gICAgLy8gaWYgYXJyb3dFbGVtZW50IGlzIG5vdCBmb3VuZCwgZG9uJ3QgcnVuIHRoZSBtb2RpZmllclxuICAgIGlmICghYXJyb3dFbGVtZW50KSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgdGhlIGFycm93RWxlbWVudCBpc24ndCBhIHF1ZXJ5IHNlbGVjdG9yIHdlIG11c3QgY2hlY2sgdGhhdCB0aGVcbiAgICAvLyBwcm92aWRlZCBET00gbm9kZSBpcyBjaGlsZCBvZiBpdHMgcG9wcGVyIG5vZGVcbiAgICBpZiAoIWRhdGEuaW5zdGFuY2UucG9wcGVyLmNvbnRhaW5zKGFycm93RWxlbWVudCkpIHtcbiAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogYGFycm93LmVsZW1lbnRgIG11c3QgYmUgY2hpbGQgb2YgaXRzIHBvcHBlciBlbGVtZW50IScpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICB9XG5cbiAgdmFyIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gIHZhciBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXIsXG4gICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZTtcblxuICB2YXIgaXNWZXJ0aWNhbCA9IFsnbGVmdCcsICdyaWdodCddLmluZGV4T2YocGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgdmFyIGxlbiA9IGlzVmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gIHZhciBzaWRlQ2FwaXRhbGl6ZWQgPSBpc1ZlcnRpY2FsID8gJ1RvcCcgOiAnTGVmdCc7XG4gIHZhciBzaWRlID0gc2lkZUNhcGl0YWxpemVkLnRvTG93ZXJDYXNlKCk7XG4gIHZhciBhbHRTaWRlID0gaXNWZXJ0aWNhbCA/ICdsZWZ0JyA6ICd0b3AnO1xuICB2YXIgb3BTaWRlID0gaXNWZXJ0aWNhbCA/ICdib3R0b20nIDogJ3JpZ2h0JztcbiAgdmFyIGFycm93RWxlbWVudFNpemUgPSBnZXRPdXRlclNpemVzKGFycm93RWxlbWVudClbbGVuXTtcblxuICAvL1xuICAvLyBleHRlbmRzIGtlZXBUb2dldGhlciBiZWhhdmlvciBtYWtpbmcgc3VyZSB0aGUgcG9wcGVyIGFuZCBpdHNcbiAgLy8gcmVmZXJlbmNlIGhhdmUgZW5vdWdoIHBpeGVscyBpbiBjb25qdW5jdGlvblxuICAvL1xuXG4gIC8vIHRvcC9sZWZ0IHNpZGVcbiAgaWYgKHJlZmVyZW5jZVtvcFNpZGVdIC0gYXJyb3dFbGVtZW50U2l6ZSA8IHBvcHBlcltzaWRlXSkge1xuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbc2lkZV0gLT0gcG9wcGVyW3NpZGVdIC0gKHJlZmVyZW5jZVtvcFNpZGVdIC0gYXJyb3dFbGVtZW50U2l6ZSk7XG4gIH1cbiAgLy8gYm90dG9tL3JpZ2h0IHNpZGVcbiAgaWYgKHJlZmVyZW5jZVtzaWRlXSArIGFycm93RWxlbWVudFNpemUgPiBwb3BwZXJbb3BTaWRlXSkge1xuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbc2lkZV0gKz0gcmVmZXJlbmNlW3NpZGVdICsgYXJyb3dFbGVtZW50U2l6ZSAtIHBvcHBlcltvcFNpZGVdO1xuICB9XG4gIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBnZXRDbGllbnRSZWN0KGRhdGEub2Zmc2V0cy5wb3BwZXIpO1xuXG4gIC8vIGNvbXB1dGUgY2VudGVyIG9mIHRoZSBwb3BwZXJcbiAgdmFyIGNlbnRlciA9IHJlZmVyZW5jZVtzaWRlXSArIHJlZmVyZW5jZVtsZW5dIC8gMiAtIGFycm93RWxlbWVudFNpemUgLyAyO1xuXG4gIC8vIENvbXB1dGUgdGhlIHNpZGVWYWx1ZSB1c2luZyB0aGUgdXBkYXRlZCBwb3BwZXIgb2Zmc2V0c1xuICAvLyB0YWtlIHBvcHBlciBtYXJnaW4gaW4gYWNjb3VudCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhpcyBpbmZvIGF2YWlsYWJsZVxuICB2YXIgY3NzID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGRhdGEuaW5zdGFuY2UucG9wcGVyKTtcbiAgdmFyIHBvcHBlck1hcmdpblNpZGUgPSBwYXJzZUZsb2F0KGNzc1snbWFyZ2luJyArIHNpZGVDYXBpdGFsaXplZF0pO1xuICB2YXIgcG9wcGVyQm9yZGVyU2lkZSA9IHBhcnNlRmxvYXQoY3NzWydib3JkZXInICsgc2lkZUNhcGl0YWxpemVkICsgJ1dpZHRoJ10pO1xuICB2YXIgc2lkZVZhbHVlID0gY2VudGVyIC0gZGF0YS5vZmZzZXRzLnBvcHBlcltzaWRlXSAtIHBvcHBlck1hcmdpblNpZGUgLSBwb3BwZXJCb3JkZXJTaWRlO1xuXG4gIC8vIHByZXZlbnQgYXJyb3dFbGVtZW50IGZyb20gYmVpbmcgcGxhY2VkIG5vdCBjb250aWd1b3VzbHkgdG8gaXRzIHBvcHBlclxuICBzaWRlVmFsdWUgPSBNYXRoLm1heChNYXRoLm1pbihwb3BwZXJbbGVuXSAtIGFycm93RWxlbWVudFNpemUsIHNpZGVWYWx1ZSksIDApO1xuXG4gIGRhdGEuYXJyb3dFbGVtZW50ID0gYXJyb3dFbGVtZW50O1xuICBkYXRhLm9mZnNldHMuYXJyb3cgPSAoX2RhdGEkb2Zmc2V0cyRhcnJvdyA9IHt9LCBkZWZpbmVQcm9wZXJ0eShfZGF0YSRvZmZzZXRzJGFycm93LCBzaWRlLCBNYXRoLnJvdW5kKHNpZGVWYWx1ZSkpLCBkZWZpbmVQcm9wZXJ0eShfZGF0YSRvZmZzZXRzJGFycm93LCBhbHRTaWRlLCAnJyksIF9kYXRhJG9mZnNldHMkYXJyb3cpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEdldCB0aGUgb3Bwb3NpdGUgcGxhY2VtZW50IHZhcmlhdGlvbiBvZiB0aGUgZ2l2ZW4gb25lXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gcGxhY2VtZW50IHZhcmlhdGlvblxuICogQHJldHVybnMge1N0cmluZ30gZmxpcHBlZCBwbGFjZW1lbnQgdmFyaWF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uKHZhcmlhdGlvbikge1xuICBpZiAodmFyaWF0aW9uID09PSAnZW5kJykge1xuICAgIHJldHVybiAnc3RhcnQnO1xuICB9IGVsc2UgaWYgKHZhcmlhdGlvbiA9PT0gJ3N0YXJ0Jykge1xuICAgIHJldHVybiAnZW5kJztcbiAgfVxuICByZXR1cm4gdmFyaWF0aW9uO1xufVxuXG4vKipcbiAqIExpc3Qgb2YgYWNjZXB0ZWQgcGxhY2VtZW50cyB0byB1c2UgYXMgdmFsdWVzIG9mIHRoZSBgcGxhY2VtZW50YCBvcHRpb24uPGJyIC8+XG4gKiBWYWxpZCBwbGFjZW1lbnRzIGFyZTpcbiAqIC0gYGF1dG9gXG4gKiAtIGB0b3BgXG4gKiAtIGByaWdodGBcbiAqIC0gYGJvdHRvbWBcbiAqIC0gYGxlZnRgXG4gKlxuICogRWFjaCBwbGFjZW1lbnQgY2FuIGhhdmUgYSB2YXJpYXRpb24gZnJvbSB0aGlzIGxpc3Q6XG4gKiAtIGAtc3RhcnRgXG4gKiAtIGAtZW5kYFxuICpcbiAqIFZhcmlhdGlvbnMgYXJlIGludGVycHJldGVkIGVhc2lseSBpZiB5b3UgdGhpbmsgb2YgdGhlbSBhcyB0aGUgbGVmdCB0byByaWdodFxuICogd3JpdHRlbiBsYW5ndWFnZXMuIEhvcml6b250YWxseSAoYHRvcGAgYW5kIGBib3R0b21gKSwgYHN0YXJ0YCBpcyBsZWZ0IGFuZCBgZW5kYFxuICogaXMgcmlnaHQuPGJyIC8+XG4gKiBWZXJ0aWNhbGx5IChgbGVmdGAgYW5kIGByaWdodGApLCBgc3RhcnRgIGlzIHRvcCBhbmQgYGVuZGAgaXMgYm90dG9tLlxuICpcbiAqIFNvbWUgdmFsaWQgZXhhbXBsZXMgYXJlOlxuICogLSBgdG9wLWVuZGAgKG9uIHRvcCBvZiByZWZlcmVuY2UsIHJpZ2h0IGFsaWduZWQpXG4gKiAtIGByaWdodC1zdGFydGAgKG9uIHJpZ2h0IG9mIHJlZmVyZW5jZSwgdG9wIGFsaWduZWQpXG4gKiAtIGBib3R0b21gIChvbiBib3R0b20sIGNlbnRlcmVkKVxuICogLSBgYXV0by1lbmRgIChvbiB0aGUgc2lkZSB3aXRoIG1vcmUgc3BhY2UgYXZhaWxhYmxlLCBhbGlnbm1lbnQgZGVwZW5kcyBieSBwbGFjZW1lbnQpXG4gKlxuICogQHN0YXRpY1xuICogQHR5cGUge0FycmF5fVxuICogQGVudW0ge1N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1ldGhvZCBwbGFjZW1lbnRzXG4gKiBAbWVtYmVyb2YgUG9wcGVyXG4gKi9cbnZhciBwbGFjZW1lbnRzID0gWydhdXRvLXN0YXJ0JywgJ2F1dG8nLCAnYXV0by1lbmQnLCAndG9wLXN0YXJ0JywgJ3RvcCcsICd0b3AtZW5kJywgJ3JpZ2h0LXN0YXJ0JywgJ3JpZ2h0JywgJ3JpZ2h0LWVuZCcsICdib3R0b20tZW5kJywgJ2JvdHRvbScsICdib3R0b20tc3RhcnQnLCAnbGVmdC1lbmQnLCAnbGVmdCcsICdsZWZ0LXN0YXJ0J107XG5cbi8vIEdldCByaWQgb2YgYGF1dG9gIGBhdXRvLXN0YXJ0YCBhbmQgYGF1dG8tZW5kYFxudmFyIHZhbGlkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuc2xpY2UoMyk7XG5cbi8qKlxuICogR2l2ZW4gYW4gaW5pdGlhbCBwbGFjZW1lbnQsIHJldHVybnMgYWxsIHRoZSBzdWJzZXF1ZW50IHBsYWNlbWVudHNcbiAqIGNsb2Nrd2lzZSAob3IgY291bnRlci1jbG9ja3dpc2UpLlxuICpcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBwbGFjZW1lbnQgLSBBIHZhbGlkIHBsYWNlbWVudCAoaXQgYWNjZXB0cyB2YXJpYXRpb25zKVxuICogQGFyZ3VtZW50IHtCb29sZWFufSBjb3VudGVyIC0gU2V0IHRvIHRydWUgdG8gd2FsayB0aGUgcGxhY2VtZW50cyBjb3VudGVyY2xvY2t3aXNlXG4gKiBAcmV0dXJucyB7QXJyYXl9IHBsYWNlbWVudHMgaW5jbHVkaW5nIHRoZWlyIHZhcmlhdGlvbnNcbiAqL1xuZnVuY3Rpb24gY2xvY2t3aXNlKHBsYWNlbWVudCkge1xuICB2YXIgY291bnRlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgdmFyIGluZGV4ID0gdmFsaWRQbGFjZW1lbnRzLmluZGV4T2YocGxhY2VtZW50KTtcbiAgdmFyIGFyciA9IHZhbGlkUGxhY2VtZW50cy5zbGljZShpbmRleCArIDEpLmNvbmNhdCh2YWxpZFBsYWNlbWVudHMuc2xpY2UoMCwgaW5kZXgpKTtcbiAgcmV0dXJuIGNvdW50ZXIgPyBhcnIucmV2ZXJzZSgpIDogYXJyO1xufVxuXG52YXIgQkVIQVZJT1JTID0ge1xuICBGTElQOiAnZmxpcCcsXG4gIENMT0NLV0lTRTogJ2Nsb2Nrd2lzZScsXG4gIENPVU5URVJDTE9DS1dJU0U6ICdjb3VudGVyY2xvY2t3aXNlJ1xufTtcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGZsaXAoZGF0YSwgb3B0aW9ucykge1xuICAvLyBpZiBgaW5uZXJgIG1vZGlmaWVyIGlzIGVuYWJsZWQsIHdlIGNhbid0IHVzZSB0aGUgYGZsaXBgIG1vZGlmaWVyXG4gIGlmIChpc01vZGlmaWVyRW5hYmxlZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgJ2lubmVyJykpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGlmIChkYXRhLmZsaXBwZWQgJiYgZGF0YS5wbGFjZW1lbnQgPT09IGRhdGEub3JpZ2luYWxQbGFjZW1lbnQpIHtcbiAgICAvLyBzZWVtcyBsaWtlIGZsaXAgaXMgdHJ5aW5nIHRvIGxvb3AsIHByb2JhYmx5IHRoZXJlJ3Mgbm90IGVub3VnaCBzcGFjZSBvbiBhbnkgb2YgdGhlIGZsaXBwYWJsZSBzaWRlc1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgdmFyIGJvdW5kYXJpZXMgPSBnZXRCb3VuZGFyaWVzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLmluc3RhbmNlLnJlZmVyZW5jZSwgb3B0aW9ucy5wYWRkaW5nLCBvcHRpb25zLmJvdW5kYXJpZXNFbGVtZW50LCBkYXRhLnBvc2l0aW9uRml4ZWQpO1xuXG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgcGxhY2VtZW50T3Bwb3NpdGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICB2YXIgdmFyaWF0aW9uID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVsxXSB8fCAnJztcblxuICB2YXIgZmxpcE9yZGVyID0gW107XG5cbiAgc3dpdGNoIChvcHRpb25zLmJlaGF2aW9yKSB7XG4gICAgY2FzZSBCRUhBVklPUlMuRkxJUDpcbiAgICAgIGZsaXBPcmRlciA9IFtwbGFjZW1lbnQsIHBsYWNlbWVudE9wcG9zaXRlXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQkVIQVZJT1JTLkNMT0NLV0lTRTpcbiAgICAgIGZsaXBPcmRlciA9IGNsb2Nrd2lzZShwbGFjZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBCRUhBVklPUlMuQ09VTlRFUkNMT0NLV0lTRTpcbiAgICAgIGZsaXBPcmRlciA9IGNsb2Nrd2lzZShwbGFjZW1lbnQsIHRydWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGZsaXBPcmRlciA9IG9wdGlvbnMuYmVoYXZpb3I7XG4gIH1cblxuICBmbGlwT3JkZXIuZm9yRWFjaChmdW5jdGlvbiAoc3RlcCwgaW5kZXgpIHtcbiAgICBpZiAocGxhY2VtZW50ICE9PSBzdGVwIHx8IGZsaXBPcmRlci5sZW5ndGggPT09IGluZGV4ICsgMSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgICBwbGFjZW1lbnRPcHBvc2l0ZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCk7XG5cbiAgICB2YXIgcG9wcGVyT2Zmc2V0cyA9IGRhdGEub2Zmc2V0cy5wb3BwZXI7XG4gICAgdmFyIHJlZk9mZnNldHMgPSBkYXRhLm9mZnNldHMucmVmZXJlbmNlO1xuXG4gICAgLy8gdXNpbmcgZmxvb3IgYmVjYXVzZSB0aGUgcmVmZXJlbmNlIG9mZnNldHMgbWF5IGNvbnRhaW4gZGVjaW1hbHMgd2UgYXJlIG5vdCBnb2luZyB0byBjb25zaWRlciBoZXJlXG4gICAgdmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbiAgICB2YXIgb3ZlcmxhcHNSZWYgPSBwbGFjZW1lbnQgPT09ICdsZWZ0JyAmJiBmbG9vcihwb3BwZXJPZmZzZXRzLnJpZ2h0KSA+IGZsb29yKHJlZk9mZnNldHMubGVmdCkgfHwgcGxhY2VtZW50ID09PSAncmlnaHQnICYmIGZsb29yKHBvcHBlck9mZnNldHMubGVmdCkgPCBmbG9vcihyZWZPZmZzZXRzLnJpZ2h0KSB8fCBwbGFjZW1lbnQgPT09ICd0b3AnICYmIGZsb29yKHBvcHBlck9mZnNldHMuYm90dG9tKSA+IGZsb29yKHJlZk9mZnNldHMudG9wKSB8fCBwbGFjZW1lbnQgPT09ICdib3R0b20nICYmIGZsb29yKHBvcHBlck9mZnNldHMudG9wKSA8IGZsb29yKHJlZk9mZnNldHMuYm90dG9tKTtcblxuICAgIHZhciBvdmVyZmxvd3NMZWZ0ID0gZmxvb3IocG9wcGVyT2Zmc2V0cy5sZWZ0KSA8IGZsb29yKGJvdW5kYXJpZXMubGVmdCk7XG4gICAgdmFyIG92ZXJmbG93c1JpZ2h0ID0gZmxvb3IocG9wcGVyT2Zmc2V0cy5yaWdodCkgPiBmbG9vcihib3VuZGFyaWVzLnJpZ2h0KTtcbiAgICB2YXIgb3ZlcmZsb3dzVG9wID0gZmxvb3IocG9wcGVyT2Zmc2V0cy50b3ApIDwgZmxvb3IoYm91bmRhcmllcy50b3ApO1xuICAgIHZhciBvdmVyZmxvd3NCb3R0b20gPSBmbG9vcihwb3BwZXJPZmZzZXRzLmJvdHRvbSkgPiBmbG9vcihib3VuZGFyaWVzLmJvdHRvbSk7XG5cbiAgICB2YXIgb3ZlcmZsb3dzQm91bmRhcmllcyA9IHBsYWNlbWVudCA9PT0gJ2xlZnQnICYmIG92ZXJmbG93c0xlZnQgfHwgcGxhY2VtZW50ID09PSAncmlnaHQnICYmIG92ZXJmbG93c1JpZ2h0IHx8IHBsYWNlbWVudCA9PT0gJ3RvcCcgJiYgb3ZlcmZsb3dzVG9wIHx8IHBsYWNlbWVudCA9PT0gJ2JvdHRvbScgJiYgb3ZlcmZsb3dzQm90dG9tO1xuXG4gICAgLy8gZmxpcCB0aGUgdmFyaWF0aW9uIGlmIHJlcXVpcmVkXG4gICAgdmFyIGlzVmVydGljYWwgPSBbJ3RvcCcsICdib3R0b20nXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xO1xuXG4gICAgLy8gZmxpcHMgdmFyaWF0aW9uIGlmIHJlZmVyZW5jZSBlbGVtZW50IG92ZXJmbG93cyBib3VuZGFyaWVzXG4gICAgdmFyIGZsaXBwZWRWYXJpYXRpb25CeVJlZiA9ICEhb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyAmJiAoaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdzdGFydCcgJiYgb3ZlcmZsb3dzTGVmdCB8fCBpc1ZlcnRpY2FsICYmIHZhcmlhdGlvbiA9PT0gJ2VuZCcgJiYgb3ZlcmZsb3dzUmlnaHQgfHwgIWlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnc3RhcnQnICYmIG92ZXJmbG93c1RvcCB8fCAhaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdlbmQnICYmIG92ZXJmbG93c0JvdHRvbSk7XG5cbiAgICAvLyBmbGlwcyB2YXJpYXRpb24gaWYgcG9wcGVyIGNvbnRlbnQgb3ZlcmZsb3dzIGJvdW5kYXJpZXNcbiAgICB2YXIgZmxpcHBlZFZhcmlhdGlvbkJ5Q29udGVudCA9ICEhb3B0aW9ucy5mbGlwVmFyaWF0aW9uc0J5Q29udGVudCAmJiAoaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdzdGFydCcgJiYgb3ZlcmZsb3dzUmlnaHQgfHwgaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdlbmQnICYmIG92ZXJmbG93c0xlZnQgfHwgIWlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnc3RhcnQnICYmIG92ZXJmbG93c0JvdHRvbSB8fCAhaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdlbmQnICYmIG92ZXJmbG93c1RvcCk7XG5cbiAgICB2YXIgZmxpcHBlZFZhcmlhdGlvbiA9IGZsaXBwZWRWYXJpYXRpb25CeVJlZiB8fCBmbGlwcGVkVmFyaWF0aW9uQnlDb250ZW50O1xuXG4gICAgaWYgKG92ZXJsYXBzUmVmIHx8IG92ZXJmbG93c0JvdW5kYXJpZXMgfHwgZmxpcHBlZFZhcmlhdGlvbikge1xuICAgICAgLy8gdGhpcyBib29sZWFuIHRvIGRldGVjdCBhbnkgZmxpcCBsb29wXG4gICAgICBkYXRhLmZsaXBwZWQgPSB0cnVlO1xuXG4gICAgICBpZiAob3ZlcmxhcHNSZWYgfHwgb3ZlcmZsb3dzQm91bmRhcmllcykge1xuICAgICAgICBwbGFjZW1lbnQgPSBmbGlwT3JkZXJbaW5kZXggKyAxXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZsaXBwZWRWYXJpYXRpb24pIHtcbiAgICAgICAgdmFyaWF0aW9uID0gZ2V0T3Bwb3NpdGVWYXJpYXRpb24odmFyaWF0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZGF0YS5wbGFjZW1lbnQgPSBwbGFjZW1lbnQgKyAodmFyaWF0aW9uID8gJy0nICsgdmFyaWF0aW9uIDogJycpO1xuXG4gICAgICAvLyB0aGlzIG9iamVjdCBjb250YWlucyBgcG9zaXRpb25gLCB3ZSB3YW50IHRvIHByZXNlcnZlIGl0IGFsb25nIHdpdGhcbiAgICAgIC8vIGFueSBhZGRpdGlvbmFsIHByb3BlcnR5IHdlIG1heSBhZGQgaW4gdGhlIGZ1dHVyZVxuICAgICAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IF9leHRlbmRzKHt9LCBkYXRhLm9mZnNldHMucG9wcGVyLCBnZXRQb3BwZXJPZmZzZXRzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLm9mZnNldHMucmVmZXJlbmNlLCBkYXRhLnBsYWNlbWVudCkpO1xuXG4gICAgICBkYXRhID0gcnVuTW9kaWZpZXJzKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCBkYXRhLCAnZmxpcCcpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24ga2VlcFRvZ2V0aGVyKGRhdGEpIHtcbiAgdmFyIF9kYXRhJG9mZnNldHMgPSBkYXRhLm9mZnNldHMsXG4gICAgICBwb3BwZXIgPSBfZGF0YSRvZmZzZXRzLnBvcHBlcixcbiAgICAgIHJlZmVyZW5jZSA9IF9kYXRhJG9mZnNldHMucmVmZXJlbmNlO1xuXG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuICB2YXIgaXNWZXJ0aWNhbCA9IFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSAhPT0gLTE7XG4gIHZhciBzaWRlID0gaXNWZXJ0aWNhbCA/ICdyaWdodCcgOiAnYm90dG9tJztcbiAgdmFyIG9wU2lkZSA9IGlzVmVydGljYWwgPyAnbGVmdCcgOiAndG9wJztcbiAgdmFyIG1lYXN1cmVtZW50ID0gaXNWZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcblxuICBpZiAocG9wcGVyW3NpZGVdIDwgZmxvb3IocmVmZXJlbmNlW29wU2lkZV0pKSB7XG4gICAgZGF0YS5vZmZzZXRzLnBvcHBlcltvcFNpZGVdID0gZmxvb3IocmVmZXJlbmNlW29wU2lkZV0pIC0gcG9wcGVyW21lYXN1cmVtZW50XTtcbiAgfVxuICBpZiAocG9wcGVyW29wU2lkZV0gPiBmbG9vcihyZWZlcmVuY2Vbc2lkZV0pKSB7XG4gICAgZGF0YS5vZmZzZXRzLnBvcHBlcltvcFNpZGVdID0gZmxvb3IocmVmZXJlbmNlW3NpZGVdKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdmFsdWUgKyB1bml0IGludG8gYSBweCB2YWx1ZSBudW1iZXJcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIHttb2RpZmllcnN+b2Zmc2V0fVxuICogQHByaXZhdGVcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBzdHIgLSBWYWx1ZSArIHVuaXQgc3RyaW5nXG4gKiBAYXJndW1lbnQge1N0cmluZ30gbWVhc3VyZW1lbnQgLSBgaGVpZ2h0YCBvciBgd2lkdGhgXG4gKiBAYXJndW1lbnQge09iamVjdH0gcG9wcGVyT2Zmc2V0c1xuICogQGFyZ3VtZW50IHtPYmplY3R9IHJlZmVyZW5jZU9mZnNldHNcbiAqIEByZXR1cm5zIHtOdW1iZXJ8U3RyaW5nfVxuICogVmFsdWUgaW4gcGl4ZWxzLCBvciBvcmlnaW5hbCBzdHJpbmcgaWYgbm8gdmFsdWVzIHdlcmUgZXh0cmFjdGVkXG4gKi9cbmZ1bmN0aW9uIHRvVmFsdWUoc3RyLCBtZWFzdXJlbWVudCwgcG9wcGVyT2Zmc2V0cywgcmVmZXJlbmNlT2Zmc2V0cykge1xuICAvLyBzZXBhcmF0ZSB2YWx1ZSBmcm9tIHVuaXRcbiAgdmFyIHNwbGl0ID0gc3RyLm1hdGNoKC8oKD86XFwtfFxcKyk/XFxkKlxcLj9cXGQqKSguKikvKTtcbiAgdmFyIHZhbHVlID0gK3NwbGl0WzFdO1xuICB2YXIgdW5pdCA9IHNwbGl0WzJdO1xuXG4gIC8vIElmIGl0J3Mgbm90IGEgbnVtYmVyIGl0J3MgYW4gb3BlcmF0b3IsIEkgZ3Vlc3NcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBpZiAodW5pdC5pbmRleE9mKCclJykgPT09IDApIHtcbiAgICB2YXIgZWxlbWVudCA9IHZvaWQgMDtcbiAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgIGNhc2UgJyVwJzpcbiAgICAgICAgZWxlbWVudCA9IHBvcHBlck9mZnNldHM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJSc6XG4gICAgICBjYXNlICclcic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBlbGVtZW50ID0gcmVmZXJlbmNlT2Zmc2V0cztcbiAgICB9XG5cbiAgICB2YXIgcmVjdCA9IGdldENsaWVudFJlY3QoZWxlbWVudCk7XG4gICAgcmV0dXJuIHJlY3RbbWVhc3VyZW1lbnRdIC8gMTAwICogdmFsdWU7XG4gIH0gZWxzZSBpZiAodW5pdCA9PT0gJ3ZoJyB8fCB1bml0ID09PSAndncnKSB7XG4gICAgLy8gaWYgaXMgYSB2aCBvciB2dywgd2UgY2FsY3VsYXRlIHRoZSBzaXplIGJhc2VkIG9uIHRoZSB2aWV3cG9ydFxuICAgIHZhciBzaXplID0gdm9pZCAwO1xuICAgIGlmICh1bml0ID09PSAndmgnKSB7XG4gICAgICBzaXplID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaXplID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpemUgLyAxMDAgKiB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiBpcyBhbiBleHBsaWNpdCBwaXhlbCB1bml0LCB3ZSBnZXQgcmlkIG9mIHRoZSB1bml0IGFuZCBrZWVwIHRoZSB2YWx1ZVxuICAgIC8vIGlmIGlzIGFuIGltcGxpY2l0IHVuaXQsIGl0J3MgcHgsIGFuZCB3ZSByZXR1cm4ganVzdCB0aGUgdmFsdWVcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBgb2Zmc2V0YCBzdHJpbmcgdG8gZXh0cmFwb2xhdGUgYHhgIGFuZCBgeWAgbnVtZXJpYyBvZmZzZXRzLlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2Yge21vZGlmaWVyc35vZmZzZXR9XG4gKiBAcHJpdmF0ZVxuICogQGFyZ3VtZW50IHtTdHJpbmd9IG9mZnNldFxuICogQGFyZ3VtZW50IHtPYmplY3R9IHBvcHBlck9mZnNldHNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSByZWZlcmVuY2VPZmZzZXRzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gYmFzZVBsYWNlbWVudFxuICogQHJldHVybnMge0FycmF5fSBhIHR3byBjZWxscyBhcnJheSB3aXRoIHggYW5kIHkgb2Zmc2V0cyBpbiBudW1iZXJzXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT2Zmc2V0KG9mZnNldCwgcG9wcGVyT2Zmc2V0cywgcmVmZXJlbmNlT2Zmc2V0cywgYmFzZVBsYWNlbWVudCkge1xuICB2YXIgb2Zmc2V0cyA9IFswLCAwXTtcblxuICAvLyBVc2UgaGVpZ2h0IGlmIHBsYWNlbWVudCBpcyBsZWZ0IG9yIHJpZ2h0IGFuZCBpbmRleCBpcyAwIG90aGVyd2lzZSB1c2Ugd2lkdGhcbiAgLy8gaW4gdGhpcyB3YXkgdGhlIGZpcnN0IG9mZnNldCB3aWxsIHVzZSBhbiBheGlzIGFuZCB0aGUgc2Vjb25kIG9uZVxuICAvLyB3aWxsIHVzZSB0aGUgb3RoZXIgb25lXG4gIHZhciB1c2VIZWlnaHQgPSBbJ3JpZ2h0JywgJ2xlZnQnXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcblxuICAvLyBTcGxpdCB0aGUgb2Zmc2V0IHN0cmluZyB0byBvYnRhaW4gYSBsaXN0IG9mIHZhbHVlcyBhbmQgb3BlcmFuZHNcbiAgLy8gVGhlIHJlZ2V4IGFkZHJlc3NlcyB2YWx1ZXMgd2l0aCB0aGUgcGx1cyBvciBtaW51cyBzaWduIGluIGZyb250ICgrMTAsIC0yMCwgZXRjKVxuICB2YXIgZnJhZ21lbnRzID0gb2Zmc2V0LnNwbGl0KC8oXFwrfFxcLSkvKS5tYXAoZnVuY3Rpb24gKGZyYWcpIHtcbiAgICByZXR1cm4gZnJhZy50cmltKCk7XG4gIH0pO1xuXG4gIC8vIERldGVjdCBpZiB0aGUgb2Zmc2V0IHN0cmluZyBjb250YWlucyBhIHBhaXIgb2YgdmFsdWVzIG9yIGEgc2luZ2xlIG9uZVxuICAvLyB0aGV5IGNvdWxkIGJlIHNlcGFyYXRlZCBieSBjb21tYSBvciBzcGFjZVxuICB2YXIgZGl2aWRlciA9IGZyYWdtZW50cy5pbmRleE9mKGZpbmQoZnJhZ21lbnRzLCBmdW5jdGlvbiAoZnJhZykge1xuICAgIHJldHVybiBmcmFnLnNlYXJjaCgvLHxcXHMvKSAhPT0gLTE7XG4gIH0pKTtcblxuICBpZiAoZnJhZ21lbnRzW2RpdmlkZXJdICYmIGZyYWdtZW50c1tkaXZpZGVyXS5pbmRleE9mKCcsJykgPT09IC0xKSB7XG4gICAgY29uc29sZS53YXJuKCdPZmZzZXRzIHNlcGFyYXRlZCBieSB3aGl0ZSBzcGFjZShzKSBhcmUgZGVwcmVjYXRlZCwgdXNlIGEgY29tbWEgKCwpIGluc3RlYWQuJyk7XG4gIH1cblxuICAvLyBJZiBkaXZpZGVyIGlzIGZvdW5kLCB3ZSBkaXZpZGUgdGhlIGxpc3Qgb2YgdmFsdWVzIGFuZCBvcGVyYW5kcyB0byBkaXZpZGVcbiAgLy8gdGhlbSBieSBvZnNldCBYIGFuZCBZLlxuICB2YXIgc3BsaXRSZWdleCA9IC9cXHMqLFxccyp8XFxzKy87XG4gIHZhciBvcHMgPSBkaXZpZGVyICE9PSAtMSA/IFtmcmFnbWVudHMuc2xpY2UoMCwgZGl2aWRlcikuY29uY2F0KFtmcmFnbWVudHNbZGl2aWRlcl0uc3BsaXQoc3BsaXRSZWdleClbMF1dKSwgW2ZyYWdtZW50c1tkaXZpZGVyXS5zcGxpdChzcGxpdFJlZ2V4KVsxXV0uY29uY2F0KGZyYWdtZW50cy5zbGljZShkaXZpZGVyICsgMSkpXSA6IFtmcmFnbWVudHNdO1xuXG4gIC8vIENvbnZlcnQgdGhlIHZhbHVlcyB3aXRoIHVuaXRzIHRvIGFic29sdXRlIHBpeGVscyB0byBhbGxvdyBvdXIgY29tcHV0YXRpb25zXG4gIG9wcyA9IG9wcy5tYXAoZnVuY3Rpb24gKG9wLCBpbmRleCkge1xuICAgIC8vIE1vc3Qgb2YgdGhlIHVuaXRzIHJlbHkgb24gdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBwb3BwZXJcbiAgICB2YXIgbWVhc3VyZW1lbnQgPSAoaW5kZXggPT09IDEgPyAhdXNlSGVpZ2h0IDogdXNlSGVpZ2h0KSA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICB2YXIgbWVyZ2VXaXRoUHJldmlvdXMgPSBmYWxzZTtcbiAgICByZXR1cm4gb3BcbiAgICAvLyBUaGlzIGFnZ3JlZ2F0ZXMgYW55IGArYCBvciBgLWAgc2lnbiB0aGF0IGFyZW4ndCBjb25zaWRlcmVkIG9wZXJhdG9yc1xuICAgIC8vIGUuZy46IDEwICsgKzUgPT4gWzEwLCArLCArNV1cbiAgICAucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICBpZiAoYVthLmxlbmd0aCAtIDFdID09PSAnJyAmJiBbJysnLCAnLSddLmluZGV4T2YoYikgIT09IC0xKSB7XG4gICAgICAgIGFbYS5sZW5ndGggLSAxXSA9IGI7XG4gICAgICAgIG1lcmdlV2l0aFByZXZpb3VzID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgICB9IGVsc2UgaWYgKG1lcmdlV2l0aFByZXZpb3VzKSB7XG4gICAgICAgIGFbYS5sZW5ndGggLSAxXSArPSBiO1xuICAgICAgICBtZXJnZVdpdGhQcmV2aW91cyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhLmNvbmNhdChiKTtcbiAgICAgIH1cbiAgICB9LCBbXSlcbiAgICAvLyBIZXJlIHdlIGNvbnZlcnQgdGhlIHN0cmluZyB2YWx1ZXMgaW50byBudW1iZXIgdmFsdWVzIChpbiBweClcbiAgICAubWFwKGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgIHJldHVybiB0b1ZhbHVlKHN0ciwgbWVhc3VyZW1lbnQsIHBvcHBlck9mZnNldHMsIHJlZmVyZW5jZU9mZnNldHMpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBMb29wIHRyb3VnaCB0aGUgb2Zmc2V0cyBhcnJheXMgYW5kIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbnNcbiAgb3BzLmZvckVhY2goZnVuY3Rpb24gKG9wLCBpbmRleCkge1xuICAgIG9wLmZvckVhY2goZnVuY3Rpb24gKGZyYWcsIGluZGV4Mikge1xuICAgICAgaWYgKGlzTnVtZXJpYyhmcmFnKSkge1xuICAgICAgICBvZmZzZXRzW2luZGV4XSArPSBmcmFnICogKG9wW2luZGV4MiAtIDFdID09PSAnLScgPyAtMSA6IDEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIG9mZnNldHM7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgdXBkYXRlIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQGFyZ3VtZW50IHtOdW1iZXJ8U3RyaW5nfSBvcHRpb25zLm9mZnNldD0wXG4gKiBUaGUgb2Zmc2V0IHZhbHVlIGFzIGRlc2NyaWJlZCBpbiB0aGUgbW9kaWZpZXIgZGVzY3JpcHRpb25cbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gb2Zmc2V0KGRhdGEsIF9yZWYpIHtcbiAgdmFyIG9mZnNldCA9IF9yZWYub2Zmc2V0O1xuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQsXG4gICAgICBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXIsXG4gICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZTtcblxuICB2YXIgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuXG4gIHZhciBvZmZzZXRzID0gdm9pZCAwO1xuICBpZiAoaXNOdW1lcmljKCtvZmZzZXQpKSB7XG4gICAgb2Zmc2V0cyA9IFsrb2Zmc2V0LCAwXTtcbiAgfSBlbHNlIHtcbiAgICBvZmZzZXRzID0gcGFyc2VPZmZzZXQob2Zmc2V0LCBwb3BwZXIsIHJlZmVyZW5jZSwgYmFzZVBsYWNlbWVudCk7XG4gIH1cblxuICBpZiAoYmFzZVBsYWNlbWVudCA9PT0gJ2xlZnQnKSB7XG4gICAgcG9wcGVyLnRvcCArPSBvZmZzZXRzWzBdO1xuICAgIHBvcHBlci5sZWZ0IC09IG9mZnNldHNbMV07XG4gIH0gZWxzZSBpZiAoYmFzZVBsYWNlbWVudCA9PT0gJ3JpZ2h0Jykge1xuICAgIHBvcHBlci50b3AgKz0gb2Zmc2V0c1swXTtcbiAgICBwb3BwZXIubGVmdCArPSBvZmZzZXRzWzFdO1xuICB9IGVsc2UgaWYgKGJhc2VQbGFjZW1lbnQgPT09ICd0b3AnKSB7XG4gICAgcG9wcGVyLmxlZnQgKz0gb2Zmc2V0c1swXTtcbiAgICBwb3BwZXIudG9wIC09IG9mZnNldHNbMV07XG4gIH0gZWxzZSBpZiAoYmFzZVBsYWNlbWVudCA9PT0gJ2JvdHRvbScpIHtcbiAgICBwb3BwZXIubGVmdCArPSBvZmZzZXRzWzBdO1xuICAgIHBvcHBlci50b3AgKz0gb2Zmc2V0c1sxXTtcbiAgfVxuXG4gIGRhdGEucG9wcGVyID0gcG9wcGVyO1xuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gcHJldmVudE92ZXJmbG93KGRhdGEsIG9wdGlvbnMpIHtcbiAgdmFyIGJvdW5kYXJpZXNFbGVtZW50ID0gb3B0aW9ucy5ib3VuZGFyaWVzRWxlbWVudCB8fCBnZXRPZmZzZXRQYXJlbnQoZGF0YS5pbnN0YW5jZS5wb3BwZXIpO1xuXG4gIC8vIElmIG9mZnNldFBhcmVudCBpcyB0aGUgcmVmZXJlbmNlIGVsZW1lbnQsIHdlIHJlYWxseSB3YW50IHRvXG4gIC8vIGdvIG9uZSBzdGVwIHVwIGFuZCB1c2UgdGhlIG5leHQgb2Zmc2V0UGFyZW50IGFzIHJlZmVyZW5jZSB0b1xuICAvLyBhdm9pZCB0byBtYWtlIHRoaXMgbW9kaWZpZXIgY29tcGxldGVseSB1c2VsZXNzIGFuZCBsb29rIGxpa2UgYnJva2VuXG4gIGlmIChkYXRhLmluc3RhbmNlLnJlZmVyZW5jZSA9PT0gYm91bmRhcmllc0VsZW1lbnQpIHtcbiAgICBib3VuZGFyaWVzRWxlbWVudCA9IGdldE9mZnNldFBhcmVudChib3VuZGFyaWVzRWxlbWVudCk7XG4gIH1cblxuICAvLyBOT1RFOiBET00gYWNjZXNzIGhlcmVcbiAgLy8gcmVzZXRzIHRoZSBwb3BwZXIncyBwb3NpdGlvbiBzbyB0aGF0IHRoZSBkb2N1bWVudCBzaXplIGNhbiBiZSBjYWxjdWxhdGVkIGV4Y2x1ZGluZ1xuICAvLyB0aGUgc2l6ZSBvZiB0aGUgcG9wcGVyIGVsZW1lbnQgaXRzZWxmXG4gIHZhciB0cmFuc2Zvcm1Qcm9wID0gZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lKCd0cmFuc2Zvcm0nKTtcbiAgdmFyIHBvcHBlclN0eWxlcyA9IGRhdGEuaW5zdGFuY2UucG9wcGVyLnN0eWxlOyAvLyBhc3NpZ25tZW50IHRvIGhlbHAgbWluaWZpY2F0aW9uXG4gIHZhciB0b3AgPSBwb3BwZXJTdHlsZXMudG9wLFxuICAgICAgbGVmdCA9IHBvcHBlclN0eWxlcy5sZWZ0LFxuICAgICAgdHJhbnNmb3JtID0gcG9wcGVyU3R5bGVzW3RyYW5zZm9ybVByb3BdO1xuXG4gIHBvcHBlclN0eWxlcy50b3AgPSAnJztcbiAgcG9wcGVyU3R5bGVzLmxlZnQgPSAnJztcbiAgcG9wcGVyU3R5bGVzW3RyYW5zZm9ybVByb3BdID0gJyc7XG5cbiAgdmFyIGJvdW5kYXJpZXMgPSBnZXRCb3VuZGFyaWVzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLmluc3RhbmNlLnJlZmVyZW5jZSwgb3B0aW9ucy5wYWRkaW5nLCBib3VuZGFyaWVzRWxlbWVudCwgZGF0YS5wb3NpdGlvbkZpeGVkKTtcblxuICAvLyBOT1RFOiBET00gYWNjZXNzIGhlcmVcbiAgLy8gcmVzdG9yZXMgdGhlIG9yaWdpbmFsIHN0eWxlIHByb3BlcnRpZXMgYWZ0ZXIgdGhlIG9mZnNldHMgaGF2ZSBiZWVuIGNvbXB1dGVkXG4gIHBvcHBlclN0eWxlcy50b3AgPSB0b3A7XG4gIHBvcHBlclN0eWxlcy5sZWZ0ID0gbGVmdDtcbiAgcG9wcGVyU3R5bGVzW3RyYW5zZm9ybVByb3BdID0gdHJhbnNmb3JtO1xuXG4gIG9wdGlvbnMuYm91bmRhcmllcyA9IGJvdW5kYXJpZXM7XG5cbiAgdmFyIG9yZGVyID0gb3B0aW9ucy5wcmlvcml0eTtcbiAgdmFyIHBvcHBlciA9IGRhdGEub2Zmc2V0cy5wb3BwZXI7XG5cbiAgdmFyIGNoZWNrID0ge1xuICAgIHByaW1hcnk6IGZ1bmN0aW9uIHByaW1hcnkocGxhY2VtZW50KSB7XG4gICAgICB2YXIgdmFsdWUgPSBwb3BwZXJbcGxhY2VtZW50XTtcbiAgICAgIGlmIChwb3BwZXJbcGxhY2VtZW50XSA8IGJvdW5kYXJpZXNbcGxhY2VtZW50XSAmJiAhb3B0aW9ucy5lc2NhcGVXaXRoUmVmZXJlbmNlKSB7XG4gICAgICAgIHZhbHVlID0gTWF0aC5tYXgocG9wcGVyW3BsYWNlbWVudF0sIGJvdW5kYXJpZXNbcGxhY2VtZW50XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoe30sIHBsYWNlbWVudCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2Vjb25kYXJ5OiBmdW5jdGlvbiBzZWNvbmRhcnkocGxhY2VtZW50KSB7XG4gICAgICB2YXIgbWFpblNpZGUgPSBwbGFjZW1lbnQgPT09ICdyaWdodCcgPyAnbGVmdCcgOiAndG9wJztcbiAgICAgIHZhciB2YWx1ZSA9IHBvcHBlclttYWluU2lkZV07XG4gICAgICBpZiAocG9wcGVyW3BsYWNlbWVudF0gPiBib3VuZGFyaWVzW3BsYWNlbWVudF0gJiYgIW9wdGlvbnMuZXNjYXBlV2l0aFJlZmVyZW5jZSkge1xuICAgICAgICB2YWx1ZSA9IE1hdGgubWluKHBvcHBlclttYWluU2lkZV0sIGJvdW5kYXJpZXNbcGxhY2VtZW50XSAtIChwbGFjZW1lbnQgPT09ICdyaWdodCcgPyBwb3BwZXIud2lkdGggOiBwb3BwZXIuaGVpZ2h0KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoe30sIG1haW5TaWRlLCB2YWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIG9yZGVyLmZvckVhY2goZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHZhciBzaWRlID0gWydsZWZ0JywgJ3RvcCddLmluZGV4T2YocGxhY2VtZW50KSAhPT0gLTEgPyAncHJpbWFyeScgOiAnc2Vjb25kYXJ5JztcbiAgICBwb3BwZXIgPSBfZXh0ZW5kcyh7fSwgcG9wcGVyLCBjaGVja1tzaWRlXShwbGFjZW1lbnQpKTtcbiAgfSk7XG5cbiAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IHBvcHBlcjtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gc2hpZnQoZGF0YSkge1xuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gIHZhciBzaGlmdHZhcmlhdGlvbiA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xuXG4gIC8vIGlmIHNoaWZ0IHNoaWZ0dmFyaWF0aW9uIGlzIHNwZWNpZmllZCwgcnVuIHRoZSBtb2RpZmllclxuICBpZiAoc2hpZnR2YXJpYXRpb24pIHtcbiAgICB2YXIgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyO1xuXG4gICAgdmFyIGlzVmVydGljYWwgPSBbJ2JvdHRvbScsICd0b3AnXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcbiAgICB2YXIgc2lkZSA9IGlzVmVydGljYWwgPyAnbGVmdCcgOiAndG9wJztcbiAgICB2YXIgbWVhc3VyZW1lbnQgPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuXG4gICAgdmFyIHNoaWZ0T2Zmc2V0cyA9IHtcbiAgICAgIHN0YXJ0OiBkZWZpbmVQcm9wZXJ0eSh7fSwgc2lkZSwgcmVmZXJlbmNlW3NpZGVdKSxcbiAgICAgIGVuZDogZGVmaW5lUHJvcGVydHkoe30sIHNpZGUsIHJlZmVyZW5jZVtzaWRlXSArIHJlZmVyZW5jZVttZWFzdXJlbWVudF0gLSBwb3BwZXJbbWVhc3VyZW1lbnRdKVxuICAgIH07XG5cbiAgICBkYXRhLm9mZnNldHMucG9wcGVyID0gX2V4dGVuZHMoe30sIHBvcHBlciwgc2hpZnRPZmZzZXRzW3NoaWZ0dmFyaWF0aW9uXSk7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGhpZGUoZGF0YSkge1xuICBpZiAoIWlzTW9kaWZpZXJSZXF1aXJlZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgJ2hpZGUnLCAncHJldmVudE92ZXJmbG93JykpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHZhciByZWZSZWN0ID0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZTtcbiAgdmFyIGJvdW5kID0gZmluZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgcmV0dXJuIG1vZGlmaWVyLm5hbWUgPT09ICdwcmV2ZW50T3ZlcmZsb3cnO1xuICB9KS5ib3VuZGFyaWVzO1xuXG4gIGlmIChyZWZSZWN0LmJvdHRvbSA8IGJvdW5kLnRvcCB8fCByZWZSZWN0LmxlZnQgPiBib3VuZC5yaWdodCB8fCByZWZSZWN0LnRvcCA+IGJvdW5kLmJvdHRvbSB8fCByZWZSZWN0LnJpZ2h0IDwgYm91bmQubGVmdCkge1xuICAgIC8vIEF2b2lkIHVubmVjZXNzYXJ5IERPTSBhY2Nlc3MgaWYgdmlzaWJpbGl0eSBoYXNuJ3QgY2hhbmdlZFxuICAgIGlmIChkYXRhLmhpZGUgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGRhdGEuaGlkZSA9IHRydWU7XG4gICAgZGF0YS5hdHRyaWJ1dGVzWyd4LW91dC1vZi1ib3VuZGFyaWVzJ10gPSAnJztcbiAgfSBlbHNlIHtcbiAgICAvLyBBdm9pZCB1bm5lY2Vzc2FyeSBET00gYWNjZXNzIGlmIHZpc2liaWxpdHkgaGFzbid0IGNoYW5nZWRcbiAgICBpZiAoZGF0YS5oaWRlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgZGF0YS5oaWRlID0gZmFsc2U7XG4gICAgZGF0YS5hdHRyaWJ1dGVzWyd4LW91dC1vZi1ib3VuZGFyaWVzJ10gPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBpbm5lcihkYXRhKSB7XG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgdmFyIF9kYXRhJG9mZnNldHMgPSBkYXRhLm9mZnNldHMsXG4gICAgICBwb3BwZXIgPSBfZGF0YSRvZmZzZXRzLnBvcHBlcixcbiAgICAgIHJlZmVyZW5jZSA9IF9kYXRhJG9mZnNldHMucmVmZXJlbmNlO1xuXG4gIHZhciBpc0hvcml6ID0gWydsZWZ0JywgJ3JpZ2h0J10uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgdmFyIHN1YnRyYWN0TGVuZ3RoID0gWyd0b3AnLCAnbGVmdCddLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPT09IC0xO1xuXG4gIHBvcHBlcltpc0hvcml6ID8gJ2xlZnQnIDogJ3RvcCddID0gcmVmZXJlbmNlW2Jhc2VQbGFjZW1lbnRdIC0gKHN1YnRyYWN0TGVuZ3RoID8gcG9wcGVyW2lzSG9yaXogPyAnd2lkdGgnIDogJ2hlaWdodCddIDogMCk7XG5cbiAgZGF0YS5wbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICBkYXRhLm9mZnNldHMucG9wcGVyID0gZ2V0Q2xpZW50UmVjdChwb3BwZXIpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIE1vZGlmaWVyIGZ1bmN0aW9uLCBlYWNoIG1vZGlmaWVyIGNhbiBoYXZlIGEgZnVuY3Rpb24gb2YgdGhpcyB0eXBlIGFzc2lnbmVkXG4gKiB0byBpdHMgYGZuYCBwcm9wZXJ0eS48YnIgLz5cbiAqIFRoZXNlIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIHVwZGF0ZSwgdGhpcyBtZWFucyB0aGF0IHlvdSBtdXN0XG4gKiBtYWtlIHN1cmUgdGhleSBhcmUgcGVyZm9ybWFudCBlbm91Z2ggdG8gYXZvaWQgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MuXG4gKlxuICogQGZ1bmN0aW9uIE1vZGlmaWVyRm5cbiAqIEBhcmd1bWVudCB7ZGF0YU9iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7ZGF0YU9iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5cbi8qKlxuICogTW9kaWZpZXJzIGFyZSBwbHVnaW5zIHVzZWQgdG8gYWx0ZXIgdGhlIGJlaGF2aW9yIG9mIHlvdXIgcG9wcGVycy48YnIgLz5cbiAqIFBvcHBlci5qcyB1c2VzIGEgc2V0IG9mIDkgbW9kaWZpZXJzIHRvIHByb3ZpZGUgYWxsIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXRpZXNcbiAqIG5lZWRlZCBieSB0aGUgbGlicmFyeS5cbiAqXG4gKiBVc3VhbGx5IHlvdSBkb24ndCB3YW50IHRvIG92ZXJyaWRlIHRoZSBgb3JkZXJgLCBgZm5gIGFuZCBgb25Mb2FkYCBwcm9wcy5cbiAqIEFsbCB0aGUgb3RoZXIgcHJvcGVydGllcyBhcmUgY29uZmlndXJhdGlvbnMgdGhhdCBjb3VsZCBiZSB0d2Vha2VkLlxuICogQG5hbWVzcGFjZSBtb2RpZmllcnNcbiAqL1xudmFyIG1vZGlmaWVycyA9IHtcbiAgLyoqXG4gICAqIE1vZGlmaWVyIHVzZWQgdG8gc2hpZnQgdGhlIHBvcHBlciBvbiB0aGUgc3RhcnQgb3IgZW5kIG9mIGl0cyByZWZlcmVuY2VcbiAgICogZWxlbWVudC48YnIgLz5cbiAgICogSXQgd2lsbCByZWFkIHRoZSB2YXJpYXRpb24gb2YgdGhlIGBwbGFjZW1lbnRgIHByb3BlcnR5LjxiciAvPlxuICAgKiBJdCBjYW4gYmUgb25lIGVpdGhlciBgLWVuZGAgb3IgYC1zdGFydGAuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBzaGlmdDoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj0xMDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDEwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IHNoaWZ0XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRoZSBgb2Zmc2V0YCBtb2RpZmllciBjYW4gc2hpZnQgeW91ciBwb3BwZXIgb24gYm90aCBpdHMgYXhpcy5cbiAgICpcbiAgICogSXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHVuaXRzOlxuICAgKiAtIGBweGAgb3IgdW5pdC1sZXNzLCBpbnRlcnByZXRlZCBhcyBwaXhlbHNcbiAgICogLSBgJWAgb3IgYCVyYCwgcGVyY2VudGFnZSByZWxhdGl2ZSB0byB0aGUgbGVuZ3RoIG9mIHRoZSByZWZlcmVuY2UgZWxlbWVudFxuICAgKiAtIGAlcGAsIHBlcmNlbnRhZ2UgcmVsYXRpdmUgdG8gdGhlIGxlbmd0aCBvZiB0aGUgcG9wcGVyIGVsZW1lbnRcbiAgICogLSBgdndgLCBDU1Mgdmlld3BvcnQgd2lkdGggdW5pdFxuICAgKiAtIGB2aGAsIENTUyB2aWV3cG9ydCBoZWlnaHQgdW5pdFxuICAgKlxuICAgKiBGb3IgbGVuZ3RoIGlzIGludGVuZGVkIHRoZSBtYWluIGF4aXMgcmVsYXRpdmUgdG8gdGhlIHBsYWNlbWVudCBvZiB0aGUgcG9wcGVyLjxiciAvPlxuICAgKiBUaGlzIG1lYW5zIHRoYXQgaWYgdGhlIHBsYWNlbWVudCBpcyBgdG9wYCBvciBgYm90dG9tYCwgdGhlIGxlbmd0aCB3aWxsIGJlIHRoZVxuICAgKiBgd2lkdGhgLiBJbiBjYXNlIG9mIGBsZWZ0YCBvciBgcmlnaHRgLCBpdCB3aWxsIGJlIHRoZSBgaGVpZ2h0YC5cbiAgICpcbiAgICogWW91IGNhbiBwcm92aWRlIGEgc2luZ2xlIHZhbHVlIChhcyBgTnVtYmVyYCBvciBgU3RyaW5nYCksIG9yIGEgcGFpciBvZiB2YWx1ZXNcbiAgICogYXMgYFN0cmluZ2AgZGl2aWRlZCBieSBhIGNvbW1hIG9yIG9uZSAob3IgbW9yZSkgd2hpdGUgc3BhY2VzLjxiciAvPlxuICAgKiBUaGUgbGF0dGVyIGlzIGEgZGVwcmVjYXRlZCBtZXRob2QgYmVjYXVzZSBpdCBsZWFkcyB0byBjb25mdXNpb24gYW5kIHdpbGwgYmVcbiAgICogcmVtb3ZlZCBpbiB2Mi48YnIgLz5cbiAgICogQWRkaXRpb25hbGx5LCBpdCBhY2NlcHRzIGFkZGl0aW9ucyBhbmQgc3VidHJhY3Rpb25zIGJldHdlZW4gZGlmZmVyZW50IHVuaXRzLlxuICAgKiBOb3RlIHRoYXQgbXVsdGlwbGljYXRpb25zIGFuZCBkaXZpc2lvbnMgYXJlbid0IHN1cHBvcnRlZC5cbiAgICpcbiAgICogVmFsaWQgZXhhbXBsZXMgYXJlOlxuICAgKiBgYGBcbiAgICogMTBcbiAgICogJzEwJSdcbiAgICogJzEwLCAxMCdcbiAgICogJzEwJSwgMTAnXG4gICAqICcxMCArIDEwJSdcbiAgICogJzEwIC0gNXZoICsgMyUnXG4gICAqICctMTBweCArIDV2aCwgNXB4IC0gNiUnXG4gICAqIGBgYFxuICAgKiA+ICoqTkIqKjogSWYgeW91IGRlc2lyZSB0byBhcHBseSBvZmZzZXRzIHRvIHlvdXIgcG9wcGVycyBpbiBhIHdheSB0aGF0IG1heSBtYWtlIHRoZW0gb3ZlcmxhcFxuICAgKiA+IHdpdGggdGhlaXIgcmVmZXJlbmNlIGVsZW1lbnQsIHVuZm9ydHVuYXRlbHksIHlvdSB3aWxsIGhhdmUgdG8gZGlzYWJsZSB0aGUgYGZsaXBgIG1vZGlmaWVyLlxuICAgKiA+IFlvdSBjYW4gcmVhZCBtb3JlIG9uIHRoaXMgYXQgdGhpcyBbaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9GZXpWcmFzdGEvcG9wcGVyLmpzL2lzc3Vlcy8zNzMpLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgb2Zmc2V0OiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTIwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogMjAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogb2Zmc2V0LFxuICAgIC8qKiBAcHJvcCB7TnVtYmVyfFN0cmluZ30gb2Zmc2V0PTBcbiAgICAgKiBUaGUgb2Zmc2V0IHZhbHVlIGFzIGRlc2NyaWJlZCBpbiB0aGUgbW9kaWZpZXIgZGVzY3JpcHRpb25cbiAgICAgKi9cbiAgICBvZmZzZXQ6IDBcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBwcmV2ZW50IHRoZSBwb3BwZXIgZnJvbSBiZWluZyBwb3NpdGlvbmVkIG91dHNpZGUgdGhlIGJvdW5kYXJ5LlxuICAgKlxuICAgKiBBIHNjZW5hcmlvIGV4aXN0cyB3aGVyZSB0aGUgcmVmZXJlbmNlIGl0c2VsZiBpcyBub3Qgd2l0aGluIHRoZSBib3VuZGFyaWVzLjxiciAvPlxuICAgKiBXZSBjYW4gc2F5IGl0IGhhcyBcImVzY2FwZWQgdGhlIGJvdW5kYXJpZXNcIiDigJQgb3IganVzdCBcImVzY2FwZWRcIi48YnIgLz5cbiAgICogSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHBvcHBlciBzaG91bGQgZWl0aGVyOlxuICAgKlxuICAgKiAtIGRldGFjaCBmcm9tIHRoZSByZWZlcmVuY2UgYW5kIHJlbWFpbiBcInRyYXBwZWRcIiBpbiB0aGUgYm91bmRhcmllcywgb3JcbiAgICogLSBpZiBpdCBzaG91bGQgaWdub3JlIHRoZSBib3VuZGFyeSBhbmQgXCJlc2NhcGUgd2l0aCBpdHMgcmVmZXJlbmNlXCJcbiAgICpcbiAgICogV2hlbiBgZXNjYXBlV2l0aFJlZmVyZW5jZWAgaXMgc2V0IHRvYHRydWVgIGFuZCByZWZlcmVuY2UgaXMgY29tcGxldGVseVxuICAgKiBvdXRzaWRlIGl0cyBib3VuZGFyaWVzLCB0aGUgcG9wcGVyIHdpbGwgb3ZlcmZsb3cgKG9yIGNvbXBsZXRlbHkgbGVhdmUpXG4gICAqIHRoZSBib3VuZGFyaWVzIGluIG9yZGVyIHRvIHJlbWFpbiBhdHRhY2hlZCB0byB0aGUgZWRnZSBvZiB0aGUgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgcHJldmVudE92ZXJmbG93OiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTMwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogMzAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogcHJldmVudE92ZXJmbG93LFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtBcnJheX0gW3ByaW9yaXR5PVsnbGVmdCcsJ3JpZ2h0JywndG9wJywnYm90dG9tJ11dXG4gICAgICogUG9wcGVyIHdpbGwgdHJ5IHRvIHByZXZlbnQgb3ZlcmZsb3cgZm9sbG93aW5nIHRoZXNlIHByaW9yaXRpZXMgYnkgZGVmYXVsdCxcbiAgICAgKiB0aGVuLCBpdCBjb3VsZCBvdmVyZmxvdyBvbiB0aGUgbGVmdCBhbmQgb24gdG9wIG9mIHRoZSBgYm91bmRhcmllc0VsZW1lbnRgXG4gICAgICovXG4gICAgcHJpb3JpdHk6IFsnbGVmdCcsICdyaWdodCcsICd0b3AnLCAnYm90dG9tJ10sXG4gICAgLyoqXG4gICAgICogQHByb3Age251bWJlcn0gcGFkZGluZz01XG4gICAgICogQW1vdW50IG9mIHBpeGVsIHVzZWQgdG8gZGVmaW5lIGEgbWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3VuZGFyaWVzXG4gICAgICogYW5kIHRoZSBwb3BwZXIuIFRoaXMgbWFrZXMgc3VyZSB0aGUgcG9wcGVyIGFsd2F5cyBoYXMgYSBsaXR0bGUgcGFkZGluZ1xuICAgICAqIGJldHdlZW4gdGhlIGVkZ2VzIG9mIGl0cyBjb250YWluZXJcbiAgICAgKi9cbiAgICBwYWRkaW5nOiA1LFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtTdHJpbmd8SFRNTEVsZW1lbnR9IGJvdW5kYXJpZXNFbGVtZW50PSdzY3JvbGxQYXJlbnQnXG4gICAgICogQm91bmRhcmllcyB1c2VkIGJ5IHRoZSBtb2RpZmllci4gQ2FuIGJlIGBzY3JvbGxQYXJlbnRgLCBgd2luZG93YCxcbiAgICAgKiBgdmlld3BvcnRgIG9yIGFueSBET00gZWxlbWVudC5cbiAgICAgKi9cbiAgICBib3VuZGFyaWVzRWxlbWVudDogJ3Njcm9sbFBhcmVudCdcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBtYWtlIHN1cmUgdGhlIHJlZmVyZW5jZSBhbmQgaXRzIHBvcHBlciBzdGF5IG5lYXIgZWFjaCBvdGhlclxuICAgKiB3aXRob3V0IGxlYXZpbmcgYW55IGdhcCBiZXR3ZWVuIHRoZSB0d28uIEVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gdGhlIGFycm93IGlzXG4gICAqIGVuYWJsZWQgYW5kIHlvdSB3YW50IHRvIGVuc3VyZSB0aGF0IGl0IHBvaW50cyB0byBpdHMgcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqIEl0IGNhcmVzIG9ubHkgYWJvdXQgdGhlIGZpcnN0IGF4aXMuIFlvdSBjYW4gc3RpbGwgaGF2ZSBwb3BwZXJzIHdpdGggbWFyZ2luXG4gICAqIGJldHdlZW4gdGhlIHBvcHBlciBhbmQgaXRzIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAga2VlcFRvZ2V0aGVyOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTQwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogNDAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjoga2VlcFRvZ2V0aGVyXG4gIH0sXG5cbiAgLyoqXG4gICAqIFRoaXMgbW9kaWZpZXIgaXMgdXNlZCB0byBtb3ZlIHRoZSBgYXJyb3dFbGVtZW50YCBvZiB0aGUgcG9wcGVyIHRvIG1ha2VcbiAgICogc3VyZSBpdCBpcyBwb3NpdGlvbmVkIGJldHdlZW4gdGhlIHJlZmVyZW5jZSBlbGVtZW50IGFuZCBpdHMgcG9wcGVyIGVsZW1lbnQuXG4gICAqIEl0IHdpbGwgcmVhZCB0aGUgb3V0ZXIgc2l6ZSBvZiB0aGUgYGFycm93RWxlbWVudGAgbm9kZSB0byBkZXRlY3QgaG93IG1hbnlcbiAgICogcGl4ZWxzIG9mIGNvbmp1bmN0aW9uIGFyZSBuZWVkZWQuXG4gICAqXG4gICAqIEl0IGhhcyBubyBlZmZlY3QgaWYgbm8gYGFycm93RWxlbWVudGAgaXMgcHJvdmlkZWQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBhcnJvdzoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj01MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDUwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGFycm93LFxuICAgIC8qKiBAcHJvcCB7U3RyaW5nfEhUTUxFbGVtZW50fSBlbGVtZW50PSdbeC1hcnJvd10nIC0gU2VsZWN0b3Igb3Igbm9kZSB1c2VkIGFzIGFycm93ICovXG4gICAgZWxlbWVudDogJ1t4LWFycm93XSdcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBmbGlwIHRoZSBwb3BwZXIncyBwbGFjZW1lbnQgd2hlbiBpdCBzdGFydHMgdG8gb3ZlcmxhcCBpdHNcbiAgICogcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqXG4gICAqIFJlcXVpcmVzIHRoZSBgcHJldmVudE92ZXJmbG93YCBtb2RpZmllciBiZWZvcmUgaXQgaW4gb3JkZXIgdG8gd29yay5cbiAgICpcbiAgICogKipOT1RFOioqIHRoaXMgbW9kaWZpZXIgd2lsbCBpbnRlcnJ1cHQgdGhlIGN1cnJlbnQgdXBkYXRlIGN5Y2xlIGFuZCB3aWxsXG4gICAqIHJlc3RhcnQgaXQgaWYgaXQgZGV0ZWN0cyB0aGUgbmVlZCB0byBmbGlwIHRoZSBwbGFjZW1lbnQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBmbGlwOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTYwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogNjAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogZmxpcCxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7U3RyaW5nfEFycmF5fSBiZWhhdmlvcj0nZmxpcCdcbiAgICAgKiBUaGUgYmVoYXZpb3IgdXNlZCB0byBjaGFuZ2UgdGhlIHBvcHBlcidzIHBsYWNlbWVudC4gSXQgY2FuIGJlIG9uZSBvZlxuICAgICAqIGBmbGlwYCwgYGNsb2Nrd2lzZWAsIGBjb3VudGVyY2xvY2t3aXNlYCBvciBhbiBhcnJheSB3aXRoIGEgbGlzdCBvZiB2YWxpZFxuICAgICAqIHBsYWNlbWVudHMgKHdpdGggb3B0aW9uYWwgdmFyaWF0aW9ucylcbiAgICAgKi9cbiAgICBiZWhhdmlvcjogJ2ZsaXAnLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtudW1iZXJ9IHBhZGRpbmc9NVxuICAgICAqIFRoZSBwb3BwZXIgd2lsbCBmbGlwIGlmIGl0IGhpdHMgdGhlIGVkZ2VzIG9mIHRoZSBgYm91bmRhcmllc0VsZW1lbnRgXG4gICAgICovXG4gICAgcGFkZGluZzogNSxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7U3RyaW5nfEhUTUxFbGVtZW50fSBib3VuZGFyaWVzRWxlbWVudD0ndmlld3BvcnQnXG4gICAgICogVGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBkZWZpbmUgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHBvcHBlciBwb3NpdGlvbi5cbiAgICAgKiBUaGUgcG9wcGVyIHdpbGwgbmV2ZXIgYmUgcGxhY2VkIG91dHNpZGUgb2YgdGhlIGRlZmluZWQgYm91bmRhcmllc1xuICAgICAqIChleGNlcHQgaWYgYGtlZXBUb2dldGhlcmAgaXMgZW5hYmxlZClcbiAgICAgKi9cbiAgICBib3VuZGFyaWVzRWxlbWVudDogJ3ZpZXdwb3J0JyxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7Qm9vbGVhbn0gZmxpcFZhcmlhdGlvbnM9ZmFsc2VcbiAgICAgKiBUaGUgcG9wcGVyIHdpbGwgc3dpdGNoIHBsYWNlbWVudCB2YXJpYXRpb24gYmV0d2VlbiBgLXN0YXJ0YCBhbmQgYC1lbmRgIHdoZW5cbiAgICAgKiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgb3ZlcmxhcHMgaXRzIGJvdW5kYXJpZXMuXG4gICAgICpcbiAgICAgKiBUaGUgb3JpZ2luYWwgcGxhY2VtZW50IHNob3VsZCBoYXZlIGEgc2V0IHZhcmlhdGlvbi5cbiAgICAgKi9cbiAgICBmbGlwVmFyaWF0aW9uczogZmFsc2UsXG4gICAgLyoqXG4gICAgICogQHByb3Age0Jvb2xlYW59IGZsaXBWYXJpYXRpb25zQnlDb250ZW50PWZhbHNlXG4gICAgICogVGhlIHBvcHBlciB3aWxsIHN3aXRjaCBwbGFjZW1lbnQgdmFyaWF0aW9uIGJldHdlZW4gYC1zdGFydGAgYW5kIGAtZW5kYCB3aGVuXG4gICAgICogdGhlIHBvcHBlciBlbGVtZW50IG92ZXJsYXBzIGl0cyByZWZlcmVuY2UgYm91bmRhcmllcy5cbiAgICAgKlxuICAgICAqIFRoZSBvcmlnaW5hbCBwbGFjZW1lbnQgc2hvdWxkIGhhdmUgYSBzZXQgdmFyaWF0aW9uLlxuICAgICAqL1xuICAgIGZsaXBWYXJpYXRpb25zQnlDb250ZW50OiBmYWxzZVxuICB9LFxuXG4gIC8qKlxuICAgKiBNb2RpZmllciB1c2VkIHRvIG1ha2UgdGhlIHBvcHBlciBmbG93IHRvd2FyZCB0aGUgaW5uZXIgb2YgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKiBCeSBkZWZhdWx0LCB3aGVuIHRoaXMgbW9kaWZpZXIgaXMgZGlzYWJsZWQsIHRoZSBwb3BwZXIgd2lsbCBiZSBwbGFjZWQgb3V0c2lkZVxuICAgKiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBpbm5lcjoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj03MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDcwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9ZmFsc2UgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogaW5uZXJcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBoaWRlIHRoZSBwb3BwZXIgd2hlbiBpdHMgcmVmZXJlbmNlIGVsZW1lbnQgaXMgb3V0c2lkZSBvZiB0aGVcbiAgICogcG9wcGVyIGJvdW5kYXJpZXMuIEl0IHdpbGwgc2V0IGEgYHgtb3V0LW9mLWJvdW5kYXJpZXNgIGF0dHJpYnV0ZSB3aGljaCBjYW5cbiAgICogYmUgdXNlZCB0byBoaWRlIHdpdGggYSBDU1Mgc2VsZWN0b3IgdGhlIHBvcHBlciB3aGVuIGl0cyByZWZlcmVuY2UgaXNcbiAgICogb3V0IG9mIGJvdW5kYXJpZXMuXG4gICAqXG4gICAqIFJlcXVpcmVzIHRoZSBgcHJldmVudE92ZXJmbG93YCBtb2RpZmllciBiZWZvcmUgaXQgaW4gb3JkZXIgdG8gd29yay5cbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGhpZGU6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9ODAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA4MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBoaWRlXG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBzdHlsZSB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyIGVsZW1lbnQgdG8gZ2V0c1xuICAgKiBwcm9wZXJseSBwb3NpdGlvbmVkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBtb2RpZmllciB3aWxsIG5vdCB0b3VjaCB0aGUgRE9NLCBpdCBqdXN0IHByZXBhcmVzIHRoZSBzdHlsZXNcbiAgICogc28gdGhhdCBgYXBwbHlTdHlsZWAgbW9kaWZpZXIgY2FuIGFwcGx5IGl0LiBUaGlzIHNlcGFyYXRpb24gaXMgdXNlZnVsXG4gICAqIGluIGNhc2UgeW91IG5lZWQgdG8gcmVwbGFjZSBgYXBwbHlTdHlsZWAgd2l0aCBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogVGhpcyBtb2RpZmllciBoYXMgYDg1MGAgYXMgYG9yZGVyYCB2YWx1ZSB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAqIHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YgUG9wcGVyLmpzLiBFeHBlY3QgdGhlIG1vZGlmaWVycyBvcmRlcmluZyBtZXRob2RcbiAgICogdG8gY2hhbmdlIGluIGZ1dHVyZSBtYWpvciB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS5cbiAgICpcbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGNvbXB1dGVTdHlsZToge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj04NTAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDg1MCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGNvbXB1dGVTdHlsZSxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7Qm9vbGVhbn0gZ3B1QWNjZWxlcmF0aW9uPXRydWVcbiAgICAgKiBJZiB0cnVlLCBpdCB1c2VzIHRoZSBDU1MgM0QgdHJhbnNmb3JtYXRpb24gdG8gcG9zaXRpb24gdGhlIHBvcHBlci5cbiAgICAgKiBPdGhlcndpc2UsIGl0IHdpbGwgdXNlIHRoZSBgdG9wYCBhbmQgYGxlZnRgIHByb3BlcnRpZXNcbiAgICAgKi9cbiAgICBncHVBY2NlbGVyYXRpb246IHRydWUsXG4gICAgLyoqXG4gICAgICogQHByb3Age3N0cmluZ30gW3g9J2JvdHRvbSddXG4gICAgICogV2hlcmUgdG8gYW5jaG9yIHRoZSBYIGF4aXMgKGBib3R0b21gIG9yIGB0b3BgKS4gQUtBIFggb2Zmc2V0IG9yaWdpbi5cbiAgICAgKiBDaGFuZ2UgdGhpcyBpZiB5b3VyIHBvcHBlciBzaG91bGQgZ3JvdyBpbiBhIGRpcmVjdGlvbiBkaWZmZXJlbnQgZnJvbSBgYm90dG9tYFxuICAgICAqL1xuICAgIHg6ICdib3R0b20nLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtzdHJpbmd9IFt4PSdsZWZ0J11cbiAgICAgKiBXaGVyZSB0byBhbmNob3IgdGhlIFkgYXhpcyAoYGxlZnRgIG9yIGByaWdodGApLiBBS0EgWSBvZmZzZXQgb3JpZ2luLlxuICAgICAqIENoYW5nZSB0aGlzIGlmIHlvdXIgcG9wcGVyIHNob3VsZCBncm93IGluIGEgZGlyZWN0aW9uIGRpZmZlcmVudCBmcm9tIGByaWdodGBcbiAgICAgKi9cbiAgICB5OiAncmlnaHQnXG4gIH0sXG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGNvbXB1dGVkIHN0eWxlcyB0byB0aGUgcG9wcGVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEFsbCB0aGUgRE9NIG1hbmlwdWxhdGlvbnMgYXJlIGxpbWl0ZWQgdG8gdGhpcyBtb2RpZmllci4gVGhpcyBpcyB1c2VmdWwgaW4gY2FzZVxuICAgKiB5b3Ugd2FudCB0byBpbnRlZ3JhdGUgUG9wcGVyLmpzIGluc2lkZSBhIGZyYW1ld29yayBvciB2aWV3IGxpYnJhcnkgYW5kIHlvdVxuICAgKiB3YW50IHRvIGRlbGVnYXRlIGFsbCB0aGUgRE9NIG1hbmlwdWxhdGlvbnMgdG8gaXQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBpZiB5b3UgZGlzYWJsZSB0aGlzIG1vZGlmaWVyLCB5b3UgbXVzdCBtYWtlIHN1cmUgdGhlIHBvcHBlciBlbGVtZW50XG4gICAqIGhhcyBpdHMgcG9zaXRpb24gc2V0IHRvIGBhYnNvbHV0ZWAgYmVmb3JlIFBvcHBlci5qcyBjYW4gZG8gaXRzIHdvcmshXG4gICAqXG4gICAqIEp1c3QgZGlzYWJsZSB0aGlzIG1vZGlmaWVyIGFuZCBkZWZpbmUgeW91ciBvd24gdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCBlZmZlY3QuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBhcHBseVN0eWxlOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTkwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogOTAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogYXBwbHlTdHlsZSxcbiAgICAvKiogQHByb3Age0Z1bmN0aW9ufSAqL1xuICAgIG9uTG9hZDogYXBwbHlTdHlsZU9uTG9hZCxcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDEuMTAuMCwgdGhlIHByb3BlcnR5IG1vdmVkIHRvIGBjb21wdXRlU3R5bGVgIG1vZGlmaWVyXG4gICAgICogQHByb3Age0Jvb2xlYW59IGdwdUFjY2VsZXJhdGlvbj10cnVlXG4gICAgICogSWYgdHJ1ZSwgaXQgdXNlcyB0aGUgQ1NTIDNEIHRyYW5zZm9ybWF0aW9uIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXIuXG4gICAgICogT3RoZXJ3aXNlLCBpdCB3aWxsIHVzZSB0aGUgYHRvcGAgYW5kIGBsZWZ0YCBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgZ3B1QWNjZWxlcmF0aW9uOiB1bmRlZmluZWRcbiAgfVxufTtcblxuLyoqXG4gKiBUaGUgYGRhdGFPYmplY3RgIGlzIGFuIG9iamVjdCBjb250YWluaW5nIGFsbCB0aGUgaW5mb3JtYXRpb24gdXNlZCBieSBQb3BwZXIuanMuXG4gKiBUaGlzIG9iamVjdCBpcyBwYXNzZWQgdG8gbW9kaWZpZXJzIGFuZCB0byB0aGUgYG9uQ3JlYXRlYCBhbmQgYG9uVXBkYXRlYCBjYWxsYmFja3MuXG4gKiBAbmFtZSBkYXRhT2JqZWN0XG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5pbnN0YW5jZSBUaGUgUG9wcGVyLmpzIGluc3RhbmNlXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZGF0YS5wbGFjZW1lbnQgUGxhY2VtZW50IGFwcGxpZWQgdG8gcG9wcGVyXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZGF0YS5vcmlnaW5hbFBsYWNlbWVudCBQbGFjZW1lbnQgb3JpZ2luYWxseSBkZWZpbmVkIG9uIGluaXRcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZGF0YS5mbGlwcGVkIFRydWUgaWYgcG9wcGVyIGhhcyBiZWVuIGZsaXBwZWQgYnkgZmxpcCBtb2RpZmllclxuICogQHByb3BlcnR5IHtCb29sZWFufSBkYXRhLmhpZGUgVHJ1ZSBpZiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgaXMgb3V0IG9mIGJvdW5kYXJpZXMsIHVzZWZ1bCB0byBrbm93IHdoZW4gdG8gaGlkZSB0aGUgcG9wcGVyXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBkYXRhLmFycm93RWxlbWVudCBOb2RlIHVzZWQgYXMgYXJyb3cgYnkgYXJyb3cgbW9kaWZpZXJcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLnN0eWxlcyBBbnkgQ1NTIHByb3BlcnR5IGRlZmluZWQgaGVyZSB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlci4gSXQgZXhwZWN0cyB0aGUgSmF2YVNjcmlwdCBub21lbmNsYXR1cmUgKGVnLiBgbWFyZ2luQm90dG9tYClcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLmFycm93U3R5bGVzIEFueSBDU1MgcHJvcGVydHkgZGVmaW5lZCBoZXJlIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyIGFycm93LiBJdCBleHBlY3RzIHRoZSBKYXZhU2NyaXB0IG5vbWVuY2xhdHVyZSAoZWcuIGBtYXJnaW5Cb3R0b21gKVxuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEuYm91bmRhcmllcyBPZmZzZXRzIG9mIHRoZSBwb3BwZXIgYm91bmRhcmllc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEub2Zmc2V0cyBUaGUgbWVhc3VyZW1lbnRzIG9mIHBvcHBlciwgcmVmZXJlbmNlIGFuZCBhcnJvdyBlbGVtZW50c1xuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEub2Zmc2V0cy5wb3BwZXIgYHRvcGAsIGBsZWZ0YCwgYHdpZHRoYCwgYGhlaWdodGAgdmFsdWVzXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSBgdG9wYCwgYGxlZnRgLCBgd2lkdGhgLCBgaGVpZ2h0YCB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLm9mZnNldHMuYXJyb3ddIGB0b3BgIGFuZCBgbGVmdGAgb2Zmc2V0cywgb25seSBvbmUgb2YgdGhlbSB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIDBcbiAqL1xuXG4vKipcbiAqIERlZmF1bHQgb3B0aW9ucyBwcm92aWRlZCB0byBQb3BwZXIuanMgY29uc3RydWN0b3IuPGJyIC8+XG4gKiBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyB0aGUgYG9wdGlvbnNgIGFyZ3VtZW50IG9mIFBvcHBlci5qcy48YnIgLz5cbiAqIFRvIG92ZXJyaWRlIGFuIG9wdGlvbiwgc2ltcGx5IHBhc3MgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWVcbiAqIHN0cnVjdHVyZSBvZiB0aGUgYG9wdGlvbnNgIG9iamVjdCwgYXMgdGhlIDNyZCBhcmd1bWVudC4gRm9yIGV4YW1wbGU6XG4gKiBgYGBcbiAqIG5ldyBQb3BwZXIocmVmLCBwb3AsIHtcbiAqICAgbW9kaWZpZXJzOiB7XG4gKiAgICAgcHJldmVudE92ZXJmbG93OiB7IGVuYWJsZWQ6IGZhbHNlIH1cbiAqICAgfVxuICogfSlcbiAqIGBgYFxuICogQHR5cGUge09iamVjdH1cbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xudmFyIERlZmF1bHRzID0ge1xuICAvKipcbiAgICogUG9wcGVyJ3MgcGxhY2VtZW50LlxuICAgKiBAcHJvcCB7UG9wcGVyLnBsYWNlbWVudHN9IHBsYWNlbWVudD0nYm90dG9tJ1xuICAgKi9cbiAgcGxhY2VtZW50OiAnYm90dG9tJyxcblxuICAvKipcbiAgICogU2V0IHRoaXMgdG8gdHJ1ZSBpZiB5b3Ugd2FudCBwb3BwZXIgdG8gcG9zaXRpb24gaXQgc2VsZiBpbiAnZml4ZWQnIG1vZGVcbiAgICogQHByb3Age0Jvb2xlYW59IHBvc2l0aW9uRml4ZWQ9ZmFsc2VcbiAgICovXG4gIHBvc2l0aW9uRml4ZWQ6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGV2ZW50cyAocmVzaXplLCBzY3JvbGwpIGFyZSBpbml0aWFsbHkgZW5hYmxlZC5cbiAgICogQHByb3Age0Jvb2xlYW59IGV2ZW50c0VuYWJsZWQ9dHJ1ZVxuICAgKi9cbiAgZXZlbnRzRW5hYmxlZDogdHJ1ZSxcblxuICAvKipcbiAgICogU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gYXV0b21hdGljYWxseSByZW1vdmUgdGhlIHBvcHBlciB3aGVuXG4gICAqIHlvdSBjYWxsIHRoZSBgZGVzdHJveWAgbWV0aG9kLlxuICAgKiBAcHJvcCB7Qm9vbGVhbn0gcmVtb3ZlT25EZXN0cm95PWZhbHNlXG4gICAqL1xuICByZW1vdmVPbkRlc3Ryb3k6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiB0aGUgcG9wcGVyIGlzIGNyZWF0ZWQuPGJyIC8+XG4gICAqIEJ5IGRlZmF1bHQsIGl0IGlzIHNldCB0byBuby1vcC48YnIgLz5cbiAgICogQWNjZXNzIFBvcHBlci5qcyBpbnN0YW5jZSB3aXRoIGBkYXRhLmluc3RhbmNlYC5cbiAgICogQHByb3Age29uQ3JlYXRlfVxuICAgKi9cbiAgb25DcmVhdGU6IGZ1bmN0aW9uIG9uQ3JlYXRlKCkge30sXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGNhbGxlZCB3aGVuIHRoZSBwb3BwZXIgaXMgdXBkYXRlZC4gVGhpcyBjYWxsYmFjayBpcyBub3QgY2FsbGVkXG4gICAqIG9uIHRoZSBpbml0aWFsaXphdGlvbi9jcmVhdGlvbiBvZiB0aGUgcG9wcGVyLCBidXQgb25seSBvbiBzdWJzZXF1ZW50XG4gICAqIHVwZGF0ZXMuPGJyIC8+XG4gICAqIEJ5IGRlZmF1bHQsIGl0IGlzIHNldCB0byBuby1vcC48YnIgLz5cbiAgICogQWNjZXNzIFBvcHBlci5qcyBpbnN0YW5jZSB3aXRoIGBkYXRhLmluc3RhbmNlYC5cbiAgICogQHByb3Age29uVXBkYXRlfVxuICAgKi9cbiAgb25VcGRhdGU6IGZ1bmN0aW9uIG9uVXBkYXRlKCkge30sXG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgbW9kaWZpZXJzIHVzZWQgdG8gbW9kaWZ5IHRoZSBvZmZzZXRzIGJlZm9yZSB0aGV5IGFyZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXIuXG4gICAqIFRoZXkgcHJvdmlkZSBtb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXRpZXMgb2YgUG9wcGVyLmpzLlxuICAgKiBAcHJvcCB7bW9kaWZpZXJzfVxuICAgKi9cbiAgbW9kaWZpZXJzOiBtb2RpZmllcnNcbn07XG5cbi8qKlxuICogQGNhbGxiYWNrIG9uQ3JlYXRlXG4gKiBAcGFyYW0ge2RhdGFPYmplY3R9IGRhdGFcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBvblVwZGF0ZVxuICogQHBhcmFtIHtkYXRhT2JqZWN0fSBkYXRhXG4gKi9cblxuLy8gVXRpbHNcbi8vIE1ldGhvZHNcbnZhciBQb3BwZXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFBvcHBlci5qcyBpbnN0YW5jZS5cbiAgICogQGNsYXNzIFBvcHBlclxuICAgKiBAcGFyYW0ge0VsZW1lbnR8cmVmZXJlbmNlT2JqZWN0fSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIGVsZW1lbnQgdXNlZCB0byBwb3NpdGlvbiB0aGUgcG9wcGVyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gcG9wcGVyIC0gVGhlIEhUTUwgLyBYTUwgZWxlbWVudCB1c2VkIGFzIHRoZSBwb3BwZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBZb3VyIGN1c3RvbSBvcHRpb25zIHRvIG92ZXJyaWRlIHRoZSBvbmVzIGRlZmluZWQgaW4gW0RlZmF1bHRzXSgjZGVmYXVsdHMpXG4gICAqIEByZXR1cm4ge09iamVjdH0gaW5zdGFuY2UgLSBUaGUgZ2VuZXJhdGVkIFBvcHBlci5qcyBpbnN0YW5jZVxuICAgKi9cbiAgZnVuY3Rpb24gUG9wcGVyKHJlZmVyZW5jZSwgcG9wcGVyKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQb3BwZXIpO1xuXG4gICAgdGhpcy5zY2hlZHVsZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3RoaXMudXBkYXRlKTtcbiAgICB9O1xuXG4gICAgLy8gbWFrZSB1cGRhdGUoKSBkZWJvdW5jZWQsIHNvIHRoYXQgaXQgb25seSBydW5zIGF0IG1vc3Qgb25jZS1wZXItdGlja1xuICAgIHRoaXMudXBkYXRlID0gZGVib3VuY2UodGhpcy51cGRhdGUuYmluZCh0aGlzKSk7XG5cbiAgICAvLyB3aXRoIHt9IHdlIGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3B0aW9ucyBpbnNpZGUgaXRcbiAgICB0aGlzLm9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgUG9wcGVyLkRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgIC8vIGluaXQgc3RhdGVcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNEZXN0cm95ZWQ6IGZhbHNlLFxuICAgICAgaXNDcmVhdGVkOiBmYWxzZSxcbiAgICAgIHNjcm9sbFBhcmVudHM6IFtdXG4gICAgfTtcblxuICAgIC8vIGdldCByZWZlcmVuY2UgYW5kIHBvcHBlciBlbGVtZW50cyAoYWxsb3cgalF1ZXJ5IHdyYXBwZXJzKVxuICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlICYmIHJlZmVyZW5jZS5qcXVlcnkgPyByZWZlcmVuY2VbMF0gOiByZWZlcmVuY2U7XG4gICAgdGhpcy5wb3BwZXIgPSBwb3BwZXIgJiYgcG9wcGVyLmpxdWVyeSA/IHBvcHBlclswXSA6IHBvcHBlcjtcblxuICAgIC8vIERlZXAgbWVyZ2UgbW9kaWZpZXJzIG9wdGlvbnNcbiAgICB0aGlzLm9wdGlvbnMubW9kaWZpZXJzID0ge307XG4gICAgT2JqZWN0LmtleXMoX2V4dGVuZHMoe30sIFBvcHBlci5EZWZhdWx0cy5tb2RpZmllcnMsIG9wdGlvbnMubW9kaWZpZXJzKSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgX3RoaXMub3B0aW9ucy5tb2RpZmllcnNbbmFtZV0gPSBfZXh0ZW5kcyh7fSwgUG9wcGVyLkRlZmF1bHRzLm1vZGlmaWVyc1tuYW1lXSB8fCB7fSwgb3B0aW9ucy5tb2RpZmllcnMgPyBvcHRpb25zLm1vZGlmaWVyc1tuYW1lXSA6IHt9KTtcbiAgICB9KTtcblxuICAgIC8vIFJlZmFjdG9yaW5nIG1vZGlmaWVycycgbGlzdCAoT2JqZWN0ID0+IEFycmF5KVxuICAgIHRoaXMubW9kaWZpZXJzID0gT2JqZWN0LmtleXModGhpcy5vcHRpb25zLm1vZGlmaWVycykubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBuYW1lOiBuYW1lXG4gICAgICB9LCBfdGhpcy5vcHRpb25zLm1vZGlmaWVyc1tuYW1lXSk7XG4gICAgfSlcbiAgICAvLyBzb3J0IHRoZSBtb2RpZmllcnMgYnkgb3JkZXJcbiAgICAuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xuICAgIH0pO1xuXG4gICAgLy8gbW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBhcmJpdHJhcnkgY29kZSB3aGVuIFBvcHBlci5qcyBnZXQgaW5pdGVkXG4gICAgLy8gc3VjaCBjb2RlIGlzIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIG9mIGl0cyBtb2RpZmllclxuICAgIC8vIHRoZXkgY291bGQgYWRkIG5ldyBwcm9wZXJ0aWVzIHRvIHRoZWlyIG9wdGlvbnMgY29uZmlndXJhdGlvblxuICAgIC8vIEJFIEFXQVJFOiBkb24ndCBhZGQgb3B0aW9ucyB0byBgb3B0aW9ucy5tb2RpZmllcnMubmFtZWAgYnV0IHRvIGBtb2RpZmllck9wdGlvbnNgIVxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyT3B0aW9ucykge1xuICAgICAgaWYgKG1vZGlmaWVyT3B0aW9ucy5lbmFibGVkICYmIGlzRnVuY3Rpb24obW9kaWZpZXJPcHRpb25zLm9uTG9hZCkpIHtcbiAgICAgICAgbW9kaWZpZXJPcHRpb25zLm9uTG9hZChfdGhpcy5yZWZlcmVuY2UsIF90aGlzLnBvcHBlciwgX3RoaXMub3B0aW9ucywgbW9kaWZpZXJPcHRpb25zLCBfdGhpcy5zdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBmaXJlIHRoZSBmaXJzdCB1cGRhdGUgdG8gcG9zaXRpb24gdGhlIHBvcHBlciBpbiB0aGUgcmlnaHQgcGxhY2VcbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgdmFyIGV2ZW50c0VuYWJsZWQgPSB0aGlzLm9wdGlvbnMuZXZlbnRzRW5hYmxlZDtcbiAgICBpZiAoZXZlbnRzRW5hYmxlZCkge1xuICAgICAgLy8gc2V0dXAgZXZlbnQgbGlzdGVuZXJzLCB0aGV5IHdpbGwgdGFrZSBjYXJlIG9mIHVwZGF0ZSB0aGUgcG9zaXRpb24gaW4gc3BlY2lmaWMgc2l0dWF0aW9uc1xuICAgICAgdGhpcy5lbmFibGVFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUuZXZlbnRzRW5hYmxlZCA9IGV2ZW50c0VuYWJsZWQ7XG4gIH1cblxuICAvLyBXZSBjYW4ndCB1c2UgY2xhc3MgcHJvcGVydGllcyBiZWNhdXNlIHRoZXkgZG9uJ3QgZ2V0IGxpc3RlZCBpbiB0aGVcbiAgLy8gY2xhc3MgcHJvdG90eXBlIGFuZCBicmVhayBzdHVmZiBsaWtlIFNpbm9uIHN0dWJzXG5cblxuICBjcmVhdGVDbGFzcyhQb3BwZXIsIFt7XG4gICAga2V5OiAndXBkYXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlJCQxKCkge1xuICAgICAgcmV0dXJuIHVwZGF0ZS5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2Rlc3Ryb3knLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95JCQxKCkge1xuICAgICAgcmV0dXJuIGRlc3Ryb3kuY2FsbCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdlbmFibGVFdmVudExpc3RlbmVycycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuYWJsZUV2ZW50TGlzdGVuZXJzJCQxKCkge1xuICAgICAgcmV0dXJuIGVuYWJsZUV2ZW50TGlzdGVuZXJzLmNhbGwodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGlzYWJsZUV2ZW50TGlzdGVuZXJzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzYWJsZUV2ZW50TGlzdGVuZXJzJCQxKCkge1xuICAgICAgcmV0dXJuIGRpc2FibGVFdmVudExpc3RlbmVycy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNjaGVkdWxlcyBhbiB1cGRhdGUuIEl0IHdpbGwgcnVuIG9uIHRoZSBuZXh0IFVJIHVwZGF0ZSBhdmFpbGFibGUuXG4gICAgICogQG1ldGhvZCBzY2hlZHVsZVVwZGF0ZVxuICAgICAqIEBtZW1iZXJvZiBQb3BwZXJcbiAgICAgKi9cblxuXG4gICAgLyoqXG4gICAgICogQ29sbGVjdGlvbiBvZiB1dGlsaXRpZXMgdXNlZnVsIHdoZW4gd3JpdGluZyBjdXN0b20gbW9kaWZpZXJzLlxuICAgICAqIFN0YXJ0aW5nIGZyb20gdmVyc2lvbiAxLjcsIHRoaXMgbWV0aG9kIGlzIGF2YWlsYWJsZSBvbmx5IGlmIHlvdVxuICAgICAqIGluY2x1ZGUgYHBvcHBlci11dGlscy5qc2AgYmVmb3JlIGBwb3BwZXIuanNgLlxuICAgICAqXG4gICAgICogKipERVBSRUNBVElPTioqOiBUaGlzIHdheSB0byBhY2Nlc3MgUG9wcGVyVXRpbHMgaXMgZGVwcmVjYXRlZFxuICAgICAqIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdjIhIFVzZSB0aGUgUG9wcGVyVXRpbHMgbW9kdWxlIGRpcmVjdGx5IGluc3RlYWQuXG4gICAgICogRHVlIHRvIHRoZSBoaWdoIGluc3RhYmlsaXR5IG9mIHRoZSBtZXRob2RzIGNvbnRhaW5lZCBpbiBVdGlscywgd2UgY2FuJ3RcbiAgICAgKiBndWFyYW50ZWUgdGhlbSB0byBmb2xsb3cgc2VtdmVyLiBVc2UgdGhlbSBhdCB5b3VyIG93biByaXNrIVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAxLjhcbiAgICAgKiBAbWVtYmVyIFV0aWxzXG4gICAgICogQG1lbWJlcm9mIFBvcHBlclxuICAgICAqL1xuXG4gIH1dKTtcbiAgcmV0dXJuIFBvcHBlcjtcbn0oKTtcblxuLyoqXG4gKiBUaGUgYHJlZmVyZW5jZU9iamVjdGAgaXMgYW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGNvbXBhdGlibGUgd2l0aCBQb3BwZXIuanNcbiAqIGFuZCBsZXRzIHlvdSB1c2UgaXQgYXMgcmVwbGFjZW1lbnQgb2YgYSByZWFsIERPTSBub2RlLjxiciAvPlxuICogWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gcG9zaXRpb24gYSBwb3BwZXIgcmVsYXRpdmVseSB0byBhIHNldCBvZiBjb29yZGluYXRlc1xuICogaW4gY2FzZSB5b3UgZG9uJ3QgaGF2ZSBhIERPTSBub2RlIHRvIHVzZSBhcyByZWZlcmVuY2UuXG4gKlxuICogYGBgXG4gKiBuZXcgUG9wcGVyKHJlZmVyZW5jZU9iamVjdCwgcG9wcGVyTm9kZSk7XG4gKiBgYGBcbiAqXG4gKiBOQjogVGhpcyBmZWF0dXJlIGlzbid0IHN1cHBvcnRlZCBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMC5cbiAqIEBuYW1lIHJlZmVyZW5jZU9iamVjdFxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZGF0YS5nZXRCb3VuZGluZ0NsaWVudFJlY3RcbiAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc2V0IG9mIGNvb3JkaW5hdGVzIGNvbXBhdGlibGUgd2l0aCB0aGUgbmF0aXZlIGBnZXRCb3VuZGluZ0NsaWVudFJlY3RgIG1ldGhvZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkYXRhLmNsaWVudFdpZHRoXG4gKiBBbiBFUzYgZ2V0dGVyIHRoYXQgd2lsbCByZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSB2aXJ0dWFsIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRhdGEuY2xpZW50SGVpZ2h0XG4gKiBBbiBFUzYgZ2V0dGVyIHRoYXQgd2lsbCByZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgdmlydHVhbCByZWZlcmVuY2UgZWxlbWVudC5cbiAqL1xuXG5cblBvcHBlci5VdGlscyA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbCkuUG9wcGVyVXRpbHM7XG5Qb3BwZXIucGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG5Qb3BwZXIuRGVmYXVsdHMgPSBEZWZhdWx0cztcblxuZXhwb3J0IGRlZmF1bHQgUG9wcGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9wcGVyLmpzLm1hcFxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };\n\nvar g;\n\n// This works in non-strict mode\ng = function () {\n\treturn this;\n}();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function("return this")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif ((typeof window === "undefined" ? "undefined" : _typeof(window)) === "object") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it\'s\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzP2NkMDAiXSwibmFtZXMiOlsiZyIsIkZ1bmN0aW9uIiwiZSIsIndpbmRvdyIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFJQSxDQUFKOztBQUVBO0FBQ0FBLElBQUssWUFBVztBQUNmLFFBQU8sSUFBUDtBQUNBLENBRkcsRUFBSjs7QUFJQSxJQUFJO0FBQ0g7QUFDQUEsS0FBSUEsS0FBSyxJQUFJQyxRQUFKLENBQWEsYUFBYixHQUFUO0FBQ0EsQ0FIRCxDQUdFLE9BQU9DLENBQVAsRUFBVTtBQUNYO0FBQ0EsS0FBSSxRQUFPQyxNQUFQLHlDQUFPQSxNQUFQLE9BQWtCLFFBQXRCLEVBQWdDSCxJQUFJRyxNQUFKO0FBQ2hDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQUMsT0FBT0MsT0FBUCxHQUFpQkwsQ0FBakIiLCJmaWxlIjoiMTAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///10\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _shiptimizeUtils = __webpack_require__(0);\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nvar _shiptimizeWeightBasedShipping = __webpack_require__(12);\n\nvar _shiptimizeWeightBasedShipping2 = _interopRequireDefault(_shiptimizeWeightBasedShipping);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar WooShipitmizeAdmin = function () {\n function WooShipitmizeAdmin() {\n _classCallCheck(this, WooShipitmizeAdmin);\n\n this.wbs = new _shiptimizeWeightBasedShipping2.default();\n }\n\n _createClass(WooShipitmizeAdmin, [{\n key: 'bootstrap',\n value: function bootstrap() {\n this.urlParams();\n }\n\n /** \n * If the export was successfull \n * @param string appLink - the login url \n */\n\n }, {\n key: 'exportSuccess',\n value: function exportSuccess(appLink) {\n if (appLink.trim().length == 0) {\n return;\n }\n\n _shiptimizeUtils2.default.openNewWindow(appLink, '');\n }\n\n /** \n * @param int id - the carrier id \n */\n\n }, {\n key: 'getCarrier',\n value: function getCarrier(id) {\n for (var x = 0; x < shiptimize_carriers.length; ++x) {\n if (shiptimize_carriers[x].Id == id) {\n return shiptimize_carriers[x];\n }\n }\n }\n\n /** \n * Show aditional options for carrier \n */\n\n }, {\n key: 'selectOptions',\n value: function selectOptions(elem) {\n this.selectServiceLevel(elem, jQuery('.shiptimize__service-level').val());\n // hide the extra options for now \n // this.selectExtraOptions(elem, jQuery('.shiptimize__extra-options').val());\n }\n\n /** \n * @param DomElement elem - the carrier select \n */\n\n }, {\n key: 'selectServiceLevel',\n value: function selectServiceLevel(elem, service_id) {\n var carrier_id = elem.val();\n var carrier = this.getCarrier(carrier_id);\n var eServiceLevel = elem.siblings(\".shiptimize__service-level\");\n\n var options_html = '';\n\n if (_typeof(carrier.OptionList) != undefined) {\n var options = carrier.OptionList;\n\n for (var x = 0; x < options.length; ++x) {\n if (options[x].Type == 1 && typeof options[x].OptionValues != 'undefined') {\n var values = options[x].OptionValues;\n options_html += \"<option>-</option>\";\n for (var i = 0; i < values.length; ++i) {\n var selected = service_id == values[i].Id ? 'selected' : '';\n options_html += \"<option value='\" + values[i].Id + \"' \" + selected + \" >\" + values[i].Name + \"</option>\";\n }\n }\n }\n }\n\n eServiceLevel.html(options_html);\n if (options_html) {\n eServiceLevel.addClass(\"active\");\n } else {\n eServiceLevel.removeClass(\"active\");\n }\n }\n }, {\n key: 'selectExtraOptions',\n value: function selectExtraOptions(elem, selected_id) {\n var carrier_id = elem.val();\n var carrier = this.getCarrier(carrier_id);\n var eExtraoptions = elem.siblings(\".shiptimize__extra-options\");\n\n var options_html = '';\n var option_values_html = [];\n\n if (_typeof(carrier.OptionList) != undefined) {\n var options = carrier.OptionList;\n for (var x = 0; x < options.length; ++x) {\n if (options[x].Type == 0) {\n if (!options_html) {\n options_html += \"<option>-</option>\";\n }\n var selected = selected_id == options[x].Id ? 'selected' : '';\n options_html += \"<option value='\" + options[x].Id + \"' \" + selected + \" >\" + options[x].Name + \"</option>\";\n }\n\n if (options[x].OptionValues && options[x].OptionValues.length > 0) {\n var vhtml = '<select id=\"shiptimize-optionvalues' + options[x].Id + '\" class=\"shiptimize__optionvalues\">';\n for (var j = 0; j < options[x].OptionValues.length; ++j) {\n vhtml += '<option>' + options[x].OptionValues[j] + '</options>';\n }\n\n vhtml += '<select>';\n }\n }\n }\n\n eExtraoptions.html(options_html);\n if (options_html) {\n eExtraoptions.addClass(\"active\");\n } else {\n eExtraoptions.removeClass(\"active\");\n }\n }\n }, {\n key: 'selectTab',\n value: function selectTab(idx) {\n jQuery(\".nav-tab\").removeClass('nav-tab-active');\n jQuery(jQuery(\".nav-tab\").get(idx)).addClass('nav-tab-active');\n\n jQuery(\".tab\").removeClass('active');\n jQuery(jQuery(\".tab\").get(idx)).addClass('active');\n }\n }, {\n key: 'accordion',\n value: function accordion(elem) {\n var $eparent = jQuery(elem).parent();\n if ($eparent.hasClass('open')) {\n $eparent.removeClass('open');\n } else {\n $eparent.addClass('open');\n }\n }\n\n /** \n * Is there stuff in the url params we care about? \n **/\n\n }, {\n key: 'urlParams',\n value: function urlParams() {\n var parts = document.location.search.split('&');\n for (var x = 0; x < parts.length; ++x) {\n var keyval = parts[x].split('=');\n var key = keyval[0];\n var value = decodeURIComponent(keyval[1]);\n\n if (key == 'CallbackURL') {\n console.log(\"We are creating a label\");\n shiptimize.openLoader(shiptimize_label_request);\n shiptimize.monitorLabelStatus(value);\n }\n }\n }\n }]);\n\n return WooShipitmizeAdmin;\n}();\n\nexports.default = WooShipitmizeAdmin;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdvby1jb21tZXJjZS1hZG1pbi5qcz80MDA5Il0sIm5hbWVzIjpbIldvb1NoaXBpdG1pemVBZG1pbiIsIndicyIsIlNoaXB0aW1pemVXZWlnaHRCYXNlZFNoaXBwaW5nIiwidXJsUGFyYW1zIiwiYXBwTGluayIsInRyaW0iLCJsZW5ndGgiLCJVdGlscyIsIm9wZW5OZXdXaW5kb3ciLCJpZCIsIngiLCJzaGlwdGltaXplX2NhcnJpZXJzIiwiSWQiLCJlbGVtIiwic2VsZWN0U2VydmljZUxldmVsIiwialF1ZXJ5IiwidmFsIiwic2VydmljZV9pZCIsImNhcnJpZXJfaWQiLCJjYXJyaWVyIiwiZ2V0Q2FycmllciIsImVTZXJ2aWNlTGV2ZWwiLCJzaWJsaW5ncyIsIm9wdGlvbnNfaHRtbCIsIk9wdGlvbkxpc3QiLCJ1bmRlZmluZWQiLCJvcHRpb25zIiwiVHlwZSIsIk9wdGlvblZhbHVlcyIsInZhbHVlcyIsImkiLCJzZWxlY3RlZCIsIk5hbWUiLCJodG1sIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInNlbGVjdGVkX2lkIiwiZUV4dHJhb3B0aW9ucyIsIm9wdGlvbl92YWx1ZXNfaHRtbCIsInZodG1sIiwiaiIsImlkeCIsImdldCIsIiRlcGFyZW50IiwicGFyZW50IiwiaGFzQ2xhc3MiLCJwYXJ0cyIsImRvY3VtZW50IiwibG9jYXRpb24iLCJzZWFyY2giLCJzcGxpdCIsImtleXZhbCIsImtleSIsInZhbHVlIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiY29uc29sZSIsImxvZyIsInNoaXB0aW1pemUiLCJvcGVuTG9hZGVyIiwic2hpcHRpbWl6ZV9sYWJlbF9yZXF1ZXN0IiwibW9uaXRvckxhYmVsU3RhdHVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7Ozs7Ozs7SUFFcUJBLGtCO0FBRWpCLGtDQUFjO0FBQUE7O0FBQ1YsYUFBS0MsR0FBTCxHQUFXLElBQUlDLHVDQUFKLEVBQVg7QUFD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IjpbImltcG9ydCBVdGlscyBmcm9tICcuL3NoaXB0aW1pemUtdXRpbHMuanMnOyBcbmltcG9ydCBTaGlwdGltaXplV2VpZ2h0QmFzZWRTaGlwcGluZyBmcm9tICcuL3NoaXB0aW1pemUtd2VpZ2h0LWJhc2VkLXNoaXBwaW5nLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV29vU2hpcGl0bWl6ZUFkbWluIHsgICAgXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy53YnMgPSBuZXcgU2hpcHRpbWl6ZVdlaWdodEJhc2VkU2hpcHBpbmcoKTtcbiAgICB9XG5cbiAgICBib290c3RyYXAoKSB7IFxuICAgICAgICB0aGlzLnVybFBhcmFtcygpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBJZiB0aGUgZXhwb3J0IHdhcyBzdWNjZXNzZnVsbCBcbiAgICAgKiBAcGFyYW0gc3RyaW5nIGFwcExpbmsgLSB0aGUgbG9naW4gdXJsIFxuICAgICAqL1xuICAgIGV4cG9ydFN1Y2Nlc3MoYXBwTGluaykge1xuICAgICAgICBpZihhcHBMaW5rLnRyaW0oKS5sZW5ndGggPT0gMCl7XG4gICAgICAgICAgICByZXR1cm47IFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBVdGlscy5vcGVuTmV3V2luZG93KGFwcExpbmssICcnKTsgXG4gICAgfSBcblxuICAgIC8qKiBcbiAgICAgKiBAcGFyYW0gaW50IGlkIC0gdGhlIGNhcnJpZXIgaWQgXG4gICAgICovIFxuICAgIGdldENhcnJpZXIoaWQpe1xuICAgICAgICBmb3IoIGxldCB4ID0gMDsgeCA8IHNoaXB0aW1pemVfY2FycmllcnMubGVuZ3RoOyArK3ggKXtcbiAgICAgICAgICAgIGlmKHNoaXB0aW1pemVfY2FycmllcnNbeF0uSWQgPT0gaWQpe1xuICAgICAgICAgICAgICAgIHJldHVybiBzaGlwdGltaXplX2NhcnJpZXJzW3hdOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBTaG93IGFkaXRpb25hbCBvcHRpb25zIGZvciBjYXJyaWVyIFxuICAgICAqLyBcbiAgICBzZWxlY3RPcHRpb25zKGVsZW0pe1xuICAgICAgICB0aGlzLnNlbGVjdFNlcnZpY2VMZXZlbChlbGVtLCBqUXVlcnkoJy5zaGlwdGltaXplX19zZXJ2aWNlLWxldmVsJykudmFsKCkpOyBcbiAgICAgICAgLy8gaGlkZSB0aGUgZXh0cmEgb3B0aW9ucyBmb3Igbm93IFxuICAgICAgICAvLyB0aGlzLnNlbGVjdEV4dHJhT3B0aW9ucyhlbGVtLCBqUXVlcnkoJy5zaGlwdGltaXplX19leHRyYS1vcHRpb25zJykudmFsKCkpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBAcGFyYW0gRG9tRWxlbWVudCAgZWxlbSAtIHRoZSBjYXJyaWVyIHNlbGVjdCBcbiAgICAgKi8gXG4gICAgc2VsZWN0U2VydmljZUxldmVsKCBlbGVtICwgc2VydmljZV9pZCApIHtcbiAgICAgICAgbGV0IGNhcnJpZXJfaWQgPSBlbGVtLnZhbCgpOyBcbiAgICAgICAgbGV0IGNhcnJpZXIgPSB0aGlzLmdldENhcnJpZXIoY2Fycmllcl9pZCk7IFxuICAgICAgICBsZXQgZVNlcnZpY2VMZXZlbCA9IGVsZW0uc2libGluZ3MoXCIuc2hpcHRpbWl6ZV9fc2VydmljZS1sZXZlbFwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc19odG1sID0gJyc7XG5cbiAgICAgICAgaWYoIHR5cGVvZihjYXJyaWVyLk9wdGlvbkxpc3QpICE9IHVuZGVmaW5lZCApe1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBjYXJyaWVyLk9wdGlvbkxpc3Q7IFxuXG4gICAgICAgICAgICBmb3IoIGxldCB4ID0gMDsgeCA8IG9wdGlvbnMubGVuZ3RoOyArK3gpe1xuICAgICAgICAgICAgICAgIGlmKCBvcHRpb25zW3hdLlR5cGUgPT0gMSAmJiB0eXBlb2Yob3B0aW9uc1t4XS5PcHRpb25WYWx1ZXMpICE9ICd1bmRlZmluZWQnICl7ICBcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IG9wdGlvbnNbeF0uT3B0aW9uVmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zX2h0bWwgKz0gXCI8b3B0aW9uPi08L29wdGlvbj5cIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yKCBsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kgKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IHNlcnZpY2VfaWQgPT0gdmFsdWVzW2ldLklkID8gJ3NlbGVjdGVkJyA6Jyc7IFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc19odG1sICs9IFwiPG9wdGlvbiB2YWx1ZT0nXCIgKyB2YWx1ZXNbaV0uSWQgKyBcIicgXCIgKyBzZWxlY3RlZCArIFwiID5cIiArIHZhbHVlc1tpXS5OYW1lICsgXCI8L29wdGlvbj5cIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVTZXJ2aWNlTGV2ZWwuaHRtbChvcHRpb25zX2h0bWwpO1xuICAgICAgICBpZihvcHRpb25zX2h0bWwpe1xuICAgICAgICAgICAgZVNlcnZpY2VMZXZlbC5hZGRDbGFzcyhcImFjdGl2ZVwiKTsgXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlU2VydmljZUxldmVsLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBzZWxlY3RFeHRyYU9wdGlvbnMoIGVsZW0sIHNlbGVjdGVkX2lkICl7IGxldCBjYXJyaWVyX2lkID0gZWxlbS52YWwoKTsgXG4gICAgICAgIGxldCBjYXJyaWVyID0gdGhpcy5nZXRDYXJyaWVyKGNhcnJpZXJfaWQpOyBcbiAgICAgICAgbGV0IGVFeHRyYW9wdGlvbnMgPSBlbGVtLnNpYmxpbmdzKFwiLnNoaXB0aW1pemVfX2V4dHJhLW9wdGlvbnNcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfaHRtbCA9ICcnO1xuICAgICAgICBsZXQgb3B0aW9uX3ZhbHVlc19odG1sID0gW107IFxuXG4gICAgICAgIGlmKCB0eXBlb2YoY2Fycmllci5PcHRpb25MaXN0KSAhPSB1bmRlZmluZWQgKXtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gY2Fycmllci5PcHRpb25MaXN0OyBcbiAgICAgICAgICAgIGZvciggbGV0IHggPSAwOyB4IDwgb3B0aW9ucy5sZW5ndGg7ICsreCl7XG4gICAgICAgICAgICAgICAgaWYoIG9wdGlvbnNbeF0uVHlwZSA9PSAwICl7ICBcbiAgICAgICAgICAgICAgICAgICAgaWYoIW9wdGlvbnNfaHRtbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zX2h0bWwgKz0gXCI8b3B0aW9uPi08L29wdGlvbj5cIjtcbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gc2VsZWN0ZWRfaWQgPT0gb3B0aW9uc1t4XS5JZCA/ICdzZWxlY3RlZCcgOicnOyBcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc19odG1sICs9IFwiPG9wdGlvbiB2YWx1ZT0nXCIgKyBvcHRpb25zW3hdLklkICsgXCInIFwiICsgc2VsZWN0ZWQgKyBcIiA+XCIgKyBvcHRpb25zW3hdLk5hbWUgKyBcIjwvb3B0aW9uPlwiOyBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1t4XS5PcHRpb25WYWx1ZXMgJiYgb3B0aW9uc1t4XS5PcHRpb25WYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmh0bWwgPSAnPHNlbGVjdCBpZD1cInNoaXB0aW1pemUtb3B0aW9udmFsdWVzJyArIG9wdGlvbnNbeF0uSWQgKydcIiBjbGFzcz1cInNoaXB0aW1pemVfX29wdGlvbnZhbHVlc1wiPic7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGo9MDsgaiA8IG9wdGlvbnNbeF0uT3B0aW9uVmFsdWVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aHRtbCArPSAnPG9wdGlvbj4nICsgb3B0aW9uc1t4XS5PcHRpb25WYWx1ZXNbal0gKyAnPC9vcHRpb25zPic7XG4gICAgICAgICAgICAgICAgICAgIH0gXG5cbiAgICAgICAgICAgICAgICAgICAgdmh0bWwgKz0gJzxzZWxlY3Q+JzsgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVFeHRyYW9wdGlvbnMuaHRtbChvcHRpb25zX2h0bWwpO1xuICAgICAgICBpZihvcHRpb25zX2h0bWwpe1xuICAgICAgICAgICAgZUV4dHJhb3B0aW9ucy5hZGRDbGFzcyhcImFjdGl2ZVwiKTsgXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlRXh0cmFvcHRpb25zLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xuICAgICAgICB9IFxuICAgIH0gXG4gXG4gICAgc2VsZWN0VGFiKGlkeCl7XG4gICAgICAgIGpRdWVyeShcIi5uYXYtdGFiXCIpLnJlbW92ZUNsYXNzKCduYXYtdGFiLWFjdGl2ZScpO1xuICAgICAgICBqUXVlcnkoalF1ZXJ5KFwiLm5hdi10YWJcIikuZ2V0KGlkeCkpLmFkZENsYXNzKCduYXYtdGFiLWFjdGl2ZScpOyBcblxuICAgICAgICBqUXVlcnkoXCIudGFiXCIpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsgXG4gICAgICAgIGpRdWVyeShqUXVlcnkoXCIudGFiXCIpLmdldChpZHgpKS5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgfVxuXG4gICAgYWNjb3JkaW9uKGVsZW0pe1xuICAgICAgICBsZXQgJGVwYXJlbnQgPSBqUXVlcnkoZWxlbSkucGFyZW50KCk7IFxuICAgICAgICBpZiAoJGVwYXJlbnQuaGFzQ2xhc3MoJ29wZW4nKSkge1xuICAgICAgICAgICAgJGVwYXJlbnQucmVtb3ZlQ2xhc3MoJ29wZW4nKTsgXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAkZXBhcmVudC5hZGRDbGFzcygnb3BlbicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICogSXMgdGhlcmUgc3R1ZmYgaW4gdGhlIHVybCBwYXJhbXMgd2UgY2FyZSBhYm91dD8gXG4gICAgKiovXG4gICAgdXJsUGFyYW1zKCkge1xuICAgICAgICBsZXQgcGFydHMgPSBkb2N1bWVudC5sb2NhdGlvbi5zZWFyY2guc3BsaXQoJyYnKTsgXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgcGFydHMubGVuZ3RoOyArK3gpIHtcbiAgICAgICAgICBsZXQga2V5dmFsID0gcGFydHNbeF0uc3BsaXQoJz0nKTsgXG4gICAgICAgICAgbGV0IGtleSA9IGtleXZhbFswXTtcbiAgICAgICAgICBsZXQgdmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5dmFsWzFdKTsgXG5cbiAgICAgICAgICBpZihrZXkgPT0gJ0NhbGxiYWNrVVJMJykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJXZSBhcmUgY3JlYXRpbmcgYSBsYWJlbFwiKTtcbiAgICAgICAgICAgIHNoaXB0aW1pemUub3BlbkxvYWRlcihzaGlwdGltaXplX2xhYmVsX3JlcXVlc3QpOyBcbiAgICAgICAgICAgIHNoaXB0aW1pemUubW9uaXRvckxhYmVsU3RhdHVzKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///11\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\n/** \n * plug into the dom and append shiptimize settings\n * Save on change via ajax \n * We can\'t save rule by rule withough pluggin into the checkout \n * Currently only the instance id is saved \n */\nvar ShiptimizeWeightBasedShipping = function () {\n function ShiptimizeWeightBasedShipping() {\n _classCallCheck(this, ShiptimizeWeightBasedShipping);\n\n console.log("Shiptimize options for WeightBasedShipping");\n this.init();\n }\n\n _createClass(ShiptimizeWeightBasedShipping, [{\n key: "init",\n value: function init() {\n //not a shipping method page \n if (typeof shiptimize_carrier == \'undefined\') {\n return;\n }\n\n var regexInstance = /instance_id=([0-9]*)/.exec(window.location.search);\n\n if (!regexInstance) {\n console.log("invalid url params cannot find instance_id " + window.location.search);\n return;\n }\n\n this.instance_id = regexInstance[1];\n this.attachShiptimizeOptions();\n }\n\n /** \n * Save our options for this instance \n */\n\n }, {\n key: "saveOptions",\n value: function saveOptions(elem) {\n var data = {\n \'data\': this.eForm.serializeArray(),\n \'instance_id\': this.instance_id,\n \'action\': \'shiptimize_wbs_settings\'\n };\n\n jQuery.post(ajaxurl, data, function (resp) {\n console.log("response ", resp);\n });\n\n console.log(this.eForm, "Saveoptions ", data);\n\n jQuery(".shiptimize-optionvalues").hide();\n var extraOption = jQuery(".shiptimize-extraoptions").val();\n jQuery("#shiptimize-extraoptions" + extraOption).show();\n }\n\n /** \n * Attach the shiptimize options under the title \n */\n\n }, {\n key: "attachShiptimizeOptions",\n value: function attachShiptimizeOptions() {\n\n var eShiptimizeOptions = jQuery("<form id=\'shiptimizeoptions\' class=\\"wbs-shiptimizeoptions\\"></form>");\n var oHtml = \'\';\n\n //no options , nothing to do \n if (typeof shiptimize_carrier.OptionList == \'undefined\') {\n return;\n }\n\n //shiptimize_extraoptions\n //shiptimize_checkboxes\n //Add a Save button \n var htmlServiceLevels = \'\';\n var htmlExtraOptions = \'\';\n var htmlCheckboxes = \'\';\n var htmlExtravalues = \'\';\n for (var x = 0; x < shiptimize_carrier.OptionList.length; ++x) {\n var option = shiptimize_carrier.OptionList[x];\n\n if (option.Type == 1) {\n if (typeof option.OptionValues != \'undefined\') {\n for (var i = 0; i < option.OptionValues.length; ++i) {\n var optionChild = option.OptionValues[i];\n var selected = shiptimize_options[\'service_level\'] == optionChild.Id ? \'selected\' : \'\';\n htmlServiceLevels += "<option value=\'" + optionChild.Id + "\' " + selected + ">" + optionChild.Name + "</option>";\n }\n }\n } else if (shiptimize_extraoptions.includes(option.Id + "")) {\n var _selected = shiptimize_options[\'extraoptions\'] == option.Id ? \'selected\' : \'\';\n htmlExtraOptions += "<option value=\'" + option.Id + "\' " + _selected + ">" + option.Name + "</option>";\n if (option.OptionFields && option.OptionFields.length > 0) {\n for (var j = 0; j < option.OptionFields.length; ++j) {\n if (option.OptionFields[j].OptionValues) {\n var optionField = option.OptionFields[j];\n htmlExtravalues += \'<select class="shiptimize-optionvalues" id="shiptimize-extraoptions\' + option.Id + \'" name="extraoptions\' + option.Id + \'" onchange=\\"shiptimize.platform.wbs.saveOptions(jQuery(this))\\">\';\n for (var i = 0; i < optionField.OptionValues.length; ++i) {\n var _optionChild = optionField.OptionValues[i];\n var _selected2 = shiptimize_options[\'extraoptionvalue\' + option.Id] == _optionChild.Id ? \'selected\' : \'\';\n htmlExtravalues += "<option value=\'" + _optionChild.Id + "\' " + _selected2 + ">" + _optionChild.Name + "</option>";\n }\n htmlExtravalues += \'</select>\';\n }\n }\n }\n } else {\n var keys = Object.keys(shiptimize_checkboxes);\n for (var i = 0; i < keys.length; ++i) {\n if (option.Id == keys[i]) {\n var optionName = shiptimize_checkboxes[option.Id];\n var checked = shiptimize_options[optionName] == option.Id ? \'checked\' : \'\';\n htmlCheckboxes += \'<span class="wbs-shiptimize-option"><input \' + checked + \' class="wbs-rse-checkbox" onchange="shiptimize.platform.wbs.saveOptions(jQuery(this))" type="checkbox" name="\' + optionName + \'" value="\' + option.Id + \'"/>\' + shiptimize_checkboxes[option.Id] + "</span>";\n }\n }\n }\n }\n\n if (htmlServiceLevels.length > 0) {\n oHtml += "<span class=\\"wbs-shiptimize-option\\"><label>" + shiptimize_labels.service_level + "</label> <select name=\\"service_level\\" onchange=\\"shiptimize.platform.wbs.saveOptions(jQuery(this))\\"><option>-</option>" + htmlServiceLevels + "</select></span>";\n }\n\n if (htmlExtraOptions.length > 0) {\n oHtml += "<span class=\\"wbs-shiptimize-option\\"><label>" + shiptimize_labels.extraoptions + "</label> <select class=\'shiptimize-extraoptions\' name=\\"extraoptions\\" onchange=\\"shiptimize.platform.wbs.saveOptions(jQuery(this))\\"><option>-</option>" + htmlExtraOptions + "</select> " + htmlExtravalues + " </span>";\n }\n\n oHtml += htmlCheckboxes;\n\n //Pickup Behaviour?\n if (shiptimize_carrier.HasPickup) {\n var selecthtml = \'<select class="shiptimize-extraoptions" name="pickupbehaviour" onchange=\\"shiptimize.platform.wbs.saveOptions(jQuery(this))\\">\';\n for (var x = 0; x < 3; ++x) {\n var _selected3 = shiptimize_options[\'pickupbehaviour\'] == x ? \'selected\' : \'\';\n selecthtml += "<option value=\\"" + x + "\\" " + _selected3 + ">" + shiptimize_labels[\'pickup\' + x] + "</option>";\n }\n selecthtml += \'</select>\';\n\n oHtml += "<span class=\\"wbs-shiptimize-option\\"><label>" + shiptimize_labels.pickupbehaviour + "</label> " + selecthtml + "</span>";\n }\n\n if (oHtml.length > 0) {\n eShiptimizeOptions.html("<h3>Shiptimize Settings</h3>" + oHtml);\n eShiptimizeOptions.insertAfter(jQuery("#mainform"));\n this.eForm = jQuery("#shiptimizeoptions");\n this.saveOptions(jQuery(".shiptimize-extraoptions"));\n }\n }\n }]);\n\n return ShiptimizeWeightBasedShipping;\n}();\n\nexports.default = ShiptimizeWeightBasedShipping;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdlaWdodC1iYXNlZC1zaGlwcGluZy5qcz8yZThjIl0sIm5hbWVzIjpbIlNoaXB0aW1pemVXZWlnaHRCYXNlZFNoaXBwaW5nIiwiY29uc29sZSIsImxvZyIsImluaXQiLCJzaGlwdGltaXplX2NhcnJpZXIiLCJyZWdleEluc3RhbmNlIiwiZXhlYyIsIndpbmRvdyIsImxvY2F0aW9uIiwic2VhcmNoIiwiaW5zdGFuY2VfaWQiLCJhdHRhY2hTaGlwdGltaXplT3B0aW9ucyIsImVsZW0iLCJkYXRhIiwiZUZvcm0iLCJzZXJpYWxpemVBcnJheSIsImpRdWVyeSIsInBvc3QiLCJhamF4dXJsIiwicmVzcCIsImhpZGUiLCJleHRyYU9wdGlvbiIsInZhbCIsInNob3ciLCJlU2hpcHRpbWl6ZU9wdGlvbnMiLCJvSHRtbCIsIk9wdGlvbkxpc3QiLCJodG1sU2VydmljZUxldmVscyIsImh0bWxFeHRyYU9wdGlvbnMiLCJodG1sQ2hlY2tib3hlcyIsImh0bWxFeHRyYXZhbHVlcyIsIngiLCJsZW5ndGgiLCJvcHRpb24iLCJUeXBlIiwiT3B0aW9uVmFsdWVzIiwiaSIsIm9wdGlvbkNoaWxkIiwic2VsZWN0ZWQiLCJzaGlwdGltaXplX29wdGlvbnMiLCJJZCIsIk5hbWUiLCJzaGlwdGltaXplX2V4dHJhb3B0aW9ucyIsImluY2x1ZGVzIiwiT3B0aW9uRmllbGRzIiwiaiIsIm9wdGlvbkZpZWxkIiwia2V5cyIsIk9iamVjdCIsInNoaXB0aW1pemVfY2hlY2tib3hlcyIsIm9wdGlvbk5hbWUiLCJjaGVja2VkIiwic2hpcHRpbWl6ZV9sYWJlbHMiLCJzZXJ2aWNlX2xldmVsIiwiZXh0cmFvcHRpb25zIiwiSGFzUGlja3VwIiwic2VsZWN0aHRtbCIsInBpY2t1cGJlaGF2aW91ciIsImh0bWwiLCJpbnNlcnRBZnRlciIsInNhdmVPcHRpb25zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7Ozs7OztJQU1xQkEsNkI7QUFFbkIs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QUFkOztBQUVBL0IsbUVBQXlEMkIsa0JBQWtCSyxlQUEzRSxpQkFBc0dELFVBQXRHO0FBQ0Q7O0FBR0QsVUFBSS9CLE1BQU1PLE1BQU4sR0FBZSxDQUFuQixFQUFzQjtBQUNwQlIsMkJBQW1Ca0MsSUFBbkIsQ0FBd0IsaUNBQWlDakMsS0FBekQ7QUFDQUQsMkJBQW1CbUMsV0FBbkIsQ0FBK0IzQyxPQUFPLFdBQVAsQ0FBL0I7QUFDQSxhQUFLRixLQUFMLEdBQWFFLE9BQU8sb0JBQVAsQ0FBYjtBQUNBLGFBQUs0QyxXQUFMLENBQWlCNUMsT0FBTywwQkFBUCxDQUFqQjtBQUNEO0FBRUY7Ozs7OztrQkF6SWtCaEIsNkIiLCJmaWxlIjoiMTIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogXG4gKiBwbHVnIGludG8gdGhlICBkb20gYW5kICBhcHBlbmQgc2hpcHRpbWl6ZSBzZXR0aW5nc1xuICogU2F2ZSBvbiBjaGFuZ2UgdmlhIGFqYXggXG4gKiBXZSBjYW4ndCBzYXZlIHJ1bGUgYnkgcnVsZSB3aXRob3VnaCBwbHVnZ2luIGludG8gdGhlIGNoZWNrb3V0IFxuICogQ3VycmVudGx5IG9ubHkgdGhlIGluc3RhbmNlIGlkIGlzIHNhdmVkIFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGlwdGltaXplV2VpZ2h0QmFzZWRTaGlwcGluZyB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc29sZS5sb2coXCJTaGlwdGltaXplIG9wdGlvbnMgZm9yIFdlaWdodEJhc2VkU2hpcHBpbmdcIik7XG4gICAgdGhpcy5pbml0KCk7XG5cbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgLy9ub3QgYSBzaGlwcGluZyBtZXRob2QgcGFnZSBcbiAgICBpZiAodHlwZW9mIChzaGlwdGltaXplX2NhcnJpZXIpID09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVnZXhJbnN0YW5jZSA9IC9pbnN0YW5jZV9pZD0oWzAtOV0qKS8uZXhlYyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcblxuICAgIGlmICghcmVnZXhJbnN0YW5jZSkge1xuICAgICAgY29uc29sZS5sb2coXCJpbnZhbGlkIHVybCBwYXJhbXMgY2Fubm90IGZpbmQgaW5zdGFuY2VfaWQgXCIgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmluc3RhbmNlX2lkID0gcmVnZXhJbnN0YW5jZVsxXTtcbiAgICB0aGlzLmF0dGFjaFNoaXB0aW1pemVPcHRpb25zKCk7XG4gIH1cblxuICAvKiogXG4gICAqIFNhdmUgb3VyIG9wdGlvbnMgZm9yIHRoaXMgaW5zdGFuY2UgXG4gICAqL1xuICBzYXZlT3B0aW9ucyhlbGVtKSB7XG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICAnZGF0YSc6IHRoaXMuZUZvcm0uc2VyaWFsaXplQXJyYXkoKSxcbiAgICAgICdpbnN0YW5jZV9pZCc6IHRoaXMuaW5zdGFuY2VfaWQsXG4gICAgICAnYWN0aW9uJzogJ3NoaXB0aW1pemVfd2JzX3NldHRpbmdzJ1xuICAgIH07XG5cbiAgICBqUXVlcnkucG9zdChhamF4dXJsLCBkYXRhLCBmdW5jdGlvbiAocmVzcCkge1xuICAgICAgY29uc29sZS5sb2coXCJyZXNwb25zZSBcIiwgcmVzcCk7XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyh0aGlzLmVGb3JtLCBcIlNhdmVvcHRpb25zIFwiLCBkYXRhKTtcbiAgICBcbiAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1vcHRpb252YWx1ZXNcIikuaGlkZSgpO1xuICAgIHZhciBleHRyYU9wdGlvbiA9IGpRdWVyeShcIi5zaGlwdGltaXplLWV4dHJhb3B0aW9uc1wiKS52YWwoKTsgXG4gICAgalF1ZXJ5KFwiI3NoaXB0aW1pemUtZXh0cmFvcHRpb25zXCIrZXh0cmFPcHRpb24pLnNob3coKTtcbiAgICAgXG4gIH1cblxuICAvKiogXG4gICAqIEF0dGFjaCB0aGUgc2hpcHRpbWl6ZSBvcHRpb25zIHVuZGVyIHRoZSB0aXRsZSAgIFxuICAgKi9cbiAgYXR0YWNoU2hpcHRpbWl6ZU9wdGlvbnMoKSB7XG5cbiAgICB2YXIgZVNoaXB0aW1pemVPcHRpb25zID0galF1ZXJ5KFwiPGZvcm0gaWQ9J3NoaXB0aW1pemVvcHRpb25zJyBjbGFzcz1cXFwid2JzLXNoaXB0aW1pemVvcHRpb25zXFxcIj48L2Zvcm0+XCIpO1xuICAgIHZhciBvSHRtbCA9ICcnO1xuXG4gICAgLy9ubyBvcHRpb25zICwgbm90aGluZyB0byBkbyBcbiAgICBpZiAodHlwZW9mIChzaGlwdGltaXplX2NhcnJpZXIuT3B0aW9uTGlzdCkgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvL3NoaXB0aW1pemVfZXh0cmFvcHRpb25zXG4gICAgLy9zaGlwdGltaXplX2NoZWNrYm94ZXNcbiAgICAvL0FkZCBhIFNhdmUgYnV0dG9uIFxuICAgIGxldCBodG1sU2VydmljZUxldmVscyA9ICcnO1xuICAgIGxldCBodG1sRXh0cmFPcHRpb25zID0gJyc7XG4gICAgbGV0IGh0bWxDaGVja2JveGVzID0gJyc7XG4gICAgbGV0IGh0bWxFeHRyYXZhbHVlcyA9ICcnOyBcbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHNoaXB0aW1pemVfY2Fycmllci5PcHRpb25MaXN0Lmxlbmd0aDsgKyt4KSB7XG4gICAgICBjb25zdCBvcHRpb24gPSBzaGlwdGltaXplX2NhcnJpZXIuT3B0aW9uTGlzdFt4XTtcblxuICAgICAgaWYgKG9wdGlvbi5UeXBlID09IDEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAob3B0aW9uLk9wdGlvblZhbHVlcykgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbi5PcHRpb25WYWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBvcHRpb25DaGlsZCA9IG9wdGlvbi5PcHRpb25WYWx1ZXNbaV07XG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWQgPSBzaGlwdGltaXplX29wdGlvbnNbJ3NlcnZpY2VfbGV2ZWwnXSA9PSBvcHRpb25DaGlsZC5JZCA/ICdzZWxlY3RlZCcgOiAnJztcbiAgICAgICAgICAgIGh0bWxTZXJ2aWNlTGV2ZWxzICs9IFwiPG9wdGlvbiB2YWx1ZT0nXCIgKyBvcHRpb25DaGlsZC5JZCArIFwiJyBcIiArIHNlbGVjdGVkICsgXCI+XCIgKyBvcHRpb25DaGlsZC5OYW1lICsgXCI8L29wdGlvbj5cIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2hpcHRpbWl6ZV9leHRyYW9wdGlvbnMuaW5jbHVkZXMob3B0aW9uLklkK1wiXCIpKSB7XG4gICAgICAgIGxldCBzZWxlY3RlZCA9IHNoaXB0aW1pemVfb3B0aW9uc1snZXh0cmFvcHRpb25zJ10gPT0gb3B0aW9uLklkID8gJ3NlbGVjdGVkJyA6ICcnO1xuICAgICAgICBodG1sRXh0cmFPcHRpb25zICs9IFwiPG9wdGlvbiB2YWx1ZT0nXCIgKyBvcHRpb24uSWQgKyBcIicgXCIgKyBzZWxlY3RlZCArIFwiPlwiICsgb3B0aW9uLk5hbWUgKyBcIjwvb3B0aW9uPlwiO1xuICAgICAgICBpZiAob3B0aW9uLk9wdGlvbkZpZWxkcyAmJiBvcHRpb24uT3B0aW9uRmllbGRzLmxlbmd0aD4wKSB7XG4gICAgICAgICAgZm9yICggdmFyIGo9MDsgajxvcHRpb24uT3B0aW9uRmllbGRzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLk9wdGlvbkZpZWxkc1tqXS5PcHRpb25WYWx1ZXMpIHsgXG4gICAgICAgICAgICAgIHZhciBvcHRpb25GaWVsZCA9IG9wdGlvbi5PcHRpb25GaWVsZHNbal07IFxuICAgICAgICAgICAgICBodG1sRXh0cmF2YWx1ZXMgKz0gJzxzZWxlY3QgY2xhc3M9XCJzaGlwdGltaXplLW9wdGlvbnZhbHVlc1wiIGlkPVwic2hpcHRpbWl6ZS1leHRyYW9wdGlvbnMnICsgb3B0aW9uLklkICsgJ1wiIG5hbWU9XCJleHRyYW9wdGlvbnMnICsgb3B0aW9uLklkICsgJ1wiIG9uY2hhbmdlPVxcXCJzaGlwdGltaXplLnBsYXRmb3JtLndicy5zYXZlT3B0aW9ucyhqUXVlcnkodGhpcykpXFxcIj4nOyBcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25GaWVsZC5PcHRpb25WYWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsZXQgb3B0aW9uQ2hpbGQgPSBvcHRpb25GaWVsZC5PcHRpb25WYWx1ZXNbaV07XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gc2hpcHRpbWl6ZV9vcHRpb25zWydleHRyYW9wdGlvbnZhbHVlJyArIG9wdGlvbi5JZF0gPT0gb3B0aW9uQ2hpbGQuSWQgPyAnc2VsZWN0ZWQnIDogJyc7XG4gICAgICAgICAgICAgICAgaHRtbEV4dHJhdmFsdWVzICs9IFwiPG9wdGlvbiB2YWx1ZT0nXCIgKyBvcHRpb25DaGlsZC5JZCArIFwiJyBcIiArIHNlbGVjdGVkICsgXCI+XCIgKyBvcHRpb25DaGlsZC5OYW1lICsgXCI8L29wdGlvbj5cIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBodG1sRXh0cmF2YWx1ZXMgKz0gJzwvc2VsZWN0Pic7IFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNoaXB0aW1pemVfY2hlY2tib3hlcyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGlmIChvcHRpb24uSWQgPT0ga2V5c1tpXSkge1xuICAgICAgICAgICAgbGV0IG9wdGlvbk5hbWUgPSBzaGlwdGltaXplX2NoZWNrYm94ZXNbb3B0aW9uLklkXTtcbiAgICAgICAgICAgIGxldCBjaGVja2VkID0gc2hpcHRpbWl6ZV9vcHRpb25zW29wdGlvbk5hbWVdID09IG9wdGlvbi5JZCA/ICdjaGVja2VkJyA6ICcnO1xuICAgICAgICAgICAgaHRtbENoZWNrYm94ZXMgKz0gJzxzcGFuIGNsYXNzPVwid2JzLXNoaXB0aW1pemUtb3B0aW9uXCI+PGlucHV0ICcgKyBjaGVja2VkICsgJyBjbGFzcz1cIndicy1yc2UtY2hlY2tib3hcIiAgb25jaGFuZ2U9XCJzaGlwdGltaXplLnBsYXRmb3JtLndicy5zYXZlT3B0aW9ucyhqUXVlcnkodGhpcykpXCIgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cIicgKyBvcHRpb25OYW1lICsgJ1wiIHZhbHVlPVwiJyArIG9wdGlvbi5JZCArICdcIi8+JyArIHNoaXB0aW1pemVfY2hlY2tib3hlc1tvcHRpb24uSWRdICsgXCI8L3NwYW4+XCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGh0bWxTZXJ2aWNlTGV2ZWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9IdG1sICs9IFwiPHNwYW4gY2xhc3M9XFxcIndicy1zaGlwdGltaXplLW9wdGlvblxcXCI+PGxhYmVsPlwiICsgc2hpcHRpbWl6ZV9sYWJlbHMuc2VydmljZV9sZXZlbCArIFwiPC9sYWJlbD4gPHNlbGVjdCBuYW1lPVxcXCJzZXJ2aWNlX2xldmVsXFxcIiAgb25jaGFuZ2U9XFxcInNoaXB0aW1pemUucGxhdGZvcm0ud2JzLnNhdmVPcHRpb25zKGpRdWVyeSh0aGlzKSlcXFwiPjxvcHRpb24+LTwvb3B0aW9uPlwiICsgaHRtbFNlcnZpY2VMZXZlbHMgKyBcIjwvc2VsZWN0Pjwvc3Bhbj5cIjtcbiAgICB9XG5cbiAgICBpZiAoaHRtbEV4dHJhT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBvSHRtbCArPSBcIjxzcGFuIGNsYXNzPVxcXCJ3YnMtc2hpcHRpbWl6ZS1vcHRpb25cXFwiPjxsYWJlbD5cIiArIHNoaXB0aW1pemVfbGFiZWxzLmV4dHJhb3B0aW9ucyArIFwiPC9sYWJlbD4gPHNlbGVjdCBjbGFzcz0nc2hpcHRpbWl6ZS1leHRyYW9wdGlvbnMnIG5hbWU9XFxcImV4dHJhb3B0aW9uc1xcXCIgIG9uY2hhbmdlPVxcXCJzaGlwdGltaXplLnBsYXRmb3JtLndicy5zYXZlT3B0aW9ucyhqUXVlcnkodGhpcykpXFxcIj48b3B0aW9uPi08L29wdGlvbj5cIiArIGh0bWxFeHRyYU9wdGlvbnMgKyBcIjwvc2VsZWN0PiBcIiArIGh0bWxFeHRyYXZhbHVlcysgXCIgPC9zcGFuPlwiO1xuICAgIH1cblxuICAgIG9IdG1sICs9IGh0bWxDaGVja2JveGVzO1xuXG4gICAgLy9QaWNrdXAgQmVoYXZpb3VyP1xuICAgIGlmKHNoaXB0aW1pemVfY2Fycmllci5IYXNQaWNrdXApIHtcbiAgICAgIGxldCBzZWxlY3RodG1sID0gJzxzZWxlY3QgY2xhc3M9XCJzaGlwdGltaXplLWV4dHJhb3B0aW9uc1wiIG5hbWU9XCJwaWNrdXBiZWhhdmlvdXJcIiBvbmNoYW5nZT1cXFwic2hpcHRpbWl6ZS5wbGF0Zm9ybS53YnMuc2F2ZU9wdGlvbnMoalF1ZXJ5KHRoaXMpKVxcXCI+JztcbiAgICAgIGZvciAodmFyIHg9MDsgeCA8IDM7ICsreCkge1xuICAgICAgICBsZXQgc2VsZWN0ZWQgPSBzaGlwdGltaXplX29wdGlvbnNbJ3BpY2t1cGJlaGF2aW91ciddID09IHggPyAnc2VsZWN0ZWQnIDogJyc7XG4gICAgICAgIHNlbGVjdGh0bWwgKz0gYDxvcHRpb24gdmFsdWU9XCIke3h9XCIgJHtzZWxlY3RlZH0+JHtzaGlwdGltaXplX2xhYmVsc1sncGlja3VwJyt4XX08L29wdGlvbj5gO1xuICAgICAgfVxuICAgICAgc2VsZWN0aHRtbCArPSAnPC9zZWxlY3Q+JztcblxuICAgICAgb0h0bWwgKz0gYDxzcGFuIGNsYXNzPVxcXCJ3YnMtc2hpcHRpbWl6ZS1vcHRpb25cXFwiPjxsYWJlbD4ke3NoaXB0aW1pemVfbGFiZWxzLnBpY2t1cGJlaGF2aW91cn08L2xhYmVsPiAke3NlbGVjdGh0bWx9PC9zcGFuPmA7XG4gICAgfSBcblxuXG4gICAgaWYgKG9IdG1sLmxlbmd0aCA+IDApIHtcbiAgICAgIGVTaGlwdGltaXplT3B0aW9ucy5odG1sKFwiPGgzPlNoaXB0aW1pemUgU2V0dGluZ3M8L2gzPlwiICsgb0h0bWwpO1xuICAgICAgZVNoaXB0aW1pemVPcHRpb25zLmluc2VydEFmdGVyKGpRdWVyeShcIiNtYWluZm9ybVwiKSk7XG4gICAgICB0aGlzLmVGb3JtID0galF1ZXJ5KFwiI3NoaXB0aW1pemVvcHRpb25zXCIpOyBcbiAgICAgIHRoaXMuc2F2ZU9wdGlvbnMoalF1ZXJ5KFwiLnNoaXB0aW1pemUtZXh0cmFvcHRpb25zXCIpKTtcbiAgICB9XG5cbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///12\n')}]); 1 /******/ (function(modules) { // webpackBootstrap 2 /******/ // The module cache 3 /******/ var installedModules = {}; 4 /******/ 5 /******/ // The require function 6 /******/ function __webpack_require__(moduleId) { 7 /******/ 8 /******/ // Check if module is in cache 9 /******/ if(installedModules[moduleId]) { 10 /******/ return installedModules[moduleId].exports; 11 /******/ } 12 /******/ // Create a new module (and put it into the cache) 13 /******/ var module = installedModules[moduleId] = { 14 /******/ i: moduleId, 15 /******/ l: false, 16 /******/ exports: {} 17 /******/ }; 18 /******/ 19 /******/ // Execute the module function 20 /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 21 /******/ 22 /******/ // Flag the module as loaded 23 /******/ module.l = true; 24 /******/ 25 /******/ // Return the exports of the module 26 /******/ return module.exports; 27 /******/ } 28 /******/ 29 /******/ 30 /******/ // expose the modules object (__webpack_modules__) 31 /******/ __webpack_require__.m = modules; 32 /******/ 33 /******/ // expose the module cache 34 /******/ __webpack_require__.c = installedModules; 35 /******/ 36 /******/ // define getter function for harmony exports 37 /******/ __webpack_require__.d = function(exports, name, getter) { 38 /******/ if(!__webpack_require__.o(exports, name)) { 39 /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); 40 /******/ } 41 /******/ }; 42 /******/ 43 /******/ // define __esModule on exports 44 /******/ __webpack_require__.r = function(exports) { 45 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 46 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 47 /******/ } 48 /******/ Object.defineProperty(exports, '__esModule', { value: true }); 49 /******/ }; 50 /******/ 51 /******/ // create a fake namespace object 52 /******/ // mode & 1: value is a module id, require it 53 /******/ // mode & 2: merge all properties of value into the ns 54 /******/ // mode & 4: return value when already ns object 55 /******/ // mode & 8|1: behave like require 56 /******/ __webpack_require__.t = function(value, mode) { 57 /******/ if(mode & 1) value = __webpack_require__(value); 58 /******/ if(mode & 8) return value; 59 /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; 60 /******/ var ns = Object.create(null); 61 /******/ __webpack_require__.r(ns); 62 /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); 63 /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); 64 /******/ return ns; 65 /******/ }; 66 /******/ 67 /******/ // getDefaultExport function for compatibility with non-harmony modules 68 /******/ __webpack_require__.n = function(module) { 69 /******/ var getter = module && module.__esModule ? 70 /******/ function getDefault() { return module['default']; } : 71 /******/ function getModuleExports() { return module; }; 72 /******/ __webpack_require__.d(getter, 'a', getter); 73 /******/ return getter; 74 /******/ }; 75 /******/ 76 /******/ // Object.prototype.hasOwnProperty.call 77 /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 78 /******/ 79 /******/ // __webpack_public_path__ 80 /******/ __webpack_require__.p = "/shiptimize-for-woocommerce/assets/js"; 81 /******/ 82 /******/ 83 /******/ // Load entry module and return exports 84 /******/ return __webpack_require__(__webpack_require__.s = "./shiptimize-admin.js"); 85 /******/ }) 86 /************************************************************************/ 87 /******/ ({ 88 89 /***/ "./js/shiptimize-utils.js": 90 /*!********************************!*\ 91 !*** ./js/shiptimize-utils.js ***! 92 \********************************/ 93 /*! no static exports found */ 94 /***/ (function(module, exports, __webpack_require__) { 95 96 "use strict"; 97 eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/** \n * Singleton object we can use for platform independent stuff \n */\nvar ShiptimizeUtils = function () {\n function ShiptimizeUtils() {\n _classCallCheck(this, ShiptimizeUtils);\n }\n\n /** \n * Inject Script into the page \n * @param string src \n */\n\n\n _createClass(ShiptimizeUtils, [{\n key: \"injectExternalScript\",\n value: function injectExternalScript(src) {\n var s = document.createElement(\"script\");\n s.setAttribute(\"src\", src);\n document.body.appendChild(s);\n }\n\n /** \n * Inject a script string \n */\n\n }, {\n key: \"injectScript\",\n value: function injectScript(contents) {\n var e = document.createElement(\"script\");\n e.value = contents;\n document.body.appendChild(e);\n }\n\n /** \n * Removes all not numeric chars from the string \n *\n * @param string string - the input string \n * @return the string without chars that are not numbers \n */\n\n }, {\n key: \"removeNonNumeric\",\n value: function removeNonNumeric(string) {\n return string.replace(/\\D/g, '');\n }\n\n /** \n * Check if the given url exists and is valid\n * We use this to check if the carrier icon exists given \n * a url path and the naming convention {carrier_id}.svg \n * Make sure the correct protocol is appended to the url http != https \n * \n * @return true it the url exists and is valid \n */\n\n }, {\n key: \"isUrlValid\",\n value: function isUrlValid(url) {\n var http = new XMLHttpRequest();\n http.open('HEAD', url, false);\n http.send();\n return http.status == 200;\n }\n\n /** \n * Open a new window with the provided URL \n * @string url \n * @return bool if the window was opened, false if popup blocker enabled \n */\n\n }, {\n key: \"openNewWindow\",\n value: function openNewWindow(url, options) {\n var newWin = window.open(url, '_blank', options);\n var blocked = !newWin || newWin.closed || typeof newWin.closed == 'undefined';\n\n return !blocked;\n }\n }]);\n\n return ShiptimizeUtils;\n}();\n\nvar utils = new ShiptimizeUtils();\nexports.default = utils;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXV0aWxzLmpzPzAwZDQiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZVV0aWxzIiwic3JjIiwicyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNvbnRlbnRzIiwiZSIsInZhbHVlIiwic3RyaW5nIiwicmVwbGFjZSIsInVybCIsImh0dHAiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJzZW5kIiwic3RhdHVzIiwib3B0aW9ucyIsIm5ld1dpbiIsIndpbmRvdyIsImJsb2NrZWQiLCJjbG9zZWQiLCJ1dGlscyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOzs7SUFHTUEsZTtBQUVGLDZCQUFjO0FBQUE7QUFFYjs7QUFHRDs7Ozs7Ozs7eUNBSXFCQyxHLEVBQUs7QUFDdEIsVUFBSUMsSUFBSUMsU0FBU0MsYUFBVCxDQUF1QixRQUF2QixDQUFSO0FBQ0FGLFFBQUVHLFlBQUYsQ0FBZSxLQUFmLEVBQXNCSixHQUF0QjtBQUNBRSxlQUFTRyxJQUFULENBQWNDLFdBQWQsQ0FBMEJMLENBQTFCO0FBQ0g7O0FBR0Q7Ozs7OztpQ0FHYU0sUSxFQUFVO0FBQ25CLFVBQUlDLElBQUlOLFNBQVNDLGFBQVQsQ0FBdUIsUUFBdkIsQ0FBUjtBQUNBSyxRQUFFQyxLQUFGLEdBQVVGLFFBQVY7QUFDQUwsZUFBU0csSUFBVCxDQUFjQyxXQUFkLENBQTBCRSxDQUExQjtBQUNIOztBQUVEOzs7Ozs7Ozs7cUNBTWlCRSxNLEVBQVE7QUFDckIsYUFBT0EsT0FBT0MsT0FBUCxDQUFlLEtBQWYsRUFBc0IsRUFBdEIsQ0FBUDtBQUNIOztBQUVEOzs7Ozs7Ozs7OzsrQkFRV0MsRyxFQUFLO0FBQ1osVUFBSUMsT0FBTyxJQUFJQyxjQUFKLEVBQVg7QUFDQUQsV0FBS0UsSUFBTCxDQUFVLE1BQVYsRUFBa0JILEdBQWxCLEVBQXVCLEtBQXZCO0FBQ0FDLFdBQUtHLElBQUw7QUFDQSxhQUFPSCxLQUFLSSxNQUFMLElBQWUsR0FBdEI7QUFDSDs7QUFFRDs7Ozs7Ozs7a0NBS2NMLEcsRUFBS00sTyxFQUFRO0FBQ3ZCLFVBQUlDLFNBQVNDLE9BQU9MLElBQVAsQ0FBWUgsR0FBWixFQUFpQixRQUFqQixFQUEyQk0sT0FBM0IsQ0FBYjtBQUNBLFVBQUlHLFVBQVUsQ0FBQ0YsTUFBRCxJQUFXQSxPQUFPRyxNQUFsQixJQUE0QixPQUFPSCxPQUFPRyxNQUFkLElBQXNCLFdBQWhFOztBQUVBLGFBQU8sQ0FBQ0QsT0FBUjtBQUNIOzs7Ozs7QUFJTCxJQUFJRSxRQUFRLElBQUl4QixlQUFKLEVBQVo7a0JBQ2V3QixLIiwiZmlsZSI6Ii4vanMvc2hpcHRpbWl6ZS11dGlscy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBcbiAqIFNpbmdsZXRvbiBvYmplY3Qgd2UgY2FuIHVzZSBmb3IgcGxhdGZvcm0gaW5kZXBlbmRlbnQgc3R1ZmYgXG4gKi9cbmNsYXNzIFNoaXB0aW1pemVVdGlscyB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcblxuICAgIH1cblxuXG4gICAgLyoqIFxuICAgICAqIEluamVjdCBTY3JpcHQgaW50byB0aGUgcGFnZSBcbiAgICAgKiBAcGFyYW0gc3RyaW5nIHNyYyBcbiAgICAgKi9cbiAgICBpbmplY3RFeHRlcm5hbFNjcmlwdChzcmMpIHtcbiAgICAgICAgbGV0IHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICBzLnNldEF0dHJpYnV0ZShcInNyY1wiLCBzcmMpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHMpO1xuICAgIH1cblxuXG4gICAgLyoqIFxuICAgICAqIEluamVjdCBhIHNjcmlwdCBzdHJpbmcgXG4gICAgICovXG4gICAgaW5qZWN0U2NyaXB0KGNvbnRlbnRzKSB7XG4gICAgICAgIGxldCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgZS52YWx1ZSA9IGNvbnRlbnRzO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBSZW1vdmVzIGFsbCBub3QgbnVtZXJpYyBjaGFycyBmcm9tIHRoZSBzdHJpbmcgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RyaW5nIHN0cmluZyAtIHRoZSBpbnB1dCBzdHJpbmcgXG4gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHdpdGhvdXQgY2hhcnMgdGhhdCBhcmUgbm90IG51bWJlcnMgXG4gICAgICovXG4gICAgcmVtb3ZlTm9uTnVtZXJpYyhzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gdXJsIGV4aXN0cyBhbmQgaXMgdmFsaWRcbiAgICAgKiBXZSB1c2UgdGhpcyB0byBjaGVjayBpZiB0aGUgY2FycmllciBpY29uIGV4aXN0cyBnaXZlbiBcbiAgICAgKiBhIHVybCBwYXRoIGFuZCB0aGUgbmFtaW5nIGNvbnZlbnRpb24ge2NhcnJpZXJfaWR9LnN2ZyBcbiAgICAgKiBNYWtlIHN1cmUgdGhlIGNvcnJlY3QgcHJvdG9jb2wgaXMgYXBwZW5kZWQgdG8gdGhlIHVybCBodHRwICE9IGh0dHBzIFxuICAgICAqIFxuICAgICAqIEByZXR1cm4gdHJ1ZSBpdCB0aGUgdXJsIGV4aXN0cyBhbmQgaXMgdmFsaWQgXG4gICAgICovIFxuICAgIGlzVXJsVmFsaWQodXJsKSB7XG4gICAgICAgIHZhciBodHRwID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIGh0dHAub3BlbignSEVBRCcsIHVybCwgZmFsc2UpO1xuICAgICAgICBodHRwLnNlbmQoKTtcbiAgICAgICAgcmV0dXJuIGh0dHAuc3RhdHVzID09IDIwMDtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogT3BlbiBhIG5ldyB3aW5kb3cgd2l0aCB0aGUgcHJvdmlkZWQgVVJMIFxuICAgICAqIEBzdHJpbmcgdXJsIFxuICAgICAqIEByZXR1cm4gYm9vbCBpZiB0aGUgd2luZG93IHdhcyBvcGVuZWQsIGZhbHNlIGlmIHBvcHVwIGJsb2NrZXIgZW5hYmxlZCBcbiAgICAgKi8gIFxuICAgIG9wZW5OZXdXaW5kb3codXJsLCBvcHRpb25zKXtcbiAgICAgICAgbGV0IG5ld1dpbiA9IHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycsIG9wdGlvbnMpOyBcbiAgICAgICAgbGV0IGJsb2NrZWQgPSAhbmV3V2luIHx8IG5ld1dpbi5jbG9zZWQgfHwgdHlwZW9mIG5ld1dpbi5jbG9zZWQ9PSd1bmRlZmluZWQnOyBcblxuICAgICAgICByZXR1cm4gIWJsb2NrZWQ7IFxuICAgIH1cbn1cblxuXG5sZXQgdXRpbHMgPSBuZXcgU2hpcHRpbWl6ZVV0aWxzKCk7XG5leHBvcnQgZGVmYXVsdCB1dGlsczsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./js/shiptimize-utils.js\n"); 98 99 /***/ }), 100 101 /***/ "./js/shiptimize-weight-based-shipping.js": 102 /*!************************************************!*\ 103 !*** ./js/shiptimize-weight-based-shipping.js ***! 104 \************************************************/ 105 /*! no static exports found */ 106 /***/ (function(module, exports, __webpack_require__) { 107 108 "use strict"; 109 eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/** \n * plug into the dom and append shiptimize settings\n * Save on change via ajax \n * We can't save rule by rule withough pluggin into the checkout \n * Currently only the instance id is saved \n */\nvar ShiptimizeWeightBasedShipping = function () {\n function ShiptimizeWeightBasedShipping() {\n _classCallCheck(this, ShiptimizeWeightBasedShipping);\n\n console.log(\"Shiptimize options for WeightBasedShipping\");\n this.init();\n }\n\n _createClass(ShiptimizeWeightBasedShipping, [{\n key: \"init\",\n value: function init() {\n //not a shipping method page \n if (typeof shiptimize_carrier == 'undefined') {\n return;\n }\n\n var regexInstance = /instance_id=([0-9]*)/.exec(window.location.search);\n\n if (!regexInstance) {\n console.log(\"invalid url params cannot find instance_id \" + window.location.search);\n return;\n }\n\n this.instance_id = regexInstance[1];\n this.attachShiptimizeOptions();\n }\n\n /** \n * Save our options for this instance \n */\n\n }, {\n key: \"saveOptions\",\n value: function saveOptions(elem) {\n var data = {\n 'data': this.eForm.serializeArray(),\n 'instance_id': this.instance_id,\n 'action': 'shiptimize_wbs_settings'\n };\n\n jQuery.post(ajaxurl, data, function (resp) {\n console.log(\"response \", resp);\n });\n\n console.log(this.eForm, \"Saveoptions \", data);\n\n jQuery(\".shiptimize-optionvalues\").hide();\n var extraOption = jQuery(\".shiptimize-extraoptions\").val();\n jQuery(\"#shiptimize-extraoptions\" + extraOption).show();\n }\n\n /** \n * Attach the shiptimize options under the title \n */\n\n }, {\n key: \"attachShiptimizeOptions\",\n value: function attachShiptimizeOptions() {\n\n var eShiptimizeOptions = jQuery(\"<form id='shiptimizeoptions' class=\\\"wbs-shiptimizeoptions\\\"></form>\");\n var oHtml = '';\n\n //no options , nothing to do \n if (typeof shiptimize_carrier.OptionList == 'undefined') {\n return;\n }\n\n //shiptimize_extraoptions\n //shiptimize_checkboxes\n //Add a Save button \n var htmlServiceLevels = '';\n var htmlExtraOptions = '';\n var htmlCheckboxes = '';\n var htmlExtravalues = '';\n for (var x = 0; x < shiptimize_carrier.OptionList.length; ++x) {\n var option = shiptimize_carrier.OptionList[x];\n\n if (option.Type == 1) {\n if (typeof option.OptionValues != 'undefined') {\n for (var i = 0; i < option.OptionValues.length; ++i) {\n var optionChild = option.OptionValues[i];\n var selected = shiptimize_options['service_level'] == optionChild.Id ? 'selected' : '';\n htmlServiceLevels += \"<option value='\" + optionChild.Id + \"' \" + selected + \">\" + optionChild.Name + \"</option>\";\n }\n }\n } else if (shiptimize_extraoptions.includes(option.Id + \"\")) {\n var _selected = shiptimize_options['extraoptions'] == option.Id ? 'selected' : '';\n htmlExtraOptions += \"<option value='\" + option.Id + \"' \" + _selected + \">\" + option.Name + \"</option>\";\n if (option.OptionFields && option.OptionFields.length > 0) {\n for (var j = 0; j < option.OptionFields.length; ++j) {\n if (option.OptionFields[j].OptionValues) {\n var optionField = option.OptionFields[j];\n htmlExtravalues += '<select class=\"shiptimize-optionvalues\" id=\"shiptimize-extraoptions' + option.Id + '\" name=\"extraoptions' + option.Id + '\" onchange=\\\"shiptimize.platform.wbs.saveOptions(jQuery(this))\\\">';\n for (var i = 0; i < optionField.OptionValues.length; ++i) {\n var _optionChild = optionField.OptionValues[i];\n var _selected2 = shiptimize_options['extraoptionvalue' + option.Id] == _optionChild.Id ? 'selected' : '';\n htmlExtravalues += \"<option value='\" + _optionChild.Id + \"' \" + _selected2 + \">\" + _optionChild.Name + \"</option>\";\n }\n htmlExtravalues += '</select>';\n }\n }\n }\n } else {\n var keys = Object.keys(shiptimize_checkboxes);\n for (var i = 0; i < keys.length; ++i) {\n if (option.Id == keys[i]) {\n var optionName = shiptimize_checkboxes[option.Id];\n var checked = shiptimize_options[optionName] == option.Id ? 'checked' : '';\n htmlCheckboxes += '<span class=\"wbs-shiptimize-option\"><input ' + checked + ' class=\"wbs-rse-checkbox\" onchange=\"shiptimize.platform.wbs.saveOptions(jQuery(this))\" type=\"checkbox\" name=\"' + optionName + '\" value=\"' + option.Id + '\"/>' + shiptimize_checkboxes[option.Id] + \"</span>\";\n }\n }\n }\n }\n\n if (htmlServiceLevels.length > 0) {\n oHtml += \"<span class=\\\"wbs-shiptimize-option\\\"><label>\" + shiptimize_labels.service_level + \"</label> <select name=\\\"service_level\\\" onchange=\\\"shiptimize.platform.wbs.saveOptions(jQuery(this))\\\"><option>-</option>\" + htmlServiceLevels + \"</select></span>\";\n }\n\n if (htmlExtraOptions.length > 0) {\n oHtml += \"<span class=\\\"wbs-shiptimize-option\\\"><label>\" + shiptimize_labels.extraoptions + \"</label> <select class='shiptimize-extraoptions' name=\\\"extraoptions\\\" onchange=\\\"shiptimize.platform.wbs.saveOptions(jQuery(this))\\\"><option>-</option>\" + htmlExtraOptions + \"</select> \" + htmlExtravalues + \" </span>\";\n }\n\n oHtml += htmlCheckboxes;\n\n //Pickup Behaviour?\n if (shiptimize_carrier.HasPickup) {\n var selecthtml = '<select class=\"shiptimize-extraoptions\" name=\"pickupbehaviour\" onchange=\\\"shiptimize.platform.wbs.saveOptions(jQuery(this))\\\">';\n for (var x = 0; x < 3; ++x) {\n var _selected3 = shiptimize_options['pickupbehaviour'] == x ? 'selected' : '';\n selecthtml += \"<option value=\\\"\" + x + \"\\\" \" + _selected3 + \">\" + shiptimize_labels['pickup' + x] + \"</option>\";\n }\n selecthtml += '</select>';\n\n oHtml += \"<span class=\\\"wbs-shiptimize-option\\\"><label>\" + shiptimize_labels.pickupbehaviour + \"</label> \" + selecthtml + \"</span>\";\n }\n\n if (oHtml.length > 0) {\n eShiptimizeOptions.html(\"<h3>Shiptimize Settings</h3>\" + oHtml);\n eShiptimizeOptions.insertAfter(jQuery(\"#mainform\"));\n this.eForm = jQuery(\"#shiptimizeoptions\");\n this.saveOptions(jQuery(\".shiptimize-extraoptions\"));\n }\n }\n }]);\n\n return ShiptimizeWeightBasedShipping;\n}();\n\nexports.default = ShiptimizeWeightBasedShipping;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdlaWdodC1iYXNlZC1zaGlwcGluZy5qcz8yZThjIl0sIm5hbWVzIjpbIlNoaXB0aW1pemVXZWlnaHRCYXNlZFNoaXBwaW5nIiwiY29uc29sZSIsImxvZyIsImluaXQiLCJzaGlwdGltaXplX2NhcnJpZXIiLCJyZWdleEluc3RhbmNlIiwiZXhlYyIsIndpbmRvdyIsImxvY2F0aW9uIiwic2VhcmNoIiwiaW5zdGFuY2VfaWQiLCJhdHRhY2hTaGlwdGltaXplT3B0aW9ucyIsImVsZW0iLCJkYXRhIiwiZUZvcm0iLCJzZXJpYWxpemVBcnJheSIsImpRdWVyeSIsInBvc3QiLCJhamF4dXJsIiwicmVzcCIsImhpZGUiLCJleHRyYU9wdGlvbiIsInZhbCIsInNob3ciLCJlU2hpcHRpbWl6ZU9wdGlvbnMiLCJvSHRtbCIsIk9wdGlvbkxpc3QiLCJodG1sU2VydmljZUxldmVscyIsImh0bWxFeHRyYU9wdGlvbnMiLCJodG1sQ2hlY2tib3hlcyIsImh0bWxFeHRyYXZhbHVlcyIsIngiLCJsZW5ndGgiLCJvcHRpb24iLCJUeXBlIiwiT3B0aW9uVmFsdWVzIiwiaSIsIm9wdGlvbkNoaWxkIiwic2VsZWN0ZWQiLCJzaGlwdGltaXplX29wdGlvbnMiLCJJZCIsIk5hbWUiLCJzaGlwdGltaXplX2V4dHJhb3B0aW9ucyIsImluY2x1ZGVzIiwiT3B0aW9uRmllbGRzIiwiaiIsIm9wdGlvbkZpZWxkIiwia2V5cyIsIk9iamVjdCIsInNoaXB0aW1pemVfY2hlY2tib3hlcyIsIm9wdGlvbk5hbWUiLCJjaGVja2VkIiwic2hpcHRpbWl6ZV9sYWJlbHMiLCJzZXJ2aWNlX2xldmVsIiwiZXh0cmFvcHRpb25zIiwiSGFzUGlja3VwIiwic2VsZWN0aHRtbCIsInBpY2t1cGJlaGF2aW91ciIsImh0bWwiLCJpbnNlcnRBZnRlciIsInNhdmVPcHRpb25zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7Ozs7OztJQU1xQkEsNkI7QUFFbkIs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QUFkOztBQUVBL0IsbUVBQXlEMkIsa0JBQWtCSyxlQUEzRSxpQkFBc0dELFVBQXRHO0FBQ0Q7O0FBR0QsVUFBSS9CLE1BQU1PLE1BQU4sR0FBZSxDQUFuQixFQUFzQjtBQUNwQlIsMkJBQW1Ca0MsSUFBbkIsQ0FBd0IsaUNBQWlDakMsS0FBekQ7QUFDQUQsMkJBQW1CbUMsV0FBbkIsQ0FBK0IzQyxPQUFPLFdBQVAsQ0FBL0I7QUFDQSxhQUFLRixLQUFMLEdBQWFFLE9BQU8sb0JBQVAsQ0FBYjtBQUNBLGFBQUs0QyxXQUFMLENBQWlCNUMsT0FBTywwQkFBUCxDQUFqQjtBQUNEO0FBRUY7Ozs7OztrQkF6SWtCaEIsNkIiLCJmaWxlIjoiLi9qcy9zaGlwdGltaXplLXdlaWdodC1iYXNlZC1zaGlwcGluZy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBcbiAqIHBsdWcgaW50byB0aGUgIGRvbSBhbmQgIGFwcGVuZCBzaGlwdGltaXplIHNldHRpbmdzXG4gKiBTYXZlIG9uIGNoYW5nZSB2aWEgYWpheCBcbiAqIFdlIGNhbid0IHNhdmUgcnVsZSBieSBydWxlIHdpdGhvdWdoIHBsdWdnaW4gaW50byB0aGUgY2hlY2tvdXQgXG4gKiBDdXJyZW50bHkgb25seSB0aGUgaW5zdGFuY2UgaWQgaXMgc2F2ZWQgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoaXB0aW1pemVXZWlnaHRCYXNlZFNoaXBwaW5nIHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zb2xlLmxvZyhcIlNoaXB0aW1pemUgb3B0aW9ucyBmb3IgV2VpZ2h0QmFzZWRTaGlwcGluZ1wiKTtcbiAgICB0aGlzLmluaXQoKTtcblxuICB9XG5cbiAgaW5pdCgpIHtcbiAgICAvL25vdCBhIHNoaXBwaW5nIG1ldGhvZCBwYWdlIFxuICAgIGlmICh0eXBlb2YgKHNoaXB0aW1pemVfY2FycmllcikgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWdleEluc3RhbmNlID0gL2luc3RhbmNlX2lkPShbMC05XSopLy5leGVjKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuXG4gICAgaWYgKCFyZWdleEluc3RhbmNlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImludmFsaWQgdXJsIHBhcmFtcyBjYW5ub3QgZmluZCBpbnN0YW5jZV9pZCBcIiArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaW5zdGFuY2VfaWQgPSByZWdleEluc3RhbmNlWzFdO1xuICAgIHRoaXMuYXR0YWNoU2hpcHRpbWl6ZU9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKiBcbiAgICogU2F2ZSBvdXIgb3B0aW9ucyBmb3IgdGhpcyBpbnN0YW5jZSBcbiAgICovXG4gIHNhdmVPcHRpb25zKGVsZW0pIHtcbiAgICB2YXIgZGF0YSA9IHtcbiAgICAgICdkYXRhJzogdGhpcy5lRm9ybS5zZXJpYWxpemVBcnJheSgpLFxuICAgICAgJ2luc3RhbmNlX2lkJzogdGhpcy5pbnN0YW5jZV9pZCxcbiAgICAgICdhY3Rpb24nOiAnc2hpcHRpbWl6ZV93YnNfc2V0dGluZ3MnXG4gICAgfTtcblxuICAgIGpRdWVyeS5wb3N0KGFqYXh1cmwsIGRhdGEsIGZ1bmN0aW9uIChyZXNwKSB7XG4gICAgICBjb25zb2xlLmxvZyhcInJlc3BvbnNlIFwiLCByZXNwKTtcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKHRoaXMuZUZvcm0sIFwiU2F2ZW9wdGlvbnMgXCIsIGRhdGEpO1xuICAgIFxuICAgIGpRdWVyeShcIi5zaGlwdGltaXplLW9wdGlvbnZhbHVlc1wiKS5oaWRlKCk7XG4gICAgdmFyIGV4dHJhT3B0aW9uID0galF1ZXJ5KFwiLnNoaXB0aW1pemUtZXh0cmFvcHRpb25zXCIpLnZhbCgpOyBcbiAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS1leHRyYW9wdGlvbnNcIitleHRyYU9wdGlvbikuc2hvdygpO1xuICAgICBcbiAgfVxuXG4gIC8qKiBcbiAgICogQXR0YWNoIHRoZSBzaGlwdGltaXplIG9wdGlvbnMgdW5kZXIgdGhlIHRpdGxlICAgXG4gICAqL1xuICBhdHRhY2hTaGlwdGltaXplT3B0aW9ucygpIHtcblxuICAgIHZhciBlU2hpcHRpbWl6ZU9wdGlvbnMgPSBqUXVlcnkoXCI8Zm9ybSBpZD0nc2hpcHRpbWl6ZW9wdGlvbnMnIGNsYXNzPVxcXCJ3YnMtc2hpcHRpbWl6ZW9wdGlvbnNcXFwiPjwvZm9ybT5cIik7XG4gICAgdmFyIG9IdG1sID0gJyc7XG5cbiAgICAvL25vIG9wdGlvbnMgLCBub3RoaW5nIHRvIGRvIFxuICAgIGlmICh0eXBlb2YgKHNoaXB0aW1pemVfY2Fycmllci5PcHRpb25MaXN0KSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vc2hpcHRpbWl6ZV9leHRyYW9wdGlvbnNcbiAgICAvL3NoaXB0aW1pemVfY2hlY2tib3hlc1xuICAgIC8vQWRkIGEgU2F2ZSBidXR0b24gXG4gICAgbGV0IGh0bWxTZXJ2aWNlTGV2ZWxzID0gJyc7XG4gICAgbGV0IGh0bWxFeHRyYU9wdGlvbnMgPSAnJztcbiAgICBsZXQgaHRtbENoZWNrYm94ZXMgPSAnJztcbiAgICBsZXQgaHRtbEV4dHJhdmFsdWVzID0gJyc7IFxuICAgIGZvciAodmFyIHggPSAwOyB4IDwgc2hpcHRpbWl6ZV9jYXJyaWVyLk9wdGlvbkxpc3QubGVuZ3RoOyArK3gpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IHNoaXB0aW1pemVfY2Fycmllci5PcHRpb25MaXN0W3hdO1xuXG4gICAgICBpZiAob3B0aW9uLlR5cGUgPT0gMSkge1xuICAgICAgICBpZiAodHlwZW9mIChvcHRpb24uT3B0aW9uVmFsdWVzKSAhPSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9uLk9wdGlvblZhbHVlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IG9wdGlvbkNoaWxkID0gb3B0aW9uLk9wdGlvblZhbHVlc1tpXTtcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IHNoaXB0aW1pemVfb3B0aW9uc1snc2VydmljZV9sZXZlbCddID09IG9wdGlvbkNoaWxkLklkID8gJ3NlbGVjdGVkJyA6ICcnO1xuICAgICAgICAgICAgaHRtbFNlcnZpY2VMZXZlbHMgKz0gXCI8b3B0aW9uIHZhbHVlPSdcIiArIG9wdGlvbkNoaWxkLklkICsgXCInIFwiICsgc2VsZWN0ZWQgKyBcIj5cIiArIG9wdGlvbkNoaWxkLk5hbWUgKyBcIjwvb3B0aW9uPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzaGlwdGltaXplX2V4dHJhb3B0aW9ucy5pbmNsdWRlcyhvcHRpb24uSWQrXCJcIikpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkID0gc2hpcHRpbWl6ZV9vcHRpb25zWydleHRyYW9wdGlvbnMnXSA9PSBvcHRpb24uSWQgPyAnc2VsZWN0ZWQnIDogJyc7XG4gICAgICAgIGh0bWxFeHRyYU9wdGlvbnMgKz0gXCI8b3B0aW9uIHZhbHVlPSdcIiArIG9wdGlvbi5JZCArIFwiJyBcIiArIHNlbGVjdGVkICsgXCI+XCIgKyBvcHRpb24uTmFtZSArIFwiPC9vcHRpb24+XCI7XG4gICAgICAgIGlmIChvcHRpb24uT3B0aW9uRmllbGRzICYmIG9wdGlvbi5PcHRpb25GaWVsZHMubGVuZ3RoPjApIHtcbiAgICAgICAgICBmb3IgKCB2YXIgaj0wOyBqPG9wdGlvbi5PcHRpb25GaWVsZHMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGlmIChvcHRpb24uT3B0aW9uRmllbGRzW2pdLk9wdGlvblZhbHVlcykgeyBcbiAgICAgICAgICAgICAgdmFyIG9wdGlvbkZpZWxkID0gb3B0aW9uLk9wdGlvbkZpZWxkc1tqXTsgXG4gICAgICAgICAgICAgIGh0bWxFeHRyYXZhbHVlcyArPSAnPHNlbGVjdCBjbGFzcz1cInNoaXB0aW1pemUtb3B0aW9udmFsdWVzXCIgaWQ9XCJzaGlwdGltaXplLWV4dHJhb3B0aW9ucycgKyBvcHRpb24uSWQgKyAnXCIgbmFtZT1cImV4dHJhb3B0aW9ucycgKyBvcHRpb24uSWQgKyAnXCIgb25jaGFuZ2U9XFxcInNoaXB0aW1pemUucGxhdGZvcm0ud2JzLnNhdmVPcHRpb25zKGpRdWVyeSh0aGlzKSlcXFwiPic7IFxuICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbkZpZWxkLk9wdGlvblZhbHVlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxldCBvcHRpb25DaGlsZCA9IG9wdGlvbkZpZWxkLk9wdGlvblZhbHVlc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWQgPSBzaGlwdGltaXplX29wdGlvbnNbJ2V4dHJhb3B0aW9udmFsdWUnICsgb3B0aW9uLklkXSA9PSBvcHRpb25DaGlsZC5JZCA/ICdzZWxlY3RlZCcgOiAnJztcbiAgICAgICAgICAgICAgICBodG1sRXh0cmF2YWx1ZXMgKz0gXCI8b3B0aW9uIHZhbHVlPSdcIiArIG9wdGlvbkNoaWxkLklkICsgXCInIFwiICsgc2VsZWN0ZWQgKyBcIj5cIiArIG9wdGlvbkNoaWxkLk5hbWUgKyBcIjwvb3B0aW9uPlwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGh0bWxFeHRyYXZhbHVlcyArPSAnPC9zZWxlY3Q+JzsgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc2hpcHRpbWl6ZV9jaGVja2JveGVzKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbi5JZCA9PSBrZXlzW2ldKSB7XG4gICAgICAgICAgICBsZXQgb3B0aW9uTmFtZSA9IHNoaXB0aW1pemVfY2hlY2tib3hlc1tvcHRpb24uSWRdO1xuICAgICAgICAgICAgbGV0IGNoZWNrZWQgPSBzaGlwdGltaXplX29wdGlvbnNbb3B0aW9uTmFtZV0gPT0gb3B0aW9uLklkID8gJ2NoZWNrZWQnIDogJyc7XG4gICAgICAgICAgICBodG1sQ2hlY2tib3hlcyArPSAnPHNwYW4gY2xhc3M9XCJ3YnMtc2hpcHRpbWl6ZS1vcHRpb25cIj48aW5wdXQgJyArIGNoZWNrZWQgKyAnIGNsYXNzPVwid2JzLXJzZS1jaGVja2JveFwiICBvbmNoYW5nZT1cInNoaXB0aW1pemUucGxhdGZvcm0ud2JzLnNhdmVPcHRpb25zKGpRdWVyeSh0aGlzKSlcIiB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiJyArIG9wdGlvbk5hbWUgKyAnXCIgdmFsdWU9XCInICsgb3B0aW9uLklkICsgJ1wiLz4nICsgc2hpcHRpbWl6ZV9jaGVja2JveGVzW29wdGlvbi5JZF0gKyBcIjwvc3Bhbj5cIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaHRtbFNlcnZpY2VMZXZlbHMubGVuZ3RoID4gMCkge1xuICAgICAgb0h0bWwgKz0gXCI8c3BhbiBjbGFzcz1cXFwid2JzLXNoaXB0aW1pemUtb3B0aW9uXFxcIj48bGFiZWw+XCIgKyBzaGlwdGltaXplX2xhYmVscy5zZXJ2aWNlX2xldmVsICsgXCI8L2xhYmVsPiA8c2VsZWN0IG5hbWU9XFxcInNlcnZpY2VfbGV2ZWxcXFwiICBvbmNoYW5nZT1cXFwic2hpcHRpbWl6ZS5wbGF0Zm9ybS53YnMuc2F2ZU9wdGlvbnMoalF1ZXJ5KHRoaXMpKVxcXCI+PG9wdGlvbj4tPC9vcHRpb24+XCIgKyBodG1sU2VydmljZUxldmVscyArIFwiPC9zZWxlY3Q+PC9zcGFuPlwiO1xuICAgIH1cblxuICAgIGlmIChodG1sRXh0cmFPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIG9IdG1sICs9IFwiPHNwYW4gY2xhc3M9XFxcIndicy1zaGlwdGltaXplLW9wdGlvblxcXCI+PGxhYmVsPlwiICsgc2hpcHRpbWl6ZV9sYWJlbHMuZXh0cmFvcHRpb25zICsgXCI8L2xhYmVsPiA8c2VsZWN0IGNsYXNzPSdzaGlwdGltaXplLWV4dHJhb3B0aW9ucycgbmFtZT1cXFwiZXh0cmFvcHRpb25zXFxcIiAgb25jaGFuZ2U9XFxcInNoaXB0aW1pemUucGxhdGZvcm0ud2JzLnNhdmVPcHRpb25zKGpRdWVyeSh0aGlzKSlcXFwiPjxvcHRpb24+LTwvb3B0aW9uPlwiICsgaHRtbEV4dHJhT3B0aW9ucyArIFwiPC9zZWxlY3Q+IFwiICsgaHRtbEV4dHJhdmFsdWVzKyBcIiA8L3NwYW4+XCI7XG4gICAgfVxuXG4gICAgb0h0bWwgKz0gaHRtbENoZWNrYm94ZXM7XG5cbiAgICAvL1BpY2t1cCBCZWhhdmlvdXI/XG4gICAgaWYoc2hpcHRpbWl6ZV9jYXJyaWVyLkhhc1BpY2t1cCkge1xuICAgICAgbGV0IHNlbGVjdGh0bWwgPSAnPHNlbGVjdCBjbGFzcz1cInNoaXB0aW1pemUtZXh0cmFvcHRpb25zXCIgbmFtZT1cInBpY2t1cGJlaGF2aW91clwiIG9uY2hhbmdlPVxcXCJzaGlwdGltaXplLnBsYXRmb3JtLndicy5zYXZlT3B0aW9ucyhqUXVlcnkodGhpcykpXFxcIj4nO1xuICAgICAgZm9yICh2YXIgeD0wOyB4IDwgMzsgKyt4KSB7XG4gICAgICAgIGxldCBzZWxlY3RlZCA9IHNoaXB0aW1pemVfb3B0aW9uc1sncGlja3VwYmVoYXZpb3VyJ10gPT0geCA/ICdzZWxlY3RlZCcgOiAnJztcbiAgICAgICAgc2VsZWN0aHRtbCArPSBgPG9wdGlvbiB2YWx1ZT1cIiR7eH1cIiAke3NlbGVjdGVkfT4ke3NoaXB0aW1pemVfbGFiZWxzWydwaWNrdXAnK3hdfTwvb3B0aW9uPmA7XG4gICAgICB9XG4gICAgICBzZWxlY3RodG1sICs9ICc8L3NlbGVjdD4nO1xuXG4gICAgICBvSHRtbCArPSBgPHNwYW4gY2xhc3M9XFxcIndicy1zaGlwdGltaXplLW9wdGlvblxcXCI+PGxhYmVsPiR7c2hpcHRpbWl6ZV9sYWJlbHMucGlja3VwYmVoYXZpb3VyfTwvbGFiZWw+ICR7c2VsZWN0aHRtbH08L3NwYW4+YDtcbiAgICB9IFxuXG5cbiAgICBpZiAob0h0bWwubGVuZ3RoID4gMCkge1xuICAgICAgZVNoaXB0aW1pemVPcHRpb25zLmh0bWwoXCI8aDM+U2hpcHRpbWl6ZSBTZXR0aW5nczwvaDM+XCIgKyBvSHRtbCk7XG4gICAgICBlU2hpcHRpbWl6ZU9wdGlvbnMuaW5zZXJ0QWZ0ZXIoalF1ZXJ5KFwiI21haW5mb3JtXCIpKTtcbiAgICAgIHRoaXMuZUZvcm0gPSBqUXVlcnkoXCIjc2hpcHRpbWl6ZW9wdGlvbnNcIik7IFxuICAgICAgdGhpcy5zYXZlT3B0aW9ucyhqUXVlcnkoXCIuc2hpcHRpbWl6ZS1leHRyYW9wdGlvbnNcIikpO1xuICAgIH1cblxuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./js/shiptimize-weight-based-shipping.js\n"); 110 111 /***/ }), 112 113 /***/ "./js/shiptimize-woo-commerce-admin.js": 114 /*!*********************************************!*\ 115 !*** ./js/shiptimize-woo-commerce-admin.js ***! 116 \*********************************************/ 117 /*! no static exports found */ 118 /***/ (function(module, exports, __webpack_require__) { 119 120 "use strict"; 121 eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _shiptimizeUtils = __webpack_require__(/*! ./shiptimize-utils.js */ \"./js/shiptimize-utils.js\");\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nvar _shiptimizeWeightBasedShipping = __webpack_require__(/*! ./shiptimize-weight-based-shipping.js */ \"./js/shiptimize-weight-based-shipping.js\");\n\nvar _shiptimizeWeightBasedShipping2 = _interopRequireDefault(_shiptimizeWeightBasedShipping);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar WooShipitmizeAdmin = function () {\n function WooShipitmizeAdmin() {\n _classCallCheck(this, WooShipitmizeAdmin);\n\n this.wbs = new _shiptimizeWeightBasedShipping2.default();\n }\n\n _createClass(WooShipitmizeAdmin, [{\n key: 'bootstrap',\n value: function bootstrap() {\n this.urlParams();\n }\n\n /** \n * If the export was successfull \n * @param string appLink - the login url \n */\n\n }, {\n key: 'exportSuccess',\n value: function exportSuccess(appLink) {\n if (appLink.trim().length == 0) {\n return;\n }\n\n _shiptimizeUtils2.default.openNewWindow(appLink, '');\n }\n\n /** \n * @param int id - the carrier id \n */\n\n }, {\n key: 'getCarrier',\n value: function getCarrier(id) {\n for (var x = 0; x < shiptimize_carriers.length; ++x) {\n if (shiptimize_carriers[x].Id == id) {\n return shiptimize_carriers[x];\n }\n }\n }\n\n /** \n * Show aditional options for carrier \n */\n\n }, {\n key: 'selectOptions',\n value: function selectOptions(elem) {\n this.selectServiceLevel(elem, jQuery('.shiptimize__service-level').val());\n // hide the extra options for now \n // this.selectExtraOptions(elem, jQuery('.shiptimize__extra-options').val());\n }\n\n /** \n * @param DomElement elem - the carrier select \n */\n\n }, {\n key: 'selectServiceLevel',\n value: function selectServiceLevel(elem, service_id) {\n var carrier_id = elem.val();\n var carrier = this.getCarrier(carrier_id);\n var eServiceLevel = elem.siblings(\".shiptimize__service-level\");\n\n var options_html = '';\n\n if (_typeof(carrier.OptionList) != undefined) {\n var options = carrier.OptionList;\n\n for (var x = 0; x < options.length; ++x) {\n if (options[x].Type == 1 && typeof options[x].OptionValues != 'undefined') {\n var values = options[x].OptionValues;\n options_html += \"<option>-</option>\";\n for (var i = 0; i < values.length; ++i) {\n var selected = service_id == values[i].Id ? 'selected' : '';\n options_html += \"<option value='\" + values[i].Id + \"' \" + selected + \" >\" + values[i].Name + \"</option>\";\n }\n }\n }\n }\n\n eServiceLevel.html(options_html);\n if (options_html) {\n eServiceLevel.addClass(\"active\");\n } else {\n eServiceLevel.removeClass(\"active\");\n }\n }\n }, {\n key: 'selectExtraOptions',\n value: function selectExtraOptions(elem, selected_id) {\n var carrier_id = elem.val();\n var carrier = this.getCarrier(carrier_id);\n var eExtraoptions = elem.siblings(\".shiptimize__extra-options\");\n\n var options_html = '';\n var option_values_html = [];\n\n if (_typeof(carrier.OptionList) != undefined) {\n var options = carrier.OptionList;\n for (var x = 0; x < options.length; ++x) {\n if (options[x].Type == 0) {\n if (!options_html) {\n options_html += \"<option>-</option>\";\n }\n var selected = selected_id == options[x].Id ? 'selected' : '';\n options_html += \"<option value='\" + options[x].Id + \"' \" + selected + \" >\" + options[x].Name + \"</option>\";\n }\n\n if (options[x].OptionValues && options[x].OptionValues.length > 0) {\n var vhtml = '<select id=\"shiptimize-optionvalues' + options[x].Id + '\" class=\"shiptimize__optionvalues\">';\n for (var j = 0; j < options[x].OptionValues.length; ++j) {\n vhtml += '<option>' + options[x].OptionValues[j] + '</options>';\n }\n\n vhtml += '<select>';\n }\n }\n }\n\n eExtraoptions.html(options_html);\n if (options_html) {\n eExtraoptions.addClass(\"active\");\n } else {\n eExtraoptions.removeClass(\"active\");\n }\n }\n }, {\n key: 'selectTab',\n value: function selectTab(idx) {\n jQuery(\".nav-tab\").removeClass('nav-tab-active');\n jQuery(jQuery(\".nav-tab\").get(idx)).addClass('nav-tab-active');\n\n jQuery(\".tab\").removeClass('active');\n jQuery(jQuery(\".tab\").get(idx)).addClass('active');\n }\n }, {\n key: 'accordion',\n value: function accordion(elem) {\n var $eparent = jQuery(elem).parent();\n if ($eparent.hasClass('open')) {\n $eparent.removeClass('open');\n } else {\n $eparent.addClass('open');\n }\n }\n\n /** \n * Is there stuff in the url params we care about? \n **/\n\n }, {\n key: 'urlParams',\n value: function urlParams() {\n var parts = document.location.search.split('&');\n for (var x = 0; x < parts.length; ++x) {\n var keyval = parts[x].split('=');\n var key = keyval[0];\n var value = decodeURIComponent(keyval[1]);\n\n if (key == 'CallbackURL') {\n console.log(\"We are creating a label\");\n shiptimize.openLoader(shiptimize_label_request);\n shiptimize.monitorLabelStatus(value);\n }\n }\n }\n }]);\n\n return WooShipitmizeAdmin;\n}();\n\nexports.default = WooShipitmizeAdmin;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdvby1jb21tZXJjZS1hZG1pbi5qcz80MDA5Il0sIm5hbWVzIjpbIldvb1NoaXBpdG1pemVBZG1pbiIsIndicyIsIlNoaXB0aW1pemVXZWlnaHRCYXNlZFNoaXBwaW5nIiwidXJsUGFyYW1zIiwiYXBwTGluayIsInRyaW0iLCJsZW5ndGgiLCJVdGlscyIsIm9wZW5OZXdXaW5kb3ciLCJpZCIsIngiLCJzaGlwdGltaXplX2NhcnJpZXJzIiwiSWQiLCJlbGVtIiwic2VsZWN0U2VydmljZUxldmVsIiwialF1ZXJ5IiwidmFsIiwic2VydmljZV9pZCIsImNhcnJpZXJfaWQiLCJjYXJyaWVyIiwiZ2V0Q2FycmllciIsImVTZXJ2aWNlTGV2ZWwiLCJzaWJsaW5ncyIsIm9wdGlvbnNfaHRtbCIsIk9wdGlvbkxpc3QiLCJ1bmRlZmluZWQiLCJvcHRpb25zIiwiVHlwZSIsIk9wdGlvblZhbHVlcyIsInZhbHVlcyIsImkiLCJzZWxlY3RlZCIsIk5hbWUiLCJodG1sIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInNlbGVjdGVkX2lkIiwiZUV4dHJhb3B0aW9ucyIsIm9wdGlvbl92YWx1ZXNfaHRtbCIsInZodG1sIiwiaiIsImlkeCIsImdldCIsIiRlcGFyZW50IiwicGFyZW50IiwiaGFzQ2xhc3MiLCJwYXJ0cyIsImRvY3VtZW50IiwibG9jYXRpb24iLCJzZWFyY2giLCJzcGxpdCIsImtleXZhbCIsImtleSIsInZhbHVlIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiY29uc29sZSIsImxvZyIsInNoaXB0aW1pemUiLCJvcGVuTG9hZGVyIiwic2hpcHRpbWl6ZV9sYWJlbF9yZXF1ZXN0IiwibW9uaXRvckxhYmVsU3RhdHVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7Ozs7Ozs7SUFFcUJBLGtCO0FBRWpCLGtDQUFjO0FBQUE7O0FBQ1YsYUFBS0MsR0FBTCxHQUFXLElBQUlDLHVDQUFKLEVBQVg7QUFD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bW1lcmNlLWFkbWluLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFV0aWxzIGZyb20gJy4vc2hpcHRpbWl6ZS11dGlscy5qcyc7IFxuaW1wb3J0IFNoaXB0aW1pemVXZWlnaHRCYXNlZFNoaXBwaW5nIGZyb20gJy4vc2hpcHRpbWl6ZS13ZWlnaHQtYmFzZWQtc2hpcHBpbmcuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXb29TaGlwaXRtaXplQWRtaW4geyAgICBcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLndicyA9IG5ldyBTaGlwdGltaXplV2VpZ2h0QmFzZWRTaGlwcGluZygpO1xuICAgIH1cblxuICAgIGJvb3RzdHJhcCgpIHsgXG4gICAgICAgIHRoaXMudXJsUGFyYW1zKCk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIElmIHRoZSBleHBvcnQgd2FzIHN1Y2Nlc3NmdWxsIFxuICAgICAqIEBwYXJhbSBzdHJpbmcgYXBwTGluayAtIHRoZSBsb2dpbiB1cmwgXG4gICAgICovXG4gICAgZXhwb3J0U3VjY2VzcyhhcHBMaW5rKSB7XG4gICAgICAgIGlmKGFwcExpbmsudHJpbSgpLmxlbmd0aCA9PSAwKXtcbiAgICAgICAgICAgIHJldHVybjsgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIFV0aWxzLm9wZW5OZXdXaW5kb3coYXBwTGluaywgJycpOyBcbiAgICB9IFxuXG4gICAgLyoqIFxuICAgICAqIEBwYXJhbSBpbnQgaWQgLSB0aGUgY2FycmllciBpZCBcbiAgICAgKi8gXG4gICAgZ2V0Q2FycmllcihpZCl7XG4gICAgICAgIGZvciggbGV0IHggPSAwOyB4IDwgc2hpcHRpbWl6ZV9jYXJyaWVycy5sZW5ndGg7ICsreCApe1xuICAgICAgICAgICAgaWYoc2hpcHRpbWl6ZV9jYXJyaWVyc1t4XS5JZCA9PSBpZCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNoaXB0aW1pemVfY2FycmllcnNbeF07IFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFNob3cgYWRpdGlvbmFsIG9wdGlvbnMgZm9yIGNhcnJpZXIgXG4gICAgICovIFxuICAgIHNlbGVjdE9wdGlvbnMoZWxlbSl7XG4gICAgICAgIHRoaXMuc2VsZWN0U2VydmljZUxldmVsKGVsZW0sIGpRdWVyeSgnLnNoaXB0aW1pemVfX3NlcnZpY2UtbGV2ZWwnKS52YWwoKSk7IFxuICAgICAgICAvLyBoaWRlIHRoZSBleHRyYSBvcHRpb25zIGZvciBub3cgXG4gICAgICAgIC8vIHRoaXMuc2VsZWN0RXh0cmFPcHRpb25zKGVsZW0sIGpRdWVyeSgnLnNoaXB0aW1pemVfX2V4dHJhLW9wdGlvbnMnKS52YWwoKSk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIEBwYXJhbSBEb21FbGVtZW50ICBlbGVtIC0gdGhlIGNhcnJpZXIgc2VsZWN0IFxuICAgICAqLyBcbiAgICBzZWxlY3RTZXJ2aWNlTGV2ZWwoIGVsZW0gLCBzZXJ2aWNlX2lkICkge1xuICAgICAgICBsZXQgY2Fycmllcl9pZCA9IGVsZW0udmFsKCk7IFxuICAgICAgICBsZXQgY2FycmllciA9IHRoaXMuZ2V0Q2FycmllcihjYXJyaWVyX2lkKTsgXG4gICAgICAgIGxldCBlU2VydmljZUxldmVsID0gZWxlbS5zaWJsaW5ncyhcIi5zaGlwdGltaXplX19zZXJ2aWNlLWxldmVsXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zX2h0bWwgPSAnJztcblxuICAgICAgICBpZiggdHlwZW9mKGNhcnJpZXIuT3B0aW9uTGlzdCkgIT0gdW5kZWZpbmVkICl7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IGNhcnJpZXIuT3B0aW9uTGlzdDsgXG5cbiAgICAgICAgICAgIGZvciggbGV0IHggPSAwOyB4IDwgb3B0aW9ucy5sZW5ndGg7ICsreCl7XG4gICAgICAgICAgICAgICAgaWYoIG9wdGlvbnNbeF0uVHlwZSA9PSAxICYmIHR5cGVvZihvcHRpb25zW3hdLk9wdGlvblZhbHVlcykgIT0gJ3VuZGVmaW5lZCcgKXsgIFxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gb3B0aW9uc1t4XS5PcHRpb25WYWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNfaHRtbCArPSBcIjxvcHRpb24+LTwvb3B0aW9uPlwiO1xuICAgICAgICAgICAgICAgICAgICBmb3IoIGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7ICsraSApe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gc2VydmljZV9pZCA9PSB2YWx1ZXNbaV0uSWQgPyAnc2VsZWN0ZWQnIDonJzsgXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zX2h0bWwgKz0gXCI8b3B0aW9uIHZhbHVlPSdcIiArIHZhbHVlc1tpXS5JZCArIFwiJyBcIiArIHNlbGVjdGVkICsgXCIgPlwiICsgdmFsdWVzW2ldLk5hbWUgKyBcIjwvb3B0aW9uPlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZVNlcnZpY2VMZXZlbC5odG1sKG9wdGlvbnNfaHRtbCk7XG4gICAgICAgIGlmKG9wdGlvbnNfaHRtbCl7XG4gICAgICAgICAgICBlU2VydmljZUxldmVsLmFkZENsYXNzKFwiYWN0aXZlXCIpOyBcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVTZXJ2aWNlTGV2ZWwucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHNlbGVjdEV4dHJhT3B0aW9ucyggZWxlbSwgc2VsZWN0ZWRfaWQgKXsgbGV0IGNhcnJpZXJfaWQgPSBlbGVtLnZhbCgpOyBcbiAgICAgICAgbGV0IGNhcnJpZXIgPSB0aGlzLmdldENhcnJpZXIoY2Fycmllcl9pZCk7IFxuICAgICAgICBsZXQgZUV4dHJhb3B0aW9ucyA9IGVsZW0uc2libGluZ3MoXCIuc2hpcHRpbWl6ZV9fZXh0cmEtb3B0aW9uc1wiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc19odG1sID0gJyc7XG4gICAgICAgIGxldCBvcHRpb25fdmFsdWVzX2h0bWwgPSBbXTsgXG5cbiAgICAgICAgaWYoIHR5cGVvZihjYXJyaWVyLk9wdGlvbkxpc3QpICE9IHVuZGVmaW5lZCApe1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBjYXJyaWVyLk9wdGlvbkxpc3Q7IFxuICAgICAgICAgICAgZm9yKCBsZXQgeCA9IDA7IHggPCBvcHRpb25zLmxlbmd0aDsgKyt4KXtcbiAgICAgICAgICAgICAgICBpZiggb3B0aW9uc1t4XS5UeXBlID09IDAgKXsgIFxuICAgICAgICAgICAgICAgICAgICBpZighb3B0aW9uc19odG1sKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNfaHRtbCArPSBcIjxvcHRpb24+LTwvb3B0aW9uPlwiO1xuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWQgPSBzZWxlY3RlZF9pZCA9PSBvcHRpb25zW3hdLklkID8gJ3NlbGVjdGVkJyA6Jyc7IFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zX2h0bWwgKz0gXCI8b3B0aW9uIHZhbHVlPSdcIiArIG9wdGlvbnNbeF0uSWQgKyBcIicgXCIgKyBzZWxlY3RlZCArIFwiID5cIiArIG9wdGlvbnNbeF0uTmFtZSArIFwiPC9vcHRpb24+XCI7IFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zW3hdLk9wdGlvblZhbHVlcyAmJiBvcHRpb25zW3hdLk9wdGlvblZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2aHRtbCA9ICc8c2VsZWN0IGlkPVwic2hpcHRpbWl6ZS1vcHRpb252YWx1ZXMnICsgb3B0aW9uc1t4XS5JZCArJ1wiIGNsYXNzPVwic2hpcHRpbWl6ZV9fb3B0aW9udmFsdWVzXCI+JztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaj0wOyBqIDwgb3B0aW9uc1t4XS5PcHRpb25WYWx1ZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZodG1sICs9ICc8b3B0aW9uPicgKyBvcHRpb25zW3hdLk9wdGlvblZhbHVlc1tqXSArICc8L29wdGlvbnM+JztcbiAgICAgICAgICAgICAgICAgICAgfSBcblxuICAgICAgICAgICAgICAgICAgICB2aHRtbCArPSAnPHNlbGVjdD4nOyAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZUV4dHJhb3B0aW9ucy5odG1sKG9wdGlvbnNfaHRtbCk7XG4gICAgICAgIGlmKG9wdGlvbnNfaHRtbCl7XG4gICAgICAgICAgICBlRXh0cmFvcHRpb25zLmFkZENsYXNzKFwiYWN0aXZlXCIpOyBcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVFeHRyYW9wdGlvbnMucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG4gICAgICAgIH0gXG4gICAgfSBcbiBcbiAgICBzZWxlY3RUYWIoaWR4KXtcbiAgICAgICAgalF1ZXJ5KFwiLm5hdi10YWJcIikucmVtb3ZlQ2xhc3MoJ25hdi10YWItYWN0aXZlJyk7XG4gICAgICAgIGpRdWVyeShqUXVlcnkoXCIubmF2LXRhYlwiKS5nZXQoaWR4KSkuYWRkQ2xhc3MoJ25hdi10YWItYWN0aXZlJyk7IFxuXG4gICAgICAgIGpRdWVyeShcIi50YWJcIikucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOyBcbiAgICAgICAgalF1ZXJ5KGpRdWVyeShcIi50YWJcIikuZ2V0KGlkeCkpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICB9XG5cbiAgICBhY2NvcmRpb24oZWxlbSl7XG4gICAgICAgIGxldCAkZXBhcmVudCA9IGpRdWVyeShlbGVtKS5wYXJlbnQoKTsgXG4gICAgICAgIGlmICgkZXBhcmVudC5oYXNDbGFzcygnb3BlbicpKSB7XG4gICAgICAgICAgICAkZXBhcmVudC5yZW1vdmVDbGFzcygnb3BlbicpOyBcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICRlcGFyZW50LmFkZENsYXNzKCdvcGVuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogXG4gICAgKiBJcyB0aGVyZSBzdHVmZiBpbiB0aGUgdXJsIHBhcmFtcyB3ZSBjYXJlIGFib3V0PyBcbiAgICAqKi9cbiAgICB1cmxQYXJhbXMoKSB7XG4gICAgICAgIGxldCBwYXJ0cyA9IGRvY3VtZW50LmxvY2F0aW9uLnNlYXJjaC5zcGxpdCgnJicpOyBcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBwYXJ0cy5sZW5ndGg7ICsreCkge1xuICAgICAgICAgIGxldCBrZXl2YWwgPSBwYXJ0c1t4XS5zcGxpdCgnPScpOyBcbiAgICAgICAgICBsZXQga2V5ID0ga2V5dmFsWzBdO1xuICAgICAgICAgIGxldCB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChrZXl2YWxbMV0pOyBcblxuICAgICAgICAgIGlmKGtleSA9PSAnQ2FsbGJhY2tVUkwnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIldlIGFyZSBjcmVhdGluZyBhIGxhYmVsXCIpO1xuICAgICAgICAgICAgc2hpcHRpbWl6ZS5vcGVuTG9hZGVyKHNoaXB0aW1pemVfbGFiZWxfcmVxdWVzdCk7IFxuICAgICAgICAgICAgc2hpcHRpbWl6ZS5tb25pdG9yTGFiZWxTdGF0dXModmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./js/shiptimize-woo-commerce-admin.js\n"); 122 123 /***/ }), 124 125 /***/ "./node_modules/popper.js/dist/esm/popper.js": 126 /*!***************************************************!*\ 127 !*** ./node_modules/popper.js/dist/esm/popper.js ***! 128 \***************************************************/ 129 /*! no static exports found */ 130 /***/ (function(module, exports, __webpack_require__) { 131 132 "use strict"; 133 eval("/* WEBPACK VAR INJECTION */(function(global) {\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n/**!\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version 1.16.1\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';\n\nvar timeoutDuration = function () {\n var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n return 1;\n }\n }\n return 0;\n}();\n\nfunction microtaskDebounce(fn) {\n var called = false;\n return function () {\n if (called) {\n return;\n }\n called = true;\n window.Promise.resolve().then(function () {\n called = false;\n fn();\n });\n };\n}\n\nfunction taskDebounce(fn) {\n var scheduled = false;\n return function () {\n if (!scheduled) {\n scheduled = true;\n setTimeout(function () {\n scheduled = false;\n fn();\n }, timeoutDuration);\n }\n };\n}\n\nvar supportsMicroTasks = isBrowser && window.Promise;\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nfunction isFunction(functionToCheck) {\n var getType = {};\n return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n}\n\n/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nfunction getStyleComputedProperty(element, property) {\n if (element.nodeType !== 1) {\n return [];\n }\n // NOTE: 1 DOM access here\n var window = element.ownerDocument.defaultView;\n var css = window.getComputedStyle(element, null);\n return property ? css[property] : css;\n}\n\n/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nfunction getParentNode(element) {\n if (element.nodeName === 'HTML') {\n return element;\n }\n return element.parentNode || element.host;\n}\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nfunction getScrollParent(element) {\n // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n if (!element) {\n return document.body;\n }\n\n switch (element.nodeName) {\n case 'HTML':\n case 'BODY':\n return element.ownerDocument.body;\n case '#document':\n return element.body;\n }\n\n // Firefox want us to check `-x` and `-y` variations as well\n\n var _getStyleComputedProp = getStyleComputedProperty(element),\n overflow = _getStyleComputedProp.overflow,\n overflowX = _getStyleComputedProp.overflowX,\n overflowY = _getStyleComputedProp.overflowY;\n\n if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n return element;\n }\n\n return getScrollParent(getParentNode(element));\n}\n\n/**\n * Returns the reference node of the reference object, or the reference object itself.\n * @method\n * @memberof Popper.Utils\n * @param {Element|Object} reference - the reference element (the popper will be relative to this)\n * @returns {Element} parent\n */\nfunction getReferenceNode(reference) {\n return reference && reference.referenceNode ? reference.referenceNode : reference;\n}\n\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nfunction isIE(version) {\n if (version === 11) {\n return isIE11;\n }\n if (version === 10) {\n return isIE10;\n }\n return isIE11 || isIE10;\n}\n\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nfunction getOffsetParent(element) {\n if (!element) {\n return document.documentElement;\n }\n\n var noOffsetParent = isIE(10) ? document.body : null;\n\n // NOTE: 1 DOM access here\n var offsetParent = element.offsetParent || null;\n // Skip hidden elements which don't have an offsetParent\n while (offsetParent === noOffsetParent && element.nextElementSibling) {\n offsetParent = (element = element.nextElementSibling).offsetParent;\n }\n\n var nodeName = offsetParent && offsetParent.nodeName;\n\n if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n return element ? element.ownerDocument.documentElement : document.documentElement;\n }\n\n // .offsetParent will return the closest TH, TD or TABLE in case\n // no offsetParent is present, I hate this job...\n if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n return getOffsetParent(offsetParent);\n }\n\n return offsetParent;\n}\n\nfunction isOffsetContainer(element) {\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY') {\n return false;\n }\n return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n}\n\n/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nfunction getRoot(node) {\n if (node.parentNode !== null) {\n return getRoot(node.parentNode);\n }\n\n return node;\n}\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nfunction findCommonOffsetParent(element1, element2) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n return document.documentElement;\n }\n\n // Here we make sure to give as \"start\" the element that comes first in the DOM\n var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n var start = order ? element1 : element2;\n var end = order ? element2 : element1;\n\n // Get common ancestor container\n var range = document.createRange();\n range.setStart(start, 0);\n range.setEnd(end, 0);\n var commonAncestorContainer = range.commonAncestorContainer;\n\n // Both nodes are inside #document\n\n if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n if (isOffsetContainer(commonAncestorContainer)) {\n return commonAncestorContainer;\n }\n\n return getOffsetParent(commonAncestorContainer);\n }\n\n // one of the nodes is inside shadowDOM, find which one\n var element1root = getRoot(element1);\n if (element1root.host) {\n return findCommonOffsetParent(element1root.host, element2);\n } else {\n return findCommonOffsetParent(element1, getRoot(element2).host);\n }\n}\n\n/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nfunction getScroll(element) {\n var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n var html = element.ownerDocument.documentElement;\n var scrollingElement = element.ownerDocument.scrollingElement || html;\n return scrollingElement[upperSide];\n }\n\n return element[upperSide];\n}\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nfunction includeScroll(rect, element) {\n var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n var modifier = subtract ? -1 : 1;\n rect.top += scrollTop * modifier;\n rect.bottom += scrollTop * modifier;\n rect.left += scrollLeft * modifier;\n rect.right += scrollLeft * modifier;\n return rect;\n}\n\n/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nfunction getBordersSize(styles, axis) {\n var sideA = axis === 'x' ? 'Left' : 'Top';\n var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n return parseFloat(styles['border' + sideA + 'Width']) + parseFloat(styles['border' + sideB + 'Width']);\n}\n\nfunction getSize(axis, body, html, computedStyle) {\n return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n}\n\nfunction getWindowSizes(document) {\n var body = document.body;\n var html = document.documentElement;\n var computedStyle = isIE(10) && getComputedStyle(html);\n\n return {\n height: getSize('Height', body, html, computedStyle),\n width: getSize('Width', body, html, computedStyle)\n };\n}\n\nvar classCallCheck = function classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nvar defineProperty = function defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n};\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\n/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nfunction getClientRect(offsets) {\n return _extends({}, offsets, {\n right: offsets.left + offsets.width,\n bottom: offsets.top + offsets.height\n });\n}\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nfunction getBoundingClientRect(element) {\n var rect = {};\n\n // IE10 10 FIX: Please, don't ask, the element isn't\n // considered in DOM in some circumstances...\n // This isn't reproducible in IE10 compatibility mode of IE11\n try {\n if (isIE(10)) {\n rect = element.getBoundingClientRect();\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n rect.top += scrollTop;\n rect.left += scrollLeft;\n rect.bottom += scrollTop;\n rect.right += scrollLeft;\n } else {\n rect = element.getBoundingClientRect();\n }\n } catch (e) {}\n\n var result = {\n left: rect.left,\n top: rect.top,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n\n // subtract scrollbar size from sizes\n var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n var width = sizes.width || element.clientWidth || result.width;\n var height = sizes.height || element.clientHeight || result.height;\n\n var horizScrollbar = element.offsetWidth - width;\n var vertScrollbar = element.offsetHeight - height;\n\n // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n // we make this check conditional for performance reasons\n if (horizScrollbar || vertScrollbar) {\n var styles = getStyleComputedProperty(element);\n horizScrollbar -= getBordersSize(styles, 'x');\n vertScrollbar -= getBordersSize(styles, 'y');\n\n result.width -= horizScrollbar;\n result.height -= vertScrollbar;\n }\n\n return getClientRect(result);\n}\n\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\n var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var isIE10 = isIE(10);\n var isHTML = parent.nodeName === 'HTML';\n var childrenRect = getBoundingClientRect(children);\n var parentRect = getBoundingClientRect(parent);\n var scrollParent = getScrollParent(children);\n\n var styles = getStyleComputedProperty(parent);\n var borderTopWidth = parseFloat(styles.borderTopWidth);\n var borderLeftWidth = parseFloat(styles.borderLeftWidth);\n\n // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n if (fixedPosition && isHTML) {\n parentRect.top = Math.max(parentRect.top, 0);\n parentRect.left = Math.max(parentRect.left, 0);\n }\n var offsets = getClientRect({\n top: childrenRect.top - parentRect.top - borderTopWidth,\n left: childrenRect.left - parentRect.left - borderLeftWidth,\n width: childrenRect.width,\n height: childrenRect.height\n });\n offsets.marginTop = 0;\n offsets.marginLeft = 0;\n\n // Subtract margins of documentElement in case it's being used as parent\n // we do this only on HTML because it's the only element that behaves\n // differently when margins are applied to it. The margins are included in\n // the box of the documentElement, in the other cases not.\n if (!isIE10 && isHTML) {\n var marginTop = parseFloat(styles.marginTop);\n var marginLeft = parseFloat(styles.marginLeft);\n\n offsets.top -= borderTopWidth - marginTop;\n offsets.bottom -= borderTopWidth - marginTop;\n offsets.left -= borderLeftWidth - marginLeft;\n offsets.right -= borderLeftWidth - marginLeft;\n\n // Attach marginTop and marginLeft because in some circumstances we may need them\n offsets.marginTop = marginTop;\n offsets.marginLeft = marginLeft;\n }\n\n if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n offsets = includeScroll(offsets, parent);\n }\n\n return offsets;\n}\n\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\n var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var html = element.ownerDocument.documentElement;\n var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n var width = Math.max(html.clientWidth, window.innerWidth || 0);\n var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n var scrollTop = !excludeScroll ? getScroll(html) : 0;\n var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n var offset = {\n top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n width: width,\n height: height\n };\n\n return getClientRect(offset);\n}\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nfunction isFixed(element) {\n var nodeName = element.nodeName;\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n return false;\n }\n if (getStyleComputedProperty(element, 'position') === 'fixed') {\n return true;\n }\n var parentNode = getParentNode(element);\n if (!parentNode) {\n return false;\n }\n return isFixed(parentNode);\n}\n\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nfunction getFixedPositionOffsetParent(element) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element || !element.parentElement || isIE()) {\n return document.documentElement;\n }\n var el = element.parentElement;\n while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n el = el.parentElement;\n }\n return el || document.documentElement;\n}\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\n var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n // NOTE: 1 DOM access here\n\n var boundaries = { top: 0, left: 0 };\n var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n\n // Handle viewport case\n if (boundariesElement === 'viewport') {\n boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n } else {\n // Handle other cases based on DOM element used as boundaries\n var boundariesNode = void 0;\n if (boundariesElement === 'scrollParent') {\n boundariesNode = getScrollParent(getParentNode(reference));\n if (boundariesNode.nodeName === 'BODY') {\n boundariesNode = popper.ownerDocument.documentElement;\n }\n } else if (boundariesElement === 'window') {\n boundariesNode = popper.ownerDocument.documentElement;\n } else {\n boundariesNode = boundariesElement;\n }\n\n var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n // In case of HTML, we need a different computation\n if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n height = _getWindowSizes.height,\n width = _getWindowSizes.width;\n\n boundaries.top += offsets.top - offsets.marginTop;\n boundaries.bottom = height + offsets.top;\n boundaries.left += offsets.left - offsets.marginLeft;\n boundaries.right = width + offsets.left;\n } else {\n // for all the other DOM elements, this one is good\n boundaries = offsets;\n }\n }\n\n // Add paddings\n padding = padding || 0;\n var isPaddingNumber = typeof padding === 'number';\n boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n\n return boundaries;\n}\n\nfunction getArea(_ref) {\n var width = _ref.width,\n height = _ref.height;\n\n return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n if (placement.indexOf('auto') === -1) {\n return placement;\n }\n\n var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n var rects = {\n top: {\n width: boundaries.width,\n height: refRect.top - boundaries.top\n },\n right: {\n width: boundaries.right - refRect.right,\n height: boundaries.height\n },\n bottom: {\n width: boundaries.width,\n height: boundaries.bottom - refRect.bottom\n },\n left: {\n width: refRect.left - boundaries.left,\n height: boundaries.height\n }\n };\n\n var sortedAreas = Object.keys(rects).map(function (key) {\n return _extends({\n key: key\n }, rects[key], {\n area: getArea(rects[key])\n });\n }).sort(function (a, b) {\n return b.area - a.area;\n });\n\n var filteredAreas = sortedAreas.filter(function (_ref2) {\n var width = _ref2.width,\n height = _ref2.height;\n return width >= popper.clientWidth && height >= popper.clientHeight;\n });\n\n var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n var variation = placement.split('-')[1];\n\n return computedPlacement + (variation ? '-' + variation : '');\n}\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nfunction getReferenceOffsets(state, popper, reference) {\n var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n\n/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nfunction getOuterSizes(element) {\n var window = element.ownerDocument.defaultView;\n var styles = window.getComputedStyle(element);\n var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n var result = {\n width: element.offsetWidth + y,\n height: element.offsetHeight + x\n };\n return result;\n}\n\n/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nfunction getOppositePlacement(placement) {\n var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\n placement = placement.split('-')[0];\n\n // Get popper node sizes\n var popperRect = getOuterSizes(popper);\n\n // Add position, width and height to our offsets object\n var popperOffsets = {\n width: popperRect.width,\n height: popperRect.height\n };\n\n // depending by the popper placement we have to compute its offsets slightly differently\n var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n var mainSide = isHoriz ? 'top' : 'left';\n var secondarySide = isHoriz ? 'left' : 'top';\n var measurement = isHoriz ? 'height' : 'width';\n var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n if (placement === secondarySide) {\n popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n } else {\n popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n }\n\n return popperOffsets;\n}\n\n/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction find(arr, check) {\n // use native find if supported\n if (Array.prototype.find) {\n return arr.find(check);\n }\n\n // use `filter` to obtain the same behavior of `find`\n return arr.filter(check)[0];\n}\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction findIndex(arr, prop, value) {\n // use native findIndex if supported\n if (Array.prototype.findIndex) {\n return arr.findIndex(function (cur) {\n return cur[prop] === value;\n });\n }\n\n // use `find` + `indexOf` if `findIndex` isn't supported\n var match = find(arr, function (obj) {\n return obj[prop] === value;\n });\n return arr.indexOf(match);\n}\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nfunction runModifiers(modifiers, data, ends) {\n var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n modifiersToRun.forEach(function (modifier) {\n if (modifier['function']) {\n // eslint-disable-line dot-notation\n console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n }\n var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n if (modifier.enabled && isFunction(fn)) {\n // Add properties to offsets to make them a complete clientRect object\n // we do this before each modifier to make sure the previous one doesn't\n // mess with these values\n data.offsets.popper = getClientRect(data.offsets.popper);\n data.offsets.reference = getClientRect(data.offsets.reference);\n\n data = fn(data, modifier);\n }\n });\n\n return data;\n}\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.<br />\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nfunction update() {\n // if popper is destroyed, don't perform any further update\n if (this.state.isDestroyed) {\n return;\n }\n\n var data = {\n instance: this,\n styles: {},\n arrowStyles: {},\n attributes: {},\n flipped: false,\n offsets: {}\n };\n\n // compute reference element offsets\n data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n // store the computed placement inside `originalPlacement`\n data.originalPlacement = data.placement;\n\n data.positionFixed = this.options.positionFixed;\n\n // compute the popper offsets\n data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n // run the modifiers\n data = runModifiers(this.modifiers, data);\n\n // the first `update` will call `onCreate` callback\n // the other ones will call `onUpdate` callback\n if (!this.state.isCreated) {\n this.state.isCreated = true;\n this.options.onCreate(data);\n } else {\n this.options.onUpdate(data);\n }\n}\n\n/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nfunction isModifierEnabled(modifiers, modifierName) {\n return modifiers.some(function (_ref) {\n var name = _ref.name,\n enabled = _ref.enabled;\n return enabled && name === modifierName;\n });\n}\n\n/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nfunction getSupportedPropertyName(property) {\n var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n for (var i = 0; i < prefixes.length; i++) {\n var prefix = prefixes[i];\n var toCheck = prefix ? '' + prefix + upperProp : property;\n if (typeof document.body.style[toCheck] !== 'undefined') {\n return toCheck;\n }\n }\n return null;\n}\n\n/**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\nfunction destroy() {\n this.state.isDestroyed = true;\n\n // touch DOM only if `applyStyle` modifier is enabled\n if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n this.popper.removeAttribute('x-placement');\n this.popper.style.position = '';\n this.popper.style.top = '';\n this.popper.style.left = '';\n this.popper.style.right = '';\n this.popper.style.bottom = '';\n this.popper.style.willChange = '';\n this.popper.style[getSupportedPropertyName('transform')] = '';\n }\n\n this.disableEventListeners();\n\n // remove the popper if user explicitly asked for the deletion on destroy\n // do not use `remove` because IE11 doesn't support it\n if (this.options.removeOnDestroy) {\n this.popper.parentNode.removeChild(this.popper);\n }\n return this;\n}\n\n/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nfunction getWindow(element) {\n var ownerDocument = element.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView : window;\n}\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n var isBody = scrollParent.nodeName === 'BODY';\n var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n target.addEventListener(event, callback, { passive: true });\n\n if (!isBody) {\n attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n }\n scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction setupEventListeners(reference, options, state, updateBound) {\n // Resize event listener on window\n state.updateBound = updateBound;\n getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n // Scroll event listener on scroll parents\n var scrollElement = getScrollParent(reference);\n attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n state.scrollElement = scrollElement;\n state.eventsEnabled = true;\n\n return state;\n}\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nfunction enableEventListeners() {\n if (!this.state.eventsEnabled) {\n this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n }\n}\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction removeEventListeners(reference, state) {\n // Remove resize event listener on window\n getWindow(reference).removeEventListener('resize', state.updateBound);\n\n // Remove scroll event listener on scroll parents\n state.scrollParents.forEach(function (target) {\n target.removeEventListener('scroll', state.updateBound);\n });\n\n // Reset state\n state.updateBound = null;\n state.scrollParents = [];\n state.scrollElement = null;\n state.eventsEnabled = false;\n return state;\n}\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nfunction disableEventListeners() {\n if (this.state.eventsEnabled) {\n cancelAnimationFrame(this.scheduleUpdate);\n this.state = removeEventListeners(this.reference, this.state);\n }\n}\n\n/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nfunction isNumeric(n) {\n return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setStyles(element, styles) {\n Object.keys(styles).forEach(function (prop) {\n var unit = '';\n // add unit if the value is numeric and is one of the following\n if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n unit = 'px';\n }\n element.style[prop] = styles[prop] + unit;\n });\n}\n\n/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setAttributes(element, attributes) {\n Object.keys(attributes).forEach(function (prop) {\n var value = attributes[prop];\n if (value !== false) {\n element.setAttribute(prop, attributes[prop]);\n } else {\n element.removeAttribute(prop);\n }\n });\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nfunction applyStyle(data) {\n // any property present in `data.styles` will be applied to the popper,\n // in this way we can make the 3rd party modifiers add custom styles to it\n // Be aware, modifiers could override the properties defined in the previous\n // lines of this modifier!\n setStyles(data.instance.popper, data.styles);\n\n // any property present in `data.attributes` will be applied to the popper,\n // they will be set as HTML attributes of the element\n setAttributes(data.instance.popper, data.attributes);\n\n // if arrowElement is defined and arrowStyles has some properties\n if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n setStyles(data.arrowElement, data.arrowStyles);\n }\n\n return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n // compute reference element offsets\n var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n popper.setAttribute('x-placement', placement);\n\n // Apply `position` to popper before anything else because\n // without the position applied we can't guarantee correct computations\n setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n return options;\n}\n\n/**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\nfunction getRoundedOffsets(data, shouldRound) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n var round = Math.round,\n floor = Math.floor;\n\n var noRound = function noRound(v) {\n return v;\n };\n\n var referenceWidth = round(reference.width);\n var popperWidth = round(popper.width);\n\n var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n var isVariation = data.placement.indexOf('-') !== -1;\n var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n var verticalToInteger = !shouldRound ? noRound : round;\n\n return {\n left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n top: verticalToInteger(popper.top),\n bottom: verticalToInteger(popper.bottom),\n right: horizontalToInteger(popper.right)\n };\n}\n\nvar isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeStyle(data, options) {\n var x = options.x,\n y = options.y;\n var popper = data.offsets.popper;\n\n // Remove this legacy support in Popper.js v2\n\n var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'applyStyle';\n }).gpuAcceleration;\n if (legacyGpuAccelerationOption !== undefined) {\n console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n }\n var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n var offsetParent = getOffsetParent(data.instance.popper);\n var offsetParentRect = getBoundingClientRect(offsetParent);\n\n // Styles\n var styles = {\n position: popper.position\n };\n\n var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n\n var sideA = x === 'bottom' ? 'top' : 'bottom';\n var sideB = y === 'right' ? 'left' : 'right';\n\n // if gpuAcceleration is set to `true` and transform is supported,\n // we use `translate3d` to apply the position to the popper we\n // automatically use the supported prefixed version if needed\n var prefixedProperty = getSupportedPropertyName('transform');\n\n // now, let's make a step back and look at this code closely (wtf?)\n // If the content of the popper grows once it's been positioned, it\n // may happen that the popper gets misplaced because of the new content\n // overflowing its reference element\n // To avoid this problem, we provide two options (x and y), which allow\n // the consumer to define the offset origin.\n // If we position a popper on top of a reference element, we can set\n // `x` to `top` to make the popper grow towards its top instead of\n // its bottom.\n var left = void 0,\n top = void 0;\n if (sideA === 'bottom') {\n // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n // and not the bottom of the html element\n if (offsetParent.nodeName === 'HTML') {\n top = -offsetParent.clientHeight + offsets.bottom;\n } else {\n top = -offsetParentRect.height + offsets.bottom;\n }\n } else {\n top = offsets.top;\n }\n if (sideB === 'right') {\n if (offsetParent.nodeName === 'HTML') {\n left = -offsetParent.clientWidth + offsets.right;\n } else {\n left = -offsetParentRect.width + offsets.right;\n }\n } else {\n left = offsets.left;\n }\n if (gpuAcceleration && prefixedProperty) {\n styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n styles[sideA] = 0;\n styles[sideB] = 0;\n styles.willChange = 'transform';\n } else {\n // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n var invertTop = sideA === 'bottom' ? -1 : 1;\n var invertLeft = sideB === 'right' ? -1 : 1;\n styles[sideA] = top * invertTop;\n styles[sideB] = left * invertLeft;\n styles.willChange = sideA + ', ' + sideB;\n }\n\n // Attributes\n var attributes = {\n 'x-placement': data.placement\n };\n\n // Update `data` attributes, styles and arrowStyles\n data.attributes = _extends({}, attributes, data.attributes);\n data.styles = _extends({}, styles, data.styles);\n data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n return data;\n}\n\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\n var requesting = find(modifiers, function (_ref) {\n var name = _ref.name;\n return name === requestingName;\n });\n\n var isRequired = !!requesting && modifiers.some(function (modifier) {\n return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n });\n\n if (!isRequired) {\n var _requesting = '`' + requestingName + '`';\n var requested = '`' + requestedName + '`';\n console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n }\n return isRequired;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction arrow(data, options) {\n var _data$offsets$arrow;\n\n // arrow depends on keepTogether in order to work\n if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n return data;\n }\n\n var arrowElement = options.element;\n\n // if arrowElement is a string, suppose it's a CSS selector\n if (typeof arrowElement === 'string') {\n arrowElement = data.instance.popper.querySelector(arrowElement);\n\n // if arrowElement is not found, don't run the modifier\n if (!arrowElement) {\n return data;\n }\n } else {\n // if the arrowElement isn't a query selector we must check that the\n // provided DOM node is child of its popper node\n if (!data.instance.popper.contains(arrowElement)) {\n console.warn('WARNING: `arrow.element` must be child of its popper element!');\n return data;\n }\n }\n\n var placement = data.placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n var len = isVertical ? 'height' : 'width';\n var sideCapitalized = isVertical ? 'Top' : 'Left';\n var side = sideCapitalized.toLowerCase();\n var altSide = isVertical ? 'left' : 'top';\n var opSide = isVertical ? 'bottom' : 'right';\n var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n //\n // extends keepTogether behavior making sure the popper and its\n // reference have enough pixels in conjunction\n //\n\n // top/left side\n if (reference[opSide] - arrowElementSize < popper[side]) {\n data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n }\n // bottom/right side\n if (reference[side] + arrowElementSize > popper[opSide]) {\n data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n }\n data.offsets.popper = getClientRect(data.offsets.popper);\n\n // compute center of the popper\n var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n // Compute the sideValue using the updated popper offsets\n // take popper margin in account because we don't have this info available\n var css = getStyleComputedProperty(data.instance.popper);\n var popperMarginSide = parseFloat(css['margin' + sideCapitalized]);\n var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width']);\n var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n // prevent arrowElement from being placed not contiguously to its popper\n sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n data.arrowElement = arrowElement;\n data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n return data;\n}\n\n/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nfunction getOppositeVariation(variation) {\n if (variation === 'end') {\n return 'start';\n } else if (variation === 'start') {\n return 'end';\n }\n return variation;\n}\n\n/**\n * List of accepted placements to use as values of the `placement` option.<br />\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.<br />\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n// Get rid of `auto` `auto-start` and `auto-end`\nvar validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nfunction clockwise(placement) {\n var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var index = validPlacements.indexOf(placement);\n var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n return counter ? arr.reverse() : arr;\n}\n\nvar BEHAVIORS = {\n FLIP: 'flip',\n CLOCKWISE: 'clockwise',\n COUNTERCLOCKWISE: 'counterclockwise'\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction flip(data, options) {\n // if `inner` modifier is enabled, we can't use the `flip` modifier\n if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n return data;\n }\n\n if (data.flipped && data.placement === data.originalPlacement) {\n // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n return data;\n }\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n var placement = data.placement.split('-')[0];\n var placementOpposite = getOppositePlacement(placement);\n var variation = data.placement.split('-')[1] || '';\n\n var flipOrder = [];\n\n switch (options.behavior) {\n case BEHAVIORS.FLIP:\n flipOrder = [placement, placementOpposite];\n break;\n case BEHAVIORS.CLOCKWISE:\n flipOrder = clockwise(placement);\n break;\n case BEHAVIORS.COUNTERCLOCKWISE:\n flipOrder = clockwise(placement, true);\n break;\n default:\n flipOrder = options.behavior;\n }\n\n flipOrder.forEach(function (step, index) {\n if (placement !== step || flipOrder.length === index + 1) {\n return data;\n }\n\n placement = data.placement.split('-')[0];\n placementOpposite = getOppositePlacement(placement);\n\n var popperOffsets = data.offsets.popper;\n var refOffsets = data.offsets.reference;\n\n // using floor because the reference offsets may contain decimals we are not going to consider here\n var floor = Math.floor;\n var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n // flip the variation if required\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n\n // flips variation if reference element overflows boundaries\n var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n // flips variation if popper content overflows boundaries\n var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);\n\n var flippedVariation = flippedVariationByRef || flippedVariationByContent;\n\n if (overlapsRef || overflowsBoundaries || flippedVariation) {\n // this boolean to detect any flip loop\n data.flipped = true;\n\n if (overlapsRef || overflowsBoundaries) {\n placement = flipOrder[index + 1];\n }\n\n if (flippedVariation) {\n variation = getOppositeVariation(variation);\n }\n\n data.placement = placement + (variation ? '-' + variation : '');\n\n // this object contains `position`, we want to preserve it along with\n // any additional property we may add in the future\n data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n data = runModifiers(data.instance.modifiers, data, 'flip');\n }\n });\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction keepTogether(data) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var placement = data.placement.split('-')[0];\n var floor = Math.floor;\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n var side = isVertical ? 'right' : 'bottom';\n var opSide = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n if (popper[side] < floor(reference[opSide])) {\n data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n }\n if (popper[opSide] > floor(reference[side])) {\n data.offsets.popper[opSide] = floor(reference[side]);\n }\n\n return data;\n}\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\n // separate value from unit\n var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n var value = +split[1];\n var unit = split[2];\n\n // If it's not a number it's an operator, I guess\n if (!value) {\n return str;\n }\n\n if (unit.indexOf('%') === 0) {\n var element = void 0;\n switch (unit) {\n case '%p':\n element = popperOffsets;\n break;\n case '%':\n case '%r':\n default:\n element = referenceOffsets;\n }\n\n var rect = getClientRect(element);\n return rect[measurement] / 100 * value;\n } else if (unit === 'vh' || unit === 'vw') {\n // if is a vh or vw, we calculate the size based on the viewport\n var size = void 0;\n if (unit === 'vh') {\n size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n } else {\n size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n }\n return size / 100 * value;\n } else {\n // if is an explicit pixel unit, we get rid of the unit and keep the value\n // if is an implicit unit, it's px, and we return just the value\n return value;\n }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n var offsets = [0, 0];\n\n // Use height if placement is left or right and index is 0 otherwise use width\n // in this way the first offset will use an axis and the second one\n // will use the other one\n var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n // Split the offset string to obtain a list of values and operands\n // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n return frag.trim();\n });\n\n // Detect if the offset string contains a pair of values or a single one\n // they could be separated by comma or space\n var divider = fragments.indexOf(find(fragments, function (frag) {\n return frag.search(/,|\\s/) !== -1;\n }));\n\n if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n }\n\n // If divider is found, we divide the list of values and operands to divide\n // them by ofset X and Y.\n var splitRegex = /\\s*,\\s*|\\s+/;\n var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n // Convert the values with units to absolute pixels to allow our computations\n ops = ops.map(function (op, index) {\n // Most of the units rely on the orientation of the popper\n var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n var mergeWithPrevious = false;\n return op\n // This aggregates any `+` or `-` sign that aren't considered operators\n // e.g.: 10 + +5 => [10, +, +5]\n .reduce(function (a, b) {\n if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n a[a.length - 1] = b;\n mergeWithPrevious = true;\n return a;\n } else if (mergeWithPrevious) {\n a[a.length - 1] += b;\n mergeWithPrevious = false;\n return a;\n } else {\n return a.concat(b);\n }\n }, [])\n // Here we convert the string values into number values (in px)\n .map(function (str) {\n return toValue(str, measurement, popperOffsets, referenceOffsets);\n });\n });\n\n // Loop trough the offsets arrays and execute the operations\n ops.forEach(function (op, index) {\n op.forEach(function (frag, index2) {\n if (isNumeric(frag)) {\n offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n }\n });\n });\n return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nfunction offset(data, _ref) {\n var offset = _ref.offset;\n var placement = data.placement,\n _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var basePlacement = placement.split('-')[0];\n\n var offsets = void 0;\n if (isNumeric(+offset)) {\n offsets = [+offset, 0];\n } else {\n offsets = parseOffset(offset, popper, reference, basePlacement);\n }\n\n if (basePlacement === 'left') {\n popper.top += offsets[0];\n popper.left -= offsets[1];\n } else if (basePlacement === 'right') {\n popper.top += offsets[0];\n popper.left += offsets[1];\n } else if (basePlacement === 'top') {\n popper.left += offsets[0];\n popper.top -= offsets[1];\n } else if (basePlacement === 'bottom') {\n popper.left += offsets[0];\n popper.top += offsets[1];\n }\n\n data.popper = popper;\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction preventOverflow(data, options) {\n var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n // If offsetParent is the reference element, we really want to\n // go one step up and use the next offsetParent as reference to\n // avoid to make this modifier completely useless and look like broken\n if (data.instance.reference === boundariesElement) {\n boundariesElement = getOffsetParent(boundariesElement);\n }\n\n // NOTE: DOM access here\n // resets the popper's position so that the document size can be calculated excluding\n // the size of the popper element itself\n var transformProp = getSupportedPropertyName('transform');\n var popperStyles = data.instance.popper.style; // assignment to help minification\n var top = popperStyles.top,\n left = popperStyles.left,\n transform = popperStyles[transformProp];\n\n popperStyles.top = '';\n popperStyles.left = '';\n popperStyles[transformProp] = '';\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n // NOTE: DOM access here\n // restores the original style properties after the offsets have been computed\n popperStyles.top = top;\n popperStyles.left = left;\n popperStyles[transformProp] = transform;\n\n options.boundaries = boundaries;\n\n var order = options.priority;\n var popper = data.offsets.popper;\n\n var check = {\n primary: function primary(placement) {\n var value = popper[placement];\n if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n value = Math.max(popper[placement], boundaries[placement]);\n }\n return defineProperty({}, placement, value);\n },\n secondary: function secondary(placement) {\n var mainSide = placement === 'right' ? 'left' : 'top';\n var value = popper[mainSide];\n if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n }\n return defineProperty({}, mainSide, value);\n }\n };\n\n order.forEach(function (placement) {\n var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n popper = _extends({}, popper, check[side](placement));\n });\n\n data.offsets.popper = popper;\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction shift(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var shiftvariation = placement.split('-')[1];\n\n // if shift shiftvariation is specified, run the modifier\n if (shiftvariation) {\n var _data$offsets = data.offsets,\n reference = _data$offsets.reference,\n popper = _data$offsets.popper;\n\n var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n var side = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n var shiftOffsets = {\n start: defineProperty({}, side, reference[side]),\n end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n };\n\n data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction hide(data) {\n if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n return data;\n }\n\n var refRect = data.offsets.reference;\n var bound = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'preventOverflow';\n }).boundaries;\n\n if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === true) {\n return data;\n }\n\n data.hide = true;\n data.attributes['x-out-of-boundaries'] = '';\n } else {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === false) {\n return data;\n }\n\n data.hide = false;\n data.attributes['x-out-of-boundaries'] = false;\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction inner(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n data.placement = getOppositePlacement(placement);\n data.offsets.popper = getClientRect(popper);\n\n return data;\n}\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.<br />\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nvar modifiers = {\n /**\n * Modifier used to shift the popper on the start or end of its reference\n * element.<br />\n * It will read the variation of the `placement` property.<br />\n * It can be one either `-end` or `-start`.\n * @memberof modifiers\n * @inner\n */\n shift: {\n /** @prop {number} order=100 - Index used to define the order of execution */\n order: 100,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: shift\n },\n\n /**\n * The `offset` modifier can shift your popper on both its axis.\n *\n * It accepts the following units:\n * - `px` or unit-less, interpreted as pixels\n * - `%` or `%r`, percentage relative to the length of the reference element\n * - `%p`, percentage relative to the length of the popper element\n * - `vw`, CSS viewport width unit\n * - `vh`, CSS viewport height unit\n *\n * For length is intended the main axis relative to the placement of the popper.<br />\n * This means that if the placement is `top` or `bottom`, the length will be the\n * `width`. In case of `left` or `right`, it will be the `height`.\n *\n * You can provide a single value (as `Number` or `String`), or a pair of values\n * as `String` divided by a comma or one (or more) white spaces.<br />\n * The latter is a deprecated method because it leads to confusion and will be\n * removed in v2.<br />\n * Additionally, it accepts additions and subtractions between different units.\n * Note that multiplications and divisions aren't supported.\n *\n * Valid examples are:\n * ```\n * 10\n * '10%'\n * '10, 10'\n * '10%, 10'\n * '10 + 10%'\n * '10 - 5vh + 3%'\n * '-10px + 5vh, 5px - 6%'\n * ```\n * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n *\n * @memberof modifiers\n * @inner\n */\n offset: {\n /** @prop {number} order=200 - Index used to define the order of execution */\n order: 200,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: offset,\n /** @prop {Number|String} offset=0\n * The offset value as described in the modifier description\n */\n offset: 0\n },\n\n /**\n * Modifier used to prevent the popper from being positioned outside the boundary.\n *\n * A scenario exists where the reference itself is not within the boundaries.<br />\n * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n * In this case we need to decide whether the popper should either:\n *\n * - detach from the reference and remain \"trapped\" in the boundaries, or\n * - if it should ignore the boundary and \"escape with its reference\"\n *\n * When `escapeWithReference` is set to`true` and reference is completely\n * outside its boundaries, the popper will overflow (or completely leave)\n * the boundaries in order to remain attached to the edge of the reference.\n *\n * @memberof modifiers\n * @inner\n */\n preventOverflow: {\n /** @prop {number} order=300 - Index used to define the order of execution */\n order: 300,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: preventOverflow,\n /**\n * @prop {Array} [priority=['left','right','top','bottom']]\n * Popper will try to prevent overflow following these priorities by default,\n * then, it could overflow on the left and on top of the `boundariesElement`\n */\n priority: ['left', 'right', 'top', 'bottom'],\n /**\n * @prop {number} padding=5\n * Amount of pixel used to define a minimum distance between the boundaries\n * and the popper. This makes sure the popper always has a little padding\n * between the edges of its container\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='scrollParent'\n * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n * `viewport` or any DOM element.\n */\n boundariesElement: 'scrollParent'\n },\n\n /**\n * Modifier used to make sure the reference and its popper stay near each other\n * without leaving any gap between the two. Especially useful when the arrow is\n * enabled and you want to ensure that it points to its reference element.\n * It cares only about the first axis. You can still have poppers with margin\n * between the popper and its reference element.\n * @memberof modifiers\n * @inner\n */\n keepTogether: {\n /** @prop {number} order=400 - Index used to define the order of execution */\n order: 400,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: keepTogether\n },\n\n /**\n * This modifier is used to move the `arrowElement` of the popper to make\n * sure it is positioned between the reference element and its popper element.\n * It will read the outer size of the `arrowElement` node to detect how many\n * pixels of conjunction are needed.\n *\n * It has no effect if no `arrowElement` is provided.\n * @memberof modifiers\n * @inner\n */\n arrow: {\n /** @prop {number} order=500 - Index used to define the order of execution */\n order: 500,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: arrow,\n /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n element: '[x-arrow]'\n },\n\n /**\n * Modifier used to flip the popper's placement when it starts to overlap its\n * reference element.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n *\n * **NOTE:** this modifier will interrupt the current update cycle and will\n * restart it if it detects the need to flip the placement.\n * @memberof modifiers\n * @inner\n */\n flip: {\n /** @prop {number} order=600 - Index used to define the order of execution */\n order: 600,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: flip,\n /**\n * @prop {String|Array} behavior='flip'\n * The behavior used to change the popper's placement. It can be one of\n * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n * placements (with optional variations)\n */\n behavior: 'flip',\n /**\n * @prop {number} padding=5\n * The popper will flip if it hits the edges of the `boundariesElement`\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='viewport'\n * The element which will define the boundaries of the popper position.\n * The popper will never be placed outside of the defined boundaries\n * (except if `keepTogether` is enabled)\n */\n boundariesElement: 'viewport',\n /**\n * @prop {Boolean} flipVariations=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the reference element overlaps its boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariations: false,\n /**\n * @prop {Boolean} flipVariationsByContent=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the popper element overlaps its reference boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariationsByContent: false\n },\n\n /**\n * Modifier used to make the popper flow toward the inner of the reference element.\n * By default, when this modifier is disabled, the popper will be placed outside\n * the reference element.\n * @memberof modifiers\n * @inner\n */\n inner: {\n /** @prop {number} order=700 - Index used to define the order of execution */\n order: 700,\n /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n enabled: false,\n /** @prop {ModifierFn} */\n fn: inner\n },\n\n /**\n * Modifier used to hide the popper when its reference element is outside of the\n * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n * be used to hide with a CSS selector the popper when its reference is\n * out of boundaries.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n * @memberof modifiers\n * @inner\n */\n hide: {\n /** @prop {number} order=800 - Index used to define the order of execution */\n order: 800,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: hide\n },\n\n /**\n * Computes the style that will be applied to the popper element to gets\n * properly positioned.\n *\n * Note that this modifier will not touch the DOM, it just prepares the styles\n * so that `applyStyle` modifier can apply it. This separation is useful\n * in case you need to replace `applyStyle` with a custom implementation.\n *\n * This modifier has `850` as `order` value to maintain backward compatibility\n * with previous versions of Popper.js. Expect the modifiers ordering method\n * to change in future major versions of the library.\n *\n * @memberof modifiers\n * @inner\n */\n computeStyle: {\n /** @prop {number} order=850 - Index used to define the order of execution */\n order: 850,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: computeStyle,\n /**\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: true,\n /**\n * @prop {string} [x='bottom']\n * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n * Change this if your popper should grow in a direction different from `bottom`\n */\n x: 'bottom',\n /**\n * @prop {string} [x='left']\n * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n * Change this if your popper should grow in a direction different from `right`\n */\n y: 'right'\n },\n\n /**\n * Applies the computed styles to the popper element.\n *\n * All the DOM manipulations are limited to this modifier. This is useful in case\n * you want to integrate Popper.js inside a framework or view library and you\n * want to delegate all the DOM manipulations to it.\n *\n * Note that if you disable this modifier, you must make sure the popper element\n * has its position set to `absolute` before Popper.js can do its work!\n *\n * Just disable this modifier and define your own to achieve the desired effect.\n *\n * @memberof modifiers\n * @inner\n */\n applyStyle: {\n /** @prop {number} order=900 - Index used to define the order of execution */\n order: 900,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: applyStyle,\n /** @prop {Function} */\n onLoad: applyStyleOnLoad,\n /**\n * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: undefined\n }\n};\n\n/**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n\n/**\n * Default options provided to Popper.js constructor.<br />\n * These can be overridden using the `options` argument of Popper.js.<br />\n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n * modifiers: {\n * preventOverflow: { enabled: false }\n * }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nvar Defaults = {\n /**\n * Popper's placement.\n * @prop {Popper.placements} placement='bottom'\n */\n placement: 'bottom',\n\n /**\n * Set this to true if you want popper to position it self in 'fixed' mode\n * @prop {Boolean} positionFixed=false\n */\n positionFixed: false,\n\n /**\n * Whether events (resize, scroll) are initially enabled.\n * @prop {Boolean} eventsEnabled=true\n */\n eventsEnabled: true,\n\n /**\n * Set to true if you want to automatically remove the popper when\n * you call the `destroy` method.\n * @prop {Boolean} removeOnDestroy=false\n */\n removeOnDestroy: false,\n\n /**\n * Callback called when the popper is created.<br />\n * By default, it is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onCreate}\n */\n onCreate: function onCreate() {},\n\n /**\n * Callback called when the popper is updated. This callback is not called\n * on the initialization/creation of the popper, but only on subsequent\n * updates.<br />\n * By default, it is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onUpdate}\n */\n onUpdate: function onUpdate() {},\n\n /**\n * List of modifiers used to modify the offsets before they are applied to the popper.\n * They provide most of the functionalities of Popper.js.\n * @prop {modifiers}\n */\n modifiers: modifiers\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n\n// Utils\n// Methods\nvar Popper = function () {\n /**\n * Creates a new Popper.js instance.\n * @class Popper\n * @param {Element|referenceObject} reference - The reference element used to position the popper\n * @param {Element} popper - The HTML / XML element used as the popper\n * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n * @return {Object} instance - The generated Popper.js instance\n */\n function Popper(reference, popper) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n classCallCheck(this, Popper);\n\n this.scheduleUpdate = function () {\n return requestAnimationFrame(_this.update);\n };\n\n // make update() debounced, so that it only runs at most once-per-tick\n this.update = debounce(this.update.bind(this));\n\n // with {} we create a new object with the options inside it\n this.options = _extends({}, Popper.Defaults, options);\n\n // init state\n this.state = {\n isDestroyed: false,\n isCreated: false,\n scrollParents: []\n };\n\n // get reference and popper elements (allow jQuery wrappers)\n this.reference = reference && reference.jquery ? reference[0] : reference;\n this.popper = popper && popper.jquery ? popper[0] : popper;\n\n // Deep merge modifiers options\n this.options.modifiers = {};\n Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n });\n\n // Refactoring modifiers' list (Object => Array)\n this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n return _extends({\n name: name\n }, _this.options.modifiers[name]);\n })\n // sort the modifiers by order\n .sort(function (a, b) {\n return a.order - b.order;\n });\n\n // modifiers have the ability to execute arbitrary code when Popper.js get inited\n // such code is executed in the same order of its modifier\n // they could add new properties to their options configuration\n // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n this.modifiers.forEach(function (modifierOptions) {\n if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n }\n });\n\n // fire the first update to position the popper in the right place\n this.update();\n\n var eventsEnabled = this.options.eventsEnabled;\n if (eventsEnabled) {\n // setup event listeners, they will take care of update the position in specific situations\n this.enableEventListeners();\n }\n\n this.state.eventsEnabled = eventsEnabled;\n }\n\n // We can't use class properties because they don't get listed in the\n // class prototype and break stuff like Sinon stubs\n\n\n createClass(Popper, [{\n key: 'update',\n value: function update$$1() {\n return update.call(this);\n }\n }, {\n key: 'destroy',\n value: function destroy$$1() {\n return destroy.call(this);\n }\n }, {\n key: 'enableEventListeners',\n value: function enableEventListeners$$1() {\n return enableEventListeners.call(this);\n }\n }, {\n key: 'disableEventListeners',\n value: function disableEventListeners$$1() {\n return disableEventListeners.call(this);\n }\n\n /**\n * Schedules an update. It will run on the next UI update available.\n * @method scheduleUpdate\n * @memberof Popper\n */\n\n /**\n * Collection of utilities useful when writing custom modifiers.\n * Starting from version 1.7, this method is available only if you\n * include `popper-utils.js` before `popper.js`.\n *\n * **DEPRECATION**: This way to access PopperUtils is deprecated\n * and will be removed in v2! Use the PopperUtils module directly instead.\n * Due to the high instability of the methods contained in Utils, we can't\n * guarantee them to follow semver. Use them at your own risk!\n * @static\n * @private\n * @type {Object}\n * @deprecated since version 1.8\n * @member Utils\n * @memberof Popper\n */\n\n }]);\n return Popper;\n}();\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.<br />\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\nPopper.placements = placements;\nPopper.Defaults = Defaults;\n\nexports.default = Popper;\n//# sourceMappingURL=popper.js.map\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcG9wcGVyLmpzL2Rpc3QvZXNtL3BvcHBlci5qcz9mMGJkIl0sIm5hbWVzIjpbImlzQnJvd3NlciIsIndpbmRvdyIsImRvY3VtZW50IiwibmF2aWdhdG9yIiwidGltZW91dER1cmF0aW9uIiwibG9uZ2VyVGltZW91dEJyb3dzZXJzIiwiaSIsImxlbmd0aCIsInVzZXJBZ2VudCIsImluZGV4T2YiLCJtaWNyb3Rhc2tEZWJvdW5jZSIsImZuIiwiY2FsbGVkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwidGFza0RlYm91bmNlIiwic2NoZWR1bGVkIiwic2V0VGltZW91dCIsInN1cHBvcnRzTWljcm9UYXNrcyIsImRlYm91bmNlIiwiaXNGdW5jdGlvbiIsImZ1bmN0aW9uVG9DaGVjayIsImdldFR5cGUiLCJ0b1N0cmluZyIsImNhbGwiLCJnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkiLCJlbGVtZW50IiwicHJvcGVydHkiLCJub2RlVHlwZSIsIm93bmVyRG9jdW1lbnQiLCJkZWZhdWx0VmlldyIsImNzcyIsImdldENvbXB1dGVkU3R5bGUiLCJnZXRQYXJlbnROb2RlIiwibm9kZU5hbWUiLCJwYXJlbnROb2RlIiwiaG9zdCIsImdldFNjcm9sbFBhcmVudCIsImJvZHkiLCJfZ2V0U3R5bGVDb21wdXRlZFByb3AiLCJvdmVyZmxvdyIsIm92ZXJmbG93WCIsIm92ZXJmbG93WSIsInRlc3QiLCJnZXRSZWZlcmVuY2VOb2RlIiwicmVmZXJlbmNlIiwicmVmZXJlbmNlTm9kZSIsImlzSUUxMSIsIk1TSW5wdXRNZXRob2RDb250ZXh0IiwiZG9jdW1lbnRNb2RlIiwiaXNJRTEwIiwiaXNJRSIsInZlcnNpb24iLCJnZXRPZmZzZXRQYXJlbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJub09mZnNldFBhcmVudCIsIm9mZnNldFBhcmVudCIsIm5leHRFbGVtZW50U2libGluZyIsImlzT2Zmc2V0Q29udGFpbmVyIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJnZXRSb290Iiwibm9kZSIsImZpbmRDb21tb25PZmZzZXRQYXJlbnQiLCJlbGVtZW50MSIsImVsZW1lbnQyIiwib3JkZXIiLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsIk5vZGUiLCJET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkciLCJzdGFydCIsImVuZCIsInJhbmdlIiwiY3JlYXRlUmFuZ2UiLCJzZXRTdGFydCIsInNldEVuZCIsImNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIiwiY29udGFpbnMiLCJlbGVtZW50MXJvb3QiLCJnZXRTY3JvbGwiLCJzaWRlIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwidXBwZXJTaWRlIiwiaHRtbCIsInNjcm9sbGluZ0VsZW1lbnQiLCJpbmNsdWRlU2Nyb2xsIiwicmVjdCIsInN1YnRyYWN0Iiwic2Nyb2xsVG9wIiwic2Nyb2xsTGVmdCIsIm1vZGlmaWVyIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwiZ2V0Qm9yZGVyc1NpemUiLCJzdHlsZXMiLCJheGlzIiwic2lkZUEiLCJzaWRlQiIsInBhcnNlRmxvYXQiLCJnZXRTaXplIiwiY29tcHV0ZWRTdHlsZSIsIk1hdGgiLCJtYXgiLCJwYXJzZUludCIsImdldFdpbmRvd1NpemVzIiwiaGVpZ2h0Iiwid2lkdGgiLCJjbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJjcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJ0YXJnZXQiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImtleSIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsInByb3RvdHlwZSIsIm9iaiIsInZhbHVlIiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJzb3VyY2UiLCJoYXNPd25Qcm9wZXJ0eSIsImdldENsaWVudFJlY3QiLCJvZmZzZXRzIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiZSIsInJlc3VsdCIsInNpemVzIiwiY2xpZW50V2lkdGgiLCJjbGllbnRIZWlnaHQiLCJob3JpelNjcm9sbGJhciIsIm9mZnNldFdpZHRoIiwidmVydFNjcm9sbGJhciIsIm9mZnNldEhlaWdodCIsImdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZSIsImNoaWxkcmVuIiwicGFyZW50IiwiZml4ZWRQb3NpdGlvbiIsImlzSFRNTCIsImNoaWxkcmVuUmVjdCIsInBhcmVudFJlY3QiLCJzY3JvbGxQYXJlbnQiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlckxlZnRXaWR0aCIsIm1hcmdpblRvcCIsIm1hcmdpbkxlZnQiLCJnZXRWaWV3cG9ydE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJ0Yml0cmFyeU5vZGUiLCJleGNsdWRlU2Nyb2xsIiwicmVsYXRpdmVPZmZzZXQiLCJpbm5lcldpZHRoIiwiaW5uZXJIZWlnaHQiLCJvZmZzZXQiLCJpc0ZpeGVkIiwiZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudCIsInBhcmVudEVsZW1lbnQiLCJlbCIsImdldEJvdW5kYXJpZXMiLCJwb3BwZXIiLCJwYWRkaW5nIiwiYm91bmRhcmllc0VsZW1lbnQiLCJib3VuZGFyaWVzIiwiYm91bmRhcmllc05vZGUiLCJfZ2V0V2luZG93U2l6ZXMiLCJpc1BhZGRpbmdOdW1iZXIiLCJnZXRBcmVhIiwiX3JlZiIsImNvbXB1dGVBdXRvUGxhY2VtZW50IiwicGxhY2VtZW50IiwicmVmUmVjdCIsInJlY3RzIiwic29ydGVkQXJlYXMiLCJrZXlzIiwibWFwIiwiYXJlYSIsInNvcnQiLCJhIiwiYiIsImZpbHRlcmVkQXJlYXMiLCJmaWx0ZXIiLCJfcmVmMiIsImNvbXB1dGVkUGxhY2VtZW50IiwidmFyaWF0aW9uIiwic3BsaXQiLCJnZXRSZWZlcmVuY2VPZmZzZXRzIiwic3RhdGUiLCJjb21tb25PZmZzZXRQYXJlbnQiLCJnZXRPdXRlclNpemVzIiwieCIsIm1hcmdpbkJvdHRvbSIsInkiLCJtYXJnaW5SaWdodCIsImdldE9wcG9zaXRlUGxhY2VtZW50IiwiaGFzaCIsInJlcGxhY2UiLCJtYXRjaGVkIiwiZ2V0UG9wcGVyT2Zmc2V0cyIsInJlZmVyZW5jZU9mZnNldHMiLCJwb3BwZXJSZWN0IiwicG9wcGVyT2Zmc2V0cyIsImlzSG9yaXoiLCJtYWluU2lkZSIsInNlY29uZGFyeVNpZGUiLCJtZWFzdXJlbWVudCIsInNlY29uZGFyeU1lYXN1cmVtZW50IiwiZmluZCIsImFyciIsImNoZWNrIiwiQXJyYXkiLCJmaW5kSW5kZXgiLCJwcm9wIiwiY3VyIiwibWF0Y2giLCJydW5Nb2RpZmllcnMiLCJtb2RpZmllcnMiLCJkYXRhIiwiZW5kcyIsIm1vZGlmaWVyc1RvUnVuIiwic2xpY2UiLCJmb3JFYWNoIiwiY29uc29sZSIsIndhcm4iLCJlbmFibGVkIiwidXBkYXRlIiwiaXNEZXN0cm95ZWQiLCJhcnJvd1N0eWxlcyIsImF0dHJpYnV0ZXMiLCJmbGlwcGVkIiwib3B0aW9ucyIsInBvc2l0aW9uRml4ZWQiLCJmbGlwIiwib3JpZ2luYWxQbGFjZW1lbnQiLCJwb3NpdGlvbiIsImlzQ3JlYXRlZCIsIm9uQ3JlYXRlIiwib25VcGRhdGUiLCJpc01vZGlmaWVyRW5hYmxlZCIsIm1vZGlmaWVyTmFtZSIsInNvbWUiLCJuYW1lIiwiZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lIiwicHJlZml4ZXMiLCJ1cHBlclByb3AiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInByZWZpeCIsInRvQ2hlY2siLCJzdHlsZSIsImRlc3Ryb3kiLCJyZW1vdmVBdHRyaWJ1dGUiLCJ3aWxsQ2hhbmdlIiwiZGlzYWJsZUV2ZW50TGlzdGVuZXJzIiwicmVtb3ZlT25EZXN0cm95IiwicmVtb3ZlQ2hpbGQiLCJnZXRXaW5kb3ciLCJhdHRhY2hUb1Njcm9sbFBhcmVudHMiLCJldmVudCIsImNhbGxiYWNrIiwic2Nyb2xsUGFyZW50cyIsImlzQm9keSIsImFkZEV2ZW50TGlzdGVuZXIiLCJwYXNzaXZlIiwicHVzaCIsInNldHVwRXZlbnRMaXN0ZW5lcnMiLCJ1cGRhdGVCb3VuZCIsInNjcm9sbEVsZW1lbnQiLCJldmVudHNFbmFibGVkIiwiZW5hYmxlRXZlbnRMaXN0ZW5lcnMiLCJzY2hlZHVsZVVwZGF0ZSIsInJlbW92ZUV2ZW50TGlzdGVuZXJzIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwiaXNOdW1lcmljIiwibiIsImlzTmFOIiwiaXNGaW5pdGUiLCJzZXRTdHlsZXMiLCJ1bml0Iiwic2V0QXR0cmlidXRlcyIsInNldEF0dHJpYnV0ZSIsImFwcGx5U3R5bGUiLCJhcnJvd0VsZW1lbnQiLCJhcHBseVN0eWxlT25Mb2FkIiwibW9kaWZpZXJPcHRpb25zIiwiZ2V0Um91bmRlZE9mZnNldHMiLCJzaG91bGRSb3VuZCIsIl9kYXRhJG9mZnNldHMiLCJyb3VuZCIsImZsb29yIiwibm9Sb3VuZCIsInYiLCJyZWZlcmVuY2VXaWR0aCIsInBvcHBlcldpZHRoIiwiaXNWZXJ0aWNhbCIsImlzVmFyaWF0aW9uIiwic2FtZVdpZHRoUGFyaXR5IiwiYm90aE9kZFdpZHRoIiwiaG9yaXpvbnRhbFRvSW50ZWdlciIsInZlcnRpY2FsVG9JbnRlZ2VyIiwiaXNGaXJlZm94IiwiY29tcHV0ZVN0eWxlIiwibGVnYWN5R3B1QWNjZWxlcmF0aW9uT3B0aW9uIiwiZ3B1QWNjZWxlcmF0aW9uIiwib2Zmc2V0UGFyZW50UmVjdCIsImRldmljZVBpeGVsUmF0aW8iLCJwcmVmaXhlZFByb3BlcnR5IiwiaW52ZXJ0VG9wIiwiaW52ZXJ0TGVmdCIsImFycm93IiwiaXNNb2RpZmllclJlcXVpcmVkIiwicmVxdWVzdGluZ05hbWUiLCJyZXF1ZXN0ZWROYW1lIiwicmVxdWVzdGluZyIsImlzUmVxdWlyZWQiLCJfcmVxdWVzdGluZyIsInJlcXVlc3RlZCIsIl9kYXRhJG9mZnNldHMkYXJyb3ciLCJxdWVyeVNlbGVjdG9yIiwibGVuIiwic2lkZUNhcGl0YWxpemVkIiwidG9Mb3dlckNhc2UiLCJhbHRTaWRlIiwib3BTaWRlIiwiYXJyb3dFbGVtZW50U2l6ZSIsImNlbnRlciIsInBvcHBlck1hcmdpblNpZGUiLCJwb3BwZXJCb3JkZXJTaWRlIiwic2lkZVZhbHVlIiwibWluIiwiZ2V0T3Bwb3NpdGVWYXJpYXRpb24iLCJwbGFjZW1lbnRzIiwidmFsaWRQbGFjZW1lbnRzIiwiY2xvY2t3aXNlIiwiY291bnRlciIsImluZGV4IiwiY29uY2F0IiwicmV2ZXJzZSIsIkJFSEFWSU9SUyIsIkZMSVAiLCJDTE9DS1dJU0UiLCJDT1VOVEVSQ0xPQ0tXSVNFIiwicGxhY2VtZW50T3Bwb3NpdGUiLCJmbGlwT3JkZXIiLCJiZWhhdmlvciIsInN0ZXAiLCJyZWZPZmZzZXRzIiwib3ZlcmxhcHNSZWYiLCJvdmVyZmxvd3NMZWZ0Iiwib3ZlcmZsb3dzUmlnaHQiLCJvdmVyZmxvd3NUb3AiLCJvdmVyZmxvd3NCb3R0b20iLCJvdmVyZmxvd3NCb3VuZGFyaWVzIiwiZmxpcHBlZFZhcmlhdGlvbkJ5UmVmIiwiZmxpcFZhcmlhdGlvbnMiLCJmbGlwcGVkVmFyaWF0aW9uQnlDb250ZW50IiwiZmxpcFZhcmlhdGlvbnNCeUNvbnRlbnQiLCJmbGlwcGVkVmFyaWF0aW9uIiwia2VlcFRvZ2V0aGVyIiwidG9WYWx1ZSIsInN0ciIsInNpemUiLCJwYXJzZU9mZnNldCIsImJhc2VQbGFjZW1lbnQiLCJ1c2VIZWlnaHQiLCJmcmFnbWVudHMiLCJmcmFnIiwidHJpbSIsImRpdmlkZXIiLCJzZWFyY2giLCJzcGxpdFJlZ2V4Iiwib3BzIiwib3AiLCJtZXJnZVdpdGhQcmV2aW91cyIsInJlZHVjZSIsImluZGV4MiIsInByZXZlbnRPdmVyZmxvdyIsInRyYW5zZm9ybVByb3AiLCJwb3BwZXJTdHlsZXMiLCJ0cmFuc2Zvcm0iLCJwcmlvcml0eSIsInByaW1hcnkiLCJlc2NhcGVXaXRoUmVmZXJlbmNlIiwic2Vjb25kYXJ5Iiwic2hpZnQiLCJzaGlmdHZhcmlhdGlvbiIsInNoaWZ0T2Zmc2V0cyIsImhpZGUiLCJib3VuZCIsImlubmVyIiwic3VidHJhY3RMZW5ndGgiLCJvbkxvYWQiLCJEZWZhdWx0cyIsIlBvcHBlciIsIl90aGlzIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiYmluZCIsImpxdWVyeSIsInVwZGF0ZSQkMSIsImRlc3Ryb3kkJDEiLCJlbmFibGVFdmVudExpc3RlbmVycyQkMSIsImRpc2FibGVFdmVudExpc3RlbmVycyQkMSIsIlV0aWxzIiwiZ2xvYmFsIiwiUG9wcGVyVXRpbHMiXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQSxJQUFJQSxZQUFZLE9BQU9DLE1BQVAsS0FBa0IsV0FBbEIsSUFBaUMsT0FBT0MsUUFBUCxLQUFvQixXQUFyRCxJQUFvRSxPQUFPQyxTQUFQLEtBQXFCLFdBQXpHOztBQUVBLElBQUlDLGtCQUFrQixZQUFZO0FBQ2hDLE1BQUlDLHdCQUF3QixDQUFDLE1BQUQsRUFBUyxTQUFULEVBQW9CLFNBQXBCLENBQTVCO0FBQ0EsT0FBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlELHNCQUFzQkUsTUFBMUMsRUFBa0RELEtBQUssQ0FBdkQsRUFBMEQ7QUFDeEQsUUFBSU4sYUFBYUcsVUFBVUssU0FBVixDQUFvQkMsT0FBcEIsQ0FBNEJKLHNCQUFzQkMsQ0FBdEIsQ0FBNUIsS0FBeUQsQ0FBMUUsRUFBNkU7QUFDM0UsYUFBTyxDQUFQO0FBQ0Q7QUFDRjtBQUNELFNBQU8sQ0FBUDtBQUNELENBUnFCLEVBQXRCOztBQVVBLFNBQVNJLGlCQUFULENBQTJCQyxFQUEzQixFQUErQjtBQUM3QixNQUFJQyxTQUFTLEtBQWI7QUFDQSxTQUFPLFlBQVk7QUFDakIsUUFBSUEsTUFBSixFQUFZO0FBQ1Y7QUFDRDtBQUNEQSxhQUFTLElBQVQ7QUFDQVgsV0FBT1ksT0FBUCxDQUFlQyxPQUFmLEdBQXlCQyxJQUF6QixDQUE4QixZQUFZO0FBQ3hDSCxlQUFTLEtBQVQ7QUFDQUQ7QUFDRCxLQUhEO0FBSUQsR0FURDtBQVVEOztBQUVELFNBQVNLLFlBQVQsQ0FBc0JMLEVBQXRCLEVBQTBCO0FBQ3hCLE1BQUlNLFlBQVks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bS9wb3BwZXIuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiohXG4gKiBAZmlsZU92ZXJ2aWV3IEtpY2thc3MgbGlicmFyeSB0byBjcmVhdGUgYW5kIHBsYWNlIHBvcHBlcnMgbmVhciB0aGVpciByZWZlcmVuY2UgZWxlbWVudHMuXG4gKiBAdmVyc2lvbiAxLjE2LjFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgRmVkZXJpY28gWml2b2xvIGFuZCBjb250cmlidXRvcnNcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG52YXIgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJztcblxudmFyIHRpbWVvdXREdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxvbmdlclRpbWVvdXRCcm93c2VycyA9IFsnRWRnZScsICdUcmlkZW50JywgJ0ZpcmVmb3gnXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25nZXJUaW1lb3V0QnJvd3NlcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoaXNCcm93c2VyICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihsb25nZXJUaW1lb3V0QnJvd3NlcnNbaV0pID49IDApIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn0oKTtcblxuZnVuY3Rpb24gbWljcm90YXNrRGVib3VuY2UoZm4pIHtcbiAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FsbGVkID0gdHJ1ZTtcbiAgICB3aW5kb3cuUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsZWQgPSBmYWxzZTtcbiAgICAgIGZuKCk7XG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRhc2tEZWJvdW5jZShmbikge1xuICB2YXIgc2NoZWR1bGVkID0gZmFsc2U7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzY2hlZHVsZWQpIHtcbiAgICAgIHNjaGVkdWxlZCA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICAgIGZuKCk7XG4gICAgICB9LCB0aW1lb3V0RHVyYXRpb24pO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIHN1cHBvcnRzTWljcm9UYXNrcyA9IGlzQnJvd3NlciAmJiB3aW5kb3cuUHJvbWlzZTtcblxuLyoqXG4qIENyZWF0ZSBhIGRlYm91bmNlZCB2ZXJzaW9uIG9mIGEgbWV0aG9kLCB0aGF0J3MgYXN5bmNocm9ub3VzbHkgZGVmZXJyZWRcbiogYnV0IGNhbGxlZCBpbiB0aGUgbWluaW11bSB0aW1lIHBvc3NpYmxlLlxuKlxuKiBAbWV0aG9kXG4qIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiogQGFyZ3VtZW50IHtGdW5jdGlvbn0gZm5cbiogQHJldHVybnMge0Z1bmN0aW9ufVxuKi9cbnZhciBkZWJvdW5jZSA9IHN1cHBvcnRzTWljcm9UYXNrcyA/IG1pY3JvdGFza0RlYm91bmNlIDogdGFza0RlYm91bmNlO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhIGZ1bmN0aW9uXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0FueX0gZnVuY3Rpb25Ub0NoZWNrIC0gdmFyaWFibGUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtCb29sZWFufSBhbnN3ZXIgdG86IGlzIGEgZnVuY3Rpb24/XG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oZnVuY3Rpb25Ub0NoZWNrKSB7XG4gIHZhciBnZXRUeXBlID0ge307XG4gIHJldHVybiBmdW5jdGlvblRvQ2hlY2sgJiYgZ2V0VHlwZS50b1N0cmluZy5jYWxsKGZ1bmN0aW9uVG9DaGVjaykgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5cbi8qKlxuICogR2V0IENTUyBjb21wdXRlZCBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFZW1lbnR9IGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBwcm9wZXJ0eVxuICovXG5mdW5jdGlvbiBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkpIHtcbiAgaWYgKGVsZW1lbnQubm9kZVR5cGUgIT09IDEpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmVcbiAgdmFyIHdpbmRvdyA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgdmFyIGNzcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpO1xuICByZXR1cm4gcHJvcGVydHkgPyBjc3NbcHJvcGVydHldIDogY3NzO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhcmVudE5vZGUgb3IgdGhlIGhvc3Qgb2YgdGhlIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IHBhcmVudFxuICovXG5mdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIHJldHVybiBlbGVtZW50LnBhcmVudE5vZGUgfHwgZWxlbWVudC5ob3N0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHNjcm9sbGluZyBwYXJlbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IHNjcm9sbCBwYXJlbnRcbiAqL1xuZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KGVsZW1lbnQpIHtcbiAgLy8gUmV0dXJuIGJvZHksIGBnZXRTY3JvbGxgIHdpbGwgdGFrZSBjYXJlIHRvIGdldCB0aGUgY29ycmVjdCBgc2Nyb2xsVG9wYCBmcm9tIGl0XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgc3dpdGNoIChlbGVtZW50Lm5vZGVOYW1lKSB7XG4gICAgY2FzZSAnSFRNTCc6XG4gICAgY2FzZSAnQk9EWSc6XG4gICAgICByZXR1cm4gZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHk7XG4gICAgY2FzZSAnI2RvY3VtZW50JzpcbiAgICAgIHJldHVybiBlbGVtZW50LmJvZHk7XG4gIH1cblxuICAvLyBGaXJlZm94IHdhbnQgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcblxuICB2YXIgX2dldFN0eWxlQ29tcHV0ZWRQcm9wID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQpLFxuICAgICAgb3ZlcmZsb3cgPSBfZ2V0U3R5bGVDb21wdXRlZFByb3Aub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0U3R5bGVDb21wdXRlZFByb3Aub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldFN0eWxlQ29tcHV0ZWRQcm9wLm92ZXJmbG93WTtcblxuICBpZiAoLyhhdXRvfHNjcm9sbHxvdmVybGF5KS8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCkpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVmZXJlbmNlIG5vZGUgb2YgdGhlIHJlZmVyZW5jZSBvYmplY3QsIG9yIHRoZSByZWZlcmVuY2Ugb2JqZWN0IGl0c2VsZi5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IHJlZmVyZW5jZSAtIHRoZSByZWZlcmVuY2UgZWxlbWVudCAodGhlIHBvcHBlciB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXMpXG4gKiBAcmV0dXJucyB7RWxlbWVudH0gcGFyZW50XG4gKi9cbmZ1bmN0aW9uIGdldFJlZmVyZW5jZU5vZGUocmVmZXJlbmNlKSB7XG4gIHJldHVybiByZWZlcmVuY2UgJiYgcmVmZXJlbmNlLnJlZmVyZW5jZU5vZGUgPyByZWZlcmVuY2UucmVmZXJlbmNlTm9kZSA6IHJlZmVyZW5jZTtcbn1cblxudmFyIGlzSUUxMSA9IGlzQnJvd3NlciAmJiAhISh3aW5kb3cuTVNJbnB1dE1ldGhvZENvbnRleHQgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlKTtcbnZhciBpc0lFMTAgPSBpc0Jyb3dzZXIgJiYgL01TSUUgMTAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgYnJvd3NlciBpcyBJbnRlcm5ldCBFeHBsb3JlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtOdW1iZXJ9IHZlcnNpb24gdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtCb29sZWFufSBpc0lFXG4gKi9cbmZ1bmN0aW9uIGlzSUUodmVyc2lvbikge1xuICBpZiAodmVyc2lvbiA9PT0gMTEpIHtcbiAgICByZXR1cm4gaXNJRTExO1xuICB9XG4gIGlmICh2ZXJzaW9uID09PSAxMCkge1xuICAgIHJldHVybiBpc0lFMTA7XG4gIH1cbiAgcmV0dXJuIGlzSUUxMSB8fCBpc0lFMTA7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb2Zmc2V0IHBhcmVudCBvZiB0aGUgZ2l2ZW4gZWxlbWVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7RWxlbWVudH0gb2Zmc2V0IHBhcmVudFxuICovXG5mdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG5cbiAgdmFyIG5vT2Zmc2V0UGFyZW50ID0gaXNJRSgxMCkgPyBkb2N1bWVudC5ib2R5IDogbnVsbDtcblxuICAvLyBOT1RFOiAxIERPTSBhY2Nlc3MgaGVyZVxuICB2YXIgb2Zmc2V0UGFyZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQgfHwgbnVsbDtcbiAgLy8gU2tpcCBoaWRkZW4gZWxlbWVudHMgd2hpY2ggZG9uJ3QgaGF2ZSBhbiBvZmZzZXRQYXJlbnRcbiAgd2hpbGUgKG9mZnNldFBhcmVudCA9PT0gbm9PZmZzZXRQYXJlbnQgJiYgZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpIHtcbiAgICBvZmZzZXRQYXJlbnQgPSAoZWxlbWVudCA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKS5vZmZzZXRQYXJlbnQ7XG4gIH1cblxuICB2YXIgbm9kZU5hbWUgPSBvZmZzZXRQYXJlbnQgJiYgb2Zmc2V0UGFyZW50Lm5vZGVOYW1lO1xuXG4gIGlmICghbm9kZU5hbWUgfHwgbm9kZU5hbWUgPT09ICdCT0RZJyB8fCBub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG5cbiAgLy8gLm9mZnNldFBhcmVudCB3aWxsIHJldHVybiB0aGUgY2xvc2VzdCBUSCwgVEQgb3IgVEFCTEUgaW4gY2FzZVxuICAvLyBubyBvZmZzZXRQYXJlbnQgaXMgcHJlc2VudCwgSSBoYXRlIHRoaXMgam9iLi4uXG4gIGlmIChbJ1RIJywgJ1REJywgJ1RBQkxFJ10uaW5kZXhPZihvZmZzZXRQYXJlbnQubm9kZU5hbWUpICE9PSAtMSAmJiBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkob2Zmc2V0UGFyZW50LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycpIHtcbiAgICByZXR1cm4gZ2V0T2Zmc2V0UGFyZW50KG9mZnNldFBhcmVudCk7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UGFyZW50O1xufVxuXG5mdW5jdGlvbiBpc09mZnNldENvbnRhaW5lcihlbGVtZW50KSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnQk9EWScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIG5vZGVOYW1lID09PSAnSFRNTCcgfHwgZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpID09PSBlbGVtZW50O1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSByb290IG5vZGUgKGRvY3VtZW50LCBzaGFkb3dET00gcm9vdCkgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gbm9kZVxuICogQHJldHVybnMge0VsZW1lbnR9IHJvb3Qgbm9kZVxuICovXG5mdW5jdGlvbiBnZXRSb290KG5vZGUpIHtcbiAgaWYgKG5vZGUucGFyZW50Tm9kZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBnZXRSb290KG5vZGUucGFyZW50Tm9kZSk7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgb2Zmc2V0IHBhcmVudCBjb21tb24gdG8gdGhlIHR3byBwcm92aWRlZCBub2Rlc1xuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50MVxuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50MlxuICogQHJldHVybnMge0VsZW1lbnR9IGNvbW1vbiBvZmZzZXQgcGFyZW50XG4gKi9cbmZ1bmN0aW9uIGZpbmRDb21tb25PZmZzZXRQYXJlbnQoZWxlbWVudDEsIGVsZW1lbnQyKSB7XG4gIC8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIHRvIGF2b2lkIGVycm9ycyBpbiBjYXNlIG9uZSBvZiB0aGUgZWxlbWVudHMgaXNuJ3QgZGVmaW5lZCBmb3IgYW55IHJlYXNvblxuICBpZiAoIWVsZW1lbnQxIHx8ICFlbGVtZW50MS5ub2RlVHlwZSB8fCAhZWxlbWVudDIgfHwgIWVsZW1lbnQyLm5vZGVUeXBlKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxuXG4gIC8vIEhlcmUgd2UgbWFrZSBzdXJlIHRvIGdpdmUgYXMgXCJzdGFydFwiIHRoZSBlbGVtZW50IHRoYXQgY29tZXMgZmlyc3QgaW4gdGhlIERPTVxuICB2YXIgb3JkZXIgPSBlbGVtZW50MS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlbGVtZW50MikgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORztcbiAgdmFyIHN0YXJ0ID0gb3JkZXIgPyBlbGVtZW50MSA6IGVsZW1lbnQyO1xuICB2YXIgZW5kID0gb3JkZXIgPyBlbGVtZW50MiA6IGVsZW1lbnQxO1xuXG4gIC8vIEdldCBjb21tb24gYW5jZXN0b3IgY29udGFpbmVyXG4gIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gIHJhbmdlLnNldFN0YXJ0KHN0YXJ0LCAwKTtcbiAgcmFuZ2Uuc2V0RW5kKGVuZCwgMCk7XG4gIHZhciBjb21tb25BbmNlc3RvckNvbnRhaW5lciA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gIC8vIEJvdGggbm9kZXMgYXJlIGluc2lkZSAjZG9jdW1lbnRcblxuICBpZiAoZWxlbWVudDEgIT09IGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyICYmIGVsZW1lbnQyICE9PSBjb21tb25BbmNlc3RvckNvbnRhaW5lciB8fCBzdGFydC5jb250YWlucyhlbmQpKSB7XG4gICAgaWYgKGlzT2Zmc2V0Q29udGFpbmVyKGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKSkge1xuICAgICAgcmV0dXJuIGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRPZmZzZXRQYXJlbnQoY29tbW9uQW5jZXN0b3JDb250YWluZXIpO1xuICB9XG5cbiAgLy8gb25lIG9mIHRoZSBub2RlcyBpcyBpbnNpZGUgc2hhZG93RE9NLCBmaW5kIHdoaWNoIG9uZVxuICB2YXIgZWxlbWVudDFyb290ID0gZ2V0Um9vdChlbGVtZW50MSk7XG4gIGlmIChlbGVtZW50MXJvb3QuaG9zdCkge1xuICAgIHJldHVybiBmaW5kQ29tbW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQxcm9vdC5ob3N0LCBlbGVtZW50Mik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZpbmRDb21tb25PZmZzZXRQYXJlbnQoZWxlbWVudDEsIGdldFJvb3QoZWxlbWVudDIpLmhvc3QpO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc2Nyb2xsIHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50IGluIHRoZSBnaXZlbiBzaWRlICh0b3AgYW5kIGxlZnQpXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBzaWRlIGB0b3BgIG9yIGBsZWZ0YFxuICogQHJldHVybnMge251bWJlcn0gYW1vdW50IG9mIHNjcm9sbGVkIHBpeGVsc1xuICovXG5mdW5jdGlvbiBnZXRTY3JvbGwoZWxlbWVudCkge1xuICB2YXIgc2lkZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJ3RvcCc7XG5cbiAgdmFyIHVwcGVyU2lkZSA9IHNpZGUgPT09ICd0b3AnID8gJ3Njcm9sbFRvcCcgOiAnc2Nyb2xsTGVmdCc7XG4gIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnQk9EWScgfHwgbm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgIHZhciBodG1sID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB2YXIgc2Nyb2xsaW5nRWxlbWVudCA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50IHx8IGh0bWw7XG4gICAgcmV0dXJuIHNjcm9sbGluZ0VsZW1lbnRbdXBwZXJTaWRlXTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50W3VwcGVyU2lkZV07XG59XG5cbi8qXG4gKiBTdW0gb3Igc3VidHJhY3QgdGhlIGVsZW1lbnQgc2Nyb2xsIHZhbHVlcyAobGVmdCBhbmQgdG9wKSBmcm9tIGEgZ2l2ZW4gcmVjdCBvYmplY3RcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWN0IC0gUmVjdCBvYmplY3QgeW91IHdhbnQgdG8gY2hhbmdlXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZnJvbSB0aGUgZnVuY3Rpb24gcmVhZHMgdGhlIHNjcm9sbCB2YWx1ZXNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc3VidHJhY3QgLSBzZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBzdWJ0cmFjdCB0aGUgc2Nyb2xsIHZhbHVlc1xuICogQHJldHVybiB7T2JqZWN0fSByZWN0IC0gVGhlIG1vZGlmaWVyIHJlY3Qgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGluY2x1ZGVTY3JvbGwocmVjdCwgZWxlbWVudCkge1xuICB2YXIgc3VidHJhY3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuXG4gIHZhciBzY3JvbGxUb3AgPSBnZXRTY3JvbGwoZWxlbWVudCwgJ3RvcCcpO1xuICB2YXIgc2Nyb2xsTGVmdCA9IGdldFNjcm9sbChlbGVtZW50LCAnbGVmdCcpO1xuICB2YXIgbW9kaWZpZXIgPSBzdWJ0cmFjdCA/IC0xIDogMTtcbiAgcmVjdC50b3AgKz0gc2Nyb2xsVG9wICogbW9kaWZpZXI7XG4gIHJlY3QuYm90dG9tICs9IHNjcm9sbFRvcCAqIG1vZGlmaWVyO1xuICByZWN0LmxlZnQgKz0gc2Nyb2xsTGVmdCAqIG1vZGlmaWVyO1xuICByZWN0LnJpZ2h0ICs9IHNjcm9sbExlZnQgKiBtb2RpZmllcjtcbiAgcmV0dXJuIHJlY3Q7XG59XG5cbi8qXG4gKiBIZWxwZXIgdG8gZGV0ZWN0IGJvcmRlcnMgb2YgYSBnaXZlbiBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0NTU1N0eWxlRGVjbGFyYXRpb259IHN0eWxlc1xuICogUmVzdWx0IG9mIGBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHlgIG9uIHRoZSBnaXZlbiBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gYXhpcyAtIGB4YCBvciBgeWBcbiAqIEByZXR1cm4ge251bWJlcn0gYm9yZGVycyAtIFRoZSBib3JkZXJzIHNpemUgb2YgdGhlIGdpdmVuIGF4aXNcbiAqL1xuXG5mdW5jdGlvbiBnZXRCb3JkZXJzU2l6ZShzdHlsZXMsIGF4aXMpIHtcbiAgdmFyIHNpZGVBID0gYXhpcyA9PT0gJ3gnID8gJ0xlZnQnIDogJ1RvcCc7XG4gIHZhciBzaWRlQiA9IHNpZGVBID09PSAnTGVmdCcgPyAnUmlnaHQnIDogJ0JvdHRvbSc7XG5cbiAgcmV0dXJuIHBhcnNlRmxvYXQoc3R5bGVzWydib3JkZXInICsgc2lkZUEgKyAnV2lkdGgnXSkgKyBwYXJzZUZsb2F0KHN0eWxlc1snYm9yZGVyJyArIHNpZGVCICsgJ1dpZHRoJ10pO1xufVxuXG5mdW5jdGlvbiBnZXRTaXplKGF4aXMsIGJvZHksIGh0bWwsIGNvbXB1dGVkU3R5bGUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KGJvZHlbJ29mZnNldCcgKyBheGlzXSwgYm9keVsnc2Nyb2xsJyArIGF4aXNdLCBodG1sWydjbGllbnQnICsgYXhpc10sIGh0bWxbJ29mZnNldCcgKyBheGlzXSwgaHRtbFsnc2Nyb2xsJyArIGF4aXNdLCBpc0lFKDEwKSA/IHBhcnNlSW50KGh0bWxbJ29mZnNldCcgKyBheGlzXSkgKyBwYXJzZUludChjb21wdXRlZFN0eWxlWydtYXJnaW4nICsgKGF4aXMgPT09ICdIZWlnaHQnID8gJ1RvcCcgOiAnTGVmdCcpXSkgKyBwYXJzZUludChjb21wdXRlZFN0eWxlWydtYXJnaW4nICsgKGF4aXMgPT09ICdIZWlnaHQnID8gJ0JvdHRvbScgOiAnUmlnaHQnKV0pIDogMCk7XG59XG5cbmZ1bmN0aW9uIGdldFdpbmRvd1NpemVzKGRvY3VtZW50KSB7XG4gIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcbiAgdmFyIGh0bWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIHZhciBjb21wdXRlZFN0eWxlID0gaXNJRSgxMCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShodG1sKTtcblxuICByZXR1cm4ge1xuICAgIGhlaWdodDogZ2V0U2l6ZSgnSGVpZ2h0JywgYm9keSwgaHRtbCwgY29tcHV0ZWRTdHlsZSksXG4gICAgd2lkdGg6IGdldFNpemUoJ1dpZHRoJywgYm9keSwgaHRtbCwgY29tcHV0ZWRTdHlsZSlcbiAgfTtcbn1cblxudmFyIGNsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cbnZhciBjcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTtcblxuXG5cblxuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG4vKipcbiAqIEdpdmVuIGVsZW1lbnQgb2Zmc2V0cywgZ2VuZXJhdGUgYW4gb3V0cHV0IHNpbWlsYXIgdG8gZ2V0Qm91bmRpbmdDbGllbnRSZWN0XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge09iamVjdH0gb2Zmc2V0c1xuICogQHJldHVybnMge09iamVjdH0gQ2xpZW50UmVjdCBsaWtlIG91dHB1dFxuICovXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0KG9mZnNldHMpIHtcbiAgcmV0dXJuIF9leHRlbmRzKHt9LCBvZmZzZXRzLCB7XG4gICAgcmlnaHQ6IG9mZnNldHMubGVmdCArIG9mZnNldHMud2lkdGgsXG4gICAgYm90dG9tOiBvZmZzZXRzLnRvcCArIG9mZnNldHMuaGVpZ2h0XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBib3VuZGluZyBjbGllbnQgcmVjdCBvZiBnaXZlbiBlbGVtZW50XG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJuIHtPYmplY3R9IGNsaWVudCByZWN0XG4gKi9cbmZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciByZWN0ID0ge307XG5cbiAgLy8gSUUxMCAxMCBGSVg6IFBsZWFzZSwgZG9uJ3QgYXNrLCB0aGUgZWxlbWVudCBpc24ndFxuICAvLyBjb25zaWRlcmVkIGluIERPTSBpbiBzb21lIGNpcmN1bXN0YW5jZXMuLi5cbiAgLy8gVGhpcyBpc24ndCByZXByb2R1Y2libGUgaW4gSUUxMCBjb21wYXRpYmlsaXR5IG1vZGUgb2YgSUUxMVxuICB0cnkge1xuICAgIGlmIChpc0lFKDEwKSkge1xuICAgICAgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB2YXIgc2Nyb2xsVG9wID0gZ2V0U2Nyb2xsKGVsZW1lbnQsICd0b3AnKTtcbiAgICAgIHZhciBzY3JvbGxMZWZ0ID0gZ2V0U2Nyb2xsKGVsZW1lbnQsICdsZWZ0Jyk7XG4gICAgICByZWN0LnRvcCArPSBzY3JvbGxUb3A7XG4gICAgICByZWN0LmxlZnQgKz0gc2Nyb2xsTGVmdDtcbiAgICAgIHJlY3QuYm90dG9tICs9IHNjcm9sbFRvcDtcbiAgICAgIHJlY3QucmlnaHQgKz0gc2Nyb2xsTGVmdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByZXN1bHQgPSB7XG4gICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgIHRvcDogcmVjdC50b3AsXG4gICAgd2lkdGg6IHJlY3QucmlnaHQgLSByZWN0LmxlZnQsXG4gICAgaGVpZ2h0OiByZWN0LmJvdHRvbSAtIHJlY3QudG9wXG4gIH07XG5cbiAgLy8gc3VidHJhY3Qgc2Nyb2xsYmFyIHNpemUgZnJvbSBzaXplc1xuICB2YXIgc2l6ZXMgPSBlbGVtZW50Lm5vZGVOYW1lID09PSAnSFRNTCcgPyBnZXRXaW5kb3dTaXplcyhlbGVtZW50Lm93bmVyRG9jdW1lbnQpIDoge307XG4gIHZhciB3aWR0aCA9IHNpemVzLndpZHRoIHx8IGVsZW1lbnQuY2xpZW50V2lkdGggfHwgcmVzdWx0LndpZHRoO1xuICB2YXIgaGVpZ2h0ID0gc2l6ZXMuaGVpZ2h0IHx8IGVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IHJlc3VsdC5oZWlnaHQ7XG5cbiAgdmFyIGhvcml6U2Nyb2xsYmFyID0gZWxlbWVudC5vZmZzZXRXaWR0aCAtIHdpZHRoO1xuICB2YXIgdmVydFNjcm9sbGJhciA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gaGVpZ2h0O1xuXG4gIC8vIGlmIGFuIGh5cG90aGV0aWNhbCBzY3JvbGxiYXIgaXMgZGV0ZWN0ZWQsIHdlIG11c3QgYmUgc3VyZSBpdCdzIG5vdCBhIGBib3JkZXJgXG4gIC8vIHdlIG1ha2UgdGhpcyBjaGVjayBjb25kaXRpb25hbCBmb3IgcGVyZm9ybWFuY2UgcmVhc29uc1xuICBpZiAoaG9yaXpTY3JvbGxiYXIgfHwgdmVydFNjcm9sbGJhcikge1xuICAgIHZhciBzdHlsZXMgPSBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZWxlbWVudCk7XG4gICAgaG9yaXpTY3JvbGxiYXIgLT0gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzLCAneCcpO1xuICAgIHZlcnRTY3JvbGxiYXIgLT0gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzLCAneScpO1xuXG4gICAgcmVzdWx0LndpZHRoIC09IGhvcml6U2Nyb2xsYmFyO1xuICAgIHJlc3VsdC5oZWlnaHQgLT0gdmVydFNjcm9sbGJhcjtcbiAgfVxuXG4gIHJldHVybiBnZXRDbGllbnRSZWN0KHJlc3VsdCk7XG59XG5cbmZ1bmN0aW9uIGdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZShjaGlsZHJlbiwgcGFyZW50KSB7XG4gIHZhciBmaXhlZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcblxuICB2YXIgaXNJRTEwID0gaXNJRSgxMCk7XG4gIHZhciBpc0hUTUwgPSBwYXJlbnQubm9kZU5hbWUgPT09ICdIVE1MJztcbiAgdmFyIGNoaWxkcmVuUmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChjaGlsZHJlbik7XG4gIHZhciBwYXJlbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHBhcmVudCk7XG4gIHZhciBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoY2hpbGRyZW4pO1xuXG4gIHZhciBzdHlsZXMgPSBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkocGFyZW50KTtcbiAgdmFyIGJvcmRlclRvcFdpZHRoID0gcGFyc2VGbG9hdChzdHlsZXMuYm9yZGVyVG9wV2lkdGgpO1xuICB2YXIgYm9yZGVyTGVmdFdpZHRoID0gcGFyc2VGbG9hdChzdHlsZXMuYm9yZGVyTGVmdFdpZHRoKTtcblxuICAvLyBJbiBjYXNlcyB3aGVyZSB0aGUgcGFyZW50IGlzIGZpeGVkLCB3ZSBtdXN0IGlnbm9yZSBuZWdhdGl2ZSBzY3JvbGwgaW4gb2Zmc2V0IGNhbGNcbiAgaWYgKGZpeGVkUG9zaXRpb24gJiYgaXNIVE1MKSB7XG4gICAgcGFyZW50UmVjdC50b3AgPSBNYXRoLm1heChwYXJlbnRSZWN0LnRvcCwgMCk7XG4gICAgcGFyZW50UmVjdC5sZWZ0ID0gTWF0aC5tYXgocGFyZW50UmVjdC5sZWZ0LCAwKTtcbiAgfVxuICB2YXIgb2Zmc2V0cyA9IGdldENsaWVudFJlY3Qoe1xuICAgIHRvcDogY2hpbGRyZW5SZWN0LnRvcCAtIHBhcmVudFJlY3QudG9wIC0gYm9yZGVyVG9wV2lkdGgsXG4gICAgbGVmdDogY2hpbGRyZW5SZWN0LmxlZnQgLSBwYXJlbnRSZWN0LmxlZnQgLSBib3JkZXJMZWZ0V2lkdGgsXG4gICAgd2lkdGg6IGNoaWxkcmVuUmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IGNoaWxkcmVuUmVjdC5oZWlnaHRcbiAgfSk7XG4gIG9mZnNldHMubWFyZ2luVG9wID0gMDtcbiAgb2Zmc2V0cy5tYXJnaW5MZWZ0ID0gMDtcblxuICAvLyBTdWJ0cmFjdCBtYXJnaW5zIG9mIGRvY3VtZW50RWxlbWVudCBpbiBjYXNlIGl0J3MgYmVpbmcgdXNlZCBhcyBwYXJlbnRcbiAgLy8gd2UgZG8gdGhpcyBvbmx5IG9uIEhUTUwgYmVjYXVzZSBpdCdzIHRoZSBvbmx5IGVsZW1lbnQgdGhhdCBiZWhhdmVzXG4gIC8vIGRpZmZlcmVudGx5IHdoZW4gbWFyZ2lucyBhcmUgYXBwbGllZCB0byBpdC4gVGhlIG1hcmdpbnMgYXJlIGluY2x1ZGVkIGluXG4gIC8vIHRoZSBib3ggb2YgdGhlIGRvY3VtZW50RWxlbWVudCwgaW4gdGhlIG90aGVyIGNhc2VzIG5vdC5cbiAgaWYgKCFpc0lFMTAgJiYgaXNIVE1MKSB7XG4gICAgdmFyIG1hcmdpblRvcCA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpblRvcCk7XG4gICAgdmFyIG1hcmdpbkxlZnQgPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5MZWZ0KTtcblxuICAgIG9mZnNldHMudG9wIC09IGJvcmRlclRvcFdpZHRoIC0gbWFyZ2luVG9wO1xuICAgIG9mZnNldHMuYm90dG9tIC09IGJvcmRlclRvcFdpZHRoIC0gbWFyZ2luVG9wO1xuICAgIG9mZnNldHMubGVmdCAtPSBib3JkZXJMZWZ0V2lkdGggLSBtYXJnaW5MZWZ0O1xuICAgIG9mZnNldHMucmlnaHQgLT0gYm9yZGVyTGVmdFdpZHRoIC0gbWFyZ2luTGVmdDtcblxuICAgIC8vIEF0dGFjaCBtYXJnaW5Ub3AgYW5kIG1hcmdpbkxlZnQgYmVjYXVzZSBpbiBzb21lIGNpcmN1bXN0YW5jZXMgd2UgbWF5IG5lZWQgdGhlbVxuICAgIG9mZnNldHMubWFyZ2luVG9wID0gbWFyZ2luVG9wO1xuICAgIG9mZnNldHMubWFyZ2luTGVmdCA9IG1hcmdpbkxlZnQ7XG4gIH1cblxuICBpZiAoaXNJRTEwICYmICFmaXhlZFBvc2l0aW9uID8gcGFyZW50LmNvbnRhaW5zKHNjcm9sbFBhcmVudCkgOiBwYXJlbnQgPT09IHNjcm9sbFBhcmVudCAmJiBzY3JvbGxQYXJlbnQubm9kZU5hbWUgIT09ICdCT0RZJykge1xuICAgIG9mZnNldHMgPSBpbmNsdWRlU2Nyb2xsKG9mZnNldHMsIHBhcmVudCk7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0cztcbn1cblxuZnVuY3Rpb24gZ2V0Vmlld3BvcnRPZmZzZXRSZWN0UmVsYXRpdmVUb0FydGJpdHJhcnlOb2RlKGVsZW1lbnQpIHtcbiAgdmFyIGV4Y2x1ZGVTY3JvbGwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIHZhciBodG1sID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgdmFyIHJlbGF0aXZlT2Zmc2V0ID0gZ2V0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcmJpdHJhcnlOb2RlKGVsZW1lbnQsIGh0bWwpO1xuICB2YXIgd2lkdGggPSBNYXRoLm1heChodG1sLmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcbiAgdmFyIGhlaWdodCA9IE1hdGgubWF4KGh0bWwuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XG5cbiAgdmFyIHNjcm9sbFRvcCA9ICFleGNsdWRlU2Nyb2xsID8gZ2V0U2Nyb2xsKGh0bWwpIDogMDtcbiAgdmFyIHNjcm9sbExlZnQgPSAhZXhjbHVkZVNjcm9sbCA/IGdldFNjcm9sbChodG1sLCAnbGVmdCcpIDogMDtcblxuICB2YXIgb2Zmc2V0ID0ge1xuICAgIHRvcDogc2Nyb2xsVG9wIC0gcmVsYXRpdmVPZmZzZXQudG9wICsgcmVsYXRpdmVPZmZzZXQubWFyZ2luVG9wLFxuICAgIGxlZnQ6IHNjcm9sbExlZnQgLSByZWxhdGl2ZU9mZnNldC5sZWZ0ICsgcmVsYXRpdmVPZmZzZXQubWFyZ2luTGVmdCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcblxuICByZXR1cm4gZ2V0Q2xpZW50UmVjdChvZmZzZXQpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIGZpeGVkIG9yIGlzIGluc2lkZSBhIGZpeGVkIHBhcmVudFxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50XG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGN1c3RvbUNvbnRhaW5lclxuICogQHJldHVybnMge0Jvb2xlYW59IGFuc3dlciB0byBcImlzRml4ZWQ/XCJcbiAqL1xuZnVuY3Rpb24gaXNGaXhlZChlbGVtZW50KSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7XG4gIGlmIChub2RlTmFtZSA9PT0gJ0JPRFknIHx8IG5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShlbGVtZW50LCAncG9zaXRpb24nKSA9PT0gJ2ZpeGVkJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBwYXJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcbiAgaWYgKCFwYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBpc0ZpeGVkKHBhcmVudE5vZGUpO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBmaXJzdCBwYXJlbnQgb2YgYW4gZWxlbWVudCB0aGF0IGhhcyBhIHRyYW5zZm9ybWVkIHByb3BlcnR5IGRlZmluZWRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0VsZW1lbnR9IGZpcnN0IHRyYW5zZm9ybWVkIHBhcmVudCBvciBkb2N1bWVudEVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBnZXRGaXhlZFBvc2l0aW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgLy8gVGhpcyBjaGVjayBpcyBuZWVkZWQgdG8gYXZvaWQgZXJyb3JzIGluIGNhc2Ugb25lIG9mIHRoZSBlbGVtZW50cyBpc24ndCBkZWZpbmVkIGZvciBhbnkgcmVhc29uXG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5wYXJlbnRFbGVtZW50IHx8IGlzSUUoKSkge1xuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cbiAgdmFyIGVsID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAoZWwgJiYgZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsLCAndHJhbnNmb3JtJykgPT09ICdub25lJykge1xuICAgIGVsID0gZWwucGFyZW50RWxlbWVudDtcbiAgfVxuICByZXR1cm4gZWwgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xufVxuXG4vKipcbiAqIENvbXB1dGVkIHRoZSBib3VuZGFyaWVzIGxpbWl0cyBhbmQgcmV0dXJuIHRoZW1cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBvcHBlclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcmVmZXJlbmNlXG4gKiBAcGFyYW0ge251bWJlcn0gcGFkZGluZ1xuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gYm91bmRhcmllc0VsZW1lbnQgLSBFbGVtZW50IHVzZWQgdG8gZGVmaW5lIHRoZSBib3VuZGFyaWVzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGZpeGVkUG9zaXRpb24gLSBJcyBpbiBmaXhlZCBwb3NpdGlvbiBtb2RlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBDb29yZGluYXRlcyBvZiB0aGUgYm91bmRhcmllc1xuICovXG5mdW5jdGlvbiBnZXRCb3VuZGFyaWVzKHBvcHBlciwgcmVmZXJlbmNlLCBwYWRkaW5nLCBib3VuZGFyaWVzRWxlbWVudCkge1xuICB2YXIgZml4ZWRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogZmFsc2U7XG5cbiAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmVcblxuICB2YXIgYm91bmRhcmllcyA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XG4gIHZhciBvZmZzZXRQYXJlbnQgPSBmaXhlZFBvc2l0aW9uID8gZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudChwb3BwZXIpIDogZmluZENvbW1vbk9mZnNldFBhcmVudChwb3BwZXIsIGdldFJlZmVyZW5jZU5vZGUocmVmZXJlbmNlKSk7XG5cbiAgLy8gSGFuZGxlIHZpZXdwb3J0IGNhc2VcbiAgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAndmlld3BvcnQnKSB7XG4gICAgYm91bmRhcmllcyA9IGdldFZpZXdwb3J0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcnRiaXRyYXJ5Tm9kZShvZmZzZXRQYXJlbnQsIGZpeGVkUG9zaXRpb24pO1xuICB9IGVsc2Uge1xuICAgIC8vIEhhbmRsZSBvdGhlciBjYXNlcyBiYXNlZCBvbiBET00gZWxlbWVudCB1c2VkIGFzIGJvdW5kYXJpZXNcbiAgICB2YXIgYm91bmRhcmllc05vZGUgPSB2b2lkIDA7XG4gICAgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAnc2Nyb2xsUGFyZW50Jykge1xuICAgICAgYm91bmRhcmllc05vZGUgPSBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShyZWZlcmVuY2UpKTtcbiAgICAgIGlmIChib3VuZGFyaWVzTm9kZS5ub2RlTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgICAgIGJvdW5kYXJpZXNOb2RlID0gcG9wcGVyLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYm91bmRhcmllc0VsZW1lbnQgPT09ICd3aW5kb3cnKSB7XG4gICAgICBib3VuZGFyaWVzTm9kZSA9IHBvcHBlci5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgYm91bmRhcmllc05vZGUgPSBib3VuZGFyaWVzRWxlbWVudDtcbiAgICB9XG5cbiAgICB2YXIgb2Zmc2V0cyA9IGdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZShib3VuZGFyaWVzTm9kZSwgb2Zmc2V0UGFyZW50LCBmaXhlZFBvc2l0aW9uKTtcblxuICAgIC8vIEluIGNhc2Ugb2YgSFRNTCwgd2UgbmVlZCBhIGRpZmZlcmVudCBjb21wdXRhdGlvblxuICAgIGlmIChib3VuZGFyaWVzTm9kZS5ub2RlTmFtZSA9PT0gJ0hUTUwnICYmICFpc0ZpeGVkKG9mZnNldFBhcmVudCkpIHtcbiAgICAgIHZhciBfZ2V0V2luZG93U2l6ZXMgPSBnZXRXaW5kb3dTaXplcyhwb3BwZXIub3duZXJEb2N1bWVudCksXG4gICAgICAgICAgaGVpZ2h0ID0gX2dldFdpbmRvd1NpemVzLmhlaWdodCxcbiAgICAgICAgICB3aWR0aCA9IF9nZXRXaW5kb3dTaXplcy53aWR0aDtcblxuICAgICAgYm91bmRhcmllcy50b3AgKz0gb2Zmc2V0cy50b3AgLSBvZmZzZXRzLm1hcmdpblRvcDtcbiAgICAgIGJvdW5kYXJpZXMuYm90dG9tID0gaGVpZ2h0ICsgb2Zmc2V0cy50b3A7XG4gICAgICBib3VuZGFyaWVzLmxlZnQgKz0gb2Zmc2V0cy5sZWZ0IC0gb2Zmc2V0cy5tYXJnaW5MZWZ0O1xuICAgICAgYm91bmRhcmllcy5yaWdodCA9IHdpZHRoICsgb2Zmc2V0cy5sZWZ0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmb3IgYWxsIHRoZSBvdGhlciBET00gZWxlbWVudHMsIHRoaXMgb25lIGlzIGdvb2RcbiAgICAgIGJvdW5kYXJpZXMgPSBvZmZzZXRzO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBwYWRkaW5nc1xuICBwYWRkaW5nID0gcGFkZGluZyB8fCAwO1xuICB2YXIgaXNQYWRkaW5nTnVtYmVyID0gdHlwZW9mIHBhZGRpbmcgPT09ICdudW1iZXInO1xuICBib3VuZGFyaWVzLmxlZnQgKz0gaXNQYWRkaW5nTnVtYmVyID8gcGFkZGluZyA6IHBhZGRpbmcubGVmdCB8fCAwO1xuICBib3VuZGFyaWVzLnRvcCArPSBpc1BhZGRpbmdOdW1iZXIgPyBwYWRkaW5nIDogcGFkZGluZy50b3AgfHwgMDtcbiAgYm91bmRhcmllcy5yaWdodCAtPSBpc1BhZGRpbmdOdW1iZXIgPyBwYWRkaW5nIDogcGFkZGluZy5yaWdodCB8fCAwO1xuICBib3VuZGFyaWVzLmJvdHRvbSAtPSBpc1BhZGRpbmdOdW1iZXIgPyBwYWRkaW5nIDogcGFkZGluZy5ib3R0b20gfHwgMDtcblxuICByZXR1cm4gYm91bmRhcmllcztcbn1cblxuZnVuY3Rpb24gZ2V0QXJlYShfcmVmKSB7XG4gIHZhciB3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICBoZWlnaHQgPSBfcmVmLmhlaWdodDtcblxuICByZXR1cm4gd2lkdGggKiBoZWlnaHQ7XG59XG5cbi8qKlxuICogVXRpbGl0eSB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgYGF1dG9gIHBsYWNlbWVudCB0byB0aGUgcGxhY2VtZW50IHdpdGggbW9yZVxuICogYXZhaWxhYmxlIHNwYWNlLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUF1dG9QbGFjZW1lbnQocGxhY2VtZW50LCByZWZSZWN0LCBwb3BwZXIsIHJlZmVyZW5jZSwgYm91bmRhcmllc0VsZW1lbnQpIHtcbiAgdmFyIHBhZGRpbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IDA7XG5cbiAgaWYgKHBsYWNlbWVudC5pbmRleE9mKCdhdXRvJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIHBsYWNlbWVudDtcbiAgfVxuXG4gIHZhciBib3VuZGFyaWVzID0gZ2V0Qm91bmRhcmllcyhwb3BwZXIsIHJlZmVyZW5jZSwgcGFkZGluZywgYm91bmRhcmllc0VsZW1lbnQpO1xuXG4gIHZhciByZWN0cyA9IHtcbiAgICB0b3A6IHtcbiAgICAgIHdpZHRoOiBib3VuZGFyaWVzLndpZHRoLFxuICAgICAgaGVpZ2h0OiByZWZSZWN0LnRvcCAtIGJvdW5kYXJpZXMudG9wXG4gICAgfSxcbiAgICByaWdodDoge1xuICAgICAgd2lkdGg6IGJvdW5kYXJpZXMucmlnaHQgLSByZWZSZWN0LnJpZ2h0LFxuICAgICAgaGVpZ2h0OiBib3VuZGFyaWVzLmhlaWdodFxuICAgIH0sXG4gICAgYm90dG9tOiB7XG4gICAgICB3aWR0aDogYm91bmRhcmllcy53aWR0aCxcbiAgICAgIGhlaWdodDogYm91bmRhcmllcy5ib3R0b20gLSByZWZSZWN0LmJvdHRvbVxuICAgIH0sXG4gICAgbGVmdDoge1xuICAgICAgd2lkdGg6IHJlZlJlY3QubGVmdCAtIGJvdW5kYXJpZXMubGVmdCxcbiAgICAgIGhlaWdodDogYm91bmRhcmllcy5oZWlnaHRcbiAgICB9XG4gIH07XG5cbiAgdmFyIHNvcnRlZEFyZWFzID0gT2JqZWN0LmtleXMocmVjdHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleToga2V5XG4gICAgfSwgcmVjdHNba2V5XSwge1xuICAgICAgYXJlYTogZ2V0QXJlYShyZWN0c1trZXldKVxuICAgIH0pO1xuICB9KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIuYXJlYSAtIGEuYXJlYTtcbiAgfSk7XG5cbiAgdmFyIGZpbHRlcmVkQXJlYXMgPSBzb3J0ZWRBcmVhcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgdmFyIHdpZHRoID0gX3JlZjIud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9yZWYyLmhlaWdodDtcbiAgICByZXR1cm4gd2lkdGggPj0gcG9wcGVyLmNsaWVudFdpZHRoICYmIGhlaWdodCA+PSBwb3BwZXIuY2xpZW50SGVpZ2h0O1xuICB9KTtcblxuICB2YXIgY29tcHV0ZWRQbGFjZW1lbnQgPSBmaWx0ZXJlZEFyZWFzLmxlbmd0aCA+IDAgPyBmaWx0ZXJlZEFyZWFzWzBdLmtleSA6IHNvcnRlZEFyZWFzWzBdLmtleTtcblxuICB2YXIgdmFyaWF0aW9uID0gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG5cbiAgcmV0dXJuIGNvbXB1dGVkUGxhY2VtZW50ICsgKHZhcmlhdGlvbiA/ICctJyArIHZhcmlhdGlvbiA6ICcnKTtcbn1cblxuLyoqXG4gKiBHZXQgb2Zmc2V0cyB0byB0aGUgcmVmZXJlbmNlIGVsZW1lbnRcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtFbGVtZW50fSBwb3BwZXIgLSB0aGUgcG9wcGVyIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gcmVmZXJlbmNlIC0gdGhlIHJlZmVyZW5jZSBlbGVtZW50ICh0aGUgcG9wcGVyIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhpcylcbiAqIEBwYXJhbSB7RWxlbWVudH0gZml4ZWRQb3NpdGlvbiAtIGlzIGluIGZpeGVkIHBvc2l0aW9uIG1vZGVcbiAqIEByZXR1cm5zIHtPYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBvZmZzZXRzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyXG4gKi9cbmZ1bmN0aW9uIGdldFJlZmVyZW5jZU9mZnNldHMoc3RhdGUsIHBvcHBlciwgcmVmZXJlbmNlKSB7XG4gIHZhciBmaXhlZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBudWxsO1xuXG4gIHZhciBjb21tb25PZmZzZXRQYXJlbnQgPSBmaXhlZFBvc2l0aW9uID8gZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudChwb3BwZXIpIDogZmluZENvbW1vbk9mZnNldFBhcmVudChwb3BwZXIsIGdldFJlZmVyZW5jZU5vZGUocmVmZXJlbmNlKSk7XG4gIHJldHVybiBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUocmVmZXJlbmNlLCBjb21tb25PZmZzZXRQYXJlbnQsIGZpeGVkUG9zaXRpb24pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgb3V0ZXIgc2l6ZXMgb2YgdGhlIGdpdmVuIGVsZW1lbnQgKG9mZnNldCBzaXplICsgbWFyZ2lucylcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IGNvbnRhaW5pbmcgd2lkdGggYW5kIGhlaWdodCBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGdldE91dGVyU2l6ZXMoZWxlbWVudCkge1xuICB2YXIgd2luZG93ID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gIHZhciB4ID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luVG9wIHx8IDApICsgcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luQm90dG9tIHx8IDApO1xuICB2YXIgeSA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpbkxlZnQgfHwgMCkgKyBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5SaWdodCB8fCAwKTtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICB3aWR0aDogZWxlbWVudC5vZmZzZXRXaWR0aCArIHksXG4gICAgaGVpZ2h0OiBlbGVtZW50Lm9mZnNldEhlaWdodCArIHhcbiAgfTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG9wcG9zaXRlIHBsYWNlbWVudCBvZiB0aGUgZ2l2ZW4gb25lXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gcGxhY2VtZW50XG4gKiBAcmV0dXJucyB7U3RyaW5nfSBmbGlwcGVkIHBsYWNlbWVudFxuICovXG5mdW5jdGlvbiBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgdmFyIGhhc2ggPSB7IGxlZnQ6ICdyaWdodCcsIHJpZ2h0OiAnbGVmdCcsIGJvdHRvbTogJ3RvcCcsIHRvcDogJ2JvdHRvbScgfTtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IG9mZnNldHMgdG8gdGhlIHBvcHBlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHtPYmplY3R9IHBvc2l0aW9uIC0gQ1NTIHBvc2l0aW9uIHRoZSBQb3BwZXIgd2lsbCBnZXQgYXBwbGllZFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcG9wcGVyIC0gdGhlIHBvcHBlciBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gcmVmZXJlbmNlT2Zmc2V0cyAtIHRoZSByZWZlcmVuY2Ugb2Zmc2V0cyAodGhlIHBvcHBlciB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXMpXG4gKiBAcGFyYW0ge1N0cmluZ30gcGxhY2VtZW50IC0gb25lIG9mIHRoZSB2YWxpZCBwbGFjZW1lbnQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gcG9wcGVyT2Zmc2V0cyAtIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBvZmZzZXRzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyXG4gKi9cbmZ1bmN0aW9uIGdldFBvcHBlck9mZnNldHMocG9wcGVyLCByZWZlcmVuY2VPZmZzZXRzLCBwbGFjZW1lbnQpIHtcbiAgcGxhY2VtZW50ID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG5cbiAgLy8gR2V0IHBvcHBlciBub2RlIHNpemVzXG4gIHZhciBwb3BwZXJSZWN0ID0gZ2V0T3V0ZXJTaXplcyhwb3BwZXIpO1xuXG4gIC8vIEFkZCBwb3NpdGlvbiwgd2lkdGggYW5kIGhlaWdodCB0byBvdXIgb2Zmc2V0cyBvYmplY3RcbiAgdmFyIHBvcHBlck9mZnNldHMgPSB7XG4gICAgd2lkdGg6IHBvcHBlclJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiBwb3BwZXJSZWN0LmhlaWdodFxuICB9O1xuXG4gIC8vIGRlcGVuZGluZyBieSB0aGUgcG9wcGVyIHBsYWNlbWVudCB3ZSBoYXZlIHRvIGNvbXB1dGUgaXRzIG9mZnNldHMgc2xpZ2h0bHkgZGlmZmVyZW50bHlcbiAgdmFyIGlzSG9yaXogPSBbJ3JpZ2h0JywgJ2xlZnQnXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xO1xuICB2YXIgbWFpblNpZGUgPSBpc0hvcml6ID8gJ3RvcCcgOiAnbGVmdCc7XG4gIHZhciBzZWNvbmRhcnlTaWRlID0gaXNIb3JpeiA/ICdsZWZ0JyA6ICd0b3AnO1xuICB2YXIgbWVhc3VyZW1lbnQgPSBpc0hvcml6ID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICB2YXIgc2Vjb25kYXJ5TWVhc3VyZW1lbnQgPSAhaXNIb3JpeiA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICBwb3BwZXJPZmZzZXRzW21haW5TaWRlXSA9IHJlZmVyZW5jZU9mZnNldHNbbWFpblNpZGVdICsgcmVmZXJlbmNlT2Zmc2V0c1ttZWFzdXJlbWVudF0gLyAyIC0gcG9wcGVyUmVjdFttZWFzdXJlbWVudF0gLyAyO1xuICBpZiAocGxhY2VtZW50ID09PSBzZWNvbmRhcnlTaWRlKSB7XG4gICAgcG9wcGVyT2Zmc2V0c1tzZWNvbmRhcnlTaWRlXSA9IHJlZmVyZW5jZU9mZnNldHNbc2Vjb25kYXJ5U2lkZV0gLSBwb3BwZXJSZWN0W3NlY29uZGFyeU1lYXN1cmVtZW50XTtcbiAgfSBlbHNlIHtcbiAgICBwb3BwZXJPZmZzZXRzW3NlY29uZGFyeVNpZGVdID0gcmVmZXJlbmNlT2Zmc2V0c1tnZXRPcHBvc2l0ZVBsYWNlbWVudChzZWNvbmRhcnlTaWRlKV07XG4gIH1cblxuICByZXR1cm4gcG9wcGVyT2Zmc2V0cztcbn1cblxuLyoqXG4gKiBNaW1pY3MgdGhlIGBmaW5kYCBtZXRob2Qgb2YgQXJyYXlcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7QXJyYXl9IGFyclxuICogQGFyZ3VtZW50IHByb3BcbiAqIEBhcmd1bWVudCB2YWx1ZVxuICogQHJldHVybnMgaW5kZXggb3IgLTFcbiAqL1xuZnVuY3Rpb24gZmluZChhcnIsIGNoZWNrKSB7XG4gIC8vIHVzZSBuYXRpdmUgZmluZCBpZiBzdXBwb3J0ZWRcbiAgaWYgKEFycmF5LnByb3RvdHlwZS5maW5kKSB7XG4gICAgcmV0dXJuIGFyci5maW5kKGNoZWNrKTtcbiAgfVxuXG4gIC8vIHVzZSBgZmlsdGVyYCB0byBvYnRhaW4gdGhlIHNhbWUgYmVoYXZpb3Igb2YgYGZpbmRgXG4gIHJldHVybiBhcnIuZmlsdGVyKGNoZWNrKVswXTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBtYXRjaGluZyBvYmplY3RcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7QXJyYXl9IGFyclxuICogQGFyZ3VtZW50IHByb3BcbiAqIEBhcmd1bWVudCB2YWx1ZVxuICogQHJldHVybnMgaW5kZXggb3IgLTFcbiAqL1xuZnVuY3Rpb24gZmluZEluZGV4KGFyciwgcHJvcCwgdmFsdWUpIHtcbiAgLy8gdXNlIG5hdGl2ZSBmaW5kSW5kZXggaWYgc3VwcG9ydGVkXG4gIGlmIChBcnJheS5wcm90b3R5cGUuZmluZEluZGV4KSB7XG4gICAgcmV0dXJuIGFyci5maW5kSW5kZXgoZnVuY3Rpb24gKGN1cikge1xuICAgICAgcmV0dXJuIGN1cltwcm9wXSA9PT0gdmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICAvLyB1c2UgYGZpbmRgICsgYGluZGV4T2ZgIGlmIGBmaW5kSW5kZXhgIGlzbid0IHN1cHBvcnRlZFxuICB2YXIgbWF0Y2ggPSBmaW5kKGFyciwgZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmpbcHJvcF0gPT09IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIGFyci5pbmRleE9mKG1hdGNoKTtcbn1cblxuLyoqXG4gKiBMb29wIHRyb3VnaCB0aGUgbGlzdCBvZiBtb2RpZmllcnMgYW5kIHJ1biB0aGVtIGluIG9yZGVyLFxuICogZWFjaCBvZiB0aGVtIHdpbGwgdGhlbiBlZGl0IHRoZSBkYXRhIG9iamVjdC5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7ZGF0YU9iamVjdH0gZGF0YVxuICogQHBhcmFtIHtBcnJheX0gbW9kaWZpZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gZW5kcyAtIE9wdGlvbmFsIG1vZGlmaWVyIG5hbWUgdXNlZCBhcyBzdG9wcGVyXG4gKiBAcmV0dXJucyB7ZGF0YU9iamVjdH1cbiAqL1xuZnVuY3Rpb24gcnVuTW9kaWZpZXJzKG1vZGlmaWVycywgZGF0YSwgZW5kcykge1xuICB2YXIgbW9kaWZpZXJzVG9SdW4gPSBlbmRzID09PSB1bmRlZmluZWQgPyBtb2RpZmllcnMgOiBtb2RpZmllcnMuc2xpY2UoMCwgZmluZEluZGV4KG1vZGlmaWVycywgJ25hbWUnLCBlbmRzKSk7XG5cbiAgbW9kaWZpZXJzVG9SdW4uZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBpZiAobW9kaWZpZXJbJ2Z1bmN0aW9uJ10pIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZG90LW5vdGF0aW9uXG4gICAgICBjb25zb2xlLndhcm4oJ2Btb2RpZmllci5mdW5jdGlvbmAgaXMgZGVwcmVjYXRlZCwgdXNlIGBtb2RpZmllci5mbmAhJyk7XG4gICAgfVxuICAgIHZhciBmbiA9IG1vZGlmaWVyWydmdW5jdGlvbiddIHx8IG1vZGlmaWVyLmZuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRvdC1ub3RhdGlvblxuICAgIGlmIChtb2RpZmllci5lbmFibGVkICYmIGlzRnVuY3Rpb24oZm4pKSB7XG4gICAgICAvLyBBZGQgcHJvcGVydGllcyB0byBvZmZzZXRzIHRvIG1ha2UgdGhlbSBhIGNvbXBsZXRlIGNsaWVudFJlY3Qgb2JqZWN0XG4gICAgICAvLyB3ZSBkbyB0aGlzIGJlZm9yZSBlYWNoIG1vZGlmaWVyIHRvIG1ha2Ugc3VyZSB0aGUgcHJldmlvdXMgb25lIGRvZXNuJ3RcbiAgICAgIC8vIG1lc3Mgd2l0aCB0aGVzZSB2YWx1ZXNcbiAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBnZXRDbGllbnRSZWN0KGRhdGEub2Zmc2V0cy5wb3BwZXIpO1xuICAgICAgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSA9IGdldENsaWVudFJlY3QoZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSk7XG5cbiAgICAgIGRhdGEgPSBmbihkYXRhLCBtb2RpZmllcik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgcG9wcGVyLCBjb21wdXRpbmcgdGhlIG5ldyBvZmZzZXRzIGFuZCBhcHBseWluZ1xuICogdGhlIG5ldyBzdHlsZS48YnIgLz5cbiAqIFByZWZlciBgc2NoZWR1bGVVcGRhdGVgIG92ZXIgYHVwZGF0ZWAgYmVjYXVzZSBvZiBwZXJmb3JtYW5jZSByZWFzb25zLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG5mdW5jdGlvbiB1cGRhdGUoKSB7XG4gIC8vIGlmIHBvcHBlciBpcyBkZXN0cm95ZWQsIGRvbid0IHBlcmZvcm0gYW55IGZ1cnRoZXIgdXBkYXRlXG4gIGlmICh0aGlzLnN0YXRlLmlzRGVzdHJveWVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGRhdGEgPSB7XG4gICAgaW5zdGFuY2U6IHRoaXMsXG4gICAgc3R5bGVzOiB7fSxcbiAgICBhcnJvd1N0eWxlczoge30sXG4gICAgYXR0cmlidXRlczoge30sXG4gICAgZmxpcHBlZDogZmFsc2UsXG4gICAgb2Zmc2V0czoge31cbiAgfTtcblxuICAvLyBjb21wdXRlIHJlZmVyZW5jZSBlbGVtZW50IG9mZnNldHNcbiAgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSA9IGdldFJlZmVyZW5jZU9mZnNldHModGhpcy5zdGF0ZSwgdGhpcy5wb3BwZXIsIHRoaXMucmVmZXJlbmNlLCB0aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZCk7XG5cbiAgLy8gY29tcHV0ZSBhdXRvIHBsYWNlbWVudCwgc3RvcmUgcGxhY2VtZW50IGluc2lkZSB0aGUgZGF0YSBvYmplY3QsXG4gIC8vIG1vZGlmaWVycyB3aWxsIGJlIGFibGUgdG8gZWRpdCBgcGxhY2VtZW50YCBpZiBuZWVkZWRcbiAgLy8gYW5kIHJlZmVyIHRvIG9yaWdpbmFsUGxhY2VtZW50IHRvIGtub3cgdGhlIG9yaWdpbmFsIHZhbHVlXG4gIGRhdGEucGxhY2VtZW50ID0gY29tcHV0ZUF1dG9QbGFjZW1lbnQodGhpcy5vcHRpb25zLnBsYWNlbWVudCwgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSwgdGhpcy5wb3BwZXIsIHRoaXMucmVmZXJlbmNlLCB0aGlzLm9wdGlvbnMubW9kaWZpZXJzLmZsaXAuYm91bmRhcmllc0VsZW1lbnQsIHRoaXMub3B0aW9ucy5tb2RpZmllcnMuZmxpcC5wYWRkaW5nKTtcblxuICAvLyBzdG9yZSB0aGUgY29tcHV0ZWQgcGxhY2VtZW50IGluc2lkZSBgb3JpZ2luYWxQbGFjZW1lbnRgXG4gIGRhdGEub3JpZ2luYWxQbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudDtcblxuICBkYXRhLnBvc2l0aW9uRml4ZWQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZDtcblxuICAvLyBjb21wdXRlIHRoZSBwb3BwZXIgb2Zmc2V0c1xuICBkYXRhLm9mZnNldHMucG9wcGVyID0gZ2V0UG9wcGVyT2Zmc2V0cyh0aGlzLnBvcHBlciwgZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSwgZGF0YS5wbGFjZW1lbnQpO1xuXG4gIGRhdGEub2Zmc2V0cy5wb3BwZXIucG9zaXRpb24gPSB0aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZCA/ICdmaXhlZCcgOiAnYWJzb2x1dGUnO1xuXG4gIC8vIHJ1biB0aGUgbW9kaWZpZXJzXG4gIGRhdGEgPSBydW5Nb2RpZmllcnModGhpcy5tb2RpZmllcnMsIGRhdGEpO1xuXG4gIC8vIHRoZSBmaXJzdCBgdXBkYXRlYCB3aWxsIGNhbGwgYG9uQ3JlYXRlYCBjYWxsYmFja1xuICAvLyB0aGUgb3RoZXIgb25lcyB3aWxsIGNhbGwgYG9uVXBkYXRlYCBjYWxsYmFja1xuICBpZiAoIXRoaXMuc3RhdGUuaXNDcmVhdGVkKSB7XG4gICAgdGhpcy5zdGF0ZS5pc0NyZWF0ZWQgPSB0cnVlO1xuICAgIHRoaXMub3B0aW9ucy5vbkNyZWF0ZShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm9wdGlvbnMub25VcGRhdGUoZGF0YSk7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdXNlZCB0byBrbm93IGlmIHRoZSBnaXZlbiBtb2RpZmllciBpcyBlbmFibGVkLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTW9kaWZpZXJFbmFibGVkKG1vZGlmaWVycywgbW9kaWZpZXJOYW1lKSB7XG4gIHJldHVybiBtb2RpZmllcnMuc29tZShmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgICBlbmFibGVkID0gX3JlZi5lbmFibGVkO1xuICAgIHJldHVybiBlbmFibGVkICYmIG5hbWUgPT09IG1vZGlmaWVyTmFtZTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcmVmaXhlZCBzdXBwb3J0ZWQgcHJvcGVydHkgbmFtZVxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQGFyZ3VtZW50IHtTdHJpbmd9IHByb3BlcnR5IChjYW1lbENhc2UpXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBwcmVmaXhlZCBwcm9wZXJ0eSAoY2FtZWxDYXNlIG9yIFBhc2NhbENhc2UsIGRlcGVuZGluZyBvbiB0aGUgdmVuZG9yIHByZWZpeClcbiAqL1xuZnVuY3Rpb24gZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lKHByb3BlcnR5KSB7XG4gIHZhciBwcmVmaXhlcyA9IFtmYWxzZSwgJ21zJywgJ1dlYmtpdCcsICdNb3onLCAnTyddO1xuICB2YXIgdXBwZXJQcm9wID0gcHJvcGVydHkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zbGljZSgxKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHByZWZpeCA9IHByZWZpeGVzW2ldO1xuICAgIHZhciB0b0NoZWNrID0gcHJlZml4ID8gJycgKyBwcmVmaXggKyB1cHBlclByb3AgOiBwcm9wZXJ0eTtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50LmJvZHkuc3R5bGVbdG9DaGVja10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdG9DaGVjaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogRGVzdHJveXMgdGhlIHBvcHBlci5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xuZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgdGhpcy5zdGF0ZS5pc0Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgLy8gdG91Y2ggRE9NIG9ubHkgaWYgYGFwcGx5U3R5bGVgIG1vZGlmaWVyIGlzIGVuYWJsZWRcbiAgaWYgKGlzTW9kaWZpZXJFbmFibGVkKHRoaXMubW9kaWZpZXJzLCAnYXBwbHlTdHlsZScpKSB7XG4gICAgdGhpcy5wb3BwZXIucmVtb3ZlQXR0cmlidXRlKCd4LXBsYWNlbWVudCcpO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlLnBvc2l0aW9uID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUudG9wID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUubGVmdCA9ICcnO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlLnJpZ2h0ID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUuYm90dG9tID0gJyc7XG4gICAgdGhpcy5wb3BwZXIuc3R5bGUud2lsbENoYW5nZSA9ICcnO1xuICAgIHRoaXMucG9wcGVyLnN0eWxlW2dldFN1cHBvcnRlZFByb3BlcnR5TmFtZSgndHJhbnNmb3JtJyldID0gJyc7XG4gIH1cblxuICB0aGlzLmRpc2FibGVFdmVudExpc3RlbmVycygpO1xuXG4gIC8vIHJlbW92ZSB0aGUgcG9wcGVyIGlmIHVzZXIgZXhwbGljaXRseSBhc2tlZCBmb3IgdGhlIGRlbGV0aW9uIG9uIGRlc3Ryb3lcbiAgLy8gZG8gbm90IHVzZSBgcmVtb3ZlYCBiZWNhdXNlIElFMTEgZG9lc24ndCBzdXBwb3J0IGl0XG4gIGlmICh0aGlzLm9wdGlvbnMucmVtb3ZlT25EZXN0cm95KSB7XG4gICAgdGhpcy5wb3BwZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBvcHBlcik7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogR2V0IHRoZSB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50XG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtXaW5kb3d9XG4gKi9cbmZ1bmN0aW9uIGdldFdpbmRvdyhlbGVtZW50KSB7XG4gIHZhciBvd25lckRvY3VtZW50ID0gZWxlbWVudC5vd25lckRvY3VtZW50O1xuICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgOiB3aW5kb3c7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFRvU2Nyb2xsUGFyZW50cyhzY3JvbGxQYXJlbnQsIGV2ZW50LCBjYWxsYmFjaywgc2Nyb2xsUGFyZW50cykge1xuICB2YXIgaXNCb2R5ID0gc2Nyb2xsUGFyZW50Lm5vZGVOYW1lID09PSAnQk9EWSc7XG4gIHZhciB0YXJnZXQgPSBpc0JvZHkgPyBzY3JvbGxQYXJlbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyA6IHNjcm9sbFBhcmVudDtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGNhbGxiYWNrLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cbiAgaWYgKCFpc0JvZHkpIHtcbiAgICBhdHRhY2hUb1Njcm9sbFBhcmVudHMoZ2V0U2Nyb2xsUGFyZW50KHRhcmdldC5wYXJlbnROb2RlKSwgZXZlbnQsIGNhbGxiYWNrLCBzY3JvbGxQYXJlbnRzKTtcbiAgfVxuICBzY3JvbGxQYXJlbnRzLnB1c2godGFyZ2V0KTtcbn1cblxuLyoqXG4gKiBTZXR1cCBuZWVkZWQgZXZlbnQgbGlzdGVuZXJzIHVzZWQgdG8gdXBkYXRlIHRoZSBwb3BwZXIgcG9zaXRpb25cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNldHVwRXZlbnRMaXN0ZW5lcnMocmVmZXJlbmNlLCBvcHRpb25zLCBzdGF0ZSwgdXBkYXRlQm91bmQpIHtcbiAgLy8gUmVzaXplIGV2ZW50IGxpc3RlbmVyIG9uIHdpbmRvd1xuICBzdGF0ZS51cGRhdGVCb3VuZCA9IHVwZGF0ZUJvdW5kO1xuICBnZXRXaW5kb3cocmVmZXJlbmNlKS5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBzdGF0ZS51cGRhdGVCb3VuZCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gIC8vIFNjcm9sbCBldmVudCBsaXN0ZW5lciBvbiBzY3JvbGwgcGFyZW50c1xuICB2YXIgc2Nyb2xsRWxlbWVudCA9IGdldFNjcm9sbFBhcmVudChyZWZlcmVuY2UpO1xuICBhdHRhY2hUb1Njcm9sbFBhcmVudHMoc2Nyb2xsRWxlbWVudCwgJ3Njcm9sbCcsIHN0YXRlLnVwZGF0ZUJvdW5kLCBzdGF0ZS5zY3JvbGxQYXJlbnRzKTtcbiAgc3RhdGUuc2Nyb2xsRWxlbWVudCA9IHNjcm9sbEVsZW1lbnQ7XG4gIHN0YXRlLmV2ZW50c0VuYWJsZWQgPSB0cnVlO1xuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuLyoqXG4gKiBJdCB3aWxsIGFkZCByZXNpemUvc2Nyb2xsIGV2ZW50cyBhbmQgc3RhcnQgcmVjYWxjdWxhdGluZ1xuICogcG9zaXRpb24gb2YgdGhlIHBvcHBlciBlbGVtZW50IHdoZW4gdGhleSBhcmUgdHJpZ2dlcmVkLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG5mdW5jdGlvbiBlbmFibGVFdmVudExpc3RlbmVycygpIHtcbiAgaWYgKCF0aGlzLnN0YXRlLmV2ZW50c0VuYWJsZWQpIHtcbiAgICB0aGlzLnN0YXRlID0gc2V0dXBFdmVudExpc3RlbmVycyh0aGlzLnJlZmVyZW5jZSwgdGhpcy5vcHRpb25zLCB0aGlzLnN0YXRlLCB0aGlzLnNjaGVkdWxlVXBkYXRlKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXNlZCB0byB1cGRhdGUgdGhlIHBvcHBlciBwb3NpdGlvblxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcnMocmVmZXJlbmNlLCBzdGF0ZSkge1xuICAvLyBSZW1vdmUgcmVzaXplIGV2ZW50IGxpc3RlbmVyIG9uIHdpbmRvd1xuICBnZXRXaW5kb3cocmVmZXJlbmNlKS5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBzdGF0ZS51cGRhdGVCb3VuZCk7XG5cbiAgLy8gUmVtb3ZlIHNjcm9sbCBldmVudCBsaXN0ZW5lciBvbiBzY3JvbGwgcGFyZW50c1xuICBzdGF0ZS5zY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzdGF0ZS51cGRhdGVCb3VuZCk7XG4gIH0pO1xuXG4gIC8vIFJlc2V0IHN0YXRlXG4gIHN0YXRlLnVwZGF0ZUJvdW5kID0gbnVsbDtcbiAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IFtdO1xuICBzdGF0ZS5zY3JvbGxFbGVtZW50ID0gbnVsbDtcbiAgc3RhdGUuZXZlbnRzRW5hYmxlZCA9IGZhbHNlO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogSXQgd2lsbCByZW1vdmUgcmVzaXplL3Njcm9sbCBldmVudHMgYW5kIHdvbid0IHJlY2FsY3VsYXRlIHBvcHBlciBwb3NpdGlvblxuICogd2hlbiB0aGV5IGFyZSB0cmlnZ2VyZWQuIEl0IGFsc28gd29uJ3QgdHJpZ2dlciBgb25VcGRhdGVgIGNhbGxiYWNrIGFueW1vcmUsXG4gKiB1bmxlc3MgeW91IGNhbGwgYHVwZGF0ZWAgbWV0aG9kIG1hbnVhbGx5LlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlclxuICovXG5mdW5jdGlvbiBkaXNhYmxlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gIGlmICh0aGlzLnN0YXRlLmV2ZW50c0VuYWJsZWQpIHtcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjaGVkdWxlVXBkYXRlKTtcbiAgICB0aGlzLnN0YXRlID0gcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5yZWZlcmVuY2UsIHRoaXMuc3RhdGUpO1xuICB9XG59XG5cbi8qKlxuICogVGVsbHMgaWYgYSBnaXZlbiBpbnB1dCBpcyBhIG51bWJlclxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5VdGlsc1xuICogQHBhcmFtIHsqfSBpbnB1dCB0byBjaGVja1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOdW1lcmljKG4pIHtcbiAgcmV0dXJuIG4gIT09ICcnICYmICFpc05hTihwYXJzZUZsb2F0KG4pKSAmJiBpc0Zpbml0ZShuKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHN0eWxlIHRvIHRoZSBnaXZlbiBwb3BwZXJcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gYXBwbHkgdGhlIHN0eWxlIHRvXG4gKiBAYXJndW1lbnQge09iamVjdH0gc3R5bGVzXG4gKiBPYmplY3Qgd2l0aCBhIGxpc3Qgb2YgcHJvcGVydGllcyBhbmQgdmFsdWVzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudFxuICovXG5mdW5jdGlvbiBzZXRTdHlsZXMoZWxlbWVudCwgc3R5bGVzKSB7XG4gIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgIHZhciB1bml0ID0gJyc7XG4gICAgLy8gYWRkIHVuaXQgaWYgdGhlIHZhbHVlIGlzIG51bWVyaWMgYW5kIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nXG4gICAgaWYgKFsnd2lkdGgnLCAnaGVpZ2h0JywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLmluZGV4T2YocHJvcCkgIT09IC0xICYmIGlzTnVtZXJpYyhzdHlsZXNbcHJvcF0pKSB7XG4gICAgICB1bml0ID0gJ3B4JztcbiAgICB9XG4gICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IHN0eWxlc1twcm9wXSArIHVuaXQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIFNldCB0aGUgYXR0cmlidXRlcyB0byB0aGUgZ2l2ZW4gcG9wcGVyXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFwcGx5IHRoZSBhdHRyaWJ1dGVzIHRvXG4gKiBAYXJndW1lbnQge09iamVjdH0gc3R5bGVzXG4gKiBPYmplY3Qgd2l0aCBhIGxpc3Qgb2YgcHJvcGVydGllcyBhbmQgdmFsdWVzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudFxuICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIGF0dHJpYnV0ZXMpIHtcbiAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbcHJvcF07XG4gICAgaWYgKHZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUocHJvcCwgYXR0cmlidXRlc1twcm9wXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHByb3ApO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YS5zdHlsZXMgLSBMaXN0IG9mIHN0eWxlIHByb3BlcnRpZXMgLSB2YWx1ZXMgdG8gYXBwbHkgdG8gcG9wcGVyIGVsZW1lbnRcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhLmF0dHJpYnV0ZXMgLSBMaXN0IG9mIGF0dHJpYnV0ZSBwcm9wZXJ0aWVzIC0gdmFsdWVzIHRvIGFwcGx5IHRvIHBvcHBlciBlbGVtZW50XG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgc2FtZSBkYXRhIG9iamVjdFxuICovXG5mdW5jdGlvbiBhcHBseVN0eWxlKGRhdGEpIHtcbiAgLy8gYW55IHByb3BlcnR5IHByZXNlbnQgaW4gYGRhdGEuc3R5bGVzYCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlcixcbiAgLy8gaW4gdGhpcyB3YXkgd2UgY2FuIG1ha2UgdGhlIDNyZCBwYXJ0eSBtb2RpZmllcnMgYWRkIGN1c3RvbSBzdHlsZXMgdG8gaXRcbiAgLy8gQmUgYXdhcmUsIG1vZGlmaWVycyBjb3VsZCBvdmVycmlkZSB0aGUgcHJvcGVydGllcyBkZWZpbmVkIGluIHRoZSBwcmV2aW91c1xuICAvLyBsaW5lcyBvZiB0aGlzIG1vZGlmaWVyIVxuICBzZXRTdHlsZXMoZGF0YS5pbnN0YW5jZS5wb3BwZXIsIGRhdGEuc3R5bGVzKTtcblxuICAvLyBhbnkgcHJvcGVydHkgcHJlc2VudCBpbiBgZGF0YS5hdHRyaWJ1dGVzYCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlcixcbiAgLy8gdGhleSB3aWxsIGJlIHNldCBhcyBIVE1MIGF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnRcbiAgc2V0QXR0cmlidXRlcyhkYXRhLmluc3RhbmNlLnBvcHBlciwgZGF0YS5hdHRyaWJ1dGVzKTtcblxuICAvLyBpZiBhcnJvd0VsZW1lbnQgaXMgZGVmaW5lZCBhbmQgYXJyb3dTdHlsZXMgaGFzIHNvbWUgcHJvcGVydGllc1xuICBpZiAoZGF0YS5hcnJvd0VsZW1lbnQgJiYgT2JqZWN0LmtleXMoZGF0YS5hcnJvd1N0eWxlcykubGVuZ3RoKSB7XG4gICAgc2V0U3R5bGVzKGRhdGEuYXJyb3dFbGVtZW50LCBkYXRhLmFycm93U3R5bGVzKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIFNldCB0aGUgeC1wbGFjZW1lbnQgYXR0cmlidXRlIGJlZm9yZSBldmVyeXRoaW5nIGVsc2UgYmVjYXVzZSBpdCBjb3VsZCBiZSB1c2VkXG4gKiB0byBhZGQgbWFyZ2lucyB0byB0aGUgcG9wcGVyIG1hcmdpbnMgbmVlZHMgdG8gYmUgY2FsY3VsYXRlZCB0byBnZXQgdGhlXG4gKiBjb3JyZWN0IHBvcHBlciBvZmZzZXRzLlxuICogQG1ldGhvZFxuICogQG1lbWJlcm9mIFBvcHBlci5tb2RpZmllcnNcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlZmVyZW5jZSAtIFRoZSByZWZlcmVuY2UgZWxlbWVudCB1c2VkIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBvcHBlciAtIFRoZSBIVE1MIGVsZW1lbnQgdXNlZCBhcyBwb3BwZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gUG9wcGVyLmpzIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gYXBwbHlTdHlsZU9uTG9hZChyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucywgbW9kaWZpZXJPcHRpb25zLCBzdGF0ZSkge1xuICAvLyBjb21wdXRlIHJlZmVyZW5jZSBlbGVtZW50IG9mZnNldHNcbiAgdmFyIHJlZmVyZW5jZU9mZnNldHMgPSBnZXRSZWZlcmVuY2VPZmZzZXRzKHN0YXRlLCBwb3BwZXIsIHJlZmVyZW5jZSwgb3B0aW9ucy5wb3NpdGlvbkZpeGVkKTtcblxuICAvLyBjb21wdXRlIGF1dG8gcGxhY2VtZW50LCBzdG9yZSBwbGFjZW1lbnQgaW5zaWRlIHRoZSBkYXRhIG9iamVjdCxcbiAgLy8gbW9kaWZpZXJzIHdpbGwgYmUgYWJsZSB0byBlZGl0IGBwbGFjZW1lbnRgIGlmIG5lZWRlZFxuICAvLyBhbmQgcmVmZXIgdG8gb3JpZ2luYWxQbGFjZW1lbnQgdG8ga25vdyB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgdmFyIHBsYWNlbWVudCA9IGNvbXB1dGVBdXRvUGxhY2VtZW50KG9wdGlvbnMucGxhY2VtZW50LCByZWZlcmVuY2VPZmZzZXRzLCBwb3BwZXIsIHJlZmVyZW5jZSwgb3B0aW9ucy5tb2RpZmllcnMuZmxpcC5ib3VuZGFyaWVzRWxlbWVudCwgb3B0aW9ucy5tb2RpZmllcnMuZmxpcC5wYWRkaW5nKTtcblxuICBwb3BwZXIuc2V0QXR0cmlidXRlKCd4LXBsYWNlbWVudCcsIHBsYWNlbWVudCk7XG5cbiAgLy8gQXBwbHkgYHBvc2l0aW9uYCB0byBwb3BwZXIgYmVmb3JlIGFueXRoaW5nIGVsc2UgYmVjYXVzZVxuICAvLyB3aXRob3V0IHRoZSBwb3NpdGlvbiBhcHBsaWVkIHdlIGNhbid0IGd1YXJhbnRlZSBjb3JyZWN0IGNvbXB1dGF0aW9uc1xuICBzZXRTdHlsZXMocG9wcGVyLCB7IHBvc2l0aW9uOiBvcHRpb25zLnBvc2l0aW9uRml4ZWQgPyAnZml4ZWQnIDogJ2Fic29sdXRlJyB9KTtcblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7Qm9vbGVhbn0gc2hvdWxkUm91bmQgLSBJZiB0aGUgb2Zmc2V0cyBzaG91bGQgYmUgcm91bmRlZCBhdCBhbGxcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBwb3BwZXIncyBwb3NpdGlvbiBvZmZzZXRzIHJvdW5kZWRcbiAqXG4gKiBUaGUgdGFsZSBvZiBwaXhlbC1wZXJmZWN0IHBvc2l0aW9uaW5nLiBJdCdzIHN0aWxsIG5vdCAxMDAlIHBlcmZlY3QsIGJ1dCBhc1xuICogZ29vZCBhcyBpdCBjYW4gYmUgd2l0aGluIHJlYXNvbi5cbiAqIERpc2N1c3Npb24gaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL0ZlelZyYXN0YS9wb3BwZXIuanMvcHVsbC83MTVcbiAqXG4gKiBMb3cgRFBJIHNjcmVlbnMgY2F1c2UgYSBwb3BwZXIgdG8gYmUgYmx1cnJ5IGlmIG5vdCB1c2luZyBmdWxsIHBpeGVscyAoU2FmYXJpXG4gKiBhcyB3ZWxsIG9uIEhpZ2ggRFBJIHNjcmVlbnMpLlxuICpcbiAqIEZpcmVmb3ggcHJlZmVycyBubyByb3VuZGluZyBmb3IgcG9zaXRpb25pbmcgYW5kIGRvZXMgbm90IGhhdmUgYmx1cnJpbmVzcyBvblxuICogaGlnaCBEUEkgc2NyZWVucy5cbiAqXG4gKiBPbmx5IGhvcml6b250YWwgcGxhY2VtZW50IGFuZCBsZWZ0L3JpZ2h0IHZhbHVlcyBuZWVkIHRvIGJlIGNvbnNpZGVyZWQuXG4gKi9cbmZ1bmN0aW9uIGdldFJvdW5kZWRPZmZzZXRzKGRhdGEsIHNob3VsZFJvdW5kKSB7XG4gIHZhciBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXIsXG4gICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZTtcbiAgdmFyIHJvdW5kID0gTWF0aC5yb3VuZCxcbiAgICAgIGZsb29yID0gTWF0aC5mbG9vcjtcblxuICB2YXIgbm9Sb3VuZCA9IGZ1bmN0aW9uIG5vUm91bmQodikge1xuICAgIHJldHVybiB2O1xuICB9O1xuXG4gIHZhciByZWZlcmVuY2VXaWR0aCA9IHJvdW5kKHJlZmVyZW5jZS53aWR0aCk7XG4gIHZhciBwb3BwZXJXaWR0aCA9IHJvdW5kKHBvcHBlci53aWR0aCk7XG5cbiAgdmFyIGlzVmVydGljYWwgPSBbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKGRhdGEucGxhY2VtZW50KSAhPT0gLTE7XG4gIHZhciBpc1ZhcmlhdGlvbiA9IGRhdGEucGxhY2VtZW50LmluZGV4T2YoJy0nKSAhPT0gLTE7XG4gIHZhciBzYW1lV2lkdGhQYXJpdHkgPSByZWZlcmVuY2VXaWR0aCAlIDIgPT09IHBvcHBlcldpZHRoICUgMjtcbiAgdmFyIGJvdGhPZGRXaWR0aCA9IHJlZmVyZW5jZVdpZHRoICUgMiA9PT0gMSAmJiBwb3BwZXJXaWR0aCAlIDIgPT09IDE7XG5cbiAgdmFyIGhvcml6b250YWxUb0ludGVnZXIgPSAhc2hvdWxkUm91bmQgPyBub1JvdW5kIDogaXNWZXJ0aWNhbCB8fCBpc1ZhcmlhdGlvbiB8fCBzYW1lV2lkdGhQYXJpdHkgPyByb3VuZCA6IGZsb29yO1xuICB2YXIgdmVydGljYWxUb0ludGVnZXIgPSAhc2hvdWxkUm91bmQgPyBub1JvdW5kIDogcm91bmQ7XG5cbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiBob3Jpem9udGFsVG9JbnRlZ2VyKGJvdGhPZGRXaWR0aCAmJiAhaXNWYXJpYXRpb24gJiYgc2hvdWxkUm91bmQgPyBwb3BwZXIubGVmdCAtIDEgOiBwb3BwZXIubGVmdCksXG4gICAgdG9wOiB2ZXJ0aWNhbFRvSW50ZWdlcihwb3BwZXIudG9wKSxcbiAgICBib3R0b206IHZlcnRpY2FsVG9JbnRlZ2VyKHBvcHBlci5ib3R0b20pLFxuICAgIHJpZ2h0OiBob3Jpem9udGFsVG9JbnRlZ2VyKHBvcHBlci5yaWdodClcbiAgfTtcbn1cblxudmFyIGlzRmlyZWZveCA9IGlzQnJvd3NlciAmJiAvRmlyZWZveC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVTdHlsZShkYXRhLCBvcHRpb25zKSB7XG4gIHZhciB4ID0gb3B0aW9ucy54LFxuICAgICAgeSA9IG9wdGlvbnMueTtcbiAgdmFyIHBvcHBlciA9IGRhdGEub2Zmc2V0cy5wb3BwZXI7XG5cbiAgLy8gUmVtb3ZlIHRoaXMgbGVnYWN5IHN1cHBvcnQgaW4gUG9wcGVyLmpzIHYyXG5cbiAgdmFyIGxlZ2FjeUdwdUFjY2VsZXJhdGlvbk9wdGlvbiA9IGZpbmQoZGF0YS5pbnN0YW5jZS5tb2RpZmllcnMsIGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIHJldHVybiBtb2RpZmllci5uYW1lID09PSAnYXBwbHlTdHlsZSc7XG4gIH0pLmdwdUFjY2VsZXJhdGlvbjtcbiAgaWYgKGxlZ2FjeUdwdUFjY2VsZXJhdGlvbk9wdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBgZ3B1QWNjZWxlcmF0aW9uYCBvcHRpb24gbW92ZWQgdG8gYGNvbXB1dGVTdHlsZWAgbW9kaWZpZXIgYW5kIHdpbGwgbm90IGJlIHN1cHBvcnRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgUG9wcGVyLmpzIScpO1xuICB9XG4gIHZhciBncHVBY2NlbGVyYXRpb24gPSBsZWdhY3lHcHVBY2NlbGVyYXRpb25PcHRpb24gIT09IHVuZGVmaW5lZCA/IGxlZ2FjeUdwdUFjY2VsZXJhdGlvbk9wdGlvbiA6IG9wdGlvbnMuZ3B1QWNjZWxlcmF0aW9uO1xuXG4gIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoZGF0YS5pbnN0YW5jZS5wb3BwZXIpO1xuICB2YXIgb2Zmc2V0UGFyZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQpO1xuXG4gIC8vIFN0eWxlc1xuICB2YXIgc3R5bGVzID0ge1xuICAgIHBvc2l0aW9uOiBwb3BwZXIucG9zaXRpb25cbiAgfTtcblxuICB2YXIgb2Zmc2V0cyA9IGdldFJvdW5kZWRPZmZzZXRzKGRhdGEsIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIDwgMiB8fCAhaXNGaXJlZm94KTtcblxuICB2YXIgc2lkZUEgPSB4ID09PSAnYm90dG9tJyA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gIHZhciBzaWRlQiA9IHkgPT09ICdyaWdodCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuXG4gIC8vIGlmIGdwdUFjY2VsZXJhdGlvbiBpcyBzZXQgdG8gYHRydWVgIGFuZCB0cmFuc2Zvcm0gaXMgc3VwcG9ydGVkLFxuICAvLyAgd2UgdXNlIGB0cmFuc2xhdGUzZGAgdG8gYXBwbHkgdGhlIHBvc2l0aW9uIHRvIHRoZSBwb3BwZXIgd2VcbiAgLy8gYXV0b21hdGljYWxseSB1c2UgdGhlIHN1cHBvcnRlZCBwcmVmaXhlZCB2ZXJzaW9uIGlmIG5lZWRlZFxuICB2YXIgcHJlZml4ZWRQcm9wZXJ0eSA9IGdldFN1cHBvcnRlZFByb3BlcnR5TmFtZSgndHJhbnNmb3JtJyk7XG5cbiAgLy8gbm93LCBsZXQncyBtYWtlIGEgc3RlcCBiYWNrIGFuZCBsb29rIGF0IHRoaXMgY29kZSBjbG9zZWx5ICh3dGY/KVxuICAvLyBJZiB0aGUgY29udGVudCBvZiB0aGUgcG9wcGVyIGdyb3dzIG9uY2UgaXQncyBiZWVuIHBvc2l0aW9uZWQsIGl0XG4gIC8vIG1heSBoYXBwZW4gdGhhdCB0aGUgcG9wcGVyIGdldHMgbWlzcGxhY2VkIGJlY2F1c2Ugb2YgdGhlIG5ldyBjb250ZW50XG4gIC8vIG92ZXJmbG93aW5nIGl0cyByZWZlcmVuY2UgZWxlbWVudFxuICAvLyBUbyBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIHByb3ZpZGUgdHdvIG9wdGlvbnMgKHggYW5kIHkpLCB3aGljaCBhbGxvd1xuICAvLyB0aGUgY29uc3VtZXIgdG8gZGVmaW5lIHRoZSBvZmZzZXQgb3JpZ2luLlxuICAvLyBJZiB3ZSBwb3NpdGlvbiBhIHBvcHBlciBvbiB0b3Agb2YgYSByZWZlcmVuY2UgZWxlbWVudCwgd2UgY2FuIHNldFxuICAvLyBgeGAgdG8gYHRvcGAgdG8gbWFrZSB0aGUgcG9wcGVyIGdyb3cgdG93YXJkcyBpdHMgdG9wIGluc3RlYWQgb2ZcbiAgLy8gaXRzIGJvdHRvbS5cbiAgdmFyIGxlZnQgPSB2b2lkIDAsXG4gICAgICB0b3AgPSB2b2lkIDA7XG4gIGlmIChzaWRlQSA9PT0gJ2JvdHRvbScpIHtcbiAgICAvLyB3aGVuIG9mZnNldFBhcmVudCBpcyA8aHRtbD4gdGhlIHBvc2l0aW9uaW5nIGlzIHJlbGF0aXZlIHRvIHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiAoZXhjbHVkaW5nIHRoZSBzY3JvbGxiYXIpXG4gICAgLy8gYW5kIG5vdCB0aGUgYm90dG9tIG9mIHRoZSBodG1sIGVsZW1lbnRcbiAgICBpZiAob2Zmc2V0UGFyZW50Lm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgIHRvcCA9IC1vZmZzZXRQYXJlbnQuY2xpZW50SGVpZ2h0ICsgb2Zmc2V0cy5ib3R0b207XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvcCA9IC1vZmZzZXRQYXJlbnRSZWN0LmhlaWdodCArIG9mZnNldHMuYm90dG9tO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0b3AgPSBvZmZzZXRzLnRvcDtcbiAgfVxuICBpZiAoc2lkZUIgPT09ICdyaWdodCcpIHtcbiAgICBpZiAob2Zmc2V0UGFyZW50Lm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgIGxlZnQgPSAtb2Zmc2V0UGFyZW50LmNsaWVudFdpZHRoICsgb2Zmc2V0cy5yaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVmdCA9IC1vZmZzZXRQYXJlbnRSZWN0LndpZHRoICsgb2Zmc2V0cy5yaWdodDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGVmdCA9IG9mZnNldHMubGVmdDtcbiAgfVxuICBpZiAoZ3B1QWNjZWxlcmF0aW9uICYmIHByZWZpeGVkUHJvcGVydHkpIHtcbiAgICBzdHlsZXNbcHJlZml4ZWRQcm9wZXJ0eV0gPSAndHJhbnNsYXRlM2QoJyArIGxlZnQgKyAncHgsICcgKyB0b3AgKyAncHgsIDApJztcbiAgICBzdHlsZXNbc2lkZUFdID0gMDtcbiAgICBzdHlsZXNbc2lkZUJdID0gMDtcbiAgICBzdHlsZXMud2lsbENoYW5nZSA9ICd0cmFuc2Zvcm0nO1xuICB9IGVsc2Uge1xuICAgIC8vIG90aHdlcmlzZSwgd2UgdXNlIHRoZSBzdGFuZGFyZCBgdG9wYCwgYGxlZnRgLCBgYm90dG9tYCBhbmQgYHJpZ2h0YCBwcm9wZXJ0aWVzXG4gICAgdmFyIGludmVydFRvcCA9IHNpZGVBID09PSAnYm90dG9tJyA/IC0xIDogMTtcbiAgICB2YXIgaW52ZXJ0TGVmdCA9IHNpZGVCID09PSAncmlnaHQnID8gLTEgOiAxO1xuICAgIHN0eWxlc1tzaWRlQV0gPSB0b3AgKiBpbnZlcnRUb3A7XG4gICAgc3R5bGVzW3NpZGVCXSA9IGxlZnQgKiBpbnZlcnRMZWZ0O1xuICAgIHN0eWxlcy53aWxsQ2hhbmdlID0gc2lkZUEgKyAnLCAnICsgc2lkZUI7XG4gIH1cblxuICAvLyBBdHRyaWJ1dGVzXG4gIHZhciBhdHRyaWJ1dGVzID0ge1xuICAgICd4LXBsYWNlbWVudCc6IGRhdGEucGxhY2VtZW50XG4gIH07XG5cbiAgLy8gVXBkYXRlIGBkYXRhYCBhdHRyaWJ1dGVzLCBzdHlsZXMgYW5kIGFycm93U3R5bGVzXG4gIGRhdGEuYXR0cmlidXRlcyA9IF9leHRlbmRzKHt9LCBhdHRyaWJ1dGVzLCBkYXRhLmF0dHJpYnV0ZXMpO1xuICBkYXRhLnN0eWxlcyA9IF9leHRlbmRzKHt9LCBzdHlsZXMsIGRhdGEuc3R5bGVzKTtcbiAgZGF0YS5hcnJvd1N0eWxlcyA9IF9leHRlbmRzKHt9LCBkYXRhLm9mZnNldHMuYXJyb3csIGRhdGEuYXJyb3dTdHlsZXMpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEhlbHBlciB1c2VkIHRvIGtub3cgaWYgdGhlIGdpdmVuIG1vZGlmaWVyIGRlcGVuZHMgZnJvbSBhbm90aGVyIG9uZS48YnIgLz5cbiAqIEl0IGNoZWNrcyBpZiB0aGUgbmVlZGVkIG1vZGlmaWVyIGlzIGxpc3RlZCBhbmQgZW5hYmxlZC5cbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBwYXJhbSB7QXJyYXl9IG1vZGlmaWVycyAtIGxpc3Qgb2YgbW9kaWZpZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdGluZ05hbWUgLSBuYW1lIG9mIHJlcXVlc3RpbmcgbW9kaWZpZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0ZWROYW1lIC0gbmFtZSBvZiByZXF1ZXN0ZWQgbW9kaWZpZXJcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc01vZGlmaWVyUmVxdWlyZWQobW9kaWZpZXJzLCByZXF1ZXN0aW5nTmFtZSwgcmVxdWVzdGVkTmFtZSkge1xuICB2YXIgcmVxdWVzdGluZyA9IGZpbmQobW9kaWZpZXJzLCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBuYW1lID0gX3JlZi5uYW1lO1xuICAgIHJldHVybiBuYW1lID09PSByZXF1ZXN0aW5nTmFtZTtcbiAgfSk7XG5cbiAgdmFyIGlzUmVxdWlyZWQgPSAhIXJlcXVlc3RpbmcgJiYgbW9kaWZpZXJzLnNvbWUoZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgcmV0dXJuIG1vZGlmaWVyLm5hbWUgPT09IHJlcXVlc3RlZE5hbWUgJiYgbW9kaWZpZXIuZW5hYmxlZCAmJiBtb2RpZmllci5vcmRlciA8IHJlcXVlc3Rpbmcub3JkZXI7XG4gIH0pO1xuXG4gIGlmICghaXNSZXF1aXJlZCkge1xuICAgIHZhciBfcmVxdWVzdGluZyA9ICdgJyArIHJlcXVlc3RpbmdOYW1lICsgJ2AnO1xuICAgIHZhciByZXF1ZXN0ZWQgPSAnYCcgKyByZXF1ZXN0ZWROYW1lICsgJ2AnO1xuICAgIGNvbnNvbGUud2FybihyZXF1ZXN0ZWQgKyAnIG1vZGlmaWVyIGlzIHJlcXVpcmVkIGJ5ICcgKyBfcmVxdWVzdGluZyArICcgbW9kaWZpZXIgaW4gb3JkZXIgdG8gd29yaywgYmUgc3VyZSB0byBpbmNsdWRlIGl0IGJlZm9yZSAnICsgX3JlcXVlc3RpbmcgKyAnIScpO1xuICB9XG4gIHJldHVybiBpc1JlcXVpcmVkO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gYXJyb3coZGF0YSwgb3B0aW9ucykge1xuICB2YXIgX2RhdGEkb2Zmc2V0cyRhcnJvdztcblxuICAvLyBhcnJvdyBkZXBlbmRzIG9uIGtlZXBUb2dldGhlciBpbiBvcmRlciB0byB3b3JrXG4gIGlmICghaXNNb2RpZmllclJlcXVpcmVkKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCAnYXJyb3cnLCAna2VlcFRvZ2V0aGVyJykpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHZhciBhcnJvd0VsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQ7XG5cbiAgLy8gaWYgYXJyb3dFbGVtZW50IGlzIGEgc3RyaW5nLCBzdXBwb3NlIGl0J3MgYSBDU1Mgc2VsZWN0b3JcbiAgaWYgKHR5cGVvZiBhcnJvd0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyb3dFbGVtZW50ID0gZGF0YS5pbnN0YW5jZS5wb3BwZXIucXVlcnlTZWxlY3RvcihhcnJvd0VsZW1lbnQpO1xuXG4gICAgLy8gaWYgYXJyb3dFbGVtZW50IGlzIG5vdCBmb3VuZCwgZG9uJ3QgcnVuIHRoZSBtb2RpZmllclxuICAgIGlmICghYXJyb3dFbGVtZW50KSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgdGhlIGFycm93RWxlbWVudCBpc24ndCBhIHF1ZXJ5IHNlbGVjdG9yIHdlIG11c3QgY2hlY2sgdGhhdCB0aGVcbiAgICAvLyBwcm92aWRlZCBET00gbm9kZSBpcyBjaGlsZCBvZiBpdHMgcG9wcGVyIG5vZGVcbiAgICBpZiAoIWRhdGEuaW5zdGFuY2UucG9wcGVyLmNvbnRhaW5zKGFycm93RWxlbWVudCkpIHtcbiAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogYGFycm93LmVsZW1lbnRgIG11c3QgYmUgY2hpbGQgb2YgaXRzIHBvcHBlciBlbGVtZW50IScpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICB9XG5cbiAgdmFyIHBsYWNlbWVudCA9IGRhdGEucGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gIHZhciBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXIsXG4gICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZTtcblxuICB2YXIgaXNWZXJ0aWNhbCA9IFsnbGVmdCcsICdyaWdodCddLmluZGV4T2YocGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgdmFyIGxlbiA9IGlzVmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gIHZhciBzaWRlQ2FwaXRhbGl6ZWQgPSBpc1ZlcnRpY2FsID8gJ1RvcCcgOiAnTGVmdCc7XG4gIHZhciBzaWRlID0gc2lkZUNhcGl0YWxpemVkLnRvTG93ZXJDYXNlKCk7XG4gIHZhciBhbHRTaWRlID0gaXNWZXJ0aWNhbCA/ICdsZWZ0JyA6ICd0b3AnO1xuICB2YXIgb3BTaWRlID0gaXNWZXJ0aWNhbCA/ICdib3R0b20nIDogJ3JpZ2h0JztcbiAgdmFyIGFycm93RWxlbWVudFNpemUgPSBnZXRPdXRlclNpemVzKGFycm93RWxlbWVudClbbGVuXTtcblxuICAvL1xuICAvLyBleHRlbmRzIGtlZXBUb2dldGhlciBiZWhhdmlvciBtYWtpbmcgc3VyZSB0aGUgcG9wcGVyIGFuZCBpdHNcbiAgLy8gcmVmZXJlbmNlIGhhdmUgZW5vdWdoIHBpeGVscyBpbiBjb25qdW5jdGlvblxuICAvL1xuXG4gIC8vIHRvcC9sZWZ0IHNpZGVcbiAgaWYgKHJlZmVyZW5jZVtvcFNpZGVdIC0gYXJyb3dFbGVtZW50U2l6ZSA8IHBvcHBlcltzaWRlXSkge1xuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbc2lkZV0gLT0gcG9wcGVyW3NpZGVdIC0gKHJlZmVyZW5jZVtvcFNpZGVdIC0gYXJyb3dFbGVtZW50U2l6ZSk7XG4gIH1cbiAgLy8gYm90dG9tL3JpZ2h0IHNpZGVcbiAgaWYgKHJlZmVyZW5jZVtzaWRlXSArIGFycm93RWxlbWVudFNpemUgPiBwb3BwZXJbb3BTaWRlXSkge1xuICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbc2lkZV0gKz0gcmVmZXJlbmNlW3NpZGVdICsgYXJyb3dFbGVtZW50U2l6ZSAtIHBvcHBlcltvcFNpZGVdO1xuICB9XG4gIGRhdGEub2Zmc2V0cy5wb3BwZXIgPSBnZXRDbGllbnRSZWN0KGRhdGEub2Zmc2V0cy5wb3BwZXIpO1xuXG4gIC8vIGNvbXB1dGUgY2VudGVyIG9mIHRoZSBwb3BwZXJcbiAgdmFyIGNlbnRlciA9IHJlZmVyZW5jZVtzaWRlXSArIHJlZmVyZW5jZVtsZW5dIC8gMiAtIGFycm93RWxlbWVudFNpemUgLyAyO1xuXG4gIC8vIENvbXB1dGUgdGhlIHNpZGVWYWx1ZSB1c2luZyB0aGUgdXBkYXRlZCBwb3BwZXIgb2Zmc2V0c1xuICAvLyB0YWtlIHBvcHBlciBtYXJnaW4gaW4gYWNjb3VudCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhpcyBpbmZvIGF2YWlsYWJsZVxuICB2YXIgY3NzID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGRhdGEuaW5zdGFuY2UucG9wcGVyKTtcbiAgdmFyIHBvcHBlck1hcmdpblNpZGUgPSBwYXJzZUZsb2F0KGNzc1snbWFyZ2luJyArIHNpZGVDYXBpdGFsaXplZF0pO1xuICB2YXIgcG9wcGVyQm9yZGVyU2lkZSA9IHBhcnNlRmxvYXQoY3NzWydib3JkZXInICsgc2lkZUNhcGl0YWxpemVkICsgJ1dpZHRoJ10pO1xuICB2YXIgc2lkZVZhbHVlID0gY2VudGVyIC0gZGF0YS5vZmZzZXRzLnBvcHBlcltzaWRlXSAtIHBvcHBlck1hcmdpblNpZGUgLSBwb3BwZXJCb3JkZXJTaWRlO1xuXG4gIC8vIHByZXZlbnQgYXJyb3dFbGVtZW50IGZyb20gYmVpbmcgcGxhY2VkIG5vdCBjb250aWd1b3VzbHkgdG8gaXRzIHBvcHBlclxuICBzaWRlVmFsdWUgPSBNYXRoLm1heChNYXRoLm1pbihwb3BwZXJbbGVuXSAtIGFycm93RWxlbWVudFNpemUsIHNpZGVWYWx1ZSksIDApO1xuXG4gIGRhdGEuYXJyb3dFbGVtZW50ID0gYXJyb3dFbGVtZW50O1xuICBkYXRhLm9mZnNldHMuYXJyb3cgPSAoX2RhdGEkb2Zmc2V0cyRhcnJvdyA9IHt9LCBkZWZpbmVQcm9wZXJ0eShfZGF0YSRvZmZzZXRzJGFycm93LCBzaWRlLCBNYXRoLnJvdW5kKHNpZGVWYWx1ZSkpLCBkZWZpbmVQcm9wZXJ0eShfZGF0YSRvZmZzZXRzJGFycm93LCBhbHRTaWRlLCAnJyksIF9kYXRhJG9mZnNldHMkYXJyb3cpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEdldCB0aGUgb3Bwb3NpdGUgcGxhY2VtZW50IHZhcmlhdGlvbiBvZiB0aGUgZ2l2ZW4gb25lXG4gKiBAbWV0aG9kXG4gKiBAbWVtYmVyb2YgUG9wcGVyLlV0aWxzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gcGxhY2VtZW50IHZhcmlhdGlvblxuICogQHJldHVybnMge1N0cmluZ30gZmxpcHBlZCBwbGFjZW1lbnQgdmFyaWF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uKHZhcmlhdGlvbikge1xuICBpZiAodmFyaWF0aW9uID09PSAnZW5kJykge1xuICAgIHJldHVybiAnc3RhcnQnO1xuICB9IGVsc2UgaWYgKHZhcmlhdGlvbiA9PT0gJ3N0YXJ0Jykge1xuICAgIHJldHVybiAnZW5kJztcbiAgfVxuICByZXR1cm4gdmFyaWF0aW9uO1xufVxuXG4vKipcbiAqIExpc3Qgb2YgYWNjZXB0ZWQgcGxhY2VtZW50cyB0byB1c2UgYXMgdmFsdWVzIG9mIHRoZSBgcGxhY2VtZW50YCBvcHRpb24uPGJyIC8+XG4gKiBWYWxpZCBwbGFjZW1lbnRzIGFyZTpcbiAqIC0gYGF1dG9gXG4gKiAtIGB0b3BgXG4gKiAtIGByaWdodGBcbiAqIC0gYGJvdHRvbWBcbiAqIC0gYGxlZnRgXG4gKlxuICogRWFjaCBwbGFjZW1lbnQgY2FuIGhhdmUgYSB2YXJpYXRpb24gZnJvbSB0aGlzIGxpc3Q6XG4gKiAtIGAtc3RhcnRgXG4gKiAtIGAtZW5kYFxuICpcbiAqIFZhcmlhdGlvbnMgYXJlIGludGVycHJldGVkIGVhc2lseSBpZiB5b3UgdGhpbmsgb2YgdGhlbSBhcyB0aGUgbGVmdCB0byByaWdodFxuICogd3JpdHRlbiBsYW5ndWFnZXMuIEhvcml6b250YWxseSAoYHRvcGAgYW5kIGBib3R0b21gKSwgYHN0YXJ0YCBpcyBsZWZ0IGFuZCBgZW5kYFxuICogaXMgcmlnaHQuPGJyIC8+XG4gKiBWZXJ0aWNhbGx5IChgbGVmdGAgYW5kIGByaWdodGApLCBgc3RhcnRgIGlzIHRvcCBhbmQgYGVuZGAgaXMgYm90dG9tLlxuICpcbiAqIFNvbWUgdmFsaWQgZXhhbXBsZXMgYXJlOlxuICogLSBgdG9wLWVuZGAgKG9uIHRvcCBvZiByZWZlcmVuY2UsIHJpZ2h0IGFsaWduZWQpXG4gKiAtIGByaWdodC1zdGFydGAgKG9uIHJpZ2h0IG9mIHJlZmVyZW5jZSwgdG9wIGFsaWduZWQpXG4gKiAtIGBib3R0b21gIChvbiBib3R0b20sIGNlbnRlcmVkKVxuICogLSBgYXV0by1lbmRgIChvbiB0aGUgc2lkZSB3aXRoIG1vcmUgc3BhY2UgYXZhaWxhYmxlLCBhbGlnbm1lbnQgZGVwZW5kcyBieSBwbGFjZW1lbnQpXG4gKlxuICogQHN0YXRpY1xuICogQHR5cGUge0FycmF5fVxuICogQGVudW0ge1N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1ldGhvZCBwbGFjZW1lbnRzXG4gKiBAbWVtYmVyb2YgUG9wcGVyXG4gKi9cbnZhciBwbGFjZW1lbnRzID0gWydhdXRvLXN0YXJ0JywgJ2F1dG8nLCAnYXV0by1lbmQnLCAndG9wLXN0YXJ0JywgJ3RvcCcsICd0b3AtZW5kJywgJ3JpZ2h0LXN0YXJ0JywgJ3JpZ2h0JywgJ3JpZ2h0LWVuZCcsICdib3R0b20tZW5kJywgJ2JvdHRvbScsICdib3R0b20tc3RhcnQnLCAnbGVmdC1lbmQnLCAnbGVmdCcsICdsZWZ0LXN0YXJ0J107XG5cbi8vIEdldCByaWQgb2YgYGF1dG9gIGBhdXRvLXN0YXJ0YCBhbmQgYGF1dG8tZW5kYFxudmFyIHZhbGlkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuc2xpY2UoMyk7XG5cbi8qKlxuICogR2l2ZW4gYW4gaW5pdGlhbCBwbGFjZW1lbnQsIHJldHVybnMgYWxsIHRoZSBzdWJzZXF1ZW50IHBsYWNlbWVudHNcbiAqIGNsb2Nrd2lzZSAob3IgY291bnRlci1jbG9ja3dpc2UpLlxuICpcbiAqIEBtZXRob2RcbiAqIEBtZW1iZXJvZiBQb3BwZXIuVXRpbHNcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBwbGFjZW1lbnQgLSBBIHZhbGlkIHBsYWNlbWVudCAoaXQgYWNjZXB0cyB2YXJpYXRpb25zKVxuICogQGFyZ3VtZW50IHtCb29sZWFufSBjb3VudGVyIC0gU2V0IHRvIHRydWUgdG8gd2FsayB0aGUgcGxhY2VtZW50cyBjb3VudGVyY2xvY2t3aXNlXG4gKiBAcmV0dXJucyB7QXJyYXl9IHBsYWNlbWVudHMgaW5jbHVkaW5nIHRoZWlyIHZhcmlhdGlvbnNcbiAqL1xuZnVuY3Rpb24gY2xvY2t3aXNlKHBsYWNlbWVudCkge1xuICB2YXIgY291bnRlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgdmFyIGluZGV4ID0gdmFsaWRQbGFjZW1lbnRzLmluZGV4T2YocGxhY2VtZW50KTtcbiAgdmFyIGFyciA9IHZhbGlkUGxhY2VtZW50cy5zbGljZShpbmRleCArIDEpLmNvbmNhdCh2YWxpZFBsYWNlbWVudHMuc2xpY2UoMCwgaW5kZXgpKTtcbiAgcmV0dXJuIGNvdW50ZXIgPyBhcnIucmV2ZXJzZSgpIDogYXJyO1xufVxuXG52YXIgQkVIQVZJT1JTID0ge1xuICBGTElQOiAnZmxpcCcsXG4gIENMT0NLV0lTRTogJ2Nsb2Nrd2lzZScsXG4gIENPVU5URVJDTE9DS1dJU0U6ICdjb3VudGVyY2xvY2t3aXNlJ1xufTtcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGZsaXAoZGF0YSwgb3B0aW9ucykge1xuICAvLyBpZiBgaW5uZXJgIG1vZGlmaWVyIGlzIGVuYWJsZWQsIHdlIGNhbid0IHVzZSB0aGUgYGZsaXBgIG1vZGlmaWVyXG4gIGlmIChpc01vZGlmaWVyRW5hYmxlZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgJ2lubmVyJykpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGlmIChkYXRhLmZsaXBwZWQgJiYgZGF0YS5wbGFjZW1lbnQgPT09IGRhdGEub3JpZ2luYWxQbGFjZW1lbnQpIHtcbiAgICAvLyBzZWVtcyBsaWtlIGZsaXAgaXMgdHJ5aW5nIHRvIGxvb3AsIHByb2JhYmx5IHRoZXJlJ3Mgbm90IGVub3VnaCBzcGFjZSBvbiBhbnkgb2YgdGhlIGZsaXBwYWJsZSBzaWRlc1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgdmFyIGJvdW5kYXJpZXMgPSBnZXRCb3VuZGFyaWVzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLmluc3RhbmNlLnJlZmVyZW5jZSwgb3B0aW9ucy5wYWRkaW5nLCBvcHRpb25zLmJvdW5kYXJpZXNFbGVtZW50LCBkYXRhLnBvc2l0aW9uRml4ZWQpO1xuXG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgcGxhY2VtZW50T3Bwb3NpdGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICB2YXIgdmFyaWF0aW9uID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVsxXSB8fCAnJztcblxuICB2YXIgZmxpcE9yZGVyID0gW107XG5cbiAgc3dpdGNoIChvcHRpb25zLmJlaGF2aW9yKSB7XG4gICAgY2FzZSBCRUhBVklPUlMuRkxJUDpcbiAgICAgIGZsaXBPcmRlciA9IFtwbGFjZW1lbnQsIHBsYWNlbWVudE9wcG9zaXRlXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQkVIQVZJT1JTLkNMT0NLV0lTRTpcbiAgICAgIGZsaXBPcmRlciA9IGNsb2Nrd2lzZShwbGFjZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBCRUhBVklPUlMuQ09VTlRFUkNMT0NLV0lTRTpcbiAgICAgIGZsaXBPcmRlciA9IGNsb2Nrd2lzZShwbGFjZW1lbnQsIHRydWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGZsaXBPcmRlciA9IG9wdGlvbnMuYmVoYXZpb3I7XG4gIH1cblxuICBmbGlwT3JkZXIuZm9yRWFjaChmdW5jdGlvbiAoc3RlcCwgaW5kZXgpIHtcbiAgICBpZiAocGxhY2VtZW50ICE9PSBzdGVwIHx8IGZsaXBPcmRlci5sZW5ndGggPT09IGluZGV4ICsgMSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgICBwbGFjZW1lbnRPcHBvc2l0ZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCk7XG5cbiAgICB2YXIgcG9wcGVyT2Zmc2V0cyA9IGRhdGEub2Zmc2V0cy5wb3BwZXI7XG4gICAgdmFyIHJlZk9mZnNldHMgPSBkYXRhLm9mZnNldHMucmVmZXJlbmNlO1xuXG4gICAgLy8gdXNpbmcgZmxvb3IgYmVjYXVzZSB0aGUgcmVmZXJlbmNlIG9mZnNldHMgbWF5IGNvbnRhaW4gZGVjaW1hbHMgd2UgYXJlIG5vdCBnb2luZyB0byBjb25zaWRlciBoZXJlXG4gICAgdmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbiAgICB2YXIgb3ZlcmxhcHNSZWYgPSBwbGFjZW1lbnQgPT09ICdsZWZ0JyAmJiBmbG9vcihwb3BwZXJPZmZzZXRzLnJpZ2h0KSA+IGZsb29yKHJlZk9mZnNldHMubGVmdCkgfHwgcGxhY2VtZW50ID09PSAncmlnaHQnICYmIGZsb29yKHBvcHBlck9mZnNldHMubGVmdCkgPCBmbG9vcihyZWZPZmZzZXRzLnJpZ2h0KSB8fCBwbGFjZW1lbnQgPT09ICd0b3AnICYmIGZsb29yKHBvcHBlck9mZnNldHMuYm90dG9tKSA+IGZsb29yKHJlZk9mZnNldHMudG9wKSB8fCBwbGFjZW1lbnQgPT09ICdib3R0b20nICYmIGZsb29yKHBvcHBlck9mZnNldHMudG9wKSA8IGZsb29yKHJlZk9mZnNldHMuYm90dG9tKTtcblxuICAgIHZhciBvdmVyZmxvd3NMZWZ0ID0gZmxvb3IocG9wcGVyT2Zmc2V0cy5sZWZ0KSA8IGZsb29yKGJvdW5kYXJpZXMubGVmdCk7XG4gICAgdmFyIG92ZXJmbG93c1JpZ2h0ID0gZmxvb3IocG9wcGVyT2Zmc2V0cy5yaWdodCkgPiBmbG9vcihib3VuZGFyaWVzLnJpZ2h0KTtcbiAgICB2YXIgb3ZlcmZsb3dzVG9wID0gZmxvb3IocG9wcGVyT2Zmc2V0cy50b3ApIDwgZmxvb3IoYm91bmRhcmllcy50b3ApO1xuICAgIHZhciBvdmVyZmxvd3NCb3R0b20gPSBmbG9vcihwb3BwZXJPZmZzZXRzLmJvdHRvbSkgPiBmbG9vcihib3VuZGFyaWVzLmJvdHRvbSk7XG5cbiAgICB2YXIgb3ZlcmZsb3dzQm91bmRhcmllcyA9IHBsYWNlbWVudCA9PT0gJ2xlZnQnICYmIG92ZXJmbG93c0xlZnQgfHwgcGxhY2VtZW50ID09PSAncmlnaHQnICYmIG92ZXJmbG93c1JpZ2h0IHx8IHBsYWNlbWVudCA9PT0gJ3RvcCcgJiYgb3ZlcmZsb3dzVG9wIHx8IHBsYWNlbWVudCA9PT0gJ2JvdHRvbScgJiYgb3ZlcmZsb3dzQm90dG9tO1xuXG4gICAgLy8gZmxpcCB0aGUgdmFyaWF0aW9uIGlmIHJlcXVpcmVkXG4gICAgdmFyIGlzVmVydGljYWwgPSBbJ3RvcCcsICdib3R0b20nXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xO1xuXG4gICAgLy8gZmxpcHMgdmFyaWF0aW9uIGlmIHJlZmVyZW5jZSBlbGVtZW50IG92ZXJmbG93cyBib3VuZGFyaWVzXG4gICAgdmFyIGZsaXBwZWRWYXJpYXRpb25CeVJlZiA9ICEhb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyAmJiAoaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdzdGFydCcgJiYgb3ZlcmZsb3dzTGVmdCB8fCBpc1ZlcnRpY2FsICYmIHZhcmlhdGlvbiA9PT0gJ2VuZCcgJiYgb3ZlcmZsb3dzUmlnaHQgfHwgIWlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnc3RhcnQnICYmIG92ZXJmbG93c1RvcCB8fCAhaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdlbmQnICYmIG92ZXJmbG93c0JvdHRvbSk7XG5cbiAgICAvLyBmbGlwcyB2YXJpYXRpb24gaWYgcG9wcGVyIGNvbnRlbnQgb3ZlcmZsb3dzIGJvdW5kYXJpZXNcbiAgICB2YXIgZmxpcHBlZFZhcmlhdGlvbkJ5Q29udGVudCA9ICEhb3B0aW9ucy5mbGlwVmFyaWF0aW9uc0J5Q29udGVudCAmJiAoaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdzdGFydCcgJiYgb3ZlcmZsb3dzUmlnaHQgfHwgaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdlbmQnICYmIG92ZXJmbG93c0xlZnQgfHwgIWlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnc3RhcnQnICYmIG92ZXJmbG93c0JvdHRvbSB8fCAhaXNWZXJ0aWNhbCAmJiB2YXJpYXRpb24gPT09ICdlbmQnICYmIG92ZXJmbG93c1RvcCk7XG5cbiAgICB2YXIgZmxpcHBlZFZhcmlhdGlvbiA9IGZsaXBwZWRWYXJpYXRpb25CeVJlZiB8fCBmbGlwcGVkVmFyaWF0aW9uQnlDb250ZW50O1xuXG4gICAgaWYgKG92ZXJsYXBzUmVmIHx8IG92ZXJmbG93c0JvdW5kYXJpZXMgfHwgZmxpcHBlZFZhcmlhdGlvbikge1xuICAgICAgLy8gdGhpcyBib29sZWFuIHRvIGRldGVjdCBhbnkgZmxpcCBsb29wXG4gICAgICBkYXRhLmZsaXBwZWQgPSB0cnVlO1xuXG4gICAgICBpZiAob3ZlcmxhcHNSZWYgfHwgb3ZlcmZsb3dzQm91bmRhcmllcykge1xuICAgICAgICBwbGFjZW1lbnQgPSBmbGlwT3JkZXJbaW5kZXggKyAxXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZsaXBwZWRWYXJpYXRpb24pIHtcbiAgICAgICAgdmFyaWF0aW9uID0gZ2V0T3Bwb3NpdGVWYXJpYXRpb24odmFyaWF0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZGF0YS5wbGFjZW1lbnQgPSBwbGFjZW1lbnQgKyAodmFyaWF0aW9uID8gJy0nICsgdmFyaWF0aW9uIDogJycpO1xuXG4gICAgICAvLyB0aGlzIG9iamVjdCBjb250YWlucyBgcG9zaXRpb25gLCB3ZSB3YW50IHRvIHByZXNlcnZlIGl0IGFsb25nIHdpdGhcbiAgICAgIC8vIGFueSBhZGRpdGlvbmFsIHByb3BlcnR5IHdlIG1heSBhZGQgaW4gdGhlIGZ1dHVyZVxuICAgICAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IF9leHRlbmRzKHt9LCBkYXRhLm9mZnNldHMucG9wcGVyLCBnZXRQb3BwZXJPZmZzZXRzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLm9mZnNldHMucmVmZXJlbmNlLCBkYXRhLnBsYWNlbWVudCkpO1xuXG4gICAgICBkYXRhID0gcnVuTW9kaWZpZXJzKGRhdGEuaW5zdGFuY2UubW9kaWZpZXJzLCBkYXRhLCAnZmxpcCcpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHVwZGF0ZSBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24ga2VlcFRvZ2V0aGVyKGRhdGEpIHtcbiAgdmFyIF9kYXRhJG9mZnNldHMgPSBkYXRhLm9mZnNldHMsXG4gICAgICBwb3BwZXIgPSBfZGF0YSRvZmZzZXRzLnBvcHBlcixcbiAgICAgIHJlZmVyZW5jZSA9IF9kYXRhJG9mZnNldHMucmVmZXJlbmNlO1xuXG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICB2YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuICB2YXIgaXNWZXJ0aWNhbCA9IFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSAhPT0gLTE7XG4gIHZhciBzaWRlID0gaXNWZXJ0aWNhbCA/ICdyaWdodCcgOiAnYm90dG9tJztcbiAgdmFyIG9wU2lkZSA9IGlzVmVydGljYWwgPyAnbGVmdCcgOiAndG9wJztcbiAgdmFyIG1lYXN1cmVtZW50ID0gaXNWZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcblxuICBpZiAocG9wcGVyW3NpZGVdIDwgZmxvb3IocmVmZXJlbmNlW29wU2lkZV0pKSB7XG4gICAgZGF0YS5vZmZzZXRzLnBvcHBlcltvcFNpZGVdID0gZmxvb3IocmVmZXJlbmNlW29wU2lkZV0pIC0gcG9wcGVyW21lYXN1cmVtZW50XTtcbiAgfVxuICBpZiAocG9wcGVyW29wU2lkZV0gPiBmbG9vcihyZWZlcmVuY2Vbc2lkZV0pKSB7XG4gICAgZGF0YS5vZmZzZXRzLnBvcHBlcltvcFNpZGVdID0gZmxvb3IocmVmZXJlbmNlW3NpZGVdKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdmFsdWUgKyB1bml0IGludG8gYSBweCB2YWx1ZSBudW1iZXJcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIHttb2RpZmllcnN+b2Zmc2V0fVxuICogQHByaXZhdGVcbiAqIEBhcmd1bWVudCB7U3RyaW5nfSBzdHIgLSBWYWx1ZSArIHVuaXQgc3RyaW5nXG4gKiBAYXJndW1lbnQge1N0cmluZ30gbWVhc3VyZW1lbnQgLSBgaGVpZ2h0YCBvciBgd2lkdGhgXG4gKiBAYXJndW1lbnQge09iamVjdH0gcG9wcGVyT2Zmc2V0c1xuICogQGFyZ3VtZW50IHtPYmplY3R9IHJlZmVyZW5jZU9mZnNldHNcbiAqIEByZXR1cm5zIHtOdW1iZXJ8U3RyaW5nfVxuICogVmFsdWUgaW4gcGl4ZWxzLCBvciBvcmlnaW5hbCBzdHJpbmcgaWYgbm8gdmFsdWVzIHdlcmUgZXh0cmFjdGVkXG4gKi9cbmZ1bmN0aW9uIHRvVmFsdWUoc3RyLCBtZWFzdXJlbWVudCwgcG9wcGVyT2Zmc2V0cywgcmVmZXJlbmNlT2Zmc2V0cykge1xuICAvLyBzZXBhcmF0ZSB2YWx1ZSBmcm9tIHVuaXRcbiAgdmFyIHNwbGl0ID0gc3RyLm1hdGNoKC8oKD86XFwtfFxcKyk/XFxkKlxcLj9cXGQqKSguKikvKTtcbiAgdmFyIHZhbHVlID0gK3NwbGl0WzFdO1xuICB2YXIgdW5pdCA9IHNwbGl0WzJdO1xuXG4gIC8vIElmIGl0J3Mgbm90IGEgbnVtYmVyIGl0J3MgYW4gb3BlcmF0b3IsIEkgZ3Vlc3NcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBpZiAodW5pdC5pbmRleE9mKCclJykgPT09IDApIHtcbiAgICB2YXIgZWxlbWVudCA9IHZvaWQgMDtcbiAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgIGNhc2UgJyVwJzpcbiAgICAgICAgZWxlbWVudCA9IHBvcHBlck9mZnNldHM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJSc6XG4gICAgICBjYXNlICclcic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBlbGVtZW50ID0gcmVmZXJlbmNlT2Zmc2V0cztcbiAgICB9XG5cbiAgICB2YXIgcmVjdCA9IGdldENsaWVudFJlY3QoZWxlbWVudCk7XG4gICAgcmV0dXJuIHJlY3RbbWVhc3VyZW1lbnRdIC8gMTAwICogdmFsdWU7XG4gIH0gZWxzZSBpZiAodW5pdCA9PT0gJ3ZoJyB8fCB1bml0ID09PSAndncnKSB7XG4gICAgLy8gaWYgaXMgYSB2aCBvciB2dywgd2UgY2FsY3VsYXRlIHRoZSBzaXplIGJhc2VkIG9uIHRoZSB2aWV3cG9ydFxuICAgIHZhciBzaXplID0gdm9pZCAwO1xuICAgIGlmICh1bml0ID09PSAndmgnKSB7XG4gICAgICBzaXplID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaXplID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpemUgLyAxMDAgKiB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiBpcyBhbiBleHBsaWNpdCBwaXhlbCB1bml0LCB3ZSBnZXQgcmlkIG9mIHRoZSB1bml0IGFuZCBrZWVwIHRoZSB2YWx1ZVxuICAgIC8vIGlmIGlzIGFuIGltcGxpY2l0IHVuaXQsIGl0J3MgcHgsIGFuZCB3ZSByZXR1cm4ganVzdCB0aGUgdmFsdWVcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBgb2Zmc2V0YCBzdHJpbmcgdG8gZXh0cmFwb2xhdGUgYHhgIGFuZCBgeWAgbnVtZXJpYyBvZmZzZXRzLlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2Yge21vZGlmaWVyc35vZmZzZXR9XG4gKiBAcHJpdmF0ZVxuICogQGFyZ3VtZW50IHtTdHJpbmd9IG9mZnNldFxuICogQGFyZ3VtZW50IHtPYmplY3R9IHBvcHBlck9mZnNldHNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSByZWZlcmVuY2VPZmZzZXRzXG4gKiBAYXJndW1lbnQge1N0cmluZ30gYmFzZVBsYWNlbWVudFxuICogQHJldHVybnMge0FycmF5fSBhIHR3byBjZWxscyBhcnJheSB3aXRoIHggYW5kIHkgb2Zmc2V0cyBpbiBudW1iZXJzXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT2Zmc2V0KG9mZnNldCwgcG9wcGVyT2Zmc2V0cywgcmVmZXJlbmNlT2Zmc2V0cywgYmFzZVBsYWNlbWVudCkge1xuICB2YXIgb2Zmc2V0cyA9IFswLCAwXTtcblxuICAvLyBVc2UgaGVpZ2h0IGlmIHBsYWNlbWVudCBpcyBsZWZ0IG9yIHJpZ2h0IGFuZCBpbmRleCBpcyAwIG90aGVyd2lzZSB1c2Ugd2lkdGhcbiAgLy8gaW4gdGhpcyB3YXkgdGhlIGZpcnN0IG9mZnNldCB3aWxsIHVzZSBhbiBheGlzIGFuZCB0aGUgc2Vjb25kIG9uZVxuICAvLyB3aWxsIHVzZSB0aGUgb3RoZXIgb25lXG4gIHZhciB1c2VIZWlnaHQgPSBbJ3JpZ2h0JywgJ2xlZnQnXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcblxuICAvLyBTcGxpdCB0aGUgb2Zmc2V0IHN0cmluZyB0byBvYnRhaW4gYSBsaXN0IG9mIHZhbHVlcyBhbmQgb3BlcmFuZHNcbiAgLy8gVGhlIHJlZ2V4IGFkZHJlc3NlcyB2YWx1ZXMgd2l0aCB0aGUgcGx1cyBvciBtaW51cyBzaWduIGluIGZyb250ICgrMTAsIC0yMCwgZXRjKVxuICB2YXIgZnJhZ21lbnRzID0gb2Zmc2V0LnNwbGl0KC8oXFwrfFxcLSkvKS5tYXAoZnVuY3Rpb24gKGZyYWcpIHtcbiAgICByZXR1cm4gZnJhZy50cmltKCk7XG4gIH0pO1xuXG4gIC8vIERldGVjdCBpZiB0aGUgb2Zmc2V0IHN0cmluZyBjb250YWlucyBhIHBhaXIgb2YgdmFsdWVzIG9yIGEgc2luZ2xlIG9uZVxuICAvLyB0aGV5IGNvdWxkIGJlIHNlcGFyYXRlZCBieSBjb21tYSBvciBzcGFjZVxuICB2YXIgZGl2aWRlciA9IGZyYWdtZW50cy5pbmRleE9mKGZpbmQoZnJhZ21lbnRzLCBmdW5jdGlvbiAoZnJhZykge1xuICAgIHJldHVybiBmcmFnLnNlYXJjaCgvLHxcXHMvKSAhPT0gLTE7XG4gIH0pKTtcblxuICBpZiAoZnJhZ21lbnRzW2RpdmlkZXJdICYmIGZyYWdtZW50c1tkaXZpZGVyXS5pbmRleE9mKCcsJykgPT09IC0xKSB7XG4gICAgY29uc29sZS53YXJuKCdPZmZzZXRzIHNlcGFyYXRlZCBieSB3aGl0ZSBzcGFjZShzKSBhcmUgZGVwcmVjYXRlZCwgdXNlIGEgY29tbWEgKCwpIGluc3RlYWQuJyk7XG4gIH1cblxuICAvLyBJZiBkaXZpZGVyIGlzIGZvdW5kLCB3ZSBkaXZpZGUgdGhlIGxpc3Qgb2YgdmFsdWVzIGFuZCBvcGVyYW5kcyB0byBkaXZpZGVcbiAgLy8gdGhlbSBieSBvZnNldCBYIGFuZCBZLlxuICB2YXIgc3BsaXRSZWdleCA9IC9cXHMqLFxccyp8XFxzKy87XG4gIHZhciBvcHMgPSBkaXZpZGVyICE9PSAtMSA/IFtmcmFnbWVudHMuc2xpY2UoMCwgZGl2aWRlcikuY29uY2F0KFtmcmFnbWVudHNbZGl2aWRlcl0uc3BsaXQoc3BsaXRSZWdleClbMF1dKSwgW2ZyYWdtZW50c1tkaXZpZGVyXS5zcGxpdChzcGxpdFJlZ2V4KVsxXV0uY29uY2F0KGZyYWdtZW50cy5zbGljZShkaXZpZGVyICsgMSkpXSA6IFtmcmFnbWVudHNdO1xuXG4gIC8vIENvbnZlcnQgdGhlIHZhbHVlcyB3aXRoIHVuaXRzIHRvIGFic29sdXRlIHBpeGVscyB0byBhbGxvdyBvdXIgY29tcHV0YXRpb25zXG4gIG9wcyA9IG9wcy5tYXAoZnVuY3Rpb24gKG9wLCBpbmRleCkge1xuICAgIC8vIE1vc3Qgb2YgdGhlIHVuaXRzIHJlbHkgb24gdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBwb3BwZXJcbiAgICB2YXIgbWVhc3VyZW1lbnQgPSAoaW5kZXggPT09IDEgPyAhdXNlSGVpZ2h0IDogdXNlSGVpZ2h0KSA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICB2YXIgbWVyZ2VXaXRoUHJldmlvdXMgPSBmYWxzZTtcbiAgICByZXR1cm4gb3BcbiAgICAvLyBUaGlzIGFnZ3JlZ2F0ZXMgYW55IGArYCBvciBgLWAgc2lnbiB0aGF0IGFyZW4ndCBjb25zaWRlcmVkIG9wZXJhdG9yc1xuICAgIC8vIGUuZy46IDEwICsgKzUgPT4gWzEwLCArLCArNV1cbiAgICAucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICBpZiAoYVthLmxlbmd0aCAtIDFdID09PSAnJyAmJiBbJysnLCAnLSddLmluZGV4T2YoYikgIT09IC0xKSB7XG4gICAgICAgIGFbYS5sZW5ndGggLSAxXSA9IGI7XG4gICAgICAgIG1lcmdlV2l0aFByZXZpb3VzID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgICB9IGVsc2UgaWYgKG1lcmdlV2l0aFByZXZpb3VzKSB7XG4gICAgICAgIGFbYS5sZW5ndGggLSAxXSArPSBiO1xuICAgICAgICBtZXJnZVdpdGhQcmV2aW91cyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhLmNvbmNhdChiKTtcbiAgICAgIH1cbiAgICB9LCBbXSlcbiAgICAvLyBIZXJlIHdlIGNvbnZlcnQgdGhlIHN0cmluZyB2YWx1ZXMgaW50byBudW1iZXIgdmFsdWVzIChpbiBweClcbiAgICAubWFwKGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgIHJldHVybiB0b1ZhbHVlKHN0ciwgbWVhc3VyZW1lbnQsIHBvcHBlck9mZnNldHMsIHJlZmVyZW5jZU9mZnNldHMpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBMb29wIHRyb3VnaCB0aGUgb2Zmc2V0cyBhcnJheXMgYW5kIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbnNcbiAgb3BzLmZvckVhY2goZnVuY3Rpb24gKG9wLCBpbmRleCkge1xuICAgIG9wLmZvckVhY2goZnVuY3Rpb24gKGZyYWcsIGluZGV4Mikge1xuICAgICAgaWYgKGlzTnVtZXJpYyhmcmFnKSkge1xuICAgICAgICBvZmZzZXRzW2luZGV4XSArPSBmcmFnICogKG9wW2luZGV4MiAtIDFdID09PSAnLScgPyAtMSA6IDEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIG9mZnNldHM7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgTW9kaWZpZXJzXG4gKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgdXBkYXRlIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQGFyZ3VtZW50IHtOdW1iZXJ8U3RyaW5nfSBvcHRpb25zLm9mZnNldD0wXG4gKiBUaGUgb2Zmc2V0IHZhbHVlIGFzIGRlc2NyaWJlZCBpbiB0aGUgbW9kaWZpZXIgZGVzY3JpcHRpb25cbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gb2Zmc2V0KGRhdGEsIF9yZWYpIHtcbiAgdmFyIG9mZnNldCA9IF9yZWYub2Zmc2V0O1xuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQsXG4gICAgICBfZGF0YSRvZmZzZXRzID0gZGF0YS5vZmZzZXRzLFxuICAgICAgcG9wcGVyID0gX2RhdGEkb2Zmc2V0cy5wb3BwZXIsXG4gICAgICByZWZlcmVuY2UgPSBfZGF0YSRvZmZzZXRzLnJlZmVyZW5jZTtcblxuICB2YXIgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuXG4gIHZhciBvZmZzZXRzID0gdm9pZCAwO1xuICBpZiAoaXNOdW1lcmljKCtvZmZzZXQpKSB7XG4gICAgb2Zmc2V0cyA9IFsrb2Zmc2V0LCAwXTtcbiAgfSBlbHNlIHtcbiAgICBvZmZzZXRzID0gcGFyc2VPZmZzZXQob2Zmc2V0LCBwb3BwZXIsIHJlZmVyZW5jZSwgYmFzZVBsYWNlbWVudCk7XG4gIH1cblxuICBpZiAoYmFzZVBsYWNlbWVudCA9PT0gJ2xlZnQnKSB7XG4gICAgcG9wcGVyLnRvcCArPSBvZmZzZXRzWzBdO1xuICAgIHBvcHBlci5sZWZ0IC09IG9mZnNldHNbMV07XG4gIH0gZWxzZSBpZiAoYmFzZVBsYWNlbWVudCA9PT0gJ3JpZ2h0Jykge1xuICAgIHBvcHBlci50b3AgKz0gb2Zmc2V0c1swXTtcbiAgICBwb3BwZXIubGVmdCArPSBvZmZzZXRzWzFdO1xuICB9IGVsc2UgaWYgKGJhc2VQbGFjZW1lbnQgPT09ICd0b3AnKSB7XG4gICAgcG9wcGVyLmxlZnQgKz0gb2Zmc2V0c1swXTtcbiAgICBwb3BwZXIudG9wIC09IG9mZnNldHNbMV07XG4gIH0gZWxzZSBpZiAoYmFzZVBsYWNlbWVudCA9PT0gJ2JvdHRvbScpIHtcbiAgICBwb3BwZXIubGVmdCArPSBvZmZzZXRzWzBdO1xuICAgIHBvcHBlci50b3AgKz0gb2Zmc2V0c1sxXTtcbiAgfVxuXG4gIGRhdGEucG9wcGVyID0gcG9wcGVyO1xuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gcHJldmVudE92ZXJmbG93KGRhdGEsIG9wdGlvbnMpIHtcbiAgdmFyIGJvdW5kYXJpZXNFbGVtZW50ID0gb3B0aW9ucy5ib3VuZGFyaWVzRWxlbWVudCB8fCBnZXRPZmZzZXRQYXJlbnQoZGF0YS5pbnN0YW5jZS5wb3BwZXIpO1xuXG4gIC8vIElmIG9mZnNldFBhcmVudCBpcyB0aGUgcmVmZXJlbmNlIGVsZW1lbnQsIHdlIHJlYWxseSB3YW50IHRvXG4gIC8vIGdvIG9uZSBzdGVwIHVwIGFuZCB1c2UgdGhlIG5leHQgb2Zmc2V0UGFyZW50IGFzIHJlZmVyZW5jZSB0b1xuICAvLyBhdm9pZCB0byBtYWtlIHRoaXMgbW9kaWZpZXIgY29tcGxldGVseSB1c2VsZXNzIGFuZCBsb29rIGxpa2UgYnJva2VuXG4gIGlmIChkYXRhLmluc3RhbmNlLnJlZmVyZW5jZSA9PT0gYm91bmRhcmllc0VsZW1lbnQpIHtcbiAgICBib3VuZGFyaWVzRWxlbWVudCA9IGdldE9mZnNldFBhcmVudChib3VuZGFyaWVzRWxlbWVudCk7XG4gIH1cblxuICAvLyBOT1RFOiBET00gYWNjZXNzIGhlcmVcbiAgLy8gcmVzZXRzIHRoZSBwb3BwZXIncyBwb3NpdGlvbiBzbyB0aGF0IHRoZSBkb2N1bWVudCBzaXplIGNhbiBiZSBjYWxjdWxhdGVkIGV4Y2x1ZGluZ1xuICAvLyB0aGUgc2l6ZSBvZiB0aGUgcG9wcGVyIGVsZW1lbnQgaXRzZWxmXG4gIHZhciB0cmFuc2Zvcm1Qcm9wID0gZ2V0U3VwcG9ydGVkUHJvcGVydHlOYW1lKCd0cmFuc2Zvcm0nKTtcbiAgdmFyIHBvcHBlclN0eWxlcyA9IGRhdGEuaW5zdGFuY2UucG9wcGVyLnN0eWxlOyAvLyBhc3NpZ25tZW50IHRvIGhlbHAgbWluaWZpY2F0aW9uXG4gIHZhciB0b3AgPSBwb3BwZXJTdHlsZXMudG9wLFxuICAgICAgbGVmdCA9IHBvcHBlclN0eWxlcy5sZWZ0LFxuICAgICAgdHJhbnNmb3JtID0gcG9wcGVyU3R5bGVzW3RyYW5zZm9ybVByb3BdO1xuXG4gIHBvcHBlclN0eWxlcy50b3AgPSAnJztcbiAgcG9wcGVyU3R5bGVzLmxlZnQgPSAnJztcbiAgcG9wcGVyU3R5bGVzW3RyYW5zZm9ybVByb3BdID0gJyc7XG5cbiAgdmFyIGJvdW5kYXJpZXMgPSBnZXRCb3VuZGFyaWVzKGRhdGEuaW5zdGFuY2UucG9wcGVyLCBkYXRhLmluc3RhbmNlLnJlZmVyZW5jZSwgb3B0aW9ucy5wYWRkaW5nLCBib3VuZGFyaWVzRWxlbWVudCwgZGF0YS5wb3NpdGlvbkZpeGVkKTtcblxuICAvLyBOT1RFOiBET00gYWNjZXNzIGhlcmVcbiAgLy8gcmVzdG9yZXMgdGhlIG9yaWdpbmFsIHN0eWxlIHByb3BlcnRpZXMgYWZ0ZXIgdGhlIG9mZnNldHMgaGF2ZSBiZWVuIGNvbXB1dGVkXG4gIHBvcHBlclN0eWxlcy50b3AgPSB0b3A7XG4gIHBvcHBlclN0eWxlcy5sZWZ0ID0gbGVmdDtcbiAgcG9wcGVyU3R5bGVzW3RyYW5zZm9ybVByb3BdID0gdHJhbnNmb3JtO1xuXG4gIG9wdGlvbnMuYm91bmRhcmllcyA9IGJvdW5kYXJpZXM7XG5cbiAgdmFyIG9yZGVyID0gb3B0aW9ucy5wcmlvcml0eTtcbiAgdmFyIHBvcHBlciA9IGRhdGEub2Zmc2V0cy5wb3BwZXI7XG5cbiAgdmFyIGNoZWNrID0ge1xuICAgIHByaW1hcnk6IGZ1bmN0aW9uIHByaW1hcnkocGxhY2VtZW50KSB7XG4gICAgICB2YXIgdmFsdWUgPSBwb3BwZXJbcGxhY2VtZW50XTtcbiAgICAgIGlmIChwb3BwZXJbcGxhY2VtZW50XSA8IGJvdW5kYXJpZXNbcGxhY2VtZW50XSAmJiAhb3B0aW9ucy5lc2NhcGVXaXRoUmVmZXJlbmNlKSB7XG4gICAgICAgIHZhbHVlID0gTWF0aC5tYXgocG9wcGVyW3BsYWNlbWVudF0sIGJvdW5kYXJpZXNbcGxhY2VtZW50XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoe30sIHBsYWNlbWVudCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2Vjb25kYXJ5OiBmdW5jdGlvbiBzZWNvbmRhcnkocGxhY2VtZW50KSB7XG4gICAgICB2YXIgbWFpblNpZGUgPSBwbGFjZW1lbnQgPT09ICdyaWdodCcgPyAnbGVmdCcgOiAndG9wJztcbiAgICAgIHZhciB2YWx1ZSA9IHBvcHBlclttYWluU2lkZV07XG4gICAgICBpZiAocG9wcGVyW3BsYWNlbWVudF0gPiBib3VuZGFyaWVzW3BsYWNlbWVudF0gJiYgIW9wdGlvbnMuZXNjYXBlV2l0aFJlZmVyZW5jZSkge1xuICAgICAgICB2YWx1ZSA9IE1hdGgubWluKHBvcHBlclttYWluU2lkZV0sIGJvdW5kYXJpZXNbcGxhY2VtZW50XSAtIChwbGFjZW1lbnQgPT09ICdyaWdodCcgPyBwb3BwZXIud2lkdGggOiBwb3BwZXIuaGVpZ2h0KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoe30sIG1haW5TaWRlLCB2YWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIG9yZGVyLmZvckVhY2goZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHZhciBzaWRlID0gWydsZWZ0JywgJ3RvcCddLmluZGV4T2YocGxhY2VtZW50KSAhPT0gLTEgPyAncHJpbWFyeScgOiAnc2Vjb25kYXJ5JztcbiAgICBwb3BwZXIgPSBfZXh0ZW5kcyh7fSwgcG9wcGVyLCBjaGVja1tzaWRlXShwbGFjZW1lbnQpKTtcbiAgfSk7XG5cbiAgZGF0YS5vZmZzZXRzLnBvcHBlciA9IHBvcHBlcjtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2RcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBvcHRpb25zIC0gTW9kaWZpZXJzIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gc2hpZnQoZGF0YSkge1xuICB2YXIgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gIHZhciBzaGlmdHZhcmlhdGlvbiA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xuXG4gIC8vIGlmIHNoaWZ0IHNoaWZ0dmFyaWF0aW9uIGlzIHNwZWNpZmllZCwgcnVuIHRoZSBtb2RpZmllclxuICBpZiAoc2hpZnR2YXJpYXRpb24pIHtcbiAgICB2YXIgX2RhdGEkb2Zmc2V0cyA9IGRhdGEub2Zmc2V0cyxcbiAgICAgICAgcmVmZXJlbmNlID0gX2RhdGEkb2Zmc2V0cy5yZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlciA9IF9kYXRhJG9mZnNldHMucG9wcGVyO1xuXG4gICAgdmFyIGlzVmVydGljYWwgPSBbJ2JvdHRvbScsICd0b3AnXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcbiAgICB2YXIgc2lkZSA9IGlzVmVydGljYWwgPyAnbGVmdCcgOiAndG9wJztcbiAgICB2YXIgbWVhc3VyZW1lbnQgPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuXG4gICAgdmFyIHNoaWZ0T2Zmc2V0cyA9IHtcbiAgICAgIHN0YXJ0OiBkZWZpbmVQcm9wZXJ0eSh7fSwgc2lkZSwgcmVmZXJlbmNlW3NpZGVdKSxcbiAgICAgIGVuZDogZGVmaW5lUHJvcGVydHkoe30sIHNpZGUsIHJlZmVyZW5jZVtzaWRlXSArIHJlZmVyZW5jZVttZWFzdXJlbWVudF0gLSBwb3BwZXJbbWVhc3VyZW1lbnRdKVxuICAgIH07XG5cbiAgICBkYXRhLm9mZnNldHMucG9wcGVyID0gX2V4dGVuZHMoe30sIHBvcHBlciwgc2hpZnRPZmZzZXRzW3NoaWZ0dmFyaWF0aW9uXSk7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBNb2RpZmllcnNcbiAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSB1cGRhdGUgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGhpZGUoZGF0YSkge1xuICBpZiAoIWlzTW9kaWZpZXJSZXF1aXJlZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgJ2hpZGUnLCAncHJldmVudE92ZXJmbG93JykpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHZhciByZWZSZWN0ID0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZTtcbiAgdmFyIGJvdW5kID0gZmluZChkYXRhLmluc3RhbmNlLm1vZGlmaWVycywgZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgcmV0dXJuIG1vZGlmaWVyLm5hbWUgPT09ICdwcmV2ZW50T3ZlcmZsb3cnO1xuICB9KS5ib3VuZGFyaWVzO1xuXG4gIGlmIChyZWZSZWN0LmJvdHRvbSA8IGJvdW5kLnRvcCB8fCByZWZSZWN0LmxlZnQgPiBib3VuZC5yaWdodCB8fCByZWZSZWN0LnRvcCA+IGJvdW5kLmJvdHRvbSB8fCByZWZSZWN0LnJpZ2h0IDwgYm91bmQubGVmdCkge1xuICAgIC8vIEF2b2lkIHVubmVjZXNzYXJ5IERPTSBhY2Nlc3MgaWYgdmlzaWJpbGl0eSBoYXNuJ3QgY2hhbmdlZFxuICAgIGlmIChkYXRhLmhpZGUgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGRhdGEuaGlkZSA9IHRydWU7XG4gICAgZGF0YS5hdHRyaWJ1dGVzWyd4LW91dC1vZi1ib3VuZGFyaWVzJ10gPSAnJztcbiAgfSBlbHNlIHtcbiAgICAvLyBBdm9pZCB1bm5lY2Vzc2FyeSBET00gYWNjZXNzIGlmIHZpc2liaWxpdHkgaGFzbid0IGNoYW5nZWRcbiAgICBpZiAoZGF0YS5oaWRlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgZGF0YS5oaWRlID0gZmFsc2U7XG4gICAgZGF0YS5hdHRyaWJ1dGVzWyd4LW91dC1vZi1ib3VuZGFyaWVzJ10gPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIE1vZGlmaWVyc1xuICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZFxuICogQGFyZ3VtZW50IHtPYmplY3R9IG9wdGlvbnMgLSBNb2RpZmllcnMgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5mdW5jdGlvbiBpbm5lcihkYXRhKSB7XG4gIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgdmFyIF9kYXRhJG9mZnNldHMgPSBkYXRhLm9mZnNldHMsXG4gICAgICBwb3BwZXIgPSBfZGF0YSRvZmZzZXRzLnBvcHBlcixcbiAgICAgIHJlZmVyZW5jZSA9IF9kYXRhJG9mZnNldHMucmVmZXJlbmNlO1xuXG4gIHZhciBpc0hvcml6ID0gWydsZWZ0JywgJ3JpZ2h0J10uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgdmFyIHN1YnRyYWN0TGVuZ3RoID0gWyd0b3AnLCAnbGVmdCddLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPT09IC0xO1xuXG4gIHBvcHBlcltpc0hvcml6ID8gJ2xlZnQnIDogJ3RvcCddID0gcmVmZXJlbmNlW2Jhc2VQbGFjZW1lbnRdIC0gKHN1YnRyYWN0TGVuZ3RoID8gcG9wcGVyW2lzSG9yaXogPyAnd2lkdGgnIDogJ2hlaWdodCddIDogMCk7XG5cbiAgZGF0YS5wbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICBkYXRhLm9mZnNldHMucG9wcGVyID0gZ2V0Q2xpZW50UmVjdChwb3BwZXIpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIE1vZGlmaWVyIGZ1bmN0aW9uLCBlYWNoIG1vZGlmaWVyIGNhbiBoYXZlIGEgZnVuY3Rpb24gb2YgdGhpcyB0eXBlIGFzc2lnbmVkXG4gKiB0byBpdHMgYGZuYCBwcm9wZXJ0eS48YnIgLz5cbiAqIFRoZXNlIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIHVwZGF0ZSwgdGhpcyBtZWFucyB0aGF0IHlvdSBtdXN0XG4gKiBtYWtlIHN1cmUgdGhleSBhcmUgcGVyZm9ybWFudCBlbm91Z2ggdG8gYXZvaWQgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MuXG4gKlxuICogQGZ1bmN0aW9uIE1vZGlmaWVyRm5cbiAqIEBhcmd1bWVudCB7ZGF0YU9iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kXG4gKiBAYXJndW1lbnQge09iamVjdH0gb3B0aW9ucyAtIE1vZGlmaWVycyBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25zXG4gKiBAcmV0dXJucyB7ZGF0YU9iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZFxuICovXG5cbi8qKlxuICogTW9kaWZpZXJzIGFyZSBwbHVnaW5zIHVzZWQgdG8gYWx0ZXIgdGhlIGJlaGF2aW9yIG9mIHlvdXIgcG9wcGVycy48YnIgLz5cbiAqIFBvcHBlci5qcyB1c2VzIGEgc2V0IG9mIDkgbW9kaWZpZXJzIHRvIHByb3ZpZGUgYWxsIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXRpZXNcbiAqIG5lZWRlZCBieSB0aGUgbGlicmFyeS5cbiAqXG4gKiBVc3VhbGx5IHlvdSBkb24ndCB3YW50IHRvIG92ZXJyaWRlIHRoZSBgb3JkZXJgLCBgZm5gIGFuZCBgb25Mb2FkYCBwcm9wcy5cbiAqIEFsbCB0aGUgb3RoZXIgcHJvcGVydGllcyBhcmUgY29uZmlndXJhdGlvbnMgdGhhdCBjb3VsZCBiZSB0d2Vha2VkLlxuICogQG5hbWVzcGFjZSBtb2RpZmllcnNcbiAqL1xudmFyIG1vZGlmaWVycyA9IHtcbiAgLyoqXG4gICAqIE1vZGlmaWVyIHVzZWQgdG8gc2hpZnQgdGhlIHBvcHBlciBvbiB0aGUgc3RhcnQgb3IgZW5kIG9mIGl0cyByZWZlcmVuY2VcbiAgICogZWxlbWVudC48YnIgLz5cbiAgICogSXQgd2lsbCByZWFkIHRoZSB2YXJpYXRpb24gb2YgdGhlIGBwbGFjZW1lbnRgIHByb3BlcnR5LjxiciAvPlxuICAgKiBJdCBjYW4gYmUgb25lIGVpdGhlciBgLWVuZGAgb3IgYC1zdGFydGAuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBzaGlmdDoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj0xMDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDEwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IHNoaWZ0XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRoZSBgb2Zmc2V0YCBtb2RpZmllciBjYW4gc2hpZnQgeW91ciBwb3BwZXIgb24gYm90aCBpdHMgYXhpcy5cbiAgICpcbiAgICogSXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHVuaXRzOlxuICAgKiAtIGBweGAgb3IgdW5pdC1sZXNzLCBpbnRlcnByZXRlZCBhcyBwaXhlbHNcbiAgICogLSBgJWAgb3IgYCVyYCwgcGVyY2VudGFnZSByZWxhdGl2ZSB0byB0aGUgbGVuZ3RoIG9mIHRoZSByZWZlcmVuY2UgZWxlbWVudFxuICAgKiAtIGAlcGAsIHBlcmNlbnRhZ2UgcmVsYXRpdmUgdG8gdGhlIGxlbmd0aCBvZiB0aGUgcG9wcGVyIGVsZW1lbnRcbiAgICogLSBgdndgLCBDU1Mgdmlld3BvcnQgd2lkdGggdW5pdFxuICAgKiAtIGB2aGAsIENTUyB2aWV3cG9ydCBoZWlnaHQgdW5pdFxuICAgKlxuICAgKiBGb3IgbGVuZ3RoIGlzIGludGVuZGVkIHRoZSBtYWluIGF4aXMgcmVsYXRpdmUgdG8gdGhlIHBsYWNlbWVudCBvZiB0aGUgcG9wcGVyLjxiciAvPlxuICAgKiBUaGlzIG1lYW5zIHRoYXQgaWYgdGhlIHBsYWNlbWVudCBpcyBgdG9wYCBvciBgYm90dG9tYCwgdGhlIGxlbmd0aCB3aWxsIGJlIHRoZVxuICAgKiBgd2lkdGhgLiBJbiBjYXNlIG9mIGBsZWZ0YCBvciBgcmlnaHRgLCBpdCB3aWxsIGJlIHRoZSBgaGVpZ2h0YC5cbiAgICpcbiAgICogWW91IGNhbiBwcm92aWRlIGEgc2luZ2xlIHZhbHVlIChhcyBgTnVtYmVyYCBvciBgU3RyaW5nYCksIG9yIGEgcGFpciBvZiB2YWx1ZXNcbiAgICogYXMgYFN0cmluZ2AgZGl2aWRlZCBieSBhIGNvbW1hIG9yIG9uZSAob3IgbW9yZSkgd2hpdGUgc3BhY2VzLjxiciAvPlxuICAgKiBUaGUgbGF0dGVyIGlzIGEgZGVwcmVjYXRlZCBtZXRob2QgYmVjYXVzZSBpdCBsZWFkcyB0byBjb25mdXNpb24gYW5kIHdpbGwgYmVcbiAgICogcmVtb3ZlZCBpbiB2Mi48YnIgLz5cbiAgICogQWRkaXRpb25hbGx5LCBpdCBhY2NlcHRzIGFkZGl0aW9ucyBhbmQgc3VidHJhY3Rpb25zIGJldHdlZW4gZGlmZmVyZW50IHVuaXRzLlxuICAgKiBOb3RlIHRoYXQgbXVsdGlwbGljYXRpb25zIGFuZCBkaXZpc2lvbnMgYXJlbid0IHN1cHBvcnRlZC5cbiAgICpcbiAgICogVmFsaWQgZXhhbXBsZXMgYXJlOlxuICAgKiBgYGBcbiAgICogMTBcbiAgICogJzEwJSdcbiAgICogJzEwLCAxMCdcbiAgICogJzEwJSwgMTAnXG4gICAqICcxMCArIDEwJSdcbiAgICogJzEwIC0gNXZoICsgMyUnXG4gICAqICctMTBweCArIDV2aCwgNXB4IC0gNiUnXG4gICAqIGBgYFxuICAgKiA+ICoqTkIqKjogSWYgeW91IGRlc2lyZSB0byBhcHBseSBvZmZzZXRzIHRvIHlvdXIgcG9wcGVycyBpbiBhIHdheSB0aGF0IG1heSBtYWtlIHRoZW0gb3ZlcmxhcFxuICAgKiA+IHdpdGggdGhlaXIgcmVmZXJlbmNlIGVsZW1lbnQsIHVuZm9ydHVuYXRlbHksIHlvdSB3aWxsIGhhdmUgdG8gZGlzYWJsZSB0aGUgYGZsaXBgIG1vZGlmaWVyLlxuICAgKiA+IFlvdSBjYW4gcmVhZCBtb3JlIG9uIHRoaXMgYXQgdGhpcyBbaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9GZXpWcmFzdGEvcG9wcGVyLmpzL2lzc3Vlcy8zNzMpLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgb2Zmc2V0OiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTIwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogMjAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogb2Zmc2V0LFxuICAgIC8qKiBAcHJvcCB7TnVtYmVyfFN0cmluZ30gb2Zmc2V0PTBcbiAgICAgKiBUaGUgb2Zmc2V0IHZhbHVlIGFzIGRlc2NyaWJlZCBpbiB0aGUgbW9kaWZpZXIgZGVzY3JpcHRpb25cbiAgICAgKi9cbiAgICBvZmZzZXQ6IDBcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBwcmV2ZW50IHRoZSBwb3BwZXIgZnJvbSBiZWluZyBwb3NpdGlvbmVkIG91dHNpZGUgdGhlIGJvdW5kYXJ5LlxuICAgKlxuICAgKiBBIHNjZW5hcmlvIGV4aXN0cyB3aGVyZSB0aGUgcmVmZXJlbmNlIGl0c2VsZiBpcyBub3Qgd2l0aGluIHRoZSBib3VuZGFyaWVzLjxiciAvPlxuICAgKiBXZSBjYW4gc2F5IGl0IGhhcyBcImVzY2FwZWQgdGhlIGJvdW5kYXJpZXNcIiDigJQgb3IganVzdCBcImVzY2FwZWRcIi48YnIgLz5cbiAgICogSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHBvcHBlciBzaG91bGQgZWl0aGVyOlxuICAgKlxuICAgKiAtIGRldGFjaCBmcm9tIHRoZSByZWZlcmVuY2UgYW5kIHJlbWFpbiBcInRyYXBwZWRcIiBpbiB0aGUgYm91bmRhcmllcywgb3JcbiAgICogLSBpZiBpdCBzaG91bGQgaWdub3JlIHRoZSBib3VuZGFyeSBhbmQgXCJlc2NhcGUgd2l0aCBpdHMgcmVmZXJlbmNlXCJcbiAgICpcbiAgICogV2hlbiBgZXNjYXBlV2l0aFJlZmVyZW5jZWAgaXMgc2V0IHRvYHRydWVgIGFuZCByZWZlcmVuY2UgaXMgY29tcGxldGVseVxuICAgKiBvdXRzaWRlIGl0cyBib3VuZGFyaWVzLCB0aGUgcG9wcGVyIHdpbGwgb3ZlcmZsb3cgKG9yIGNvbXBsZXRlbHkgbGVhdmUpXG4gICAqIHRoZSBib3VuZGFyaWVzIGluIG9yZGVyIHRvIHJlbWFpbiBhdHRhY2hlZCB0byB0aGUgZWRnZSBvZiB0aGUgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAgcHJldmVudE92ZXJmbG93OiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTMwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogMzAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogcHJldmVudE92ZXJmbG93LFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtBcnJheX0gW3ByaW9yaXR5PVsnbGVmdCcsJ3JpZ2h0JywndG9wJywnYm90dG9tJ11dXG4gICAgICogUG9wcGVyIHdpbGwgdHJ5IHRvIHByZXZlbnQgb3ZlcmZsb3cgZm9sbG93aW5nIHRoZXNlIHByaW9yaXRpZXMgYnkgZGVmYXVsdCxcbiAgICAgKiB0aGVuLCBpdCBjb3VsZCBvdmVyZmxvdyBvbiB0aGUgbGVmdCBhbmQgb24gdG9wIG9mIHRoZSBgYm91bmRhcmllc0VsZW1lbnRgXG4gICAgICovXG4gICAgcHJpb3JpdHk6IFsnbGVmdCcsICdyaWdodCcsICd0b3AnLCAnYm90dG9tJ10sXG4gICAgLyoqXG4gICAgICogQHByb3Age251bWJlcn0gcGFkZGluZz01XG4gICAgICogQW1vdW50IG9mIHBpeGVsIHVzZWQgdG8gZGVmaW5lIGEgbWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3VuZGFyaWVzXG4gICAgICogYW5kIHRoZSBwb3BwZXIuIFRoaXMgbWFrZXMgc3VyZSB0aGUgcG9wcGVyIGFsd2F5cyBoYXMgYSBsaXR0bGUgcGFkZGluZ1xuICAgICAqIGJldHdlZW4gdGhlIGVkZ2VzIG9mIGl0cyBjb250YWluZXJcbiAgICAgKi9cbiAgICBwYWRkaW5nOiA1LFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtTdHJpbmd8SFRNTEVsZW1lbnR9IGJvdW5kYXJpZXNFbGVtZW50PSdzY3JvbGxQYXJlbnQnXG4gICAgICogQm91bmRhcmllcyB1c2VkIGJ5IHRoZSBtb2RpZmllci4gQ2FuIGJlIGBzY3JvbGxQYXJlbnRgLCBgd2luZG93YCxcbiAgICAgKiBgdmlld3BvcnRgIG9yIGFueSBET00gZWxlbWVudC5cbiAgICAgKi9cbiAgICBib3VuZGFyaWVzRWxlbWVudDogJ3Njcm9sbFBhcmVudCdcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBtYWtlIHN1cmUgdGhlIHJlZmVyZW5jZSBhbmQgaXRzIHBvcHBlciBzdGF5IG5lYXIgZWFjaCBvdGhlclxuICAgKiB3aXRob3V0IGxlYXZpbmcgYW55IGdhcCBiZXR3ZWVuIHRoZSB0d28uIEVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gdGhlIGFycm93IGlzXG4gICAqIGVuYWJsZWQgYW5kIHlvdSB3YW50IHRvIGVuc3VyZSB0aGF0IGl0IHBvaW50cyB0byBpdHMgcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqIEl0IGNhcmVzIG9ubHkgYWJvdXQgdGhlIGZpcnN0IGF4aXMuIFlvdSBjYW4gc3RpbGwgaGF2ZSBwb3BwZXJzIHdpdGggbWFyZ2luXG4gICAqIGJldHdlZW4gdGhlIHBvcHBlciBhbmQgaXRzIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKiBAbWVtYmVyb2YgbW9kaWZpZXJzXG4gICAqIEBpbm5lclxuICAgKi9cbiAga2VlcFRvZ2V0aGVyOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTQwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogNDAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjoga2VlcFRvZ2V0aGVyXG4gIH0sXG5cbiAgLyoqXG4gICAqIFRoaXMgbW9kaWZpZXIgaXMgdXNlZCB0byBtb3ZlIHRoZSBgYXJyb3dFbGVtZW50YCBvZiB0aGUgcG9wcGVyIHRvIG1ha2VcbiAgICogc3VyZSBpdCBpcyBwb3NpdGlvbmVkIGJldHdlZW4gdGhlIHJlZmVyZW5jZSBlbGVtZW50IGFuZCBpdHMgcG9wcGVyIGVsZW1lbnQuXG4gICAqIEl0IHdpbGwgcmVhZCB0aGUgb3V0ZXIgc2l6ZSBvZiB0aGUgYGFycm93RWxlbWVudGAgbm9kZSB0byBkZXRlY3QgaG93IG1hbnlcbiAgICogcGl4ZWxzIG9mIGNvbmp1bmN0aW9uIGFyZSBuZWVkZWQuXG4gICAqXG4gICAqIEl0IGhhcyBubyBlZmZlY3QgaWYgbm8gYGFycm93RWxlbWVudGAgaXMgcHJvdmlkZWQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBhcnJvdzoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj01MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDUwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGFycm93LFxuICAgIC8qKiBAcHJvcCB7U3RyaW5nfEhUTUxFbGVtZW50fSBlbGVtZW50PSdbeC1hcnJvd10nIC0gU2VsZWN0b3Igb3Igbm9kZSB1c2VkIGFzIGFycm93ICovXG4gICAgZWxlbWVudDogJ1t4LWFycm93XSdcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBmbGlwIHRoZSBwb3BwZXIncyBwbGFjZW1lbnQgd2hlbiBpdCBzdGFydHMgdG8gb3ZlcmxhcCBpdHNcbiAgICogcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqXG4gICAqIFJlcXVpcmVzIHRoZSBgcHJldmVudE92ZXJmbG93YCBtb2RpZmllciBiZWZvcmUgaXQgaW4gb3JkZXIgdG8gd29yay5cbiAgICpcbiAgICogKipOT1RFOioqIHRoaXMgbW9kaWZpZXIgd2lsbCBpbnRlcnJ1cHQgdGhlIGN1cnJlbnQgdXBkYXRlIGN5Y2xlIGFuZCB3aWxsXG4gICAqIHJlc3RhcnQgaXQgaWYgaXQgZGV0ZWN0cyB0aGUgbmVlZCB0byBmbGlwIHRoZSBwbGFjZW1lbnQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBmbGlwOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTYwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogNjAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogZmxpcCxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7U3RyaW5nfEFycmF5fSBiZWhhdmlvcj0nZmxpcCdcbiAgICAgKiBUaGUgYmVoYXZpb3IgdXNlZCB0byBjaGFuZ2UgdGhlIHBvcHBlcidzIHBsYWNlbWVudC4gSXQgY2FuIGJlIG9uZSBvZlxuICAgICAqIGBmbGlwYCwgYGNsb2Nrd2lzZWAsIGBjb3VudGVyY2xvY2t3aXNlYCBvciBhbiBhcnJheSB3aXRoIGEgbGlzdCBvZiB2YWxpZFxuICAgICAqIHBsYWNlbWVudHMgKHdpdGggb3B0aW9uYWwgdmFyaWF0aW9ucylcbiAgICAgKi9cbiAgICBiZWhhdmlvcjogJ2ZsaXAnLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtudW1iZXJ9IHBhZGRpbmc9NVxuICAgICAqIFRoZSBwb3BwZXIgd2lsbCBmbGlwIGlmIGl0IGhpdHMgdGhlIGVkZ2VzIG9mIHRoZSBgYm91bmRhcmllc0VsZW1lbnRgXG4gICAgICovXG4gICAgcGFkZGluZzogNSxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7U3RyaW5nfEhUTUxFbGVtZW50fSBib3VuZGFyaWVzRWxlbWVudD0ndmlld3BvcnQnXG4gICAgICogVGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBkZWZpbmUgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHBvcHBlciBwb3NpdGlvbi5cbiAgICAgKiBUaGUgcG9wcGVyIHdpbGwgbmV2ZXIgYmUgcGxhY2VkIG91dHNpZGUgb2YgdGhlIGRlZmluZWQgYm91bmRhcmllc1xuICAgICAqIChleGNlcHQgaWYgYGtlZXBUb2dldGhlcmAgaXMgZW5hYmxlZClcbiAgICAgKi9cbiAgICBib3VuZGFyaWVzRWxlbWVudDogJ3ZpZXdwb3J0JyxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7Qm9vbGVhbn0gZmxpcFZhcmlhdGlvbnM9ZmFsc2VcbiAgICAgKiBUaGUgcG9wcGVyIHdpbGwgc3dpdGNoIHBsYWNlbWVudCB2YXJpYXRpb24gYmV0d2VlbiBgLXN0YXJ0YCBhbmQgYC1lbmRgIHdoZW5cbiAgICAgKiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgb3ZlcmxhcHMgaXRzIGJvdW5kYXJpZXMuXG4gICAgICpcbiAgICAgKiBUaGUgb3JpZ2luYWwgcGxhY2VtZW50IHNob3VsZCBoYXZlIGEgc2V0IHZhcmlhdGlvbi5cbiAgICAgKi9cbiAgICBmbGlwVmFyaWF0aW9uczogZmFsc2UsXG4gICAgLyoqXG4gICAgICogQHByb3Age0Jvb2xlYW59IGZsaXBWYXJpYXRpb25zQnlDb250ZW50PWZhbHNlXG4gICAgICogVGhlIHBvcHBlciB3aWxsIHN3aXRjaCBwbGFjZW1lbnQgdmFyaWF0aW9uIGJldHdlZW4gYC1zdGFydGAgYW5kIGAtZW5kYCB3aGVuXG4gICAgICogdGhlIHBvcHBlciBlbGVtZW50IG92ZXJsYXBzIGl0cyByZWZlcmVuY2UgYm91bmRhcmllcy5cbiAgICAgKlxuICAgICAqIFRoZSBvcmlnaW5hbCBwbGFjZW1lbnQgc2hvdWxkIGhhdmUgYSBzZXQgdmFyaWF0aW9uLlxuICAgICAqL1xuICAgIGZsaXBWYXJpYXRpb25zQnlDb250ZW50OiBmYWxzZVxuICB9LFxuXG4gIC8qKlxuICAgKiBNb2RpZmllciB1c2VkIHRvIG1ha2UgdGhlIHBvcHBlciBmbG93IHRvd2FyZCB0aGUgaW5uZXIgb2YgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICAgKiBCeSBkZWZhdWx0LCB3aGVuIHRoaXMgbW9kaWZpZXIgaXMgZGlzYWJsZWQsIHRoZSBwb3BwZXIgd2lsbCBiZSBwbGFjZWQgb3V0c2lkZVxuICAgKiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBpbm5lcjoge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj03MDAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDcwMCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9ZmFsc2UgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogaW5uZXJcbiAgfSxcblxuICAvKipcbiAgICogTW9kaWZpZXIgdXNlZCB0byBoaWRlIHRoZSBwb3BwZXIgd2hlbiBpdHMgcmVmZXJlbmNlIGVsZW1lbnQgaXMgb3V0c2lkZSBvZiB0aGVcbiAgICogcG9wcGVyIGJvdW5kYXJpZXMuIEl0IHdpbGwgc2V0IGEgYHgtb3V0LW9mLWJvdW5kYXJpZXNgIGF0dHJpYnV0ZSB3aGljaCBjYW5cbiAgICogYmUgdXNlZCB0byBoaWRlIHdpdGggYSBDU1Mgc2VsZWN0b3IgdGhlIHBvcHBlciB3aGVuIGl0cyByZWZlcmVuY2UgaXNcbiAgICogb3V0IG9mIGJvdW5kYXJpZXMuXG4gICAqXG4gICAqIFJlcXVpcmVzIHRoZSBgcHJldmVudE92ZXJmbG93YCBtb2RpZmllciBiZWZvcmUgaXQgaW4gb3JkZXIgdG8gd29yay5cbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGhpZGU6IHtcbiAgICAvKiogQHByb3Age251bWJlcn0gb3JkZXI9ODAwIC0gSW5kZXggdXNlZCB0byBkZWZpbmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiAqL1xuICAgIG9yZGVyOiA4MDAsXG4gICAgLyoqIEBwcm9wIHtCb29sZWFufSBlbmFibGVkPXRydWUgLSBXaGV0aGVyIHRoZSBtb2RpZmllciBpcyBlbmFibGVkIG9yIG5vdCAqL1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgLyoqIEBwcm9wIHtNb2RpZmllckZufSAqL1xuICAgIGZuOiBoaWRlXG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBzdHlsZSB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyIGVsZW1lbnQgdG8gZ2V0c1xuICAgKiBwcm9wZXJseSBwb3NpdGlvbmVkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBtb2RpZmllciB3aWxsIG5vdCB0b3VjaCB0aGUgRE9NLCBpdCBqdXN0IHByZXBhcmVzIHRoZSBzdHlsZXNcbiAgICogc28gdGhhdCBgYXBwbHlTdHlsZWAgbW9kaWZpZXIgY2FuIGFwcGx5IGl0LiBUaGlzIHNlcGFyYXRpb24gaXMgdXNlZnVsXG4gICAqIGluIGNhc2UgeW91IG5lZWQgdG8gcmVwbGFjZSBgYXBwbHlTdHlsZWAgd2l0aCBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogVGhpcyBtb2RpZmllciBoYXMgYDg1MGAgYXMgYG9yZGVyYCB2YWx1ZSB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAqIHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YgUG9wcGVyLmpzLiBFeHBlY3QgdGhlIG1vZGlmaWVycyBvcmRlcmluZyBtZXRob2RcbiAgICogdG8gY2hhbmdlIGluIGZ1dHVyZSBtYWpvciB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS5cbiAgICpcbiAgICogQG1lbWJlcm9mIG1vZGlmaWVyc1xuICAgKiBAaW5uZXJcbiAgICovXG4gIGNvbXB1dGVTdHlsZToge1xuICAgIC8qKiBAcHJvcCB7bnVtYmVyfSBvcmRlcj04NTAgLSBJbmRleCB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uICovXG4gICAgb3JkZXI6IDg1MCxcbiAgICAvKiogQHByb3Age0Jvb2xlYW59IGVuYWJsZWQ9dHJ1ZSAtIFdoZXRoZXIgdGhlIG1vZGlmaWVyIGlzIGVuYWJsZWQgb3Igbm90ICovXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvKiogQHByb3Age01vZGlmaWVyRm59ICovXG4gICAgZm46IGNvbXB1dGVTdHlsZSxcbiAgICAvKipcbiAgICAgKiBAcHJvcCB7Qm9vbGVhbn0gZ3B1QWNjZWxlcmF0aW9uPXRydWVcbiAgICAgKiBJZiB0cnVlLCBpdCB1c2VzIHRoZSBDU1MgM0QgdHJhbnNmb3JtYXRpb24gdG8gcG9zaXRpb24gdGhlIHBvcHBlci5cbiAgICAgKiBPdGhlcndpc2UsIGl0IHdpbGwgdXNlIHRoZSBgdG9wYCBhbmQgYGxlZnRgIHByb3BlcnRpZXNcbiAgICAgKi9cbiAgICBncHVBY2NlbGVyYXRpb246IHRydWUsXG4gICAgLyoqXG4gICAgICogQHByb3Age3N0cmluZ30gW3g9J2JvdHRvbSddXG4gICAgICogV2hlcmUgdG8gYW5jaG9yIHRoZSBYIGF4aXMgKGBib3R0b21gIG9yIGB0b3BgKS4gQUtBIFggb2Zmc2V0IG9yaWdpbi5cbiAgICAgKiBDaGFuZ2UgdGhpcyBpZiB5b3VyIHBvcHBlciBzaG91bGQgZ3JvdyBpbiBhIGRpcmVjdGlvbiBkaWZmZXJlbnQgZnJvbSBgYm90dG9tYFxuICAgICAqL1xuICAgIHg6ICdib3R0b20nLFxuICAgIC8qKlxuICAgICAqIEBwcm9wIHtzdHJpbmd9IFt4PSdsZWZ0J11cbiAgICAgKiBXaGVyZSB0byBhbmNob3IgdGhlIFkgYXhpcyAoYGxlZnRgIG9yIGByaWdodGApLiBBS0EgWSBvZmZzZXQgb3JpZ2luLlxuICAgICAqIENoYW5nZSB0aGlzIGlmIHlvdXIgcG9wcGVyIHNob3VsZCBncm93IGluIGEgZGlyZWN0aW9uIGRpZmZlcmVudCBmcm9tIGByaWdodGBcbiAgICAgKi9cbiAgICB5OiAncmlnaHQnXG4gIH0sXG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGNvbXB1dGVkIHN0eWxlcyB0byB0aGUgcG9wcGVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEFsbCB0aGUgRE9NIG1hbmlwdWxhdGlvbnMgYXJlIGxpbWl0ZWQgdG8gdGhpcyBtb2RpZmllci4gVGhpcyBpcyB1c2VmdWwgaW4gY2FzZVxuICAgKiB5b3Ugd2FudCB0byBpbnRlZ3JhdGUgUG9wcGVyLmpzIGluc2lkZSBhIGZyYW1ld29yayBvciB2aWV3IGxpYnJhcnkgYW5kIHlvdVxuICAgKiB3YW50IHRvIGRlbGVnYXRlIGFsbCB0aGUgRE9NIG1hbmlwdWxhdGlvbnMgdG8gaXQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBpZiB5b3UgZGlzYWJsZSB0aGlzIG1vZGlmaWVyLCB5b3UgbXVzdCBtYWtlIHN1cmUgdGhlIHBvcHBlciBlbGVtZW50XG4gICAqIGhhcyBpdHMgcG9zaXRpb24gc2V0IHRvIGBhYnNvbHV0ZWAgYmVmb3JlIFBvcHBlci5qcyBjYW4gZG8gaXRzIHdvcmshXG4gICAqXG4gICAqIEp1c3QgZGlzYWJsZSB0aGlzIG1vZGlmaWVyIGFuZCBkZWZpbmUgeW91ciBvd24gdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCBlZmZlY3QuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBtb2RpZmllcnNcbiAgICogQGlubmVyXG4gICAqL1xuICBhcHBseVN0eWxlOiB7XG4gICAgLyoqIEBwcm9wIHtudW1iZXJ9IG9yZGVyPTkwMCAtIEluZGV4IHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiBleGVjdXRpb24gKi9cbiAgICBvcmRlcjogOTAwLFxuICAgIC8qKiBAcHJvcCB7Qm9vbGVhbn0gZW5hYmxlZD10cnVlIC0gV2hldGhlciB0aGUgbW9kaWZpZXIgaXMgZW5hYmxlZCBvciBub3QgKi9cbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8qKiBAcHJvcCB7TW9kaWZpZXJGbn0gKi9cbiAgICBmbjogYXBwbHlTdHlsZSxcbiAgICAvKiogQHByb3Age0Z1bmN0aW9ufSAqL1xuICAgIG9uTG9hZDogYXBwbHlTdHlsZU9uTG9hZCxcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDEuMTAuMCwgdGhlIHByb3BlcnR5IG1vdmVkIHRvIGBjb21wdXRlU3R5bGVgIG1vZGlmaWVyXG4gICAgICogQHByb3Age0Jvb2xlYW59IGdwdUFjY2VsZXJhdGlvbj10cnVlXG4gICAgICogSWYgdHJ1ZSwgaXQgdXNlcyB0aGUgQ1NTIDNEIHRyYW5zZm9ybWF0aW9uIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXIuXG4gICAgICogT3RoZXJ3aXNlLCBpdCB3aWxsIHVzZSB0aGUgYHRvcGAgYW5kIGBsZWZ0YCBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgZ3B1QWNjZWxlcmF0aW9uOiB1bmRlZmluZWRcbiAgfVxufTtcblxuLyoqXG4gKiBUaGUgYGRhdGFPYmplY3RgIGlzIGFuIG9iamVjdCBjb250YWluaW5nIGFsbCB0aGUgaW5mb3JtYXRpb24gdXNlZCBieSBQb3BwZXIuanMuXG4gKiBUaGlzIG9iamVjdCBpcyBwYXNzZWQgdG8gbW9kaWZpZXJzIGFuZCB0byB0aGUgYG9uQ3JlYXRlYCBhbmQgYG9uVXBkYXRlYCBjYWxsYmFja3MuXG4gKiBAbmFtZSBkYXRhT2JqZWN0XG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5pbnN0YW5jZSBUaGUgUG9wcGVyLmpzIGluc3RhbmNlXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZGF0YS5wbGFjZW1lbnQgUGxhY2VtZW50IGFwcGxpZWQgdG8gcG9wcGVyXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZGF0YS5vcmlnaW5hbFBsYWNlbWVudCBQbGFjZW1lbnQgb3JpZ2luYWxseSBkZWZpbmVkIG9uIGluaXRcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZGF0YS5mbGlwcGVkIFRydWUgaWYgcG9wcGVyIGhhcyBiZWVuIGZsaXBwZWQgYnkgZmxpcCBtb2RpZmllclxuICogQHByb3BlcnR5IHtCb29sZWFufSBkYXRhLmhpZGUgVHJ1ZSBpZiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgaXMgb3V0IG9mIGJvdW5kYXJpZXMsIHVzZWZ1bCB0byBrbm93IHdoZW4gdG8gaGlkZSB0aGUgcG9wcGVyXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBkYXRhLmFycm93RWxlbWVudCBOb2RlIHVzZWQgYXMgYXJyb3cgYnkgYXJyb3cgbW9kaWZpZXJcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLnN0eWxlcyBBbnkgQ1NTIHByb3BlcnR5IGRlZmluZWQgaGVyZSB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlci4gSXQgZXhwZWN0cyB0aGUgSmF2YVNjcmlwdCBub21lbmNsYXR1cmUgKGVnLiBgbWFyZ2luQm90dG9tYClcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLmFycm93U3R5bGVzIEFueSBDU1MgcHJvcGVydHkgZGVmaW5lZCBoZXJlIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyIGFycm93LiBJdCBleHBlY3RzIHRoZSBKYXZhU2NyaXB0IG5vbWVuY2xhdHVyZSAoZWcuIGBtYXJnaW5Cb3R0b21gKVxuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEuYm91bmRhcmllcyBPZmZzZXRzIG9mIHRoZSBwb3BwZXIgYm91bmRhcmllc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEub2Zmc2V0cyBUaGUgbWVhc3VyZW1lbnRzIG9mIHBvcHBlciwgcmVmZXJlbmNlIGFuZCBhcnJvdyBlbGVtZW50c1xuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEub2Zmc2V0cy5wb3BwZXIgYHRvcGAsIGBsZWZ0YCwgYHdpZHRoYCwgYGhlaWdodGAgdmFsdWVzXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZSBgdG9wYCwgYGxlZnRgLCBgd2lkdGhgLCBgaGVpZ2h0YCB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhLm9mZnNldHMuYXJyb3ddIGB0b3BgIGFuZCBgbGVmdGAgb2Zmc2V0cywgb25seSBvbmUgb2YgdGhlbSB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIDBcbiAqL1xuXG4vKipcbiAqIERlZmF1bHQgb3B0aW9ucyBwcm92aWRlZCB0byBQb3BwZXIuanMgY29uc3RydWN0b3IuPGJyIC8+XG4gKiBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyB0aGUgYG9wdGlvbnNgIGFyZ3VtZW50IG9mIFBvcHBlci5qcy48YnIgLz5cbiAqIFRvIG92ZXJyaWRlIGFuIG9wdGlvbiwgc2ltcGx5IHBhc3MgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWVcbiAqIHN0cnVjdHVyZSBvZiB0aGUgYG9wdGlvbnNgIG9iamVjdCwgYXMgdGhlIDNyZCBhcmd1bWVudC4gRm9yIGV4YW1wbGU6XG4gKiBgYGBcbiAqIG5ldyBQb3BwZXIocmVmLCBwb3AsIHtcbiAqICAgbW9kaWZpZXJzOiB7XG4gKiAgICAgcHJldmVudE92ZXJmbG93OiB7IGVuYWJsZWQ6IGZhbHNlIH1cbiAqICAgfVxuICogfSlcbiAqIGBgYFxuICogQHR5cGUge09iamVjdH1cbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJvZiBQb3BwZXJcbiAqL1xudmFyIERlZmF1bHRzID0ge1xuICAvKipcbiAgICogUG9wcGVyJ3MgcGxhY2VtZW50LlxuICAgKiBAcHJvcCB7UG9wcGVyLnBsYWNlbWVudHN9IHBsYWNlbWVudD0nYm90dG9tJ1xuICAgKi9cbiAgcGxhY2VtZW50OiAnYm90dG9tJyxcblxuICAvKipcbiAgICogU2V0IHRoaXMgdG8gdHJ1ZSBpZiB5b3Ugd2FudCBwb3BwZXIgdG8gcG9zaXRpb24gaXQgc2VsZiBpbiAnZml4ZWQnIG1vZGVcbiAgICogQHByb3Age0Jvb2xlYW59IHBvc2l0aW9uRml4ZWQ9ZmFsc2VcbiAgICovXG4gIHBvc2l0aW9uRml4ZWQ6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGV2ZW50cyAocmVzaXplLCBzY3JvbGwpIGFyZSBpbml0aWFsbHkgZW5hYmxlZC5cbiAgICogQHByb3Age0Jvb2xlYW59IGV2ZW50c0VuYWJsZWQ9dHJ1ZVxuICAgKi9cbiAgZXZlbnRzRW5hYmxlZDogdHJ1ZSxcblxuICAvKipcbiAgICogU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gYXV0b21hdGljYWxseSByZW1vdmUgdGhlIHBvcHBlciB3aGVuXG4gICAqIHlvdSBjYWxsIHRoZSBgZGVzdHJveWAgbWV0aG9kLlxuICAgKiBAcHJvcCB7Qm9vbGVhbn0gcmVtb3ZlT25EZXN0cm95PWZhbHNlXG4gICAqL1xuICByZW1vdmVPbkRlc3Ryb3k6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiB0aGUgcG9wcGVyIGlzIGNyZWF0ZWQuPGJyIC8+XG4gICAqIEJ5IGRlZmF1bHQsIGl0IGlzIHNldCB0byBuby1vcC48YnIgLz5cbiAgICogQWNjZXNzIFBvcHBlci5qcyBpbnN0YW5jZSB3aXRoIGBkYXRhLmluc3RhbmNlYC5cbiAgICogQHByb3Age29uQ3JlYXRlfVxuICAgKi9cbiAgb25DcmVhdGU6IGZ1bmN0aW9uIG9uQ3JlYXRlKCkge30sXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGNhbGxlZCB3aGVuIHRoZSBwb3BwZXIgaXMgdXBkYXRlZC4gVGhpcyBjYWxsYmFjayBpcyBub3QgY2FsbGVkXG4gICAqIG9uIHRoZSBpbml0aWFsaXphdGlvbi9jcmVhdGlvbiBvZiB0aGUgcG9wcGVyLCBidXQgb25seSBvbiBzdWJzZXF1ZW50XG4gICAqIHVwZGF0ZXMuPGJyIC8+XG4gICAqIEJ5IGRlZmF1bHQsIGl0IGlzIHNldCB0byBuby1vcC48YnIgLz5cbiAgICogQWNjZXNzIFBvcHBlci5qcyBpbnN0YW5jZSB3aXRoIGBkYXRhLmluc3RhbmNlYC5cbiAgICogQHByb3Age29uVXBkYXRlfVxuICAgKi9cbiAgb25VcGRhdGU6IGZ1bmN0aW9uIG9uVXBkYXRlKCkge30sXG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgbW9kaWZpZXJzIHVzZWQgdG8gbW9kaWZ5IHRoZSBvZmZzZXRzIGJlZm9yZSB0aGV5IGFyZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXIuXG4gICAqIFRoZXkgcHJvdmlkZSBtb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXRpZXMgb2YgUG9wcGVyLmpzLlxuICAgKiBAcHJvcCB7bW9kaWZpZXJzfVxuICAgKi9cbiAgbW9kaWZpZXJzOiBtb2RpZmllcnNcbn07XG5cbi8qKlxuICogQGNhbGxiYWNrIG9uQ3JlYXRlXG4gKiBAcGFyYW0ge2RhdGFPYmplY3R9IGRhdGFcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBvblVwZGF0ZVxuICogQHBhcmFtIHtkYXRhT2JqZWN0fSBkYXRhXG4gKi9cblxuLy8gVXRpbHNcbi8vIE1ldGhvZHNcbnZhciBQb3BwZXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFBvcHBlci5qcyBpbnN0YW5jZS5cbiAgICogQGNsYXNzIFBvcHBlclxuICAgKiBAcGFyYW0ge0VsZW1lbnR8cmVmZXJlbmNlT2JqZWN0fSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIGVsZW1lbnQgdXNlZCB0byBwb3NpdGlvbiB0aGUgcG9wcGVyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gcG9wcGVyIC0gVGhlIEhUTUwgLyBYTUwgZWxlbWVudCB1c2VkIGFzIHRoZSBwb3BwZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBZb3VyIGN1c3RvbSBvcHRpb25zIHRvIG92ZXJyaWRlIHRoZSBvbmVzIGRlZmluZWQgaW4gW0RlZmF1bHRzXSgjZGVmYXVsdHMpXG4gICAqIEByZXR1cm4ge09iamVjdH0gaW5zdGFuY2UgLSBUaGUgZ2VuZXJhdGVkIFBvcHBlci5qcyBpbnN0YW5jZVxuICAgKi9cbiAgZnVuY3Rpb24gUG9wcGVyKHJlZmVyZW5jZSwgcG9wcGVyKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQb3BwZXIpO1xuXG4gICAgdGhpcy5zY2hlZHVsZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3RoaXMudXBkYXRlKTtcbiAgICB9O1xuXG4gICAgLy8gbWFrZSB1cGRhdGUoKSBkZWJvdW5jZWQsIHNvIHRoYXQgaXQgb25seSBydW5zIGF0IG1vc3Qgb25jZS1wZXItdGlja1xuICAgIHRoaXMudXBkYXRlID0gZGVib3VuY2UodGhpcy51cGRhdGUuYmluZCh0aGlzKSk7XG5cbiAgICAvLyB3aXRoIHt9IHdlIGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3B0aW9ucyBpbnNpZGUgaXRcbiAgICB0aGlzLm9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgUG9wcGVyLkRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgIC8vIGluaXQgc3RhdGVcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNEZXN0cm95ZWQ6IGZhbHNlLFxuICAgICAgaXNDcmVhdGVkOiBmYWxzZSxcbiAgICAgIHNjcm9sbFBhcmVudHM6IFtdXG4gICAgfTtcblxuICAgIC8vIGdldCByZWZlcmVuY2UgYW5kIHBvcHBlciBlbGVtZW50cyAoYWxsb3cgalF1ZXJ5IHdyYXBwZXJzKVxuICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlICYmIHJlZmVyZW5jZS5qcXVlcnkgPyByZWZlcmVuY2VbMF0gOiByZWZlcmVuY2U7XG4gICAgdGhpcy5wb3BwZXIgPSBwb3BwZXIgJiYgcG9wcGVyLmpxdWVyeSA/IHBvcHBlclswXSA6IHBvcHBlcjtcblxuICAgIC8vIERlZXAgbWVyZ2UgbW9kaWZpZXJzIG9wdGlvbnNcbiAgICB0aGlzLm9wdGlvbnMubW9kaWZpZXJzID0ge307XG4gICAgT2JqZWN0LmtleXMoX2V4dGVuZHMoe30sIFBvcHBlci5EZWZhdWx0cy5tb2RpZmllcnMsIG9wdGlvbnMubW9kaWZpZXJzKSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgX3RoaXMub3B0aW9ucy5tb2RpZmllcnNbbmFtZV0gPSBfZXh0ZW5kcyh7fSwgUG9wcGVyLkRlZmF1bHRzLm1vZGlmaWVyc1tuYW1lXSB8fCB7fSwgb3B0aW9ucy5tb2RpZmllcnMgPyBvcHRpb25zLm1vZGlmaWVyc1tuYW1lXSA6IHt9KTtcbiAgICB9KTtcblxuICAgIC8vIFJlZmFjdG9yaW5nIG1vZGlmaWVycycgbGlzdCAoT2JqZWN0ID0+IEFycmF5KVxuICAgIHRoaXMubW9kaWZpZXJzID0gT2JqZWN0LmtleXModGhpcy5vcHRpb25zLm1vZGlmaWVycykubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBuYW1lOiBuYW1lXG4gICAgICB9LCBfdGhpcy5vcHRpb25zLm1vZGlmaWVyc1tuYW1lXSk7XG4gICAgfSlcbiAgICAvLyBzb3J0IHRoZSBtb2RpZmllcnMgYnkgb3JkZXJcbiAgICAuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xuICAgIH0pO1xuXG4gICAgLy8gbW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBhcmJpdHJhcnkgY29kZSB3aGVuIFBvcHBlci5qcyBnZXQgaW5pdGVkXG4gICAgLy8gc3VjaCBjb2RlIGlzIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIG9mIGl0cyBtb2RpZmllclxuICAgIC8vIHRoZXkgY291bGQgYWRkIG5ldyBwcm9wZXJ0aWVzIHRvIHRoZWlyIG9wdGlvbnMgY29uZmlndXJhdGlvblxuICAgIC8vIEJFIEFXQVJFOiBkb24ndCBhZGQgb3B0aW9ucyB0byBgb3B0aW9ucy5tb2RpZmllcnMubmFtZWAgYnV0IHRvIGBtb2RpZmllck9wdGlvbnNgIVxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyT3B0aW9ucykge1xuICAgICAgaWYgKG1vZGlmaWVyT3B0aW9ucy5lbmFibGVkICYmIGlzRnVuY3Rpb24obW9kaWZpZXJPcHRpb25zLm9uTG9hZCkpIHtcbiAgICAgICAgbW9kaWZpZXJPcHRpb25zLm9uTG9hZChfdGhpcy5yZWZlcmVuY2UsIF90aGlzLnBvcHBlciwgX3RoaXMub3B0aW9ucywgbW9kaWZpZXJPcHRpb25zLCBfdGhpcy5zdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBmaXJlIHRoZSBmaXJzdCB1cGRhdGUgdG8gcG9zaXRpb24gdGhlIHBvcHBlciBpbiB0aGUgcmlnaHQgcGxhY2VcbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgdmFyIGV2ZW50c0VuYWJsZWQgPSB0aGlzLm9wdGlvbnMuZXZlbnRzRW5hYmxlZDtcbiAgICBpZiAoZXZlbnRzRW5hYmxlZCkge1xuICAgICAgLy8gc2V0dXAgZXZlbnQgbGlzdGVuZXJzLCB0aGV5IHdpbGwgdGFrZSBjYXJlIG9mIHVwZGF0ZSB0aGUgcG9zaXRpb24gaW4gc3BlY2lmaWMgc2l0dWF0aW9uc1xuICAgICAgdGhpcy5lbmFibGVFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUuZXZlbnRzRW5hYmxlZCA9IGV2ZW50c0VuYWJsZWQ7XG4gIH1cblxuICAvLyBXZSBjYW4ndCB1c2UgY2xhc3MgcHJvcGVydGllcyBiZWNhdXNlIHRoZXkgZG9uJ3QgZ2V0IGxpc3RlZCBpbiB0aGVcbiAgLy8gY2xhc3MgcHJvdG90eXBlIGFuZCBicmVhayBzdHVmZiBsaWtlIFNpbm9uIHN0dWJzXG5cblxuICBjcmVhdGVDbGFzcyhQb3BwZXIsIFt7XG4gICAga2V5OiAndXBkYXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlJCQxKCkge1xuICAgICAgcmV0dXJuIHVwZGF0ZS5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2Rlc3Ryb3knLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95JCQxKCkge1xuICAgICAgcmV0dXJuIGRlc3Ryb3kuY2FsbCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdlbmFibGVFdmVudExpc3RlbmVycycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuYWJsZUV2ZW50TGlzdGVuZXJzJCQxKCkge1xuICAgICAgcmV0dXJuIGVuYWJsZUV2ZW50TGlzdGVuZXJzLmNhbGwodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGlzYWJsZUV2ZW50TGlzdGVuZXJzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzYWJsZUV2ZW50TGlzdGVuZXJzJCQxKCkge1xuICAgICAgcmV0dXJuIGRpc2FibGVFdmVudExpc3RlbmVycy5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNjaGVkdWxlcyBhbiB1cGRhdGUuIEl0IHdpbGwgcnVuIG9uIHRoZSBuZXh0IFVJIHVwZGF0ZSBhdmFpbGFibGUuXG4gICAgICogQG1ldGhvZCBzY2hlZHVsZVVwZGF0ZVxuICAgICAqIEBtZW1iZXJvZiBQb3BwZXJcbiAgICAgKi9cblxuXG4gICAgLyoqXG4gICAgICogQ29sbGVjdGlvbiBvZiB1dGlsaXRpZXMgdXNlZnVsIHdoZW4gd3JpdGluZyBjdXN0b20gbW9kaWZpZXJzLlxuICAgICAqIFN0YXJ0aW5nIGZyb20gdmVyc2lvbiAxLjcsIHRoaXMgbWV0aG9kIGlzIGF2YWlsYWJsZSBvbmx5IGlmIHlvdVxuICAgICAqIGluY2x1ZGUgYHBvcHBlci11dGlscy5qc2AgYmVmb3JlIGBwb3BwZXIuanNgLlxuICAgICAqXG4gICAgICogKipERVBSRUNBVElPTioqOiBUaGlzIHdheSB0byBhY2Nlc3MgUG9wcGVyVXRpbHMgaXMgZGVwcmVjYXRlZFxuICAgICAqIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdjIhIFVzZSB0aGUgUG9wcGVyVXRpbHMgbW9kdWxlIGRpcmVjdGx5IGluc3RlYWQuXG4gICAgICogRHVlIHRvIHRoZSBoaWdoIGluc3RhYmlsaXR5IG9mIHRoZSBtZXRob2RzIGNvbnRhaW5lZCBpbiBVdGlscywgd2UgY2FuJ3RcbiAgICAgKiBndWFyYW50ZWUgdGhlbSB0byBmb2xsb3cgc2VtdmVyLiBVc2UgdGhlbSBhdCB5b3VyIG93biByaXNrIVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAxLjhcbiAgICAgKiBAbWVtYmVyIFV0aWxzXG4gICAgICogQG1lbWJlcm9mIFBvcHBlclxuICAgICAqL1xuXG4gIH1dKTtcbiAgcmV0dXJuIFBvcHBlcjtcbn0oKTtcblxuLyoqXG4gKiBUaGUgYHJlZmVyZW5jZU9iamVjdGAgaXMgYW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGNvbXBhdGlibGUgd2l0aCBQb3BwZXIuanNcbiAqIGFuZCBsZXRzIHlvdSB1c2UgaXQgYXMgcmVwbGFjZW1lbnQgb2YgYSByZWFsIERPTSBub2RlLjxiciAvPlxuICogWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gcG9zaXRpb24gYSBwb3BwZXIgcmVsYXRpdmVseSB0byBhIHNldCBvZiBjb29yZGluYXRlc1xuICogaW4gY2FzZSB5b3UgZG9uJ3QgaGF2ZSBhIERPTSBub2RlIHRvIHVzZSBhcyByZWZlcmVuY2UuXG4gKlxuICogYGBgXG4gKiBuZXcgUG9wcGVyKHJlZmVyZW5jZU9iamVjdCwgcG9wcGVyTm9kZSk7XG4gKiBgYGBcbiAqXG4gKiBOQjogVGhpcyBmZWF0dXJlIGlzbid0IHN1cHBvcnRlZCBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMC5cbiAqIEBuYW1lIHJlZmVyZW5jZU9iamVjdFxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZGF0YS5nZXRCb3VuZGluZ0NsaWVudFJlY3RcbiAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc2V0IG9mIGNvb3JkaW5hdGVzIGNvbXBhdGlibGUgd2l0aCB0aGUgbmF0aXZlIGBnZXRCb3VuZGluZ0NsaWVudFJlY3RgIG1ldGhvZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkYXRhLmNsaWVudFdpZHRoXG4gKiBBbiBFUzYgZ2V0dGVyIHRoYXQgd2lsbCByZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSB2aXJ0dWFsIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRhdGEuY2xpZW50SGVpZ2h0XG4gKiBBbiBFUzYgZ2V0dGVyIHRoYXQgd2lsbCByZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgdmlydHVhbCByZWZlcmVuY2UgZWxlbWVudC5cbiAqL1xuXG5cblBvcHBlci5VdGlscyA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbCkuUG9wcGVyVXRpbHM7XG5Qb3BwZXIucGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG5Qb3BwZXIuRGVmYXVsdHMgPSBEZWZhdWx0cztcblxuZXhwb3J0IGRlZmF1bHQgUG9wcGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9wcGVyLmpzLm1hcFxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/popper.js/dist/esm/popper.js\n"); 134 135 /***/ }), 136 137 /***/ "./node_modules/webpack/buildin/global.js": 138 /*!***********************************!*\ 139 !*** (webpack)/buildin/global.js ***! 140 \***********************************/ 141 /*! no static exports found */ 142 /***/ (function(module, exports, __webpack_require__) { 143 144 "use strict"; 145 eval("\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar g;\n\n// This works in non-strict mode\ng = function () {\n\treturn this;\n}();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif ((typeof window === \"undefined\" ? \"undefined\" : _typeof(window)) === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzP2NkMDAiXSwibmFtZXMiOlsiZyIsIkZ1bmN0aW9uIiwiZSIsIndpbmRvdyIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFJQSxDQUFKOztBQUVBO0FBQ0FBLElBQUssWUFBVztBQUNmLFFBQU8sSUFBUDtBQUNBLENBRkcsRUFBSjs7QUFJQSxJQUFJO0FBQ0g7QUFDQUEsS0FBSUEsS0FBSyxJQUFJQyxRQUFKLENBQWEsYUFBYixHQUFUO0FBQ0EsQ0FIRCxDQUdFLE9BQU9DLENBQVAsRUFBVTtBQUNYO0FBQ0EsS0FBSSxRQUFPQyxNQUFQLHlDQUFPQSxNQUFQLE9BQWtCLFFBQXRCLEVBQWdDSCxJQUFJRyxNQUFKO0FBQ2hDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQUMsT0FBT0MsT0FBUCxHQUFpQkwsQ0FBakIiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/webpack/buildin/global.js\n"); 146 147 /***/ }), 148 149 /***/ "./scss/shiptimize-admin.scss": 150 /*!************************************!*\ 151 !*** ./scss/shiptimize-admin.scss ***! 152 \************************************/ 153 /*! no static exports found */ 154 /***/ (function(module, exports, __webpack_require__) { 155 156 eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zY3NzL3NoaXB0aW1pemUtYWRtaW4uc2Nzcz82MGM5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6Ii4vc2Nzcy9zaGlwdGltaXplLWFkbWluLnNjc3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./scss/shiptimize-admin.scss\n"); 157 158 /***/ }), 159 160 /***/ "./shiptimize-admin.js": 161 /*!*****************************!*\ 162 !*** ./shiptimize-admin.js ***! 163 \*****************************/ 164 /*! no static exports found */ 165 /***/ (function(module, exports, __webpack_require__) { 166 167 "use strict"; 168 eval("\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n__webpack_require__(/*! ./scss/shiptimize-admin.scss */ \"./scss/shiptimize-admin.scss\");\n\nvar _popper = __webpack_require__(/*! popper.js */ \"./node_modules/popper.js/dist/esm/popper.js\");\n\nvar _popper2 = _interopRequireDefault(_popper);\n\nvar _shiptimizeWooCommerceAdmin = __webpack_require__(/*! ./js/shiptimize-woo-commerce-admin.js */ \"./js/shiptimize-woo-commerce-admin.js\");\n\nvar _shiptimizeWooCommerceAdmin2 = _interopRequireDefault(_shiptimizeWooCommerceAdmin);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Shiptimize = function () {\n function Shiptimize() {\n _classCallCheck(this, Shiptimize);\n\n console.log(\"I'm alive!\");\n }\n\n /** \n * \n */\n\n\n _createClass(Shiptimize, [{\n key: 'bootstrap',\n value: function bootstrap() {\n this.tooltips();\n this.platform = new _shiptimizeWooCommerceAdmin2.default();\n\n this.loadAnalytics();\n if (typeof this.platform.bootstrap != 'undefined') {\n this.platform.bootstrap();\n }\n }\n }, {\n key: 'tooltips',\n value: function tooltips() {\n var toltip = jQuery(\".shiptimize-tooltip-message\");\n var container = jQuery('#wpcontent');\n\n if (toltip.size() == 0) {\n return;\n }\n\n var me = this;\n toltip.each(function (idx, elem) {\n me.attachPopper(elem, container);\n });\n }\n }, {\n key: 'attachPopper',\n value: function attachPopper(toltip, container) {\n var eToltip = jQuery(toltip);\n var toltipReference = eToltip.siblings(\".shiptimize-tooltip-reference\");\n var arrow = eToltip.children('.shiptimize-tooltip-message__arrow').get(0);\n\n var popper = new _popper2.default(toltipReference.get(0), toltip, {\n placement: 'left',\n modifiers: {\n flip: {\n behavior: ['top', 'left', 'bottom']\n },\n preventOverflow: {\n boundariesElement: container\n },\n offset: {\n enabled: true,\n offset: '10,10'\n },\n arrow: {\n enabled: true,\n element: arrow\n }\n }\n });\n setTimeout(function () {\n popper.update();\n }, 200);\n }\n }, {\n key: 'exportSuccess',\n value: function exportSuccess(appLink) {\n this.platform.exportSuccess(appLink);\n }\n\n /** \n * @param string category \n * @param string action \n * @param string label \n */\n\n }, {\n key: 'sendAnalyticsEvent',\n value: function sendAnalyticsEvent(category, action, label) {\n ga('shiptimize.send', 'event', category, action, label, { transport: 'beacon' });\n }\n }, {\n key: 'loadAnalytics',\n value: function loadAnalytics() {\n if (typeof ga == 'undefined') {\n (function (i, s, o, g, r, a, m) {\n i['GoogleAnalyticsObject'] = r;\n i[r] = i[r] || function () {\n (i[r].q = i[r].q || []).push(arguments);\n }, i[r].l = 1 * new Date();\n a = s.createElement(o), m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n console.log(\"inserting analytics \");\n }\n ga('create', 'UA-101485643-1', 'auto', 'shiptimize');\n ga('shiptimize.set', 'anonymizeIp', true);\n console.log(\"creating tracker\");\n }\n }, {\n key: 'printlabel',\n value: function printlabel(event, orderid) {\n var _this = this;\n\n event.stopPropagation();\n console.log(\"Printing label for orderid \", orderid);\n\n var data = {\n 'action': 'shiptimize_print_label',\n 'orderid': orderid\n };\n\n this.openLoader(shiptimize_label_request);\n\n jQuery.post(ajaxurl, data, function (data) {\n console.log(data);\n\n if (typeof data.response != 'undefined') {\n if (typeof data.response.Error != 'undefined' && data.response.Error.Id > 0) {\n _this.loaderMsg(data.response.Error.Info);\n\n setTimeout(function () {\n _this.closeLoader();\n }, 2000);\n }\n\n if (typeof data.response.CallbackURL != 'undefined') {\n _this.monitorLabelStatus(data.response.CallbackURL);\n }\n }\n\n if (typeof data.errors != 'undefined') {\n _this.loaderMsg(data.errors.join('<br/>'));\n setTimeout(function () {\n _this.closeLoader();\n }, 5000);\n }\n }, \"json\");\n }\n\n /**\n * Request the label status every 1s \n */\n\n }, {\n key: 'monitorLabelStatus',\n value: function monitorLabelStatus(callbackUrl) {\n var _this2 = this;\n\n var data = {\n 'action': 'shiptimize_label_status',\n 'callbackUrl': callbackUrl\n };\n\n jQuery.post(ajaxurl, data, function (data) {\n console.log(data);\n\n if (typeof data.response != 'undefined') {\n\n // Check for falta errors \n if (data.httpCode == '200') {\n _this2.loaderMsg(shiptimize_label_request + ' ' + data.response.Finished + '%');\n } else {\n _this2.loaderMsg(\"Fatal API error \" + data.httpCode);\n setTimeout(function () {\n _this2.closeLoader();\n }, 5000);\n return;\n }\n\n // Print API errors\n if (data.response.Error.Id > 0) {\n _this2.loaderMsg(data.response.Error.Info);\n }\n\n if (data.response.Error.Id == 902) {\n //No process running \n setTimeout(function () {\n _this2.closeLoader();\n }, 2000);\n }\n\n if (data.response.Finished == 100) {\n if (data.response.LabelFile.length > 0) {\n var labelinfo = shiptimize_label_click.replace('%', '<a href=\"' + data.response.LabelFile + '\" target=\\'_blank\\'>' + shiptimize_label_label + '</a>');\n var noticelist = jQuery(\"#wp__notice-list\");\n noticelist.removeClass('woocommerce-layout__notice-list-hide');\n noticelist.append('<div class=\"notice notice-info is-dismissible updated\">' + labelinfo + '</div>');\n window.open(data.response.LabelFile, '_blank');\n _this2.closeLoader();\n\n /** \n * Make sure the info is updated without the need to reload the page \n */\n for (var x = 0; x < data.response.ClientReferenceCodeList.length; ++x) {\n var labelresult = data.response.ClientReferenceCodeList[x];\n if (labelresult.Error.Id == 0) {\n jQuery(\"#shiptimize-label\" + labelresult.ReferenceCode).addClass('shiptimize-icon-print-printed');\n } else {\n jQuery(\"#shiptimize-label\" + labelresult.ReferenceCode).addClass(\"shiptimize-icon-print-error\");\n }\n\n jQuery(\"#shiptimize-tooltip\" + labelresult.ReferenceCode).html(labelresult.message);\n }\n } else {\n var msg = '';\n for (var x = 0; x < data.response.ClientReferenceCodeList.length; ++x) {\n var _labelresult = data.response.ClientReferenceCodeList[0];\n if (_labelresult.Error.Id > 0) {\n msg += \"<div class='shiptimize-label-error error'>\" + _labelresult.Error.Info + \"</div>\";\n }\n jQuery(\"#shiptimize-label\" + _labelresult.ReferenceCode).addClass(\"shiptimize-icon-print-error\");\n jQuery(\"#shiptimize-tooltip\" + _labelresult.ReferenceCode).html(_labelresult.message);\n }\n\n _this2.loaderMsg(msg);\n setTimeout(function () {\n _this2.closeLoader();\n }, 5000);\n }\n }\n\n if (data.response.Finished < 100) {\n setTimeout(function () {\n _this2.monitorLabelStatus(callbackUrl);\n }, 2000);\n }\n }\n }, \"json\");\n }\n }, {\n key: 'loaderMsg',\n value: function loaderMsg(message) {\n jQuery(\".shiptimize-loader-message\").html(message);\n }\n }, {\n key: 'openLoader',\n value: function openLoader(message) {\n jQuery('body').append('<div class=\"shiptimize-loader-wrapper\"><div class=\"shiptimize-loader\"><div></div><div></div><div></div></div><div class=\"shiptimize-loader-message\">' + message + '</div></div>');\n }\n }, {\n key: 'closeLoader',\n value: function closeLoader() {\n jQuery(\".shiptimize-loader-wrapper\").remove();\n }\n }]);\n\n return Shiptimize;\n}();\n\njQuery(function () {\n window.shiptimize = new Shiptimize();\n window.shiptimize.bootstrap();\n window.Popper = _popper2.default;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGlwdGltaXplLWFkbWluLmpzPzM4YTIiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZSIsImNvbnNvbGUiLCJsb2ciLCJ0b29sdGlwcyIsInBsYXRmb3JtIiwiV29vU2hpcHRpbWl6ZSIsImxvYWRBbmFseXRpY3MiLCJib290c3RyYXAiLCJ0b2x0aXAiLCJqUXVlcnkiLCJjb250YWluZXIiLCJzaXplIiwibWUiLCJlYWNoIiwiaWR4IiwiZWxlbSIsImF0dGFjaFBvcHBlciIsImVUb2x0aXAiLCJ0b2x0aXBSZWZlcmVuY2UiLCJzaWJsaW5ncyIsImFycm93IiwiY2hpbGRyZW4iLCJnZXQiLCJwb3BwZXIiLCJQb3BwZXIiLCJwbGFjZW1lbnQiLCJtb2RpZmllcnMiLCJmbGlwIiwiYmVoYXZpb3IiLCJwcmV2ZW50T3ZlcmZsb3ciLCJib3VuZGFyaWVzRWxlbWVudCIsIm9mZnNldCIsImVuYWJsZWQiLCJlbGVtZW50Iiwic2V0VGltZW91dCIsInVwZGF0ZSIsImFwcExpbmsiLCJleHBvcnRTdWNjZXNzIiwiY2F0ZWdvcnkiLCJhY3Rpb24iLCJsYWJlbCIsImdhIiwidHJhbnNwb3J0IiwiaSIsInMiLCJvIiwiZyIsInIiLCJhIiwibSIsInEiLCJwdXNoIiwiYXJndW1lbnRzIiwibCIsIkRhdGUiLCJjcmVhdGVFbGVtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJhc3luYyIsInNyYyIsInBhcmVudE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJ3aW5kb3ciLCJkb2N1bWVudCIsImV2ZW50Iiwib3JkZXJpZCIsInN0b3BQcm9wYWdhdGlvbiIsImRhdGEiLCJvcGVuTG9hZGVyIiwic2hpcHRpbWl6ZV9sYWJlbF9yZXF1ZXN0IiwicG9zdCIsImFqYXh1cmwiLCJyZXNwb25zZSIsIkVycm9yIiwiSWQiLCJsb2FkZXJNc2ciLCJJbmZvIiwiY2xvc2VMb2FkZXIiLCJDYWxsYmFja1VSTCIsIm1vbml0b3JMYWJlbFN0YXR1cyIsImVycm9ycyIsImpvaW4iLCJjYWxsYmFja1VybCIsImh0dHBDb2RlIiwiRmluaXNoZWQiLCJMYWJlbEZpbGUiLCJsZW5ndGgiLCJsYWJlbGluZm8iLCJzaGlwdGltaXplX2xhYmVsX2NsaWNrIiwicmVwbGFjZSIsInNoaXB0aW1pemVfbGFiZWxfbGFiZWwiLCJub3RpY2VsaXN0IiwicmVtb3ZlQ2xhc3MiLCJhcHBlbmQiLCJvcGVuIiwieCIsIkNsaWVudFJlZmVyZW5jZUNvZGVMaXN0IiwibGFiZWxyZXN1bHQiLCJSZWZlcmVuY2VDb2RlIiwiYWRkQ2xhc3MiLCJodG1sIiwibWVzc2FnZSIsIm1zZyIsInJlbW92ZSIsInNoaXB0aW1pemUiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTs7QUFDQTs7OztBQUVBOzs7Ozs7OztJQUVNQSxVO0FBRUosd0JBQWE7QUFBQTs7QUFDWEMsWUFBUUMsR0FBUixDQUFZLFlBQVo7QUFDRDs7QUFFRDs7Ozs7OztnQ0FHVztBQUNULFdBQUtDLFFBQUw7QUFDQSxXQUFLQyxRQUFMLEdBQWdCLElBQUlDLG9DQUFKLEVBQWhCOztBQUVBLFdBQUtDLGFBQUw7QUFDQSxVQUFHLE9BQU8sS0FBS0YsUUFBTCxDQUFjRyxTQUFyQixJQUFtQyxXQUF0QyxFQUFtRDtBQUNqRCxhQUFLSCxRQUFMLENBQWNHLFNBQWQ7QUFDRDtBQUNGOzs7K0JBRVU7QUFDVCxVQUFJQyxTQUFTQyxPQUFPLDZCQUFQLENBQWI7QUFDQSxVQUFJQyxZQUFZRCxPQUFPLFlBQVAsQ0FBaEI7O0FBRUEsVUFBS0QsT0FBT0csSUFBUCxNQUFpQixDQUF0QixFQUEwQjtBQUN4QjtBQUNEOztBQUVELFVBQUlDLEtBQUssSUFBVDtBQUNBSixhQUFPSyxJQUFQLENBQWEsVUFBV0MsR0FBWCxFQUFnQkMsSUFBaEIsRUFBdUI7QUFDbENILFdBQUdJLFlBQUgsQ0FBZ0JELElBQWhCLEVBQXFCTCxTQUFyQjtBQUNELE9BRkQ7QUFJRDs7O2lDQUVZRixNLEVBQVFFLFMsRUFBVTtBQUM3QixVQUFJTyxVQUFVUixPQUFPRCxNQUFQLENBQWQ7QUFDQSxVQUFJ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QWY7QUFDQW5FLHlCQUFXLFlBQU07QUFBRSx1QkFBSzBDLFdBQUw7QUFBcUIsZUFBeEMsRUFBMEMsSUFBMUM7QUFDRDtBQUNGOztBQUVELGNBQUdWLEtBQUtLLFFBQUwsQ0FBY1ksUUFBZCxHQUF5QixHQUE1QixFQUFpQztBQUMvQmpELHVCQUFZLFlBQU07QUFBRSxxQkFBSzRDLGtCQUFMLENBQXdCRyxXQUF4QjtBQUF1QyxhQUEzRCxFQUE2RCxJQUE3RDtBQUNEO0FBQ0Y7QUFFRixPQXZFRCxFQXVFRyxNQXZFSDtBQXdFRDs7OzhCQUVTbUIsTyxFQUFTO0FBQ2pCM0YsYUFBTyw0QkFBUCxFQUFxQzBGLElBQXJDLENBQTBDQyxPQUExQztBQUNEOzs7K0JBRVVBLE8sRUFBUztBQUNsQjNGLGFBQU8sTUFBUCxFQUFlbUYsTUFBZixDQUFzQix5SkFBeUpRLE9BQXpKLEdBQW9LLGNBQTFMO0FBQ0Q7OztrQ0FFWTtBQUNYM0YsYUFBTyw0QkFBUCxFQUFxQzZGLE1BQXJDO0FBQ0Q7Ozs7OztBQUdIN0YsT0FBTyxZQUFZO0FBQ2pCb0QsU0FBTzBDLFVBQVAsR0FBb0IsSUFBSXZHLFVBQUosRUFBcEI7QUFDQTZELFNBQU8wQyxVQUFQLENBQWtCaEcsU0FBbEI7QUFDQXNELFNBQU9yQyxNQUFQLEdBQWdCQSxnQkFBaEI7QUFDRCxDQUpEIiwiZmlsZSI6Ii4vc2hpcHRpbWl6ZS1hZG1pbi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnLi9zY3NzL3NoaXB0aW1pemUtYWRtaW4uc2Nzcyc7XG5pbXBvcnQgUG9wcGVyIGZyb20gJ3BvcHBlci5qcyc7IFxuXG5pbXBvcnQgV29vU2hpcHRpbWl6ZSAgZnJvbSAnLi9qcy9zaGlwdGltaXplLXdvby1jb21tZXJjZS1hZG1pbi5qcyc7IFxuXG5jbGFzcyBTaGlwdGltaXplIHtcblxuICBjb25zdHJ1Y3Rvcigpe1xuICAgIGNvbnNvbGUubG9nKFwiSSdtIGFsaXZlIVwiKTsgXG4gIH1cblxuICAvKiogXG4gICAqICBcbiAgICovIFxuICBib290c3RyYXAoKXtcbiAgICB0aGlzLnRvb2x0aXBzKCk7IFxuICAgIHRoaXMucGxhdGZvcm0gPSBuZXcgV29vU2hpcHRpbWl6ZSgpOyBcblxuICAgIHRoaXMubG9hZEFuYWx5dGljcygpOyBcbiAgICBpZih0eXBlb2YodGhpcy5wbGF0Zm9ybS5ib290c3RyYXApICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnBsYXRmb3JtLmJvb3RzdHJhcCgpO1xuICAgIH1cbiAgfVxuXG4gIHRvb2x0aXBzKCApe1xuICAgIGxldCB0b2x0aXAgPSBqUXVlcnkoXCIuc2hpcHRpbWl6ZS10b29sdGlwLW1lc3NhZ2VcIik7XG4gICAgbGV0IGNvbnRhaW5lciA9IGpRdWVyeSgnI3dwY29udGVudCcpOyBcblxuICAgIGlmICggdG9sdGlwLnNpemUoKSA9PSAwICkge1xuICAgICAgcmV0dXJuOyBcbiAgICB9XG5cbiAgICBsZXQgbWUgPSB0aGlzOyBcbiAgICB0b2x0aXAuZWFjaCggZnVuY3Rpb24gKCBpZHgsIGVsZW0gKSB7XG4gICAgICBtZS5hdHRhY2hQb3BwZXIoZWxlbSxjb250YWluZXIpO1xuICAgIH0pOyAgICAgIFxuXG4gIH1cblxuICBhdHRhY2hQb3BwZXIodG9sdGlwLCBjb250YWluZXIpeyAgXG4gICAgbGV0IGVUb2x0aXAgPSBqUXVlcnkodG9sdGlwKTsgXG4gICAgbGV0IHRvbHRpcFJlZmVyZW5jZSA9IGVUb2x0aXAuc2libGluZ3MoXCIuc2hpcHRpbWl6ZS10b29sdGlwLXJlZmVyZW5jZVwiKTtcbiAgICBsZXQgYXJyb3cgPSBlVG9sdGlwLmNoaWxkcmVuKCcuc2hpcHRpbWl6ZS10b29sdGlwLW1lc3NhZ2VfX2Fycm93JykuZ2V0KDApOyBcblxuICAgIHZhciBwb3BwZXIgPSBuZXcgUG9wcGVyKHRvbHRpcFJlZmVyZW5jZS5nZXQoMCksIHRvbHRpcCwge1xuICAgICAgcGxhY2VtZW50OiAnbGVmdCcsXG4gICAgICBtb2RpZmllcnM6IHtcbiAgICAgICAgICBmbGlwOiB7XG4gICAgICAgICAgICAgIGJlaGF2aW9yOiBbJ3RvcCcsJ2xlZnQnLCAnYm90dG9tJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIHByZXZlbnRPdmVyZmxvdzoge1xuICAgICAgICAgICAgICBib3VuZGFyaWVzRWxlbWVudDogY29udGFpbmVyLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb2Zmc2V0OiB7IFxuICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICBvZmZzZXQ6ICcxMCwxMCdcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFycm93OiB7XG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgZWxlbWVudDogYXJyb3dcbiAgICAgICAgICB9XG4gICAgICB9LCBcbiAgICB9KTsgIFxuICAgIHNldFRpbWVvdXQgKCAoKSA9PiB7IHBvcHBlci51cGRhdGUoKTsgfSAsIDIwMCk7ICAgICBcbiAgfVxuXG4gIGV4cG9ydFN1Y2Nlc3MoYXBwTGluayl7XG4gICAgdGhpcy5wbGF0Zm9ybS5leHBvcnRTdWNjZXNzKGFwcExpbmspO1xuICB9XG5cbiAgLyoqIFxuICAgKiBAcGFyYW0gc3RyaW5nIGNhdGVnb3J5IFxuICAgKiBAcGFyYW0gc3RyaW5nIGFjdGlvbiBcbiAgICogQHBhcmFtIHN0cmluZyBsYWJlbCBcbiAgICovXG4gIHNlbmRBbmFseXRpY3NFdmVudChjYXRlZ29yeSwgYWN0aW9uLCBsYWJlbCkge1xuICAgICAgZ2EoJ3NoaXB0aW1pemUuc2VuZCcsICdldmVudCcsIGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsLCB7IHRyYW5zcG9ydDogJ2JlYWNvbicgfSk7XG4gIH1cblxuICBsb2FkQW5hbHl0aWNzKCkge1xuICAgICAgaWYgKHR5cGVvZihnYSkgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAoZnVuY3Rpb24oaSwgcywgbywgZywgciwgYSwgbSkge1xuICAgICAgICAgICAgICBpWydHb29nbGVBbmFseXRpY3NPYmplY3QnXSA9IHI7XG4gICAgICAgICAgICAgIGlbcl0gPSBpW3JdIHx8IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgKGlbcl0ucSA9IGlbcl0ucSB8fCBbXSkucHVzaChhcmd1bWVudHMpXG4gICAgICAgICAgICAgIH0sIGlbcl0ubCA9IDEgKiBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICBhID0gcy5jcmVhdGVFbGVtZW50KG8pLFxuICAgICAgICAgICAgICAgICAgbSA9IHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUobylbMF07XG4gICAgICAgICAgICAgIGEuYXN5bmMgPSAxO1xuICAgICAgICAgICAgICBhLnNyYyA9IGc7XG4gICAgICAgICAgICAgIG0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSwgbSlcbiAgICAgICAgICB9KSh3aW5kb3csIGRvY3VtZW50LCAnc2NyaXB0JywgJ2h0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2FuYWx5dGljcy5qcycsICdnYScpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiaW5zZXJ0aW5nIGFuYWx5dGljcyBcIik7XG4gICAgICB9IFxuICAgICAgZ2EoJ2NyZWF0ZScsICdVQS0xMDE0ODU2NDMtMScsICdhdXRvJywgJ3NoaXB0aW1pemUnKTtcbiAgICAgIGdhKCdzaGlwdGltaXplLnNldCcsICdhbm9ueW1pemVJcCcsIHRydWUpO1xuICAgICAgY29uc29sZS5sb2coXCJjcmVhdGluZyB0cmFja2VyXCIpO1xuICB9XG5cbiAgcHJpbnRsYWJlbChldmVudCwgb3JkZXJpZCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBcbiAgICBjb25zb2xlLmxvZyAoXCJQcmludGluZyBsYWJlbCBmb3Igb3JkZXJpZCBcIiwgb3JkZXJpZCk7XG5cbiAgICB2YXIgZGF0YSA9IHtcbiAgICAgICdhY3Rpb24nOiAnc2hpcHRpbWl6ZV9wcmludF9sYWJlbCcsIFxuICAgICAgJ29yZGVyaWQnOiBvcmRlcmlkXG4gICAgfTsgXG5cbiAgICB0aGlzLm9wZW5Mb2FkZXIoc2hpcHRpbWl6ZV9sYWJlbF9yZXF1ZXN0KTsgXG5cbiAgICBqUXVlcnkucG9zdChhamF4dXJsLCBkYXRhLCAoZGF0YSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coZGF0YSk7IFxuXG4gICAgICBpZiAodHlwZW9mKGRhdGEucmVzcG9uc2UpICE9ICd1bmRlZmluZWQnICkge1xuICAgICAgICAgIGlmKHR5cGVvZihkYXRhLnJlc3BvbnNlLkVycm9yKSAhPSAndW5kZWZpbmVkJyAmJiBkYXRhLnJlc3BvbnNlLkVycm9yLklkID4gMCkge1xuICAgICAgICAgICAgdGhpcy5sb2FkZXJNc2coZGF0YS5yZXNwb25zZS5FcnJvci5JbmZvKTtcblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMuY2xvc2VMb2FkZXIoKTsgfSwgMjAwMCk7ICBcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZih0eXBlb2YoZGF0YS5yZXNwb25zZS5DYWxsYmFja1VSTCkgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMubW9uaXRvckxhYmVsU3RhdHVzKGRhdGEucmVzcG9uc2UuQ2FsbGJhY2tVUkwpOyAgICAgICAgICAgICBcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKHR5cGVvZihkYXRhLmVycm9ycykgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy5sb2FkZXJNc2coZGF0YS5lcnJvcnMuam9pbignPGJyLz4nKSk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmNsb3NlTG9hZGVyKCk7IH0sIDUwMDApOyAgXG4gICAgICB9XG4gICAgfSwgXCJqc29uXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGhlIGxhYmVsIHN0YXR1cyBldmVyeSAxcyBcbiAgICovXG4gIG1vbml0b3JMYWJlbFN0YXR1cyhjYWxsYmFja1VybCkge1xuICAgIHZhciBkYXRhID0ge1xuICAgICAgJ2FjdGlvbic6ICdzaGlwdGltaXplX2xhYmVsX3N0YXR1cycsXG4gICAgICAnY2FsbGJhY2tVcmwnOiBjYWxsYmFja1VybFxuICAgIH07IFxuXG4gICAgalF1ZXJ5LnBvc3QoYWpheHVybCwgZGF0YSwgKGRhdGEpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGRhdGEpOyBcblxuICAgICAgaWYodHlwZW9mKGRhdGEucmVzcG9uc2UpIT0gJ3VuZGVmaW5lZCcpIHtcblxuICAgICAgICAvLyBDaGVjayBmb3IgZmFsdGEgZXJyb3JzIFxuICAgICAgICBpZihkYXRhLmh0dHBDb2RlID09ICcyMDAnKSB7XG4gICAgICAgICAgdGhpcy5sb2FkZXJNc2coc2hpcHRpbWl6ZV9sYWJlbF9yZXF1ZXN0ICsgJyAnICsgZGF0YS5yZXNwb25zZS5GaW5pc2hlZCArICclJyk7ICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2FkZXJNc2coXCJGYXRhbCBBUEkgZXJyb3IgXCIgKyBkYXRhLmh0dHBDb2RlKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5jbG9zZUxvYWRlcigpOyB9LCA1MDAwKTtcbiAgICAgICAgICByZXR1cm47IFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJpbnQgQVBJIGVycm9yc1xuICAgICAgICBpZiAoZGF0YS5yZXNwb25zZS5FcnJvci5JZCA+IDApIHtcbiAgICAgICAgICB0aGlzLmxvYWRlck1zZyhkYXRhLnJlc3BvbnNlLkVycm9yLkluZm8pOyBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGRhdGEucmVzcG9uc2UuRXJyb3IuSWQgPT0gOTAyKSB7IC8vTm8gcHJvY2VzcyBydW5uaW5nIFxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGVyKClcbiAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGRhdGEucmVzcG9uc2UuRmluaXNoZWQgPT0gMTAwICkge1xuICAgICAgICAgIGlmICggZGF0YS5yZXNwb25zZS5MYWJlbEZpbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGxhYmVsaW5mbyA9IHNoaXB0aW1pemVfbGFiZWxfY2xpY2sucmVwbGFjZSgnJScsYDxhIGhyZWY9XCIke2RhdGEucmVzcG9uc2UuTGFiZWxGaWxlfVwiIHRhcmdldD0nX2JsYW5rJz4ke3NoaXB0aW1pemVfbGFiZWxfbGFiZWx9PC9hPmApO1xuICAgICAgICAgICAgbGV0IG5vdGljZWxpc3QgPSBqUXVlcnkoXCIjd3BfX25vdGljZS1saXN0XCIpOyBcbiAgICAgICAgICAgIG5vdGljZWxpc3QucmVtb3ZlQ2xhc3MoJ3dvb2NvbW1lcmNlLWxheW91dF9fbm90aWNlLWxpc3QtaGlkZScpOyBcbiAgICAgICAgICAgIG5vdGljZWxpc3QuYXBwZW5kKGA8ZGl2IGNsYXNzPVwibm90aWNlIG5vdGljZS1pbmZvIGlzLWRpc21pc3NpYmxlIHVwZGF0ZWRcIj4ke2xhYmVsaW5mb308L2Rpdj5gKTtcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKGRhdGEucmVzcG9uc2UuTGFiZWxGaWxlLCdfYmxhbmsnKTsgXG4gICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGVyKCk7XG5cbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqIE1ha2Ugc3VyZSB0aGUgaW5mbyBpcyB1cGRhdGVkIHdpdGhvdXQgdGhlIG5lZWQgdG8gcmVsb2FkIHRoZSBwYWdlIFxuICAgICAgICAgICAgICovIFxuICAgICAgICAgICAgZm9yKHZhciB4ID0wOyB4IDwgZGF0YS5yZXNwb25zZS5DbGllbnRSZWZlcmVuY2VDb2RlTGlzdC5sZW5ndGg7ICsreCkge1xuICAgICAgICAgICAgICB2YXIgbGFiZWxyZXN1bHQgPSBkYXRhLnJlc3BvbnNlLkNsaWVudFJlZmVyZW5jZUNvZGVMaXN0W3hdOyBcbiAgICAgICAgICAgICAgaWYobGFiZWxyZXN1bHQuRXJyb3IuSWQgPT0gMCkgeyBcbiAgICAgICAgICAgICAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS1sYWJlbFwiICsgbGFiZWxyZXN1bHQuUmVmZXJlbmNlQ29kZSkuYWRkQ2xhc3MoJ3NoaXB0aW1pemUtaWNvbi1wcmludC1wcmludGVkJyk7ICAgXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgalF1ZXJ5KFwiI3NoaXB0aW1pemUtbGFiZWxcIiArIGxhYmVscmVzdWx0LlJlZmVyZW5jZUNvZGUpLmFkZENsYXNzKFwic2hpcHRpbWl6ZS1pY29uLXByaW50LWVycm9yXCIpOyAgXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGpRdWVyeShcIiNzaGlwdGltaXplLXRvb2x0aXBcIiArIGxhYmVscmVzdWx0LlJlZmVyZW5jZUNvZGUpLmh0bWwobGFiZWxyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1zZyA9ICcnOyBcbiAgICAgICAgICAgIGZvciAoIHZhciB4PTA7IHggPCBkYXRhLnJlc3BvbnNlLkNsaWVudFJlZmVyZW5jZUNvZGVMaXN0Lmxlbmd0aDsgKyt4ICkge1xuICAgICAgICAgICAgICBsZXQgbGFiZWxyZXN1bHQgPSBkYXRhLnJlc3BvbnNlLkNsaWVudFJlZmVyZW5jZUNvZGVMaXN0WzBdOyBcbiAgICAgICAgICAgICAgaWYobGFiZWxyZXN1bHQuRXJyb3IuSWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgbXNnICs9IFwiPGRpdiBjbGFzcz0nc2hpcHRpbWl6ZS1sYWJlbC1lcnJvciBlcnJvcic+XCIgKyBsYWJlbHJlc3VsdC5FcnJvci5JbmZvICsgXCI8L2Rpdj5cIjsgXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgalF1ZXJ5KFwiI3NoaXB0aW1pemUtbGFiZWxcIiArIGxhYmVscmVzdWx0LlJlZmVyZW5jZUNvZGUpLmFkZENsYXNzKFwic2hpcHRpbWl6ZS1pY29uLXByaW50LWVycm9yXCIpOyAgXG4gICAgICAgICAgICAgIGpRdWVyeShcIiNzaGlwdGltaXplLXRvb2x0aXBcIiArIGxhYmVscmVzdWx0LlJlZmVyZW5jZUNvZGUpLmh0bWwobGFiZWxyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGVyTXNnKG1zZyk7IFxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMuY2xvc2VMb2FkZXIoKTsgfSwgNTAwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoZGF0YS5yZXNwb25zZS5GaW5pc2hlZCA8IDEwMCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoICgpID0+IHsgdGhpcy5tb25pdG9yTGFiZWxTdGF0dXMoY2FsbGJhY2tVcmwpOyB9LCAyMDAwKTsgXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0sIFwianNvblwiKTtcbiAgfVxuXG4gIGxvYWRlck1zZyhtZXNzYWdlKSB7XG4gICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtbG9hZGVyLW1lc3NhZ2VcIikuaHRtbChtZXNzYWdlKTsgXG4gIH1cblxuICBvcGVuTG9hZGVyKG1lc3NhZ2UpIHtcbiAgICBqUXVlcnkoJ2JvZHknKS5hcHBlbmQoJzxkaXYgY2xhc3M9XCJzaGlwdGltaXplLWxvYWRlci13cmFwcGVyXCI+PGRpdiBjbGFzcz1cInNoaXB0aW1pemUtbG9hZGVyXCI+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz1cInNoaXB0aW1pemUtbG9hZGVyLW1lc3NhZ2VcIj4nICsgbWVzc2FnZSAgKyAnPC9kaXY+PC9kaXY+Jyk7IFxuICB9XG5cbiAgY2xvc2VMb2FkZXIoKXtcbiAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1sb2FkZXItd3JhcHBlclwiKS5yZW1vdmUoKTsgXG4gIH1cbn1cblxualF1ZXJ5KGZ1bmN0aW9uICgpIHtcbiAgd2luZG93LnNoaXB0aW1pemUgPSBuZXcgU2hpcHRpbWl6ZSgpO1xuICB3aW5kb3cuc2hpcHRpbWl6ZS5ib290c3RyYXAoKTsgXG4gIHdpbmRvdy5Qb3BwZXIgPSBQb3BwZXI7XG59KTtcblxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./shiptimize-admin.js\n"); 169 170 /***/ }) 171 172 /******/ }); -
shiptimize-for-woocommerce/trunk/assets/js/shiptimize-dokan.js
r2724326 r2746465 1 !function(i){var t={};function r(e){if(t[e])return t[e].exports;var n=t[e]={i:e,l:!1,exports:{}};return i[e].call(n.exports,n,n.exports,r),n.l=!0,n.exports}r.m=i,r.c=t,r.d=function(e,n,i){r.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:i})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(n,e){if(1&e&&(n=r(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var t in n)r.d(i,t,function(e){return n[e]}.bind(null,t));return i},r.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},r.p="/shiptimize-for-woocommerce/assets/js",r(r.s=14)}({14:function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\n/** \n * Add any aditional functionality we need in the vendor dashboard \n */\nvar ShiptimizeDokan = function () {\n function ShiptimizeDokan() {\n _classCallCheck(this, ShiptimizeDokan);\n }\n\n _createClass(ShiptimizeDokan, [{\n key: "export",\n value: function _export(data) {\n jQuery("<div class=\'shiptimize-sending\'>" + shiptimize_label_sending + "</div>").insertBefore(\'.shiptimize-export-btn\');\n jQuery.ajax({\n url: dokan.ajaxurl,\n method: \'GET\',\n data: data,\n success: function success(resp) {\n jQuery(".shiptimize-sending").remove();\n jQuery(resp).insertAfter(\'.shiptimize-export-btn\');\n },\n error: function error(err) {\n jQuery(".shiptimize-sending").remove();\n jQuery("An error has occurred " + JSON.stringify(err)).insertAfter(".shiptimize-export-btn");\n }\n });\n }\n }, {\n key: "exportSelected",\n value: function exportSelected() {\n var selectedIds = [];\n jQuery("input[name=\'bulk_orders[]\']:checked").each(function (idx, elem) {\n selectedIds[idx] = jQuery(elem).val();\n });\n\n if (selectedIds.length == 0) {\n alert("No orders are selected");\n return;\n }\n var data = {\n \'action\': \'shiptimize_dokan_export_selected\',\n \'ids\': selectedIds\n };\n\n this.export(data);\n }\n }, {\n key: "exportAll",\n value: function exportAll() {\n var data = {\n \'action\': \'shiptimize_dokan_export_all\'\n };\n\n this.export(data);\n }\n }]);\n\n return ShiptimizeDokan;\n}();\n\njQuery(function () {\n window.shiptimize_dokan = new ShiptimizeDokan();\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLWRva2FuLmpzP2FmNDUiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZURva2FuIiwiZGF0YSIsImpRdWVyeSIsInNoaXB0aW1pemVfbGFiZWxfc2VuZGluZyIsImluc2VydEJlZm9yZSIsImFqYXgiLCJ1cmwiLCJkb2thbiIsImFqYXh1cmwiLCJtZXRob2QiLCJzdWNjZXNzIiwicmVzcCIsInJlbW92ZSIsImluc2VydEFmdGVyIiwiZXJyb3IiLCJlcnIiLCJKU09OIiwic3RyaW5naWZ5Iiwic2VsZWN0ZWRJZHMiLCJlYWNoIiwiaWR4IiwiZWxlbSIsInZhbCIsImxlbmd0aCIsImFsZXJ0IiwiZXhwb3J0Iiwid2luZG93Iiwic2hpcHRpbWl6ZV9kb2thbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7OztJQUdNQSxlO0FBRUosNkJBQWM7QUFBQTtBQUFFOzs7OzRCQUVSQyxJLEVBQU07QUFDWkMsYUFBTyxxQ0FBcUNDLHdCQUFyQyxHQUFnRSxRQUF2RSxFQUFpRkMsWUFBakYsQ0FBOEYsd0JBQTlGO0FBQ0FGLGFBQU9HLElBQVAsQ0FBWTtBQUNWQyxhQUFLQyxNQUFNQyxPQUREO0FBRVZDLGdCQUFRLEtBRkU7QUFHVlIsY0FBTUEsSUFISTtBQUlWUyxpQkFBUyxpQkFBVUMsSUFBVixFQUFnQjtBQUN2QlQsaUJBQU8scUJBQVAsRUFBOEJVLE1BQTlCO0FBQ0FWLGlCQUFPUyxJQUFQLEVBQ0dFLFdBREgsQ0FDZSx3QkFEZjtBQUVELFNBUlM7QUFTVkMsZUFBTyxlQUFVQyxHQUFWLEVBQWU7QUFDcEJiLGlCQUFPLHFCQUFQLEVBQThCVSxNQUE5QjtBQUNBVixpQkFBTywyQkFBMkJjLEtBQUtDLFNBQUwsQ0FBZUYsR0FBZixDQUFsQyxFQUNHRixXQURILENBQ2Usd0JBRGY7QUFFRDtBQWJTLE9BQVo7QUFlRDs7O3FDQUVnQjtBQUNmLFVBQUlLLGNBQWMsRUFBbEI7QUFDQWhCLGFBQU8scUNBQVAsRUFDR2lCLElBREgsQ0FDUSxVQUFVQyxHQUFWLEVBQWVDLElBQWYsRUFBcUI7QUFDekJILG9CQUFZRSxHQUFaLElBQW1CbEIsT0FBT21CLElBQVAsRUFDaEJDLEdBRGdCLEVBQW5CO0FBRUQsT0FKSDs7QUFNQSxVQUFJSixZQUFZSyxNQUFaLElBQXNCLENBQTFCLEVBQTZCO0FBQzNCQyxjQUFNLHdCQUFOO0FBQ0E7QUFDRDtBQUNELFVBQUl2QixPQUFPO0FBQ1Qsa0JBQVUsa0NBREQ7QUFFVCxlQUFPaUI7QUFGRSxPQUFYOztBQUtBLFdBQUtPLE1BQUwsQ0FBWXhCLElBQVo7QUFDRDs7O2dDQUVXO0FBQ1YsVUFBSUEsT0FBTztBQUNULGtCQUFVO0FBREQsT0FBWDs7QUFJQSxXQUFLd0IsTUFBTCxDQUFZeEIsSUFBWjtBQUNEOzs7Ozs7QUFJSEMsT0FBTyxZQUFZO0FBQ2pCd0IsU0FBT0MsZ0JBQVAsR0FBMEIsSUFBSTNCLGVBQUosRUFBMUI7QUFDRCxDQUZEIiwiZmlsZSI6IjE0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFxuICogQWRkIGFueSBhZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB3ZSBuZWVkIGluIHRoZSB2ZW5kb3IgZGFzaGJvYXJkIFxuICovXG5jbGFzcyBTaGlwdGltaXplRG9rYW4ge1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBleHBvcnQgKGRhdGEpIHtcbiAgICBqUXVlcnkoXCI8ZGl2IGNsYXNzPSdzaGlwdGltaXplLXNlbmRpbmcnPlwiICsgc2hpcHRpbWl6ZV9sYWJlbF9zZW5kaW5nICsgXCI8L2Rpdj5cIikuaW5zZXJ0QmVmb3JlKCcuc2hpcHRpbWl6ZS1leHBvcnQtYnRuJyk7XG4gICAgalF1ZXJ5LmFqYXgoe1xuICAgICAgdXJsOiBkb2thbi5hamF4dXJsLFxuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcCkge1xuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1zZW5kaW5nXCIpLnJlbW92ZSgpO1xuICAgICAgICBqUXVlcnkocmVzcClcbiAgICAgICAgICAuaW5zZXJ0QWZ0ZXIoJy5zaGlwdGltaXplLWV4cG9ydC1idG4nKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZnVuY3Rpb24gKGVycikge1xuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1zZW5kaW5nXCIpLnJlbW92ZSgpO1xuICAgICAgICBqUXVlcnkoXCJBbiBlcnJvciBoYXMgb2NjdXJyZWQgXCIgKyBKU09OLnN0cmluZ2lmeShlcnIpKVxuICAgICAgICAgIC5pbnNlcnRBZnRlcihcIi5zaGlwdGltaXplLWV4cG9ydC1idG5cIik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBleHBvcnRTZWxlY3RlZCgpIHtcbiAgICBsZXQgc2VsZWN0ZWRJZHMgPSBbXTtcbiAgICBqUXVlcnkoXCJpbnB1dFtuYW1lPSdidWxrX29yZGVyc1tdJ106Y2hlY2tlZFwiKVxuICAgICAgLmVhY2goZnVuY3Rpb24gKGlkeCwgZWxlbSkge1xuICAgICAgICBzZWxlY3RlZElkc1tpZHhdID0galF1ZXJ5KGVsZW0pXG4gICAgICAgICAgLnZhbCgpO1xuICAgICAgfSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRJZHMubGVuZ3RoID09IDApIHtcbiAgICAgIGFsZXJ0KFwiTm8gb3JkZXJzIGFyZSBzZWxlY3RlZFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGRhdGEgPSB7XG4gICAgICAnYWN0aW9uJzogJ3NoaXB0aW1pemVfZG9rYW5fZXhwb3J0X3NlbGVjdGVkJyxcbiAgICAgICdpZHMnOiBzZWxlY3RlZElkc1xuICAgIH07XG5cbiAgICB0aGlzLmV4cG9ydChkYXRhKTtcbiAgfVxuXG4gIGV4cG9ydEFsbCgpIHtcbiAgICBsZXQgZGF0YSA9IHtcbiAgICAgICdhY3Rpb24nOiAnc2hpcHRpbWl6ZV9kb2thbl9leHBvcnRfYWxsJ1xuICAgIH07XG5cbiAgICB0aGlzLmV4cG9ydChkYXRhKTtcbiAgfVxufVxuXG5cbmpRdWVyeShmdW5jdGlvbiAoKSB7XG4gIHdpbmRvdy5zaGlwdGltaXplX2Rva2FuID0gbmV3IFNoaXB0aW1pemVEb2thbigpO1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///14\n')}}); 1 /******/ (function(modules) { // webpackBootstrap 2 /******/ // The module cache 3 /******/ var installedModules = {}; 4 /******/ 5 /******/ // The require function 6 /******/ function __webpack_require__(moduleId) { 7 /******/ 8 /******/ // Check if module is in cache 9 /******/ if(installedModules[moduleId]) { 10 /******/ return installedModules[moduleId].exports; 11 /******/ } 12 /******/ // Create a new module (and put it into the cache) 13 /******/ var module = installedModules[moduleId] = { 14 /******/ i: moduleId, 15 /******/ l: false, 16 /******/ exports: {} 17 /******/ }; 18 /******/ 19 /******/ // Execute the module function 20 /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 21 /******/ 22 /******/ // Flag the module as loaded 23 /******/ module.l = true; 24 /******/ 25 /******/ // Return the exports of the module 26 /******/ return module.exports; 27 /******/ } 28 /******/ 29 /******/ 30 /******/ // expose the modules object (__webpack_modules__) 31 /******/ __webpack_require__.m = modules; 32 /******/ 33 /******/ // expose the module cache 34 /******/ __webpack_require__.c = installedModules; 35 /******/ 36 /******/ // define getter function for harmony exports 37 /******/ __webpack_require__.d = function(exports, name, getter) { 38 /******/ if(!__webpack_require__.o(exports, name)) { 39 /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); 40 /******/ } 41 /******/ }; 42 /******/ 43 /******/ // define __esModule on exports 44 /******/ __webpack_require__.r = function(exports) { 45 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 46 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 47 /******/ } 48 /******/ Object.defineProperty(exports, '__esModule', { value: true }); 49 /******/ }; 50 /******/ 51 /******/ // create a fake namespace object 52 /******/ // mode & 1: value is a module id, require it 53 /******/ // mode & 2: merge all properties of value into the ns 54 /******/ // mode & 4: return value when already ns object 55 /******/ // mode & 8|1: behave like require 56 /******/ __webpack_require__.t = function(value, mode) { 57 /******/ if(mode & 1) value = __webpack_require__(value); 58 /******/ if(mode & 8) return value; 59 /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; 60 /******/ var ns = Object.create(null); 61 /******/ __webpack_require__.r(ns); 62 /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); 63 /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); 64 /******/ return ns; 65 /******/ }; 66 /******/ 67 /******/ // getDefaultExport function for compatibility with non-harmony modules 68 /******/ __webpack_require__.n = function(module) { 69 /******/ var getter = module && module.__esModule ? 70 /******/ function getDefault() { return module['default']; } : 71 /******/ function getModuleExports() { return module; }; 72 /******/ __webpack_require__.d(getter, 'a', getter); 73 /******/ return getter; 74 /******/ }; 75 /******/ 76 /******/ // Object.prototype.hasOwnProperty.call 77 /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 78 /******/ 79 /******/ // __webpack_public_path__ 80 /******/ __webpack_require__.p = "/shiptimize-for-woocommerce/assets/js"; 81 /******/ 82 /******/ 83 /******/ // Load entry module and return exports 84 /******/ return __webpack_require__(__webpack_require__.s = "./js/shiptimize-dokan.js"); 85 /******/ }) 86 /************************************************************************/ 87 /******/ ({ 88 89 /***/ "./js/shiptimize-dokan.js": 90 /*!********************************!*\ 91 !*** ./js/shiptimize-dokan.js ***! 92 \********************************/ 93 /*! no static exports found */ 94 /***/ (function(module, exports, __webpack_require__) { 95 96 "use strict"; 97 eval("\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/** \n * Add any aditional functionality we need in the vendor dashboard \n */\nvar ShiptimizeDokan = function () {\n function ShiptimizeDokan() {\n _classCallCheck(this, ShiptimizeDokan);\n }\n\n _createClass(ShiptimizeDokan, [{\n key: \"export\",\n value: function _export(data) {\n jQuery(\"<div class='shiptimize-sending'>\" + shiptimize_label_sending + \"</div>\").insertBefore('.shiptimize-export-btn');\n jQuery.ajax({\n url: dokan.ajaxurl,\n method: 'GET',\n data: data,\n success: function success(resp) {\n jQuery(\".shiptimize-sending\").remove();\n jQuery(resp).insertAfter('.shiptimize-export-btn');\n },\n error: function error(err) {\n jQuery(\".shiptimize-sending\").remove();\n jQuery(\"An error has occurred \" + JSON.stringify(err)).insertAfter(\".shiptimize-export-btn\");\n }\n });\n }\n }, {\n key: \"exportSelected\",\n value: function exportSelected() {\n var selectedIds = [];\n jQuery(\"input[name='bulk_orders[]']:checked\").each(function (idx, elem) {\n selectedIds[idx] = jQuery(elem).val();\n });\n\n if (selectedIds.length == 0) {\n alert(\"No orders are selected\");\n return;\n }\n var data = {\n 'action': 'shiptimize_dokan_export_selected',\n 'ids': selectedIds\n };\n\n this.export(data);\n }\n }, {\n key: \"exportAll\",\n value: function exportAll() {\n var data = {\n 'action': 'shiptimize_dokan_export_all'\n };\n\n this.export(data);\n }\n }]);\n\n return ShiptimizeDokan;\n}();\n\njQuery(function () {\n window.shiptimize_dokan = new ShiptimizeDokan();\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLWRva2FuLmpzP2FmNDUiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZURva2FuIiwiZGF0YSIsImpRdWVyeSIsInNoaXB0aW1pemVfbGFiZWxfc2VuZGluZyIsImluc2VydEJlZm9yZSIsImFqYXgiLCJ1cmwiLCJkb2thbiIsImFqYXh1cmwiLCJtZXRob2QiLCJzdWNjZXNzIiwicmVzcCIsInJlbW92ZSIsImluc2VydEFmdGVyIiwiZXJyb3IiLCJlcnIiLCJKU09OIiwic3RyaW5naWZ5Iiwic2VsZWN0ZWRJZHMiLCJlYWNoIiwiaWR4IiwiZWxlbSIsInZhbCIsImxlbmd0aCIsImFsZXJ0IiwiZXhwb3J0Iiwid2luZG93Iiwic2hpcHRpbWl6ZV9kb2thbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7OztJQUdNQSxlO0FBRUosNkJBQWM7QUFBQTtBQUFFOzs7OzRCQUVSQyxJLEVBQU07QUFDWkMsYUFBTyxxQ0FBcUNDLHdCQUFyQyxHQUFnRSxRQUF2RSxFQUFpRkMsWUFBakYsQ0FBOEYsd0JBQTlGO0FBQ0FGLGFBQU9HLElBQVAsQ0FBWTtBQUNWQyxhQUFLQyxNQUFNQyxPQUREO0FBRVZDLGdCQUFRLEtBRkU7QUFHVlIsY0FBTUEsSUFISTtBQUlWUyxpQkFBUyxpQkFBVUMsSUFBVixFQUFnQjtBQUN2QlQsaUJBQU8scUJBQVAsRUFBOEJVLE1BQTlCO0FBQ0FWLGlCQUFPUyxJQUFQLEVBQ0dFLFdBREgsQ0FDZSx3QkFEZjtBQUVELFNBUlM7QUFTVkMsZUFBTyxlQUFVQyxHQUFWLEVBQWU7QUFDcEJiLGlCQUFPLHFCQUFQLEVBQThCVSxNQUE5QjtBQUNBVixpQkFBTywyQkFBMkJjLEtBQUtDLFNBQUwsQ0FBZUYsR0FBZixDQUFsQyxFQUNHRixXQURILENBQ2Usd0JBRGY7QUFFRDtBQWJTLE9BQVo7QUFlRDs7O3FDQUVnQjtBQUNmLFVBQUlLLGNBQWMsRUFBbEI7QUFDQWhCLGFBQU8scUNBQVAsRUFDR2lCLElBREgsQ0FDUSxVQUFVQyxHQUFWLEVBQWVDLElBQWYsRUFBcUI7QUFDekJILG9CQUFZRSxHQUFaLElBQW1CbEIsT0FBT21CLElBQVAsRUFDaEJDLEdBRGdCLEVBQW5CO0FBRUQsT0FKSDs7QUFNQSxVQUFJSixZQUFZSyxNQUFaLElBQXNCLENBQTFCLEVBQTZCO0FBQzNCQyxjQUFNLHdCQUFOO0FBQ0E7QUFDRDtBQUNELFVBQUl2QixPQUFPO0FBQ1Qsa0JBQVUsa0NBREQ7QUFFVCxlQUFPaUI7QUFGRSxPQUFYOztBQUtBLFdBQUtPLE1BQUwsQ0FBWXhCLElBQVo7QUFDRDs7O2dDQUVXO0FBQ1YsVUFBSUEsT0FBTztBQUNULGtCQUFVO0FBREQsT0FBWDs7QUFJQSxXQUFLd0IsTUFBTCxDQUFZeEIsSUFBWjtBQUNEOzs7Ozs7QUFJSEMsT0FBTyxZQUFZO0FBQ2pCd0IsU0FBT0MsZ0JBQVAsR0FBMEIsSUFBSTNCLGVBQUosRUFBMUI7QUFDRCxDQUZEIiwiZmlsZSI6Ii4vanMvc2hpcHRpbWl6ZS1kb2thbi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBcbiAqIEFkZCBhbnkgYWRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgd2UgbmVlZCBpbiB0aGUgdmVuZG9yIGRhc2hib2FyZCBcbiAqL1xuY2xhc3MgU2hpcHRpbWl6ZURva2FuIHtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgZXhwb3J0IChkYXRhKSB7XG4gICAgalF1ZXJ5KFwiPGRpdiBjbGFzcz0nc2hpcHRpbWl6ZS1zZW5kaW5nJz5cIiArIHNoaXB0aW1pemVfbGFiZWxfc2VuZGluZyArIFwiPC9kaXY+XCIpLmluc2VydEJlZm9yZSgnLnNoaXB0aW1pemUtZXhwb3J0LWJ0bicpO1xuICAgIGpRdWVyeS5hamF4KHtcbiAgICAgIHVybDogZG9rYW4uYWpheHVybCxcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3ApIHtcbiAgICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtc2VuZGluZ1wiKS5yZW1vdmUoKTtcbiAgICAgICAgalF1ZXJ5KHJlc3ApXG4gICAgICAgICAgLmluc2VydEFmdGVyKCcuc2hpcHRpbWl6ZS1leHBvcnQtYnRuJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtc2VuZGluZ1wiKS5yZW1vdmUoKTtcbiAgICAgICAgalF1ZXJ5KFwiQW4gZXJyb3IgaGFzIG9jY3VycmVkIFwiICsgSlNPTi5zdHJpbmdpZnkoZXJyKSlcbiAgICAgICAgICAuaW5zZXJ0QWZ0ZXIoXCIuc2hpcHRpbWl6ZS1leHBvcnQtYnRuXCIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0U2VsZWN0ZWQoKSB7XG4gICAgbGV0IHNlbGVjdGVkSWRzID0gW107XG4gICAgalF1ZXJ5KFwiaW5wdXRbbmFtZT0nYnVsa19vcmRlcnNbXSddOmNoZWNrZWRcIilcbiAgICAgIC5lYWNoKGZ1bmN0aW9uIChpZHgsIGVsZW0pIHtcbiAgICAgICAgc2VsZWN0ZWRJZHNbaWR4XSA9IGpRdWVyeShlbGVtKVxuICAgICAgICAgIC52YWwoKTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKHNlbGVjdGVkSWRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICBhbGVydChcIk5vIG9yZGVycyBhcmUgc2VsZWN0ZWRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBkYXRhID0ge1xuICAgICAgJ2FjdGlvbic6ICdzaGlwdGltaXplX2Rva2FuX2V4cG9ydF9zZWxlY3RlZCcsXG4gICAgICAnaWRzJzogc2VsZWN0ZWRJZHNcbiAgICB9O1xuXG4gICAgdGhpcy5leHBvcnQoZGF0YSk7XG4gIH1cblxuICBleHBvcnRBbGwoKSB7XG4gICAgbGV0IGRhdGEgPSB7XG4gICAgICAnYWN0aW9uJzogJ3NoaXB0aW1pemVfZG9rYW5fZXhwb3J0X2FsbCdcbiAgICB9O1xuXG4gICAgdGhpcy5leHBvcnQoZGF0YSk7XG4gIH1cbn1cblxuXG5qUXVlcnkoZnVuY3Rpb24gKCkge1xuICB3aW5kb3cuc2hpcHRpbWl6ZV9kb2thbiA9IG5ldyBTaGlwdGltaXplRG9rYW4oKTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./js/shiptimize-dokan.js\n"); 98 99 /***/ }) 100 101 /******/ }); -
shiptimize-for-woocommerce/trunk/assets/js/shiptimize-wcfm.js
r2724326 r2746465 1 !function(e){var B={};function F(Q){if(B[Q])return B[Q].exports;var i=B[Q]={i:Q,l:!1,exports:{}};return e[Q].call(i.exports,i,i.exports,F),i.l=!0,i.exports}F.m=e,F.c=B,F.d=function(Q,i,e){F.o(Q,i)||Object.defineProperty(Q,i,{enumerable:!0,get:e})},F.r=function(Q){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(Q,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(Q,"__esModule",{value:!0})},F.t=function(i,Q){if(1&Q&&(i=F(i)),8&Q)return i;if(4&Q&&"object"==typeof i&&i&&i.__esModule)return i;var e=Object.create(null);if(F.r(e),Object.defineProperty(e,"default",{enumerable:!0,value:i}),2&Q&&"string"!=typeof i)for(var B in i)F.d(e,B,function(Q){return i[Q]}.bind(null,B));return e},F.n=function(Q){var i=Q&&Q.__esModule?function(){return Q.default}:function(){return Q};return F.d(i,"a",i),i},F.o=function(Q,i){return Object.prototype.hasOwnProperty.call(Q,i)},F.p="/shiptimize-for-woocommerce/assets/js",F(F.s=13)}({13:function(module,exports,__webpack_require__){"use strict";eval("\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/** \n * Add any aditional functionality we need in the vendor dashboard \n */\nvar ShiptimizeWCFM = function () {\n function ShiptimizeWCFM() {\n var _this = this;\n\n _classCallCheck(this, ShiptimizeWCFM);\n\n /** \n * Because wcfm will first build the structure for the rules and only then set hte values \n */\n this.shipping_methods = ['wcfmmp_shipping_rates_by_weight', 'wcfmmp_shipping_rates'];\n\n if (jQuery(\"#enable_store_shipping\").size() > 0) {\n this.appendSelectors();\n }\n\n /** \n * On save if keys are set then check if they produced a valid token \n */\n jQuery(\"#wcfm_settings_save_button\").on('click', function (evt) {\n if (jQuery(\"input[name='shiptimize_public_key']\").val() && jQuery(\"input[name='shiptimize_private_key']\").val()) {\n setTimeout(function () {\n _this.checkIfKeysAreValid();\n }, 500);\n }\n });\n }\n\n _createClass(ShiptimizeWCFM, [{\n key: 'appendSelectors',\n value: function appendSelectors() {\n var _this2 = this;\n\n var eCarrierOption = jQuery(\"<div><p class='wcfm_title'><strong>Shiptimize</strong></p></div>\");\n var eCarriers = jQuery(\"<select class='wcfm-select shiptimize_carrier'><option>-</option>\");\n\n for (var x = 0; x < shiptimize_carriers.length; ++x) {\n eCarriers.append(\"<option value='\" + shiptimize_carriers[x].Id + \"'>\" + shiptimize_carriers[x].Name + \"</option>\");\n }\n\n eCarrierOption.append(eCarriers);\n\n for (var x = 0; x < this.shipping_methods.length; ++x) {\n this.appendShiptimizeTo(this.shipping_methods[x], eCarrierOption);\n }\n\n setTimeout(function () {\n _this2.setSelectedCarrier();\n }, 1000);\n }\n }, {\n key: 'checkIfKeysAreValid',\n value: function checkIfKeysAreValid() {\n var data = { 'action': 'shiptimize_check_keys' };\n jQuery.getJSON(ajaxurl, data, function (resp) {\n if (resp.err) {\n alert(resp.err);\n }\n console.log(resp);\n });\n }\n\n /** \n * \n */\n\n }, {\n key: 'setSelectedCarrier',\n value: function setSelectedCarrier() {\n for (var x = 0; x < this.shipping_methods.length; ++x) {\n var rule_name = 'shiptimize_' + this.shipping_methods[x];\n var rules = window[rule_name];\n var elem = jQuery(\"#\" + this.shipping_methods[x]).find('.shiptimize_carrier');\n console.log(\"settting rules for \" + rule_name, rules);\n if (typeof rules != 'undefined') {\n for (var i = 0; i < rules.length; ++i) {\n jQuery(elem.get(i)).val(rules[i]);\n }\n }\n }\n }\n\n /** \n * @param string - selector - The name of the selector \n * @param element - eCarrierOption - a template for the carrier select \n */\n\n }, {\n key: 'appendShiptimizeTo',\n value: function appendShiptimizeTo(selector, eCarrierOption) {\n var _this3 = this;\n\n var elem = jQuery(\"#\" + selector).find('.country_select');\n if (elem.size() == 0) {\n setTimeout(function () {\n _this3.appendShiptimizeTo(selector, eCarrierOption);\n }, 500);\n return;\n }\n\n var eSelect = eCarrierOption.find(\"select\");\n console.log(eSelect);\n eSelect.attr(\"name\", \"shiptimize_\" + selector + \"[]\");\n\n eCarrierOption.clone().insertAfter(elem);\n }\n }, {\n key: 'exportOrder',\n value: function exportOrder(orderid) {\n jQuery(\".notice\").remove();\n jQuery(\"#shiptimize-export-status\").html(shiptimize_label_sending);\n jQuery.ajax({\n 'url': wcfm_params.ajax_url,\n 'type': 'GET',\n 'data': {\n 'action': 'shiptimize_wcfm_export_order',\n 'orderid': orderid\n },\n 'success': function success(resp) {\n console.log(resp);\n jQuery(\"#shiptimize-export-status\").html(\"\");\n jQuery(\".wcfm-top-element-container\").append(resp);\n },\n 'error': function error(err) {\n jQuery(\"#shiptimize-export-status\").html(JSON.stringify(err));\n console.log(\"Error exporting \" + orderid, err);\n }\n });\n }\n }, {\n key: 'exportSelectedOrders',\n value: function exportSelectedOrders() {\n jQuery(\".notice\").remove();\n jQuery(\"#shiptimize-export-status\").html(shiptimize_label_sending);\n var orderids = [];\n jQuery(\".shiptimize-wcfm-checkbox\").each(function (idx, elem) {\n if (jQuery(this).is(\":checked\")) {\n orderids.push(jQuery(this).val());\n }\n });\n\n console.log(\"exporting \", orderids);\n if (orderids.length == 0) {\n alert(\"No orders where selected\");\n return;\n }\n\n jQuery.ajax({\n 'url': wcfm_params.ajax_url,\n 'type': 'GET',\n 'data': {\n 'action': 'shiptimize_wcfm_export_orders',\n 'orderids': orderids\n },\n 'success': function success(resp) {\n console.log(resp);\n jQuery(\"#shiptimize-export-status\").html(\"\");\n jQuery(\".wcfm-top-element-container\").append(resp);\n },\n 'error': function error(err) {\n jQuery(\"#shiptimize-export-status\").html(JSON.stringify(err));\n console.log(\"Error exporting \" + orderids, err);\n }\n });\n }\n }]);\n\n return ShiptimizeWCFM;\n}();\n\njQuery(function () {\n window.shiptimize_wcfm = new ShiptimizeWCFM();\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdjZm0uanM/ZDJlZSJdLCJuYW1lcyI6WyJTaGlwdGltaXplV0NGTSIsInNoaXBwaW5nX21ldGhvZHMiLCJqUXVlcnkiLCJzaXplIiwiYXBwZW5kU2VsZWN0b3JzIiwib24iLCJldnQiLCJ2YWwiLCJzZXRUaW1lb3V0IiwiY2hlY2tJZktleXNBcmVWYWxpZCIsImVDYXJyaWVyT3B0aW9uIiwiZUNhcnJpZXJzIiwieCIsInNoaXB0aW1pemVfY2FycmllcnMiLCJsZW5ndGgiLCJhcHBlbmQiLCJJZCIsIk5hbWUiLCJhcHBlbmRTaGlwdGltaXplVG8iLCJzZXRTZWxlY3RlZENhcnJpZXIiLCJkYXRhIiwiZ2V0SlNPTiIsImFqYXh1cmwiLCJyZXNwIiwiZXJyIiwiYWxlcnQiLCJjb25zb2xlIiwibG9nIiwicnVsZV9uYW1lIiwicnVsZXMiLCJ3aW5kb3ciLCJlbGVtIiwiZmluZCIsImkiLCJnZXQiLCJzZWxlY3RvciIsImVTZWxlY3QiLCJhdHRyIiwiY2xvbmUiLCJpbnNlcnRBZnRlciIsIm9yZGVyaWQiLCJyZW1vdmUiLCJodG1sIiwic2hpcHRpbWl6ZV9sYWJlbF9zZW5kaW5nIiwiYWpheCIsIndjZm1fcGFyYW1zIiwiYWpheF91cmwiLCJKU09OIiwic3RyaW5naWZ5Iiwib3JkZXJpZHMiLCJlYWNoIiwiaWR4IiwiaXMiLCJwdXNoIiwic2hpcHRpbWl6ZV93Y2ZtIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7O0lBR01BLGM7QUFFSiw0QkFBYztBQUFBOztBQUFBOztBQUNaOzs7QUFHQSxTQUFLQyxnQkFBTCxHQUF3QixDQUN0QixpQ0FEc0IsRUFFdEIsdUJBRnNCLENBQXhCOztBQUtBLFFBQUlDLE9BQU8sd0JBQVAsRUFDREMsSUFEQyxLQUNRLENBRFosRUFDZTtBQUNiLFdBQUtDLGVBQUw7QUFDRDs7QUFHRDs7O0FBR0FGLFdBQU8sNEJBQVAsRUFBcUNHLEVBQXJDLENBQXdDLE9BQXhDLEVBQWlELFVBQUND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SUFBUCxFQUFhSyxHQUFiLEVBQWQ7QUFDRDtBQUNGLE9BSkQ7O0FBTUFtQixjQUFRQyxHQUFSLENBQVksWUFBWixFQUEyQnNCLFFBQTNCO0FBQ0EsVUFBSUEsU0FBU25DLE1BQVQsSUFBbUIsQ0FBdkIsRUFBMEI7QUFDeEJXLGNBQU0sMEJBQU47QUFDQTtBQUNEOztBQUVEdkIsYUFBTzBDLElBQVAsQ0FBWTtBQUNWLGVBQU9DLFlBQVlDLFFBRFQ7QUFFVixnQkFBUSxLQUZFO0FBR1YsZ0JBQVE7QUFDTixvQkFBVSwrQkFESjtBQUVOLHNCQUFhRztBQUZQLFNBSEU7QUFPVixtQkFBWSxpQkFBVTFCLElBQVYsRUFBZ0I7QUFDMUJHLGtCQUFRQyxHQUFSLENBQVlKLElBQVo7QUFDQXJCLGlCQUFPLDJCQUFQLEVBQW9Dd0MsSUFBcEMsQ0FBeUMsRUFBekM7QUFDQXhDLGlCQUFPLDZCQUFQLEVBQXNDYSxNQUF0QyxDQUE2Q1EsSUFBN0M7QUFDRCxTQVhTO0FBWVYsaUJBQVUsZUFBVUMsR0FBVixFQUFlO0FBQ3ZCdEIsaUJBQU8sMkJBQVAsRUFBb0N3QyxJQUFwQyxDQUF5Q0ssS0FBS0MsU0FBTCxDQUFleEIsR0FBZixDQUF6QztBQUNBRSxrQkFBUUMsR0FBUixDQUFZLHFCQUFxQnNCLFFBQWpDLEVBQTJDekIsR0FBM0M7QUFDRDtBQWZTLE9BQVo7QUFpQkQ7Ozs7OztBQUdIdEIsT0FBTyxZQUFZO0FBQ2pCNEIsU0FBT3dCLGVBQVAsR0FBeUIsSUFBSXRELGNBQUosRUFBekI7QUFDRCxDQUZEIiwiZmlsZSI6IjEzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFxuICogQWRkIGFueSBhZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB3ZSBuZWVkIGluIHRoZSB2ZW5kb3IgZGFzaGJvYXJkIFxuICovXG5jbGFzcyBTaGlwdGltaXplV0NGTSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqIFxuICAgICAqIEJlY2F1c2Ugd2NmbSB3aWxsIGZpcnN0IGJ1aWxkIHRoZSBzdHJ1Y3R1cmUgZm9yIHRoZSBydWxlcyBhbmQgb25seSB0aGVuIHNldCBodGUgdmFsdWVzIFxuICAgICAqL1xuICAgIHRoaXMuc2hpcHBpbmdfbWV0aG9kcyA9IFtcbiAgICAgICd3Y2ZtbXBfc2hpcHBpbmdfcmF0ZXNfYnlfd2VpZ2h0JyxcbiAgICAgICd3Y2ZtbXBfc2hpcHBpbmdfcmF0ZXMnXG4gICAgXTtcblxuICAgIGlmIChqUXVlcnkoXCIjZW5hYmxlX3N0b3JlX3NoaXBwaW5nXCIpXG4gICAgICAuc2l6ZSgpID4gMCkge1xuICAgICAgdGhpcy5hcHBlbmRTZWxlY3RvcnMoKTtcbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBPbiBzYXZlIGlmIGtleXMgYXJlIHNldCB0aGVuIGNoZWNrIGlmIHRoZXkgcHJvZHVjZWQgYSB2YWxpZCB0b2tlbiBcbiAgICAgKi8gXG4gICAgalF1ZXJ5KFwiI3djZm1fc2V0dGluZ3Nfc2F2ZV9idXR0b25cIikub24oJ2NsaWNrJywgKGV2dCkgPT4ge1xuICAgICAgaWYoalF1ZXJ5KFwiaW5wdXRbbmFtZT0nc2hpcHRpbWl6ZV9wdWJsaWNfa2V5J11cIikudmFsKCkgJiYgalF1ZXJ5KFwiaW5wdXRbbmFtZT0nc2hpcHRpbWl6ZV9wcml2YXRlX2tleSddXCIpLnZhbCgpKXtcbiAgICAgICAgc2V0VGltZW91dCggKCkgPT57IHRoaXMuY2hlY2tJZktleXNBcmVWYWxpZCgpOyB9LCA1MDAgKTsgXG4gICAgICB9XG4gICAgfSk7IFxuICB9XG5cbiAgYXBwZW5kU2VsZWN0b3JzKCkge1xuXG4gICAgdmFyIGVDYXJyaWVyT3B0aW9uID0galF1ZXJ5KFwiPGRpdj48cCBjbGFzcz0nd2NmbV90aXRsZSc+PHN0cm9uZz5TaGlwdGltaXplPC9zdHJvbmc+PC9wPjwvZGl2PlwiKTtcbiAgICB2YXIgZUNhcnJpZXJzID0galF1ZXJ5KFwiPHNlbGVjdCBjbGFzcz0nd2NmbS1zZWxlY3Qgc2hpcHRpbWl6ZV9jYXJyaWVyJz48b3B0aW9uPi08L29wdGlvbj5cIik7XG5cbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHNoaXB0aW1pemVfY2FycmllcnMubGVuZ3RoOyArK3gpIHtcbiAgICAgIGVDYXJyaWVycy5hcHBlbmQoXCI8b3B0aW9uIHZhbHVlPSdcIiArIHNoaXB0aW1pemVfY2FycmllcnNbeF0uSWQgKyBcIic+XCIgKyBzaGlwdGltaXplX2NhcnJpZXJzW3hdLk5hbWUgKyBcIjwvb3B0aW9uPlwiKTtcbiAgICB9XG5cbiAgICBlQ2Fycmllck9wdGlvbi5hcHBlbmQoZUNhcnJpZXJzKTtcblxuICAgIGZvciAodmFyIHggPSAwOyB4IDwgdGhpcy5zaGlwcGluZ19tZXRob2RzLmxlbmd0aDsgKyt4KSB7XG4gICAgICB0aGlzLmFwcGVuZFNoaXB0aW1pemVUbyh0aGlzLnNoaXBwaW5nX21ldGhvZHNbeF0sIGVDYXJyaWVyT3B0aW9uKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRDYXJyaWVyKCk7XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICBjaGVja0lmS2V5c0FyZVZhbGlkKCl7XG4gICAgY29uc3QgZGF0YSA9IHsnYWN0aW9uJzonc2hpcHRpbWl6ZV9jaGVja19rZXlzJ307XG4gICAgalF1ZXJ5LmdldEpTT04oYWpheHVybCwgZGF0YSwgZnVuY3Rpb24ocmVzcCl7XG4gICAgICBpZihyZXNwLmVycil7XG4gICAgICAgIGFsZXJ0KHJlc3AuZXJyKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKHJlc3ApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFxuICAgKiBcbiAgICovXG4gIHNldFNlbGVjdGVkQ2FycmllcigpIHtcbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMuc2hpcHBpbmdfbWV0aG9kcy5sZW5ndGg7ICsreCkge1xuICAgICAgbGV0IHJ1bGVfbmFtZSA9ICdzaGlwdGltaXplXycgKyB0aGlzLnNoaXBwaW5nX21ldGhvZHNbeF07XG4gICAgICBsZXQgcnVsZXMgPSB3aW5kb3dbcnVsZV9uYW1lXTtcbiAgICAgIGxldCBlbGVtID0galF1ZXJ5KFwiI1wiICsgdGhpcy5zaGlwcGluZ19tZXRob2RzW3hdKVxuICAgICAgLmZpbmQoJy5zaGlwdGltaXplX2NhcnJpZXInKTtcbiAgICAgIGNvbnNvbGUubG9nKFwic2V0dHRpbmcgcnVsZXMgZm9yIFwiICsgcnVsZV9uYW1lLCBydWxlcyk7XG4gICAgICBpZih0eXBlb2YocnVsZXMpICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgalF1ZXJ5KGVsZW0uZ2V0KGkpKS52YWwocnVsZXNbaV0pOyBcbiAgICAgICAgICB9IFxuICAgICAgfSBcbiAgICB9XG4gIH1cblxuICAvKiogXG4gICAqIEBwYXJhbSBzdHJpbmcgLSBzZWxlY3RvciAtIFRoZSBuYW1lIG9mIHRoZSBzZWxlY3RvciBcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBlQ2Fycmllck9wdGlvbiAtIGEgdGVtcGxhdGUgZm9yIHRoZSBjYXJyaWVyIHNlbGVjdCBcbiAgICovXG4gIGFwcGVuZFNoaXB0aW1pemVUbyhzZWxlY3RvciwgZUNhcnJpZXJPcHRpb24pIHtcbiAgICBsZXQgZWxlbSA9IGpRdWVyeShcIiNcIiArIHNlbGVjdG9yKVxuICAgICAgLmZpbmQoJy5jb3VudHJ5X3NlbGVjdCcpO1xuICAgIGlmIChlbGVtLnNpemUoKSA9PSAwKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHBlbmRTaGlwdGltaXplVG8oc2VsZWN0b3IsIGVDYXJyaWVyT3B0aW9uKTtcbiAgICAgIH0sIDUwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG5cbiAgICB2YXIgZVNlbGVjdCA9IGVDYXJyaWVyT3B0aW9uLmZpbmQoXCJzZWxlY3RcIik7XG4gICAgY29uc29sZS5sb2coZVNlbGVjdCk7XG4gICAgZVNlbGVjdC5hdHRyKFwibmFtZVwiLCBcInNoaXB0aW1pemVfXCIgKyBzZWxlY3RvciArIFwiW11cIik7XG5cbiAgICBlQ2Fycmllck9wdGlvbi5jbG9uZSgpXG4gICAgICAuaW5zZXJ0QWZ0ZXIoZWxlbSk7XG4gIH1cblxuICBleHBvcnRPcmRlcihvcmRlcmlkKXtcbiAgICBqUXVlcnkoXCIubm90aWNlXCIpLnJlbW92ZSgpO1xuICAgIGpRdWVyeShcIiNzaGlwdGltaXplLWV4cG9ydC1zdGF0dXNcIikuaHRtbChzaGlwdGltaXplX2xhYmVsX3NlbmRpbmcpO1xuICAgIGpRdWVyeS5hamF4KHtcbiAgICAgICd1cmwnOiB3Y2ZtX3BhcmFtcy5hamF4X3VybCxcbiAgICAgICd0eXBlJzogJ0dFVCcsIFxuICAgICAgJ2RhdGEnOiB7XG4gICAgICAgICdhY3Rpb24nOiAnc2hpcHRpbWl6ZV93Y2ZtX2V4cG9ydF9vcmRlcicsXG4gICAgICAgICdvcmRlcmlkJyA6IG9yZGVyaWQsXG4gICAgICB9LFxuICAgICAgJ3N1Y2Nlc3MnIDogZnVuY3Rpb24gKHJlc3ApIHtcbiAgICAgICAgY29uc29sZS5sb2cocmVzcCk7IFxuICAgICAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS1leHBvcnQtc3RhdHVzXCIpLmh0bWwoXCJcIik7XG4gICAgICAgIGpRdWVyeShcIi53Y2ZtLXRvcC1lbGVtZW50LWNvbnRhaW5lclwiKS5hcHBlbmQocmVzcCk7XG4gICAgICB9LFxuICAgICAgJ2Vycm9yJyA6IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgalF1ZXJ5KFwiI3NoaXB0aW1pemUtZXhwb3J0LXN0YXR1c1wiKS5odG1sKEpTT04uc3RyaW5naWZ5KGVycikpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGV4cG9ydGluZyBcIiArIG9yZGVyaWQsIGVycik7IFxuICAgICAgfVxuICAgIH0pOyBcbiAgfVxuXG4gIGV4cG9ydFNlbGVjdGVkT3JkZXJzKCl7XG4gICAgalF1ZXJ5KFwiLm5vdGljZVwiKS5yZW1vdmUoKTtcbiAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS1leHBvcnQtc3RhdHVzXCIpLmh0bWwoc2hpcHRpbWl6ZV9sYWJlbF9zZW5kaW5nKTtcbiAgICB2YXIgb3JkZXJpZHMgPSBbXTsgXG4gICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtd2NmbS1jaGVja2JveFwiKS5lYWNoKGZ1bmN0aW9uIChpZHgsZWxlbSkge1xuICAgICAgaWYgKGpRdWVyeSh0aGlzKS5pcyhcIjpjaGVja2VkXCIpKSB7XG4gICAgICAgIG9yZGVyaWRzLnB1c2goalF1ZXJ5KHRoaXMpLnZhbCgpKTsgXG4gICAgICB9XG4gICAgfSk7IFxuXG4gICAgY29uc29sZS5sb2coXCJleHBvcnRpbmcgXCIgLCBvcmRlcmlkcyk7IFxuICAgIGlmIChvcmRlcmlkcy5sZW5ndGggPT0gMCkge1xuICAgICAgYWxlcnQoXCJObyBvcmRlcnMgd2hlcmUgc2VsZWN0ZWRcIik7IFxuICAgICAgcmV0dXJuOyBcbiAgICB9XG5cbiAgICBqUXVlcnkuYWpheCh7XG4gICAgICAndXJsJzogd2NmbV9wYXJhbXMuYWpheF91cmwsXG4gICAgICAndHlwZSc6ICdHRVQnLCBcbiAgICAgICdkYXRhJzoge1xuICAgICAgICAnYWN0aW9uJzogJ3NoaXB0aW1pemVfd2NmbV9leHBvcnRfb3JkZXJzJyxcbiAgICAgICAgJ29yZGVyaWRzJyA6IG9yZGVyaWRzLFxuICAgICAgfSxcbiAgICAgICdzdWNjZXNzJyA6IGZ1bmN0aW9uIChyZXNwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3ApOyBcbiAgICAgICAgalF1ZXJ5KFwiI3NoaXB0aW1pemUtZXhwb3J0LXN0YXR1c1wiKS5odG1sKFwiXCIpO1xuICAgICAgICBqUXVlcnkoXCIud2NmbS10b3AtZWxlbWVudC1jb250YWluZXJcIikuYXBwZW5kKHJlc3ApO1xuICAgICAgfSxcbiAgICAgICdlcnJvcicgOiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGpRdWVyeShcIiNzaGlwdGltaXplLWV4cG9ydC1zdGF0dXNcIikuaHRtbChKU09OLnN0cmluZ2lmeShlcnIpKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBleHBvcnRpbmcgXCIgKyBvcmRlcmlkcywgZXJyKTsgXG4gICAgICB9XG4gICAgfSk7ICBcbiAgfSBcbn1cblxualF1ZXJ5KGZ1bmN0aW9uICgpIHtcbiAgd2luZG93LnNoaXB0aW1pemVfd2NmbSA9IG5ldyBTaGlwdGltaXplV0NGTSgpO1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///13\n")}}); 1 /******/ (function(modules) { // webpackBootstrap 2 /******/ // The module cache 3 /******/ var installedModules = {}; 4 /******/ 5 /******/ // The require function 6 /******/ function __webpack_require__(moduleId) { 7 /******/ 8 /******/ // Check if module is in cache 9 /******/ if(installedModules[moduleId]) { 10 /******/ return installedModules[moduleId].exports; 11 /******/ } 12 /******/ // Create a new module (and put it into the cache) 13 /******/ var module = installedModules[moduleId] = { 14 /******/ i: moduleId, 15 /******/ l: false, 16 /******/ exports: {} 17 /******/ }; 18 /******/ 19 /******/ // Execute the module function 20 /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 21 /******/ 22 /******/ // Flag the module as loaded 23 /******/ module.l = true; 24 /******/ 25 /******/ // Return the exports of the module 26 /******/ return module.exports; 27 /******/ } 28 /******/ 29 /******/ 30 /******/ // expose the modules object (__webpack_modules__) 31 /******/ __webpack_require__.m = modules; 32 /******/ 33 /******/ // expose the module cache 34 /******/ __webpack_require__.c = installedModules; 35 /******/ 36 /******/ // define getter function for harmony exports 37 /******/ __webpack_require__.d = function(exports, name, getter) { 38 /******/ if(!__webpack_require__.o(exports, name)) { 39 /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); 40 /******/ } 41 /******/ }; 42 /******/ 43 /******/ // define __esModule on exports 44 /******/ __webpack_require__.r = function(exports) { 45 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 46 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 47 /******/ } 48 /******/ Object.defineProperty(exports, '__esModule', { value: true }); 49 /******/ }; 50 /******/ 51 /******/ // create a fake namespace object 52 /******/ // mode & 1: value is a module id, require it 53 /******/ // mode & 2: merge all properties of value into the ns 54 /******/ // mode & 4: return value when already ns object 55 /******/ // mode & 8|1: behave like require 56 /******/ __webpack_require__.t = function(value, mode) { 57 /******/ if(mode & 1) value = __webpack_require__(value); 58 /******/ if(mode & 8) return value; 59 /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; 60 /******/ var ns = Object.create(null); 61 /******/ __webpack_require__.r(ns); 62 /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); 63 /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); 64 /******/ return ns; 65 /******/ }; 66 /******/ 67 /******/ // getDefaultExport function for compatibility with non-harmony modules 68 /******/ __webpack_require__.n = function(module) { 69 /******/ var getter = module && module.__esModule ? 70 /******/ function getDefault() { return module['default']; } : 71 /******/ function getModuleExports() { return module; }; 72 /******/ __webpack_require__.d(getter, 'a', getter); 73 /******/ return getter; 74 /******/ }; 75 /******/ 76 /******/ // Object.prototype.hasOwnProperty.call 77 /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 78 /******/ 79 /******/ // __webpack_public_path__ 80 /******/ __webpack_require__.p = "/shiptimize-for-woocommerce/assets/js"; 81 /******/ 82 /******/ 83 /******/ // Load entry module and return exports 84 /******/ return __webpack_require__(__webpack_require__.s = "./js/shiptimize-wcfm.js"); 85 /******/ }) 86 /************************************************************************/ 87 /******/ ({ 88 89 /***/ "./js/shiptimize-wcfm.js": 90 /*!*******************************!*\ 91 !*** ./js/shiptimize-wcfm.js ***! 92 \*******************************/ 93 /*! no static exports found */ 94 /***/ (function(module, exports, __webpack_require__) { 95 96 "use strict"; 97 eval("\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/** \n * Add any aditional functionality we need in the vendor dashboard \n */\nvar ShiptimizeWCFM = function () {\n function ShiptimizeWCFM() {\n var _this = this;\n\n _classCallCheck(this, ShiptimizeWCFM);\n\n /** \n * Because wcfm will first build the structure for the rules and only then set hte values \n */\n this.shipping_methods = ['wcfmmp_shipping_rates_by_weight', 'wcfmmp_shipping_rates'];\n\n if (jQuery(\"#enable_store_shipping\").size() > 0) {\n this.appendSelectors();\n }\n\n /** \n * On save if keys are set then check if they produced a valid token \n */\n jQuery(\"#wcfm_settings_save_button\").on('click', function (evt) {\n if (jQuery(\"input[name='shiptimize_public_key']\").val() && jQuery(\"input[name='shiptimize_private_key']\").val()) {\n setTimeout(function () {\n _this.checkIfKeysAreValid();\n }, 500);\n }\n });\n }\n\n _createClass(ShiptimizeWCFM, [{\n key: 'appendSelectors',\n value: function appendSelectors() {\n var _this2 = this;\n\n var eCarrierOption = jQuery(\"<div><p class='wcfm_title'><strong>Shiptimize</strong></p></div>\");\n var eCarriers = jQuery(\"<select class='wcfm-select shiptimize_carrier'><option>-</option>\");\n\n for (var x = 0; x < shiptimize_carriers.length; ++x) {\n eCarriers.append(\"<option value='\" + shiptimize_carriers[x].Id + \"'>\" + shiptimize_carriers[x].Name + \"</option>\");\n }\n\n eCarrierOption.append(eCarriers);\n\n for (var x = 0; x < this.shipping_methods.length; ++x) {\n this.appendShiptimizeTo(this.shipping_methods[x], eCarrierOption);\n }\n\n setTimeout(function () {\n _this2.setSelectedCarrier();\n }, 1000);\n }\n }, {\n key: 'checkIfKeysAreValid',\n value: function checkIfKeysAreValid() {\n var data = { 'action': 'shiptimize_check_keys' };\n jQuery.getJSON(ajaxurl, data, function (resp) {\n if (resp.err) {\n alert(resp.err);\n }\n console.log(resp);\n });\n }\n\n /** \n * \n */\n\n }, {\n key: 'setSelectedCarrier',\n value: function setSelectedCarrier() {\n for (var x = 0; x < this.shipping_methods.length; ++x) {\n var rule_name = 'shiptimize_' + this.shipping_methods[x];\n var rules = window[rule_name];\n var elem = jQuery(\"#\" + this.shipping_methods[x]).find('.shiptimize_carrier');\n console.log(\"settting rules for \" + rule_name, rules);\n if (typeof rules != 'undefined') {\n for (var i = 0; i < rules.length; ++i) {\n jQuery(elem.get(i)).val(rules[i]);\n }\n }\n }\n }\n\n /** \n * @param string - selector - The name of the selector \n * @param element - eCarrierOption - a template for the carrier select \n */\n\n }, {\n key: 'appendShiptimizeTo',\n value: function appendShiptimizeTo(selector, eCarrierOption) {\n var _this3 = this;\n\n var elem = jQuery(\"#\" + selector).find('.country_select');\n if (elem.size() == 0) {\n setTimeout(function () {\n _this3.appendShiptimizeTo(selector, eCarrierOption);\n }, 500);\n return;\n }\n\n var eSelect = eCarrierOption.find(\"select\");\n console.log(eSelect);\n eSelect.attr(\"name\", \"shiptimize_\" + selector + \"[]\");\n\n eCarrierOption.clone().insertAfter(elem);\n }\n }, {\n key: 'exportOrder',\n value: function exportOrder(orderid) {\n jQuery(\".notice\").remove();\n jQuery(\"#shiptimize-export-status\").html(shiptimize_label_sending);\n jQuery.ajax({\n 'url': wcfm_params.ajax_url,\n 'type': 'GET',\n 'data': {\n 'action': 'shiptimize_wcfm_export_order',\n 'orderid': orderid\n },\n 'success': function success(resp) {\n console.log(resp);\n jQuery(\"#shiptimize-export-status\").html(\"\");\n jQuery(\".wcfm-top-element-container\").append(resp);\n },\n 'error': function error(err) {\n jQuery(\"#shiptimize-export-status\").html(JSON.stringify(err));\n console.log(\"Error exporting \" + orderid, err);\n }\n });\n }\n }, {\n key: 'exportSelectedOrders',\n value: function exportSelectedOrders() {\n jQuery(\".notice\").remove();\n jQuery(\"#shiptimize-export-status\").html(shiptimize_label_sending);\n var orderids = [];\n jQuery(\".shiptimize-wcfm-checkbox\").each(function (idx, elem) {\n if (jQuery(this).is(\":checked\")) {\n orderids.push(jQuery(this).val());\n }\n });\n\n console.log(\"exporting \", orderids);\n if (orderids.length == 0) {\n alert(\"No orders where selected\");\n return;\n }\n\n jQuery.ajax({\n 'url': wcfm_params.ajax_url,\n 'type': 'GET',\n 'data': {\n 'action': 'shiptimize_wcfm_export_orders',\n 'orderids': orderids\n },\n 'success': function success(resp) {\n console.log(resp);\n jQuery(\"#shiptimize-export-status\").html(\"\");\n jQuery(\".wcfm-top-element-container\").append(resp);\n },\n 'error': function error(err) {\n jQuery(\"#shiptimize-export-status\").html(JSON.stringify(err));\n console.log(\"Error exporting \" + orderids, err);\n }\n });\n }\n }]);\n\n return ShiptimizeWCFM;\n}();\n\njQuery(function () {\n window.shiptimize_wcfm = new ShiptimizeWCFM();\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdjZm0uanM/ZDJlZSJdLCJuYW1lcyI6WyJTaGlwdGltaXplV0NGTSIsInNoaXBwaW5nX21ldGhvZHMiLCJqUXVlcnkiLCJzaXplIiwiYXBwZW5kU2VsZWN0b3JzIiwib24iLCJldnQiLCJ2YWwiLCJzZXRUaW1lb3V0IiwiY2hlY2tJZktleXNBcmVWYWxpZCIsImVDYXJyaWVyT3B0aW9uIiwiZUNhcnJpZXJzIiwieCIsInNoaXB0aW1pemVfY2FycmllcnMiLCJsZW5ndGgiLCJhcHBlbmQiLCJJZCIsIk5hbWUiLCJhcHBlbmRTaGlwdGltaXplVG8iLCJzZXRTZWxlY3RlZENhcnJpZXIiLCJkYXRhIiwiZ2V0SlNPTiIsImFqYXh1cmwiLCJyZXNwIiwiZXJyIiwiYWxlcnQiLCJjb25zb2xlIiwibG9nIiwicnVsZV9uYW1lIiwicnVsZXMiLCJ3aW5kb3ciLCJlbGVtIiwiZmluZCIsImkiLCJnZXQiLCJzZWxlY3RvciIsImVTZWxlY3QiLCJhdHRyIiwiY2xvbmUiLCJpbnNlcnRBZnRlciIsIm9yZGVyaWQiLCJyZW1vdmUiLCJodG1sIiwic2hpcHRpbWl6ZV9sYWJlbF9zZW5kaW5nIiwiYWpheCIsIndjZm1fcGFyYW1zIiwiYWpheF91cmwiLCJKU09OIiwic3RyaW5naWZ5Iiwib3JkZXJpZHMiLCJlYWNoIiwiaWR4IiwiaXMiLCJwdXNoIiwic2hpcHRpbWl6ZV93Y2ZtIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7O0lBR01BLGM7QUFFSiw0QkFBYztBQUFBOztBQUFBOztBQUNaOzs7QUFHQSxTQUFLQyxnQkFBTCxHQUF3QixDQUN0QixpQ0FEc0IsRUFFdEIsdUJBRnNCLENBQXhCOztBQUtBLFFBQUlDLE9BQU8sd0JBQVAsRUFDREMsSUFEQyxLQUNRLENBRFosRUFDZTtBQUNiLFdBQUtDLGVBQUw7QUFDRDs7QUFHRDs7O0FBR0FGLFdBQU8sNEJBQVAsRUFBcUNHLEVBQXJDLENBQXdDLE9BQXhDLEVBQWlELFVBQUND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SUFBUCxFQUFhSyxHQUFiLEVBQWQ7QUFDRDtBQUNGLE9BSkQ7O0FBTUFtQixjQUFRQyxHQUFSLENBQVksWUFBWixFQUEyQnNCLFFBQTNCO0FBQ0EsVUFBSUEsU0FBU25DLE1BQVQsSUFBbUIsQ0FBdkIsRUFBMEI7QUFDeEJXLGNBQU0sMEJBQU47QUFDQTtBQUNEOztBQUVEdkIsYUFBTzBDLElBQVAsQ0FBWTtBQUNWLGVBQU9DLFlBQVlDLFFBRFQ7QUFFVixnQkFBUSxLQUZFO0FBR1YsZ0JBQVE7QUFDTixvQkFBVSwrQkFESjtBQUVOLHNCQUFhRztBQUZQLFNBSEU7QUFPVixtQkFBWSxpQkFBVTFCLElBQVYsRUFBZ0I7QUFDMUJHLGtCQUFRQyxHQUFSLENBQVlKLElBQVo7QUFDQXJCLGlCQUFPLDJCQUFQLEVBQW9Dd0MsSUFBcEMsQ0FBeUMsRUFBekM7QUFDQXhDLGlCQUFPLDZCQUFQLEVBQXNDYSxNQUF0QyxDQUE2Q1EsSUFBN0M7QUFDRCxTQVhTO0FBWVYsaUJBQVUsZUFBVUMsR0FBVixFQUFlO0FBQ3ZCdEIsaUJBQU8sMkJBQVAsRUFBb0N3QyxJQUFwQyxDQUF5Q0ssS0FBS0MsU0FBTCxDQUFleEIsR0FBZixDQUF6QztBQUNBRSxrQkFBUUMsR0FBUixDQUFZLHFCQUFxQnNCLFFBQWpDLEVBQTJDekIsR0FBM0M7QUFDRDtBQWZTLE9BQVo7QUFpQkQ7Ozs7OztBQUdIdEIsT0FBTyxZQUFZO0FBQ2pCNEIsU0FBT3dCLGVBQVAsR0FBeUIsSUFBSXRELGNBQUosRUFBekI7QUFDRCxDQUZEIiwiZmlsZSI6Ii4vanMvc2hpcHRpbWl6ZS13Y2ZtLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFxuICogQWRkIGFueSBhZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB3ZSBuZWVkIGluIHRoZSB2ZW5kb3IgZGFzaGJvYXJkIFxuICovXG5jbGFzcyBTaGlwdGltaXplV0NGTSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqIFxuICAgICAqIEJlY2F1c2Ugd2NmbSB3aWxsIGZpcnN0IGJ1aWxkIHRoZSBzdHJ1Y3R1cmUgZm9yIHRoZSBydWxlcyBhbmQgb25seSB0aGVuIHNldCBodGUgdmFsdWVzIFxuICAgICAqL1xuICAgIHRoaXMuc2hpcHBpbmdfbWV0aG9kcyA9IFtcbiAgICAgICd3Y2ZtbXBfc2hpcHBpbmdfcmF0ZXNfYnlfd2VpZ2h0JyxcbiAgICAgICd3Y2ZtbXBfc2hpcHBpbmdfcmF0ZXMnXG4gICAgXTtcblxuICAgIGlmIChqUXVlcnkoXCIjZW5hYmxlX3N0b3JlX3NoaXBwaW5nXCIpXG4gICAgICAuc2l6ZSgpID4gMCkge1xuICAgICAgdGhpcy5hcHBlbmRTZWxlY3RvcnMoKTtcbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBPbiBzYXZlIGlmIGtleXMgYXJlIHNldCB0aGVuIGNoZWNrIGlmIHRoZXkgcHJvZHVjZWQgYSB2YWxpZCB0b2tlbiBcbiAgICAgKi8gXG4gICAgalF1ZXJ5KFwiI3djZm1fc2V0dGluZ3Nfc2F2ZV9idXR0b25cIikub24oJ2NsaWNrJywgKGV2dCkgPT4ge1xuICAgICAgaWYoalF1ZXJ5KFwiaW5wdXRbbmFtZT0nc2hpcHRpbWl6ZV9wdWJsaWNfa2V5J11cIikudmFsKCkgJiYgalF1ZXJ5KFwiaW5wdXRbbmFtZT0nc2hpcHRpbWl6ZV9wcml2YXRlX2tleSddXCIpLnZhbCgpKXtcbiAgICAgICAgc2V0VGltZW91dCggKCkgPT57IHRoaXMuY2hlY2tJZktleXNBcmVWYWxpZCgpOyB9LCA1MDAgKTsgXG4gICAgICB9XG4gICAgfSk7IFxuICB9XG5cbiAgYXBwZW5kU2VsZWN0b3JzKCkge1xuXG4gICAgdmFyIGVDYXJyaWVyT3B0aW9uID0galF1ZXJ5KFwiPGRpdj48cCBjbGFzcz0nd2NmbV90aXRsZSc+PHN0cm9uZz5TaGlwdGltaXplPC9zdHJvbmc+PC9wPjwvZGl2PlwiKTtcbiAgICB2YXIgZUNhcnJpZXJzID0galF1ZXJ5KFwiPHNlbGVjdCBjbGFzcz0nd2NmbS1zZWxlY3Qgc2hpcHRpbWl6ZV9jYXJyaWVyJz48b3B0aW9uPi08L29wdGlvbj5cIik7XG5cbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHNoaXB0aW1pemVfY2FycmllcnMubGVuZ3RoOyArK3gpIHtcbiAgICAgIGVDYXJyaWVycy5hcHBlbmQoXCI8b3B0aW9uIHZhbHVlPSdcIiArIHNoaXB0aW1pemVfY2FycmllcnNbeF0uSWQgKyBcIic+XCIgKyBzaGlwdGltaXplX2NhcnJpZXJzW3hdLk5hbWUgKyBcIjwvb3B0aW9uPlwiKTtcbiAgICB9XG5cbiAgICBlQ2Fycmllck9wdGlvbi5hcHBlbmQoZUNhcnJpZXJzKTtcblxuICAgIGZvciAodmFyIHggPSAwOyB4IDwgdGhpcy5zaGlwcGluZ19tZXRob2RzLmxlbmd0aDsgKyt4KSB7XG4gICAgICB0aGlzLmFwcGVuZFNoaXB0aW1pemVUbyh0aGlzLnNoaXBwaW5nX21ldGhvZHNbeF0sIGVDYXJyaWVyT3B0aW9uKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRDYXJyaWVyKCk7XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICBjaGVja0lmS2V5c0FyZVZhbGlkKCl7XG4gICAgY29uc3QgZGF0YSA9IHsnYWN0aW9uJzonc2hpcHRpbWl6ZV9jaGVja19rZXlzJ307XG4gICAgalF1ZXJ5LmdldEpTT04oYWpheHVybCwgZGF0YSwgZnVuY3Rpb24ocmVzcCl7XG4gICAgICBpZihyZXNwLmVycil7XG4gICAgICAgIGFsZXJ0KHJlc3AuZXJyKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKHJlc3ApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFxuICAgKiBcbiAgICovXG4gIHNldFNlbGVjdGVkQ2FycmllcigpIHtcbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMuc2hpcHBpbmdfbWV0aG9kcy5sZW5ndGg7ICsreCkge1xuICAgICAgbGV0IHJ1bGVfbmFtZSA9ICdzaGlwdGltaXplXycgKyB0aGlzLnNoaXBwaW5nX21ldGhvZHNbeF07XG4gICAgICBsZXQgcnVsZXMgPSB3aW5kb3dbcnVsZV9uYW1lXTtcbiAgICAgIGxldCBlbGVtID0galF1ZXJ5KFwiI1wiICsgdGhpcy5zaGlwcGluZ19tZXRob2RzW3hdKVxuICAgICAgLmZpbmQoJy5zaGlwdGltaXplX2NhcnJpZXInKTtcbiAgICAgIGNvbnNvbGUubG9nKFwic2V0dHRpbmcgcnVsZXMgZm9yIFwiICsgcnVsZV9uYW1lLCBydWxlcyk7XG4gICAgICBpZih0eXBlb2YocnVsZXMpICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgalF1ZXJ5KGVsZW0uZ2V0KGkpKS52YWwocnVsZXNbaV0pOyBcbiAgICAgICAgICB9IFxuICAgICAgfSBcbiAgICB9XG4gIH1cblxuICAvKiogXG4gICAqIEBwYXJhbSBzdHJpbmcgLSBzZWxlY3RvciAtIFRoZSBuYW1lIG9mIHRoZSBzZWxlY3RvciBcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBlQ2Fycmllck9wdGlvbiAtIGEgdGVtcGxhdGUgZm9yIHRoZSBjYXJyaWVyIHNlbGVjdCBcbiAgICovXG4gIGFwcGVuZFNoaXB0aW1pemVUbyhzZWxlY3RvciwgZUNhcnJpZXJPcHRpb24pIHtcbiAgICBsZXQgZWxlbSA9IGpRdWVyeShcIiNcIiArIHNlbGVjdG9yKVxuICAgICAgLmZpbmQoJy5jb3VudHJ5X3NlbGVjdCcpO1xuICAgIGlmIChlbGVtLnNpemUoKSA9PSAwKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHBlbmRTaGlwdGltaXplVG8oc2VsZWN0b3IsIGVDYXJyaWVyT3B0aW9uKTtcbiAgICAgIH0sIDUwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG5cbiAgICB2YXIgZVNlbGVjdCA9IGVDYXJyaWVyT3B0aW9uLmZpbmQoXCJzZWxlY3RcIik7XG4gICAgY29uc29sZS5sb2coZVNlbGVjdCk7XG4gICAgZVNlbGVjdC5hdHRyKFwibmFtZVwiLCBcInNoaXB0aW1pemVfXCIgKyBzZWxlY3RvciArIFwiW11cIik7XG5cbiAgICBlQ2Fycmllck9wdGlvbi5jbG9uZSgpXG4gICAgICAuaW5zZXJ0QWZ0ZXIoZWxlbSk7XG4gIH1cblxuICBleHBvcnRPcmRlcihvcmRlcmlkKXtcbiAgICBqUXVlcnkoXCIubm90aWNlXCIpLnJlbW92ZSgpO1xuICAgIGpRdWVyeShcIiNzaGlwdGltaXplLWV4cG9ydC1zdGF0dXNcIikuaHRtbChzaGlwdGltaXplX2xhYmVsX3NlbmRpbmcpO1xuICAgIGpRdWVyeS5hamF4KHtcbiAgICAgICd1cmwnOiB3Y2ZtX3BhcmFtcy5hamF4X3VybCxcbiAgICAgICd0eXBlJzogJ0dFVCcsIFxuICAgICAgJ2RhdGEnOiB7XG4gICAgICAgICdhY3Rpb24nOiAnc2hpcHRpbWl6ZV93Y2ZtX2V4cG9ydF9vcmRlcicsXG4gICAgICAgICdvcmRlcmlkJyA6IG9yZGVyaWQsXG4gICAgICB9LFxuICAgICAgJ3N1Y2Nlc3MnIDogZnVuY3Rpb24gKHJlc3ApIHtcbiAgICAgICAgY29uc29sZS5sb2cocmVzcCk7IFxuICAgICAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS1leHBvcnQtc3RhdHVzXCIpLmh0bWwoXCJcIik7XG4gICAgICAgIGpRdWVyeShcIi53Y2ZtLXRvcC1lbGVtZW50LWNvbnRhaW5lclwiKS5hcHBlbmQocmVzcCk7XG4gICAgICB9LFxuICAgICAgJ2Vycm9yJyA6IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgalF1ZXJ5KFwiI3NoaXB0aW1pemUtZXhwb3J0LXN0YXR1c1wiKS5odG1sKEpTT04uc3RyaW5naWZ5KGVycikpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGV4cG9ydGluZyBcIiArIG9yZGVyaWQsIGVycik7IFxuICAgICAgfVxuICAgIH0pOyBcbiAgfVxuXG4gIGV4cG9ydFNlbGVjdGVkT3JkZXJzKCl7XG4gICAgalF1ZXJ5KFwiLm5vdGljZVwiKS5yZW1vdmUoKTtcbiAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS1leHBvcnQtc3RhdHVzXCIpLmh0bWwoc2hpcHRpbWl6ZV9sYWJlbF9zZW5kaW5nKTtcbiAgICB2YXIgb3JkZXJpZHMgPSBbXTsgXG4gICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtd2NmbS1jaGVja2JveFwiKS5lYWNoKGZ1bmN0aW9uIChpZHgsZWxlbSkge1xuICAgICAgaWYgKGpRdWVyeSh0aGlzKS5pcyhcIjpjaGVja2VkXCIpKSB7XG4gICAgICAgIG9yZGVyaWRzLnB1c2goalF1ZXJ5KHRoaXMpLnZhbCgpKTsgXG4gICAgICB9XG4gICAgfSk7IFxuXG4gICAgY29uc29sZS5sb2coXCJleHBvcnRpbmcgXCIgLCBvcmRlcmlkcyk7IFxuICAgIGlmIChvcmRlcmlkcy5sZW5ndGggPT0gMCkge1xuICAgICAgYWxlcnQoXCJObyBvcmRlcnMgd2hlcmUgc2VsZWN0ZWRcIik7IFxuICAgICAgcmV0dXJuOyBcbiAgICB9XG5cbiAgICBqUXVlcnkuYWpheCh7XG4gICAgICAndXJsJzogd2NmbV9wYXJhbXMuYWpheF91cmwsXG4gICAgICAndHlwZSc6ICdHRVQnLCBcbiAgICAgICdkYXRhJzoge1xuICAgICAgICAnYWN0aW9uJzogJ3NoaXB0aW1pemVfd2NmbV9leHBvcnRfb3JkZXJzJyxcbiAgICAgICAgJ29yZGVyaWRzJyA6IG9yZGVyaWRzLFxuICAgICAgfSxcbiAgICAgICdzdWNjZXNzJyA6IGZ1bmN0aW9uIChyZXNwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3ApOyBcbiAgICAgICAgalF1ZXJ5KFwiI3NoaXB0aW1pemUtZXhwb3J0LXN0YXR1c1wiKS5odG1sKFwiXCIpO1xuICAgICAgICBqUXVlcnkoXCIud2NmbS10b3AtZWxlbWVudC1jb250YWluZXJcIikuYXBwZW5kKHJlc3ApO1xuICAgICAgfSxcbiAgICAgICdlcnJvcicgOiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGpRdWVyeShcIiNzaGlwdGltaXplLWV4cG9ydC1zdGF0dXNcIikuaHRtbChKU09OLnN0cmluZ2lmeShlcnIpKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBleHBvcnRpbmcgXCIgKyBvcmRlcmlkcywgZXJyKTsgXG4gICAgICB9XG4gICAgfSk7ICBcbiAgfSBcbn1cblxualF1ZXJ5KGZ1bmN0aW9uICgpIHtcbiAgd2luZG93LnNoaXB0aW1pemVfd2NmbSA9IG5ldyBTaGlwdGltaXplV0NGTSgpO1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./js/shiptimize-wcfm.js\n"); 98 99 /***/ }) 100 101 /******/ }); -
shiptimize-for-woocommerce/trunk/assets/js/shiptimize.js
r2724326 r2746465 1 !function(i){var B={};function g(I){if(B[I])return B[I].exports;var Q=B[I]={i:I,l:!1,exports:{}};return i[I].call(Q.exports,Q,Q.exports,g),Q.l=!0,Q.exports}g.m=i,g.c=B,g.d=function(I,Q,i){g.o(I,Q)||Object.defineProperty(I,Q,{enumerable:!0,get:i})},g.r=function(I){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(I,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(I,"__esModule",{value:!0})},g.t=function(Q,I){if(1&I&&(Q=g(Q)),8&I)return Q;if(4&I&&"object"==typeof Q&&Q&&Q.__esModule)return Q;var i=Object.create(null);if(g.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:Q}),2&I&&"string"!=typeof Q)for(var B in Q)g.d(i,B,function(I){return Q[I]}.bind(null,B));return i},g.n=function(I){var Q=I&&I.__esModule?function(){return I.default}:function(){return I};return g.d(Q,"a",Q),Q},g.o=function(I,Q){return Object.prototype.hasOwnProperty.call(I,Q)},g.p="/shiptimize-for-woocommerce/assets/js",g(g.s=1)}([function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\n/** \n * Singleton object we can use for platform independent stuff \n */\nvar ShiptimizeUtils = function () {\n function ShiptimizeUtils() {\n _classCallCheck(this, ShiptimizeUtils);\n }\n\n /** \n * Inject Script into the page \n * @param string src \n */\n\n\n _createClass(ShiptimizeUtils, [{\n key: "injectExternalScript",\n value: function injectExternalScript(src) {\n var s = document.createElement("script");\n s.setAttribute("src", src);\n document.body.appendChild(s);\n }\n\n /** \n * Inject a script string \n */\n\n }, {\n key: "injectScript",\n value: function injectScript(contents) {\n var e = document.createElement("script");\n e.value = contents;\n document.body.appendChild(e);\n }\n\n /** \n * Removes all not numeric chars from the string \n *\n * @param string string - the input string \n * @return the string without chars that are not numbers \n */\n\n }, {\n key: "removeNonNumeric",\n value: function removeNonNumeric(string) {\n return string.replace(/\\D/g, \'\');\n }\n\n /** \n * Check if the given url exists and is valid\n * We use this to check if the carrier icon exists given \n * a url path and the naming convention {carrier_id}.svg \n * Make sure the correct protocol is appended to the url http != https \n * \n * @return true it the url exists and is valid \n */\n\n }, {\n key: "isUrlValid",\n value: function isUrlValid(url) {\n var http = new XMLHttpRequest();\n http.open(\'HEAD\', url, false);\n http.send();\n return http.status == 200;\n }\n\n /** \n * Open a new window with the provided URL \n * @string url \n * @return bool if the window was opened, false if popup blocker enabled \n */\n\n }, {\n key: "openNewWindow",\n value: function openNewWindow(url, options) {\n var newWin = window.open(url, \'_blank\', options);\n var blocked = !newWin || newWin.closed || typeof newWin.closed == \'undefined\';\n\n return !blocked;\n }\n }]);\n\n return ShiptimizeUtils;\n}();\n\nvar utils = new ShiptimizeUtils();\nexports.default = utils;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXV0aWxzLmpzPzAwZDQiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZVV0aWxzIiwic3JjIiwicyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNvbnRlbnRzIiwiZSIsInZhbHVlIiwic3RyaW5nIiwicmVwbGFjZSIsInVybCIsImh0dHAiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJzZW5kIiwic3RhdHVzIiwib3B0aW9ucyIsIm5ld1dpbiIsIndpbmRvdyIsImJsb2NrZWQiLCJjbG9zZWQiLCJ1dGlscyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOzs7SUFHTUEsZTtBQUVGLDZCQUFjO0FBQUE7QUFFYjs7QUFHRDs7Ozs7Ozs7eUNBSXFCQyxHLEVBQUs7QUFDdEIsVUFBSUMsSUFBSUMsU0FBU0MsYUFBVCxDQUF1QixRQUF2QixDQUFSO0FBQ0FGLFFBQUVHLFlBQUYsQ0FBZSxLQUFmLEVBQXNCSixHQUF0QjtBQUNBRSxlQUFTRyxJQUFULENBQWNDLFdBQWQsQ0FBMEJMLENBQTFCO0FBQ0g7O0FBR0Q7Ozs7OztpQ0FHYU0sUSxFQUFVO0FBQ25CLFVBQUlDLElBQUlOLFNBQVNDLGFBQVQsQ0FBdUIsUUFBdkIsQ0FBUjtBQUNBSyxRQUFFQyxLQUFGLEdBQVVGLFFBQVY7QUFDQUwsZUFBU0csSUFBVCxDQUFjQyxXQUFkLENBQTBCRSxDQUExQjtBQUNIOztBQUVEOzs7Ozs7Ozs7cUNBTWlCRSxNLEVBQVE7QUFDckIsYUFBT0EsT0FBT0MsT0FBUCxDQUFlLEtBQWYsRUFBc0IsRUFBdEIsQ0FBUDtBQUNIOztBQUVEOzs7Ozs7Ozs7OzsrQkFRV0MsRyxFQUFLO0FBQ1osVUFBSUMsT0FBTyxJQUFJQyxjQUFKLEVBQVg7QUFDQUQsV0FBS0UsSUFBTCxDQUFVLE1BQVYsRUFBa0JILEdBQWxCLEVBQXVCLEtBQXZCO0FBQ0FDLFdBQUtHLElBQUw7QUFDQSxhQUFPSCxLQUFLSSxNQUFMLElBQWUsR0FBdEI7QUFDSDs7QUFFRDs7Ozs7Ozs7a0NBS2NMLEcsRUFBS00sTyxFQUFRO0FBQ3ZCLFVBQUlDLFNBQVNDLE9BQU9MLElBQVAsQ0FBWUgsR0FBWixFQUFpQixRQUFqQixFQUEyQk0sT0FBM0IsQ0FBYjtBQUNBLFVBQUlHLFVBQVUsQ0FBQ0YsTUFBRCxJQUFXQSxPQUFPRyxNQUFsQixJQUE0QixPQUFPSCxPQUFPRyxNQUFkLElBQXNCLFdBQWhFOztBQUVBLGFBQU8sQ0FBQ0QsT0FBUjtBQUNIOzs7Ozs7QUFJTCxJQUFJRSxRQUFRLElBQUl4QixlQUFKLEVBQVo7a0JBQ2V3QixLIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogXG4gKiBTaW5nbGV0b24gb2JqZWN0IHdlIGNhbiB1c2UgZm9yIHBsYXRmb3JtIGluZGVwZW5kZW50IHN0dWZmIFxuICovXG5jbGFzcyBTaGlwdGltaXplVXRpbHMge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG5cbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBJbmplY3QgU2NyaXB0IGludG8gdGhlIHBhZ2UgXG4gICAgICogQHBhcmFtIHN0cmluZyBzcmMgXG4gICAgICovXG4gICAgaW5qZWN0RXh0ZXJuYWxTY3JpcHQoc3JjKSB7XG4gICAgICAgIGxldCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgc3JjKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzKTtcbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBJbmplY3QgYSBzY3JpcHQgc3RyaW5nIFxuICAgICAqL1xuICAgIGluamVjdFNjcmlwdChjb250ZW50cykge1xuICAgICAgICBsZXQgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgIGUudmFsdWUgPSBjb250ZW50cztcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogUmVtb3ZlcyBhbGwgbm90IG51bWVyaWMgY2hhcnMgZnJvbSB0aGUgc3RyaW5nIFxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmluZyBzdHJpbmcgLSB0aGUgaW5wdXQgc3RyaW5nIFxuICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyB3aXRob3V0IGNoYXJzIHRoYXQgYXJlIG5vdCBudW1iZXJzIFxuICAgICAqL1xuICAgIHJlbW92ZU5vbk51bWVyaWMoc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIHVybCBleGlzdHMgYW5kIGlzIHZhbGlkXG4gICAgICogV2UgdXNlIHRoaXMgdG8gY2hlY2sgaWYgdGhlIGNhcnJpZXIgaWNvbiBleGlzdHMgZ2l2ZW4gXG4gICAgICogYSB1cmwgcGF0aCBhbmQgdGhlIG5hbWluZyBjb252ZW50aW9uIHtjYXJyaWVyX2lkfS5zdmcgXG4gICAgICogTWFrZSBzdXJlIHRoZSBjb3JyZWN0IHByb3RvY29sIGlzIGFwcGVuZGVkIHRvIHRoZSB1cmwgaHR0cCAhPSBodHRwcyBcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJuIHRydWUgaXQgdGhlIHVybCBleGlzdHMgYW5kIGlzIHZhbGlkIFxuICAgICAqLyBcbiAgICBpc1VybFZhbGlkKHVybCkge1xuICAgICAgICB2YXIgaHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBodHRwLm9wZW4oJ0hFQUQnLCB1cmwsIGZhbHNlKTtcbiAgICAgICAgaHR0cC5zZW5kKCk7XG4gICAgICAgIHJldHVybiBodHRwLnN0YXR1cyA9PSAyMDA7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIE9wZW4gYSBuZXcgd2luZG93IHdpdGggdGhlIHByb3ZpZGVkIFVSTCBcbiAgICAgKiBAc3RyaW5nIHVybCBcbiAgICAgKiBAcmV0dXJuIGJvb2wgaWYgdGhlIHdpbmRvdyB3YXMgb3BlbmVkLCBmYWxzZSBpZiBwb3B1cCBibG9ja2VyIGVuYWJsZWQgXG4gICAgICovICBcbiAgICBvcGVuTmV3V2luZG93KHVybCwgb3B0aW9ucyl7XG4gICAgICAgIGxldCBuZXdXaW4gPSB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnLCBvcHRpb25zKTsgXG4gICAgICAgIGxldCBibG9ja2VkID0gIW5ld1dpbiB8fCBuZXdXaW4uY2xvc2VkIHx8IHR5cGVvZiBuZXdXaW4uY2xvc2VkPT0ndW5kZWZpbmVkJzsgXG5cbiAgICAgICAgcmV0dXJuICFibG9ja2VkOyBcbiAgICB9XG59XG5cblxubGV0IHV0aWxzID0gbmV3IFNoaXB0aW1pemVVdGlscygpO1xuZXhwb3J0IGRlZmF1bHQgdXRpbHM7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///0\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n__webpack_require__(2);\n\n__webpack_require__(3);\n\nvar _shiptimizeUtils = __webpack_require__(0);\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nvar _shiptimizeWooCommerce = __webpack_require__(4);\n\nvar _shiptimizeWooCommerce2 = _interopRequireDefault(_shiptimizeWooCommerce);\n\nvar _shiptimizeGmaps = __webpack_require__(5);\n\nvar _shiptimizeGmaps2 = _interopRequireDefault(_shiptimizeGmaps);\n\nvar _shiptimizeOpenMap = __webpack_require__(6);\n\nvar _shiptimizeOpenMap2 = _interopRequireDefault(_shiptimizeOpenMap);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/** \n * Class Shiptimize depends on jQuery. \n * Check if we are meant to append a map \n * \n * Platform dependent functions marked with * @platformDependent \n */\nvar Shiptimize = function () {\n function Shiptimize(ajax_url) {\n _classCallCheck(this, Shiptimize);\n\n this.markers = []; //pickup {lat, lng} \n this.isMapLoaded = false;\n this.gmaps_key = typeof shiptimize_maps_key == 'undefined' ? '' : shiptimize_maps_key;\n this.openMapMarkerIcons = {};\n this.ajax_url = ajax_url; // platform dependent \n\n this.platform = new _shiptimizeWooCommerce2.default(this.ajax_url);\n\n this.map = this.gmaps_key ? new _shiptimizeGmaps2.default(this.gmaps_key) : new _shiptimizeOpenMap2.default();\n this.platform.isCheckout();\n this.map.grantReady();\n }\n\n /** \n * Show the map to the user \n */\n\n\n _createClass(Shiptimize, [{\n key: 'showMap',\n value: function showMap() {\n this.userScroll = jQuery('html,body').scrollTop();\n jQuery('html,body').scrollTop(0);\n jQuery(\".shiptimize-pickup\").addClass(\"active\");\n }\n\n /** \n * Hide the map \n */\n\n }, {\n key: 'hideMap',\n value: function hideMap() {\n jQuery(\".shiptimize-pickup\").removeClass(\"active\");\n jQuery(\".shiptimize-pickup__error\").hide();\n jQuery('html,body').scrollTop(this.userScroll);\n }\n }, {\n key: 'clearMarkers',\n value: function clearMarkers() {\n this.map.clearMarkers();\n }\n\n /** \n * Generate the inputs for the user to append extra info if necessary \n * The id of these fields is in the format shiptimize_extra_{PointId}_{FieldId}\n */\n\n }, {\n key: 'getExtendedInfoHtml',\n value: function getExtendedInfoHtml(pickupPoint) {\n if (!pickupPoint.ExtendedInfo || typeof pickupPoint.ExtendedInfo.length == 'undefined') {\n return \"\";\n }\n\n var html = '';\n\n for (var x = 0; pickupPoint.ExtendedInfo && x < pickupPoint.ExtendedInfo.length; ++x) {\n var extraInfo = pickupPoint.ExtendedInfo[x];\n html += '<div class=\"shiptimize-pickup__extended\">' + '<label class=\"shiptimize-pickup__extended_label \">' + extraInfo.Tekst + '</label>' + '<input type=\"text\" name=\"shiptimize_pickup_extended_value\" value=\"\" id=\"shiptimize_extra_' + pickupPoint.PointId + '_' + extraInfo.FieldId + '\"/> ' + '<input type=\"hidden\" name=\"shiptimize_pickup_extended_id\" id=\"shiptimize_pickup\" value=\"' + extraInfo.FieldId + '\"/> ' + '</div>';\n }\n\n return html;\n }\n\n /**\n * Reset all markers \n * Select the marker of index idx in map \n */\n\n }, {\n key: 'selectPointFromListInMap',\n value: function selectPointFromListInMap(idx) {\n jQuery(\"input[name='shiptimize__point']\").prop('checked', false);\n this.map.selectMarkerByIdx(idx);\n\n jQuery(jQuery(\"input[name='shiptimize__point']\").get(idx)).prop('checked', true);\n }\n\n /** \n * When the user clicks the validate button \n */\n\n }, {\n key: 'selectFromList',\n value: function selectFromList() {\n var idx = jQuery(\"input[name='shiptimize__point']:checked\").val();\n var pickup = this.pickupPoints[idx];\n var extra = '';\n\n for (var i = 0; pickup.ExtendedInfo && i < pickup.ExtendedInfo.length; ++i) {\n extra += \"<br/>\" + pickup.ExtendedInfo[i].Tekst + ': ' + jQuery(\"#shiptimize_extra_\" + pickup.PointId + \"_\" + pickup.ExtendedInfo[i].FieldId).val();\n }\n\n jQuery(\".shiptimize-pickup__description\").html(shiptimize_selected_pickup + \" : \" + pickup.Information.Name + \" \" + pickup.Information.Address + \" \" + extra);\n\n this.platform.setPickupPoint(pickup);\n this.hideMap();\n }\n\n /** \n * Returns the distance between 2 (lat,lng) points in kms \n */\n\n }, {\n key: 'getDistance',\n value: function getDistance(latlng, latlng2) {\n\n var R = 6371e3; // metres\n var φ1 = latlng.lat().toRadians();\n var φ2 = latlng2.lng().toRadians();\n\n var Δφ = (latln2.lat() - latlng.lng()).toRadians();\n var Δλ = (latln2.lng() - latlng.lon()).toRadians();\n\n var a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n var d = Math.floor(R * c / 1000);\n }\n\n /** \n * Show the map and query the server for pickup locations near the shipping address provided by the client\n * center the map on the first point \n * remove old markers \n * add the new markers \n */\n\n }, {\n key: 'getPickupLocations',\n value: function getPickupLocations(evt) {\n var _this = this;\n\n if (!this.map || !this.map.isScriptLoaded) {\n console.log(\"map is not loaded ...\");\n return;\n }\n\n this.pickupPointsLoadStart();\n\n /** because some version of woo will trigger a call to checkout and finish the order **/\n evt.preventDefault();\n evt.stopPropagation();\n\n this.showMap();\n\n var data = this.platform.getShippingData();\n data.action = 'shiptimize_pickup_locations';\n\n this.map.setCarrierIcon(data.CarrierId);\n\n this.map.geocode(data, function (geocode) {\n _this.getPickupLocationsFromGeocodedAddr(geocode, data);\n });\n }\n }, {\n key: 'getPickupLocationsFromGeocodedAddr',\n value: function getPickupLocationsFromGeocodedAddr(geocode, data) {\n var _this2 = this;\n\n this.resetUI();\n\n if (!geocode.lng || !geocode.lat) {\n this.pickupPointsLoadStop();\n this.pickupError(shiptimize_geolocationfailed);\n return;\n }\n\n data.Address.Country = geocode.iso2;\n data.Address.Long = geocode.lng;\n data.Address.Lat = geocode.lat;\n\n console.log(data);\n console.log(geocode);\n\n jQuery.getJSON(this.ajax_url, data, function (pickupPoints) {\n // We have the points remove the loader \n _this2.pickupPointsLoadStop();\n\n if (pickupPoints.length == 0) {\n console.log(\"no pickup points found for this address \");\n return;\n }\n\n console.log(pickupPoints);\n if (pickupPoints.Error.Id == 0 && pickupPoints.Point.length > 0) {\n jQuery(\".shiptimize-pickup__options,.shiptimize-pickup__map\").show();\n _this2.setPickupLocations(pickupPoints.Point);\n } else {\n console.log(\"The api returned an error: \", pickupPoints.Error); //pickupPoints.Error.Info || \n _this2.pickupError(shiptimize_no_points_found);\n }\n }).fail(function (resp) {\n console.log(\"Error getting points, shiptimize api error? report to shiptimize. \", resp.responseText); //pickupPoints.Error.Info || \n _this2.pickupError(shiptimize_no_points_found);\n });\n }\n }, {\n key: 'resetUI',\n value: function resetUI() {\n jQuery(\".shiptimize-pickup__error\").hide();\n this.map.clearMarkers();\n }\n\n /** \n * @param string info - the message to display \n */\n\n }, {\n key: 'pickupError',\n value: function pickupError(info) {\n this.pickupPoints = [];\n\n var eError = jQuery(\".shiptimize-pickup__error\");\n eError.html(info);\n eError.show();\n\n jQuery(\".shiptimize-pickup__options,.shiptimize-pickup__map\").hide();\n }\n\n /** \n * Append the pickup Locations to the map\n * @param array pickupPoints - an array of available pickup points \n */\n\n }, {\n key: 'setPickupLocations',\n value: function setPickupLocations(pickupPoints) {\n var _this3 = this;\n\n jQuery(\".shiptimize-pickup__error\").hide();\n\n this.pickupPoints = pickupPoints;\n this.map.clearMarkers();\n this.map.centerMap(this.pickupPoints[0].Lat, this.pickupPoints[1].Long);\n this.map.addMarkers(pickupPoints, function (idx) {\n _this3.selectPointFromListInMap(idx);\n });\n this.setOptionsForAddress(pickupPoints);\n\n typeof this.map.map.invalidateSize != 'undefined' && this.map.map.invalidateSize();\n\n setTimeout(function () {\n _this3.map.fitBounds();\n }, 200);\n }\n\n /** \n * @param pickupPoints[] - [] of pickup points returned by the api \n */\n\n }, {\n key: 'setOptionsForAddress',\n value: function setOptionsForAddress(pickupPoints) {\n\n var html = '';\n for (var i = 0; i < pickupPoints.length; ++i) {\n html += '<div class=\"shiptimize-pickup__point\">' + '<input type=\"radio\" value=\"' + i + '\" name=\"shiptimize__point\" onclick=\"shiptimize.selectPointFromListInMap(' + i + ')\"/>' + '<span class=\"shiptimize-pickup__point_description\" onclick=\"shiptimize.selectPointFromListInMap(' + i + ')\">' + '<span>' + (pickupPoints[i].Information.Name ? pickupPoints[i].Information.Name + '<br/>' : '') + pickupPoints[i].Information.Address + '</span>' + this.getExtendedInfoHtml(pickupPoints[i]) + '</span>' + '</div>';\n }\n console.log(html);\n\n jQuery(\".shiptimize-pickup__other\").html(html);\n }\n }, {\n key: 'loadMap',\n value: function loadMap() {\n this.map.loadMap();\n }\n }, {\n key: 'pickupPointsLoadStart',\n value: function pickupPointsLoadStart() {\n jQuery(\".shiptimize-pickup__mapWrapper\").addClass('loading');\n }\n }, {\n key: 'pickupPointsLoadStop',\n value: function pickupPointsLoadStop() {\n jQuery(\".shiptimize-pickup__mapWrapper\").removeClass('loading');\n }\n }]);\n\n return Shiptimize;\n}();\n\njQuery(function () {\n if (typeof woocommerce_params != 'undefined') {\n window.shiptimize = new Shiptimize(woocommerce_params.ajax_url);\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGlwdG1pemUuanM/NjljNyJdLCJuYW1lcyI6WyJTaGlwdGltaXplIiwiYWpheF91cmwiLCJtYXJrZXJzIiwiaXNNYXBMb2FkZWQiLCJnbWFwc19rZXkiLCJzaGlwdGltaXplX21hcHNfa2V5Iiwib3Blbk1hcE1hcmtlckljb25zIiwicGxhdGZvcm0iLCJXb29Db21tZXJjZSIsIm1hcCIsIkdvb2dsZU1hcCIsIk9wZW5TdHJlZXRNYXAiLCJpc0NoZWNrb3V0IiwiZ3JhbnRSZWFkeSIsInVzZXJTY3JvbGwiLCJqUXVlcnkiLCJzY3JvbGxUb3AiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwiaGlkZSIsImNsZWFyTWFya2VycyIsInBpY2t1cFBvaW50IiwiRXh0ZW5kZWRJbmZvIiwibGVuZ3RoIiwiaHRtbCIsIngiLCJleHRyYUluZm8iLCJUZWtzdCIsIlBvaW50SWQiLCJGaWVsZElkIiwiaWR4IiwicHJvcCIsInNlbGVjdE1hcmtlckJ5SWR4IiwiZ2V0IiwidmFsIiwicGlja3VwIiwicGlja3VwUG9pbnRzIiwiZXh0cmEiLCJpIiwic2hpcHRpbWl6ZV9zZWxlY3RlZF9waWNrdXAiLCJJbmZvcm1hdGlvbiIsIk5hbWUiLCJBZGRyZXNzIiwic2V0UGlja3VwUG9pbnQiLCJoaWRlTWFwIiwibGF0bG5nIiwibGF0bG5nMiIsIlIiLCLPhjEiLCJsYXQiLCJ0b1JhZGlhbnMiLCLPhjIiLCJsbmciLCLOlM+GIiwibGF0bG4yIiwizpTOuyIsImxvbiIsImEiLCJNYXRoIiwic2luIiwiY29zIiwiYyIsImF0YW4yIiwic3FydCIsImQiLCJmbG9vciIsImV2dCIsImlzU2NyaXB0TG9hZGVkIiwiY29uc29sZSIsImxvZyIsInBpY2t1cFBvaW50c0xvYWRTdGFydCIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwic2hvd01hcCIsImRhdGEiLCJnZXRTaGlwcGluZ0RhdGEiLCJhY3Rpb24iLCJzZXRDYXJyaWVySWNvbiIsIkNhcnJpZXJJZCIsImdlb2NvZGUiLCJnZXRQaWNrdXBMb2NhdGlvbnNGcm9tR2VvY29kZWRBZGRyIiwicmVzZXRVSSIsInBpY2t1cFBvaW50c0xvYWRTdG9wIiwicGlja3VwRXJyb3IiLCJzaGlwdGltaXplX2dlb2xvY2F0aW9uZmFpbGVkIiwiQ291bnRyeSIsImlzbzIiLCJMb25nIiwiTGF0IiwiZ2V0SlNPTiIsIkVycm9yIiwiSWQiLCJQb2ludCIsInNob3ciLCJzZXRQaWNrdXBMb2NhdGlvbnMiLCJzaGlwdGltaXplX25vX3BvaW50c19mb3VuZCIsImZhaWwiLCJyZXNwIiwicmVzcG9uc2VUZXh0IiwiaW5mbyIsImVFcnJvciIsImNlbnRlck1hcCIsImFkZE1hcmtlcnMiLCJzZWxlY3RQb2ludEZyb21MaXN0SW5NYXAiLCJzZXRPcHRpb25zRm9yQWRkcmVzcyIsImludmFsaWRhdGVTaXplIiwic2V0VGltZW91dCIsImZpdEJvdW5kcyIsImdldEV4dGVuZGVkSW5mb0h0bWwiLCJsb2FkTWFwIiwid29vY29tbWVyY2VfcGFyYW1zIiwid2luZG93Iiwic2hpcHRpbWl6ZSJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOztBQUNBOztBQUVBOzs7O0FBQ0E7Ozs7QUFFQTs7OztBQUNBOzs7Ozs7OztBQUVBOzs7Ozs7SUFNTUEsVTtBQUVGLHdCQUFZQyxRQUFaLEVBQXNCO0FBQUE7O0FBQ2xCLGFBQUtDLE9BQUwsR0FBZSxFQUFmLENBRGtCLENBQ0M7QUFDbkIsYUFBS0MsV0FBTCxHQUFtQixLQUFuQjtBQUNBLGFBQUtDLFNBQUwsR0FBaUIsT0FBT0MsbUJBQVAsSUFBK0IsV0FBL0IsR0FBOEMsRUFBOUMsR0FBbURBLG1CQUFwRTtBQUNBLGFBQUtDLGtCQUFMLEdBQTBCLEVBQTFCO0FBQ0EsYUFBS0wsUUFBTCxHQUFnQkEsUUFBaEIsQ0FMa0IsQ0FLUTs7QUFFMUIsYUFBS00sUUFBTCxHQUFnQixJQUFJQywrQkFBSixDQUFnQixLQUFLUCxRQUFyQixDQUFoQjs7QUFFQSxhQUFLUSxHQUFMLEdBQVcsS0FBS0wsU0FBTCxH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VEo7QUFVSDtBQUNEOEIsb0JBQVFDLEdBQVIsQ0FBWTdDLElBQVo7O0FBRUFULG1CQUFPLDJCQUFQLEVBQW9DUyxJQUFwQyxDQUF5Q0EsSUFBekM7QUFDSDs7O2tDQUdTO0FBQ04saUJBQUtmLEdBQUwsQ0FBU29HLE9BQVQ7QUFDSDs7O2dEQUV1QjtBQUN0QjlGLG1CQUFPLGdDQUFQLEVBQXlDRSxRQUF6QyxDQUFrRCxTQUFsRDtBQUNEOzs7K0NBRXNCO0FBQ3JCRixtQkFBTyxnQ0FBUCxFQUF5Q0csV0FBekMsQ0FBcUQsU0FBckQ7QUFDRDs7Ozs7O0FBR0xILE9BQU8sWUFBVztBQUNkLFFBQUcsT0FBTytGLGtCQUFQLElBQThCLFdBQWpDLEVBQTZDO0FBQ3pDQyxlQUFPQyxVQUFQLEdBQW9CLElBQUloSCxVQUFKLENBQWU4RyxtQkFBbUI3RyxRQUFsQyxDQUFwQjtBQUNIO0FBQ0osQ0FKRCIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICcuL3Njc3Mvc2hpcHRpbWl6ZS5zY3NzJztcbmltcG9ydCAnLi9jc3MvbGVhZmxldC5jc3MnO1xuXG5pbXBvcnQgVXRpbHMgZnJvbSAnLi9qcy9zaGlwdGltaXplLXV0aWxzLmpzJztcbmltcG9ydCBXb29Db21tZXJjZSBmcm9tICcuL2pzL3NoaXB0aW1pemUtd29vLWNvbW1lcmNlLmpzJztcblxuaW1wb3J0IEdvb2dsZU1hcCBmcm9tICcuL2pzL3NoaXB0aW1pemUtZ21hcHMuanMnO1xuaW1wb3J0IE9wZW5TdHJlZXRNYXAgZnJvbSAnLi9qcy9zaGlwdGltaXplLW9wZW4tbWFwLmpzJztcblxuLyoqIFxuICogQ2xhc3MgU2hpcHRpbWl6ZSBkZXBlbmRzIG9uIGpRdWVyeS4gXG4gKiBDaGVjayBpZiB3ZSBhcmUgbWVhbnQgdG8gYXBwZW5kIGEgbWFwIFxuICogXG4gKiBQbGF0Zm9ybSBkZXBlbmRlbnQgZnVuY3Rpb25zIG1hcmtlZCB3aXRoICAgKiBAcGxhdGZvcm1EZXBlbmRlbnQgXG4gKi9cbmNsYXNzIFNoaXB0aW1pemUge1xuXG4gICAgY29uc3RydWN0b3IoYWpheF91cmwpIHtcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gW107IC8vcGlja3VwIHtsYXQsIGxuZ30gXG4gICAgICAgIHRoaXMuaXNNYXBMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5nbWFwc19rZXkgPSB0eXBlb2Yoc2hpcHRpbWl6ZV9tYXBzX2tleSkgPT0gJ3VuZGVmaW5lZCcgPyAgJycgOiBzaGlwdGltaXplX21hcHNfa2V5IDtcbiAgICAgICAgdGhpcy5vcGVuTWFwTWFya2VySWNvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5hamF4X3VybCA9IGFqYXhfdXJsOyAvLyBwbGF0Zm9ybSBkZXBlbmRlbnQgXG5cbiAgICAgICAgdGhpcy5wbGF0Zm9ybSA9IG5ldyBXb29Db21tZXJjZSh0aGlzLmFqYXhfdXJsKTtcblxuICAgICAgICB0aGlzLm1hcCA9IHRoaXMuZ21hcHNfa2V5ID8gbmV3IEdvb2dsZU1hcCh0aGlzLmdtYXBzX2tleSkgOiBuZXcgT3BlblN0cmVldE1hcCgpO1xuICAgICAgICB0aGlzLnBsYXRmb3JtLmlzQ2hlY2tvdXQoKTsgXG4gICAgICAgIHRoaXMubWFwLmdyYW50UmVhZHkoKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogU2hvdyB0aGUgbWFwIHRvIHRoZSB1c2VyIFxuICAgICAqL1xuICAgIHNob3dNYXAoKSB7XG4gICAgICAgIHRoaXMudXNlclNjcm9sbCA9IGpRdWVyeSgnaHRtbCxib2R5Jykuc2Nyb2xsVG9wKCk7IFxuICAgICAgICBqUXVlcnkoJ2h0bWwsYm9keScpLnNjcm9sbFRvcCgwKTsgXG4gICAgICAgIGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cFwiKS5hZGRDbGFzcyhcImFjdGl2ZVwiKTsgXG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIEhpZGUgdGhlIG1hcCAgIFxuICAgICAqL1xuICAgIGhpZGVNYXAoKSB7XG4gICAgICAgIGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cFwiKS5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtcbiAgICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19lcnJvclwiKS5oaWRlKCk7XG4gICAgICAgIGpRdWVyeSgnaHRtbCxib2R5Jykuc2Nyb2xsVG9wKHRoaXMudXNlclNjcm9sbCk7IFxuICAgIH1cblxuICAgIGNsZWFyTWFya2VycygpIHtcbiAgICAgICAgdGhpcy5tYXAuY2xlYXJNYXJrZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIEdlbmVyYXRlIHRoZSBpbnB1dHMgZm9yIHRoZSB1c2VyIHRvIGFwcGVuZCBleHRyYSBpbmZvIGlmIG5lY2Vzc2FyeSBcbiAgICAgKiBUaGUgaWQgb2YgdGhlc2UgZmllbGRzIGlzIGluIHRoZSBmb3JtYXQgc2hpcHRpbWl6ZV9leHRyYV97UG9pbnRJZH1fe0ZpZWxkSWR9XG4gICAgICovXG4gICAgZ2V0RXh0ZW5kZWRJbmZvSHRtbChwaWNrdXBQb2ludCkge1xuICAgICAgICBpZiAoIXBpY2t1cFBvaW50LkV4dGVuZGVkSW5mbyB8fCB0eXBlb2YocGlja3VwUG9pbnQuRXh0ZW5kZWRJbmZvLmxlbmd0aCkgPT0ndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgICAgIGZvciAobGV0IHggPSAwOyBwaWNrdXBQb2ludC5FeHRlbmRlZEluZm8gJiYgeCA8IHBpY2t1cFBvaW50LkV4dGVuZGVkSW5mby5sZW5ndGg7ICsreCkge1xuICAgICAgICAgICAgbGV0IGV4dHJhSW5mbyA9IHBpY2t1cFBvaW50LkV4dGVuZGVkSW5mb1t4XTtcbiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJzaGlwdGltaXplLXBpY2t1cF9fZXh0ZW5kZWRcIj4nICtcbiAgICAgICAgICAgICAgICAnPGxhYmVsIGNsYXNzPVwic2hpcHRpbWl6ZS1waWNrdXBfX2V4dGVuZGVkX2xhYmVsIFwiPicgKyBleHRyYUluZm8uVGVrc3QgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAnPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInNoaXB0aW1pemVfcGlja3VwX2V4dGVuZGVkX3ZhbHVlXCIgdmFsdWU9XCJcIiBpZD1cInNoaXB0aW1pemVfZXh0cmFfJyArIHBpY2t1cFBvaW50LlBvaW50SWQgKyAnXycgKyBleHRyYUluZm8uRmllbGRJZCArICdcIi8+ICcgK1xuICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJzaGlwdGltaXplX3BpY2t1cF9leHRlbmRlZF9pZFwiIGlkPVwic2hpcHRpbWl6ZV9waWNrdXBcIiB2YWx1ZT1cIicgKyBleHRyYUluZm8uRmllbGRJZCArICdcIi8+ICcgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXQgYWxsIG1hcmtlcnMgIFxuICAgICAqIFNlbGVjdCB0aGUgbWFya2VyIG9mIGluZGV4IGlkeCBpbiBtYXAgXG4gICAgICovXG4gICAgc2VsZWN0UG9pbnRGcm9tTGlzdEluTWFwKGlkeCkge1xuICAgICAgICBqUXVlcnkoXCJpbnB1dFtuYW1lPSdzaGlwdGltaXplX19wb2ludCddXCIpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgICAgIHRoaXMubWFwLnNlbGVjdE1hcmtlckJ5SWR4KGlkeCk7XG5cbiAgICAgICAgalF1ZXJ5KGpRdWVyeShcImlucHV0W25hbWU9J3NoaXB0aW1pemVfX3BvaW50J11cIikuZ2V0KGlkeCkpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogV2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIHZhbGlkYXRlIGJ1dHRvbiBcbiAgICAgKi9cbiAgICBzZWxlY3RGcm9tTGlzdCgpIHtcbiAgICAgICAgbGV0IGlkeCA9IGpRdWVyeShcImlucHV0W25hbWU9J3NoaXB0aW1pemVfX3BvaW50J106Y2hlY2tlZFwiKS52YWwoKTtcbiAgICAgICAgbGV0IHBpY2t1cCA9IHRoaXMucGlja3VwUG9pbnRzW2lkeF07XG4gICAgICAgIGxldCBleHRyYSA9ICcnO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwaWNrdXAuRXh0ZW5kZWRJbmZvICYmIGkgPCBwaWNrdXAuRXh0ZW5kZWRJbmZvLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBleHRyYSArPSBcIjxici8+XCIgKyBwaWNrdXAuRXh0ZW5kZWRJbmZvW2ldLlRla3N0ICsgJzogJyArIGpRdWVyeShcIiNzaGlwdGltaXplX2V4dHJhX1wiICsgcGlja3VwLlBvaW50SWQgKyBcIl9cIiArIHBpY2t1cC5FeHRlbmRlZEluZm9baV0uRmllbGRJZCkudmFsKCk7XG4gICAgICAgIH1cblxuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX2Rlc2NyaXB0aW9uXCIpLmh0bWwoc2hpcHRpbWl6ZV9zZWxlY3RlZF9waWNrdXAgKyBcIiA6IFwiICsgcGlja3VwLkluZm9ybWF0aW9uLk5hbWUgKyBcIiBcIiArIHBpY2t1cC5JbmZvcm1hdGlvbi5BZGRyZXNzICsgXCIgXCIgKyBleHRyYSk7XG5cbiAgICAgICAgdGhpcy5wbGF0Zm9ybS5zZXRQaWNrdXBQb2ludChwaWNrdXApO1xuICAgICAgICB0aGlzLmhpZGVNYXAoKTtcbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiAgUmV0dXJucyB0aGUgZGlzdGFuY2UgYmV0d2VlbiAyIChsYXQsbG5nKSBwb2ludHMgaW4ga21zIFxuICAgICAqL1xuICAgIGdldERpc3RhbmNlKGxhdGxuZywgbGF0bG5nMikge1xuXG4gICAgICAgIHZhciBSID0gNjM3MWUzOyAvLyBtZXRyZXNcbiAgICAgICAgdmFyIM+GMSA9IGxhdGxuZy5sYXQoKS50b1JhZGlhbnMoKTtcbiAgICAgICAgdmFyIM+GMiA9IGxhdGxuZzIubG5nKCkudG9SYWRpYW5zKCk7XG5cbiAgICAgICAgdmFyIM6Uz4YgPSAobGF0bG4yLmxhdCgpIC0gbGF0bG5nLmxuZygpKS50b1JhZGlhbnMoKTtcbiAgICAgICAgdmFyIM6UzrsgPSAobGF0bG4yLmxuZygpIC0gbGF0bG5nLmxvbigpKS50b1JhZGlhbnMoKTtcblxuICAgICAgICB2YXIgYSA9IE1hdGguc2luKM6Uz4YgLyAyKSAqIE1hdGguc2luKM6Uz4YgLyAyKSArXG4gICAgICAgICAgICBNYXRoLmNvcyjPhjEpICogTWF0aC5jb3Moz4YyKSAqXG4gICAgICAgICAgICBNYXRoLnNpbijOlM67IC8gMikgKiBNYXRoLnNpbijOlM67IC8gMik7XG4gICAgICAgIHZhciBjID0gMiAqIE1hdGguYXRhbjIoTWF0aC5zcXJ0KGEpLCBNYXRoLnNxcnQoMSAtIGEpKTtcblxuICAgICAgICB2YXIgZCA9IE1hdGguZmxvb3IoUiAqIGMgLyAxMDAwKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogU2hvdyB0aGUgbWFwIGFuZCBxdWVyeSB0aGUgc2VydmVyIGZvciBwaWNrdXAgbG9jYXRpb25zIG5lYXIgdGhlIHNoaXBwaW5nIGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIGNsaWVudFxuICAgICAqIGNlbnRlciB0aGUgbWFwIG9uIHRoZSBmaXJzdCBwb2ludCBcbiAgICAgKiByZW1vdmUgb2xkIG1hcmtlcnMgXG4gICAgICogYWRkIHRoZSBuZXcgbWFya2VycyAgXG4gICAgICovXG4gICAgZ2V0UGlja3VwTG9jYXRpb25zKGV2dCkge1xuICAgICAgICBpZighdGhpcy5tYXAgfHwgIXRoaXMubWFwLmlzU2NyaXB0TG9hZGVkKXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibWFwIGlzIG5vdCBsb2FkZWQgLi4uXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5waWNrdXBQb2ludHNMb2FkU3RhcnQoKTsgXG5cbiAgICAgICAgLyoqIGJlY2F1c2Ugc29tZSB2ZXJzaW9uIG9mIHdvbyB3aWxsIHRyaWdnZXIgYSBjYWxsIHRvIGNoZWNrb3V0IGFuZCBmaW5pc2ggIHRoZSBvcmRlciAqKi9cbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuc2hvd01hcCgpO1xuXG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5wbGF0Zm9ybS5nZXRTaGlwcGluZ0RhdGEoKTtcbiAgICAgICAgZGF0YS5hY3Rpb24gPSAnc2hpcHRpbWl6ZV9waWNrdXBfbG9jYXRpb25zJztcblxuICAgICAgICB0aGlzLm1hcC5zZXRDYXJyaWVySWNvbihkYXRhLkNhcnJpZXJJZCk7XG5cbiAgICAgICAgdGhpcy5tYXAuZ2VvY29kZShkYXRhLCAoZ2VvY29kZSkgPT4geyB0aGlzLmdldFBpY2t1cExvY2F0aW9uc0Zyb21HZW9jb2RlZEFkZHIoZ2VvY29kZSwgZGF0YSk7IH0pO1xuICAgIH1cblxuXG4gICAgZ2V0UGlja3VwTG9jYXRpb25zRnJvbUdlb2NvZGVkQWRkcihnZW9jb2RlLCBkYXRhKSB7XG4gICAgICAgIHRoaXMucmVzZXRVSSgpOyBcbiAgICAgICAgXG4gICAgICAgIGlmKCFnZW9jb2RlLmxuZyB8fCAhZ2VvY29kZS5sYXQpIHtcbiAgICAgICAgICAgIHRoaXMucGlja3VwUG9pbnRzTG9hZFN0b3AoKTsgXG4gICAgICAgICAgICB0aGlzLnBpY2t1cEVycm9yKHNoaXB0aW1pemVfZ2VvbG9jYXRpb25mYWlsZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YS5BZGRyZXNzLkNvdW50cnkgPSBnZW9jb2RlLmlzbzI7XG4gICAgICAgIGRhdGEuQWRkcmVzcy5Mb25nID0gZ2VvY29kZS5sbmc7XG4gICAgICAgIGRhdGEuQWRkcmVzcy5MYXQgPSBnZW9jb2RlLmxhdDtcblxuICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTtcbiAgICAgICAgY29uc29sZS5sb2coZ2VvY29kZSk7XG5cbiAgICAgICAgalF1ZXJ5LmdldEpTT04odGhpcy5hamF4X3VybCwgZGF0YSwgKHBpY2t1cFBvaW50cykgPT4ge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSB0aGUgcG9pbnRzIHJlbW92ZSB0aGUgbG9hZGVyIFxuICAgICAgICAgICAgdGhpcy5waWNrdXBQb2ludHNMb2FkU3RvcCgpOyBcblxuICAgICAgICAgICAgaWYgKHBpY2t1cFBvaW50cy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibm8gcGlja3VwIHBvaW50cyBmb3VuZCBmb3IgdGhpcyBhZGRyZXNzIFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHBpY2t1cFBvaW50cyk7XG4gICAgICAgICAgICBpZiAocGlja3VwUG9pbnRzLkVycm9yLklkID09IDAgJiYgcGlja3VwUG9pbnRzLlBvaW50Lmxlbmd0aCA+IDAgKSB7XG4gICAgICAgICAgICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19vcHRpb25zLC5zaGlwdGltaXplLXBpY2t1cF9fbWFwXCIpLnNob3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBpY2t1cExvY2F0aW9ucyhwaWNrdXBQb2ludHMuUG9pbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoZSBhcGkgcmV0dXJuZWQgYW4gZXJyb3I6IFwiLCBwaWNrdXBQb2ludHMuRXJyb3IpOyAvL3BpY2t1cFBvaW50cy5FcnJvci5JbmZvIHx8IFxuICAgICAgICAgICAgICAgIHRoaXMucGlja3VwRXJyb3Ioc2hpcHRpbWl6ZV9ub19wb2ludHNfZm91bmQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pLmZhaWwoIChyZXNwKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGdldHRpbmcgcG9pbnRzLCBzaGlwdGltaXplIGFwaSBlcnJvcj8gcmVwb3J0IHRvIHNoaXB0aW1pemUuIFwiLCByZXNwLnJlc3BvbnNlVGV4dCk7IC8vcGlja3VwUG9pbnRzLkVycm9yLkluZm8gfHwgXG4gICAgICAgICAgICB0aGlzLnBpY2t1cEVycm9yKHNoaXB0aW1pemVfbm9fcG9pbnRzX2ZvdW5kKTsgXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlc2V0VUkoKXtcbiAgICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19lcnJvclwiKS5oaWRlKCk7XG4gICAgICAgIHRoaXMubWFwLmNsZWFyTWFya2VycygpOyBcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQHBhcmFtIHN0cmluZyBpbmZvIC0gdGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBcbiAgICAgKi9cbiAgICBwaWNrdXBFcnJvcihpbmZvKSB7XG4gICAgICAgIHRoaXMucGlja3VwUG9pbnRzID0gW107IFxuXG4gICAgICAgIGxldCBlRXJyb3IgPSBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX2Vycm9yXCIpO1xuICAgICAgICBlRXJyb3IuaHRtbChpbmZvKTtcbiAgICAgICAgZUVycm9yLnNob3coKTtcblxuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX29wdGlvbnMsLnNoaXB0aW1pemUtcGlja3VwX19tYXBcIikuaGlkZSgpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBBcHBlbmQgdGhlIHBpY2t1cCBMb2NhdGlvbnMgdG8gdGhlIG1hcFxuICAgICAqIEBwYXJhbSBhcnJheSBwaWNrdXBQb2ludHMgLSBhbiBhcnJheSBvZiBhdmFpbGFibGUgcGlja3VwIHBvaW50cyBcbiAgICAgKi9cbiAgICBzZXRQaWNrdXBMb2NhdGlvbnMocGlja3VwUG9pbnRzKSB7XG4gICAgICAgIGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cF9fZXJyb3JcIikuaGlkZSgpO1xuXG4gICAgICAgIHRoaXMucGlja3VwUG9pbnRzID0gcGlja3VwUG9pbnRzO1xuICAgICAgICB0aGlzLm1hcC5jbGVhck1hcmtlcnMoKTtcbiAgICAgICAgdGhpcy5tYXAuY2VudGVyTWFwKHRoaXMucGlja3VwUG9pbnRzWzBdLkxhdCwgdGhpcy5waWNrdXBQb2ludHNbMV0uTG9uZyk7XG4gICAgICAgIHRoaXMubWFwLmFkZE1hcmtlcnMocGlja3VwUG9pbnRzLCAoaWR4KSA9PiB7IHRoaXMuc2VsZWN0UG9pbnRGcm9tTGlzdEluTWFwKGlkeCk7IH0pO1xuICAgICAgICB0aGlzLnNldE9wdGlvbnNGb3JBZGRyZXNzKHBpY2t1cFBvaW50cyk7XG5cbiAgICAgICAgKHR5cGVvZih0aGlzLm1hcC5tYXAuaW52YWxpZGF0ZVNpemUpICE9ICd1bmRlZmluZWQnKSAmJiB0aGlzLm1hcC5tYXAuaW52YWxpZGF0ZVNpemUoKTtcblxuICAgICAgICBzZXRUaW1lb3V0ICggKCkgPT4geyBcbiAgICAgICAgICAgIHRoaXMubWFwLmZpdEJvdW5kcygpOyBcbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQHBhcmFtIHBpY2t1cFBvaW50c1tdIC0gW10gb2YgcGlja3VwIHBvaW50cyByZXR1cm5lZCBieSB0aGUgYXBpIFxuICAgICAqL1xuICAgIHNldE9wdGlvbnNGb3JBZGRyZXNzKHBpY2t1cFBvaW50cykge1xuXG4gICAgICAgIGxldCBodG1sID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGlja3VwUG9pbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwic2hpcHRpbWl6ZS1waWNrdXBfX3BvaW50XCI+JyArXG4gICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPVwicmFkaW9cIiB2YWx1ZT1cIicgKyBpICsgJ1wiIG5hbWU9XCJzaGlwdGltaXplX19wb2ludFwiICBvbmNsaWNrPVwic2hpcHRpbWl6ZS5zZWxlY3RQb2ludEZyb21MaXN0SW5NYXAoJyArIGkgKyAnKVwiLz4nICtcbiAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzaGlwdGltaXplLXBpY2t1cF9fcG9pbnRfZGVzY3JpcHRpb25cIiBvbmNsaWNrPVwic2hpcHRpbWl6ZS5zZWxlY3RQb2ludEZyb21MaXN0SW5NYXAoJyArIGkgKyAnKVwiPicgK1xuICAgICAgICAgICAgICAgICc8c3Bhbj4nICsgKHBpY2t1cFBvaW50c1tpXS5JbmZvcm1hdGlvbi5OYW1lID9waWNrdXBQb2ludHNbaV0uSW5mb3JtYXRpb24uTmFtZSArICc8YnIvPicgOiAnJylcbiAgICAgICAgICAgICAgICAgKyBwaWNrdXBQb2ludHNbaV0uSW5mb3JtYXRpb24uQWRkcmVzcyArICc8L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRFeHRlbmRlZEluZm9IdG1sKHBpY2t1cFBvaW50c1tpXSkgK1xuICAgICAgICAgICAgICAgICc8L3NwYW4+J1xuXG4gICAgICAgICAgICAgICAgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGh0bWwpO1xuXG4gICAgICAgIGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cF9fb3RoZXJcIikuaHRtbChodG1sKTtcbiAgICB9XG5cblxuICAgIGxvYWRNYXAoKSB7XG4gICAgICAgIHRoaXMubWFwLmxvYWRNYXAoKTtcbiAgICB9XG5cbiAgICBwaWNrdXBQb2ludHNMb2FkU3RhcnQoKSB7XG4gICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX21hcFdyYXBwZXJcIikuYWRkQ2xhc3MoJ2xvYWRpbmcnKTsgIFxuICAgIH07IFxuXG4gICAgcGlja3VwUG9pbnRzTG9hZFN0b3AoKSB7XG4gICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX21hcFdyYXBwZXJcIikucmVtb3ZlQ2xhc3MoJ2xvYWRpbmcnKTsgXG4gICAgfTtcbn1cblxualF1ZXJ5KGZ1bmN0aW9uKCkge1xuICAgIGlmKHR5cGVvZih3b29jb21tZXJjZV9wYXJhbXMpICE9ICd1bmRlZmluZWQnKXtcbiAgICAgICAgd2luZG93LnNoaXB0aW1pemUgPSBuZXcgU2hpcHRpbWl6ZSh3b29jb21tZXJjZV9wYXJhbXMuYWpheF91cmwpOyAgICBcbiAgICB9IFxufSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1\n")},function(module,exports,__webpack_require__){eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zY3NzL3NoaXB0aW1pemUuc2Nzcz9lYzk3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6IjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2\n")},function(module,exports,__webpack_require__){eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jc3MvbGVhZmxldC5jc3M/OTU1NSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSIsImZpbGUiOiIzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _shiptimizeUtils = __webpack_require__(0);\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Woocommerce = function () {\n function Woocommerce(ajax_url) {\n _classCallCheck(this, Woocommerce);\n\n this.ajax_url = ajax_url;\n }\n\n /** \n * @return true if this is the checkout page \n */\n\n\n _createClass(Woocommerce, [{\n key: 'isCheckout',\n value: function isCheckout() {\n return jQuery(\"body\").hasClass('woocommerce-checkout');\n }\n\n /* \n * If there is only one method available woo will use a hidden field for the selected carrier \n * + Generic Methods do not have an instance id \n */\n\n }, {\n key: 'getShippingMethodId',\n value: function getShippingMethodId() {\n\n var eCheckbox = jQuery(\"input[name='shipping_method[0]']:checked\");\n var eHidden = jQuery(\"input[name='shipping_method[0]']\");\n\n var shippingMethod = eCheckbox.length > 0 ? eCheckbox.val() : eHidden.val();\n\n if (shippingMethod.indexOf(':') > 0) {\n var method_parts = shippingMethod.split(':');\n return _shiptimizeUtils2.default.removeNonNumeric(method_parts[0]);\n } else {\n return shippingMethod;\n }\n }\n\n /** \n * Wordpress won't send session cookies to wp-admin and the session handling in woocommerce is so poorly documented we are better off \n * extracting necessary info client side our selves. We're emulating their checkout.js \n * @return an object containing address parts \n */\n\n }, {\n key: 'getShippingData',\n value: function getShippingData() {\n\n var country = jQuery('#billing_country').val(),\n state = jQuery('#billing_state').val(),\n postcode = jQuery('input#billing_postcode').val(),\n city = jQuery('#billing_city').val(),\n address = jQuery('input#billing_address_1').val(),\n address_2 = jQuery('input#billing_address_2').val(),\n s_country = country,\n s_state = state,\n s_postcode = postcode,\n s_city = city,\n s_address = address,\n s_address_2 = address_2;\n\n if (jQuery('#ship-to-different-address').find('input').is(':checked')) {\n s_country = jQuery('#shipping_country').val();\n s_state = jQuery('#shipping_state').val();\n s_postcode = jQuery('input#shipping_postcode').val();\n s_city = jQuery('#shipping_city').val();\n s_address = jQuery('input#shipping_address_1').val();\n s_address_2 = jQuery('input#shipping_address_2').val();\n }\n\n return {\n \"Address\": {\n \"Lat\": \"\",\n \"Long\": \"\",\n \"Streetname1\": s_address,\n \"Streetname2\": s_address_2,\n \"HouseNumber\": '',\n \"NumberExtension\": '',\n \"PostalCode\": s_postcode,\n \"s_postcode\": s_postcode,\n \"City\": s_city,\n \"Country\": s_country,\n \"State\": s_state\n\n },\n post_data: jQuery('form.checkout').serialize(),\n \"CarrierId\": this.carrier_id\n };\n }\n\n /** \n * We must run this onload \n * And on method change \n * because people may never change the carrier or select a pickup point \n */\n\n }, {\n key: 'setCarrier',\n value: function setCarrier(carrier_id) {\n this.carrier_id = typeof carrier_id != 'undefined' ? carrier_id : this.getShippingMethodId();\n jQuery(\"#shipping_carrier_id\").val(this.carrier_id);\n }\n\n /** \n * @param Pickup pickup \n */\n\n }, {\n key: 'setPickupPoint',\n value: function setPickupPoint(pickup) {\n var pickup_label = pickup.Information.Name + \" \" + pickup.Information.Address;\n\n jQuery(\".shiptimize-pickup__description\").html(shiptimize_selected_pickup + \" : \" + pickup_label);\n jQuery(\"#shipping_pickup_id\").val(pickup.PointId);\n jQuery(\"#shipping_pickup_label\").val(pickup_label);\n\n jQuery(\"#shiptimizepickup\").val(pickup.PointId);\n }\n }]);\n\n return Woocommerce;\n}();\n\nexports.default = Woocommerce;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdvby1jb21tZXJjZS5qcz8yY2Y5Il0sIm5hbWVzIjpbIldvb2NvbW1lcmNlIiwiYWpheF91cmwiLCJqUXVlcnkiLCJoYXNDbGFzcyIsImVDaGVja2JveCIsImVIaWRkZW4iLCJzaGlwcGluZ01ldGhvZCIsImxlbmd0aCIsInZhbCIsImluZGV4T2YiLCJtZXRob2RfcGFydHMiLCJzcGxpdCIsIlV0aWxzIiwicmVtb3ZlTm9uTnVtZXJpYyIsImNvdW50cnkiLCJzdGF0ZSIsInBvc3Rjb2RlIiwiY2l0eSIsImFkZHJlc3MiLCJhZGRyZXNzXzIiLCJzX2NvdW50cnkiLCJzX3N0YXRlIiwic19wb3N0Y29kZSIsInNfY2l0eSIsInNfYWRkcmVzcyIsInNfYWRkcmVzc18yIiwiZmluZCIsImlzIiwicG9zdF9kYXRhIiwic2VyaWFsaXplIiwiY2Fycmllcl9pZCIsImdldFNoaXBwaW5nTWV0aG9kSWQiLCJwaWNrdXAiLCJwaWNrdXBfbGFiZWwiLCJJbmZvcm1hdGlvbiIsIk5hbWUiLCJBZGRyZXNzIiwiaHRtbCIsInNoaXB0aW1pemVfc2VsZWN0ZWRfcGlja3VwIiwiUG9pbnRJZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7SUFFcUJBLFc7QUFFakIseUJBQVlDLFFBQVosRUFBc0I7QUFBQTs7QUFDbEIsYUFBS0EsUUFBTCxHQUFnQkEsUUFBaEI7QUFDSDs7QUFFRDs7Ozs7OztxQ0FHYTtBQUNULG1CQUFPQyxPQUFPLE1BQVAsRUFBZUMsUUFBZixDQUF3QixzQkFBeEIsQ0FBUDtBQUNIOztBQUVEOzs7Ozs7OzhDQUlxQjs7QUFFakIsZ0JBQUlDLFlBQVlGLE9BQU8sMENBQVAsQ0FBaEI7QUFDQSxnQkFBSUcsVUFBVUgsT0FBTyxrQ0FBUCxDQUFkOztBQUVBLGdCQUFJSSxpQkFBa0JGLFVBQVVHLE1BQVYsR0FBbUIsQ0FBbkIsR0FBdUJILFVBQVVJLEdBQVYsRUFBdkIsR0FBeUNILFFBQVFHLEdBQVIs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Ozs7a0JBMUdnQnZDLFciLCJmaWxlIjoiNC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBVdGlscyBmcm9tICcuL3NoaXB0aW1pemUtdXRpbHMuanMnOyBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV29vY29tbWVyY2Uge1xuXG4gICAgY29uc3RydWN0b3IoYWpheF91cmwpIHtcbiAgICAgICAgdGhpcy5hamF4X3VybCA9IGFqYXhfdXJsO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgY2hlY2tvdXQgcGFnZSBcbiAgICAgKi9cbiAgICBpc0NoZWNrb3V0KCkge1xuICAgICAgICByZXR1cm4galF1ZXJ5KFwiYm9keVwiKS5oYXNDbGFzcygnd29vY29tbWVyY2UtY2hlY2tvdXQnKTtcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiBJZiB0aGVyZSBpcyBvbmx5IG9uZSBtZXRob2QgYXZhaWxhYmxlIHdvbyB3aWxsIHVzZSBhIGhpZGRlbiBmaWVsZCBmb3IgdGhlIHNlbGVjdGVkIGNhcnJpZXIgXG4gICAgICogICsgR2VuZXJpYyBNZXRob2RzIGRvIG5vdCBoYXZlIGFuIGluc3RhbmNlIGlkIFxuICAgICAqLyBcbiAgICBnZXRTaGlwcGluZ01ldGhvZElkKCl7XG5cbiAgICAgICAgbGV0IGVDaGVja2JveCA9IGpRdWVyeShcImlucHV0W25hbWU9J3NoaXBwaW5nX21ldGhvZFswXSddOmNoZWNrZWRcIik7IFxuICAgICAgICBsZXQgZUhpZGRlbiA9IGpRdWVyeShcImlucHV0W25hbWU9J3NoaXBwaW5nX21ldGhvZFswXSddXCIpOyBcblxuICAgICAgICBsZXQgc2hpcHBpbmdNZXRob2QgPSAgZUNoZWNrYm94Lmxlbmd0aCA+IDAgPyBlQ2hlY2tib3gudmFsKCkgOiBlSGlkZGVuLnZhbCgpIDsgXG5cbiAgICAgICAgaWYgKCBzaGlwcGluZ01ldGhvZC5pbmRleE9mKCc6JykgPiAwICl7XG4gICAgICAgICAgICB2YXIgbWV0aG9kX3BhcnRzID0gc2hpcHBpbmdNZXRob2Quc3BsaXQoJzonKTtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5yZW1vdmVOb25OdW1lcmljKG1ldGhvZF9wYXJ0c1swXSk7ICAgICBcbiAgICAgICAgfVxuICAgICAgICBlbHNlIFxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gc2hpcHBpbmdNZXRob2Q7XG4gICAgICAgIH0gXG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFdvcmRwcmVzcyB3b24ndCBzZW5kIHNlc3Npb24gY29va2llcyB0byB3cC1hZG1pbiBhbmQgdGhlIHNlc3Npb24gaGFuZGxpbmcgaW4gd29vY29tbWVyY2UgaXMgc28gcG9vcmx5IGRvY3VtZW50ZWQgd2UgYXJlIGJldHRlciBvZmYgXG4gICAgICogZXh0cmFjdGluZyBuZWNlc3NhcnkgaW5mbyBjbGllbnQgc2lkZSBvdXIgc2VsdmVzLiBXZSdyZSBlbXVsYXRpbmcgdGhlaXIgY2hlY2tvdXQuanMgXG4gICAgICogQHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBhZGRyZXNzIHBhcnRzIFxuICAgICAqL1xuICAgIGdldFNoaXBwaW5nRGF0YSgpIHtcblxuICAgICAgICB2YXIgY291bnRyeSA9IGpRdWVyeSgnI2JpbGxpbmdfY291bnRyeScpLnZhbCgpLFxuICAgICAgICAgICAgc3RhdGUgPSBqUXVlcnkoJyNiaWxsaW5nX3N0YXRlJykudmFsKCksXG4gICAgICAgICAgICBwb3N0Y29kZSA9IGpRdWVyeSgnaW5wdXQjYmlsbGluZ19wb3N0Y29kZScpLnZhbCgpLFxuICAgICAgICAgICAgY2l0eSA9IGpRdWVyeSgnI2JpbGxpbmdfY2l0eScpLnZhbCgpLFxuICAgICAgICAgICAgYWRkcmVzcyA9IGpRdWVyeSgnaW5wdXQjYmlsbGluZ19hZGRyZXNzXzEnKS52YWwoKSxcbiAgICAgICAgICAgIGFkZHJlc3NfMiA9IGpRdWVyeSgnaW5wdXQjYmlsbGluZ19hZGRyZXNzXzInKS52YWwoKSxcbiAgICAgICAgICAgIHNfY291bnRyeSA9IGNvdW50cnksXG4gICAgICAgICAgICBzX3N0YXRlID0gc3RhdGUsXG4gICAgICAgICAgICBzX3Bvc3Rjb2RlID0gcG9zdGNvZGUsXG4gICAgICAgICAgICBzX2NpdHkgPSBjaXR5LFxuICAgICAgICAgICAgc19hZGRyZXNzID0gYWRkcmVzcyxcbiAgICAgICAgICAgIHNfYWRkcmVzc18yID0gYWRkcmVzc18yO1xuXG5cbiAgICAgICAgaWYgKGpRdWVyeSgnI3NoaXAtdG8tZGlmZmVyZW50LWFkZHJlc3MnKS5maW5kKCdpbnB1dCcpLmlzKCc6Y2hlY2tlZCcpKSB7XG4gICAgICAgICAgICBzX2NvdW50cnkgPSBqUXVlcnkoJyNzaGlwcGluZ19jb3VudHJ5JykudmFsKCk7XG4gICAgICAgICAgICBzX3N0YXRlID0galF1ZXJ5KCcjc2hpcHBpbmdfc3RhdGUnKS52YWwoKTtcbiAgICAgICAgICAgIHNfcG9zdGNvZGUgPSBqUXVlcnkoJ2lucHV0I3NoaXBwaW5nX3Bvc3Rjb2RlJykudmFsKCk7XG4gICAgICAgICAgICBzX2NpdHkgPSBqUXVlcnkoJyNzaGlwcGluZ19jaXR5JykudmFsKCk7XG4gICAgICAgICAgICBzX2FkZHJlc3MgPSBqUXVlcnkoJ2lucHV0I3NoaXBwaW5nX2FkZHJlc3NfMScpLnZhbCgpO1xuICAgICAgICAgICAgc19hZGRyZXNzXzIgPSBqUXVlcnkoJ2lucHV0I3NoaXBwaW5nX2FkZHJlc3NfMicpLnZhbCgpO1xuICAgICAgICB9XG4gXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBcIkFkZHJlc3NcIjp7XG4gICAgICAgICAgICAgICAgXCJMYXRcIjogXCJcIixcbiAgICAgICAgICAgICAgICBcIkxvbmdcIjogXCJcIixcbiAgICAgICAgICAgICAgICBcIlN0cmVldG5hbWUxXCI6IHNfYWRkcmVzcyxcbiAgICAgICAgICAgICAgICBcIlN0cmVldG5hbWUyXCI6IHNfYWRkcmVzc18yLFxuICAgICAgICAgICAgICAgIFwiSG91c2VOdW1iZXJcIjogJycsXG4gICAgICAgICAgICAgICAgXCJOdW1iZXJFeHRlbnNpb25cIjogJycsXG4gICAgICAgICAgICAgICAgXCJQb3N0YWxDb2RlXCI6IHNfcG9zdGNvZGUsXG4gICAgICAgICAgICAgICAgXCJzX3Bvc3Rjb2RlXCI6IHNfcG9zdGNvZGUsXG4gICAgICAgICAgICAgICAgXCJDaXR5XCI6IHNfY2l0eSxcbiAgICAgICAgICAgICAgICBcIkNvdW50cnlcIjogc19jb3VudHJ5LFxuICAgICAgICAgICAgICAgIFwiU3RhdGVcIjogc19zdGF0ZSxcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvc3RfZGF0YTogalF1ZXJ5KCdmb3JtLmNoZWNrb3V0Jykuc2VyaWFsaXplKCksXG4gICAgICAgICAgICBcIkNhcnJpZXJJZFwiOiB0aGlzLmNhcnJpZXJfaWRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogV2UgbXVzdCBydW4gdGhpcyBvbmxvYWQgXG4gICAgICogQW5kIG9uIG1ldGhvZCBjaGFuZ2UgXG4gICAgICogYmVjYXVzZSBwZW9wbGUgbWF5IG5ldmVyIGNoYW5nZSB0aGUgY2FycmllciBvciBzZWxlY3QgYSBwaWNrdXAgcG9pbnQgXG4gICAgICovIFxuICAgIHNldENhcnJpZXIoY2Fycmllcl9pZCl7XG4gICAgICAgIHRoaXMuY2Fycmllcl9pZCA9IHR5cGVvZihjYXJyaWVyX2lkKSAhPSAndW5kZWZpbmVkJyA/IGNhcnJpZXJfaWQgOiB0aGlzLmdldFNoaXBwaW5nTWV0aG9kSWQoKTsgIFxuICAgICAgICBqUXVlcnkoXCIjc2hpcHBpbmdfY2Fycmllcl9pZFwiKS52YWwodGhpcy5jYXJyaWVyX2lkKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQHBhcmFtIFBpY2t1cCBwaWNrdXAgXG4gICAgICovXG4gICAgc2V0UGlja3VwUG9pbnQocGlja3VwKSB7XG4gICAgICAgIGxldCBwaWNrdXBfbGFiZWwgPSAgcGlja3VwLkluZm9ybWF0aW9uLk5hbWUgKyBcIiBcIiArIHBpY2t1cC5JbmZvcm1hdGlvbi5BZGRyZXNzOyBcblxuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX2Rlc2NyaXB0aW9uXCIpLmh0bWwoc2hpcHRpbWl6ZV9zZWxlY3RlZF9waWNrdXAgKyBcIiA6IFwiICtwaWNrdXBfbGFiZWwpO1xuICAgICAgICBqUXVlcnkoXCIjc2hpcHBpbmdfcGlja3VwX2lkXCIpLnZhbChwaWNrdXAuUG9pbnRJZCk7XG4gICAgICAgIGpRdWVyeShcIiNzaGlwcGluZ19waWNrdXBfbGFiZWxcIikudmFsKHBpY2t1cF9sYWJlbCk7IFxuXG4gICAgICAgIGpRdWVyeShcIiNzaGlwdGltaXplcGlja3VwXCIpLnZhbChwaWNrdXAuUG9pbnRJZCk7IFxuICAgICAgICBcbiAgICB9XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _shiptimizeUtils = __webpack_require__(0);\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ShiptimizeGmaps = function () {\n function ShiptimizeGmaps(key) {\n _classCallCheck(this, ShiptimizeGmaps);\n\n this.isScriptLoaded = false;\n this.markers = [];\n this.map = null;\n this.pickupPoints = [];\n this.key = key;\n\n /** \n * the root url for the icons it's different for every platform \n * make sure to include a trailing / \n */\n this.icon_folder = typeof shiptimize_icon_folder != 'undefined' ? shiptimize_icon_folder : '';\n this.icon_selected = this.icon_folder + 'selected.png';\n this.icon_default = this.icon_folder + 'default.png';\n this.current_icon = this.icon_default;\n }\n\n /** \n * Checks if we have an icon for this carrier.\n * If yes then change the carrier icon\n * If not then use the default icon\n * \n * @param int carrier_id - the carrier id \n */\n\n\n _createClass(ShiptimizeGmaps, [{\n key: 'setCarrierIcon',\n value: function setCarrierIcon(carrier_id) {\n var carrier_icon_url = this.icon_folder + '' + carrier_id + '.png';\n //this.current_icon = Utils.isUrlValid(carrier_icon_url) ? carrier_icon_url : this.icon_default; \n this.current_icon = carrier_icon_url;\n }\n\n /** \n * if the script has not been loaded , load it \n */\n\n }, {\n key: 'grantReady',\n value: function grantReady() {\n if (!this.isScriptLoaded) {\n this.loadScript();\n }\n }\n }, {\n key: 'loadScript',\n value: function loadScript() {\n _shiptimizeUtils2.default.injectExternalScript(\"https://maps.googleapis.com/maps/api/js?key=\" + this.key + \"&callback=shiptimize.loadMap\");\n this.isScriptLoaded = true;\n }\n\n /** \n * Load the map into the element \n * This function needs the script to be loaded \n */\n\n }, {\n key: 'loadMap',\n value: function loadMap() {\n console.log(\"displaying map on container with \" + jQuery(\".shiptimize-pickup__map\").width() + \" \" + jQuery(\".shiptimize-pickup__map\").height(), jQuery(\".shiptimize-pickup__map\").get(0));\n this.map = new google.maps.Map(jQuery(\".shiptimize-pickup__map\").get(0), {\n center: { lat: -34.397, lng: 150.644 },\n zoom: 16,\n mapTypeControl: false\n });\n }\n\n /** \n * center the map \n */\n\n }, {\n key: 'centerMap',\n value: function centerMap(lat, lng) {\n this.map.setCenter(new google.maps.LatLng(lat, lng));\n }\n\n /** \n * Extract the country code from a geocode result\n * @param geocode - a google.maps.Geocoder result \n * @return string alpha-2 code for the country name \n */\n\n }, {\n key: 'getCountryCodeFromResult',\n value: function getCountryCodeFromResult(geocode) {\n if (typeof geocode.address_components == \"undefined\") {\n return \"\";\n }\n\n var components = geocode.address_components;\n for (var i = 0; i < components.length; ++i) {\n var types = components[i].types;\n\n for (var j = 0; j < types.length; ++j) {\n if (types[j] == 'country') {\n return components[i].short_name;\n }\n }\n }\n }\n\n /**\n * \n * @param shippingData, the address parts \n * @param f_callback , the function to call when all mighty google returns a result \n */\n\n }, {\n key: 'geocode',\n value: function geocode(shippingData, f_callback) {\n var _this = this;\n\n if (typeof google == 'undefined') {\n //script not loaded yet\n setTimeout(function () {\n _this.geocode(shippingData, f_callback);\n }, 200);\n return;\n }\n\n var geocoder = new google.maps.Geocoder();\n var me = this;\n\n var address = shippingData.Address.Streetname1 + \" \" + shippingData.Address.Streetname2 + \" \" + shippingData.Address.postalCode + \" \" + shippingData.Address.City + \" \" + shippingData.Address.State + \" \" + shippingData.Address.Country;\n console.log('geocoding ' + address);\n\n geocoder.geocode({ 'address': address }, function (results, status) {\n var geocode = { iso2: '', lat: '', lng: '' };\n\n if (status == 'OK') {\n geocode = results[0];\n } else {\n console.log('Geocode was not successful for the following reason: ' + status);\n f_callback(geocode);\n return;\n }\n\n var latlng = geocode.geometry.location;\n\n geocode.iso2 = me.getCountryCodeFromResult(geocode);\n geocode.lat = latlng.lat();\n geocode.lng = latlng.lng();\n\n f_callback(geocode);\n });\n }\n }, {\n key: 'clearMarkers',\n value: function clearMarkers() {\n if (this.markers.length > 0) {\n for (var i = 0; i < this.markers.length; ++i) {\n this.markers[i].setMap(null);\n }\n\n this.markers = [];\n }\n }\n\n /** \n * Add the markers to map \n * @param array pickupPoints - an array of pickupPoints\n * @param callback - a function to call when the marker is clicked \n */\n\n }, {\n key: 'addMarkers',\n value: function addMarkers(pickupPoints, callback) {\n var _this2 = this;\n\n this.pickupPoints = pickupPoints;\n\n var _loop = function _loop(x) {\n _this2.markers[x] = _this2.getMarker(pickupPoints[x]);\n // we need to do this because the values for lat,lng we have are rounded, so they will not match the ones returned by google\n pickupPoints[x].marker = _this2.markers[x];\n\n _this2.markers[x].addListener('click', function () {\n if (typeof callback != 'undefined') {\n callback(x);\n }\n });\n };\n\n for (var x = 0; x < pickupPoints.length; ++x) {\n _loop(x);\n }\n\n this.fitBounds();\n }\n\n /** \n * Return a marker for the gmaps \n */\n\n }, {\n key: 'getMarker',\n value: function getMarker(pickupPoint, callback) {\n var marker = new google.maps.Marker({\n position: new google.maps.LatLng(pickupPoint.Lat, pickupPoint.Long),\n map: this.map,\n icon: {\n url: this.current_icon,\n scaledSize: new google.maps.Size(50, 50), // scaled size\n origin: new google.maps.Point(0, 0), // origin\n anchor: new google.maps.Point(0, 0) // anchor\n }\n });\n\n return marker;\n }\n }, {\n key: 'fitBounds',\n value: function fitBounds() {\n var bounds = new google.maps.LatLngBounds();\n for (var x = 0; x < this.markers.length; ++x) {\n bounds.extend(this.markers[x].getPosition());\n }\n this.map.fitBounds(bounds);\n }\n\n /**\n * Reset all markers \n * Select the marker of index idx in map \n * @param int idx - the index to select \n */\n\n }, {\n key: 'selectMarkerByIdx',\n value: function selectMarkerByIdx(idx) {\n var selected = {\n url: this.icon_selected,\n scaledSize: new google.maps.Size(50, 50), // scaled size\n origin: new google.maps.Point(0, 0), // origin\n anchor: new google.maps.Point(0, 0) // anchor\n };\n var curr = {\n url: this.current_icon,\n scaledSize: new google.maps.Size(50, 50), // scaled size\n origin: new google.maps.Point(0, 0), // origin\n anchor: new google.maps.Point(0, 0) // anchor\n };\n\n for (var i = 0; i < this.markers.length; ++i) {\n this.markers[i].setIcon(idx == i ? selected : curr);\n }\n }\n }]);\n\n return ShiptimizeGmaps;\n}();\n\nexports.default = ShiptimizeGmaps;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLWdtYXBzLmpzPzBiZjEiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZUdtYXBzIiwia2V5IiwiaXNTY3JpcHRMb2FkZWQiLCJtYXJrZXJzIiwibWFwIiwicGlja3VwUG9pbnRzIiwiaWNvbl9mb2xkZXIiLCJzaGlwdGltaXplX2ljb25fZm9sZGVyIiwiaWNvbl9zZWxlY3RlZCIsImljb25fZGVmYXVsdCIsImN1cnJlbnRfaWNvbiIsImNhcnJpZXJfaWQiLCJjYXJyaWVyX2ljb25fdXJsIiwibG9hZFNjcmlwdCIsIlV0aWxzIiwiaW5qZWN0RXh0ZXJuYWxTY3JpcHQiLCJjb25zb2xlIiwibG9nIiwialF1ZXJ5Iiwid2lkdGgiLCJoZWlnaHQiLCJnZXQiLCJnb29nbGUiLCJtYXBzIiwiTWFwIiwiY2VudGVyIiwibGF0IiwibG5nIiwiem9vbSIsIm1hcFR5cGVDb250cm9sIiwic2V0Q2VudGVyIiwiTGF0TG5nIiwiZ2VvY29kZSIsImFkZHJlc3NfY29tcG9uZW50cyIsImNvbXBvbmVudHMiLCJpIiwibGVuZ3RoIiwidHlwZXMiLCJqIiwic2hvcnRfbmFtZSIsInNoaXBwaW5nRGF0YSIsImZfY2FsbGJhY2siLCJzZXRUaW1lb3V0IiwiZ2VvY29kZXIiLCJHZW9jb2RlciIsIm1lIiwiYWRkcmVzcyIsIkFkZHJlc3MiLCJTdHJlZXRuYW1lMSIsIlN0cmVldG5hbWUyIiwicG9zdGFsQ29kZSIsIkNpdHkiLCJTdGF0ZSIsIkNvdW50cnkiLCJyZXN1bHRzIiwic3RhdHVzIiwiaXNvMiIsImxhdGxuZyIsImdlb21ldHJ5IiwibG9jYXRpb24iLCJnZXRDb3VudHJ5Q29kZUZyb21SZXN1bHQiLCJzZXRNYXAiLCJjYWxsYmFjayIsIngiLCJnZXRNYXJrZXIiLCJtYXJrZXIiLCJhZGRMaXN0ZW5lciIsImZpdEJvdW5kcyIsInBpY2t1cFBvaW50IiwiTWFya2VyIiwicG9zaXRpb24iLCJMYXQiLCJMb25nIiwiaWNvbiIsInVybCIsInNjYWxlZFNpemUiLCJTaXplIiwib3JpZ2luIiwiUG9pbnQiLCJhbmNob3IiLCJib3VuZHMiLCJMYXRMbmdCb3VuZHMiLCJleHRlbmQiLCJnZXRQb3NpdGlvbiIsImlkeCIsInNlbGVjdGVkIiwiY3VyciIsInNldEljb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7Ozs7O0lBRXFCQSxlO0FBRWpCLDZCQUFZQyxHQUFaLEVBQWlCO0FBQUE7O0FBQ2IsYUFBS0MsY0FBTCxHQUFzQixLQUF0QjtBQUNBLGFBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0EsYUFBS0MsR0FBTCxHQUFXLElBQVg7QUFDQSxhQUFLQyxZQUFMLEdBQW9CLEVBQXBCO0FBQ0EsYUFBS0osR0FBTCxHQUFXQSxHQUFYOztBQUVBOzs7O0FBSUEsYUFBS0ssV0FBTCxHQUFtQixPQUFPQyxzQkFBUCxJQUFrQyxXQUFsQyxHQUFpREEsc0JBQWpELEdBQTBFLEVBQTdGO0FBQ0EsYUFBS0MsYUFBTCxHQUFxQixLQUFLRixXQUFMLEdBQWlCLGNBQXRDO0FBQ0EsYUFBS0csWUFBTCxHQUFvQixLQUFLSCxXQUFMLEdBQWlCLGFBQXJDO0FBQ0EsYUFBS0ksWUFBTCxHQUFvQixLQUFLRCxZQUF6QjtBQUNIOztBQUdEOzs7Ozs7Ozs7Ozt1Q0FPZUUsVSxFQUFXO0FBQ3hCLGdCQUFJQyxtQkFBbUIsS0FBS04sV0FBTCxHQUFpQixFQUFqQixHQUFvQkssVUFBcEIsR0FBK0IsTUFBdEQ7QUFDQTtBQUNBLGlCQUFLRCxZQUFMLEdBQW9CRSxnQkFBcEI7QUFDRDs7QUFHRDs7Ozs7O3FDQUdhO0FBQ1QsZ0JBQUksQ0FBQyxLQUFLVixjQUFWLEVBQTBCO0FBQ3RCLHFCQUFLVyxVQUFMO0FBQ0g7QUFDSjs7O3FDQUVZO0FBQ1RDLHNDQUFNQyxvQkFBTixDQUEyQixpREFBaUQsS0FBS2QsR0FBdEQsR0FBNEQsOEJBQXZGO0FBQ0EsaUJBQUtDLGNBQUwsR0FBc0IsSUFBdEI7QUFDSDs7QUFFRDs7Ozs7OztrQ0FJVTtBQUNOYyxvQkFBUUMsR0FBUixDQUFZLHND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QUFJQyxXQUFXO0FBQ1BYLHFCQUFNLEtBQUtsRSxhQURKO0FBRVBtRSw0QkFBWSxJQUFJckQsT0FBT0MsSUFBUCxDQUFZcUQsSUFBaEIsQ0FBcUIsRUFBckIsRUFBeUIsRUFBekIsQ0FGTCxFQUVtQztBQUMxQ0Msd0JBQVEsSUFBSXZELE9BQU9DLElBQVAsQ0FBWXVELEtBQWhCLENBQXNCLENBQXRCLEVBQXdCLENBQXhCLENBSEQsRUFHNkI7QUFDcENDLHdCQUFRLElBQUl6RCxPQUFPQyxJQUFQLENBQVl1RCxLQUFoQixDQUFzQixDQUF0QixFQUF5QixDQUF6QixDQUpELENBSTZCO0FBSjdCLGFBQWY7QUFNQSxnQkFBSVEsT0FBTztBQUNIWixxQkFBTSxLQUFLaEUsWUFEUjtBQUVIaUUsNEJBQVksSUFBSXJELE9BQU9DLElBQVAsQ0FBWXFELElBQWhCLENBQXFCLEVBQXJCLEVBQXlCLEVBQXpCLENBRlQsRUFFdUM7QUFDMUNDLHdCQUFRLElBQUl2RCxPQUFPQyxJQUFQLENBQVl1RCxLQUFoQixDQUFzQixDQUF0QixFQUF3QixDQUF4QixDQUhMLEVBR2lDO0FBQ3BDQyx3QkFBUSxJQUFJekQsT0FBT0MsSUFBUCxDQUFZdUQsS0FBaEIsQ0FBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsQ0FKTCxDQUlpQztBQUpqQyxhQUFYOztBQU9BLGlCQUFLLElBQUkzQyxJQUFJLENBQWIsRUFBZ0JBLElBQUksS0FBS2hDLE9BQUwsQ0FBYWlDLE1BQWpDLEVBQXlDLEVBQUVELENBQTNDLEVBQThDO0FBQzFDLHFCQUFLaEMsT0FBTCxDQUFhZ0MsQ0FBYixFQUFnQm9ELE9BQWhCLENBQ0VILE9BQU9qRCxDQUFQLEdBRUFrRCxRQUZBLEdBSUFDLElBTEY7QUFPSDtBQUNKOzs7Ozs7a0JBMU5nQnRGLGUiLCJmaWxlIjoiNS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBVdGlscyBmcm9tICcuL3NoaXB0aW1pemUtdXRpbHMuanMnOyAgXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoaXB0aW1pemVHbWFwcyB7XG5cbiAgICBjb25zdHJ1Y3RvcihrZXkpIHtcbiAgICAgICAgdGhpcy5pc1NjcmlwdExvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1hcmtlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5tYXAgPSBudWxsO1xuICAgICAgICB0aGlzLnBpY2t1cFBvaW50cyA9IFtdO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcblxuICAgICAgICAvKiogXG4gICAgICAgICAqIHRoZSByb290IHVybCBmb3IgdGhlIGljb25zIGl0J3MgZGlmZmVyZW50IGZvciBldmVyeSBwbGF0Zm9ybSAgXG4gICAgICAgICAqIG1ha2Ugc3VyZSB0byBpbmNsdWRlIGEgdHJhaWxpbmcgLyBcbiAgICAgICAgICovIFxuICAgICAgICB0aGlzLmljb25fZm9sZGVyID0gdHlwZW9mKHNoaXB0aW1pemVfaWNvbl9mb2xkZXIpICE9ICd1bmRlZmluZWQnID8gIHNoaXB0aW1pemVfaWNvbl9mb2xkZXIgOiAnJzsgIFxuICAgICAgICB0aGlzLmljb25fc2VsZWN0ZWQgPSB0aGlzLmljb25fZm9sZGVyKydzZWxlY3RlZC5wbmcnO1xuICAgICAgICB0aGlzLmljb25fZGVmYXVsdCA9IHRoaXMuaWNvbl9mb2xkZXIrJ2RlZmF1bHQucG5nJztcbiAgICAgICAgdGhpcy5jdXJyZW50X2ljb24gPSB0aGlzLmljb25fZGVmYXVsdDsgXG4gICAgfVxuXG5cbiAgICAvKiogXG4gICAgICogQ2hlY2tzIGlmIHdlIGhhdmUgYW4gaWNvbiBmb3IgdGhpcyBjYXJyaWVyLlxuICAgICAqIElmIHllcyB0aGVuIGNoYW5nZSB0aGUgY2FycmllciBpY29uXG4gICAgICogSWYgbm90IHRoZW4gdXNlIHRoZSBkZWZhdWx0IGljb25cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gaW50IGNhcnJpZXJfaWQgLSB0aGUgY2FycmllciBpZCBcbiAgICAgKi8gXG4gICAgc2V0Q2Fycmllckljb24oY2Fycmllcl9pZCl7XG4gICAgICBsZXQgY2Fycmllcl9pY29uX3VybCA9IHRoaXMuaWNvbl9mb2xkZXIrJycrY2Fycmllcl9pZCsnLnBuZyc7IFxuICAgICAgLy90aGlzLmN1cnJlbnRfaWNvbiA9IFV0aWxzLmlzVXJsVmFsaWQoY2Fycmllcl9pY29uX3VybCkgPyAgY2Fycmllcl9pY29uX3VybCA6IHRoaXMuaWNvbl9kZWZhdWx0OyBcbiAgICAgIHRoaXMuY3VycmVudF9pY29uID0gY2Fycmllcl9pY29uX3VybDtcbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBpZiB0aGUgc2NyaXB0IGhhcyBub3QgYmVlbiBsb2FkZWQgLCBsb2FkIGl0IFxuICAgICAqL1xuICAgIGdyYW50UmVhZHkoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1NjcmlwdExvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5sb2FkU2NyaXB0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkU2NyaXB0KCkge1xuICAgICAgICBVdGlscy5pbmplY3RFeHRlcm5hbFNjcmlwdChcImh0dHBzOi8vbWFwcy5nb29nbGVhcGlzLmNvbS9tYXBzL2FwaS9qcz9rZXk9XCIgKyB0aGlzLmtleSArIFwiJmNhbGxiYWNrPXNoaXB0aW1pemUubG9hZE1hcFwiKTtcbiAgICAgICAgdGhpcy5pc1NjcmlwdExvYWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIExvYWQgdGhlIG1hcCBpbnRvIHRoZSBlbGVtZW50IFxuICAgICAqIFRoaXMgZnVuY3Rpb24gbmVlZHMgdGhlIHNjcmlwdCB0byBiZSBsb2FkZWQgXG4gICAgICovXG4gICAgbG9hZE1hcCgpIHsgICAgICAgIFxuICAgICAgICBjb25zb2xlLmxvZyhcImRpc3BsYXlpbmcgbWFwIG9uIGNvbnRhaW5lciB3aXRoIFwiICsgalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19tYXBcIikud2lkdGgoKSArIFwiIFwiK2pRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cF9fbWFwXCIpLmhlaWdodCgpICxqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX21hcFwiKS5nZXQoMCkpOyBcbiAgICAgICAgdGhpcy5tYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cF9fbWFwXCIpLmdldCgwKSwge1xuICAgICAgICAgICAgY2VudGVyOiB7IGxhdDogLTM0LjM5NywgbG5nOiAxNTAuNjQ0IH0sXG4gICAgICAgICAgICB6b29tOiAxNixcbiAgICAgICAgICAgIG1hcFR5cGVDb250cm9sOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIGNlbnRlciB0aGUgbWFwIFxuICAgICAqL1xuICAgIGNlbnRlck1hcChsYXQsIGxuZykge1xuICAgICAgICB0aGlzLm1hcC5zZXRDZW50ZXIobmV3IGdvb2dsZS5tYXBzLkxhdExuZyhsYXQsIGxuZykpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBFeHRyYWN0IHRoZSBjb3VudHJ5IGNvZGUgZnJvbSBhIGdlb2NvZGUgcmVzdWx0XG4gICAgICogQHBhcmFtIGdlb2NvZGUgLSBhIGdvb2dsZS5tYXBzLkdlb2NvZGVyIHJlc3VsdCBcbiAgICAgKiBAcmV0dXJuIHN0cmluZyBhbHBoYS0yIGNvZGUgZm9yIHRoZSBjb3VudHJ5IG5hbWUgXG4gICAgICovIFxuICAgIGdldENvdW50cnlDb2RlRnJvbVJlc3VsdChnZW9jb2RlKXtcbiAgICAgIGlmKHR5cGVvZihnZW9jb2RlLmFkZHJlc3NfY29tcG9uZW50cykgPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgICAgIHJldHVybiBcIlwiOyBcbiAgICAgIH1cblxuICAgICAgbGV0IGNvbXBvbmVudHMgPSBnZW9jb2RlLmFkZHJlc3NfY29tcG9uZW50cztcbiAgICAgIGZvciggbGV0IGk9MDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyArK2kgKXtcbiAgICAgICAgbGV0IHR5cGVzID0gY29tcG9uZW50c1tpXS50eXBlczsgXG5cbiAgICAgICAgZm9yKGxldCBqPTA7IGogPCB0eXBlcy5sZW5ndGg7ICsraiApe1xuICAgICAgICAgIGlmKCB0eXBlc1tqXSA9PSAnY291bnRyeScpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRzW2ldLnNob3J0X25hbWU7IFxuICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFxuICAgICAqIEBwYXJhbSBzaGlwcGluZ0RhdGEsIHRoZSBhZGRyZXNzIHBhcnRzICAgICAgIFxuICAgICAqIEBwYXJhbSBmX2NhbGxiYWNrICwgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbGwgbWlnaHR5IGdvb2dsZSByZXR1cm5zIGEgcmVzdWx0IFxuICAgICAqLyBcbiAgICBnZW9jb2RlKHNoaXBwaW5nRGF0YSwgIGZfY2FsbGJhY2spIHsgXG4gICAgICBpZih0eXBlb2YoZ29vZ2xlKSA9PSAndW5kZWZpbmVkJyl7IC8vc2NyaXB0IG5vdCBsb2FkZWQgeWV0XG4gICAgICAgIHNldFRpbWVvdXQoKCk9Pnt0aGlzLmdlb2NvZGUoc2hpcHBpbmdEYXRhLCBmX2NhbGxiYWNrKTsgfSwgMjAwKTsgXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgICBsZXQgZ2VvY29kZXIgPSBuZXcgZ29vZ2xlLm1hcHMuR2VvY29kZXIoKTtcbiAgICAgICAgbGV0IG1lICA9IHRoaXM7IFxuXG4gICAgICAgIHZhciBhZGRyZXNzID0gc2hpcHBpbmdEYXRhLkFkZHJlc3MuU3RyZWV0bmFtZTEgKyBcIiBcIiArIHNoaXBwaW5nRGF0YS5BZGRyZXNzLlN0cmVldG5hbWUyICsgXCIgXCIgKyBzaGlwcGluZ0RhdGEuQWRkcmVzcy5wb3N0YWxDb2RlICsgXCIgXCIgKyBzaGlwcGluZ0RhdGEuQWRkcmVzcy5DaXR5ICsgXCIgXCIgKyBzaGlwcGluZ0RhdGEuQWRkcmVzcy5TdGF0ZSArIFwiIFwiICsgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ291bnRyeTtcbiAgICAgICAgY29uc29sZS5sb2coJ2dlb2NvZGluZyAnICsgYWRkcmVzcyk7XG5cbiAgICAgICAgZ2VvY29kZXIuZ2VvY29kZSh7ICdhZGRyZXNzJzogYWRkcmVzcyB9LCBmdW5jdGlvbihyZXN1bHRzLCBzdGF0dXMpIHtcbiAgICAgICAgICAgIGxldCBnZW9jb2RlID0ge2lzbzI6JycsIGxhdDonJywgbG5nOicnfTtcblxuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAnT0snKSB7XG4gICAgICAgICAgICAgICAgZ2VvY29kZSA9IHJlc3VsdHNbMF07XG4gICAgICAgICAgICB9ICBcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZW9jb2RlIHdhcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZvbGxvd2luZyByZWFzb246ICcgKyBzdGF0dXMpO1xuICAgICAgICAgICAgICAgIGZfY2FsbGJhY2soZ2VvY29kZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuOyBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGxhdGxuZyA9IGdlb2NvZGUuZ2VvbWV0cnkubG9jYXRpb247XG5cbiAgICAgICAgICAgIGdlb2NvZGUuaXNvMiA9IG1lLmdldENvdW50cnlDb2RlRnJvbVJlc3VsdChnZW9jb2RlKTtcbiAgICAgICAgICAgIGdlb2NvZGUubGF0ID0gbGF0bG5nLmxhdCgpOyBcbiAgICAgICAgICAgIGdlb2NvZGUubG5nID0gbGF0bG5nLmxuZygpOyBcblxuICAgICAgICAgICAgZl9jYWxsYmFjayhnZW9jb2RlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2xlYXJNYXJrZXJzKCkge1xuICAgICAgICBpZiAodGhpcy5tYXJrZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYXJrZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrZXJzW2ldLnNldE1hcChudWxsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5tYXJrZXJzID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQWRkIHRoZSBtYXJrZXJzIHRvIG1hcCBcbiAgICAgKiBAcGFyYW0gYXJyYXkgcGlja3VwUG9pbnRzIC0gYW4gYXJyYXkgb2YgcGlja3VwUG9pbnRzXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0gYSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG1hcmtlciBpcyBjbGlja2VkIFxuICAgICAqL1xuICAgIGFkZE1hcmtlcnMocGlja3VwUG9pbnRzLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLnBpY2t1cFBvaW50cyA9IHBpY2t1cFBvaW50cztcblxuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHBpY2t1cFBvaW50cy5sZW5ndGg7ICsreCkge1xuICAgICAgICAgICAgdGhpcy5tYXJrZXJzW3hdID0gdGhpcy5nZXRNYXJrZXIocGlja3VwUG9pbnRzW3hdKTtcbiAgICAgICAgICAgIC8vICAgIHdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIHRoZSB2YWx1ZXMgZm9yIGxhdCxsbmcgd2UgaGF2ZSBhcmUgcm91bmRlZCwgc28gdGhleSB3aWxsIG5vdCBtYXRjaCB0aGUgb25lcyByZXR1cm5lZCBieSBnb29nbGVcbiAgICAgICAgICAgIHBpY2t1cFBvaW50c1t4XS5tYXJrZXIgPSB0aGlzLm1hcmtlcnNbeF07XG5cbiAgICAgICAgICAgIHRoaXMubWFya2Vyc1t4XS5hZGRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmKHR5cGVvZihjYWxsYmFjaykhPSAndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soeCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXRCb3VuZHMoKVxuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBSZXR1cm4gYSBtYXJrZXIgZm9yIHRoZSBnbWFwcyBcbiAgICAgKi9cbiAgICBnZXRNYXJrZXIocGlja3VwUG9pbnQsIGNhbGxiYWNrKSB7XG4gICAgICAgIGxldCBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKHBpY2t1cFBvaW50LkxhdCwgcGlja3VwUG9pbnQuTG9uZyksXG4gICAgICAgICAgICBtYXA6IHRoaXMubWFwLFxuICAgICAgICAgICAgaWNvbjoge1xuICAgICAgICAgICAgICAgIHVybDogIHRoaXMuY3VycmVudF9pY29uLFxuICAgICAgICAgICAgICAgIHNjYWxlZFNpemU6IG5ldyBnb29nbGUubWFwcy5TaXplKDUwLCA1MCksIC8vIHNjYWxlZCBzaXplXG4gICAgICAgICAgICAgICAgb3JpZ2luOiBuZXcgZ29vZ2xlLm1hcHMuUG9pbnQoMCwwKSwgLy8gb3JpZ2luXG4gICAgICAgICAgICAgICAgYW5jaG9yOiBuZXcgZ29vZ2xlLm1hcHMuUG9pbnQoMCwgMCkgLy8gYW5jaG9yXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuIFxuXG4gICAgICAgIHJldHVybiBtYXJrZXI7XG4gICAgIH1cblxuICAgIGZpdEJvdW5kcygpIHtcbiAgICAgIHZhciBib3VuZHMgPSBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nQm91bmRzKCk7XG4gICAgICBmb3IoIGxldCB4ID0gMDsgeDwgdGhpcy5tYXJrZXJzLmxlbmd0aDsgKyt4ICl7XG4gICAgICAgIGJvdW5kcy5leHRlbmQodGhpcy5tYXJrZXJzW3hdLmdldFBvc2l0aW9uKCkpOyBcbiAgICAgIH0gXG4gICAgICB0aGlzLm1hcC5maXRCb3VuZHMoYm91bmRzKTtcbiAgICB9XG4gXG4gICAgLyoqXG4gICAgICogUmVzZXQgYWxsIG1hcmtlcnMgIFxuICAgICAqIFNlbGVjdCB0aGUgbWFya2VyIG9mIGluZGV4IGlkeCBpbiBtYXAgXG4gICAgICogQHBhcmFtIGludCBpZHggLSB0aGUgaW5kZXggdG8gc2VsZWN0IFxuICAgICAqL1xuICAgIHNlbGVjdE1hcmtlckJ5SWR4KGlkeCkgeyBcbiAgICAgICAgbGV0IHNlbGVjdGVkID0ge1xuICAgICAgICAgICAgICAgIHVybDogIHRoaXMuaWNvbl9zZWxlY3RlZCxcbiAgICAgICAgICAgICAgICBzY2FsZWRTaXplOiBuZXcgZ29vZ2xlLm1hcHMuU2l6ZSg1MCwgNTApLCAvLyBzY2FsZWQgc2l6ZVxuICAgICAgICAgICAgICAgIG9yaWdpbjogbmV3IGdvb2dsZS5tYXBzLlBvaW50KDAsMCksIC8vIG9yaWdpblxuICAgICAgICAgICAgICAgIGFuY2hvcjogbmV3IGdvb2dsZS5tYXBzLlBvaW50KDAsIDApIC8vIGFuY2hvclxuICAgICAgICB9O1xuICAgICAgICBsZXQgY3VyciA9IHtcbiAgICAgICAgICAgICAgICB1cmw6ICB0aGlzLmN1cnJlbnRfaWNvbixcbiAgICAgICAgICAgICAgICBzY2FsZWRTaXplOiBuZXcgZ29vZ2xlLm1hcHMuU2l6ZSg1MCwgNTApLCAvLyBzY2FsZWQgc2l6ZVxuICAgICAgICAgICAgICAgIG9yaWdpbjogbmV3IGdvb2dsZS5tYXBzLlBvaW50KDAsMCksIC8vIG9yaWdpblxuICAgICAgICAgICAgICAgIGFuY2hvcjogbmV3IGdvb2dsZS5tYXBzLlBvaW50KDAsIDApIC8vIGFuY2hvclxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYXJrZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0aGlzLm1hcmtlcnNbaV0uc2V0SWNvbihcbiAgICAgICAgICAgICAgaWR4ID09IGkgXG4gICAgICAgICAgICAgID8gXG4gICAgICAgICAgICAgIHNlbGVjdGVkXG4gICAgICAgICAgICAgIDpcbiAgICAgICAgICAgICAgY3VyclxuICAgICAgICAgICAgKTsgIFxuICAgICAgICB9XG4gICAgfVxuXG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _shiptimizeUtils = __webpack_require__(0);\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ShiptimizeOpenMap = function () {\n function ShiptimizeOpenMap() {\n _classCallCheck(this, ShiptimizeOpenMap);\n\n this.isScriptLoaded = false;\n this.markers = [];\n this.map = null;\n\n /** \n * the root url for the icons it's different for every platform \n * make sure to include a trailing / \n */\n this.icon_folder = typeof shiptimize_icon_folder != 'undefined' ? shiptimize_icon_folder : '';\n }\n\n /** \n *\n * @param string imageUrl - full url to the icon \n * @return L.icon object \n */\n\n\n _createClass(ShiptimizeOpenMap, [{\n key: 'createIcon',\n value: function createIcon(imageUrl) {\n return L.icon({\n iconUrl: imageUrl,\n iconSize: [50, 50], // size of the icon \n iconAnchor: [25, 25], // point of the icon which will correspond to marker's location \n popupAnchor: [-25, -50] // point from which the popup should open relative to the iconAnchor\n });\n }\n\n /** \n * @param decimal lat \n * @param decimal lng \n */\n\n }, {\n key: 'centerMap',\n value: function centerMap(lat, lng) {\n var latlng = L.latLng(lat, lng);\n }\n\n /** \n * if the script has not been loaded , load it. \n * We use this function because we only want to load the script when the user clicks the button \n */\n\n }, {\n key: 'grantReady',\n value: function grantReady() {\n if (!this.isScriptLoaded) {\n this.loadScript();\n }\n }\n\n /** \n * @param f_callback what function to call when the request resolves \n * @param city - city name \n * @param country - country in iso2 uppercase \n * @param postalcode - the postal code \n * @param streetname - the streetname \n */\n\n }, {\n key: 'geocodeAddress',\n value: function geocodeAddress(f_callback, city, country, postalcode, streetname) {\n var queryString = \"https://nominatim.openstreetmap.org/search?format=json&addressdetails=1\" + \"&city=\" + city + \"&country=\" + country;\n\n if (typeof postalcode != 'undefined') {\n if (country == 'PT' || country == 'Portugal') {\n postalcode = postalcode.substr(0, 4);\n }\n queryString += \"&postalcode=\" + postalcode;\n }\n\n if (typeof streetname != 'undefined') {\n queryString += \"&street=\" + streetname;\n }\n\n jQuery.getJSON(queryString, {}, function (response) {\n var geocode = {\n 'iso2': '',\n 'lat': '',\n 'lng': ''\n };\n\n if (response.length > 0) {\n var location = response[0];\n\n geocode.iso2 = location.address.country_code;\n\n geocode.lat = location.lat;\n geocode.lng = location.lon;\n }\n f_callback(geocode);\n\n console.log(response);\n });\n }\n }, {\n key: 'geocode',\n\n\n /**\n * \n * @param shippingData, the address parts \n * @param f_callback , the function to call when all mighty google returns a result \n */\n value: function geocode(shippingData, f_callback) {\n var _this = this;\n\n console.log(shippingData);\n this.grantReady();\n\n this.geocodeAddress(function (geocode) {\n if (!geocode.lat) {\n return _this.geocodeAddress(function (geocode) {\n f_callback(geocode);\n }, shippingData.Address.City, shippingData.Address.Country);\n }\n\n f_callback(geocode);\n }, shippingData.Address.City, shippingData.Address.Country, shippingData.Address.PostalCode, shippingData.Address.Streetname1);\n }\n }, {\n key: 'loadScript',\n value: function loadScript() {\n _shiptimizeUtils2.default.injectExternalScript(SHIPTIMIZE_PLUGIN_URL + \"assets/js/leaflet-1.4.0.js\");\n this.isScriptLoaded = true;\n this.loadMap();\n return;\n }\n\n /** \n * Leaflet does not receive a callback so we wait here for the script to be loaded \n */\n\n }, {\n key: 'loadMap',\n value: function loadMap() {\n var _this2 = this;\n\n if (typeof L == 'undefined') {\n setTimeout(function () {\n _this2.loadMap();\n }, 200);\n return;\n }\n\n this.icon_selected = this.createIcon(shiptimize_icon_folder + 'selected.png');\n this.icon_default = this.createIcon(shiptimize_icon_folder + 'default.png');\n this.current_icon = this.icon_default;\n\n this.map = new L.map(jQuery(\".shiptimize-pickup__map\").get(0), {\n \"zoom\": 16,\n \"center\": [51.505, -0.09]\n });\n\n L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n \"attribution\": '© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n }).addTo(this.map);\n }\n }, {\n key: 'clearMarkers',\n value: function clearMarkers() {\n if (this.markers.length > 0) {\n for (var i = 0; i < this.markers.length; ++i) {\n this.map.removeLayer(this.markers[i]);\n }\n }\n this.markers = [];\n }\n\n /** \n * Add the markers to map \n * @param array pickupPoints - an array of pickupPoints\n * @param function callback \n */\n\n }, {\n key: 'addMarkers',\n value: function addMarkers(pickupPoints, callback) {\n var _this3 = this;\n\n this.pickupPoints = pickupPoints;\n\n var _loop = function _loop(x) {\n _this3.markers[x] = _this3.getMarker(pickupPoints[x]);\n // we need to do this because the values for lat,lng we have are rounded, so they will not match the ones returned by google\n _this3.pickupPoints[x].marker = _this3.markers[x];\n\n _this3.markers[x].on('click', function () {\n if (typeof callback == 'function') {\n callback(x);\n }\n });\n };\n\n for (var x = 0; x < pickupPoints.length; ++x) {\n _loop(x);\n }\n\n this.fitBounds();\n }\n }, {\n key: 'resetMarker',\n value: function resetMarker(marker) {\n marker.setIcon(this.icon_default);\n }\n }, {\n key: 'selectMarker',\n value: function selectMarker(marker) {\n marker.setIcon(this.icon_selected);\n }\n\n /** \n * Adjust the zoom in the map to display all the markers \n * There's a fit bounds that receives 2 corners, but calculating them is up to us. \n * corners: top left, bottom right \n * then we center the map at the center of the square \n */\n\n }, {\n key: 'fitBounds',\n value: function fitBounds() {\n var _this4 = this;\n\n var bottomLeft = [this.pickupPoints[0].Lat, this.pickupPoints[0].Long];\n var topRight = [this.pickupPoints[0].Lat, this.pickupPoints[0].Long];\n\n for (var i = 0; i < this.pickupPoints.length; ++i) {\n var lat = this.pickupPoints[i].Lat;\n var lng = this.pickupPoints[i].Long;\n\n if (lat < bottomLeft[0]) {\n bottomLeft[0] = lat;\n }\n\n if (lat > topRight[0]) {\n topRight[0] = lat;\n }\n\n if (lng > topRight[1]) {\n topRight[1] = lng;\n }\n\n if (lng < bottomLeft[1]) {\n bottomLeft[1] = lng;\n }\n }\n\n var centerX = bottomLeft[0] + (topRight[0] - bottomLeft[0]) / 2;\n var centerY = bottomLeft[1] + (topRight[1] - bottomLeft[1]) / 2;\n\n this.map.panTo([centerX, centerY]);\n\n this.map.fitBounds([bottomLeft, topRight]);\n\n setTimeout(function () {\n _this4.map.invalidateSize();\n }, 200);\n }\n\n /** \n * Return a marker for the openLayers \n * IconAnchor: The coordinates of the \"tip\" of the icon (relative to its top left corner). \n * The icon will be aligned so that this point is at the marker's geographical location. \n * Centered by default if size is specified, also can be set in CSS with negative margins.\n */\n\n }, {\n key: 'getMarker',\n value: function getMarker(pickupPoint) {\n var marker = L.marker([pickupPoint.Lat, pickupPoint.Long], {\n \"icon\": this.current_icon,\n \"title\": pickupPoint.Information.Name + \"\\n\" + pickupPoint.Information.Address\n });\n marker.addTo(this.map);\n return marker;\n }\n\n /** \n * Checks if we have an icon for this carrier.\n * If yes then change the carrier icon\n * If not then use the default icon\n * \n * @param int carrier_id - the carrier id \n */\n\n }, {\n key: 'setCarrierIcon',\n value: function setCarrierIcon(carrier_id) {\n var _this5 = this;\n\n if (typeof L == 'undefined') {\n setTimeout(function () {\n _this5.setCarrierIcon(carrier_id);\n }, 200);\n return;\n }\n var carrier_icon_url = this.icon_folder + '' + carrier_id + '.png';\n //this.current_icon = Utils.isUrlValid(carrier_icon_url) ? this.createIcon(carrier_icon_url) : this.icon_default;\n this.current_icon = this.createIcon(carrier_icon_url);\n }\n\n /**\n * Reset all markers \n * Select the marker of index idx in map \n * @param int idx - the index to select \n */\n\n }, {\n key: 'selectMarkerByIdx',\n value: function selectMarkerByIdx(idx) {\n for (var i = 0; i < this.markers.length; ++i) {\n this.markers[i].setIcon(idx == i ? this.icon_selected : this.current_icon);\n }\n }\n }]);\n\n return ShiptimizeOpenMap;\n}();\n\nexports.default = ShiptimizeOpenMap;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLW9wZW4tbWFwLmpzPzg5YzEiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZU9wZW5NYXAiLCJpc1NjcmlwdExvYWRlZCIsIm1hcmtlcnMiLCJtYXAiLCJpY29uX2ZvbGRlciIsInNoaXB0aW1pemVfaWNvbl9mb2xkZXIiLCJpbWFnZVVybCIsIkwiLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsInBvcHVwQW5jaG9yIiwibGF0IiwibG5nIiwibGF0bG5nIiwibGF0TG5nIiwibG9hZFNjcmlwdCIsImZfY2FsbGJhY2siLCJjaXR5IiwiY291bnRyeSIsInBvc3RhbGNvZGUiLCJzdHJlZXRuYW1lIiwicXVlcnlTdHJpbmciLCJzdWJzdHIiLCJqUXVlcnkiLCJnZXRKU09OIiwicmVzcG9uc2UiLCJnZW9jb2RlIiwibGVuZ3RoIiwibG9jYXRpb24iLCJpc28yIiwiYWRkcmVzcyIsImNvdW50cnlfY29kZSIsImxvbiIsImNvbnNvbGUiLCJsb2ciLCJzaGlwcGluZ0RhdGEiLCJncmFudFJlYWR5IiwiZ2VvY29kZUFkZHJlc3MiLCJBZGRyZXNzIiwiQ2l0eSIsIkNvdW50cnkiLCJQb3N0YWxDb2RlIiwiU3RyZWV0bmFtZTEiLCJVdGlscyIsImluamVjdEV4dGVybmFsU2NyaXB0IiwiU0hJUFRJTUlaRV9QTFVHSU5fVVJMIiwibG9hZE1hcCIsInNldFRpbWVvdXQiLCJpY29uX3NlbGVjdGVkIiwiY3JlYXRlSWNvbiIsImljb25fZGVmYXVsdCIsImN1cnJlbnRfaWNvbiIsImdldCIsInRpbGVMYXllciIsImFkZFRvIiwiaSIsInJlbW92ZUxheWVyIiwicGlja3VwUG9pbnRzIiwiY2FsbGJhY2siLCJ4IiwiZ2V0TWFya2VyIiwibWFya2VyIiwib24iLCJmaXRCb3VuZHMiLCJzZXRJY29uIiwiYm90dG9tTGVmdCIsIkxhdCIsIkxvbmciLCJ0b3BSaWdodCIsImNlbnRlclgiLCJjZW50ZXJZIiwicGFuVG8iLCJpbnZhbGlkYXRlU2l6ZSIsInBpY2t1cFBvaW50IiwiSW5mb3JtYXRpb24iLCJOYW1lIiwiY2Fycmllcl9pZCIsInNldENhcnJpZXJJY29uIiwiY2Fycmllcl9pY29uX3VybCIsImlkeCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7SUFFcUJBLGlCO0FBRWpCLGlDQUFjO0FBQUE7O0FBQ1YsYUFBS0MsY0FBTCxHQUFzQixLQUF0QjtBQUNBLGFBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0EsYUFBS0MsR0FBTCxHQUFXLElBQVg7O0FBRUE7Ozs7QUFJQSxhQUFLQyxXQUFMLEdBQW1CLE9BQU9DLHNCQUFQLElBQWtDLFdBQWxDLEdBQWdEQSxzQkFBaEQsR0FBeUUsRUFBNUY7QUFDSDs7QUFFRDs7Ozs7Ozs7O21DQUtXQyxRLEVBQVU7QUFDbEIsbUJBQU9DLEVBQUVDLElBQUYsQ0FBTztBQUNUQyx5QkFBU0gsUUFEQTtBQUVUSSwwQkFBVSxDQUFDLEVBQUQsRUFBSyxFQUFMLENBRkQsRUFFVztBQUNwQkMsNEJBQVksQ0FBQyxFQUFELEVBQUssRUFBTCxDQUhILEVBR2E7QUFDdEJDLDZCQUFhLENBQUMsQ0FBQyxFQUFGLEVBQU0sQ0FBQyxFQUFQLENBSkosQ0FJZTtBQUpmLGFBQVAsQ0FBUDtBQU1GOztBQUVEOzs7Ozs7O2tDQUlVQyxHLEVBQUtDLEcsRUFBSTtBQUNmLGdCQUFJQyxTQUFTUixFQUFFUyxNQUFGLENBQVNILEdBQVQsRUFBY0MsR0FBZCxDQUFiO0FBQ0g7O0FBRUQ7Ozs7Ozs7cUNBSWE7QUFDVCxnQkFBSSxDQUFDLEtBQUtiLGNBQVYsRUFBMEI7QUFDdEIscUJBQUtnQixVQUFMO0FBQ0g7QUFDSjs7QUFHSDs7Ozs7Ozs7Ozt1Q0FPZUMsVSxFQUFZQyxJLEVBQU1DLE8sRUFBU0MsVSxFQUFZQyxVLEVBQVk7QUFDaEUsZ0JBQUlDLGNBQWMsNEVBQ2hCLFFBRGdCLEdBQ0xKLElBREssR0FFaEIsV0FGZ0IsR0FFRkMsT0FGaEI7O0FBSUEsZ0JBQUksT0FBUUMsVUFBUixJQUF1QixX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QztBQUMxQyxxQkFBS3ZELE9BQUwsQ0FBYXVELENBQWIsRUFBZ0JTLE9BQWhCLENBQ0llLE9BQU94QixDQUFQLEdBQ0EsS0FBS1AsYUFETCxHQUVBLEtBQUtHLFlBSFQ7QUFLSDtBQUNKOzs7Ozs7a0JBL1FnQnJELGlCIiwiZmlsZSI6IjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVXRpbHMgZnJvbSAnLi9zaGlwdGltaXplLXV0aWxzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hpcHRpbWl6ZU9wZW5NYXAge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaXNTY3JpcHRMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gW107XG4gICAgICAgIHRoaXMubWFwID0gbnVsbDtcblxuICAgICAgICAvKiogXG4gICAgICAgICAqIHRoZSByb290IHVybCBmb3IgdGhlIGljb25zIGl0J3MgZGlmZmVyZW50IGZvciBldmVyeSBwbGF0Zm9ybSAgXG4gICAgICAgICAqIG1ha2Ugc3VyZSB0byBpbmNsdWRlIGEgdHJhaWxpbmcgLyBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaWNvbl9mb2xkZXIgPSB0eXBlb2Yoc2hpcHRpbWl6ZV9pY29uX2ZvbGRlcikgIT0gJ3VuZGVmaW5lZCcgPyBzaGlwdGltaXplX2ljb25fZm9sZGVyIDogJyc7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmluZyBpbWFnZVVybCAtIGZ1bGwgdXJsIHRvIHRoZSBpY29uIFxuICAgICAqIEByZXR1cm4gTC5pY29uIG9iamVjdCBcbiAgICAgKi9cbiAgICBjcmVhdGVJY29uKGltYWdlVXJsKSB7XG4gICAgICAgcmV0dXJuIEwuaWNvbih7XG4gICAgICAgICAgICBpY29uVXJsOiBpbWFnZVVybCxcbiAgICAgICAgICAgIGljb25TaXplOiBbNTAsIDUwXSwgLy8gc2l6ZSBvZiB0aGUgaWNvbiBcbiAgICAgICAgICAgIGljb25BbmNob3I6IFsyNSwgMjVdLCAvLyBwb2ludCBvZiB0aGUgaWNvbiB3aGljaCB3aWxsIGNvcnJlc3BvbmQgdG8gbWFya2VyJ3MgbG9jYXRpb24gXG4gICAgICAgICAgICBwb3B1cEFuY2hvcjogWy0yNSwgLTUwXSAvLyBwb2ludCBmcm9tIHdoaWNoIHRoZSBwb3B1cCBzaG91bGQgb3BlbiByZWxhdGl2ZSB0byB0aGUgaWNvbkFuY2hvclxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQHBhcmFtIGRlY2ltYWwgbGF0IFxuICAgICAqIEBwYXJhbSBkZWNpbWFsIGxuZyBcbiAgICAgKi8gXG4gICAgY2VudGVyTWFwKGxhdCwgbG5nKXtcbiAgICAgICAgbGV0IGxhdGxuZyA9IEwubGF0TG5nKGxhdCwgbG5nKTsgIFxuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBpZiB0aGUgc2NyaXB0IGhhcyBub3QgYmVlbiBsb2FkZWQgLCBsb2FkIGl0LiBcbiAgICAgKiBXZSB1c2UgdGhpcyBmdW5jdGlvbiBiZWNhdXNlIHdlIG9ubHkgd2FudCB0byBsb2FkIHRoZSBzY3JpcHQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGJ1dHRvbiBcbiAgICAgKi9cbiAgICBncmFudFJlYWR5KCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTY3JpcHRMb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZFNjcmlwdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgLyoqIFxuICAgKiBAcGFyYW0gZl9jYWxsYmFjayB3aGF0IGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgcmVxdWVzdCByZXNvbHZlcyBcbiAgICogQHBhcmFtIGNpdHkgLSBjaXR5IG5hbWUgXG4gICAqIEBwYXJhbSBjb3VudHJ5IC0gY291bnRyeSBpbiBpc28yIHVwcGVyY2FzZSBcbiAgICogQHBhcmFtIHBvc3RhbGNvZGUgLSB0aGUgcG9zdGFsIGNvZGUgXG4gICAqIEBwYXJhbSBzdHJlZXRuYW1lIC0gdGhlIHN0cmVldG5hbWUgXG4gICAqL1xuICBnZW9jb2RlQWRkcmVzcyhmX2NhbGxiYWNrLCBjaXR5LCBjb3VudHJ5LCBwb3N0YWxjb2RlLCBzdHJlZXRuYW1lKSB7XG4gICAgdmFyIHF1ZXJ5U3RyaW5nID0gXCJodHRwczovL25vbWluYXRpbS5vcGVuc3RyZWV0bWFwLm9yZy9zZWFyY2g/Zm9ybWF0PWpzb24mYWRkcmVzc2RldGFpbHM9MVwiICtcbiAgICAgIFwiJmNpdHk9XCIgKyBjaXR5ICtcbiAgICAgIFwiJmNvdW50cnk9XCIgKyBjb3VudHJ5O1xuXG4gICAgaWYgKHR5cGVvZiAocG9zdGFsY29kZSkgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChjb3VudHJ5ID09ICdQVCcgfHwgY291bnRyeSA9PSAnUG9ydHVnYWwnKSB7XG4gICAgICAgIHBvc3RhbGNvZGUgPSBwb3N0YWxjb2RlLnN1YnN0cigwLCA0KTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5U3RyaW5nICs9IFwiJnBvc3RhbGNvZGU9XCIgKyBwb3N0YWxjb2RlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgKHN0cmVldG5hbWUpICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICBxdWVyeVN0cmluZyArPSBcIiZzdHJlZXQ9XCIgKyBzdHJlZXRuYW1lO1xuICAgIH1cblxuICAgIGpRdWVyeS5nZXRKU09OKHF1ZXJ5U3RyaW5nLCB7fSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICBsZXQgZ2VvY29kZSA9IHtcbiAgICAgICAgJ2lzbzInOiAnJyxcbiAgICAgICAgJ2xhdCc6ICcnLFxuICAgICAgICAnbG5nJzogJydcbiAgICAgIH07XG5cbiAgICAgIGlmIChyZXNwb25zZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBsb2NhdGlvbiA9IHJlc3BvbnNlWzBdO1xuXG4gICAgICAgIGdlb2NvZGUuaXNvMiA9IGxvY2F0aW9uLmFkZHJlc3MuY291bnRyeV9jb2RlO1xuXG4gICAgICAgIGdlb2NvZGUubGF0ID0gbG9jYXRpb24ubGF0O1xuICAgICAgICBnZW9jb2RlLmxuZyA9IGxvY2F0aW9uLmxvbjtcbiAgICAgIH1cbiAgICAgIGZfY2FsbGJhY2soZ2VvY29kZSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogIFxuICAgKiBAcGFyYW0gc2hpcHBpbmdEYXRhLCB0aGUgYWRkcmVzcyBwYXJ0cyAgICAgICBcbiAgICogQHBhcmFtIGZfY2FsbGJhY2sgLCB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFsbCBtaWdodHkgZ29vZ2xlIHJldHVybnMgYSByZXN1bHQgXG4gICAqL1xuICBnZW9jb2RlKHNoaXBwaW5nRGF0YSwgZl9jYWxsYmFjaykge1xuICAgIGNvbnNvbGUubG9nKHNoaXBwaW5nRGF0YSk7XG4gICAgdGhpcy5ncmFudFJlYWR5KCk7XG5cbiAgICB0aGlzLmdlb2NvZGVBZGRyZXNzKChnZW9jb2RlKSA9PiB7XG4gICAgICBpZiAoIWdlb2NvZGUubGF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb2NvZGVBZGRyZXNzKGZ1bmN0aW9uIChnZW9jb2RlKSB7XG4gICAgICAgICAgZl9jYWxsYmFjayhnZW9jb2RlKTtcbiAgICAgICAgfSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ2l0eSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ291bnRyeSk7XG4gICAgICB9XG5cbiAgICAgIGZfY2FsbGJhY2soZ2VvY29kZSk7XG4gICAgfSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ2l0eSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ291bnRyeSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuUG9zdGFsQ29kZSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuU3RyZWV0bmFtZTEpO1xuICB9XG4gICAgbG9hZFNjcmlwdCgpIHtcbiAgICAgICAgVXRpbHMuaW5qZWN0RXh0ZXJuYWxTY3JpcHQoU0hJUFRJTUlaRV9QTFVHSU5fVVJMICsgXCJhc3NldHMvanMvbGVhZmxldC0xLjQuMC5qc1wiKTtcbiAgICAgICAgdGhpcy5pc1NjcmlwdExvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZE1hcCgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIExlYWZsZXQgZG9lcyBub3QgcmVjZWl2ZSBhIGNhbGxiYWNrIHNvIHdlIHdhaXQgaGVyZSBmb3IgdGhlIHNjcmlwdCB0byBiZSBsb2FkZWQgXG4gICAgICovXG4gICAgbG9hZE1hcCgpIHtcbiAgICAgICAgaWYgKHR5cGVvZihMKSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMubG9hZE1hcCgpOyB9LCAyMDApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pY29uX3NlbGVjdGVkID0gdGhpcy5jcmVhdGVJY29uKHNoaXB0aW1pemVfaWNvbl9mb2xkZXIgKyAnc2VsZWN0ZWQucG5nJyk7XG4gICAgICAgIHRoaXMuaWNvbl9kZWZhdWx0ID0gdGhpcy5jcmVhdGVJY29uKHNoaXB0aW1pemVfaWNvbl9mb2xkZXIgKyAnZGVmYXVsdC5wbmcnKTtcbiAgICAgICAgdGhpcy5jdXJyZW50X2ljb24gPSB0aGlzLmljb25fZGVmYXVsdDtcblxuICAgICAgICB0aGlzLm1hcCA9IG5ldyBMLm1hcChqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX21hcFwiKS5nZXQoMCksIHtcbiAgICAgICAgICAgIFwiem9vbVwiOiAxNixcbiAgICAgICAgICAgIFwiY2VudGVyXCI6IFs1MS41MDUsIC0wLjA5XVxuICAgICAgICB9KTtcblxuICAgICAgICBMLnRpbGVMYXllcignaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLCB7XG4gICAgICAgICAgICBcImF0dHJpYnV0aW9uXCI6ICcmY29weTsgPGEgaHJlZj1cImh0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiPk9wZW5TdHJlZXRNYXA8L2E+IGNvbnRyaWJ1dG9ycydcbiAgICAgICAgfSkuYWRkVG8odGhpcy5tYXApO1xuICAgIH1cblxuICAgIGNsZWFyTWFya2VycygpIHtcbiAgICAgICAgaWYgKHRoaXMubWFya2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFwLnJlbW92ZUxheWVyKHRoaXMubWFya2Vyc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrZXJzID0gW107XG4gICAgfVxuXG5cbiAgICAvKiogXG4gICAgICogQWRkIHRoZSBtYXJrZXJzIHRvIG1hcCBcbiAgICAgKiBAcGFyYW0gYXJyYXkgcGlja3VwUG9pbnRzIC0gYW4gYXJyYXkgb2YgcGlja3VwUG9pbnRzXG4gICAgICogQHBhcmFtIGZ1bmN0aW9uIGNhbGxiYWNrIFxuICAgICAqL1xuICAgIGFkZE1hcmtlcnMocGlja3VwUG9pbnRzLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLnBpY2t1cFBvaW50cyA9IHBpY2t1cFBvaW50czsgXG5cbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBwaWNrdXBQb2ludHMubGVuZ3RoOyArK3gpIHtcbiAgICAgICAgICAgIHRoaXMubWFya2Vyc1t4XSA9IHRoaXMuZ2V0TWFya2VyKHBpY2t1cFBvaW50c1t4XSk7XG4gICAgICAgICAgICAvLyAgICB3ZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSB0aGUgdmFsdWVzIGZvciBsYXQsbG5nIHdlIGhhdmUgYXJlIHJvdW5kZWQsIHNvIHRoZXkgd2lsbCBub3QgbWF0Y2ggdGhlIG9uZXMgcmV0dXJuZWQgYnkgZ29vZ2xlXG4gICAgICAgICAgICB0aGlzLnBpY2t1cFBvaW50c1t4XS5tYXJrZXIgPSB0aGlzLm1hcmtlcnNbeF07XG5cbiAgICAgICAgICAgIHRoaXMubWFya2Vyc1t4XS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYodHlwZW9mKGNhbGxiYWNrKSA9PSAnZnVuY3Rpb24nKXtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpdEJvdW5kcygpO1xuICAgIH1cblxuICAgIHJlc2V0TWFya2VyKG1hcmtlcikge1xuICAgICAgICBtYXJrZXIuc2V0SWNvbih0aGlzLmljb25fZGVmYXVsdCk7XG4gICAgfVxuXG4gICAgc2VsZWN0TWFya2VyKG1hcmtlcikge1xuICAgICAgICBtYXJrZXIuc2V0SWNvbih0aGlzLmljb25fc2VsZWN0ZWQpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBBZGp1c3QgdGhlIHpvb20gaW4gdGhlIG1hcCB0byBkaXNwbGF5IGFsbCB0aGUgbWFya2VycyBcbiAgICAgKiBUaGVyZSdzIGEgZml0IGJvdW5kcyB0aGF0IHJlY2VpdmVzIDIgY29ybmVycywgYnV0IGNhbGN1bGF0aW5nIHRoZW0gaXMgdXAgdG8gdXMuIFxuICAgICAqIGNvcm5lcnM6IHRvcCBsZWZ0LCBib3R0b20gcmlnaHQgICAgIFxuICAgICAqIHRoZW4gd2UgY2VudGVyIHRoZSBtYXAgYXQgdGhlIGNlbnRlciBvZiB0aGUgc3F1YXJlICBcbiAgICAgKi9cbiAgICBmaXRCb3VuZHMoKSB7XG4gICAgICAgIGxldCBib3R0b21MZWZ0ID0gW3RoaXMucGlja3VwUG9pbnRzWzBdLkxhdCwgdGhpcy5waWNrdXBQb2ludHNbMF0uTG9uZ107XG4gICAgICAgIGxldCB0b3BSaWdodCA9IFt0aGlzLnBpY2t1cFBvaW50c1swXS5MYXQsIHRoaXMucGlja3VwUG9pbnRzWzBdLkxvbmddO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5waWNrdXBQb2ludHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBsYXQgPSB0aGlzLnBpY2t1cFBvaW50c1tpXS5MYXQ7XG4gICAgICAgICAgICBsZXQgbG5nID0gdGhpcy5waWNrdXBQb2ludHNbaV0uTG9uZztcblxuICAgICAgICAgICAgaWYgKGxhdCA8IGJvdHRvbUxlZnRbMF0pIHtcbiAgICAgICAgICAgICAgICBib3R0b21MZWZ0WzBdID0gbGF0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGF0ID4gdG9wUmlnaHRbMF0pIHtcbiAgICAgICAgICAgICAgICB0b3BSaWdodFswXSA9IGxhdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxuZyA+IHRvcFJpZ2h0WzFdKSB7XG4gICAgICAgICAgICAgICAgdG9wUmlnaHRbMV0gPSBsbmc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsbmcgPCBib3R0b21MZWZ0WzFdKSB7XG4gICAgICAgICAgICAgICAgYm90dG9tTGVmdFsxXSA9IGxuZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IGNlbnRlclggPSBib3R0b21MZWZ0WzBdICsgKHRvcFJpZ2h0WzBdIC0gYm90dG9tTGVmdFswXSkgLyAyO1xuICAgICAgICBsZXQgY2VudGVyWSA9IGJvdHRvbUxlZnRbMV0gKyAodG9wUmlnaHRbMV0gLSBib3R0b21MZWZ0WzFdKSAvIDI7XG5cbiAgICAgICAgdGhpcy5tYXAucGFuVG8oW2NlbnRlclgsIGNlbnRlclldKTtcblxuICAgICAgICB0aGlzLm1hcC5maXRCb3VuZHMoW1xuICAgICAgICAgICAgYm90dG9tTGVmdCxcbiAgICAgICAgICAgIHRvcFJpZ2h0XG4gICAgICAgIF0pO1xuXG4gICAgICAgIHNldFRpbWVvdXQoICgpID0+IHsgdGhpcy5tYXAuaW52YWxpZGF0ZVNpemUoKX0sIDIwMCk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFJldHVybiBhIG1hcmtlciBmb3IgdGhlIG9wZW5MYXllcnMgXG4gICAgICogSWNvbkFuY2hvcjogVGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBcInRpcFwiIG9mIHRoZSBpY29uIChyZWxhdGl2ZSB0byBpdHMgdG9wIGxlZnQgY29ybmVyKS4gXG4gICAgICogVGhlIGljb24gd2lsbCBiZSBhbGlnbmVkIHNvIHRoYXQgdGhpcyBwb2ludCBpcyBhdCB0aGUgbWFya2VyJ3MgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uLiBcbiAgICAgKiBDZW50ZXJlZCBieSBkZWZhdWx0IGlmIHNpemUgaXMgc3BlY2lmaWVkLCBhbHNvIGNhbiBiZSBzZXQgaW4gQ1NTIHdpdGggbmVnYXRpdmUgbWFyZ2lucy5cbiAgICAgKi9cbiAgICBnZXRNYXJrZXIocGlja3VwUG9pbnQpIHtcbiAgICAgICAgbGV0IG1hcmtlciA9IEwubWFya2VyKFtwaWNrdXBQb2ludC5MYXQsIHBpY2t1cFBvaW50LkxvbmddLCB7XG4gICAgICAgICAgICBcImljb25cIjogdGhpcy5jdXJyZW50X2ljb24sXG4gICAgICAgICAgICBcInRpdGxlXCI6IHBpY2t1cFBvaW50LkluZm9ybWF0aW9uLk5hbWUgKyBcIlxcblwiICsgcGlja3VwUG9pbnQuSW5mb3JtYXRpb24uQWRkcmVzc1xuICAgICAgICB9KTtcbiAgICAgICAgbWFya2VyLmFkZFRvKHRoaXMubWFwKTtcbiAgICAgICAgcmV0dXJuIG1hcmtlcjtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQ2hlY2tzIGlmIHdlIGhhdmUgYW4gaWNvbiBmb3IgdGhpcyBjYXJyaWVyLlxuICAgICAqIElmIHllcyB0aGVuIGNoYW5nZSB0aGUgY2FycmllciBpY29uXG4gICAgICogSWYgbm90IHRoZW4gdXNlIHRoZSBkZWZhdWx0IGljb25cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gaW50IGNhcnJpZXJfaWQgLSB0aGUgY2FycmllciBpZCBcbiAgICAgKi9cbiAgICBzZXRDYXJyaWVySWNvbihjYXJyaWVyX2lkKSB7XG4gICAgICAgIGlmICh0eXBlb2YoTCkgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLnNldENhcnJpZXJJY29uKGNhcnJpZXJfaWQpOyB9LCAyMDApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjYXJyaWVyX2ljb25fdXJsID0gdGhpcy5pY29uX2ZvbGRlciArICcnICsgY2Fycmllcl9pZCArICcucG5nJztcbiAgICAgICAgLy90aGlzLmN1cnJlbnRfaWNvbiA9IFV0aWxzLmlzVXJsVmFsaWQoY2Fycmllcl9pY29uX3VybCkgPyB0aGlzLmNyZWF0ZUljb24oY2Fycmllcl9pY29uX3VybCkgOiB0aGlzLmljb25fZGVmYXVsdDtcbiAgICAgICAgdGhpcy5jdXJyZW50X2ljb24gPSB0aGlzLmNyZWF0ZUljb24oY2Fycmllcl9pY29uX3VybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXQgYWxsIG1hcmtlcnMgIFxuICAgICAqIFNlbGVjdCB0aGUgbWFya2VyIG9mIGluZGV4IGlkeCBpbiBtYXAgXG4gICAgICogQHBhcmFtIGludCBpZHggLSB0aGUgaW5kZXggdG8gc2VsZWN0IFxuICAgICAqL1xuICAgIHNlbGVjdE1hcmtlckJ5SWR4KGlkeCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdGhpcy5tYXJrZXJzW2ldLnNldEljb24oXG4gICAgICAgICAgICAgICAgaWR4ID09IGkgP1xuICAgICAgICAgICAgICAgIHRoaXMuaWNvbl9zZWxlY3RlZCA6XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50X2ljb25cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6\n")}]); 1 /******/ (function(modules) { // webpackBootstrap 2 /******/ // The module cache 3 /******/ var installedModules = {}; 4 /******/ 5 /******/ // The require function 6 /******/ function __webpack_require__(moduleId) { 7 /******/ 8 /******/ // Check if module is in cache 9 /******/ if(installedModules[moduleId]) { 10 /******/ return installedModules[moduleId].exports; 11 /******/ } 12 /******/ // Create a new module (and put it into the cache) 13 /******/ var module = installedModules[moduleId] = { 14 /******/ i: moduleId, 15 /******/ l: false, 16 /******/ exports: {} 17 /******/ }; 18 /******/ 19 /******/ // Execute the module function 20 /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 21 /******/ 22 /******/ // Flag the module as loaded 23 /******/ module.l = true; 24 /******/ 25 /******/ // Return the exports of the module 26 /******/ return module.exports; 27 /******/ } 28 /******/ 29 /******/ 30 /******/ // expose the modules object (__webpack_modules__) 31 /******/ __webpack_require__.m = modules; 32 /******/ 33 /******/ // expose the module cache 34 /******/ __webpack_require__.c = installedModules; 35 /******/ 36 /******/ // define getter function for harmony exports 37 /******/ __webpack_require__.d = function(exports, name, getter) { 38 /******/ if(!__webpack_require__.o(exports, name)) { 39 /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); 40 /******/ } 41 /******/ }; 42 /******/ 43 /******/ // define __esModule on exports 44 /******/ __webpack_require__.r = function(exports) { 45 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 46 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 47 /******/ } 48 /******/ Object.defineProperty(exports, '__esModule', { value: true }); 49 /******/ }; 50 /******/ 51 /******/ // create a fake namespace object 52 /******/ // mode & 1: value is a module id, require it 53 /******/ // mode & 2: merge all properties of value into the ns 54 /******/ // mode & 4: return value when already ns object 55 /******/ // mode & 8|1: behave like require 56 /******/ __webpack_require__.t = function(value, mode) { 57 /******/ if(mode & 1) value = __webpack_require__(value); 58 /******/ if(mode & 8) return value; 59 /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; 60 /******/ var ns = Object.create(null); 61 /******/ __webpack_require__.r(ns); 62 /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); 63 /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); 64 /******/ return ns; 65 /******/ }; 66 /******/ 67 /******/ // getDefaultExport function for compatibility with non-harmony modules 68 /******/ __webpack_require__.n = function(module) { 69 /******/ var getter = module && module.__esModule ? 70 /******/ function getDefault() { return module['default']; } : 71 /******/ function getModuleExports() { return module; }; 72 /******/ __webpack_require__.d(getter, 'a', getter); 73 /******/ return getter; 74 /******/ }; 75 /******/ 76 /******/ // Object.prototype.hasOwnProperty.call 77 /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 78 /******/ 79 /******/ // __webpack_public_path__ 80 /******/ __webpack_require__.p = "/shiptimize-for-woocommerce/assets/js"; 81 /******/ 82 /******/ 83 /******/ // Load entry module and return exports 84 /******/ return __webpack_require__(__webpack_require__.s = "./shiptmize.js"); 85 /******/ }) 86 /************************************************************************/ 87 /******/ ({ 88 89 /***/ "./css/leaflet.css": 90 /*!*************************!*\ 91 !*** ./css/leaflet.css ***! 92 \*************************/ 93 /*! no static exports found */ 94 /***/ (function(module, exports, __webpack_require__) { 95 96 eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jc3MvbGVhZmxldC5jc3M/OTU1NSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSIsImZpbGUiOiIuL2Nzcy9sZWFmbGV0LmNzcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./css/leaflet.css\n"); 97 98 /***/ }), 99 100 /***/ "./js/shiptimize-gmaps.js": 101 /*!********************************!*\ 102 !*** ./js/shiptimize-gmaps.js ***! 103 \********************************/ 104 /*! no static exports found */ 105 /***/ (function(module, exports, __webpack_require__) { 106 107 "use strict"; 108 eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _shiptimizeUtils = __webpack_require__(/*! ./shiptimize-utils.js */ \"./js/shiptimize-utils.js\");\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ShiptimizeGmaps = function () {\n function ShiptimizeGmaps(key) {\n _classCallCheck(this, ShiptimizeGmaps);\n\n this.isScriptLoaded = false;\n this.markers = [];\n this.map = null;\n this.pickupPoints = [];\n this.key = key;\n\n /** \n * the root url for the icons it's different for every platform \n * make sure to include a trailing / \n */\n this.icon_folder = typeof shiptimize_icon_folder != 'undefined' ? shiptimize_icon_folder : '';\n this.icon_selected = this.icon_folder + 'selected.png';\n this.icon_default = this.icon_folder + 'default.png';\n this.current_icon = this.icon_default;\n }\n\n /** \n * Checks if we have an icon for this carrier.\n * If yes then change the carrier icon\n * If not then use the default icon\n * \n * @param int carrier_id - the carrier id \n */\n\n\n _createClass(ShiptimizeGmaps, [{\n key: 'setCarrierIcon',\n value: function setCarrierIcon(carrier_id) {\n var carrier_icon_url = this.icon_folder + '' + carrier_id + '.png';\n //this.current_icon = Utils.isUrlValid(carrier_icon_url) ? carrier_icon_url : this.icon_default; \n this.current_icon = carrier_icon_url;\n }\n\n /** \n * if the script has not been loaded , load it \n */\n\n }, {\n key: 'grantReady',\n value: function grantReady() {\n if (!this.isScriptLoaded) {\n this.loadScript();\n }\n }\n }, {\n key: 'loadScript',\n value: function loadScript() {\n _shiptimizeUtils2.default.injectExternalScript(\"https://maps.googleapis.com/maps/api/js?key=\" + this.key + \"&callback=shiptimize.loadMap\");\n this.isScriptLoaded = true;\n }\n\n /** \n * Load the map into the element \n * This function needs the script to be loaded \n */\n\n }, {\n key: 'loadMap',\n value: function loadMap() {\n console.log(\"displaying map on container with \" + jQuery(\".shiptimize-pickup__map\").width() + \" \" + jQuery(\".shiptimize-pickup__map\").height(), jQuery(\".shiptimize-pickup__map\").get(0));\n this.map = new google.maps.Map(jQuery(\".shiptimize-pickup__map\").get(0), {\n center: { lat: -34.397, lng: 150.644 },\n zoom: 16,\n mapTypeControl: false\n });\n }\n\n /** \n * center the map \n */\n\n }, {\n key: 'centerMap',\n value: function centerMap(lat, lng) {\n this.map.setCenter(new google.maps.LatLng(lat, lng));\n }\n\n /** \n * Extract the country code from a geocode result\n * @param geocode - a google.maps.Geocoder result \n * @return string alpha-2 code for the country name \n */\n\n }, {\n key: 'getCountryCodeFromResult',\n value: function getCountryCodeFromResult(geocode) {\n if (typeof geocode.address_components == \"undefined\") {\n return \"\";\n }\n\n var components = geocode.address_components;\n for (var i = 0; i < components.length; ++i) {\n var types = components[i].types;\n\n for (var j = 0; j < types.length; ++j) {\n if (types[j] == 'country') {\n return components[i].short_name;\n }\n }\n }\n }\n\n /**\n * \n * @param shippingData, the address parts \n * @param f_callback , the function to call when all mighty google returns a result \n */\n\n }, {\n key: 'geocode',\n value: function geocode(shippingData, f_callback) {\n var _this = this;\n\n if (typeof google == 'undefined') {\n //script not loaded yet\n setTimeout(function () {\n _this.geocode(shippingData, f_callback);\n }, 200);\n return;\n }\n\n var geocoder = new google.maps.Geocoder();\n var me = this;\n\n var address = shippingData.Address.Streetname1 + \" \" + shippingData.Address.Streetname2 + \" \" + shippingData.Address.postalCode + \" \" + shippingData.Address.City + \" \" + shippingData.Address.State + \" \" + shippingData.Address.Country;\n console.log('geocoding ' + address);\n\n geocoder.geocode({ 'address': address }, function (results, status) {\n var geocode = { iso2: '', lat: '', lng: '' };\n\n if (status == 'OK') {\n geocode = results[0];\n } else {\n console.log('Geocode was not successful for the following reason: ' + status);\n f_callback(geocode);\n return;\n }\n\n var latlng = geocode.geometry.location;\n\n geocode.iso2 = me.getCountryCodeFromResult(geocode);\n geocode.lat = latlng.lat();\n geocode.lng = latlng.lng();\n\n f_callback(geocode);\n });\n }\n }, {\n key: 'clearMarkers',\n value: function clearMarkers() {\n if (this.markers.length > 0) {\n for (var i = 0; i < this.markers.length; ++i) {\n this.markers[i].setMap(null);\n }\n\n this.markers = [];\n }\n }\n\n /** \n * Add the markers to map \n * @param array pickupPoints - an array of pickupPoints\n * @param callback - a function to call when the marker is clicked \n */\n\n }, {\n key: 'addMarkers',\n value: function addMarkers(pickupPoints, callback) {\n var _this2 = this;\n\n this.pickupPoints = pickupPoints;\n\n var _loop = function _loop(x) {\n _this2.markers[x] = _this2.getMarker(pickupPoints[x]);\n // we need to do this because the values for lat,lng we have are rounded, so they will not match the ones returned by google\n pickupPoints[x].marker = _this2.markers[x];\n\n _this2.markers[x].addListener('click', function () {\n if (typeof callback != 'undefined') {\n callback(x);\n }\n });\n };\n\n for (var x = 0; x < pickupPoints.length; ++x) {\n _loop(x);\n }\n\n this.fitBounds();\n }\n\n /** \n * Return a marker for the gmaps \n */\n\n }, {\n key: 'getMarker',\n value: function getMarker(pickupPoint, callback) {\n var marker = new google.maps.Marker({\n position: new google.maps.LatLng(pickupPoint.Lat, pickupPoint.Long),\n map: this.map,\n icon: {\n url: this.current_icon,\n scaledSize: new google.maps.Size(50, 50), // scaled size\n origin: new google.maps.Point(0, 0), // origin\n anchor: new google.maps.Point(0, 0) // anchor\n }\n });\n\n return marker;\n }\n }, {\n key: 'fitBounds',\n value: function fitBounds() {\n var bounds = new google.maps.LatLngBounds();\n for (var x = 0; x < this.markers.length; ++x) {\n bounds.extend(this.markers[x].getPosition());\n }\n this.map.fitBounds(bounds);\n }\n\n /**\n * Reset all markers \n * Select the marker of index idx in map \n * @param int idx - the index to select \n */\n\n }, {\n key: 'selectMarkerByIdx',\n value: function selectMarkerByIdx(idx) {\n var selected = {\n url: this.icon_selected,\n scaledSize: new google.maps.Size(50, 50), // scaled size\n origin: new google.maps.Point(0, 0), // origin\n anchor: new google.maps.Point(0, 0) // anchor\n };\n var curr = {\n url: this.current_icon,\n scaledSize: new google.maps.Size(50, 50), // scaled size\n origin: new google.maps.Point(0, 0), // origin\n anchor: new google.maps.Point(0, 0) // anchor\n };\n\n for (var i = 0; i < this.markers.length; ++i) {\n this.markers[i].setIcon(idx == i ? selected : curr);\n }\n }\n }]);\n\n return ShiptimizeGmaps;\n}();\n\nexports.default = ShiptimizeGmaps;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLWdtYXBzLmpzPzBiZjEiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZUdtYXBzIiwia2V5IiwiaXNTY3JpcHRMb2FkZWQiLCJtYXJrZXJzIiwibWFwIiwicGlja3VwUG9pbnRzIiwiaWNvbl9mb2xkZXIiLCJzaGlwdGltaXplX2ljb25fZm9sZGVyIiwiaWNvbl9zZWxlY3RlZCIsImljb25fZGVmYXVsdCIsImN1cnJlbnRfaWNvbiIsImNhcnJpZXJfaWQiLCJjYXJyaWVyX2ljb25fdXJsIiwibG9hZFNjcmlwdCIsIlV0aWxzIiwiaW5qZWN0RXh0ZXJuYWxTY3JpcHQiLCJjb25zb2xlIiwibG9nIiwialF1ZXJ5Iiwid2lkdGgiLCJoZWlnaHQiLCJnZXQiLCJnb29nbGUiLCJtYXBzIiwiTWFwIiwiY2VudGVyIiwibGF0IiwibG5nIiwiem9vbSIsIm1hcFR5cGVDb250cm9sIiwic2V0Q2VudGVyIiwiTGF0TG5nIiwiZ2VvY29kZSIsImFkZHJlc3NfY29tcG9uZW50cyIsImNvbXBvbmVudHMiLCJpIiwibGVuZ3RoIiwidHlwZXMiLCJqIiwic2hvcnRfbmFtZSIsInNoaXBwaW5nRGF0YSIsImZfY2FsbGJhY2siLCJzZXRUaW1lb3V0IiwiZ2VvY29kZXIiLCJHZW9jb2RlciIsIm1lIiwiYWRkcmVzcyIsIkFkZHJlc3MiLCJTdHJlZXRuYW1lMSIsIlN0cmVldG5hbWUyIiwicG9zdGFsQ29kZSIsIkNpdHkiLCJTdGF0ZSIsIkNvdW50cnkiLCJyZXN1bHRzIiwic3RhdHVzIiwiaXNvMiIsImxhdGxuZyIsImdlb21ldHJ5IiwibG9jYXRpb24iLCJnZXRDb3VudHJ5Q29kZUZyb21SZXN1bHQiLCJzZXRNYXAiLCJjYWxsYmFjayIsIngiLCJnZXRNYXJrZXIiLCJtYXJrZXIiLCJhZGRMaXN0ZW5lciIsImZpdEJvdW5kcyIsInBpY2t1cFBvaW50IiwiTWFya2VyIiwicG9zaXRpb24iLCJMYXQiLCJMb25nIiwiaWNvbiIsInVybCIsInNjYWxlZFNpemUiLCJTaXplIiwib3JpZ2luIiwiUG9pbnQiLCJhbmNob3IiLCJib3VuZHMiLCJMYXRMbmdCb3VuZHMiLCJleHRlbmQiLCJnZXRQb3NpdGlvbiIsImlkeCIsInNlbGVjdGVkIiwiY3VyciIsInNldEljb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7Ozs7O0lBRXFCQSxlO0FBRWpCLDZCQUFZQyxHQUFaLEVBQWlCO0FBQUE7O0FBQ2IsYUFBS0MsY0FBTCxHQUFzQixLQUF0QjtBQUNBLGFBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0EsYUFBS0MsR0FBTCxHQUFXLElBQVg7QUFDQSxhQUFLQyxZQUFMLEdBQW9CLEVBQXBCO0FBQ0EsYUFBS0osR0FBTCxHQUFXQSxHQUFYOztBQUVBOzs7O0FBSUEsYUFBS0ssV0FBTCxHQUFtQixPQUFPQyxzQkFBUCxJQUFrQyxXQUFsQyxHQUFpREEsc0JBQWpELEdBQTBFLEVBQTdGO0FBQ0EsYUFBS0MsYUFBTCxHQUFxQixLQUFLRixXQUFMLEdBQWlCLGNBQXRDO0FBQ0EsYUFBS0csWUFBTCxHQUFvQixLQUFLSCxXQUFMLEdBQWlCLGFBQXJDO0FBQ0EsYUFBS0ksWUFBTCxHQUFvQixLQUFLRCxZQUF6QjtBQUNIOztBQUdEOzs7Ozs7Ozs7Ozt1Q0FPZUUsVSxFQUFXO0FBQ3hCLGdCQUFJQyxtQkFBbUIsS0FBS04sV0FBTCxHQUFpQixFQUFqQixHQUFvQkssVUFBcEIsR0FBK0IsTUFBdEQ7QUFDQTtBQUNBLGlCQUFLRCxZQUFMLEdBQW9CRSxnQkFBcEI7QUFDRDs7QUFHRDs7Ozs7O3FDQUdhO0FBQ1QsZ0JBQUksQ0FBQyxLQUFLVixjQUFWLEVBQTBCO0FBQ3RCLHFCQUFLVyxVQUFMO0FBQ0g7QUFDSjs7O3FDQUVZO0FBQ1RDLHNDQUFNQyxvQkFBTixDQUEyQixpREFBaUQsS0FBS2QsR0FBdEQsR0FBNEQsOEJBQXZGO0FBQ0EsaUJBQUtDLGNBQUwsR0FBc0IsSUFBdEI7QUFDSDs7QUFFRDs7Ozs7OztrQ0FJVTtBQUNOYyxvQkFBUUMsR0FBUixDQUFZLHNDQUFzQ0MsT0FBTyx5QkFBUCxFQUFrQ0MsS0FBbEMsRUFBdEMsR0FBa0YsR0FBbEYsR0FBc0ZELE9BQU8seUJBQVAsRUFBa0NFLE1BQWxDLEVBQWxHLEVBQThJRixPQUFPLHlCQUFQLEVBQWtDRyxHQUFsQyxDQUFzQyxDQUF0QyxDQUE5STtBQUNBLGlCQUFLakIsR0FBTCxHQUFXLElBQUlrQixPQUFPQyxJQUFQLENBQVlDLEdBQWhCLENBQW9CTixPQUFPLHlCQUFQLEVBQWtDRyxHQUFsQyxDQUFzQyxDQUF0QyxDQUFwQixFQUE4RDtBQUNyRUksd0JBQVEsRUFBRUMsS0FBSyxDQUFDLE1BQVIsRUFBZ0JDLEtBQUssT0FBckIsRUFENkQ7QUFFckVDLHNCQUFNLEVBRitEO0FBR3JFQyxnQ0FBZ0I7QUFIcUQsYUFBOUQsQ0FBWDtBQUtIOztBQUVEOzs7Ozs7a0NBR1VILEcsRUFBS0MsRyxFQUFLO0FBQ2hCLGlCQUFLdkIsR0FBTCxDQUFTMEIsU0FBVCxDQUFtQixJQUFJUixPQUFPQyxJQUFQLENBQVlRLE1BQWhCLENBQXVCTCxHQUF2QixFQUE0QkMsR0FBNUIsQ0FBbkI7QUFDSDs7QUFFRDs7Ozs7Ozs7aURBS3lCSyxPLEVBQVE7QUFDL0IsZ0JBQUcsT0FBT0EsUUFBUUMsa0JBQWYsSUFBc0MsV0FBekMsRUFBcUQ7QUFDbkQsdUJBQU8sRUFBUDtBQUNEOztBQUVELGdCQUFJQyxhQUFhRixRQUFRQyxrQkFBekI7QUFDQSxpQkFBSyxJQUFJRSxJQUFFLENBQVgsRUFBY0EsSUFBSUQsV0FBV0UsTUFBN0IsRUFBcUMsRUFBRUQsQ0FBdkMsRUFBMEM7QUFDeEMsb0JBQUlFLFFBQVFILFdBQVdDLENBQVgsRUFBY0UsS0FBMUI7O0FBRUEscUJBQUksSUFBSUMsSUFBRSxDQUFWLEVBQWFBLElBQUlELE1BQU1ELE1BQXZCLEVBQStCLEVBQUVFLENBQWpDLEVBQW9DO0FBQ2xDLHdCQUFJRCxNQUFNQyxDQUFOLEtBQVksU0FBaEIsRUFBMkI7QUFDekIsK0JBQU9KLFdBQVdDLENBQVgsRUFBY0ksVUFBckI7QUFDRDtBQUNGO0FBRUY7QUFDRjs7QUFFRDs7Ozs7Ozs7Z0NBS1FDLFksRUFBZUMsVSxFQUFZO0FBQUE7O0FBQ2pDLGdCQUFHLE9BQU9uQixNQUFQLElBQWtCLFdBQXJCLEVBQWlDO0FBQUU7QUFDakNvQiwyQkFBVyxZQUFJO0FBQUMsMEJBQUtWLE9BQUwsQ0FBYVEsWUFBYixFQUEyQkMsVUFBM0I7QUFBeUMsaUJBQXpELEVBQTJELEdBQTNEO0FBQ0E7QUFDRDs7QUFFQyxnQkFBSUUsV0FBVyxJQUFJckIsT0FBT0MsSUFBUCxDQUFZcUIsUUFBaEIsRUFBZjtBQUNBLGdCQUFJQyxLQUFNLElBQVY7O0FBRUEsZ0JBQUlDLFVBQVVOLGFBQWFPLE9BQWIsQ0FBcUJDLFdBQXJCLEdBQW1DLEdBQW5DLEdBQXlDUixhQUFhTyxPQUFiLENBQXFCRSxXQUE5RCxHQUE0RSxHQUE1RSxHQUFrRlQsYUFBYU8sT0FBYixDQUFxQkcsVUFBdkcsR0FBb0gsR0FBcEgsR0FBMEhWLGFBQWFPLE9BQWIsQ0FBcUJJLElBQS9JLEdBQXNKLEdBQXRKLEdBQTRKWCxhQUFhTyxPQUFiLENBQXFCSyxLQUFqTCxHQUF5TCxHQUF6TCxHQUErTFosYUFBYU8sT0FBYixDQUFxQk0sT0FBbE87QUFDQXJDLG9CQUFRQyxHQUFSLENBQVksZUFBZTZCLE9BQTNCOztBQUVBSCxxQkFBU1gsT0FBVCxDQUFpQixFQUFFLFdBQVdjLE9BQWIsRUFBakIsRUFBeUMsVUFBU1EsT0FBVCxFQUFrQkMsTUFBbEIsRUFBMEI7QUFDL0Qsb0JBQUl2QixVQUFVLEVBQUN3QixNQUFLLEVBQU4sRUFBVTlCLEtBQUksRUFBZCxFQUFrQkMsS0FBSSxFQUF0QixFQUFkOztBQUVBLG9CQUFJNEIsVUFBVSxJQUFkLEVBQW9CO0FBQ2hCdkIsOEJBQVVzQixRQUFRLENBQVIsQ0FBVjtBQUNILGlCQUZELE1BR0s7QUFDRHRDLDRCQUFRQyxHQUFSLENBQVksMERBQTBEc0MsTUFBdEU7QUFDQWQsK0JBQVdULE9BQVg7QUFDQTtBQUNIOztBQUVELG9CQUFJeUIsU0FBU3pCLFFBQVEwQixRQUFSLENBQWlCQyxRQUE5Qjs7QUFFQTNCLHdCQUFRd0IsSUFBUixHQUFlWCxHQUFHZSx3QkFBSCxDQUE0QjVCLE9BQTVCLENBQWY7QUFDQUEsd0JBQVFOLEdBQVIsR0FBYytCLE9BQU8vQixHQUFQLEVBQWQ7QUFDQU0sd0JBQVFMLEdBQVIsR0FBYzhCLE9BQU85QixHQUFQLEVBQWQ7O0FBRUFjLDJCQUFXVCxPQUFYO0FBQ0gsYUFuQkQ7QUFvQkg7Ozt1Q0FFYztBQUNYLGdCQUFJLEtBQUs3QixPQUFMLENBQWFpQyxNQUFiLEdBQXNCLENBQTFCLEVBQTZCO0FBQ3pCLHFCQUFLLElBQUlELElBQUksQ0FBYixFQUFnQkEsSUFBSSxLQUFLaEMsT0FBTCxDQUFhaUMsTUFBakMsRUFBeUMsRUFBRUQsQ0FBM0MsRUFBOEM7QUFDMUMseUJBQUtoQyxPQUFMLENBQWFnQyxDQUFiLEVBQWdCMEIsTUFBaEIsQ0FBdUIsSUFBdkI7QUFDSDs7QUFFRCxxQkFBSzFELE9BQUwsR0FBZSxFQUFmO0FBQ0g7QUFDSjs7QUFFRDs7Ozs7Ozs7bUNBS1dFLFksRUFBY3lELFEsRUFBVTtBQUFBOztBQUMvQixpQkFBS3pELFlBQUwsR0FBb0JBLFlBQXBCOztBQUQrQix1Q0FHdEIwRCxDQUhzQjtBQUkzQix1QkFBSzVELE9BQUwsQ0FBYTRELENBQWIsSUFBa0IsT0FBS0MsU0FBTCxDQUFlM0QsYUFBYTBELENBQWIsQ0FBZixDQUFsQjtBQUNBO0FBQ0ExRCw2QkFBYTBELENBQWIsRUFBZ0JFLE1BQWhCLEdBQXlCLE9BQUs5RCxPQUFMLENBQWE0RCxDQUFiLENBQXpCOztBQUVBLHVCQUFLNUQsT0FBTCxDQUFhNEQsQ0FBYixFQUFnQkcsV0FBaEIsQ0FBNEIsT0FBNUIsRUFBcUMsWUFBTTtBQUN6Qyx3QkFBRyxPQUFPSixRQUFQLElBQW1CLFdBQXRCLEVBQWtDO0FBQ2hDQSxpQ0FBU0MsQ0FBVDtBQUNEO0FBQ0YsaUJBSkQ7QUFSMkI7O0FBRy9CLGlCQUFLLElBQUlBLElBQUksQ0FBYixFQUFnQkEsSUFBSTFELGFBQWErQixNQUFqQyxFQUF5QyxFQUFFMkIsQ0FBM0MsRUFBOEM7QUFBQSxzQkFBckNBLENBQXFDO0FBVTdDOztBQUVELGlCQUFLSSxTQUFMO0FBQ0g7O0FBRUQ7Ozs7OztrQ0FHVUMsVyxFQUFhTixRLEVBQVU7QUFDN0IsZ0JBQUlHLFNBQVMsSUFBSTNDLE9BQU9DLElBQVAsQ0FBWThDLE1BQWhCLENBQXVCO0FBQ2hDQywwQkFBVSxJQUFJaEQsT0FBT0MsSUFBUCxDQUFZUSxNQUFoQixDQUF1QnFDLFlBQVlHLEdBQW5DLEVBQXdDSCxZQUFZSSxJQUFwRCxDQURzQjtBQUVoQ3BFLHFCQUFLLEtBQUtBLEdBRnNCO0FBR2hDcUUsc0JBQU07QUFDRkMseUJBQU0sS0FBS2hFLFlBRFQ7QUFFRmlFLGdDQUFZLElBQUlyRCxPQUFPQyxJQUFQLENBQVlxRCxJQUFoQixDQUFxQixFQUFyQixFQUF5QixFQUF6QixDQUZWLEVBRXdDO0FBQzFDQyw0QkFBUSxJQUFJdkQsT0FBT0MsSUFBUCxDQUFZdUQsS0FBaEIsQ0FBc0IsQ0FBdEIsRUFBd0IsQ0FBeEIsQ0FITixFQUdrQztBQUNwQ0MsNEJBQVEsSUFBSXpELE9BQU9DLElBQVAsQ0FBWXVELEtBQWhCLENBQXNCLENBQXRCLEVBQXlCLENBQXpCLENBSk4sQ0FJa0M7QUFKbEM7QUFIMEIsYUFBdkIsQ0FBYjs7QUFZQSxtQkFBT2IsTUFBUDtBQUNGOzs7b0NBRVU7QUFDVixnQkFBSWUsU0FBUyxJQUFJMUQsT0FBT0MsSUFBUCxDQUFZMEQsWUFBaEIsRUFBYjtBQUNBLGlCQUFLLElBQUlsQixJQUFJLENBQWIsRUFBZ0JBLElBQUcsS0FBSzVELE9BQUwsQ0FBYWlDLE1BQWhDLEVBQXdDLEVBQUUyQixDQUExQyxFQUE2QztBQUMzQ2lCLHVCQUFPRSxNQUFQLENBQWMsS0FBSy9FLE9BQUwsQ0FBYTRELENBQWIsRUFBZ0JvQixXQUFoQixFQUFkO0FBQ0Q7QUFDRCxpQkFBSy9FLEdBQUwsQ0FBUytELFNBQVQsQ0FBbUJhLE1BQW5CO0FBQ0Q7O0FBRUQ7Ozs7Ozs7OzBDQUtrQkksRyxFQUFLO0FBQ25CLGdCQUFJQyxXQUFXO0FBQ1BYLHFCQUFNLEtBQUtsRSxhQURKO0FBRVBtRSw0QkFBWSxJQUFJckQsT0FBT0MsSUFBUCxDQUFZcUQsSUFBaEIsQ0FBcUIsRUFBckIsRUFBeUIsRUFBekIsQ0FGTCxFQUVtQztBQUMxQ0Msd0JBQVEsSUFBSXZELE9BQU9DLElBQVAsQ0FBWXVELEtBQWhCLENBQXNCLENBQXRCLEVBQXdCLENBQXhCLENBSEQsRUFHNkI7QUFDcENDLHdCQUFRLElBQUl6RCxPQUFPQyxJQUFQLENBQVl1RCxLQUFoQixDQUFzQixDQUF0QixFQUF5QixDQUF6QixDQUpELENBSTZCO0FBSjdCLGFBQWY7QUFNQSxnQkFBSVEsT0FBTztBQUNIWixxQkFBTSxLQUFLaEUsWUFEUjtBQUVIaUUsNEJBQVksSUFBSXJELE9BQU9DLElBQVAsQ0FBWXFELElBQWhCLENBQXFCLEVBQXJCLEVBQXlCLEVBQXpCLENBRlQsRUFFdUM7QUFDMUNDLHdCQUFRLElBQUl2RCxPQUFPQyxJQUFQLENBQVl1RCxLQUFoQixDQUFzQixDQUF0QixFQUF3QixDQUF4QixDQUhMLEVBR2lDO0FBQ3BDQyx3QkFBUSxJQUFJekQsT0FBT0MsSUFBUCxDQUFZdUQsS0FBaEIsQ0FBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsQ0FKTCxDQUlpQztBQUpqQyxhQUFYOztBQU9BLGlCQUFLLElBQUkzQyxJQUFJLENBQWIsRUFBZ0JBLElBQUksS0FBS2hDLE9BQUwsQ0FBYWlDLE1BQWpDLEVBQXlDLEVBQUVELENBQTNDLEVBQThDO0FBQzFDLHFCQUFLaEMsT0FBTCxDQUFhZ0MsQ0FBYixFQUFnQm9ELE9BQWhCLENBQ0VILE9BQU9qRCxDQUFQLEdBRUFrRCxRQUZBLEdBSUFDLElBTEY7QUFPSDtBQUNKOzs7Ozs7a0JBMU5nQnRGLGUiLCJmaWxlIjoiLi9qcy9zaGlwdGltaXplLWdtYXBzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFV0aWxzIGZyb20gJy4vc2hpcHRpbWl6ZS11dGlscy5qcyc7ICBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hpcHRpbWl6ZUdtYXBzIHtcblxuICAgIGNvbnN0cnVjdG9yKGtleSkge1xuICAgICAgICB0aGlzLmlzU2NyaXB0TG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMubWFya2VycyA9IFtdO1xuICAgICAgICB0aGlzLm1hcCA9IG51bGw7XG4gICAgICAgIHRoaXMucGlja3VwUG9pbnRzID0gW107XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuXG4gICAgICAgIC8qKiBcbiAgICAgICAgICogdGhlIHJvb3QgdXJsIGZvciB0aGUgaWNvbnMgaXQncyBkaWZmZXJlbnQgZm9yIGV2ZXJ5IHBsYXRmb3JtICBcbiAgICAgICAgICogbWFrZSBzdXJlIHRvIGluY2x1ZGUgYSB0cmFpbGluZyAvIFxuICAgICAgICAgKi8gXG4gICAgICAgIHRoaXMuaWNvbl9mb2xkZXIgPSB0eXBlb2Yoc2hpcHRpbWl6ZV9pY29uX2ZvbGRlcikgIT0gJ3VuZGVmaW5lZCcgPyAgc2hpcHRpbWl6ZV9pY29uX2ZvbGRlciA6ICcnOyAgXG4gICAgICAgIHRoaXMuaWNvbl9zZWxlY3RlZCA9IHRoaXMuaWNvbl9mb2xkZXIrJ3NlbGVjdGVkLnBuZyc7XG4gICAgICAgIHRoaXMuaWNvbl9kZWZhdWx0ID0gdGhpcy5pY29uX2ZvbGRlcisnZGVmYXVsdC5wbmcnO1xuICAgICAgICB0aGlzLmN1cnJlbnRfaWNvbiA9IHRoaXMuaWNvbl9kZWZhdWx0OyBcbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBDaGVja3MgaWYgd2UgaGF2ZSBhbiBpY29uIGZvciB0aGlzIGNhcnJpZXIuXG4gICAgICogSWYgeWVzIHRoZW4gY2hhbmdlIHRoZSBjYXJyaWVyIGljb25cbiAgICAgKiBJZiBub3QgdGhlbiB1c2UgdGhlIGRlZmF1bHQgaWNvblxuICAgICAqIFxuICAgICAqIEBwYXJhbSBpbnQgY2Fycmllcl9pZCAtIHRoZSBjYXJyaWVyIGlkIFxuICAgICAqLyBcbiAgICBzZXRDYXJyaWVySWNvbihjYXJyaWVyX2lkKXtcbiAgICAgIGxldCBjYXJyaWVyX2ljb25fdXJsID0gdGhpcy5pY29uX2ZvbGRlcisnJytjYXJyaWVyX2lkKycucG5nJzsgXG4gICAgICAvL3RoaXMuY3VycmVudF9pY29uID0gVXRpbHMuaXNVcmxWYWxpZChjYXJyaWVyX2ljb25fdXJsKSA/ICBjYXJyaWVyX2ljb25fdXJsIDogdGhpcy5pY29uX2RlZmF1bHQ7IFxuICAgICAgdGhpcy5jdXJyZW50X2ljb24gPSBjYXJyaWVyX2ljb25fdXJsO1xuICAgIH1cblxuXG4gICAgLyoqIFxuICAgICAqIGlmIHRoZSBzY3JpcHQgaGFzIG5vdCBiZWVuIGxvYWRlZCAsIGxvYWQgaXQgXG4gICAgICovXG4gICAgZ3JhbnRSZWFkeSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2NyaXB0TG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRTY3JpcHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRTY3JpcHQoKSB7XG4gICAgICAgIFV0aWxzLmluamVjdEV4dGVybmFsU2NyaXB0KFwiaHR0cHM6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2pzP2tleT1cIiArIHRoaXMua2V5ICsgXCImY2FsbGJhY2s9c2hpcHRpbWl6ZS5sb2FkTWFwXCIpO1xuICAgICAgICB0aGlzLmlzU2NyaXB0TG9hZGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogTG9hZCB0aGUgbWFwIGludG8gdGhlIGVsZW1lbnQgXG4gICAgICogVGhpcyBmdW5jdGlvbiBuZWVkcyB0aGUgc2NyaXB0IHRvIGJlIGxvYWRlZCBcbiAgICAgKi9cbiAgICBsb2FkTWFwKCkgeyAgICAgICAgXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZGlzcGxheWluZyBtYXAgb24gY29udGFpbmVyIHdpdGggXCIgKyBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX21hcFwiKS53aWR0aCgpICsgXCIgXCIralF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19tYXBcIikuaGVpZ2h0KCkgLGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cF9fbWFwXCIpLmdldCgwKSk7IFxuICAgICAgICB0aGlzLm1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAoalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19tYXBcIikuZ2V0KDApLCB7XG4gICAgICAgICAgICBjZW50ZXI6IHsgbGF0OiAtMzQuMzk3LCBsbmc6IDE1MC42NDQgfSxcbiAgICAgICAgICAgIHpvb206IDE2LFxuICAgICAgICAgICAgbWFwVHlwZUNvbnRyb2w6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogY2VudGVyIHRoZSBtYXAgXG4gICAgICovXG4gICAgY2VudGVyTWFwKGxhdCwgbG5nKSB7XG4gICAgICAgIHRoaXMubWFwLnNldENlbnRlcihuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGxhdCwgbG5nKSk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIEV4dHJhY3QgdGhlIGNvdW50cnkgY29kZSBmcm9tIGEgZ2VvY29kZSByZXN1bHRcbiAgICAgKiBAcGFyYW0gZ2VvY29kZSAtIGEgZ29vZ2xlLm1hcHMuR2VvY29kZXIgcmVzdWx0IFxuICAgICAqIEByZXR1cm4gc3RyaW5nIGFscGhhLTIgY29kZSBmb3IgdGhlIGNvdW50cnkgbmFtZSBcbiAgICAgKi8gXG4gICAgZ2V0Q291bnRyeUNvZGVGcm9tUmVzdWx0KGdlb2NvZGUpe1xuICAgICAgaWYodHlwZW9mKGdlb2NvZGUuYWRkcmVzc19jb21wb25lbnRzKSA9PSBcInVuZGVmaW5lZFwiKXtcbiAgICAgICAgcmV0dXJuIFwiXCI7IFxuICAgICAgfVxuXG4gICAgICBsZXQgY29tcG9uZW50cyA9IGdlb2NvZGUuYWRkcmVzc19jb21wb25lbnRzO1xuICAgICAgZm9yKCBsZXQgaT0wOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7ICsraSApe1xuICAgICAgICBsZXQgdHlwZXMgPSBjb21wb25lbnRzW2ldLnR5cGVzOyBcblxuICAgICAgICBmb3IobGV0IGo9MDsgaiA8IHR5cGVzLmxlbmd0aDsgKytqICl7XG4gICAgICAgICAgaWYoIHR5cGVzW2pdID09ICdjb3VudHJ5Jykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHNbaV0uc2hvcnRfbmFtZTsgXG4gICAgICAgICAgfSBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgXG4gICAgICogQHBhcmFtIHNoaXBwaW5nRGF0YSwgdGhlIGFkZHJlc3MgcGFydHMgICAgICAgXG4gICAgICogQHBhcmFtIGZfY2FsbGJhY2sgLCB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFsbCBtaWdodHkgZ29vZ2xlIHJldHVybnMgYSByZXN1bHQgXG4gICAgICovIFxuICAgIGdlb2NvZGUoc2hpcHBpbmdEYXRhLCAgZl9jYWxsYmFjaykgeyBcbiAgICAgIGlmKHR5cGVvZihnb29nbGUpID09ICd1bmRlZmluZWQnKXsgLy9zY3JpcHQgbm90IGxvYWRlZCB5ZXRcbiAgICAgICAgc2V0VGltZW91dCgoKT0+e3RoaXMuZ2VvY29kZShzaGlwcGluZ0RhdGEsIGZfY2FsbGJhY2spOyB9LCAyMDApOyBcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAgIGxldCBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xuICAgICAgICBsZXQgbWUgID0gdGhpczsgXG5cbiAgICAgICAgdmFyIGFkZHJlc3MgPSBzaGlwcGluZ0RhdGEuQWRkcmVzcy5TdHJlZXRuYW1lMSArIFwiIFwiICsgc2hpcHBpbmdEYXRhLkFkZHJlc3MuU3RyZWV0bmFtZTIgKyBcIiBcIiArIHNoaXBwaW5nRGF0YS5BZGRyZXNzLnBvc3RhbENvZGUgKyBcIiBcIiArIHNoaXBwaW5nRGF0YS5BZGRyZXNzLkNpdHkgKyBcIiBcIiArIHNoaXBwaW5nRGF0YS5BZGRyZXNzLlN0YXRlICsgXCIgXCIgKyBzaGlwcGluZ0RhdGEuQWRkcmVzcy5Db3VudHJ5O1xuICAgICAgICBjb25zb2xlLmxvZygnZ2VvY29kaW5nICcgKyBhZGRyZXNzKTtcblxuICAgICAgICBnZW9jb2Rlci5nZW9jb2RlKHsgJ2FkZHJlc3MnOiBhZGRyZXNzIH0sIGZ1bmN0aW9uKHJlc3VsdHMsIHN0YXR1cykge1xuICAgICAgICAgICAgbGV0IGdlb2NvZGUgPSB7aXNvMjonJywgbGF0OicnLCBsbmc6Jyd9O1xuXG4gICAgICAgICAgICBpZiAoc3RhdHVzID09ICdPSycpIHtcbiAgICAgICAgICAgICAgICBnZW9jb2RlID0gcmVzdWx0c1swXTtcbiAgICAgICAgICAgIH0gIFxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dlb2NvZGUgd2FzIG5vdCBzdWNjZXNzZnVsIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbjogJyArIHN0YXR1cyk7XG4gICAgICAgICAgICAgICAgZl9jYWxsYmFjayhnZW9jb2RlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47IFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbGF0bG5nID0gZ2VvY29kZS5nZW9tZXRyeS5sb2NhdGlvbjtcblxuICAgICAgICAgICAgZ2VvY29kZS5pc28yID0gbWUuZ2V0Q291bnRyeUNvZGVGcm9tUmVzdWx0KGdlb2NvZGUpO1xuICAgICAgICAgICAgZ2VvY29kZS5sYXQgPSBsYXRsbmcubGF0KCk7IFxuICAgICAgICAgICAgZ2VvY29kZS5sbmcgPSBsYXRsbmcubG5nKCk7IFxuXG4gICAgICAgICAgICBmX2NhbGxiYWNrKGdlb2NvZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjbGVhck1hcmtlcnMoKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcmtlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1hcmtlcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtlcnNbaV0uc2V0TWFwKG51bGwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm1hcmtlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBBZGQgdGhlIG1hcmtlcnMgdG8gbWFwIFxuICAgICAqIEBwYXJhbSBhcnJheSBwaWNrdXBQb2ludHMgLSBhbiBhcnJheSBvZiBwaWNrdXBQb2ludHNcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBhIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgbWFya2VyIGlzIGNsaWNrZWQgXG4gICAgICovXG4gICAgYWRkTWFya2VycyhwaWNrdXBQb2ludHMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMucGlja3VwUG9pbnRzID0gcGlja3VwUG9pbnRzO1xuXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgcGlja3VwUG9pbnRzLmxlbmd0aDsgKyt4KSB7XG4gICAgICAgICAgICB0aGlzLm1hcmtlcnNbeF0gPSB0aGlzLmdldE1hcmtlcihwaWNrdXBQb2ludHNbeF0pO1xuICAgICAgICAgICAgLy8gICAgd2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UgdGhlIHZhbHVlcyBmb3IgbGF0LGxuZyB3ZSBoYXZlIGFyZSByb3VuZGVkLCBzbyB0aGV5IHdpbGwgbm90IG1hdGNoIHRoZSBvbmVzIHJldHVybmVkIGJ5IGdvb2dsZVxuICAgICAgICAgICAgcGlja3VwUG9pbnRzW3hdLm1hcmtlciA9IHRoaXMubWFya2Vyc1t4XTtcblxuICAgICAgICAgICAgdGhpcy5tYXJrZXJzW3hdLmFkZExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgaWYodHlwZW9mKGNhbGxiYWNrKSE9ICd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpdEJvdW5kcygpXG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFJldHVybiBhIG1hcmtlciBmb3IgdGhlIGdtYXBzIFxuICAgICAqL1xuICAgIGdldE1hcmtlcihwaWNrdXBQb2ludCwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoe1xuICAgICAgICAgICAgcG9zaXRpb246IG5ldyBnb29nbGUubWFwcy5MYXRMbmcocGlja3VwUG9pbnQuTGF0LCBwaWNrdXBQb2ludC5Mb25nKSxcbiAgICAgICAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgICAgICAgICBpY29uOiB7XG4gICAgICAgICAgICAgICAgdXJsOiAgdGhpcy5jdXJyZW50X2ljb24sXG4gICAgICAgICAgICAgICAgc2NhbGVkU2l6ZTogbmV3IGdvb2dsZS5tYXBzLlNpemUoNTAsIDUwKSwgLy8gc2NhbGVkIHNpemVcbiAgICAgICAgICAgICAgICBvcmlnaW46IG5ldyBnb29nbGUubWFwcy5Qb2ludCgwLDApLCAvLyBvcmlnaW5cbiAgICAgICAgICAgICAgICBhbmNob3I6IG5ldyBnb29nbGUubWFwcy5Qb2ludCgwLCAwKSAvLyBhbmNob3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gXG5cbiAgICAgICAgcmV0dXJuIG1hcmtlcjtcbiAgICAgfVxuXG4gICAgZml0Qm91bmRzKCkge1xuICAgICAgdmFyIGJvdW5kcyA9IG5ldyBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMoKTtcbiAgICAgIGZvciggbGV0IHggPSAwOyB4PCB0aGlzLm1hcmtlcnMubGVuZ3RoOyArK3ggKXtcbiAgICAgICAgYm91bmRzLmV4dGVuZCh0aGlzLm1hcmtlcnNbeF0uZ2V0UG9zaXRpb24oKSk7IFxuICAgICAgfSBcbiAgICAgIHRoaXMubWFwLmZpdEJvdW5kcyhib3VuZHMpO1xuICAgIH1cbiBcbiAgICAvKipcbiAgICAgKiBSZXNldCBhbGwgbWFya2VycyAgXG4gICAgICogU2VsZWN0IHRoZSBtYXJrZXIgb2YgaW5kZXggaWR4IGluIG1hcCBcbiAgICAgKiBAcGFyYW0gaW50IGlkeCAtIHRoZSBpbmRleCB0byBzZWxlY3QgXG4gICAgICovXG4gICAgc2VsZWN0TWFya2VyQnlJZHgoaWR4KSB7IFxuICAgICAgICBsZXQgc2VsZWN0ZWQgPSB7XG4gICAgICAgICAgICAgICAgdXJsOiAgdGhpcy5pY29uX3NlbGVjdGVkLFxuICAgICAgICAgICAgICAgIHNjYWxlZFNpemU6IG5ldyBnb29nbGUubWFwcy5TaXplKDUwLCA1MCksIC8vIHNjYWxlZCBzaXplXG4gICAgICAgICAgICAgICAgb3JpZ2luOiBuZXcgZ29vZ2xlLm1hcHMuUG9pbnQoMCwwKSwgLy8gb3JpZ2luXG4gICAgICAgICAgICAgICAgYW5jaG9yOiBuZXcgZ29vZ2xlLm1hcHMuUG9pbnQoMCwgMCkgLy8gYW5jaG9yXG4gICAgICAgIH07XG4gICAgICAgIGxldCBjdXJyID0ge1xuICAgICAgICAgICAgICAgIHVybDogIHRoaXMuY3VycmVudF9pY29uLFxuICAgICAgICAgICAgICAgIHNjYWxlZFNpemU6IG5ldyBnb29nbGUubWFwcy5TaXplKDUwLCA1MCksIC8vIHNjYWxlZCBzaXplXG4gICAgICAgICAgICAgICAgb3JpZ2luOiBuZXcgZ29vZ2xlLm1hcHMuUG9pbnQoMCwwKSwgLy8gb3JpZ2luXG4gICAgICAgICAgICAgICAgYW5jaG9yOiBuZXcgZ29vZ2xlLm1hcHMuUG9pbnQoMCwgMCkgLy8gYW5jaG9yXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1hcmtlcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHRoaXMubWFya2Vyc1tpXS5zZXRJY29uKFxuICAgICAgICAgICAgICBpZHggPT0gaSBcbiAgICAgICAgICAgICAgPyBcbiAgICAgICAgICAgICAgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICBjdXJyXG4gICAgICAgICAgICApOyAgXG4gICAgICAgIH1cbiAgICB9XG5cbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./js/shiptimize-gmaps.js\n"); 109 110 /***/ }), 111 112 /***/ "./js/shiptimize-open-map.js": 113 /*!***********************************!*\ 114 !*** ./js/shiptimize-open-map.js ***! 115 \***********************************/ 116 /*! no static exports found */ 117 /***/ (function(module, exports, __webpack_require__) { 118 119 "use strict"; 120 eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _shiptimizeUtils = __webpack_require__(/*! ./shiptimize-utils.js */ \"./js/shiptimize-utils.js\");\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ShiptimizeOpenMap = function () {\n function ShiptimizeOpenMap() {\n _classCallCheck(this, ShiptimizeOpenMap);\n\n this.isScriptLoaded = false;\n this.markers = [];\n this.map = null;\n\n /** \n * the root url for the icons it's different for every platform \n * make sure to include a trailing / \n */\n this.icon_folder = typeof shiptimize_icon_folder != 'undefined' ? shiptimize_icon_folder : '';\n }\n\n /** \n *\n * @param string imageUrl - full url to the icon \n * @return L.icon object \n */\n\n\n _createClass(ShiptimizeOpenMap, [{\n key: 'createIcon',\n value: function createIcon(imageUrl) {\n return L.icon({\n iconUrl: imageUrl,\n iconSize: [50, 50], // size of the icon \n iconAnchor: [25, 25], // point of the icon which will correspond to marker's location \n popupAnchor: [-25, -50] // point from which the popup should open relative to the iconAnchor\n });\n }\n\n /** \n * @param decimal lat \n * @param decimal lng \n */\n\n }, {\n key: 'centerMap',\n value: function centerMap(lat, lng) {\n var latlng = L.latLng(lat, lng);\n }\n\n /** \n * if the script has not been loaded , load it. \n * We use this function because we only want to load the script when the user clicks the button \n */\n\n }, {\n key: 'grantReady',\n value: function grantReady() {\n if (!this.isScriptLoaded) {\n this.loadScript();\n }\n }\n\n /** \n * @param f_callback what function to call when the request resolves \n * @param city - city name \n * @param country - country in iso2 uppercase \n * @param postalcode - the postal code \n * @param streetname - the streetname \n */\n\n }, {\n key: 'geocodeAddress',\n value: function geocodeAddress(f_callback, city, country, postalcode, streetname) {\n var queryString = \"https://nominatim.openstreetmap.org/search?format=json&addressdetails=1\" + \"&city=\" + city + \"&country=\" + country;\n\n if (typeof postalcode != 'undefined') {\n if (country == 'PT' || country == 'Portugal') {\n postalcode = postalcode.substr(0, 4);\n }\n queryString += \"&postalcode=\" + postalcode;\n }\n\n if (typeof streetname != 'undefined') {\n queryString += \"&street=\" + streetname;\n }\n\n jQuery.getJSON(queryString, {}, function (response) {\n var geocode = {\n 'iso2': '',\n 'lat': '',\n 'lng': ''\n };\n\n if (response.length > 0) {\n var location = response[0];\n\n geocode.iso2 = location.address.country_code;\n\n geocode.lat = location.lat;\n geocode.lng = location.lon;\n }\n f_callback(geocode);\n\n console.log(response);\n });\n }\n }, {\n key: 'geocode',\n\n\n /**\n * \n * @param shippingData, the address parts \n * @param f_callback , the function to call when all mighty google returns a result \n */\n value: function geocode(shippingData, f_callback) {\n var _this = this;\n\n console.log(shippingData);\n this.grantReady();\n\n this.geocodeAddress(function (geocode) {\n if (!geocode.lat) {\n return _this.geocodeAddress(function (geocode) {\n f_callback(geocode);\n }, shippingData.Address.City, shippingData.Address.Country);\n }\n\n f_callback(geocode);\n }, shippingData.Address.City, shippingData.Address.Country, shippingData.Address.PostalCode, shippingData.Address.Streetname1);\n }\n }, {\n key: 'loadScript',\n value: function loadScript() {\n _shiptimizeUtils2.default.injectExternalScript(SHIPTIMIZE_PLUGIN_URL + \"assets/js/leaflet-1.4.0.js\");\n this.isScriptLoaded = true;\n this.loadMap();\n return;\n }\n\n /** \n * Leaflet does not receive a callback so we wait here for the script to be loaded \n */\n\n }, {\n key: 'loadMap',\n value: function loadMap() {\n var _this2 = this;\n\n if (typeof L == 'undefined') {\n setTimeout(function () {\n _this2.loadMap();\n }, 200);\n return;\n }\n\n this.icon_selected = this.createIcon(shiptimize_icon_folder + 'selected.png');\n this.icon_default = this.createIcon(shiptimize_icon_folder + 'default.png');\n this.current_icon = this.icon_default;\n\n this.map = new L.map(jQuery(\".shiptimize-pickup__map\").get(0), {\n \"zoom\": 16,\n \"center\": [51.505, -0.09]\n });\n\n L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n \"attribution\": '© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n }).addTo(this.map);\n }\n }, {\n key: 'clearMarkers',\n value: function clearMarkers() {\n if (this.markers.length > 0) {\n for (var i = 0; i < this.markers.length; ++i) {\n this.map.removeLayer(this.markers[i]);\n }\n }\n this.markers = [];\n }\n\n /** \n * Add the markers to map \n * @param array pickupPoints - an array of pickupPoints\n * @param function callback \n */\n\n }, {\n key: 'addMarkers',\n value: function addMarkers(pickupPoints, callback) {\n var _this3 = this;\n\n this.pickupPoints = pickupPoints;\n\n var _loop = function _loop(x) {\n _this3.markers[x] = _this3.getMarker(pickupPoints[x]);\n // we need to do this because the values for lat,lng we have are rounded, so they will not match the ones returned by google\n _this3.pickupPoints[x].marker = _this3.markers[x];\n\n _this3.markers[x].on('click', function () {\n if (typeof callback == 'function') {\n callback(x);\n }\n });\n };\n\n for (var x = 0; x < pickupPoints.length; ++x) {\n _loop(x);\n }\n\n this.fitBounds();\n }\n }, {\n key: 'resetMarker',\n value: function resetMarker(marker) {\n marker.setIcon(this.icon_default);\n }\n }, {\n key: 'selectMarker',\n value: function selectMarker(marker) {\n marker.setIcon(this.icon_selected);\n }\n\n /** \n * Adjust the zoom in the map to display all the markers \n * There's a fit bounds that receives 2 corners, but calculating them is up to us. \n * corners: top left, bottom right \n * then we center the map at the center of the square \n */\n\n }, {\n key: 'fitBounds',\n value: function fitBounds() {\n var _this4 = this;\n\n var bottomLeft = [this.pickupPoints[0].Lat, this.pickupPoints[0].Long];\n var topRight = [this.pickupPoints[0].Lat, this.pickupPoints[0].Long];\n\n for (var i = 0; i < this.pickupPoints.length; ++i) {\n var lat = this.pickupPoints[i].Lat;\n var lng = this.pickupPoints[i].Long;\n\n if (lat < bottomLeft[0]) {\n bottomLeft[0] = lat;\n }\n\n if (lat > topRight[0]) {\n topRight[0] = lat;\n }\n\n if (lng > topRight[1]) {\n topRight[1] = lng;\n }\n\n if (lng < bottomLeft[1]) {\n bottomLeft[1] = lng;\n }\n }\n\n var centerX = parseFloat(bottomLeft[0]) + (parseFloat(topRight[0]) - parseFloat(bottomLeft[0])) / 2;\n var centerY = parseFloat(bottomLeft[1]) + (parseFloat(topRight[1]) - parseFloat(bottomLeft[1])) / 2;\n\n this.map.panTo([centerX, centerY]);\n\n this.map.fitBounds([bottomLeft, topRight]);\n\n setTimeout(function () {\n _this4.map.invalidateSize();\n }, 200);\n }\n\n /** \n * Return a marker for the openLayers \n * IconAnchor: The coordinates of the \"tip\" of the icon (relative to its top left corner). \n * The icon will be aligned so that this point is at the marker's geographical location. \n * Centered by default if size is specified, also can be set in CSS with negative margins.\n */\n\n }, {\n key: 'getMarker',\n value: function getMarker(pickupPoint) {\n var marker = L.marker([pickupPoint.Lat, pickupPoint.Long], {\n \"icon\": this.current_icon,\n \"title\": pickupPoint.Information.Name + \"\\n\" + pickupPoint.Information.Address\n });\n marker.addTo(this.map);\n return marker;\n }\n\n /** \n * Checks if we have an icon for this carrier.\n * If yes then change the carrier icon\n * If not then use the default icon\n * \n * @param int carrier_id - the carrier id \n */\n\n }, {\n key: 'setCarrierIcon',\n value: function setCarrierIcon(carrier_id) {\n var _this5 = this;\n\n if (typeof L == 'undefined') {\n setTimeout(function () {\n _this5.setCarrierIcon(carrier_id);\n }, 200);\n return;\n }\n var carrier_icon_url = this.icon_folder + '' + carrier_id + '.png';\n //this.current_icon = Utils.isUrlValid(carrier_icon_url) ? this.createIcon(carrier_icon_url) : this.icon_default;\n this.current_icon = this.createIcon(carrier_icon_url);\n }\n\n /**\n * Reset all markers \n * Select the marker of index idx in map \n * @param int idx - the index to select \n */\n\n }, {\n key: 'selectMarkerByIdx',\n value: function selectMarkerByIdx(idx) {\n for (var i = 0; i < this.markers.length; ++i) {\n this.markers[i].setIcon(idx == i ? this.icon_selected : this.current_icon);\n }\n }\n }]);\n\n return ShiptimizeOpenMap;\n}();\n\nexports.default = ShiptimizeOpenMap;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLW9wZW4tbWFwLmpzPzg5YzEiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZU9wZW5NYXAiLCJpc1NjcmlwdExvYWRlZCIsIm1hcmtlcnMiLCJtYXAiLCJpY29uX2ZvbGRlciIsInNoaXB0aW1pemVfaWNvbl9mb2xkZXIiLCJpbWFnZVVybCIsIkwiLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsInBvcHVwQW5jaG9yIiwibGF0IiwibG5nIiwibGF0bG5nIiwibGF0TG5nIiwibG9hZFNjcmlwdCIsImZfY2FsbGJhY2siLCJjaXR5IiwiY291bnRyeSIsInBvc3RhbGNvZGUiLCJzdHJlZXRuYW1lIiwicXVlcnlTdHJpbmciLCJzdWJzdHIiLCJqUXVlcnkiLCJnZXRKU09OIiwicmVzcG9uc2UiLCJnZW9jb2RlIiwibGVuZ3RoIiwibG9jYXRpb24iLCJpc28yIiwiYWRkcmVzcyIsImNvdW50cnlfY29kZSIsImxvbiIsImNvbnNvbGUiLCJsb2ciLCJzaGlwcGluZ0RhdGEiLCJncmFudFJlYWR5IiwiZ2VvY29kZUFkZHJlc3MiLCJBZGRyZXNzIiwiQ2l0eSIsIkNvdW50cnkiLCJQb3N0YWxDb2RlIiwiU3RyZWV0bmFtZTEiLCJVdGlscyIsImluamVjdEV4dGVybmFsU2NyaXB0IiwiU0hJUFRJTUlaRV9QTFVHSU5fVVJMIiwibG9hZE1hcCIsInNldFRpbWVvdXQiLCJpY29uX3NlbGVjdGVkIiwiY3JlYXRlSWNvbiIsImljb25fZGVmYXVsdCIsImN1cnJlbnRfaWNvbiIsImdldCIsInRpbGVMYXllciIsImFkZFRvIiwiaSIsInJlbW92ZUxheWVyIiwicGlja3VwUG9pbnRzIiwiY2FsbGJhY2siLCJ4IiwiZ2V0TWFya2VyIiwibWFya2VyIiwib24iLCJmaXRCb3VuZHMiLCJzZXRJY29uIiwiYm90dG9tTGVmdCIsIkxhdCIsIkxvbmciLCJ0b3BSaWdodCIsImNlbnRlclgiLCJwYXJzZUZsb2F0IiwiY2VudGVyWSIsInBhblRvIiwiaW52YWxpZGF0ZVNpemUiLCJwaWNrdXBQb2ludCIsIkluZm9ybWF0aW9uIiwiTmFtZSIsImNhcnJpZXJfaWQiLCJzZXRDYXJyaWVySWNvbiIsImNhcnJpZXJfaWNvbl91cmwiLCJpZHgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7Ozs7O0lBRXFCQSxpQjtBQUVqQixpQ0FBYztBQUFBOztBQUNWLGFBQUtDLGNBQUwsR0FBc0IsS0FBdEI7QUFDQSxhQUFLQyxPQUFMLEdBQWUsRUFBZjtBQUNBLGFBQUtDLEdBQUwsR0FBVyxJQUFYOztBQUVBOzs7O0FBSUEsYUFBS0MsV0FBTCxHQUFtQixPQUFPQyxzQkFBUCxJQUFrQyxXQUFsQyxHQUFnREEsc0JBQWhELEdBQXlFLEVBQTVGO0FBQ0g7O0FBRUQ7Ozs7Ozs7OzttQ0FLV0MsUSxFQUFVO0FBQ2xCLG1CQUFPQyxFQUFFQyxJQUFGLENBQU87QUFDVEMseUJBQVNILFFBREE7QUFFVEksMEJBQVUsQ0FBQyxFQUFELEVBQUssRUFBTCxDQUZELEVBRVc7QUFDcEJDLDRCQUFZLENBQUMsRUFBRCxFQUFLLEVBQUwsQ0FISCxFQUdhO0FBQ3RCQyw2QkFBYSxDQUFDLENBQUMsRUFBRixFQUFNLENBQUMsRUFBUCxDQUpKLENBSWU7QUFKZixhQUFQLENBQVA7QUFNRjs7QUFFRDs7Ozs7OztrQ0FJVUMsRyxFQUFLQyxHLEVBQUk7QUFDZixnQkFBSUMsU0FBU1IsRUFBRVMsTUFBRixDQUFTSCxHQUFULEVBQWNDLEdBQWQsQ0FBYjtBQUNIOztBQUVEOzs7Ozs7O3FDQUlhO0FBQ1QsZ0JBQUksQ0FBQyxLQUFLYixjQUFWLEVBQTBCO0FBQ3RCLHFCQUFLZ0IsVUFBTDtBQUNIO0FBQ0o7O0FBR0g7Ozs7Ozs7Ozs7dUNBT2VDLFUsRUFBWUMsSSxFQUFNQyxPLEVBQVNDLFUsRUFBWUMsVSxFQUFZO0FBQ2hFLGdCQUFJQyxjQUFjLDRFQUNoQixRQURnQixHQUNMSixJQURLLEdBRWhCLFdBRmdCLEdBRUZDLE9BRmhCOztBQUlBLGdCQUFJLE9BQVFDLFVBQVIsSUFBdUIsV0FBM0IsRUFBd0M7QUFDdEMsb0JBQUlELFdBQVcsSUFBWCxJQUFtQkEsV0FBVyxVQUFsQyxFQUE4QztBQUM1Q0MsaUNBQWFBLFdBQVdHLE1BQVgsQ0FBa0IsQ0FBbEIsRUFBcUIsQ0FBckIsQ0FBYjtBQUNEO0FBQ0RELCtCQUFlLGlCQUFpQkYsVUFBaEM7QUFDRDs7QUFFRCxnQkFBSSxPQUFRQyxVQUFSLElBQXVCLFdBQTNCLEVBQXdDO0FBQ3RDQywrQkFBZSxhQUFhRCxVQUE1QjtBQUNEOztBQUVERyxtQkFBT0MsT0FBUCxDQUFlSCxXQUFmLEVBQTRCLEVBQTVCLEVBQWdDLFVBQVVJLFFBQVYsRUFBb0I7QUFDbEQsb0JBQUlDLFVBQVU7QUFDWiw0QkFBUSxFQURJO0FBRVosMkJBQU8sRUFGSztBQUdaLDJCQUFPO0FBSEssaUJBQWQ7O0FBTUEsb0JBQUlELFNBQVNFLE1BQVQsR0FBa0IsQ0FBdEIsRUFBeUI7QUFDdkIsd0JBQUlDLFdBQVdILFNBQVMsQ0FBVCxDQUFmOztBQUVBQyw0QkFBUUcsSUFBUixHQUFlRCxTQUFTRSxPQUFULENBQWlCQyxZQUFoQzs7QUFFQUwsNEJBQVFmLEdBQVIsR0FBY2lCLFNBQVNqQixHQUF2QjtBQUNBZSw0QkFBUWQsR0FBUixHQUFjZ0IsU0FBU0ksR0FBdkI7QUFDRDtBQUNEaEIsMkJBQVdVLE9BQVg7O0FBRUFPLHdCQUFRQyxHQUFSLENBQVlULFFBQVo7QUFDRCxhQWxCRDtBQW1CRDs7Ozs7QUFFRDs7Ozs7Z0NBS1FVLFksRUFBY25CLFUsRUFBWTtBQUFBOztBQUNoQ2lCLG9CQUFRQyxHQUFSLENBQVlDLFlBQVo7QUFDQSxpQkFBS0MsVUFBTDs7QUFFQSxpQkFBS0MsY0FBTCxDQUFvQixVQUFDWCxPQUFELEVBQWE7QUFDL0Isb0JBQUksQ0FBQ0EsUUFBUWYsR0FBYixFQUFrQjtBQUNoQiwyQkFBTyxNQUFLMEIsY0FBTCxDQUFvQixVQUFVWCxPQUFWLEVBQW1CO0FBQzVDVixtQ0FBV1UsT0FBWDtBQUNELHFCQUZNLEVBRUpTLGFBQWFHLE9BQWIsQ0FBcUJDLElBRmpCLEVBRXVCSixhQUFhRyxPQUFiLENBQXFCRSxPQUY1QyxDQUFQO0FBR0Q7O0FBRUR4QiwyQkFBV1UsT0FBWDtBQUNELGFBUkQsRUFRR1MsYUFBYUcsT0FBYixDQUFxQkMsSUFSeEIsRUFROEJKLGFBQWFHLE9BQWIsQ0FBcUJFLE9BUm5ELEVBUTRETCxhQUFhRyxPQUFiLENBQXFCRyxVQVJqRixFQVE2Rk4sYUFBYUcsT0FBYixDQUFxQkksV0FSbEg7QUFTRDs7O3FDQUNjO0FBQ1RDLHNDQUFNQyxvQkFBTixDQUEyQkMsd0JBQXdCLDRCQUFuRDtBQUNBLGlCQUFLOUMsY0FBTCxHQUFzQixJQUF0QjtBQUNBLGlCQUFLK0MsT0FBTDtBQUNBO0FBQ0g7O0FBRUQ7Ozs7OztrQ0FHVTtBQUFBOztBQUNOLGdCQUFJLE9BQU96QyxDQUFQLElBQWEsV0FBakIsRUFBOEI7QUFDMUIwQywyQkFBVyxZQUFNO0FBQUUsMkJBQUtELE9BQUw7QUFBaUIsaUJBQXBDLEVBQXNDLEdBQXRDO0FBQ0E7QUFDSDs7QUFFRCxpQkFBS0UsYUFBTCxHQUFxQixLQUFLQyxVQUFMLENBQWdCOUMseUJBQXlCLGNBQXpDLENBQXJCO0FBQ0EsaUJBQUsrQyxZQUFMLEdBQW9CLEtBQUtELFVBQUwsQ0FBZ0I5Qyx5QkFBeUIsYUFBekMsQ0FBcEI7QUFDQSxpQkFBS2dELFlBQUwsR0FBb0IsS0FBS0QsWUFBekI7O0FBRUEsaUJBQUtqRCxHQUFMLEdBQVcsSUFBSUksRUFBRUosR0FBTixDQUFVc0IsT0FBTyx5QkFBUCxFQUFrQzZCLEdBQWxDLENBQXNDLENBQXRDLENBQVYsRUFBb0Q7QUFDM0Qsd0JBQVEsRUFEbUQ7QUFFM0QsMEJBQVUsQ0FBQyxNQUFELEVBQVMsQ0FBQyxJQUFWO0FBRmlELGFBQXBELENBQVg7O0FBS0EvQyxjQUFFZ0QsU0FBRixDQUFZLG9EQUFaLEVBQWtFO0FBQzlELCtCQUFlO0FBRCtDLGFBQWxFLEVBRUdDLEtBRkgsQ0FFUyxLQUFLckQsR0FGZDtBQUdIOzs7dUNBRWM7QUFDWCxnQkFBSSxLQUFLRCxPQUFMLENBQWEyQixNQUFiLEdBQXNCLENBQTFCLEVBQTZCO0FBQ3pCLHFCQUFLLElBQUk0QixJQUFJLENBQWIsRUFBZ0JBLElBQUksS0FBS3ZELE9BQUwsQ0FBYTJCLE1BQWpDLEVBQXlDLEVBQUU0QixDQUEzQyxFQUE4QztBQUMxQyx5QkFBS3RELEdBQUwsQ0FBU3VELFdBQVQsQ0FBcUIsS0FBS3hELE9BQUwsQ0FBYXVELENBQWIsQ0FBckI7QUFDSDtBQUNKO0FBQ0QsaUJBQUt2RCxPQUFMLEdBQWUsRUFBZjtBQUNIOztBQUdEOzs7Ozs7OzttQ0FLV3lELFksRUFBY0MsUSxFQUFVO0FBQUE7O0FBQy9CLGlCQUFLRCxZQUFMLEdBQW9CQSxZQUFwQjs7QUFEK0IsdUNBR3RCRSxDQUhzQjtBQUkzQix1QkFBSzNELE9BQUwsQ0FBYTJELENBQWIsSUFBa0IsT0FBS0MsU0FBTCxDQUFlSCxhQUFhRSxDQUFiLENBQWYsQ0FBbEI7QUFDQTtBQUNBLHVCQUFLRixZQUFMLENBQWtCRSxDQUFsQixFQUFxQkUsTUFBckIsR0FBOEIsT0FBSzdELE9BQUwsQ0FBYTJELENBQWIsQ0FBOUI7O0FBRUEsdUJBQUszRCxPQUFMLENBQWEyRCxDQUFiLEVBQWdCRyxFQUFoQixDQUFtQixPQUFuQixFQUE0QixZQUFNO0FBQzlCLHdCQUFHLE9BQU9KLFFBQVAsSUFBb0IsVUFBdkIsRUFBa0M7QUFDOUJBLGlDQUFTQyxDQUFUO0FBQ0g7QUFDSixpQkFKRDtBQVIyQjs7QUFHL0IsaUJBQUssSUFBSUEsSUFBSSxDQUFiLEVBQWdCQSxJQUFJRixhQUFhOUIsTUFBakMsRUFBeUMsRUFBRWdDLENBQTNDLEVBQThDO0FBQUEsc0JBQXJDQSxDQUFxQztBQVU3Qzs7QUFFRCxpQkFBS0ksU0FBTDtBQUNIOzs7b0NBRVdGLE0sRUFBUTtBQUNoQkEsbUJBQU9HLE9BQVAsQ0FBZSxLQUFLZCxZQUFwQjtBQUNIOzs7cUNBRVlXLE0sRUFBUTtBQUNqQkEsbUJBQU9HLE9BQVAsQ0FBZSxLQUFLaEIsYUFBcEI7QUFDSDs7QUFFRDs7Ozs7Ozs7O29DQU1ZO0FBQUE7O0FBQ1IsZ0JBQUlpQixhQUFhLENBQUMsS0FBS1IsWUFBTCxDQUFrQixDQUFsQixFQUFxQlMsR0FBdEIsRUFBMkIsS0FBS1QsWUFBTCxDQUFrQixDQUFsQixFQUFxQlUsSUFBaEQsQ0FBakI7QUFDQSxnQkFBSUMsV0FBVyxDQUFDLEtBQUtYLFlBQUwsQ0FBa0IsQ0FBbEIsRUFBcUJTLEdBQXRCLEVBQTJCLEtBQUtULFlBQUwsQ0FBa0IsQ0FBbEIsRUFBcUJVLElBQWhELENBQWY7O0FBRUEsaUJBQUssSUFBSVosSUFBSSxDQUFiLEVBQWdCQSxJQUFJLEtBQUtFLFlBQUwsQ0FBa0I5QixNQUF0QyxFQUE4QyxFQUFFNEIsQ0FBaEQsRUFBbUQ7QUFDL0Msb0JBQUk1QyxNQUFNLEtBQUs4QyxZQUFMLENBQWtCRixDQUFsQixFQUFxQlcsR0FBL0I7QUFDQSxvQkFBSXRELE1BQU0sS0FBSzZDLFlBQUwsQ0FBa0JGLENBQWxCLEVBQXFCWSxJQUEvQjs7QUFFQSxvQkFBSXhELE1BQU1zRCxXQUFXLENBQVgsQ0FBVixFQUF5QjtBQUNyQkEsK0JBQVcsQ0FBWCxJQUFnQnRELEdBQWhCO0FBQ0g7O0FBRUQsb0JBQUlBLE1BQU15RCxTQUFTLENBQVQsQ0FBVixFQUF1QjtBQUNuQkEsNkJBQVMsQ0FBVCxJQUFjekQsR0FBZDtBQUNIOztBQUVELG9CQUFJQyxNQUFNd0QsU0FBUyxDQUFULENBQVYsRUFBdUI7QUFDbkJBLDZCQUFTLENBQVQsSUFBY3hELEdBQWQ7QUFDSDs7QUFFRCxvQkFBSUEsTUFBTXFELFdBQVcsQ0FBWCxDQUFWLEVBQXlCO0FBQ3JCQSwrQkFBVyxDQUFYLElBQWdCckQsR0FBaEI7QUFDSDtBQUNKOztBQUdELGdCQUFJeUQsVUFBVUMsV0FBV0wsV0FBVyxDQUFYLENBQVgsSUFBNEIsQ0FBQ0ssV0FBV0YsU0FBUyxDQUFULENBQVgsSUFBMEJFLFdBQVdMLFdBQVcsQ0FBWCxDQUFYLENBQTNCLElBQXdELENBQWxHO0FBQ0EsZ0JBQUlNLFVBQVVELFdBQVdMLFdBQVcsQ0FBWCxDQUFYLElBQTRCLENBQUNLLFdBQVdGLFNBQVMsQ0FBVCxDQUFYLElBQTBCRSxXQUFXTCxXQUFXLENBQVgsQ0FBWCxDQUEzQixJQUF3RCxDQUFsRzs7QUFFQSxpQkFBS2hFLEdBQUwsQ0FBU3VFLEtBQVQsQ0FBZSxDQUFDSCxPQUFELEVBQVVFLE9BQVYsQ0FBZjs7QUFFQSxpQkFBS3RFLEdBQUwsQ0FBUzhELFNBQVQsQ0FBbUIsQ0FDZkUsVUFEZSxFQUVmRyxRQUZlLENBQW5COztBQUtBckIsdUJBQVksWUFBTTtBQUFFLHVCQUFLOUMsR0FBTCxDQUFTd0UsY0FBVDtBQUEwQixhQUE5QyxFQUFnRCxHQUFoRDtBQUNIOztBQUVEOzs7Ozs7Ozs7a0NBTVVDLFcsRUFBYTtBQUNuQixnQkFBSWIsU0FBU3hELEVBQUV3RCxNQUFGLENBQVMsQ0FBQ2EsWUFBWVIsR0FBYixFQUFrQlEsWUFBWVAsSUFBOUIsQ0FBVCxFQUE4QztBQUN2RCx3QkFBUSxLQUFLaEIsWUFEMEM7QUFFdkQseUJBQVN1QixZQUFZQyxXQUFaLENBQXdCQyxJQUF4QixHQUErQixJQUEvQixHQUFzQ0YsWUFBWUMsV0FBWixDQUF3QnJDO0FBRmhCLGFBQTlDLENBQWI7QUFJQXVCLG1CQUFPUCxLQUFQLENBQWEsS0FBS3JELEdBQWxCO0FBQ0EsbUJBQU80RCxNQUFQO0FBQ0g7O0FBRUQ7Ozs7Ozs7Ozs7dUNBT2VnQixVLEVBQVk7QUFBQTs7QUFDdkIsZ0JBQUksT0FBT3hFLENBQVAsSUFBYSxXQUFqQixFQUE4QjtBQUMxQjBDLDJCQUFXLFlBQU07QUFBRSwyQkFBSytCLGNBQUwsQ0FBb0JELFVBQXBCO0FBQWtDLGlCQUFyRCxFQUF1RCxHQUF2RDtBQUNBO0FBQ0g7QUFDRCxnQkFBSUUsbUJBQW1CLEtBQUs3RSxXQUFMLEdBQW1CLEVBQW5CLEdBQXdCMkUsVUFBeEIsR0FBcUMsTUFBNUQ7QUFDQTtBQUNBLGlCQUFLMUIsWUFBTCxHQUFvQixLQUFLRixVQUFMLENBQWdCOEIsZ0JBQWhCLENBQXBCO0FBQ0g7O0FBRUQ7Ozs7Ozs7OzBDQUtrQkMsRyxFQUFLO0FBQ25CLGlCQUFLLElBQUl6QixJQUFJLENBQWIsRUFBZ0JBLElBQUksS0FBS3ZELE9BQUwsQ0FBYTJCLE1BQWpDLEVBQXlDLEVBQUU0QixDQUEzQyxFQUE4QztBQUMxQyxxQkFBS3ZELE9BQUwsQ0FBYXVELENBQWIsRUFBZ0JTLE9BQWhCLENBQ0lnQixPQUFPekIsQ0FBUCxHQUNBLEtBQUtQLGFBREwsR0FFQSxLQUFLRyxZQUhUO0FBS0g7QUFDSjs7Ozs7O2tCQS9RZ0JyRCxpQiIsImZpbGUiOiIuL2pzL3NoaXB0aW1pemUtb3Blbi1tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVXRpbHMgZnJvbSAnLi9zaGlwdGltaXplLXV0aWxzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hpcHRpbWl6ZU9wZW5NYXAge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaXNTY3JpcHRMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gW107XG4gICAgICAgIHRoaXMubWFwID0gbnVsbDtcblxuICAgICAgICAvKiogXG4gICAgICAgICAqIHRoZSByb290IHVybCBmb3IgdGhlIGljb25zIGl0J3MgZGlmZmVyZW50IGZvciBldmVyeSBwbGF0Zm9ybSAgXG4gICAgICAgICAqIG1ha2Ugc3VyZSB0byBpbmNsdWRlIGEgdHJhaWxpbmcgLyBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaWNvbl9mb2xkZXIgPSB0eXBlb2Yoc2hpcHRpbWl6ZV9pY29uX2ZvbGRlcikgIT0gJ3VuZGVmaW5lZCcgPyBzaGlwdGltaXplX2ljb25fZm9sZGVyIDogJyc7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmluZyBpbWFnZVVybCAtIGZ1bGwgdXJsIHRvIHRoZSBpY29uIFxuICAgICAqIEByZXR1cm4gTC5pY29uIG9iamVjdCBcbiAgICAgKi9cbiAgICBjcmVhdGVJY29uKGltYWdlVXJsKSB7XG4gICAgICAgcmV0dXJuIEwuaWNvbih7XG4gICAgICAgICAgICBpY29uVXJsOiBpbWFnZVVybCxcbiAgICAgICAgICAgIGljb25TaXplOiBbNTAsIDUwXSwgLy8gc2l6ZSBvZiB0aGUgaWNvbiBcbiAgICAgICAgICAgIGljb25BbmNob3I6IFsyNSwgMjVdLCAvLyBwb2ludCBvZiB0aGUgaWNvbiB3aGljaCB3aWxsIGNvcnJlc3BvbmQgdG8gbWFya2VyJ3MgbG9jYXRpb24gXG4gICAgICAgICAgICBwb3B1cEFuY2hvcjogWy0yNSwgLTUwXSAvLyBwb2ludCBmcm9tIHdoaWNoIHRoZSBwb3B1cCBzaG91bGQgb3BlbiByZWxhdGl2ZSB0byB0aGUgaWNvbkFuY2hvclxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQHBhcmFtIGRlY2ltYWwgbGF0IFxuICAgICAqIEBwYXJhbSBkZWNpbWFsIGxuZyBcbiAgICAgKi8gXG4gICAgY2VudGVyTWFwKGxhdCwgbG5nKXtcbiAgICAgICAgbGV0IGxhdGxuZyA9IEwubGF0TG5nKGxhdCwgbG5nKTsgIFxuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBpZiB0aGUgc2NyaXB0IGhhcyBub3QgYmVlbiBsb2FkZWQgLCBsb2FkIGl0LiBcbiAgICAgKiBXZSB1c2UgdGhpcyBmdW5jdGlvbiBiZWNhdXNlIHdlIG9ubHkgd2FudCB0byBsb2FkIHRoZSBzY3JpcHQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGJ1dHRvbiBcbiAgICAgKi9cbiAgICBncmFudFJlYWR5KCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTY3JpcHRMb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZFNjcmlwdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgLyoqIFxuICAgKiBAcGFyYW0gZl9jYWxsYmFjayB3aGF0IGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgcmVxdWVzdCByZXNvbHZlcyBcbiAgICogQHBhcmFtIGNpdHkgLSBjaXR5IG5hbWUgXG4gICAqIEBwYXJhbSBjb3VudHJ5IC0gY291bnRyeSBpbiBpc28yIHVwcGVyY2FzZSBcbiAgICogQHBhcmFtIHBvc3RhbGNvZGUgLSB0aGUgcG9zdGFsIGNvZGUgXG4gICAqIEBwYXJhbSBzdHJlZXRuYW1lIC0gdGhlIHN0cmVldG5hbWUgXG4gICAqL1xuICBnZW9jb2RlQWRkcmVzcyhmX2NhbGxiYWNrLCBjaXR5LCBjb3VudHJ5LCBwb3N0YWxjb2RlLCBzdHJlZXRuYW1lKSB7XG4gICAgdmFyIHF1ZXJ5U3RyaW5nID0gXCJodHRwczovL25vbWluYXRpbS5vcGVuc3RyZWV0bWFwLm9yZy9zZWFyY2g/Zm9ybWF0PWpzb24mYWRkcmVzc2RldGFpbHM9MVwiICtcbiAgICAgIFwiJmNpdHk9XCIgKyBjaXR5ICtcbiAgICAgIFwiJmNvdW50cnk9XCIgKyBjb3VudHJ5O1xuXG4gICAgaWYgKHR5cGVvZiAocG9zdGFsY29kZSkgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChjb3VudHJ5ID09ICdQVCcgfHwgY291bnRyeSA9PSAnUG9ydHVnYWwnKSB7XG4gICAgICAgIHBvc3RhbGNvZGUgPSBwb3N0YWxjb2RlLnN1YnN0cigwLCA0KTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5U3RyaW5nICs9IFwiJnBvc3RhbGNvZGU9XCIgKyBwb3N0YWxjb2RlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgKHN0cmVldG5hbWUpICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICBxdWVyeVN0cmluZyArPSBcIiZzdHJlZXQ9XCIgKyBzdHJlZXRuYW1lO1xuICAgIH1cblxuICAgIGpRdWVyeS5nZXRKU09OKHF1ZXJ5U3RyaW5nLCB7fSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICBsZXQgZ2VvY29kZSA9IHtcbiAgICAgICAgJ2lzbzInOiAnJyxcbiAgICAgICAgJ2xhdCc6ICcnLFxuICAgICAgICAnbG5nJzogJydcbiAgICAgIH07XG5cbiAgICAgIGlmIChyZXNwb25zZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBsb2NhdGlvbiA9IHJlc3BvbnNlWzBdO1xuXG4gICAgICAgIGdlb2NvZGUuaXNvMiA9IGxvY2F0aW9uLmFkZHJlc3MuY291bnRyeV9jb2RlO1xuXG4gICAgICAgIGdlb2NvZGUubGF0ID0gbG9jYXRpb24ubGF0O1xuICAgICAgICBnZW9jb2RlLmxuZyA9IGxvY2F0aW9uLmxvbjtcbiAgICAgIH1cbiAgICAgIGZfY2FsbGJhY2soZ2VvY29kZSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogIFxuICAgKiBAcGFyYW0gc2hpcHBpbmdEYXRhLCB0aGUgYWRkcmVzcyBwYXJ0cyAgICAgICBcbiAgICogQHBhcmFtIGZfY2FsbGJhY2sgLCB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFsbCBtaWdodHkgZ29vZ2xlIHJldHVybnMgYSByZXN1bHQgXG4gICAqL1xuICBnZW9jb2RlKHNoaXBwaW5nRGF0YSwgZl9jYWxsYmFjaykge1xuICAgIGNvbnNvbGUubG9nKHNoaXBwaW5nRGF0YSk7XG4gICAgdGhpcy5ncmFudFJlYWR5KCk7XG5cbiAgICB0aGlzLmdlb2NvZGVBZGRyZXNzKChnZW9jb2RlKSA9PiB7XG4gICAgICBpZiAoIWdlb2NvZGUubGF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb2NvZGVBZGRyZXNzKGZ1bmN0aW9uIChnZW9jb2RlKSB7XG4gICAgICAgICAgZl9jYWxsYmFjayhnZW9jb2RlKTtcbiAgICAgICAgfSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ2l0eSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ291bnRyeSk7XG4gICAgICB9XG5cbiAgICAgIGZfY2FsbGJhY2soZ2VvY29kZSk7XG4gICAgfSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ2l0eSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuQ291bnRyeSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuUG9zdGFsQ29kZSwgc2hpcHBpbmdEYXRhLkFkZHJlc3MuU3RyZWV0bmFtZTEpO1xuICB9XG4gICAgbG9hZFNjcmlwdCgpIHtcbiAgICAgICAgVXRpbHMuaW5qZWN0RXh0ZXJuYWxTY3JpcHQoU0hJUFRJTUlaRV9QTFVHSU5fVVJMICsgXCJhc3NldHMvanMvbGVhZmxldC0xLjQuMC5qc1wiKTtcbiAgICAgICAgdGhpcy5pc1NjcmlwdExvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZE1hcCgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIExlYWZsZXQgZG9lcyBub3QgcmVjZWl2ZSBhIGNhbGxiYWNrIHNvIHdlIHdhaXQgaGVyZSBmb3IgdGhlIHNjcmlwdCB0byBiZSBsb2FkZWQgXG4gICAgICovXG4gICAgbG9hZE1hcCgpIHtcbiAgICAgICAgaWYgKHR5cGVvZihMKSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMubG9hZE1hcCgpOyB9LCAyMDApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pY29uX3NlbGVjdGVkID0gdGhpcy5jcmVhdGVJY29uKHNoaXB0aW1pemVfaWNvbl9mb2xkZXIgKyAnc2VsZWN0ZWQucG5nJyk7XG4gICAgICAgIHRoaXMuaWNvbl9kZWZhdWx0ID0gdGhpcy5jcmVhdGVJY29uKHNoaXB0aW1pemVfaWNvbl9mb2xkZXIgKyAnZGVmYXVsdC5wbmcnKTtcbiAgICAgICAgdGhpcy5jdXJyZW50X2ljb24gPSB0aGlzLmljb25fZGVmYXVsdDtcblxuICAgICAgICB0aGlzLm1hcCA9IG5ldyBMLm1hcChqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX21hcFwiKS5nZXQoMCksIHtcbiAgICAgICAgICAgIFwiem9vbVwiOiAxNixcbiAgICAgICAgICAgIFwiY2VudGVyXCI6IFs1MS41MDUsIC0wLjA5XVxuICAgICAgICB9KTtcblxuICAgICAgICBMLnRpbGVMYXllcignaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLCB7XG4gICAgICAgICAgICBcImF0dHJpYnV0aW9uXCI6ICcmY29weTsgPGEgaHJlZj1cImh0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiPk9wZW5TdHJlZXRNYXA8L2E+IGNvbnRyaWJ1dG9ycydcbiAgICAgICAgfSkuYWRkVG8odGhpcy5tYXApO1xuICAgIH1cblxuICAgIGNsZWFyTWFya2VycygpIHtcbiAgICAgICAgaWYgKHRoaXMubWFya2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFwLnJlbW92ZUxheWVyKHRoaXMubWFya2Vyc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrZXJzID0gW107XG4gICAgfVxuXG5cbiAgICAvKiogXG4gICAgICogQWRkIHRoZSBtYXJrZXJzIHRvIG1hcCBcbiAgICAgKiBAcGFyYW0gYXJyYXkgcGlja3VwUG9pbnRzIC0gYW4gYXJyYXkgb2YgcGlja3VwUG9pbnRzXG4gICAgICogQHBhcmFtIGZ1bmN0aW9uIGNhbGxiYWNrIFxuICAgICAqL1xuICAgIGFkZE1hcmtlcnMocGlja3VwUG9pbnRzLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLnBpY2t1cFBvaW50cyA9IHBpY2t1cFBvaW50czsgXG5cbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBwaWNrdXBQb2ludHMubGVuZ3RoOyArK3gpIHtcbiAgICAgICAgICAgIHRoaXMubWFya2Vyc1t4XSA9IHRoaXMuZ2V0TWFya2VyKHBpY2t1cFBvaW50c1t4XSk7XG4gICAgICAgICAgICAvLyAgICB3ZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSB0aGUgdmFsdWVzIGZvciBsYXQsbG5nIHdlIGhhdmUgYXJlIHJvdW5kZWQsIHNvIHRoZXkgd2lsbCBub3QgbWF0Y2ggdGhlIG9uZXMgcmV0dXJuZWQgYnkgZ29vZ2xlXG4gICAgICAgICAgICB0aGlzLnBpY2t1cFBvaW50c1t4XS5tYXJrZXIgPSB0aGlzLm1hcmtlcnNbeF07XG5cbiAgICAgICAgICAgIHRoaXMubWFya2Vyc1t4XS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYodHlwZW9mKGNhbGxiYWNrKSA9PSAnZnVuY3Rpb24nKXtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpdEJvdW5kcygpO1xuICAgIH1cblxuICAgIHJlc2V0TWFya2VyKG1hcmtlcikge1xuICAgICAgICBtYXJrZXIuc2V0SWNvbih0aGlzLmljb25fZGVmYXVsdCk7XG4gICAgfVxuXG4gICAgc2VsZWN0TWFya2VyKG1hcmtlcikge1xuICAgICAgICBtYXJrZXIuc2V0SWNvbih0aGlzLmljb25fc2VsZWN0ZWQpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBBZGp1c3QgdGhlIHpvb20gaW4gdGhlIG1hcCB0byBkaXNwbGF5IGFsbCB0aGUgbWFya2VycyBcbiAgICAgKiBUaGVyZSdzIGEgZml0IGJvdW5kcyB0aGF0IHJlY2VpdmVzIDIgY29ybmVycywgYnV0IGNhbGN1bGF0aW5nIHRoZW0gaXMgdXAgdG8gdXMuIFxuICAgICAqIGNvcm5lcnM6IHRvcCBsZWZ0LCBib3R0b20gcmlnaHQgICAgIFxuICAgICAqIHRoZW4gd2UgY2VudGVyIHRoZSBtYXAgYXQgdGhlIGNlbnRlciBvZiB0aGUgc3F1YXJlICBcbiAgICAgKi9cbiAgICBmaXRCb3VuZHMoKSB7XG4gICAgICAgIGxldCBib3R0b21MZWZ0ID0gW3RoaXMucGlja3VwUG9pbnRzWzBdLkxhdCwgdGhpcy5waWNrdXBQb2ludHNbMF0uTG9uZ107XG4gICAgICAgIGxldCB0b3BSaWdodCA9IFt0aGlzLnBpY2t1cFBvaW50c1swXS5MYXQsIHRoaXMucGlja3VwUG9pbnRzWzBdLkxvbmddO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5waWNrdXBQb2ludHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBsYXQgPSB0aGlzLnBpY2t1cFBvaW50c1tpXS5MYXQ7XG4gICAgICAgICAgICBsZXQgbG5nID0gdGhpcy5waWNrdXBQb2ludHNbaV0uTG9uZztcblxuICAgICAgICAgICAgaWYgKGxhdCA8IGJvdHRvbUxlZnRbMF0pIHtcbiAgICAgICAgICAgICAgICBib3R0b21MZWZ0WzBdID0gbGF0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGF0ID4gdG9wUmlnaHRbMF0pIHtcbiAgICAgICAgICAgICAgICB0b3BSaWdodFswXSA9IGxhdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxuZyA+IHRvcFJpZ2h0WzFdKSB7XG4gICAgICAgICAgICAgICAgdG9wUmlnaHRbMV0gPSBsbmc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsbmcgPCBib3R0b21MZWZ0WzFdKSB7XG4gICAgICAgICAgICAgICAgYm90dG9tTGVmdFsxXSA9IGxuZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IGNlbnRlclggPSBwYXJzZUZsb2F0KGJvdHRvbUxlZnRbMF0pICsgKHBhcnNlRmxvYXQodG9wUmlnaHRbMF0pIC0gcGFyc2VGbG9hdChib3R0b21MZWZ0WzBdKSkgLyAyO1xuICAgICAgICBsZXQgY2VudGVyWSA9IHBhcnNlRmxvYXQoYm90dG9tTGVmdFsxXSkgKyAocGFyc2VGbG9hdCh0b3BSaWdodFsxXSkgLSBwYXJzZUZsb2F0KGJvdHRvbUxlZnRbMV0pKSAvIDI7XG5cbiAgICAgICAgdGhpcy5tYXAucGFuVG8oW2NlbnRlclgsIGNlbnRlclldKTtcblxuICAgICAgICB0aGlzLm1hcC5maXRCb3VuZHMoW1xuICAgICAgICAgICAgYm90dG9tTGVmdCxcbiAgICAgICAgICAgIHRvcFJpZ2h0XG4gICAgICAgIF0pO1xuXG4gICAgICAgIHNldFRpbWVvdXQoICgpID0+IHsgdGhpcy5tYXAuaW52YWxpZGF0ZVNpemUoKX0sIDIwMCk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFJldHVybiBhIG1hcmtlciBmb3IgdGhlIG9wZW5MYXllcnMgXG4gICAgICogSWNvbkFuY2hvcjogVGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBcInRpcFwiIG9mIHRoZSBpY29uIChyZWxhdGl2ZSB0byBpdHMgdG9wIGxlZnQgY29ybmVyKS4gXG4gICAgICogVGhlIGljb24gd2lsbCBiZSBhbGlnbmVkIHNvIHRoYXQgdGhpcyBwb2ludCBpcyBhdCB0aGUgbWFya2VyJ3MgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uLiBcbiAgICAgKiBDZW50ZXJlZCBieSBkZWZhdWx0IGlmIHNpemUgaXMgc3BlY2lmaWVkLCBhbHNvIGNhbiBiZSBzZXQgaW4gQ1NTIHdpdGggbmVnYXRpdmUgbWFyZ2lucy5cbiAgICAgKi9cbiAgICBnZXRNYXJrZXIocGlja3VwUG9pbnQpIHtcbiAgICAgICAgbGV0IG1hcmtlciA9IEwubWFya2VyKFtwaWNrdXBQb2ludC5MYXQsIHBpY2t1cFBvaW50LkxvbmddLCB7XG4gICAgICAgICAgICBcImljb25cIjogdGhpcy5jdXJyZW50X2ljb24sXG4gICAgICAgICAgICBcInRpdGxlXCI6IHBpY2t1cFBvaW50LkluZm9ybWF0aW9uLk5hbWUgKyBcIlxcblwiICsgcGlja3VwUG9pbnQuSW5mb3JtYXRpb24uQWRkcmVzc1xuICAgICAgICB9KTtcbiAgICAgICAgbWFya2VyLmFkZFRvKHRoaXMubWFwKTtcbiAgICAgICAgcmV0dXJuIG1hcmtlcjtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQ2hlY2tzIGlmIHdlIGhhdmUgYW4gaWNvbiBmb3IgdGhpcyBjYXJyaWVyLlxuICAgICAqIElmIHllcyB0aGVuIGNoYW5nZSB0aGUgY2FycmllciBpY29uXG4gICAgICogSWYgbm90IHRoZW4gdXNlIHRoZSBkZWZhdWx0IGljb25cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gaW50IGNhcnJpZXJfaWQgLSB0aGUgY2FycmllciBpZCBcbiAgICAgKi9cbiAgICBzZXRDYXJyaWVySWNvbihjYXJyaWVyX2lkKSB7XG4gICAgICAgIGlmICh0eXBlb2YoTCkgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLnNldENhcnJpZXJJY29uKGNhcnJpZXJfaWQpOyB9LCAyMDApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjYXJyaWVyX2ljb25fdXJsID0gdGhpcy5pY29uX2ZvbGRlciArICcnICsgY2Fycmllcl9pZCArICcucG5nJztcbiAgICAgICAgLy90aGlzLmN1cnJlbnRfaWNvbiA9IFV0aWxzLmlzVXJsVmFsaWQoY2Fycmllcl9pY29uX3VybCkgPyB0aGlzLmNyZWF0ZUljb24oY2Fycmllcl9pY29uX3VybCkgOiB0aGlzLmljb25fZGVmYXVsdDtcbiAgICAgICAgdGhpcy5jdXJyZW50X2ljb24gPSB0aGlzLmNyZWF0ZUljb24oY2Fycmllcl9pY29uX3VybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXQgYWxsIG1hcmtlcnMgIFxuICAgICAqIFNlbGVjdCB0aGUgbWFya2VyIG9mIGluZGV4IGlkeCBpbiBtYXAgXG4gICAgICogQHBhcmFtIGludCBpZHggLSB0aGUgaW5kZXggdG8gc2VsZWN0IFxuICAgICAqL1xuICAgIHNlbGVjdE1hcmtlckJ5SWR4KGlkeCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdGhpcy5tYXJrZXJzW2ldLnNldEljb24oXG4gICAgICAgICAgICAgICAgaWR4ID09IGkgP1xuICAgICAgICAgICAgICAgIHRoaXMuaWNvbl9zZWxlY3RlZCA6XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50X2ljb25cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./js/shiptimize-open-map.js\n"); 121 122 /***/ }), 123 124 /***/ "./js/shiptimize-utils.js": 125 /*!********************************!*\ 126 !*** ./js/shiptimize-utils.js ***! 127 \********************************/ 128 /*! no static exports found */ 129 /***/ (function(module, exports, __webpack_require__) { 130 131 "use strict"; 132 eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/** \n * Singleton object we can use for platform independent stuff \n */\nvar ShiptimizeUtils = function () {\n function ShiptimizeUtils() {\n _classCallCheck(this, ShiptimizeUtils);\n }\n\n /** \n * Inject Script into the page \n * @param string src \n */\n\n\n _createClass(ShiptimizeUtils, [{\n key: \"injectExternalScript\",\n value: function injectExternalScript(src) {\n var s = document.createElement(\"script\");\n s.setAttribute(\"src\", src);\n document.body.appendChild(s);\n }\n\n /** \n * Inject a script string \n */\n\n }, {\n key: \"injectScript\",\n value: function injectScript(contents) {\n var e = document.createElement(\"script\");\n e.value = contents;\n document.body.appendChild(e);\n }\n\n /** \n * Removes all not numeric chars from the string \n *\n * @param string string - the input string \n * @return the string without chars that are not numbers \n */\n\n }, {\n key: \"removeNonNumeric\",\n value: function removeNonNumeric(string) {\n return string.replace(/\\D/g, '');\n }\n\n /** \n * Check if the given url exists and is valid\n * We use this to check if the carrier icon exists given \n * a url path and the naming convention {carrier_id}.svg \n * Make sure the correct protocol is appended to the url http != https \n * \n * @return true it the url exists and is valid \n */\n\n }, {\n key: \"isUrlValid\",\n value: function isUrlValid(url) {\n var http = new XMLHttpRequest();\n http.open('HEAD', url, false);\n http.send();\n return http.status == 200;\n }\n\n /** \n * Open a new window with the provided URL \n * @string url \n * @return bool if the window was opened, false if popup blocker enabled \n */\n\n }, {\n key: \"openNewWindow\",\n value: function openNewWindow(url, options) {\n var newWin = window.open(url, '_blank', options);\n var blocked = !newWin || newWin.closed || typeof newWin.closed == 'undefined';\n\n return !blocked;\n }\n }]);\n\n return ShiptimizeUtils;\n}();\n\nvar utils = new ShiptimizeUtils();\nexports.default = utils;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXV0aWxzLmpzPzAwZDQiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZVV0aWxzIiwic3JjIiwicyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNvbnRlbnRzIiwiZSIsInZhbHVlIiwic3RyaW5nIiwicmVwbGFjZSIsInVybCIsImh0dHAiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJzZW5kIiwic3RhdHVzIiwib3B0aW9ucyIsIm5ld1dpbiIsIndpbmRvdyIsImJsb2NrZWQiLCJjbG9zZWQiLCJ1dGlscyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOzs7SUFHTUEsZTtBQUVGLDZCQUFjO0FBQUE7QUFFYjs7QUFHRDs7Ozs7Ozs7eUNBSXFCQyxHLEVBQUs7QUFDdEIsVUFBSUMsSUFBSUMsU0FBU0MsYUFBVCxDQUF1QixRQUF2QixDQUFSO0FBQ0FGLFFBQUVHLFlBQUYsQ0FBZSxLQUFmLEVBQXNCSixHQUF0QjtBQUNBRSxlQUFTRyxJQUFULENBQWNDLFdBQWQsQ0FBMEJMLENBQTFCO0FBQ0g7O0FBR0Q7Ozs7OztpQ0FHYU0sUSxFQUFVO0FBQ25CLFVBQUlDLElBQUlOLFNBQVNDLGFBQVQsQ0FBdUIsUUFBdkIsQ0FBUjtBQUNBSyxRQUFFQyxLQUFGLEdBQVVGLFFBQVY7QUFDQUwsZUFBU0csSUFBVCxDQUFjQyxXQUFkLENBQTBCRSxDQUExQjtBQUNIOztBQUVEOzs7Ozs7Ozs7cUNBTWlCRSxNLEVBQVE7QUFDckIsYUFBT0EsT0FBT0MsT0FBUCxDQUFlLEtBQWYsRUFBc0IsRUFBdEIsQ0FBUDtBQUNIOztBQUVEOzs7Ozs7Ozs7OzsrQkFRV0MsRyxFQUFLO0FBQ1osVUFBSUMsT0FBTyxJQUFJQyxjQUFKLEVBQVg7QUFDQUQsV0FBS0UsSUFBTCxDQUFVLE1BQVYsRUFBa0JILEdBQWxCLEVBQXVCLEtBQXZCO0FBQ0FDLFdBQUtHLElBQUw7QUFDQSxhQUFPSCxLQUFLSSxNQUFMLElBQWUsR0FBdEI7QUFDSDs7QUFFRDs7Ozs7Ozs7a0NBS2NMLEcsRUFBS00sTyxFQUFRO0FBQ3ZCLFVBQUlDLFNBQVNDLE9BQU9MLElBQVAsQ0FBWUgsR0FBWixFQUFpQixRQUFqQixFQUEyQk0sT0FBM0IsQ0FBYjtBQUNBLFVBQUlHLFVBQVUsQ0FBQ0YsTUFBRCxJQUFXQSxPQUFPRyxNQUFsQixJQUE0QixPQUFPSCxPQUFPRyxNQUFkLElBQXNCLFdBQWhFOztBQUVBLGFBQU8sQ0FBQ0QsT0FBUjtBQUNIOzs7Ozs7QUFJTCxJQUFJRSxRQUFRLElBQUl4QixlQUFKLEVBQVo7a0JBQ2V3QixLIiwiZmlsZSI6Ii4vanMvc2hpcHRpbWl6ZS11dGlscy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBcbiAqIFNpbmdsZXRvbiBvYmplY3Qgd2UgY2FuIHVzZSBmb3IgcGxhdGZvcm0gaW5kZXBlbmRlbnQgc3R1ZmYgXG4gKi9cbmNsYXNzIFNoaXB0aW1pemVVdGlscyB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcblxuICAgIH1cblxuXG4gICAgLyoqIFxuICAgICAqIEluamVjdCBTY3JpcHQgaW50byB0aGUgcGFnZSBcbiAgICAgKiBAcGFyYW0gc3RyaW5nIHNyYyBcbiAgICAgKi9cbiAgICBpbmplY3RFeHRlcm5hbFNjcmlwdChzcmMpIHtcbiAgICAgICAgbGV0IHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICBzLnNldEF0dHJpYnV0ZShcInNyY1wiLCBzcmMpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHMpO1xuICAgIH1cblxuXG4gICAgLyoqIFxuICAgICAqIEluamVjdCBhIHNjcmlwdCBzdHJpbmcgXG4gICAgICovXG4gICAgaW5qZWN0U2NyaXB0KGNvbnRlbnRzKSB7XG4gICAgICAgIGxldCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgZS52YWx1ZSA9IGNvbnRlbnRzO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBSZW1vdmVzIGFsbCBub3QgbnVtZXJpYyBjaGFycyBmcm9tIHRoZSBzdHJpbmcgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RyaW5nIHN0cmluZyAtIHRoZSBpbnB1dCBzdHJpbmcgXG4gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHdpdGhvdXQgY2hhcnMgdGhhdCBhcmUgbm90IG51bWJlcnMgXG4gICAgICovXG4gICAgcmVtb3ZlTm9uTnVtZXJpYyhzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gdXJsIGV4aXN0cyBhbmQgaXMgdmFsaWRcbiAgICAgKiBXZSB1c2UgdGhpcyB0byBjaGVjayBpZiB0aGUgY2FycmllciBpY29uIGV4aXN0cyBnaXZlbiBcbiAgICAgKiBhIHVybCBwYXRoIGFuZCB0aGUgbmFtaW5nIGNvbnZlbnRpb24ge2NhcnJpZXJfaWR9LnN2ZyBcbiAgICAgKiBNYWtlIHN1cmUgdGhlIGNvcnJlY3QgcHJvdG9jb2wgaXMgYXBwZW5kZWQgdG8gdGhlIHVybCBodHRwICE9IGh0dHBzIFxuICAgICAqIFxuICAgICAqIEByZXR1cm4gdHJ1ZSBpdCB0aGUgdXJsIGV4aXN0cyBhbmQgaXMgdmFsaWQgXG4gICAgICovIFxuICAgIGlzVXJsVmFsaWQodXJsKSB7XG4gICAgICAgIHZhciBodHRwID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIGh0dHAub3BlbignSEVBRCcsIHVybCwgZmFsc2UpO1xuICAgICAgICBodHRwLnNlbmQoKTtcbiAgICAgICAgcmV0dXJuIGh0dHAuc3RhdHVzID09IDIwMDtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogT3BlbiBhIG5ldyB3aW5kb3cgd2l0aCB0aGUgcHJvdmlkZWQgVVJMIFxuICAgICAqIEBzdHJpbmcgdXJsIFxuICAgICAqIEByZXR1cm4gYm9vbCBpZiB0aGUgd2luZG93IHdhcyBvcGVuZWQsIGZhbHNlIGlmIHBvcHVwIGJsb2NrZXIgZW5hYmxlZCBcbiAgICAgKi8gIFxuICAgIG9wZW5OZXdXaW5kb3codXJsLCBvcHRpb25zKXtcbiAgICAgICAgbGV0IG5ld1dpbiA9IHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycsIG9wdGlvbnMpOyBcbiAgICAgICAgbGV0IGJsb2NrZWQgPSAhbmV3V2luIHx8IG5ld1dpbi5jbG9zZWQgfHwgdHlwZW9mIG5ld1dpbi5jbG9zZWQ9PSd1bmRlZmluZWQnOyBcblxuICAgICAgICByZXR1cm4gIWJsb2NrZWQ7IFxuICAgIH1cbn1cblxuXG5sZXQgdXRpbHMgPSBuZXcgU2hpcHRpbWl6ZVV0aWxzKCk7XG5leHBvcnQgZGVmYXVsdCB1dGlsczsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./js/shiptimize-utils.js\n"); 133 134 /***/ }), 135 136 /***/ "./js/shiptimize-woo-commerce.js": 137 /*!***************************************!*\ 138 !*** ./js/shiptimize-woo-commerce.js ***! 139 \***************************************/ 140 /*! no static exports found */ 141 /***/ (function(module, exports, __webpack_require__) { 142 143 "use strict"; 144 eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _shiptimizeUtils = __webpack_require__(/*! ./shiptimize-utils.js */ \"./js/shiptimize-utils.js\");\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Woocommerce = function () {\n function Woocommerce(ajax_url) {\n _classCallCheck(this, Woocommerce);\n\n this.ajax_url = ajax_url;\n }\n\n /** \n * @return true if this is the checkout page \n */\n\n\n _createClass(Woocommerce, [{\n key: 'isCheckout',\n value: function isCheckout() {\n return jQuery(\"body\").hasClass('woocommerce-checkout');\n }\n\n /* \n * If there is only one method available woo will use a hidden field for the selected carrier \n * + Generic Methods do not have an instance id \n */\n\n }, {\n key: 'getShippingMethodId',\n value: function getShippingMethodId() {\n\n var eCheckbox = jQuery(\"input[name='shipping_method[0]']:checked\");\n var eHidden = jQuery(\"input[name='shipping_method[0]']\");\n\n var shippingMethod = eCheckbox.length > 0 ? eCheckbox.val() : eHidden.val();\n\n if (shippingMethod.indexOf(':') > 0) {\n var method_parts = shippingMethod.split(':');\n return _shiptimizeUtils2.default.removeNonNumeric(method_parts[0]);\n } else {\n return shippingMethod;\n }\n }\n\n /** \n * Wordpress won't send session cookies to wp-admin and the session handling in woocommerce is so poorly documented we are better off \n * extracting necessary info client side our selves. We're emulating their checkout.js \n * @return an object containing address parts \n */\n\n }, {\n key: 'getShippingData',\n value: function getShippingData() {\n\n var country = jQuery('#billing_country').val(),\n state = jQuery('#billing_state').val(),\n postcode = jQuery('input#billing_postcode').val(),\n city = jQuery('#billing_city').val(),\n address = jQuery('input#billing_address_1').val(),\n address_2 = jQuery('input#billing_address_2').val(),\n s_country = country,\n s_state = state,\n s_postcode = postcode,\n s_city = city,\n s_address = address,\n s_address_2 = address_2;\n\n if (jQuery('#ship-to-different-address').find('input').is(':checked')) {\n s_country = jQuery('#shipping_country').val();\n s_state = jQuery('#shipping_state').val();\n s_postcode = jQuery('input#shipping_postcode').val();\n s_city = jQuery('#shipping_city').val();\n s_address = jQuery('input#shipping_address_1').val();\n s_address_2 = jQuery('input#shipping_address_2').val();\n }\n\n return {\n \"Address\": {\n \"Lat\": \"\",\n \"Long\": \"\",\n \"Streetname1\": s_address,\n \"Streetname2\": s_address_2,\n \"HouseNumber\": '',\n \"NumberExtension\": '',\n \"PostalCode\": s_postcode,\n \"s_postcode\": s_postcode,\n \"City\": s_city,\n \"Country\": s_country,\n \"State\": s_state\n\n },\n post_data: jQuery('form.checkout').serialize(),\n \"CarrierId\": this.carrier_id\n };\n }\n\n /** \n * We must run this onload \n * And on method change \n * because people may never change the carrier or select a pickup point \n */\n\n }, {\n key: 'setCarrier',\n value: function setCarrier(carrier_id) {\n this.carrier_id = typeof carrier_id != 'undefined' ? carrier_id : this.getShippingMethodId();\n jQuery(\"#shipping_carrier_id\").val(this.carrier_id);\n }\n\n /** \n * @param Pickup pickup \n */\n\n }, {\n key: 'setPickupPoint',\n value: function setPickupPoint(pickup) {\n var pickup_label = pickup.Information.Name + \" \" + pickup.Information.Address;\n\n jQuery(\".shiptimize-pickup__description\").html(shiptimize_selected_pickup + \" : \" + pickup_label);\n jQuery(\"#shipping_pickup_id\").val(pickup.PointId);\n jQuery(\"#shipping_pickup_label\").val(pickup_label);\n\n jQuery(\"#shiptimizepickup\").val(pickup.PointId);\n }\n }]);\n\n return Woocommerce;\n}();\n\nexports.default = Woocommerce;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdvby1jb21tZXJjZS5qcz8yY2Y5Il0sIm5hbWVzIjpbIldvb2NvbW1lcmNlIiwiYWpheF91cmwiLCJqUXVlcnkiLCJoYXNDbGFzcyIsImVDaGVja2JveCIsImVIaWRkZW4iLCJzaGlwcGluZ01ldGhvZCIsImxlbmd0aCIsInZhbCIsImluZGV4T2YiLCJtZXRob2RfcGFydHMiLCJzcGxpdCIsIlV0aWxzIiwicmVtb3ZlTm9uTnVtZXJpYyIsImNvdW50cnkiLCJzdGF0ZSIsInBvc3Rjb2RlIiwiY2l0eSIsImFkZHJlc3MiLCJhZGRyZXNzXzIiLCJzX2NvdW50cnkiLCJzX3N0YXRlIiwic19wb3N0Y29kZSIsInNfY2l0eSIsInNfYWRkcmVzcyIsInNfYWRkcmVzc18yIiwiZmluZCIsImlzIiwicG9zdF9kYXRhIiwic2VyaWFsaXplIiwiY2Fycmllcl9pZCIsImdldFNoaXBwaW5nTWV0aG9kSWQiLCJwaWNrdXAiLCJwaWNrdXBfbGFiZWwiLCJJbmZvcm1hdGlvbiIsIk5hbWUiLCJBZGRyZXNzIiwiaHRtbCIsInNoaXB0aW1pemVfc2VsZWN0ZWRfcGlja3VwIiwiUG9pbnRJZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7SUFFcUJBLFc7QUFFakIseUJBQVlDLFFBQVosRUFBc0I7QUFBQTs7QUFDbEIsYUFBS0EsUUFBTCxHQUFnQkEsUUFBaEI7QUFDSDs7QUFFRDs7Ozs7OztxQ0FHYTtBQUNULG1CQUFPQyxPQUFPLE1BQVAsRUFBZUMsUUFBZixDQUF3QixzQkFBeEIsQ0FBUDtBQUNIOztBQUVEOzs7Ozs7OzhDQUlxQjs7QUFFakIsZ0JBQUlDLFlBQVlGLE9BQU8sMENBQVAsQ0FBaEI7QUFDQSxnQkFBSUcsVUFBVUgsT0FBTyxrQ0FBUCxDQUFkOztBQUVBLGdCQUFJSSxpQkFBa0JGLFVBQVVHLE1BQVYsR0FBbUIsQ0FBbkIsR0FBdUJILFVBQVVJLEdBQVYsRUFBdkIsR0FBeUNILFFBQVFHLEdBQVIs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Ozs7a0JBMUdnQnZDLFciLCJmaWxlIjoiLi9qcy9zaGlwdGltaXplLXdvby1jb21tZXJjZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBVdGlscyBmcm9tICcuL3NoaXB0aW1pemUtdXRpbHMuanMnOyBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV29vY29tbWVyY2Uge1xuXG4gICAgY29uc3RydWN0b3IoYWpheF91cmwpIHtcbiAgICAgICAgdGhpcy5hamF4X3VybCA9IGFqYXhfdXJsO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgY2hlY2tvdXQgcGFnZSBcbiAgICAgKi9cbiAgICBpc0NoZWNrb3V0KCkge1xuICAgICAgICByZXR1cm4galF1ZXJ5KFwiYm9keVwiKS5oYXNDbGFzcygnd29vY29tbWVyY2UtY2hlY2tvdXQnKTtcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiBJZiB0aGVyZSBpcyBvbmx5IG9uZSBtZXRob2QgYXZhaWxhYmxlIHdvbyB3aWxsIHVzZSBhIGhpZGRlbiBmaWVsZCBmb3IgdGhlIHNlbGVjdGVkIGNhcnJpZXIgXG4gICAgICogICsgR2VuZXJpYyBNZXRob2RzIGRvIG5vdCBoYXZlIGFuIGluc3RhbmNlIGlkIFxuICAgICAqLyBcbiAgICBnZXRTaGlwcGluZ01ldGhvZElkKCl7XG5cbiAgICAgICAgbGV0IGVDaGVja2JveCA9IGpRdWVyeShcImlucHV0W25hbWU9J3NoaXBwaW5nX21ldGhvZFswXSddOmNoZWNrZWRcIik7IFxuICAgICAgICBsZXQgZUhpZGRlbiA9IGpRdWVyeShcImlucHV0W25hbWU9J3NoaXBwaW5nX21ldGhvZFswXSddXCIpOyBcblxuICAgICAgICBsZXQgc2hpcHBpbmdNZXRob2QgPSAgZUNoZWNrYm94Lmxlbmd0aCA+IDAgPyBlQ2hlY2tib3gudmFsKCkgOiBlSGlkZGVuLnZhbCgpIDsgXG5cbiAgICAgICAgaWYgKCBzaGlwcGluZ01ldGhvZC5pbmRleE9mKCc6JykgPiAwICl7XG4gICAgICAgICAgICB2YXIgbWV0aG9kX3BhcnRzID0gc2hpcHBpbmdNZXRob2Quc3BsaXQoJzonKTtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5yZW1vdmVOb25OdW1lcmljKG1ldGhvZF9wYXJ0c1swXSk7ICAgICBcbiAgICAgICAgfVxuICAgICAgICBlbHNlIFxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gc2hpcHBpbmdNZXRob2Q7XG4gICAgICAgIH0gXG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFdvcmRwcmVzcyB3b24ndCBzZW5kIHNlc3Npb24gY29va2llcyB0byB3cC1hZG1pbiBhbmQgdGhlIHNlc3Npb24gaGFuZGxpbmcgaW4gd29vY29tbWVyY2UgaXMgc28gcG9vcmx5IGRvY3VtZW50ZWQgd2UgYXJlIGJldHRlciBvZmYgXG4gICAgICogZXh0cmFjdGluZyBuZWNlc3NhcnkgaW5mbyBjbGllbnQgc2lkZSBvdXIgc2VsdmVzLiBXZSdyZSBlbXVsYXRpbmcgdGhlaXIgY2hlY2tvdXQuanMgXG4gICAgICogQHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBhZGRyZXNzIHBhcnRzIFxuICAgICAqL1xuICAgIGdldFNoaXBwaW5nRGF0YSgpIHtcblxuICAgICAgICB2YXIgY291bnRyeSA9IGpRdWVyeSgnI2JpbGxpbmdfY291bnRyeScpLnZhbCgpLFxuICAgICAgICAgICAgc3RhdGUgPSBqUXVlcnkoJyNiaWxsaW5nX3N0YXRlJykudmFsKCksXG4gICAgICAgICAgICBwb3N0Y29kZSA9IGpRdWVyeSgnaW5wdXQjYmlsbGluZ19wb3N0Y29kZScpLnZhbCgpLFxuICAgICAgICAgICAgY2l0eSA9IGpRdWVyeSgnI2JpbGxpbmdfY2l0eScpLnZhbCgpLFxuICAgICAgICAgICAgYWRkcmVzcyA9IGpRdWVyeSgnaW5wdXQjYmlsbGluZ19hZGRyZXNzXzEnKS52YWwoKSxcbiAgICAgICAgICAgIGFkZHJlc3NfMiA9IGpRdWVyeSgnaW5wdXQjYmlsbGluZ19hZGRyZXNzXzInKS52YWwoKSxcbiAgICAgICAgICAgIHNfY291bnRyeSA9IGNvdW50cnksXG4gICAgICAgICAgICBzX3N0YXRlID0gc3RhdGUsXG4gICAgICAgICAgICBzX3Bvc3Rjb2RlID0gcG9zdGNvZGUsXG4gICAgICAgICAgICBzX2NpdHkgPSBjaXR5LFxuICAgICAgICAgICAgc19hZGRyZXNzID0gYWRkcmVzcyxcbiAgICAgICAgICAgIHNfYWRkcmVzc18yID0gYWRkcmVzc18yO1xuXG5cbiAgICAgICAgaWYgKGpRdWVyeSgnI3NoaXAtdG8tZGlmZmVyZW50LWFkZHJlc3MnKS5maW5kKCdpbnB1dCcpLmlzKCc6Y2hlY2tlZCcpKSB7XG4gICAgICAgICAgICBzX2NvdW50cnkgPSBqUXVlcnkoJyNzaGlwcGluZ19jb3VudHJ5JykudmFsKCk7XG4gICAgICAgICAgICBzX3N0YXRlID0galF1ZXJ5KCcjc2hpcHBpbmdfc3RhdGUnKS52YWwoKTtcbiAgICAgICAgICAgIHNfcG9zdGNvZGUgPSBqUXVlcnkoJ2lucHV0I3NoaXBwaW5nX3Bvc3Rjb2RlJykudmFsKCk7XG4gICAgICAgICAgICBzX2NpdHkgPSBqUXVlcnkoJyNzaGlwcGluZ19jaXR5JykudmFsKCk7XG4gICAgICAgICAgICBzX2FkZHJlc3MgPSBqUXVlcnkoJ2lucHV0I3NoaXBwaW5nX2FkZHJlc3NfMScpLnZhbCgpO1xuICAgICAgICAgICAgc19hZGRyZXNzXzIgPSBqUXVlcnkoJ2lucHV0I3NoaXBwaW5nX2FkZHJlc3NfMicpLnZhbCgpO1xuICAgICAgICB9XG4gXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBcIkFkZHJlc3NcIjp7XG4gICAgICAgICAgICAgICAgXCJMYXRcIjogXCJcIixcbiAgICAgICAgICAgICAgICBcIkxvbmdcIjogXCJcIixcbiAgICAgICAgICAgICAgICBcIlN0cmVldG5hbWUxXCI6IHNfYWRkcmVzcyxcbiAgICAgICAgICAgICAgICBcIlN0cmVldG5hbWUyXCI6IHNfYWRkcmVzc18yLFxuICAgICAgICAgICAgICAgIFwiSG91c2VOdW1iZXJcIjogJycsXG4gICAgICAgICAgICAgICAgXCJOdW1iZXJFeHRlbnNpb25cIjogJycsXG4gICAgICAgICAgICAgICAgXCJQb3N0YWxDb2RlXCI6IHNfcG9zdGNvZGUsXG4gICAgICAgICAgICAgICAgXCJzX3Bvc3Rjb2RlXCI6IHNfcG9zdGNvZGUsXG4gICAgICAgICAgICAgICAgXCJDaXR5XCI6IHNfY2l0eSxcbiAgICAgICAgICAgICAgICBcIkNvdW50cnlcIjogc19jb3VudHJ5LFxuICAgICAgICAgICAgICAgIFwiU3RhdGVcIjogc19zdGF0ZSxcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvc3RfZGF0YTogalF1ZXJ5KCdmb3JtLmNoZWNrb3V0Jykuc2VyaWFsaXplKCksXG4gICAgICAgICAgICBcIkNhcnJpZXJJZFwiOiB0aGlzLmNhcnJpZXJfaWRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogV2UgbXVzdCBydW4gdGhpcyBvbmxvYWQgXG4gICAgICogQW5kIG9uIG1ldGhvZCBjaGFuZ2UgXG4gICAgICogYmVjYXVzZSBwZW9wbGUgbWF5IG5ldmVyIGNoYW5nZSB0aGUgY2FycmllciBvciBzZWxlY3QgYSBwaWNrdXAgcG9pbnQgXG4gICAgICovIFxuICAgIHNldENhcnJpZXIoY2Fycmllcl9pZCl7XG4gICAgICAgIHRoaXMuY2Fycmllcl9pZCA9IHR5cGVvZihjYXJyaWVyX2lkKSAhPSAndW5kZWZpbmVkJyA/IGNhcnJpZXJfaWQgOiB0aGlzLmdldFNoaXBwaW5nTWV0aG9kSWQoKTsgIFxuICAgICAgICBqUXVlcnkoXCIjc2hpcHBpbmdfY2Fycmllcl9pZFwiKS52YWwodGhpcy5jYXJyaWVyX2lkKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQHBhcmFtIFBpY2t1cCBwaWNrdXAgXG4gICAgICovXG4gICAgc2V0UGlja3VwUG9pbnQocGlja3VwKSB7XG4gICAgICAgIGxldCBwaWNrdXBfbGFiZWwgPSAgcGlja3VwLkluZm9ybWF0aW9uLk5hbWUgKyBcIiBcIiArIHBpY2t1cC5JbmZvcm1hdGlvbi5BZGRyZXNzOyBcblxuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX2Rlc2NyaXB0aW9uXCIpLmh0bWwoc2hpcHRpbWl6ZV9zZWxlY3RlZF9waWNrdXAgKyBcIiA6IFwiICtwaWNrdXBfbGFiZWwpO1xuICAgICAgICBqUXVlcnkoXCIjc2hpcHBpbmdfcGlja3VwX2lkXCIpLnZhbChwaWNrdXAuUG9pbnRJZCk7XG4gICAgICAgIGpRdWVyeShcIiNzaGlwcGluZ19waWNrdXBfbGFiZWxcIikudmFsKHBpY2t1cF9sYWJlbCk7IFxuXG4gICAgICAgIGpRdWVyeShcIiNzaGlwdGltaXplcGlja3VwXCIpLnZhbChwaWNrdXAuUG9pbnRJZCk7IFxuICAgICAgICBcbiAgICB9XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./js/shiptimize-woo-commerce.js\n"); 145 146 /***/ }), 147 148 /***/ "./scss/shiptimize.scss": 149 /*!******************************!*\ 150 !*** ./scss/shiptimize.scss ***! 151 \******************************/ 152 /*! no static exports found */ 153 /***/ (function(module, exports, __webpack_require__) { 154 155 eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zY3NzL3NoaXB0aW1pemUuc2Nzcz9lYzk3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6Ii4vc2Nzcy9zaGlwdGltaXplLnNjc3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./scss/shiptimize.scss\n"); 156 157 /***/ }), 158 159 /***/ "./shiptmize.js": 160 /*!**********************!*\ 161 !*** ./shiptmize.js ***! 162 \**********************/ 163 /*! no static exports found */ 164 /***/ (function(module, exports, __webpack_require__) { 165 166 "use strict"; 167 eval("\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n__webpack_require__(/*! ./scss/shiptimize.scss */ \"./scss/shiptimize.scss\");\n\n__webpack_require__(/*! ./css/leaflet.css */ \"./css/leaflet.css\");\n\nvar _shiptimizeUtils = __webpack_require__(/*! ./js/shiptimize-utils.js */ \"./js/shiptimize-utils.js\");\n\nvar _shiptimizeUtils2 = _interopRequireDefault(_shiptimizeUtils);\n\nvar _shiptimizeWooCommerce = __webpack_require__(/*! ./js/shiptimize-woo-commerce.js */ \"./js/shiptimize-woo-commerce.js\");\n\nvar _shiptimizeWooCommerce2 = _interopRequireDefault(_shiptimizeWooCommerce);\n\nvar _shiptimizeGmaps = __webpack_require__(/*! ./js/shiptimize-gmaps.js */ \"./js/shiptimize-gmaps.js\");\n\nvar _shiptimizeGmaps2 = _interopRequireDefault(_shiptimizeGmaps);\n\nvar _shiptimizeOpenMap = __webpack_require__(/*! ./js/shiptimize-open-map.js */ \"./js/shiptimize-open-map.js\");\n\nvar _shiptimizeOpenMap2 = _interopRequireDefault(_shiptimizeOpenMap);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/** \n * Class Shiptimize depends on jQuery. \n * Check if we are meant to append a map \n * \n * Platform dependent functions marked with * @platformDependent \n */\nvar Shiptimize = function () {\n function Shiptimize(ajax_url) {\n _classCallCheck(this, Shiptimize);\n\n this.markers = []; //pickup {lat, lng} \n this.isMapLoaded = false;\n this.gmaps_key = typeof shiptimize_maps_key == 'undefined' ? '' : shiptimize_maps_key;\n this.openMapMarkerIcons = {};\n this.ajax_url = ajax_url; // platform dependent \n\n this.platform = new _shiptimizeWooCommerce2.default(this.ajax_url);\n\n this.map = this.gmaps_key ? new _shiptimizeGmaps2.default(this.gmaps_key) : new _shiptimizeOpenMap2.default();\n this.platform.isCheckout();\n this.map.grantReady();\n }\n\n /** \n * Show the map to the user \n */\n\n\n _createClass(Shiptimize, [{\n key: 'showMap',\n value: function showMap() {\n this.userScroll = jQuery('html,body').scrollTop();\n jQuery('html,body').scrollTop(0);\n jQuery(\".shiptimize-pickup\").addClass(\"active\");\n }\n\n /** \n * Hide the map \n */\n\n }, {\n key: 'hideMap',\n value: function hideMap() {\n jQuery(\".shiptimize-pickup\").removeClass(\"active\");\n jQuery(\".shiptimize-pickup__error\").hide();\n jQuery('html,body').scrollTop(this.userScroll);\n }\n }, {\n key: 'clearMarkers',\n value: function clearMarkers() {\n this.map.clearMarkers();\n }\n\n /** \n * Generate the inputs for the user to append extra info if necessary \n * The id of these fields is in the format shiptimize_extra_{PointId}_{FieldId}\n */\n\n }, {\n key: 'getExtendedInfoHtml',\n value: function getExtendedInfoHtml(pickupPoint) {\n if (!pickupPoint.ExtendedInfo || typeof pickupPoint.ExtendedInfo.length == 'undefined') {\n return \"\";\n }\n\n var html = '';\n\n for (var x = 0; pickupPoint.ExtendedInfo && x < pickupPoint.ExtendedInfo.length; ++x) {\n var extraInfo = pickupPoint.ExtendedInfo[x];\n html += '<div class=\"shiptimize-pickup__extended\">' + '<label class=\"shiptimize-pickup__extended_label \">' + extraInfo.Tekst + '</label>' + '<input type=\"text\" name=\"shiptimize_pickup_extended_value\" value=\"\" id=\"shiptimize_extra_' + pickupPoint.PointId + '_' + extraInfo.FieldId + '\"/> ' + '<input type=\"hidden\" name=\"shiptimize_pickup_extended_id\" id=\"shiptimize_pickup\" value=\"' + extraInfo.FieldId + '\"/> ' + '</div>';\n }\n\n return html;\n }\n\n /**\n * Reset all markers \n * Select the marker of index idx in map \n */\n\n }, {\n key: 'selectPointFromListInMap',\n value: function selectPointFromListInMap(idx) {\n jQuery(\"input[name='shiptimize__point']\").prop('checked', false);\n this.map.selectMarkerByIdx(idx);\n\n jQuery(jQuery(\"input[name='shiptimize__point']\").get(idx)).prop('checked', true);\n }\n\n /** \n * When the user clicks the validate button \n */\n\n }, {\n key: 'selectFromList',\n value: function selectFromList() {\n var idx = jQuery(\"input[name='shiptimize__point']:checked\").val();\n var pickup = this.pickupPoints[idx];\n var extra = '';\n\n for (var i = 0; pickup.ExtendedInfo && i < pickup.ExtendedInfo.length; ++i) {\n extra += \"<br/>\" + pickup.ExtendedInfo[i].Tekst + ': ' + jQuery(\"#shiptimize_extra_\" + pickup.PointId + \"_\" + pickup.ExtendedInfo[i].FieldId).val();\n }\n\n jQuery(\".shiptimize-pickup__description\").html(shiptimize_selected_pickup + \" : \" + pickup.Information.Name + \" \" + pickup.Information.Address + \" \" + extra);\n\n this.platform.setPickupPoint(pickup);\n this.hideMap();\n }\n\n /** \n * Returns the distance between 2 (lat,lng) points in kms \n */\n\n }, {\n key: 'getDistance',\n value: function getDistance(latlng, latlng2) {\n\n var R = 6371e3; // metres\n var φ1 = latlng.lat().toRadians();\n var φ2 = latlng2.lng().toRadians();\n\n var Δφ = (latln2.lat() - latlng.lng()).toRadians();\n var Δλ = (latln2.lng() - latlng.lon()).toRadians();\n\n var a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n var d = Math.floor(R * c / 1000);\n }\n\n /** \n * Show the map and query the server for pickup locations near the shipping address provided by the client\n * center the map on the first point \n * remove old markers \n * add the new markers \n */\n\n }, {\n key: 'getPickupLocations',\n value: function getPickupLocations(evt) {\n var _this = this;\n\n if (!this.map || !this.map.isScriptLoaded) {\n console.log(\"map is not loaded ...\");\n return;\n }\n\n this.pickupPointsLoadStart();\n\n /** because some version of woo will trigger a call to checkout and finish the order **/\n evt.preventDefault();\n evt.stopPropagation();\n\n this.showMap();\n\n var data = this.platform.getShippingData();\n data.action = 'shiptimize_pickup_locations';\n\n this.map.setCarrierIcon(data.CarrierId);\n\n this.map.geocode(data, function (geocode) {\n _this.getPickupLocationsFromGeocodedAddr(geocode, data);\n });\n }\n }, {\n key: 'getPickupLocationsFromGeocodedAddr',\n value: function getPickupLocationsFromGeocodedAddr(geocode, data) {\n var _this2 = this;\n\n this.resetUI();\n\n if (!geocode.lng || !geocode.lat) {\n this.pickupPointsLoadStop();\n this.pickupError(shiptimize_geolocationfailed);\n return;\n }\n\n data.Address.Country = geocode.iso2;\n data.Address.Long = geocode.lng;\n data.Address.Lat = geocode.lat;\n\n console.log(data);\n console.log(geocode);\n\n jQuery.getJSON(this.ajax_url, data, function (pickupPoints) {\n // We have the points remove the loader \n _this2.pickupPointsLoadStop();\n\n if (pickupPoints.length == 0) {\n console.log(\"no pickup points found for this address \");\n return;\n }\n\n console.log(pickupPoints);\n if (pickupPoints.Error.Id == 0 && pickupPoints.Point.length > 0) {\n jQuery(\".shiptimize-pickup__options,.shiptimize-pickup__map\").show();\n _this2.setPickupLocations(pickupPoints.Point);\n } else {\n console.log(\"The api returned an error: \", pickupPoints.Error); //pickupPoints.Error.Info || \n _this2.pickupError(shiptimize_no_points_found);\n }\n }).fail(function (resp) {\n console.log(\"Error getting points, shiptimize api error? report to shiptimize. \", resp.responseText); //pickupPoints.Error.Info || \n _this2.pickupError(shiptimize_no_points_found);\n });\n }\n }, {\n key: 'resetUI',\n value: function resetUI() {\n jQuery(\".shiptimize-pickup__error\").hide();\n this.map.clearMarkers();\n }\n\n /** \n * @param string info - the message to display \n */\n\n }, {\n key: 'pickupError',\n value: function pickupError(info) {\n this.pickupPoints = [];\n\n var eError = jQuery(\".shiptimize-pickup__error\");\n eError.html(info);\n eError.show();\n\n jQuery(\".shiptimize-pickup__options,.shiptimize-pickup__map\").hide();\n }\n\n /** \n * Append the pickup Locations to the map\n * @param array pickupPoints - an array of available pickup points \n */\n\n }, {\n key: 'setPickupLocations',\n value: function setPickupLocations(pickupPoints) {\n var _this3 = this;\n\n jQuery(\".shiptimize-pickup__error\").hide();\n\n this.pickupPoints = pickupPoints;\n this.map.clearMarkers();\n this.map.centerMap(this.pickupPoints[0].Lat, this.pickupPoints[1].Long);\n this.map.addMarkers(pickupPoints, function (idx) {\n _this3.selectPointFromListInMap(idx);\n });\n this.setOptionsForAddress(pickupPoints);\n\n typeof this.map.map.invalidateSize != 'undefined' && this.map.map.invalidateSize();\n\n setTimeout(function () {\n _this3.map.fitBounds();\n }, 200);\n }\n\n /** \n * @param pickupPoints[] - [] of pickup points returned by the api \n */\n\n }, {\n key: 'setOptionsForAddress',\n value: function setOptionsForAddress(pickupPoints) {\n\n var html = '';\n for (var i = 0; i < pickupPoints.length; ++i) {\n html += '<div class=\"shiptimize-pickup__point\">' + '<input type=\"radio\" value=\"' + i + '\" name=\"shiptimize__point\" onclick=\"shiptimize.selectPointFromListInMap(' + i + ')\"/>' + '<span class=\"shiptimize-pickup__point_description\" onclick=\"shiptimize.selectPointFromListInMap(' + i + ')\">' + '<span>' + (pickupPoints[i].Information.Name ? pickupPoints[i].Information.Name + '<br/>' : '') + pickupPoints[i].Information.Address + '</span>' + this.getExtendedInfoHtml(pickupPoints[i]) + '</span>' + '</div>';\n }\n console.log(html);\n\n jQuery(\".shiptimize-pickup__other\").html(html);\n }\n }, {\n key: 'loadMap',\n value: function loadMap() {\n this.map.loadMap();\n }\n }, {\n key: 'pickupPointsLoadStart',\n value: function pickupPointsLoadStart() {\n jQuery(\".shiptimize-pickup__mapWrapper\").addClass('loading');\n }\n }, {\n key: 'pickupPointsLoadStop',\n value: function pickupPointsLoadStop() {\n jQuery(\".shiptimize-pickup__mapWrapper\").removeClass('loading');\n }\n }]);\n\n return Shiptimize;\n}();\n\njQuery(function () {\n if (typeof woocommerce_params != 'undefined') {\n window.shiptimize = new Shiptimize(woocommerce_params.ajax_url);\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zaGlwdG1pemUuanM/NjljNyJdLCJuYW1lcyI6WyJTaGlwdGltaXplIiwiYWpheF91cmwiLCJtYXJrZXJzIiwiaXNNYXBMb2FkZWQiLCJnbWFwc19rZXkiLCJzaGlwdGltaXplX21hcHNfa2V5Iiwib3Blbk1hcE1hcmtlckljb25zIiwicGxhdGZvcm0iLCJXb29Db21tZXJjZSIsIm1hcCIsIkdvb2dsZU1hcCIsIk9wZW5TdHJlZXRNYXAiLCJpc0NoZWNrb3V0IiwiZ3JhbnRSZWFkeSIsInVzZXJTY3JvbGwiLCJqUXVlcnkiLCJzY3JvbGxUb3AiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwiaGlkZSIsImNsZWFyTWFya2VycyIsInBpY2t1cFBvaW50IiwiRXh0ZW5kZWRJbmZvIiwibGVuZ3RoIiwiaHRtbCIsIngiLCJleHRyYUluZm8iLCJUZWtzdCIsIlBvaW50SWQiLCJGaWVsZElkIiwiaWR4IiwicHJvcCIsInNlbGVjdE1hcmtlckJ5SWR4IiwiZ2V0IiwidmFsIiwicGlja3VwIiwicGlja3VwUG9pbnRzIiwiZXh0cmEiLCJpIiwic2hpcHRpbWl6ZV9zZWxlY3RlZF9waWNrdXAiLCJJbmZvcm1hdGlvbiIsIk5hbWUiLCJBZGRyZXNzIiwic2V0UGlja3VwUG9pbnQiLCJoaWRlTWFwIiwibGF0bG5nIiwibGF0bG5nMiIsIlIiLCLPhjEiLCJsYXQiLCJ0b1JhZGlhbnMiLCLPhjIiLCJsbmciLCLOlM+GIiwibGF0bG4yIiwizpTOuyIsImxvbiIsImEiLCJNYXRoIiwic2luIiwiY29zIiwiYyIsImF0YW4yIiwic3FydCIsImQiLCJmbG9vciIsImV2dCIsImlzU2NyaXB0TG9hZGVkIiwiY29uc29sZSIsImxvZyIsInBpY2t1cFBvaW50c0xvYWRTdGFydCIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwic2hvd01hcCIsImRhdGEiLCJnZXRTaGlwcGluZ0RhdGEiLCJhY3Rpb24iLCJzZXRDYXJyaWVySWNvbiIsIkNhcnJpZXJJZCIsImdlb2NvZGUiLCJnZXRQaWNrdXBMb2NhdGlvbnNGcm9tR2VvY29kZWRBZGRyIiwicmVzZXRVSSIsInBpY2t1cFBvaW50c0xvYWRTdG9wIiwicGlja3VwRXJyb3IiLCJzaGlwdGltaXplX2dlb2xvY2F0aW9uZmFpbGVkIiwiQ291bnRyeSIsImlzbzIiLCJMb25nIiwiTGF0IiwiZ2V0SlNPTiIsIkVycm9yIiwiSWQiLCJQb2ludCIsInNob3ciLCJzZXRQaWNrdXBMb2NhdGlvbnMiLCJzaGlwdGltaXplX25vX3BvaW50c19mb3VuZCIsImZhaWwiLCJyZXNwIiwicmVzcG9uc2VUZXh0IiwiaW5mbyIsImVFcnJvciIsImNlbnRlck1hcCIsImFkZE1hcmtlcnMiLCJzZWxlY3RQb2ludEZyb21MaXN0SW5NYXAiLCJzZXRPcHRpb25zRm9yQWRkcmVzcyIsImludmFsaWRhdGVTaXplIiwic2V0VGltZW91dCIsImZpdEJvdW5kcyIsImdldEV4dGVuZGVkSW5mb0h0bWwiLCJsb2FkTWFwIiwid29vY29tbWVyY2VfcGFyYW1zIiwid2luZG93Iiwic2hpcHRpbWl6ZSJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOztBQUNBOztBQUVBOzs7O0FBQ0E7Ozs7QUFFQTs7OztBQUNBOzs7Ozs7OztBQUVBOzs7Ozs7SUFNTUEsVTtBQUVGLHdCQUFZQyxRQUFaLEVBQXNCO0FBQUE7O0FBQ2xCLGFBQUtDLE9BQUwsR0FBZSxFQUFmLENBRGtCLENBQ0M7QUFDbkIsYUFBS0MsV0FBTCxHQUFtQixLQUFuQjtBQUNBLGFBQUtDLFNBQUwsR0FBaUIsT0FBT0MsbUJBQVAsSUFBK0IsV0FBL0IsR0FBOEMsRUFBOUMsR0FBbURBLG1CQUFwRTtBQUNBLGFBQUtDLGtCQUFMLEdBQTBCLEVBQTFCO0FBQ0EsYUFBS0wsUUFBTCxHQUFnQkEsUUFBaEIsQ0FMa0IsQ0FLUTs7QUFFMUIsYUFBS00sUUFBTCxHQUFnQixJQUFJQywrQkFBSixDQUFnQixLQUFLUCxRQUFyQixDQUFoQjs7QUFFQSxhQUFLUSxHQUFMLEdBQVcsS0FBS0wsU0FBTCxH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VEo7QUFVSDtBQUNEOEIsb0JBQVFDLEdBQVIsQ0FBWTdDLElBQVo7O0FBRUFULG1CQUFPLDJCQUFQLEVBQW9DUyxJQUFwQyxDQUF5Q0EsSUFBekM7QUFDSDs7O2tDQUdTO0FBQ04saUJBQUtmLEdBQUwsQ0FBU29HLE9BQVQ7QUFDSDs7O2dEQUV1QjtBQUN0QjlGLG1CQUFPLGdDQUFQLEVBQXlDRSxRQUF6QyxDQUFrRCxTQUFsRDtBQUNEOzs7K0NBRXNCO0FBQ3JCRixtQkFBTyxnQ0FBUCxFQUF5Q0csV0FBekMsQ0FBcUQsU0FBckQ7QUFDRDs7Ozs7O0FBR0xILE9BQU8sWUFBVztBQUNkLFFBQUcsT0FBTytGLGtCQUFQLElBQThCLFdBQWpDLEVBQTZDO0FBQ3pDQyxlQUFPQyxVQUFQLEdBQW9CLElBQUloSCxVQUFKLENBQWU4RyxtQkFBbUI3RyxRQUFsQyxDQUFwQjtBQUNIO0FBQ0osQ0FKRCIsImZpbGUiOiIuL3NoaXB0bWl6ZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnLi9zY3NzL3NoaXB0aW1pemUuc2Nzcyc7XG5pbXBvcnQgJy4vY3NzL2xlYWZsZXQuY3NzJztcblxuaW1wb3J0IFV0aWxzIGZyb20gJy4vanMvc2hpcHRpbWl6ZS11dGlscy5qcyc7XG5pbXBvcnQgV29vQ29tbWVyY2UgZnJvbSAnLi9qcy9zaGlwdGltaXplLXdvby1jb21tZXJjZS5qcyc7XG5cbmltcG9ydCBHb29nbGVNYXAgZnJvbSAnLi9qcy9zaGlwdGltaXplLWdtYXBzLmpzJztcbmltcG9ydCBPcGVuU3RyZWV0TWFwIGZyb20gJy4vanMvc2hpcHRpbWl6ZS1vcGVuLW1hcC5qcyc7XG5cbi8qKiBcbiAqIENsYXNzIFNoaXB0aW1pemUgZGVwZW5kcyBvbiBqUXVlcnkuIFxuICogQ2hlY2sgaWYgd2UgYXJlIG1lYW50IHRvIGFwcGVuZCBhIG1hcCBcbiAqIFxuICogUGxhdGZvcm0gZGVwZW5kZW50IGZ1bmN0aW9ucyBtYXJrZWQgd2l0aCAgICogQHBsYXRmb3JtRGVwZW5kZW50IFxuICovXG5jbGFzcyBTaGlwdGltaXplIHtcblxuICAgIGNvbnN0cnVjdG9yKGFqYXhfdXJsKSB7XG4gICAgICAgIHRoaXMubWFya2VycyA9IFtdOyAvL3BpY2t1cCB7bGF0LCBsbmd9IFxuICAgICAgICB0aGlzLmlzTWFwTG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZ21hcHNfa2V5ID0gdHlwZW9mKHNoaXB0aW1pemVfbWFwc19rZXkpID09ICd1bmRlZmluZWQnID8gICcnIDogc2hpcHRpbWl6ZV9tYXBzX2tleSA7XG4gICAgICAgIHRoaXMub3Blbk1hcE1hcmtlckljb25zID0ge307XG4gICAgICAgIHRoaXMuYWpheF91cmwgPSBhamF4X3VybDsgLy8gcGxhdGZvcm0gZGVwZW5kZW50IFxuXG4gICAgICAgIHRoaXMucGxhdGZvcm0gPSBuZXcgV29vQ29tbWVyY2UodGhpcy5hamF4X3VybCk7XG5cbiAgICAgICAgdGhpcy5tYXAgPSB0aGlzLmdtYXBzX2tleSA/IG5ldyBHb29nbGVNYXAodGhpcy5nbWFwc19rZXkpIDogbmV3IE9wZW5TdHJlZXRNYXAoKTtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybS5pc0NoZWNrb3V0KCk7IFxuICAgICAgICB0aGlzLm1hcC5ncmFudFJlYWR5KCk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFNob3cgdGhlIG1hcCB0byB0aGUgdXNlciBcbiAgICAgKi9cbiAgICBzaG93TWFwKCkge1xuICAgICAgICB0aGlzLnVzZXJTY3JvbGwgPSBqUXVlcnkoJ2h0bWwsYm9keScpLnNjcm9sbFRvcCgpOyBcbiAgICAgICAgalF1ZXJ5KCdodG1sLGJvZHknKS5zY3JvbGxUb3AoMCk7IFxuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBcIikuYWRkQ2xhc3MoXCJhY3RpdmVcIik7IFxuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBIaWRlIHRoZSBtYXAgICBcbiAgICAgKi9cbiAgICBoaWRlTWFwKCkge1xuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBcIikucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG4gICAgICAgIGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cF9fZXJyb3JcIikuaGlkZSgpO1xuICAgICAgICBqUXVlcnkoJ2h0bWwsYm9keScpLnNjcm9sbFRvcCh0aGlzLnVzZXJTY3JvbGwpOyBcbiAgICB9XG5cbiAgICBjbGVhck1hcmtlcnMoKSB7XG4gICAgICAgIHRoaXMubWFwLmNsZWFyTWFya2VycygpO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBHZW5lcmF0ZSB0aGUgaW5wdXRzIGZvciB0aGUgdXNlciB0byBhcHBlbmQgZXh0cmEgaW5mbyBpZiBuZWNlc3NhcnkgXG4gICAgICogVGhlIGlkIG9mIHRoZXNlIGZpZWxkcyBpcyBpbiB0aGUgZm9ybWF0IHNoaXB0aW1pemVfZXh0cmFfe1BvaW50SWR9X3tGaWVsZElkfVxuICAgICAqL1xuICAgIGdldEV4dGVuZGVkSW5mb0h0bWwocGlja3VwUG9pbnQpIHtcbiAgICAgICAgaWYgKCFwaWNrdXBQb2ludC5FeHRlbmRlZEluZm8gfHwgdHlwZW9mKHBpY2t1cFBvaW50LkV4dGVuZGVkSW5mby5sZW5ndGgpID09J3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGh0bWwgPSAnJztcblxuICAgICAgICBmb3IgKGxldCB4ID0gMDsgcGlja3VwUG9pbnQuRXh0ZW5kZWRJbmZvICYmIHggPCBwaWNrdXBQb2ludC5FeHRlbmRlZEluZm8ubGVuZ3RoOyArK3gpIHtcbiAgICAgICAgICAgIGxldCBleHRyYUluZm8gPSBwaWNrdXBQb2ludC5FeHRlbmRlZEluZm9beF07XG4gICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwic2hpcHRpbWl6ZS1waWNrdXBfX2V4dGVuZGVkXCI+JyArXG4gICAgICAgICAgICAgICAgJzxsYWJlbCBjbGFzcz1cInNoaXB0aW1pemUtcGlja3VwX19leHRlbmRlZF9sYWJlbCBcIj4nICsgZXh0cmFJbmZvLlRla3N0ICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJzaGlwdGltaXplX3BpY2t1cF9leHRlbmRlZF92YWx1ZVwiIHZhbHVlPVwiXCIgaWQ9XCJzaGlwdGltaXplX2V4dHJhXycgKyBwaWNrdXBQb2ludC5Qb2ludElkICsgJ18nICsgZXh0cmFJbmZvLkZpZWxkSWQgKyAnXCIvPiAnICtcbiAgICAgICAgICAgICAgICAnPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwic2hpcHRpbWl6ZV9waWNrdXBfZXh0ZW5kZWRfaWRcIiBpZD1cInNoaXB0aW1pemVfcGlja3VwXCIgdmFsdWU9XCInICsgZXh0cmFJbmZvLkZpZWxkSWQgKyAnXCIvPiAnICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBodG1sO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0IGFsbCBtYXJrZXJzICBcbiAgICAgKiBTZWxlY3QgdGhlIG1hcmtlciBvZiBpbmRleCBpZHggaW4gbWFwIFxuICAgICAqL1xuICAgIHNlbGVjdFBvaW50RnJvbUxpc3RJbk1hcChpZHgpIHtcbiAgICAgICAgalF1ZXJ5KFwiaW5wdXRbbmFtZT0nc2hpcHRpbWl6ZV9fcG9pbnQnXVwiKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuICAgICAgICB0aGlzLm1hcC5zZWxlY3RNYXJrZXJCeUlkeChpZHgpO1xuXG4gICAgICAgIGpRdWVyeShqUXVlcnkoXCJpbnB1dFtuYW1lPSdzaGlwdGltaXplX19wb2ludCddXCIpLmdldChpZHgpKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSB2YWxpZGF0ZSBidXR0b24gXG4gICAgICovXG4gICAgc2VsZWN0RnJvbUxpc3QoKSB7XG4gICAgICAgIGxldCBpZHggPSBqUXVlcnkoXCJpbnB1dFtuYW1lPSdzaGlwdGltaXplX19wb2ludCddOmNoZWNrZWRcIikudmFsKCk7XG4gICAgICAgIGxldCBwaWNrdXAgPSB0aGlzLnBpY2t1cFBvaW50c1tpZHhdO1xuICAgICAgICBsZXQgZXh0cmEgPSAnJztcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgcGlja3VwLkV4dGVuZGVkSW5mbyAmJiBpIDwgcGlja3VwLkV4dGVuZGVkSW5mby5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgZXh0cmEgKz0gXCI8YnIvPlwiICsgcGlja3VwLkV4dGVuZGVkSW5mb1tpXS5UZWtzdCArICc6ICcgKyBqUXVlcnkoXCIjc2hpcHRpbWl6ZV9leHRyYV9cIiArIHBpY2t1cC5Qb2ludElkICsgXCJfXCIgKyBwaWNrdXAuRXh0ZW5kZWRJbmZvW2ldLkZpZWxkSWQpLnZhbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19kZXNjcmlwdGlvblwiKS5odG1sKHNoaXB0aW1pemVfc2VsZWN0ZWRfcGlja3VwICsgXCIgOiBcIiArIHBpY2t1cC5JbmZvcm1hdGlvbi5OYW1lICsgXCIgXCIgKyBwaWNrdXAuSW5mb3JtYXRpb24uQWRkcmVzcyArIFwiIFwiICsgZXh0cmEpO1xuXG4gICAgICAgIHRoaXMucGxhdGZvcm0uc2V0UGlja3VwUG9pbnQocGlja3VwKTtcbiAgICAgICAgdGhpcy5oaWRlTWFwKCk7XG4gICAgfVxuXG5cbiAgICAvKiogXG4gICAgICogIFJldHVybnMgdGhlIGRpc3RhbmNlIGJldHdlZW4gMiAobGF0LGxuZykgcG9pbnRzIGluIGttcyBcbiAgICAgKi9cbiAgICBnZXREaXN0YW5jZShsYXRsbmcsIGxhdGxuZzIpIHtcblxuICAgICAgICB2YXIgUiA9IDYzNzFlMzsgLy8gbWV0cmVzXG4gICAgICAgIHZhciDPhjEgPSBsYXRsbmcubGF0KCkudG9SYWRpYW5zKCk7XG4gICAgICAgIHZhciDPhjIgPSBsYXRsbmcyLmxuZygpLnRvUmFkaWFucygpO1xuXG4gICAgICAgIHZhciDOlM+GID0gKGxhdGxuMi5sYXQoKSAtIGxhdGxuZy5sbmcoKSkudG9SYWRpYW5zKCk7XG4gICAgICAgIHZhciDOlM67ID0gKGxhdGxuMi5sbmcoKSAtIGxhdGxuZy5sb24oKSkudG9SYWRpYW5zKCk7XG5cbiAgICAgICAgdmFyIGEgPSBNYXRoLnNpbijOlM+GIC8gMikgKiBNYXRoLnNpbijOlM+GIC8gMikgK1xuICAgICAgICAgICAgTWF0aC5jb3Moz4YxKSAqIE1hdGguY29zKM+GMikgKlxuICAgICAgICAgICAgTWF0aC5zaW4ozpTOuyAvIDIpICogTWF0aC5zaW4ozpTOuyAvIDIpO1xuICAgICAgICB2YXIgYyA9IDIgKiBNYXRoLmF0YW4yKE1hdGguc3FydChhKSwgTWF0aC5zcXJ0KDEgLSBhKSk7XG5cbiAgICAgICAgdmFyIGQgPSBNYXRoLmZsb29yKFIgKiBjIC8gMTAwMCk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIFNob3cgdGhlIG1hcCBhbmQgcXVlcnkgdGhlIHNlcnZlciBmb3IgcGlja3VwIGxvY2F0aW9ucyBuZWFyIHRoZSBzaGlwcGluZyBhZGRyZXNzIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnRcbiAgICAgKiBjZW50ZXIgdGhlIG1hcCBvbiB0aGUgZmlyc3QgcG9pbnQgXG4gICAgICogcmVtb3ZlIG9sZCBtYXJrZXJzIFxuICAgICAqIGFkZCB0aGUgbmV3IG1hcmtlcnMgIFxuICAgICAqL1xuICAgIGdldFBpY2t1cExvY2F0aW9ucyhldnQpIHtcbiAgICAgICAgaWYoIXRoaXMubWFwIHx8ICF0aGlzLm1hcC5pc1NjcmlwdExvYWRlZCl7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIm1hcCBpcyBub3QgbG9hZGVkIC4uLlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGlja3VwUG9pbnRzTG9hZFN0YXJ0KCk7IFxuXG4gICAgICAgIC8qKiBiZWNhdXNlIHNvbWUgdmVyc2lvbiBvZiB3b28gd2lsbCB0cmlnZ2VyIGEgY2FsbCB0byBjaGVja291dCBhbmQgZmluaXNoICB0aGUgb3JkZXIgKiovXG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnNob3dNYXAoKTtcblxuICAgICAgICBsZXQgZGF0YSA9IHRoaXMucGxhdGZvcm0uZ2V0U2hpcHBpbmdEYXRhKCk7XG4gICAgICAgIGRhdGEuYWN0aW9uID0gJ3NoaXB0aW1pemVfcGlja3VwX2xvY2F0aW9ucyc7XG5cbiAgICAgICAgdGhpcy5tYXAuc2V0Q2Fycmllckljb24oZGF0YS5DYXJyaWVySWQpO1xuXG4gICAgICAgIHRoaXMubWFwLmdlb2NvZGUoZGF0YSwgKGdlb2NvZGUpID0+IHsgdGhpcy5nZXRQaWNrdXBMb2NhdGlvbnNGcm9tR2VvY29kZWRBZGRyKGdlb2NvZGUsIGRhdGEpOyB9KTtcbiAgICB9XG5cblxuICAgIGdldFBpY2t1cExvY2F0aW9uc0Zyb21HZW9jb2RlZEFkZHIoZ2VvY29kZSwgZGF0YSkge1xuICAgICAgICB0aGlzLnJlc2V0VUkoKTsgXG4gICAgICAgIFxuICAgICAgICBpZighZ2VvY29kZS5sbmcgfHwgIWdlb2NvZGUubGF0KSB7XG4gICAgICAgICAgICB0aGlzLnBpY2t1cFBvaW50c0xvYWRTdG9wKCk7IFxuICAgICAgICAgICAgdGhpcy5waWNrdXBFcnJvcihzaGlwdGltaXplX2dlb2xvY2F0aW9uZmFpbGVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEuQWRkcmVzcy5Db3VudHJ5ID0gZ2VvY29kZS5pc28yO1xuICAgICAgICBkYXRhLkFkZHJlc3MuTG9uZyA9IGdlb2NvZGUubG5nO1xuICAgICAgICBkYXRhLkFkZHJlc3MuTGF0ID0gZ2VvY29kZS5sYXQ7XG5cbiAgICAgICAgY29uc29sZS5sb2coZGF0YSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGdlb2NvZGUpO1xuXG4gICAgICAgIGpRdWVyeS5nZXRKU09OKHRoaXMuYWpheF91cmwsIGRhdGEsIChwaWNrdXBQb2ludHMpID0+IHtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgdGhlIHBvaW50cyByZW1vdmUgdGhlIGxvYWRlciBcbiAgICAgICAgICAgIHRoaXMucGlja3VwUG9pbnRzTG9hZFN0b3AoKTsgXG5cbiAgICAgICAgICAgIGlmIChwaWNrdXBQb2ludHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm5vIHBpY2t1cCBwb2ludHMgZm91bmQgZm9yIHRoaXMgYWRkcmVzcyBcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhwaWNrdXBQb2ludHMpO1xuICAgICAgICAgICAgaWYgKHBpY2t1cFBvaW50cy5FcnJvci5JZCA9PSAwICYmIHBpY2t1cFBvaW50cy5Qb2ludC5sZW5ndGggPiAwICkge1xuICAgICAgICAgICAgICAgIGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cF9fb3B0aW9ucywuc2hpcHRpbWl6ZS1waWNrdXBfX21hcFwiKS5zaG93KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQaWNrdXBMb2NhdGlvbnMocGlja3VwUG9pbnRzLlBvaW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGUgYXBpIHJldHVybmVkIGFuIGVycm9yOiBcIiwgcGlja3VwUG9pbnRzLkVycm9yKTsgLy9waWNrdXBQb2ludHMuRXJyb3IuSW5mbyB8fCBcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2t1cEVycm9yKHNoaXB0aW1pemVfbm9fcG9pbnRzX2ZvdW5kKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KS5mYWlsKCAocmVzcCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBnZXR0aW5nIHBvaW50cywgc2hpcHRpbWl6ZSBhcGkgZXJyb3I/IHJlcG9ydCB0byBzaGlwdGltaXplLiBcIiwgcmVzcC5yZXNwb25zZVRleHQpOyAvL3BpY2t1cFBvaW50cy5FcnJvci5JbmZvIHx8IFxuICAgICAgICAgICAgdGhpcy5waWNrdXBFcnJvcihzaGlwdGltaXplX25vX3BvaW50c19mb3VuZCk7IFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXNldFVJKCl7XG4gICAgICAgIGpRdWVyeShcIi5zaGlwdGltaXplLXBpY2t1cF9fZXJyb3JcIikuaGlkZSgpO1xuICAgICAgICB0aGlzLm1hcC5jbGVhck1hcmtlcnMoKTsgXG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIEBwYXJhbSBzdHJpbmcgaW5mbyAtIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgXG4gICAgICovXG4gICAgcGlja3VwRXJyb3IoaW5mbykge1xuICAgICAgICB0aGlzLnBpY2t1cFBvaW50cyA9IFtdOyBcblxuICAgICAgICBsZXQgZUVycm9yID0galF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19lcnJvclwiKTtcbiAgICAgICAgZUVycm9yLmh0bWwoaW5mbyk7XG4gICAgICAgIGVFcnJvci5zaG93KCk7XG5cbiAgICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19vcHRpb25zLC5zaGlwdGltaXplLXBpY2t1cF9fbWFwXCIpLmhpZGUoKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQXBwZW5kIHRoZSBwaWNrdXAgTG9jYXRpb25zIHRvIHRoZSBtYXBcbiAgICAgKiBAcGFyYW0gYXJyYXkgcGlja3VwUG9pbnRzIC0gYW4gYXJyYXkgb2YgYXZhaWxhYmxlIHBpY2t1cCBwb2ludHMgXG4gICAgICovXG4gICAgc2V0UGlja3VwTG9jYXRpb25zKHBpY2t1cFBvaW50cykge1xuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX2Vycm9yXCIpLmhpZGUoKTtcblxuICAgICAgICB0aGlzLnBpY2t1cFBvaW50cyA9IHBpY2t1cFBvaW50cztcbiAgICAgICAgdGhpcy5tYXAuY2xlYXJNYXJrZXJzKCk7XG4gICAgICAgIHRoaXMubWFwLmNlbnRlck1hcCh0aGlzLnBpY2t1cFBvaW50c1swXS5MYXQsIHRoaXMucGlja3VwUG9pbnRzWzFdLkxvbmcpO1xuICAgICAgICB0aGlzLm1hcC5hZGRNYXJrZXJzKHBpY2t1cFBvaW50cywgKGlkeCkgPT4geyB0aGlzLnNlbGVjdFBvaW50RnJvbUxpc3RJbk1hcChpZHgpOyB9KTtcbiAgICAgICAgdGhpcy5zZXRPcHRpb25zRm9yQWRkcmVzcyhwaWNrdXBQb2ludHMpO1xuXG4gICAgICAgICh0eXBlb2YodGhpcy5tYXAubWFwLmludmFsaWRhdGVTaXplKSAhPSAndW5kZWZpbmVkJykgJiYgdGhpcy5tYXAubWFwLmludmFsaWRhdGVTaXplKCk7XG5cbiAgICAgICAgc2V0VGltZW91dCAoICgpID0+IHsgXG4gICAgICAgICAgICB0aGlzLm1hcC5maXRCb3VuZHMoKTsgXG4gICAgICAgIH0sIDIwMCk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIEBwYXJhbSBwaWNrdXBQb2ludHNbXSAtIFtdIG9mIHBpY2t1cCBwb2ludHMgcmV0dXJuZWQgYnkgdGhlIGFwaSBcbiAgICAgKi9cbiAgICBzZXRPcHRpb25zRm9yQWRkcmVzcyhwaWNrdXBQb2ludHMpIHtcblxuICAgICAgICBsZXQgaHRtbCA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBpY2t1cFBvaW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInNoaXB0aW1pemUtcGlja3VwX19wb2ludFwiPicgK1xuICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT1cInJhZGlvXCIgdmFsdWU9XCInICsgaSArICdcIiBuYW1lPVwic2hpcHRpbWl6ZV9fcG9pbnRcIiAgb25jbGljaz1cInNoaXB0aW1pemUuc2VsZWN0UG9pbnRGcm9tTGlzdEluTWFwKCcgKyBpICsgJylcIi8+JyArXG4gICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2hpcHRpbWl6ZS1waWNrdXBfX3BvaW50X2Rlc2NyaXB0aW9uXCIgb25jbGljaz1cInNoaXB0aW1pemUuc2VsZWN0UG9pbnRGcm9tTGlzdEluTWFwKCcgKyBpICsgJylcIj4nICtcbiAgICAgICAgICAgICAgICAnPHNwYW4+JyArIChwaWNrdXBQb2ludHNbaV0uSW5mb3JtYXRpb24uTmFtZSA/cGlja3VwUG9pbnRzW2ldLkluZm9ybWF0aW9uLk5hbWUgKyAnPGJyLz4nIDogJycpXG4gICAgICAgICAgICAgICAgICsgcGlja3VwUG9pbnRzW2ldLkluZm9ybWF0aW9uLkFkZHJlc3MgKyAnPC9zcGFuPicgK1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RXh0ZW5kZWRJbmZvSHRtbChwaWNrdXBQb2ludHNbaV0pICtcbiAgICAgICAgICAgICAgICAnPC9zcGFuPidcblxuICAgICAgICAgICAgICAgICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhodG1sKTtcblxuICAgICAgICBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1waWNrdXBfX290aGVyXCIpLmh0bWwoaHRtbCk7XG4gICAgfVxuXG5cbiAgICBsb2FkTWFwKCkge1xuICAgICAgICB0aGlzLm1hcC5sb2FkTWFwKCk7XG4gICAgfVxuXG4gICAgcGlja3VwUG9pbnRzTG9hZFN0YXJ0KCkge1xuICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19tYXBXcmFwcGVyXCIpLmFkZENsYXNzKCdsb2FkaW5nJyk7ICBcbiAgICB9OyBcblxuICAgIHBpY2t1cFBvaW50c0xvYWRTdG9wKCkge1xuICAgICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19tYXBXcmFwcGVyXCIpLnJlbW92ZUNsYXNzKCdsb2FkaW5nJyk7IFxuICAgIH07XG59XG5cbmpRdWVyeShmdW5jdGlvbigpIHtcbiAgICBpZih0eXBlb2Yod29vY29tbWVyY2VfcGFyYW1zKSAhPSAndW5kZWZpbmVkJyl7XG4gICAgICAgIHdpbmRvdy5zaGlwdGltaXplID0gbmV3IFNoaXB0aW1pemUod29vY29tbWVyY2VfcGFyYW1zLmFqYXhfdXJsKTsgICAgXG4gICAgfSBcbn0pOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./shiptmize.js\n"); 168 169 /***/ }) 170 171 /******/ }); -
shiptimize-for-woocommerce/trunk/constants.php
r2726206 r2746465 4 4 define( 'SHIPTIMIZE_API_URL', 'https://api.pakketmail.nl/v3' ); 5 5 define( 'SHIPTIMIZE_BRAND', 'Shiptimize' ); 6 define( 'SHIPTIMIZE_VERSION', '3.1.4 5' );6 define( 'SHIPTIMIZE_VERSION', '3.1.47' ); 7 7 define( 'SHIPTIMIZE_CREATE_ACCOUNT', 'https://www.shiptimize.me/quote/' ); 8 8 define( 'SHIPTIMIZE_CHECKOUT', 0); -
shiptimize-for-woocommerce/trunk/includes/admin/class-shiptimize-order-ui.php
r2722008 r2746465 66 66 WooShiptimize::log("requesting label status from $callbackurl"); 67 67 $response = WooShiptimize::get_api()->monitor_label_status($callbackurl); 68 if (isset($response->response->Finished) && $response->response->Finished ) { 69 foreach($response->response->ClientReferenceCodeList as $labelresult) { 70 $order = new WooShiptimizeOrder($labelresult->ReferenceCode); 71 $status = ShiptimizeOrder::$LABEL_STATUS_NOT_REQUESTED; 72 $msg = ''; 73 $labelurl = ''; 74 75 if ($labelresult->Error->Id == 0 ) { 76 $status = ShiptimizeOrder::$LABEL_STATUS_PRINTED; 77 $labelurl = $response->response->LabelFile; // all labels in this batch share the same url 78 $msg = $shiptimize->translate('labelprinted'); 79 } 80 else { 81 $status = ShiptimizeOrder::$LABEL_STATUS_ERROR; 82 $msg = $labelresult->Error->Info; 83 } 84 85 $order_meta = $order->get_order_meta(); 86 $msg = $order_meta->message . $msg; 87 $labelresult->message = $msg; 88 $order->set_label_meta($labelresult->ReferenceCode,$status,$labelurl,$msg); 89 } 68 WooShiptimize::log("label_response " . var_export($response, true)); 69 if (isset($response->response->Finished) && $response->response->Finished == 100) { 70 if (isset($response->response->ClientReferenceCodeList)) { 71 foreach($response->response->ClientReferenceCodeList as $labelresult) { 72 $order = new WooShiptimizeOrder($labelresult->ReferenceCode); 73 $status = ShiptimizeOrder::$LABEL_STATUS_NOT_REQUESTED; 74 $msg = ''; 75 $labelurl = ''; 76 77 if ($labelresult->Error->Id == 0 ) { 78 $status = ShiptimizeOrder::$LABEL_STATUS_PRINTED; 79 $labelurl = $response->response->LabelFile; // all labels in this batch share the same url 80 $msg = $shiptimize->translate('labelprinted'); 81 } 82 else { 83 $status = ShiptimizeOrder::$LABEL_STATUS_ERROR; 84 $msg = $labelresult->Error->Info; 85 } 86 87 $order_meta = $order->get_order_meta(); 88 $msg = $order_meta->message . $msg; 89 $labelresult->message = $msg; 90 $order->set_label_meta($labelresult->ReferenceCode,$status,$labelurl,$msg); 91 } 92 } 90 93 } 91 94 … … 324 327 $urlString = ''; 325 328 326 if ( WooShiptimize::$is_dev ) {327 error_log ( "bulk_export summary " . var_export($summary, true) );328 }329 329 330 WooShiptimize::log ( "bulk_export summary " . var_export($summary, true) ); 331 330 332 if(isset($summary->response)) { 331 333 if(isset($summary->response->CallbackURL)) { … … 350 352 $urlString = ''; 351 353 352 if ( WooShiptimize::$is_dev ) {353 error_log( "bulk_export summary " . var_export($summary, true) );354 }354 355 WooShiptimize::log( "bulk_export summary " . var_export($summary, true) ); 356 355 357 356 358 foreach((array)$summary as $key => $value) { -
shiptimize-for-woocommerce/trunk/includes/admin/class-shiptimize-shipping.php
r2724326 r2746465 22 22 $this->filters(); 23 23 24 $this->is_dev = file_exists(ABSPATH .'isdevmachine');24 $this->is_dev = file_exists(ABSPATH . 'isdevmachine'); 25 25 } 26 26 … … 33 33 } 34 34 35 public function actions() {35 public function actions() { 36 36 add_action( 'woocommerce_shipping_init', array( $this, 'shiptimize_init_shipping' ) ); 37 37 add_action( 'wp_footer', array( $this, 'script_carriers_with_pickup' ) ); … … 157 157 add_filter( 'woocommerce_shipping_methods', array($this, 'add_shipping_methods') ); 158 158 add_filter( 'woocommerce_update_order_review_fragments', array( $this, 'shipping_fragments' ) , 200 ); 159 add_filter( 'woocommerce_review_order_ after_order_total' , array( $this, 'shiptimize_shipping_options') , 200 ); //avoid conflicts with other plugins trying to print stuff Woo-wallet will print twice without this159 add_filter( 'woocommerce_review_order_before_payment' , array( $this, 'shiptimize_shipping_options') , 200 ); //avoid conflicts with other plugins trying to print stuff Woo-wallet will print twice without this 160 160 } 161 161 … … 211 211 212 212 if(get_option('shiptimize_pickupdisable')){ 213 if ($this->is_dev) { 214 error_log("pickup points are disabled"); 215 } 213 WooShiptimize::log("pickup points are disabled"); 216 214 return $fragments; 217 215 } … … 220 218 $choosen_methods_woo = WC()->session->get( 'chosen_shipping_methods' ); 221 219 222 220 WooShiptimize::log("Session " . var_export(WC()->session, true)); 221 WooShiptimize::log("Methods " . var_export($choosen_methods_woo, true)); 223 222 224 223 if( isset($choosen_methods_woo[0]) ) { … … 257 256 } 258 257 } 259 else if ($this->is_dev){260 error_log("No Shipping method was choosen ");258 else { 259 WooShiptimize::log("No Shipping method was choosen "); 261 260 } 262 261 263 262 $fragments['.shiptimize-shipping-options'] = $shiptimize_options.'</table>'; 264 263 265 264 return $fragments; 266 265 } … … 285 284 $HasPickup = false; 286 285 286 WooShiptimize::log("is_carrier_pickup_able " . var_export($carrier,true)); 287 287 if (isset($carrier->OptionList)) { 288 288 foreach($carrier->OptionList as $option) { … … 294 294 } 295 295 } 296 } else if(isset($option->IsPickup) && $option->IsPickup ) { // Points in regular options296 } else if(isset($option->IsPickup) && $option->IsPickup > 0) { // Points in regular options 297 297 WooShiptimize::log("HasPickup for $carrier->Name found in $option->Name"); 298 298 $HasPickup = true; … … 306 306 307 307 public function get_settings_from_shipping_method_id($shipping_method) { 308 if (!$shipping_method) { 309 return; 310 } 311 308 312 $matches = array(); 309 313 preg_match("/shipping_shiptimize_([0-9]+)[a-z0-9\_]*\:?([0-9]*)?/", $shipping_method, $matches); … … 348 352 } 349 353 354 $pickupbehaviour = isset($settings['pickupbehaviour']) ? $settings['pickupbehaviour'] : ''; 350 355 $shiptimizepoint = $fields['shiptimizepickup']; 351 352 $msg .= "<br/>Selected Point:$shiptimizepoint\npickup [ " . $settings['pickupbehaviour'] ." ]\n<br/>Settings " . var_export($settings,true) ; 353 356 357 $msg = "<br/>Selected Point:$shiptimizepoint\npickup [ " . $pickupbehaviour ." ]\n<br/>Settings " . var_export($settings,true) ; 354 358 WooShiptimize::log($msg); 355 356 if (isset($settings['pickupbehaviour']) && $ settings['pickupbehaviour']== ShiptimizeOrder::$PICKUP_BEHAVIOUR_MANDATORY && !$shiptimizepoint) {359 360 if (isset($settings['pickupbehaviour']) && $pickupbehaviour == ShiptimizeOrder::$PICKUP_BEHAVIOUR_MANDATORY && !$shiptimizepoint) { 357 361 $errors->add( 'validation', $shiptimize->translate('mandatorypointmsg') ); 358 362 } … … 375 379 */ 376 380 public function add_shipping_methods($methods){ 377 $carriers = json_decode(get_option('shiptimize_carriers')); 378 379 if (!$carriers) { 380 return $methods; 381 } 381 $shiptimize_methods = get_option('shiptimize_carriers'); 382 383 if(!$shiptimize_methods) { 384 return $methods; 385 } 386 387 $carriers = json_decode($shiptimize_methods); 382 388 383 389 foreach($carriers as $carrier){ … … 534 540 * @param int $orderid - optional - the order for which we are requesting this info 535 541 */ 536 public function get_shiptimize_carrier($choosen_method, $order_id =''){ 542 public function get_shiptimize_carrier($choosen_method, $order_id ='') { 543 WooShiptimize::log('choosen_method ' . $choosen_method); 544 537 545 if(stripos($choosen_method, 'table_rate_plus')) { 538 546 return $this->get_shiptimize_carrier_from_table_rates($choosen_method, $order_id); … … 694 702 695 703 if( stripos( $_SERVER['HTTP_HOST'] , '.local' ) ){ 696 error_log( $carrier->Name . " ".( isset($carrier->OptionList ) ? json_encode( $carrier->OptionList ) :'' ));704 WooShiptimize::log( $carrier->Name . " ".( isset($carrier->OptionList ) ? json_encode( $carrier->OptionList ) :'' )); 697 705 } 698 706 … … 725 733 ); 726 734 735 // how it's possible that someone declares this method before there's an instance of the plugin is a mistery to solve later 736 // possible they copied the code and did their own rendition of the thing? 737 if(!\$shiptimize) { 738 \$shiptimize = WooShiptimize::getInstance(); 739 } 740 727 741 \$this->init(); 728 742 … … 775 789 $class_file = fopen( $file_path , 'w' ); 776 790 if( !fwrite( $class_file, $class_contents) ){ 777 error_log("can't write to path: $file_path, classfile: $class_file please check your file permissions ");791 WooShiptimize::log("can't write to path: $file_path, classfile: $class_file please check your file permissions "); 778 792 } 779 793 … … 891 905 892 906 if( stripos( $_SERVER['HTTP_HOST'] , '.local' ) ){ 893 error_log( $carrier->Name . " ".( isset($carrier->OptionList ) ? json_encode( $carrier->OptionList ) :'' ));907 WooShiptimize::log( $carrier->Name . " ".( isset($carrier->OptionList ) ? json_encode( $carrier->OptionList ) :'' )); 894 908 } 895 909 … … 1130 1144 } 1131 1145 } 1132 1133 1134 ShiptimizeShipping::get_instance(); -
shiptimize-for-woocommerce/trunk/includes/class-woo-shiptimize-order.php
r2722008 r2746465 178 178 179 179 if( $product->has_weight() ) { 180 $item_weight = wc_get_weight(floatval($qty * $product->get_weight()),'g'); 180 $productweight = $product->get_weight(); 181 if(is_numeric($qty) && is_numeric($productweight)) { 182 $item_weight = wc_get_weight(floatval($qty * $productweight),'g'); 183 } 181 184 $weight += $item_weight; 182 185 } … … 272 275 // Regular woo shipping methods you add to zones 273 276 else { 274 if(WooShiptimize::$is_dev){ 275 error_log("Regular Woo method will request shipping items "); 276 } 277 277 WooShiptimize::log("Regular Woo method will request shipping items "); 278 278 279 $this->ShippingMethodName = $this->woo_order->get_shipping_method(); 279 280 foreach ( $this->woo_order->get_items('shipping') as $item_id => $shipping_item ){ … … 310 311 } 311 312 else { 312 error_log("Invalid service level id for order $this->ShopItemId. Did something change in the carrier settings ? ");313 WooShiptimize::log("Invalid service level id for order $this->ShopItemId. Did something change in the carrier settings ? "); 313 314 } 314 315 } … … 366 367 367 368 if(!$this->woo_order){ 368 error_log("Invalid order to bootstrap with id $this->ShopItemId ");369 WooShiptimize::log("Invalid order to bootstrap with id $this->ShopItemId "); 369 370 return; 370 371 } … … 440 441 global $shiptimize; 441 442 442 if(WooShiptimize::$is_dev) { 443 error_log("status update for order {$this->ShopItemId} => $status"); 444 } 443 WooShiptimize::log("status update for order {$this->ShopItemId} => $status"); 445 444 446 445 if(!isset(self::$api_status2wp_status[$status])){ 447 error_log("unknown status ignoring ");446 WooShiptimize::log("unknown status ignoring "); 448 447 return; 449 448 } … … 808 807 $order = new WooShiptimizeOrder($id); 809 808 $ordermeta = $order->get_order_meta(); 810 if ( $ordermeta->status == ShiptimizeOrder::$STATUS_EXPORTED_SUCCESSFULLY ) { 809 810 if ( isset($ordermeta->status) && $ordermeta->status == ShiptimizeOrder::$STATUS_EXPORTED_SUCCESSFULLY ) { 811 811 array_push( $shiptimize_patch_orders, $order->get_api_props() ); 812 812 } -
shiptimize-for-woocommerce/trunk/includes/class-woo-shiptimize.php
r2726206 r2746465 83 83 global $wpdb; 84 84 85 $this->db_prefix = $wpdb->prefix; 86 87 if(self::$is_dev){ 88 ini_set('display_errors', 1); 89 ini_set('display_startup_errors', 1); 90 error_reporting(E_ALL); 91 } 85 $this->db_prefix = $wpdb->prefix; 92 86 } 93 87 … … 101 95 102 96 if ( is_null( self::$_instance ) ) { 97 self::$is_dev = file_exists(ABSPATH . 'isdevmachine'); 103 98 self::$_instance = new self(); 104 self:: $is_dev = file_exists(ABSPATH . 'isdevmachine');99 self::shiptimize_check_upgrade(); 105 100 } 106 101 return self::$_instance; 107 102 } 108 103 109 public function bootstrap() { 104 public function bootstrap() { 105 106 register_activation_hook(SHIPTIMIZE_PLUGIN_FILE, array($this, 'activate')); 107 register_deactivation_hook(SHIPTIMIZE_PLUGIN_FILE, array($this, 'deactivate')); 108 ShiptimizeShipping::get_instance(); 109 110 110 $active_plugins = (array) get_option( 'active_plugins', array() ); 111 111 if ( is_multisite() ) { … … 150 150 151 151 /** 152 * Check the database for current version and see if we need to update something153 */154 public function check_update(){155 global $shiptimize,$wpdb;156 157 if ( 'yes' === get_transient( 'shiptimize_upgrading' ) ) {158 return;159 }160 161 $current_version = get_option('shiptimize_version');162 163 if($current_version == WooShiptimize::$version){164 return;165 }166 167 // name, value, expires in seconds168 set_transient( 'shiptimize_upgrading', 'yes', 600 );169 170 if( $shiptimize->is_options_valid() ){171 self::refresh_token();172 }173 174 delete_transient( 'shiptimize_upgrading' );175 update_option('shiptimize_version', WooShiptimize::$version);176 }177 178 179 /**180 152 * Declare the routes on activation, some plugins will rely on the flush rules to do stuff 181 153 * We can't load it everytime the plugin loads … … 185 157 global $wpdb; 186 158 187 update_option('shiptimize_db_version', self::$database_version); 188 189 if ( self::$is_dev ) { 190 error_log("Activating " . (is_multisite() ? 'multisite' : 'regular') . " network_wide: $network_wide"); 191 } 192 193 if ( is_multisite() && $network_wide ) { 194 error_log(var_export(get_sites(['fields'=>'ids']),true)); 195 foreach (get_sites(['fields'=>'ids']) as $blog_id) { 196 switch_to_blog($blog_id); 197 if ( self::$is_dev ) { 198 error_log("Activating site: " . site_url()); 199 } 200 //This class is a singleton foreach site we need to update this manually if iterating several sites 201 $shiptimize = WooShiptimize::instance(); 202 $shiptimize->db_prefix = $wpdb->prefix; 203 WooShiptimize::_active_site($network_wide); 204 restore_current_blog(); 205 } 206 207 } else { 208 WooShiptimize::_active_site($network_wide); 159 $database_version = get_option('shiptimize_db_version'); 160 self::log("Activating " . (is_multisite() ? 'multisite' : 'regular') . " network_wide: $network_wide current_db " . $database_version . "plugindb " . self::$database_version); 161 162 if($database_version < self::$database_version) { 163 164 if ( is_multisite() && $network_wide ) { 165 166 foreach (get_sites( ['fields'=>'ids'] ) as $blog_id) { 167 switch_to_blog($blog_id); 168 169 self::log("Activating site: " . site_url()); 170 171 //This class is a singleton foreach site we need to update this manually if iterating several sites 172 $shiptimize = WooShiptimize::instance(); 173 $shiptimize->db_prefix = $wpdb->prefix; 174 WooShiptimize::_active_site($network_wide); 175 restore_current_blog(); 176 } 177 178 } else { 179 WooShiptimize::_active_site($network_wide); 180 } 181 182 update_option( 'shiptimize_db_version', self::$database_version ); 209 183 } 210 184 } … … 220 194 $shiptimize = WooShiptimize::instance(); 221 195 $shiptimize->create_shiptimize_data_model('bigint(20) unsigned '); 222 223 if( !$network_wide && $shiptimize->is_options_valid() ){224 self::refresh_token();225 }226 227 196 ShiptimizeMarketplace::activate($network_wide); 228 197 } … … 234 203 */ 235 204 public function actions( ) { 205 add_action( 'plugins_loaded', array( $this,'plugins_loaded' ) ); 206 207 add_action( 'upgrader_process_complete', array( $this,'upgrade_function' ) ,10, 2); 208 236 209 add_action('admin_enqueue_scripts', array( $this, 'shiptimize_admin_styles' ) ); 237 210 add_action('admin_enqueue_scripts', array( $this, 'shiptimize_admin_scripts' ) ); … … 255 228 add_action( $action_name , array($this, 'auto_export')); 256 229 } 257 258 259 } 230 } 231 232 public function plugins_loaded() { 233 $this->check_marketplaces(); 234 $this->load_plugin_textdomain(); 235 } 236 237 public function check_marketplaces() { 238 global $shiptimize_dokan,$shiptimize_wcfm; 239 240 $active_plugins = apply_filters('active_plugins', get_option( 'active_plugins' )); 241 if ( in_array( 'dokan-lite/dokan.php', $active_plugins )) { 242 require_once(SHIPTIMIZE_PLUGIN_PATH . 'includes/plugins/class-shiptimize-dokan.php'); 243 } 244 245 if (in_array('wc-multivendor-marketplace/wc-multivendor-marketplace.php', $active_plugins)) { 246 require_once(SHIPTIMIZE_PLUGIN_PATH . 'includes/plugins/class-shiptimize-wcfm.php'); 247 } 248 } 249 250 public function upgrade_function( $upgrader_object, $options ) { 251 global $shiptimize; 252 253 $current_plugin_path_name = plugin_basename( __FILE__ ); 254 255 if ($options['action'] == 'update' && $options['type'] == 'plugin' ){ 256 foreach($options['plugins'] as $each_plugin){ 257 if ($each_plugin==$current_plugin_path_name){ 258 $shiptimize->check_update(); 259 } 260 } 261 } 262 } 263 264 public function load_plugin_textdomain() { 265 global $shiptimize; 266 267 load_plugin_textdomain( 'shiptimize-for-woocommerce', FALSE, basename( dirname( __FILE__ ) ) . '/languages/' ); 268 } 260 269 261 270 /** … … 265 274 global $wpdb; 266 275 267 if( self::$is_dev){ 268 error_log("Auto export order_id: $order_id "); 269 } 276 self::log("Auto export order_id: $order_id "); 270 277 271 278 $exported = $wpdb->get_results("select status from {$wpdb->prefix}shiptimize where id=$order_id "); 272 279 273 if(self::$is_dev){ 274 error_log("Exported " . var_export($exported,true)); 275 } 280 self::log("Exported " . var_export($exported,true)); 276 281 277 282 if (!$exported || ($exported[0]->status != ShiptimizeOrder::$STATUS_EXPORTED_SUCCESSFULLY) ) { … … 279 284 } 280 285 else if( self::$is_dev) { 281 error_log("order $order_id was already exported status is $exported[0]->status: ignore");286 self::log("order $order_id was already exported status is $exported[0]->status: ignore"); 282 287 } 283 288 } … … 354 359 //Receive the RAW post data via the php://input IO stream. 355 360 $content = file_get_contents("php://input"); 356 self::log(" API_UPDATE ".var_export($content,true) , true);361 self::log(" API_UPDATE ".var_export($content,true)); 357 362 358 363 if(!trim($content)){ … … 376 381 377 382 378 error_log("\n\nHEADERS:\n" . json_encode(getallheaders()) . "\n\n");379 380 381 383 if (isset($data->Action) && $data->Action == 'getshippingmethods') { 382 384 echo ShiptimizeShipping::get_shipping_methods(); … … 401 403 'methods' => WP_REST_Server::CREATABLE, 402 404 'callback' => array($this, 'api_update'), 405 'permission_callback' => '__return_true', 403 406 ) ); 404 407 … … 407 410 'methods' => WP_REST_Server::READABLE, 408 411 'callback' => array($this, 'api_update'), 412 'permission_callback' => '__return_true', 409 413 ) ); 410 414 } … … 679 683 680 684 if(class_exists('ShiptimizeShipping')){ 681 if ( self::$is_dev ) { 682 error_log("clear_carrier_classes"); 683 } 685 self::log("clear_carrier_classes"); 684 686 ShiptimizeShipping::clear_carrier_classes(); 685 687 } 686 688 else { 687 689 $message = "Class ShiptimizeShipping not found; can't update the carrier classes. File should be at " . SHIPTIMIZE_PLUGIN_PATH . 'includes/admin/class-shiptimize-shipping.php. Does the file exist? ' . (file_exists(SHIPTIMIZE_PLUGIN_PATH . 'includes/admin/class-shiptimize-shipping.php') ? 'Yes': 'No'); 688 error_log($message);690 self::log($message); 689 691 } 690 692 … … 783 785 784 786 if(self::$is_dev) { 785 error_log("\n" . date("Y-m-d H:i:s") . "\t" . $msg , 3, SHIPTIMIZE_PLUGIN_PATH . '/shiptimize.log');787 error_log("\n" . date("Y-m-d H:i:s") . "\t" . $msg);//, 3, SHIPTIMIZE_PLUGIN_PATH . '/shiptimize.log'); 786 788 } 787 789 else { … … 821 823 catch (Exception $e) { 822 824 $contentvalid = false; 823 WooShiptimize::log($e->getMessage());825 self::log($e->getMessage()); 824 826 } 825 827 … … 827 829 return $contentvalid; 828 830 } 831 832 /** 833 * Check if we need to run any upgrade functions 834 * All elements in this function should be idempotent 835 **/ 836 static function shiptimize_check_upgrade () { 837 global $wpdb; 838 839 $current_version = get_option('shiptimize_app_version'); 840 $current_version = floatval($current_version); 841 842 if($current_version >= floatval(SHIPTIMIZE_VERSION) ) { 843 return; 844 } 845 846 WooShiptimize::log("Shiptimize Upgrade from $current_version ",1); 847 848 // Label creation table changes introduced in v3.1.34 849 $ordercolumns = $wpdb->get_results("show columns from {$wpdb->prefix}shiptimize where field='labelurl'"); 850 851 if(!isset($ordercolumns[0]->Field)) { 852 WooShiptimize::log("Updating shiptimize datamodel to include label creation "); 853 $wpdb->query("alter table " . $wpdb->prefix . "shiptimize add column labelurl varchar(255) null"); 854 } 855 856 if ( !get_option( WooShiptimize::$OPTION_SHIPTIMIZE_CACHE_KEY ) && get_option( WooShiptimize::$OPTION_SHIPTIMIZE_PUBLIC_KEY ) ) { 857 update_option( WooShiptimize::$OPTION_SHIPTIMIZE_CACHE_KEY, get_option(WooShiptimize::$OPTION_SHIPTIMIZE_PUBLIC_KEY) ); 858 update_option( WooShiptimize::$OPTION_CALLBACK_URL , WooShiptimize::get_callback_url()); 859 } 860 861 update_option('shiptimize_app_version',SHIPTIMIZE_VERSION); 862 } 829 863 } 830 831 register_activation_hook(SHIPTIMIZE_PLUGIN_FILE, array('WooShiptimize', 'activate'));832 register_deactivation_hook(SHIPTIMIZE_PLUGIN_FILE, array('WooShiptimize', 'deactivate')); -
shiptimize-for-woocommerce/trunk/includes/core/class-shiptimize-api-v3.php
r2722008 r2746465 452 452 * @override 453 453 */ 454 protected function send_to_api($method = 'GET', $endpoint , $data = '', $headers = array())454 protected function send_to_api($method = 'GET', $endpoint = '/', $data = '', $headers = array()) 455 455 { 456 456 $result = new \stdClass(); -
shiptimize-for-woocommerce/trunk/includes/core/class-shiptimize-order.php
r2705717 r2746465 766 766 } 767 767 else { 768 error_log("invalid char o: $o - c:[$c]");768 ///error_log("invalid char o: $o - c:[$c]"); 769 769 $str2 .= ' '; 770 770 } -
shiptimize-for-woocommerce/trunk/includes/core/class-shiptimize.php
r2705717 r2746465 29 29 * @var string 30 30 */ 31 protected static $database_version = " 1.0";31 protected static $database_version = "2.0"; 32 32 33 33 /** -
shiptimize-for-woocommerce/trunk/includes/core/lang/en.php
r2726206 r2746465 98 98 'printsuccesseddescription' => 'Label successfully printed', 99 99 'printerrordescription' => 'Label request <u>returned errors</u>', 100 'useapititle' => ' Use WP API',100 'useapititle' => 'Issues with order status updates?', 101 101 'usewpapi' => "Use the woordpress API to send back order updates", 102 102 'useapihelpinactive' => "<p>When you have configured order statusses to be automatically updated at certain events (on import, label create, and/or delivered) but you see <i>‘not found’</i> results in the tracking updates for shipments in your Shiptimize account the plugin could update order status updates via the WordPress API as an alternative. </p> -
shiptimize-for-woocommerce/trunk/includes/core/lang/pt.php
r2726206 r2746465 113 113 'printsuccesseddescription' => 'Etiqueta obtida com sucesso', 114 114 'printerrordescription' => '<u>Erros</u> ao obter a label', 115 'useapititle' => 'API do W P',115 'useapititle' => 'API do Wordpress', 116 116 'usewpapi' => "Receber actualizações de estado através da API do woordpress", 117 'useapihelpinactive' => "<p>Quando configura actualizações de estado automaticas (ao importar, criar label ou entregue) mas encontra 'Not Found' nas actualizações de encomenda deve escolher receber as actualizações através da API do Woocommerce. </p>117 'useapihelpinactive' => "<p>Quando configura actualizações de estado automaticas (ao importar, criar etiqueta ) mas encontra 'Not Found' nas actualizações de encomenda; deve escolher receber as actualizações através da API do Wordpress. </p> 118 118 <p> No entanto, a API do Wordpress parece não estar activa no seu site, pelo que não podemos facultar-lhe uma alternativa. Fale com o seu programador sobre isto. 119 119 <br/> %s</p> 120 120 ", 121 'useapihelp' => 'Quando configura actualizações de estado automaticas (ao importar, criar label ou entregue) mas encontra "Not Found" nas actualizações de encomenda deve escolher receber as actualizações através da API do Woocommerce.121 'useapihelp' => 'Quando configura actualizações de estado automaticas (ao importar, criar etiqueta ) mas encontra "Not Found" nas actualizações de encomenda; deve escolher receber as actualizações através da API do Wordpress. 122 122 Siga os seguintes passos: 123 123 <ol> 124 <li>Active a opção de receber actualizações usando a API do Wo ordpress abaixo. %s </li>124 <li>Active a opção de receber actualizações usando a API do Wordpress abaixo. %s </li> 125 125 <li>Na sua conta na aplicação, crie novas chaves em "Definições" > "Integrações" > "Gestão de Chaves".</li> 126 126 <li>Active as chaves</li> 127 <li>Copie e cole as chages que gerou nas configurações da Shiptimize nest site127 <li>Copie as chaves que gerou nas configurações da Shiptimize para as configurações do plugin. 128 128 </li> 129 129 <li>Clique em "Salvar Alterações".</li> -
shiptimize-for-woocommerce/trunk/readme.txt
r2726206 r2746465 3 3 Tags: shipping, multi carrier, save, automate, woocommerce 4 4 Requires at least: 4.9 5 Tested up to: 5.95 Tested up to: 6.0 6 6 Requires PHP: 5.6 7 7 Stable tag: trunk -
shiptimize-for-woocommerce/trunk/shiptimize.php
r2726206 r2746465 3 3 * Plugin Name: Shiptimize for WooCommerce 4 4 * Description: Shiptimize for WooCommerce 5 * Version: 3.1.4 55 * Version: 3.1.47 6 6 * Author: Shiptimize 7 7 * Author URI: https://shiptimize.me … … 20 20 } 21 21 22 # 23 # For reasons unknown some websites will return http instead of https with plugin_dir_url24 # Suspect is W3 Total cache 25 # 26 $plugin_url = plugin_dir_url( __FILE__ ); 27 # Get rid of the protocol entirely28 $plugin_url = preg_replace('/https?\:/', '', $plugin_url ); 22 /** 23 * There's nothing for us to do in cron tasks 24 */ 25 if ( wp_doing_cron() ) 26 { 27 return; 28 } 29 29 30 30 define( 'SHIPTIMIZE_DEV', file_exists('isdevmachine') ? 1 : 0 ); 31 31 define( 'SHIPTIMIZE_PLUGIN_PATH', plugin_dir_path( __FILE__ ) ); 32 32 define( 'SHIPTIMIZE_PLUGIN_FILE', __FILE__ ); 33 define( 'SHIPTIMIZE_PLUGIN_URL', $plugin_url);33 define( 'SHIPTIMIZE_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); 34 34 define( 'SHIPTIMIZE_LOGO', SHIPTIMIZE_PLUGIN_URL . 'assets/images/logo.svg' ); 35 35 36 36 37 require_once(SHIPTIMIZE_PLUGIN_PATH . '/constants.php'); 37 require_once(SHIPTIMIZE_PLUGIN_PATH . 'includes/class-woo-shiptimize.php'); 38 39 function shiptimize_load_plugin_textdomain() { 40 global $shiptimize; 41 42 load_plugin_textdomain( 'shiptimize-for-woocommerce', FALSE, basename( dirname( __FILE__ ) ) . '/languages/' ); 43 44 if($shiptimize){ 45 $shiptimize->check_update(); 46 } 47 } 48 49 add_action( 'plugins_loaded', 'shiptimize_load_plugin_textdomain' ); 50 add_action( 'plugins_loaded', 'check_marketplaces'); 51 52 add_action( 'upgrader_process_complete', 'shiptimize_upgrade_function',10, 2); 53 54 function shiptimize_upgrade_function( $upgrader_object, $options ) { 55 global $shiptimize; 56 57 $current_plugin_path_name = plugin_basename( __FILE__ ); 58 59 if ($options['action'] == 'update' && $options['type'] == 'plugin' ){ 60 foreach($options['plugins'] as $each_plugin){ 61 if ($each_plugin==$current_plugin_path_name){ 62 $shiptimize->check_update(); 63 } 64 } 65 } 66 } 67 68 /** 69 * Check if we need to run any upgrade functions 70 **/ 71 function shiptimize_check_upgrade () { 72 global $wpdb; 73 74 $current_version = get_option('shiptimize_db_version'); 75 $current_version = str_replace('.', "",$current_version); 76 77 if($current_version > 2 ) { 78 return; 79 } 80 81 WooShiptimize::log("Shiptimize Upgrade from $current_version ",1); 82 83 // Label creation table changes introduced in v3.1.34 84 $shiptimizeorder = $wpdb->get_results("select status from {$wpdb->prefix}shiptimize limit 0,1"); 85 86 if(!isset($shiptimizeorder['labelurl'])) { 87 error_log("Updating shiptimize datamodel to include label creation "); 88 $wpdb->query("alter table " . $wpdb->prefix . "shiptimize add column labelurl varchar(255) null"); 89 } 90 91 if ( !get_option( WooShiptimize::$OPTION_SHIPTIMIZE_CACHE_KEY ) && get_option( WooShiptimize::$OPTION_SHIPTIMIZE_PUBLIC_KEY ) ) { 92 update_option( WooShiptimize::$OPTION_SHIPTIMIZE_CACHE_KEY, get_option(WooShiptimize::$OPTION_SHIPTIMIZE_PUBLIC_KEY) ); 93 update_option( WooShiptimize::$OPTION_CALLBACK_URL , WooShiptimize::get_callback_url()); 94 } 95 96 update_option('shiptimize_db_version','3'); 97 } 38 require_once(SHIPTIMIZE_PLUGIN_PATH . 'includes/class-woo-shiptimize.php'); 98 39 99 40 /** … … 108 49 } 109 50 110 function check_marketplaces() {111 global $shiptimize_dokan,$shiptimize_wcfm;112 113 $active_plugins = apply_filters('active_plugins', get_option( 'active_plugins' ));114 if ( in_array( 'dokan-lite/dokan.php', $active_plugins )) {115 require_once(SHIPTIMIZE_PLUGIN_PATH . 'includes/plugins/class-shiptimize-dokan.php');116 }117 118 if (in_array('wc-multivendor-marketplace/wc-multivendor-marketplace.php', $active_plugins)) {119 require_once(SHIPTIMIZE_PLUGIN_PATH . 'includes/plugins/class-shiptimize-wcfm.php');120 }121 }122 123 shiptimize_check_upgrade();124 125 51 $shiptimize = WooShiptimize::instance(); 126 52 $shiptimize->bootstrap(); 53
Note: See TracChangeset
for help on using the changeset viewer.