Changeset 2800002
- Timestamp:
- 10/17/2022 11:56:52 AM (3 years ago)
- Location:
- shiptimize-for-woocommerce/trunk
- Files:
-
- 15 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-shipping.php (modified) (18 diffs)
-
includes/core/lang/de.php (modified) (1 diff)
-
includes/core/lang/en.php (modified) (1 diff)
-
includes/core/lang/es.php (modified) (1 diff)
-
includes/core/lang/nl.php (modified) (1 diff)
-
includes/core/lang/pt.php (modified) (1 diff)
-
readme.txt (modified) (1 diff)
-
shiptimize.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
shiptimize-for-woocommerce/trunk/assets/css/shiptimize-admin.css
r2757277 r2800002 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-exclude-class { 26 padding: 0 10px; } 27 28 .shiptimize-icon { 29 display: inline-block; } 30 .shiptimize-icon::before { 31 display: inline-block; 32 font-family: shiptimize-icons; 33 font-size: 25px; } 34 .shiptimize-icon-success::before { 35 content: "\E905"; 36 color: #27ae60; } 37 .shiptimize-icon-not-exported::before { 38 content: "\E906"; 39 color: #f39c12; } 40 .shiptimize-icon-error::before { 41 content: "\E904"; 42 color: #e74c3c; } 43 .shiptimize-icon-test-successful::before { 44 content: "\E905"; 45 color: #80e0a7; } 46 .shiptimize-icon-print-notprinted::before { 47 content: "\E903"; 48 color: #f39c12; } 49 .shiptimize-icon-print-printed::before { 50 content: "\E902"; 51 color: #27ae60; } 52 .shiptimize-icon-print-error::before { 53 content: "\E901"; 54 color: #e74c3c; } 55 56 .shiptimize-btn-label-print { 57 min-height: auto !important; 58 line-height: 1rem !important; 59 padding: 4px 3px 2px 4px !important; } 60 .shiptimize-btn-label-print::before { 61 content: "\E903"; 62 font-size: 20px; } 63 64 .shiptimize-message-large { 65 min-width: 300px; } 66 67 .shiptimize-list { 68 margin-top: 15px; 69 margin-left: 0; } 70 71 .shiptimize-tooltip__inner { 72 display: inline-block; 73 padding: 10px 20px; } 74 75 .shiptimize-tooltip-wrapper { 76 display: inline-block; 77 text-align: center; 78 padding: 0 10px; 79 vertical-align: top; } 80 81 .shiptimize-tooltip-message { 82 display: inline-block; 83 position: absolute; 84 visibility: hidden; 85 /** display none f* up the position calculation */ 86 z-index: 9999; 87 background: #ececec; 88 border: solid thin #ececec; 89 box-shadow: 0px 3px 6.51px 0.49px rgba(0, 0, 0, 0.1); 90 text-align: left; } 91 .shiptimize-tooltip-message__arrow { 92 border-style: solid; 93 position: absolute; 94 z-index: 9999; 95 margin: -10px; } 96 .shiptimize-tooltip-message[x-placement^="left"] .shiptimize-tooltip-message__arrow { 97 border-width: 10px 0 10px 10px; 98 border-color: transparent transparent transparent #ececec; 99 right: -10px; 100 top: calc(50% - 10px); 101 margin-left: 0; 102 margin-right: 0; } 103 104 .shiptimize-status-list { 105 margin-bottom: 30px; 106 margin-top: 20px; } 107 .shiptimize-status-list li { 108 display: inline-block; 109 width: 280px; 110 margin-bottom: 20px; } 111 112 .shiptimize-status-select { 113 float: none; } 114 115 .shiptimize-export-btn { 116 background-color: transparent; } 117 .shiptimize-export-btn.Shiptimize::before { 118 font-family: 'shiptimize-icons'; 119 content: '\E900'; 120 background-size: 100%; 121 position: relative; 122 left: -5px; 123 top: 0px; } 124 125 .shiptimize-btn-print-label { 126 background-color: transparent; } 127 .shiptimize-btn-print-label::before { 128 font-family: 'shiptimize-icons'; 129 content: '\E903'; 130 background-size: 100%; 131 position: relative; 132 left: -5px; 133 top: 0px; } 134 135 .shiptimize-settings__section { 136 margin: 40px 0; } 137 138 .shiptimize-settings__field { 139 margin-bottom: 15px; } 140 141 .shiptimize-settings__label { 142 display: inline-block; 143 min-width: 115px; 144 text-align: right; 145 margin-right: 10px; 146 vertical-align: top; } 147 .shiptimize-settings__label::after { 148 content: ':'; } 149 150 .shiptimize-settings__key { 151 width: 300px; } 152 153 .shiptimize-settings__maps_key { 154 min-width: 345px; } 155 156 .shiptimize-settings__checkbox-group { 157 display: block; 158 padding: 15px 10px; } 159 160 .shiptimize-checkbox { 161 display: inline-block; 162 margin-right: 20px; } 163 164 .shiptimize-warning { 165 white-space: nowrap; 166 display: block; } 167 168 .shiptimize__carrier-options { 169 display: none; } 170 .shiptimize__carrier-options.active { 171 display: inline-block; } 172 173 .shiptimize-errors { 174 color: red; 175 padding: 20px 0; } 176 177 .shiptimize-account-btn { 178 background-color: #f2a900; } 179 180 .shiptimize-loader-wrapper { 181 display: inline-block; 182 width: 400px; 183 min-height: 200px; 184 text-align: center; 185 position: fixed; 186 background-color: rgba(255, 255, 255, 0.8); 187 top: 50%; 188 top: calc(50% - 150px); 189 left: 50%; 190 left: calc(50% - 200px); 191 z-index: 99999; 192 padding-bottom: 40px; 193 font-size: 1rem; } 194 195 .shiptimize-loader { 196 position: relative; 197 width: 80px; 198 height: 80px; 199 margin: 40px auto; } 200 201 .shiptimize-loader div { 202 display: inline-block; 203 position: absolute; 204 left: 8px; 205 width: 16px; 206 background: #fdbc3b; 207 animation: shiptimize-loader 1.2s cubic-bezier(0, 0.5, 0.5, 1) infinite; } 208 209 .shiptimize-loader div:nth-child(1) { 210 left: 8px; 211 animation-delay: -0.24s; } 212 213 .shiptimize-loader div:nth-child(2) { 214 left: 32px; 215 animation-delay: -0.12s; } 216 217 .shiptimize-loader div:nth-child(3) { 218 left: 56px; 219 animation-delay: 0; } 220 221 @keyframes shiptimize-loader { 222 0% { 223 top: 8px; 224 height: 64px; } 225 50%, 100% { 226 top: 24px; 227 height: 32px; } } 228 229 .shiptimize-tooltip-wrapper:hover .shiptimize-tooltip-message { 230 visibility: visible; } 231 232 .column-shiptimize_status { 233 text-align: center !important; } 234 235 .wbs-shiptimizeoptions { 236 background: whitesmoke; 237 padding: 20px; 238 margin-bottom: 20px; } 239 240 .wbs-shiptimize-option { 241 margin-right: 20px; } 242 243 .tab { 244 display: none; } 245 .tab.active { 246 display: block; } 247 -
shiptimize-for-woocommerce/trunk/assets/css/shiptimize.css
r2757277 r2800002 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
r2757277 r2800002 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.servicelevel + "</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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdlaWdodC1iYXNlZC1zaGlwcGluZy5qcz8yZThjIl0sIm5hbWVzIjpbIlNoaXB0aW1pemVXZWlnaHRCYXNlZFNoaXBwaW5nIiwiY29uc29sZSIsImxvZyIsImluaXQiLCJzaGlwdGltaXplX2NhcnJpZXIiLCJyZWdleEluc3RhbmNlIiwiZXhlYyIsIndpbmRvdyIsImxvY2F0aW9uIiwic2VhcmNoIiwiaW5zdGFuY2VfaWQiLCJhdHRhY2hTaGlwdGltaXplT3B0aW9ucyIsImVsZW0iLCJkYXRhIiwiZUZvcm0iLCJzZXJpYWxpemVBcnJheSIsImpRdWVyeSIsInBvc3QiLCJhamF4dXJsIiwicmVzcCIsImhpZGUiLCJleHRyYU9wdGlvbiIsInZhbCIsInNob3ciLCJlU2hpcHRpbWl6ZU9wdGlvbnMiLCJvSHRtbCIsIk9wdGlvbkxpc3QiLCJodG1sU2VydmljZUxldmVscyIsImh0bWxFeHRyYU9wdGlvbnMiLCJodG1sQ2hlY2tib3hlcyIsImh0bWxFeHRyYXZhbHVlcyIsIngiLCJsZW5ndGgiLCJvcHRpb24iLCJUeXBlIiwiT3B0aW9uVmFsdWVzIiwiaSIsIm9wdGlvbkNoaWxkIiwic2VsZWN0ZWQiLCJzaGlwdGltaXplX29wdGlvbnMiLCJJZCIsIk5hbWUiLCJzaGlwdGltaXplX2V4dHJhb3B0aW9ucyIsImluY2x1ZGVzIiwiT3B0aW9uRmllbGRzIiwiaiIsIm9wdGlvbkZpZWxkIiwia2V5cyIsIk9iamVjdCIsInNoaXB0aW1pemVfY2hlY2tib3hlcyIsIm9wdGlvbk5hbWUiLCJjaGVja2VkIiwic2hpcHRpbWl6ZV9sYWJlbHMiLCJzZXJ2aWNlbGV2ZWwiLCJleHRyYW9wdGlvbnMiLCJIYXNQaWNrdXAiLCJzZWxlY3RodG1sIiwicGlja3VwYmVoYXZpb3VyIiwiaHRtbCIsImluc2VydEFmdGVyIiwic2F2ZU9wdGlvbnMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTs7Ozs7O0lBTXFCQSw2QjtBQUVuQiwy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QWQ7O0FBRUEvQixtRUFBeUQyQixrQkFBa0JLLGVBQTNFLGlCQUFzR0QsVUFBdEc7QUFDRDs7QUFHRCxVQUFJL0IsTUFBTU8sTUFBTixHQUFlLENBQW5CLEVBQXNCO0FBQ3BCUiwyQkFBbUJrQyxJQUFuQixDQUF3QixpQ0FBaUNqQyxLQUF6RDtBQUNBRCwyQkFBbUJtQyxXQUFuQixDQUErQjNDLE9BQU8sV0FBUCxDQUEvQjtBQUNBLGFBQUtGLEtBQUwsR0FBYUUsT0FBTyxvQkFBUCxDQUFiO0FBQ0EsYUFBSzRDLFdBQUwsQ0FBaUI1QyxPQUFPLDBCQUFQLENBQWpCO0FBQ0Q7QUFFRjs7Ozs7O2tCQXpJa0JoQiw2QiIsImZpbGUiOiIxMi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBcbiAqIHBsdWcgaW50byB0aGUgIGRvbSBhbmQgIGFwcGVuZCBzaGlwdGltaXplIHNldHRpbmdzXG4gKiBTYXZlIG9uIGNoYW5nZSB2aWEgYWpheCBcbiAqIFdlIGNhbid0IHNhdmUgcnVsZSBieSBydWxlIHdpdGhvdWdoIHBsdWdnaW4gaW50byB0aGUgY2hlY2tvdXQgXG4gKiBDdXJyZW50bHkgb25seSB0aGUgaW5zdGFuY2UgaWQgaXMgc2F2ZWQgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoaXB0aW1pemVXZWlnaHRCYXNlZFNoaXBwaW5nIHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zb2xlLmxvZyhcIlNoaXB0aW1pemUgb3B0aW9ucyBmb3IgV2VpZ2h0QmFzZWRTaGlwcGluZ1wiKTtcbiAgICB0aGlzLmluaXQoKTtcblxuICB9XG5cbiAgaW5pdCgpIHtcbiAgICAvL25vdCBhIHNoaXBwaW5nIG1ldGhvZCBwYWdlIFxuICAgIGlmICh0eXBlb2YgKHNoaXB0aW1pemVfY2FycmllcikgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWdleEluc3RhbmNlID0gL2luc3RhbmNlX2lkPShbMC05XSopLy5leGVjKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuXG4gICAgaWYgKCFyZWdleEluc3RhbmNlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImludmFsaWQgdXJsIHBhcmFtcyBjYW5ub3QgZmluZCBpbnN0YW5jZV9pZCBcIiArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaW5zdGFuY2VfaWQgPSByZWdleEluc3RhbmNlWzFdO1xuICAgIHRoaXMuYXR0YWNoU2hpcHRpbWl6ZU9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKiBcbiAgICogU2F2ZSBvdXIgb3B0aW9ucyBmb3IgdGhpcyBpbnN0YW5jZSBcbiAgICovXG4gIHNhdmVPcHRpb25zKGVsZW0pIHtcbiAgICB2YXIgZGF0YSA9IHtcbiAgICAgICdkYXRhJzogdGhpcy5lRm9ybS5zZXJpYWxpemVBcnJheSgpLFxuICAgICAgJ2luc3RhbmNlX2lkJzogdGhpcy5pbnN0YW5jZV9pZCxcbiAgICAgICdhY3Rpb24nOiAnc2hpcHRpbWl6ZV93YnNfc2V0dGluZ3MnXG4gICAgfTtcblxuICAgIGpRdWVyeS5wb3N0KGFqYXh1cmwsIGRhdGEsIGZ1bmN0aW9uIChyZXNwKSB7XG4gICAgICBjb25zb2xlLmxvZyhcInJlc3BvbnNlIFwiLCByZXNwKTtcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKHRoaXMuZUZvcm0sIFwiU2F2ZW9wdGlvbnMgXCIsIGRhdGEpO1xuICAgIFxuICAgIGpRdWVyeShcIi5zaGlwdGltaXplLW9wdGlvbnZhbHVlc1wiKS5oaWRlKCk7XG4gICAgdmFyIGV4dHJhT3B0aW9uID0galF1ZXJ5KFwiLnNoaXB0aW1pemUtZXh0cmFvcHRpb25zXCIpLnZhbCgpOyBcbiAgICBqUXVlcnkoXCIjc2hpcHRpbWl6ZS1leHRyYW9wdGlvbnNcIitleHRyYU9wdGlvbikuc2hvdygpO1xuICAgICBcbiAgfVxuXG4gIC8qKiBcbiAgICogQXR0YWNoIHRoZSBzaGlwdGltaXplIG9wdGlvbnMgdW5kZXIgdGhlIHRpdGxlICAgXG4gICAqL1xuICBhdHRhY2hTaGlwdGltaXplT3B0aW9ucygpIHtcblxuICAgIHZhciBlU2hpcHRpbWl6ZU9wdGlvbnMgPSBqUXVlcnkoXCI8Zm9ybSBpZD0nc2hpcHRpbWl6ZW9wdGlvbnMnIGNsYXNzPVxcXCJ3YnMtc2hpcHRpbWl6ZW9wdGlvbnNcXFwiPjwvZm9ybT5cIik7XG4gICAgdmFyIG9IdG1sID0gJyc7XG5cbiAgICAvL25vIG9wdGlvbnMgLCBub3RoaW5nIHRvIGRvIFxuICAgIGlmICh0eXBlb2YgKHNoaXB0aW1pemVfY2Fycmllci5PcHRpb25MaXN0KSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vc2hpcHRpbWl6ZV9leHRyYW9wdGlvbnNcbiAgICAvL3NoaXB0aW1pemVfY2hlY2tib3hlc1xuICAgIC8vQWRkIGEgU2F2ZSBidXR0b24gXG4gICAgbGV0IGh0bWxTZXJ2aWNlTGV2ZWxzID0gJyc7XG4gICAgbGV0IGh0bWxFeHRyYU9wdGlvbnMgPSAnJztcbiAgICBsZXQgaHRtbENoZWNrYm94ZXMgPSAnJztcbiAgICBsZXQgaHRtbEV4dHJhdmFsdWVzID0gJyc7IFxuICAgIGZvciAodmFyIHggPSAwOyB4IDwgc2hpcHRpbWl6ZV9jYXJyaWVyLk9wdGlvbkxpc3QubGVuZ3RoOyArK3gpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IHNoaXB0aW1pemVfY2Fycmllci5PcHRpb25MaXN0W3hdO1xuXG4gICAgICBpZiAob3B0aW9uLlR5cGUgPT0gMSkge1xuICAgICAgICBpZiAodHlwZW9mIChvcHRpb24uT3B0aW9uVmFsdWVzKSAhPSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9uLk9wdGlvblZhbHVlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IG9wdGlvbkNoaWxkID0gb3B0aW9uLk9wdGlvblZhbHVlc1tpXTtcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IHNoaXB0aW1pemVfb3B0aW9uc1snc2VydmljZV9sZXZlbCddID09IG9wdGlvbkNoaWxkLklkID8gJ3NlbGVjdGVkJyA6ICcnO1xuICAgICAgICAgICAgaHRtbFNlcnZpY2VMZXZlbHMgKz0gXCI8b3B0aW9uIHZhbHVlPSdcIiArIG9wdGlvbkNoaWxkLklkICsgXCInIFwiICsgc2VsZWN0ZWQgKyBcIj5cIiArIG9wdGlvbkNoaWxkLk5hbWUgKyBcIjwvb3B0aW9uPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzaGlwdGltaXplX2V4dHJhb3B0aW9ucy5pbmNsdWRlcyhvcHRpb24uSWQrXCJcIikpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkID0gc2hpcHRpbWl6ZV9vcHRpb25zWydleHRyYW9wdGlvbnMnXSA9PSBvcHRpb24uSWQgPyAnc2VsZWN0ZWQnIDogJyc7XG4gICAgICAgIGh0bWxFeHRyYU9wdGlvbnMgKz0gXCI8b3B0aW9uIHZhbHVlPSdcIiArIG9wdGlvbi5JZCArIFwiJyBcIiArIHNlbGVjdGVkICsgXCI+XCIgKyBvcHRpb24uTmFtZSArIFwiPC9vcHRpb24+XCI7XG4gICAgICAgIGlmIChvcHRpb24uT3B0aW9uRmllbGRzICYmIG9wdGlvbi5PcHRpb25GaWVsZHMubGVuZ3RoPjApIHtcbiAgICAgICAgICBmb3IgKCB2YXIgaj0wOyBqPG9wdGlvbi5PcHRpb25GaWVsZHMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGlmIChvcHRpb24uT3B0aW9uRmllbGRzW2pdLk9wdGlvblZhbHVlcykgeyBcbiAgICAgICAgICAgICAgdmFyIG9wdGlvbkZpZWxkID0gb3B0aW9uLk9wdGlvbkZpZWxkc1tqXTsgXG4gICAgICAgICAgICAgIGh0bWxFeHRyYXZhbHVlcyArPSAnPHNlbGVjdCBjbGFzcz1cInNoaXB0aW1pemUtb3B0aW9udmFsdWVzXCIgaWQ9XCJzaGlwdGltaXplLWV4dHJhb3B0aW9ucycgKyBvcHRpb24uSWQgKyAnXCIgbmFtZT1cImV4dHJhb3B0aW9ucycgKyBvcHRpb24uSWQgKyAnXCIgb25jaGFuZ2U9XFxcInNoaXB0aW1pemUucGxhdGZvcm0ud2JzLnNhdmVPcHRpb25zKGpRdWVyeSh0aGlzKSlcXFwiPic7IFxuICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbkZpZWxkLk9wdGlvblZhbHVlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxldCBvcHRpb25DaGlsZCA9IG9wdGlvbkZpZWxkLk9wdGlvblZhbHVlc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWQgPSBzaGlwdGltaXplX29wdGlvbnNbJ2V4dHJhb3B0aW9udmFsdWUnICsgb3B0aW9uLklkXSA9PSBvcHRpb25DaGlsZC5JZCA/ICdzZWxlY3RlZCcgOiAnJztcbiAgICAgICAgICAgICAgICBodG1sRXh0cmF2YWx1ZXMgKz0gXCI8b3B0aW9uIHZhbHVlPSdcIiArIG9wdGlvbkNoaWxkLklkICsgXCInIFwiICsgc2VsZWN0ZWQgKyBcIj5cIiArIG9wdGlvbkNoaWxkLk5hbWUgKyBcIjwvb3B0aW9uPlwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGh0bWxFeHRyYXZhbHVlcyArPSAnPC9zZWxlY3Q+JzsgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc2hpcHRpbWl6ZV9jaGVja2JveGVzKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbi5JZCA9PSBrZXlzW2ldKSB7XG4gICAgICAgICAgICBsZXQgb3B0aW9uTmFtZSA9IHNoaXB0aW1pemVfY2hlY2tib3hlc1tvcHRpb24uSWRdO1xuICAgICAgICAgICAgbGV0IGNoZWNrZWQgPSBzaGlwdGltaXplX29wdGlvbnNbb3B0aW9uTmFtZV0gPT0gb3B0aW9uLklkID8gJ2NoZWNrZWQnIDogJyc7XG4gICAgICAgICAgICBodG1sQ2hlY2tib3hlcyArPSAnPHNwYW4gY2xhc3M9XCJ3YnMtc2hpcHRpbWl6ZS1vcHRpb25cIj48aW5wdXQgJyArIGNoZWNrZWQgKyAnIGNsYXNzPVwid2JzLXJzZS1jaGVja2JveFwiICBvbmNoYW5nZT1cInNoaXB0aW1pemUucGxhdGZvcm0ud2JzLnNhdmVPcHRpb25zKGpRdWVyeSh0aGlzKSlcIiB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiJyArIG9wdGlvbk5hbWUgKyAnXCIgdmFsdWU9XCInICsgb3B0aW9uLklkICsgJ1wiLz4nICsgc2hpcHRpbWl6ZV9jaGVja2JveGVzW29wdGlvbi5JZF0gKyBcIjwvc3Bhbj5cIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaHRtbFNlcnZpY2VMZXZlbHMubGVuZ3RoID4gMCkge1xuICAgICAgb0h0bWwgKz0gXCI8c3BhbiBjbGFzcz1cXFwid2JzLXNoaXB0aW1pemUtb3B0aW9uXFxcIj48bGFiZWw+XCIgKyBzaGlwdGltaXplX2xhYmVscy5zZXJ2aWNlbGV2ZWwgKyBcIjwvbGFiZWw+IDxzZWxlY3QgbmFtZT1cXFwic2VydmljZV9sZXZlbFxcXCIgIG9uY2hhbmdlPVxcXCJzaGlwdGltaXplLnBsYXRmb3JtLndicy5zYXZlT3B0aW9ucyhqUXVlcnkodGhpcykpXFxcIj48b3B0aW9uPi08L29wdGlvbj5cIiArIGh0bWxTZXJ2aWNlTGV2ZWxzICsgXCI8L3NlbGVjdD48L3NwYW4+XCI7XG4gICAgfVxuXG4gICAgaWYgKGh0bWxFeHRyYU9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgb0h0bWwgKz0gXCI8c3BhbiBjbGFzcz1cXFwid2JzLXNoaXB0aW1pemUtb3B0aW9uXFxcIj48bGFiZWw+XCIgKyBzaGlwdGltaXplX2xhYmVscy5leHRyYW9wdGlvbnMgKyBcIjwvbGFiZWw+IDxzZWxlY3QgY2xhc3M9J3NoaXB0aW1pemUtZXh0cmFvcHRpb25zJyBuYW1lPVxcXCJleHRyYW9wdGlvbnNcXFwiICBvbmNoYW5nZT1cXFwic2hpcHRpbWl6ZS5wbGF0Zm9ybS53YnMuc2F2ZU9wdGlvbnMoalF1ZXJ5KHRoaXMpKVxcXCI+PG9wdGlvbj4tPC9vcHRpb24+XCIgKyBodG1sRXh0cmFPcHRpb25zICsgXCI8L3NlbGVjdD4gXCIgKyBodG1sRXh0cmF2YWx1ZXMrIFwiIDwvc3Bhbj5cIjtcbiAgICB9XG5cbiAgICBvSHRtbCArPSBodG1sQ2hlY2tib3hlcztcblxuICAgIC8vUGlja3VwIEJlaGF2aW91cj9cbiAgICBpZihzaGlwdGltaXplX2NhcnJpZXIuSGFzUGlja3VwKSB7XG4gICAgICBsZXQgc2VsZWN0aHRtbCA9ICc8c2VsZWN0IGNsYXNzPVwic2hpcHRpbWl6ZS1leHRyYW9wdGlvbnNcIiBuYW1lPVwicGlja3VwYmVoYXZpb3VyXCIgb25jaGFuZ2U9XFxcInNoaXB0aW1pemUucGxhdGZvcm0ud2JzLnNhdmVPcHRpb25zKGpRdWVyeSh0aGlzKSlcXFwiPic7XG4gICAgICBmb3IgKHZhciB4PTA7IHggPCAzOyArK3gpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkID0gc2hpcHRpbWl6ZV9vcHRpb25zWydwaWNrdXBiZWhhdmlvdXInXSA9PSB4ID8gJ3NlbGVjdGVkJyA6ICcnO1xuICAgICAgICBzZWxlY3RodG1sICs9IGA8b3B0aW9uIHZhbHVlPVwiJHt4fVwiICR7c2VsZWN0ZWR9PiR7c2hpcHRpbWl6ZV9sYWJlbHNbJ3BpY2t1cCcreF19PC9vcHRpb24+YDtcbiAgICAgIH1cbiAgICAgIHNlbGVjdGh0bWwgKz0gJzwvc2VsZWN0Pic7XG5cbiAgICAgIG9IdG1sICs9IGA8c3BhbiBjbGFzcz1cXFwid2JzLXNoaXB0aW1pemUtb3B0aW9uXFxcIj48bGFiZWw+JHtzaGlwdGltaXplX2xhYmVscy5waWNrdXBiZWhhdmlvdXJ9PC9sYWJlbD4gJHtzZWxlY3RodG1sfTwvc3Bhbj5gO1xuICAgIH0gXG5cblxuICAgIGlmIChvSHRtbC5sZW5ndGggPiAwKSB7XG4gICAgICBlU2hpcHRpbWl6ZU9wdGlvbnMuaHRtbChcIjxoMz5TaGlwdGltaXplIFNldHRpbmdzPC9oMz5cIiArIG9IdG1sKTtcbiAgICAgIGVTaGlwdGltaXplT3B0aW9ucy5pbnNlcnRBZnRlcihqUXVlcnkoXCIjbWFpbmZvcm1cIikpO1xuICAgICAgdGhpcy5lRm9ybSA9IGpRdWVyeShcIiNzaGlwdGltaXplb3B0aW9uc1wiKTsgXG4gICAgICB0aGlzLnNhdmVPcHRpb25zKGpRdWVyeShcIi5zaGlwdGltaXplLWV4dHJhb3B0aW9uc1wiKSk7XG4gICAgfVxuXG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\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.servicelevel + \"</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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLXdlaWdodC1iYXNlZC1zaGlwcGluZy5qcz8yZThjIl0sIm5hbWVzIjpbIlNoaXB0aW1pemVXZWlnaHRCYXNlZFNoaXBwaW5nIiwiY29uc29sZSIsImxvZyIsImluaXQiLCJzaGlwdGltaXplX2NhcnJpZXIiLCJyZWdleEluc3RhbmNlIiwiZXhlYyIsIndpbmRvdyIsImxvY2F0aW9uIiwic2VhcmNoIiwiaW5zdGFuY2VfaWQiLCJhdHRhY2hTaGlwdGltaXplT3B0aW9ucyIsImVsZW0iLCJkYXRhIiwiZUZvcm0iLCJzZXJpYWxpemVBcnJheSIsImpRdWVyeSIsInBvc3QiLCJhamF4dXJsIiwicmVzcCIsImhpZGUiLCJleHRyYU9wdGlvbiIsInZhbCIsInNob3ciLCJlU2hpcHRpbWl6ZU9wdGlvbnMiLCJvSHRtbCIsIk9wdGlvbkxpc3QiLCJodG1sU2VydmljZUxldmVscyIsImh0bWxFeHRyYU9wdGlvbnMiLCJodG1sQ2hlY2tib3hlcyIsImh0bWxFeHRyYXZhbHVlcyIsIngiLCJsZW5ndGgiLCJvcHRpb24iLCJUeXBlIiwiT3B0aW9uVmFsdWVzIiwiaSIsIm9wdGlvbkNoaWxkIiwic2VsZWN0ZWQiLCJzaGlwdGltaXplX29wdGlvbnMiLCJJZCIsIk5hbWUiLCJzaGlwdGltaXplX2V4dHJhb3B0aW9ucyIsImluY2x1ZGVzIiwiT3B0aW9uRmllbGRzIiwiaiIsIm9wdGlvbkZpZWxkIiwia2V5cyIsIk9iamVjdCIsInNoaXB0aW1pemVfY2hlY2tib3hlcyIsIm9wdGlvbk5hbWUiLCJjaGVja2VkIiwic2hpcHRpbWl6ZV9sYWJlbHMiLCJzZXJ2aWNlbGV2ZWwiLCJleHRyYW9wdGlvbnMiLCJIYXNQaWNrdXAiLCJzZWxlY3RodG1sIiwicGlja3VwYmVoYXZpb3VyIiwiaHRtbCIsImluc2VydEFmdGVyIiwic2F2ZU9wdGlvbnMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTs7Ozs7O0lBTXFCQSw2QjtBQUVuQiwy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QWQ7O0FBRUEvQixtRUFBeUQyQixrQkFBa0JLLGVBQTNFLGlCQUFzR0QsVUFBdEc7QUFDRDs7QUFHRCxVQUFJL0IsTUFBTU8sTUFBTixHQUFlLENBQW5CLEVBQXNCO0FBQ3BCUiwyQkFBbUJrQyxJQUFuQixDQUF3QixpQ0FBaUNqQyxLQUF6RDtBQUNBRCwyQkFBbUJtQyxXQUFuQixDQUErQjNDLE9BQU8sV0FBUCxDQUEvQjtBQUNBLGFBQUtGLEtBQUwsR0FBYUUsT0FBTyxvQkFBUCxDQUFiO0FBQ0EsYUFBSzRDLFdBQUwsQ0FBaUI1QyxPQUFPLDBCQUFQLENBQWpCO0FBQ0Q7QUFFRjs7Ozs7O2tCQXpJa0JoQiw2QiIsImZpbGUiOiIuL2pzL3NoaXB0aW1pemUtd2VpZ2h0LWJhc2VkLXNoaXBwaW5nLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFxuICogcGx1ZyBpbnRvIHRoZSAgZG9tIGFuZCAgYXBwZW5kIHNoaXB0aW1pemUgc2V0dGluZ3NcbiAqIFNhdmUgb24gY2hhbmdlIHZpYSBhamF4IFxuICogV2UgY2FuJ3Qgc2F2ZSBydWxlIGJ5IHJ1bGUgd2l0aG91Z2ggcGx1Z2dpbiBpbnRvIHRoZSBjaGVja291dCBcbiAqIEN1cnJlbnRseSBvbmx5IHRoZSBpbnN0YW5jZSBpZCBpcyBzYXZlZCBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hpcHRpbWl6ZVdlaWdodEJhc2VkU2hpcHBpbmcge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbnNvbGUubG9nKFwiU2hpcHRpbWl6ZSBvcHRpb25zIGZvciBXZWlnaHRCYXNlZFNoaXBwaW5nXCIpO1xuICAgIHRoaXMuaW5pdCgpO1xuXG4gIH1cblxuICBpbml0KCkge1xuICAgIC8vbm90IGEgc2hpcHBpbmcgbWV0aG9kIHBhZ2UgXG4gICAgaWYgKHR5cGVvZiAoc2hpcHRpbWl6ZV9jYXJyaWVyKSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZ2V4SW5zdGFuY2UgPSAvaW5zdGFuY2VfaWQ9KFswLTldKikvLmV4ZWMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cbiAgICBpZiAoIXJlZ2V4SW5zdGFuY2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiaW52YWxpZCB1cmwgcGFyYW1zIGNhbm5vdCBmaW5kIGluc3RhbmNlX2lkIFwiICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pbnN0YW5jZV9pZCA9IHJlZ2V4SW5zdGFuY2VbMV07XG4gICAgdGhpcy5hdHRhY2hTaGlwdGltaXplT3B0aW9ucygpO1xuICB9XG5cbiAgLyoqIFxuICAgKiBTYXZlIG91ciBvcHRpb25zIGZvciB0aGlzIGluc3RhbmNlIFxuICAgKi9cbiAgc2F2ZU9wdGlvbnMoZWxlbSkge1xuICAgIHZhciBkYXRhID0ge1xuICAgICAgJ2RhdGEnOiB0aGlzLmVGb3JtLnNlcmlhbGl6ZUFycmF5KCksXG4gICAgICAnaW5zdGFuY2VfaWQnOiB0aGlzLmluc3RhbmNlX2lkLFxuICAgICAgJ2FjdGlvbic6ICdzaGlwdGltaXplX3dic19zZXR0aW5ncydcbiAgICB9O1xuXG4gICAgalF1ZXJ5LnBvc3QoYWpheHVybCwgZGF0YSwgZnVuY3Rpb24gKHJlc3ApIHtcbiAgICAgIGNvbnNvbGUubG9nKFwicmVzcG9uc2UgXCIsIHJlc3ApO1xuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2codGhpcy5lRm9ybSwgXCJTYXZlb3B0aW9ucyBcIiwgZGF0YSk7XG4gICAgXG4gICAgalF1ZXJ5KFwiLnNoaXB0aW1pemUtb3B0aW9udmFsdWVzXCIpLmhpZGUoKTtcbiAgICB2YXIgZXh0cmFPcHRpb24gPSBqUXVlcnkoXCIuc2hpcHRpbWl6ZS1leHRyYW9wdGlvbnNcIikudmFsKCk7IFxuICAgIGpRdWVyeShcIiNzaGlwdGltaXplLWV4dHJhb3B0aW9uc1wiK2V4dHJhT3B0aW9uKS5zaG93KCk7XG4gICAgIFxuICB9XG5cbiAgLyoqIFxuICAgKiBBdHRhY2ggdGhlIHNoaXB0aW1pemUgb3B0aW9ucyB1bmRlciB0aGUgdGl0bGUgICBcbiAgICovXG4gIGF0dGFjaFNoaXB0aW1pemVPcHRpb25zKCkge1xuXG4gICAgdmFyIGVTaGlwdGltaXplT3B0aW9ucyA9IGpRdWVyeShcIjxmb3JtIGlkPSdzaGlwdGltaXplb3B0aW9ucycgY2xhc3M9XFxcIndicy1zaGlwdGltaXplb3B0aW9uc1xcXCI+PC9mb3JtPlwiKTtcbiAgICB2YXIgb0h0bWwgPSAnJztcblxuICAgIC8vbm8gb3B0aW9ucyAsIG5vdGhpbmcgdG8gZG8gXG4gICAgaWYgKHR5cGVvZiAoc2hpcHRpbWl6ZV9jYXJyaWVyLk9wdGlvbkxpc3QpID09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy9zaGlwdGltaXplX2V4dHJhb3B0aW9uc1xuICAgIC8vc2hpcHRpbWl6ZV9jaGVja2JveGVzXG4gICAgLy9BZGQgYSBTYXZlIGJ1dHRvbiBcbiAgICBsZXQgaHRtbFNlcnZpY2VMZXZlbHMgPSAnJztcbiAgICBsZXQgaHRtbEV4dHJhT3B0aW9ucyA9ICcnO1xuICAgIGxldCBodG1sQ2hlY2tib3hlcyA9ICcnO1xuICAgIGxldCBodG1sRXh0cmF2YWx1ZXMgPSAnJzsgXG4gICAgZm9yICh2YXIgeCA9IDA7IHggPCBzaGlwdGltaXplX2NhcnJpZXIuT3B0aW9uTGlzdC5sZW5ndGg7ICsreCkge1xuICAgICAgY29uc3Qgb3B0aW9uID0gc2hpcHRpbWl6ZV9jYXJyaWVyLk9wdGlvbkxpc3RbeF07XG5cbiAgICAgIGlmIChvcHRpb24uVHlwZSA9PSAxKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKG9wdGlvbi5PcHRpb25WYWx1ZXMpICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb24uT3B0aW9uVmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgb3B0aW9uQ2hpbGQgPSBvcHRpb24uT3B0aW9uVmFsdWVzW2ldO1xuICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gc2hpcHRpbWl6ZV9vcHRpb25zWydzZXJ2aWNlX2xldmVsJ10gPT0gb3B0aW9uQ2hpbGQuSWQgPyAnc2VsZWN0ZWQnIDogJyc7XG4gICAgICAgICAgICBodG1sU2VydmljZUxldmVscyArPSBcIjxvcHRpb24gdmFsdWU9J1wiICsgb3B0aW9uQ2hpbGQuSWQgKyBcIicgXCIgKyBzZWxlY3RlZCArIFwiPlwiICsgb3B0aW9uQ2hpbGQuTmFtZSArIFwiPC9vcHRpb24+XCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNoaXB0aW1pemVfZXh0cmFvcHRpb25zLmluY2x1ZGVzKG9wdGlvbi5JZCtcIlwiKSkge1xuICAgICAgICBsZXQgc2VsZWN0ZWQgPSBzaGlwdGltaXplX29wdGlvbnNbJ2V4dHJhb3B0aW9ucyddID09IG9wdGlvbi5JZCA/ICdzZWxlY3RlZCcgOiAnJztcbiAgICAgICAgaHRtbEV4dHJhT3B0aW9ucyArPSBcIjxvcHRpb24gdmFsdWU9J1wiICsgb3B0aW9uLklkICsgXCInIFwiICsgc2VsZWN0ZWQgKyBcIj5cIiArIG9wdGlvbi5OYW1lICsgXCI8L29wdGlvbj5cIjtcbiAgICAgICAgaWYgKG9wdGlvbi5PcHRpb25GaWVsZHMgJiYgb3B0aW9uLk9wdGlvbkZpZWxkcy5sZW5ndGg+MCkge1xuICAgICAgICAgIGZvciAoIHZhciBqPTA7IGo8b3B0aW9uLk9wdGlvbkZpZWxkcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKG9wdGlvbi5PcHRpb25GaWVsZHNbal0uT3B0aW9uVmFsdWVzKSB7IFxuICAgICAgICAgICAgICB2YXIgb3B0aW9uRmllbGQgPSBvcHRpb24uT3B0aW9uRmllbGRzW2pdOyBcbiAgICAgICAgICAgICAgaHRtbEV4dHJhdmFsdWVzICs9ICc8c2VsZWN0IGNsYXNzPVwic2hpcHRpbWl6ZS1vcHRpb252YWx1ZXNcIiBpZD1cInNoaXB0aW1pemUtZXh0cmFvcHRpb25zJyArIG9wdGlvbi5JZCArICdcIiBuYW1lPVwiZXh0cmFvcHRpb25zJyArIG9wdGlvbi5JZCArICdcIiBvbmNoYW5nZT1cXFwic2hpcHRpbWl6ZS5wbGF0Zm9ybS53YnMuc2F2ZU9wdGlvbnMoalF1ZXJ5KHRoaXMpKVxcXCI+JzsgXG4gICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9uRmllbGQuT3B0aW9uVmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9wdGlvbkNoaWxkID0gb3B0aW9uRmllbGQuT3B0aW9uVmFsdWVzW2ldO1xuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IHNoaXB0aW1pemVfb3B0aW9uc1snZXh0cmFvcHRpb252YWx1ZScgKyBvcHRpb24uSWRdID09IG9wdGlvbkNoaWxkLklkID8gJ3NlbGVjdGVkJyA6ICcnO1xuICAgICAgICAgICAgICAgIGh0bWxFeHRyYXZhbHVlcyArPSBcIjxvcHRpb24gdmFsdWU9J1wiICsgb3B0aW9uQ2hpbGQuSWQgKyBcIicgXCIgKyBzZWxlY3RlZCArIFwiPlwiICsgb3B0aW9uQ2hpbGQuTmFtZSArIFwiPC9vcHRpb24+XCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaHRtbEV4dHJhdmFsdWVzICs9ICc8L3NlbGVjdD4nOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzaGlwdGltaXplX2NoZWNrYm94ZXMpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBpZiAob3B0aW9uLklkID09IGtleXNbaV0pIHtcbiAgICAgICAgICAgIGxldCBvcHRpb25OYW1lID0gc2hpcHRpbWl6ZV9jaGVja2JveGVzW29wdGlvbi5JZF07XG4gICAgICAgICAgICBsZXQgY2hlY2tlZCA9IHNoaXB0aW1pemVfb3B0aW9uc1tvcHRpb25OYW1lXSA9PSBvcHRpb24uSWQgPyAnY2hlY2tlZCcgOiAnJztcbiAgICAgICAgICAgIGh0bWxDaGVja2JveGVzICs9ICc8c3BhbiBjbGFzcz1cIndicy1zaGlwdGltaXplLW9wdGlvblwiPjxpbnB1dCAnICsgY2hlY2tlZCArICcgY2xhc3M9XCJ3YnMtcnNlLWNoZWNrYm94XCIgIG9uY2hhbmdlPVwic2hpcHRpbWl6ZS5wbGF0Zm9ybS53YnMuc2F2ZU9wdGlvbnMoalF1ZXJ5KHRoaXMpKVwiIHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCInICsgb3B0aW9uTmFtZSArICdcIiB2YWx1ZT1cIicgKyBvcHRpb24uSWQgKyAnXCIvPicgKyBzaGlwdGltaXplX2NoZWNrYm94ZXNbb3B0aW9uLklkXSArIFwiPC9zcGFuPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChodG1sU2VydmljZUxldmVscy5sZW5ndGggPiAwKSB7XG4gICAgICBvSHRtbCArPSBcIjxzcGFuIGNsYXNzPVxcXCJ3YnMtc2hpcHRpbWl6ZS1vcHRpb25cXFwiPjxsYWJlbD5cIiArIHNoaXB0aW1pemVfbGFiZWxzLnNlcnZpY2VsZXZlbCArIFwiPC9sYWJlbD4gPHNlbGVjdCBuYW1lPVxcXCJzZXJ2aWNlX2xldmVsXFxcIiAgb25jaGFuZ2U9XFxcInNoaXB0aW1pemUucGxhdGZvcm0ud2JzLnNhdmVPcHRpb25zKGpRdWVyeSh0aGlzKSlcXFwiPjxvcHRpb24+LTwvb3B0aW9uPlwiICsgaHRtbFNlcnZpY2VMZXZlbHMgKyBcIjwvc2VsZWN0Pjwvc3Bhbj5cIjtcbiAgICB9XG5cbiAgICBpZiAoaHRtbEV4dHJhT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBvSHRtbCArPSBcIjxzcGFuIGNsYXNzPVxcXCJ3YnMtc2hpcHRpbWl6ZS1vcHRpb25cXFwiPjxsYWJlbD5cIiArIHNoaXB0aW1pemVfbGFiZWxzLmV4dHJhb3B0aW9ucyArIFwiPC9sYWJlbD4gPHNlbGVjdCBjbGFzcz0nc2hpcHRpbWl6ZS1leHRyYW9wdGlvbnMnIG5hbWU9XFxcImV4dHJhb3B0aW9uc1xcXCIgIG9uY2hhbmdlPVxcXCJzaGlwdGltaXplLnBsYXRmb3JtLndicy5zYXZlT3B0aW9ucyhqUXVlcnkodGhpcykpXFxcIj48b3B0aW9uPi08L29wdGlvbj5cIiArIGh0bWxFeHRyYU9wdGlvbnMgKyBcIjwvc2VsZWN0PiBcIiArIGh0bWxFeHRyYXZhbHVlcysgXCIgPC9zcGFuPlwiO1xuICAgIH1cblxuICAgIG9IdG1sICs9IGh0bWxDaGVja2JveGVzO1xuXG4gICAgLy9QaWNrdXAgQmVoYXZpb3VyP1xuICAgIGlmKHNoaXB0aW1pemVfY2Fycmllci5IYXNQaWNrdXApIHtcbiAgICAgIGxldCBzZWxlY3RodG1sID0gJzxzZWxlY3QgY2xhc3M9XCJzaGlwdGltaXplLWV4dHJhb3B0aW9uc1wiIG5hbWU9XCJwaWNrdXBiZWhhdmlvdXJcIiBvbmNoYW5nZT1cXFwic2hpcHRpbWl6ZS5wbGF0Zm9ybS53YnMuc2F2ZU9wdGlvbnMoalF1ZXJ5KHRoaXMpKVxcXCI+JztcbiAgICAgIGZvciAodmFyIHg9MDsgeCA8IDM7ICsreCkge1xuICAgICAgICBsZXQgc2VsZWN0ZWQgPSBzaGlwdGltaXplX29wdGlvbnNbJ3BpY2t1cGJlaGF2aW91ciddID09IHggPyAnc2VsZWN0ZWQnIDogJyc7XG4gICAgICAgIHNlbGVjdGh0bWwgKz0gYDxvcHRpb24gdmFsdWU9XCIke3h9XCIgJHtzZWxlY3RlZH0+JHtzaGlwdGltaXplX2xhYmVsc1sncGlja3VwJyt4XX08L29wdGlvbj5gO1xuICAgICAgfVxuICAgICAgc2VsZWN0aHRtbCArPSAnPC9zZWxlY3Q+JztcblxuICAgICAgb0h0bWwgKz0gYDxzcGFuIGNsYXNzPVxcXCJ3YnMtc2hpcHRpbWl6ZS1vcHRpb25cXFwiPjxsYWJlbD4ke3NoaXB0aW1pemVfbGFiZWxzLnBpY2t1cGJlaGF2aW91cn08L2xhYmVsPiAke3NlbGVjdGh0bWx9PC9zcGFuPmA7XG4gICAgfSBcblxuXG4gICAgaWYgKG9IdG1sLmxlbmd0aCA+IDApIHtcbiAgICAgIGVTaGlwdGltaXplT3B0aW9ucy5odG1sKFwiPGgzPlNoaXB0aW1pemUgU2V0dGluZ3M8L2gzPlwiICsgb0h0bWwpO1xuICAgICAgZVNoaXB0aW1pemVPcHRpb25zLmluc2VydEFmdGVyKGpRdWVyeShcIiNtYWluZm9ybVwiKSk7XG4gICAgICB0aGlzLmVGb3JtID0galF1ZXJ5KFwiI3NoaXB0aW1pemVvcHRpb25zXCIpOyBcbiAgICAgIHRoaXMuc2F2ZU9wdGlvbnMoalF1ZXJ5KFwiLnNoaXB0aW1pemUtZXh0cmFvcHRpb25zXCIpKTtcbiAgICB9XG5cbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\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
r2757277 r2800002 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
r2757277 r2800002 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
r2757277 r2800002 1 !function(B){var i={};function g(I){if(i[I])return i[I].exports;var Q=i[I]={i:I,l:!1,exports:{}};return B[I].call(Q.exports,Q,Q.exports,g),Q.l=!0,Q.exports}g.m=B,g.c=i,g.d=function(I,Q,B){g.o(I,Q)||Object.defineProperty(I,Q,{enumerable:!0,get:B})},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 B=Object.create(null);if(g.r(B),Object.defineProperty(B,"default",{enumerable:!0,value:Q}),2&I&&"string"!=typeof Q)for(var i in Q)g.d(B,i,function(I){return Q[I]}.bind(null,i));return B},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 = 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLW9wZW4tbWFwLmpzPzg5YzEiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZU9wZW5NYXAiLCJpc1NjcmlwdExvYWRlZCIsIm1hcmtlcnMiLCJtYXAiLCJpY29uX2ZvbGRlciIsInNoaXB0aW1pemVfaWNvbl9mb2xkZXIiLCJpbWFnZVVybCIsIkwiLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsInBvcHVwQW5jaG9yIiwibGF0IiwibG5nIiwibGF0bG5nIiwibGF0TG5nIiwibG9hZFNjcmlwdCIsImZfY2FsbGJhY2siLCJjaXR5IiwiY291bnRyeSIsInBvc3RhbGNvZGUiLCJzdHJlZXRuYW1lIiwicXVlcnlTdHJpbmciLCJzdWJzdHIiLCJqUXVlcnkiLCJnZXRKU09OIiwicmVzcG9uc2UiLCJnZW9jb2RlIiwibGVuZ3RoIiwibG9jYXRpb24iLCJpc28yIiwiYWRkcmVzcyIsImNvdW50cnlfY29kZSIsImxvbiIsImNvbnNvbGUiLCJsb2ciLCJzaGlwcGluZ0RhdGEiLCJncmFudFJlYWR5IiwiZ2VvY29kZUFkZHJlc3MiLCJBZGRyZXNzIiwiQ2l0eSIsIkNvdW50cnkiLCJQb3N0YWxDb2RlIiwiU3RyZWV0bmFtZTEiLCJVdGlscyIsImluamVjdEV4dGVybmFsU2NyaXB0IiwiU0hJUFRJTUlaRV9QTFVHSU5fVVJMIiwibG9hZE1hcCIsInNldFRpbWVvdXQiLCJpY29uX3NlbGVjdGVkIiwiY3JlYXRlSWNvbiIsImljb25fZGVmYXVsdCIsImN1cnJlbnRfaWNvbiIsImdldCIsInRpbGVMYXllciIsImFkZFRvIiwiaSIsInJlbW92ZUxheWVyIiwicGlja3VwUG9pbnRzIiwiY2FsbGJhY2siLCJ4IiwiZ2V0TWFya2VyIiwibWFya2VyIiwib24iLCJmaXRCb3VuZHMiLCJzZXRJY29uIiwiYm90dG9tTGVmdCIsIkxhdCIsIkxvbmciLCJ0b3BSaWdodCIsImNlbnRlclgiLCJwYXJzZUZsb2F0IiwiY2VudGVyWSIsInBhblRvIiwiaW52YWxpZGF0ZVNpemUiLCJwaWNrdXBQb2ludCIsIkluZm9ybWF0aW9uIiwiTmFtZSIsImNhcnJpZXJfaWQiLCJzZXRDYXJyaWVySWNvbiIsImNhcnJpZXJfaWNvbl91cmwiLCJpZHgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7Ozs7O0lBRXFCQSxpQjtBQUVqQixpQ0FBYztBQUFBOztBQUNWLGFBQUtDLGNBQUwsR0FBc0IsS0FBdEI7QUFDQSxhQUFLQyxPQUFMLEdBQWUsRUFBZjtBQUNBLGFBQUtDLEdBQUwsR0FBVyxJQUFYOztBQUVBOzs7O0FBSUEsYUFBS0MsV0FBTCxHQUFtQixPQUFPQyxzQkFBUCxJQUFrQyxXQUFsQyxHQUFnREEsc0JBQWhELEdBQXlFLEVBQTVGO0FBQ0g7O0FBRUQ7Ozs7Ozs7OzttQ0FLV0MsUSxFQUFVO0FBQ2xCLG1CQUFPQyxFQUFFQyxJQUFGLENBQU87QUFDVEMseUJBQVNILFFBREE7QUFFVEksMEJBQVUsQ0FBQyxFQUFELEVBQUssRUFBTCxDQUZELEVBRVc7QUFDcEJDLDRCQUFZLENBQUMsRUFBRCxFQUFLLEVBQUwsQ0FISCxFQUdhO0FBQ3RCQyw2QkFBYSxDQUFDLENBQUMsRUFBRixFQUFNLENBQUMsRUFBUCxDQUpKLENBSWU7QUFKZixhQUFQLENBQVA7QUFNRjs7QUFFRDs7Ozs7OztrQ0FJVUMsRyxFQUFLQyxHLEVBQUk7QUFDZixnQkFBSUMsU0FBU1IsRUFBRVMsTUFBRixDQUFTSCxHQUFULEVBQWNDLEdBQWQsQ0FBYjtBQUNIOztBQUVEOzs7Ozs7O3FDQUlhO0FBQ1QsZ0JBQUksQ0FBQyxLQUFLYixjQUFWLEVBQTBCO0FBQ3RCLHFCQUFLZ0IsVUFBTDtBQUNIO0FBQ0o7O0FBR0g7Ozs7Ozs7Ozs7dUNBT2VDLFUsRUFBWUMsSSxFQUFNQyxPLEVBQVNDLFUsRUFBWUMsVSxFQUFZO0FBQ2hFLGdCQUFJQyxjQUFjLDRFQUNoQixRQURnQixHQUNMSixJQURLLEdBRWhCLFdBRmdCLEdBRUZDLE9BRmhCOztBQUlBLGdCQUFJLE9BQVFD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LGlCQUFLLElBQUl6QixJQUFJLENBQWIsRUFBZ0JBLElBQUksS0FBS3ZELE9BQUwsQ0FBYTJCLE1BQWpDLEVBQXlDLEVBQUU0QixDQUEzQyxFQUE4QztBQUMxQyxxQkFBS3ZELE9BQUwsQ0FBYXVELENBQWIsRUFBZ0JTLE9BQWhCLENBQ0lnQixPQUFPekIsQ0FBUCxHQUNBLEtBQUtQLGFBREwsR0FFQSxLQUFLRyxZQUhUO0FBS0g7QUFDSjs7Ozs7O2tCQS9RZ0JyRCxpQiIsImZpbGUiOiI2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFV0aWxzIGZyb20gJy4vc2hpcHRpbWl6ZS11dGlscy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoaXB0aW1pemVPcGVuTWFwIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmlzU2NyaXB0TG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMubWFya2VycyA9IFtdO1xuICAgICAgICB0aGlzLm1hcCA9IG51bGw7XG5cbiAgICAgICAgLyoqIFxuICAgICAgICAgKiB0aGUgcm9vdCB1cmwgZm9yIHRoZSBpY29ucyBpdCdzIGRpZmZlcmVudCBmb3IgZXZlcnkgcGxhdGZvcm0gIFxuICAgICAgICAgKiBtYWtlIHN1cmUgdG8gaW5jbHVkZSBhIHRyYWlsaW5nIC8gXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmljb25fZm9sZGVyID0gdHlwZW9mKHNoaXB0aW1pemVfaWNvbl9mb2xkZXIpICE9ICd1bmRlZmluZWQnID8gc2hpcHRpbWl6ZV9pY29uX2ZvbGRlciA6ICcnO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdHJpbmcgaW1hZ2VVcmwgLSBmdWxsIHVybCB0byB0aGUgaWNvbiBcbiAgICAgKiBAcmV0dXJuIEwuaWNvbiBvYmplY3QgXG4gICAgICovXG4gICAgY3JlYXRlSWNvbihpbWFnZVVybCkge1xuICAgICAgIHJldHVybiBMLmljb24oe1xuICAgICAgICAgICAgaWNvblVybDogaW1hZ2VVcmwsXG4gICAgICAgICAgICBpY29uU2l6ZTogWzUwLCA1MF0sIC8vIHNpemUgb2YgdGhlIGljb24gXG4gICAgICAgICAgICBpY29uQW5jaG9yOiBbMjUsIDI1XSwgLy8gcG9pbnQgb2YgdGhlIGljb24gd2hpY2ggd2lsbCBjb3JyZXNwb25kIHRvIG1hcmtlcidzIGxvY2F0aW9uIFxuICAgICAgICAgICAgcG9wdXBBbmNob3I6IFstMjUsIC01MF0gLy8gcG9pbnQgZnJvbSB3aGljaCB0aGUgcG9wdXAgc2hvdWxkIG9wZW4gcmVsYXRpdmUgdG8gdGhlIGljb25BbmNob3JcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIEBwYXJhbSBkZWNpbWFsIGxhdCBcbiAgICAgKiBAcGFyYW0gZGVjaW1hbCBsbmcgXG4gICAgICovIFxuICAgIGNlbnRlck1hcChsYXQsIGxuZyl7XG4gICAgICAgIGxldCBsYXRsbmcgPSBMLmxhdExuZyhsYXQsIGxuZyk7ICBcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogaWYgdGhlIHNjcmlwdCBoYXMgbm90IGJlZW4gbG9hZGVkICwgbG9hZCBpdC4gXG4gICAgICogV2UgdXNlIHRoaXMgZnVuY3Rpb24gYmVjYXVzZSB3ZSBvbmx5IHdhbnQgdG8gbG9hZCB0aGUgc2NyaXB0IHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBidXR0b24gXG4gICAgICovXG4gICAgZ3JhbnRSZWFkeSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2NyaXB0TG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRTY3JpcHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gIC8qKiBcbiAgICogQHBhcmFtIGZfY2FsbGJhY2sgd2hhdCBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHJlcXVlc3QgcmVzb2x2ZXMgXG4gICAqIEBwYXJhbSBjaXR5IC0gY2l0eSBuYW1lIFxuICAgKiBAcGFyYW0gY291bnRyeSAtIGNvdW50cnkgaW4gaXNvMiB1cHBlcmNhc2UgXG4gICAqIEBwYXJhbSBwb3N0YWxjb2RlIC0gdGhlIHBvc3RhbCBjb2RlIFxuICAgKiBAcGFyYW0gc3RyZWV0bmFtZSAtIHRoZSBzdHJlZXRuYW1lIFxuICAgKi9cbiAgZ2VvY29kZUFkZHJlc3MoZl9jYWxsYmFjaywgY2l0eSwgY291bnRyeSwgcG9zdGFsY29kZSwgc3RyZWV0bmFtZSkge1xuICAgIHZhciBxdWVyeVN0cmluZyA9IFwiaHR0cHM6Ly9ub21pbmF0aW0ub3BlbnN0cmVldG1hcC5vcmcvc2VhcmNoP2Zvcm1hdD1qc29uJmFkZHJlc3NkZXRhaWxzPTFcIiArXG4gICAgICBcIiZjaXR5PVwiICsgY2l0eSArXG4gICAgICBcIiZjb3VudHJ5PVwiICsgY291bnRyeTtcblxuICAgIGlmICh0eXBlb2YgKHBvc3RhbGNvZGUpICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoY291bnRyeSA9PSAnUFQnIHx8IGNvdW50cnkgPT0gJ1BvcnR1Z2FsJykge1xuICAgICAgICBwb3N0YWxjb2RlID0gcG9zdGFsY29kZS5zdWJzdHIoMCwgNCk7XG4gICAgICB9XG4gICAgICBxdWVyeVN0cmluZyArPSBcIiZwb3N0YWxjb2RlPVwiICsgcG9zdGFsY29kZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIChzdHJlZXRuYW1lKSAhPSAndW5kZWZpbmVkJykge1xuICAgICAgcXVlcnlTdHJpbmcgKz0gXCImc3RyZWV0PVwiICsgc3RyZWV0bmFtZTtcbiAgICB9XG5cbiAgICBqUXVlcnkuZ2V0SlNPTihxdWVyeVN0cmluZywge30sIGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgbGV0IGdlb2NvZGUgPSB7XG4gICAgICAgICdpc28yJzogJycsXG4gICAgICAgICdsYXQnOiAnJyxcbiAgICAgICAgJ2xuZyc6ICcnXG4gICAgICB9O1xuXG4gICAgICBpZiAocmVzcG9uc2UubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgbG9jYXRpb24gPSByZXNwb25zZVswXTtcblxuICAgICAgICBnZW9jb2RlLmlzbzIgPSBsb2NhdGlvbi5hZGRyZXNzLmNvdW50cnlfY29kZTtcblxuICAgICAgICBnZW9jb2RlLmxhdCA9IGxvY2F0aW9uLmxhdDtcbiAgICAgICAgZ2VvY29kZS5sbmcgPSBsb2NhdGlvbi5sb247XG4gICAgICB9XG4gICAgICBmX2NhbGxiYWNrKGdlb2NvZGUpO1xuXG4gICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICBcbiAgICogQHBhcmFtIHNoaXBwaW5nRGF0YSwgdGhlIGFkZHJlc3MgcGFydHMgICAgICAgXG4gICAqIEBwYXJhbSBmX2NhbGxiYWNrICwgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbGwgbWlnaHR5IGdvb2dsZSByZXR1cm5zIGEgcmVzdWx0IFxuICAgKi9cbiAgZ2VvY29kZShzaGlwcGluZ0RhdGEsIGZfY2FsbGJhY2spIHtcbiAgICBjb25zb2xlLmxvZyhzaGlwcGluZ0RhdGEpO1xuICAgIHRoaXMuZ3JhbnRSZWFkeSgpO1xuXG4gICAgdGhpcy5nZW9jb2RlQWRkcmVzcygoZ2VvY29kZSkgPT4ge1xuICAgICAgaWYgKCFnZW9jb2RlLmxhdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW9jb2RlQWRkcmVzcyhmdW5jdGlvbiAoZ2VvY29kZSkge1xuICAgICAgICAgIGZfY2FsbGJhY2soZ2VvY29kZSk7XG4gICAgICAgIH0sIHNoaXBwaW5nRGF0YS5BZGRyZXNzLkNpdHksIHNoaXBwaW5nRGF0YS5BZGRyZXNzLkNvdW50cnkpO1xuICAgICAgfVxuXG4gICAgICBmX2NhbGxiYWNrKGdlb2NvZGUpO1xuICAgIH0sIHNoaXBwaW5nRGF0YS5BZGRyZXNzLkNpdHksIHNoaXBwaW5nRGF0YS5BZGRyZXNzLkNvdW50cnksIHNoaXBwaW5nRGF0YS5BZGRyZXNzLlBvc3RhbENvZGUsIHNoaXBwaW5nRGF0YS5BZGRyZXNzLlN0cmVldG5hbWUxKTtcbiAgfVxuICAgIGxvYWRTY3JpcHQoKSB7XG4gICAgICAgIFV0aWxzLmluamVjdEV4dGVybmFsU2NyaXB0KFNISVBUSU1JWkVfUExVR0lOX1VSTCArIFwiYXNzZXRzL2pzL2xlYWZsZXQtMS40LjAuanNcIik7XG4gICAgICAgIHRoaXMuaXNTY3JpcHRMb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRNYXAoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBMZWFmbGV0IGRvZXMgbm90IHJlY2VpdmUgYSBjYWxsYmFjayBzbyB3ZSB3YWl0IGhlcmUgZm9yIHRoZSBzY3JpcHQgdG8gYmUgbG9hZGVkIFxuICAgICAqL1xuICAgIGxvYWRNYXAoKSB7XG4gICAgICAgIGlmICh0eXBlb2YoTCkgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmxvYWRNYXAoKTsgfSwgMjAwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaWNvbl9zZWxlY3RlZCA9IHRoaXMuY3JlYXRlSWNvbihzaGlwdGltaXplX2ljb25fZm9sZGVyICsgJ3NlbGVjdGVkLnBuZycpO1xuICAgICAgICB0aGlzLmljb25fZGVmYXVsdCA9IHRoaXMuY3JlYXRlSWNvbihzaGlwdGltaXplX2ljb25fZm9sZGVyICsgJ2RlZmF1bHQucG5nJyk7XG4gICAgICAgIHRoaXMuY3VycmVudF9pY29uID0gdGhpcy5pY29uX2RlZmF1bHQ7XG5cbiAgICAgICAgdGhpcy5tYXAgPSBuZXcgTC5tYXAoalF1ZXJ5KFwiLnNoaXB0aW1pemUtcGlja3VwX19tYXBcIikuZ2V0KDApLCB7XG4gICAgICAgICAgICBcInpvb21cIjogMTYsXG4gICAgICAgICAgICBcImNlbnRlclwiOiBbNTEuNTA1LCAtMC4wOV1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgTC50aWxlTGF5ZXIoJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywge1xuICAgICAgICAgICAgXCJhdHRyaWJ1dGlvblwiOiAnJmNvcHk7IDxhIGhyZWY9XCJodHRwczovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIj5PcGVuU3RyZWV0TWFwPC9hPiBjb250cmlidXRvcnMnXG4gICAgICAgIH0pLmFkZFRvKHRoaXMubWFwKTtcbiAgICB9XG5cbiAgICBjbGVhck1hcmtlcnMoKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcmtlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1hcmtlcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcC5yZW1vdmVMYXllcih0aGlzLm1hcmtlcnNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFya2VycyA9IFtdO1xuICAgIH1cblxuXG4gICAgLyoqIFxuICAgICAqIEFkZCB0aGUgbWFya2VycyB0byBtYXAgXG4gICAgICogQHBhcmFtIGFycmF5IHBpY2t1cFBvaW50cyAtIGFuIGFycmF5IG9mIHBpY2t1cFBvaW50c1xuICAgICAqIEBwYXJhbSBmdW5jdGlvbiBjYWxsYmFjayBcbiAgICAgKi9cbiAgICBhZGRNYXJrZXJzKHBpY2t1cFBvaW50cywgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5waWNrdXBQb2ludHMgPSBwaWNrdXBQb2ludHM7IFxuXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgcGlja3VwUG9pbnRzLmxlbmd0aDsgKyt4KSB7XG4gICAgICAgICAgICB0aGlzLm1hcmtlcnNbeF0gPSB0aGlzLmdldE1hcmtlcihwaWNrdXBQb2ludHNbeF0pO1xuICAgICAgICAgICAgLy8gICAgd2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UgdGhlIHZhbHVlcyBmb3IgbGF0LGxuZyB3ZSBoYXZlIGFyZSByb3VuZGVkLCBzbyB0aGV5IHdpbGwgbm90IG1hdGNoIHRoZSBvbmVzIHJldHVybmVkIGJ5IGdvb2dsZVxuICAgICAgICAgICAgdGhpcy5waWNrdXBQb2ludHNbeF0ubWFya2VyID0gdGhpcy5tYXJrZXJzW3hdO1xuXG4gICAgICAgICAgICB0aGlzLm1hcmtlcnNbeF0ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmKHR5cGVvZihjYWxsYmFjaykgPT0gJ2Z1bmN0aW9uJyl7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXRCb3VuZHMoKTtcbiAgICB9XG5cbiAgICByZXNldE1hcmtlcihtYXJrZXIpIHtcbiAgICAgICAgbWFya2VyLnNldEljb24odGhpcy5pY29uX2RlZmF1bHQpO1xuICAgIH1cblxuICAgIHNlbGVjdE1hcmtlcihtYXJrZXIpIHtcbiAgICAgICAgbWFya2VyLnNldEljb24odGhpcy5pY29uX3NlbGVjdGVkKTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQWRqdXN0IHRoZSB6b29tIGluIHRoZSBtYXAgdG8gZGlzcGxheSBhbGwgdGhlIG1hcmtlcnMgXG4gICAgICogVGhlcmUncyBhIGZpdCBib3VuZHMgdGhhdCByZWNlaXZlcyAyIGNvcm5lcnMsIGJ1dCBjYWxjdWxhdGluZyB0aGVtIGlzIHVwIHRvIHVzLiBcbiAgICAgKiBjb3JuZXJzOiB0b3AgbGVmdCwgYm90dG9tIHJpZ2h0ICAgICBcbiAgICAgKiB0aGVuIHdlIGNlbnRlciB0aGUgbWFwIGF0IHRoZSBjZW50ZXIgb2YgdGhlIHNxdWFyZSAgXG4gICAgICovXG4gICAgZml0Qm91bmRzKCkge1xuICAgICAgICBsZXQgYm90dG9tTGVmdCA9IFt0aGlzLnBpY2t1cFBvaW50c1swXS5MYXQsIHRoaXMucGlja3VwUG9pbnRzWzBdLkxvbmddO1xuICAgICAgICBsZXQgdG9wUmlnaHQgPSBbdGhpcy5waWNrdXBQb2ludHNbMF0uTGF0LCB0aGlzLnBpY2t1cFBvaW50c1swXS5Mb25nXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGlja3VwUG9pbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgbGF0ID0gdGhpcy5waWNrdXBQb2ludHNbaV0uTGF0O1xuICAgICAgICAgICAgbGV0IGxuZyA9IHRoaXMucGlja3VwUG9pbnRzW2ldLkxvbmc7XG5cbiAgICAgICAgICAgIGlmIChsYXQgPCBib3R0b21MZWZ0WzBdKSB7XG4gICAgICAgICAgICAgICAgYm90dG9tTGVmdFswXSA9IGxhdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxhdCA+IHRvcFJpZ2h0WzBdKSB7XG4gICAgICAgICAgICAgICAgdG9wUmlnaHRbMF0gPSBsYXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsbmcgPiB0b3BSaWdodFsxXSkge1xuICAgICAgICAgICAgICAgIHRvcFJpZ2h0WzFdID0gbG5nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobG5nIDwgYm90dG9tTGVmdFsxXSkge1xuICAgICAgICAgICAgICAgIGJvdHRvbUxlZnRbMV0gPSBsbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBjZW50ZXJYID0gcGFyc2VGbG9hdChib3R0b21MZWZ0WzBdKSArIChwYXJzZUZsb2F0KHRvcFJpZ2h0WzBdKSAtIHBhcnNlRmxvYXQoYm90dG9tTGVmdFswXSkpIC8gMjtcbiAgICAgICAgbGV0IGNlbnRlclkgPSBwYXJzZUZsb2F0KGJvdHRvbUxlZnRbMV0pICsgKHBhcnNlRmxvYXQodG9wUmlnaHRbMV0pIC0gcGFyc2VGbG9hdChib3R0b21MZWZ0WzFdKSkgLyAyO1xuXG4gICAgICAgIHRoaXMubWFwLnBhblRvKFtjZW50ZXJYLCBjZW50ZXJZXSk7XG5cbiAgICAgICAgdGhpcy5tYXAuZml0Qm91bmRzKFtcbiAgICAgICAgICAgIGJvdHRvbUxlZnQsXG4gICAgICAgICAgICB0b3BSaWdodFxuICAgICAgICBdKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7IHRoaXMubWFwLmludmFsaWRhdGVTaXplKCl9LCAyMDApO1xuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBSZXR1cm4gYSBtYXJrZXIgZm9yIHRoZSBvcGVuTGF5ZXJzIFxuICAgICAqIEljb25BbmNob3I6IFRoZSBjb29yZGluYXRlcyBvZiB0aGUgXCJ0aXBcIiBvZiB0aGUgaWNvbiAocmVsYXRpdmUgdG8gaXRzIHRvcCBsZWZ0IGNvcm5lcikuIFxuICAgICAqIFRoZSBpY29uIHdpbGwgYmUgYWxpZ25lZCBzbyB0aGF0IHRoaXMgcG9pbnQgaXMgYXQgdGhlIG1hcmtlcidzIGdlb2dyYXBoaWNhbCBsb2NhdGlvbi4gXG4gICAgICogQ2VudGVyZWQgYnkgZGVmYXVsdCBpZiBzaXplIGlzIHNwZWNpZmllZCwgYWxzbyBjYW4gYmUgc2V0IGluIENTUyB3aXRoIG5lZ2F0aXZlIG1hcmdpbnMuXG4gICAgICovXG4gICAgZ2V0TWFya2VyKHBpY2t1cFBvaW50KSB7XG4gICAgICAgIGxldCBtYXJrZXIgPSBMLm1hcmtlcihbcGlja3VwUG9pbnQuTGF0LCBwaWNrdXBQb2ludC5Mb25nXSwge1xuICAgICAgICAgICAgXCJpY29uXCI6IHRoaXMuY3VycmVudF9pY29uLFxuICAgICAgICAgICAgXCJ0aXRsZVwiOiBwaWNrdXBQb2ludC5JbmZvcm1hdGlvbi5OYW1lICsgXCJcXG5cIiArIHBpY2t1cFBvaW50LkluZm9ybWF0aW9uLkFkZHJlc3NcbiAgICAgICAgfSk7XG4gICAgICAgIG1hcmtlci5hZGRUbyh0aGlzLm1hcCk7XG4gICAgICAgIHJldHVybiBtYXJrZXI7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIENoZWNrcyBpZiB3ZSBoYXZlIGFuIGljb24gZm9yIHRoaXMgY2Fycmllci5cbiAgICAgKiBJZiB5ZXMgdGhlbiBjaGFuZ2UgdGhlIGNhcnJpZXIgaWNvblxuICAgICAqIElmIG5vdCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBpY29uXG4gICAgICogXG4gICAgICogQHBhcmFtIGludCBjYXJyaWVyX2lkIC0gdGhlIGNhcnJpZXIgaWQgXG4gICAgICovXG4gICAgc2V0Q2Fycmllckljb24oY2Fycmllcl9pZCkge1xuICAgICAgICBpZiAodHlwZW9mKEwpID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5zZXRDYXJyaWVySWNvbihjYXJyaWVyX2lkKTsgfSwgMjAwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2Fycmllcl9pY29uX3VybCA9IHRoaXMuaWNvbl9mb2xkZXIgKyAnJyArIGNhcnJpZXJfaWQgKyAnLnBuZyc7XG4gICAgICAgIC8vdGhpcy5jdXJyZW50X2ljb24gPSBVdGlscy5pc1VybFZhbGlkKGNhcnJpZXJfaWNvbl91cmwpID8gdGhpcy5jcmVhdGVJY29uKGNhcnJpZXJfaWNvbl91cmwpIDogdGhpcy5pY29uX2RlZmF1bHQ7XG4gICAgICAgIHRoaXMuY3VycmVudF9pY29uID0gdGhpcy5jcmVhdGVJY29uKGNhcnJpZXJfaWNvbl91cmwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0IGFsbCBtYXJrZXJzICBcbiAgICAgKiBTZWxlY3QgdGhlIG1hcmtlciBvZiBpbmRleCBpZHggaW4gbWFwIFxuICAgICAqIEBwYXJhbSBpbnQgaWR4IC0gdGhlIGluZGV4IHRvIHNlbGVjdCBcbiAgICAgKi9cbiAgICBzZWxlY3RNYXJrZXJCeUlkeChpZHgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1hcmtlcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHRoaXMubWFya2Vyc1tpXS5zZXRJY29uKFxuICAgICAgICAgICAgICAgIGlkeCA9PSBpID9cbiAgICAgICAgICAgICAgICB0aGlzLmljb25fc2VsZWN0ZWQgOlxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudF9pY29uXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxufSJdLCJzb3VyY2VSb290IjoiIn0=\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLWdtYXBzLmpzPzBiZjEiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZUdtYXBzIiwia2V5IiwiaXNTY3JpcHRMb2FkZWQiLCJtYXJrZXJzIiwibWFwIiwicGlja3VwUG9pbnRzIiwiaWNvbl9mb2xkZXIiLCJzaGlwdGltaXplX2ljb25fZm9sZGVyIiwiaWNvbl9zZWxlY3RlZCIsImljb25fZGVmYXVsdCIsImN1cnJlbnRfaWNvbiIsImNhcnJpZXJfaWQiLCJjYXJyaWVyX2ljb25fdXJsIiwibG9hZFNjcmlwdCIsIlV0aWxzIiwiaW5qZWN0RXh0ZXJuYWxTY3JpcHQiLCJjb25zb2xlIiwibG9nIiwialF1ZXJ5Iiwid2lkdGgiLCJoZWlnaHQiLCJnZXQiLCJnb29nbGUiLCJtYXBzIiwiTWFwIiwiY2VudGVyIiwibGF0IiwibG5nIiwiem9vbSIsIm1hcFR5cGVDb250cm9sIiwic2V0Q2VudGVyIiwiTGF0TG5nIiwiZ2VvY29kZSIsImFkZHJlc3NfY29tcG9uZW50cyIsImNvbXBvbmVudHMiLCJpIiwibGVuZ3RoIiwidHlwZXMiLCJqIiwic2hvcnRfbmFtZSIsInNoaXBwaW5nRGF0YSIsImZfY2FsbGJhY2siLCJzZXRUaW1lb3V0IiwiZ2VvY29kZXIiLCJHZW9jb2RlciIsIm1lIiwiYWRkcmVzcyIsIkFkZHJlc3MiLCJTdHJlZXRuYW1lMSIsIlN0cmVldG5hbWUyIiwicG9zdGFsQ29kZSIsIkNpdHkiLCJTdGF0ZSIsIkNvdW50cnkiLCJyZXN1bHRzIiwic3RhdHVzIiwiaXNvMiIsImxhdGxuZyIsImdlb21ldHJ5IiwibG9jYXRpb24iLCJnZXRDb3VudHJ5Q29kZUZyb21SZXN1bHQiLCJzZXRNYXAiLCJjYWxsYmFjayIsIngiLCJnZXRNYXJrZXIiLCJtYXJrZXIiLCJhZGRMaXN0ZW5lciIsImZpdEJvdW5kcyIsInBpY2t1cFBvaW50IiwiTWFya2VyIiwicG9zaXRpb24iLCJMYXQiLCJMb25nIiwiaWNvbiIsInVybCIsInNjYWxlZFNpemUiLCJTaXplIiwib3JpZ2luIiwiUG9pbnQiLCJhbmNob3IiLCJib3VuZHMiLCJMYXRMbmdCb3VuZHMiLCJleHRlbmQiLCJnZXRQb3NpdGlvbiIsImlkeCIsInNlbGVjdGVkIiwiY3VyciIsInNldEljb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7Ozs7O0lBRXFCQSxlO0FBRWpCLDZCQUFZQyxHQUFaLEVBQWlCO0FBQUE7O0FBQ2IsYUFBS0MsY0FBTCxHQUFzQixLQUF0QjtBQUNBLGFBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0EsYUFBS0MsR0FBTCxHQUFXLElBQVg7QUFDQSxhQUFLQyxZQUFMLEdBQW9CLEVBQXBCO0FBQ0EsYUFBS0osR0FBTCxHQUFXQSxHQUFYOztBQUVBOzs7O0FBSUEsYUFBS0ssV0FBTCxHQUFtQixPQUFPQyxzQkFBUCxJQUFrQyxXQUFsQyxHQUFpREEsc0JBQWpELEdBQTBFLEVBQTdGO0FBQ0EsYUFBS0MsYUFBTCxHQUFxQixLQUFLRixXQUFMLEdBQWlCLGNBQXRDO0FBQ0EsYUFBS0csWUFBTCxHQUFvQixLQUFLSCxXQUFMLEdBQWlCLGFBQXJDO0FBQ0EsYUFBS0ksWUFBTCxHQUFvQixLQUFLRCxZQUF6QjtBQUNIOztBQUdEOzs7Ozs7Ozs7Ozt1Q0FPZUUsVSxFQUFXO0FBQ3hCLGdCQUFJQyxtQkFBbUIsS0FBS04sV0FBTCxHQUFpQixFQUFqQixHQUFvQkssVUFBcEIsR0FBK0IsTUFBdEQ7QUFDQTtBQUNBLGlCQUFLRCxZQUFMLEdBQW9CRSxnQkFBcEI7QUFDRDs7QUFHRDs7Ozs7O3FDQUdhO0FBQ1QsZ0JBQUksQ0FBQyxLQUFLVixjQUFWLEVBQTBCO0FBQ3RCLHFCQUFLVyxVQUFMO0FBQ0g7QUFDSjs7O3FDQUVZO0FBQ1RDLHNDQUFNQyxvQkFBTixDQUEyQixpREFBaUQsS0FBS2QsR0FBdEQsR0FBNEQsOEJBQXZGO0FBQ0EsaUJBQUtDLGNBQUwsR0FBc0IsSUFBdEI7QUFDSDs7QUFFRDs7Ozs7OztrQ0FJVTtBQUNOYyxvQkFBUUMsR0FBUixDQUFZLHND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QUFJQyxXQUFXO0FBQ1BYLHFCQUFNLEtBQUtsRSxhQURKO0FBRVBtRSw0QkFBWSxJQUFJckQsT0FBT0MsSUFBUCxDQUFZcUQsSUFBaEIsQ0FBcUIsRUFBckIsRUFBeUIsRUFBekIsQ0FGTCxFQUVtQztBQUMxQ0Msd0JBQVEsSUFBSXZELE9BQU9DLElBQVAsQ0FBWXVELEtBQWhCLENBQXNCLENBQXRCLEVBQXdCLENBQXhCLENBSEQsRUFHNkI7QUFDcENDLHdCQUFRLElBQUl6RCxPQUFPQyxJQUFQLENBQVl1RCxLQUFoQixDQUFzQixDQUF0QixFQUF5QixDQUF6QixDQUpELENBSTZCO0FBSjdCLGFBQWY7QUFNQSxnQkFBSVEsT0FBTztBQUNIWixxQkFBTSxLQUFLaEUsWUFEUjtBQUVIaUUsNEJBQVksSUFBSXJELE9BQU9DLElBQVAsQ0FBWXFELElBQWhCLENBQXFCLEVBQXJCLEVBQXlCLEVBQXpCLENBRlQsRUFFdUM7QUFDMUNDLHdCQUFRLElBQUl2RCxPQUFPQyxJQUFQLENBQVl1RCxLQUFoQixDQUFzQixDQUF0QixFQUF3QixDQUF4QixDQUhMLEVBR2lDO0FBQ3BDQyx3QkFBUSxJQUFJekQsT0FBT0MsSUFBUCxDQUFZdUQsS0FBaEIsQ0FBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsQ0FKTCxDQUlpQztBQUpqQyxhQUFYOztBQU9BLGlCQUFLLElBQUkzQyxJQUFJLENBQWIsRUFBZ0JBLElBQUksS0FBS2hDLE9BQUwsQ0FBYWlDLE1BQWpDLEVBQXlDLEVBQUVELENBQTNDLEVBQThDO0FBQzFDLHFCQUFLaEMsT0FBTCxDQUFhZ0MsQ0FBYixFQUFnQm9ELE9BQWhCLENBQ0VILE9BQU9qRCxDQUFQLEdBRUFrRCxRQUZBLEdBSUFDLElBTEY7QUFPSDtBQUNKOzs7Ozs7a0JBMU5nQnRGLGUiLCJmaWxlIjoiLi9qcy9zaGlwdGltaXplLWdtYXBzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFV0aWxzIGZyb20gJy4vc2hpcHRpbWl6ZS11dGlscy5qcyc7ICBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hpcHRpbWl6ZUdtYXBzIHtcblxuICAgIGNvbnN0cnVjdG9yKGtleSkge1xuICAgICAgICB0aGlzLmlzU2NyaXB0TG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMubWFya2VycyA9IFtdO1xuICAgICAgICB0aGlzLm1hcCA9IG51bGw7XG4gICAgICAgIHRoaXMucGlja3VwUG9pbnRzID0gW107XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuXG4gICAgICAgIC8qKiBcbiAgICAgICAgICogdGhlIHJvb3QgdXJsIGZvciB0aGUgaWNvbnMgaXQncyBkaWZmZXJlbnQgZm9yIGV2ZXJ5IHBsYXRmb3JtICBcbiAgICAgICAgICogbWFrZSBzdXJlIHRvIGluY2x1ZGUgYSB0cmFpbGluZyAvIFxuICAgICAgICAgKi8gXG4gICAgICAgIHRoaXMuaWNvbl9mb2xkZXIgPSB0eXBlb2Yoc2hpcHRpbWl6ZV9pY29uX2ZvbGRlcikgIT0gJ3VuZGVmaW5lZCcgPyAgc2hpcHRpbWl6ZV9pY29uX2ZvbGRlciA6ICcnOyAgXG4gICAgICAgIHRoaXMuaWNvbl9zZWxlY3RlZCA9IHRoaXMuaWNvbl9mb2xkZXIrJ3NlbGVjdGVkLnBuZyc7XG4gICAgICAgIHRoaXMuaWNvbl9kZWZhdWx0ID0gdGhpcy5pY29uX2ZvbGRlcisnZGVmYXVsdC5wbmcnO1xuICAgICAgICB0aGlzLmN1cnJlbnRfaWNvbiA9IHRoaXMuaWNvbl9kZWZhdWx0OyBcbiAgICB9XG5cblxuICAgIC8qKiBcbiAgICAgKiBDaGVja3MgaWYgd2UgaGF2ZSBhbiBpY29uIGZvciB0aGlzIGNhcnJpZXIuXG4gICAgICogSWYgeWVzIHRoZW4gY2hhbmdlIHRoZSBjYXJyaWVyIGljb25cbiAgICAgKiBJZiBub3QgdGhlbiB1c2UgdGhlIGRlZmF1bHQgaWNvblxuICAgICAqIFxuICAgICAqIEBwYXJhbSBpbnQgY2Fycmllcl9pZCAtIHRoZSBjYXJyaWVyIGlkIFxuICAgICAqLyBcbiAgICBzZXRDYXJyaWVySWNvbihjYXJyaWVyX2lkKXtcbiAgICAgIGxldCBjYXJyaWVyX2ljb25fdXJsID0gdGhpcy5pY29uX2ZvbGRlcisnJytjYXJyaWVyX2lkKycucG5nJzsgXG4gICAgICAvL3RoaXMuY3VycmVudF9pY29uID0gVXRpbHMuaXNVcmxWYWxpZChjYXJyaWVyX2ljb25fdXJsKSA/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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zaGlwdGltaXplLW9wZW4tbWFwLmpzPzg5YzEiXSwibmFtZXMiOlsiU2hpcHRpbWl6ZU9wZW5NYXAiLCJpc1NjcmlwdExvYWRlZCIsIm1hcmtlcnMiLCJtYXAiLCJpY29uX2ZvbGRlciIsInNoaXB0aW1pemVfaWNvbl9mb2xkZXIiLCJpbWFnZVVybCIsIkwiLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsInBvcHVwQW5jaG9yIiwibGF0IiwibG5nIiwibGF0bG5nIiwibGF0TG5nIiwibG9hZFNjcmlwdCIsImZfY2FsbGJhY2siLCJjaXR5IiwiY291bnRyeSIsInBvc3RhbGNvZGUiLCJzdHJlZXRuYW1lIiwicXVlcnlTdHJpbmciLCJzdWJzdHIiLCJqUXVlcnkiLCJnZXRKU09OIiwicmVzcG9uc2UiLCJnZW9jb2RlIiwibGVuZ3RoIiwibG9jYXRpb24iLCJpc28yIiwiYWRkcmVzcyIsImNvdW50cnlfY29kZSIsImxvbiIsImNvbnNvbGUiLCJsb2ciLCJzaGlwcGluZ0RhdGEiLCJncmFudFJlYWR5IiwiZ2VvY29kZUFkZHJlc3MiLCJBZGRyZXNzIiwiQ2l0eSIsIkNvdW50cnkiLCJQb3N0YWxDb2RlIiwiU3RyZWV0bmFtZTEiLCJVdGlscyIsImluamVjdEV4dGVybmFsU2NyaXB0IiwiU0hJUFRJTUlaRV9QTFVHSU5fVVJMIiwibG9hZE1hcCIsInNldFRpbWVvdXQiLCJpY29uX3NlbGVjdGVkIiwiY3JlYXRlSWNvbiIsImljb25fZGVmYXVsdCIsImN1cnJlbnRfaWNvbiIsImdldCIsInRpbGVMYXllciIsImFkZFRvIiwiaSIsInJlbW92ZUxheWVyIiwicGlja3VwUG9pbnRzIiwiY2FsbGJhY2siLCJ4IiwiZ2V0TWFya2VyIiwibWFya2VyIiwib24iLCJmaXRCb3VuZHMiLCJzZXRJY29uIiwiYm90dG9tTGVmdCIsIkxhdCIsIkxvbmciLCJ0b3BSaWdodCIsImNlbnRlclgiLCJwYXJzZUZsb2F0IiwiY2VudGVyWSIsInBhblRvIiwiaW52YWxpZGF0ZVNpemUiLCJwaWNrdXBQb2ludCIsIkluZm9ybWF0aW9uIiwiTmFtZSIsImNhcnJpZXJfaWQiLCJzZXRDYXJyaWVySWNvbiIsImNhcnJpZXJfaWNvbl91cmwiLCJpZHgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7Ozs7O0lBRXFCQSxpQjtBQUVqQixpQ0FBYztBQUFBOztBQUNWLGFBQUtDLGNBQUwsR0FBc0IsS0FBdEI7QUFDQSxhQUFLQyxPQUFMLEdBQWUsRUFBZjtBQUNBLGFBQUtDLEdBQUwsR0FBVyxJQUFYOztBQUVBOzs7O0FBSUEsYUFBS0MsV0FBTCxHQUFtQixPQUFPQyxzQkFBUCxJQUFrQyxXQUFsQyxHQUFnREEsc0JBQWhELEdBQXlFLEVBQTVGO0FBQ0g7O0FBRUQ7Ozs7Ozs7OzttQ0FLV0MsUSxFQUFVO0FBQ2xCLG1CQUFPQyxFQUFFQyxJQUFGLENBQU87QUFDVEMseUJBQVNILFFBREE7QUFFVEksMEJBQVUsQ0FBQyxFQUFELEVBQUssRUFBTCxDQUZELEVBRVc7QUFDcEJDLDRCQUFZLENBQUMsRUFBRCxFQUFLLEVBQUwsQ0FISCxFQUdhO0FBQ3RCQyw2QkFBYSxDQUFDLENBQUMsRUFBRixFQUFNLENBQUMsRUFBUCxDQUpKLENBSWU7QUFKZixhQUFQLENBQVA7QUFNRjs7QUFFRDs7Ozs7OztrQ0FJVUMsRyxFQUFLQyxHLEVBQUk7QUFDZixnQkFBSUMsU0FBU1IsRUFBRVMsTUFBRixDQUFTSCxHQUFULEVBQWNDLEdBQWQsQ0FBYjtBQUNIOztBQUVEOzs7Ozs7O3FDQUlhO0FBQ1QsZ0JBQUksQ0FBQyxLQUFLYixjQUFWLEVBQTBCO0FBQ3RCLHFCQUFLZ0IsVUFBTDtBQUNIO0FBQ0o7O0FBR0g7Ozs7Ozs7Ozs7dUNBT2VDLFUsRUFBWUMsSSxFQUFNQyxPLEVBQVNDLFUsRUFBWUMsVSxFQUFZO0FBQ2hFLGdCQUFJQyxjQUFjLDRFQUNoQixRQURnQixHQUNMSixJQURLLEdBRWhCLFdBRmdCLEdBRUZDLE9BRmhCOztBQUlBLGdCQUFJLE9BQVFD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LGlCQUFLLElBQUl6QixJQUFJLENBQWIsRUFBZ0JBLElBQUksS0FBS3ZELE9BQUwsQ0FBYTJCLE1BQWpDLEVBQXlDLEVBQUU0QixDQUEzQyxFQUE4QztBQUMxQyxxQkFBS3ZELE9BQUwsQ0FBYXVELENBQWIsRUFBZ0JTLE9BQWhCLENBQ0lnQixPQUFPekIsQ0FBUCxHQUNBLEtBQUtQLGFBREwsR0FFQSxLQUFLRyxZQUhUO0FBS0g7QUFDSjs7Ozs7O2tCQS9RZ0JyRCxpQiIsImZpbGUiOiIuL2pzL3NoaXB0aW1pemUtb3Blbi1tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVXRpbHMgZnJvbSAnLi9zaGlwdGltaXplLXV0aWxzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hpcHRpbWl6ZU9wZW5NYXAge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaXNTY3JpcHRMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gW107XG4gICAgICAgIHRoaXMubWFwID0gbnVsbDtcblxuICAgICAgICAvKiogXG4gICAgICAgICAqIHRoZSByb290IHVybCBmb3IgdGhlIGljb25zIGl0J3MgZGlmZmVyZW50IGZvciBldmVyeSBwbGF0Zm9ybSAgXG4gICAgICAgICAqIG1ha2Ugc3VyZSB0byBpbmNsdWRlIGEgdHJhaWxpbmcgLyBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaWNvbl9mb2xkZXIgPSB0eXBlb2Yoc2hpcHRpbWl6ZV9pY29uX2ZvbGRlcikgIT0gJ3VuZGVmaW5lZCcgPyBzaGlwdGltaXplX2ljb25fZm9sZGVyIDogJyc7XG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmluZyBpbWFnZVVybCAtIGZ1bGwgdXJsIHRvIHRoZSBpY29uIFxuICAgICAqIEByZXR1cm4gTC5pY29uIG9iamVjdCBcbiAgICAgKi9cbiAgICBjcmVhdGVJY29uKGltYWdlVXJsKSB7XG4gICAgICAgcmV0dXJuIEwuaWNvbih7XG4gICAgICAgICAgICBpY29uVXJsOiBpbWFnZVVybCxcbiAgICAgICAgICAgIGljb25TaXplOiBbNTAsIDUwXSwgLy8gc2l6ZSBvZiB0aGUgaWNvbiBcbiAgICAgICAgICAgIGljb25BbmNob3I6IFsyNSwgMjVdLCAvLyBwb2ludCBvZiB0aGUgaWNvbiB3aGljaCB3aWxsIGNvcnJlc3BvbmQgdG8gbWFya2VyJ3MgbG9jYXRpb24gXG4gICAgICAgICAgICBwb3B1cEFuY2hvcjogWy0yNSwgLTUwXSAvLyBwb2ludCBmcm9tIHdoaWNoIHRoZSBwb3B1cCBzaG91bGQgb3BlbiByZWxhdGl2ZSB0byB0aGUgaWNvbkFuY2hvclxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogXG4gICAgICogQHBhcmFtIGRlY2ltYWwgbGF0IFxuICAgICAqIEBwYXJhbSBkZWNpbWFsIGxuZyBcbiAgICAgKi8gXG4gICAgY2VudGVyTWFwKGxhdCwgbG5nKXtcbiAgICAgICAgbGV0IGxhdGxuZyA9IEwubGF0TG5nKGxhdCwgbG5nKTsgIFxuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBpZiB0aGUgc2NyaXB0IGhhcyBub3QgYmVlbiBsb2FkZWQgLCBsb2FkIGl0LiBcbiAgICAgKiBXZSB1c2UgdGhpcyBmdW5jdGlvbiBiZWNhdXNlIHdlIG9ubHkgd2FudCB0byBsb2FkIHRoZSBzY3JpcHQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGJ1dHRvbiBcbiAgICAgKi9cbiAgICBncmFudFJlYWR5KCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTY3JpcHRMb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZFNjcmlwdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgLyoqIFxuICAgKiBAcGFyYW0gZl9jYWxsYmFjayB3aGF0IGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgcmVxdWVzdCByZXNvbHZlcyBcbiAgICogQHBhcmFtIGNpdHkgLSBjaXR5IG5hbWUgXG4gICAqIEBwYXJhbSBjb3VudHJ5IC0gY291bnRyeSBpbiBpc28yIHVwcGVyY2FzZSBcbiAgICogQHBhcmFtIHBvc3RhbGNvZGUgLSB0aGUgcG9zdGFsIGNvZGUgXG4gICAqIEBwYXJhbSBzdHJlZXRuYW1lIC0gdGhlIHN0cmVldG5hbWUgXG4gICAqL1xuICBnZW9jb2RlQWRkcmVzcyhmX2NhbGxiYWNrLCBjaXR5LCBjb3VudHJ5LCBwb3N0YWxjb2RlLCBzdHJlZXRuYW1lKSB7XG4gICAgdmFyIHF1ZXJ5U3RyaW5nID0gXCJodHRwczovL25vbWluYXRpbS5vcGVuc3RyZWV0bWFwLm9yZy9zZWFyY2g/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
r2781393 r2800002 4 4 define( 'SHIPTIMIZE_API_URL', 'https://api.pakketmail.nl/v3' ); 5 5 define( 'SHIPTIMIZE_BRAND', 'Shiptimize' ); 6 define( 'SHIPTIMIZE_VERSION', '3.1.5 3' );6 define( 'SHIPTIMIZE_VERSION', '3.1.54' ); 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-shipping.php
r2746465 r2800002 17 17 */ 18 18 private $wbs_active = false; 19 20 /** Did we init shipping ? **/ 21 private $started = 0; 19 22 20 23 private function __construct(){ … … 402 405 * Load the classes 403 406 */ 404 public function shiptimize_init_shipping(){ 407 public function shiptimize_init_shipping() { 408 WooShiptimize::log( "shiptimize_init_shipping " . $this->started ); 409 if ( $this->started++ ) { 410 return; 411 } 412 405 413 $this->wbs_active = class_exists( '\Wbs\ShippingMethod'); 406 $carriers = json_decode(get_option('shiptimize_carriers')); 407 408 if(!$carriers){ 414 $carrier_json = get_option('shiptimize_carriers'); 415 $carriers = json_decode($carrier_json); 416 417 if ( !$carriers ) { 409 418 return; 410 419 } 411 420 412 foreach ($carriers as $carrier){413 $this->loadFlatRateCarrier( $carrier);414 $this->loadFreeShippingCarrier( $carrier);421 foreach ( $carriers as $carrier ) { 422 $this->loadFlatRateCarrier( $carrier ); 423 $this->loadFreeShippingCarrier( $carrier ); 415 424 416 425 if($this->wbs_active){ … … 429 438 $this->writeShippingClassFree( $file_path, $class_name, $carrier); 430 439 } 440 431 441 require_once ( $file_path ); 432 442 } … … 699 709 } 700 710 701 }702 703 if( stripos( $_SERVER['HTTP_HOST'] , '.local' ) ){704 WooShiptimize::log( $carrier->Name . " ".( isset($carrier->OptionList ) ? json_encode( $carrier->OptionList ) :'' ));705 711 } 712 713 714 // Only display the exclude classes if the advanced shipping plugin is active 715 $excludeclasses = ''; 716 if ( is_plugin_active('woocommerce-advanced-shipping/woocommerce-advanced-shipping.php') ) { 717 $excludeclasses = $this->get_option_string('multiplecheckboxes','shiptimize-excludeclasses','excludeclasses',0,""); 718 } 719 720 WooShiptimize::log( $carrier->Name . " ".( isset($carrier->OptionList ) ? json_encode( $carrier->OptionList ) :'' )); 706 721 707 722 $service_level_field = $service_level_options ? $this->get_option_string('select','shiptimize-service-level','service_level',0,"array($service_level_options)") : ''; … … 740 755 741 756 \$this->init(); 757 \$this->options = get_option(\$this->id . '_' . \$this->instance_id . '_settings'); 742 758 743 759 /*Service Level*/ … … 750 766 %s 751 767 752 add_action( 'woocommerce_update_options_shipping_' . \$this->id, array( \$this, 'process_admin_options' ) ); 768 /** Exclude classes **/ 769 %s 770 771 772 add_action( 'woocommerce_update_options_shipping_' . \$this->id, array( \$this, 'process_admin_options' ) ); 773 774 add_filter( 'woocommerce_shipping_' . \$this->id . '_is_available', array(\$this, 'method_available'), 10, 3 ); 753 775 } 776 777 public function method_available ( \$available, \$package, \$shipping_method ) { 778 \$opt_exclude_classes = explode( ',', \$this->get_instance_option('excludeclasses') ); 779 780 if ( !\$available || empty( \$opt_exclude_classes ) ) { 781 return \$available; 782 } 783 784 \$contains_classes_to_exclude = false; 785 error_log(\$shipping_method->get_title()); 786 // Check if the package contains products that have at least one of the selected classes 787 foreach ( \$package['contents'] as \$key => \$item ) { 788 \$product = \$item['data']; 789 790 foreach ( \$opt_exclude_classes as \$c2exclude ) { 791 if ( \$c2exclude > 0 ) { 792 \$contains_classes_to_exclude |= \$product->get_shipping_class_id(\$c2exclude) == \$c2exclude ; 793 } 794 } 795 } 796 797 error_log(\"contains class \" . ( \$contains_classes_to_exclude ? 1 : 0 )); 798 799 return !\$contains_classes_to_exclude; 800 } 801 802 public function validate_excludeclasses_field( \$key , \$value ) { 803 if ( \$key === 'excludeclasses' ) { 804 return implode( ',' , \$value ); 805 } 806 } 754 807 755 808 public function get_admin_options_html() … … 761 814 } 762 815 816 \$shipping = new \WC_Shipping(); 817 \$excludeclassesoptions = array(); 818 819 \$opt_exclude_classes = explode( ',', \$this->get_instance_option('excludeclasses') ); 820 821 foreach ( \$shipping->get_shipping_classes() as \$shipping_class ) { 822 823 array_push( \$excludeclassesoptions, array( 824 'id' => \$shipping_class->term_id, 825 'name' => \$shipping_class->name, 826 'selected' => in_array( \$shipping_class->term_id , \$opt_exclude_classes ) ? 'checked' : '' 827 )); 828 } 829 763 830 return '<table class=\"form-table\">' . \$settings_html . '</table><script> 764 831 var optionsid = \"#woocommerce_' . \$this->id . '_extraoptions\"; … … 772 839 jQuery(optionsid).change(shiptimize_extraoption_values); 773 840 841 setExcludeClasses(); 774 842 }, 0); 775 843 … … 778 846 jQuery(\".shiptimize-extra-option-values\").parent().parent().parent().hide(); 779 847 jQuery(\"#woocommerce_' . \$this->id . '_extraoptions\" + selectedoption).parent().parent().parent().show(); 848 } 849 850 function setExcludeClasses() { 851 var excludeoptions =' . json_encode(\$excludeclassesoptions) . '; 852 var select = jQuery(\"#woocommerce_shipping_shiptimize_{$carrier->Id}_excludeclasses\"); 853 var content = select.parent(); 854 select.remove(); 855 for ( var x=0; x< excludeoptions.length; ++x ) { 856 content.append(\'<span class=\"shiptimize-ib shiptimize-exclude-class\"> <input type=\"checkbox\" name=\"woocommerce_shipping_shiptimize_{$carrier->Id}_excludeclasses[]\" value=\"\' + excludeoptions[x].id + \'\" \' + excludeoptions[x].selected + \' /> \' + excludeoptions[x].name + \'</span>\'); 780 857 } 858 859 860 } 781 861 </script>'; 782 862 } … … 784 864 $service_level_field, 785 865 $extraoptions_field, 786 join("\n",$checkbox_fields) 866 join("\n",$checkbox_fields), 867 $excludeclasses 787 868 ); 788 869 … … 904 985 } 905 986 906 if( stripos( $_SERVER['HTTP_HOST'] , '.local' ) ){ 907 WooShiptimize::log( $carrier->Name . " ".( isset($carrier->OptionList ) ? json_encode( $carrier->OptionList ) :'' )); 908 } 987 // Only display the exclude classes if the advanced shipping plugin is active 988 $excludeclasses = ''; 989 if ( is_plugin_active('woocommerce-advanced-shipping/woocommerce-advanced-shipping.php') ) { 990 $excludeclasses = $this->get_option_string('multiplecheckboxes','shiptimize-excludeclasses','excludeclasses',0,""); 991 } 992 993 WooShiptimize::log( $carrier->Name . " ".( isset($carrier->OptionList ) ? json_encode( $carrier->OptionList ) :'' )); 909 994 910 995 $service_level_field = $service_level_options ? $this->get_option_string('select','shiptimize-service-level','service_level',0,"array($service_level_options)") : ''; … … 946 1031 %s 947 1032 1033 /** exclude classes **/ 1034 %s 1035 948 1036 add_action( 'woocommerce_update_options_shipping_' . \$this->id, array( \$this, 'process_admin_options' ) ); 949 1037 } 1038 1039 public function method_available ( \$available, \$package, \$shipping_method ) { 1040 \$opt_exclude_classes = explode( ',', \$this->get_instance_option('excludeclasses') ); 1041 1042 if ( !\$available || empty( \$opt_exclude_classes ) ) { 1043 return \$available; 1044 } 1045 1046 \$contains_classes_to_exclude = false; 1047 error_log(\$shipping_method->get_title()); 1048 // Check if the package contains products that have at least one of the selected classes 1049 foreach ( \$package['contents'] as \$key => \$item ) { 1050 \$product = \$item['data']; 1051 1052 foreach ( \$opt_exclude_classes as \$c2exclude ) { 1053 if ( \$c2exclude > 0 ) { 1054 \$contains_classes_to_exclude |= \$product->get_shipping_class_id(\$c2exclude) == \$c2exclude ; 1055 } 1056 } 1057 } 1058 1059 error_log(\"contains class \" . ( \$contains_classes_to_exclude ? 1 : 0 )); 1060 1061 return !\$contains_classes_to_exclude; 1062 } 1063 1064 public function validate_excludeclasses_field( \$key , \$value ) { 1065 if ( \$key === 'excludeclasses' ) { 1066 return implode( ',' , \$value ); 1067 } 1068 } 950 1069 951 1070 /** … … 953 1072 */ 954 1073 public function init() { 1074 add_filter( 'woocommerce_shipping_' . \$this->id . '_is_available', array(\$this, 'method_available'), 10, 3 ); 1075 955 1076 // Load the settings. 956 1077 \$this->init_form_fields(); … … 975 1096 } 976 1097 1098 \$shipping = new \WC_Shipping(); 1099 \$excludeclassesoptions = array(); 1100 1101 \$opt_exclude_classes = explode( ',', \$this->get_instance_option('excludeclasses') ); 1102 1103 foreach ( \$shipping->get_shipping_classes() as \$shipping_class ) { 1104 1105 array_push( \$excludeclassesoptions, array( 1106 'id' => \$shipping_class->term_id, 1107 'name' => \$shipping_class->name, 1108 'selected' => in_array( \$shipping_class->term_id , \$opt_exclude_classes ) ? 'checked' : '' 1109 )); 1110 } 1111 977 1112 return '<table class=\"form-table\">' . \$settings_html . '</table><script> 978 1113 var optionsid = \"#woocommerce_' . \$this->id . '_extraoptions\"; … … 985 1120 986 1121 jQuery(optionsid).change(shiptimize_extraoption_values); 1122 setExcludeClasses(); 987 1123 988 1124 }, 0); … … 992 1128 jQuery(\".shiptimize-extra-option-values\").parent().parent().parent().hide(); 993 1129 jQuery(\"#woocommerce_' . \$this->id . '_extraoptions\" + selectedoption).parent().parent().parent().show(); 1130 } 1131 1132 function setExcludeClasses() { 1133 var excludeoptions =' . json_encode(\$excludeclassesoptions) . '; 1134 var select = jQuery(\"#woocommerce_shipping_shiptimize_{$carrier->Id}_free_excludeclasses\"); 1135 var content = select.parent(); 1136 select.remove(); 1137 for ( var x=0; x< excludeoptions.length; ++x ) { 1138 content.append(\'<span class=\"shiptimize-ib shiptimize-exclude-class\"> <input type=\"checkbox\" name=\"woocommerce_shipping_shiptimize_{$carrier->Id}_free_excludeclasses[]\" value=\"\' + excludeoptions[x].id + \'\" \' + excludeoptions[x].selected + \' /> \' + excludeoptions[x].name + \'</span>\'); 994 1139 } 1140 } 995 1141 </script>'; 996 1142 } … … 999 1145 $service_level_field, 1000 1146 $extraoptions_field, 1001 join("\n",$checkbox_fields) 1147 join("\n",$checkbox_fields), 1148 $excludeclasses 1002 1149 ); 1003 1150 … … 1023 1170 $shiptimizejs .= "var shiptimize_extraoptions=" . addslashes(json_encode($shiptimizeOptions->getAllowedExtraOptions())).";"; 1024 1171 $shiptimizejs .= "var shiptimize_checkboxes=" . addslashes(json_encode($shiptimizeOptions->getCheckboxFieldIds())).";"; 1025 1026 1027 1172 } 1028 1173 -
shiptimize-for-woocommerce/trunk/includes/core/lang/de.php
r2726206 r2800002 89 89 <li>Fügen Sie diese neuen Schlüssel in das Feld GLS Credentials in den GLS-Einstellungen hier in WordPress ein und klicken Sie auf die Schaltfläche "Änderungen speichern".</li> 90 90 </ol>', 91 'hideifclasspresent' => 'Wenn mindestens ein Artikel im Warenkorb diese Klassen enthält, zeigen Sie diese Methode nicht an' 91 92 ); -
shiptimize-for-woocommerce/trunk/includes/core/lang/en.php
r2746465 r2800002 172 172 'hidenotfree' => 'If at least one shipping method is available with cost 0, hide any shipping method with cost > 0', 173 173 'hidenotfreetitle' => 'Hide Shipping Methods', 174 'excludeclasses' => 'If at least one item in cart contains of these classes do not display this method' 174 175 ); -
shiptimize-for-woocommerce/trunk/includes/core/lang/es.php
r2724326 r2800002 179 179 'provincesdescription' => 'Declarar provincias adicionales', 180 180 'hidenotfree' => 'Si hay al menos un método de envío disponible con coste 0, ocultar cualquier método de envío con coste > 0', 181 'hidenotfreetitle' => 'Ocultar métodos de envío' 181 'hidenotfreetitle' => 'Ocultar métodos de envío', 182 'hideifclasspresent' => 'Si al menos un artículo en el carrito contiene de estas clases, no muestre este método' 182 183 ); -
shiptimize-for-woocommerce/trunk/includes/core/lang/nl.php
r2726206 r2800002 135 135 <li>Plak deze nieuwe sleutels in het Shiptimize Credentials veld in de Shiptimize Instellingen hier in WordPress en klik op de "Wijzigingen opslaan" knop.</li> 136 136 </ol>', 137 'hideifclasspresent' => 'Als ten minste één item in de winkelwagen van deze klassen bevat, wordt deze methode niet weergegeven' 137 138 ); -
shiptimize-for-woocommerce/trunk/includes/core/lang/pt.php
r2746465 r2800002 186 186 'provincesdescription' => 'declarar estas provincias', 187 187 'hidenotfree' => 'Se existir pelo menos um método de envio com custo zero, esconder qualquer método de envio com custo superior a zero', 188 'hidenotfreetitle' => 'Esconder métodos de envio' 188 'hidenotfreetitle' => 'Esconder métodos de envio', 189 'hideifclasspresent' => 'Se pelo menos um item no carrinho contiver uma das classes assinaladas, não mostrar este método de envio' 189 190 ); -
shiptimize-for-woocommerce/trunk/readme.txt
r2781393 r2800002 59 59 == Changelog == 60 60 61 = 3.1.54 - 2022-10-17 = 62 * enhancement - If advanced shipment is installed and active allow sellers to specify certain classes where our shipping methods will not display at checkout. 63 61 64 = 3.1.53 - 2022-09-07 = 62 65 * fix - Item weight should be the weight of the item, not the total of the quantity indicated -
shiptimize-for-woocommerce/trunk/shiptimize.php
r2781393 r2800002 3 3 * Plugin Name: Shiptimize for WooCommerce 4 4 * Description: Shiptimize for WooCommerce 5 * Version: 3.1.5 35 * Version: 3.1.54 6 6 * Author: Shiptimize 7 7 * Author URI: https://shiptimize.me … … 25 25 { 26 26 return; 27 } 27 } 28 28 29 29 define( 'SHIPTIMIZE_DEV', file_exists('isdevmachine') ? 1 : 0 );
Note: See TracChangeset
for help on using the changeset viewer.