|
@@ -1,11 +1,16676 @@
|
|
|
-!function e(t,n,a){function r(s,i){if(!n[s]){if(!t[s]){var u="function"==typeof require&&require;if(!i&&u)return u(s,!0);if(o)return o(s,!0);var l=new Error("Cannot find module '"+s+"'");throw l.code="MODULE_NOT_FOUND",l}var c=n[s]={exports:{}};t[s][0].call(c.exports,function(e){var n=t[s][1][e];return r(n?n:e)},c,c.exports,e,t,n,a)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s<a.length;s++)r(a[s]);return r}({1:[function(e,t,n){function a(){c=!1,i.length?l=i.concat(l):f=-1,l.length&&r()}function r(){if(!c){var e=setTimeout(a);c=!0;for(var t=l.length;t;){for(i=l,l=[];++f<t;)i&&i[f].run();f=-1,t=l.length}i=null,c=!1,clearTimeout(e)}}function o(e,t){this.fun=e,this.array=t}function s(){}var i,u=t.exports={},l=[],c=!1,f=-1;u.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];l.push(new o(e,t)),1!==l.length||c||setTimeout(r,0)},o.prototype.run=function(){this.fun.apply(null,this.array)},u.title="browser",u.browser=!0,u.env={},u.argv=[],u.version="",u.versions={},u.on=s,u.addListener=s,u.once=s,u.off=s,u.removeListener=s,u.removeAllListeners=s,u.emit=s,u.binding=function(e){throw new Error("process.binding is not supported")},u.cwd=function(){return"/"},u.chdir=function(e){throw new Error("process.chdir is not supported")},u.umask=function(){return 0}},{}],2:[function(e,t,n){(function(t){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.Misago=void 0;var s=e("../../../misago/frontend/src/utils/ordered-list"),i=a(s),u=n.Misago=function(){function e(){r(this,e),this._initializers=[],this._context={}}return o(e,[{key:"addInitializer",value:function(e){this._initializers.push({key:e.name,item:e.initializer,after:e.after,before:e.before})}},{key:"init",value:function(e){var t=this;this._context=e;var n=new i["default"](this._initializers).orderedValues();n.forEach(function(e){e(t)})}},{key:"has",value:function(e){return!!this._context[e]}},{key:"get",value:function(e,t){return this.has(e)?this._context[e]:t||void 0}},{key:"pop",value:function(e){if(this.has(e)){var t=this._context[e];return this._context[e]=null,t}}}]),e}(),l=new u;t.misago=l,n["default"]=l}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../../../misago/frontend/src/utils/ordered-list":144}],3:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){u["default"].init(s["default"].get("CSRF_COOKIE_NAME"))}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../misago/frontend/src/services/ajax"),u=a(i);s["default"].addInitializer({name:"ajax",initializer:r})},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/ajax":128}],4:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){u["default"].init(d["default"],m["default"],c["default"])}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../misago/frontend/src/services/auth"),u=a(i),l=e("../../../../misago/frontend/src/services/modal"),c=a(l),f=e("../../../../misago/frontend/src/services/store"),d=a(f),p=e("../../../../misago/frontend/src/services/local-storage"),m=a(p);s["default"].addInitializer({name:"auth",initializer:r,after:"store"})},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/auth":129,"../../../../misago/frontend/src/services/local-storage":132,"../../../../misago/frontend/src/services/modal":134,"../../../../misago/frontend/src/services/store":138}],5:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e){c["default"].init(e,u["default"],d["default"],m["default"])}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../misago/frontend/src/services/ajax"),u=a(i),l=e("../../../../misago/frontend/src/services/captcha"),c=a(l),f=e("../../../../misago/frontend/src/services/include"),d=a(f),p=e("../../../../misago/frontend/src/services/snackbar"),m=a(p);s["default"].addInitializer({name:"captcha",initializer:r})},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/ajax":128,"../../../../misago/frontend/src/services/captcha":130,"../../../../misago/frontend/src/services/include":131,"../../../../misago/frontend/src/services/snackbar":137}],6:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){(0,f["default"])((0,o.connect)(u.select)(l["default"]),"auth-message-mount")}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("react-redux"),s=e("../../../../../misago/frontend/src/index"),i=a(s),u=e("../../../../../misago/frontend/src/components/auth-message"),l=a(u),c=e("../../../../../misago/frontend/src/utils/mount-component"),f=a(c);i["default"].addInitializer({name:"component:auth-message",initializer:r,after:"store"})},{"../../../../../misago/frontend/src/components/auth-message":52,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143,"react-redux":"react-redux"}],7:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e){e.has("BAN_MESSAGE")&&(0,u["default"])(e.get("BAN_MESSAGE"),!1)}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../../misago/frontend/src/utils/banned-page"),u=a(i);s["default"].addInitializer({name:"component:baned-page",initializer:r,after:"store"})},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/banned-page":140}],8:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e){e.has("USER_OPTIONS")&&(0,c["default"])({root:u["default"].get("USERCP_URL"),component:s["default"],paths:(0,o.paths)()})}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../../misago/frontend/src/components/options/root"),s=a(o),i=e("../../../../../misago/frontend/src/index"),u=a(i),l=e("../../../../../misago/frontend/src/utils/routed-component"),c=a(l);u["default"].addInitializer({name:"component:options",initializer:r,after:"store"})},{"../../../../../misago/frontend/src/components/options/root":73,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/routed-component":147}],9:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e){e.has("PROFILE")&&e.has("PROFILE_PAGES")&&(0,f["default"])({root:l["default"].get("PROFILE").absolute_url,component:(0,o.connect)(s.select)(i["default"]),paths:(0,s.paths)()})}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("react-redux"),s=e("../../../../../misago/frontend/src/components/profile/root"),i=a(s),u=e("../../../../../misago/frontend/src/index"),l=a(u),c=e("../../../../../misago/frontend/src/utils/routed-component"),f=a(c);l["default"].addInitializer({name:"component:profile",initializer:r,after:"reducer:profile-dehydrate"})},{"../../../../../misago/frontend/src/components/profile/root":90,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/routed-component":147,"react-redux":"react-redux"}],10:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){document.getElementById("request-activation-link-mount")&&(0,c["default"])(u["default"],"request-activation-link-mount",!1)}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../../misago/frontend/src/components/request-activation-link"),u=a(i),l=e("../../../../../misago/frontend/src/utils/mount-component"),c=a(l);s["default"].addInitializer({name:"component:request-activation-link",initializer:r,after:"store"})},{"../../../../../misago/frontend/src/components/request-activation-link":94,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143}],11:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){document.getElementById("request-password-reset-mount")&&(0,c["default"])(u["default"],"request-password-reset-mount",!1)}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../../misago/frontend/src/components/request-password-reset"),u=a(i),l=e("../../../../../misago/frontend/src/utils/mount-component"),c=a(l);s["default"].addInitializer({name:"component:request-password-reset",initializer:r,after:"store"})},{"../../../../../misago/frontend/src/components/request-password-reset":95,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143}],12:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){document.getElementById("reset-password-form-mount")&&(0,c["default"])(u["default"],"reset-password-form-mount",!1)}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../../misago/frontend/src/components/reset-password-form"),u=a(i),l=e("../../../../../misago/frontend/src/utils/mount-component"),c=a(l);s["default"].addInitializer({name:"component:reset-password-form",initializer:r,after:"store"})},{"../../../../../misago/frontend/src/components/reset-password-form":96,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143}],13:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){(0,c["default"])((0,o.connect)(u.select)(u.Snackbar),"snackbar-mount")}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("react-redux"),s=e("../../../../../misago/frontend/src/index"),i=a(s),u=e("../../../../../misago/frontend/src/components/snackbar"),l=e("../../../../../misago/frontend/src/utils/mount-component"),c=a(l);i["default"].addInitializer({name:"component:snackbar",initializer:r,after:"snackbar"})},{"../../../../../misago/frontend/src/components/snackbar":100,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143,"react-redux":"react-redux"}],14:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){(0,c["default"])((0,o.connect)(u.select)(u.UserMenu),"user-menu-mount"),(0,c["default"])((0,o.connect)(u.select)(u.CompactUserMenu),"user-menu-compact-mount")}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("react-redux"),s=e("../../../../../misago/frontend/src/index"),i=a(s),u=e("../../../../../misago/frontend/src/components/user-menu/root"),l=e("../../../../../misago/frontend/src/utils/mount-component"),c=a(l);i["default"].addInitializer({name:"component:user-menu",initializer:r,after:"store"})},{"../../../../../misago/frontend/src/components/user-menu/root":102,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143,"react-redux":"react-redux"}],15:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e){e.has("USERS_LISTS")&&(0,c["default"])({root:u["default"].get("USERS_LIST_URL"),component:s["default"],paths:(0,o.paths)()})}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../../misago/frontend/src/components/users/root"),s=a(o),i=e("../../../../../misago/frontend/src/index"),u=a(i),l=e("../../../../../misago/frontend/src/utils/routed-component"),c=a(l);u["default"].addInitializer({name:"component:users",initializer:r,after:"store"})},{"../../../../../misago/frontend/src/components/users/root":119,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/routed-component":147}],16:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e){u["default"].init(e.get("STATIC_URL"))}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../misago/frontend/src/services/include"),u=a(i);s["default"].addInitializer({name:"include",initializer:r})},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/include":131}],17:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){u["default"].init("misago_")}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../misago/frontend/src/services/local-storage"),u=a(i);s["default"].addInitializer({name:"local-storage",initializer:r})},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/local-storage":132}],18:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){var e=document.getElementById("mobile-navbar-dropdown-mount");e&&u["default"].init(e)}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../misago/frontend/src/services/mobile-navbar-dropdown"),u=a(i);s["default"].addInitializer({name:"dropdown",initializer:r,before:"store"})},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/mobile-navbar-dropdown":133}],19:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){var e=document.getElementById("modal-mount");e&&u["default"].init(e)}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../misago/frontend/src/services/modal"),u=a(i);s["default"].addInitializer({name:"modal",initializer:r,before:"store"})},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/modal":134}],20:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){s["default"].locale($("html").attr("lang"))}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("moment"),s=a(o),i=e("../../../../misago/frontend/src/index"),u=a(i);u["default"].addInitializer({name:"moment",initializer:r})},{"../../../../misago/frontend/src/index":121,moment:"moment"}],21:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e){u["default"].init(e.get("SETTINGS").forum_name)}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../misago/frontend/src/services/page-title"),u=a(i);s["default"].addInitializer({name:"page-title",initializer:r})},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/page-title":135}],22:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){d["default"].init(u["default"],c["default"])}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../misago/frontend/src/services/ajax"),u=a(i),l=e("../../../../misago/frontend/src/services/snackbar"),c=a(l),f=e("../../../../misago/frontend/src/services/polls"),d=a(f);s["default"].addInitializer({name:"polls",initializer:r})},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/ajax":128,"../../../../misago/frontend/src/services/polls":136,"../../../../misago/frontend/src/services/snackbar":137}],23:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e){c["default"].addReducer("auth",u["default"],Object.assign({isAuthenticated:e.get("isAuthenticated"),isAnonymous:!e.get("isAuthenticated"),user:e.get("user")},i.initialState))}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../../misago/frontend/src/reducers/auth"),u=a(i),l=e("../../../../../misago/frontend/src/services/store"),c=a(l);s["default"].addInitializer({name:"reducer:auth",initializer:r,before:"store"})},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/auth":122,"../../../../../misago/frontend/src/services/store":138}],24:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){s["default"].has("PROFILE")&&l["default"].dispatch((0,i.dehydrate)(s["default"].get("PROFILE")))}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../../misago/frontend/src/reducers/profile"),u=e("../../../../../misago/frontend/src/services/store"),l=a(u);s["default"].addInitializer({name:"reducer:profile-dehydrate",initializer:r,after:"store"})},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/profile":123,"../../../../../misago/frontend/src/services/store":138}],25:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){c["default"].addReducer("profile",u["default"],{})}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../../misago/frontend/src/reducers/profile"),u=a(i),l=e("../../../../../misago/frontend/src/services/store"),c=a(l);s["default"].addInitializer({name:"reducer:profile",initializer:r,before:"store"})},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/profile":123,"../../../../../misago/frontend/src/services/store":138}],26:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){c["default"].addReducer("snackbar",u["default"],i.initialState)}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../../misago/frontend/src/reducers/snackbar"),u=a(i),l=e("../../../../../misago/frontend/src/services/store"),c=a(l);s["default"].addInitializer({name:"reducer:snackbar",initializer:r,before:"store"})},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/snackbar":124,"../../../../../misago/frontend/src/services/store":138}],27:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){c["default"].addReducer("tick",u["default"],i.initialState)}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../../misago/frontend/src/reducers/tick"),u=a(i),l=e("../../../../../misago/frontend/src/services/store"),c=a(l);s["default"].addInitializer({name:"reducer:tick",initializer:r,before:"store"})},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/tick":125,"../../../../../misago/frontend/src/services/store":138}],28:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){c["default"].addReducer("username-history",u["default"],[])}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../../misago/frontend/src/reducers/username-history"),u=a(i),l=e("../../../../../misago/frontend/src/services/store"),c=a(l);s["default"].addInitializer({name:"reducer:username-history",initializer:r,before:"store"})},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/username-history":126,"../../../../../misago/frontend/src/services/store":138}],29:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){c["default"].addReducer("users",u["default"],[])}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../../misago/frontend/src/reducers/users"),u=a(i),l=e("../../../../../misago/frontend/src/services/store"),c=a(l);s["default"].addInitializer({name:"reducer:users",initializer:r,before:"store"})},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/users":127,"../../../../../misago/frontend/src/services/store":138}],30:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){u["default"].init(c["default"])}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../misago/frontend/src/services/snackbar"),u=a(i),l=e("../../../../misago/frontend/src/services/store"),c=a(l);s["default"].addInitializer({name:"snackbar",initializer:r,after:"store"})},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/snackbar":137,"../../../../misago/frontend/src/services/store":138}],31:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){u["default"].init()}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../misago/frontend/src/services/store"),u=a(i);s["default"].addInitializer({name:"store",initializer:r,before:"_end"})},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/store":138}],32:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){window.setInterval(function(){l["default"].dispatch((0,i.doTick)())},c)}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../misago/frontend/src/reducers/tick"),u=e("../../../../misago/frontend/src/services/store"),l=a(u),c=5e4;s["default"].addInitializer({name:"tick-start",initializer:r,after:"store"})},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/reducers/tick":125,"../../../../misago/frontend/src/services/store":138}],33:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){c["default"].init(u["default"])}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=r;var o=e("../../../../misago/frontend/src/index"),s=a(o),i=e("../../../../misago/frontend/src/services/include"),u=a(i),l=e("../../../../misago/frontend/src/services/zxcvbn"),c=a(l);s["default"].addInitializer({name:"zxcvbn",initializer:r})},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/include":131,"../../../../misago/frontend/src/services/zxcvbn":139}],34:[function(e,t,n){function a(e){return null===e||void 0===e}function r(e){return e&&"object"==typeof e&&"number"==typeof e.length?"function"!=typeof e.copy||"function"!=typeof e.slice?!1:e.length>0&&"number"!=typeof e[0]?!1:!0:!1}function o(e,t,n){var o,c;if(a(e)||a(t))return!1;if(e.prototype!==t.prototype)return!1;if(u(e))return u(t)?(e=s.call(e),t=s.call(t),l(e,t,n)):!1;if(r(e)){if(!r(t))return!1;if(e.length!==t.length)return!1;for(o=0;o<e.length;o++)if(e[o]!==t[o])return!1;return!0}try{var f=i(e),d=i(t)}catch(p){return!1}if(f.length!=d.length)return!1;for(f.sort(),d.sort(),o=f.length-1;o>=0;o--)if(f[o]!=d[o])return!1;for(o=f.length-1;o>=0;o--)if(c=f[o],!l(e[c],t[c],n))return!1;return typeof e==typeof t}var s=Array.prototype.slice,i=e("./lib/keys.js"),u=e("./lib/is_arguments.js"),l=t.exports=function(e,t,n){return n||(n={}),e===t?!0:e instanceof Date&&t instanceof Date?e.getTime()===t.getTime():!e||!t||"object"!=typeof e&&"object"!=typeof t?n.strict?e===t:e==t:o(e,t,n)}},{"./lib/is_arguments.js":35,"./lib/keys.js":36}],35:[function(e,t,n){function a(e){return"[object Arguments]"==Object.prototype.toString.call(e)}function r(e){return e&&"object"==typeof e&&"number"==typeof e.length&&Object.prototype.hasOwnProperty.call(e,"callee")&&!Object.prototype.propertyIsEnumerable.call(e,"callee")||!1}var o="[object Arguments]"==function(){return Object.prototype.toString.call(arguments)}();n=t.exports=o?a:r,n.supported=a,n.unsupported=r},{}],36:[function(e,t,n){function a(e){var t=[];for(var n in e)t.push(n);return t}n=t.exports="function"==typeof Object.keys?Object.keys:a,n.shim=a},{}],37:[function(e,t,n){"use strict";n.__esModule=!0;var a="PUSH";n.PUSH=a;var r="REPLACE";n.REPLACE=r;var o="POP";n.POP=o,n["default"]={PUSH:a,REPLACE:r,POP:o}},{}],38:[function(e,t,n){"use strict";function a(e,t,n){function a(){s=!0,n.apply(this,arguments)}function r(){s||(e>o?t.call(this,o++,r,a):a.apply(this,arguments))}var o=0,s=!1;r()}n.__esModule=!0,n.loopAsync=a},{}],39:[function(e,t,n){(function(t){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e){return l+e}function o(e,n){try{window.sessionStorage.setItem(r(e),JSON.stringify(n))}catch(a){if(a.name===f)return void("production"!==t.env.NODE_ENV?u["default"](!1,"[history] Unable to save state; sessionStorage is not available due to security settings"):void 0);if(a.name===c&&0===window.sessionStorage.length)return void("production"!==t.env.NODE_ENV?u["default"](!1,"[history] Unable to save state; sessionStorage is not available in Safari private mode"):void 0);throw a}}function s(e){var n=void 0;try{n=window.sessionStorage.getItem(r(e))}catch(a){if(a.name===f)return"production"!==t.env.NODE_ENV?u["default"](!1,"[history] Unable to read state; sessionStorage is not available due to security settings"):void 0,null}if(n)try{return JSON.parse(n)}catch(a){}return null}n.__esModule=!0,n.saveState=o,n.readState=s;var i=e("warning"),u=a(i),l="@@History/",c="QuotaExceededError",f="SecurityError"}).call(this,e("_process"))},{_process:1,warning:51}],40:[function(e,t,n){"use strict";function a(e,t,n){e.addEventListener?e.addEventListener(t,n,!1):e.attachEvent("on"+t,n)}function r(e,t,n){e.removeEventListener?e.removeEventListener(t,n,!1):e.detachEvent("on"+t,n)}function o(){return window.location.href.split("#")[1]||""}function s(e){window.location.replace(window.location.pathname+window.location.search+"#"+e)}function i(){return window.location.pathname+window.location.search+window.location.hash}function u(e){e&&window.history.go(e)}function l(e,t){t(window.confirm(e))}function c(){var e=navigator.userAgent;return-1===e.indexOf("Android 2.")&&-1===e.indexOf("Android 4.0")||-1===e.indexOf("Mobile Safari")||-1!==e.indexOf("Chrome")||-1!==e.indexOf("Windows Phone")?-1!==e.indexOf("CriOS")?!1:window.history&&"pushState"in window.history:!1}function f(){var e=navigator.userAgent;return-1===e.indexOf("Firefox")}n.__esModule=!0,n.addEventListener=a,n.removeEventListener=r,n.getHashPath=o,n.replaceHashPath=s,n.getWindowPath=i,n.go=u,n.getUserConfirmation=l,n.supportsHistory=c,n.supportsGoWithoutReloadUsingHash=f},{}],41:[function(e,t,n){"use strict";n.__esModule=!0;var a=!("undefined"==typeof window||!window.document||!window.document.createElement);n.canUseDOM=a},{}],42:[function(e,t,n){(function(a){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(){function e(e){e=e||window.history.state||{};var t=f.getWindowPath(),n=e,a=n.key,r=void 0;a?r=d.readState(a):(r=null,a=_.createKey(),b&&window.history.replaceState(s({},e,{key:a}),null,t));var o=v["default"](t);return _.createLocation(s({},o,{state:r}),void 0,a)}function t(t){function n(t){void 0!==t.state&&a(e(t.state))}var a=t.transitionTo;return f.addEventListener(window,"popstate",n),function(){f.removeEventListener(window,"popstate",n)}}function n(e){var t=e.basename,n=e.pathname,a=e.search,r=e.hash,o=e.state,s=e.action,i=e.key;if(s!==l.POP){d.saveState(i,o);var u=(t||"")+n+a+r,c={key:i};if(s===l.PUSH){if(y)return window.location.href=u,!1;window.history.pushState(c,null,u)}else{if(y)return window.location.replace(u),!1;window.history.replaceState(c,null,u)}}}function r(e){1===++w&&(E=t(_));var n=_.listenBefore(e);return function(){n(),0===--w&&E()}}function o(e){1===++w&&(E=t(_));var n=_.listen(e);return function(){n(),0===--w&&E()}}function i(e){1===++w&&(E=t(_)),_.registerTransitionHook(e)}function p(e){_.unregisterTransitionHook(e),0===--w&&E()}var h=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];c.canUseDOM?void 0:"production"!==a.env.NODE_ENV?u["default"](!1,"Browser history needs a DOM"):u["default"](!1);var g=h.forceRefresh,b=f.supportsHistory(),y=!b||g,_=m["default"](s({},h,{getCurrentLocation:e,finishTransition:n,saveState:d.saveState})),w=0,E=void 0;return s({},_,{listenBefore:r,listen:o,registerTransitionHook:i,unregisterTransitionHook:p})}n.__esModule=!0;var s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},i=e("invariant"),u=r(i),l=e("./Actions"),c=e("./ExecutionEnvironment"),f=e("./DOMUtils"),d=e("./DOMStateStorage"),p=e("./createDOMHistory"),m=r(p),h=e("./parsePath"),v=r(h);n["default"]=o,t.exports=n["default"]}).call(this,e("_process"))},{"./Actions":37,"./DOMStateStorage":39,"./DOMUtils":40,"./ExecutionEnvironment":41,"./createDOMHistory":43,"./parsePath":48,_process:1,invariant:50}],43:[function(e,t,n){(function(a){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e){function t(e){return l.canUseDOM?void 0:"production"!==a.env.NODE_ENV?u["default"](!1,"DOM history needs a DOM"):u["default"](!1),n.listen(e)}var n=d["default"](s({getUserConfirmation:c.getUserConfirmation},e,{go:c.go}));return s({},n,{listen:t})}n.__esModule=!0;var s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},i=e("invariant"),u=r(i),l=e("./ExecutionEnvironment"),c=e("./DOMUtils"),f=e("./createHistory"),d=r(f);n["default"]=o,t.exports=n["default"]}).call(this,e("_process"))},{"./DOMUtils":40,"./ExecutionEnvironment":41,"./createHistory":44,_process:1,invariant:50}],44:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e){return Math.random().toString(36).substr(2,e)}function o(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.key===t.key&&l["default"](e.state,t.state)}function s(){function e(e){return U.push(e),function(){U=U.filter(function(t){return t!==e})}}function t(){return H&&H.action===f.POP?D.indexOf(H.key):B?D.indexOf(B.key):-1}function n(e){var n=t();B=e,B.action===f.PUSH?D=[].concat(D.slice(0,n+1),[B.key]):B.action===f.REPLACE&&(D[n]=B.key),z.forEach(function(e){e(B)})}function a(e){if(z.push(e),B)e(B);else{var t=M();D=[t.key],n(t)}return function(){z=z.filter(function(t){return t!==e})}}function s(e,t){c.loopAsync(U.length,function(t,n,a){h["default"](U[t],e,function(e){null!=e?a(e):n()})},function(e){A&&"string"==typeof e?A(e,function(e){t(e!==!1)}):t(e!==!1)})}function u(e){B&&o(B,e)||(H=e,s(e,function(t){if(H===e)if(t){if(e.action===f.PUSH){var a=w(B),r=w(e);r===a&&(e.action=f.REPLACE)}T(e)!==!1&&n(e)}else if(B&&e.action===f.POP){var o=D.indexOf(B.key),s=D.indexOf(e.key);-1!==o&&-1!==s&&R(o-s)}}))}function l(e){u(O(e,f.PUSH,b()))}function d(e){u(O(e,f.REPLACE,b()))}function m(){R(-1)}function v(){R(1)}function b(){return r(I)}function w(e){if(null==e||"string"==typeof e)return e;var t=e.pathname,n=e.search,a=e.hash,r=t;return n&&(r+=n),a&&(r+=a),
|
|
|
-r}function E(e){return w(e)}function O(e,t){var n=arguments.length<=2||void 0===arguments[2]?b():arguments[2];return"object"==typeof t&&("string"==typeof e&&(e=g["default"](e)),e=i({},e,{state:t}),t=n,n=arguments[3]||b()),p["default"](e,t,n)}function k(e){B?(x(B,e),n(B)):x(M(),e)}function x(e,t){e.state=i({},e.state,t),L(e.key,e.state)}function N(e){-1===U.indexOf(e)&&U.push(e)}function j(e){U=U.filter(function(t){return t!==e})}function P(e,t){"string"==typeof t&&(t=g["default"](t)),l(i({state:e},t))}function S(e,t){"string"==typeof t&&(t=g["default"](t)),d(i({state:e},t))}var C=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],M=C.getCurrentLocation,T=C.finishTransition,L=C.saveState,R=C.go,I=C.keyLength,A=C.getUserConfirmation;"number"!=typeof I&&(I=_);var U=[],D=[],z=[],B=void 0,H=void 0;return{listenBefore:e,listen:a,transitionTo:u,push:l,replace:d,go:R,goBack:m,goForward:v,createKey:b,createPath:w,createHref:E,createLocation:O,setState:y["default"](k,"setState is deprecated; use location.key to save state instead"),registerTransitionHook:y["default"](N,"registerTransitionHook is deprecated; use listenBefore instead"),unregisterTransitionHook:y["default"](j,"unregisterTransitionHook is deprecated; use the callback returned from listenBefore instead"),pushState:y["default"](P,"pushState is deprecated; use push instead"),replaceState:y["default"](S,"replaceState is deprecated; use replace instead")}}n.__esModule=!0;var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},u=e("deep-equal"),l=a(u),c=e("./AsyncUtils"),f=e("./Actions"),d=e("./createLocation"),p=a(d),m=e("./runTransitionHook"),h=a(m),v=e("./parsePath"),g=a(v),b=e("./deprecate"),y=a(b),_=6;n["default"]=s,t.exports=n["default"]},{"./Actions":37,"./AsyncUtils":38,"./createLocation":45,"./deprecate":46,"./parsePath":48,"./runTransitionHook":49,"deep-equal":34}],45:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(){var e=arguments.length<=0||void 0===arguments[0]?"/":arguments[0],t=arguments.length<=1||void 0===arguments[1]?s.POP:arguments[1],n=arguments.length<=2||void 0===arguments[2]?null:arguments[2],a=arguments.length<=3||void 0===arguments[3]?null:arguments[3];"string"==typeof e&&(e=u["default"](e)),"object"==typeof t&&(e=o({},e,{state:t}),t=n||s.POP,n=a);var r=e.pathname||"/",i=e.search||"",l=e.hash||"",c=e.state||null;return{pathname:r,search:i,hash:l,state:c,action:t,key:n}}n.__esModule=!0;var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},s=e("./Actions"),i=e("./parsePath"),u=a(i);n["default"]=r,t.exports=n["default"]},{"./Actions":37,"./parsePath":48}],46:[function(e,t,n){"use strict";function a(e){return e}n.__esModule=!0,n["default"]=a,t.exports=n["default"]},{}],47:[function(e,t,n){"use strict";function a(e){var t=e.match(/^https?:\/\/[^\/]*/);return null==t?e:e.substring(t[0].length)}n.__esModule=!0,n["default"]=a,t.exports=n["default"]},{}],48:[function(e,t,n){(function(a){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=l["default"](e),n="",r="";"production"!==a.env.NODE_ENV?i["default"](e===t,'A path must be pathname + search + hash only, not a fully qualified URL like "%s"',e):void 0;var o=t.indexOf("#");-1!==o&&(r=t.substring(o),t=t.substring(0,o));var s=t.indexOf("?");return-1!==s&&(n=t.substring(s),t=t.substring(0,s)),""===t&&(t="/"),{pathname:t,search:n,hash:r}}n.__esModule=!0;var s=e("warning"),i=r(s),u=e("./extractPath"),l=r(u);n["default"]=o,t.exports=n["default"]}).call(this,e("_process"))},{"./extractPath":47,_process:1,warning:51}],49:[function(e,t,n){(function(a){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t,n){var r=e(t,n);e.length<2?n(r):"production"!==a.env.NODE_ENV?i["default"](void 0===r,'You should not "return" in a transition hook with a callback argument; call the callback instead'):void 0}n.__esModule=!0;var s=e("warning"),i=r(s);n["default"]=o,t.exports=n["default"]}).call(this,e("_process"))},{_process:1,warning:51}],50:[function(e,t,n){"use strict";var a=function(e,t,n,a,r,o,s,i){if(!e){var u;if(void 0===t)u=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var l=[n,a,r,o,s,i],c=0;u=new Error(t.replace(/%s/g,function(){return l[c++]})),u.name="Invariant Violation"}throw u.framesToPop=1,u}};t.exports=a},{}],51:[function(e,t,n){"use strict";var a=function(){};t.exports=a},{}],52:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e){return{user:e.auth.user,signedIn:e.auth.signedIn,signedOut:e.auth.signedOut}}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.select=i;var l=e("react"),c=a(l),f=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),u(t,[{key:"refresh",value:function(){window.location.reload()}},{key:"getMessage",value:function(){return this.props.signedIn?interpolate(gettext("You have signed in as %(username)s. Please refresh the page before continuing."),{username:this.props.signedIn.username},!0):this.props.signedOut?interpolate(gettext("%(username)s, you have been signed out. Please refresh the page before continuing."),{username:this.props.user.username},!0):void 0}},{key:"getClassName",value:function(){return this.props.signedIn||this.props.signedOut?"auth-message show":"auth-message"}},{key:"render",value:function(){return c["default"].createElement("div",{className:this.getClassName()},c["default"].createElement("div",{className:"container"},c["default"].createElement("p",{className:"lead"},this.getMessage()),c["default"].createElement("p",null,c["default"].createElement("button",{type:"button",className:"btn btn-default",onClick:this.refresh},gettext("Reload page"))," ",c["default"].createElement("span",{className:"hidden-xs hidden-sm text-muted"},gettext("or press F5 key.")))))}}]),t}(c["default"].Component);n["default"]=f},{react:"react"}],53:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=$("base").attr("href")+"user-avatar/",f=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getSrc",value:function(){var e=this.props.size||100,t=c;return t+=this.props.user&&this.props.user.id?this.props.user.avatar_hash+"/"+e+"/"+this.props.user.id+".png":e+".png"}},{key:"render",value:function(){return l["default"].createElement("img",{src:this.getSrc(),className:this.props.className||"user-avatar",title:gettext("User avatar")})}}]),t}(l["default"].Component);n["default"]=f},{react:"react"}],54:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("moment"),l=a(u),c=e("react"),f=a(c),d=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getReasonMessage",value:function(){return this.props.message.html?f["default"].createElement("div",{className:"lead",dangerouslySetInnerHTML:{__html:this.props.message.html}}):f["default"].createElement("p",{className:"lead"},this.props.message.plain)}},{key:"getExpirationMessage",value:function(){if(this.props.expires){if(this.props.expires.isAfter((0,l["default"])())){var e=interpolate(gettext("This ban expires on %(expires_on)s."),{expires_on:this.props.expires.format("LL, LT")},!0),t=interpolate(gettext("This ban expires %(expires_on)s."),{expires_on:this.props.expires.fromNow()},!0);return f["default"].createElement("abbr",{title:e},t)}return gettext("This ban has expired.")}return gettext("This ban is permanent.")}},{key:"render",value:function(){return f["default"].createElement("div",{className:"page page-error page-error-banned"},f["default"].createElement("div",{className:"container"},f["default"].createElement("div",{className:"message-panel"},f["default"].createElement("div",{className:"message-icon"},f["default"].createElement("span",{className:"material-icon"},"highlight_off")),f["default"].createElement("div",{className:"message-body"},this.getReasonMessage(),f["default"].createElement("p",{className:"message-footnote"},this.getExpirationMessage())))))}}]),t}(f["default"].Component);n["default"]=d},{moment:"moment",react:"react"}],55:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("./loader"),f=a(c),d=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"render",value:function(){var e="btn "+this.props.className,t=this.props.disabled;return this.props.loading&&(e+=" btn-loading",t=!0),l["default"].createElement("button",{type:this.props.onClick?"button":"submit",className:e,disabled:t,onClick:this.props.onClick},this.props.children,this.props.loading?l["default"].createElement(f["default"],null):null)}}]),t}(l["default"].Component);n["default"]=d,d.defaultProps={className:"btn-default",type:"submit",loading:!1,disabled:!1,onClick:null}},{"./loader":64,react:"react"}],56:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("../avatar"),f=(a(c),e("../button")),d=a(f),p=e("../../services/ajax"),m=a(p),h=e("../../services/snackbar"),v=a(h),g=$("base").attr("href")+"user-avatar",b=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.cropAvatar=function(){if(n.state.isLoading)return!1;n.setState({isLoading:!0});var e=n.props.upload?"crop_tmp":"crop_org",t=$(".crop-form");m["default"].post(n.props.user.api_url.avatar,{avatar:e,crop:{offset:t.cropit("offset"),zoom:t.cropit("zoom")}}).then(function(e){n.props.onComplete(e.avatar_hash,e.options),v["default"].success(e.detail)},function(e){400===e.status?(v["default"].error(e.detail),n.setState({isLoading:!1})):n.props.showError(e)})},n.state={isLoading:!1},n}return s(t,e),i(t,[{key:"getAvatarSize",value:function(){return this.props.upload?this.props.options.crop_tmp.size:this.props.options.crop_org.size}},{key:"getAvatarSecret",value:function(){return this.props.upload?this.props.options.crop_tmp.secret:this.props.options.crop_org.secret}},{key:"getAvatarHash",value:function(){return this.props.upload||this.props.user.avatar_hash}},{key:"getImagePath",value:function(){return[g,this.getAvatarSecret()+":"+this.getAvatarHash(),this.props.user.id+".png"].join("/")}},{key:"componentDidMount",value:function(){var e=this,t=$(".crop-form");t.width(this.getAvatarSize()),t.cropit({width:this.getAvatarSize(),height:this.getAvatarSize(),imageState:{src:this.getImagePath()},onImageLoaded:function(){if(e.props.upload){var n=t.cropit("zoom"),a=t.cropit("imageSize");if(a.width>a.height){var r=a.width*n,o=(r-e.getAvatarSize())/-2;t.cropit("offset",{x:o,y:0})}else if(a.width<a.height){var s=a.height*n,i=(s-e.getAvatarSize())/-2;t.cropit("offset",{x:0,y:i})}}else{var u=e.props.options.crop_org.crop;u&&(t.cropit("zoom",u.zoom),t.cropit("offset",{x:u.x,y:u.y}))}}})}},{key:"componentWillUnmount",value:function(){$(".crop-form").cropit("disable")}},{key:"render",value:function(){return l["default"].createElement("div",null,l["default"].createElement("div",{className:"modal-body modal-avatar-crop"},l["default"].createElement("div",{className:"crop-form"},l["default"].createElement("div",{className:"cropit-image-preview"}),l["default"].createElement("input",{type:"range",className:"cropit-image-zoom-input"}))),l["default"].createElement("div",{className:"modal-footer"},l["default"].createElement("div",{className:"col-md-6 col-md-offset-3"},l["default"].createElement(d["default"],{onClick:this.cropAvatar,loading:this.state.isLoading,className:"btn-primary btn-block"},this.props.upload?gettext("Set avatar"):gettext("Crop image")),l["default"].createElement(d["default"],{onClick:this.props.showIndex,disabled:this.state.isLoading,className:"btn-default btn-block"},gettext("Cancel")))))}}]),t}(l["default"].Component);n["default"]=b},{"../../services/ajax":128,"../../services/snackbar":137,"../avatar":53,"../button":55,react:"react"}],57:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.Gallery=n.GalleryItem=void 0;var u=e("react"),l=a(u),c=e("../button"),f=a(c),d=e("../../index"),p=a(d),m=e("../../services/ajax"),h=a(m),v=e("../../services/snackbar"),g=a(v),b=e("../../utils/batch"),y=a(b),_=n.GalleryItem=function(e){function t(){var e,n,a,s;r(this,t);for(var i=arguments.length,u=Array(i),l=0;i>l;l++)u[l]=arguments[l];return n=a=o(this,(e=Object.getPrototypeOf(t)).call.apply(e,[this].concat(u))),a.select=function(){a.props.select(a.props.image)},s=n,o(a,s)}return s(t,e),i(t,[{key:"getClassName",value:function(){return this.props.selection===this.props.image?this.props.disabled?"btn btn-avatar btn-disabled avatar-selected":"btn btn-avatar avatar-selected":this.props.disabled?"btn btn-avatar btn-disabled":"btn btn-avatar"}},{key:"render",value:function(){return l["default"].createElement("button",{type:"button",className:this.getClassName(),disabled:this.props.disabled,onClick:this.select},l["default"].createElement("img",{src:p["default"].get("MEDIA_URL")+this.props.image}))}}]),t}(l["default"].Component),w=n.Gallery=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"render",value:function(){var e=this;return l["default"].createElement("div",{className:"avatars-gallery"},l["default"].createElement("h3",null,this.props.name),l["default"].createElement("div",{className:"avatars-gallery-images"},(0,y["default"])(this.props.images,4,null).map(function(t,n){return l["default"].createElement("div",{className:"row",key:n},t.map(function(t,n){return l["default"].createElement("div",{className:"col-xs-3",key:n},t?l["default"].createElement(_,{image:t,disabled:e.props.disabled,select:e.props.select,selection:e.props.selection}):l["default"].createElement("div",{className:"blank-avatar"}))}))})))}}]),t}(l["default"].Component),E=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.select=function(e){n.setState({selection:e})},n.save=function(){return n.state.isLoading?!1:(n.setState({isLoading:!0}),void h["default"].post(n.props.user.api_url.avatar,{avatar:"galleries",image:n.state.selection}).then(function(e){n.setState({isLoading:!1}),g["default"].success(e.detail),n.props.onComplete(e.avatar_hash,e.options)},function(e){400===e.status?(g["default"].error(e.detail),n.setState({isLoading:!1})):n.props.showError(e)}))},n.state={selection:null,isLoading:!1},n}return s(t,e),i(t,[{key:"render",value:function(){var e=this;return l["default"].createElement("div",null,l["default"].createElement("div",{className:"modal-body modal-avatar-gallery"},this.props.options.galleries.map(function(t,n){return l["default"].createElement(w,{name:t.name,images:t.images,selection:e.state.selection,disabled:e.state.isLoading,select:e.select,key:n})})),l["default"].createElement("div",{className:"modal-footer"},l["default"].createElement("div",{className:"row"},l["default"].createElement("div",{className:"col-md-6 col-md-offset-3"},l["default"].createElement(f["default"],{onClick:this.save,loading:this.state.isLoading,disabled:!this.state.selection,className:"btn-primary btn-block"},this.state.selection?gettext("Save choice"):gettext("Select avatar")),l["default"].createElement(f["default"],{onClick:this.props.showIndex,disabled:this.state.isLoading,className:"btn-default btn-block"},gettext("Cancel"))))))}}]),t}(l["default"].Component);n["default"]=E},{"../../index":121,"../../services/ajax":128,"../../services/snackbar":137,"../../utils/batch":141,"../button":55,react:"react"}],58:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("../avatar"),f=a(c),d=e("../button"),p=a(d),m=e("../loader"),h=a(m),v=e("../../services/ajax"),g=a(v),b=e("../../services/snackbar"),y=a(b),_=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.setGravatar=function(){n.callApi("gravatar")},n.setGenerated=function(){n.callApi("generated")},n.state={isLoading:!1},n}return s(t,e),i(t,[{key:"callApi",value:function(e){var t=this;return this.state.isLoading?!1:(this.setState({isLoading:!0}),void g["default"].post(this.props.user.api_url.avatar,{avatar:e}).then(function(e){t.setState({isLoading:!1}),y["default"].success(e.detail),t.props.onComplete(e.avatar_hash,e.options)},function(e){400===e.status?(y["default"].error(e.detail),t.setState({isLoading:!1})):t.props.showError(e)}))}},{key:"getGravatarButton",value:function(){return this.props.options.gravatar?l["default"].createElement(p["default"],{onClick:this.setGravatar,disabled:this.state.isLoading,className:"btn-default btn-block btn-avatar-gravatar"},gettext("Download my Gravatar")):null}},{key:"getCropButton",value:function(){return this.props.options.crop_org?l["default"].createElement(p["default"],{onClick:this.props.showCrop,disabled:this.state.isLoading,className:"btn-default btn-block btn-avatar-crop"},gettext("Re-crop uploaded image")):null}},{key:"getUploadButton",value:function(){return this.props.options.upload?l["default"].createElement(p["default"],{onClick:this.props.showUpload,disabled:this.state.isLoading,className:"btn-default btn-block btn-avatar-upload"},gettext("Upload new image")):null}},{key:"getGalleryButton",value:function(){return this.props.options.galleries?l["default"].createElement(p["default"],{onClick:this.props.showGallery,disabled:this.state.isLoading,className:"btn-default btn-block btn-avatar-gallery"},gettext("Pick avatar from gallery")):null}},{key:"getAvatarPreview",value:function(){var e={id:this.props.user.id,avatar_hash:this.props.options.avatar_hash};return this.state.isLoading?l["default"].createElement("div",{className:"avatar-preview preview-loading"},l["default"].createElement(f["default"],{user:e,size:"200"}),l["default"].createElement(h["default"],null)):l["default"].createElement("div",{className:"avatar-preview"},l["default"].createElement(f["default"],{user:e,size:"200"}))}},{key:"render",value:function(){return l["default"].createElement("div",{className:"modal-body modal-avatar-index"},l["default"].createElement("div",{className:"row"},l["default"].createElement("div",{className:"col-md-5"},this.getAvatarPreview()),l["default"].createElement("div",{className:"col-md-7"},this.getGravatarButton(),l["default"].createElement(p["default"],{onClick:this.setGenerated,disabled:this.state.isLoading,className:"btn-default btn-block btn-avatar-generate"},gettext("Generate my individual avatar")),this.getCropButton(),this.getUploadButton(),this.getGalleryButton())))}}]),t}(l["default"].Component);n["default"]=_},{"../../services/ajax":128,"../../services/snackbar":137,"../avatar":53,"../button":55,"../loader":64,react:"react"}],59:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e){return{user:e.auth.user}}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.ChangeAvatarError=void 0,n.select=i;var l=e("react"),c=a(l),f=e("./index"),d=a(f),p=e("./crop"),m=a(p),h=e("./upload"),v=a(h),g=e("./gallery"),b=a(g),y=e("../modal-loader"),_=a(y),w=e("../../reducers/users"),E=e("../../services/ajax"),O=a(E),k=e("../../services/store"),x=a(k),N=n.ChangeAvatarError=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),u(t,[{key:"getErrorReason",value:function(){return this.props.reason?c["default"].createElement("p",{dangerouslySetInnerHTML:{__html:this.props.reason}}):null}},{key:"render",value:function(){return c["default"].createElement("div",{className:"modal-body"},c["default"].createElement("div",{className:"message-icon"},c["default"].createElement("span",{className:"material-icon"},"remove_circle_outline")),c["default"].createElement("div",{className:"message-body"},c["default"].createElement("p",{className:"lead"},this.props.message),this.getErrorReason()))}}]),t}(c["default"].Component),j=function(e){function t(){var e,n,a,s;r(this,t);for(var i=arguments.length,u=Array(i),l=0;i>l;l++)u[l]=arguments[l];return n=a=o(this,(e=Object.getPrototypeOf(t)).call.apply(e,[this].concat(u))),a.showError=function(e){a.setState({error:e})},a.showIndex=function(){a.setState({component:d["default"]})},a.showUpload=function(){a.setState({component:v["default"]})},a.showCrop=function(){a.setState({component:m["default"]})},a.showGallery=function(){a.setState({component:b["default"]})},a.completeFlow=function(e,t){x["default"].dispatch((0,w.updateAvatar)(a.props.user,e)),a.setState({component:d["default"],options:t})},s=n,o(a,s)}return s(t,e),u(t,[{key:"componentDidMount",value:function(){var e=this;O["default"].get(this.props.user.api_url.avatar).then(function(t){e.setState({component:d["default"],options:t,error:null})},function(t){e.showError(t)})}},{key:"getBody",value:function(){return this.state?this.state.error?c["default"].createElement(N,{message:this.state.error.detail,reason:this.state.error.reason}):c["default"].createElement(this.state.component,{options:this.state.options,user:this.props.user,onComplete:this.completeFlow,showError:this.showError,showIndex:this.showIndex,showCrop:this.showCrop,showUpload:this.showUpload,showGallery:this.showGallery}):c["default"].createElement(_["default"],null)}},{key:"getClassName",value:function(){return this.state&&this.state.error?"modal-dialog modal-message modal-change-avatar":"modal-dialog modal-change-avatar"}},{key:"render",value:function(){return c["default"].createElement("div",{className:this.getClassName(),role:"document"},c["default"].createElement("div",{className:"modal-content"},c["default"].createElement("div",{className:"modal-header"},c["default"].createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},c["default"].createElement("span",{"aria-hidden":"true"},"×")),c["default"].createElement("h4",{className:"modal-title"},gettext("Change your avatar"))),this.getBody()))}}]),t}(c["default"].Component);n["default"]=j},{"../../reducers/users":127,"../../services/ajax":128,"../../services/store":138,"../modal-loader":65,"./crop":56,"./gallery":57,"./index":58,"./upload":60,react:"react"}],60:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("./crop"),f=a(c),d=e("../button"),p=a(d),m=e("../../services/ajax"),h=a(m),v=e("../../services/snackbar"),g=a(v),b=e("../../utils/file-size"),y=a(b),_=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.pickFile=function(){document.getElementById("avatar-hidden-upload").click()},n.uploadFile=function(){var e=document.getElementById("avatar-hidden-upload").files[0],t=n.validateFile(e);if(t)return void g["default"].error(t);n.setState({image:e,preview:URL.createObjectURL(e),progress:0});var a=new FormData;a.append("avatar","upload"),a.append("image",e),h["default"].upload(n.props.user.api_url.avatar,a,function(e){n.setState({progress:e})}).then(function(e){n.setState({options:e.options,uploaded:e.detail}),g["default"].info(gettext("Your image has been uploaded and you may now crop it."))},function(e){400===e.status?(g["default"].error(e.detail),n.setState({isLoading:!1,image:null,progress:0})):n.props.showError(e)})},n.state={image:null,preview:null,progress:0,uploaded:null},n}return s(t,e),i(t,[{key:"validateFile",value:function(e){if(e.size>this.props.options.upload.limit)return interpolate(gettext("Selected file is too big. (%(filesize)s)"),{filesize:(0,y["default"])(e.size)},!0);var t=gettext("Selected file type is not supported.");if(-1===this.props.options.upload.allowed_mime_types.indexOf(e.type))return t;var n=!1,a=e.name.toLowerCase();return this.props.options.upload.allowed_extensions.map(function(e){a.substr(-1*e.length)===e&&(n=!0)}),n?!1:t}},{key:"getUploadRequirements",value:function(e){var t=e.allowed_extensions.map(function(e){
|
|
|
-return e.substr(1)});return interpolate(gettext("%(files)s files smaller than %(limit)s"),{files:t.join(", "),limit:(0,y["default"])(e.limit)},!0)}},{key:"getUploadButton",value:function(){return l["default"].createElement("div",{className:"modal-body modal-avatar-upload"},l["default"].createElement(p["default"],{className:"btn-pick-file",onClick:this.pickFile},l["default"].createElement("div",{className:"material-icon"},"input"),gettext("Select file")),l["default"].createElement("p",{className:"text-muted"},this.getUploadRequirements(this.props.options.upload)))}},{key:"getUploadProgressLabel",value:function(){return interpolate(gettext("%(progress)s % complete"),{progress:this.state.progress},!0)}},{key:"getUploadProgress",value:function(){return l["default"].createElement("div",{className:"modal-body modal-avatar-upload"},l["default"].createElement("div",{className:"upload-progress"},l["default"].createElement("img",{src:this.state.preview}),l["default"].createElement("div",{className:"progress"},l["default"].createElement("div",{className:"progress-bar",role:"progressbar","aria-valuenow":"{this.state.progress}","aria-valuemin":"0","aria-valuemax":"100",style:{width:this.state.progress+"%"}},l["default"].createElement("span",{className:"sr-only"},this.getUploadProgressLabel())))))}},{key:"renderUpload",value:function(){return l["default"].createElement("div",null,l["default"].createElement("input",{type:"file",id:"avatar-hidden-upload",className:"hidden-file-upload",onChange:this.uploadFile}),this.state.image?this.getUploadProgress():this.getUploadButton(),l["default"].createElement("div",{className:"modal-footer"},l["default"].createElement("div",{className:"col-md-6 col-md-offset-3"},l["default"].createElement(p["default"],{onClick:this.props.showIndex,disabled:!!this.state.image,className:"btn-default btn-block"},gettext("Cancel")))))}},{key:"renderCrop",value:function(){return l["default"].createElement(f["default"],{options:this.state.options,user:this.props.user,upload:this.state.uploaded,onComplete:this.props.onComplete,showError:this.props.showError,showIndex:this.props.showIndex})}},{key:"render",value:function(){return this.state.uploaded?this.renderCrop():this.renderUpload()}}]),t}(l["default"].Component);n["default"]=_},{"../../services/ajax":128,"../../services/snackbar":137,"../../utils/file-size":142,"../button":55,"./crop":56,react:"react"}],61:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"isValidated",value:function(){return"undefined"!=typeof this.props.validation}},{key:"getClassName",value:function(){var e="form-group";return this.isValidated()&&(e+=" has-feedback",e+=null===this.props.validation?" has-success":" has-error"),e}},{key:"getFeedback",value:function(){var e=this;return this.props.validation?l["default"].createElement("div",{className:"help-block errors"},this.props.validation.map(function(t,n){return l["default"].createElement("p",{key:e.props["for"]+"FeedbackItem"+n},t)})):null}},{key:"getFeedbackIcon",value:function(){return this.isValidated()?l["default"].createElement("span",{className:"material-icon form-control-feedback","aria-hidden":"true",key:this.props["for"]+"FeedbackIcon"},this.props.validation?"clear":"check"):null}},{key:"getFeedbackDescription",value:function(){return this.isValidated()?l["default"].createElement("span",{id:this.props["for"]+"_status",className:"sr-only"},this.props.validation?gettext("(error)"):gettext("(success)")):null}},{key:"getHelpText",value:function(){return this.props.helpText?l["default"].createElement("p",{className:"help-block"},this.props.helpText):null}},{key:"render",value:function(){return l["default"].createElement("div",{className:this.getClassName()},l["default"].createElement("label",{className:"control-label "+(this.props.labelClass||""),htmlFor:this.props["for"]||""},this.props.label+":"),l["default"].createElement("div",{className:this.props.controlClass||""},this.props.children,this.getFeedbackIcon(),this.getFeedbackDescription(),this.getFeedback(),this.getHelpText(),this.props.extra||null))}}]),t}(l["default"].Component);n["default"]=c},{react:"react"}],62:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var l=e("react"),c=a(l),f=e("../utils/validators"),d=e("../services/snackbar"),p=a(d),m=(0,f.required)(),h=function(e){function t(){var e,n,a,i;o(this,t);for(var u=arguments.length,l=Array(u),c=0;u>c;c++)l[c]=arguments[c];return n=a=s(this,(e=Object.getPrototypeOf(t)).call.apply(e,[this].concat(l))),a.bindInput=function(e){return function(t){var n=r({},e,t.target.value),o=a.state.errors||{};o[e]=a.validateField(e,n[e]),n.errors=o,a.setState(n)}},a.handleSubmit=function(e){if(e.preventDefault(),!a.state.isLoading&&a.clean()){a.setState({isLoading:!0});var t=a.send();t?t.then(function(e){a.setState({isLoading:!1}),a.handleSuccess(e)},function(e){a.setState({isLoading:!1}),a.handleError(e)}):a.setState({isLoading:!1})}},i=n,s(a,i)}return i(t,e),u(t,[{key:"validate",value:function(){var e={};if(!this.state.validators)return e;var t={required:this.state.validators.required||this.state.validators,optional:this.state.validators.optional||{}},n=[];for(var a in t.required)t.required.hasOwnProperty(a)&&t.required[a]&&n.push(a);for(var a in t.optional)t.optional.hasOwnProperty(a)&&t.optional[a]&&n.push(a);for(var r in n){var a=n[r],o=this.validateField(a,this.state[a]);null===o?e[a]=null:o&&(e[a]=o)}return e}},{key:"isValid",value:function(){var e=this.validate();for(var t in e)if(e.hasOwnProperty(t)&&null!==e[t])return!1;return!0}},{key:"validateField",value:function(e,t){var n=[];if(!this.state.validators)return n;var a={required:(this.state.validators.required||this.state.validators)[e],optional:(this.state.validators.optional||{})[e]},r=m(t)||!1;if(a.required){if(r)n=[r];else for(var o in a.required){var s=a.required[o](t);s&&n.push(s)}return n.length?n:null}if(r===!1&&a.optional){for(var o in a.optional){var s=a.optional[o](t);s&&n.push(s)}return n.length?n:null}return!1}},{key:"clean",value:function(){return!0}},{key:"send",value:function(){return null}},{key:"handleSuccess",value:function(e){}},{key:"handleError",value:function(e){p["default"].apiError(e)}}]),t}(c["default"].Component);n["default"]=h},{"../services/snackbar":137,"../utils/validators":148,react:"react"}],63:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"isActive",value:function(){return this.props.path?0===document.location.pathname.indexOf(this.props.path):!1}},{key:"getClassName",value:function(){return this.isActive()?(this.props.className||"")+" "+(this.props.activeClassName||"active"):this.props.className||""}},{key:"render",value:function(){return l["default"].createElement("li",{className:this.getClassName()},this.props.children)}}]),t}(l["default"].Component);n["default"]=c},{react:"react"}],64:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"render",value:function(){return l["default"].createElement("div",{className:this.props.className||"loader"},l["default"].createElement("div",{className:"loader-spinning-wheel"}))}}]),t}(l["default"].Component);n["default"]=c},{react:"react"}],65:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("./loader"),f=a(c),d=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"render",value:function(){return l["default"].createElement("div",{className:"modal-body modal-loader"},l["default"].createElement(f["default"],null))}}]),t}(l["default"].Component);n["default"]=d},{"./loader":64,react:"react"}],66:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("./panel-message"),f=a(c),d=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getHelpText",value:function(){return this.props.helpText?l["default"].createElement("p",{className:"help-block"},this.props.helpText):null}},{key:"render",value:function(){return l["default"].createElement("div",{className:"modal-body"},l["default"].createElement("div",{className:"message-icon"},l["default"].createElement("span",{className:"material-icon"},this.props.icon||"info_outline")),l["default"].createElement("div",{className:"message-body"},l["default"].createElement("p",{className:"lead"},this.props.message),this.getHelpText()))}}]),t}(f["default"]);n["default"]=d},{"./panel-message":78,react:"react"}],67:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("../../panel-loader"),f=a(c),d=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"render",value:function(){return l["default"].createElement("div",{className:"panel panel-default panel-form"},l["default"].createElement("div",{className:"panel-heading"},l["default"].createElement("h3",{className:"panel-title"},gettext("Change username"))),l["default"].createElement(f["default"],null))}}]),t}(l["default"].Component);n["default"]=d},{"../../panel-loader":77,react:"react"}],68:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("../../panel-message"),f=a(c),d=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getHelpText",value:function(){return this.props.options.next_on?interpolate(gettext("You will be able to change your username %(next_change)s."),{next_change:this.props.options.next_on.fromNow()},!0):gettext("You have used up available name changes.")}},{key:"render",value:function(){return l["default"].createElement("div",{className:"panel panel-default panel-form"},l["default"].createElement("div",{className:"panel-heading"},l["default"].createElement("h3",{className:"panel-title"},gettext("Change username"))),l["default"].createElement(f["default"],{message:gettext("You can't change your username at the moment."),helpText:this.getHelpText()}))}}]),t}(l["default"].Component);n["default"]=d},{"../../panel-message":78,react:"react"}],69:[function(e,t,n){"use strict";function a(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var l=e("react"),c=r(l),f=e("../../button"),d=r(f),p=e("../../form"),m=r(p),h=e("../../form-group"),v=r(h),g=e("../../../services/ajax"),b=r(g),y=e("../../../services/snackbar"),_=r(y),w=e("../../../utils/validators"),E=a(w),O=function(e){function t(e){o(this,t);var n=s(this,Object.getPrototypeOf(t).call(this,e));return n.state={username:"",validators:{username:[E.usernameContent(),E.usernameMinLength({username_length_min:e.options.length_min}),E.usernameMaxLength({username_length_max:e.options.length_max})]},isLoading:!1},n}return i(t,e),u(t,[{key:"getHelpText",value:function(){var e=[];if(this.props.options.changes_left>0){var t=ngettext("You can change your username %(changes_left)s more time.","You can change your username %(changes_left)s more times.",this.props.options.changes_left);e.push(interpolate(t,{changes_left:this.props.options.changes_left},!0))}if(this.props.user.acl.name_changes_expire>0){var t=ngettext("Used changes redeem after %(name_changes_expire)s day.","Used changes redeem after %(name_changes_expire)s days.",this.props.user.acl.name_changes_expire);e.push(interpolate(t,{name_changes_expire:this.props.user.acl.name_changes_expire},!0))}return e.length?e.join(" "):null}},{key:"clean",value:function(){var e=this.validate();return e.username?(_["default"].error(e.username[0]),!1):this.state.username.trim()===this.props.user.username?(_["default"].info(gettext("Your new username is same as current one.")),!1):!0}},{key:"send",value:function(){return b["default"].post(this.props.user.api_url.username,{username:this.state.username})}},{key:"handleSuccess",value:function(e){this.setState({username:""}),this.props.complete(e.username,e.slug,e.options)}},{key:"handleError",value:function(e){_["default"].apiError(e)}},{key:"render",value:function(){return c["default"].createElement("form",{onSubmit:this.handleSubmit,className:"form-horizontal"},c["default"].createElement("div",{className:"panel panel-default panel-form"},c["default"].createElement("div",{className:"panel-heading"},c["default"].createElement("h3",{className:"panel-title"},gettext("Change username"))),c["default"].createElement("div",{className:"panel-body"},c["default"].createElement(v["default"],{label:gettext("New username"),"for":"id_username",labelClass:"col-sm-4",controlClass:"col-sm-8",helpText:this.getHelpText()},c["default"].createElement("input",{type:"text",id:"id_username",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("username"),value:this.state.username}))),c["default"].createElement("div",{className:"panel-footer"},c["default"].createElement("div",{className:"row"},c["default"].createElement("div",{className:"col-sm-8 col-sm-offset-4"},c["default"].createElement(d["default"],{className:"btn-primary",loading:this.state.isLoading},gettext("Change username")))))))}}]),t}(m["default"]);n["default"]=O},{"../../../services/ajax":128,"../../../services/snackbar":137,"../../../utils/validators":148,"../../button":55,"../../form":62,"../../form-group":61,react:"react"}],70:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("moment"),l=a(u),c=e("react"),f=a(c),d=e("./form-loading"),p=a(d),m=e("./form-locked"),h=a(m),v=e("./form"),g=a(v),b=e("../../username-history"),y=a(b),_=e("../../../index"),w=a(_),E=e("../../../reducers/username-history"),O=e("../../../reducers/users"),k=e("../../../services/ajax"),x=a(k),N=e("../../../services/page-title"),j=a(N),P=e("../../../services/snackbar"),S=a(P),C=e("../../../services/store"),M=a(C),T=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.onComplete=function(e,t,a){n.setState({options:a}),M["default"].dispatch((0,E.addNameChange)({username:e,slug:t},n.props.user,n.props.user)),M["default"].dispatch((0,O.updateUsername)(n.props.user,e,t)),S["default"].success(gettext("Your username has been changed successfully."))},n.state={isLoaded:!1,options:null},n}return s(t,e),i(t,[{key:"componentDidMount",value:function(){var e=this;j["default"].set({title:gettext("Change username"),parent:gettext("Change your options")}),Promise.all([x["default"].get(this.props.user.api_url.username),x["default"].get(w["default"].get("USERNAME_CHANGES_API"),{user:this.props.user.id})]).then(function(t){M["default"].dispatch((0,E.dehydrate)(t[1].results)),e.setState({isLoaded:!0,options:{changes_left:t[0].changes_left,length_min:t[0].length_min,length_max:t[0].length_max,next_on:t[0].next_on?(0,l["default"])(t[0].next_on):null}})})}},{key:"getChangeForm",value:function(){return this.state.isLoaded?this.state.options.changes_left>0?f["default"].createElement(g["default"],{user:this.props.user,options:this.state.options,complete:this.onComplete}):f["default"].createElement(h["default"],{options:this.state.options}):f["default"].createElement(p["default"],null)}},{key:"render",value:function(){return f["default"].createElement("div",null,this.getChangeForm(),f["default"].createElement(y["default"],{isLoaded:this.state.isLoaded,changes:this.props["username-history"]}))}}]),t}(f["default"].Component);n["default"]=T},{"../../../index":121,"../../../reducers/username-history":126,"../../../reducers/users":127,"../../../services/ajax":128,"../../../services/page-title":135,"../../../services/snackbar":137,"../../../services/store":138,"../../username-history":105,"./form":69,"./form-loading":67,"./form-locked":68,moment:"moment",react:"react"}],71:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("../button"),f=a(c),d=e("../form"),p=a(d),m=e("../form-group"),h=a(m),v=e("../select"),g=a(v),b=e("../yes-no-switch"),y=a(b),_=e("../../reducers/auth"),w=e("../../services/ajax"),E=a(w),O=e("../../services/page-title"),k=a(O),x=e("../../services/snackbar"),N=a(x),j=e("../../services/store"),P=a(j),S=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.state={isLoading:!1,is_hiding_presence:e.user.is_hiding_presence,limits_private_thread_invites_to:e.user.limits_private_thread_invites_to,subscribe_to_started_threads:e.user.subscribe_to_started_threads,subscribe_to_replied_threads:e.user.subscribe_to_replied_threads,errors:{}},n.privateThreadInvitesChoices=[{value:0,icon:"help_outline",label:gettext("Everybody")},{value:1,icon:"done_all",label:gettext("Users I follow")},{value:2,icon:"highlight_off",label:gettext("Nobody")}],n.subscribeToChoices=[{value:0,icon:"bookmark_border",label:gettext("No")},{value:1,icon:"bookmark",label:gettext("Bookmark")},{value:2,icon:"mail",label:gettext("Bookmark with e-mail notification")}],n}return s(t,e),i(t,[{key:"send",value:function(){return E["default"].post(this.props.user.api_url.options,{is_hiding_presence:this.state.is_hiding_presence,limits_private_thread_invites_to:this.state.limits_private_thread_invites_to,subscribe_to_started_threads:this.state.subscribe_to_started_threads,subscribe_to_replied_threads:this.state.subscribe_to_replied_threads})}},{key:"handleSuccess",value:function(){P["default"].dispatch((0,_.patchUser)({is_hiding_presence:this.state.is_hiding_presence,limits_private_thread_invites_to:this.state.limits_private_thread_invites_to,subscribe_to_started_threads:this.state.subscribe_to_started_threads,subscribe_to_replied_threads:this.state.subscribe_to_replied_threads})),N["default"].success(gettext("Your forum options have been changed."))}},{key:"handleError",value:function(e){400===e.status?N["default"].error(gettext("Please reload page and try again.")):N["default"].apiError(e)}},{key:"componentDidMount",value:function(){k["default"].set({title:gettext("Forum options"),parent:gettext("Change your options")})}},{key:"render",value:function(){return l["default"].createElement("form",{onSubmit:this.handleSubmit,className:"form-horizontal"},l["default"].createElement("div",{className:"panel panel-default panel-form"},l["default"].createElement("div",{className:"panel-heading"},l["default"].createElement("h3",{className:"panel-title"},gettext("Change forum options"))),l["default"].createElement("div",{className:"panel-body"},l["default"].createElement("fieldset",null,l["default"].createElement("legend",null,gettext("Privacy settings")),l["default"].createElement(h["default"],{label:gettext("Hide my presence"),helpText:gettext("If you hide your presence, only members with permission to see hidden users will see when you are online."),"for":"id_is_hiding_presence",labelClass:"col-sm-4",controlClass:"col-sm-8"},l["default"].createElement(y["default"],{id:"id_is_hiding_presence",disabled:this.state.isLoading,iconOn:"visibility_off",iconOff:"visibility",labelOn:gettext("Hide my presence from other users"),labelOff:gettext("Show my presence to other users"),onChange:this.bindInput("is_hiding_presence"),value:this.state.is_hiding_presence})),l["default"].createElement(h["default"],{label:gettext("Private thread invitations"),"for":"id_limits_private_thread_invites_to",labelClass:"col-sm-4",controlClass:"col-sm-8"},l["default"].createElement(g["default"],{id:"id_limits_private_thread_invites_to",disabled:this.state.isLoading,onChange:this.bindInput("limits_private_thread_invites_to"),value:this.state.limits_private_thread_invites_to,choices:this.privateThreadInvitesChoices}))),l["default"].createElement("fieldset",null,l["default"].createElement("legend",null,gettext("Automatic subscriptions")),l["default"].createElement(h["default"],{label:gettext("Threads I start"),"for":"id_subscribe_to_started_threads",labelClass:"col-sm-4",controlClass:"col-sm-8"},l["default"].createElement(g["default"],{id:"id_subscribe_to_started_threads",disabled:this.state.isLoading,onChange:this.bindInput("subscribe_to_started_threads"),value:this.state.subscribe_to_started_threads,choices:this.subscribeToChoices})),l["default"].createElement(h["default"],{label:gettext("Threads I reply to"),"for":"id_subscribe_to_replied_threads",labelClass:"col-sm-4",controlClass:"col-sm-8"},l["default"].createElement(g["default"],{id:"id_subscribe_to_replied_threads",disabled:this.state.isLoading,onChange:this.bindInput("subscribe_to_replied_threads"),value:this.state.subscribe_to_replied_threads,choices:this.subscribeToChoices})))),l["default"].createElement("div",{className:"panel-footer"},l["default"].createElement("div",{className:"row"},l["default"].createElement("div",{className:"col-sm-8 col-sm-offset-4"},l["default"].createElement(f["default"],{className:"btn-primary",loading:this.state.isLoading},gettext("Save changes")))))))}}]),t}(p["default"]);n["default"]=S},{"../../reducers/auth":122,"../../services/ajax":128,"../../services/page-title":135,"../../services/snackbar":137,"../../services/store":138,"../button":55,"../form":62,"../form-group":61,"../select":98,"../yes-no-switch":120,react:"react"}],72:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,
|
|
|
-enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.CompactNav=n.SideNav=void 0;var u=e("react"),l=a(u),c=e("react-router"),f=e("../li"),d=a(f),p=e("../../index");a(p),n.SideNav=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"render",value:function(){var e=this;return l["default"].createElement("div",{className:"list-group nav-side"},this.props.options.map(function(t){return l["default"].createElement(c.Link,{to:e.props.baseUrl+t.component+"/",className:"list-group-item",activeClassName:"active",key:t.component},l["default"].createElement("span",{className:"material-icon"},t.icon),t.name)}))}}]),t}(l["default"].Component),n.CompactNav=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"render",value:function(){var e=this;return l["default"].createElement("ul",{className:"dropdown-menu",role:"menu"},this.props.options.map(function(t){return l["default"].createElement(d["default"],{path:e.props.baseUrl+t.component+"/",key:t.component},l["default"].createElement(c.Link,{to:e.props.baseUrl+t.component+"/",onClick:e.props.hideNav},l["default"].createElement("span",{className:"material-icon"},t.icon),t.name))}))}}]),t}(l["default"].Component)},{"../../index":121,"../li":63,react:"react","react-router":"react-router"}],73:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e){return{tick:e.tick.tick,user:e.auth.user,"username-history":e["username-history"]}}function u(){return[{path:w["default"].get("USERCP_URL")+"forum-options/",component:(0,d.connect)(i)(h["default"])},{path:w["default"].get("USERCP_URL")+"change-username/",component:(0,d.connect)(i)(g["default"])},{path:w["default"].get("USERCP_URL")+"sign-in-credentials/",component:(0,d.connect)(i)(y["default"])}]}var l=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.select=i,n.paths=u;var c=e("react"),f=a(c),d=e("react-redux"),p=e("./navs"),m=e("./forum-options"),h=a(m),v=e("./change-username/root"),g=a(v),b=e("./sign-in-credentials/root"),y=a(b),_=e("../../index"),w=a(_),E=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.toggleNav=function(){n.state.dropdown?n.setState({dropdown:!1}):n.setState({dropdown:!0})},n.hideNav=function(){n.setState({dropdown:!1})},n.state={dropdown:!1},n}return s(t,e),l(t,[{key:"getToggleNavClassName",value:function(){return this.state.dropdown?"btn btn-default btn-icon open":"btn btn-default btn-icon"}},{key:"getCompactNavClassName",value:function(){return this.state.dropdown?"compact-nav open":"compact-nav"}},{key:"render",value:function(){return f["default"].createElement("div",{className:"page page-options"},f["default"].createElement("div",{className:"page-header"},f["default"].createElement("div",{className:"container"},f["default"].createElement("h1",{className:"pull-left"},gettext("Change your options")),f["default"].createElement("button",{className:"btn btn-default btn-aligned btn-icon btn-dropdown-toggle hidden-md hidden-lg",type:"button",onClick:this.toggleNav,"aria-haspopup":"true","aria-expanded":this.state.dropdown?"true":"false"},f["default"].createElement("i",{className:"material-icon"},"menu")))),f["default"].createElement("div",{className:this.getCompactNavClassName()},f["default"].createElement(p.CompactNav,{options:w["default"].get("USER_OPTIONS"),baseUrl:w["default"].get("USERCP_URL"),hideNav:this.hideNav})),f["default"].createElement("div",{className:"container"},f["default"].createElement("div",{className:"row"},f["default"].createElement("div",{className:"col-md-3 hidden-xs hidden-sm"},f["default"].createElement(p.SideNav,{options:w["default"].get("USER_OPTIONS"),baseUrl:w["default"].get("USERCP_URL")})),f["default"].createElement("div",{className:"col-md-9"},this.props.children))))}}]),t}(f["default"].Component);n["default"]=E},{"../../index":121,"./change-username/root":70,"./forum-options":71,"./navs":72,"./sign-in-credentials/root":76,react:"react","react-redux":"react-redux"}],74:[function(e,t,n){"use strict";function a(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var l=e("react"),c=r(l),f=e("../../button"),d=r(f),p=e("../../form"),m=r(p),h=e("../../form-group"),v=r(h),g=e("../../../services/ajax"),b=r(g),y=e("../../../services/snackbar"),_=r(y),w=e("../../../utils/validators"),E=a(w),O=function(e){function t(e){o(this,t);var n=s(this,Object.getPrototypeOf(t).call(this,e));return n.state={new_email:"",password:"",validators:{new_email:[E.email()],password:[]},isLoading:!1},n}return i(t,e),u(t,[{key:"clean",value:function(){var e=this.validate(),t=[this.state.new_email.trim().length,this.state.password.trim().length];return-1!==t.indexOf(0)?(_["default"].error(gettext("Fill out all fields.")),!1):e.new_email?(_["default"].error(e.new_email[0]),!1):!0}},{key:"send",value:function(){return b["default"].post(this.props.user.api_url.change_email,{new_email:this.state.new_email,password:this.state.password})}},{key:"handleSuccess",value:function(e){this.setState({new_email:"",password:""}),_["default"].success(e.detail)}},{key:"handleError",value:function(e){400===e.status?e.new_email?_["default"].error(e.new_email):_["default"].error(e.password):_["default"].apiError(e)}},{key:"render",value:function(){return c["default"].createElement("form",{onSubmit:this.handleSubmit,className:"form-horizontal"},c["default"].createElement("input",{type:"type",style:{display:"none"}}),c["default"].createElement("input",{type:"password",style:{display:"none"}}),c["default"].createElement("div",{className:"panel panel-default panel-form"},c["default"].createElement("div",{className:"panel-heading"},c["default"].createElement("h3",{className:"panel-title"},gettext("Change e-mail address"))),c["default"].createElement("div",{className:"panel-body"},c["default"].createElement(v["default"],{label:gettext("New e-mail"),"for":"id_new_email",labelClass:"col-sm-4",controlClass:"col-sm-8"},c["default"].createElement("input",{type:"text",id:"id_new_email",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("new_email"),value:this.state.new_email})),c["default"].createElement("hr",null),c["default"].createElement(v["default"],{label:gettext("Your current password"),"for":"id_password",labelClass:"col-sm-4",controlClass:"col-sm-8"},c["default"].createElement("input",{type:"password",id:"id_password",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password}))),c["default"].createElement("div",{className:"panel-footer"},c["default"].createElement("div",{className:"row"},c["default"].createElement("div",{className:"col-sm-8 col-sm-offset-4"},c["default"].createElement(d["default"],{className:"btn-primary",loading:this.state.isLoading},gettext("Change e-mail")))))))}}]),t}(m["default"]);n["default"]=O},{"../../../services/ajax":128,"../../../services/snackbar":137,"../../../utils/validators":148,"../../button":55,"../../form":62,"../../form-group":61,react:"react"}],75:[function(e,t,n){"use strict";function a(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var l=e("react"),c=r(l),f=e("../../button"),d=r(f),p=e("../../form"),m=r(p),h=e("../../form-group"),v=r(h),g=e("../../../index"),b=r(g),y=e("../../../services/ajax"),_=r(y),w=e("../../../services/snackbar"),E=r(w),O=e("../../../utils/validators"),k=a(O),x=function(e){function t(e){o(this,t);var n=s(this,Object.getPrototypeOf(t).call(this,e));return n.state={new_password:"",repeat_password:"",password:"",validators:{new_password:[k.passwordMinLength(b["default"].get("SETTINGS"))],repeat_password:[],password:[]},isLoading:!1},n}return i(t,e),u(t,[{key:"clean",value:function(){var e=this.validate(),t=[this.state.new_password.trim().length,this.state.repeat_password.trim().length,this.state.password.trim().length];return-1!==t.indexOf(0)?(E["default"].error(gettext("Fill out all fields.")),!1):e.new_password?(E["default"].error(e.new_password[0]),!1):this.state.new_password.trim()!==this.state.repeat_password.trim()?(E["default"].error(gettext("New passwords are different.")),!1):!0}},{key:"send",value:function(){return _["default"].post(this.props.user.api_url.change_password,{new_password:this.state.new_password,password:this.state.password})}},{key:"handleSuccess",value:function(e){this.setState({new_password:"",repeat_password:"",password:""}),E["default"].success(e.detail)}},{key:"handleError",value:function(e){400===e.status?e.new_password?E["default"].error(e.new_password):E["default"].error(e.password):E["default"].apiError(e)}},{key:"render",value:function(){return c["default"].createElement("form",{onSubmit:this.handleSubmit,className:"form-horizontal"},c["default"].createElement("input",{type:"type",style:{display:"none"}}),c["default"].createElement("input",{type:"password",style:{display:"none"}}),c["default"].createElement("div",{className:"panel panel-default panel-form"},c["default"].createElement("div",{className:"panel-heading"},c["default"].createElement("h3",{className:"panel-title"},gettext("Change password"))),c["default"].createElement("div",{className:"panel-body"},c["default"].createElement(v["default"],{label:gettext("New password"),"for":"id_new_password",labelClass:"col-sm-4",controlClass:"col-sm-8"},c["default"].createElement("input",{type:"password",id:"id_new_password",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("new_password"),value:this.state.new_password})),c["default"].createElement(v["default"],{label:gettext("Repeat password"),"for":"id_repeat_password",labelClass:"col-sm-4",controlClass:"col-sm-8"},c["default"].createElement("input",{type:"password",id:"id_repeat_password",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("repeat_password"),value:this.state.repeat_password})),c["default"].createElement("hr",null),c["default"].createElement(v["default"],{label:gettext("Your current password"),"for":"id_password",labelClass:"col-sm-4",controlClass:"col-sm-8"},c["default"].createElement("input",{type:"password",id:"id_password",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password}))),c["default"].createElement("div",{className:"panel-footer"},c["default"].createElement("div",{className:"row"},c["default"].createElement("div",{className:"col-sm-8 col-sm-offset-4"},c["default"].createElement(d["default"],{className:"btn-primary",loading:this.state.isLoading},gettext("Change password")))))))}}]),t}(m["default"]);n["default"]=x},{"../../../index":121,"../../../services/ajax":128,"../../../services/snackbar":137,"../../../utils/validators":148,"../../button":55,"../../form":62,"../../form-group":61,react:"react"}],76:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("./change-email"),f=a(c),d=e("./change-password"),p=a(d),m=e("../../../index"),h=a(m),v=e("../../../services/page-title"),g=a(v),b=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"componentDidMount",value:function(){g["default"].set({title:gettext("Change email or password"),parent:gettext("Change your options")})}},{key:"render",value:function(){return l["default"].createElement("div",null,l["default"].createElement(f["default"],{user:this.props.user}),l["default"].createElement(p["default"],{user:this.props.user}),l["default"].createElement("p",{className:"message-line"},l["default"].createElement("span",{className:"material-icon"},"warning"),l["default"].createElement("a",{href:h["default"].get("FORGOTTEN_PASSWORD_URL")},gettext("Change forgotten password"))))}}]),t}(l["default"].Component);n["default"]=b},{"../../../index":121,"../../../services/page-title":135,"./change-email":74,"./change-password":75,react:"react"}],77:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("./loader"),f=a(c),d=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"render",value:function(){return l["default"].createElement("div",{className:"panel-body panel-body-loading"},l["default"].createElement(f["default"],{className:"loader loader-spaced"}))}}]),t}(l["default"].Component);n["default"]=d},{"./loader":64,react:"react"}],78:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getHelpText",value:function(){return this.props.helpText?l["default"].createElement("p",{className:"help-block"},this.props.helpText):null}},{key:"render",value:function(){return l["default"].createElement("div",{className:"panel-body panel-message-body"},l["default"].createElement("div",{className:"message-icon"},l["default"].createElement("span",{className:"material-icon"},this.props.icon||"info_outline")),l["default"].createElement("div",{className:"message-body"},l["default"].createElement("p",{className:"lead"},this.props.message),this.getHelpText()))}}]),t}(l["default"].Component);n["default"]=c},{react:"react"}],79:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.LABELS=n.STYLES=void 0;var u=e("react"),l=a(u),c=e("../services/zxcvbn"),f=a(c),d=n.STYLES=["progress-bar-danger","progress-bar-warning","progress-bar-warning","progress-bar-primary","progress-bar-success"],p=n.LABELS=[gettext("Entered password is very weak."),gettext("Entered password is weak."),gettext("Entered password is average."),gettext("Entered password is strong."),gettext("Entered password is very strong.")],m=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n._score=0,n._password=null,n._inputs=[],n}return s(t,e),i(t,[{key:"getScore",value:function(e,t){var n=this,a=!1;return e.trim()!==this._password&&(a=!0),t.length!==this._inputs.length?a=!0:t.map(function(e,t){e.trim()!==n._inputs[t]&&(a=!0)}),a&&(this._score=f["default"].scorePassword(e,t),this._password=e.trim(),this._inputs=t.map(function(e){return e.trim()})),this._score}},{key:"render",value:function(){var e=this.getScore(this.props.password,this.props.inputs);return l["default"].createElement("div",{className:"help-block password-strength"},l["default"].createElement("div",{className:"progress"},l["default"].createElement("div",{className:"progress-bar "+d[e],style:{width:20+20*e+"%"},role:"progress-bar","aria-valuenow":e,"aria-valuemin":"0","aria-valuemax":"4"},l["default"].createElement("span",{className:"sr-only"},p[e]))),l["default"].createElement("p",{className:"text-small"},p[e]))}}]),t}(l["default"].Component);n["default"]=m},{"../services/zxcvbn":139,react:"react"}],80:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("../avatar"),f=a(c),d=e("./follow-button"),p=a(d),m=e("./moderation/nav"),h=a(m),v=e("../user-status"),g=a(v),b=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getUserStatus",value:function(){return l["default"].createElement("li",{className:"user-status-display"},l["default"].createElement(g["default"],{user:this.props.profile,status:this.props.profile.status},l["default"].createElement(v.StatusIcon,{user:this.props.profile,status:this.props.profile.status}),l["default"].createElement(v.StatusLabel,{user:this.props.profile,status:this.props.profile.status,className:"status-label"})))}},{key:"getUserRank",value:function(){return this.props.profile.rank.is_tab?l["default"].createElement("li",{className:"user-rank"},l["default"].createElement("a",{href:this.props.profile.rank.absolute_url,className:"item-title"},this.props.profile.rank.name)):l["default"].createElement("li",{className:"user-rank"},l["default"].createElement("span",{className:"item-title"},this.props.profile.rank.name))}},{key:"getUserTitle",value:function(){return this.props.profile.title?l["default"].createElement("li",{className:"user-title"},this.props.profile.title):this.props.profile.rank.title?l["default"].createElement("li",{className:"user-title"},this.props.profile.rank.title):null}},{key:"getJoinedOn",value:function(){var e=interpolate(gettext("Joined on %(joined_on)s"),{joined_on:this.props.profile.joined_on.format("LL, LT")},!0),t=interpolate(gettext("Joined %(joined_on)s"),{joined_on:this.props.profile.joined_on.fromNow()},!0);return l["default"].createElement("li",{className:"user-joined-on"},l["default"].createElement("abbr",{title:e},t))}},{key:"getEmail",value:function(){return this.props.profile.email?l["default"].createElement("li",{className:"user-email"},l["default"].createElement("a",{href:"mailto:"+this.props.profile.email,className:"item-title"},this.props.profile.email)):null}},{key:"getFollowButton",value:function(){return this.props.profile.acl.can_follow?l["default"].createElement(p["default"],{className:"btn btn-aligned hidden-xs hidden-sm",profile:this.props.profile}):null}},{key:"getModerationButton",value:function(){return this.props.profile.acl.can_moderate?l["default"].createElement("div",{className:"btn-group btn-aligned hidden-xs hidden-sm"},l["default"].createElement("button",{className:"btn btn-default btn-moderate dropdown-toggle",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},l["default"].createElement("span",{className:"material-icon"},"tonality"),gettext("Moderation")),l["default"].createElement(h["default"],{profile:this.props.profile})):null}},{key:"render",value:function(){return l["default"].createElement("div",{className:"page-header"},l["default"].createElement("div",{className:"container"},l["default"].createElement("div",{className:"row"},l["default"].createElement("div",{className:"col-md-9 col-md-offset-3"},l["default"].createElement("h1",{className:"pull-left"},l["default"].createElement(f["default"],{user:this.props.profile,size:"100"}),l["default"].createElement("span",{className:"user-name"},this.props.profile.username)),this.getFollowButton(),this.getModerationButton(),l["default"].createElement("button",{className:"btn btn-default btn-aligned btn-icon btn-dropdown-toggle hidden-md hidden-lg",type:"button",onClick:this.props.toggleNav,"aria-haspopup":"true","aria-expanded":this.props.dropdown?"true":"false"},l["default"].createElement("i",{className:"material-icon"},"menu"))))),l["default"].createElement("div",{className:"header-stats"},l["default"].createElement("div",{className:"container"},l["default"].createElement("div",{className:"row"},l["default"].createElement("div",{className:"col-md-9 col-md-offset-3"},l["default"].createElement("ul",{className:"list-inline"},this.getUserStatus(),this.getUserRank(),this.getUserTitle(),this.getJoinedOn(),this.getEmail()))))))}}]),t}(l["default"].Component);n["default"]=b},{"../avatar":53,"../user-status":104,"./follow-button":82,"./moderation/nav":88,react:"react"}],81:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("moment"),l=a(u),c=e("react"),f=a(c),d=e("../panel-loader"),p=a(d),m=e("../panel-message"),h=a(m),v=e("../../index"),g=a(v),b=e("../../services/polls"),y=a(b),_=e("../../services/page-title"),w=a(_),E=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.update=function(e){e.expires_on&&(e.expires_on=(0,l["default"])(e.expires_on)),n.setState({isLoaded:!0,error:null,ban:e})},n.error=function(e){n.setState({isLoaded:!0,error:e.detail,ban:null})},g["default"].has("PROFILE_BAN")?n.initWithPreloadedData(g["default"].pop("PROFILE_BAN")):n.initWithoutPreloadedData(),n.startPolling(e.profile.api_url.ban),n}return s(t,e),i(t,[{key:"initWithPreloadedData",value:function(e){e.expires_on&&(e.expires_on=(0,l["default"])(e.expires_on)),this.state={isLoaded:!0,ban:e}}},{key:"initWithoutPreloadedData",value:function(){this.state={isLoaded:!1}}},{key:"startPolling",value:function(e){y["default"].start({poll:"ban-details",url:e,frequency:9e4,update:this.update,error:this.error})}},{key:"componentDidMount",value:function(){w["default"].set({title:gettext("Ban details"),parent:this.props.profile.username})}},{key:"componentWillUnmount",value:function(){y["default"].stop("ban-details")}},{key:"getUserMessage",value:function(){return this.state.ban.user_message?f["default"].createElement("div",{className:"panel-body ban-message ban-user-message"},f["default"].createElement("h4",null,gettext("User-shown ban message")),f["default"].createElement("div",{className:"lead",dangerouslySetInnerHTML:{__html:this.state.ban.user_message.html}})):null}},{key:"getStaffMessage",value:function(){return this.state.ban.staff_message?f["default"].createElement("div",{className:"panel-body ban-message ban-staff-message"},f["default"].createElement("h4",null,gettext("Team-shown ban message")),f["default"].createElement("div",{className:"lead",dangerouslySetInnerHTML:{__html:this.state.ban.staff_message.html}})):null}},{key:"getExpirationMessage",value:function(){if(this.state.ban.expires_on){if(this.state.ban.expires_on.isAfter((0,l["default"])())){var e=interpolate(gettext("This ban expires on %(expires_on)s."),{expires_on:this.state.ban.expires_on.format("LL, LT")},!0),t=interpolate(gettext("This ban expires %(expires_on)s."),{expires_on:this.state.ban.expires_on.fromNow()},!0);return f["default"].createElement("abbr",{title:e},t)}return gettext("This ban has expired.")}return interpolate(gettext("%(username)s's ban is permanent."),{username:this.props.profile.username},!0)}},{key:"getPanelBody",value:function(){return this.state.ban?Object.keys(this.state.ban).length?f["default"].createElement("div",null,this.getUserMessage(),this.getStaffMessage(),f["default"].createElement("div",{className:"panel-body ban-expires"},f["default"].createElement("h4",null,gettext("Ban expiration")),f["default"].createElement("p",{className:"lead"},this.getExpirationMessage()))):f["default"].createElement("div",null,f["default"].createElement(h["default"],{message:gettext("No ban is active at the moment.")})):this.state.error?f["default"].createElement("div",null,f["default"].createElement(h["default"],{icon:"error_outline",message:this.state.error})):f["default"].createElement("div",null,f["default"].createElement(p["default"],null))}},{key:"render",value:function(){return f["default"].createElement("div",{className:"profile-ban-details"},f["default"].createElement("div",{className:"panel panel-default"},f["default"].createElement("div",{className:"panel-heading"},f["default"].createElement("h3",{className:"panel-title"},gettext("Ban details"))),this.getPanelBody()))}}]),t}(f["default"].Component);n["default"]=E},{"../../index":121,"../../services/page-title":135,"../../services/polls":136,"../panel-loader":77,"../panel-message":78,moment:"moment",react:"react"}],82:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{
|
|
|
-constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("../button"),f=a(c),d=e("../../reducers/profile"),p=e("../../services/ajax"),m=a(p),h=e("../../services/snackbar"),v=a(h),g=e("../../services/store"),b=a(g),y=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.action=function(){n.setState({isLoading:!0}),n.props.profile.is_followed?b["default"].dispatch((0,d.patchProfile)({is_followed:!1,followers:n.props.profile.followers-1})):b["default"].dispatch((0,d.patchProfile)({is_followed:!0,followers:n.props.profile.followers+1})),m["default"].post(n.props.profile.api_url.follow).then(function(e){n.setState({isLoading:!1}),b["default"].dispatch((0,d.patchProfile)(e))},function(e){n.setState({isLoading:!1}),v["default"].apiError(e)})},n.state={isLoading:!1},n}return s(t,e),i(t,[{key:"getClassName",value:function(){return this.props.profile.is_followed?this.props.className+" btn-default btn-following":this.props.className+" btn-default btn-follow"}},{key:"getIcon",value:function(){return this.props.profile.is_followed?"favorite":"favorite_border"}},{key:"getLabel",value:function(){return this.props.profile.is_followed?gettext("Following"):gettext("Follow")}},{key:"render",value:function(){return l["default"].createElement(f["default"],{className:this.getClassName(),disabled:this.state.isLoading,onClick:this.action},l["default"].createElement("span",{className:"material-icon"},this.getIcon()),this.getLabel())}}]),t}(l["default"].Component);n["default"]=y},{"../../reducers/profile":123,"../../services/ajax":128,"../../services/snackbar":137,"../../services/store":138,"../button":55,react:"react"}],83:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var l=e("react"),c=a(l),f=e("../button"),d=a(f),p=e("../search"),m=a(p),h=e("../users-list/root"),v=a(h),g=e("../../index"),b=a(g),y=e("../../reducers/users"),_=e("../../services/ajax"),w=a(_),E=e("../../services/snackbar"),O=a(E),k=e("../../services/store"),x=a(k),N=e("../../services/page-title"),j=a(N),P=function(e){function t(e){o(this,t);var n=s(this,Object.getPrototypeOf(t).call(this,e));return n.loadMore=function(){n.setState({isBusy:!0}),n.loadUsers(n.state.page+1,n.state.search)},n.search=function(e){n.setState({isLoaded:!1,isBusy:!0,search:e.target.value,count:0,more:0,page:1,pages:1}),n.loadUsers(1,e.target.value)},n.setSpecialProps(),b["default"].has(n.PRELOADED_DATA_KEY)?n.initWithPreloadedData(b["default"].pop(n.PRELOADED_DATA_KEY)):n.initWithoutPreloadedData(),n}return i(t,e),u(t,[{key:"setSpecialProps",value:function(){this.PRELOADED_DATA_KEY="PROFILE_FOLLOWERS",this.TITLE=gettext("Followers"),this.API_FILTER="followers"}},{key:"initWithPreloadedData",value:function(e){this.state={isLoaded:!0,isBusy:!1,search:"",count:e.count,more:e.more,page:e.page,pages:e.pages},x["default"].dispatch((0,y.dehydrate)(e.results))}},{key:"initWithoutPreloadedData",value:function(){this.state={isLoaded:!1,isBusy:!1,search:"",count:0,more:0,page:1,pages:1},this.loadUsers()}},{key:"loadUsers",value:function(){var e,t=this,n=arguments.length<=0||void 0===arguments[0]?1:arguments[0],a=arguments.length<=1||void 0===arguments[1]?null:arguments[1];w["default"].get(b["default"].get("USERS_API"),(e={},r(e,this.API_FILTER,this.props.profile.id),r(e,"name",a),r(e,"page",n||1),e),"user-"+this.API_FILTER).then(function(e){1===n?x["default"].dispatch((0,y.dehydrate)(e.results)):x["default"].dispatch((0,y.append)(e.results)),t.setState({isLoaded:!0,isBusy:!1,count:e.count,more:e.more,page:e.page,pages:e.pages})},function(e){O["default"].apiError(e)})}},{key:"componentDidMount",value:function(){j["default"].set({title:this.TITLE,parent:this.props.profile.username})}},{key:"getLabel",value:function(){if(this.state.isLoaded){if(this.state.search){var e=ngettext("Found %(users)s user.","Found %(users)s users.",this.state.count);return interpolate(e,{users:this.state.count},!0)}if(this.props.profile.id===this.props.user.id){var e=ngettext("You have %(users)s follower.","You have %(users)s followers.",this.state.count);return interpolate(e,{users:this.state.count},!0)}var e=ngettext("%(username)s has %(users)s follower.","%(username)s has %(users)s followers.",this.state.count);return interpolate(e,{username:this.props.profile.username,users:this.state.count},!0)}return gettext("Loading...")}},{key:"getEmptyMessage",value:function(){return this.state.search?gettext("Search returned no users matching specified criteria."):this.props.user.id===this.props.profile.id?gettext("You have no followers."):interpolate(gettext("%(username)s has no followers."),{username:this.props.profile.username},!0)}},{key:"getMoreButton",value:function(){return this.state.more?c["default"].createElement("div",{className:"pager-more"},c["default"].createElement(d["default"],{loading:this.state.isBusy,onClick:this.loadMore},interpolate(gettext("Show more (%(more)s)"),{more:this.state.more},!0))):null}},{key:"getListBody",value:function(){return this.state.isLoaded&&0===this.state.count?c["default"].createElement("p",{className:"lead"},this.getEmptyMessage()):c["default"].createElement("div",null,c["default"].createElement(v["default"],{isLoaded:this.state.isLoaded,users:this.props.users,showRank:!0,cols:2}),this.getMoreButton())}},{key:"getClassName",value:function(){return"profile-"+this.API_FILTER}},{key:"render",value:function(){return c["default"].createElement("div",{className:this.getClassName()},c["default"].createElement("nav",{className:"toolbar"},c["default"].createElement("h3",{className:"toolbar-left"},this.getLabel()),c["default"].createElement(m["default"],{className:"toolbar-right",value:this.state.search,onChange:this.search,placeholder:gettext("Search history...")})),this.getListBody())}}]),t}(c["default"].Component);n["default"]=P},{"../../index":121,"../../reducers/users":127,"../../services/ajax":128,"../../services/page-title":135,"../../services/snackbar":137,"../../services/store":138,"../button":55,"../search":97,"../users-list/root":106,react:"react"}],84:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=(a(u),e("./followers")),c=a(l),f=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"setSpecialProps",value:function(){this.PRELOADED_DATA_KEY="PROFILE_FOLLOWS",this.TITLE=gettext("Follows"),this.API_FILTER="follows"}},{key:"getLabel",value:function(){if(this.state.isLoaded){if(this.state.search){var e=ngettext("Found %(users)s user.","Found %(users)s users.",this.state.count);return interpolate(e,{users:this.state.count},!0)}if(this.props.profile.id===this.props.user.id){var e=ngettext("You are following %(users)s user.","You are following %(users)s users.",this.state.count);return interpolate(e,{users:this.state.count},!0)}var e=ngettext("%(username)s is following %(users)s user.","%(username)s is following %(users)s users.",this.state.count);return interpolate(e,{username:this.props.profile.username,users:this.state.count},!0)}return gettext("Loading...")}},{key:"getEmptyMessage",value:function(){return this.state.search?gettext("Search returned no users matching specified criteria."):this.props.user.id===this.props.profile.id?gettext("You are not following any users."):interpolate(gettext("%(username)s is not following any users."),{username:this.props.profile.username},!0)}}]),t}(c["default"]);n["default"]=f},{"./followers":83,react:"react"}],85:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("../../button"),f=a(c),d=e("../../form"),p=a(d),m=e("../../form-group"),h=a(m),v=e("../../modal-loader"),g=a(v),b=e("../../yes-no-switch"),y=a(b),_=e("../../modal-message"),w=a(_),E=e("../../../reducers/users"),O=e("../../../services/ajax"),k=a(O),x=e("../../../services/snackbar"),N=a(x),j=e("../../../services/store"),P=a(j),S=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.state={isLoaded:!1,isLoading:!1,error:null,is_avatar_locked:"",avatar_lock_user_message:"",avatar_lock_staff_message:""},n}return s(t,e),i(t,[{key:"componentDidMount",value:function(){var e=this;k["default"].get(this.props.profile.api_url.moderate_avatar).then(function(t){e.setState({isLoaded:!0,is_avatar_locked:t.is_avatar_locked,avatar_lock_user_message:t.avatar_lock_user_message,avatar_lock_staff_message:t.avatar_lock_staff_message})},function(t){e.setState({isLoaded:!0,error:t.detail})})}},{key:"clean",value:function(){return this.isValid()?!0:(N["default"].error(this.validate().username[0]),!1)}},{key:"send",value:function(){return k["default"].post(this.props.profile.api_url.moderate_avatar,{is_avatar_locked:this.state.is_avatar_locked,avatar_lock_user_message:this.state.avatar_lock_user_message,avatar_lock_staff_message:this.state.avatar_lock_staff_message})}},{key:"handleSuccess",value:function(e){P["default"].dispatch((0,E.updateAvatar)(this.props.profile,e.avatar_hash)),N["default"].success(gettext("Avatar controls have been changed."))}},{key:"getFormBody",value:function(){return l["default"].createElement("form",{onSubmit:this.handleSubmit},l["default"].createElement("div",{className:"modal-body"},l["default"].createElement(h["default"],{label:gettext("Lock avatar"),helpText:gettext("Locking user avatar will prohibit user from changing his avatar and will reset his/her avatar to default one."),"for":"id_is_avatar_locked"},l["default"].createElement(y["default"],{id:"id_is_avatar_locked",disabled:this.state.isLoading,iconOn:"lock_outline",iconOff:"lock_open",labelOn:gettext("Disallow user from changing avatar"),labelOff:gettext("Allow user to change avatar"),onChange:this.bindInput("is_avatar_locked"),value:this.state.is_avatar_locked})),l["default"].createElement(h["default"],{label:gettext("User message"),helpText:gettext("Optional message for user explaining why he/she is prohibited form changing avatar."),"for":"id_avatar_lock_user_message"},l["default"].createElement("textarea",{id:"id_avatar_lock_user_message",className:"form-control",rows:"4",disabled:this.state.isLoading,onChange:this.bindInput("avatar_lock_user_message"),value:this.state.avatar_lock_user_message})),l["default"].createElement(h["default"],{label:gettext("Staff message"),helpText:gettext("Optional message for forum team members explaining why user is prohibited form changing avatar."),"for":"id_avatar_lock_staff_message"},l["default"].createElement("textarea",{id:"id_avatar_lock_staff_message",className:"form-control",rows:"4",disabled:this.state.isLoading,onChange:this.bindInput("avatar_lock_staff_message"),value:this.state.avatar_lock_staff_message}))),l["default"].createElement("div",{className:"modal-footer"},l["default"].createElement("button",{type:"button",className:"btn btn-default","data-dismiss":"modal"},gettext("Close")),l["default"].createElement(f["default"],{className:"btn-primary",loading:this.state.isLoading},gettext("Save changes"))))}},{key:"getModalBody",value:function(){return this.state.error?l["default"].createElement(w["default"],{icon:"remove_circle_outline",message:this.state.error}):this.state.isLoaded?this.getFormBody():l["default"].createElement(g["default"],null)}},{key:"getClassName",value:function(){return this.state.error?"modal-dialog modal-message modal-avatar-controls":"modal-dialog modal-avatar-controls"}},{key:"render",value:function(){return l["default"].createElement("div",{className:this.getClassName(),role:"document"},l["default"].createElement("div",{className:"modal-content"},l["default"].createElement("div",{className:"modal-header"},l["default"].createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},l["default"].createElement("span",{"aria-hidden":"true"},"×")),l["default"].createElement("h4",{className:"modal-title"},gettext("Avatar controls"))),this.getModalBody()))}}]),t}(p["default"]);n["default"]=S},{"../../../reducers/users":127,"../../../services/ajax":128,"../../../services/snackbar":137,"../../../services/store":138,"../../button":55,"../../form":62,"../../form-group":61,"../../modal-loader":65,"../../modal-message":66,"../../yes-no-switch":120,react:"react"}],86:[function(e,t,n){"use strict";function a(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var l=e("react"),c=r(l),f=e("../../button"),d=r(f),p=e("../../form"),m=r(p),h=e("../../form-group"),v=r(h),g=e("../../modal-loader"),b=r(g),y=e("../../modal-message"),_=r(y),w=e("../../../index"),E=r(w),O=e("../../../reducers/username-history"),k=e("../../../reducers/users"),x=e("../../../services/ajax"),N=r(x),j=e("../../../services/snackbar"),P=r(j),S=e("../../../services/store"),C=r(S),M=e("../../../utils/validators"),T=a(M),L=function(e){function t(e){o(this,t);var n=s(this,Object.getPrototypeOf(t).call(this,e));return n.state={isLoaded:!1,isLoading:!1,error:null,username:"",validators:{username:[T.usernameContent(),T.usernameMinLength(E["default"].get("SETTINGS")),T.usernameMaxLength(E["default"].get("SETTINGS"))]}},n}return i(t,e),u(t,[{key:"componentDidMount",value:function(){var e=this;N["default"].get(this.props.profile.api_url.moderate_username).then(function(){e.setState({isLoaded:!0})},function(t){e.setState({isLoaded:!0,error:t.detail})})}},{key:"clean",value:function(){return this.isValid()?!0:(P["default"].error(this.validate().username[0]),!1)}},{key:"send",value:function(){return N["default"].post(this.props.profile.api_url.moderate_username,{username:this.state.username})}},{key:"handleSuccess",value:function(e){this.setState({username:""}),C["default"].dispatch((0,O.addNameChange)(e,this.props.profile,this.props.user)),C["default"].dispatch((0,k.updateUsername)(this.props.profile,e.username,e.slug)),P["default"].success(gettext("Username has been changed."))}},{key:"getFormBody",value:function(){return c["default"].createElement("form",{onSubmit:this.handleSubmit},c["default"].createElement("div",{className:"modal-body"},c["default"].createElement(v["default"],{label:gettext("New username"),"for":"id_username"},c["default"].createElement("input",{type:"text",id:"id_username",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("username"),value:this.state.username}))),c["default"].createElement("div",{className:"modal-footer"},c["default"].createElement("button",{type:"button",className:"btn btn-default","data-dismiss":"modal"},gettext("Close")),c["default"].createElement(d["default"],{className:"btn-primary",loading:this.state.isLoading},gettext("Change username"))))}},{key:"getModalBody",value:function(){return this.state.error?c["default"].createElement(_["default"],{icon:"remove_circle_outline",message:this.state.error}):this.state.isLoaded?this.getFormBody():c["default"].createElement(b["default"],null)}},{key:"getClassName",value:function(){return this.state.error?"modal-dialog modal-message modal-rename-user":"modal-dialog modal-rename-user"}},{key:"render",value:function(){return c["default"].createElement("div",{className:this.getClassName(),role:"document"},c["default"].createElement("div",{className:"modal-content"},c["default"].createElement("div",{className:"modal-header"},c["default"].createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},c["default"].createElement("span",{"aria-hidden":"true"},"×")),c["default"].createElement("h4",{className:"modal-title"},gettext("Change username"))),this.getModalBody()))}}]),t}(m["default"]);n["default"]=L},{"../../../index":121,"../../../reducers/username-history":126,"../../../reducers/users":127,"../../../services/ajax":128,"../../../services/snackbar":137,"../../../services/store":138,"../../../utils/validators":148,"../../button":55,"../../form":62,"../../form-group":61,"../../modal-loader":65,"../../modal-message":66,react:"react"}],87:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("../../button"),f=a(c),d=e("../../form"),p=a(d),m=e("../../form-group"),h=a(m),v=e("../../modal-loader"),g=a(v),b=e("../../modal-message"),y=a(b),_=e("../../yes-no-switch"),w=a(_),E=e("../../../index"),O=a(E),k=e("../../../services/ajax"),x=a(k),N=e("../../../services/polls"),j=a(N),P=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.countdown=function(){window.setTimeout(function(){n.state.countdown>1?(n.setState({countdown:n.state.countdown-1}),n.countdown()):n.state.confirm||n.setState({confirm:!0})},1e3)},n.state={isLoaded:!1,isLoading:!1,isDeleted:!1,error:null,countdown:5,confirm:!1,with_content:!1},n}return s(t,e),i(t,[{key:"componentDidMount",value:function(){var e=this;x["default"].get(this.props.profile.api_url["delete"]).then(function(){e.setState({isLoaded:!0}),e.countdown()},function(t){e.setState({isLoaded:!0,error:t.detail})})}},{key:"send",value:function(){return x["default"].post(this.props.profile.api_url["delete"],{with_content:this.state.with_content})}},{key:"handleSuccess",value:function(){j["default"].stop("user-profile"),this.state.with_content?this.setState({isDeleted:interpolate(gettext("%(username)s's account, threads, posts and other content has been deleted."),{username:this.props.profile.username},!0)}):this.setState({isDeleted:interpolate(gettext("%(username)s's account has been deleted and other content has been hidden."),{username:this.props.profile.username},!0)})}},{key:"getButtonLabel",value:function(){return this.state.confirm?interpolate(gettext("Delete %(username)s"),{username:this.props.profile.username},!0):interpolate(gettext("Please wait... (%(countdown)ss)"),{countdown:this.state.countdown},!0)}},{key:"getForm",value:function(){return l["default"].createElement("form",{onSubmit:this.handleSubmit,className:"form-horizontal"},l["default"].createElement("div",{className:"modal-body"},l["default"].createElement(h["default"],{label:gettext("User content"),labelClass:"col-sm-4",controlClass:"col-sm-8","for":"id_with_content"},l["default"].createElement(w["default"],{id:"id_with_content",disabled:this.state.isLoading,labelOn:gettext("Delete together with user's account"),labelOff:gettext("Hide after deleting user's account"),onChange:this.bindInput("with_content"),value:this.state.with_content}))),l["default"].createElement("div",{className:"modal-footer"},l["default"].createElement("button",{type:"button",className:"btn btn-default","data-dismiss":"modal"},gettext("Cancel")),l["default"].createElement(f["default"],{className:"btn-danger",loading:this.state.isLoading,disabled:!this.state.confirm},this.getButtonLabel())))}},{key:"getDeletedBody",value:function(){return l["default"].createElement("div",{className:"modal-body"},l["default"].createElement("div",{className:"message-icon"},l["default"].createElement("span",{className:"material-icon"},"info_outline")),l["default"].createElement("div",{className:"message-body"},l["default"].createElement("p",{className:"lead"},this.state.isDeleted),l["default"].createElement("p",null,l["default"].createElement("a",{href:O["default"].get("USERS_LIST_URL")},gettext("Return to users list")))))}},{key:"getModalBody",value:function(){return this.state.error?l["default"].createElement(y["default"],{icon:"remove_circle_outline",message:this.state.error}):this.state.isLoaded?this.state.isDeleted?this.getDeletedBody():this.getForm():l["default"].createElement(g["default"],null)}},{key:"getClassName",value:function(){return this.state.error||this.state.isDeleted?"modal-dialog modal-message modal-delete-account":"modal-dialog modal-delete-account"}},{key:"render",value:function(){return l["default"].createElement("div",{className:this.getClassName(),role:"document"},l["default"].createElement("div",{className:"modal-content"},l["default"].createElement("div",{className:"modal-header"},l["default"].createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},l["default"].createElement("span",{"aria-hidden":"true"},"×")),l["default"].createElement("h4",{className:"modal-title"},gettext("Delete user account"))),this.getModalBody()))}}]),t}(p["default"]);n["default"]=P},{"../../../index":121,"../../../services/ajax":128,"../../../services/polls":136,"../../button":55,"../../form":62,"../../form-group":61,"../../modal-loader":65,"../../modal-message":66,"../../yes-no-switch":120,react:"react"}],88:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("react-redux"),f=e("./avatar-controls"),d=a(f),p=e("./change-username"),m=a(p),h=e("./delete-account"),v=a(h),g=e("../../../services/modal"),b=a(g),y=function(e){return{tick:e.tick,user:e.auth,profile:e.profile}},_=function(e){function t(){var e,n,a,s;r(this,t);for(var i=arguments.length,u=Array(i),l=0;i>l;l++)u[l]=arguments[l];return n=a=o(this,(e=Object.getPrototypeOf(t)).call.apply(e,[this].concat(u))),a.showAvatarDialog=function(){b["default"].show((0,c.connect)(y)(d["default"]))},a.showRenameDialog=function(){b["default"].show((0,c.connect)(y)(m["default"]))},a.showDeleteDialog=function(){b["default"].show((0,c.connect)(y)(v["default"]))},s=n,o(a,s)}return s(t,e),i(t,[{key:"getAvatarButton",value:function(){return this.props.profile.acl.can_moderate_avatar?l["default"].createElement("li",null,l["default"].createElement("button",{type:"button",className:"btn-link",onClick:this.showAvatarDialog},l["default"].createElement("span",{className:"material-icon"},"portrait"),gettext("Avatar controls"))):null}},{key:"getRenameButton",value:function(){return this.props.profile.acl.can_rename?l["default"].createElement("li",null,l["default"].createElement("button",{type:"button",className:"btn-link",onClick:this.showRenameDialog},l["default"].createElement("span",{className:"material-icon"},"credit_card"),gettext("Change username"))):null}},{key:"getDeleteButton",value:function(){return this.props.profile.acl.can_delete?l["default"].createElement("li",null,l["default"].createElement("button",{type:"button",className:"btn-link",onClick:this.showDeleteDialog},l["default"].createElement("span",{className:"material-icon"},"clear"),gettext("Delete account"))):null}},{key:"render",value:function(){return l["default"].createElement("ul",{className:"dropdown-menu dropdown-menu-right",role:"menu"},this.getAvatarButton(),this.getRenameButton(),this.getDeleteButton(),l["default"].createElement("li",{className:"divider hidden-md hidden-lg"}),l["default"].createElement("li",{className:"dropdown-buttons hidden-md hidden-lg"},l["default"].createElement("button",{type:"button",className:"btn btn-default btn-block",onClick:this.props.toggleNav},l["default"].createElement("span",{className:"material-icon"},"menu"),gettext("Menu"))))}}]),t}(l["default"].Component);n["default"]=_},{"../../../services/modal":134,"./avatar-controls":85,"./change-username":86,"./delete-account":87,react:"react","react-redux":"react-redux"}],89:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.CompactNav=n.SideNav=void 0;var u=e("react"),l=a(u),c=e("react-router"),f=e("../li"),d=a(f),p=e("./follow-button"),m=a(p),h=e("../../index"),v=(a(h),n.SideNav=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getMeta",value:function(e){return e?l["default"].createElement("span",{className:"badge"},this.props.profile[e.attr]):null}},{key:"render",value:function(){var e=this;return l["default"].createElement("div",{className:"list-group nav-side"},this.props.pages.map(function(t){return l["default"].createElement(c.Link,{to:e.props.baseUrl+t.component+"/",className:"list-group-item",activeClassName:"active",key:t.component},l["default"].createElement("span",{className:"material-icon"},t.icon),t.name,e.getMeta(t.meta))}))}}]),t}(l["default"].Component));n.CompactNav=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"showSpecialOptions",value:function(){return this.props.profile.acl.can_follow||this.props.profile.acl.can_moderate}},{key:"getFollowButton",value:function(){return this.props.profile.acl.can_follow?l["default"].createElement(m["default"],{className:"btn btn-block",profile:this.props.profile}):null}},{key:"getModerationButton",value:function(){return this.props.profile.acl.can_moderate?l["default"].createElement("button",{type:"button",className:"btn btn-default btn-block",onClick:this.props.toggleModeration},l["default"].createElement("span",{className:"material-icon"},"tonality"),gettext("Moderation")):null}},{key:"getSpecialOptions",value:function(){return this.showSpecialOptions()?l["default"].createElement("li",{className:"dropdown-buttons"},this.getFollowButton(),this.getModerationButton()):null}},{key:"render",value:function(){var e=this;return l["default"].createElement("ul",{className:"dropdown-menu",role:"menu"},this.getSpecialOptions(),this.showSpecialOptions()?l["default"].createElement("li",{className:"divider"}):null,this.props.pages.map(function(t){return l["default"].createElement(d["default"],{path:e.props.baseUrl+t.component+"/",key:t.component
|
|
|
-},l["default"].createElement(c.Link,{to:e.props.baseUrl+t.component+"/",onClick:e.props.hideNav},l["default"].createElement("span",{className:"material-icon"},t.icon),t.name,e.getMeta(t.meta)))}))}}]),t}(v)},{"../../index":121,"../li":63,"./follow-button":82,react:"react","react-router":"react-router"}],90:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e){return{tick:e.tick.tick,user:e.auth.user,users:e.users,profile:e.profile,"username-history":e["username-history"]}}function u(){var e=[];return S["default"].get("PROFILE_PAGES").forEach(function(t){e.push(Object.assign({},t,{path:S["default"].get("PROFILE").absolute_url+t.component+"/",component:(0,d.connect)(i)(U[t.component])}))}),e}var l=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.select=i,n.paths=u;var c=e("react"),f=a(c),d=e("react-redux"),p=e("../avatar"),m=a(p),h=e("./ban-details"),v=a(h),g=e("./followers"),b=a(g),y=e("./follows"),_=a(y),w=e("./username-history"),E=a(w),O=e("./Header"),k=a(O),x=e("./moderation/nav"),N=a(x),j=e("./navs"),P=e("../../index"),S=a(P),C=e("../../reducers/profile"),M=e("../../services/polls"),T=a(M),L=e("../../services/store"),R=a(L),I=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.update=function(e){R["default"].dispatch((0,C.dehydrate)(e))},n.toggleNav=function(){"pages"===n.state.dropdown?n.setState({dropdown:!1}):n.setState({dropdown:"pages"})},n.toggleModeration=function(){"moderation"===n.state.dropdown?n.setState({dropdown:!1}):n.setState({dropdown:"moderation"})},n.hideNav=function(){n.setState({dropdown:!1})},n.state={dropdown:!1},n.startPolling(e.profile.api_url.root),n}return s(t,e),l(t,[{key:"startPolling",value:function(e){T["default"].start({poll:"user-profile",url:e,frequency:9e4,update:this.update})}},{key:"getToggleNavClassName",value:function(){return this.state.dropdown?"btn btn-default btn-icon open":"btn btn-default btn-icon"}},{key:"getCompactNavClassName",value:function(){return this.state.dropdown?"compact-nav open":"compact-nav"}},{key:"getNavDropdown",value:function(){return"pages"===this.state.dropdown?f["default"].createElement(j.CompactNav,{pages:S["default"].get("PROFILE_PAGES"),baseUrl:S["default"].get("PROFILE").absolute_url,profile:this.props.profile,toggleModeration:this.toggleModeration,hideNav:this.hideNav}):"moderation"===this.state.dropdown?f["default"].createElement(N["default"],{profile:this.props.profile,toggleNav:this.toggleNav,hideNav:this.hideNav}):null}},{key:"getClassName",value:function(){var e="page page-user-profile";return e}},{key:"render",value:function(){return f["default"].createElement("div",{className:this.getClassName()},f["default"].createElement(k["default"],{user:this.props.user,profile:this.props.profile,toggleNav:this.toggleNav,toggleModeration:this.toggleModeration}),f["default"].createElement("div",{className:this.getCompactNavClassName()},this.getNavDropdown()),f["default"].createElement("div",{className:"container"},f["default"].createElement("div",{className:"row"},f["default"].createElement("div",{className:"col-md-3 hidden-xs hidden-sm"},f["default"].createElement("div",{className:"profile-side-avatar"},f["default"].createElement(m["default"],{user:this.props.profile,size:"400"})),f["default"].createElement(j.SideNav,{pages:S["default"].get("PROFILE_PAGES"),baseUrl:S["default"].get("PROFILE").absolute_url,profile:this.props.profile})),f["default"].createElement("div",{className:"col-md-9"},this.props.children))))}}]),t}(f["default"].Component);n["default"]=I;var A=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),l(t,[{key:"render",value:function(){return f["default"].createElement("div",{className:"container"},f["default"].createElement("p",null,"Hello, I'm placeholder for "+this.props.route.name))}}]),t}(f["default"].Component),U={posts:A,threads:A,followers:b["default"],follows:_["default"],"username-history":E["default"],"ban-details":v["default"]}},{"../../index":121,"../../reducers/profile":123,"../../services/polls":136,"../../services/store":138,"../avatar":53,"./Header":80,"./ban-details":81,"./followers":83,"./follows":84,"./moderation/nav":88,"./navs":89,"./username-history":91,react:"react","react-redux":"react-redux"}],91:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("../button"),f=a(c),d=e("../search"),p=a(d),m=e("../username-history"),h=a(m),v=e("../../index"),g=a(v),b=e("../../reducers/username-history"),y=e("../../services/ajax"),_=a(y),w=e("../../services/snackbar"),E=a(w),O=e("../../services/store"),k=a(O),x=e("../../services/page-title"),N=a(x),j=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.loadMore=function(){n.setState({isBusy:!0}),n.loadChanges(n.state.page+1,n.state.search)},n.search=function(e){n.setState({isLoaded:!1,isBusy:!0,search:e.target.value,count:0,more:0,page:1,pages:1}),n.loadChanges(1,e.target.value)},g["default"].has("PROFILE_NAME_HISTORY")?n.initWithPreloadedData(g["default"].pop("PROFILE_NAME_HISTORY")):n.initWithoutPreloadedData(),n}return s(t,e),i(t,[{key:"initWithPreloadedData",value:function(e){this.state={isLoaded:!0,isBusy:!1,search:"",count:e.count,more:e.more,page:e.page,pages:e.pages},k["default"].dispatch((0,b.dehydrate)(e.results))}},{key:"initWithoutPreloadedData",value:function(){this.state={isLoaded:!1,isBusy:!1,search:"",count:0,more:0,page:1,pages:1},this.loadChanges()}},{key:"loadChanges",value:function(){var e=this,t=arguments.length<=0||void 0===arguments[0]?1:arguments[0],n=arguments.length<=1||void 0===arguments[1]?null:arguments[1];_["default"].get(g["default"].get("USERNAME_CHANGES_API"),{user:this.props.profile.id,search:n,page:t||1},"search-username-history").then(function(n){1===t?k["default"].dispatch((0,b.dehydrate)(n.results)):k["default"].dispatch((0,b.append)(n.results)),e.setState({isLoaded:!0,isBusy:!1,count:n.count,more:n.more,page:n.page,pages:n.pages})},function(e){E["default"].apiError(e)})}},{key:"componentDidMount",value:function(){N["default"].set({title:gettext("Username history"),parent:this.props.profile.username})}},{key:"getLabel",value:function(){if(this.state.isLoaded){if(this.state.search){var e=ngettext("Found %(changes)s username change.","Found %(changes)s username changes.",this.state.count);return interpolate(e,{changes:this.state.count},!0)}if(this.props.profile.id===this.props.user.id){var e=ngettext("Your username was changed %(changes)s time.","Your username was changed %(changes)s times.",this.state.count);return interpolate(e,{changes:this.state.count},!0)}var e=ngettext("%(username)s's username was changed %(changes)s time.","%(username)s's username was changed %(changes)s times.",this.state.count);return interpolate(e,{username:this.props.profile.username,changes:this.state.count},!0)}return gettext("Loading...")}},{key:"getEmptyMessage",value:function(){return this.state.search?gettext("Search returned no username changes matching specified criteria."):this.props.user.id===this.props.profile.id?gettext("No name changes have been recorded for your account."):interpolate(gettext("%(username)s's username was never changed."),{username:this.props.profile.username},!0)}},{key:"getMoreButton",value:function(){return this.state.more?l["default"].createElement("div",{className:"pager-more"},l["default"].createElement(f["default"],{loading:this.state.isBusy,onClick:this.loadMore},interpolate(gettext("Show older (%(more)s)"),{more:this.state.more},!0))):null}},{key:"render",value:function(){return l["default"].createElement("div",{className:"profile-username-history"},l["default"].createElement("nav",{className:"toolbar"},l["default"].createElement("h3",{className:"toolbar-left"},this.getLabel()),l["default"].createElement(p["default"],{className:"toolbar-right",value:this.state.search,onChange:this.search,placeholder:gettext("Search history...")})),l["default"].createElement(h["default"],{isLoaded:this.state.isLoaded,emptyMessage:this.getEmptyMessage(),changes:this.props["username-history"]}),this.getMoreButton())}}]),t}(l["default"].Component);n["default"]=j},{"../../index":121,"../../reducers/username-history":126,"../../services/ajax":128,"../../services/page-title":135,"../../services/snackbar":137,"../../services/store":138,"../button":55,"../search":97,"../username-history":105,react:"react"}],92:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("./loader"),f=a(c),d=e("./register.js"),p=a(d),m=e("../services/captcha"),h=a(m),v=e("../services/modal"),g=a(v),b=e("../services/snackbar"),y=a(b),_=e("../services/zxcvbn"),w=a(_),E=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.showRegisterModal=function(){"closed"===misago.get("SETTINGS").account_activation?y["default"].info(gettext("New registrations are currently disabled.")):n.state.isLoaded?g["default"].show(p["default"]):(n.setState({isLoading:!0}),Promise.all([h["default"].load(),w["default"].load()]).then(function(){n.state.isLoaded||n.setState({isLoading:!1,isLoaded:!1}),g["default"].show(p["default"])}))},n.state={isLoading:!1,isLoaded:!1},n}return s(t,e),i(t,[{key:"getClassName",value:function(){return this.props.className+(this.state.isLoading?" btn-loading":"")}},{key:"render",value:function(){return l["default"].createElement("button",{type:"button",onClick:this.showRegisterModal,className:"btn "+this.getClassName(),disabled:this.state.isLoaded},gettext("Register"),this.state.isLoading?l["default"].createElement(f["default"],null):null)}}]),t}(l["default"].Component);n["default"]=E},{"../services/captcha":130,"../services/modal":134,"../services/snackbar":137,"../services/zxcvbn":139,"./loader":64,"./register.js":93,react:"react"}],93:[function(e,t,n){"use strict";function a(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.RegisterComplete=n.RegisterForm=void 0;var l=e("react"),c=r(l),f=e("./button"),d=r(f),p=e("./form"),m=r(p),h=e("./form-group"),v=r(h),g=e("./password-strength"),b=r(g),y=e("../index"),_=r(y),w=e("../services/ajax"),E=r(w),O=e("../services/auth"),k=r(O),x=e("../services/captcha"),N=r(x),j=e("../services/modal"),P=r(j),S=e("../services/snackbar"),C=r(S),M=e("../utils/banned-page"),T=r(M),L=e("../utils/validators"),R=a(L),I=n.RegisterForm=function(e){function t(e){o(this,t);var n=s(this,Object.getPrototypeOf(t).call(this,e));return n.state={isLoading:!1,username:"",email:"",password:"",captcha:"",validators:{username:[R.usernameContent(),R.usernameMinLength(_["default"].get("SETTINGS")),R.usernameMaxLength(_["default"].get("SETTINGS"))],email:[R.email()],password:[R.passwordMinLength(_["default"].get("SETTINGS"))],captcha:N["default"].validator()},errors:{}},n}return i(t,e),u(t,[{key:"clean",value:function(){return this.isValid()?!0:(C["default"].error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}},{key:"send",value:function(){return E["default"].post(_["default"].get("USERS_API"),{username:this.state.username,email:this.state.email,password:this.state.password,captcha:this.state.captcha})}},{key:"handleSuccess",value:function(e){this.props.callback(e)}},{key:"handleError",value:function(e){400===e.status?(this.setState({errors:Object.assign({},this.state.errors,e)}),C["default"].error(gettext("Form contains errors."))):403===e.status&&e.ban?((0,T["default"])(e.ban),P["default"].hide()):C["default"].apiError(e)}},{key:"getLegalFootNote",value:function(){return _["default"].get("TERMS_OF_SERVICE_URL")?c["default"].createElement("a",{href:_["default"].get("TERMS_OF_SERVICE_URL"),target:"_blank"},gettext("By registering you agree to site's terms and conditions.")):null}},{key:"render",value:function(){return c["default"].createElement("div",{className:"modal-dialog modal-register",role:"document"},c["default"].createElement("div",{className:"modal-content"},c["default"].createElement("div",{className:"modal-header"},c["default"].createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},c["default"].createElement("span",{"aria-hidden":"true"},"×")),c["default"].createElement("h4",{className:"modal-title"},gettext("Register"))),c["default"].createElement("form",{onSubmit:this.handleSubmit,className:"form-horizontal"},c["default"].createElement("input",{type:"type",style:{display:"none"}}),c["default"].createElement("input",{type:"password",style:{display:"none"}}),c["default"].createElement("div",{className:"modal-body"},c["default"].createElement(v["default"],{label:gettext("Username"),"for":"id_username",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.username},c["default"].createElement("input",{type:"text",id:"id_username",className:"form-control","aria-describedby":"id_username_status",disabled:this.state.isLoading,onChange:this.bindInput("username"),value:this.state.username})),c["default"].createElement(v["default"],{label:gettext("E-mail"),"for":"id_email",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.email},c["default"].createElement("input",{type:"text",id:"id_email",className:"form-control","aria-describedby":"id_email_status",disabled:this.state.isLoading,onChange:this.bindInput("email"),value:this.state.email})),c["default"].createElement(v["default"],{label:gettext("Password"),"for":"id_password",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.password,extra:c["default"].createElement(b["default"],{password:this.state.password,inputs:[this.state.username,this.state.email]})},c["default"].createElement("input",{type:"password",id:"id_password",className:"form-control","aria-describedby":"id_password_status",disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password})),N["default"].component({form:this,labelClass:"col-sm-4",controlClass:"col-sm-8"})),c["default"].createElement("div",{className:"modal-footer"},this.getLegalFootNote(),c["default"].createElement(d["default"],{className:"btn-primary",loading:this.state.isLoading},gettext("Register account"))))))}}]),t}(m["default"]),A=n.RegisterComplete=function(e){function t(){return o(this,t),s(this,Object.getPrototypeOf(t).apply(this,arguments))}return i(t,e),u(t,[{key:"getLead",value:function(){return"user"===this.props.activation?gettext("%(username)s, your account has been created but you need to activate it before you will be able to sign in."):"admin"===this.props.activation?gettext("%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in."):void 0}},{key:"getSubscript",value:function(){return"user"===this.props.activation?gettext("We have sent an e-mail to %(email)s with link that you have to click to activate your account."):"admin"===this.props.activation?gettext("We will send an e-mail to %(email)s when this takes place."):void 0}},{key:"render",value:function(){return c["default"].createElement("div",{className:"modal-dialog modal-message modal-register",role:"document"},c["default"].createElement("div",{className:"modal-content"},c["default"].createElement("div",{className:"modal-header"},c["default"].createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},c["default"].createElement("span",{"aria-hidden":"true"},"×")),c["default"].createElement("h4",{className:"modal-title"},gettext("Registration complete"))),c["default"].createElement("div",{className:"modal-body"},c["default"].createElement("div",{className:"message-icon"},c["default"].createElement("span",{className:"material-icon"},"info_outline")),c["default"].createElement("div",{className:"message-body"},c["default"].createElement("p",{className:"lead"},interpolate(this.getLead(),{username:this.props.username},!0)),c["default"].createElement("p",null,interpolate(this.getSubscript(),{email:this.props.email},!0))))))}}]),t}(c["default"].Component),U=function(e){function t(e){o(this,t);var n=s(this,Object.getPrototypeOf(t).call(this,e));return n.completeRegistration=function(e){"active"===e.activation?(P["default"].hide(),k["default"].signIn(e)):n.setState({complete:e})},n.state={complete:!1},n}return i(t,e),u(t,[{key:"render",value:function(){return this.state.complete?c["default"].createElement(A,{activation:this.state.complete.activation,username:this.state.complete.username,email:this.state.complete.email}):c["default"].createElement(I,{callback:this.completeRegistration})}}]),t}(c["default"].Component);n["default"]=U},{"../index":121,"../services/ajax":128,"../services/auth":129,"../services/captcha":130,"../services/modal":134,"../services/snackbar":137,"../utils/banned-page":140,"../utils/validators":148,"./button":55,"./form":62,"./form-group":61,"./password-strength":79,react:"react"}],94:[function(e,t,n){"use strict";function a(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.LinkSent=n.RequestLinkForm=void 0;var l=e("react"),c=r(l),f=e("../index"),d=r(f),p=e("./button"),m=r(p),h=e("./form"),v=r(h),g=e("../services/ajax"),b=r(g),y=e("../services/snackbar"),_=r(y),w=e("../utils/validators"),E=a(w),O=e("../utils/banned-page"),k=r(O),x=n.RequestLinkForm=function(e){function t(e){o(this,t);var n=s(this,Object.getPrototypeOf(t).call(this,e));return n.state={isLoading:!1,email:"",validators:{email:[E.email()]}},n}return i(t,e),u(t,[{key:"clean",value:function(){return this.isValid()?!0:(_["default"].error(gettext("Enter a valid email address.")),!1)}},{key:"send",value:function(){return b["default"].post(d["default"].get("SEND_ACTIVATION_API"),{email:this.state.email})}},{key:"handleSuccess",value:function(e){this.props.callback(e)}},{key:"handleError",value:function(e){["already_active","inactive_admin"].indexOf(e.code)>-1?_["default"].info(e.detail):403===e.status&&e.ban?(0,k["default"])(e.ban):_["default"].apiError(e)}},{key:"render",value:function(){return c["default"].createElement("div",{className:"well well-form well-form-request-activation-link"},c["default"].createElement("form",{onSubmit:this.handleSubmit},c["default"].createElement("div",{className:"form-group"},c["default"].createElement("div",{className:"control-input"},c["default"].createElement("input",{type:"text",className:"form-control",placeholder:gettext("Your e-mail address"),disabled:this.state.isLoading,onChange:this.bindInput("email"),value:this.state.email}))),c["default"].createElement(m["default"],{className:"btn-primary btn-block",loading:this.state.isLoading},gettext("Send link"))))}}]),t}(v["default"]),N=n.LinkSent=function(e){function t(){return o(this,t),s(this,Object.getPrototypeOf(t).apply(this,arguments))}return i(t,e),u(t,[{key:"getMessage",value:function(){return interpolate(gettext("Activation link was sent to %(email)s"),{email:this.props.user.email},!0)}},{key:"render",value:function(){return c["default"].createElement("div",{className:"well well-form well-form-request-activation-link well-done"},c["default"].createElement("div",{className:"done-message"},c["default"].createElement("div",{className:"message-icon"},c["default"].createElement("span",{className:"material-icon"},"check")),c["default"].createElement("div",{className:"message-body"},c["default"].createElement("p",null,this.getMessage())),c["default"].createElement("button",{type:"button",className:"btn btn-primary btn-block",onClick:this.props.callback},gettext("Request another link"))))}}]),t}(c["default"].Component),j=function(e){function t(e){o(this,t);var n=s(this,Object.getPrototypeOf(t).call(this,e));return n.complete=function(e){n.setState({complete:e})},n.reset=function(){n.setState({complete:!1})},n.state={complete:!1},n}return i(t,e),u(t,[{key:"render",value:function(){return this.state.complete?c["default"].createElement(N,{user:this.state.complete,callback:this.reset}):c["default"].createElement(x,{callback:this.complete})}}]),t}(c["default"].Component);n["default"]=j},{"../index":121,"../services/ajax":128,"../services/snackbar":137,"../utils/banned-page":140,"../utils/validators":148,"./button":55,"./form":62,react:"react"}],95:[function(e,t,n){"use strict";function a(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.AccountInactivePage=n.LinkSent=n.RequestResetForm=void 0;var l=e("react"),c=r(l),f=e("react-dom"),d=r(f),p=e("../index"),m=r(p),h=e("./button"),v=r(h),g=e("./form"),b=r(g),y=e("../services/ajax"),_=r(y),w=e("../services/snackbar"),E=r(w),O=e("../utils/validators"),k=a(O),x=e("../utils/banned-page"),N=r(x),j=n.RequestResetForm=function(e){function t(e){o(this,t);var n=s(this,Object.getPrototypeOf(t).call(this,e));return n.state={isLoading:!1,email:"",validators:{email:[k.email()]}},n}return i(t,e),u(t,[{key:"clean",value:function(){return this.isValid()?!0:(E["default"].error(gettext("Enter a valid email address.")),!1)}},{key:"send",value:function(){return _["default"].post(m["default"].get("SEND_PASSWORD_RESET_API"),{email:this.state.email})}},{key:"handleSuccess",value:function(e){this.props.callback(e)}},{key:"handleError",value:function(e){["inactive_user","inactive_admin"].indexOf(e.code)>-1?this.props.showInactivePage(e):403===e.status&&e.ban?(0,N["default"])(e.ban):E["default"].apiError(e)}},{key:"render",value:function(){return c["default"].createElement("div",{className:"well well-form well-form-request-password-reset"},c["default"].createElement("form",{onSubmit:this.handleSubmit},c["default"].createElement("div",{className:"form-group"},c["default"].createElement("div",{className:"control-input"},c["default"].createElement("input",{type:"text",className:"form-control",placeholder:gettext("Your e-mail address"),disabled:this.state.isLoading,onChange:this.bindInput("email"),value:this.state.email}))),c["default"].createElement(v["default"],{className:"btn-primary btn-block",loading:this.state.isLoading},gettext("Send link"))))}}]),t}(b["default"]),P=n.LinkSent=function(e){function t(){return o(this,t),s(this,Object.getPrototypeOf(t).apply(this,arguments))}return i(t,e),u(t,[{key:"getMessage",value:function(){return interpolate(gettext("Reset password link was sent to %(email)s"),{email:this.props.user.email},!0)}},{key:"render",value:function(){return c["default"].createElement("div",{className:"well well-form well-form-request-password-reset well-done"},c["default"].createElement("div",{className:"done-message"},c["default"].createElement("div",{className:"message-icon"},c["default"].createElement("span",{className:"material-icon"},"check")),c["default"].createElement("div",{className:"message-body"},c["default"].createElement("p",null,this.getMessage())),c["default"].createElement("button",{type:"button",className:"btn btn-primary btn-block",onClick:this.props.callback},gettext("Request another link"))))}}]),t}(c["default"].Component),S=n.AccountInactivePage=function(e){function t(){return o(this,t),s(this,Object.getPrototypeOf(t).apply(this,arguments))}return i(t,e),u(t,[{key:"getActivateButton",value:function(){return"inactive_user"===this.props.activation?c["default"].createElement("p",null,c["default"].createElement("a",{href:m["default"].get("REQUEST_ACTIVATION_URL")},gettext("Activate your account."))):null}},{key:"render",value:function(){return c["default"].createElement("div",{className:"page page-message page-message-info page-forgotten-password-inactive"},c["default"].createElement("div",{className:"container"},c["default"].createElement("div",{className:"message-panel"},c["default"].createElement("div",{className:"message-icon"},c["default"].createElement("span",{className:"material-icon"},"info_outline")),c["default"].createElement("div",{className:"message-body"},c["default"].createElement("p",{className:"lead"},gettext("Your account is inactive.")),c["default"].createElement("p",null,this.props.message),this.getActivateButton()))))}}]),t}(c["default"].Component),C=function(e){function t(e){o(this,t);var n=s(this,Object.getPrototypeOf(t).call(this,e));return n.complete=function(e){n.setState({complete:e})},n.reset=function(){n.setState({complete:!1})},n.state={complete:!1},n}return i(t,e),u(t,[{key:"showInactivePage",value:function(e){d["default"].render(c["default"].createElement(S,{activation:e.code,message:e.detail}),document.getElementById("page-mount"))}},{key:"render",value:function(){return this.state.complete?c["default"].createElement(P,{user:this.state.complete,callback:this.reset}):c["default"].createElement(j,{callback:this.complete,showInactivePage:this.showInactivePage})}}]),t}(c["default"].Component);n["default"]=C},{"../index":121,"../services/ajax":128,"../services/snackbar":137,"../utils/banned-page":140,"../utils/validators":148,"./button":55,"./form":62,react:"react","react-dom":"react-dom"}],96:[function(e,t,n){"use strict";function a(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.PasswordChangedPage=n.ResetPasswordForm=void 0;var l=e("react"),c=r(l),f=e("react-dom"),d=r(f),p=e("../index"),m=r(p),h=e("./button"),v=r(h),g=e("./form"),b=r(g),y=e("./sign-in.js"),_=r(y),w=e("../services/ajax"),E=r(w),O=e("../services/auth"),k=r(O),x=e("../services/modal"),N=r(x),j=e("../services/snackbar"),P=r(j),S=e("../utils/validators"),C=a(S),M=e("../utils/banned-page"),T=r(M),L=n.ResetPasswordForm=function(e){function t(e){
|
|
|
-o(this,t);var n=s(this,Object.getPrototypeOf(t).call(this,e));return n.state={isLoading:!1,password:"",validators:{password:[C.passwordMinLength(m["default"].get("SETTINGS"))]}},n}return i(t,e),u(t,[{key:"clean",value:function(){return this.isValid()?!0:(this.state.password.trim().length?P["default"].error(this.state.errors.password[0]):P["default"].error(gettext("Enter new password.")),!1)}},{key:"send",value:function(){return E["default"].post(m["default"].get("CHANGE_PASSWORD_API"),{password:this.state.password})}},{key:"handleSuccess",value:function(e){this.props.callback(e)}},{key:"handleError",value:function(e){403===e.status&&e.ban?(0,T["default"])(e.ban):P["default"].apiError(e)}},{key:"render",value:function(){return c["default"].createElement("div",{className:"well well-form well-form-reset-password"},c["default"].createElement("form",{onSubmit:this.handleSubmit},c["default"].createElement("div",{className:"form-group"},c["default"].createElement("div",{className:"control-input"},c["default"].createElement("input",{type:"password",className:"form-control",placeholder:gettext("Enter new password"),disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password}))),c["default"].createElement(v["default"],{className:"btn-primary btn-block",loading:this.state.isLoading},gettext("Change password"))))}}]),t}(b["default"]),R=n.PasswordChangedPage=function(e){function t(){return o(this,t),s(this,Object.getPrototypeOf(t).apply(this,arguments))}return i(t,e),u(t,[{key:"getMessage",value:function(){return interpolate(gettext("%(username)s, your password has been changed successfully."),{username:this.props.user.username},!0)}},{key:"showSignIn",value:function(){N["default"].show(_["default"])}},{key:"render",value:function(){return c["default"].createElement("div",{className:"page page-message page-message-success page-forgotten-password-changed"},c["default"].createElement("div",{className:"container"},c["default"].createElement("div",{className:"message-panel"},c["default"].createElement("div",{className:"message-icon"},c["default"].createElement("span",{className:"material-icon"},"check")),c["default"].createElement("div",{className:"message-body"},c["default"].createElement("p",{className:"lead"},this.getMessage()),c["default"].createElement("p",null,gettext("You will have to sign in using new password before continuing.")),c["default"].createElement("p",null,c["default"].createElement("button",{type:"button",className:"btn btn-primary",onClick:this.showSignIn},gettext("Sign in")))))))}}]),t}(c["default"].Component),I=function(e){function t(){var e,n,a,r;o(this,t);for(var i=arguments.length,u=Array(i),l=0;i>l;l++)u[l]=arguments[l];return n=a=s(this,(e=Object.getPrototypeOf(t)).call.apply(e,[this].concat(u))),a.complete=function(e){k["default"].softSignOut(),$('#hidden-login-form input[name="redirect_to"]').remove(),d["default"].render(c["default"].createElement(R,{user:e}),document.getElementById("page-mount"))},r=n,s(a,r)}return i(t,e),u(t,[{key:"render",value:function(){return c["default"].createElement(L,{callback:this.complete})}}]),t}(c["default"].Component);n["default"]=I},{"../index":121,"../services/ajax":128,"../services/auth":129,"../services/modal":134,"../services/snackbar":137,"../utils/banned-page":140,"../utils/validators":148,"./button":55,"./form":62,"./sign-in.js":99,react:"react","react-dom":"react-dom"}],97:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getClassName",value:function(){return this.props.className?"form-search "+this.props.className:"form-search"}},{key:"render",value:function(){return l["default"].createElement("div",{className:this.getClassName()},l["default"].createElement("input",{type:"text",className:"form-control",value:this.props.value,onChange:this.props.onChange,placeholder:this.props.placeholder||gettext("Search...")}),l["default"].createElement("span",{className:"material-icon"},"search"))}}]),t}(l["default"].Component);n["default"]=c},{react:"react"}],98:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=function(e){function t(){var e,n,a,s;r(this,t);for(var i=arguments.length,u=Array(i),l=0;i>l;l++)u[l]=arguments[l];return n=a=o(this,(e=Object.getPrototypeOf(t)).call.apply(e,[this].concat(u))),a.change=function(e){return function(){a.props.onChange({target:{value:e}})}},s=n,o(a,s)}return s(t,e),i(t,[{key:"getChoice",value:function(){var e=this,t=null;return this.props.choices.map(function(n){n.value===e.props.value&&(t=n)}),t}},{key:"getIcon",value:function(){return this.getChoice().icon}},{key:"getLabel",value:function(){return this.getChoice().label}},{key:"render",value:function(){var e=this;return l["default"].createElement("div",{className:"btn-group btn-select-group"},l["default"].createElement("button",{type:"button",className:"btn btn-select dropdown-toggle",id:this.props.id||null,"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-describedby":this.props["aria-describedby"]||null,disabled:this.props.disabled||!1},l["default"].createElement("span",{className:"material-icon"},this.getIcon()),this.getLabel()),l["default"].createElement("ul",{className:"dropdown-menu"},this.props.choices.map(function(t,n){return l["default"].createElement("li",{key:n},l["default"].createElement("button",{type:"button",className:"btn-link",onClick:e.change(t.value)},l["default"].createElement("span",{className:"material-icon"},t.icon),t.label))})))}}]),t}(l["default"].Component);n["default"]=c},{react:"react"}],99:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("../index"),f=a(c),d=e("./button"),p=a(d),m=e("./form"),h=a(m),v=e("../services/ajax"),g=a(v),b=e("../services/modal"),y=a(b),_=e("../services/snackbar"),w=a(_),E=e("../utils/banned-page"),O=a(E),k=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.state={isLoading:!1,showActivation:!1,username:"",password:"",validators:{username:[],password:[]}},n}return s(t,e),i(t,[{key:"clean",value:function(){return this.isValid()?!0:(w["default"].error(gettext("Fill out both fields.")),!1)}},{key:"send",value:function(){return g["default"].post(f["default"].get("AUTH_API"),{username:this.state.username,password:this.state.password})}},{key:"handleSuccess",value:function(){var e=$("#hidden-login-form");e.append('<input type="text" name="username" />'),e.append('<input type="password" name="password" />'),e.find('input[type="hidden"]').val(g["default"].getCsrfToken()),e.find('input[name="redirect_to"]').val(window.location.pathname),e.find('input[name="username"]').val(this.state.username),e.find('input[name="password"]').val(this.state.password),e.submit(),this.setState({isLoading:!0})}},{key:"handleError",value:function(e){400===e.status?"inactive_admin"===e.code?w["default"].info(e.detail):"inactive_user"===e.code?(w["default"].info(e.detail),this.setState({showActivation:!0})):"banned"===e.code?((0,O["default"])(e.detail),y["default"].hide()):w["default"].error(e.detail):403===e.status&&e.ban?((0,O["default"])(e.ban),y["default"].hide()):w["default"].apiError(e)}},{key:"getActivationButton",value:function(){return this.state.showActivation?l["default"].createElement("a",{href:f["default"].get("REQUEST_ACTIVATION_URL"),className:"btn btn-success btn-block"},gettext("Activate account")):null}},{key:"render",value:function(){return l["default"].createElement("div",{className:"modal-dialog modal-sm modal-sign-in",role:"document"},l["default"].createElement("div",{className:"modal-content"},l["default"].createElement("div",{className:"modal-header"},l["default"].createElement("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":gettext("Close")},l["default"].createElement("span",{"aria-hidden":"true"},"×")),l["default"].createElement("h4",{className:"modal-title"},gettext("Sign in"))),l["default"].createElement("form",{onSubmit:this.handleSubmit},l["default"].createElement("div",{className:"modal-body"},l["default"].createElement("div",{className:"form-group"},l["default"].createElement("div",{className:"control-input"},l["default"].createElement("input",{id:"id_username",className:"form-control",type:"text",disabled:this.state.isLoading,placeholder:gettext("Username or e-mail"),onChange:this.bindInput("username"),value:this.state.username}))),l["default"].createElement("div",{className:"form-group"},l["default"].createElement("div",{className:"control-input"},l["default"].createElement("input",{id:"id_password",className:"form-control",type:"password",disabled:this.state.isLoading,placeholder:gettext("Password"),onChange:this.bindInput("password"),value:this.state.password})))),l["default"].createElement("div",{className:"modal-footer"},this.getActivationButton(),l["default"].createElement(p["default"],{className:"btn-primary btn-block",loading:this.state.isLoading},gettext("Sign in")),l["default"].createElement("a",{href:f["default"].get("FORGOTTEN_PASSWORD_URL"),className:"btn btn-default btn-block"},gettext("Forgot password?"))))))}}]),t}(h["default"]);n["default"]=k},{"../index":121,"../services/ajax":128,"../services/modal":134,"../services/snackbar":137,"../utils/banned-page":140,"./button":55,"./form":62,react:"react"}],100:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e){return e.snackbar}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.Snackbar=void 0,n.select=i;var l=e("react"),c=a(l),f={info:"alert-info",success:"alert-success",warning:"alert-warning",error:"alert-danger"};n.Snackbar=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),u(t,[{key:"getSnackbarClass",value:function(){var e="alerts-snackbar";return e+=this.props.isVisible?" in":" out"}},{key:"render",value:function(){return c["default"].createElement("div",{className:this.getSnackbarClass()},c["default"].createElement("p",{className:"alert "+f[this.props.type]},this.props.message))}}]),t}(c["default"].Component)},{react:"react"}],101:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.CompactGuestNav=n.GuestNav=n.GuestMenu=void 0;var u=e("react"),l=a(u),c=e("../avatar"),f=a(c),d=e("../register-button"),p=a(d),m=e("../sign-in.js"),h=a(m),v=e("../../services/mobile-navbar-dropdown"),g=a(v),b=e("../../services/modal"),y=a(b),_=n.GuestMenu=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"showSignInModal",value:function(){y["default"].show(h["default"])}},{key:"render",value:function(){return l["default"].createElement("ul",{className:"dropdown-menu user-dropdown dropdown-menu-right",role:"menu"},l["default"].createElement("li",{className:"guest-preview"},l["default"].createElement("h4",null,gettext("You are browsing as guest.")),l["default"].createElement("p",null,gettext("Sign in or register to start and participate in discussions.")),l["default"].createElement("div",{className:"row"},l["default"].createElement("div",{className:"col-xs-6"},l["default"].createElement("button",{type:"button",className:"btn btn-default btn-block",onClick:this.showSignInModal},gettext("Sign in"))),l["default"].createElement("div",{className:"col-xs-6"},l["default"].createElement(p["default"],{className:"btn-primary btn-block"},gettext("Register"))))))}}]),t}(l["default"].Component);n.GuestNav=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"render",value:function(){return l["default"].createElement("div",{className:"nav nav-guest"},l["default"].createElement("button",{type:"button",className:"btn navbar-btn btn-default",onClick:this.showSignInModal},gettext("Sign in")),l["default"].createElement(p["default"],{className:"navbar-btn btn-primary"},gettext("Register")))}}]),t}(_),n.CompactGuestNav=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"showGuestMenu",value:function(){g["default"].show(_)}},{key:"render",value:function(){return l["default"].createElement("button",{type:"button",onClick:this.showGuestMenu},l["default"].createElement(f["default"],{size:"64"}))}}]),t}(l["default"].Component)},{"../../services/mobile-navbar-dropdown":133,"../../services/modal":134,"../avatar":53,"../register-button":92,"../sign-in.js":99,react:"react"}],102:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e){return e.auth}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.CompactUserMenu=n.UserMenu=void 0,n.select=i;var l=e("react"),c=a(l),f=e("./guest-nav"),d=e("./user-nav");n.UserMenu=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),u(t,[{key:"render",value:function(){return this.props.isAuthenticated?c["default"].createElement(d.UserNav,{user:this.props.user}):c["default"].createElement(f.GuestNav,null)}}]),t}(c["default"].Component),n.CompactUserMenu=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),u(t,[{key:"render",value:function(){return this.props.isAuthenticated?c["default"].createElement(d.CompactUserNav,{user:this.props.user}):c["default"].createElement(f.CompactGuestNav,null)}}]),t}(c["default"].Component)},{"./guest-nav":101,"./user-nav":103,react:"react"}],103:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e){return{user:e.auth.user}}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.CompactUserNav=n.UserNav=n.UserMenu=void 0,n.selectUserMenu=i;var l=e("react"),c=a(l),f=e("react-redux"),d=e("../avatar"),p=a(d),m=e("../change-avatar/root"),h=a(m),v=e("../../index"),g=a(v),b=e("../../services/mobile-navbar-dropdown"),y=a(b),_=e("../../services/modal"),w=a(_),E=n.UserMenu=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),u(t,[{key:"logout",value:function(){var e=confirm(gettext("Are you sure you want to sign out?"));e&&$("#hidden-logout-form").submit()}},{key:"changeAvatar",value:function(){w["default"].show((0,f.connect)(m.select)(h["default"]))}},{key:"render",value:function(){return c["default"].createElement("ul",{className:"dropdown-menu user-dropdown dropdown-menu-right",role:"menu"},c["default"].createElement("li",{className:"dropdown-header"},c["default"].createElement("strong",null,this.props.user.username)),c["default"].createElement("li",{className:"divider"}),c["default"].createElement("li",null,c["default"].createElement("a",{href:this.props.user.absolute_url},c["default"].createElement("span",{className:"material-icon"},"account_circle"),gettext("See your profile"))),c["default"].createElement("li",null,c["default"].createElement("a",{href:g["default"].get("USERCP_URL")},c["default"].createElement("span",{className:"material-icon"},"done_all"),gettext("Change options"))),c["default"].createElement("li",null,c["default"].createElement("button",{type:"button",className:"btn-link",onClick:this.changeAvatar},c["default"].createElement("span",{className:"material-icon"},"portrait"),gettext("Change avatar"))),c["default"].createElement("li",{className:"divider"}),c["default"].createElement("li",{className:"dropdown-buttons"},c["default"].createElement("button",{type:"button",className:"btn btn-default btn-block",onClick:this.logout},gettext("Log out"))))}}]),t}(c["default"].Component);n.UserNav=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),u(t,[{key:"render",value:function(){return c["default"].createElement("ul",{className:"ul nav navbar-nav nav-user"},c["default"].createElement("li",{className:"dropdown"},c["default"].createElement("a",{href:this.props.user.absolute_url,className:"dropdown-toggle","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",role:"button"},c["default"].createElement(p["default"],{user:this.props.user,size:"64"})),c["default"].createElement(E,{user:this.props.user})))}}]),t}(c["default"].Component),n.CompactUserNav=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),u(t,[{key:"showUserMenu",value:function(){y["default"].showConnected("user-menu",(0,f.connect)(i)(E))}},{key:"render",value:function(){return c["default"].createElement("button",{type:"button",onClick:this.showUserMenu},c["default"].createElement(p["default"],{user:this.props.user,size:"64"}))}}]),t}(c["default"].Component)},{"../../index":121,"../../services/mobile-navbar-dropdown":133,"../../services/modal":134,"../avatar":53,"../change-avatar/root":59,react:"react","react-redux":"react-redux"}],104:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.StatusLabel=n.StatusIcon=void 0;var u=e("react"),l=a(u),c=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getClass",value:function(){var e="";return this.props.status.is_banned?e="banned":this.props.status.is_hidden?e="offline":this.props.status.is_online_hidden?e="online":this.props.status.is_offline_hidden?e="offline":this.props.status.is_online?e="online":this.props.status.is_offline&&(e="offline"),"user-status user-"+e}},{key:"render",value:function(){return l["default"].createElement("span",{className:this.getClass()},this.props.children)}}]),t}(l["default"].Component);n["default"]=c;n.StatusIcon=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getIcon",value:function(){return this.props.status.is_banned?"remove_circle_outline":this.props.status.is_hidden?"help_outline":this.props.status.is_online_hidden?"label":this.props.status.is_offline_hidden?"label_outline":this.props.status.is_online?"lens":this.props.status.is_offline?"panorama_fish_eye":void 0}},{key:"render",value:function(){return l["default"].createElement("span",{className:"material-icon status-icon"},this.getIcon())}}]),t}(l["default"].Component),n.StatusLabel=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getHelp",value:function(){return this.props.status.is_banned?this.props.status.banned_until?interpolate(gettext("%(username)s is banned until %(ban_expires)s"),{username:this.props.user.username,ban_expires:this.props.status.banned_until.format("LL, LT")},!0):interpolate(gettext("%(username)s is banned"),{username:this.props.user.username},!0):this.props.status.is_hidden?interpolate(gettext("%(username)s is hiding presence"),{username:this.props.user.username},!0):this.props.status.is_online_hidden?interpolate(gettext("%(username)s is online (hidden)"),{username:this.props.user.username},!0):this.props.status.is_offline_hidden?interpolate(gettext("%(username)s was last seen %(last_click)s (hidden)"),{username:this.props.user.username,last_click:this.props.status.last_click.fromNow()},!0):this.props.status.is_online?interpolate(gettext("%(username)s is online"),{username:this.props.user.username},!0):this.props.status.is_offline?interpolate(gettext("%(username)s was last seen %(last_click)s"),{username:this.props.user.username,last_click:this.props.status.last_click.fromNow()},!0):void 0}},{key:"getLabel",value:function(){return this.props.status.is_banned?gettext("Banned"):this.props.status.is_hidden?gettext("Hidden"):this.props.status.is_online_hidden?gettext("Online (hidden)"):this.props.status.is_offline_hidden?gettext("Offline (hidden)"):this.props.status.is_online?gettext("Online"):this.props.status.is_offline?gettext("Offline"):void 0}},{key:"render",value:function(){return l["default"].createElement("span",{className:this.props.className||"status-label",title:this.getHelp()},this.getLabel())}}]),t}(l["default"].Component)},{react:"react"}],105:[function(e,t,n){"use strict";function a(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var l=e("react"),c=r(l),f=e("./avatar"),d=r(f),p=e("../utils/random"),m=a(p),h=function(e){function t(){return o(this,t),s(this,Object.getPrototypeOf(t).apply(this,arguments))}return i(t,e),u(t,[{key:"renderUserAvatar",value:function(e){return e.changed_by?c["default"].createElement("a",{href:e.changed_by.absolute_url,className:"user-avatar"},c["default"].createElement(d["default"],{user:e.changed_by,size:"100"})):c["default"].createElement("span",{className:"user-avatar"},c["default"].createElement(d["default"],{size:"100"}))}},{key:"renderUsername",value:function(e){return e.changed_by?c["default"].createElement("a",{href:e.changed_by.absolute_url,className:"item-title"},e.changed_by.username):c["default"].createElement("span",{className:"item-title"},e.changed_by_username)}},{key:"renderHistory",value:function(){var e=this;return c["default"].createElement("div",{className:"username-history ui-ready"},c["default"].createElement("ul",{className:"list-group"},this.props.changes.map(function(t){return c["default"].createElement("li",{className:"list-group-item",key:t.id},c["default"].createElement("div",{className:"username-change-avatar"},e.renderUserAvatar(t)),c["default"].createElement("div",{className:"username-change-author"},e.renderUsername(t)),c["default"].createElement("div",{className:"username-change"},t.old_username,c["default"].createElement("span",{className:"material-icon"},"arrow_forward"),t.new_username),c["default"].createElement("div",{className:"username-change-date"},c["default"].createElement("abbr",{title:t.changed_on.format("LLL")},t.changed_on.fromNow())))})))}},{key:"getEmptyMessage",value:function(){return this.props.emptyMessage?this.props.emptyMessage:gettext("No name changes have been recorded for your account.")}},{key:"renderEmptyHistory",value:function(){return c["default"].createElement("div",{className:"username-history ui-ready"},c["default"].createElement("ul",{className:"list-group"},c["default"].createElement("li",{className:"list-group-item empty-message"},this.getEmptyMessage())))}},{key:"renderHistoryPreview",value:function(){return c["default"].createElement("div",{className:"username-history ui-preview"},c["default"].createElement("ul",{className:"list-group"},m.range(3,5).map(function(e){return c["default"].createElement("li",{className:"list-group-item",key:e},c["default"].createElement("div",{className:"username-change-avatar"},c["default"].createElement("span",{className:"user-avatar"},c["default"].createElement(d["default"],{size:"100"}))),c["default"].createElement("div",{className:"username-change-author"},c["default"].createElement("span",{className:"ui-preview-text",style:{width:m["int"](30,100)+"px"}}," ")),c["default"].createElement("div",{className:"username-change"},c["default"].createElement("span",{className:"ui-preview-text",style:{width:m["int"](30,50)+"px"}}," "),c["default"].createElement("span",{className:"material-icon"},"arrow_forward"),c["default"].createElement("span",{className:"ui-preview-text",style:{width:m["int"](30,50)+"px"}}," ")),c["default"].createElement("div",{className:"username-change-date"},c["default"].createElement("span",{className:"ui-preview-text",style:{width:m["int"](50,100)+"px"}}," ")))})))}},{key:"render",value:function(){return this.props.isLoaded?this.props.changes.length?this.renderHistory():this.renderEmptyHistory():this.renderHistoryPreview()}}]),t}(c["default"].Component);n["default"]=h},{"../utils/random":145,"./avatar":53,react:"react"}],106:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);
|
|
|
-e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("./user-card"),f=a(c),d=e("./user-preview"),p=a(d),m=e("../../utils/batch"),h=a(m),v=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getPager",value:function(){return this.props.pages>1?l["default"].createElement(Pager,this.props):null}},{key:"getClassName",value:function(){return this.props.className?"users-cards-list "+this.props.className+" ui-ready":"users-cards-list ui-ready"}},{key:"getColClassName",value:function(){return"col-md-"+12/this.props.cols}},{key:"getBody",value:function(){var e=this;if(this.props.isLoaded)return(0,h["default"])(this.props.users,this.props.cols).map(function(t,n){return l["default"].createElement("div",{className:"row",key:n},t.map(function(t){return l["default"].createElement("div",{className:e.getColClassName(),key:t.id},l["default"].createElement(f["default"],{user:t,showStatus:e.props.showStatus,showRank:e.props.showRank}))}))});for(var t=[],n=0;n<this.props.cols;n++)t.push(n);return l["default"].createElement("div",{className:"row"},t.map(function(t){return l["default"].createElement("div",{className:e.getColClassName(),key:t},l["default"].createElement(p["default"],{showStatus:e.props.showStatus}))}))}},{key:"render",value:function(){return l["default"].createElement("div",{className:"users-cards-list ui-ready"},this.getBody())}}]),t}(l["default"].Component);n["default"]=v},{"../../utils/batch":141,"./user-card":107,"./user-preview":108,react:"react"}],107:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("../avatar"),f=a(c),d=e("../user-status"),p=a(d),m=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getClassName",value:function(){return this.props.user.rank.css_class?"user-card user-card-"+this.props.user.rank.css_class+" ui-ready":"user-card ui-ready"}},{key:"getUserStatus",value:function(){return this.props.showStatus?this.props.user.status?l["default"].createElement(p["default"],{user:this.props.user,status:this.props.user.status},l["default"].createElement(d.StatusIcon,{user:this.props.user,status:this.props.user.status}),l["default"].createElement(d.StatusLabel,{user:this.props.user,status:this.props.user.status,className:"status-label"})):l["default"].createElement("span",{className:"user-status"},l["default"].createElement("span",{className:"status-icon ui-preview"}," "),l["default"].createElement("span",{className:"status-label ui-preview"}," ")):null}},{key:"getRankName",value:function(){return this.props.showRank?this.props.user.rank.is_tab?l["default"].createElement("a",{href:this.props.user.rank.absolute_url,className:"item-title rank-name"},this.props.user.rank.name):l["default"].createElement("span",{className:"item-title rank-name"},this.props.user.rank.name):null}},{key:"getUserTitle",value:function(){return this.props.user.title?l["default"].createElement("span",{className:"user-title"},this.props.user.title):null}},{key:"getUserJoinedOn",value:function(){var e=interpolate(gettext("Joined on %(joined_on)s"),{joined_on:this.props.user.joined_on.format("LL, LT")},!0),t=interpolate(gettext("Joined %(joined_on)s"),{joined_on:this.props.user.joined_on.fromNow()},!0);return l["default"].createElement("span",{className:"user-joined-on",title:e},t)}},{key:"render",value:function(){return l["default"].createElement("div",{className:this.getClassName()},l["default"].createElement("div",{className:"user-card-bg-image"},l["default"].createElement(f["default"],{user:this.props.user,size:"400",className:"bg-image"}),l["default"].createElement("div",{className:"user-card-bg"},l["default"].createElement("div",{className:"user-details"},l["default"].createElement("div",{className:"user-avatar"},l["default"].createElement("a",{href:this.props.user.absolute_url},l["default"].createElement(f["default"],{user:this.props.user,size:"400"}))),l["default"].createElement("h4",{className:"user-name"},l["default"].createElement("a",{href:this.props.user.absolute_url,className:"item-title"},this.props.user.username)),l["default"].createElement("p",{className:"user-subscript"},this.getUserStatus(),this.getRankName(),this.getUserTitle(),this.getUserJoinedOn())),l["default"].createElement("div",{className:"user-card-stats"},l["default"].createElement("ul",{className:"list-unstyled"},l["default"].createElement("li",{className:"user-posts-count"},l["default"].createElement("strong",null,this.props.user.posts),l["default"].createElement("small",null,gettext("posts"))),l["default"].createElement("li",{className:"user-threads-count"},l["default"].createElement("strong",null,this.props.user.threads),l["default"].createElement("small",null,gettext("threads"))),l["default"].createElement("li",{className:"user-followers-count"},l["default"].createElement("strong",null,this.props.user.followers),l["default"].createElement("small",null,gettext("followers"))))))))}}]),t}(l["default"].Component);n["default"]=m},{"../avatar":53,"../user-status":104,react:"react"}],108:[function(e,t,n){"use strict";function a(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var l=e("react"),c=r(l),f=e("../avatar"),d=r(f),p=e("../../utils/random"),m=a(p),h=function(e){function t(){return o(this,t),s(this,Object.getPrototypeOf(t).apply(this,arguments))}return i(t,e),u(t,[{key:"getUserStatus",value:function(){return this.props.showStatus?c["default"].createElement("span",{className:"user-status"},c["default"].createElement("span",{className:"status-icon ui-preview"}," "),c["default"].createElement("span",{className:"status-label ui-preview"}," ")):null}},{key:"render",value:function(){return c["default"].createElement("div",{className:"user-card ui-preview"},c["default"].createElement("div",{className:"user-card-bg-image"},c["default"].createElement(d["default"],{size:"400",className:"bg-image"}),c["default"].createElement("div",{className:"user-card-bg"},c["default"].createElement("div",{className:"user-details"},c["default"].createElement("div",{className:"user-avatar"},c["default"].createElement(d["default"],{size:"400"})),c["default"].createElement("h4",{className:"user-name"},c["default"].createElement("span",{className:"item-title"},c["default"].createElement("span",{className:"ui-preview-text",style:{width:m["int"](60,150)+"px"}}," "))),c["default"].createElement("p",{className:"user-subscript"},this.getUserStatus(),c["default"].createElement("span",{className:"user-joined-on"},c["default"].createElement("span",{className:"ui-preview-text",style:{width:m["int"](30,50)+"px"}}," ")))),c["default"].createElement("div",{className:"user-card-stats"},c["default"].createElement("ul",{className:"list-unstyled"},c["default"].createElement("li",{className:"user-posts-count"},c["default"].createElement("strong",null,c["default"].createElement("span",{className:"ui-preview-text"}," ")),c["default"].createElement("small",null,gettext("posts"))),c["default"].createElement("li",{className:"user-threads-count"},c["default"].createElement("strong",null,c["default"].createElement("span",{className:"ui-preview-text"}," ")),c["default"].createElement("small",null,gettext("threads"))),c["default"].createElement("li",{className:"user-followers-count"},c["default"].createElement("strong",null,c["default"].createElement("span",{className:"ui-preview-text"}," ")),c["default"].createElement("small",null,gettext("followers"))))))))}}]),t}(c["default"].Component);n["default"]=h},{"../../utils/random":145,"../avatar":53,react:"react"}],109:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getEmptyMessage",value:function(){return interpolate(gettext("No users have posted any new messages during last %(days)s days."),{days:this.props.trackedPeriod},!0)}},{key:"render",value:function(){return l["default"].createElement("div",{className:"active-posters-list"},l["default"].createElement("div",{className:"container"},l["default"].createElement("p",{className:"lead"},this.getEmptyMessage())))}}]),t}(l["default"].Component);n["default"]=c},{react:"react"}],110:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("react-router"),f=e("../../avatar"),d=a(f),p=e("../../user-status"),m=a(p),h=e("../../../index"),v=a(h),g=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getClassName",value:function(){return this.props.rank.css_class?"list-group-item list-group-rank-"+this.props.rank.css_class:"list-group-item"}},{key:"getUserStatus",value:function(){return this.props.user.status?l["default"].createElement(m["default"],{user:this.props.user,status:this.props.user.status},l["default"].createElement(p.StatusIcon,{user:this.props.user,status:this.props.user.status}),l["default"].createElement(p.StatusLabel,{user:this.props.user,status:this.props.user.status,className:"status-label hidden-xs hidden-sm"})):l["default"].createElement("span",{className:"user-status"},l["default"].createElement("span",{className:"status-icon ui-preview"}," "),l["default"].createElement("span",{className:"status-label ui-preview hidden-xs hidden-sm"}," "))}},{key:"getRankName",value:function(){if(this.props.rank.is_tab){var e=v["default"].get("USERS_LIST_URL")+this.props.rank.slug+"/";return l["default"].createElement(c.Link,{to:e,className:"item-title rank-name"},this.props.rank.name)}return l["default"].createElement("span",{className:"item-title rank-name"},this.props.rank.name)}},{key:"getUserTitle",value:function(){return this.props.user.title?l["default"].createElement("span",{className:"user-title hidden-xs hidden-sm"},this.props.user.title):null}},{key:"render",value:function(){return l["default"].createElement("li",{className:this.getClassName()},l["default"].createElement("div",{className:"rank-user-avatar"},l["default"].createElement("a",{href:this.props.user.absolute_url},l["default"].createElement(d["default"],{user:this.props.user,size:"50"}))),l["default"].createElement("div",{className:"rank-user"},l["default"].createElement("div",{className:"user-name"},l["default"].createElement("a",{href:this.props.user.absolute_url,className:"item-title"},this.props.user.username)),this.getUserStatus(),this.getRankName(),this.getUserTitle()),l["default"].createElement("div",{className:"rank-position"},l["default"].createElement("strong",null,"#",this.props.counter),l["default"].createElement("small",null,gettext("Rank"))),l["default"].createElement("div",{className:"rank-posts-counted"},l["default"].createElement("strong",null,this.props.user.meta.score),l["default"].createElement("small",null,gettext("Ranked posts"))),l["default"].createElement("div",{className:"rank-posts-total"},l["default"].createElement("strong",null,this.props.user.posts),l["default"].createElement("small",null,gettext("Total posts"))))}}]),t}(l["default"].Component);n["default"]=g},{"../../../index":121,"../../avatar":53,"../../user-status":104,react:"react","react-router":"react-router"}],111:[function(e,t,n){"use strict";function a(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function r(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var l=e("react"),c=r(l),f=e("../../avatar"),d=r(f),p=e("../../../utils/random"),m=a(p),h=function(e){function t(){return o(this,t),s(this,Object.getPrototypeOf(t).apply(this,arguments))}return i(t,e),u(t,[{key:"render",value:function(){return c["default"].createElement("div",{className:"active-posters-list"},c["default"].createElement("div",{className:"container"},c["default"].createElement("p",{className:"lead ui-preview-paragraph"},m.range(3,4).map(function(e){return c["default"].createElement("span",{key:e,className:"ui-preview-text",style:{width:m["int"](50,120)+"px"}}," ")})),c["default"].createElement("div",{className:"active-posters ui-preview"},c["default"].createElement("ul",{className:"list-group"},m.range(5,10).map(function(e,t){return c["default"].createElement("li",{key:e,className:"list-group-item"},c["default"].createElement("div",{className:"rank-user-avatar"},c["default"].createElement("span",null,c["default"].createElement(d["default"],{size:"50"}))),c["default"].createElement("div",{className:"rank-user"},c["default"].createElement("div",{className:"user-name"},c["default"].createElement("span",{className:"item-title"},c["default"].createElement("span",{className:"ui-preview-text",style:{width:m["int"](30,80)+"px"}}," "))),c["default"].createElement("span",{className:"user-status"},c["default"].createElement("span",{className:"status-icon ui-preview"}," "),c["default"].createElement("span",{className:"status-label ui-preview hidden-xs hidden-sm"}," ")),c["default"].createElement("span",{className:"rank-name"},c["default"].createElement("span",{className:"ui-preview-text",style:{width:m["int"](30,50)+"px"}}," ")),c["default"].createElement("span",{className:"user-title hidden-xs hidden-sm"},c["default"].createElement("span",{className:"ui-preview-text",style:{width:m["int"](30,50)+"px"}}," "))),c["default"].createElement("div",{className:"rank-position"},c["default"].createElement("strong",null,c["default"].createElement("span",{className:"ui-preview-text",style:{width:"30px"}}," ")),c["default"].createElement("small",null,gettext("Rank"))),c["default"].createElement("div",{className:"rank-posts-counted"},c["default"].createElement("strong",null,c["default"].createElement("span",{className:"ui-preview-text",style:{width:"30px"}}," ")),c["default"].createElement("small",null,gettext("Ranked posts"))),c["default"].createElement("div",{className:"rank-posts-total"},c["default"].createElement("strong",null,c["default"].createElement("span",{className:"ui-preview-text",style:{width:"30px"}}," ")),c["default"].createElement("small",null,gettext("Total posts"))))})))))}}]),t}(c["default"].Component);n["default"]=h},{"../../../utils/random":145,"../../avatar":53,react:"react"}],112:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("./list-item"),f=a(c),d=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getLeadMessage",value:function(){var e=ngettext("%(posters)s most active poster from last %(days)s days.","%(posters)s most active posters from last %(days)s days.",this.props.count);return interpolate(e,{posters:this.props.count,days:this.props.trackedPeriod},!0)}},{key:"render",value:function(){return l["default"].createElement("div",{className:"active-posters-list"},l["default"].createElement("div",{className:"container"},l["default"].createElement("p",{className:"lead"},this.getLeadMessage()),l["default"].createElement("div",{className:"active-posters ui-ready"},l["default"].createElement("ul",{className:"list-group"},this.props.users.map(function(e,t){return l["default"].createElement(f["default"],{user:e,rank:e.rank,counter:t+1,key:e.id})})))))}}]),t}(l["default"].Component);n["default"]=d},{"./list-item":110,react:"react"}],113:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("./list-empty"),f=a(c),d=e("./list-loading"),p=a(d),m=e("./list"),h=a(m),v=e("../../../index"),g=a(v),b=e("../../../reducers/users"),y=e("../../../services/polls"),_=a(y),w=e("../../../services/store"),E=a(w),O=e("../../../services/page-title"),k=a(O),x=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.update=function(e){E["default"].dispatch((0,b.dehydrate)(e.results)),n.setState({isLoaded:!0,trackedPeriod:e.tracked_period,count:e.count})},g["default"].has("USERS")?n.initWithPreloadedData(g["default"].pop("USERS")):n.initWithoutPreloadedData(),n.startPolling(),n}return s(t,e),i(t,[{key:"initWithPreloadedData",value:function(e){this.state={isLoaded:!0,trackedPeriod:e.tracked_period,count:e.count},E["default"].dispatch((0,b.dehydrate)(e.results))}},{key:"initWithoutPreloadedData",value:function(){this.state={isLoaded:!1}}},{key:"startPolling",value:function(){_["default"].start({poll:"active-posters",url:g["default"].get("USERS_API"),data:{list:"active"},frequency:9e4,update:this.update})}},{key:"componentDidMount",value:function(){k["default"].set({title:this.props.route.extra.name,parent:gettext("Users")})}},{key:"componentWillUnmount",value:function(){_["default"].stop("active-posters")}},{key:"render",value:function(){return this.state.isLoaded?this.state.count>0?l["default"].createElement(h["default"],{users:this.props.users,trackedPeriod:this.state.trackedPeriod,count:this.state.count}):l["default"].createElement(f["default"],{trackedPeriod:this.state.trackedPeriod}):l["default"].createElement(p["default"],null)}}]),t}(l["default"].Component);n["default"]=x},{"../../../index":121,"../../../reducers/users":127,"../../../services/page-title":135,"../../../services/polls":136,"../../../services/store":138,"./list":112,"./list-empty":109,"./list-loading":111,react:"react"}],114:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.CompactNav=n.TabsNav=void 0;var u=e("react"),l=a(u),c=e("react-router"),f=e("../li"),d=a(f),p=e("../../index"),m=(a(p),function(e,t){var n=e;return n+="rank"===t.component?t.slug:t.component,n+"/"}),h=function(e,t,n){return t.map(function(t){var a=m(e,t);return l["default"].createElement(d["default"],{path:a,key:a},l["default"].createElement(c.Link,{to:a,onClick:n},t.name))})};n.TabsNav=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"render",value:function(){return l["default"].createElement("ul",{className:"nav nav-pills"},h(this.props.baseUrl,this.props.lists))}}]),t}(l["default"].Component),n.CompactNav=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"render",value:function(){return l["default"].createElement("ul",{className:"dropdown-menu",role:"menu"},h(this.props.baseUrl,this.props.lists,this.props.hideNav))}}]),t}(l["default"].Component)},{"../../index":121,"../li":63,react:"react","react-router":"react-router"}],115:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("../../users-list/root"),f=a(c),d=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"render",value:function(){return l["default"].createElement("div",null,l["default"].createElement(f["default"],{isLoaded:!1,cols:3,showStatus:!0}))}}]),t}(l["default"].Component);n["default"]=d},{"../../users-list/root":106,react:"react"}],116:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("./pager"),f=a(c),d=e("../../users-list/root"),p=a(d),m=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getPager",value:function(){return this.props.pages>1?l["default"].createElement(f["default"],this.props):null}},{key:"render",value:function(){return l["default"].createElement("div",null,l["default"].createElement(p["default"],{users:this.props.users,showStatus:!0,cols:3,isLoaded:!0}),this.getPager())}}]),t}(l["default"].Component);n["default"]=m},{"../../users-list/root":106,"./pager":117,react:"react"}],117:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=e("react-router"),f=e("../../../utils/reset-scroll"),d=a(f),p=function(e){function t(){return r(this,t),o(this,Object.getPrototypeOf(t).apply(this,arguments))}return s(t,e),i(t,[{key:"getPreviousPage",value:function(){if(this.props.previous||this.props.first){var e=this.props.baseUrl;return this.props.previous&&(e+=this.props.previous+"/"),l["default"].createElement("li",{className:"previous"},l["default"].createElement(c.Link,{to:e,onClick:d["default"]},l["default"].createElement("span",{"aria-hidden":"true",className:"material-icon"},"arrow_back")))}return null}},{key:"getNextPage",value:function(){if(this.props.next){var e=this.props.baseUrl+this.props.next+"/";return l["default"].createElement("li",{className:"next"},l["default"].createElement(c.Link,{to:e,onClick:d["default"]},l["default"].createElement("span",{"aria-hidden":"true",className:"material-icon"},"arrow_forward")))}return null}},{key:"getProgessBar",value:function(){var e=this;return l["default"].createElement("ul",{className:"pager-progress-bar"},this.props.page_range.map(function(t){var n=t===e.props.page?"active":null,a=e.props.baseUrl;return t>1&&(a+=t+"/"),l["default"].createElement("li",{key:t,className:n},l["default"].createElement(c.Link,{to:a,onClick:d["default"]},t))}))}},{key:"render",value:function(){return l["default"].createElement("div",{className:"pager-undercontent"},l["default"].createElement("nav",null,l["default"].createElement("ul",{className:"pager"},this.getPreviousPage(),this.getNextPage()),this.getProgessBar()))}}]),t}(l["default"].Component);n["default"]=p},{"../../../utils/reset-scroll":146,react:"react","react-router":"react-router"}],118:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){
|
|
|
-if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},u=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var l=e("react"),c=a(l),f=e("./list"),d=a(f),p=e("./list-loading"),m=a(p),h=e("../../../index"),v=a(h),g=e("../../../reducers/users"),b=e("../../../services/polls"),y=a(b),_=e("../../../services/store"),w=a(_),E=e("../../../services/page-title"),O=a(E),k=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.update=function(e){w["default"].dispatch((0,g.dehydrate)(e.results)),e.isLoaded=!0,n.setState(e)},v["default"].has("USERS")?n.initWithPreloadedData(v["default"].pop("USERS")):n.initWithoutPreloadedData(),n.startPolling(e.params.page||1),n}return s(t,e),u(t,[{key:"initWithPreloadedData",value:function(e){this.state=Object.assign(e,{isLoaded:!0}),w["default"].dispatch((0,g.dehydrate)(e.results))}},{key:"initWithoutPreloadedData",value:function(){this.state={isLoaded:!1}}},{key:"startPolling",value:function(e){y["default"].start({poll:"rank-users",url:v["default"].get("USERS_API"),data:{rank:this.props.route.rank.id,page:e},frequency:9e4,update:this.update})}},{key:"componentDidMount",value:function(){O["default"].set({title:this.props.route.rank.name,page:this.props.params.page||null,parent:gettext("Users")})}},{key:"componentWillUnmount",value:function(){y["default"].stop("rank-users")}},{key:"componentWillReceiveProps",value:function(e){this.props.params.page!==e.params.page&&(O["default"].set({title:this.props.route.rank.name,page:e.params.page||null,parent:gettext("Users")}),this.setState({isLoaded:!1}),y["default"].stop("rank-users"),this.startPolling(e.params.page))}},{key:"getClassName",value:function(){return this.props.route.rank.css_class?"rank-users-list rank-users-"+this.props.route.rank.css_class:"rank-users-list"}},{key:"getRankDescription",value:function(){return this.props.route.rank.description?c["default"].createElement("div",{className:"rank-description"},c["default"].createElement("div",{className:"lead",dangerouslySetInnerHTML:{__html:this.props.route.rank.description.html}})):null}},{key:"getComponent",value:function(){if(this.state.isLoaded){if(this.state.count>0){var e=v["default"].get("USERS_LIST_URL")+this.props.route.rank.slug+"/";return c["default"].createElement(d["default"],i({baseUrl:e,users:this.props.users},this.state))}return c["default"].createElement("p",{className:"lead"},gettext("There are no users with this rank at the moment."))}return c["default"].createElement(m["default"],null)}},{key:"render",value:function(){return c["default"].createElement("div",{className:this.getClassName()},c["default"].createElement("div",{className:"container"},this.getRankDescription(),this.getComponent()))}}]),t}(c["default"].Component);n["default"]=k},{"../../../index":121,"../../../reducers/users":127,"../../../services/page-title":135,"../../../services/polls":136,"../../../services/store":138,"./list":116,"./list-loading":115,react:"react"}],119:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e){return{tick:e.tick.tick,user:e.auth.user,users:e.users}}function u(){var e=[];return y["default"].get("USERS_LISTS").forEach(function(t){"rank"===t.component?(e.push({path:y["default"].get("USERS_LIST_URL")+t.slug+"/:page/",component:(0,d.connect)(i)(g["default"]),rank:t}),e.push({path:y["default"].get("USERS_LIST_URL")+t.slug+"/",component:(0,d.connect)(i)(g["default"]),rank:t})):"active-posters"===t.component&&e.push({path:y["default"].get("USERS_LIST_URL")+t.component+"/",component:(0,d.connect)(i)(h["default"]),extra:{name:t.name}})}),e}var l=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.select=i,n.paths=u;var c=e("react"),f=a(c),d=e("react-redux"),p=e("./navs"),m=e("./active-posters/root"),h=a(m),v=e("./rank/root"),g=a(v),b=e("../../index"),y=a(b),_=function(e){function t(e){r(this,t);var n=o(this,Object.getPrototypeOf(t).call(this,e));return n.toggleNav=function(){n.state.dropdown?n.setState({dropdown:!1}):n.setState({dropdown:!0})},n.hideNav=function(){n.setState({dropdown:!1})},n.state={dropdown:!1},n}return s(t,e),l(t,[{key:"getToggleNavClassName",value:function(){return this.state.dropdown?"btn btn-default btn-icon open":"btn btn-default btn-icon"}},{key:"getCompactNavClassName",value:function(){return this.state.dropdown?"compact-nav open":"compact-nav"}},{key:"render",value:function(){return f["default"].createElement("div",{className:"page page-users-lists"},f["default"].createElement("div",{className:"page-header tabbed"},f["default"].createElement("div",{className:"container"},f["default"].createElement("h1",{className:"pull-left"},gettext("Users")),f["default"].createElement("button",{className:"btn btn-default btn-aligned btn-icon btn-dropdown-toggle hidden-md hidden-lg",type:"button",onClick:this.toggleNav,"aria-haspopup":"true","aria-expanded":this.state.dropdown?"true":"false"},f["default"].createElement("i",{className:"material-icon"},"menu"))),f["default"].createElement("div",{className:"page-tabs hidden-xs hidden-sm"},f["default"].createElement("div",{className:"container"},f["default"].createElement(p.TabsNav,{lists:y["default"].get("USERS_LISTS"),baseUrl:y["default"].get("USERS_LIST_URL")})))),f["default"].createElement("div",{className:this.getCompactNavClassName()},f["default"].createElement(p.CompactNav,{lists:y["default"].get("USERS_LISTS"),baseUrl:y["default"].get("USERS_LIST_URL"),hideNav:this.hideNav})),this.props.children)}}]),t}(f["default"].Component);n["default"]=_},{"../../index":121,"./active-posters/root":113,"./navs":114,"./rank/root":118,react:"react","react-redux":"react-redux"}],120:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var u=e("react"),l=a(u),c=function(e){function t(){var e,n,a,s;r(this,t);for(var i=arguments.length,u=Array(i),l=0;i>l;l++)u[l]=arguments[l];return n=a=o(this,(e=Object.getPrototypeOf(t)).call.apply(e,[this].concat(u))),a.toggle=function(){a.props.onChange({target:{value:!a.props.value}})},s=n,o(a,s)}return s(t,e),i(t,[{key:"getClassName",value:function(){return this.props.value?"btn btn-yes-no btn-yes-no-on":"btn btn-yes-no btn-yes-no-off"}},{key:"getIcon",value:function(){return this.props.value?this.props.iconOn||"check_box":this.props.iconOff||"check_box_outline_blank"}},{key:"getLabel",value:function(){return this.props.value?this.props.labelOn||gettext("yes"):this.props.labelOff||gettext("no")}},{key:"render",value:function(){return l["default"].createElement("button",{type:"button",onClick:this.toggle,className:this.getClassName(),id:this.props.id||null,"aria-describedby":this.props["aria-describedby"]||null,disabled:this.props.disabled||!1},l["default"].createElement("span",{className:"material-icon"},this.getIcon()),this.getLabel())}}]),t}(l["default"].Component);n["default"]=c},{react:"react"}],121:[function(e,t,n){(function(t){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.Misago=void 0;var s=e("./utils/ordered-list"),i=a(s),u=n.Misago=function(){function e(){r(this,e),this._initializers=[],this._context={}}return o(e,[{key:"addInitializer",value:function(e){this._initializers.push({key:e.name,item:e.initializer,after:e.after,before:e.before})}},{key:"init",value:function(e){var t=this;this._context=e;var n=new i["default"](this._initializers).orderedValues();n.forEach(function(e){e(t)})}},{key:"has",value:function(e){return!!this._context[e]}},{key:"get",value:function(e,t){return this.has(e)?this._context[e]:t||void 0}},{key:"pop",value:function(e){if(this.has(e)){var t=this._context[e];return this._context[e]=null,t}}}]),e}(),l=new u;t.misago=l,n["default"]=l}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./utils/ordered-list":144}],122:[function(e,t,n){"use strict";function a(e){return{type:l,patch:e}}function r(e){return{type:c,user:e}}function o(){var e=arguments.length<=0||void 0===arguments[0]?!1:arguments[0];return{type:f,soft:e}}function s(){var e=arguments.length<=0||void 0===arguments[0]?u:arguments[0],t=arguments.length<=1||void 0===arguments[1]?null:arguments[1];switch(t.type){case l:var n=Object.assign({},e);return n.user=Object.assign({},e.user,t.patch),n;case c:return Object.assign({},e,{signedIn:t.user});case f:return Object.assign({},e,{isAuthenticated:!1,isAnonymous:!0,signedOut:!t.soft});case i.UPDATE_AVATAR:if(e.isAuthenticated&&e.user.id===t.userId){var a=Object.assign({},e);return a.user=Object.assign({},e.user,{avatar_hash:t.avatarHash}),a}return e;case i.UPDATE_USERNAME:if(e.isAuthenticated&&e.user.id===t.userId){var r=Object.assign({},e);return r.user=Object.assign({},e.user,{username:t.username,slug:t.slug}),r}return e;default:return e}}Object.defineProperty(n,"__esModule",{value:!0}),n.SIGN_OUT=n.SIGN_IN=n.PATCH_USER=n.initialState=void 0,n.patchUser=a,n.signIn=r,n.signOut=o,n["default"]=s;var i=e("./users"),u=n.initialState={signedIn:!1,signedOut:!1},l=n.PATCH_USER="PATCH_USER",c=n.SIGN_IN="SIGN_IN",f=n.SIGN_OUT="SIGN_OUT"},{"./users":127}],123:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e){return{type:c,profile:e}}function o(e){return{type:f,patch:e}}function s(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],t=arguments.length<=1||void 0===arguments[1]?null:arguments[1];switch(t.type){case c:return Object.assign({},t.profile,{joined_on:(0,u["default"])(t.profile.joined_on),status:(0,l.dehydrateStatus)(t.profile.status)});case f:return Object.assign({},e,t.patch);case l.UPDATE_AVATAR:return e.id===t.userId?Object.assign({},e,{avatar_hash:t.avatarHash}):e;case l.UPDATE_USERNAME:return e.id===t.userId?Object.assign({},e,{username:t.username,slug:t.slug}):e;default:return e}}Object.defineProperty(n,"__esModule",{value:!0}),n.PATCH_PROFILE=n.DEHYDRATE_PROFILE=void 0,n.dehydrate=r,n.patchProfile=o,n["default"]=s;var i=e("moment"),u=a(i),l=e("./users"),c=n.DEHYDRATE_PROFILE="DEHYDRATE_PROFILE",f=n.PATCH_PROFILE="PATCH_PROFILE"},{"./users":127,moment:"moment"}],124:[function(e,t,n){"use strict";function a(e,t){return{type:i,message:e,messageType:t}}function r(){return{type:u}}function o(){var e=arguments.length<=0||void 0===arguments[0]?s:arguments[0],t=arguments.length<=1||void 0===arguments[1]?null:arguments[1];return t.type===i?{type:t.messageType,message:t.message,isVisible:!0}:t.type===u?Object.assign({},e,{isVisible:!1}):e}Object.defineProperty(n,"__esModule",{value:!0}),n.showSnackbar=a,n.hideSnackbar=r,n["default"]=o;var s=n.initialState={type:"info",message:"",isVisible:!1},i=n.SHOW_SNACKBAR="SHOW_SNACKBAR",u=n.HIDE_SNACKBAR="HIDE_SNACKBAR"},{}],125:[function(e,t,n){"use strict";function a(){return{type:s}}function r(){var e=arguments.length<=0||void 0===arguments[0]?o:arguments[0],t=arguments.length<=1||void 0===arguments[1]?null:arguments[1];return t.type===s?Object.assign({},e,{tick:e.tick+1}):e}Object.defineProperty(n,"__esModule",{value:!0}),n.doTick=a,n["default"]=r;var o=n.initialState={tick:0},s=n.TICK="TICK"},{}],126:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t,n){return{type:f,change:e,user:t,changedBy:n}}function o(e){return{type:d,items:e}}function s(e){return{type:p,items:e}}function i(){var e=arguments.length<=0||void 0===arguments[0]?[]:arguments[0],t=arguments.length<=1||void 0===arguments[1]?null:arguments[1];switch(t.type){case f:var n=e.slice();return n.unshift({id:Math.floor(Date.now()/1e3),changed_by:t.changedBy,changed_by_username:t.changedBy.username,changed_on:(0,c["default"])(),new_username:t.change.username,old_username:t.user.username}),n;case d:return e.concat(t.items.map(function(e){return Object.assign({},e,{changed_on:(0,c["default"])(e.changed_on)})}));case p:return t.items.map(function(e){return Object.assign({},e,{changed_on:(0,c["default"])(e.changed_on)})});case u.UPDATE_AVATAR:return e.map(function(e){return e=Object.assign({},e),e.changed_by&&e.changed_by.id===t.userId&&(e.changed_by=Object.assign({},e.changed_by,{avatar_hash:t.avatarHash})),e});case u.UPDATE_USERNAME:return e.map(function(e){return e=Object.assign({},e),e.changed_by&&e.changed_by.id===t.userId&&(e.changed_by=Object.assign({},e.changed_by,{username:t.username,slug:t.slug})),Object.assign({},e)});default:return e}}Object.defineProperty(n,"__esModule",{value:!0}),n.DEHYDRATE_HISTORY=n.APPEND_HISTORY=n.ADD_NAME_CHANGE=void 0,n.addNameChange=r,n.append=o,n.dehydrate=s,n["default"]=i;var u=e("./users"),l=e("moment"),c=a(l),f=n.ADD_NAME_CHANGE="ADD_NAME_CHANGE",d=n.APPEND_HISTORY="APPEND_HISTORY",p=n.DEHYDRATE_HISTORY="DEHYDRATE_HISTORY"},{"./users":127,moment:"moment"}],127:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e){return{type:d,items:e}}function o(e){return{type:p,items:e}}function s(e){return e?Object.assign({},e,{last_click:e.last_click?(0,f["default"])(e.last_click):null,banned_until:e.banned_until?(0,f["default"])(e.banned_until):null}):null}function i(e,t){return{type:m,userId:e.id,avatarHash:t}}function u(e,t,n){return{type:h,userId:e.id,username:t,slug:n}}function l(){var e=arguments.length<=0||void 0===arguments[0]?[]:arguments[0],t=arguments.length<=1||void 0===arguments[1]?null:arguments[1];switch(t.type){case d:return e.concat(t.items.map(function(e){return Object.assign({},e,{joined_on:(0,f["default"])(e.joined_on),status:s(e.status)})}));case p:return t.items.map(function(e){return Object.assign({},e,{joined_on:(0,f["default"])(e.joined_on),status:s(e.status)})});case m:return e.map(function(e){return e=Object.assign({},e),e.id===t.userId&&(e.avatar_hash=t.avatarHash),e});default:return e}}Object.defineProperty(n,"__esModule",{value:!0}),n.UPDATE_USERNAME=n.UPDATE_AVATAR=n.DEHYDRATE_USERS=n.APPEND_USERS=void 0,n.append=r,n.dehydrate=o,n.dehydrateStatus=s,n.updateAvatar=i,n.updateUsername=u,n["default"]=l;var c=e("moment"),f=a(c),d=n.APPEND_USERS="APPEND_USERS",p=n.DEHYDRATE_USERS="DEHYDRATE_USERS",m=n.UPDATE_AVATAR="UPDATE_AVATAR",h=n.UPDATE_USERNAME="UPDATE_USERNAME"},{moment:"moment"}],128:[function(e,t,n){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},o=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var s=n.Ajax=function(){function e(){a(this,e),this._cookieName=null,this._csrfToken=null,this._locks={}}return o(e,[{key:"init",value:function(e){this._cookieName=e,this._csrfToken=this.getCsrfToken()}},{key:"getCsrfToken",value:function(){if(-1!==document.cookie.indexOf(this._cookieName)){var e=new RegExp(this._cookieName+"=([^;]*)"),t=document.cookie.match(e)[0];return t?t.split("=")[1]:null}return null}},{key:"request",value:function(e,t,n){var a=this;return new Promise(function(r,o){var s={url:t,method:e,headers:{"X-CSRFToken":a._csrfToken},data:n?JSON.stringify(n):null,contentType:"application/json; charset=utf-8",dataType:"json",success:function(e){r(e)},error:function(e){var t=e.responseJSON||{};t.status=e.status,0===t.status&&(t.detail=gettext("Lost connection with application.")),404===t.status&&(t.detail&&"NOT FOUND"!==t.detail||(t.detail=gettext("Action link is invalid."))),500!==t.status||t.detail||(t.detail=gettext("Unknown error has occured.")),t.statusText=e.statusText,o(t)}};$.ajax(s)})}},{key:"get",value:function(e,t,n){var a=this;if(t&&(e+="?"+$.param(t)),!n)return this.request("GET",e);var o=function(){var t=a;return a._locks[n]&&(a._locks[n].url=e),a._locks[n]&&a._locks[n].waiter?{v:{then:function(){}}}:a._locks[n]&&a._locks[n].wait?(a._locks[n].waiter=!0,{v:new Promise(function(a,r){var o=function s(e){t._locks[n].wait?window.setTimeout(function(){s(e)},300):t._locks[n].url!==e?s(t._locks[n].url):(t._locks[n].waiter=!1,t.request("GET",t._locks[n].url).then(function(r){t._locks[n].url===e?a(r):(t._locks[n].waiter=!0,s(t._locks[n].url))},function(a){t._locks[n].url===e?r(a):(t._locks[n].waiter=!0,s(t._locks[n].url))}))};window.setTimeout(function(){o(e)},300)})}):(a._locks[n]={url:e,wait:!0,waiter:!1},{v:new Promise(function(a,r){t.request("GET",e).then(function(r){t._locks[n].wait=!1,t._locks[n].url===e&&a(r)},function(a){t._locks[n].wait=!1,t._locks[n].url===e&&r(a)})})})}();return"object"===("undefined"==typeof o?"undefined":r(o))?o.v:void 0}},{key:"post",value:function(e,t){return this.request("POST",e,t)}},{key:"patch",value:function(e,t){return this.request("PATCH",e,t)}},{key:"put",value:function(e,t){return this.request("PUT",e,t)}},{key:"delete",value:function(e){return this.request("DELETE",e)}},{key:"upload",value:function(e,t,n){var a=this;return new Promise(function(r,o){var s={url:e,method:"POST",headers:{"X-CSRFToken":a._csrfToken},data:t,contentType:!1,processData:!1,xhr:function i(){var i=new window.XMLHttpRequest;return i.upload.addEventListener("progress",function(e){e.lengthComputable&&n(Math.round(e.loaded/e.total*100))},!1),i},success:function(e){r(e)},error:function(e){var t=e.responseJSON||{};t.status=e.status,0===t.status&&(t.detail=gettext("Lost connection with application.")),404===t.status&&(t.detail&&"NOT FOUND"!==t.detail||(t.detail=gettext("Action link is invalid."))),500!==t.status||t.detail||(t.detail=gettext("Unknown error has occured.")),t.statusText=e.statusText,o(t)}};$.ajax(s)})}}]),e}();n["default"]=new s},{}],129:[function(e,t,n){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.Auth=void 0;var o=e("../reducers/auth"),s=n.Auth=function(){function e(){a(this,e)}return r(e,[{key:"init",value:function(e,t,n){this._store=e,this._local=t,this._modal=n,this.syncSession(),this.watchState()}},{key:"syncSession",value:function(){var e=this._store.getState().auth;e.isAuthenticated?this._local.set("auth",{isAuthenticated:!0,username:e.user.username}):this._local.set("auth",{isAuthenticated:!1})}},{key:"watchState",value:function(){var e=this;this._local.watch("auth",function(t){t.isAuthenticated?e._store.dispatch((0,o.signIn)({username:t.username})):e._store.dispatch((0,o.signOut)())}),this._modal.hide()}},{key:"signIn",value:function(e){this._store.dispatch((0,o.signIn)(e)),this._local.set("auth",{isAuthenticated:!0,username:e.username}),this._modal.hide()}},{key:"signOut",value:function(){this._store.dispatch((0,o.signOut)()),this._local.set("auth",{isAuthenticated:!1}),this._modal.hide()}},{key:"softSignOut",value:function(){this._store.dispatch((0,o.signOut)(!0)),this._local.set("auth",{isAuthenticated:!1}),this._modal.hide()}}]),e}();n["default"]=new s},{"../reducers/auth":122}],130:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.Captcha=n.ReCaptcha=n.ReCaptchaComponent=n.QACaptcha=n.NoCaptcha=n.BaseCaptcha=void 0;var u=e("react"),l=a(u),c=e("../components/form-group"),f=a(c),d=n.BaseCaptcha=function(){function e(){s(this,e)}return i(e,[{key:"init",value:function(e,t,n,a){this._context=e,this._ajax=t,this._include=n,this._snackbar=a}}]),e}(),p=n.NoCaptcha=function(e){function t(){return s(this,t),r(this,Object.getPrototypeOf(t).apply(this,arguments))}return o(t,e),i(t,[{key:"load",value:function(){return new Promise(function(e){e()})}},{key:"validator",value:function(){return null}},{key:"component",value:function(){return null}}]),t}(d),m=n.QACaptcha=function(e){function t(){return s(this,t),r(this,Object.getPrototypeOf(t).apply(this,arguments))}return o(t,e),i(t,[{key:"load",value:function(){var e=this;return new Promise(function(t,n){e._ajax.get(e._context.get("CAPTCHA_API_URL")).then(function(n){e.question=n.question,e.helpText=n.help_text,t()},function(){e._snackbar.error(gettext("Failed to load CAPTCHA.")),n()})})}},{key:"validator",value:function(){return[]}},{key:"component",value:function(e){return l["default"].createElement(f["default"],{label:this.question,"for":"id_captcha",labelClass:e.labelClass||"col-sm-4",controlClass:e.controlClass||"col-sm-8",validation:e.form.state.errors.captcha,helpText:this.helpText||null},l["default"].createElement("input",{type:"text",id:"id_captcha",className:"form-control","aria-describedby":"id_captcha_status",disabled:e.form.state.isLoading,onChange:e.form.bindInput("captcha"),value:e.form.state.captcha}))}}]),t}(d),h=n.ReCaptchaComponent=function(e){function t(){return s(this,t),r(this,Object.getPrototypeOf(t).apply(this,arguments))}return o(t,e),i(t,[{key:"componentDidMount",value:function(){var e=this;grecaptcha.render("recaptcha",{sitekey:this.props.siteKey,callback:function(t){e.props.binding({target:{value:t}})}})}},{key:"render",value:function(){return l["default"].createElement("div",{id:"recaptcha"})}}]),t}(l["default"].Component),v=n.ReCaptcha=function(e){function t(){return s(this,t),r(this,Object.getPrototypeOf(t).apply(this,arguments))}return o(t,e),i(t,[{key:"load",value:function(){return this._include.include("https://www.google.com/recaptcha/api.js",!0),new Promise(function(e){var t=function n(){"undefined"==typeof grecaptcha?window.setTimeout(function(){n()},200):e()};t()})}},{key:"validator",value:function(){return[]}},{key:"component",value:function(e){return l["default"].createElement(f["default"],{label:gettext("Captcha"),"for":"id_captcha",labelClass:e.labelClass||"col-sm-4",controlClass:e.controlClass||"col-sm-8",validation:e.form.state.errors.captcha,helpText:gettext("Please solve the quick test.")},l["default"].createElement(h,{siteKey:this._context.get("SETTINGS").recaptcha_site_key,binding:e.form.bindInput("captcha")}))}}]),t}(d),g=n.Captcha=function(){function e(){s(this,e)}return i(e,[{key:"init",value:function(e,t,n,a){switch(e.get("SETTINGS").captcha_type){case"no":this._captcha=new p;break;case"qa":this._captcha=new m;break;case"re":this._captcha=new v}this._captcha.init(e,t,n,a)}},{key:"load",value:function(){return this._captcha.load()}},{key:"validator",value:function(){return this._captcha.validator()}},{key:"component",value:function(e){return this._captcha.component(e)}}]),e}();n["default"]=new g},{"../components/form-group":61,react:"react"}],131:[function(e,t,n){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var o=n.Include=function(){function e(){a(this,e)}return r(e,[{key:"init",value:function(e){this._staticUrl=e,this._included=[]}},{key:"include",value:function(e){var t=arguments.length<=1||void 0===arguments[1]?!1:arguments[1];-1===this._included.indexOf(e)&&(this._included.push(e),this._include(e,t))}},{key:"_include",value:function(e,t){$.ajax({url:(t?"":this._staticUrl)+e,cache:!0,dataType:"script"})}}]),e}();n["default"]=new o},{}],132:[function(e,t,n){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var o=window.localStorage,s=n.LocalStorage=function(){function e(){a(this,e)}return r(e,[{key:"init",value:function(e){var t=this;this._prefix=e,this._watchers=[],window.addEventListener("storage",function(e){var n=JSON.parse(e.newValue);t._watchers.forEach(function(t){t.key===e.key&&e.oldValue!==e.newValue&&t.callback(n)})})}},{key:"set",value:function(e,t){o.setItem(this._prefix+e,JSON.stringify(t))}},{key:"get",value:function(e){var t=o.getItem(this._prefix+e);return t?JSON.parse(t):null}},{key:"watch",value:function(e,t){this._watchers.push({key:this._prefix+e,callback:t})}}]),e}();n["default"]=new s},{}],133:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.MobileNavbarDropdown=void 0;var s=e("../utils/mount-component"),i=a(s),u=n.MobileNavbarDropdown=function(){function e(){r(this,e)}return o(e,[{key:"init",value:function(e){this._element=e,this._component=null}},{key:"show",value:function(e){this._component===e?this.hide():(this._component=e,(0,i["default"])(e,this._element.id),$(this._element).addClass("open"))}},{key:"showConnected",value:function(e,t){this._component===e?this.hide():(this._component=e,(0,i["default"])(t,this._element.id,!0),$(this._element).addClass("open"))}},{key:"hide",value:function(){$(this._element).removeClass("open"),this._component=null}}]),e}();n["default"]=new u},{"../utils/mount-component":143}],134:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.Modal=void 0;var s=e("react-dom"),i=a(s),u=e("../utils/mount-component"),l=a(u),c=n.Modal=function(){function e(){r(this,e)}return o(e,[{key:"init",value:function(e){var t=this;this._element=e,this._modal=$(e).modal({show:!1}),this._modal.on("hidden.bs.modal",function(){i["default"].unmountComponentAtNode(t._element)})}},{key:"show",value:function(e){(0,l["default"])(e,this._element.id),this._modal.modal("show")}},{key:"hide",value:function(){this._modal.modal("hide")}}]),e}();n["default"]=new c},{"../utils/mount-component":143,"react-dom":"react-dom"}],135:[function(e,t,n){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var o=n.PageTitle=function(){function e(){a(this,e)}return r(e,[{key:"init",value:function(e){this._forumName=e}},{key:"set",value:function(e){"string"==typeof e&&(e={title:e});var t=e.title;if(e.page){var n=interpolate(gettext("page: %(page)s"),{page:e.page},!0);t+=" ("+n+")"}e.parent&&(t+=" | "+e.parent),document.title=t+" | "+this._forumName}}]),e}();n["default"]=new o},{}],136:[function(e,t,n){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var o=n.Polls=function(){function e(){a(this,e)}return r(e,[{key:"init",value:function(e,t){this._ajax=e,this._snackbar=t,this._polls={}}},{key:"start",value:function(e){var t=this,n=function a(){t._polls[e.poll]=e,t._ajax.get(e.url,e.data||null).then(function(n){e.update(n),t._polls[e.poll].timeout=window.setTimeout(a,e.frequency)},function(n){
|
|
|
-e.error?e.error(n):t._snackbar.apiError(n)})};n()}},{key:"stop",value:function(e){this._polls[e]&&window.clearTimeout(this._polls[e].timeout)}}]),e}();n["default"]=new o},{}],137:[function(e,t,n){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.Snackbar=void 0;var o=e("../reducers/snackbar"),s=300,i=5e3,u=n.Snackbar=function(){function e(){a(this,e)}return r(e,[{key:"init",value:function(e){this._store=e,this._timeout=null}},{key:"alert",value:function(e,t){var n=this;this._timeout?(window.clearTimeout(this._timeout),this._store.dispatch((0,o.hideSnackbar)()),this._timeout=window.setTimeout(function(){n._timeout=null,n.alert(e,t)},s)):(this._store.dispatch((0,o.showSnackbar)(e,t)),this._timeout=window.setTimeout(function(){n._store.dispatch((0,o.hideSnackbar)()),n._timeout=null},i))}},{key:"info",value:function(e){this.alert(e,"info")}},{key:"success",value:function(e){this.alert(e,"success")}},{key:"warning",value:function(e){this.alert(e,"warning")}},{key:"error",value:function(e){this.alert(e,"error")}},{key:"apiError",value:function(e){var t=e.detail;t||(t=404===e.status?gettext("Action link is invalid."):gettext("Unknown error has occured.")),403===e.status&&"Permission denied"===t&&(t=gettext("You don't have permission to perform this action.")),this.error(t)}}]),e}();n["default"]=new u},{"../reducers/snackbar":124}],138:[function(e,t,n){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0}),n.StoreWrapper=void 0;var o=e("redux"),s=n.StoreWrapper=function(){function e(){a(this,e),this._store=null,this._reducers={},this._initialState={}}return r(e,[{key:"addReducer",value:function(e,t,n){this._reducers[e]=t,this._initialState[e]=n}},{key:"init",value:function(){this._store=(0,o.createStore)((0,o.combineReducers)(this._reducers),this._initialState)}},{key:"getStore",value:function(){return this._store}},{key:"getState",value:function(){return this._store.getState()}},{key:"dispatch",value:function(e){return this._store.dispatch(e)}}]),e}();n["default"]=new s},{redux:"redux"}],139:[function(e,t,n){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var o=n.Zxcvbn=function(){function e(){a(this,e)}return r(e,[{key:"init",value:function(e){this._include=e}},{key:"scorePassword",value:function(e,t){return zxcvbn(e,t).score}},{key:"load",value:function(){return"undefined"==typeof zxcvbn?(this._include.include("misago/js/zxcvbn.js"),this._loadingPromise()):this._loadedPromise()}},{key:"_loadingPromise",value:function(){return new Promise(function(e){var t=function n(){"undefined"==typeof zxcvbn?window.setTimeout(function(){n()},200):e()};t()})}},{key:"_loadedPromise",value:function(){return new Promise(function(e){e()})}}]),e}();n["default"]=new o},{}],140:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=function(e,t){if(l["default"].render(i["default"].createElement(c.Provider,{store:v["default"].getStore()},i["default"].createElement(b,{message:e.message,expires:e.expires_on?(0,o["default"])(e.expires_on):null})),document.getElementById("page-mount")),"undefined"==typeof t||t){var n=m["default"].get("SETTINGS").forum_name;document.title=gettext("You are banned")+" | "+n,window.history.pushState({},"",m["default"].get("BANNED_URL"))}};var r=e("moment"),o=a(r),s=e("react"),i=a(s),u=e("react-dom"),l=a(u),c=e("react-redux"),f=e("../components/banned-page"),d=a(f),p=e("../index"),m=a(p),h=e("../services/store"),v=a(h),g=function(e){return e.tick},b=(0,c.connect)(g)(d["default"])},{"../components/banned-page":54,"../index":121,"../services/store":138,moment:"moment",react:"react","react-dom":"react-dom","react-redux":"react-redux"}],141:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=function(e,t){var n=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],a=[],r=[];if(e.forEach(function(e){r.push(e),r.length===t&&(a.push(r),r=[])}),n!==!1&&r.length>0&&r.length<t)for(var o=r.length;t>o;o++)r.push(n);return r.length&&a.push(r),a}},{}],142:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=function(e){return e>1e9?Math.round(100*e/1e9)/100+" GB":e>1e6?Math.round(100*e/1e6)/100+" MB":e>1e3?Math.round(100*e/1e3)/100+" KB":Math.round(100*e)/100+" B"}},{}],143:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=function(e,t){var n=arguments.length<=2||void 0===arguments[2]?!0:arguments[2],a=document.getElementById(t),r=e.props?e:o["default"].createElement(e,null);a&&(n?i["default"].render(o["default"].createElement(u.Provider,{store:c["default"].getStore()},r),a):i["default"].render(r,a))};var r=e("react"),o=a(r),s=e("react-dom"),i=a(s),u=e("react-redux"),l=e("../services/store"),c=a(l)},{"../services/store":138,react:"react","react-dom":"react-dom","react-redux":"react-redux"}],144:[function(e,t,n){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,n,a){return n&&e(t.prototype,n),a&&e(t,a),t}}();Object.defineProperty(n,"__esModule",{value:!0});var o=function(){function e(t){a(this,e),this.isOrdered=!1,this._items=t||[]}return r(e,[{key:"add",value:function(e,t,n){this._items.push({key:e,item:t,after:n?n.after||null:null,before:n?n.before||null:null})}},{key:"get",value:function(e,t){for(var n=0;n<this._items.length;n++)if(this._items[n].key===e)return this._items[n].item;return t}},{key:"has",value:function(e){return void 0!==this.get(e)}},{key:"values",value:function t(){for(var t=[],e=0;e<this._items.length;e++)t.push(this._items[e].item);return t}},{key:"order",value:function(e){return this.isOrdered||(this._items=this._order(this._items),this.isOrdered=!0),e||"undefined"==typeof e?this.values():this._items}},{key:"orderedValues",value:function(){return this.order(!0)}},{key:"_order",value:function(e){function t(e){var t=-1;-1===r.indexOf(e.key)&&(e.after?(t=r.indexOf(e.after),-1!==t&&(t+=1)):e.before&&(t=r.indexOf(e.before)),-1!==t&&(a.splice(t,0,e),r.splice(t,0,e.key)))}var n=[];e.forEach(function(e){n.push(e.key)});var a=[],r=[];e.forEach(function(e){e.after||e.before||(a.push(e),r.push(e.key))}),e.forEach(function(e){"_end"===e.before&&(a.push(e),r.push(e.key))});for(var o=200;o>0&&n.length!==r.length;)o-=1,e.forEach(t);return a}}]),e}();n["default"]=o},{}],145:[function(e,t,n){"use strict";function a(e,t){return Math.floor(Math.random()*(t-e+1))+e}function r(e,t){for(var n=new Array(a(e,t)),r=0;r<n.length;r++)n[r]=r;return n}Object.defineProperty(n,"__esModule",{value:!0}),n["int"]=a,n.range=r},{}],146:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=function(){window.scrollTo(0,0)}},{}],147:[function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=function(e){var t={component:e.component,childRoutes:[{path:e.root,onEnter:function(t,n){n(null,e.paths[0].path)}}].concat(e.paths.map(function(e){return e}))};i["default"].render(o["default"].createElement(u.Provider,{store:p["default"].getStore()},o["default"].createElement(l.Router,{routes:t,history:h})),m)};var r=e("react"),o=a(r),s=e("react-dom"),i=a(s),u=e("react-redux"),l=e("react-router"),c=e("history/lib/createBrowserHistory"),f=a(c),d=e("../services/store"),p=a(d),m=document.getElementById("page-mount"),h=new f["default"]},{"../services/store":138,"history/lib/createBrowserHistory":42,react:"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router"}],148:[function(e,t,n){"use strict";function a(){return function(e){return 0===$.trim(e).length?gettext("This field is required."):void 0}}function r(e){return function(t){return f.test(t)?void 0:e||gettext("Enter a valid email address.")}}function o(e,t){return function(n){var a="",r=$.trim(n).length;return e>r?(a=t?t(e,r):ngettext("Ensure this value has at least %(limit_value)s character (it has %(show_value)s).","Ensure this value has at least %(limit_value)s characters (it has %(show_value)s).",e),interpolate(a,{limit_value:e,show_value:r},!0)):void 0}}function s(e,t){return function(n){var a="",r=$.trim(n).length;return r>e?(a=t?t(e,r):ngettext("Ensure this value has at most %(limit_value)s character (it has %(show_value)s).","Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).",e),interpolate(a,{limit_value:e,show_value:r},!0)):void 0}}function i(e){var t=function(e){return ngettext("Username must be at least %(limit_value)s character long.","Username must be at least %(limit_value)s characters long.",e)};return this.minLength(e.username_length_min,t)}function u(e){var t=function(e){return ngettext("Username cannot be longer than %(limit_value)s character.","Username cannot be longer than %(limit_value)s characters.",e)};return this.maxLength(e.username_length_max,t)}function l(){return function(e){return d.test($.trim(e))?void 0:gettext("Username can only contain latin alphabet letters and digits.")}}function c(e){var t=function(e){return ngettext("Valid password must be at least %(limit_value)s character long.","Valid password must be at least %(limit_value)s characters long.",e)};return this.minLength(e.password_length_min,t)}Object.defineProperty(n,"__esModule",{value:!0}),n.required=a,n.email=r,n.minLength=o,n.maxLength=s,n.usernameMinLength=i,n.usernameMaxLength=u,n.usernameContent=l,n.passwordMinLength=c;var f=/^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i,d=new RegExp("^[0-9a-z]+$","i")},{}]},{},[2,3,4,5,16,17,18,19,20,21,22,30,31,32,33,6,7,8,9,10,11,12,13,14,15,23,24,25,26,27,28,29]);
|
|
|
-//# sourceMappingURL=misago.js.map
|
|
|
+(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
|
|
+// shim for using process in browser
|
|
|
+
|
|
|
+var process = module.exports = {};
|
|
|
+var queue = [];
|
|
|
+var draining = false;
|
|
|
+var currentQueue;
|
|
|
+var queueIndex = -1;
|
|
|
+
|
|
|
+function cleanUpNextTick() {
|
|
|
+ draining = false;
|
|
|
+ if (currentQueue.length) {
|
|
|
+ queue = currentQueue.concat(queue);
|
|
|
+ } else {
|
|
|
+ queueIndex = -1;
|
|
|
+ }
|
|
|
+ if (queue.length) {
|
|
|
+ drainQueue();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function drainQueue() {
|
|
|
+ if (draining) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var timeout = setTimeout(cleanUpNextTick);
|
|
|
+ draining = true;
|
|
|
+
|
|
|
+ var len = queue.length;
|
|
|
+ while(len) {
|
|
|
+ currentQueue = queue;
|
|
|
+ queue = [];
|
|
|
+ while (++queueIndex < len) {
|
|
|
+ if (currentQueue) {
|
|
|
+ currentQueue[queueIndex].run();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ queueIndex = -1;
|
|
|
+ len = queue.length;
|
|
|
+ }
|
|
|
+ currentQueue = null;
|
|
|
+ draining = false;
|
|
|
+ clearTimeout(timeout);
|
|
|
+}
|
|
|
+
|
|
|
+process.nextTick = function (fun) {
|
|
|
+ var args = new Array(arguments.length - 1);
|
|
|
+ if (arguments.length > 1) {
|
|
|
+ for (var i = 1; i < arguments.length; i++) {
|
|
|
+ args[i - 1] = arguments[i];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ queue.push(new Item(fun, args));
|
|
|
+ if (queue.length === 1 && !draining) {
|
|
|
+ setTimeout(drainQueue, 0);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+// v8 likes predictible objects
|
|
|
+function Item(fun, array) {
|
|
|
+ this.fun = fun;
|
|
|
+ this.array = array;
|
|
|
+}
|
|
|
+Item.prototype.run = function () {
|
|
|
+ this.fun.apply(null, this.array);
|
|
|
+};
|
|
|
+process.title = 'browser';
|
|
|
+process.browser = true;
|
|
|
+process.env = {};
|
|
|
+process.argv = [];
|
|
|
+process.version = ''; // empty string to avoid regexp issues
|
|
|
+process.versions = {};
|
|
|
+
|
|
|
+function noop() {}
|
|
|
+
|
|
|
+process.on = noop;
|
|
|
+process.addListener = noop;
|
|
|
+process.once = noop;
|
|
|
+process.off = noop;
|
|
|
+process.removeListener = noop;
|
|
|
+process.removeAllListeners = noop;
|
|
|
+process.emit = noop;
|
|
|
+
|
|
|
+process.binding = function (name) {
|
|
|
+ throw new Error('process.binding is not supported');
|
|
|
+};
|
|
|
+
|
|
|
+process.cwd = function () { return '/' };
|
|
|
+process.chdir = function (dir) {
|
|
|
+ throw new Error('process.chdir is not supported');
|
|
|
+};
|
|
|
+process.umask = function() { return 0; };
|
|
|
+
|
|
|
+},{}],2:[function(require,module,exports){
|
|
|
+(function (global){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.Misago = undefined;
|
|
|
+
|
|
|
+var _orderedList = require('../../../misago/frontend/src/utils/ordered-list');
|
|
|
+
|
|
|
+var _orderedList2 = _interopRequireDefault(_orderedList);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+var Misago = exports.Misago = function () {
|
|
|
+ function Misago() {
|
|
|
+ _classCallCheck(this, Misago);
|
|
|
+
|
|
|
+ this._initializers = [];
|
|
|
+ this._context = {};
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(Misago, [{
|
|
|
+ key: 'addInitializer',
|
|
|
+ value: function addInitializer(initializer) {
|
|
|
+ this._initializers.push({
|
|
|
+ key: initializer.name,
|
|
|
+
|
|
|
+ item: initializer.initializer,
|
|
|
+
|
|
|
+ after: initializer.after,
|
|
|
+ before: initializer.before
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'init',
|
|
|
+ value: function init(context) {
|
|
|
+ var _this = this;
|
|
|
+
|
|
|
+ this._context = context;
|
|
|
+
|
|
|
+ var initOrder = new _orderedList2.default(this._initializers).orderedValues();
|
|
|
+ initOrder.forEach(function (initializer) {
|
|
|
+ initializer(_this);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // context accessors
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'has',
|
|
|
+ value: function has(key) {
|
|
|
+ return !!this._context[key];
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'get',
|
|
|
+ value: function get(key, fallback) {
|
|
|
+ if (this.has(key)) {
|
|
|
+ return this._context[key];
|
|
|
+ } else {
|
|
|
+ return fallback || undefined;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'pop',
|
|
|
+ value: function pop(key) {
|
|
|
+ if (this.has(key)) {
|
|
|
+ var value = this._context[key];
|
|
|
+ this._context[key] = null;
|
|
|
+ return value;
|
|
|
+ } else {
|
|
|
+ return undefined;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return Misago;
|
|
|
+}();
|
|
|
+
|
|
|
+// create singleton
|
|
|
+
|
|
|
+var misago = new Misago();
|
|
|
+
|
|
|
+// expose it globally
|
|
|
+global.misago = misago;
|
|
|
+
|
|
|
+// and export it for tests and stuff
|
|
|
+exports.default = misago;
|
|
|
+
|
|
|
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
+
|
|
|
+},{"../../../misago/frontend/src/utils/ordered-list":144}],3:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _ajax = require('../../../../misago/frontend/src/services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ _ajax2.default.init(_index2.default.get('CSRF_COOKIE_NAME'));
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'ajax',
|
|
|
+ initializer: initializer
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/ajax":128}],4:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _auth = require('../../../../misago/frontend/src/services/auth');
|
|
|
+
|
|
|
+var _auth2 = _interopRequireDefault(_auth);
|
|
|
+
|
|
|
+var _modal = require('../../../../misago/frontend/src/services/modal');
|
|
|
+
|
|
|
+var _modal2 = _interopRequireDefault(_modal);
|
|
|
+
|
|
|
+var _store = require('../../../../misago/frontend/src/services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+var _localStorage = require('../../../../misago/frontend/src/services/local-storage');
|
|
|
+
|
|
|
+var _localStorage2 = _interopRequireDefault(_localStorage);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ _auth2.default.init(_store2.default, _localStorage2.default, _modal2.default);
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'auth',
|
|
|
+ initializer: initializer,
|
|
|
+ after: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/auth":129,"../../../../misago/frontend/src/services/local-storage":132,"../../../../misago/frontend/src/services/modal":134,"../../../../misago/frontend/src/services/store":138}],5:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _ajax = require('../../../../misago/frontend/src/services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _captcha = require('../../../../misago/frontend/src/services/captcha');
|
|
|
+
|
|
|
+var _captcha2 = _interopRequireDefault(_captcha);
|
|
|
+
|
|
|
+var _include = require('../../../../misago/frontend/src/services/include');
|
|
|
+
|
|
|
+var _include2 = _interopRequireDefault(_include);
|
|
|
+
|
|
|
+var _snackbar = require('../../../../misago/frontend/src/services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer(context) {
|
|
|
+ _captcha2.default.init(context, _ajax2.default, _include2.default, _snackbar2.default);
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'captcha',
|
|
|
+ initializer: initializer
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/ajax":128,"../../../../misago/frontend/src/services/captcha":130,"../../../../misago/frontend/src/services/include":131,"../../../../misago/frontend/src/services/snackbar":137}],6:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _reactRedux = require('react-redux');
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _authMessage = require('../../../../../misago/frontend/src/components/auth-message');
|
|
|
+
|
|
|
+var _authMessage2 = _interopRequireDefault(_authMessage);
|
|
|
+
|
|
|
+var _mountComponent = require('../../../../../misago/frontend/src/utils/mount-component');
|
|
|
+
|
|
|
+var _mountComponent2 = _interopRequireDefault(_mountComponent);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ (0, _mountComponent2.default)((0, _reactRedux.connect)(_authMessage.select)(_authMessage2.default), 'auth-message-mount');
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'component:auth-message',
|
|
|
+ initializer: initializer,
|
|
|
+ after: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/components/auth-message":52,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143,"react-redux":"react-redux"}],7:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _bannedPage = require('../../../../../misago/frontend/src/utils/banned-page');
|
|
|
+
|
|
|
+var _bannedPage2 = _interopRequireDefault(_bannedPage);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer(context) {
|
|
|
+ if (context.has('BAN_MESSAGE')) {
|
|
|
+ (0, _bannedPage2.default)(context.get('BAN_MESSAGE'), false);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'component:baned-page',
|
|
|
+ initializer: initializer,
|
|
|
+ after: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/banned-page":140}],8:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _root = require('../../../../../misago/frontend/src/components/options/root');
|
|
|
+
|
|
|
+var _root2 = _interopRequireDefault(_root);
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _routedComponent = require('../../../../../misago/frontend/src/utils/routed-component');
|
|
|
+
|
|
|
+var _routedComponent2 = _interopRequireDefault(_routedComponent);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer(context) {
|
|
|
+ if (context.has('USER_OPTIONS')) {
|
|
|
+ (0, _routedComponent2.default)({
|
|
|
+ root: _index2.default.get('USERCP_URL'),
|
|
|
+ component: _root2.default,
|
|
|
+ paths: (0, _root.paths)()
|
|
|
+ });
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'component:options',
|
|
|
+ initializer: initializer,
|
|
|
+ after: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/components/options/root":73,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/routed-component":147}],9:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _reactRedux = require('react-redux');
|
|
|
+
|
|
|
+var _root = require('../../../../../misago/frontend/src/components/profile/root');
|
|
|
+
|
|
|
+var _root2 = _interopRequireDefault(_root);
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _routedComponent = require('../../../../../misago/frontend/src/utils/routed-component');
|
|
|
+
|
|
|
+var _routedComponent2 = _interopRequireDefault(_routedComponent);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer(context) {
|
|
|
+ if (context.has('PROFILE') && context.has('PROFILE_PAGES')) {
|
|
|
+ (0, _routedComponent2.default)({
|
|
|
+ root: _index2.default.get('PROFILE').absolute_url,
|
|
|
+ component: (0, _reactRedux.connect)(_root.select)(_root2.default),
|
|
|
+ paths: (0, _root.paths)()
|
|
|
+ });
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'component:profile',
|
|
|
+ initializer: initializer,
|
|
|
+ after: 'reducer:profile-dehydrate'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/components/profile/root":90,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/routed-component":147,"react-redux":"react-redux"}],10:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _requestActivationLink = require('../../../../../misago/frontend/src/components/request-activation-link');
|
|
|
+
|
|
|
+var _requestActivationLink2 = _interopRequireDefault(_requestActivationLink);
|
|
|
+
|
|
|
+var _mountComponent = require('../../../../../misago/frontend/src/utils/mount-component');
|
|
|
+
|
|
|
+var _mountComponent2 = _interopRequireDefault(_mountComponent);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ if (document.getElementById('request-activation-link-mount')) {
|
|
|
+ (0, _mountComponent2.default)(_requestActivationLink2.default, 'request-activation-link-mount', false);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'component:request-activation-link',
|
|
|
+ initializer: initializer,
|
|
|
+ after: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/components/request-activation-link":94,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143}],11:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _requestPasswordReset = require('../../../../../misago/frontend/src/components/request-password-reset');
|
|
|
+
|
|
|
+var _requestPasswordReset2 = _interopRequireDefault(_requestPasswordReset);
|
|
|
+
|
|
|
+var _mountComponent = require('../../../../../misago/frontend/src/utils/mount-component');
|
|
|
+
|
|
|
+var _mountComponent2 = _interopRequireDefault(_mountComponent);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ if (document.getElementById('request-password-reset-mount')) {
|
|
|
+ (0, _mountComponent2.default)(_requestPasswordReset2.default, 'request-password-reset-mount', false);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'component:request-password-reset',
|
|
|
+ initializer: initializer,
|
|
|
+ after: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/components/request-password-reset":95,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143}],12:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _resetPasswordForm = require('../../../../../misago/frontend/src/components/reset-password-form');
|
|
|
+
|
|
|
+var _resetPasswordForm2 = _interopRequireDefault(_resetPasswordForm);
|
|
|
+
|
|
|
+var _mountComponent = require('../../../../../misago/frontend/src/utils/mount-component');
|
|
|
+
|
|
|
+var _mountComponent2 = _interopRequireDefault(_mountComponent);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ if (document.getElementById('reset-password-form-mount')) {
|
|
|
+ (0, _mountComponent2.default)(_resetPasswordForm2.default, 'reset-password-form-mount', false);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'component:reset-password-form',
|
|
|
+ initializer: initializer,
|
|
|
+ after: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/components/reset-password-form":96,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143}],13:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _reactRedux = require('react-redux');
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _snackbar = require('../../../../../misago/frontend/src/components/snackbar');
|
|
|
+
|
|
|
+var _mountComponent = require('../../../../../misago/frontend/src/utils/mount-component');
|
|
|
+
|
|
|
+var _mountComponent2 = _interopRequireDefault(_mountComponent);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ (0, _mountComponent2.default)((0, _reactRedux.connect)(_snackbar.select)(_snackbar.Snackbar), 'snackbar-mount');
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'component:snackbar',
|
|
|
+ initializer: initializer,
|
|
|
+ after: 'snackbar'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/components/snackbar":100,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143,"react-redux":"react-redux"}],14:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _reactRedux = require('react-redux');
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _root = require('../../../../../misago/frontend/src/components/user-menu/root');
|
|
|
+
|
|
|
+var _mountComponent = require('../../../../../misago/frontend/src/utils/mount-component');
|
|
|
+
|
|
|
+var _mountComponent2 = _interopRequireDefault(_mountComponent);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ (0, _mountComponent2.default)((0, _reactRedux.connect)(_root.select)(_root.UserMenu), 'user-menu-mount');
|
|
|
+ (0, _mountComponent2.default)((0, _reactRedux.connect)(_root.select)(_root.CompactUserMenu), 'user-menu-compact-mount');
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'component:user-menu',
|
|
|
+ initializer: initializer,
|
|
|
+ after: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/components/user-menu/root":102,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/mount-component":143,"react-redux":"react-redux"}],15:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _root = require('../../../../../misago/frontend/src/components/users/root');
|
|
|
+
|
|
|
+var _root2 = _interopRequireDefault(_root);
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _routedComponent = require('../../../../../misago/frontend/src/utils/routed-component');
|
|
|
+
|
|
|
+var _routedComponent2 = _interopRequireDefault(_routedComponent);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer(context) {
|
|
|
+ if (context.has('USERS_LISTS')) {
|
|
|
+ (0, _routedComponent2.default)({
|
|
|
+ root: _index2.default.get('USERS_LIST_URL'),
|
|
|
+ component: _root2.default,
|
|
|
+ paths: (0, _root.paths)()
|
|
|
+ });
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'component:users',
|
|
|
+ initializer: initializer,
|
|
|
+ after: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/components/users/root":119,"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/utils/routed-component":147}],16:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _include = require('../../../../misago/frontend/src/services/include');
|
|
|
+
|
|
|
+var _include2 = _interopRequireDefault(_include);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer(context) {
|
|
|
+ _include2.default.init(context.get('STATIC_URL'));
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'include',
|
|
|
+ initializer: initializer
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/include":131}],17:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _localStorage = require('../../../../misago/frontend/src/services/local-storage');
|
|
|
+
|
|
|
+var _localStorage2 = _interopRequireDefault(_localStorage);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ _localStorage2.default.init('misago_');
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'local-storage',
|
|
|
+ initializer: initializer
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/local-storage":132}],18:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _mobileNavbarDropdown = require('../../../../misago/frontend/src/services/mobile-navbar-dropdown');
|
|
|
+
|
|
|
+var _mobileNavbarDropdown2 = _interopRequireDefault(_mobileNavbarDropdown);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ var element = document.getElementById('mobile-navbar-dropdown-mount');
|
|
|
+ if (element) {
|
|
|
+ _mobileNavbarDropdown2.default.init(element);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'dropdown',
|
|
|
+ initializer: initializer,
|
|
|
+ before: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/mobile-navbar-dropdown":133}],19:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _modal = require('../../../../misago/frontend/src/services/modal');
|
|
|
+
|
|
|
+var _modal2 = _interopRequireDefault(_modal);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ var element = document.getElementById('modal-mount');
|
|
|
+ if (element) {
|
|
|
+ _modal2.default.init(element);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'modal',
|
|
|
+ initializer: initializer,
|
|
|
+ before: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/modal":134}],20:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _moment = require('moment');
|
|
|
+
|
|
|
+var _moment2 = _interopRequireDefault(_moment);
|
|
|
+
|
|
|
+var _index = require('../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ _moment2.default.locale($('html').attr('lang'));
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'moment',
|
|
|
+ initializer: initializer
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../misago/frontend/src/index":121,"moment":"moment"}],21:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _pageTitle = require('../../../../misago/frontend/src/services/page-title');
|
|
|
+
|
|
|
+var _pageTitle2 = _interopRequireDefault(_pageTitle);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer(context) {
|
|
|
+ _pageTitle2.default.init(context.get('SETTINGS').forum_name);
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'page-title',
|
|
|
+ initializer: initializer
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/page-title":135}],22:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _ajax = require('../../../../misago/frontend/src/services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _snackbar = require('../../../../misago/frontend/src/services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _polls = require('../../../../misago/frontend/src/services/polls');
|
|
|
+
|
|
|
+var _polls2 = _interopRequireDefault(_polls);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ _polls2.default.init(_ajax2.default, _snackbar2.default);
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'polls',
|
|
|
+ initializer: initializer
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/ajax":128,"../../../../misago/frontend/src/services/polls":136,"../../../../misago/frontend/src/services/snackbar":137}],23:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _auth = require('../../../../../misago/frontend/src/reducers/auth');
|
|
|
+
|
|
|
+var _auth2 = _interopRequireDefault(_auth);
|
|
|
+
|
|
|
+var _store = require('../../../../../misago/frontend/src/services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer(context) {
|
|
|
+ _store2.default.addReducer('auth', _auth2.default, Object.assign({
|
|
|
+ 'isAuthenticated': context.get('isAuthenticated'),
|
|
|
+ 'isAnonymous': !context.get('isAuthenticated'),
|
|
|
+
|
|
|
+ 'user': context.get('user')
|
|
|
+ }, _auth.initialState));
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'reducer:auth',
|
|
|
+ initializer: initializer,
|
|
|
+ before: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/auth":122,"../../../../../misago/frontend/src/services/store":138}],24:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _profile = require('../../../../../misago/frontend/src/reducers/profile');
|
|
|
+
|
|
|
+var _store = require('../../../../../misago/frontend/src/services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ if (_index2.default.has('PROFILE')) {
|
|
|
+ _store2.default.dispatch((0, _profile.dehydrate)(_index2.default.get('PROFILE')));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'reducer:profile-dehydrate',
|
|
|
+ initializer: initializer,
|
|
|
+ after: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/profile":123,"../../../../../misago/frontend/src/services/store":138}],25:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _profile = require('../../../../../misago/frontend/src/reducers/profile');
|
|
|
+
|
|
|
+var _profile2 = _interopRequireDefault(_profile);
|
|
|
+
|
|
|
+var _store = require('../../../../../misago/frontend/src/services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ _store2.default.addReducer('profile', _profile2.default, {});
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'reducer:profile',
|
|
|
+ initializer: initializer,
|
|
|
+ before: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/profile":123,"../../../../../misago/frontend/src/services/store":138}],26:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _snackbar = require('../../../../../misago/frontend/src/reducers/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _store = require('../../../../../misago/frontend/src/services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ _store2.default.addReducer('snackbar', _snackbar2.default, _snackbar.initialState);
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'reducer:snackbar',
|
|
|
+ initializer: initializer,
|
|
|
+ before: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/snackbar":124,"../../../../../misago/frontend/src/services/store":138}],27:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _tick = require('../../../../../misago/frontend/src/reducers/tick');
|
|
|
+
|
|
|
+var _tick2 = _interopRequireDefault(_tick);
|
|
|
+
|
|
|
+var _store = require('../../../../../misago/frontend/src/services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ _store2.default.addReducer('tick', _tick2.default, _tick.initialState);
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'reducer:tick',
|
|
|
+ initializer: initializer,
|
|
|
+ before: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/tick":125,"../../../../../misago/frontend/src/services/store":138}],28:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _usernameHistory = require('../../../../../misago/frontend/src/reducers/username-history');
|
|
|
+
|
|
|
+var _usernameHistory2 = _interopRequireDefault(_usernameHistory);
|
|
|
+
|
|
|
+var _store = require('../../../../../misago/frontend/src/services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ _store2.default.addReducer('username-history', _usernameHistory2.default, []);
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'reducer:username-history',
|
|
|
+ initializer: initializer,
|
|
|
+ before: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/username-history":126,"../../../../../misago/frontend/src/services/store":138}],29:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _users = require('../../../../../misago/frontend/src/reducers/users');
|
|
|
+
|
|
|
+var _users2 = _interopRequireDefault(_users);
|
|
|
+
|
|
|
+var _store = require('../../../../../misago/frontend/src/services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ _store2.default.addReducer('users', _users2.default, []);
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'reducer:users',
|
|
|
+ initializer: initializer,
|
|
|
+ before: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../../misago/frontend/src/index":121,"../../../../../misago/frontend/src/reducers/users":127,"../../../../../misago/frontend/src/services/store":138}],30:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _snackbar = require('../../../../misago/frontend/src/services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _store = require('../../../../misago/frontend/src/services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ _snackbar2.default.init(_store2.default);
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'snackbar',
|
|
|
+ initializer: initializer,
|
|
|
+ after: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/snackbar":137,"../../../../misago/frontend/src/services/store":138}],31:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _store = require('../../../../misago/frontend/src/services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ _store2.default.init();
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'store',
|
|
|
+ initializer: initializer,
|
|
|
+ before: '_end'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/store":138}],32:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _tick = require('../../../../misago/frontend/src/reducers/tick');
|
|
|
+
|
|
|
+var _store = require('../../../../misago/frontend/src/services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+var TICK_PERIOD = 50 * 1000; //do the tick every 50s
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ window.setInterval(function () {
|
|
|
+ _store2.default.dispatch((0, _tick.doTick)());
|
|
|
+ }, TICK_PERIOD);
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'tick-start',
|
|
|
+ initializer: initializer,
|
|
|
+ after: 'store'
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/reducers/tick":125,"../../../../misago/frontend/src/services/store":138}],33:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.default = initializer;
|
|
|
+
|
|
|
+var _index = require('../../../../misago/frontend/src/index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _include = require('../../../../misago/frontend/src/services/include');
|
|
|
+
|
|
|
+var _include2 = _interopRequireDefault(_include);
|
|
|
+
|
|
|
+var _zxcvbn = require('../../../../misago/frontend/src/services/zxcvbn');
|
|
|
+
|
|
|
+var _zxcvbn2 = _interopRequireDefault(_zxcvbn);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function initializer() {
|
|
|
+ _zxcvbn2.default.init(_include2.default);
|
|
|
+}
|
|
|
+
|
|
|
+_index2.default.addInitializer({
|
|
|
+ name: 'zxcvbn',
|
|
|
+ initializer: initializer
|
|
|
+});
|
|
|
+
|
|
|
+},{"../../../../misago/frontend/src/index":121,"../../../../misago/frontend/src/services/include":131,"../../../../misago/frontend/src/services/zxcvbn":139}],34:[function(require,module,exports){
|
|
|
+var pSlice = Array.prototype.slice;
|
|
|
+var objectKeys = require('./lib/keys.js');
|
|
|
+var isArguments = require('./lib/is_arguments.js');
|
|
|
+
|
|
|
+var deepEqual = module.exports = function (actual, expected, opts) {
|
|
|
+ if (!opts) opts = {};
|
|
|
+ // 7.1. All identical values are equivalent, as determined by ===.
|
|
|
+ if (actual === expected) {
|
|
|
+ return true;
|
|
|
+
|
|
|
+ } else if (actual instanceof Date && expected instanceof Date) {
|
|
|
+ return actual.getTime() === expected.getTime();
|
|
|
+
|
|
|
+ // 7.3. Other pairs that do not both pass typeof value == 'object',
|
|
|
+ // equivalence is determined by ==.
|
|
|
+ } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') {
|
|
|
+ return opts.strict ? actual === expected : actual == expected;
|
|
|
+
|
|
|
+ // 7.4. For all other Object pairs, including Array objects, equivalence is
|
|
|
+ // determined by having the same number of owned properties (as verified
|
|
|
+ // with Object.prototype.hasOwnProperty.call), the same set of keys
|
|
|
+ // (although not necessarily the same order), equivalent values for every
|
|
|
+ // corresponding key, and an identical 'prototype' property. Note: this
|
|
|
+ // accounts for both named and indexed properties on Arrays.
|
|
|
+ } else {
|
|
|
+ return objEquiv(actual, expected, opts);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function isUndefinedOrNull(value) {
|
|
|
+ return value === null || value === undefined;
|
|
|
+}
|
|
|
+
|
|
|
+function isBuffer (x) {
|
|
|
+ if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false;
|
|
|
+ if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (x.length > 0 && typeof x[0] !== 'number') return false;
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+function objEquiv(a, b, opts) {
|
|
|
+ var i, key;
|
|
|
+ if (isUndefinedOrNull(a) || isUndefinedOrNull(b))
|
|
|
+ return false;
|
|
|
+ // an identical 'prototype' property.
|
|
|
+ if (a.prototype !== b.prototype) return false;
|
|
|
+ //~~~I've managed to break Object.keys through screwy arguments passing.
|
|
|
+ // Converting to array solves the problem.
|
|
|
+ if (isArguments(a)) {
|
|
|
+ if (!isArguments(b)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ a = pSlice.call(a);
|
|
|
+ b = pSlice.call(b);
|
|
|
+ return deepEqual(a, b, opts);
|
|
|
+ }
|
|
|
+ if (isBuffer(a)) {
|
|
|
+ if (!isBuffer(b)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (a.length !== b.length) return false;
|
|
|
+ for (i = 0; i < a.length; i++) {
|
|
|
+ if (a[i] !== b[i]) return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ var ka = objectKeys(a),
|
|
|
+ kb = objectKeys(b);
|
|
|
+ } catch (e) {//happens when one is a string literal and the other isn't
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ // having the same number of owned properties (keys incorporates
|
|
|
+ // hasOwnProperty)
|
|
|
+ if (ka.length != kb.length)
|
|
|
+ return false;
|
|
|
+ //the same set of keys (although not necessarily the same order),
|
|
|
+ ka.sort();
|
|
|
+ kb.sort();
|
|
|
+ //~~~cheap key test
|
|
|
+ for (i = ka.length - 1; i >= 0; i--) {
|
|
|
+ if (ka[i] != kb[i])
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ //equivalent values for every corresponding key, and
|
|
|
+ //~~~possibly expensive deep test
|
|
|
+ for (i = ka.length - 1; i >= 0; i--) {
|
|
|
+ key = ka[i];
|
|
|
+ if (!deepEqual(a[key], b[key], opts)) return false;
|
|
|
+ }
|
|
|
+ return typeof a === typeof b;
|
|
|
+}
|
|
|
+
|
|
|
+},{"./lib/is_arguments.js":35,"./lib/keys.js":36}],35:[function(require,module,exports){
|
|
|
+var supportsArgumentsClass = (function(){
|
|
|
+ return Object.prototype.toString.call(arguments)
|
|
|
+})() == '[object Arguments]';
|
|
|
+
|
|
|
+exports = module.exports = supportsArgumentsClass ? supported : unsupported;
|
|
|
+
|
|
|
+exports.supported = supported;
|
|
|
+function supported(object) {
|
|
|
+ return Object.prototype.toString.call(object) == '[object Arguments]';
|
|
|
+};
|
|
|
+
|
|
|
+exports.unsupported = unsupported;
|
|
|
+function unsupported(object){
|
|
|
+ return object &&
|
|
|
+ typeof object == 'object' &&
|
|
|
+ typeof object.length == 'number' &&
|
|
|
+ Object.prototype.hasOwnProperty.call(object, 'callee') &&
|
|
|
+ !Object.prototype.propertyIsEnumerable.call(object, 'callee') ||
|
|
|
+ false;
|
|
|
+};
|
|
|
+
|
|
|
+},{}],36:[function(require,module,exports){
|
|
|
+exports = module.exports = typeof Object.keys === 'function'
|
|
|
+ ? Object.keys : shim;
|
|
|
+
|
|
|
+exports.shim = shim;
|
|
|
+function shim (obj) {
|
|
|
+ var keys = [];
|
|
|
+ for (var key in obj) keys.push(key);
|
|
|
+ return keys;
|
|
|
+}
|
|
|
+
|
|
|
+},{}],37:[function(require,module,exports){
|
|
|
+/**
|
|
|
+ * Indicates that navigation was caused by a call to history.push.
|
|
|
+ */
|
|
|
+'use strict';
|
|
|
+
|
|
|
+exports.__esModule = true;
|
|
|
+var PUSH = 'PUSH';
|
|
|
+
|
|
|
+exports.PUSH = PUSH;
|
|
|
+/**
|
|
|
+ * Indicates that navigation was caused by a call to history.replace.
|
|
|
+ */
|
|
|
+var REPLACE = 'REPLACE';
|
|
|
+
|
|
|
+exports.REPLACE = REPLACE;
|
|
|
+/**
|
|
|
+ * Indicates that navigation was caused by some other action such
|
|
|
+ * as using a browser's back/forward buttons and/or manually manipulating
|
|
|
+ * the URL in a browser's location bar. This is the default.
|
|
|
+ *
|
|
|
+ * See https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onpopstate
|
|
|
+ * for more information.
|
|
|
+ */
|
|
|
+var POP = 'POP';
|
|
|
+
|
|
|
+exports.POP = POP;
|
|
|
+exports['default'] = {
|
|
|
+ PUSH: PUSH,
|
|
|
+ REPLACE: REPLACE,
|
|
|
+ POP: POP
|
|
|
+};
|
|
|
+},{}],38:[function(require,module,exports){
|
|
|
+"use strict";
|
|
|
+
|
|
|
+exports.__esModule = true;
|
|
|
+exports.loopAsync = loopAsync;
|
|
|
+
|
|
|
+function loopAsync(turns, work, callback) {
|
|
|
+ var currentTurn = 0;
|
|
|
+ var isDone = false;
|
|
|
+
|
|
|
+ function done() {
|
|
|
+ isDone = true;
|
|
|
+ callback.apply(this, arguments);
|
|
|
+ }
|
|
|
+
|
|
|
+ function next() {
|
|
|
+ if (isDone) return;
|
|
|
+
|
|
|
+ if (currentTurn < turns) {
|
|
|
+ work.call(this, currentTurn++, next, done);
|
|
|
+ } else {
|
|
|
+ done.apply(this, arguments);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ next();
|
|
|
+}
|
|
|
+},{}],39:[function(require,module,exports){
|
|
|
+(function (process){
|
|
|
+/*eslint-disable no-empty */
|
|
|
+'use strict';
|
|
|
+
|
|
|
+exports.__esModule = true;
|
|
|
+exports.saveState = saveState;
|
|
|
+exports.readState = readState;
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+var _warning = require('warning');
|
|
|
+
|
|
|
+var _warning2 = _interopRequireDefault(_warning);
|
|
|
+
|
|
|
+var KeyPrefix = '@@History/';
|
|
|
+var QuotaExceededError = 'QuotaExceededError';
|
|
|
+var SecurityError = 'SecurityError';
|
|
|
+
|
|
|
+function createKey(key) {
|
|
|
+ return KeyPrefix + key;
|
|
|
+}
|
|
|
+
|
|
|
+function saveState(key, state) {
|
|
|
+ try {
|
|
|
+ window.sessionStorage.setItem(createKey(key), JSON.stringify(state));
|
|
|
+ } catch (error) {
|
|
|
+ if (error.name === SecurityError) {
|
|
|
+ // Blocking cookies in Chrome/Firefox/Safari throws SecurityError on any
|
|
|
+ // attempt to access window.sessionStorage.
|
|
|
+ process.env.NODE_ENV !== 'production' ? _warning2['default'](false, '[history] Unable to save state; sessionStorage is not available due to security settings') : undefined;
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (error.name === QuotaExceededError && window.sessionStorage.length === 0) {
|
|
|
+ // Safari "private mode" throws QuotaExceededError.
|
|
|
+ process.env.NODE_ENV !== 'production' ? _warning2['default'](false, '[history] Unable to save state; sessionStorage is not available in Safari private mode') : undefined;
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function readState(key) {
|
|
|
+ var json = undefined;
|
|
|
+ try {
|
|
|
+ json = window.sessionStorage.getItem(createKey(key));
|
|
|
+ } catch (error) {
|
|
|
+ if (error.name === SecurityError) {
|
|
|
+ // Blocking cookies in Chrome/Firefox/Safari throws SecurityError on any
|
|
|
+ // attempt to access window.sessionStorage.
|
|
|
+ process.env.NODE_ENV !== 'production' ? _warning2['default'](false, '[history] Unable to read state; sessionStorage is not available due to security settings') : undefined;
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (json) {
|
|
|
+ try {
|
|
|
+ return JSON.parse(json);
|
|
|
+ } catch (error) {
|
|
|
+ // Ignore invalid JSON.
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+}
|
|
|
+}).call(this,require('_process'))
|
|
|
+
|
|
|
+},{"_process":1,"warning":51}],40:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+exports.__esModule = true;
|
|
|
+exports.addEventListener = addEventListener;
|
|
|
+exports.removeEventListener = removeEventListener;
|
|
|
+exports.getHashPath = getHashPath;
|
|
|
+exports.replaceHashPath = replaceHashPath;
|
|
|
+exports.getWindowPath = getWindowPath;
|
|
|
+exports.go = go;
|
|
|
+exports.getUserConfirmation = getUserConfirmation;
|
|
|
+exports.supportsHistory = supportsHistory;
|
|
|
+exports.supportsGoWithoutReloadUsingHash = supportsGoWithoutReloadUsingHash;
|
|
|
+
|
|
|
+function addEventListener(node, event, listener) {
|
|
|
+ if (node.addEventListener) {
|
|
|
+ node.addEventListener(event, listener, false);
|
|
|
+ } else {
|
|
|
+ node.attachEvent('on' + event, listener);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function removeEventListener(node, event, listener) {
|
|
|
+ if (node.removeEventListener) {
|
|
|
+ node.removeEventListener(event, listener, false);
|
|
|
+ } else {
|
|
|
+ node.detachEvent('on' + event, listener);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function getHashPath() {
|
|
|
+ // We can't use window.location.hash here because it's not
|
|
|
+ // consistent across browsers - Firefox will pre-decode it!
|
|
|
+ return window.location.href.split('#')[1] || '';
|
|
|
+}
|
|
|
+
|
|
|
+function replaceHashPath(path) {
|
|
|
+ window.location.replace(window.location.pathname + window.location.search + '#' + path);
|
|
|
+}
|
|
|
+
|
|
|
+function getWindowPath() {
|
|
|
+ return window.location.pathname + window.location.search + window.location.hash;
|
|
|
+}
|
|
|
+
|
|
|
+function go(n) {
|
|
|
+ if (n) window.history.go(n);
|
|
|
+}
|
|
|
+
|
|
|
+function getUserConfirmation(message, callback) {
|
|
|
+ callback(window.confirm(message));
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Returns true if the HTML5 history API is supported. Taken from Modernizr.
|
|
|
+ *
|
|
|
+ * https://github.com/Modernizr/Modernizr/blob/master/LICENSE
|
|
|
+ * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js
|
|
|
+ * changed to avoid false negatives for Windows Phones: https://github.com/rackt/react-router/issues/586
|
|
|
+ */
|
|
|
+
|
|
|
+function supportsHistory() {
|
|
|
+ var ua = navigator.userAgent;
|
|
|
+ if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ // FIXME: Work around our browser history not working correctly on Chrome
|
|
|
+ // iOS: https://github.com/rackt/react-router/issues/2565
|
|
|
+ if (ua.indexOf('CriOS') !== -1) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return window.history && 'pushState' in window.history;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Returns false if using go(n) with hash history causes a full page reload.
|
|
|
+ */
|
|
|
+
|
|
|
+function supportsGoWithoutReloadUsingHash() {
|
|
|
+ var ua = navigator.userAgent;
|
|
|
+ return ua.indexOf('Firefox') === -1;
|
|
|
+}
|
|
|
+},{}],41:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+exports.__esModule = true;
|
|
|
+var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
|
|
|
+exports.canUseDOM = canUseDOM;
|
|
|
+},{}],42:[function(require,module,exports){
|
|
|
+(function (process){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+exports.__esModule = true;
|
|
|
+
|
|
|
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+var _invariant = require('invariant');
|
|
|
+
|
|
|
+var _invariant2 = _interopRequireDefault(_invariant);
|
|
|
+
|
|
|
+var _Actions = require('./Actions');
|
|
|
+
|
|
|
+var _ExecutionEnvironment = require('./ExecutionEnvironment');
|
|
|
+
|
|
|
+var _DOMUtils = require('./DOMUtils');
|
|
|
+
|
|
|
+var _DOMStateStorage = require('./DOMStateStorage');
|
|
|
+
|
|
|
+var _createDOMHistory = require('./createDOMHistory');
|
|
|
+
|
|
|
+var _createDOMHistory2 = _interopRequireDefault(_createDOMHistory);
|
|
|
+
|
|
|
+var _parsePath = require('./parsePath');
|
|
|
+
|
|
|
+var _parsePath2 = _interopRequireDefault(_parsePath);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Creates and returns a history object that uses HTML5's history API
|
|
|
+ * (pushState, replaceState, and the popstate event) to manage history.
|
|
|
+ * This is the recommended method of managing history in browsers because
|
|
|
+ * it provides the cleanest URLs.
|
|
|
+ *
|
|
|
+ * Note: In browsers that do not support the HTML5 history API full
|
|
|
+ * page reloads will be used to preserve URLs.
|
|
|
+ */
|
|
|
+function createBrowserHistory() {
|
|
|
+ var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
|
|
|
+
|
|
|
+ !_ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? _invariant2['default'](false, 'Browser history needs a DOM') : _invariant2['default'](false) : undefined;
|
|
|
+
|
|
|
+ var forceRefresh = options.forceRefresh;
|
|
|
+
|
|
|
+ var isSupported = _DOMUtils.supportsHistory();
|
|
|
+ var useRefresh = !isSupported || forceRefresh;
|
|
|
+
|
|
|
+ function getCurrentLocation(historyState) {
|
|
|
+ historyState = historyState || window.history.state || {};
|
|
|
+
|
|
|
+ var path = _DOMUtils.getWindowPath();
|
|
|
+ var _historyState = historyState;
|
|
|
+ var key = _historyState.key;
|
|
|
+
|
|
|
+ var state = undefined;
|
|
|
+ if (key) {
|
|
|
+ state = _DOMStateStorage.readState(key);
|
|
|
+ } else {
|
|
|
+ state = null;
|
|
|
+ key = history.createKey();
|
|
|
+
|
|
|
+ if (isSupported) window.history.replaceState(_extends({}, historyState, { key: key }), null, path);
|
|
|
+ }
|
|
|
+
|
|
|
+ var location = _parsePath2['default'](path);
|
|
|
+
|
|
|
+ return history.createLocation(_extends({}, location, { state: state }), undefined, key);
|
|
|
+ }
|
|
|
+
|
|
|
+ function startPopStateListener(_ref) {
|
|
|
+ var transitionTo = _ref.transitionTo;
|
|
|
+
|
|
|
+ function popStateListener(event) {
|
|
|
+ if (event.state === undefined) return; // Ignore extraneous popstate events in WebKit.
|
|
|
+
|
|
|
+ transitionTo(getCurrentLocation(event.state));
|
|
|
+ }
|
|
|
+
|
|
|
+ _DOMUtils.addEventListener(window, 'popstate', popStateListener);
|
|
|
+
|
|
|
+ return function () {
|
|
|
+ _DOMUtils.removeEventListener(window, 'popstate', popStateListener);
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ function finishTransition(location) {
|
|
|
+ var basename = location.basename;
|
|
|
+ var pathname = location.pathname;
|
|
|
+ var search = location.search;
|
|
|
+ var hash = location.hash;
|
|
|
+ var state = location.state;
|
|
|
+ var action = location.action;
|
|
|
+ var key = location.key;
|
|
|
+
|
|
|
+ if (action === _Actions.POP) return; // Nothing to do.
|
|
|
+
|
|
|
+ _DOMStateStorage.saveState(key, state);
|
|
|
+
|
|
|
+ var path = (basename || '') + pathname + search + hash;
|
|
|
+ var historyState = {
|
|
|
+ key: key
|
|
|
+ };
|
|
|
+
|
|
|
+ if (action === _Actions.PUSH) {
|
|
|
+ if (useRefresh) {
|
|
|
+ window.location.href = path;
|
|
|
+ return false; // Prevent location update.
|
|
|
+ } else {
|
|
|
+ window.history.pushState(historyState, null, path);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // REPLACE
|
|
|
+ if (useRefresh) {
|
|
|
+ window.location.replace(path);
|
|
|
+ return false; // Prevent location update.
|
|
|
+ } else {
|
|
|
+ window.history.replaceState(historyState, null, path);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ var history = _createDOMHistory2['default'](_extends({}, options, {
|
|
|
+ getCurrentLocation: getCurrentLocation,
|
|
|
+ finishTransition: finishTransition,
|
|
|
+ saveState: _DOMStateStorage.saveState
|
|
|
+ }));
|
|
|
+
|
|
|
+ var listenerCount = 0,
|
|
|
+ stopPopStateListener = undefined;
|
|
|
+
|
|
|
+ function listenBefore(listener) {
|
|
|
+ if (++listenerCount === 1) stopPopStateListener = startPopStateListener(history);
|
|
|
+
|
|
|
+ var unlisten = history.listenBefore(listener);
|
|
|
+
|
|
|
+ return function () {
|
|
|
+ unlisten();
|
|
|
+
|
|
|
+ if (--listenerCount === 0) stopPopStateListener();
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ function listen(listener) {
|
|
|
+ if (++listenerCount === 1) stopPopStateListener = startPopStateListener(history);
|
|
|
+
|
|
|
+ var unlisten = history.listen(listener);
|
|
|
+
|
|
|
+ return function () {
|
|
|
+ unlisten();
|
|
|
+
|
|
|
+ if (--listenerCount === 0) stopPopStateListener();
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ // deprecated
|
|
|
+ function registerTransitionHook(hook) {
|
|
|
+ if (++listenerCount === 1) stopPopStateListener = startPopStateListener(history);
|
|
|
+
|
|
|
+ history.registerTransitionHook(hook);
|
|
|
+ }
|
|
|
+
|
|
|
+ // deprecated
|
|
|
+ function unregisterTransitionHook(hook) {
|
|
|
+ history.unregisterTransitionHook(hook);
|
|
|
+
|
|
|
+ if (--listenerCount === 0) stopPopStateListener();
|
|
|
+ }
|
|
|
+
|
|
|
+ return _extends({}, history, {
|
|
|
+ listenBefore: listenBefore,
|
|
|
+ listen: listen,
|
|
|
+ registerTransitionHook: registerTransitionHook,
|
|
|
+ unregisterTransitionHook: unregisterTransitionHook
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+exports['default'] = createBrowserHistory;
|
|
|
+module.exports = exports['default'];
|
|
|
+}).call(this,require('_process'))
|
|
|
+
|
|
|
+},{"./Actions":37,"./DOMStateStorage":39,"./DOMUtils":40,"./ExecutionEnvironment":41,"./createDOMHistory":43,"./parsePath":48,"_process":1,"invariant":50}],43:[function(require,module,exports){
|
|
|
+(function (process){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+exports.__esModule = true;
|
|
|
+
|
|
|
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+var _invariant = require('invariant');
|
|
|
+
|
|
|
+var _invariant2 = _interopRequireDefault(_invariant);
|
|
|
+
|
|
|
+var _ExecutionEnvironment = require('./ExecutionEnvironment');
|
|
|
+
|
|
|
+var _DOMUtils = require('./DOMUtils');
|
|
|
+
|
|
|
+var _createHistory = require('./createHistory');
|
|
|
+
|
|
|
+var _createHistory2 = _interopRequireDefault(_createHistory);
|
|
|
+
|
|
|
+function createDOMHistory(options) {
|
|
|
+ var history = _createHistory2['default'](_extends({
|
|
|
+ getUserConfirmation: _DOMUtils.getUserConfirmation
|
|
|
+ }, options, {
|
|
|
+ go: _DOMUtils.go
|
|
|
+ }));
|
|
|
+
|
|
|
+ function listen(listener) {
|
|
|
+ !_ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? _invariant2['default'](false, 'DOM history needs a DOM') : _invariant2['default'](false) : undefined;
|
|
|
+
|
|
|
+ return history.listen(listener);
|
|
|
+ }
|
|
|
+
|
|
|
+ return _extends({}, history, {
|
|
|
+ listen: listen
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+exports['default'] = createDOMHistory;
|
|
|
+module.exports = exports['default'];
|
|
|
+}).call(this,require('_process'))
|
|
|
+
|
|
|
+},{"./DOMUtils":40,"./ExecutionEnvironment":41,"./createHistory":44,"_process":1,"invariant":50}],44:[function(require,module,exports){
|
|
|
+//import warning from 'warning'
|
|
|
+'use strict';
|
|
|
+
|
|
|
+exports.__esModule = true;
|
|
|
+
|
|
|
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+var _deepEqual = require('deep-equal');
|
|
|
+
|
|
|
+var _deepEqual2 = _interopRequireDefault(_deepEqual);
|
|
|
+
|
|
|
+var _AsyncUtils = require('./AsyncUtils');
|
|
|
+
|
|
|
+var _Actions = require('./Actions');
|
|
|
+
|
|
|
+var _createLocation2 = require('./createLocation');
|
|
|
+
|
|
|
+var _createLocation3 = _interopRequireDefault(_createLocation2);
|
|
|
+
|
|
|
+var _runTransitionHook = require('./runTransitionHook');
|
|
|
+
|
|
|
+var _runTransitionHook2 = _interopRequireDefault(_runTransitionHook);
|
|
|
+
|
|
|
+var _parsePath = require('./parsePath');
|
|
|
+
|
|
|
+var _parsePath2 = _interopRequireDefault(_parsePath);
|
|
|
+
|
|
|
+var _deprecate = require('./deprecate');
|
|
|
+
|
|
|
+var _deprecate2 = _interopRequireDefault(_deprecate);
|
|
|
+
|
|
|
+function createRandomKey(length) {
|
|
|
+ return Math.random().toString(36).substr(2, length);
|
|
|
+}
|
|
|
+
|
|
|
+function locationsAreEqual(a, b) {
|
|
|
+ return a.pathname === b.pathname && a.search === b.search &&
|
|
|
+ //a.action === b.action && // Different action !== location change.
|
|
|
+ a.key === b.key && _deepEqual2['default'](a.state, b.state);
|
|
|
+}
|
|
|
+
|
|
|
+var DefaultKeyLength = 6;
|
|
|
+
|
|
|
+function createHistory() {
|
|
|
+ var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
|
|
|
+ var getCurrentLocation = options.getCurrentLocation;
|
|
|
+ var finishTransition = options.finishTransition;
|
|
|
+ var saveState = options.saveState;
|
|
|
+ var go = options.go;
|
|
|
+ var keyLength = options.keyLength;
|
|
|
+ var getUserConfirmation = options.getUserConfirmation;
|
|
|
+
|
|
|
+ if (typeof keyLength !== 'number') keyLength = DefaultKeyLength;
|
|
|
+
|
|
|
+ var transitionHooks = [];
|
|
|
+
|
|
|
+ function listenBefore(hook) {
|
|
|
+ transitionHooks.push(hook);
|
|
|
+
|
|
|
+ return function () {
|
|
|
+ transitionHooks = transitionHooks.filter(function (item) {
|
|
|
+ return item !== hook;
|
|
|
+ });
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ var allKeys = [];
|
|
|
+ var changeListeners = [];
|
|
|
+ var location = undefined;
|
|
|
+
|
|
|
+ function getCurrent() {
|
|
|
+ if (pendingLocation && pendingLocation.action === _Actions.POP) {
|
|
|
+ return allKeys.indexOf(pendingLocation.key);
|
|
|
+ } else if (location) {
|
|
|
+ return allKeys.indexOf(location.key);
|
|
|
+ } else {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function updateLocation(newLocation) {
|
|
|
+ var current = getCurrent();
|
|
|
+
|
|
|
+ location = newLocation;
|
|
|
+
|
|
|
+ if (location.action === _Actions.PUSH) {
|
|
|
+ allKeys = [].concat(allKeys.slice(0, current + 1), [location.key]);
|
|
|
+ } else if (location.action === _Actions.REPLACE) {
|
|
|
+ allKeys[current] = location.key;
|
|
|
+ }
|
|
|
+
|
|
|
+ changeListeners.forEach(function (listener) {
|
|
|
+ listener(location);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function listen(listener) {
|
|
|
+ changeListeners.push(listener);
|
|
|
+
|
|
|
+ if (location) {
|
|
|
+ listener(location);
|
|
|
+ } else {
|
|
|
+ var _location = getCurrentLocation();
|
|
|
+ allKeys = [_location.key];
|
|
|
+ updateLocation(_location);
|
|
|
+ }
|
|
|
+
|
|
|
+ return function () {
|
|
|
+ changeListeners = changeListeners.filter(function (item) {
|
|
|
+ return item !== listener;
|
|
|
+ });
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ function confirmTransitionTo(location, callback) {
|
|
|
+ _AsyncUtils.loopAsync(transitionHooks.length, function (index, next, done) {
|
|
|
+ _runTransitionHook2['default'](transitionHooks[index], location, function (result) {
|
|
|
+ if (result != null) {
|
|
|
+ done(result);
|
|
|
+ } else {
|
|
|
+ next();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }, function (message) {
|
|
|
+ if (getUserConfirmation && typeof message === 'string') {
|
|
|
+ getUserConfirmation(message, function (ok) {
|
|
|
+ callback(ok !== false);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ callback(message !== false);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ var pendingLocation = undefined;
|
|
|
+
|
|
|
+ function transitionTo(nextLocation) {
|
|
|
+ if (location && locationsAreEqual(location, nextLocation)) return; // Nothing to do.
|
|
|
+
|
|
|
+ pendingLocation = nextLocation;
|
|
|
+
|
|
|
+ confirmTransitionTo(nextLocation, function (ok) {
|
|
|
+ if (pendingLocation !== nextLocation) return; // Transition was interrupted.
|
|
|
+
|
|
|
+ if (ok) {
|
|
|
+ // treat PUSH to current path like REPLACE to be consistent with browsers
|
|
|
+ if (nextLocation.action === _Actions.PUSH) {
|
|
|
+ var prevPath = createPath(location);
|
|
|
+ var nextPath = createPath(nextLocation);
|
|
|
+
|
|
|
+ if (nextPath === prevPath) nextLocation.action = _Actions.REPLACE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (finishTransition(nextLocation) !== false) updateLocation(nextLocation);
|
|
|
+ } else if (location && nextLocation.action === _Actions.POP) {
|
|
|
+ var prevIndex = allKeys.indexOf(location.key);
|
|
|
+ var nextIndex = allKeys.indexOf(nextLocation.key);
|
|
|
+
|
|
|
+ if (prevIndex !== -1 && nextIndex !== -1) go(prevIndex - nextIndex); // Restore the URL.
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function push(location) {
|
|
|
+ transitionTo(createLocation(location, _Actions.PUSH, createKey()));
|
|
|
+ }
|
|
|
+
|
|
|
+ function replace(location) {
|
|
|
+ transitionTo(createLocation(location, _Actions.REPLACE, createKey()));
|
|
|
+ }
|
|
|
+
|
|
|
+ function goBack() {
|
|
|
+ go(-1);
|
|
|
+ }
|
|
|
+
|
|
|
+ function goForward() {
|
|
|
+ go(1);
|
|
|
+ }
|
|
|
+
|
|
|
+ function createKey() {
|
|
|
+ return createRandomKey(keyLength);
|
|
|
+ }
|
|
|
+
|
|
|
+ function createPath(location) {
|
|
|
+ if (location == null || typeof location === 'string') return location;
|
|
|
+
|
|
|
+ var pathname = location.pathname;
|
|
|
+ var search = location.search;
|
|
|
+ var hash = location.hash;
|
|
|
+
|
|
|
+ var result = pathname;
|
|
|
+
|
|
|
+ if (search) result += search;
|
|
|
+
|
|
|
+ if (hash) result += hash;
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ function createHref(location) {
|
|
|
+ return createPath(location);
|
|
|
+ }
|
|
|
+
|
|
|
+ function createLocation(location, action) {
|
|
|
+ var key = arguments.length <= 2 || arguments[2] === undefined ? createKey() : arguments[2];
|
|
|
+
|
|
|
+ if (typeof action === 'object') {
|
|
|
+ //warning(
|
|
|
+ // false,
|
|
|
+ // 'The state (2nd) argument to history.createLocation is deprecated; use a ' +
|
|
|
+ // 'location descriptor instead'
|
|
|
+ //)
|
|
|
+
|
|
|
+ if (typeof location === 'string') location = _parsePath2['default'](location);
|
|
|
+
|
|
|
+ location = _extends({}, location, { state: action });
|
|
|
+
|
|
|
+ action = key;
|
|
|
+ key = arguments[3] || createKey();
|
|
|
+ }
|
|
|
+
|
|
|
+ return _createLocation3['default'](location, action, key);
|
|
|
+ }
|
|
|
+
|
|
|
+ // deprecated
|
|
|
+ function setState(state) {
|
|
|
+ if (location) {
|
|
|
+ updateLocationState(location, state);
|
|
|
+ updateLocation(location);
|
|
|
+ } else {
|
|
|
+ updateLocationState(getCurrentLocation(), state);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function updateLocationState(location, state) {
|
|
|
+ location.state = _extends({}, location.state, state);
|
|
|
+ saveState(location.key, location.state);
|
|
|
+ }
|
|
|
+
|
|
|
+ // deprecated
|
|
|
+ function registerTransitionHook(hook) {
|
|
|
+ if (transitionHooks.indexOf(hook) === -1) transitionHooks.push(hook);
|
|
|
+ }
|
|
|
+
|
|
|
+ // deprecated
|
|
|
+ function unregisterTransitionHook(hook) {
|
|
|
+ transitionHooks = transitionHooks.filter(function (item) {
|
|
|
+ return item !== hook;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // deprecated
|
|
|
+ function pushState(state, path) {
|
|
|
+ if (typeof path === 'string') path = _parsePath2['default'](path);
|
|
|
+
|
|
|
+ push(_extends({ state: state }, path));
|
|
|
+ }
|
|
|
+
|
|
|
+ // deprecated
|
|
|
+ function replaceState(state, path) {
|
|
|
+ if (typeof path === 'string') path = _parsePath2['default'](path);
|
|
|
+
|
|
|
+ replace(_extends({ state: state }, path));
|
|
|
+ }
|
|
|
+
|
|
|
+ return {
|
|
|
+ listenBefore: listenBefore,
|
|
|
+ listen: listen,
|
|
|
+ transitionTo: transitionTo,
|
|
|
+ push: push,
|
|
|
+ replace: replace,
|
|
|
+ go: go,
|
|
|
+ goBack: goBack,
|
|
|
+ goForward: goForward,
|
|
|
+ createKey: createKey,
|
|
|
+ createPath: createPath,
|
|
|
+ createHref: createHref,
|
|
|
+ createLocation: createLocation,
|
|
|
+
|
|
|
+ setState: _deprecate2['default'](setState, 'setState is deprecated; use location.key to save state instead'),
|
|
|
+ registerTransitionHook: _deprecate2['default'](registerTransitionHook, 'registerTransitionHook is deprecated; use listenBefore instead'),
|
|
|
+ unregisterTransitionHook: _deprecate2['default'](unregisterTransitionHook, 'unregisterTransitionHook is deprecated; use the callback returned from listenBefore instead'),
|
|
|
+ pushState: _deprecate2['default'](pushState, 'pushState is deprecated; use push instead'),
|
|
|
+ replaceState: _deprecate2['default'](replaceState, 'replaceState is deprecated; use replace instead')
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+exports['default'] = createHistory;
|
|
|
+module.exports = exports['default'];
|
|
|
+},{"./Actions":37,"./AsyncUtils":38,"./createLocation":45,"./deprecate":46,"./parsePath":48,"./runTransitionHook":49,"deep-equal":34}],45:[function(require,module,exports){
|
|
|
+//import warning from 'warning'
|
|
|
+'use strict';
|
|
|
+
|
|
|
+exports.__esModule = true;
|
|
|
+
|
|
|
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+var _Actions = require('./Actions');
|
|
|
+
|
|
|
+var _parsePath = require('./parsePath');
|
|
|
+
|
|
|
+var _parsePath2 = _interopRequireDefault(_parsePath);
|
|
|
+
|
|
|
+function createLocation() {
|
|
|
+ var location = arguments.length <= 0 || arguments[0] === undefined ? '/' : arguments[0];
|
|
|
+ var action = arguments.length <= 1 || arguments[1] === undefined ? _Actions.POP : arguments[1];
|
|
|
+ var key = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];
|
|
|
+
|
|
|
+ var _fourthArg = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3];
|
|
|
+
|
|
|
+ if (typeof location === 'string') location = _parsePath2['default'](location);
|
|
|
+
|
|
|
+ if (typeof action === 'object') {
|
|
|
+ //warning(
|
|
|
+ // false,
|
|
|
+ // 'The state (2nd) argument to createLocation is deprecated; use a ' +
|
|
|
+ // 'location descriptor instead'
|
|
|
+ //)
|
|
|
+
|
|
|
+ location = _extends({}, location, { state: action });
|
|
|
+
|
|
|
+ action = key || _Actions.POP;
|
|
|
+ key = _fourthArg;
|
|
|
+ }
|
|
|
+
|
|
|
+ var pathname = location.pathname || '/';
|
|
|
+ var search = location.search || '';
|
|
|
+ var hash = location.hash || '';
|
|
|
+ var state = location.state || null;
|
|
|
+
|
|
|
+ return {
|
|
|
+ pathname: pathname,
|
|
|
+ search: search,
|
|
|
+ hash: hash,
|
|
|
+ state: state,
|
|
|
+ action: action,
|
|
|
+ key: key
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+exports['default'] = createLocation;
|
|
|
+module.exports = exports['default'];
|
|
|
+},{"./Actions":37,"./parsePath":48}],46:[function(require,module,exports){
|
|
|
+//import warning from 'warning'
|
|
|
+
|
|
|
+"use strict";
|
|
|
+
|
|
|
+exports.__esModule = true;
|
|
|
+function deprecate(fn) {
|
|
|
+ return fn;
|
|
|
+ //return function () {
|
|
|
+ // warning(false, '[history] ' + message)
|
|
|
+ // return fn.apply(this, arguments)
|
|
|
+ //}
|
|
|
+}
|
|
|
+
|
|
|
+exports["default"] = deprecate;
|
|
|
+module.exports = exports["default"];
|
|
|
+},{}],47:[function(require,module,exports){
|
|
|
+"use strict";
|
|
|
+
|
|
|
+exports.__esModule = true;
|
|
|
+function extractPath(string) {
|
|
|
+ var match = string.match(/^https?:\/\/[^\/]*/);
|
|
|
+
|
|
|
+ if (match == null) return string;
|
|
|
+
|
|
|
+ return string.substring(match[0].length);
|
|
|
+}
|
|
|
+
|
|
|
+exports["default"] = extractPath;
|
|
|
+module.exports = exports["default"];
|
|
|
+},{}],48:[function(require,module,exports){
|
|
|
+(function (process){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+exports.__esModule = true;
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+var _warning = require('warning');
|
|
|
+
|
|
|
+var _warning2 = _interopRequireDefault(_warning);
|
|
|
+
|
|
|
+var _extractPath = require('./extractPath');
|
|
|
+
|
|
|
+var _extractPath2 = _interopRequireDefault(_extractPath);
|
|
|
+
|
|
|
+function parsePath(path) {
|
|
|
+ var pathname = _extractPath2['default'](path);
|
|
|
+ var search = '';
|
|
|
+ var hash = '';
|
|
|
+
|
|
|
+ process.env.NODE_ENV !== 'production' ? _warning2['default'](path === pathname, 'A path must be pathname + search + hash only, not a fully qualified URL like "%s"', path) : undefined;
|
|
|
+
|
|
|
+ var hashIndex = pathname.indexOf('#');
|
|
|
+ if (hashIndex !== -1) {
|
|
|
+ hash = pathname.substring(hashIndex);
|
|
|
+ pathname = pathname.substring(0, hashIndex);
|
|
|
+ }
|
|
|
+
|
|
|
+ var searchIndex = pathname.indexOf('?');
|
|
|
+ if (searchIndex !== -1) {
|
|
|
+ search = pathname.substring(searchIndex);
|
|
|
+ pathname = pathname.substring(0, searchIndex);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pathname === '') pathname = '/';
|
|
|
+
|
|
|
+ return {
|
|
|
+ pathname: pathname,
|
|
|
+ search: search,
|
|
|
+ hash: hash
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+exports['default'] = parsePath;
|
|
|
+module.exports = exports['default'];
|
|
|
+}).call(this,require('_process'))
|
|
|
+
|
|
|
+},{"./extractPath":47,"_process":1,"warning":51}],49:[function(require,module,exports){
|
|
|
+(function (process){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+exports.__esModule = true;
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
+
|
|
|
+var _warning = require('warning');
|
|
|
+
|
|
|
+var _warning2 = _interopRequireDefault(_warning);
|
|
|
+
|
|
|
+function runTransitionHook(hook, location, callback) {
|
|
|
+ var result = hook(location, callback);
|
|
|
+
|
|
|
+ if (hook.length < 2) {
|
|
|
+ // Assume the hook runs synchronously and automatically
|
|
|
+ // call the callback with the return value.
|
|
|
+ callback(result);
|
|
|
+ } else {
|
|
|
+ process.env.NODE_ENV !== 'production' ? _warning2['default'](result === undefined, 'You should not "return" in a transition hook with a callback argument; call the callback instead') : undefined;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+exports['default'] = runTransitionHook;
|
|
|
+module.exports = exports['default'];
|
|
|
+}).call(this,require('_process'))
|
|
|
+
|
|
|
+},{"_process":1,"warning":51}],50:[function(require,module,exports){
|
|
|
+(function (process){
|
|
|
+/**
|
|
|
+ * Copyright 2013-2015, Facebook, Inc.
|
|
|
+ * All rights reserved.
|
|
|
+ *
|
|
|
+ * This source code is licensed under the BSD-style license found in the
|
|
|
+ * LICENSE file in the root directory of this source tree. An additional grant
|
|
|
+ * of patent rights can be found in the PATENTS file in the same directory.
|
|
|
+ */
|
|
|
+
|
|
|
+'use strict';
|
|
|
+
|
|
|
+/**
|
|
|
+ * Use invariant() to assert state which your program assumes to be true.
|
|
|
+ *
|
|
|
+ * Provide sprintf-style format (only %s is supported) and arguments
|
|
|
+ * to provide information about what broke and what you were
|
|
|
+ * expecting.
|
|
|
+ *
|
|
|
+ * The invariant message will be stripped in production, but the invariant
|
|
|
+ * will remain to ensure logic does not differ in production.
|
|
|
+ */
|
|
|
+
|
|
|
+var invariant = function(condition, format, a, b, c, d, e, f) {
|
|
|
+ if (process.env.NODE_ENV !== 'production') {
|
|
|
+ if (format === undefined) {
|
|
|
+ throw new Error('invariant requires an error message argument');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!condition) {
|
|
|
+ var error;
|
|
|
+ if (format === undefined) {
|
|
|
+ error = new Error(
|
|
|
+ 'Minified exception occurred; use the non-minified dev environment ' +
|
|
|
+ 'for the full error message and additional helpful warnings.'
|
|
|
+ );
|
|
|
+ } else {
|
|
|
+ var args = [a, b, c, d, e, f];
|
|
|
+ var argIndex = 0;
|
|
|
+ error = new Error(
|
|
|
+ format.replace(/%s/g, function() { return args[argIndex++]; })
|
|
|
+ );
|
|
|
+ error.name = 'Invariant Violation';
|
|
|
+ }
|
|
|
+
|
|
|
+ error.framesToPop = 1; // we don't care about invariant's own frame
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+module.exports = invariant;
|
|
|
+
|
|
|
+}).call(this,require('_process'))
|
|
|
+
|
|
|
+},{"_process":1}],51:[function(require,module,exports){
|
|
|
+(function (process){
|
|
|
+/**
|
|
|
+ * Copyright 2014-2015, Facebook, Inc.
|
|
|
+ * All rights reserved.
|
|
|
+ *
|
|
|
+ * This source code is licensed under the BSD-style license found in the
|
|
|
+ * LICENSE file in the root directory of this source tree. An additional grant
|
|
|
+ * of patent rights can be found in the PATENTS file in the same directory.
|
|
|
+ */
|
|
|
+
|
|
|
+'use strict';
|
|
|
+
|
|
|
+/**
|
|
|
+ * Similar to invariant but only logs a warning if the condition is not met.
|
|
|
+ * This can be used to log issues in development environments in critical
|
|
|
+ * paths. Removing the logging code for production environments will keep the
|
|
|
+ * same logic and follow the same code paths.
|
|
|
+ */
|
|
|
+
|
|
|
+var warning = function() {};
|
|
|
+
|
|
|
+if (process.env.NODE_ENV !== 'production') {
|
|
|
+ warning = function(condition, format, args) {
|
|
|
+ var len = arguments.length;
|
|
|
+ args = new Array(len > 2 ? len - 2 : 0);
|
|
|
+ for (var key = 2; key < len; key++) {
|
|
|
+ args[key - 2] = arguments[key];
|
|
|
+ }
|
|
|
+ if (format === undefined) {
|
|
|
+ throw new Error(
|
|
|
+ '`warning(condition, format, ...args)` requires a warning ' +
|
|
|
+ 'message argument'
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ if (format.length < 10 || (/^[s\W]*$/).test(format)) {
|
|
|
+ throw new Error(
|
|
|
+ 'The warning format should be able to uniquely identify this ' +
|
|
|
+ 'warning. Please, use a more descriptive format than: ' + format
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!condition) {
|
|
|
+ var argIndex = 0;
|
|
|
+ var message = 'Warning: ' +
|
|
|
+ format.replace(/%s/g, function() {
|
|
|
+ return args[argIndex++];
|
|
|
+ });
|
|
|
+ if (typeof console !== 'undefined') {
|
|
|
+ console.error(message);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ // This error was thrown as a convenience so that you can use this stack
|
|
|
+ // to find the callsite that caused this warning to fire.
|
|
|
+ throw new Error(message);
|
|
|
+ } catch(x) {}
|
|
|
+ }
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+module.exports = warning;
|
|
|
+
|
|
|
+}).call(this,require('_process'))
|
|
|
+
|
|
|
+},{"_process":1}],52:[function(require,module,exports){
|
|
|
+"use strict";
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.select = select;
|
|
|
+
|
|
|
+var _react = require("react");
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: "refresh",
|
|
|
+ value: function refresh() {
|
|
|
+ window.location.reload();
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "getMessage",
|
|
|
+ value: function getMessage() {
|
|
|
+ if (this.props.signedIn) {
|
|
|
+ return interpolate(gettext("You have signed in as %(username)s. Please refresh the page before continuing."), { username: this.props.signedIn.username }, true);
|
|
|
+ } else if (this.props.signedOut) {
|
|
|
+ return interpolate(gettext("%(username)s, you have been signed out. Please refresh the page before continuing."), { username: this.props.user.username }, true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "getClassName",
|
|
|
+ value: function getClassName() {
|
|
|
+ if (this.props.signedIn || this.props.signedOut) {
|
|
|
+ return "auth-message show";
|
|
|
+ } else {
|
|
|
+ return "auth-message";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "render",
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ "div",
|
|
|
+ { className: this.getClassName() },
|
|
|
+ _react2.default.createElement(
|
|
|
+ "div",
|
|
|
+ { className: "container" },
|
|
|
+ _react2.default.createElement(
|
|
|
+ "p",
|
|
|
+ { className: "lead" },
|
|
|
+ this.getMessage()
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ "p",
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ "button",
|
|
|
+ { type: "button", className: "btn btn-default",
|
|
|
+ onClick: this.refresh },
|
|
|
+ gettext("Reload page")
|
|
|
+ ),
|
|
|
+ " ",
|
|
|
+ _react2.default.createElement(
|
|
|
+ "span",
|
|
|
+ { className: "hidden-xs hidden-sm text-muted" },
|
|
|
+ gettext("or press F5 key.")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+function select(state) {
|
|
|
+ return {
|
|
|
+ user: state.auth.user,
|
|
|
+ signedIn: state.auth.signedIn,
|
|
|
+ signedOut: state.auth.signedOut
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+},{"react":"react"}],53:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+var BASE_URL = $('base').attr('href') + 'user-avatar/';
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getSrc',
|
|
|
+ value: function getSrc() {
|
|
|
+ var size = this.props.size || 100; // jshint ignore:line
|
|
|
+ var url = BASE_URL;
|
|
|
+
|
|
|
+ if (this.props.user && this.props.user.id) {
|
|
|
+ // just avatar hash, size and user id
|
|
|
+ url += this.props.user.avatar_hash + '/' + size + '/' + this.props.user.id + '.png';
|
|
|
+ } else {
|
|
|
+ // just append avatar size to file to produce no-avatar placeholder
|
|
|
+ url += size + '.png';
|
|
|
+ }
|
|
|
+
|
|
|
+ return url;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement('img', { src: this.getSrc(),
|
|
|
+ className: this.props.className || 'user-avatar',
|
|
|
+ title: gettext("User avatar") });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"react":"react"}],54:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _moment = require('moment');
|
|
|
+
|
|
|
+var _moment2 = _interopRequireDefault(_moment);
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getReasonMessage',
|
|
|
+ value: function getReasonMessage() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ if (this.props.message.html) {
|
|
|
+ return _react2.default.createElement('div', { className: 'lead', dangerouslySetInnerHTML: {
|
|
|
+ __html: this.props.message.html
|
|
|
+ } });
|
|
|
+ } else {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'lead' },
|
|
|
+ this.props.message.plain
|
|
|
+ );
|
|
|
+ }
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getExpirationMessage',
|
|
|
+ value: function getExpirationMessage() {
|
|
|
+ if (this.props.expires) {
|
|
|
+ if (this.props.expires.isAfter((0, _moment2.default)())) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ var title = interpolate(gettext("This ban expires on %(expires_on)s."), {
|
|
|
+ 'expires_on': this.props.expires.format('LL, LT')
|
|
|
+ }, true);
|
|
|
+
|
|
|
+ var message = interpolate(gettext("This ban expires %(expires_on)s."), {
|
|
|
+ 'expires_on': this.props.expires.fromNow()
|
|
|
+ }, true);
|
|
|
+
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'abbr',
|
|
|
+ { title: title },
|
|
|
+ message
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return gettext("This ban has expired.");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return gettext("This ban is permanent.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'page page-error page-error-banned' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'container' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-panel' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-icon' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'highlight_off'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-body' },
|
|
|
+ this.getReasonMessage(),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'message-footnote' },
|
|
|
+ this.getExpirationMessage()
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"moment":"moment","react":"react"}],55:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _loader = require('./loader');
|
|
|
+
|
|
|
+var _loader2 = _interopRequireDefault(_loader);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var Button = function (_React$Component) {
|
|
|
+ _inherits(Button, _React$Component);
|
|
|
+
|
|
|
+ function Button() {
|
|
|
+ _classCallCheck(this, Button);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(Button).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(Button, [{
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ var className = 'btn ' + this.props.className;
|
|
|
+ var disabled = this.props.disabled;
|
|
|
+
|
|
|
+ if (this.props.loading) {
|
|
|
+ className += ' btn-loading';
|
|
|
+ disabled = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: this.props.onClick ? 'button' : 'submit',
|
|
|
+ className: className,
|
|
|
+ disabled: disabled,
|
|
|
+ onClick: this.props.onClick },
|
|
|
+ this.props.children,
|
|
|
+ this.props.loading ? _react2.default.createElement(_loader2.default, null) : null
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return Button;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = Button;
|
|
|
+
|
|
|
+Button.defaultProps = {
|
|
|
+ className: "btn-default",
|
|
|
+
|
|
|
+ type: "submit",
|
|
|
+
|
|
|
+ loading: false,
|
|
|
+ disabled: false,
|
|
|
+
|
|
|
+ onClick: null
|
|
|
+};
|
|
|
+
|
|
|
+},{"./loader":64,"react":"react"}],56:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _avatar = require('../avatar');
|
|
|
+
|
|
|
+var _avatar2 = _interopRequireDefault(_avatar);
|
|
|
+
|
|
|
+var _button = require('../button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _ajax = require('../../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _snackbar = require('../../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var BASE_URL = $('base').attr('href') + 'user-avatar';
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.cropAvatar = function () {
|
|
|
+ if (_this.state.isLoading) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ _this.setState({
|
|
|
+ 'isLoading': true
|
|
|
+ });
|
|
|
+
|
|
|
+ var avatarType = _this.props.upload ? 'crop_tmp' : 'crop_org';
|
|
|
+ var cropit = $('.crop-form');
|
|
|
+
|
|
|
+ _ajax2.default.post(_this.props.user.api_url.avatar, {
|
|
|
+ 'avatar': avatarType,
|
|
|
+ 'crop': {
|
|
|
+ 'offset': cropit.cropit('offset'),
|
|
|
+ 'zoom': cropit.cropit('zoom')
|
|
|
+ }
|
|
|
+ }).then(function (data) {
|
|
|
+ _this.props.onComplete(data.avatar_hash, data.options);
|
|
|
+ _snackbar2.default.success(data.detail);
|
|
|
+ }, function (rejection) {
|
|
|
+ if (rejection.status === 400) {
|
|
|
+ _snackbar2.default.error(rejection.detail);
|
|
|
+ _this.setState({
|
|
|
+ 'isLoading': false
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ _this.props.showError(rejection);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ 'isLoading': false
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getAvatarSize',
|
|
|
+ value: function getAvatarSize() {
|
|
|
+ if (this.props.upload) {
|
|
|
+ return this.props.options.crop_tmp.size;
|
|
|
+ } else {
|
|
|
+ return this.props.options.crop_org.size;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getAvatarSecret',
|
|
|
+ value: function getAvatarSecret() {
|
|
|
+ if (this.props.upload) {
|
|
|
+ return this.props.options.crop_tmp.secret;
|
|
|
+ } else {
|
|
|
+ return this.props.options.crop_org.secret;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getAvatarHash',
|
|
|
+ value: function getAvatarHash() {
|
|
|
+ return this.props.upload || this.props.user.avatar_hash;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getImagePath',
|
|
|
+ value: function getImagePath() {
|
|
|
+ return [BASE_URL, this.getAvatarSecret() + ':' + this.getAvatarHash(), this.props.user.id + '.png'].join('/');
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'componentDidMount',
|
|
|
+ value: function componentDidMount() {
|
|
|
+ var _this2 = this;
|
|
|
+
|
|
|
+ var cropit = $('.crop-form');
|
|
|
+ cropit.width(this.getAvatarSize());
|
|
|
+
|
|
|
+ cropit.cropit({
|
|
|
+ 'width': this.getAvatarSize(),
|
|
|
+ 'height': this.getAvatarSize(),
|
|
|
+ 'imageState': {
|
|
|
+ 'src': this.getImagePath()
|
|
|
+ },
|
|
|
+ onImageLoaded: function onImageLoaded() {
|
|
|
+ if (_this2.props.upload) {
|
|
|
+ // center uploaded image
|
|
|
+ var zoomLevel = cropit.cropit('zoom');
|
|
|
+ var imageSize = cropit.cropit('imageSize');
|
|
|
+
|
|
|
+ // is it wider than taller?
|
|
|
+ if (imageSize.width > imageSize.height) {
|
|
|
+ var displayedWidth = imageSize.width * zoomLevel;
|
|
|
+ var offsetX = (displayedWidth - _this2.getAvatarSize()) / -2;
|
|
|
+
|
|
|
+ cropit.cropit('offset', {
|
|
|
+ 'x': offsetX,
|
|
|
+ 'y': 0
|
|
|
+ });
|
|
|
+ } else if (imageSize.width < imageSize.height) {
|
|
|
+ var displayedHeight = imageSize.height * zoomLevel;
|
|
|
+ var offsetY = (displayedHeight - _this2.getAvatarSize()) / -2;
|
|
|
+
|
|
|
+ cropit.cropit('offset', {
|
|
|
+ 'x': 0,
|
|
|
+ 'y': offsetY
|
|
|
+ });
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // use preserved crop
|
|
|
+ var crop = _this2.props.options.crop_org.crop;
|
|
|
+ if (crop) {
|
|
|
+ cropit.cropit('zoom', crop.zoom);
|
|
|
+ cropit.cropit('offset', {
|
|
|
+ 'x': crop.x,
|
|
|
+ 'y': crop.y
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'componentWillUnmount',
|
|
|
+ value: function componentWillUnmount() {
|
|
|
+ $('.crop-form').cropit('disable');
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-body modal-avatar-crop' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'crop-form' },
|
|
|
+ _react2.default.createElement('div', { className: 'cropit-image-preview' }),
|
|
|
+ _react2.default.createElement('input', { type: 'range', className: 'cropit-image-zoom-input' })
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-footer' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-md-6 col-md-offset-3' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { onClick: this.cropAvatar,
|
|
|
+ loading: this.state.isLoading,
|
|
|
+ className: 'btn-primary btn-block' },
|
|
|
+ this.props.upload ? gettext("Set avatar") : gettext("Crop image")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { onClick: this.props.showIndex,
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ className: 'btn-default btn-block' },
|
|
|
+ gettext("Cancel")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../services/ajax":128,"../../services/snackbar":137,"../avatar":53,"../button":55,"react":"react"}],57:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.Gallery = exports.GalleryItem = undefined;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _button = require('../button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _index = require('../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _ajax = require('../../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _snackbar = require('../../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _batch = require('../../utils/batch');
|
|
|
+
|
|
|
+var _batch2 = _interopRequireDefault(_batch);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var GalleryItem = exports.GalleryItem = function (_React$Component) {
|
|
|
+ _inherits(GalleryItem, _React$Component);
|
|
|
+
|
|
|
+ function GalleryItem() {
|
|
|
+ var _Object$getPrototypeO;
|
|
|
+
|
|
|
+ var _temp, _this, _ret;
|
|
|
+
|
|
|
+ _classCallCheck(this, GalleryItem);
|
|
|
+
|
|
|
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
+ args[_key] = arguments[_key];
|
|
|
+ }
|
|
|
+
|
|
|
+ return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_Object$getPrototypeO = Object.getPrototypeOf(GalleryItem)).call.apply(_Object$getPrototypeO, [this].concat(args))), _this), _this.select = function () {
|
|
|
+ _this.props.select(_this.props.image);
|
|
|
+ }, _temp), _possibleConstructorReturn(_this, _ret);
|
|
|
+ }
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ _createClass(GalleryItem, [{
|
|
|
+ key: 'getClassName',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function getClassName() {
|
|
|
+ if (this.props.selection === this.props.image) {
|
|
|
+ if (this.props.disabled) {
|
|
|
+ return 'btn btn-avatar btn-disabled avatar-selected';
|
|
|
+ } else {
|
|
|
+ return 'btn btn-avatar avatar-selected';
|
|
|
+ }
|
|
|
+ } else if (this.props.disabled) {
|
|
|
+ return 'btn btn-avatar btn-disabled';
|
|
|
+ } else {
|
|
|
+ return 'btn btn-avatar';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button',
|
|
|
+ className: this.getClassName(),
|
|
|
+ disabled: this.props.disabled,
|
|
|
+ onClick: this.select },
|
|
|
+ _react2.default.createElement('img', { src: _index2.default.get('MEDIA_URL') + this.props.image })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return GalleryItem;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var Gallery = exports.Gallery = function (_React$Component2) {
|
|
|
+ _inherits(Gallery, _React$Component2);
|
|
|
+
|
|
|
+ function Gallery() {
|
|
|
+ _classCallCheck(this, Gallery);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(Gallery).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(Gallery, [{
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ var _this3 = this;
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'avatars-gallery' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h3',
|
|
|
+ null,
|
|
|
+ this.props.name
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'avatars-gallery-images' },
|
|
|
+ (0, _batch2.default)(this.props.images, 4, null).map(function (row, i) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'row', key: i },
|
|
|
+ row.map(function (item, i) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-xs-3', key: i },
|
|
|
+ item ? _react2.default.createElement(GalleryItem, { image: item,
|
|
|
+ disabled: _this3.props.disabled,
|
|
|
+ select: _this3.props.select,
|
|
|
+ selection: _this3.props.selection }) : _react2.default.createElement('div', { className: 'blank-avatar' })
|
|
|
+ );
|
|
|
+ })
|
|
|
+ );
|
|
|
+ })
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return Gallery;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var _class = function (_React$Component3) {
|
|
|
+ _inherits(_class, _React$Component3);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this4 = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this4.select = function (image) {
|
|
|
+ _this4.setState({
|
|
|
+ selection: image
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ _this4.save = function () {
|
|
|
+ if (_this4.state.isLoading) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ _this4.setState({
|
|
|
+ 'isLoading': true
|
|
|
+ });
|
|
|
+
|
|
|
+ _ajax2.default.post(_this4.props.user.api_url.avatar, {
|
|
|
+ avatar: 'galleries',
|
|
|
+ image: _this4.state.selection
|
|
|
+ }).then(function (response) {
|
|
|
+ _this4.setState({
|
|
|
+ 'isLoading': false
|
|
|
+ });
|
|
|
+
|
|
|
+ _snackbar2.default.success(response.detail);
|
|
|
+ _this4.props.onComplete(response.avatar_hash, response.options);
|
|
|
+ }, function (rejection) {
|
|
|
+ if (rejection.status === 400) {
|
|
|
+ _snackbar2.default.error(rejection.detail);
|
|
|
+ _this4.setState({
|
|
|
+ 'isLoading': false
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ _this4.props.showError(rejection);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ _this4.state = {
|
|
|
+ 'selection': null,
|
|
|
+ 'isLoading': false
|
|
|
+ };
|
|
|
+ return _this4;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'render',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function render() {
|
|
|
+ var _this5 = this;
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-body modal-avatar-gallery' },
|
|
|
+ this.props.options.galleries.map(function (item, i) {
|
|
|
+ return _react2.default.createElement(Gallery, { name: item.name,
|
|
|
+ images: item.images,
|
|
|
+ selection: _this5.state.selection,
|
|
|
+ disabled: _this5.state.isLoading,
|
|
|
+ select: _this5.select,
|
|
|
+ key: i });
|
|
|
+ })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-footer' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'row' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-md-6 col-md-offset-3' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { onClick: this.save,
|
|
|
+ loading: this.state.isLoading,
|
|
|
+ disabled: !this.state.selection,
|
|
|
+ className: 'btn-primary btn-block' },
|
|
|
+ this.state.selection ? gettext("Save choice") : gettext("Select avatar")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { onClick: this.props.showIndex,
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ className: 'btn-default btn-block' },
|
|
|
+ gettext("Cancel")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../index":121,"../../services/ajax":128,"../../services/snackbar":137,"../../utils/batch":141,"../button":55,"react":"react"}],58:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _avatar = require('../avatar');
|
|
|
+
|
|
|
+var _avatar2 = _interopRequireDefault(_avatar);
|
|
|
+
|
|
|
+var _button = require('../button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _loader = require('../loader');
|
|
|
+
|
|
|
+var _loader2 = _interopRequireDefault(_loader);
|
|
|
+
|
|
|
+var _ajax = require('../../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _snackbar = require('../../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.setGravatar = function () {
|
|
|
+ _this.callApi('gravatar');
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.setGenerated = function () {
|
|
|
+ _this.callApi('generated');
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ 'isLoading': false
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'callApi',
|
|
|
+ value: function callApi(avatarType) {
|
|
|
+ var _this2 = this;
|
|
|
+
|
|
|
+ if (this.state.isLoading) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.setState({
|
|
|
+ 'isLoading': true
|
|
|
+ });
|
|
|
+
|
|
|
+ _ajax2.default.post(this.props.user.api_url.avatar, {
|
|
|
+ avatar: avatarType
|
|
|
+ }).then(function (response) {
|
|
|
+ _this2.setState({
|
|
|
+ 'isLoading': false
|
|
|
+ });
|
|
|
+
|
|
|
+ _snackbar2.default.success(response.detail);
|
|
|
+ _this2.props.onComplete(response.avatar_hash, response.options);
|
|
|
+ }, function (rejection) {
|
|
|
+ if (rejection.status === 400) {
|
|
|
+ _snackbar2.default.error(rejection.detail);
|
|
|
+ _this2.setState({
|
|
|
+ 'isLoading': false
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ _this2.props.showError(rejection);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'getGravatarButton',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function getGravatarButton() {
|
|
|
+ if (this.props.options.gravatar) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { onClick: this.setGravatar,
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ className: 'btn-default btn-block btn-avatar-gravatar' },
|
|
|
+ gettext("Download my Gravatar")
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getCropButton',
|
|
|
+ value: function getCropButton() {
|
|
|
+ if (this.props.options.crop_org) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { onClick: this.props.showCrop,
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ className: 'btn-default btn-block btn-avatar-crop' },
|
|
|
+ gettext("Re-crop uploaded image")
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getUploadButton',
|
|
|
+ value: function getUploadButton() {
|
|
|
+ if (this.props.options.upload) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { onClick: this.props.showUpload,
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ className: 'btn-default btn-block btn-avatar-upload' },
|
|
|
+ gettext("Upload new image")
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getGalleryButton',
|
|
|
+ value: function getGalleryButton() {
|
|
|
+ if (this.props.options.galleries) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { onClick: this.props.showGallery,
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ className: 'btn-default btn-block btn-avatar-gallery' },
|
|
|
+ gettext("Pick avatar from gallery")
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getAvatarPreview',
|
|
|
+ value: function getAvatarPreview() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ var userPeview = {
|
|
|
+ id: this.props.user.id,
|
|
|
+ avatar_hash: this.props.options.avatar_hash
|
|
|
+ };
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ if (this.state.isLoading) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'avatar-preview preview-loading' },
|
|
|
+ _react2.default.createElement(_avatar2.default, { user: userPeview, size: '200' }),
|
|
|
+ _react2.default.createElement(_loader2.default, null)
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'avatar-preview' },
|
|
|
+ _react2.default.createElement(_avatar2.default, { user: userPeview, size: '200' })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-body modal-avatar-index' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'row' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-md-5' },
|
|
|
+ this.getAvatarPreview()
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-md-7' },
|
|
|
+ this.getGravatarButton(),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { onClick: this.setGenerated,
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ className: 'btn-default btn-block btn-avatar-generate' },
|
|
|
+ gettext("Generate my individual avatar")
|
|
|
+ ),
|
|
|
+ this.getCropButton(),
|
|
|
+ this.getUploadButton(),
|
|
|
+ this.getGalleryButton()
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../services/ajax":128,"../../services/snackbar":137,"../avatar":53,"../button":55,"../loader":64,"react":"react"}],59:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.ChangeAvatarError = undefined;
|
|
|
+exports.select = select;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _index = require('./index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _crop = require('./crop');
|
|
|
+
|
|
|
+var _crop2 = _interopRequireDefault(_crop);
|
|
|
+
|
|
|
+var _upload = require('./upload');
|
|
|
+
|
|
|
+var _upload2 = _interopRequireDefault(_upload);
|
|
|
+
|
|
|
+var _gallery = require('./gallery');
|
|
|
+
|
|
|
+var _gallery2 = _interopRequireDefault(_gallery);
|
|
|
+
|
|
|
+var _modalLoader = require('../modal-loader');
|
|
|
+
|
|
|
+var _modalLoader2 = _interopRequireDefault(_modalLoader);
|
|
|
+
|
|
|
+var _users = require('../../reducers/users');
|
|
|
+
|
|
|
+var _ajax = require('../../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _store = require('../../services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var ChangeAvatarError = exports.ChangeAvatarError = function (_React$Component) {
|
|
|
+ _inherits(ChangeAvatarError, _React$Component);
|
|
|
+
|
|
|
+ function ChangeAvatarError() {
|
|
|
+ _classCallCheck(this, ChangeAvatarError);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(ChangeAvatarError).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(ChangeAvatarError, [{
|
|
|
+ key: 'getErrorReason',
|
|
|
+ value: function getErrorReason() {
|
|
|
+ if (this.props.reason) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement('p', { dangerouslySetInnerHTML: { __html: this.props.reason } });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-icon' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'remove_circle_outline'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'lead' },
|
|
|
+ this.props.message
|
|
|
+ ),
|
|
|
+ this.getErrorReason()
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return ChangeAvatarError;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var _class = function (_React$Component2) {
|
|
|
+ _inherits(_class, _React$Component2);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ var _Object$getPrototypeO;
|
|
|
+
|
|
|
+ var _temp, _this2, _ret;
|
|
|
+
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
+ args[_key] = arguments[_key];
|
|
|
+ }
|
|
|
+
|
|
|
+ return _ret = (_temp = (_this2 = _possibleConstructorReturn(this, (_Object$getPrototypeO = Object.getPrototypeOf(_class)).call.apply(_Object$getPrototypeO, [this].concat(args))), _this2), _this2.showError = function (error) {
|
|
|
+ _this2.setState({
|
|
|
+ error: error
|
|
|
+ });
|
|
|
+ }, _this2.showIndex = function () {
|
|
|
+ _this2.setState({
|
|
|
+ 'component': _index2.default
|
|
|
+ });
|
|
|
+ }, _this2.showUpload = function () {
|
|
|
+ _this2.setState({
|
|
|
+ 'component': _upload2.default
|
|
|
+ });
|
|
|
+ }, _this2.showCrop = function () {
|
|
|
+ _this2.setState({
|
|
|
+ 'component': _crop2.default
|
|
|
+ });
|
|
|
+ }, _this2.showGallery = function () {
|
|
|
+ _this2.setState({
|
|
|
+ 'component': _gallery2.default
|
|
|
+ });
|
|
|
+ }, _this2.completeFlow = function (avatarHash, options) {
|
|
|
+ _store2.default.dispatch((0, _users.updateAvatar)(_this2.props.user, avatarHash));
|
|
|
+
|
|
|
+ _this2.setState({
|
|
|
+ 'component': _index2.default,
|
|
|
+ options: options
|
|
|
+ });
|
|
|
+ }, _temp), _possibleConstructorReturn(_this2, _ret);
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'componentDidMount',
|
|
|
+ value: function componentDidMount() {
|
|
|
+ var _this3 = this;
|
|
|
+
|
|
|
+ _ajax2.default.get(this.props.user.api_url.avatar).then(function (options) {
|
|
|
+ _this3.setState({
|
|
|
+ 'component': _index2.default,
|
|
|
+ 'options': options,
|
|
|
+ 'error': null
|
|
|
+ });
|
|
|
+ }, function (rejection) {
|
|
|
+ _this3.showError(rejection);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'getBody',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function getBody() {
|
|
|
+ if (this.state) {
|
|
|
+ if (this.state.error) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(ChangeAvatarError, { message: this.state.error.detail,
|
|
|
+ reason: this.state.error.reason });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(this.state.component, { options: this.state.options,
|
|
|
+ user: this.props.user,
|
|
|
+ onComplete: this.completeFlow,
|
|
|
+ showError: this.showError,
|
|
|
+ showIndex: this.showIndex,
|
|
|
+ showCrop: this.showCrop,
|
|
|
+ showUpload: this.showUpload,
|
|
|
+ showGallery: this.showGallery });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_modalLoader2.default, null);
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getClassName',
|
|
|
+ value: function getClassName() {
|
|
|
+ if (this.state && this.state.error) {
|
|
|
+ return "modal-dialog modal-message modal-change-avatar";
|
|
|
+ } else {
|
|
|
+ return "modal-dialog modal-change-avatar";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: this.getClassName(),
|
|
|
+ role: 'document' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-content' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-header' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'close', 'data-dismiss': 'modal',
|
|
|
+ 'aria-label': gettext("Close") },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { 'aria-hidden': 'true' },
|
|
|
+ '×'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h4',
|
|
|
+ { className: 'modal-title' },
|
|
|
+ gettext("Change your avatar")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ this.getBody()
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+function select(state) {
|
|
|
+ return {
|
|
|
+ 'user': state.auth.user
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+},{"../../reducers/users":127,"../../services/ajax":128,"../../services/store":138,"../modal-loader":65,"./crop":56,"./gallery":57,"./index":58,"./upload":60,"react":"react"}],60:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _crop = require('./crop');
|
|
|
+
|
|
|
+var _crop2 = _interopRequireDefault(_crop);
|
|
|
+
|
|
|
+var _button = require('../button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _ajax = require('../../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _snackbar = require('../../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _fileSize = require('../../utils/file-size');
|
|
|
+
|
|
|
+var _fileSize2 = _interopRequireDefault(_fileSize);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.pickFile = function () {
|
|
|
+ document.getElementById('avatar-hidden-upload').click();
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.uploadFile = function () {
|
|
|
+ var image = document.getElementById('avatar-hidden-upload').files[0];
|
|
|
+
|
|
|
+ var validationError = _this.validateFile(image);
|
|
|
+ if (validationError) {
|
|
|
+ _snackbar2.default.error(validationError);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ _this.setState({
|
|
|
+ image: image,
|
|
|
+ 'preview': URL.createObjectURL(image),
|
|
|
+ 'progress': 0
|
|
|
+ });
|
|
|
+
|
|
|
+ var data = new FormData();
|
|
|
+ data.append('avatar', 'upload');
|
|
|
+ data.append('image', image);
|
|
|
+
|
|
|
+ _ajax2.default.upload(_this.props.user.api_url.avatar, data, function (progress) {
|
|
|
+ _this.setState({
|
|
|
+ progress: progress
|
|
|
+ });
|
|
|
+ }).then(function (data) {
|
|
|
+ _this.setState({
|
|
|
+ 'options': data.options,
|
|
|
+ 'uploaded': data.detail
|
|
|
+ });
|
|
|
+ _snackbar2.default.info(gettext("Your image has been uploaded and you may now crop it."));
|
|
|
+ }, function (rejection) {
|
|
|
+ if (rejection.status === 400) {
|
|
|
+ _snackbar2.default.error(rejection.detail);
|
|
|
+ _this.setState({
|
|
|
+ 'isLoading': false,
|
|
|
+ 'image': null,
|
|
|
+ 'progress': 0
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ _this.props.showError(rejection);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ 'image': null,
|
|
|
+ 'preview': null,
|
|
|
+ 'progress': 0,
|
|
|
+ 'uploaded': null
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'validateFile',
|
|
|
+ value: function validateFile(image) {
|
|
|
+ if (image.size > this.props.options.upload.limit) {
|
|
|
+ return interpolate(gettext("Selected file is too big. (%(filesize)s)"), {
|
|
|
+ 'filesize': (0, _fileSize2.default)(image.size)
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+
|
|
|
+ var invalidTypeMsg = gettext("Selected file type is not supported.");
|
|
|
+ if (this.props.options.upload.allowed_mime_types.indexOf(image.type) === -1) {
|
|
|
+ return invalidTypeMsg;
|
|
|
+ }
|
|
|
+
|
|
|
+ var extensionFound = false;
|
|
|
+ var loweredFilename = image.name.toLowerCase();
|
|
|
+ this.props.options.upload.allowed_extensions.map(function (extension) {
|
|
|
+ if (loweredFilename.substr(extension.length * -1) === extension) {
|
|
|
+ extensionFound = true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ if (!extensionFound) {
|
|
|
+ return invalidTypeMsg;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'getUploadRequirements',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function getUploadRequirements(options) {
|
|
|
+ var extensions = options.allowed_extensions.map(function (extension) {
|
|
|
+ return extension.substr(1);
|
|
|
+ });
|
|
|
+
|
|
|
+ return interpolate(gettext("%(files)s files smaller than %(limit)s"), {
|
|
|
+ 'files': extensions.join(', '),
|
|
|
+ 'limit': (0, _fileSize2.default)(options.limit)
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getUploadButton',
|
|
|
+ value: function getUploadButton() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-body modal-avatar-upload' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { className: 'btn-pick-file',
|
|
|
+ onClick: this.pickFile },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'input'
|
|
|
+ ),
|
|
|
+ gettext("Select file")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'text-muted' },
|
|
|
+ this.getUploadRequirements(this.props.options.upload)
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getUploadProgressLabel',
|
|
|
+ value: function getUploadProgressLabel() {
|
|
|
+ return interpolate(gettext("%(progress)s % complete"), {
|
|
|
+ 'progress': this.state.progress
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getUploadProgress',
|
|
|
+ value: function getUploadProgress() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-body modal-avatar-upload' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'upload-progress' },
|
|
|
+ _react2.default.createElement('img', { src: this.state.preview }),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'progress' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'progress-bar', role: 'progressbar',
|
|
|
+ 'aria-valuenow': '{this.state.progress}',
|
|
|
+ 'aria-valuemin': '0', 'aria-valuemax': '100',
|
|
|
+ style: { width: this.state.progress + '%' } },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'sr-only' },
|
|
|
+ this.getUploadProgressLabel()
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'renderUpload',
|
|
|
+ value: function renderUpload() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement('input', { type: 'file',
|
|
|
+ id: 'avatar-hidden-upload',
|
|
|
+ className: 'hidden-file-upload',
|
|
|
+ onChange: this.uploadFile }),
|
|
|
+ this.state.image ? this.getUploadProgress() : this.getUploadButton(),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-footer' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-md-6 col-md-offset-3' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { onClick: this.props.showIndex,
|
|
|
+ disabled: !!this.state.image,
|
|
|
+ className: 'btn-default btn-block' },
|
|
|
+ gettext("Cancel")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'renderCrop',
|
|
|
+ value: function renderCrop() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_crop2.default, { options: this.state.options,
|
|
|
+ user: this.props.user,
|
|
|
+ upload: this.state.uploaded,
|
|
|
+ onComplete: this.props.onComplete,
|
|
|
+ showError: this.props.showError,
|
|
|
+ showIndex: this.props.showIndex });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return this.state.uploaded ? this.renderCrop() : this.renderUpload();
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../services/ajax":128,"../../services/snackbar":137,"../../utils/file-size":142,"../button":55,"./crop":56,"react":"react"}],61:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'isValidated',
|
|
|
+ value: function isValidated() {
|
|
|
+ return typeof this.props.validation !== "undefined";
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getClassName',
|
|
|
+ value: function getClassName() {
|
|
|
+ var className = 'form-group';
|
|
|
+ if (this.isValidated()) {
|
|
|
+ className += ' has-feedback';
|
|
|
+ if (this.props.validation === null) {
|
|
|
+ className += ' has-success';
|
|
|
+ } else {
|
|
|
+ className += ' has-error';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return className;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getFeedback',
|
|
|
+ value: function getFeedback() {
|
|
|
+ var _this2 = this;
|
|
|
+
|
|
|
+ if (this.props.validation) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'help-block errors' },
|
|
|
+ this.props.validation.map(function (error, i) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { key: _this2.props.for + 'FeedbackItem' + i },
|
|
|
+ error
|
|
|
+ );
|
|
|
+ })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getFeedbackIcon',
|
|
|
+ value: function getFeedbackIcon() {
|
|
|
+ if (this.isValidated()) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon form-control-feedback',
|
|
|
+ 'aria-hidden': 'true', key: this.props.for + 'FeedbackIcon' },
|
|
|
+ this.props.validation ? 'clear' : 'check'
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getFeedbackDescription',
|
|
|
+ value: function getFeedbackDescription() {
|
|
|
+ if (this.isValidated()) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { id: this.props.for + '_status', className: 'sr-only' },
|
|
|
+ this.props.validation ? gettext('(error)') : gettext('(success)')
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getHelpText',
|
|
|
+ value: function getHelpText() {
|
|
|
+ if (this.props.helpText) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'help-block' },
|
|
|
+ this.props.helpText
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: this.getClassName() },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'label',
|
|
|
+ { className: 'control-label ' + (this.props.labelClass || ''),
|
|
|
+ htmlFor: this.props.for || '' },
|
|
|
+ this.props.label + ':'
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: this.props.controlClass || '' },
|
|
|
+ this.props.children,
|
|
|
+ this.getFeedbackIcon(),
|
|
|
+ this.getFeedbackDescription(),
|
|
|
+ this.getFeedback(),
|
|
|
+ this.getHelpText(),
|
|
|
+ this.props.extra || null
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"react":"react"}],62:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _validators = require('../utils/validators');
|
|
|
+
|
|
|
+var _snackbar = require('../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var validateRequired = (0, _validators.required)();
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ var _Object$getPrototypeO;
|
|
|
+
|
|
|
+ var _temp, _this, _ret;
|
|
|
+
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
+ args[_key] = arguments[_key];
|
|
|
+ }
|
|
|
+
|
|
|
+ return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_Object$getPrototypeO = Object.getPrototypeOf(_class)).call.apply(_Object$getPrototypeO, [this].concat(args))), _this), _this.bindInput = function (name) {
|
|
|
+ return function (event) {
|
|
|
+ var newState = _defineProperty({}, name, event.target.value);
|
|
|
+
|
|
|
+ var formErrors = _this.state.errors || {};
|
|
|
+ formErrors[name] = _this.validateField(name, newState[name]);
|
|
|
+ newState.errors = formErrors;
|
|
|
+
|
|
|
+ _this.setState(newState);
|
|
|
+ };
|
|
|
+ }, _this.handleSubmit = function (event) {
|
|
|
+ // we don't reload page on submissions
|
|
|
+ event.preventDefault();
|
|
|
+ if (_this.state.isLoading) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (_this.clean()) {
|
|
|
+ _this.setState({ isLoading: true });
|
|
|
+ var promise = _this.send();
|
|
|
+
|
|
|
+ if (promise) {
|
|
|
+ promise.then(function (success) {
|
|
|
+ _this.setState({ isLoading: false });
|
|
|
+ _this.handleSuccess(success);
|
|
|
+ }, function (rejection) {
|
|
|
+ _this.setState({ isLoading: false });
|
|
|
+ _this.handleError(rejection);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ _this.setState({ isLoading: false });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, _temp), _possibleConstructorReturn(_this, _ret);
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'validate',
|
|
|
+ value: function validate() {
|
|
|
+ var errors = {};
|
|
|
+ if (!this.state.validators) {
|
|
|
+ return errors;
|
|
|
+ }
|
|
|
+
|
|
|
+ var validators = {
|
|
|
+ required: this.state.validators.required || this.state.validators,
|
|
|
+ optional: this.state.validators.optional || {}
|
|
|
+ };
|
|
|
+
|
|
|
+ var validatedFields = [];
|
|
|
+
|
|
|
+ // add required fields to validation
|
|
|
+ for (var name in validators.required) {
|
|
|
+ if (validators.required.hasOwnProperty(name) && validators.required[name]) {
|
|
|
+ validatedFields.push(name);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // add optional fields to validation
|
|
|
+ for (var name in validators.optional) {
|
|
|
+ if (validators.optional.hasOwnProperty(name) && validators.optional[name]) {
|
|
|
+ validatedFields.push(name);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // validate fields values
|
|
|
+ for (var i in validatedFields) {
|
|
|
+ var name = validatedFields[i];
|
|
|
+ var fieldErrors = this.validateField(name, this.state[name]);
|
|
|
+
|
|
|
+ if (fieldErrors === null) {
|
|
|
+ errors[name] = null;
|
|
|
+ } else if (fieldErrors) {
|
|
|
+ errors[name] = fieldErrors;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return errors;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'isValid',
|
|
|
+ value: function isValid() {
|
|
|
+ var errors = this.validate();
|
|
|
+ for (var field in errors) {
|
|
|
+ if (errors.hasOwnProperty(field)) {
|
|
|
+ if (errors[field] !== null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'validateField',
|
|
|
+ value: function validateField(name, value) {
|
|
|
+ var errors = [];
|
|
|
+ if (!this.state.validators) {
|
|
|
+ return errors;
|
|
|
+ }
|
|
|
+
|
|
|
+ var validators = {
|
|
|
+ required: (this.state.validators.required || this.state.validators)[name],
|
|
|
+ optional: (this.state.validators.optional || {})[name]
|
|
|
+ };
|
|
|
+
|
|
|
+ var requiredError = validateRequired(value) || false;
|
|
|
+
|
|
|
+ if (validators.required) {
|
|
|
+ if (requiredError) {
|
|
|
+ errors = [requiredError];
|
|
|
+ } else {
|
|
|
+ for (var i in validators.required) {
|
|
|
+ var validationError = validators.required[i](value);
|
|
|
+ if (validationError) {
|
|
|
+ errors.push(validationError);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return errors.length ? errors : null;
|
|
|
+ } else if (requiredError === false && validators.optional) {
|
|
|
+ for (var i in validators.optional) {
|
|
|
+ var validationError = validators.optional[i](value);
|
|
|
+ if (validationError) {
|
|
|
+ errors.push(validationError);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return errors.length ? errors : null;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false; // false === field wasn't validated
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'clean',
|
|
|
+ value: function clean() {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'send',
|
|
|
+ value: function send() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleSuccess',
|
|
|
+ value: function handleSuccess(success) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleError',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+ value: function handleError(rejection) {
|
|
|
+ _snackbar2.default.apiError(rejection);
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../services/snackbar":137,"../utils/validators":148,"react":"react"}],63:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'isActive',
|
|
|
+ value: function isActive() {
|
|
|
+ if (this.props.path) {
|
|
|
+ return document.location.pathname.indexOf(this.props.path) === 0;
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getClassName',
|
|
|
+ value: function getClassName() {
|
|
|
+ if (this.isActive()) {
|
|
|
+ return (this.props.className || '') + ' ' + (this.props.activeClassName || 'active');
|
|
|
+ } else {
|
|
|
+ return this.props.className || '';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ // jshint ignore:start
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: this.getClassName() },
|
|
|
+ this.props.children
|
|
|
+ );
|
|
|
+ // jshint ignore:end
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"react":"react"}],64:[function(require,module,exports){
|
|
|
+"use strict";
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require("react");
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: "render",
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ "div",
|
|
|
+ { className: this.props.className || "loader" },
|
|
|
+ _react2.default.createElement("div", { className: "loader-spinning-wheel" })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"react":"react"}],65:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _loader = require('./loader');
|
|
|
+
|
|
|
+var _loader2 = _interopRequireDefault(_loader);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-body modal-loader' },
|
|
|
+ _react2.default.createElement(_loader2.default, null)
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"./loader":64,"react":"react"}],66:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _panelMessage = require('./panel-message');
|
|
|
+
|
|
|
+var _panelMessage2 = _interopRequireDefault(_panelMessage);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_PanelMessage) {
|
|
|
+ _inherits(_class, _PanelMessage);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getHelpText',
|
|
|
+ value: function getHelpText() {
|
|
|
+ if (this.props.helpText) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'help-block' },
|
|
|
+ this.props.helpText
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-icon' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ this.props.icon || 'info_outline'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'lead' },
|
|
|
+ this.props.message
|
|
|
+ ),
|
|
|
+ this.getHelpText()
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_panelMessage2.default);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"./panel-message":78,"react":"react"}],67:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _panelLoader = require('../../panel-loader');
|
|
|
+
|
|
|
+var _panelLoader2 = _interopRequireDefault(_panelLoader);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel panel-default panel-form' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-heading' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h3',
|
|
|
+ { className: 'panel-title' },
|
|
|
+ gettext("Change username")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(_panelLoader2.default, null)
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../panel-loader":77,"react":"react"}],68:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _panelMessage = require('../../panel-message');
|
|
|
+
|
|
|
+var _panelMessage2 = _interopRequireDefault(_panelMessage);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getHelpText',
|
|
|
+ value: function getHelpText() {
|
|
|
+ if (this.props.options.next_on) {
|
|
|
+ return interpolate(gettext("You will be able to change your username %(next_change)s."), { 'next_change': this.props.options.next_on.fromNow() }, true);
|
|
|
+ } else {
|
|
|
+ return gettext("You have used up available name changes.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel panel-default panel-form' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-heading' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h3',
|
|
|
+ { className: 'panel-title' },
|
|
|
+ gettext("Change username")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(_panelMessage2.default, { message: gettext("You can't change your username at the moment."),
|
|
|
+ helpText: this.getHelpText() })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../panel-message":78,"react":"react"}],69:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _button = require('../../button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _form = require('../../form');
|
|
|
+
|
|
|
+var _form2 = _interopRequireDefault(_form);
|
|
|
+
|
|
|
+var _formGroup = require('../../form-group');
|
|
|
+
|
|
|
+var _formGroup2 = _interopRequireDefault(_formGroup);
|
|
|
+
|
|
|
+var _ajax = require('../../../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _snackbar = require('../../../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _validators = require('../../../utils/validators');
|
|
|
+
|
|
|
+var validators = _interopRequireWildcard(_validators);
|
|
|
+
|
|
|
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_Form) {
|
|
|
+ _inherits(_class, _Form);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ username: '',
|
|
|
+
|
|
|
+ validators: {
|
|
|
+ username: [validators.usernameContent(), validators.usernameMinLength({
|
|
|
+ username_length_min: props.options.length_min
|
|
|
+ }), validators.usernameMaxLength({
|
|
|
+ username_length_max: props.options.length_max
|
|
|
+ })]
|
|
|
+ },
|
|
|
+
|
|
|
+ isLoading: false
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getHelpText',
|
|
|
+ value: function getHelpText() {
|
|
|
+ var phrases = [];
|
|
|
+
|
|
|
+ if (this.props.options.changes_left > 0) {
|
|
|
+ var message = ngettext("You can change your username %(changes_left)s more time.", "You can change your username %(changes_left)s more times.", this.props.options.changes_left);
|
|
|
+
|
|
|
+ phrases.push(interpolate(message, {
|
|
|
+ 'changes_left': this.props.options.changes_left
|
|
|
+ }, true));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.props.user.acl.name_changes_expire > 0) {
|
|
|
+ var message = ngettext("Used changes redeem after %(name_changes_expire)s day.", "Used changes redeem after %(name_changes_expire)s days.", this.props.user.acl.name_changes_expire);
|
|
|
+
|
|
|
+ phrases.push(interpolate(message, {
|
|
|
+ 'name_changes_expire': this.props.user.acl.name_changes_expire
|
|
|
+ }, true));
|
|
|
+ }
|
|
|
+
|
|
|
+ return phrases.length ? phrases.join(' ') : null;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'clean',
|
|
|
+ value: function clean() {
|
|
|
+ var errors = this.validate();
|
|
|
+ if (errors.username) {
|
|
|
+ _snackbar2.default.error(errors.username[0]);
|
|
|
+ return false;
|
|
|
+ }if (this.state.username.trim() === this.props.user.username) {
|
|
|
+ _snackbar2.default.info(gettext("Your new username is same as current one."));
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'send',
|
|
|
+ value: function send() {
|
|
|
+ return _ajax2.default.post(this.props.user.api_url.username, {
|
|
|
+ 'username': this.state.username
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleSuccess',
|
|
|
+ value: function handleSuccess(success) {
|
|
|
+ this.setState({
|
|
|
+ 'username': ''
|
|
|
+ });
|
|
|
+
|
|
|
+ this.props.complete(success.username, success.slug, success.options);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleError',
|
|
|
+ value: function handleError(rejection) {
|
|
|
+ _snackbar2.default.apiError(rejection);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'form',
|
|
|
+ { onSubmit: this.handleSubmit, className: 'form-horizontal' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel panel-default panel-form' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-heading' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h3',
|
|
|
+ { className: 'panel-title' },
|
|
|
+ gettext("Change username")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("New username"), 'for': 'id_username',
|
|
|
+ labelClass: 'col-sm-4', controlClass: 'col-sm-8',
|
|
|
+ helpText: this.getHelpText() },
|
|
|
+ _react2.default.createElement('input', { type: 'text', id: 'id_username', className: 'form-control',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('username'),
|
|
|
+ value: this.state.username })
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-footer' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'row' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-sm-8 col-sm-offset-4' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { className: 'btn-primary', loading: this.state.isLoading },
|
|
|
+ gettext("Change username")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_form2.default);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../../services/ajax":128,"../../../services/snackbar":137,"../../../utils/validators":148,"../../button":55,"../../form":62,"../../form-group":61,"react":"react"}],70:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _moment = require('moment');
|
|
|
+
|
|
|
+var _moment2 = _interopRequireDefault(_moment);
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _formLoading = require('./form-loading');
|
|
|
+
|
|
|
+var _formLoading2 = _interopRequireDefault(_formLoading);
|
|
|
+
|
|
|
+var _formLocked = require('./form-locked');
|
|
|
+
|
|
|
+var _formLocked2 = _interopRequireDefault(_formLocked);
|
|
|
+
|
|
|
+var _form = require('./form');
|
|
|
+
|
|
|
+var _form2 = _interopRequireDefault(_form);
|
|
|
+
|
|
|
+var _usernameHistory = require('../../username-history');
|
|
|
+
|
|
|
+var _usernameHistory2 = _interopRequireDefault(_usernameHistory);
|
|
|
+
|
|
|
+var _index = require('../../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _usernameHistory3 = require('../../../reducers/username-history');
|
|
|
+
|
|
|
+var _users = require('../../../reducers/users');
|
|
|
+
|
|
|
+var _ajax = require('../../../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _pageTitle = require('../../../services/page-title');
|
|
|
+
|
|
|
+var _pageTitle2 = _interopRequireDefault(_pageTitle);
|
|
|
+
|
|
|
+var _snackbar = require('../../../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _store = require('../../../services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.onComplete = function (username, slug, options) {
|
|
|
+ _this.setState({
|
|
|
+ options: options
|
|
|
+ });
|
|
|
+
|
|
|
+ _store2.default.dispatch((0, _usernameHistory3.addNameChange)({ username: username, slug: slug }, _this.props.user, _this.props.user));
|
|
|
+ _store2.default.dispatch((0, _users.updateUsername)(_this.props.user, username, slug));
|
|
|
+
|
|
|
+ _snackbar2.default.success(gettext("Your username has been changed successfully."));
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ isLoaded: false,
|
|
|
+ options: null
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'componentDidMount',
|
|
|
+ value: function componentDidMount() {
|
|
|
+ var _this2 = this;
|
|
|
+
|
|
|
+ _pageTitle2.default.set({
|
|
|
+ title: gettext("Change username"),
|
|
|
+ parent: gettext("Change your options")
|
|
|
+ });
|
|
|
+
|
|
|
+ Promise.all([_ajax2.default.get(this.props.user.api_url.username), _ajax2.default.get(_index2.default.get('USERNAME_CHANGES_API'), { user: this.props.user.id })]).then(function (data) {
|
|
|
+ _store2.default.dispatch((0, _usernameHistory3.dehydrate)(data[1].results));
|
|
|
+
|
|
|
+ _this2.setState({
|
|
|
+ isLoaded: true,
|
|
|
+ options: {
|
|
|
+ changes_left: data[0].changes_left,
|
|
|
+ length_min: data[0].length_min,
|
|
|
+ length_max: data[0].length_max,
|
|
|
+ next_on: data[0].next_on ? (0, _moment2.default)(data[0].next_on) : null
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'getChangeForm',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function getChangeForm() {
|
|
|
+ if (this.state.isLoaded) {
|
|
|
+ if (this.state.options.changes_left > 0) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_form2.default, { user: this.props.user,
|
|
|
+ options: this.state.options,
|
|
|
+ complete: this.onComplete });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_formLocked2.default, { options: this.state.options });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_formLoading2.default, null);
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ null,
|
|
|
+ this.getChangeForm(),
|
|
|
+ _react2.default.createElement(_usernameHistory2.default, { isLoaded: this.state.isLoaded,
|
|
|
+ changes: this.props['username-history'] })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../../index":121,"../../../reducers/username-history":126,"../../../reducers/users":127,"../../../services/ajax":128,"../../../services/page-title":135,"../../../services/snackbar":137,"../../../services/store":138,"../../username-history":105,"./form":69,"./form-loading":67,"./form-locked":68,"moment":"moment","react":"react"}],71:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _button = require('../button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _form = require('../form');
|
|
|
+
|
|
|
+var _form2 = _interopRequireDefault(_form);
|
|
|
+
|
|
|
+var _formGroup = require('../form-group');
|
|
|
+
|
|
|
+var _formGroup2 = _interopRequireDefault(_formGroup);
|
|
|
+
|
|
|
+var _select = require('../select');
|
|
|
+
|
|
|
+var _select2 = _interopRequireDefault(_select);
|
|
|
+
|
|
|
+var _yesNoSwitch = require('../yes-no-switch');
|
|
|
+
|
|
|
+var _yesNoSwitch2 = _interopRequireDefault(_yesNoSwitch);
|
|
|
+
|
|
|
+var _auth = require('../../reducers/auth');
|
|
|
+
|
|
|
+var _ajax = require('../../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _pageTitle = require('../../services/page-title');
|
|
|
+
|
|
|
+var _pageTitle2 = _interopRequireDefault(_pageTitle);
|
|
|
+
|
|
|
+var _snackbar = require('../../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _store = require('../../services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_Form) {
|
|
|
+ _inherits(_class, _Form);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ 'isLoading': false,
|
|
|
+
|
|
|
+ 'is_hiding_presence': props.user.is_hiding_presence,
|
|
|
+ 'limits_private_thread_invites_to': props.user.limits_private_thread_invites_to,
|
|
|
+ 'subscribe_to_started_threads': props.user.subscribe_to_started_threads,
|
|
|
+ 'subscribe_to_replied_threads': props.user.subscribe_to_replied_threads,
|
|
|
+
|
|
|
+ 'errors': {}
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.privateThreadInvitesChoices = [{
|
|
|
+ 'value': 0,
|
|
|
+ 'icon': 'help_outline',
|
|
|
+ 'label': gettext('Everybody')
|
|
|
+ }, {
|
|
|
+ 'value': 1,
|
|
|
+ 'icon': 'done_all',
|
|
|
+ 'label': gettext('Users I follow')
|
|
|
+ }, {
|
|
|
+ 'value': 2,
|
|
|
+ 'icon': 'highlight_off',
|
|
|
+ 'label': gettext('Nobody')
|
|
|
+ }];
|
|
|
+
|
|
|
+ _this.subscribeToChoices = [{
|
|
|
+ 'value': 0,
|
|
|
+ 'icon': 'bookmark_border',
|
|
|
+ 'label': gettext('No')
|
|
|
+ }, {
|
|
|
+ 'value': 1,
|
|
|
+ 'icon': 'bookmark',
|
|
|
+ 'label': gettext('Bookmark')
|
|
|
+ }, {
|
|
|
+ 'value': 2,
|
|
|
+ 'icon': 'mail',
|
|
|
+ 'label': gettext('Bookmark with e-mail notification')
|
|
|
+ }];
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'send',
|
|
|
+ value: function send() {
|
|
|
+ return _ajax2.default.post(this.props.user.api_url.options, {
|
|
|
+ is_hiding_presence: this.state.is_hiding_presence,
|
|
|
+ limits_private_thread_invites_to: this.state.limits_private_thread_invites_to,
|
|
|
+ subscribe_to_started_threads: this.state.subscribe_to_started_threads,
|
|
|
+ subscribe_to_replied_threads: this.state.subscribe_to_replied_threads
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleSuccess',
|
|
|
+ value: function handleSuccess() {
|
|
|
+ _store2.default.dispatch((0, _auth.patchUser)({
|
|
|
+ is_hiding_presence: this.state.is_hiding_presence,
|
|
|
+ limits_private_thread_invites_to: this.state.limits_private_thread_invites_to,
|
|
|
+ subscribe_to_started_threads: this.state.subscribe_to_started_threads,
|
|
|
+ subscribe_to_replied_threads: this.state.subscribe_to_replied_threads
|
|
|
+ }));
|
|
|
+ _snackbar2.default.success(gettext("Your forum options have been changed."));
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleError',
|
|
|
+ value: function handleError(rejection) {
|
|
|
+ if (rejection.status === 400) {
|
|
|
+ _snackbar2.default.error(gettext("Please reload page and try again."));
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.apiError(rejection);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'componentDidMount',
|
|
|
+ value: function componentDidMount() {
|
|
|
+ _pageTitle2.default.set({
|
|
|
+ title: gettext("Forum options"),
|
|
|
+ parent: gettext("Change your options")
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'form',
|
|
|
+ { onSubmit: this.handleSubmit, className: 'form-horizontal' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel panel-default panel-form' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-heading' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h3',
|
|
|
+ { className: 'panel-title' },
|
|
|
+ gettext("Change forum options")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'fieldset',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'legend',
|
|
|
+ null,
|
|
|
+ gettext("Privacy settings")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("Hide my presence"),
|
|
|
+ helpText: gettext("If you hide your presence, only members with permission to see hidden users will see when you are online."),
|
|
|
+ 'for': 'id_is_hiding_presence',
|
|
|
+ labelClass: 'col-sm-4', controlClass: 'col-sm-8' },
|
|
|
+ _react2.default.createElement(_yesNoSwitch2.default, { id: 'id_is_hiding_presence',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ iconOn: 'visibility_off',
|
|
|
+ iconOff: 'visibility',
|
|
|
+ labelOn: gettext("Hide my presence from other users"),
|
|
|
+ labelOff: gettext("Show my presence to other users"),
|
|
|
+ onChange: this.bindInput('is_hiding_presence'),
|
|
|
+ value: this.state.is_hiding_presence })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("Private thread invitations"),
|
|
|
+ 'for': 'id_limits_private_thread_invites_to',
|
|
|
+ labelClass: 'col-sm-4', controlClass: 'col-sm-8' },
|
|
|
+ _react2.default.createElement(_select2.default, { id: 'id_limits_private_thread_invites_to',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('limits_private_thread_invites_to'),
|
|
|
+ value: this.state.limits_private_thread_invites_to,
|
|
|
+ choices: this.privateThreadInvitesChoices })
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'fieldset',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'legend',
|
|
|
+ null,
|
|
|
+ gettext("Automatic subscriptions")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("Threads I start"),
|
|
|
+ 'for': 'id_subscribe_to_started_threads',
|
|
|
+ labelClass: 'col-sm-4', controlClass: 'col-sm-8' },
|
|
|
+ _react2.default.createElement(_select2.default, { id: 'id_subscribe_to_started_threads',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('subscribe_to_started_threads'),
|
|
|
+ value: this.state.subscribe_to_started_threads,
|
|
|
+ choices: this.subscribeToChoices })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("Threads I reply to"),
|
|
|
+ 'for': 'id_subscribe_to_replied_threads',
|
|
|
+ labelClass: 'col-sm-4', controlClass: 'col-sm-8' },
|
|
|
+ _react2.default.createElement(_select2.default, { id: 'id_subscribe_to_replied_threads',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('subscribe_to_replied_threads'),
|
|
|
+ value: this.state.subscribe_to_replied_threads,
|
|
|
+ choices: this.subscribeToChoices })
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-footer' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'row' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-sm-8 col-sm-offset-4' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { className: 'btn-primary', loading: this.state.isLoading },
|
|
|
+ gettext("Save changes")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_form2.default);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../reducers/auth":122,"../../services/ajax":128,"../../services/page-title":135,"../../services/snackbar":137,"../../services/store":138,"../button":55,"../form":62,"../form-group":61,"../select":98,"../yes-no-switch":120,"react":"react"}],72:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.CompactNav = exports.SideNav = undefined;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _reactRouter = require('react-router');
|
|
|
+
|
|
|
+var _li = require('../li');
|
|
|
+
|
|
|
+var _li2 = _interopRequireDefault(_li);
|
|
|
+
|
|
|
+var _index = require('../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+//jshint ignore:line
|
|
|
+
|
|
|
+//jshint ignore:line
|
|
|
+
|
|
|
+var SideNav = exports.SideNav = function (_React$Component) {
|
|
|
+ _inherits(SideNav, _React$Component);
|
|
|
+
|
|
|
+ function SideNav() {
|
|
|
+ _classCallCheck(this, SideNav);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(SideNav).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(SideNav, [{
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ var _this2 = this;
|
|
|
+
|
|
|
+ // jshint ignore:start
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'list-group nav-side' },
|
|
|
+ this.props.options.map(function (option) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ _reactRouter.Link,
|
|
|
+ { to: _this2.props.baseUrl + option.component + '/',
|
|
|
+ className: 'list-group-item',
|
|
|
+ activeClassName: 'active',
|
|
|
+ key: option.component },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ option.icon
|
|
|
+ ),
|
|
|
+ option.name
|
|
|
+ );
|
|
|
+ })
|
|
|
+ );
|
|
|
+ // jshint ignore:end
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return SideNav;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var CompactNav = exports.CompactNav = function (_React$Component2) {
|
|
|
+ _inherits(CompactNav, _React$Component2);
|
|
|
+
|
|
|
+ function CompactNav() {
|
|
|
+ _classCallCheck(this, CompactNav);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(CompactNav).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(CompactNav, [{
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ var _this4 = this;
|
|
|
+
|
|
|
+ // jshint ignore:start
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'dropdown-menu', role: 'menu' },
|
|
|
+ this.props.options.map(function (option) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ _li2.default,
|
|
|
+ { path: _this4.props.baseUrl + option.component + '/',
|
|
|
+ key: option.component },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _reactRouter.Link,
|
|
|
+ { to: _this4.props.baseUrl + option.component + '/',
|
|
|
+ onClick: _this4.props.hideNav },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ option.icon
|
|
|
+ ),
|
|
|
+ option.name
|
|
|
+ )
|
|
|
+ );
|
|
|
+ })
|
|
|
+ );
|
|
|
+ // jshint ignore:end
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return CompactNav;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+},{"../../index":121,"../li":63,"react":"react","react-router":"react-router"}],73:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.select = select;
|
|
|
+exports.paths = paths;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _reactRedux = require('react-redux');
|
|
|
+
|
|
|
+var _navs = require('./navs');
|
|
|
+
|
|
|
+var _forumOptions = require('./forum-options');
|
|
|
+
|
|
|
+var _forumOptions2 = _interopRequireDefault(_forumOptions);
|
|
|
+
|
|
|
+var _root = require('./change-username/root');
|
|
|
+
|
|
|
+var _root2 = _interopRequireDefault(_root);
|
|
|
+
|
|
|
+var _root3 = require('./sign-in-credentials/root');
|
|
|
+
|
|
|
+var _root4 = _interopRequireDefault(_root3);
|
|
|
+
|
|
|
+var _index = require('../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.toggleNav = function () {
|
|
|
+ if (_this.state.dropdown) {
|
|
|
+ _this.setState({
|
|
|
+ dropdown: false
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ _this.setState({
|
|
|
+ dropdown: true
|
|
|
+ });
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.hideNav = function () {
|
|
|
+ _this.setState({
|
|
|
+ dropdown: false
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ dropdown: false
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getToggleNavClassName',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function getToggleNavClassName() {
|
|
|
+ if (this.state.dropdown) {
|
|
|
+ return 'btn btn-default btn-icon open';
|
|
|
+ } else {
|
|
|
+ return 'btn btn-default btn-icon';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getCompactNavClassName',
|
|
|
+ value: function getCompactNavClassName() {
|
|
|
+ if (this.state.dropdown) {
|
|
|
+ return 'compact-nav open';
|
|
|
+ } else {
|
|
|
+ return 'compact-nav';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'page page-options' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'page-header' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'container' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h1',
|
|
|
+ { className: 'pull-left' },
|
|
|
+ gettext("Change your options")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { className: 'btn btn-default btn-aligned btn-icon btn-dropdown-toggle hidden-md hidden-lg',
|
|
|
+ type: 'button',
|
|
|
+ onClick: this.toggleNav,
|
|
|
+ 'aria-haspopup': 'true',
|
|
|
+ 'aria-expanded': this.state.dropdown ? 'true' : 'false' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'i',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'menu'
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: this.getCompactNavClassName() },
|
|
|
+ _react2.default.createElement(_navs.CompactNav, { options: _index2.default.get('USER_OPTIONS'),
|
|
|
+ baseUrl: _index2.default.get('USERCP_URL'),
|
|
|
+ hideNav: this.hideNav })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'container' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'row' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-md-3 hidden-xs hidden-sm' },
|
|
|
+ _react2.default.createElement(_navs.SideNav, { options: _index2.default.get('USER_OPTIONS'),
|
|
|
+ baseUrl: _index2.default.get('USERCP_URL') })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-md-9' },
|
|
|
+ this.props.children
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+function select(store) {
|
|
|
+ return {
|
|
|
+ 'tick': store.tick.tick,
|
|
|
+ 'user': store.auth.user,
|
|
|
+ 'username-history': store['username-history']
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function paths() {
|
|
|
+ return [{
|
|
|
+ path: _index2.default.get('USERCP_URL') + 'forum-options/',
|
|
|
+ component: (0, _reactRedux.connect)(select)(_forumOptions2.default)
|
|
|
+ }, {
|
|
|
+ path: _index2.default.get('USERCP_URL') + 'change-username/',
|
|
|
+ component: (0, _reactRedux.connect)(select)(_root2.default)
|
|
|
+ }, {
|
|
|
+ path: _index2.default.get('USERCP_URL') + 'sign-in-credentials/',
|
|
|
+ component: (0, _reactRedux.connect)(select)(_root4.default)
|
|
|
+ }];
|
|
|
+}
|
|
|
+
|
|
|
+},{"../../index":121,"./change-username/root":70,"./forum-options":71,"./navs":72,"./sign-in-credentials/root":76,"react":"react","react-redux":"react-redux"}],74:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _button = require('../../button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _form = require('../../form');
|
|
|
+
|
|
|
+var _form2 = _interopRequireDefault(_form);
|
|
|
+
|
|
|
+var _formGroup = require('../../form-group');
|
|
|
+
|
|
|
+var _formGroup2 = _interopRequireDefault(_formGroup);
|
|
|
+
|
|
|
+var _ajax = require('../../../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _snackbar = require('../../../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _validators = require('../../../utils/validators');
|
|
|
+
|
|
|
+var validators = _interopRequireWildcard(_validators);
|
|
|
+
|
|
|
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_Form) {
|
|
|
+ _inherits(_class, _Form);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ new_email: '',
|
|
|
+ password: '',
|
|
|
+
|
|
|
+ validators: {
|
|
|
+ new_email: [validators.email()],
|
|
|
+ password: []
|
|
|
+ },
|
|
|
+
|
|
|
+ isLoading: false
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'clean',
|
|
|
+ value: function clean() {
|
|
|
+ var errors = this.validate();
|
|
|
+ var lengths = [this.state.new_email.trim().length, this.state.password.trim().length];
|
|
|
+
|
|
|
+ if (lengths.indexOf(0) !== -1) {
|
|
|
+ _snackbar2.default.error(gettext("Fill out all fields."));
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (errors.new_email) {
|
|
|
+ _snackbar2.default.error(errors.new_email[0]);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'send',
|
|
|
+ value: function send() {
|
|
|
+ return _ajax2.default.post(this.props.user.api_url.change_email, {
|
|
|
+ new_email: this.state.new_email,
|
|
|
+ password: this.state.password
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleSuccess',
|
|
|
+ value: function handleSuccess(response) {
|
|
|
+ this.setState({
|
|
|
+ new_email: '',
|
|
|
+ password: ''
|
|
|
+ });
|
|
|
+
|
|
|
+ _snackbar2.default.success(response.detail);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleError',
|
|
|
+ value: function handleError(rejection) {
|
|
|
+ if (rejection.status === 400) {
|
|
|
+ if (rejection.new_email) {
|
|
|
+ _snackbar2.default.error(rejection.new_email);
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.error(rejection.password);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.apiError(rejection);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'form',
|
|
|
+ { onSubmit: this.handleSubmit, className: 'form-horizontal' },
|
|
|
+ _react2.default.createElement('input', { type: 'type', style: { display: 'none' } }),
|
|
|
+ _react2.default.createElement('input', { type: 'password', style: { display: 'none' } }),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel panel-default panel-form' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-heading' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h3',
|
|
|
+ { className: 'panel-title' },
|
|
|
+ gettext("Change e-mail address")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("New e-mail"), 'for': 'id_new_email',
|
|
|
+ labelClass: 'col-sm-4', controlClass: 'col-sm-8' },
|
|
|
+ _react2.default.createElement('input', { type: 'text', id: 'id_new_email', className: 'form-control',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('new_email'),
|
|
|
+ value: this.state.new_email })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement('hr', null),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("Your current password"), 'for': 'id_password',
|
|
|
+ labelClass: 'col-sm-4', controlClass: 'col-sm-8' },
|
|
|
+ _react2.default.createElement('input', { type: 'password', id: 'id_password', className: 'form-control',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('password'),
|
|
|
+ value: this.state.password })
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-footer' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'row' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-sm-8 col-sm-offset-4' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { className: 'btn-primary', loading: this.state.isLoading },
|
|
|
+ gettext("Change e-mail")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_form2.default);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../../services/ajax":128,"../../../services/snackbar":137,"../../../utils/validators":148,"../../button":55,"../../form":62,"../../form-group":61,"react":"react"}],75:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _button = require('../../button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _form = require('../../form');
|
|
|
+
|
|
|
+var _form2 = _interopRequireDefault(_form);
|
|
|
+
|
|
|
+var _formGroup = require('../../form-group');
|
|
|
+
|
|
|
+var _formGroup2 = _interopRequireDefault(_formGroup);
|
|
|
+
|
|
|
+var _index = require('../../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _ajax = require('../../../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _snackbar = require('../../../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _validators = require('../../../utils/validators');
|
|
|
+
|
|
|
+var validators = _interopRequireWildcard(_validators);
|
|
|
+
|
|
|
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_Form) {
|
|
|
+ _inherits(_class, _Form);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ new_password: '',
|
|
|
+ repeat_password: '',
|
|
|
+ password: '',
|
|
|
+
|
|
|
+ validators: {
|
|
|
+ new_password: [validators.passwordMinLength(_index2.default.get('SETTINGS'))],
|
|
|
+ repeat_password: [],
|
|
|
+ password: []
|
|
|
+ },
|
|
|
+
|
|
|
+ isLoading: false
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'clean',
|
|
|
+ value: function clean() {
|
|
|
+ var errors = this.validate();
|
|
|
+ var lengths = [this.state.new_password.trim().length, this.state.repeat_password.trim().length, this.state.password.trim().length];
|
|
|
+
|
|
|
+ if (lengths.indexOf(0) !== -1) {
|
|
|
+ _snackbar2.default.error(gettext("Fill out all fields."));
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (errors.new_password) {
|
|
|
+ _snackbar2.default.error(errors.new_password[0]);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.state.new_password.trim() !== this.state.repeat_password.trim()) {
|
|
|
+ _snackbar2.default.error(gettext("New passwords are different."));
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'send',
|
|
|
+ value: function send() {
|
|
|
+ return _ajax2.default.post(this.props.user.api_url.change_password, {
|
|
|
+ new_password: this.state.new_password,
|
|
|
+ password: this.state.password
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleSuccess',
|
|
|
+ value: function handleSuccess(response) {
|
|
|
+ this.setState({
|
|
|
+ new_password: '',
|
|
|
+ repeat_password: '',
|
|
|
+ password: ''
|
|
|
+ });
|
|
|
+
|
|
|
+ _snackbar2.default.success(response.detail);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleError',
|
|
|
+ value: function handleError(rejection) {
|
|
|
+ if (rejection.status === 400) {
|
|
|
+ if (rejection.new_password) {
|
|
|
+ _snackbar2.default.error(rejection.new_password);
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.error(rejection.password);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.apiError(rejection);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'form',
|
|
|
+ { onSubmit: this.handleSubmit, className: 'form-horizontal' },
|
|
|
+ _react2.default.createElement('input', { type: 'type', style: { display: 'none' } }),
|
|
|
+ _react2.default.createElement('input', { type: 'password', style: { display: 'none' } }),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel panel-default panel-form' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-heading' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h3',
|
|
|
+ { className: 'panel-title' },
|
|
|
+ gettext("Change password")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("New password"), 'for': 'id_new_password',
|
|
|
+ labelClass: 'col-sm-4', controlClass: 'col-sm-8' },
|
|
|
+ _react2.default.createElement('input', { type: 'password', id: 'id_new_password', className: 'form-control',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('new_password'),
|
|
|
+ value: this.state.new_password })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("Repeat password"), 'for': 'id_repeat_password',
|
|
|
+ labelClass: 'col-sm-4', controlClass: 'col-sm-8' },
|
|
|
+ _react2.default.createElement('input', { type: 'password', id: 'id_repeat_password', className: 'form-control',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('repeat_password'),
|
|
|
+ value: this.state.repeat_password })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement('hr', null),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("Your current password"), 'for': 'id_password',
|
|
|
+ labelClass: 'col-sm-4', controlClass: 'col-sm-8' },
|
|
|
+ _react2.default.createElement('input', { type: 'password', id: 'id_password', className: 'form-control',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('password'),
|
|
|
+ value: this.state.password })
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-footer' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'row' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-sm-8 col-sm-offset-4' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { className: 'btn-primary', loading: this.state.isLoading },
|
|
|
+ gettext("Change password")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_form2.default);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../../index":121,"../../../services/ajax":128,"../../../services/snackbar":137,"../../../utils/validators":148,"../../button":55,"../../form":62,"../../form-group":61,"react":"react"}],76:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _changeEmail = require('./change-email');
|
|
|
+
|
|
|
+var _changeEmail2 = _interopRequireDefault(_changeEmail);
|
|
|
+
|
|
|
+var _changePassword = require('./change-password');
|
|
|
+
|
|
|
+var _changePassword2 = _interopRequireDefault(_changePassword);
|
|
|
+
|
|
|
+var _index = require('../../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _pageTitle = require('../../../services/page-title');
|
|
|
+
|
|
|
+var _pageTitle2 = _interopRequireDefault(_pageTitle);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'componentDidMount',
|
|
|
+ value: function componentDidMount() {
|
|
|
+ _pageTitle2.default.set({
|
|
|
+ title: gettext("Change email or password"),
|
|
|
+ parent: gettext("Change your options")
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(_changeEmail2.default, { user: this.props.user }),
|
|
|
+ _react2.default.createElement(_changePassword2.default, { user: this.props.user }),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'message-line' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'warning'
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: _index2.default.get('FORGOTTEN_PASSWORD_URL') },
|
|
|
+ gettext("Change forgotten password")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../../index":121,"../../../services/page-title":135,"./change-email":74,"./change-password":75,"react":"react"}],77:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _loader = require('./loader');
|
|
|
+
|
|
|
+var _loader2 = _interopRequireDefault(_loader);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-body panel-body-loading' },
|
|
|
+ _react2.default.createElement(_loader2.default, { className: 'loader loader-spaced' })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"./loader":64,"react":"react"}],78:[function(require,module,exports){
|
|
|
+"use strict";
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require("react");
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: "getHelpText",
|
|
|
+ value: function getHelpText() {
|
|
|
+ if (this.props.helpText) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ "p",
|
|
|
+ { className: "help-block" },
|
|
|
+ this.props.helpText
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "render",
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ "div",
|
|
|
+ { className: "panel-body panel-message-body" },
|
|
|
+ _react2.default.createElement(
|
|
|
+ "div",
|
|
|
+ { className: "message-icon" },
|
|
|
+ _react2.default.createElement(
|
|
|
+ "span",
|
|
|
+ { className: "material-icon" },
|
|
|
+ this.props.icon || 'info_outline'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ "div",
|
|
|
+ { className: "message-body" },
|
|
|
+ _react2.default.createElement(
|
|
|
+ "p",
|
|
|
+ { className: "lead" },
|
|
|
+ this.props.message
|
|
|
+ ),
|
|
|
+ this.getHelpText()
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"react":"react"}],79:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.LABELS = exports.STYLES = undefined;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _zxcvbn = require('../services/zxcvbn');
|
|
|
+
|
|
|
+var _zxcvbn2 = _interopRequireDefault(_zxcvbn);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+var STYLES = exports.STYLES = ['progress-bar-danger', 'progress-bar-warning', 'progress-bar-warning', 'progress-bar-primary', 'progress-bar-success'];
|
|
|
+
|
|
|
+var LABELS = exports.LABELS = [gettext("Entered password is very weak."), gettext("Entered password is weak."), gettext("Entered password is average."), gettext("Entered password is strong."), gettext("Entered password is very strong.")];
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this._score = 0;
|
|
|
+ _this._password = null;
|
|
|
+ _this._inputs = [];
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getScore',
|
|
|
+ value: function getScore(password, inputs) {
|
|
|
+ var _this2 = this;
|
|
|
+
|
|
|
+ var cacheStale = false;
|
|
|
+
|
|
|
+ if (password.trim() !== this._password) {
|
|
|
+ cacheStale = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (inputs.length !== this._inputs.length) {
|
|
|
+ cacheStale = true;
|
|
|
+ } else {
|
|
|
+ inputs.map(function (value, i) {
|
|
|
+ if (value.trim() !== _this2._inputs[i]) {
|
|
|
+ cacheStale = true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ if (cacheStale) {
|
|
|
+ this._score = _zxcvbn2.default.scorePassword(password, inputs);
|
|
|
+ this._password = password.trim();
|
|
|
+ this._inputs = inputs.map(function (value) {
|
|
|
+ return value.trim();
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ return this._score;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ var score = this.getScore(this.props.password, this.props.inputs);
|
|
|
+
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'help-block password-strength' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'progress' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: "progress-bar " + STYLES[score],
|
|
|
+ style: { width: 20 + 20 * score + '%' },
|
|
|
+ role: 'progress-bar',
|
|
|
+ 'aria-valuenow': score,
|
|
|
+ 'aria-valuemin': '0',
|
|
|
+ 'aria-valuemax': '4' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'sr-only' },
|
|
|
+ LABELS[score]
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'text-small' },
|
|
|
+ LABELS[score]
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../services/zxcvbn":139,"react":"react"}],80:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _avatar = require('../avatar');
|
|
|
+
|
|
|
+var _avatar2 = _interopRequireDefault(_avatar);
|
|
|
+
|
|
|
+var _followButton = require('./follow-button');
|
|
|
+
|
|
|
+var _followButton2 = _interopRequireDefault(_followButton);
|
|
|
+
|
|
|
+var _nav = require('./moderation/nav');
|
|
|
+
|
|
|
+var _nav2 = _interopRequireDefault(_nav);
|
|
|
+
|
|
|
+var _userStatus = require('../user-status');
|
|
|
+
|
|
|
+var _userStatus2 = _interopRequireDefault(_userStatus);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getUserStatus',
|
|
|
+ value: function getUserStatus() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'user-status-display' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _userStatus2.default,
|
|
|
+ { user: this.props.profile, status: this.props.profile.status },
|
|
|
+ _react2.default.createElement(_userStatus.StatusIcon, { user: this.props.profile,
|
|
|
+ status: this.props.profile.status }),
|
|
|
+ _react2.default.createElement(_userStatus.StatusLabel, { user: this.props.profile,
|
|
|
+ status: this.props.profile.status,
|
|
|
+ className: 'status-label' })
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getUserRank',
|
|
|
+ value: function getUserRank() {
|
|
|
+ if (this.props.profile.rank.is_tab) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'user-rank' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: this.props.profile.rank.absolute_url, className: 'item-title' },
|
|
|
+ this.props.profile.rank.name
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'user-rank' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'item-title' },
|
|
|
+ this.props.profile.rank.name
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getUserTitle',
|
|
|
+ value: function getUserTitle() {
|
|
|
+ if (this.props.profile.title) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'user-title' },
|
|
|
+ this.props.profile.title
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else if (this.props.profile.rank.title) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'user-title' },
|
|
|
+ this.props.profile.rank.title
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getJoinedOn',
|
|
|
+ value: function getJoinedOn() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ var title = interpolate(gettext("Joined on %(joined_on)s"), {
|
|
|
+ 'joined_on': this.props.profile.joined_on.format('LL, LT')
|
|
|
+ }, true);
|
|
|
+
|
|
|
+ var age = interpolate(gettext("Joined %(joined_on)s"), {
|
|
|
+ 'joined_on': this.props.profile.joined_on.fromNow()
|
|
|
+ }, true);
|
|
|
+
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'user-joined-on' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'abbr',
|
|
|
+ { title: title },
|
|
|
+ age
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getEmail',
|
|
|
+ value: function getEmail() {
|
|
|
+ if (this.props.profile.email) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'user-email' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: 'mailto:' + this.props.profile.email, className: 'item-title' },
|
|
|
+ this.props.profile.email
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getFollowButton',
|
|
|
+ value: function getFollowButton() {
|
|
|
+ if (this.props.profile.acl.can_follow) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_followButton2.default, { className: 'btn btn-aligned hidden-xs hidden-sm',
|
|
|
+ profile: this.props.profile });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getModerationButton',
|
|
|
+ value: function getModerationButton() {
|
|
|
+ if (this.props.profile.acl.can_moderate) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'btn-group btn-aligned hidden-xs hidden-sm' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { className: 'btn btn-default btn-moderate dropdown-toggle',
|
|
|
+ type: 'button',
|
|
|
+ 'data-toggle': 'dropdown',
|
|
|
+ 'aria-haspopup': 'true',
|
|
|
+ 'aria-expanded': 'false' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'tonality'
|
|
|
+ ),
|
|
|
+ gettext("Moderation")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(_nav2.default, { profile: this.props.profile })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'page-header' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'container' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'row' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-md-9 col-md-offset-3' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h1',
|
|
|
+ { className: 'pull-left' },
|
|
|
+ _react2.default.createElement(_avatar2.default, { user: this.props.profile, size: '100' }),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'user-name' },
|
|
|
+ this.props.profile.username
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ this.getFollowButton(),
|
|
|
+ this.getModerationButton(),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { className: 'btn btn-default btn-aligned btn-icon btn-dropdown-toggle hidden-md hidden-lg',
|
|
|
+ type: 'button',
|
|
|
+ onClick: this.props.toggleNav,
|
|
|
+ 'aria-haspopup': 'true',
|
|
|
+ 'aria-expanded': this.props.dropdown ? 'true' : 'false' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'i',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'menu'
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'header-stats' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'container' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'row' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-md-9 col-md-offset-3' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'list-inline' },
|
|
|
+ this.getUserStatus(),
|
|
|
+ this.getUserRank(),
|
|
|
+ this.getUserTitle(),
|
|
|
+ this.getJoinedOn(),
|
|
|
+ this.getEmail()
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../avatar":53,"../user-status":104,"./follow-button":82,"./moderation/nav":88,"react":"react"}],81:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _moment = require('moment');
|
|
|
+
|
|
|
+var _moment2 = _interopRequireDefault(_moment);
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _panelLoader = require('../panel-loader');
|
|
|
+
|
|
|
+var _panelLoader2 = _interopRequireDefault(_panelLoader);
|
|
|
+
|
|
|
+var _panelMessage = require('../panel-message');
|
|
|
+
|
|
|
+var _panelMessage2 = _interopRequireDefault(_panelMessage);
|
|
|
+
|
|
|
+var _index = require('../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _polls = require('../../services/polls');
|
|
|
+
|
|
|
+var _polls2 = _interopRequireDefault(_polls);
|
|
|
+
|
|
|
+var _pageTitle = require('../../services/page-title');
|
|
|
+
|
|
|
+var _pageTitle2 = _interopRequireDefault(_pageTitle);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.update = function (ban) {
|
|
|
+ if (ban.expires_on) {
|
|
|
+ ban.expires_on = (0, _moment2.default)(ban.expires_on);
|
|
|
+ }
|
|
|
+
|
|
|
+ _this.setState({
|
|
|
+ isLoaded: true,
|
|
|
+ error: null,
|
|
|
+
|
|
|
+ ban: ban
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.error = function (error) {
|
|
|
+ _this.setState({
|
|
|
+ isLoaded: true,
|
|
|
+ error: error.detail,
|
|
|
+ ban: null
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ if (_index2.default.has('PROFILE_BAN')) {
|
|
|
+ _this.initWithPreloadedData(_index2.default.pop('PROFILE_BAN'));
|
|
|
+ } else {
|
|
|
+ _this.initWithoutPreloadedData();
|
|
|
+ }
|
|
|
+
|
|
|
+ _this.startPolling(props.profile.api_url.ban);
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'initWithPreloadedData',
|
|
|
+ value: function initWithPreloadedData(ban) {
|
|
|
+ if (ban.expires_on) {
|
|
|
+ ban.expires_on = (0, _moment2.default)(ban.expires_on);
|
|
|
+ }
|
|
|
+
|
|
|
+ this.state = {
|
|
|
+ isLoaded: true,
|
|
|
+ ban: ban
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'initWithoutPreloadedData',
|
|
|
+ value: function initWithoutPreloadedData() {
|
|
|
+ this.state = {
|
|
|
+ isLoaded: false
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'startPolling',
|
|
|
+ value: function startPolling(api) {
|
|
|
+ _polls2.default.start({
|
|
|
+ poll: 'ban-details',
|
|
|
+ url: api,
|
|
|
+ frequency: 90 * 1000,
|
|
|
+ update: this.update,
|
|
|
+ error: this.error
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'componentDidMount',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function componentDidMount() {
|
|
|
+ _pageTitle2.default.set({
|
|
|
+ title: gettext("Ban details"),
|
|
|
+ parent: this.props.profile.username
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'componentWillUnmount',
|
|
|
+ value: function componentWillUnmount() {
|
|
|
+ _polls2.default.stop('ban-details');
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getUserMessage',
|
|
|
+ value: function getUserMessage() {
|
|
|
+ if (this.state.ban.user_message) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-body ban-message ban-user-message' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h4',
|
|
|
+ null,
|
|
|
+ gettext("User-shown ban message")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement('div', { className: 'lead', dangerouslySetInnerHTML: {
|
|
|
+ __html: this.state.ban.user_message.html
|
|
|
+ } })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getStaffMessage',
|
|
|
+ value: function getStaffMessage() {
|
|
|
+ if (this.state.ban.staff_message) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-body ban-message ban-staff-message' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h4',
|
|
|
+ null,
|
|
|
+ gettext("Team-shown ban message")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement('div', { className: 'lead', dangerouslySetInnerHTML: {
|
|
|
+ __html: this.state.ban.staff_message.html
|
|
|
+ } })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getExpirationMessage',
|
|
|
+ value: function getExpirationMessage() {
|
|
|
+ if (this.state.ban.expires_on) {
|
|
|
+ if (this.state.ban.expires_on.isAfter((0, _moment2.default)())) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ var _title = interpolate(gettext("This ban expires on %(expires_on)s."), {
|
|
|
+ 'expires_on': this.state.ban.expires_on.format('LL, LT')
|
|
|
+ }, true);
|
|
|
+
|
|
|
+ var message = interpolate(gettext("This ban expires %(expires_on)s."), {
|
|
|
+ 'expires_on': this.state.ban.expires_on.fromNow()
|
|
|
+ }, true);
|
|
|
+
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'abbr',
|
|
|
+ { title: _title },
|
|
|
+ message
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return gettext("This ban has expired.");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return interpolate(gettext("%(username)s's ban is permanent."), {
|
|
|
+ 'username': this.props.profile.username
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getPanelBody',
|
|
|
+ value: function getPanelBody() {
|
|
|
+ if (this.state.ban) {
|
|
|
+ if (Object.keys(this.state.ban).length) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ null,
|
|
|
+ this.getUserMessage(),
|
|
|
+ this.getStaffMessage(),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-body ban-expires' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h4',
|
|
|
+ null,
|
|
|
+ gettext("Ban expiration")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'lead' },
|
|
|
+ this.getExpirationMessage()
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(_panelMessage2.default, { message: gettext("No ban is active at the moment.") })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ } else if (this.state.error) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(_panelMessage2.default, { icon: 'error_outline',
|
|
|
+ message: this.state.error })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(_panelLoader2.default, null)
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'profile-ban-details' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel panel-default' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'panel-heading' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h3',
|
|
|
+ { className: 'panel-title' },
|
|
|
+ gettext("Ban details")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ this.getPanelBody()
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../index":121,"../../services/page-title":135,"../../services/polls":136,"../panel-loader":77,"../panel-message":78,"moment":"moment","react":"react"}],82:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _button = require('../button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _profile = require('../../reducers/profile');
|
|
|
+
|
|
|
+var _ajax = require('../../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _snackbar = require('../../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _store = require('../../services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.action = function () {
|
|
|
+ _this.setState({
|
|
|
+ isLoading: true
|
|
|
+ });
|
|
|
+
|
|
|
+ if (_this.props.profile.is_followed) {
|
|
|
+ _store2.default.dispatch((0, _profile.patchProfile)({
|
|
|
+ is_followed: false,
|
|
|
+ followers: _this.props.profile.followers - 1
|
|
|
+ }));
|
|
|
+ } else {
|
|
|
+ _store2.default.dispatch((0, _profile.patchProfile)({
|
|
|
+ is_followed: true,
|
|
|
+ followers: _this.props.profile.followers + 1
|
|
|
+ }));
|
|
|
+ }
|
|
|
+
|
|
|
+ _ajax2.default.post(_this.props.profile.api_url.follow).then(function (data) {
|
|
|
+ _this.setState({
|
|
|
+ isLoading: false
|
|
|
+ });
|
|
|
+
|
|
|
+ _store2.default.dispatch((0, _profile.patchProfile)(data));
|
|
|
+ }, function (rejection) {
|
|
|
+ _this.setState({
|
|
|
+ isLoading: false
|
|
|
+ });
|
|
|
+ _snackbar2.default.apiError(rejection);
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ isLoading: false
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getClassName',
|
|
|
+ value: function getClassName() {
|
|
|
+ if (this.props.profile.is_followed) {
|
|
|
+ return this.props.className + ' btn-default btn-following';
|
|
|
+ } else {
|
|
|
+ return this.props.className + ' btn-default btn-follow';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getIcon',
|
|
|
+ value: function getIcon() {
|
|
|
+ if (this.props.profile.is_followed) {
|
|
|
+ return 'favorite';
|
|
|
+ } else {
|
|
|
+ return 'favorite_border';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getLabel',
|
|
|
+ value: function getLabel() {
|
|
|
+ if (this.props.profile.is_followed) {
|
|
|
+ return gettext("Following");
|
|
|
+ } else {
|
|
|
+ return gettext("Follow");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { className: this.getClassName(),
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onClick: this.action },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ this.getIcon()
|
|
|
+ ),
|
|
|
+ this.getLabel()
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../reducers/profile":123,"../../services/ajax":128,"../../services/snackbar":137,"../../services/store":138,"../button":55,"react":"react"}],83:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _button = require('../button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _search = require('../search');
|
|
|
+
|
|
|
+var _search2 = _interopRequireDefault(_search);
|
|
|
+
|
|
|
+var _root = require('../users-list/root');
|
|
|
+
|
|
|
+var _root2 = _interopRequireDefault(_root);
|
|
|
+
|
|
|
+var _index = require('../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _users = require('../../reducers/users');
|
|
|
+
|
|
|
+var _ajax = require('../../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _snackbar = require('../../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _store = require('../../services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+var _pageTitle = require('../../services/page-title');
|
|
|
+
|
|
|
+var _pageTitle2 = _interopRequireDefault(_pageTitle);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.loadMore = function () {
|
|
|
+ _this.setState({
|
|
|
+ isBusy: true
|
|
|
+ });
|
|
|
+
|
|
|
+ _this.loadUsers(_this.state.page + 1, _this.state.search);
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.search = function (ev) {
|
|
|
+ _this.setState({
|
|
|
+ isLoaded: false,
|
|
|
+ isBusy: true,
|
|
|
+
|
|
|
+ search: ev.target.value,
|
|
|
+
|
|
|
+ count: 0,
|
|
|
+ more: 0,
|
|
|
+
|
|
|
+ page: 1,
|
|
|
+ pages: 1
|
|
|
+ });
|
|
|
+
|
|
|
+ _this.loadUsers(1, ev.target.value);
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.setSpecialProps();
|
|
|
+
|
|
|
+ if (_index2.default.has(_this.PRELOADED_DATA_KEY)) {
|
|
|
+ _this.initWithPreloadedData(_index2.default.pop(_this.PRELOADED_DATA_KEY));
|
|
|
+ } else {
|
|
|
+ _this.initWithoutPreloadedData();
|
|
|
+ }
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'setSpecialProps',
|
|
|
+ value: function setSpecialProps() {
|
|
|
+ this.PRELOADED_DATA_KEY = 'PROFILE_FOLLOWERS';
|
|
|
+ this.TITLE = gettext('Followers');
|
|
|
+ this.API_FILTER = 'followers';
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'initWithPreloadedData',
|
|
|
+ value: function initWithPreloadedData(data) {
|
|
|
+ this.state = {
|
|
|
+ isLoaded: true,
|
|
|
+ isBusy: false,
|
|
|
+
|
|
|
+ search: '',
|
|
|
+
|
|
|
+ count: data.count,
|
|
|
+ more: data.more,
|
|
|
+
|
|
|
+ page: data.page,
|
|
|
+ pages: data.pages
|
|
|
+ };
|
|
|
+
|
|
|
+ _store2.default.dispatch((0, _users.dehydrate)(data.results));
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'initWithoutPreloadedData',
|
|
|
+ value: function initWithoutPreloadedData() {
|
|
|
+ this.state = {
|
|
|
+ isLoaded: false,
|
|
|
+ isBusy: false,
|
|
|
+
|
|
|
+ search: '',
|
|
|
+
|
|
|
+ count: 0,
|
|
|
+ more: 0,
|
|
|
+
|
|
|
+ page: 1,
|
|
|
+ pages: 1
|
|
|
+ };
|
|
|
+
|
|
|
+ this.loadUsers();
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'loadUsers',
|
|
|
+ value: function loadUsers() {
|
|
|
+ var _ajax$get,
|
|
|
+ _this2 = this;
|
|
|
+
|
|
|
+ var page = arguments.length <= 0 || arguments[0] === undefined ? 1 : arguments[0];
|
|
|
+ var search = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
|
|
|
+
|
|
|
+ _ajax2.default.get(_index2.default.get('USERS_API'), (_ajax$get = {}, _defineProperty(_ajax$get, this.API_FILTER, this.props.profile.id), _defineProperty(_ajax$get, 'name', search), _defineProperty(_ajax$get, 'page', page || 1), _ajax$get), 'user-' + this.API_FILTER).then(function (data) {
|
|
|
+ if (page === 1) {
|
|
|
+ _store2.default.dispatch((0, _users.dehydrate)(data.results));
|
|
|
+ } else {
|
|
|
+ _store2.default.dispatch((0, _users.append)(data.results));
|
|
|
+ }
|
|
|
+
|
|
|
+ _this2.setState({
|
|
|
+ isLoaded: true,
|
|
|
+ isBusy: false,
|
|
|
+
|
|
|
+ count: data.count,
|
|
|
+ more: data.more,
|
|
|
+
|
|
|
+ page: data.page,
|
|
|
+ pages: data.pages
|
|
|
+ });
|
|
|
+ }, function (rejection) {
|
|
|
+ _snackbar2.default.apiError(rejection);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'componentDidMount',
|
|
|
+ value: function componentDidMount() {
|
|
|
+ _pageTitle2.default.set({
|
|
|
+ title: this.TITLE,
|
|
|
+ parent: this.props.profile.username
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'getLabel',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function getLabel() {
|
|
|
+ if (!this.state.isLoaded) {
|
|
|
+ return gettext('Loading...');
|
|
|
+ } else if (this.state.search) {
|
|
|
+ var message = ngettext("Found %(users)s user.", "Found %(users)s users.", this.state.count);
|
|
|
+
|
|
|
+ return interpolate(message, {
|
|
|
+ 'users': this.state.count
|
|
|
+ }, true);
|
|
|
+ } else if (this.props.profile.id === this.props.user.id) {
|
|
|
+ var message = ngettext("You have %(users)s follower.", "You have %(users)s followers.", this.state.count);
|
|
|
+
|
|
|
+ return interpolate(message, {
|
|
|
+ 'users': this.state.count
|
|
|
+ }, true);
|
|
|
+ } else {
|
|
|
+ var message = ngettext("%(username)s has %(users)s follower.", "%(username)s has %(users)s followers.", this.state.count);
|
|
|
+
|
|
|
+ return interpolate(message, {
|
|
|
+ 'username': this.props.profile.username,
|
|
|
+ 'users': this.state.count
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getEmptyMessage',
|
|
|
+ value: function getEmptyMessage() {
|
|
|
+ if (this.state.search) {
|
|
|
+ return gettext("Search returned no users matching specified criteria.");
|
|
|
+ } else if (this.props.user.id === this.props.profile.id) {
|
|
|
+ return gettext("You have no followers.");
|
|
|
+ } else {
|
|
|
+ return interpolate(gettext("%(username)s has no followers."), {
|
|
|
+ 'username': this.props.profile.username
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getMoreButton',
|
|
|
+ value: function getMoreButton() {
|
|
|
+ if (this.state.more) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'pager-more' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { loading: this.state.isBusy,
|
|
|
+ onClick: this.loadMore },
|
|
|
+ interpolate(gettext("Show more (%(more)s)"), {
|
|
|
+ 'more': this.state.more
|
|
|
+ }, true)
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getListBody',
|
|
|
+ value: function getListBody() {
|
|
|
+ if (this.state.isLoaded && this.state.count === 0) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'lead' },
|
|
|
+ this.getEmptyMessage()
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(_root2.default, { isLoaded: this.state.isLoaded,
|
|
|
+ users: this.props.users,
|
|
|
+ showRank: true,
|
|
|
+ cols: 2 }),
|
|
|
+ this.getMoreButton()
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getClassName',
|
|
|
+ value: function getClassName() {
|
|
|
+ return 'profile-' + this.API_FILTER;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: this.getClassName() },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'nav',
|
|
|
+ { className: 'toolbar' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h3',
|
|
|
+ { className: 'toolbar-left' },
|
|
|
+ this.getLabel()
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(_search2.default, { className: 'toolbar-right',
|
|
|
+ value: this.state.search,
|
|
|
+ onChange: this.search,
|
|
|
+ placeholder: gettext("Search history...") })
|
|
|
+ ),
|
|
|
+ this.getListBody()
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../index":121,"../../reducers/users":127,"../../services/ajax":128,"../../services/page-title":135,"../../services/snackbar":137,"../../services/store":138,"../button":55,"../search":97,"../users-list/root":106,"react":"react"}],84:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _followers = require('./followers');
|
|
|
+
|
|
|
+var _followers2 = _interopRequireDefault(_followers);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_Followers) {
|
|
|
+ _inherits(_class, _Followers);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'setSpecialProps',
|
|
|
+ value: function setSpecialProps() {
|
|
|
+ this.PRELOADED_DATA_KEY = 'PROFILE_FOLLOWS';
|
|
|
+ this.TITLE = gettext('Follows');
|
|
|
+ this.API_FILTER = 'follows';
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getLabel',
|
|
|
+ value: function getLabel() {
|
|
|
+ if (!this.state.isLoaded) {
|
|
|
+ return gettext('Loading...');
|
|
|
+ } else if (this.state.search) {
|
|
|
+ var message = ngettext("Found %(users)s user.", "Found %(users)s users.", this.state.count);
|
|
|
+
|
|
|
+ return interpolate(message, {
|
|
|
+ 'users': this.state.count
|
|
|
+ }, true);
|
|
|
+ } else if (this.props.profile.id === this.props.user.id) {
|
|
|
+ var message = ngettext("You are following %(users)s user.", "You are following %(users)s users.", this.state.count);
|
|
|
+
|
|
|
+ return interpolate(message, {
|
|
|
+ 'users': this.state.count
|
|
|
+ }, true);
|
|
|
+ } else {
|
|
|
+ var message = ngettext("%(username)s is following %(users)s user.", "%(username)s is following %(users)s users.", this.state.count);
|
|
|
+
|
|
|
+ return interpolate(message, {
|
|
|
+ 'username': this.props.profile.username,
|
|
|
+ 'users': this.state.count
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getEmptyMessage',
|
|
|
+ value: function getEmptyMessage() {
|
|
|
+ if (this.state.search) {
|
|
|
+ return gettext("Search returned no users matching specified criteria.");
|
|
|
+ } else if (this.props.user.id === this.props.profile.id) {
|
|
|
+ return gettext("You are not following any users.");
|
|
|
+ } else {
|
|
|
+ return interpolate(gettext("%(username)s is not following any users."), {
|
|
|
+ 'username': this.props.profile.username
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_followers2.default);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"./followers":83,"react":"react"}],85:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _button = require('../../button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _form = require('../../form');
|
|
|
+
|
|
|
+var _form2 = _interopRequireDefault(_form);
|
|
|
+
|
|
|
+var _formGroup = require('../../form-group');
|
|
|
+
|
|
|
+var _formGroup2 = _interopRequireDefault(_formGroup);
|
|
|
+
|
|
|
+var _modalLoader = require('../../modal-loader');
|
|
|
+
|
|
|
+var _modalLoader2 = _interopRequireDefault(_modalLoader);
|
|
|
+
|
|
|
+var _yesNoSwitch = require('../../yes-no-switch');
|
|
|
+
|
|
|
+var _yesNoSwitch2 = _interopRequireDefault(_yesNoSwitch);
|
|
|
+
|
|
|
+var _modalMessage = require('../../modal-message');
|
|
|
+
|
|
|
+var _modalMessage2 = _interopRequireDefault(_modalMessage);
|
|
|
+
|
|
|
+var _users = require('../../../reducers/users');
|
|
|
+
|
|
|
+var _ajax = require('../../../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _snackbar = require('../../../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _store = require('../../../services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_Form) {
|
|
|
+ _inherits(_class, _Form);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ isLoaded: false,
|
|
|
+ isLoading: false,
|
|
|
+ error: null,
|
|
|
+
|
|
|
+ is_avatar_locked: '',
|
|
|
+ avatar_lock_user_message: '',
|
|
|
+ avatar_lock_staff_message: ''
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'componentDidMount',
|
|
|
+ value: function componentDidMount() {
|
|
|
+ var _this2 = this;
|
|
|
+
|
|
|
+ _ajax2.default.get(this.props.profile.api_url.moderate_avatar).then(function (options) {
|
|
|
+ _this2.setState({
|
|
|
+ isLoaded: true,
|
|
|
+
|
|
|
+ is_avatar_locked: options.is_avatar_locked,
|
|
|
+ avatar_lock_user_message: options.avatar_lock_user_message,
|
|
|
+ avatar_lock_staff_message: options.avatar_lock_staff_message
|
|
|
+ });
|
|
|
+ }, function (rejection) {
|
|
|
+ _this2.setState({
|
|
|
+ isLoaded: true,
|
|
|
+ error: rejection.detail
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'clean',
|
|
|
+ value: function clean() {
|
|
|
+ if (this.isValid()) {
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.error(this.validate().username[0]);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'send',
|
|
|
+ value: function send() {
|
|
|
+ return _ajax2.default.post(this.props.profile.api_url.moderate_avatar, {
|
|
|
+ is_avatar_locked: this.state.is_avatar_locked,
|
|
|
+ avatar_lock_user_message: this.state.avatar_lock_user_message,
|
|
|
+ avatar_lock_staff_message: this.state.avatar_lock_staff_message
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleSuccess',
|
|
|
+ value: function handleSuccess(apiResponse) {
|
|
|
+ _store2.default.dispatch((0, _users.updateAvatar)(this.props.profile, apiResponse.avatar_hash));
|
|
|
+ _snackbar2.default.success(gettext("Avatar controls have been changed."));
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getFormBody',
|
|
|
+ value: function getFormBody() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'form',
|
|
|
+ { onSubmit: this.handleSubmit },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("Lock avatar"),
|
|
|
+ helpText: gettext("Locking user avatar will prohibit user from changing his avatar and will reset his/her avatar to default one."),
|
|
|
+ 'for': 'id_is_avatar_locked' },
|
|
|
+ _react2.default.createElement(_yesNoSwitch2.default, { id: 'id_is_avatar_locked',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ iconOn: 'lock_outline',
|
|
|
+ iconOff: 'lock_open',
|
|
|
+ labelOn: gettext("Disallow user from changing avatar"),
|
|
|
+ labelOff: gettext("Allow user to change avatar"),
|
|
|
+ onChange: this.bindInput('is_avatar_locked'),
|
|
|
+ value: this.state.is_avatar_locked })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("User message"),
|
|
|
+ helpText: gettext("Optional message for user explaining why he/she is prohibited form changing avatar."),
|
|
|
+ 'for': 'id_avatar_lock_user_message' },
|
|
|
+ _react2.default.createElement('textarea', { id: 'id_avatar_lock_user_message',
|
|
|
+ className: 'form-control',
|
|
|
+ rows: '4',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('avatar_lock_user_message'),
|
|
|
+ value: this.state.avatar_lock_user_message })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("Staff message"),
|
|
|
+ helpText: gettext("Optional message for forum team members explaining why user is prohibited form changing avatar."),
|
|
|
+ 'for': 'id_avatar_lock_staff_message' },
|
|
|
+ _react2.default.createElement('textarea', { id: 'id_avatar_lock_staff_message',
|
|
|
+ className: 'form-control',
|
|
|
+ rows: '4',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('avatar_lock_staff_message'),
|
|
|
+ value: this.state.avatar_lock_staff_message })
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-footer' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'btn btn-default', 'data-dismiss': 'modal' },
|
|
|
+ gettext("Close")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { className: 'btn-primary', loading: this.state.isLoading },
|
|
|
+ gettext("Save changes")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getModalBody',
|
|
|
+ value: function getModalBody() {
|
|
|
+ if (this.state.error) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_modalMessage2.default, { icon: 'remove_circle_outline',
|
|
|
+ message: this.state.error });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else if (this.state.isLoaded) {
|
|
|
+ return this.getFormBody();
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_modalLoader2.default, null);
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getClassName',
|
|
|
+ value: function getClassName() {
|
|
|
+ if (this.state.error) {
|
|
|
+ return "modal-dialog modal-message modal-avatar-controls";
|
|
|
+ } else {
|
|
|
+ return "modal-dialog modal-avatar-controls";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: this.getClassName(),
|
|
|
+ role: 'document' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-content' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-header' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'close', 'data-dismiss': 'modal',
|
|
|
+ 'aria-label': gettext("Close") },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { 'aria-hidden': 'true' },
|
|
|
+ '×'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h4',
|
|
|
+ { className: 'modal-title' },
|
|
|
+ gettext("Avatar controls")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ this.getModalBody()
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_form2.default);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../../reducers/users":127,"../../../services/ajax":128,"../../../services/snackbar":137,"../../../services/store":138,"../../button":55,"../../form":62,"../../form-group":61,"../../modal-loader":65,"../../modal-message":66,"../../yes-no-switch":120,"react":"react"}],86:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _button = require('../../button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _form = require('../../form');
|
|
|
+
|
|
|
+var _form2 = _interopRequireDefault(_form);
|
|
|
+
|
|
|
+var _formGroup = require('../../form-group');
|
|
|
+
|
|
|
+var _formGroup2 = _interopRequireDefault(_formGroup);
|
|
|
+
|
|
|
+var _modalLoader = require('../../modal-loader');
|
|
|
+
|
|
|
+var _modalLoader2 = _interopRequireDefault(_modalLoader);
|
|
|
+
|
|
|
+var _modalMessage = require('../../modal-message');
|
|
|
+
|
|
|
+var _modalMessage2 = _interopRequireDefault(_modalMessage);
|
|
|
+
|
|
|
+var _index = require('../../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _usernameHistory = require('../../../reducers/username-history');
|
|
|
+
|
|
|
+var _users = require('../../../reducers/users');
|
|
|
+
|
|
|
+var _ajax = require('../../../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _snackbar = require('../../../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _store = require('../../../services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+var _validators = require('../../../utils/validators');
|
|
|
+
|
|
|
+var validators = _interopRequireWildcard(_validators);
|
|
|
+
|
|
|
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_Form) {
|
|
|
+ _inherits(_class, _Form);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ isLoaded: false,
|
|
|
+ isLoading: false,
|
|
|
+ error: null,
|
|
|
+
|
|
|
+ username: '',
|
|
|
+ validators: {
|
|
|
+ username: [validators.usernameContent(), validators.usernameMinLength(_index2.default.get('SETTINGS')), validators.usernameMaxLength(_index2.default.get('SETTINGS'))]
|
|
|
+ }
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'componentDidMount',
|
|
|
+ value: function componentDidMount() {
|
|
|
+ var _this2 = this;
|
|
|
+
|
|
|
+ _ajax2.default.get(this.props.profile.api_url.moderate_username).then(function () {
|
|
|
+ _this2.setState({
|
|
|
+ isLoaded: true
|
|
|
+ });
|
|
|
+ }, function (rejection) {
|
|
|
+ _this2.setState({
|
|
|
+ isLoaded: true,
|
|
|
+ error: rejection.detail
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'clean',
|
|
|
+ value: function clean() {
|
|
|
+ if (this.isValid()) {
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.error(this.validate().username[0]);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'send',
|
|
|
+ value: function send() {
|
|
|
+ return _ajax2.default.post(this.props.profile.api_url.moderate_username, {
|
|
|
+ username: this.state.username
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleSuccess',
|
|
|
+ value: function handleSuccess(apiResponse) {
|
|
|
+ this.setState({
|
|
|
+ username: ''
|
|
|
+ });
|
|
|
+
|
|
|
+ _store2.default.dispatch((0, _usernameHistory.addNameChange)(apiResponse, this.props.profile, this.props.user));
|
|
|
+ _store2.default.dispatch((0, _users.updateUsername)(this.props.profile, apiResponse.username, apiResponse.slug));
|
|
|
+
|
|
|
+ _snackbar2.default.success(gettext("Username has been changed."));
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getFormBody',
|
|
|
+ value: function getFormBody() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'form',
|
|
|
+ { onSubmit: this.handleSubmit },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("New username"), 'for': 'id_username' },
|
|
|
+ _react2.default.createElement('input', { type: 'text', id: 'id_username', className: 'form-control',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('username'),
|
|
|
+ value: this.state.username })
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-footer' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'btn btn-default', 'data-dismiss': 'modal' },
|
|
|
+ gettext("Close")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { className: 'btn-primary', loading: this.state.isLoading },
|
|
|
+ gettext("Change username")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getModalBody',
|
|
|
+ value: function getModalBody() {
|
|
|
+ if (this.state.error) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_modalMessage2.default, { icon: 'remove_circle_outline',
|
|
|
+ message: this.state.error });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else if (this.state.isLoaded) {
|
|
|
+ return this.getFormBody();
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_modalLoader2.default, null);
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getClassName',
|
|
|
+ value: function getClassName() {
|
|
|
+ if (this.state.error) {
|
|
|
+ return "modal-dialog modal-message modal-rename-user";
|
|
|
+ } else {
|
|
|
+ return "modal-dialog modal-rename-user";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: this.getClassName(),
|
|
|
+ role: 'document' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-content' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-header' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'close', 'data-dismiss': 'modal',
|
|
|
+ 'aria-label': gettext("Close") },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { 'aria-hidden': 'true' },
|
|
|
+ '×'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h4',
|
|
|
+ { className: 'modal-title' },
|
|
|
+ gettext("Change username")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ this.getModalBody()
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_form2.default);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../../index":121,"../../../reducers/username-history":126,"../../../reducers/users":127,"../../../services/ajax":128,"../../../services/snackbar":137,"../../../services/store":138,"../../../utils/validators":148,"../../button":55,"../../form":62,"../../form-group":61,"../../modal-loader":65,"../../modal-message":66,"react":"react"}],87:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _button = require('../../button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _form = require('../../form');
|
|
|
+
|
|
|
+var _form2 = _interopRequireDefault(_form);
|
|
|
+
|
|
|
+var _formGroup = require('../../form-group');
|
|
|
+
|
|
|
+var _formGroup2 = _interopRequireDefault(_formGroup);
|
|
|
+
|
|
|
+var _modalLoader = require('../../modal-loader');
|
|
|
+
|
|
|
+var _modalLoader2 = _interopRequireDefault(_modalLoader);
|
|
|
+
|
|
|
+var _modalMessage = require('../../modal-message');
|
|
|
+
|
|
|
+var _modalMessage2 = _interopRequireDefault(_modalMessage);
|
|
|
+
|
|
|
+var _yesNoSwitch = require('../../yes-no-switch');
|
|
|
+
|
|
|
+var _yesNoSwitch2 = _interopRequireDefault(_yesNoSwitch);
|
|
|
+
|
|
|
+var _index = require('../../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _ajax = require('../../../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _polls = require('../../../services/polls');
|
|
|
+
|
|
|
+var _polls2 = _interopRequireDefault(_polls);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_Form) {
|
|
|
+ _inherits(_class, _Form);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.countdown = function () {
|
|
|
+ window.setTimeout(function () {
|
|
|
+ if (_this.state.countdown > 1) {
|
|
|
+ _this.setState({
|
|
|
+ countdown: _this.state.countdown - 1
|
|
|
+ });
|
|
|
+ _this.countdown();
|
|
|
+ } else if (!_this.state.confirm) {
|
|
|
+ _this.setState({
|
|
|
+ confirm: true
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, 1000);
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ isLoaded: false,
|
|
|
+ isLoading: false,
|
|
|
+ isDeleted: false,
|
|
|
+ error: null,
|
|
|
+
|
|
|
+ countdown: 5,
|
|
|
+ confirm: false,
|
|
|
+
|
|
|
+ with_content: false
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'componentDidMount',
|
|
|
+ value: function componentDidMount() {
|
|
|
+ var _this2 = this;
|
|
|
+
|
|
|
+ _ajax2.default.get(this.props.profile.api_url.delete).then(function () {
|
|
|
+ _this2.setState({
|
|
|
+ isLoaded: true
|
|
|
+ });
|
|
|
+
|
|
|
+ _this2.countdown();
|
|
|
+ }, function (rejection) {
|
|
|
+ _this2.setState({
|
|
|
+ isLoaded: true,
|
|
|
+ error: rejection.detail
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'send',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function send() {
|
|
|
+ return _ajax2.default.post(this.props.profile.api_url.delete, {
|
|
|
+ with_content: this.state.with_content
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleSuccess',
|
|
|
+ value: function handleSuccess() {
|
|
|
+ _polls2.default.stop('user-profile');
|
|
|
+
|
|
|
+ if (this.state.with_content) {
|
|
|
+ this.setState({
|
|
|
+ isDeleted: interpolate(gettext("%(username)s's account, threads, posts and other content has been deleted."), {
|
|
|
+ 'username': this.props.profile.username
|
|
|
+ }, true)
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ this.setState({
|
|
|
+ isDeleted: interpolate(gettext("%(username)s's account has been deleted and other content has been hidden."), {
|
|
|
+ 'username': this.props.profile.username
|
|
|
+ }, true)
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getButtonLabel',
|
|
|
+ value: function getButtonLabel() {
|
|
|
+ if (this.state.confirm) {
|
|
|
+ return interpolate(gettext("Delete %(username)s"), {
|
|
|
+ 'username': this.props.profile.username
|
|
|
+ }, true);
|
|
|
+ } else {
|
|
|
+ return interpolate(gettext("Please wait... (%(countdown)ss)"), {
|
|
|
+ 'countdown': this.state.countdown
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getForm',
|
|
|
+ value: function getForm() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'form',
|
|
|
+ { onSubmit: this.handleSubmit, className: 'form-horizontal' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("User content"),
|
|
|
+ labelClass: 'col-sm-4', controlClass: 'col-sm-8',
|
|
|
+ 'for': 'id_with_content' },
|
|
|
+ _react2.default.createElement(_yesNoSwitch2.default, { id: 'id_with_content',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ labelOn: gettext("Delete together with user's account"),
|
|
|
+ labelOff: gettext("Hide after deleting user's account"),
|
|
|
+ onChange: this.bindInput('with_content'),
|
|
|
+ value: this.state.with_content })
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-footer' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button',
|
|
|
+ className: 'btn btn-default',
|
|
|
+ 'data-dismiss': 'modal' },
|
|
|
+ gettext("Cancel")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { className: 'btn-danger',
|
|
|
+ loading: this.state.isLoading,
|
|
|
+ disabled: !this.state.confirm },
|
|
|
+ this.getButtonLabel()
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getDeletedBody',
|
|
|
+ value: function getDeletedBody() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-icon' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'info_outline'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'lead' },
|
|
|
+ this.state.isDeleted
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: _index2.default.get('USERS_LIST_URL') },
|
|
|
+ gettext("Return to users list")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getModalBody',
|
|
|
+ value: function getModalBody() {
|
|
|
+ if (this.state.error) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_modalMessage2.default, { icon: 'remove_circle_outline',
|
|
|
+ message: this.state.error });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else if (this.state.isLoaded) {
|
|
|
+ if (this.state.isDeleted) {
|
|
|
+ return this.getDeletedBody();
|
|
|
+ } else {
|
|
|
+ return this.getForm();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_modalLoader2.default, null);
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getClassName',
|
|
|
+ value: function getClassName() {
|
|
|
+ if (this.state.error || this.state.isDeleted) {
|
|
|
+ return "modal-dialog modal-message modal-delete-account";
|
|
|
+ } else {
|
|
|
+ return "modal-dialog modal-delete-account";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: this.getClassName(),
|
|
|
+ role: 'document' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-content' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-header' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'close', 'data-dismiss': 'modal',
|
|
|
+ 'aria-label': gettext("Close") },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { 'aria-hidden': 'true' },
|
|
|
+ '×'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h4',
|
|
|
+ { className: 'modal-title' },
|
|
|
+ gettext("Delete user account")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ this.getModalBody()
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_form2.default);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../../index":121,"../../../services/ajax":128,"../../../services/polls":136,"../../button":55,"../../form":62,"../../form-group":61,"../../modal-loader":65,"../../modal-message":66,"../../yes-no-switch":120,"react":"react"}],88:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _reactRedux = require('react-redux');
|
|
|
+
|
|
|
+var _avatarControls = require('./avatar-controls');
|
|
|
+
|
|
|
+var _avatarControls2 = _interopRequireDefault(_avatarControls);
|
|
|
+
|
|
|
+var _changeUsername = require('./change-username');
|
|
|
+
|
|
|
+var _changeUsername2 = _interopRequireDefault(_changeUsername);
|
|
|
+
|
|
|
+var _deleteAccount = require('./delete-account');
|
|
|
+
|
|
|
+var _deleteAccount2 = _interopRequireDefault(_deleteAccount);
|
|
|
+
|
|
|
+var _modal = require('../../../services/modal');
|
|
|
+
|
|
|
+var _modal2 = _interopRequireDefault(_modal);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+/* jshint ignore:start */
|
|
|
+var select = function select(store) {
|
|
|
+ return {
|
|
|
+ tick: store.tick,
|
|
|
+ user: store.auth,
|
|
|
+ profile: store.profile
|
|
|
+ };
|
|
|
+};
|
|
|
+/* jshint ignore:end */
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ var _Object$getPrototypeO;
|
|
|
+
|
|
|
+ var _temp, _this, _ret;
|
|
|
+
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
+ args[_key] = arguments[_key];
|
|
|
+ }
|
|
|
+
|
|
|
+ return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_Object$getPrototypeO = Object.getPrototypeOf(_class)).call.apply(_Object$getPrototypeO, [this].concat(args))), _this), _this.showAvatarDialog = function () {
|
|
|
+ _modal2.default.show((0, _reactRedux.connect)(select)(_avatarControls2.default));
|
|
|
+ }, _this.showRenameDialog = function () {
|
|
|
+ _modal2.default.show((0, _reactRedux.connect)(select)(_changeUsername2.default));
|
|
|
+ }, _this.showDeleteDialog = function () {
|
|
|
+ _modal2.default.show((0, _reactRedux.connect)(select)(_deleteAccount2.default));
|
|
|
+ }, _temp), _possibleConstructorReturn(_this, _ret);
|
|
|
+ }
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getAvatarButton',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function getAvatarButton() {
|
|
|
+ if (this.props.profile.acl.can_moderate_avatar) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'btn-link',
|
|
|
+ onClick: this.showAvatarDialog },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'portrait'
|
|
|
+ ),
|
|
|
+ gettext("Avatar controls")
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'getRenameButton',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function getRenameButton() {
|
|
|
+ if (this.props.profile.acl.can_rename) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'btn-link',
|
|
|
+ onClick: this.showRenameDialog },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'credit_card'
|
|
|
+ ),
|
|
|
+ gettext("Change username")
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'getDeleteButton',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function getDeleteButton() {
|
|
|
+ if (this.props.profile.acl.can_delete) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'btn-link',
|
|
|
+ onClick: this.showDeleteDialog },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'clear'
|
|
|
+ ),
|
|
|
+ gettext("Delete account")
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'dropdown-menu dropdown-menu-right', role: 'menu' },
|
|
|
+ this.getAvatarButton(),
|
|
|
+ this.getRenameButton(),
|
|
|
+ this.getDeleteButton(),
|
|
|
+ _react2.default.createElement('li', { className: 'divider hidden-md hidden-lg' }),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'dropdown-buttons hidden-md hidden-lg' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'btn btn-default btn-block',
|
|
|
+ onClick: this.props.toggleNav },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'menu'
|
|
|
+ ),
|
|
|
+ gettext("Menu")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../../services/modal":134,"./avatar-controls":85,"./change-username":86,"./delete-account":87,"react":"react","react-redux":"react-redux"}],89:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.CompactNav = exports.SideNav = undefined;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _reactRouter = require('react-router');
|
|
|
+
|
|
|
+var _li = require('../li');
|
|
|
+
|
|
|
+var _li2 = _interopRequireDefault(_li);
|
|
|
+
|
|
|
+var _followButton = require('./follow-button');
|
|
|
+
|
|
|
+var _followButton2 = _interopRequireDefault(_followButton);
|
|
|
+
|
|
|
+var _index = require('../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+//jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+//jshint ignore:line
|
|
|
+
|
|
|
+var SideNav = exports.SideNav = function (_React$Component) {
|
|
|
+ _inherits(SideNav, _React$Component);
|
|
|
+
|
|
|
+ function SideNav() {
|
|
|
+ _classCallCheck(this, SideNav);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(SideNav).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(SideNav, [{
|
|
|
+ key: 'getMeta',
|
|
|
+ value: function getMeta(meta) {
|
|
|
+ if (meta) {
|
|
|
+ // jshint ignore:start
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'badge' },
|
|
|
+ this.props.profile[meta.attr]
|
|
|
+ );
|
|
|
+ // jshint ignore:end
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ var _this2 = this;
|
|
|
+
|
|
|
+ // jshint ignore:start
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'list-group nav-side' },
|
|
|
+ this.props.pages.map(function (page) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ _reactRouter.Link,
|
|
|
+ { to: _this2.props.baseUrl + page.component + '/',
|
|
|
+ className: 'list-group-item',
|
|
|
+ activeClassName: 'active',
|
|
|
+ key: page.component },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ page.icon
|
|
|
+ ),
|
|
|
+ page.name,
|
|
|
+ _this2.getMeta(page.meta)
|
|
|
+ );
|
|
|
+ })
|
|
|
+ );
|
|
|
+ // jshint ignore:end
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return SideNav;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var CompactNav = exports.CompactNav = function (_SideNav) {
|
|
|
+ _inherits(CompactNav, _SideNav);
|
|
|
+
|
|
|
+ function CompactNav() {
|
|
|
+ _classCallCheck(this, CompactNav);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(CompactNav).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(CompactNav, [{
|
|
|
+ key: 'showSpecialOptions',
|
|
|
+ value: function showSpecialOptions() {
|
|
|
+ return this.props.profile.acl.can_follow || this.props.profile.acl.can_moderate;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getFollowButton',
|
|
|
+ value: function getFollowButton() {
|
|
|
+ if (this.props.profile.acl.can_follow) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_followButton2.default, { className: 'btn btn-block',
|
|
|
+ profile: this.props.profile });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getModerationButton',
|
|
|
+ value: function getModerationButton() {
|
|
|
+ if (this.props.profile.acl.can_moderate) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'btn btn-default btn-block',
|
|
|
+ onClick: this.props.toggleModeration },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'tonality'
|
|
|
+ ),
|
|
|
+ gettext("Moderation")
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getSpecialOptions',
|
|
|
+ value: function getSpecialOptions() {
|
|
|
+ if (this.showSpecialOptions()) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'dropdown-buttons' },
|
|
|
+ this.getFollowButton(),
|
|
|
+ this.getModerationButton()
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ var _this4 = this;
|
|
|
+
|
|
|
+ // jshint ignore:start
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'dropdown-menu', role: 'menu' },
|
|
|
+ this.getSpecialOptions(),
|
|
|
+ this.showSpecialOptions() ? _react2.default.createElement('li', { className: 'divider' }) : null,
|
|
|
+ this.props.pages.map(function (page) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ _li2.default,
|
|
|
+ { path: _this4.props.baseUrl + page.component + '/',
|
|
|
+ key: page.component },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _reactRouter.Link,
|
|
|
+ { to: _this4.props.baseUrl + page.component + '/',
|
|
|
+ onClick: _this4.props.hideNav },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ page.icon
|
|
|
+ ),
|
|
|
+ page.name,
|
|
|
+ _this4.getMeta(page.meta)
|
|
|
+ )
|
|
|
+ );
|
|
|
+ })
|
|
|
+ );
|
|
|
+ // jshint ignore:end
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return CompactNav;
|
|
|
+}(SideNav);
|
|
|
+
|
|
|
+},{"../../index":121,"../li":63,"./follow-button":82,"react":"react","react-router":"react-router"}],90:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.select = select;
|
|
|
+exports.paths = paths;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _reactRedux = require('react-redux');
|
|
|
+
|
|
|
+var _avatar = require('../avatar');
|
|
|
+
|
|
|
+var _avatar2 = _interopRequireDefault(_avatar);
|
|
|
+
|
|
|
+var _banDetails = require('./ban-details');
|
|
|
+
|
|
|
+var _banDetails2 = _interopRequireDefault(_banDetails);
|
|
|
+
|
|
|
+var _followers = require('./followers');
|
|
|
+
|
|
|
+var _followers2 = _interopRequireDefault(_followers);
|
|
|
+
|
|
|
+var _follows = require('./follows');
|
|
|
+
|
|
|
+var _follows2 = _interopRequireDefault(_follows);
|
|
|
+
|
|
|
+var _usernameHistory = require('./username-history');
|
|
|
+
|
|
|
+var _usernameHistory2 = _interopRequireDefault(_usernameHistory);
|
|
|
+
|
|
|
+var _Header = require('./Header');
|
|
|
+
|
|
|
+var _Header2 = _interopRequireDefault(_Header);
|
|
|
+
|
|
|
+var _nav = require('./moderation/nav');
|
|
|
+
|
|
|
+var _nav2 = _interopRequireDefault(_nav);
|
|
|
+
|
|
|
+var _navs = require('./navs');
|
|
|
+
|
|
|
+var _index = require('../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _profile = require('../../reducers/profile');
|
|
|
+
|
|
|
+var _polls = require('../../services/polls');
|
|
|
+
|
|
|
+var _polls2 = _interopRequireDefault(_polls);
|
|
|
+
|
|
|
+var _store = require('../../services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.update = function (data) {
|
|
|
+ _store2.default.dispatch((0, _profile.dehydrate)(data));
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.toggleNav = function () {
|
|
|
+ if (_this.state.dropdown === 'pages') {
|
|
|
+ _this.setState({
|
|
|
+ dropdown: false
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ _this.setState({
|
|
|
+ dropdown: 'pages'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.toggleModeration = function () {
|
|
|
+ if (_this.state.dropdown === 'moderation') {
|
|
|
+ _this.setState({
|
|
|
+ dropdown: false
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ _this.setState({
|
|
|
+ dropdown: 'moderation'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.hideNav = function () {
|
|
|
+ _this.setState({
|
|
|
+ dropdown: false
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ dropdown: false
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.startPolling(props.profile.api_url.root);
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'startPolling',
|
|
|
+ value: function startPolling(api) {
|
|
|
+ _polls2.default.start({
|
|
|
+ poll: 'user-profile',
|
|
|
+ url: api,
|
|
|
+ frequency: 90 * 1000,
|
|
|
+ update: this.update
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'getToggleNavClassName',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function getToggleNavClassName() {
|
|
|
+ if (this.state.dropdown) {
|
|
|
+ return 'btn btn-default btn-icon open';
|
|
|
+ } else {
|
|
|
+ return 'btn btn-default btn-icon';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getCompactNavClassName',
|
|
|
+ value: function getCompactNavClassName() {
|
|
|
+ if (this.state.dropdown) {
|
|
|
+ return 'compact-nav open';
|
|
|
+ } else {
|
|
|
+ return 'compact-nav';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getNavDropdown',
|
|
|
+ value: function getNavDropdown() {
|
|
|
+ if (this.state.dropdown === 'pages') {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_navs.CompactNav, { pages: _index2.default.get('PROFILE_PAGES'),
|
|
|
+ baseUrl: _index2.default.get('PROFILE').absolute_url,
|
|
|
+ profile: this.props.profile,
|
|
|
+ toggleModeration: this.toggleModeration,
|
|
|
+ hideNav: this.hideNav });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else if (this.state.dropdown === 'moderation') {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_nav2.default, { profile: this.props.profile,
|
|
|
+ toggleNav: this.toggleNav,
|
|
|
+ hideNav: this.hideNav });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getClassName',
|
|
|
+ value: function getClassName() {
|
|
|
+ var baseClass = 'page page-user-profile';
|
|
|
+ if (false && this.props.profile.rank.css_class) {
|
|
|
+ return baseClass + ' page-user-profile-' + this.props.profile.rank.css_class;
|
|
|
+ } else {
|
|
|
+ return baseClass;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: this.getClassName() },
|
|
|
+ _react2.default.createElement(_Header2.default, { user: this.props.user,
|
|
|
+ profile: this.props.profile,
|
|
|
+ toggleNav: this.toggleNav,
|
|
|
+ toggleModeration: this.toggleModeration }),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: this.getCompactNavClassName() },
|
|
|
+ this.getNavDropdown()
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'container' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'row' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-md-3 hidden-xs hidden-sm' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'profile-side-avatar' },
|
|
|
+ _react2.default.createElement(_avatar2.default, { user: this.props.profile, size: '400' })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(_navs.SideNav, { pages: _index2.default.get('PROFILE_PAGES'),
|
|
|
+ baseUrl: _index2.default.get('PROFILE').absolute_url,
|
|
|
+ profile: this.props.profile })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-md-9' },
|
|
|
+ this.props.children
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+function select(store) {
|
|
|
+ return {
|
|
|
+ 'tick': store.tick.tick,
|
|
|
+ 'user': store.auth.user,
|
|
|
+ 'users': store.users,
|
|
|
+ 'profile': store.profile,
|
|
|
+ 'username-history': store['username-history']
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+var Placeholder = function (_React$Component2) {
|
|
|
+ _inherits(Placeholder, _React$Component2);
|
|
|
+
|
|
|
+ function Placeholder() {
|
|
|
+ _classCallCheck(this, Placeholder);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(Placeholder).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(Placeholder, [{
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ // jshint ignore:start
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'container' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ null,
|
|
|
+ "Hello, I'm placeholder for " + this.props.route.name
|
|
|
+ )
|
|
|
+ );
|
|
|
+ // jshint ignore:end
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return Placeholder;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var COMPONENTS = {
|
|
|
+ 'posts': Placeholder,
|
|
|
+ 'threads': Placeholder,
|
|
|
+ 'followers': _followers2.default,
|
|
|
+ 'follows': _follows2.default,
|
|
|
+ 'username-history': _usernameHistory2.default,
|
|
|
+ 'ban-details': _banDetails2.default
|
|
|
+};
|
|
|
+
|
|
|
+function paths() {
|
|
|
+ var paths = [];
|
|
|
+
|
|
|
+ _index2.default.get('PROFILE_PAGES').forEach(function (item) {
|
|
|
+ paths.push(Object.assign({}, item, {
|
|
|
+ path: _index2.default.get('PROFILE').absolute_url + item.component + '/',
|
|
|
+ component: (0, _reactRedux.connect)(select)(COMPONENTS[item.component])
|
|
|
+ }));
|
|
|
+ });
|
|
|
+
|
|
|
+ return paths;
|
|
|
+}
|
|
|
+
|
|
|
+},{"../../index":121,"../../reducers/profile":123,"../../services/polls":136,"../../services/store":138,"../avatar":53,"./Header":80,"./ban-details":81,"./followers":83,"./follows":84,"./moderation/nav":88,"./navs":89,"./username-history":91,"react":"react","react-redux":"react-redux"}],91:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _button = require('../button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _search = require('../search');
|
|
|
+
|
|
|
+var _search2 = _interopRequireDefault(_search);
|
|
|
+
|
|
|
+var _usernameHistory = require('../username-history');
|
|
|
+
|
|
|
+var _usernameHistory2 = _interopRequireDefault(_usernameHistory);
|
|
|
+
|
|
|
+var _index = require('../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _usernameHistory3 = require('../../reducers/username-history');
|
|
|
+
|
|
|
+var _ajax = require('../../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _snackbar = require('../../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _store = require('../../services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+var _pageTitle = require('../../services/page-title');
|
|
|
+
|
|
|
+var _pageTitle2 = _interopRequireDefault(_pageTitle);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.loadMore = function () {
|
|
|
+ _this.setState({
|
|
|
+ isBusy: true
|
|
|
+ });
|
|
|
+
|
|
|
+ _this.loadChanges(_this.state.page + 1, _this.state.search);
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.search = function (ev) {
|
|
|
+ _this.setState({
|
|
|
+ isLoaded: false,
|
|
|
+ isBusy: true,
|
|
|
+
|
|
|
+ search: ev.target.value,
|
|
|
+
|
|
|
+ count: 0,
|
|
|
+ more: 0,
|
|
|
+
|
|
|
+ page: 1,
|
|
|
+ pages: 1
|
|
|
+ });
|
|
|
+
|
|
|
+ _this.loadChanges(1, ev.target.value);
|
|
|
+ };
|
|
|
+
|
|
|
+ if (_index2.default.has('PROFILE_NAME_HISTORY')) {
|
|
|
+ _this.initWithPreloadedData(_index2.default.pop('PROFILE_NAME_HISTORY'));
|
|
|
+ } else {
|
|
|
+ _this.initWithoutPreloadedData();
|
|
|
+ }
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'initWithPreloadedData',
|
|
|
+ value: function initWithPreloadedData(data) {
|
|
|
+ this.state = {
|
|
|
+ isLoaded: true,
|
|
|
+ isBusy: false,
|
|
|
+
|
|
|
+ search: '',
|
|
|
+
|
|
|
+ count: data.count,
|
|
|
+ more: data.more,
|
|
|
+
|
|
|
+ page: data.page,
|
|
|
+ pages: data.pages
|
|
|
+ };
|
|
|
+
|
|
|
+ _store2.default.dispatch((0, _usernameHistory3.dehydrate)(data.results));
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'initWithoutPreloadedData',
|
|
|
+ value: function initWithoutPreloadedData() {
|
|
|
+ this.state = {
|
|
|
+ isLoaded: false,
|
|
|
+ isBusy: false,
|
|
|
+
|
|
|
+ search: '',
|
|
|
+
|
|
|
+ count: 0,
|
|
|
+ more: 0,
|
|
|
+
|
|
|
+ page: 1,
|
|
|
+ pages: 1
|
|
|
+ };
|
|
|
+
|
|
|
+ this.loadChanges();
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'loadChanges',
|
|
|
+ value: function loadChanges() {
|
|
|
+ var _this2 = this;
|
|
|
+
|
|
|
+ var page = arguments.length <= 0 || arguments[0] === undefined ? 1 : arguments[0];
|
|
|
+ var search = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
|
|
|
+
|
|
|
+ _ajax2.default.get(_index2.default.get('USERNAME_CHANGES_API'), {
|
|
|
+ user: this.props.profile.id,
|
|
|
+ search: search,
|
|
|
+ page: page || 1
|
|
|
+ }, 'search-username-history').then(function (data) {
|
|
|
+ if (page === 1) {
|
|
|
+ _store2.default.dispatch((0, _usernameHistory3.dehydrate)(data.results));
|
|
|
+ } else {
|
|
|
+ _store2.default.dispatch((0, _usernameHistory3.append)(data.results));
|
|
|
+ }
|
|
|
+
|
|
|
+ _this2.setState({
|
|
|
+ isLoaded: true,
|
|
|
+ isBusy: false,
|
|
|
+
|
|
|
+ count: data.count,
|
|
|
+ more: data.more,
|
|
|
+
|
|
|
+ page: data.page,
|
|
|
+ pages: data.pages
|
|
|
+ });
|
|
|
+ }, function (rejection) {
|
|
|
+ _snackbar2.default.apiError(rejection);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'componentDidMount',
|
|
|
+ value: function componentDidMount() {
|
|
|
+ _pageTitle2.default.set({
|
|
|
+ title: gettext("Username history"),
|
|
|
+ parent: this.props.profile.username
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'getLabel',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function getLabel() {
|
|
|
+ if (!this.state.isLoaded) {
|
|
|
+ return gettext('Loading...');
|
|
|
+ } else if (this.state.search) {
|
|
|
+ var message = ngettext("Found %(changes)s username change.", "Found %(changes)s username changes.", this.state.count);
|
|
|
+
|
|
|
+ return interpolate(message, {
|
|
|
+ 'changes': this.state.count
|
|
|
+ }, true);
|
|
|
+ } else if (this.props.profile.id === this.props.user.id) {
|
|
|
+ var message = ngettext("Your username was changed %(changes)s time.", "Your username was changed %(changes)s times.", this.state.count);
|
|
|
+
|
|
|
+ return interpolate(message, {
|
|
|
+ 'changes': this.state.count
|
|
|
+ }, true);
|
|
|
+ } else {
|
|
|
+ var message = ngettext("%(username)s's username was changed %(changes)s time.", "%(username)s's username was changed %(changes)s times.", this.state.count);
|
|
|
+
|
|
|
+ return interpolate(message, {
|
|
|
+ 'username': this.props.profile.username,
|
|
|
+ 'changes': this.state.count
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getEmptyMessage',
|
|
|
+ value: function getEmptyMessage() {
|
|
|
+ if (this.state.search) {
|
|
|
+ return gettext("Search returned no username changes matching specified criteria.");
|
|
|
+ } else if (this.props.user.id === this.props.profile.id) {
|
|
|
+ return gettext("No name changes have been recorded for your account.");
|
|
|
+ } else {
|
|
|
+ return interpolate(gettext("%(username)s's username was never changed."), {
|
|
|
+ 'username': this.props.profile.username
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getMoreButton',
|
|
|
+ value: function getMoreButton() {
|
|
|
+ if (this.state.more) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'pager-more' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { loading: this.state.isBusy,
|
|
|
+ onClick: this.loadMore },
|
|
|
+ interpolate(gettext("Show older (%(more)s)"), {
|
|
|
+ 'more': this.state.more
|
|
|
+ }, true)
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'profile-username-history' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'nav',
|
|
|
+ { className: 'toolbar' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h3',
|
|
|
+ { className: 'toolbar-left' },
|
|
|
+ this.getLabel()
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(_search2.default, { className: 'toolbar-right',
|
|
|
+ value: this.state.search,
|
|
|
+ onChange: this.search,
|
|
|
+ placeholder: gettext("Search history...") })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(_usernameHistory2.default, { isLoaded: this.state.isLoaded,
|
|
|
+ emptyMessage: this.getEmptyMessage(),
|
|
|
+ changes: this.props['username-history'] }),
|
|
|
+ this.getMoreButton()
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../index":121,"../../reducers/username-history":126,"../../services/ajax":128,"../../services/page-title":135,"../../services/snackbar":137,"../../services/store":138,"../button":55,"../search":97,"../username-history":105,"react":"react"}],92:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _loader = require('./loader');
|
|
|
+
|
|
|
+var _loader2 = _interopRequireDefault(_loader);
|
|
|
+
|
|
|
+var _register = require('./register.js');
|
|
|
+
|
|
|
+var _register2 = _interopRequireDefault(_register);
|
|
|
+
|
|
|
+var _captcha = require('../services/captcha');
|
|
|
+
|
|
|
+var _captcha2 = _interopRequireDefault(_captcha);
|
|
|
+
|
|
|
+var _modal = require('../services/modal');
|
|
|
+
|
|
|
+var _modal2 = _interopRequireDefault(_modal);
|
|
|
+
|
|
|
+var _snackbar = require('../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _zxcvbn = require('../services/zxcvbn');
|
|
|
+
|
|
|
+var _zxcvbn2 = _interopRequireDefault(_zxcvbn);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.showRegisterModal = function () {
|
|
|
+ if (misago.get('SETTINGS').account_activation === 'closed') {
|
|
|
+ _snackbar2.default.info(gettext("New registrations are currently disabled."));
|
|
|
+ } else if (_this.state.isLoaded) {
|
|
|
+ _modal2.default.show(_register2.default);
|
|
|
+ } else {
|
|
|
+ _this.setState({
|
|
|
+ 'isLoading': true
|
|
|
+ });
|
|
|
+
|
|
|
+ Promise.all([_captcha2.default.load(), _zxcvbn2.default.load()]).then(function () {
|
|
|
+ if (!_this.state.isLoaded) {
|
|
|
+ _this.setState({
|
|
|
+ 'isLoading': false,
|
|
|
+ 'isLoaded': false
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ _modal2.default.show(_register2.default);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ 'isLoading': false,
|
|
|
+ 'isLoaded': false
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getClassName',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function getClassName() {
|
|
|
+ return this.props.className + (this.state.isLoading ? ' btn-loading' : '');
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', onClick: this.showRegisterModal,
|
|
|
+ className: 'btn ' + this.getClassName(),
|
|
|
+ disabled: this.state.isLoaded },
|
|
|
+ gettext("Register"),
|
|
|
+ this.state.isLoading ? _react2.default.createElement(_loader2.default, null) : null
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../services/captcha":130,"../services/modal":134,"../services/snackbar":137,"../services/zxcvbn":139,"./loader":64,"./register.js":93,"react":"react"}],93:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.RegisterComplete = exports.RegisterForm = undefined;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _button = require('./button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _form = require('./form');
|
|
|
+
|
|
|
+var _form2 = _interopRequireDefault(_form);
|
|
|
+
|
|
|
+var _formGroup = require('./form-group');
|
|
|
+
|
|
|
+var _formGroup2 = _interopRequireDefault(_formGroup);
|
|
|
+
|
|
|
+var _passwordStrength = require('./password-strength');
|
|
|
+
|
|
|
+var _passwordStrength2 = _interopRequireDefault(_passwordStrength);
|
|
|
+
|
|
|
+var _index = require('../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _ajax = require('../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _auth = require('../services/auth');
|
|
|
+
|
|
|
+var _auth2 = _interopRequireDefault(_auth);
|
|
|
+
|
|
|
+var _captcha = require('../services/captcha');
|
|
|
+
|
|
|
+var _captcha2 = _interopRequireDefault(_captcha);
|
|
|
+
|
|
|
+var _modal = require('../services/modal');
|
|
|
+
|
|
|
+var _modal2 = _interopRequireDefault(_modal);
|
|
|
+
|
|
|
+var _snackbar = require('../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _bannedPage = require('../utils/banned-page');
|
|
|
+
|
|
|
+var _bannedPage2 = _interopRequireDefault(_bannedPage);
|
|
|
+
|
|
|
+var _validators = require('../utils/validators');
|
|
|
+
|
|
|
+var validators = _interopRequireWildcard(_validators);
|
|
|
+
|
|
|
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var RegisterForm = exports.RegisterForm = function (_Form) {
|
|
|
+ _inherits(RegisterForm, _Form);
|
|
|
+
|
|
|
+ function RegisterForm(props) {
|
|
|
+ _classCallCheck(this, RegisterForm);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(RegisterForm).call(this, props));
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ isLoading: false,
|
|
|
+
|
|
|
+ username: '',
|
|
|
+ email: '',
|
|
|
+ password: '',
|
|
|
+ captcha: '',
|
|
|
+
|
|
|
+ validators: {
|
|
|
+ username: [validators.usernameContent(), validators.usernameMinLength(_index2.default.get('SETTINGS')), validators.usernameMaxLength(_index2.default.get('SETTINGS'))],
|
|
|
+ email: [validators.email()],
|
|
|
+ password: [validators.passwordMinLength(_index2.default.get('SETTINGS'))],
|
|
|
+ captcha: _captcha2.default.validator()
|
|
|
+ },
|
|
|
+
|
|
|
+ errors: {}
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(RegisterForm, [{
|
|
|
+ key: 'clean',
|
|
|
+ value: function clean() {
|
|
|
+ if (this.isValid()) {
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.error(gettext("Form contains errors."));
|
|
|
+ this.setState({
|
|
|
+ errors: this.validate()
|
|
|
+ });
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'send',
|
|
|
+ value: function send() {
|
|
|
+ return _ajax2.default.post(_index2.default.get('USERS_API'), {
|
|
|
+ username: this.state.username,
|
|
|
+ email: this.state.email,
|
|
|
+ password: this.state.password,
|
|
|
+ captcha: this.state.captcha
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleSuccess',
|
|
|
+ value: function handleSuccess(apiResponse) {
|
|
|
+ this.props.callback(apiResponse);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleError',
|
|
|
+ value: function handleError(rejection) {
|
|
|
+ if (rejection.status === 400) {
|
|
|
+ this.setState({
|
|
|
+ 'errors': Object.assign({}, this.state.errors, rejection)
|
|
|
+ });
|
|
|
+ _snackbar2.default.error(gettext("Form contains errors."));
|
|
|
+ } else if (rejection.status === 403 && rejection.ban) {
|
|
|
+ (0, _bannedPage2.default)(rejection.ban);
|
|
|
+ _modal2.default.hide();
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.apiError(rejection);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getLegalFootNote',
|
|
|
+ value: function getLegalFootNote() {
|
|
|
+ if (_index2.default.get('TERMS_OF_SERVICE_URL')) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: _index2.default.get('TERMS_OF_SERVICE_URL'),
|
|
|
+ target: '_blank' },
|
|
|
+ gettext("By registering you agree to site's terms and conditions.")
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-dialog modal-register', role: 'document' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-content' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-header' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'close', 'data-dismiss': 'modal',
|
|
|
+ 'aria-label': gettext("Close") },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { 'aria-hidden': 'true' },
|
|
|
+ '×'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h4',
|
|
|
+ { className: 'modal-title' },
|
|
|
+ gettext("Register")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'form',
|
|
|
+ { onSubmit: this.handleSubmit, className: 'form-horizontal' },
|
|
|
+ _react2.default.createElement('input', { type: 'type', style: { display: 'none' } }),
|
|
|
+ _react2.default.createElement('input', { type: 'password', style: { display: 'none' } }),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("Username"), 'for': 'id_username',
|
|
|
+ labelClass: 'col-sm-4', controlClass: 'col-sm-8',
|
|
|
+ validation: this.state.errors.username },
|
|
|
+ _react2.default.createElement('input', { type: 'text', id: 'id_username', className: 'form-control',
|
|
|
+ 'aria-describedby': 'id_username_status',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('username'),
|
|
|
+ value: this.state.username })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("E-mail"), 'for': 'id_email',
|
|
|
+ labelClass: 'col-sm-4', controlClass: 'col-sm-8',
|
|
|
+ validation: this.state.errors.email },
|
|
|
+ _react2.default.createElement('input', { type: 'text', id: 'id_email', className: 'form-control',
|
|
|
+ 'aria-describedby': 'id_email_status',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('email'),
|
|
|
+ value: this.state.email })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("Password"), 'for': 'id_password',
|
|
|
+ labelClass: 'col-sm-4', controlClass: 'col-sm-8',
|
|
|
+ validation: this.state.errors.password,
|
|
|
+ extra: _react2.default.createElement(_passwordStrength2.default, { password: this.state.password,
|
|
|
+ inputs: [this.state.username, this.state.email] }) },
|
|
|
+ _react2.default.createElement('input', { type: 'password', id: 'id_password', className: 'form-control',
|
|
|
+ 'aria-describedby': 'id_password_status',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('password'),
|
|
|
+ value: this.state.password })
|
|
|
+ ),
|
|
|
+ _captcha2.default.component({
|
|
|
+ form: this,
|
|
|
+ labelClass: "col-sm-4",
|
|
|
+ controlClass: "col-sm-8"
|
|
|
+ })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-footer' },
|
|
|
+ this.getLegalFootNote(),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { className: 'btn-primary', loading: this.state.isLoading },
|
|
|
+ gettext("Register account")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return RegisterForm;
|
|
|
+}(_form2.default);
|
|
|
+
|
|
|
+var RegisterComplete = exports.RegisterComplete = function (_React$Component) {
|
|
|
+ _inherits(RegisterComplete, _React$Component);
|
|
|
+
|
|
|
+ function RegisterComplete() {
|
|
|
+ _classCallCheck(this, RegisterComplete);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(RegisterComplete).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(RegisterComplete, [{
|
|
|
+ key: 'getLead',
|
|
|
+ value: function getLead() {
|
|
|
+ if (this.props.activation === 'user') {
|
|
|
+ return gettext("%(username)s, your account has been created but you need to activate it before you will be able to sign in.");
|
|
|
+ } else if (this.props.activation === 'admin') {
|
|
|
+ return gettext("%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getSubscript',
|
|
|
+ value: function getSubscript() {
|
|
|
+ if (this.props.activation === 'user') {
|
|
|
+ return gettext("We have sent an e-mail to %(email)s with link that you have to click to activate your account.");
|
|
|
+ } else if (this.props.activation === 'admin') {
|
|
|
+ return gettext("We will send an e-mail to %(email)s when this takes place.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-dialog modal-message modal-register',
|
|
|
+ role: 'document' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-content' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-header' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'close', 'data-dismiss': 'modal',
|
|
|
+ 'aria-label': gettext("Close") },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { 'aria-hidden': 'true' },
|
|
|
+ '×'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h4',
|
|
|
+ { className: 'modal-title' },
|
|
|
+ gettext("Registration complete")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-icon' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'info_outline'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'lead' },
|
|
|
+ interpolate(this.getLead(), { 'username': this.props.username }, true)
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ null,
|
|
|
+ interpolate(this.getSubscript(), { 'email': this.props.email }, true)
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return RegisterComplete;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var _class = function (_React$Component2) {
|
|
|
+ _inherits(_class, _React$Component2);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this3 = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this3.completeRegistration = function (apiResponse) {
|
|
|
+ if (apiResponse.activation === 'active') {
|
|
|
+ _modal2.default.hide();
|
|
|
+ _auth2.default.signIn(apiResponse);
|
|
|
+ } else {
|
|
|
+ _this3.setState({
|
|
|
+ complete: apiResponse
|
|
|
+ });
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ _this3.state = {
|
|
|
+ complete: false
|
|
|
+ };
|
|
|
+ return _this3;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'render',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ if (this.state.complete) {
|
|
|
+ return _react2.default.createElement(RegisterComplete, { activation: this.state.complete.activation,
|
|
|
+ username: this.state.complete.username,
|
|
|
+ email: this.state.complete.email });
|
|
|
+ } else {
|
|
|
+ return _react2.default.createElement(RegisterForm, { callback: this.completeRegistration });
|
|
|
+ }
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../index":121,"../services/ajax":128,"../services/auth":129,"../services/captcha":130,"../services/modal":134,"../services/snackbar":137,"../utils/banned-page":140,"../utils/validators":148,"./button":55,"./form":62,"./form-group":61,"./password-strength":79,"react":"react"}],94:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.LinkSent = exports.RequestLinkForm = undefined;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _index = require('../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _button = require('./button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _form = require('./form');
|
|
|
+
|
|
|
+var _form2 = _interopRequireDefault(_form);
|
|
|
+
|
|
|
+var _ajax = require('../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _snackbar = require('../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _validators = require('../utils/validators');
|
|
|
+
|
|
|
+var validators = _interopRequireWildcard(_validators);
|
|
|
+
|
|
|
+var _bannedPage = require('../utils/banned-page');
|
|
|
+
|
|
|
+var _bannedPage2 = _interopRequireDefault(_bannedPage);
|
|
|
+
|
|
|
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var RequestLinkForm = exports.RequestLinkForm = function (_Form) {
|
|
|
+ _inherits(RequestLinkForm, _Form);
|
|
|
+
|
|
|
+ function RequestLinkForm(props) {
|
|
|
+ _classCallCheck(this, RequestLinkForm);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(RequestLinkForm).call(this, props));
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ 'isLoading': false,
|
|
|
+
|
|
|
+ 'email': '',
|
|
|
+
|
|
|
+ 'validators': {
|
|
|
+ 'email': [validators.email()]
|
|
|
+ }
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(RequestLinkForm, [{
|
|
|
+ key: 'clean',
|
|
|
+ value: function clean() {
|
|
|
+ if (this.isValid()) {
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.error(gettext("Enter a valid email address."));
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'send',
|
|
|
+ value: function send() {
|
|
|
+ return _ajax2.default.post(_index2.default.get('SEND_ACTIVATION_API'), {
|
|
|
+ 'email': this.state.email
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleSuccess',
|
|
|
+ value: function handleSuccess(apiResponse) {
|
|
|
+ this.props.callback(apiResponse);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleError',
|
|
|
+ value: function handleError(rejection) {
|
|
|
+ if (['already_active', 'inactive_admin'].indexOf(rejection.code) > -1) {
|
|
|
+ _snackbar2.default.info(rejection.detail);
|
|
|
+ } else if (rejection.status === 403 && rejection.ban) {
|
|
|
+ (0, _bannedPage2.default)(rejection.ban);
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.apiError(rejection);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'well well-form well-form-request-activation-link' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'form',
|
|
|
+ { onSubmit: this.handleSubmit },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'form-group' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'control-input' },
|
|
|
+ _react2.default.createElement('input', { type: 'text', className: 'form-control',
|
|
|
+ placeholder: gettext("Your e-mail address"),
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('email'),
|
|
|
+ value: this.state.email })
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { className: 'btn-primary btn-block',
|
|
|
+ loading: this.state.isLoading },
|
|
|
+ gettext("Send link")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return RequestLinkForm;
|
|
|
+}(_form2.default);
|
|
|
+
|
|
|
+var LinkSent = exports.LinkSent = function (_React$Component) {
|
|
|
+ _inherits(LinkSent, _React$Component);
|
|
|
+
|
|
|
+ function LinkSent() {
|
|
|
+ _classCallCheck(this, LinkSent);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(LinkSent).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(LinkSent, [{
|
|
|
+ key: 'getMessage',
|
|
|
+ value: function getMessage() {
|
|
|
+ return interpolate(gettext("Activation link was sent to %(email)s"), {
|
|
|
+ email: this.props.user.email
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'well well-form well-form-request-activation-link well-done' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'done-message' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-icon' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'check'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ null,
|
|
|
+ this.getMessage()
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'btn btn-primary btn-block',
|
|
|
+ onClick: this.props.callback },
|
|
|
+ gettext("Request another link")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return LinkSent;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var _class = function (_React$Component2) {
|
|
|
+ _inherits(_class, _React$Component2);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this3 = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this3.complete = function (apiResponse) {
|
|
|
+ _this3.setState({
|
|
|
+ complete: apiResponse
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ _this3.reset = function () {
|
|
|
+ _this3.setState({
|
|
|
+ complete: false
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ _this3.state = {
|
|
|
+ complete: false
|
|
|
+ };
|
|
|
+ return _this3;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'render',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ if (this.state.complete) {
|
|
|
+ return _react2.default.createElement(LinkSent, { user: this.state.complete, callback: this.reset });
|
|
|
+ } else {
|
|
|
+ return _react2.default.createElement(RequestLinkForm, { callback: this.complete });
|
|
|
+ };
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../index":121,"../services/ajax":128,"../services/snackbar":137,"../utils/banned-page":140,"../utils/validators":148,"./button":55,"./form":62,"react":"react"}],95:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.AccountInactivePage = exports.LinkSent = exports.RequestResetForm = undefined;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _reactDom = require('react-dom');
|
|
|
+
|
|
|
+var _reactDom2 = _interopRequireDefault(_reactDom);
|
|
|
+
|
|
|
+var _index = require('../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _button = require('./button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _form = require('./form');
|
|
|
+
|
|
|
+var _form2 = _interopRequireDefault(_form);
|
|
|
+
|
|
|
+var _ajax = require('../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _snackbar = require('../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _validators = require('../utils/validators');
|
|
|
+
|
|
|
+var validators = _interopRequireWildcard(_validators);
|
|
|
+
|
|
|
+var _bannedPage = require('../utils/banned-page');
|
|
|
+
|
|
|
+var _bannedPage2 = _interopRequireDefault(_bannedPage);
|
|
|
+
|
|
|
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var RequestResetForm = exports.RequestResetForm = function (_Form) {
|
|
|
+ _inherits(RequestResetForm, _Form);
|
|
|
+
|
|
|
+ function RequestResetForm(props) {
|
|
|
+ _classCallCheck(this, RequestResetForm);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(RequestResetForm).call(this, props));
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ 'isLoading': false,
|
|
|
+
|
|
|
+ 'email': '',
|
|
|
+
|
|
|
+ 'validators': {
|
|
|
+ 'email': [validators.email()]
|
|
|
+ }
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(RequestResetForm, [{
|
|
|
+ key: 'clean',
|
|
|
+ value: function clean() {
|
|
|
+ if (this.isValid()) {
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.error(gettext("Enter a valid email address."));
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'send',
|
|
|
+ value: function send() {
|
|
|
+ return _ajax2.default.post(_index2.default.get('SEND_PASSWORD_RESET_API'), {
|
|
|
+ 'email': this.state.email
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleSuccess',
|
|
|
+ value: function handleSuccess(apiResponse) {
|
|
|
+ this.props.callback(apiResponse);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleError',
|
|
|
+ value: function handleError(rejection) {
|
|
|
+ if (['inactive_user', 'inactive_admin'].indexOf(rejection.code) > -1) {
|
|
|
+ this.props.showInactivePage(rejection);
|
|
|
+ } else if (rejection.status === 403 && rejection.ban) {
|
|
|
+ (0, _bannedPage2.default)(rejection.ban);
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.apiError(rejection);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'well well-form well-form-request-password-reset' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'form',
|
|
|
+ { onSubmit: this.handleSubmit },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'form-group' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'control-input' },
|
|
|
+ _react2.default.createElement('input', { type: 'text', className: 'form-control',
|
|
|
+ placeholder: gettext("Your e-mail address"),
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('email'),
|
|
|
+ value: this.state.email })
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { className: 'btn-primary btn-block',
|
|
|
+ loading: this.state.isLoading },
|
|
|
+ gettext("Send link")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return RequestResetForm;
|
|
|
+}(_form2.default);
|
|
|
+
|
|
|
+var LinkSent = exports.LinkSent = function (_React$Component) {
|
|
|
+ _inherits(LinkSent, _React$Component);
|
|
|
+
|
|
|
+ function LinkSent() {
|
|
|
+ _classCallCheck(this, LinkSent);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(LinkSent).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(LinkSent, [{
|
|
|
+ key: 'getMessage',
|
|
|
+ value: function getMessage() {
|
|
|
+ return interpolate(gettext("Reset password link was sent to %(email)s"), {
|
|
|
+ email: this.props.user.email
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'well well-form well-form-request-password-reset well-done' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'done-message' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-icon' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'check'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ null,
|
|
|
+ this.getMessage()
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'btn btn-primary btn-block',
|
|
|
+ onClick: this.props.callback },
|
|
|
+ gettext("Request another link")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return LinkSent;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var AccountInactivePage = exports.AccountInactivePage = function (_React$Component2) {
|
|
|
+ _inherits(AccountInactivePage, _React$Component2);
|
|
|
+
|
|
|
+ function AccountInactivePage() {
|
|
|
+ _classCallCheck(this, AccountInactivePage);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(AccountInactivePage).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(AccountInactivePage, [{
|
|
|
+ key: 'getActivateButton',
|
|
|
+ value: function getActivateButton() {
|
|
|
+ if (this.props.activation === 'inactive_user') {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: _index2.default.get('REQUEST_ACTIVATION_URL') },
|
|
|
+ gettext("Activate your account.")
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'page page-message page-message-info page-forgotten-password-inactive' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'container' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-panel' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-icon' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'info_outline'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'lead' },
|
|
|
+ gettext("Your account is inactive.")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ null,
|
|
|
+ this.props.message
|
|
|
+ ),
|
|
|
+ this.getActivateButton()
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return AccountInactivePage;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var _class = function (_React$Component3) {
|
|
|
+ _inherits(_class, _React$Component3);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this4 = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this4.complete = function (apiResponse) {
|
|
|
+ _this4.setState({
|
|
|
+ complete: apiResponse
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ _this4.reset = function () {
|
|
|
+ _this4.setState({
|
|
|
+ complete: false
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ _this4.state = {
|
|
|
+ complete: false
|
|
|
+ };
|
|
|
+ return _this4;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'showInactivePage',
|
|
|
+ value: function showInactivePage(apiResponse) {
|
|
|
+ _reactDom2.default.render(_react2.default.createElement(AccountInactivePage, { activation: apiResponse.code,
|
|
|
+ message: apiResponse.detail }), document.getElementById('page-mount'));
|
|
|
+ }
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ if (this.state.complete) {
|
|
|
+ return _react2.default.createElement(LinkSent, { user: this.state.complete, callback: this.reset });
|
|
|
+ } else {
|
|
|
+ return _react2.default.createElement(RequestResetForm, { callback: this.complete,
|
|
|
+ showInactivePage: this.showInactivePage });
|
|
|
+ };
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../index":121,"../services/ajax":128,"../services/snackbar":137,"../utils/banned-page":140,"../utils/validators":148,"./button":55,"./form":62,"react":"react","react-dom":"react-dom"}],96:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.PasswordChangedPage = exports.ResetPasswordForm = undefined;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _reactDom = require('react-dom');
|
|
|
+
|
|
|
+var _reactDom2 = _interopRequireDefault(_reactDom);
|
|
|
+
|
|
|
+var _index = require('../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _button = require('./button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _form = require('./form');
|
|
|
+
|
|
|
+var _form2 = _interopRequireDefault(_form);
|
|
|
+
|
|
|
+var _signIn = require('./sign-in.js');
|
|
|
+
|
|
|
+var _signIn2 = _interopRequireDefault(_signIn);
|
|
|
+
|
|
|
+var _ajax = require('../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _auth = require('../services/auth');
|
|
|
+
|
|
|
+var _auth2 = _interopRequireDefault(_auth);
|
|
|
+
|
|
|
+var _modal = require('../services/modal');
|
|
|
+
|
|
|
+var _modal2 = _interopRequireDefault(_modal);
|
|
|
+
|
|
|
+var _snackbar = require('../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _validators = require('../utils/validators');
|
|
|
+
|
|
|
+var validators = _interopRequireWildcard(_validators);
|
|
|
+
|
|
|
+var _bannedPage = require('../utils/banned-page');
|
|
|
+
|
|
|
+var _bannedPage2 = _interopRequireDefault(_bannedPage);
|
|
|
+
|
|
|
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var ResetPasswordForm = exports.ResetPasswordForm = function (_Form) {
|
|
|
+ _inherits(ResetPasswordForm, _Form);
|
|
|
+
|
|
|
+ function ResetPasswordForm(props) {
|
|
|
+ _classCallCheck(this, ResetPasswordForm);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(ResetPasswordForm).call(this, props));
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ 'isLoading': false,
|
|
|
+
|
|
|
+ 'password': '',
|
|
|
+
|
|
|
+ 'validators': {
|
|
|
+ 'password': [validators.passwordMinLength(_index2.default.get('SETTINGS'))]
|
|
|
+ }
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(ResetPasswordForm, [{
|
|
|
+ key: 'clean',
|
|
|
+ value: function clean() {
|
|
|
+ if (this.isValid()) {
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ if (this.state.password.trim().length) {
|
|
|
+ _snackbar2.default.error(this.state.errors.password[0]);
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.error(gettext("Enter new password."));
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'send',
|
|
|
+ value: function send() {
|
|
|
+ return _ajax2.default.post(_index2.default.get('CHANGE_PASSWORD_API'), {
|
|
|
+ 'password': this.state.password
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleSuccess',
|
|
|
+ value: function handleSuccess(apiResponse) {
|
|
|
+ this.props.callback(apiResponse);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleError',
|
|
|
+ value: function handleError(rejection) {
|
|
|
+ if (rejection.status === 403 && rejection.ban) {
|
|
|
+ (0, _bannedPage2.default)(rejection.ban);
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.apiError(rejection);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'well well-form well-form-reset-password' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'form',
|
|
|
+ { onSubmit: this.handleSubmit },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'form-group' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'control-input' },
|
|
|
+ _react2.default.createElement('input', { type: 'password', className: 'form-control',
|
|
|
+ placeholder: gettext("Enter new password"),
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ onChange: this.bindInput('password'),
|
|
|
+ value: this.state.password })
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { className: 'btn-primary btn-block',
|
|
|
+ loading: this.state.isLoading },
|
|
|
+ gettext("Change password")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return ResetPasswordForm;
|
|
|
+}(_form2.default);
|
|
|
+
|
|
|
+var PasswordChangedPage = exports.PasswordChangedPage = function (_React$Component) {
|
|
|
+ _inherits(PasswordChangedPage, _React$Component);
|
|
|
+
|
|
|
+ function PasswordChangedPage() {
|
|
|
+ _classCallCheck(this, PasswordChangedPage);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(PasswordChangedPage).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(PasswordChangedPage, [{
|
|
|
+ key: 'getMessage',
|
|
|
+ value: function getMessage() {
|
|
|
+ return interpolate(gettext("%(username)s, your password has been changed successfully."), {
|
|
|
+ username: this.props.user.username
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'showSignIn',
|
|
|
+ value: function showSignIn() {
|
|
|
+ _modal2.default.show(_signIn2.default);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'page page-message page-message-success page-forgotten-password-changed' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'container' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-panel' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-icon' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'check'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'message-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'lead' },
|
|
|
+ this.getMessage()
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ null,
|
|
|
+ gettext("You will have to sign in using new password before continuing.")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'btn btn-primary', onClick: this.showSignIn },
|
|
|
+ gettext("Sign in")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return PasswordChangedPage;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var _class = function (_React$Component2) {
|
|
|
+ _inherits(_class, _React$Component2);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ var _Object$getPrototypeO;
|
|
|
+
|
|
|
+ var _temp, _this3, _ret;
|
|
|
+
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
+ args[_key] = arguments[_key];
|
|
|
+ }
|
|
|
+
|
|
|
+ return _ret = (_temp = (_this3 = _possibleConstructorReturn(this, (_Object$getPrototypeO = Object.getPrototypeOf(_class)).call.apply(_Object$getPrototypeO, [this].concat(args))), _this3), _this3.complete = function (apiResponse) {
|
|
|
+ _auth2.default.softSignOut();
|
|
|
+
|
|
|
+ // nuke "redirect_to" field so we don't end
|
|
|
+ // coming back to error page after sign in
|
|
|
+ $('#hidden-login-form input[name="redirect_to"]').remove();
|
|
|
+
|
|
|
+ _reactDom2.default.render(_react2.default.createElement(PasswordChangedPage, { user: apiResponse }), document.getElementById('page-mount'));
|
|
|
+ }, _temp), _possibleConstructorReturn(_this3, _ret);
|
|
|
+ }
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'render',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(ResetPasswordForm, { callback: this.complete });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../index":121,"../services/ajax":128,"../services/auth":129,"../services/modal":134,"../services/snackbar":137,"../utils/banned-page":140,"../utils/validators":148,"./button":55,"./form":62,"./sign-in.js":99,"react":"react","react-dom":"react-dom"}],97:[function(require,module,exports){
|
|
|
+"use strict";
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require("react");
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: "getClassName",
|
|
|
+ value: function getClassName() {
|
|
|
+ if (this.props.className) {
|
|
|
+ return "form-search " + this.props.className;
|
|
|
+ } else {
|
|
|
+ return "form-search";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "render",
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ "div",
|
|
|
+ { className: this.getClassName() },
|
|
|
+ _react2.default.createElement("input", { type: "text",
|
|
|
+ className: "form-control",
|
|
|
+ value: this.props.value,
|
|
|
+ onChange: this.props.onChange,
|
|
|
+ placeholder: this.props.placeholder || gettext("Search...") }),
|
|
|
+ _react2.default.createElement(
|
|
|
+ "span",
|
|
|
+ { className: "material-icon" },
|
|
|
+ "search"
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"react":"react"}],98:[function(require,module,exports){
|
|
|
+"use strict";
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require("react");
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ var _Object$getPrototypeO;
|
|
|
+
|
|
|
+ var _temp, _this, _ret;
|
|
|
+
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
+ args[_key] = arguments[_key];
|
|
|
+ }
|
|
|
+
|
|
|
+ return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_Object$getPrototypeO = Object.getPrototypeOf(_class)).call.apply(_Object$getPrototypeO, [this].concat(args))), _this), _this.change = function (value) {
|
|
|
+ return function () {
|
|
|
+ _this.props.onChange({
|
|
|
+ target: {
|
|
|
+ value: value
|
|
|
+ }
|
|
|
+ });
|
|
|
+ };
|
|
|
+ }, _temp), _possibleConstructorReturn(_this, _ret);
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: "getChoice",
|
|
|
+ value: function getChoice() {
|
|
|
+ var _this2 = this;
|
|
|
+
|
|
|
+ var choice = null;
|
|
|
+ this.props.choices.map(function (item) {
|
|
|
+ if (item.value === _this2.props.value) {
|
|
|
+ choice = item;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return choice;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "getIcon",
|
|
|
+ value: function getIcon() {
|
|
|
+ return this.getChoice().icon;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "getLabel",
|
|
|
+ value: function getLabel() {
|
|
|
+ return this.getChoice().label;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: "render",
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function render() {
|
|
|
+ var _this3 = this;
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ "div",
|
|
|
+ { className: "btn-group btn-select-group" },
|
|
|
+ _react2.default.createElement(
|
|
|
+ "button",
|
|
|
+ { type: "button",
|
|
|
+ className: "btn btn-select dropdown-toggle",
|
|
|
+ id: this.props.id || null,
|
|
|
+ "data-toggle": "dropdown",
|
|
|
+ "aria-haspopup": "true",
|
|
|
+ "aria-expanded": "false",
|
|
|
+ "aria-describedby": this.props['aria-describedby'] || null,
|
|
|
+ disabled: this.props.disabled || false },
|
|
|
+ _react2.default.createElement(
|
|
|
+ "span",
|
|
|
+ { className: "material-icon" },
|
|
|
+ this.getIcon()
|
|
|
+ ),
|
|
|
+ this.getLabel()
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ "ul",
|
|
|
+ { className: "dropdown-menu" },
|
|
|
+ this.props.choices.map(function (item, i) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ "li",
|
|
|
+ { key: i },
|
|
|
+ _react2.default.createElement(
|
|
|
+ "button",
|
|
|
+ { type: "button", className: "btn-link",
|
|
|
+ onClick: _this3.change(item.value) },
|
|
|
+ _react2.default.createElement(
|
|
|
+ "span",
|
|
|
+ { className: "material-icon" },
|
|
|
+ item.icon
|
|
|
+ ),
|
|
|
+ item.label
|
|
|
+ )
|
|
|
+ );
|
|
|
+ })
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"react":"react"}],99:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _index = require('../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _button = require('./button');
|
|
|
+
|
|
|
+var _button2 = _interopRequireDefault(_button);
|
|
|
+
|
|
|
+var _form = require('./form');
|
|
|
+
|
|
|
+var _form2 = _interopRequireDefault(_form);
|
|
|
+
|
|
|
+var _ajax = require('../services/ajax');
|
|
|
+
|
|
|
+var _ajax2 = _interopRequireDefault(_ajax);
|
|
|
+
|
|
|
+var _modal = require('../services/modal');
|
|
|
+
|
|
|
+var _modal2 = _interopRequireDefault(_modal);
|
|
|
+
|
|
|
+var _snackbar = require('../services/snackbar');
|
|
|
+
|
|
|
+var _snackbar2 = _interopRequireDefault(_snackbar);
|
|
|
+
|
|
|
+var _bannedPage = require('../utils/banned-page');
|
|
|
+
|
|
|
+var _bannedPage2 = _interopRequireDefault(_bannedPage);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_Form) {
|
|
|
+ _inherits(_class, _Form);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ 'isLoading': false,
|
|
|
+ 'showActivation': false,
|
|
|
+
|
|
|
+ 'username': '',
|
|
|
+ 'password': '',
|
|
|
+
|
|
|
+ 'validators': {
|
|
|
+ 'username': [],
|
|
|
+ 'password': []
|
|
|
+ }
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'clean',
|
|
|
+ value: function clean() {
|
|
|
+ if (!this.isValid()) {
|
|
|
+ _snackbar2.default.error(gettext("Fill out both fields."));
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'send',
|
|
|
+ value: function send() {
|
|
|
+ return _ajax2.default.post(_index2.default.get('AUTH_API'), {
|
|
|
+ 'username': this.state.username,
|
|
|
+ 'password': this.state.password
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleSuccess',
|
|
|
+ value: function handleSuccess() {
|
|
|
+ var form = $('#hidden-login-form');
|
|
|
+
|
|
|
+ form.append('<input type="text" name="username" />');
|
|
|
+ form.append('<input type="password" name="password" />');
|
|
|
+
|
|
|
+ // fill out form with user credentials and submit it, this will tell
|
|
|
+ // Misago to redirect user back to right page, and will trigger browser's
|
|
|
+ // key ring feature
|
|
|
+ form.find('input[type="hidden"]').val(_ajax2.default.getCsrfToken());
|
|
|
+ form.find('input[name="redirect_to"]').val(window.location.pathname);
|
|
|
+ form.find('input[name="username"]').val(this.state.username);
|
|
|
+ form.find('input[name="password"]').val(this.state.password);
|
|
|
+ form.submit();
|
|
|
+
|
|
|
+ // keep form loading
|
|
|
+ this.setState({
|
|
|
+ 'isLoading': true
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'handleError',
|
|
|
+ value: function handleError(rejection) {
|
|
|
+ if (rejection.status === 400) {
|
|
|
+ if (rejection.code === 'inactive_admin') {
|
|
|
+ _snackbar2.default.info(rejection.detail);
|
|
|
+ } else if (rejection.code === 'inactive_user') {
|
|
|
+ _snackbar2.default.info(rejection.detail);
|
|
|
+ this.setState({
|
|
|
+ 'showActivation': true
|
|
|
+ });
|
|
|
+ } else if (rejection.code === 'banned') {
|
|
|
+ (0, _bannedPage2.default)(rejection.detail);
|
|
|
+ _modal2.default.hide();
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.error(rejection.detail);
|
|
|
+ }
|
|
|
+ } else if (rejection.status === 403 && rejection.ban) {
|
|
|
+ (0, _bannedPage2.default)(rejection.ban);
|
|
|
+ _modal2.default.hide();
|
|
|
+ } else {
|
|
|
+ _snackbar2.default.apiError(rejection);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getActivationButton',
|
|
|
+ value: function getActivationButton() {
|
|
|
+ if (this.state.showActivation) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: _index2.default.get('REQUEST_ACTIVATION_URL'),
|
|
|
+ className: 'btn btn-success btn-block' },
|
|
|
+ gettext("Activate account")
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-dialog modal-sm modal-sign-in',
|
|
|
+ role: 'document' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-content' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-header' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'close', 'data-dismiss': 'modal',
|
|
|
+ 'aria-label': gettext("Close") },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { 'aria-hidden': 'true' },
|
|
|
+ '×'
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h4',
|
|
|
+ { className: 'modal-title' },
|
|
|
+ gettext("Sign in")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'form',
|
|
|
+ { onSubmit: this.handleSubmit },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-body' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'form-group' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'control-input' },
|
|
|
+ _react2.default.createElement('input', { id: 'id_username', className: 'form-control', type: 'text',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ placeholder: gettext("Username or e-mail"),
|
|
|
+ onChange: this.bindInput('username'),
|
|
|
+ value: this.state.username })
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'form-group' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'control-input' },
|
|
|
+ _react2.default.createElement('input', { id: 'id_password', className: 'form-control', type: 'password',
|
|
|
+ disabled: this.state.isLoading,
|
|
|
+ placeholder: gettext("Password"),
|
|
|
+ onChange: this.bindInput('password'),
|
|
|
+ value: this.state.password })
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'modal-footer' },
|
|
|
+ this.getActivationButton(),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _button2.default,
|
|
|
+ { className: 'btn-primary btn-block',
|
|
|
+ loading: this.state.isLoading },
|
|
|
+ gettext("Sign in")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: _index2.default.get('FORGOTTEN_PASSWORD_URL'),
|
|
|
+ className: 'btn btn-default btn-block' },
|
|
|
+ gettext("Forgot password?")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_form2.default);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../index":121,"../services/ajax":128,"../services/modal":134,"../services/snackbar":137,"../utils/banned-page":140,"./button":55,"./form":62,"react":"react"}],100:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.Snackbar = undefined;
|
|
|
+exports.select = select;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+/* jshint ignore:start */
|
|
|
+var TYPES_CLASSES = {
|
|
|
+ 'info': 'alert-info',
|
|
|
+ 'success': 'alert-success',
|
|
|
+ 'warning': 'alert-warning',
|
|
|
+ 'error': 'alert-danger'
|
|
|
+};
|
|
|
+/* jshint ignore:end */
|
|
|
+
|
|
|
+var Snackbar = exports.Snackbar = function (_React$Component) {
|
|
|
+ _inherits(Snackbar, _React$Component);
|
|
|
+
|
|
|
+ function Snackbar() {
|
|
|
+ _classCallCheck(this, Snackbar);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(Snackbar).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(Snackbar, [{
|
|
|
+ key: 'getSnackbarClass',
|
|
|
+ value: function getSnackbarClass() {
|
|
|
+ var snackbarClass = 'alerts-snackbar';
|
|
|
+ if (this.props.isVisible) {
|
|
|
+ snackbarClass += ' in';
|
|
|
+ } else {
|
|
|
+ snackbarClass += ' out';
|
|
|
+ }
|
|
|
+ return snackbarClass;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: this.getSnackbarClass() },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'alert ' + TYPES_CLASSES[this.props.type] },
|
|
|
+ this.props.message
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return Snackbar;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+function select(state) {
|
|
|
+ return state.snackbar;
|
|
|
+}
|
|
|
+
|
|
|
+},{"react":"react"}],101:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.CompactGuestNav = exports.GuestNav = exports.GuestMenu = undefined;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _avatar = require('../avatar');
|
|
|
+
|
|
|
+var _avatar2 = _interopRequireDefault(_avatar);
|
|
|
+
|
|
|
+var _registerButton = require('../register-button');
|
|
|
+
|
|
|
+var _registerButton2 = _interopRequireDefault(_registerButton);
|
|
|
+
|
|
|
+var _signIn = require('../sign-in.js');
|
|
|
+
|
|
|
+var _signIn2 = _interopRequireDefault(_signIn);
|
|
|
+
|
|
|
+var _mobileNavbarDropdown = require('../../services/mobile-navbar-dropdown');
|
|
|
+
|
|
|
+var _mobileNavbarDropdown2 = _interopRequireDefault(_mobileNavbarDropdown);
|
|
|
+
|
|
|
+var _modal = require('../../services/modal');
|
|
|
+
|
|
|
+var _modal2 = _interopRequireDefault(_modal);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var GuestMenu = exports.GuestMenu = function (_React$Component) {
|
|
|
+ _inherits(GuestMenu, _React$Component);
|
|
|
+
|
|
|
+ function GuestMenu() {
|
|
|
+ _classCallCheck(this, GuestMenu);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(GuestMenu).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(GuestMenu, [{
|
|
|
+ key: 'showSignInModal',
|
|
|
+ value: function showSignInModal() {
|
|
|
+ _modal2.default.show(_signIn2.default);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'dropdown-menu user-dropdown dropdown-menu-right',
|
|
|
+ role: 'menu' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'guest-preview' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h4',
|
|
|
+ null,
|
|
|
+ gettext("You are browsing as guest.")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ null,
|
|
|
+ gettext('Sign in or register to start and participate in discussions.')
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'row' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-xs-6' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'btn btn-default btn-block',
|
|
|
+ onClick: this.showSignInModal },
|
|
|
+ gettext("Sign in")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'col-xs-6' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _registerButton2.default,
|
|
|
+ { className: 'btn-primary btn-block' },
|
|
|
+ gettext("Register")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return GuestMenu;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var GuestNav = exports.GuestNav = function (_GuestMenu) {
|
|
|
+ _inherits(GuestNav, _GuestMenu);
|
|
|
+
|
|
|
+ function GuestNav() {
|
|
|
+ _classCallCheck(this, GuestNav);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(GuestNav).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(GuestNav, [{
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'nav nav-guest' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'btn navbar-btn btn-default',
|
|
|
+ onClick: this.showSignInModal },
|
|
|
+ gettext("Sign in")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ _registerButton2.default,
|
|
|
+ { className: 'navbar-btn btn-primary' },
|
|
|
+ gettext("Register")
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return GuestNav;
|
|
|
+}(GuestMenu);
|
|
|
+
|
|
|
+var CompactGuestNav = exports.CompactGuestNav = function (_React$Component2) {
|
|
|
+ _inherits(CompactGuestNav, _React$Component2);
|
|
|
+
|
|
|
+ function CompactGuestNav() {
|
|
|
+ _classCallCheck(this, CompactGuestNav);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(CompactGuestNav).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(CompactGuestNav, [{
|
|
|
+ key: 'showGuestMenu',
|
|
|
+ value: function showGuestMenu() {
|
|
|
+ _mobileNavbarDropdown2.default.show(GuestMenu);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', onClick: this.showGuestMenu },
|
|
|
+ _react2.default.createElement(_avatar2.default, { size: '64' })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return CompactGuestNav;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+},{"../../services/mobile-navbar-dropdown":133,"../../services/modal":134,"../avatar":53,"../register-button":92,"../sign-in.js":99,"react":"react"}],102:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.CompactUserMenu = exports.UserMenu = undefined;
|
|
|
+exports.select = select;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _guestNav = require('./guest-nav');
|
|
|
+
|
|
|
+var _userNav = require('./user-nav');
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var UserMenu = exports.UserMenu = function (_React$Component) {
|
|
|
+ _inherits(UserMenu, _React$Component);
|
|
|
+
|
|
|
+ function UserMenu() {
|
|
|
+ _classCallCheck(this, UserMenu);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(UserMenu).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(UserMenu, [{
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ if (this.props.isAuthenticated) {
|
|
|
+ return _react2.default.createElement(_userNav.UserNav, { user: this.props.user });
|
|
|
+ } else {
|
|
|
+ return _react2.default.createElement(_guestNav.GuestNav, null);
|
|
|
+ }
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return UserMenu;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var CompactUserMenu = exports.CompactUserMenu = function (_React$Component2) {
|
|
|
+ _inherits(CompactUserMenu, _React$Component2);
|
|
|
+
|
|
|
+ function CompactUserMenu() {
|
|
|
+ _classCallCheck(this, CompactUserMenu);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(CompactUserMenu).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(CompactUserMenu, [{
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ if (this.props.isAuthenticated) {
|
|
|
+ return _react2.default.createElement(_userNav.CompactUserNav, { user: this.props.user });
|
|
|
+ } else {
|
|
|
+ return _react2.default.createElement(_guestNav.CompactGuestNav, null);
|
|
|
+ }
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return CompactUserMenu;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+function select(state) {
|
|
|
+ return state.auth;
|
|
|
+}
|
|
|
+
|
|
|
+},{"./guest-nav":101,"./user-nav":103,"react":"react"}],103:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.CompactUserNav = exports.UserNav = exports.UserMenu = undefined;
|
|
|
+exports.selectUserMenu = selectUserMenu;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _reactRedux = require('react-redux');
|
|
|
+
|
|
|
+var _avatar = require('../avatar');
|
|
|
+
|
|
|
+var _avatar2 = _interopRequireDefault(_avatar);
|
|
|
+
|
|
|
+var _root = require('../change-avatar/root');
|
|
|
+
|
|
|
+var _root2 = _interopRequireDefault(_root);
|
|
|
+
|
|
|
+var _index = require('../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _mobileNavbarDropdown = require('../../services/mobile-navbar-dropdown');
|
|
|
+
|
|
|
+var _mobileNavbarDropdown2 = _interopRequireDefault(_mobileNavbarDropdown);
|
|
|
+
|
|
|
+var _modal = require('../../services/modal');
|
|
|
+
|
|
|
+var _modal2 = _interopRequireDefault(_modal);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var UserMenu = exports.UserMenu = function (_React$Component) {
|
|
|
+ _inherits(UserMenu, _React$Component);
|
|
|
+
|
|
|
+ function UserMenu() {
|
|
|
+ _classCallCheck(this, UserMenu);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(UserMenu).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(UserMenu, [{
|
|
|
+ key: 'logout',
|
|
|
+ value: function logout() {
|
|
|
+ var decision = confirm(gettext("Are you sure you want to sign out?"));
|
|
|
+ if (decision) {
|
|
|
+ $('#hidden-logout-form').submit();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'changeAvatar',
|
|
|
+ value: function changeAvatar() {
|
|
|
+ _modal2.default.show((0, _reactRedux.connect)(_root.select)(_root2.default));
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'dropdown-menu user-dropdown dropdown-menu-right',
|
|
|
+ role: 'menu' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'dropdown-header' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'strong',
|
|
|
+ null,
|
|
|
+ this.props.user.username
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement('li', { className: 'divider' }),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: this.props.user.absolute_url },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'account_circle'
|
|
|
+ ),
|
|
|
+ gettext("See your profile")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: _index2.default.get('USERCP_URL') },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'done_all'
|
|
|
+ ),
|
|
|
+ gettext("Change options")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'btn-link', onClick: this.changeAvatar },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'portrait'
|
|
|
+ ),
|
|
|
+ gettext("Change avatar")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement('li', { className: 'divider' }),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'dropdown-buttons' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', className: 'btn btn-default btn-block',
|
|
|
+ onClick: this.logout },
|
|
|
+ gettext("Log out")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return UserMenu;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var UserNav = exports.UserNav = function (_React$Component2) {
|
|
|
+ _inherits(UserNav, _React$Component2);
|
|
|
+
|
|
|
+ function UserNav() {
|
|
|
+ _classCallCheck(this, UserNav);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(UserNav).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(UserNav, [{
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'ul nav navbar-nav nav-user' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'dropdown' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: this.props.user.absolute_url, className: 'dropdown-toggle',
|
|
|
+ 'data-toggle': 'dropdown', 'aria-haspopup': 'true', 'aria-expanded': 'false',
|
|
|
+ role: 'button' },
|
|
|
+ _react2.default.createElement(_avatar2.default, { user: this.props.user, size: '64' })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(UserMenu, { user: this.props.user })
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return UserNav;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+function selectUserMenu(state) {
|
|
|
+ return { user: state.auth.user };
|
|
|
+}
|
|
|
+
|
|
|
+var CompactUserNav = exports.CompactUserNav = function (_React$Component3) {
|
|
|
+ _inherits(CompactUserNav, _React$Component3);
|
|
|
+
|
|
|
+ function CompactUserNav() {
|
|
|
+ _classCallCheck(this, CompactUserNav);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(CompactUserNav).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(CompactUserNav, [{
|
|
|
+ key: 'showUserMenu',
|
|
|
+ value: function showUserMenu() {
|
|
|
+ _mobileNavbarDropdown2.default.showConnected('user-menu', (0, _reactRedux.connect)(selectUserMenu)(UserMenu));
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { type: 'button', onClick: this.showUserMenu },
|
|
|
+ _react2.default.createElement(_avatar2.default, { user: this.props.user, size: '64' })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return CompactUserNav;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+},{"../../index":121,"../../services/mobile-navbar-dropdown":133,"../../services/modal":134,"../avatar":53,"../change-avatar/root":59,"react":"react","react-redux":"react-redux"}],104:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.StatusLabel = exports.StatusIcon = undefined;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getClass',
|
|
|
+ value: function getClass() {
|
|
|
+ var status = '';
|
|
|
+ if (this.props.status.is_banned) {
|
|
|
+ status = 'banned';
|
|
|
+ } else if (this.props.status.is_hidden) {
|
|
|
+ status = 'offline';
|
|
|
+ } else if (this.props.status.is_online_hidden) {
|
|
|
+ status = 'online';
|
|
|
+ } else if (this.props.status.is_offline_hidden) {
|
|
|
+ status = 'offline';
|
|
|
+ } else if (this.props.status.is_online) {
|
|
|
+ status = 'online';
|
|
|
+ } else if (this.props.status.is_offline) {
|
|
|
+ status = 'offline';
|
|
|
+ }
|
|
|
+
|
|
|
+ return 'user-status user-' + status;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: this.getClass() },
|
|
|
+ this.props.children
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+var StatusIcon = exports.StatusIcon = function (_React$Component2) {
|
|
|
+ _inherits(StatusIcon, _React$Component2);
|
|
|
+
|
|
|
+ function StatusIcon() {
|
|
|
+ _classCallCheck(this, StatusIcon);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(StatusIcon).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(StatusIcon, [{
|
|
|
+ key: 'getIcon',
|
|
|
+ value: function getIcon() {
|
|
|
+ if (this.props.status.is_banned) {
|
|
|
+ return 'remove_circle_outline';
|
|
|
+ } else if (this.props.status.is_hidden) {
|
|
|
+ return 'help_outline';
|
|
|
+ } else if (this.props.status.is_online_hidden) {
|
|
|
+ return 'label';
|
|
|
+ } else if (this.props.status.is_offline_hidden) {
|
|
|
+ return 'label_outline';
|
|
|
+ } else if (this.props.status.is_online) {
|
|
|
+ return 'lens';
|
|
|
+ } else if (this.props.status.is_offline) {
|
|
|
+ return 'panorama_fish_eye';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon status-icon' },
|
|
|
+ this.getIcon()
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return StatusIcon;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var StatusLabel = exports.StatusLabel = function (_React$Component3) {
|
|
|
+ _inherits(StatusLabel, _React$Component3);
|
|
|
+
|
|
|
+ function StatusLabel() {
|
|
|
+ _classCallCheck(this, StatusLabel);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(StatusLabel).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(StatusLabel, [{
|
|
|
+ key: 'getHelp',
|
|
|
+ value: function getHelp() {
|
|
|
+ if (this.props.status.is_banned) {
|
|
|
+ if (this.props.status.banned_until) {
|
|
|
+ return interpolate(gettext("%(username)s is banned until %(ban_expires)s"), {
|
|
|
+ username: this.props.user.username,
|
|
|
+ ban_expires: this.props.status.banned_until.format('LL, LT')
|
|
|
+ }, true);
|
|
|
+ } else {
|
|
|
+ return interpolate(gettext("%(username)s is banned"), {
|
|
|
+ username: this.props.user.username
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ } else if (this.props.status.is_hidden) {
|
|
|
+ return interpolate(gettext("%(username)s is hiding presence"), {
|
|
|
+ username: this.props.user.username
|
|
|
+ }, true);
|
|
|
+ } else if (this.props.status.is_online_hidden) {
|
|
|
+ return interpolate(gettext("%(username)s is online (hidden)"), {
|
|
|
+ username: this.props.user.username
|
|
|
+ }, true);
|
|
|
+ } else if (this.props.status.is_offline_hidden) {
|
|
|
+ return interpolate(gettext("%(username)s was last seen %(last_click)s (hidden)"), {
|
|
|
+ username: this.props.user.username,
|
|
|
+ last_click: this.props.status.last_click.fromNow()
|
|
|
+ }, true);
|
|
|
+ } else if (this.props.status.is_online) {
|
|
|
+ return interpolate(gettext("%(username)s is online"), {
|
|
|
+ username: this.props.user.username
|
|
|
+ }, true);
|
|
|
+ } else if (this.props.status.is_offline) {
|
|
|
+ return interpolate(gettext("%(username)s was last seen %(last_click)s"), {
|
|
|
+ username: this.props.user.username,
|
|
|
+ last_click: this.props.status.last_click.fromNow()
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getLabel',
|
|
|
+ value: function getLabel() {
|
|
|
+ if (this.props.status.is_banned) {
|
|
|
+ return gettext("Banned");
|
|
|
+ } else if (this.props.status.is_hidden) {
|
|
|
+ return gettext("Hidden");
|
|
|
+ } else if (this.props.status.is_online_hidden) {
|
|
|
+ return gettext("Online (hidden)");
|
|
|
+ } else if (this.props.status.is_offline_hidden) {
|
|
|
+ return gettext("Offline (hidden)");
|
|
|
+ } else if (this.props.status.is_online) {
|
|
|
+ return gettext("Online");
|
|
|
+ } else if (this.props.status.is_offline) {
|
|
|
+ return gettext("Offline");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: this.props.className || "status-label",
|
|
|
+ title: this.getHelp() },
|
|
|
+ this.getLabel()
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return StatusLabel;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+},{"react":"react"}],105:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _avatar = require('./avatar');
|
|
|
+
|
|
|
+var _avatar2 = _interopRequireDefault(_avatar);
|
|
|
+
|
|
|
+var _random = require('../utils/random');
|
|
|
+
|
|
|
+var random = _interopRequireWildcard(_random);
|
|
|
+
|
|
|
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'renderUserAvatar',
|
|
|
+ value: function renderUserAvatar(item) {
|
|
|
+ if (item.changed_by) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: item.changed_by.absolute_url, className: 'user-avatar' },
|
|
|
+ _react2.default.createElement(_avatar2.default, { user: item.changed_by, size: '100' })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'user-avatar' },
|
|
|
+ _react2.default.createElement(_avatar2.default, { size: '100' })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'renderUsername',
|
|
|
+ value: function renderUsername(item) {
|
|
|
+ if (item.changed_by) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: item.changed_by.absolute_url, className: 'item-title' },
|
|
|
+ item.changed_by.username
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'item-title' },
|
|
|
+ item.changed_by_username
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'renderHistory',
|
|
|
+ value: function renderHistory() {
|
|
|
+ var _this2 = this;
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'username-history ui-ready' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'list-group' },
|
|
|
+ this.props.changes.map(function (item) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'list-group-item', key: item.id },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'username-change-avatar' },
|
|
|
+ _this2.renderUserAvatar(item)
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'username-change-author' },
|
|
|
+ _this2.renderUsername(item)
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'username-change' },
|
|
|
+ item.old_username,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'arrow_forward'
|
|
|
+ ),
|
|
|
+ item.new_username
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'username-change-date' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'abbr',
|
|
|
+ { title: item.changed_on.format('LLL') },
|
|
|
+ item.changed_on.fromNow()
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ })
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getEmptyMessage',
|
|
|
+ value: function getEmptyMessage() {
|
|
|
+ if (this.props.emptyMessage) {
|
|
|
+ return this.props.emptyMessage;
|
|
|
+ } else {
|
|
|
+ return gettext("No name changes have been recorded for your account.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'renderEmptyHistory',
|
|
|
+ value: function renderEmptyHistory() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'username-history ui-ready' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'list-group' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'list-group-item empty-message' },
|
|
|
+ this.getEmptyMessage()
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'renderHistoryPreview',
|
|
|
+ value: function renderHistoryPreview() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'username-history ui-preview' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'list-group' },
|
|
|
+ random.range(3, 5).map(function (i) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'list-group-item', key: i },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'username-change-avatar' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'user-avatar' },
|
|
|
+ _react2.default.createElement(_avatar2.default, { size: '100' })
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'username-change-author' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'ui-preview-text', style: { width: random.int(30, 100) + "px" } },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'username-change' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'ui-preview-text', style: { width: random.int(30, 50) + "px" } },
|
|
|
+ ' '
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'arrow_forward'
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'ui-preview-text', style: { width: random.int(30, 50) + "px" } },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'username-change-date' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'ui-preview-text', style: { width: random.int(50, 100) + "px" } },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ })
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ if (this.props.isLoaded) {
|
|
|
+ if (this.props.changes.length) {
|
|
|
+ return this.renderHistory();
|
|
|
+ } else {
|
|
|
+ return this.renderEmptyHistory();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return this.renderHistoryPreview();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../utils/random":145,"./avatar":53,"react":"react"}],106:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _userCard = require('./user-card');
|
|
|
+
|
|
|
+var _userCard2 = _interopRequireDefault(_userCard);
|
|
|
+
|
|
|
+var _userPreview = require('./user-preview');
|
|
|
+
|
|
|
+var _userPreview2 = _interopRequireDefault(_userPreview);
|
|
|
+
|
|
|
+var _batch = require('../../utils/batch');
|
|
|
+
|
|
|
+var _batch2 = _interopRequireDefault(_batch);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getPager',
|
|
|
+ value: function getPager() {
|
|
|
+ if (this.props.pages > 1) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(Pager, this.props);
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getClassName',
|
|
|
+ value: function getClassName() {
|
|
|
+ if (this.props.className) {
|
|
|
+ return "users-cards-list " + this.props.className + " ui-ready";
|
|
|
+ } else {
|
|
|
+ return "users-cards-list ui-ready";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getColClassName',
|
|
|
+ value: function getColClassName() {
|
|
|
+ return "col-md-" + 12 / this.props.cols;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getBody',
|
|
|
+ value: function getBody() {
|
|
|
+ var _this2 = this;
|
|
|
+
|
|
|
+ if (this.props.isLoaded) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return (0, _batch2.default)(this.props.users, this.props.cols).map(function (row, r) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'row', key: r },
|
|
|
+ row.map(function (user) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: _this2.getColClassName(), key: user.id },
|
|
|
+ _react2.default.createElement(_userCard2.default, { user: user,
|
|
|
+ showStatus: _this2.props.showStatus,
|
|
|
+ showRank: _this2.props.showRank })
|
|
|
+ );
|
|
|
+ })
|
|
|
+ );
|
|
|
+ });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ var row = [];
|
|
|
+ for (var i = 0; i < this.props.cols; i++) {
|
|
|
+ row.push(i);
|
|
|
+ }
|
|
|
+
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'row' },
|
|
|
+ row.map(function (i) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: _this2.getColClassName(), key: i },
|
|
|
+ _react2.default.createElement(_userPreview2.default, { showStatus: _this2.props.showStatus })
|
|
|
+ );
|
|
|
+ })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'users-cards-list ui-ready' },
|
|
|
+ this.getBody()
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../utils/batch":141,"./user-card":107,"./user-preview":108,"react":"react"}],107:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _avatar = require('../avatar');
|
|
|
+
|
|
|
+var _avatar2 = _interopRequireDefault(_avatar);
|
|
|
+
|
|
|
+var _userStatus = require('../user-status');
|
|
|
+
|
|
|
+var _userStatus2 = _interopRequireDefault(_userStatus);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getClassName',
|
|
|
+ value: function getClassName() {
|
|
|
+ if (this.props.user.rank.css_class) {
|
|
|
+ return 'user-card user-card-' + this.props.user.rank.css_class + ' ui-ready';
|
|
|
+ } else {
|
|
|
+ return 'user-card ui-ready';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getUserStatus',
|
|
|
+ value: function getUserStatus() {
|
|
|
+ if (this.props.showStatus) {
|
|
|
+ if (this.props.user.status) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ _userStatus2.default,
|
|
|
+ { user: this.props.user, status: this.props.user.status },
|
|
|
+ _react2.default.createElement(_userStatus.StatusIcon, { user: this.props.user,
|
|
|
+ status: this.props.user.status }),
|
|
|
+ _react2.default.createElement(_userStatus.StatusLabel, { user: this.props.user,
|
|
|
+ status: this.props.user.status,
|
|
|
+ className: 'status-label' })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'user-status' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'status-icon ui-preview' },
|
|
|
+ ' '
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'status-label ui-preview' },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getRankName',
|
|
|
+ value: function getRankName() {
|
|
|
+ if (this.props.showRank) {
|
|
|
+ if (this.props.user.rank.is_tab) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: this.props.user.rank.absolute_url,
|
|
|
+ className: 'item-title rank-name' },
|
|
|
+ this.props.user.rank.name
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'item-title rank-name' },
|
|
|
+ this.props.user.rank.name
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getUserTitle',
|
|
|
+ value: function getUserTitle() {
|
|
|
+ if (this.props.user.title) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'user-title' },
|
|
|
+ this.props.user.title
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getUserJoinedOn',
|
|
|
+ value: function getUserJoinedOn() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ var title = interpolate(gettext("Joined on %(joined_on)s"), {
|
|
|
+ 'joined_on': this.props.user.joined_on.format('LL, LT')
|
|
|
+ }, true);
|
|
|
+
|
|
|
+ var age = interpolate(gettext("Joined %(joined_on)s"), {
|
|
|
+ 'joined_on': this.props.user.joined_on.fromNow()
|
|
|
+ }, true);
|
|
|
+
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'user-joined-on', title: title },
|
|
|
+ age
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: this.getClassName() },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'user-card-bg-image' },
|
|
|
+ _react2.default.createElement(_avatar2.default, { user: this.props.user, size: '400', className: 'bg-image' }),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'user-card-bg' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'user-details' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'user-avatar' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: this.props.user.absolute_url },
|
|
|
+ _react2.default.createElement(_avatar2.default, { user: this.props.user, size: '400' })
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h4',
|
|
|
+ { className: 'user-name' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: this.props.user.absolute_url, className: 'item-title' },
|
|
|
+ this.props.user.username
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'user-subscript' },
|
|
|
+ this.getUserStatus(),
|
|
|
+ this.getRankName(),
|
|
|
+ this.getUserTitle(),
|
|
|
+ this.getUserJoinedOn()
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'user-card-stats' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'list-unstyled' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'user-posts-count' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'strong',
|
|
|
+ null,
|
|
|
+ this.props.user.posts
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'small',
|
|
|
+ null,
|
|
|
+ gettext("posts")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'user-threads-count' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'strong',
|
|
|
+ null,
|
|
|
+ this.props.user.threads
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'small',
|
|
|
+ null,
|
|
|
+ gettext("threads")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'user-followers-count' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'strong',
|
|
|
+ null,
|
|
|
+ this.props.user.followers
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'small',
|
|
|
+ null,
|
|
|
+ gettext("followers")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../avatar":53,"../user-status":104,"react":"react"}],108:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _avatar = require('../avatar');
|
|
|
+
|
|
|
+var _avatar2 = _interopRequireDefault(_avatar);
|
|
|
+
|
|
|
+var _random = require('../../utils/random');
|
|
|
+
|
|
|
+var random = _interopRequireWildcard(_random);
|
|
|
+
|
|
|
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getUserStatus',
|
|
|
+ value: function getUserStatus() {
|
|
|
+ if (this.props.showStatus) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'user-status' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'status-icon ui-preview' },
|
|
|
+ ' '
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'status-label ui-preview' },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'user-card ui-preview' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'user-card-bg-image' },
|
|
|
+ _react2.default.createElement(_avatar2.default, { size: '400', className: 'bg-image' }),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'user-card-bg' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'user-details' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'user-avatar' },
|
|
|
+ _react2.default.createElement(_avatar2.default, { size: '400' })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h4',
|
|
|
+ { className: 'user-name' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'item-title' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'ui-preview-text', style: { width: random.int(60, 150) + "px" } },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'user-subscript' },
|
|
|
+ this.getUserStatus(),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'user-joined-on' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'ui-preview-text', style: { width: random.int(30, 50) + "px" } },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'user-card-stats' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'list-unstyled' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'user-posts-count' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'strong',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'ui-preview-text' },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'small',
|
|
|
+ null,
|
|
|
+ gettext("posts")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'user-threads-count' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'strong',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'ui-preview-text' },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'small',
|
|
|
+ null,
|
|
|
+ gettext("threads")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'user-followers-count' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'strong',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'ui-preview-text' },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'small',
|
|
|
+ null,
|
|
|
+ gettext("followers")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../utils/random":145,"../avatar":53,"react":"react"}],109:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getEmptyMessage',
|
|
|
+ value: function getEmptyMessage() {
|
|
|
+ return interpolate(gettext("No users have posted any new messages during last %(days)s days."), { 'days': this.props.trackedPeriod }, true);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'active-posters-list' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'container' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'lead' },
|
|
|
+ this.getEmptyMessage()
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"react":"react"}],110:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _reactRouter = require('react-router');
|
|
|
+
|
|
|
+var _avatar = require('../../avatar');
|
|
|
+
|
|
|
+var _avatar2 = _interopRequireDefault(_avatar);
|
|
|
+
|
|
|
+var _userStatus = require('../../user-status');
|
|
|
+
|
|
|
+var _userStatus2 = _interopRequireDefault(_userStatus);
|
|
|
+
|
|
|
+var _index = require('../../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getClassName',
|
|
|
+ value: function getClassName() {
|
|
|
+ if (this.props.rank.css_class) {
|
|
|
+ return "list-group-item list-group-rank-" + this.props.rank.css_class;
|
|
|
+ } else {
|
|
|
+ return "list-group-item";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getUserStatus',
|
|
|
+ value: function getUserStatus() {
|
|
|
+ if (this.props.user.status) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ _userStatus2.default,
|
|
|
+ { user: this.props.user, status: this.props.user.status },
|
|
|
+ _react2.default.createElement(_userStatus.StatusIcon, { user: this.props.user,
|
|
|
+ status: this.props.user.status }),
|
|
|
+ _react2.default.createElement(_userStatus.StatusLabel, { user: this.props.user,
|
|
|
+ status: this.props.user.status,
|
|
|
+ className: 'status-label hidden-xs hidden-sm' })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'user-status' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'status-icon ui-preview' },
|
|
|
+ ' '
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'status-label ui-preview hidden-xs hidden-sm' },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getRankName',
|
|
|
+ value: function getRankName() {
|
|
|
+ if (this.props.rank.is_tab) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ var rankUrl = _index2.default.get('USERS_LIST_URL') + this.props.rank.slug + '/';
|
|
|
+ return _react2.default.createElement(
|
|
|
+ _reactRouter.Link,
|
|
|
+ { to: rankUrl, className: 'item-title rank-name' },
|
|
|
+ this.props.rank.name
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'item-title rank-name' },
|
|
|
+ this.props.rank.name
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getUserTitle',
|
|
|
+ value: function getUserTitle() {
|
|
|
+ if (this.props.user.title) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'user-title hidden-xs hidden-sm' },
|
|
|
+ this.props.user.title
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: this.getClassName() },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'rank-user-avatar' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: this.props.user.absolute_url },
|
|
|
+ _react2.default.createElement(_avatar2.default, { user: this.props.user, size: '50' })
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'rank-user' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'user-name' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'a',
|
|
|
+ { href: this.props.user.absolute_url, className: 'item-title' },
|
|
|
+ this.props.user.username
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ this.getUserStatus(),
|
|
|
+ this.getRankName(),
|
|
|
+ this.getUserTitle()
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'rank-position' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'strong',
|
|
|
+ null,
|
|
|
+ '#',
|
|
|
+ this.props.counter
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'small',
|
|
|
+ null,
|
|
|
+ gettext("Rank")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'rank-posts-counted' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'strong',
|
|
|
+ null,
|
|
|
+ this.props.user.meta.score
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'small',
|
|
|
+ null,
|
|
|
+ gettext("Ranked posts")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'rank-posts-total' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'strong',
|
|
|
+ null,
|
|
|
+ this.props.user.posts
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'small',
|
|
|
+ null,
|
|
|
+ gettext("Total posts")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../../index":121,"../../avatar":53,"../../user-status":104,"react":"react","react-router":"react-router"}],111:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _avatar = require('../../avatar');
|
|
|
+
|
|
|
+var _avatar2 = _interopRequireDefault(_avatar);
|
|
|
+
|
|
|
+var _random = require('../../../utils/random');
|
|
|
+
|
|
|
+var random = _interopRequireWildcard(_random);
|
|
|
+
|
|
|
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'active-posters-list' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'container' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'lead ui-preview-paragraph' },
|
|
|
+ random.range(3, 4).map(function (i) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { key: i, className: 'ui-preview-text', style: { width: random.int(50, 120) + "px" } },
|
|
|
+ ' '
|
|
|
+ );
|
|
|
+ })
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'active-posters ui-preview' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'list-group' },
|
|
|
+ random.range(5, 10).map(function (i, counter) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { key: i, className: 'list-group-item' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'rank-user-avatar' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(_avatar2.default, { size: '50' })
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'rank-user' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'user-name' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'item-title' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'ui-preview-text', style: { width: random.int(30, 80) + "px" } },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'user-status' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'status-icon ui-preview' },
|
|
|
+ ' '
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'status-label ui-preview hidden-xs hidden-sm' },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'rank-name' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'ui-preview-text', style: { width: random.int(30, 50) + "px" } },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'user-title hidden-xs hidden-sm' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'ui-preview-text', style: { width: random.int(30, 50) + "px" } },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'rank-position' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'strong',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'ui-preview-text', style: { width: "30px" } },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'small',
|
|
|
+ null,
|
|
|
+ gettext("Rank")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'rank-posts-counted' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'strong',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'ui-preview-text', style: { width: "30px" } },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'small',
|
|
|
+ null,
|
|
|
+ gettext("Ranked posts")
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'rank-posts-total' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'strong',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { className: 'ui-preview-text', style: { width: "30px" } },
|
|
|
+ ' '
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'small',
|
|
|
+ null,
|
|
|
+ gettext("Total posts")
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ })
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../../utils/random":145,"../../avatar":53,"react":"react"}],112:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _listItem = require('./list-item');
|
|
|
+
|
|
|
+var _listItem2 = _interopRequireDefault(_listItem);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getLeadMessage',
|
|
|
+ value: function getLeadMessage() {
|
|
|
+ var message = ngettext("%(posters)s most active poster from last %(days)s days.", "%(posters)s most active posters from last %(days)s days.", this.props.count);
|
|
|
+
|
|
|
+ return interpolate(message, {
|
|
|
+ posters: this.props.count,
|
|
|
+ days: this.props.trackedPeriod
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'active-posters-list' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'container' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'lead' },
|
|
|
+ this.getLeadMessage()
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'active-posters ui-ready' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'list-group' },
|
|
|
+ this.props.users.map(function (user, i) {
|
|
|
+ return _react2.default.createElement(_listItem2.default, { user: user,
|
|
|
+ rank: user.rank,
|
|
|
+ counter: i + 1,
|
|
|
+ key: user.id });
|
|
|
+ })
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"./list-item":110,"react":"react"}],113:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _listEmpty = require('./list-empty');
|
|
|
+
|
|
|
+var _listEmpty2 = _interopRequireDefault(_listEmpty);
|
|
|
+
|
|
|
+var _listLoading = require('./list-loading');
|
|
|
+
|
|
|
+var _listLoading2 = _interopRequireDefault(_listLoading);
|
|
|
+
|
|
|
+var _list = require('./list');
|
|
|
+
|
|
|
+var _list2 = _interopRequireDefault(_list);
|
|
|
+
|
|
|
+var _index = require('../../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _users = require('../../../reducers/users');
|
|
|
+
|
|
|
+var _polls = require('../../../services/polls');
|
|
|
+
|
|
|
+var _polls2 = _interopRequireDefault(_polls);
|
|
|
+
|
|
|
+var _store = require('../../../services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+var _pageTitle = require('../../../services/page-title');
|
|
|
+
|
|
|
+var _pageTitle2 = _interopRequireDefault(_pageTitle);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.update = function (data) {
|
|
|
+ _store2.default.dispatch((0, _users.dehydrate)(data.results));
|
|
|
+
|
|
|
+ _this.setState({
|
|
|
+ isLoaded: true,
|
|
|
+
|
|
|
+ trackedPeriod: data.tracked_period,
|
|
|
+ count: data.count
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ if (_index2.default.has('USERS')) {
|
|
|
+ _this.initWithPreloadedData(_index2.default.pop('USERS'));
|
|
|
+ } else {
|
|
|
+ _this.initWithoutPreloadedData();
|
|
|
+ }
|
|
|
+
|
|
|
+ _this.startPolling();
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'initWithPreloadedData',
|
|
|
+ value: function initWithPreloadedData(data) {
|
|
|
+ this.state = {
|
|
|
+ isLoaded: true,
|
|
|
+
|
|
|
+ trackedPeriod: data.tracked_period,
|
|
|
+ count: data.count
|
|
|
+ };
|
|
|
+
|
|
|
+ _store2.default.dispatch((0, _users.dehydrate)(data.results));
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'initWithoutPreloadedData',
|
|
|
+ value: function initWithoutPreloadedData() {
|
|
|
+ this.state = {
|
|
|
+ isLoaded: false
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'startPolling',
|
|
|
+ value: function startPolling() {
|
|
|
+ _polls2.default.start({
|
|
|
+ poll: 'active-posters',
|
|
|
+ url: _index2.default.get('USERS_API'),
|
|
|
+ data: {
|
|
|
+ list: 'active'
|
|
|
+ },
|
|
|
+ frequency: 90 * 1000,
|
|
|
+ update: this.update
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'componentDidMount',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function componentDidMount() {
|
|
|
+ _pageTitle2.default.set({
|
|
|
+ title: this.props.route.extra.name,
|
|
|
+ parent: gettext("Users")
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'componentWillUnmount',
|
|
|
+ value: function componentWillUnmount() {
|
|
|
+ _polls2.default.stop('active-posters');
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ if (this.state.isLoaded) {
|
|
|
+ if (this.state.count > 0) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_list2.default, { users: this.props.users,
|
|
|
+ trackedPeriod: this.state.trackedPeriod,
|
|
|
+ count: this.state.count });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_listEmpty2.default, { trackedPeriod: this.state.trackedPeriod });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_listLoading2.default, null);
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../../index":121,"../../../reducers/users":127,"../../../services/page-title":135,"../../../services/polls":136,"../../../services/store":138,"./list":112,"./list-empty":109,"./list-loading":111,"react":"react"}],114:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.CompactNav = exports.TabsNav = undefined;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _reactRouter = require('react-router');
|
|
|
+
|
|
|
+var _li = require('../li');
|
|
|
+
|
|
|
+var _li2 = _interopRequireDefault(_li);
|
|
|
+
|
|
|
+var _index = require('../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+//jshint ignore:line
|
|
|
+
|
|
|
+//jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:start
|
|
|
+var listUrl = function listUrl(baseUrl, list) {
|
|
|
+ var url = baseUrl;
|
|
|
+ if (list.component === 'rank') {
|
|
|
+ url += list.slug;
|
|
|
+ } else {
|
|
|
+ url += list.component;
|
|
|
+ }
|
|
|
+ return url + '/';
|
|
|
+};
|
|
|
+
|
|
|
+var navLinks = function navLinks(baseUrl, lists, hideNav) {
|
|
|
+ return lists.map(function (list) {
|
|
|
+ var url = listUrl(baseUrl, list);
|
|
|
+ return _react2.default.createElement(
|
|
|
+ _li2.default,
|
|
|
+ { path: url,
|
|
|
+ key: url },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _reactRouter.Link,
|
|
|
+ { to: url, onClick: hideNav },
|
|
|
+ list.name
|
|
|
+ )
|
|
|
+ );
|
|
|
+ });
|
|
|
+};
|
|
|
+// jshint ignore:end
|
|
|
+
|
|
|
+var TabsNav = exports.TabsNav = function (_React$Component) {
|
|
|
+ _inherits(TabsNav, _React$Component);
|
|
|
+
|
|
|
+ function TabsNav() {
|
|
|
+ _classCallCheck(this, TabsNav);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(TabsNav).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(TabsNav, [{
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ // jshint ignore:start
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'nav nav-pills' },
|
|
|
+ navLinks(this.props.baseUrl, this.props.lists)
|
|
|
+ );
|
|
|
+ // jshint ignore:end
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return TabsNav;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var CompactNav = exports.CompactNav = function (_React$Component2) {
|
|
|
+ _inherits(CompactNav, _React$Component2);
|
|
|
+
|
|
|
+ function CompactNav() {
|
|
|
+ _classCallCheck(this, CompactNav);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(CompactNav).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(CompactNav, [{
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ // jshint ignore:start
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'dropdown-menu', role: 'menu' },
|
|
|
+ navLinks(this.props.baseUrl, this.props.lists, this.props.hideNav)
|
|
|
+ );
|
|
|
+ // jshint ignore:end
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return CompactNav;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+},{"../../index":121,"../li":63,"react":"react","react-router":"react-router"}],115:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _root = require('../../users-list/root');
|
|
|
+
|
|
|
+var _root2 = _interopRequireDefault(_root);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(_root2.default, { isLoaded: false, cols: 3, showStatus: true })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../users-list/root":106,"react":"react"}],116:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _pager = require('./pager');
|
|
|
+
|
|
|
+var _pager2 = _interopRequireDefault(_pager);
|
|
|
+
|
|
|
+var _root = require('../../users-list/root');
|
|
|
+
|
|
|
+var _root2 = _interopRequireDefault(_root);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getPager',
|
|
|
+ value: function getPager() {
|
|
|
+ if (this.props.pages > 1) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_pager2.default, this.props);
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(_root2.default, { users: this.props.users,
|
|
|
+ showStatus: true,
|
|
|
+ cols: 3,
|
|
|
+ isLoaded: true }),
|
|
|
+ this.getPager()
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../users-list/root":106,"./pager":117,"react":"react"}],117:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _reactRouter = require('react-router');
|
|
|
+
|
|
|
+var _resetScroll = require('../../../utils/reset-scroll');
|
|
|
+
|
|
|
+var _resetScroll2 = _interopRequireDefault(_resetScroll);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getPreviousPage',
|
|
|
+ value: function getPreviousPage() {
|
|
|
+ if (this.props.previous || this.props.first) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ var url = this.props.baseUrl;
|
|
|
+ if (this.props.previous) {
|
|
|
+ url += this.props.previous + '/';
|
|
|
+ }
|
|
|
+
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'previous' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _reactRouter.Link,
|
|
|
+ { to: url, onClick: _resetScroll2.default },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { 'aria-hidden': 'true', className: 'material-icon' },
|
|
|
+ 'arrow_back'
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getNextPage',
|
|
|
+ value: function getNextPage() {
|
|
|
+ if (this.props.next) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ var url = this.props.baseUrl + this.props.next + '/';
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { className: 'next' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _reactRouter.Link,
|
|
|
+ { to: url, onClick: _resetScroll2.default },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'span',
|
|
|
+ { 'aria-hidden': 'true', className: 'material-icon' },
|
|
|
+ 'arrow_forward'
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getProgessBar',
|
|
|
+ value: function getProgessBar() {
|
|
|
+ var _this2 = this;
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'pager-progress-bar' },
|
|
|
+ this.props.page_range.map(function (page) {
|
|
|
+ var className = page === _this2.props.page ? 'active' : null;
|
|
|
+ var url = _this2.props.baseUrl;
|
|
|
+
|
|
|
+ if (page > 1) {
|
|
|
+ url += page + '/';
|
|
|
+ }
|
|
|
+
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'li',
|
|
|
+ { key: page, className: className },
|
|
|
+ _react2.default.createElement(
|
|
|
+ _reactRouter.Link,
|
|
|
+ { to: url, onClick: _resetScroll2.default },
|
|
|
+ page
|
|
|
+ )
|
|
|
+ );
|
|
|
+ })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'pager-undercontent' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'nav',
|
|
|
+ null,
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'ul',
|
|
|
+ { className: 'pager' },
|
|
|
+ this.getPreviousPage(),
|
|
|
+ this.getNextPage()
|
|
|
+ ),
|
|
|
+ this.getProgessBar()
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../../utils/reset-scroll":146,"react":"react","react-router":"react-router"}],118:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _list = require('./list');
|
|
|
+
|
|
|
+var _list2 = _interopRequireDefault(_list);
|
|
|
+
|
|
|
+var _listLoading = require('./list-loading');
|
|
|
+
|
|
|
+var _listLoading2 = _interopRequireDefault(_listLoading);
|
|
|
+
|
|
|
+var _index = require('../../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _users = require('../../../reducers/users');
|
|
|
+
|
|
|
+var _polls = require('../../../services/polls');
|
|
|
+
|
|
|
+var _polls2 = _interopRequireDefault(_polls);
|
|
|
+
|
|
|
+var _store = require('../../../services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+var _pageTitle = require('../../../services/page-title');
|
|
|
+
|
|
|
+var _pageTitle2 = _interopRequireDefault(_pageTitle);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.update = function (data) {
|
|
|
+ _store2.default.dispatch((0, _users.dehydrate)(data.results));
|
|
|
+
|
|
|
+ data.isLoaded = true;
|
|
|
+ _this.setState(data);
|
|
|
+ };
|
|
|
+
|
|
|
+ if (_index2.default.has('USERS')) {
|
|
|
+ _this.initWithPreloadedData(_index2.default.pop('USERS'));
|
|
|
+ } else {
|
|
|
+ _this.initWithoutPreloadedData();
|
|
|
+ }
|
|
|
+
|
|
|
+ _this.startPolling(props.params.page || 1);
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'initWithPreloadedData',
|
|
|
+ value: function initWithPreloadedData(data) {
|
|
|
+ this.state = Object.assign(data, {
|
|
|
+ isLoaded: true
|
|
|
+ });
|
|
|
+ _store2.default.dispatch((0, _users.dehydrate)(data.results));
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'initWithoutPreloadedData',
|
|
|
+ value: function initWithoutPreloadedData() {
|
|
|
+ this.state = {
|
|
|
+ isLoaded: false
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'startPolling',
|
|
|
+ value: function startPolling(page) {
|
|
|
+ _polls2.default.start({
|
|
|
+ poll: 'rank-users',
|
|
|
+ url: _index2.default.get('USERS_API'),
|
|
|
+ data: {
|
|
|
+ rank: this.props.route.rank.id,
|
|
|
+ page: page
|
|
|
+ },
|
|
|
+ frequency: 90 * 1000,
|
|
|
+ update: this.update
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'componentDidMount',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function componentDidMount() {
|
|
|
+ _pageTitle2.default.set({
|
|
|
+ title: this.props.route.rank.name,
|
|
|
+ page: this.props.params.page || null,
|
|
|
+ parent: gettext("Users")
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'componentWillUnmount',
|
|
|
+ value: function componentWillUnmount() {
|
|
|
+ _polls2.default.stop('rank-users');
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'componentWillReceiveProps',
|
|
|
+ value: function componentWillReceiveProps(nextProps) {
|
|
|
+ if (this.props.params.page !== nextProps.params.page) {
|
|
|
+ _pageTitle2.default.set({
|
|
|
+ title: this.props.route.rank.name,
|
|
|
+ page: nextProps.params.page || null,
|
|
|
+ parent: gettext("Users")
|
|
|
+ });
|
|
|
+
|
|
|
+ this.setState({
|
|
|
+ isLoaded: false
|
|
|
+ });
|
|
|
+
|
|
|
+ _polls2.default.stop('rank-users');
|
|
|
+ this.startPolling(nextProps.params.page);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getClassName',
|
|
|
+ value: function getClassName() {
|
|
|
+ if (this.props.route.rank.css_class) {
|
|
|
+ return 'rank-users-list rank-users-' + this.props.route.rank.css_class;
|
|
|
+ } else {
|
|
|
+ return 'rank-users-list';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getRankDescription',
|
|
|
+ value: function getRankDescription() {
|
|
|
+ if (this.props.route.rank.description) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'rank-description' },
|
|
|
+ _react2.default.createElement('div', { className: 'lead', dangerouslySetInnerHTML: {
|
|
|
+ __html: this.props.route.rank.description.html
|
|
|
+ } })
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getComponent',
|
|
|
+ value: function getComponent() {
|
|
|
+ if (this.state.isLoaded) {
|
|
|
+ if (this.state.count > 0) {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ var baseUrl = _index2.default.get('USERS_LIST_URL') + this.props.route.rank.slug + '/';
|
|
|
+ return _react2.default.createElement(_list2.default, _extends({ baseUrl: baseUrl,
|
|
|
+ users: this.props.users
|
|
|
+ }, this.state));
|
|
|
+ /* jshint ignore:end */
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'p',
|
|
|
+ { className: 'lead' },
|
|
|
+ gettext("There are no users with this rank at the moment.")
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(_listLoading2.default, null);
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: this.getClassName() },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'container' },
|
|
|
+ this.getRankDescription(),
|
|
|
+ this.getComponent()
|
|
|
+ )
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"../../../index":121,"../../../reducers/users":127,"../../../services/page-title":135,"../../../services/polls":136,"../../../services/store":138,"./list":116,"./list-loading":115,"react":"react"}],119:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.select = select;
|
|
|
+exports.paths = paths;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _reactRedux = require('react-redux');
|
|
|
+
|
|
|
+var _navs = require('./navs');
|
|
|
+
|
|
|
+var _root = require('./active-posters/root');
|
|
|
+
|
|
|
+var _root2 = _interopRequireDefault(_root);
|
|
|
+
|
|
|
+var _root3 = require('./rank/root');
|
|
|
+
|
|
|
+var _root4 = _interopRequireDefault(_root3);
|
|
|
+
|
|
|
+var _index = require('../../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class(props) {
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
|
|
|
+
|
|
|
+ _this.toggleNav = function () {
|
|
|
+ if (_this.state.dropdown) {
|
|
|
+ _this.setState({
|
|
|
+ dropdown: false
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ _this.setState({
|
|
|
+ dropdown: true
|
|
|
+ });
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.hideNav = function () {
|
|
|
+ _this.setState({
|
|
|
+ dropdown: false
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ _this.state = {
|
|
|
+ dropdown: false
|
|
|
+ };
|
|
|
+ return _this;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: 'getToggleNavClassName',
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function getToggleNavClassName() {
|
|
|
+ if (this.state.dropdown) {
|
|
|
+ return 'btn btn-default btn-icon open';
|
|
|
+ } else {
|
|
|
+ return 'btn btn-default btn-icon';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getCompactNavClassName',
|
|
|
+ value: function getCompactNavClassName() {
|
|
|
+ if (this.state.dropdown) {
|
|
|
+ return 'compact-nav open';
|
|
|
+ } else {
|
|
|
+ return 'compact-nav';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'page page-users-lists' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'page-header tabbed' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'container' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'h1',
|
|
|
+ { className: 'pull-left' },
|
|
|
+ gettext("Users")
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'button',
|
|
|
+ { className: 'btn btn-default btn-aligned btn-icon btn-dropdown-toggle hidden-md hidden-lg',
|
|
|
+ type: 'button',
|
|
|
+ onClick: this.toggleNav,
|
|
|
+ 'aria-haspopup': 'true',
|
|
|
+ 'aria-expanded': this.state.dropdown ? 'true' : 'false' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'i',
|
|
|
+ { className: 'material-icon' },
|
|
|
+ 'menu'
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'page-tabs hidden-xs hidden-sm' },
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: 'container' },
|
|
|
+ _react2.default.createElement(_navs.TabsNav, { lists: _index2.default.get('USERS_LISTS'),
|
|
|
+ baseUrl: _index2.default.get('USERS_LIST_URL') })
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ _react2.default.createElement(
|
|
|
+ 'div',
|
|
|
+ { className: this.getCompactNavClassName() },
|
|
|
+ _react2.default.createElement(_navs.CompactNav, { lists: _index2.default.get('USERS_LISTS'),
|
|
|
+ baseUrl: _index2.default.get('USERS_LIST_URL'),
|
|
|
+ hideNav: this.hideNav })
|
|
|
+ ),
|
|
|
+ this.props.children
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+function select(store) {
|
|
|
+ return {
|
|
|
+ 'tick': store.tick.tick,
|
|
|
+ 'user': store.auth.user,
|
|
|
+ 'users': store.users
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function paths() {
|
|
|
+ var paths = [];
|
|
|
+
|
|
|
+ _index2.default.get('USERS_LISTS').forEach(function (item) {
|
|
|
+ if (item.component === 'rank') {
|
|
|
+ paths.push({
|
|
|
+ path: _index2.default.get('USERS_LIST_URL') + item.slug + '/:page/',
|
|
|
+ component: (0, _reactRedux.connect)(select)(_root4.default),
|
|
|
+ rank: item
|
|
|
+ });
|
|
|
+ paths.push({
|
|
|
+ path: _index2.default.get('USERS_LIST_URL') + item.slug + '/',
|
|
|
+ component: (0, _reactRedux.connect)(select)(_root4.default),
|
|
|
+ rank: item
|
|
|
+ });
|
|
|
+ } else if (item.component === 'active-posters') {
|
|
|
+ paths.push({
|
|
|
+ path: _index2.default.get('USERS_LIST_URL') + item.component + '/',
|
|
|
+ component: (0, _reactRedux.connect)(select)(_root2.default),
|
|
|
+ extra: {
|
|
|
+ name: item.name
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return paths;
|
|
|
+}
|
|
|
+
|
|
|
+},{"../../index":121,"./active-posters/root":113,"./navs":114,"./rank/root":118,"react":"react","react-redux":"react-redux"}],120:[function(require,module,exports){
|
|
|
+"use strict";
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+var _react = require("react");
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+var _class = function (_React$Component) {
|
|
|
+ _inherits(_class, _React$Component);
|
|
|
+
|
|
|
+ function _class() {
|
|
|
+ var _Object$getPrototypeO;
|
|
|
+
|
|
|
+ var _temp, _this, _ret;
|
|
|
+
|
|
|
+ _classCallCheck(this, _class);
|
|
|
+
|
|
|
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
+ args[_key] = arguments[_key];
|
|
|
+ }
|
|
|
+
|
|
|
+ return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_Object$getPrototypeO = Object.getPrototypeOf(_class)).call.apply(_Object$getPrototypeO, [this].concat(args))), _this), _this.toggle = function () {
|
|
|
+ _this.props.onChange({
|
|
|
+ target: {
|
|
|
+ value: !_this.props.value
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }, _temp), _possibleConstructorReturn(_this, _ret);
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(_class, [{
|
|
|
+ key: "getClassName",
|
|
|
+ value: function getClassName() {
|
|
|
+ if (this.props.value) {
|
|
|
+ return "btn btn-yes-no btn-yes-no-on";
|
|
|
+ } else {
|
|
|
+ return "btn btn-yes-no btn-yes-no-off";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "getIcon",
|
|
|
+ value: function getIcon() {
|
|
|
+ if (this.props.value) {
|
|
|
+ return this.props.iconOn || 'check_box';
|
|
|
+ } else {
|
|
|
+ return this.props.iconOff || 'check_box_outline_blank';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "getLabel",
|
|
|
+ value: function getLabel() {
|
|
|
+ if (this.props.value) {
|
|
|
+ return this.props.labelOn || gettext("yes");
|
|
|
+ } else {
|
|
|
+ return this.props.labelOff || gettext("no");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: "render",
|
|
|
+
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement(
|
|
|
+ "button",
|
|
|
+ { type: "button",
|
|
|
+ onClick: this.toggle,
|
|
|
+ className: this.getClassName(),
|
|
|
+ id: this.props.id || null,
|
|
|
+ "aria-describedby": this.props['aria-describedby'] || null,
|
|
|
+ disabled: this.props.disabled || false },
|
|
|
+ _react2.default.createElement(
|
|
|
+ "span",
|
|
|
+ { className: "material-icon" },
|
|
|
+ this.getIcon()
|
|
|
+ ),
|
|
|
+ this.getLabel()
|
|
|
+ );
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return _class;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+exports.default = _class;
|
|
|
+
|
|
|
+},{"react":"react"}],121:[function(require,module,exports){
|
|
|
+(function (global){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.Misago = undefined;
|
|
|
+
|
|
|
+var _orderedList = require('./utils/ordered-list');
|
|
|
+
|
|
|
+var _orderedList2 = _interopRequireDefault(_orderedList);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+var Misago = exports.Misago = function () {
|
|
|
+ function Misago() {
|
|
|
+ _classCallCheck(this, Misago);
|
|
|
+
|
|
|
+ this._initializers = [];
|
|
|
+ this._context = {};
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(Misago, [{
|
|
|
+ key: 'addInitializer',
|
|
|
+ value: function addInitializer(initializer) {
|
|
|
+ this._initializers.push({
|
|
|
+ key: initializer.name,
|
|
|
+
|
|
|
+ item: initializer.initializer,
|
|
|
+
|
|
|
+ after: initializer.after,
|
|
|
+ before: initializer.before
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'init',
|
|
|
+ value: function init(context) {
|
|
|
+ var _this = this;
|
|
|
+
|
|
|
+ this._context = context;
|
|
|
+
|
|
|
+ var initOrder = new _orderedList2.default(this._initializers).orderedValues();
|
|
|
+ initOrder.forEach(function (initializer) {
|
|
|
+ initializer(_this);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // context accessors
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'has',
|
|
|
+ value: function has(key) {
|
|
|
+ return !!this._context[key];
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'get',
|
|
|
+ value: function get(key, fallback) {
|
|
|
+ if (this.has(key)) {
|
|
|
+ return this._context[key];
|
|
|
+ } else {
|
|
|
+ return fallback || undefined;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'pop',
|
|
|
+ value: function pop(key) {
|
|
|
+ if (this.has(key)) {
|
|
|
+ var value = this._context[key];
|
|
|
+ this._context[key] = null;
|
|
|
+ return value;
|
|
|
+ } else {
|
|
|
+ return undefined;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return Misago;
|
|
|
+}();
|
|
|
+
|
|
|
+// create singleton
|
|
|
+
|
|
|
+var misago = new Misago();
|
|
|
+
|
|
|
+// expose it globally
|
|
|
+global.misago = misago;
|
|
|
+
|
|
|
+// and export it for tests and stuff
|
|
|
+exports.default = misago;
|
|
|
+
|
|
|
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
+
|
|
|
+},{"./utils/ordered-list":144}],122:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.SIGN_OUT = exports.SIGN_IN = exports.PATCH_USER = exports.initialState = undefined;
|
|
|
+exports.patchUser = patchUser;
|
|
|
+exports.signIn = signIn;
|
|
|
+exports.signOut = signOut;
|
|
|
+exports.default = auth;
|
|
|
+
|
|
|
+var _users = require('./users');
|
|
|
+
|
|
|
+var initialState = exports.initialState = {
|
|
|
+ signedIn: false,
|
|
|
+ signedOut: false
|
|
|
+};
|
|
|
+
|
|
|
+var PATCH_USER = exports.PATCH_USER = 'PATCH_USER';
|
|
|
+var SIGN_IN = exports.SIGN_IN = 'SIGN_IN';
|
|
|
+var SIGN_OUT = exports.SIGN_OUT = 'SIGN_OUT';
|
|
|
+
|
|
|
+function patchUser(patch) {
|
|
|
+ return {
|
|
|
+ type: PATCH_USER,
|
|
|
+ patch: patch
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function signIn(user) {
|
|
|
+ return {
|
|
|
+ type: SIGN_IN,
|
|
|
+ user: user
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function signOut() {
|
|
|
+ var soft = arguments.length <= 0 || arguments[0] === undefined ? false : arguments[0];
|
|
|
+
|
|
|
+ return {
|
|
|
+ type: SIGN_OUT,
|
|
|
+ soft: soft
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function auth() {
|
|
|
+ var state = arguments.length <= 0 || arguments[0] === undefined ? initialState : arguments[0];
|
|
|
+ var action = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
|
|
|
+
|
|
|
+ switch (action.type) {
|
|
|
+ case PATCH_USER:
|
|
|
+ var newState = Object.assign({}, state);
|
|
|
+ newState.user = Object.assign({}, state.user, action.patch);
|
|
|
+ return newState;
|
|
|
+
|
|
|
+ case SIGN_IN:
|
|
|
+ return Object.assign({}, state, {
|
|
|
+ signedIn: action.user
|
|
|
+ });
|
|
|
+
|
|
|
+ case SIGN_OUT:
|
|
|
+ return Object.assign({}, state, {
|
|
|
+ isAuthenticated: false,
|
|
|
+ isAnonymous: true,
|
|
|
+ signedOut: !action.soft
|
|
|
+ });
|
|
|
+
|
|
|
+ case _users.UPDATE_AVATAR:
|
|
|
+ if (state.isAuthenticated && state.user.id === action.userId) {
|
|
|
+ var _newState = Object.assign({}, state);
|
|
|
+ _newState.user = Object.assign({}, state.user, {
|
|
|
+ 'avatar_hash': action.avatarHash
|
|
|
+ });
|
|
|
+ return _newState;
|
|
|
+ }
|
|
|
+ return state;
|
|
|
+
|
|
|
+ case _users.UPDATE_USERNAME:
|
|
|
+ if (state.isAuthenticated && state.user.id === action.userId) {
|
|
|
+ var _newState2 = Object.assign({}, state);
|
|
|
+ _newState2.user = Object.assign({}, state.user, {
|
|
|
+ username: action.username,
|
|
|
+ slug: action.slug
|
|
|
+ });
|
|
|
+ return _newState2;
|
|
|
+ }
|
|
|
+ return state;
|
|
|
+
|
|
|
+ default:
|
|
|
+ return state;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+},{"./users":127}],123:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.PATCH_PROFILE = exports.DEHYDRATE_PROFILE = undefined;
|
|
|
+exports.dehydrate = dehydrate;
|
|
|
+exports.patchProfile = patchProfile;
|
|
|
+exports.default = auth;
|
|
|
+
|
|
|
+var _moment = require('moment');
|
|
|
+
|
|
|
+var _moment2 = _interopRequireDefault(_moment);
|
|
|
+
|
|
|
+var _users = require('./users');
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+var DEHYDRATE_PROFILE = exports.DEHYDRATE_PROFILE = 'DEHYDRATE_PROFILE';
|
|
|
+var PATCH_PROFILE = exports.PATCH_PROFILE = 'PATCH_PROFILE';
|
|
|
+
|
|
|
+function dehydrate(profile) {
|
|
|
+ return {
|
|
|
+ type: DEHYDRATE_PROFILE,
|
|
|
+ profile: profile
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function patchProfile(patch) {
|
|
|
+ return {
|
|
|
+ type: PATCH_PROFILE,
|
|
|
+ patch: patch
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function auth() {
|
|
|
+ var state = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
|
|
|
+ var action = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
|
|
|
+
|
|
|
+ switch (action.type) {
|
|
|
+ case DEHYDRATE_PROFILE:
|
|
|
+ return Object.assign({}, action.profile, {
|
|
|
+ joined_on: (0, _moment2.default)(action.profile.joined_on),
|
|
|
+ status: (0, _users.dehydrateStatus)(action.profile.status)
|
|
|
+ });
|
|
|
+
|
|
|
+ case PATCH_PROFILE:
|
|
|
+ return Object.assign({}, state, action.patch);
|
|
|
+
|
|
|
+ case _users.UPDATE_AVATAR:
|
|
|
+ if (state.id === action.userId) {
|
|
|
+ return Object.assign({}, state, {
|
|
|
+ avatar_hash: action.avatarHash
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return state;
|
|
|
+
|
|
|
+ case _users.UPDATE_USERNAME:
|
|
|
+ if (state.id === action.userId) {
|
|
|
+ return Object.assign({}, state, {
|
|
|
+ username: action.username,
|
|
|
+ slug: action.slug
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return state;
|
|
|
+
|
|
|
+ default:
|
|
|
+ return state;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+},{"./users":127,"moment":"moment"}],124:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.showSnackbar = showSnackbar;
|
|
|
+exports.hideSnackbar = hideSnackbar;
|
|
|
+exports.default = snackbar;
|
|
|
+var initialState = exports.initialState = {
|
|
|
+ type: 'info',
|
|
|
+ message: '',
|
|
|
+ isVisible: false
|
|
|
+};
|
|
|
+
|
|
|
+var SHOW_SNACKBAR = exports.SHOW_SNACKBAR = 'SHOW_SNACKBAR';
|
|
|
+var HIDE_SNACKBAR = exports.HIDE_SNACKBAR = 'HIDE_SNACKBAR';
|
|
|
+
|
|
|
+function showSnackbar(message, type) {
|
|
|
+ return {
|
|
|
+ type: SHOW_SNACKBAR,
|
|
|
+ message: message,
|
|
|
+ messageType: type
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function hideSnackbar() {
|
|
|
+ return {
|
|
|
+ type: HIDE_SNACKBAR
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function snackbar() {
|
|
|
+ var state = arguments.length <= 0 || arguments[0] === undefined ? initialState : arguments[0];
|
|
|
+ var action = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
|
|
|
+
|
|
|
+ if (action.type === SHOW_SNACKBAR) {
|
|
|
+ return {
|
|
|
+ type: action.messageType,
|
|
|
+ message: action.message,
|
|
|
+ isVisible: true
|
|
|
+ };
|
|
|
+ } else if (action.type === HIDE_SNACKBAR) {
|
|
|
+ return Object.assign({}, state, {
|
|
|
+ isVisible: false
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ return state;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+},{}],125:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.doTick = doTick;
|
|
|
+exports.default = tick;
|
|
|
+var initialState = exports.initialState = {
|
|
|
+ tick: 0
|
|
|
+};
|
|
|
+
|
|
|
+var TICK = exports.TICK = 'TICK';
|
|
|
+
|
|
|
+function doTick() {
|
|
|
+ return {
|
|
|
+ type: TICK
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function tick() {
|
|
|
+ var state = arguments.length <= 0 || arguments[0] === undefined ? initialState : arguments[0];
|
|
|
+ var action = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
|
|
|
+
|
|
|
+ if (action.type === TICK) {
|
|
|
+ return Object.assign({}, state, {
|
|
|
+ tick: state.tick + 1
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ return state;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+},{}],126:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.DEHYDRATE_HISTORY = exports.APPEND_HISTORY = exports.ADD_NAME_CHANGE = undefined;
|
|
|
+exports.addNameChange = addNameChange;
|
|
|
+exports.append = append;
|
|
|
+exports.dehydrate = dehydrate;
|
|
|
+exports.default = username;
|
|
|
+
|
|
|
+var _users = require('./users');
|
|
|
+
|
|
|
+var _moment = require('moment');
|
|
|
+
|
|
|
+var _moment2 = _interopRequireDefault(_moment);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+var ADD_NAME_CHANGE = exports.ADD_NAME_CHANGE = 'ADD_NAME_CHANGE';
|
|
|
+var APPEND_HISTORY = exports.APPEND_HISTORY = 'APPEND_HISTORY';
|
|
|
+var DEHYDRATE_HISTORY = exports.DEHYDRATE_HISTORY = 'DEHYDRATE_HISTORY';
|
|
|
+
|
|
|
+function addNameChange(change, user, changedBy) {
|
|
|
+ return {
|
|
|
+ type: ADD_NAME_CHANGE,
|
|
|
+ change: change,
|
|
|
+ user: user,
|
|
|
+ changedBy: changedBy
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function append(items) {
|
|
|
+ return {
|
|
|
+ type: APPEND_HISTORY,
|
|
|
+ items: items
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function dehydrate(items) {
|
|
|
+ return {
|
|
|
+ type: DEHYDRATE_HISTORY,
|
|
|
+ items: items
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function username() {
|
|
|
+ var state = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
|
|
|
+ var action = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
|
|
|
+
|
|
|
+ switch (action.type) {
|
|
|
+ case ADD_NAME_CHANGE:
|
|
|
+ var newState = state.slice();
|
|
|
+ newState.unshift({
|
|
|
+ id: Math.floor(Date.now() / 1000), // just small hax for getting id
|
|
|
+ changed_by: action.changedBy,
|
|
|
+ changed_by_username: action.changedBy.username,
|
|
|
+ changed_on: (0, _moment2.default)(),
|
|
|
+ new_username: action.change.username,
|
|
|
+ old_username: action.user.username
|
|
|
+ });
|
|
|
+ return newState;
|
|
|
+
|
|
|
+ case APPEND_HISTORY:
|
|
|
+ return state.concat(action.items.map(function (item) {
|
|
|
+ return Object.assign({}, item, {
|
|
|
+ changed_on: (0, _moment2.default)(item.changed_on)
|
|
|
+ });
|
|
|
+ }));
|
|
|
+
|
|
|
+ case DEHYDRATE_HISTORY:
|
|
|
+ return action.items.map(function (item) {
|
|
|
+ return Object.assign({}, item, {
|
|
|
+ changed_on: (0, _moment2.default)(item.changed_on)
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ case _users.UPDATE_AVATAR:
|
|
|
+ return state.map(function (item) {
|
|
|
+ item = Object.assign({}, item);
|
|
|
+ if (item.changed_by && item.changed_by.id === action.userId) {
|
|
|
+ item.changed_by = Object.assign({}, item.changed_by, {
|
|
|
+ 'avatar_hash': action.avatarHash
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ return item;
|
|
|
+ });
|
|
|
+
|
|
|
+ case _users.UPDATE_USERNAME:
|
|
|
+ return state.map(function (item) {
|
|
|
+ item = Object.assign({}, item);
|
|
|
+ if (item.changed_by && item.changed_by.id === action.userId) {
|
|
|
+ item.changed_by = Object.assign({}, item.changed_by, {
|
|
|
+ 'username': action.username,
|
|
|
+ 'slug': action.slug
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ return Object.assign({}, item);
|
|
|
+ });
|
|
|
+
|
|
|
+ default:
|
|
|
+ return state;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+},{"./users":127,"moment":"moment"}],127:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.UPDATE_USERNAME = exports.UPDATE_AVATAR = exports.DEHYDRATE_USERS = exports.APPEND_USERS = undefined;
|
|
|
+exports.append = append;
|
|
|
+exports.dehydrate = dehydrate;
|
|
|
+exports.dehydrateStatus = dehydrateStatus;
|
|
|
+exports.updateAvatar = updateAvatar;
|
|
|
+exports.updateUsername = updateUsername;
|
|
|
+exports.default = user;
|
|
|
+
|
|
|
+var _moment = require('moment');
|
|
|
+
|
|
|
+var _moment2 = _interopRequireDefault(_moment);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+var APPEND_USERS = exports.APPEND_USERS = 'APPEND_USERS';
|
|
|
+var DEHYDRATE_USERS = exports.DEHYDRATE_USERS = 'DEHYDRATE_USERS';
|
|
|
+var UPDATE_AVATAR = exports.UPDATE_AVATAR = 'UPDATE_AVATAR';
|
|
|
+var UPDATE_USERNAME = exports.UPDATE_USERNAME = 'UPDATE_USERNAME';
|
|
|
+
|
|
|
+function append(items) {
|
|
|
+ return {
|
|
|
+ type: APPEND_USERS,
|
|
|
+ items: items
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function dehydrate(items) {
|
|
|
+ return {
|
|
|
+ type: DEHYDRATE_USERS,
|
|
|
+ items: items
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function dehydrateStatus(status) {
|
|
|
+ if (status) {
|
|
|
+ return Object.assign({}, status, {
|
|
|
+ last_click: status.last_click ? (0, _moment2.default)(status.last_click) : null,
|
|
|
+ banned_until: status.banned_until ? (0, _moment2.default)(status.banned_until) : null
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function updateAvatar(user, avatarHash) {
|
|
|
+ return {
|
|
|
+ type: UPDATE_AVATAR,
|
|
|
+ userId: user.id,
|
|
|
+ avatarHash: avatarHash
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function updateUsername(user, username, slug) {
|
|
|
+ return {
|
|
|
+ type: UPDATE_USERNAME,
|
|
|
+ userId: user.id,
|
|
|
+ username: username,
|
|
|
+ slug: slug
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function user() {
|
|
|
+ var state = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
|
|
|
+ var action = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
|
|
|
+
|
|
|
+ switch (action.type) {
|
|
|
+ case APPEND_USERS:
|
|
|
+ return state.concat(action.items.map(function (item) {
|
|
|
+ return Object.assign({}, item, {
|
|
|
+ joined_on: (0, _moment2.default)(item.joined_on),
|
|
|
+ status: dehydrateStatus(item.status)
|
|
|
+ });
|
|
|
+ }));
|
|
|
+
|
|
|
+ case DEHYDRATE_USERS:
|
|
|
+ return action.items.map(function (item) {
|
|
|
+ return Object.assign({}, item, {
|
|
|
+ joined_on: (0, _moment2.default)(item.joined_on),
|
|
|
+ status: dehydrateStatus(item.status)
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ case UPDATE_AVATAR:
|
|
|
+ return state.map(function (item) {
|
|
|
+ item = Object.assign({}, item);
|
|
|
+ if (item.id === action.userId) {
|
|
|
+ item.avatar_hash = action.avatarHash;
|
|
|
+ }
|
|
|
+
|
|
|
+ return item;
|
|
|
+ });
|
|
|
+
|
|
|
+ default:
|
|
|
+ return state;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+},{"moment":"moment"}],128:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+var Ajax = exports.Ajax = function () {
|
|
|
+ function Ajax() {
|
|
|
+ _classCallCheck(this, Ajax);
|
|
|
+
|
|
|
+ this._cookieName = null;
|
|
|
+ this._csrfToken = null;
|
|
|
+ this._locks = {};
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(Ajax, [{
|
|
|
+ key: 'init',
|
|
|
+ value: function init(cookieName) {
|
|
|
+ this._cookieName = cookieName;
|
|
|
+ this._csrfToken = this.getCsrfToken();
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getCsrfToken',
|
|
|
+ value: function getCsrfToken() {
|
|
|
+ if (document.cookie.indexOf(this._cookieName) !== -1) {
|
|
|
+ var cookieRegex = new RegExp(this._cookieName + '\=([^;]*)');
|
|
|
+ var cookie = document.cookie.match(cookieRegex)[0];
|
|
|
+ return cookie ? cookie.split('=')[1] : null;
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'request',
|
|
|
+ value: function request(method, url, data) {
|
|
|
+ var self = this;
|
|
|
+ return new Promise(function (resolve, reject) {
|
|
|
+ var xhr = {
|
|
|
+ url: url,
|
|
|
+ method: method,
|
|
|
+ headers: {
|
|
|
+ 'X-CSRFToken': self._csrfToken
|
|
|
+ },
|
|
|
+
|
|
|
+ data: data ? JSON.stringify(data) : null,
|
|
|
+ contentType: "application/json; charset=utf-8",
|
|
|
+ dataType: 'json',
|
|
|
+
|
|
|
+ success: function success(data) {
|
|
|
+ resolve(data);
|
|
|
+ },
|
|
|
+
|
|
|
+ error: function error(jqXHR) {
|
|
|
+ var rejection = jqXHR.responseJSON || {};
|
|
|
+
|
|
|
+ rejection.status = jqXHR.status;
|
|
|
+
|
|
|
+ if (rejection.status === 0) {
|
|
|
+ rejection.detail = gettext("Lost connection with application.");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rejection.status === 404) {
|
|
|
+ if (!rejection.detail || rejection.detail === 'NOT FOUND') {
|
|
|
+ rejection.detail = gettext("Action link is invalid.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rejection.status === 500 && !rejection.detail) {
|
|
|
+ rejection.detail = gettext("Unknown error has occured.");
|
|
|
+ }
|
|
|
+
|
|
|
+ rejection.statusText = jqXHR.statusText;
|
|
|
+
|
|
|
+ reject(rejection);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ $.ajax(xhr);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'get',
|
|
|
+ value: function get(url, params, lock) {
|
|
|
+ var _this = this;
|
|
|
+
|
|
|
+ if (params) {
|
|
|
+ url += '?' + $.param(params);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (lock) {
|
|
|
+ var _ret = function () {
|
|
|
+ var self = _this;
|
|
|
+
|
|
|
+ // update url in existing lock?
|
|
|
+ if (_this._locks[lock]) {
|
|
|
+ _this._locks[lock].url = url;
|
|
|
+ }
|
|
|
+
|
|
|
+ // immediately dereference promise handlers without doing anything
|
|
|
+ // we are already waiting for existing response to resolve
|
|
|
+ if (_this._locks[lock] && _this._locks[lock].waiter) {
|
|
|
+ return {
|
|
|
+ v: {
|
|
|
+ then: function then() {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // return promise that will begin when original one resolves
|
|
|
+ } else if (_this._locks[lock] && _this._locks[lock].wait) {
|
|
|
+ _this._locks[lock].waiter = true;
|
|
|
+
|
|
|
+ return {
|
|
|
+ v: new Promise(function (resolve, reject) {
|
|
|
+ var wait = function wait(url) {
|
|
|
+ // keep waiting on promise
|
|
|
+ if (self._locks[lock].wait) {
|
|
|
+ window.setTimeout(function () {
|
|
|
+ wait(url);
|
|
|
+ }, 300);
|
|
|
+
|
|
|
+ // poll for new url
|
|
|
+ } else if (self._locks[lock].url !== url) {
|
|
|
+ wait(self._locks[lock].url);
|
|
|
+
|
|
|
+ // ajax backend for response
|
|
|
+ } else {
|
|
|
+ self._locks[lock].waiter = false;
|
|
|
+ self.request('GET', self._locks[lock].url).then(function (data) {
|
|
|
+ if (self._locks[lock].url === url) {
|
|
|
+ resolve(data);
|
|
|
+ } else {
|
|
|
+ self._locks[lock].waiter = true;
|
|
|
+ wait(self._locks[lock].url);
|
|
|
+ }
|
|
|
+ }, function (rejection) {
|
|
|
+ if (self._locks[lock].url === url) {
|
|
|
+ reject(rejection);
|
|
|
+ } else {
|
|
|
+ self._locks[lock].waiter = true;
|
|
|
+ wait(self._locks[lock].url);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ window.setTimeout(function () {
|
|
|
+ wait(url);
|
|
|
+ }, 300);
|
|
|
+ })
|
|
|
+ };
|
|
|
+
|
|
|
+ // setup new lock without waiter
|
|
|
+ } else {
|
|
|
+ _this._locks[lock] = {
|
|
|
+ url: url,
|
|
|
+ wait: true,
|
|
|
+ waiter: false
|
|
|
+ };
|
|
|
+
|
|
|
+ return {
|
|
|
+ v: new Promise(function (resolve, reject) {
|
|
|
+ self.request('GET', url).then(function (data) {
|
|
|
+ self._locks[lock].wait = false;
|
|
|
+ if (self._locks[lock].url === url) {
|
|
|
+ resolve(data);
|
|
|
+ }
|
|
|
+ }, function (rejection) {
|
|
|
+ self._locks[lock].wait = false;
|
|
|
+ if (self._locks[lock].url === url) {
|
|
|
+ reject(rejection);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ })
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }();
|
|
|
+
|
|
|
+ if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v;
|
|
|
+ } else {
|
|
|
+ return this.request('GET', url);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'post',
|
|
|
+ value: function post(url, data) {
|
|
|
+ return this.request('POST', url, data);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'patch',
|
|
|
+ value: function patch(url, data) {
|
|
|
+ return this.request('PATCH', url, data);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'put',
|
|
|
+ value: function put(url, data) {
|
|
|
+ return this.request('PUT', url, data);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'delete',
|
|
|
+ value: function _delete(url) {
|
|
|
+ return this.request('DELETE', url);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'upload',
|
|
|
+ value: function upload(url, data, progress) {
|
|
|
+ var self = this;
|
|
|
+ return new Promise(function (resolve, reject) {
|
|
|
+ var xhr = {
|
|
|
+ url: url,
|
|
|
+ method: 'POST',
|
|
|
+ headers: {
|
|
|
+ 'X-CSRFToken': self._csrfToken
|
|
|
+ },
|
|
|
+
|
|
|
+ data: data,
|
|
|
+ contentType: false,
|
|
|
+ processData: false,
|
|
|
+
|
|
|
+ xhr: function xhr() {
|
|
|
+ var xhr = new window.XMLHttpRequest();
|
|
|
+ xhr.upload.addEventListener("progress", function (evt) {
|
|
|
+ if (evt.lengthComputable) {
|
|
|
+ progress(Math.round(evt.loaded / evt.total * 100));
|
|
|
+ }
|
|
|
+ }, false);
|
|
|
+ return xhr;
|
|
|
+ },
|
|
|
+
|
|
|
+ success: function success(response) {
|
|
|
+ resolve(response);
|
|
|
+ },
|
|
|
+
|
|
|
+ error: function error(jqXHR) {
|
|
|
+ var rejection = jqXHR.responseJSON || {};
|
|
|
+
|
|
|
+ rejection.status = jqXHR.status;
|
|
|
+
|
|
|
+ if (rejection.status === 0) {
|
|
|
+ rejection.detail = gettext("Lost connection with application.");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rejection.status === 404) {
|
|
|
+ if (!rejection.detail || rejection.detail === 'NOT FOUND') {
|
|
|
+ rejection.detail = gettext("Action link is invalid.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rejection.status === 500 && !rejection.detail) {
|
|
|
+ rejection.detail = gettext("Unknown error has occured.");
|
|
|
+ }
|
|
|
+
|
|
|
+ rejection.statusText = jqXHR.statusText;
|
|
|
+
|
|
|
+ reject(rejection);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ $.ajax(xhr);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return Ajax;
|
|
|
+}();
|
|
|
+
|
|
|
+exports.default = new Ajax();
|
|
|
+
|
|
|
+},{}],129:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.Auth = undefined;
|
|
|
+
|
|
|
+var _auth = require('../reducers/auth');
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var Auth = exports.Auth = function () {
|
|
|
+ function Auth() {
|
|
|
+ _classCallCheck(this, Auth);
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(Auth, [{
|
|
|
+ key: 'init',
|
|
|
+ value: function init(store, local, modal) {
|
|
|
+ this._store = store;
|
|
|
+ this._local = local;
|
|
|
+ this._modal = modal;
|
|
|
+
|
|
|
+ // tell other tabs what auth state is because we are most current with it
|
|
|
+ this.syncSession();
|
|
|
+
|
|
|
+ // listen for other tabs to tell us that state changed
|
|
|
+ this.watchState();
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'syncSession',
|
|
|
+ value: function syncSession() {
|
|
|
+ var state = this._store.getState().auth;
|
|
|
+ if (state.isAuthenticated) {
|
|
|
+ this._local.set('auth', {
|
|
|
+ isAuthenticated: true,
|
|
|
+ username: state.user.username
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ this._local.set('auth', {
|
|
|
+ isAuthenticated: false
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'watchState',
|
|
|
+ value: function watchState() {
|
|
|
+ var _this = this;
|
|
|
+
|
|
|
+ this._local.watch('auth', function (newState) {
|
|
|
+ if (newState.isAuthenticated) {
|
|
|
+ _this._store.dispatch((0, _auth.signIn)({
|
|
|
+ username: newState.username
|
|
|
+ }));
|
|
|
+ } else {
|
|
|
+ _this._store.dispatch((0, _auth.signOut)());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this._modal.hide();
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'signIn',
|
|
|
+ value: function signIn(user) {
|
|
|
+ this._store.dispatch((0, _auth.signIn)(user));
|
|
|
+ this._local.set('auth', {
|
|
|
+ isAuthenticated: true,
|
|
|
+ username: user.username
|
|
|
+ });
|
|
|
+ this._modal.hide();
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'signOut',
|
|
|
+ value: function signOut() {
|
|
|
+ this._store.dispatch((0, _auth.signOut)());
|
|
|
+ this._local.set('auth', {
|
|
|
+ isAuthenticated: false
|
|
|
+ });
|
|
|
+ this._modal.hide();
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'softSignOut',
|
|
|
+ value: function softSignOut() {
|
|
|
+ this._store.dispatch((0, _auth.signOut)(true));
|
|
|
+ this._local.set('auth', {
|
|
|
+ isAuthenticated: false
|
|
|
+ });
|
|
|
+ this._modal.hide();
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return Auth;
|
|
|
+}();
|
|
|
+
|
|
|
+exports.default = new Auth();
|
|
|
+
|
|
|
+},{"../reducers/auth":122}],130:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }(); /* global grecaptcha */
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.Captcha = exports.ReCaptcha = exports.ReCaptchaComponent = exports.QACaptcha = exports.NoCaptcha = exports.BaseCaptcha = undefined;
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _formGroup = require('../components/form-group');
|
|
|
+
|
|
|
+var _formGroup2 = _interopRequireDefault(_formGroup);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
+
|
|
|
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var BaseCaptcha = exports.BaseCaptcha = function () {
|
|
|
+ function BaseCaptcha() {
|
|
|
+ _classCallCheck(this, BaseCaptcha);
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(BaseCaptcha, [{
|
|
|
+ key: 'init',
|
|
|
+ value: function init(context, ajax, include, snackbar) {
|
|
|
+ this._context = context;
|
|
|
+ this._ajax = ajax;
|
|
|
+ this._include = include;
|
|
|
+ this._snackbar = snackbar;
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return BaseCaptcha;
|
|
|
+}();
|
|
|
+
|
|
|
+var NoCaptcha = exports.NoCaptcha = function (_BaseCaptcha) {
|
|
|
+ _inherits(NoCaptcha, _BaseCaptcha);
|
|
|
+
|
|
|
+ function NoCaptcha() {
|
|
|
+ _classCallCheck(this, NoCaptcha);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(NoCaptcha).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(NoCaptcha, [{
|
|
|
+ key: 'load',
|
|
|
+ value: function load() {
|
|
|
+ return new Promise(function (resolve) {
|
|
|
+ // immediately resolve as we don't have anything to validate
|
|
|
+ resolve();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'validator',
|
|
|
+ value: function validator() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'component',
|
|
|
+ value: function component() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return NoCaptcha;
|
|
|
+}(BaseCaptcha);
|
|
|
+
|
|
|
+var QACaptcha = exports.QACaptcha = function (_BaseCaptcha2) {
|
|
|
+ _inherits(QACaptcha, _BaseCaptcha2);
|
|
|
+
|
|
|
+ function QACaptcha() {
|
|
|
+ _classCallCheck(this, QACaptcha);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(QACaptcha).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(QACaptcha, [{
|
|
|
+ key: 'load',
|
|
|
+ value: function load() {
|
|
|
+ var self = this;
|
|
|
+ return new Promise(function (resolve, reject) {
|
|
|
+ self._ajax.get(self._context.get('CAPTCHA_API_URL')).then(function (data) {
|
|
|
+ self.question = data.question;
|
|
|
+ self.helpText = data.help_text;
|
|
|
+ resolve();
|
|
|
+ }, function () {
|
|
|
+ self._snackbar.error(gettext("Failed to load CAPTCHA."));
|
|
|
+ reject();
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'validator',
|
|
|
+ value: function validator() {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'component',
|
|
|
+ value: function component(kwargs) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: this.question, 'for': 'id_captcha',
|
|
|
+ labelClass: kwargs.labelClass || "col-sm-4",
|
|
|
+ controlClass: kwargs.controlClass || "col-sm-8",
|
|
|
+ validation: kwargs.form.state.errors.captcha,
|
|
|
+ helpText: this.helpText || null },
|
|
|
+ _react2.default.createElement('input', { type: 'text', id: 'id_captcha', className: 'form-control',
|
|
|
+ 'aria-describedby': 'id_captcha_status',
|
|
|
+ disabled: kwargs.form.state.isLoading,
|
|
|
+ onChange: kwargs.form.bindInput('captcha'),
|
|
|
+ value: kwargs.form.state.captcha })
|
|
|
+ );
|
|
|
+ }
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return QACaptcha;
|
|
|
+}(BaseCaptcha);
|
|
|
+
|
|
|
+var ReCaptchaComponent = exports.ReCaptchaComponent = function (_React$Component) {
|
|
|
+ _inherits(ReCaptchaComponent, _React$Component);
|
|
|
+
|
|
|
+ function ReCaptchaComponent() {
|
|
|
+ _classCallCheck(this, ReCaptchaComponent);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(ReCaptchaComponent).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(ReCaptchaComponent, [{
|
|
|
+ key: 'componentDidMount',
|
|
|
+ value: function componentDidMount() {
|
|
|
+ var _this4 = this;
|
|
|
+
|
|
|
+ grecaptcha.render('recaptcha', {
|
|
|
+ 'sitekey': this.props.siteKey,
|
|
|
+ 'callback': function callback(response) {
|
|
|
+ // fire fakey event to binding
|
|
|
+ _this4.props.binding({
|
|
|
+ target: {
|
|
|
+ value: response
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'render',
|
|
|
+ value: function render() {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ return _react2.default.createElement('div', { id: 'recaptcha' });
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return ReCaptchaComponent;
|
|
|
+}(_react2.default.Component);
|
|
|
+
|
|
|
+var ReCaptcha = exports.ReCaptcha = function (_BaseCaptcha3) {
|
|
|
+ _inherits(ReCaptcha, _BaseCaptcha3);
|
|
|
+
|
|
|
+ function ReCaptcha() {
|
|
|
+ _classCallCheck(this, ReCaptcha);
|
|
|
+
|
|
|
+ return _possibleConstructorReturn(this, Object.getPrototypeOf(ReCaptcha).apply(this, arguments));
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(ReCaptcha, [{
|
|
|
+ key: 'load',
|
|
|
+ value: function load() {
|
|
|
+ this._include.include('https://www.google.com/recaptcha/api.js', true);
|
|
|
+
|
|
|
+ return new Promise(function (resolve) {
|
|
|
+ var wait = function wait() {
|
|
|
+ if (typeof grecaptcha === "undefined") {
|
|
|
+ window.setTimeout(function () {
|
|
|
+ wait();
|
|
|
+ }, 200);
|
|
|
+ } else {
|
|
|
+ resolve();
|
|
|
+ }
|
|
|
+ };
|
|
|
+ wait();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'validator',
|
|
|
+ value: function validator() {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'component',
|
|
|
+ value: function component(kwargs) {
|
|
|
+ return _react2.default.createElement(
|
|
|
+ _formGroup2.default,
|
|
|
+ { label: gettext("Captcha"), 'for': 'id_captcha',
|
|
|
+ labelClass: kwargs.labelClass || "col-sm-4",
|
|
|
+ controlClass: kwargs.controlClass || "col-sm-8",
|
|
|
+ validation: kwargs.form.state.errors.captcha,
|
|
|
+ helpText: gettext("Please solve the quick test.") },
|
|
|
+ _react2.default.createElement(ReCaptchaComponent, { siteKey: this._context.get('SETTINGS').recaptcha_site_key,
|
|
|
+ binding: kwargs.form.bindInput('captcha') })
|
|
|
+ );
|
|
|
+ }
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return ReCaptcha;
|
|
|
+}(BaseCaptcha);
|
|
|
+
|
|
|
+var Captcha = exports.Captcha = function () {
|
|
|
+ function Captcha() {
|
|
|
+ _classCallCheck(this, Captcha);
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(Captcha, [{
|
|
|
+ key: 'init',
|
|
|
+ value: function init(context, ajax, include, snackbar) {
|
|
|
+ switch (context.get('SETTINGS').captcha_type) {
|
|
|
+ case 'no':
|
|
|
+ this._captcha = new NoCaptcha();
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'qa':
|
|
|
+ this._captcha = new QACaptcha();
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 're':
|
|
|
+ this._captcha = new ReCaptcha();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ this._captcha.init(context, ajax, include, snackbar);
|
|
|
+ }
|
|
|
+
|
|
|
+ // accessors for underlying strategy
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'load',
|
|
|
+ value: function load() {
|
|
|
+ return this._captcha.load();
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'validator',
|
|
|
+ value: function validator() {
|
|
|
+ return this._captcha.validator();
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'component',
|
|
|
+ value: function component(kwargs) {
|
|
|
+ return this._captcha.component(kwargs);
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return Captcha;
|
|
|
+}();
|
|
|
+
|
|
|
+exports.default = new Captcha();
|
|
|
+
|
|
|
+},{"../components/form-group":61,"react":"react"}],131:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+var Include = exports.Include = function () {
|
|
|
+ function Include() {
|
|
|
+ _classCallCheck(this, Include);
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(Include, [{
|
|
|
+ key: 'init',
|
|
|
+ value: function init(staticUrl) {
|
|
|
+ this._staticUrl = staticUrl;
|
|
|
+ this._included = [];
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'include',
|
|
|
+ value: function include(script) {
|
|
|
+ var remote = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];
|
|
|
+
|
|
|
+ if (this._included.indexOf(script) === -1) {
|
|
|
+ this._included.push(script);
|
|
|
+ this._include(script, remote);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: '_include',
|
|
|
+ value: function _include(script, remote) {
|
|
|
+ $.ajax({
|
|
|
+ url: (!remote ? this._staticUrl : '') + script,
|
|
|
+ cache: true,
|
|
|
+ dataType: 'script'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return Include;
|
|
|
+}();
|
|
|
+
|
|
|
+exports.default = new Include();
|
|
|
+
|
|
|
+},{}],132:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+var storage = window.localStorage;
|
|
|
+
|
|
|
+var LocalStorage = exports.LocalStorage = function () {
|
|
|
+ function LocalStorage() {
|
|
|
+ _classCallCheck(this, LocalStorage);
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(LocalStorage, [{
|
|
|
+ key: 'init',
|
|
|
+ value: function init(prefix) {
|
|
|
+ var _this = this;
|
|
|
+
|
|
|
+ this._prefix = prefix;
|
|
|
+ this._watchers = [];
|
|
|
+
|
|
|
+ window.addEventListener('storage', function (e) {
|
|
|
+ var newValueJson = JSON.parse(e.newValue);
|
|
|
+ _this._watchers.forEach(function (watcher) {
|
|
|
+ if (watcher.key === e.key && e.oldValue !== e.newValue) {
|
|
|
+ watcher.callback(newValueJson);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'set',
|
|
|
+ value: function set(key, value) {
|
|
|
+ storage.setItem(this._prefix + key, JSON.stringify(value));
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'get',
|
|
|
+ value: function get(key) {
|
|
|
+ var itemString = storage.getItem(this._prefix + key);
|
|
|
+ if (itemString) {
|
|
|
+ return JSON.parse(itemString);
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'watch',
|
|
|
+ value: function watch(key, callback) {
|
|
|
+ this._watchers.push({
|
|
|
+ key: this._prefix + key,
|
|
|
+ callback: callback
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return LocalStorage;
|
|
|
+}();
|
|
|
+
|
|
|
+exports.default = new LocalStorage();
|
|
|
+
|
|
|
+},{}],133:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.MobileNavbarDropdown = undefined;
|
|
|
+
|
|
|
+var _mountComponent = require('../utils/mount-component');
|
|
|
+
|
|
|
+var _mountComponent2 = _interopRequireDefault(_mountComponent);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+var MobileNavbarDropdown = exports.MobileNavbarDropdown = function () {
|
|
|
+ function MobileNavbarDropdown() {
|
|
|
+ _classCallCheck(this, MobileNavbarDropdown);
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(MobileNavbarDropdown, [{
|
|
|
+ key: 'init',
|
|
|
+ value: function init(element) {
|
|
|
+ this._element = element;
|
|
|
+ this._component = null;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'show',
|
|
|
+ value: function show(component) {
|
|
|
+ if (this._component === component) {
|
|
|
+ this.hide();
|
|
|
+ } else {
|
|
|
+ this._component = component;
|
|
|
+ (0, _mountComponent2.default)(component, this._element.id);
|
|
|
+ $(this._element).addClass('open');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'showConnected',
|
|
|
+ value: function showConnected(name, component) {
|
|
|
+ if (this._component === name) {
|
|
|
+ this.hide();
|
|
|
+ } else {
|
|
|
+ this._component = name;
|
|
|
+ (0, _mountComponent2.default)(component, this._element.id, true);
|
|
|
+ $(this._element).addClass('open');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'hide',
|
|
|
+ value: function hide() {
|
|
|
+ $(this._element).removeClass('open');
|
|
|
+ this._component = null;
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return MobileNavbarDropdown;
|
|
|
+}();
|
|
|
+
|
|
|
+exports.default = new MobileNavbarDropdown();
|
|
|
+
|
|
|
+},{"../utils/mount-component":143}],134:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.Modal = undefined;
|
|
|
+
|
|
|
+var _reactDom = require('react-dom');
|
|
|
+
|
|
|
+var _reactDom2 = _interopRequireDefault(_reactDom);
|
|
|
+
|
|
|
+var _mountComponent = require('../utils/mount-component');
|
|
|
+
|
|
|
+var _mountComponent2 = _interopRequireDefault(_mountComponent);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+var Modal = exports.Modal = function () {
|
|
|
+ function Modal() {
|
|
|
+ _classCallCheck(this, Modal);
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(Modal, [{
|
|
|
+ key: 'init',
|
|
|
+ value: function init(element) {
|
|
|
+ var _this = this;
|
|
|
+
|
|
|
+ this._element = element;
|
|
|
+
|
|
|
+ this._modal = $(element).modal({ show: false });
|
|
|
+
|
|
|
+ this._modal.on('hidden.bs.modal', function () {
|
|
|
+ _reactDom2.default.unmountComponentAtNode(_this._element);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'show',
|
|
|
+ value: function show(component) {
|
|
|
+ (0, _mountComponent2.default)(component, this._element.id);
|
|
|
+ this._modal.modal('show');
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'hide',
|
|
|
+ value: function hide() {
|
|
|
+ this._modal.modal('hide');
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return Modal;
|
|
|
+}();
|
|
|
+
|
|
|
+exports.default = new Modal();
|
|
|
+
|
|
|
+},{"../utils/mount-component":143,"react-dom":"react-dom"}],135:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+var PageTitle = exports.PageTitle = function () {
|
|
|
+ function PageTitle() {
|
|
|
+ _classCallCheck(this, PageTitle);
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(PageTitle, [{
|
|
|
+ key: 'init',
|
|
|
+ value: function init(forumName) {
|
|
|
+ this._forumName = forumName;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'set',
|
|
|
+ value: function set(title) {
|
|
|
+ if (typeof title === 'string') {
|
|
|
+ title = { title: title };
|
|
|
+ }
|
|
|
+
|
|
|
+ var finalTitle = title.title;
|
|
|
+
|
|
|
+ if (title.page) {
|
|
|
+ var pageLabel = interpolate(gettext('page: %(page)s'), {
|
|
|
+ page: title.page
|
|
|
+ }, true);
|
|
|
+
|
|
|
+ finalTitle += ' (' + pageLabel + ')';
|
|
|
+ }
|
|
|
+
|
|
|
+ if (title.parent) {
|
|
|
+ finalTitle += ' | ' + title.parent;
|
|
|
+ }
|
|
|
+
|
|
|
+ document.title = finalTitle + ' | ' + this._forumName;
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return PageTitle;
|
|
|
+}();
|
|
|
+
|
|
|
+exports.default = new PageTitle();
|
|
|
+
|
|
|
+},{}],136:[function(require,module,exports){
|
|
|
+"use strict";
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+var Polls = exports.Polls = function () {
|
|
|
+ function Polls() {
|
|
|
+ _classCallCheck(this, Polls);
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(Polls, [{
|
|
|
+ key: "init",
|
|
|
+ value: function init(ajax, snackbar) {
|
|
|
+ this._ajax = ajax;
|
|
|
+ this._snackbar = snackbar;
|
|
|
+
|
|
|
+ this._polls = {};
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "start",
|
|
|
+ value: function start(kwargs) {
|
|
|
+ var _this = this;
|
|
|
+
|
|
|
+ var poolServer = function poolServer() {
|
|
|
+ _this._polls[kwargs.poll] = kwargs;
|
|
|
+
|
|
|
+ _this._ajax.get(kwargs.url, kwargs.data || null).then(function (data) {
|
|
|
+ kwargs.update(data);
|
|
|
+
|
|
|
+ _this._polls[kwargs.poll].timeout = window.setTimeout(poolServer, kwargs.frequency);
|
|
|
+ }, function (rejection) {
|
|
|
+ if (kwargs.error) {
|
|
|
+ kwargs.error(rejection);
|
|
|
+ } else {
|
|
|
+ _this._snackbar.apiError(rejection);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ poolServer();
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "stop",
|
|
|
+ value: function stop(pollId) {
|
|
|
+ if (this._polls[pollId]) {
|
|
|
+ window.clearTimeout(this._polls[pollId].timeout);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return Polls;
|
|
|
+}();
|
|
|
+
|
|
|
+exports.default = new Polls();
|
|
|
+
|
|
|
+},{}],137:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.Snackbar = undefined;
|
|
|
+
|
|
|
+var _snackbar = require('../reducers/snackbar');
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+var HIDE_ANIMATION_LENGTH = 300;
|
|
|
+var MESSAGE_SHOW_LENGTH = 5000;
|
|
|
+
|
|
|
+var Snackbar = exports.Snackbar = function () {
|
|
|
+ function Snackbar() {
|
|
|
+ _classCallCheck(this, Snackbar);
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(Snackbar, [{
|
|
|
+ key: 'init',
|
|
|
+ value: function init(store) {
|
|
|
+ this._store = store;
|
|
|
+ this._timeout = null;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'alert',
|
|
|
+ value: function alert(message, type) {
|
|
|
+ var _this = this;
|
|
|
+
|
|
|
+ if (this._timeout) {
|
|
|
+ window.clearTimeout(this._timeout);
|
|
|
+ this._store.dispatch((0, _snackbar.hideSnackbar)());
|
|
|
+
|
|
|
+ this._timeout = window.setTimeout(function () {
|
|
|
+ _this._timeout = null;
|
|
|
+ _this.alert(message, type);
|
|
|
+ }, HIDE_ANIMATION_LENGTH);
|
|
|
+ } else {
|
|
|
+ this._store.dispatch((0, _snackbar.showSnackbar)(message, type));
|
|
|
+ this._timeout = window.setTimeout(function () {
|
|
|
+ _this._store.dispatch((0, _snackbar.hideSnackbar)());
|
|
|
+ _this._timeout = null;
|
|
|
+ }, MESSAGE_SHOW_LENGTH);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // shorthands for message types
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'info',
|
|
|
+ value: function info(message) {
|
|
|
+ this.alert(message, 'info');
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'success',
|
|
|
+ value: function success(message) {
|
|
|
+ this.alert(message, 'success');
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'warning',
|
|
|
+ value: function warning(message) {
|
|
|
+ this.alert(message, 'warning');
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'error',
|
|
|
+ value: function error(message) {
|
|
|
+ this.alert(message, 'error');
|
|
|
+ }
|
|
|
+
|
|
|
+ // shorthand for api errors
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'apiError',
|
|
|
+ value: function apiError(rejection) {
|
|
|
+ var message = rejection.detail;
|
|
|
+
|
|
|
+ if (!message) {
|
|
|
+ if (rejection.status === 404) {
|
|
|
+ message = gettext("Action link is invalid.");
|
|
|
+ } else {
|
|
|
+ message = gettext("Unknown error has occured.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rejection.status === 403 && message === "Permission denied") {
|
|
|
+ message = gettext("You don't have permission to perform this action.");
|
|
|
+ }
|
|
|
+
|
|
|
+ this.error(message);
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return Snackbar;
|
|
|
+}();
|
|
|
+
|
|
|
+exports.default = new Snackbar();
|
|
|
+
|
|
|
+},{"../reducers/snackbar":124}],138:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.StoreWrapper = undefined;
|
|
|
+
|
|
|
+var _redux = require('redux');
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+var StoreWrapper = exports.StoreWrapper = function () {
|
|
|
+ function StoreWrapper() {
|
|
|
+ _classCallCheck(this, StoreWrapper);
|
|
|
+
|
|
|
+ this._store = null;
|
|
|
+ this._reducers = {};
|
|
|
+ this._initialState = {};
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(StoreWrapper, [{
|
|
|
+ key: 'addReducer',
|
|
|
+ value: function addReducer(name, reducer, initialState) {
|
|
|
+ this._reducers[name] = reducer;
|
|
|
+ this._initialState[name] = initialState;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'init',
|
|
|
+ value: function init() {
|
|
|
+ this._store = (0, _redux.createStore)((0, _redux.combineReducers)(this._reducers), this._initialState);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'getStore',
|
|
|
+ value: function getStore() {
|
|
|
+ return this._store;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Store API
|
|
|
+
|
|
|
+ }, {
|
|
|
+ key: 'getState',
|
|
|
+ value: function getState() {
|
|
|
+ return this._store.getState();
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: 'dispatch',
|
|
|
+ value: function dispatch(action) {
|
|
|
+ return this._store.dispatch(action);
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return StoreWrapper;
|
|
|
+}();
|
|
|
+
|
|
|
+exports.default = new StoreWrapper();
|
|
|
+
|
|
|
+},{"redux":"redux"}],139:[function(require,module,exports){
|
|
|
+"use strict";
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+/* global zxcvbn */
|
|
|
+
|
|
|
+var Zxcvbn = exports.Zxcvbn = function () {
|
|
|
+ function Zxcvbn() {
|
|
|
+ _classCallCheck(this, Zxcvbn);
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(Zxcvbn, [{
|
|
|
+ key: "init",
|
|
|
+ value: function init(include) {
|
|
|
+ this._include = include;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "scorePassword",
|
|
|
+ value: function scorePassword(password, inputs) {
|
|
|
+ // 0-4 score, the more the stronger password
|
|
|
+ return zxcvbn(password, inputs).score;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "load",
|
|
|
+ value: function load() {
|
|
|
+ if (typeof zxcvbn === "undefined") {
|
|
|
+ this._include.include('misago/js/zxcvbn.js');
|
|
|
+ return this._loadingPromise();
|
|
|
+ } else {
|
|
|
+ return this._loadedPromise();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "_loadingPromise",
|
|
|
+ value: function _loadingPromise() {
|
|
|
+ return new Promise(function (resolve) {
|
|
|
+ var wait = function wait() {
|
|
|
+ if (typeof zxcvbn === "undefined") {
|
|
|
+ window.setTimeout(function () {
|
|
|
+ wait();
|
|
|
+ }, 200);
|
|
|
+ } else {
|
|
|
+ resolve();
|
|
|
+ }
|
|
|
+ };
|
|
|
+ wait();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "_loadedPromise",
|
|
|
+ value: function _loadedPromise() {
|
|
|
+ // we have already loaded zxcvbn.js, resolve away!
|
|
|
+ return new Promise(function (resolve) {
|
|
|
+ resolve();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return Zxcvbn;
|
|
|
+}();
|
|
|
+
|
|
|
+exports.default = new Zxcvbn();
|
|
|
+
|
|
|
+},{}],140:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+exports.default = function (ban, changeState) {
|
|
|
+ _reactDom2.default.render(
|
|
|
+ /* jshint ignore:start */
|
|
|
+ _react2.default.createElement(
|
|
|
+ _reactRedux.Provider,
|
|
|
+ { store: _store2.default.getStore() },
|
|
|
+ _react2.default.createElement(RedrawedBannedPage, { message: ban.message,
|
|
|
+ expires: ban.expires_on ? (0, _moment2.default)(ban.expires_on) : null })
|
|
|
+ ),
|
|
|
+ /* jshint ignore:end */
|
|
|
+ document.getElementById('page-mount'));
|
|
|
+
|
|
|
+ if (typeof changeState === 'undefined' || changeState) {
|
|
|
+ var forumName = _index2.default.get('SETTINGS').forum_name;
|
|
|
+ document.title = gettext("You are banned") + ' | ' + forumName;
|
|
|
+ window.history.pushState({}, "", _index2.default.get('BANNED_URL'));
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+var _moment = require('moment');
|
|
|
+
|
|
|
+var _moment2 = _interopRequireDefault(_moment);
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _reactDom = require('react-dom');
|
|
|
+
|
|
|
+var _reactDom2 = _interopRequireDefault(_reactDom);
|
|
|
+
|
|
|
+var _reactRedux = require('react-redux');
|
|
|
+
|
|
|
+var _bannedPage = require('../components/banned-page');
|
|
|
+
|
|
|
+var _bannedPage2 = _interopRequireDefault(_bannedPage);
|
|
|
+
|
|
|
+var _index = require('../index');
|
|
|
+
|
|
|
+var _index2 = _interopRequireDefault(_index);
|
|
|
+
|
|
|
+var _store = require('../services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+/* jshint ignore:start */
|
|
|
+// jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+var select = function select(state) {
|
|
|
+ return state.tick;
|
|
|
+}; // jshint ignore:line
|
|
|
+// jshint ignore:line
|
|
|
+
|
|
|
+var RedrawedBannedPage = (0, _reactRedux.connect)(select)(_bannedPage2.default);
|
|
|
+/* jshint ignore:end */
|
|
|
+
|
|
|
+},{"../components/banned-page":54,"../index":121,"../services/store":138,"moment":"moment","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],141:[function(require,module,exports){
|
|
|
+"use strict";
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+exports.default = function (list, rowWidth) {
|
|
|
+ var padding = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];
|
|
|
+
|
|
|
+ var rows = [];
|
|
|
+ var row = [];
|
|
|
+
|
|
|
+ list.forEach(function (element) {
|
|
|
+ row.push(element);
|
|
|
+ if (row.length === rowWidth) {
|
|
|
+ rows.push(row);
|
|
|
+ row = [];
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // pad row to required length?
|
|
|
+ if (padding !== false && row.length > 0 && row.length < rowWidth) {
|
|
|
+ for (var i = row.length; i < rowWidth; i++) {
|
|
|
+ row.push(padding);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (row.length) {
|
|
|
+ rows.push(row);
|
|
|
+ }
|
|
|
+
|
|
|
+ return rows;
|
|
|
+};
|
|
|
+
|
|
|
+},{}],142:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+exports.default = function (bytes) {
|
|
|
+ if (bytes > 1000 * 1000 * 1000) {
|
|
|
+ return Math.round(bytes * 100 / (1000 * 1000 * 1000)) / 100 + ' GB';
|
|
|
+ } else if (bytes > 1000 * 1000) {
|
|
|
+ return Math.round(bytes * 100 / (1000 * 1000)) / 100 + ' MB';
|
|
|
+ } else if (bytes > 1000) {
|
|
|
+ return Math.round(bytes * 100 / 1000) / 100 + ' KB';
|
|
|
+ } else {
|
|
|
+ return Math.round(bytes * 100) / 100 + ' B';
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+},{}],143:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+exports.default = function (Component, rootElementId) {
|
|
|
+ var connected = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2];
|
|
|
+
|
|
|
+ var rootElement = document.getElementById(rootElementId);
|
|
|
+
|
|
|
+ /* jshint ignore:start */
|
|
|
+ var finalComponent = Component.props ? Component : _react2.default.createElement(Component, null);
|
|
|
+ /* jshint ignore:end */
|
|
|
+
|
|
|
+ if (rootElement) {
|
|
|
+ if (connected) {
|
|
|
+ _reactDom2.default.render(
|
|
|
+ /* jshint ignore:start */
|
|
|
+ _react2.default.createElement(
|
|
|
+ _reactRedux.Provider,
|
|
|
+ { store: _store2.default.getStore() },
|
|
|
+ finalComponent
|
|
|
+ ),
|
|
|
+ /* jshint ignore:end */
|
|
|
+ rootElement);
|
|
|
+ } else {
|
|
|
+ /* jshint ignore:start */
|
|
|
+ _reactDom2.default.render(finalComponent, rootElement);
|
|
|
+ /* jshint ignore:end */
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _reactDom = require('react-dom');
|
|
|
+
|
|
|
+var _reactDom2 = _interopRequireDefault(_reactDom);
|
|
|
+
|
|
|
+var _reactRedux = require('react-redux');
|
|
|
+
|
|
|
+var _store = require('../services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+},{"../services/store":138,"react":"react","react-dom":"react-dom","react-redux":"react-redux"}],144:[function(require,module,exports){
|
|
|
+"use strict";
|
|
|
+
|
|
|
+var _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; }; }();
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
+
|
|
|
+var OrderedList = function () {
|
|
|
+ function OrderedList(items) {
|
|
|
+ _classCallCheck(this, OrderedList);
|
|
|
+
|
|
|
+ this.isOrdered = false;
|
|
|
+ this._items = items || [];
|
|
|
+ }
|
|
|
+
|
|
|
+ _createClass(OrderedList, [{
|
|
|
+ key: "add",
|
|
|
+ value: function add(key, item, order) {
|
|
|
+ this._items.push({
|
|
|
+ key: key,
|
|
|
+ item: item,
|
|
|
+
|
|
|
+ after: order ? order.after || null : null,
|
|
|
+ before: order ? order.before || null : null
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "get",
|
|
|
+ value: function get(key, value) {
|
|
|
+ for (var i = 0; i < this._items.length; i++) {
|
|
|
+ if (this._items[i].key === key) {
|
|
|
+ return this._items[i].item;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "has",
|
|
|
+ value: function has(key) {
|
|
|
+ return this.get(key) !== undefined;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "values",
|
|
|
+ value: function values() {
|
|
|
+ var values = [];
|
|
|
+ for (var i = 0; i < this._items.length; i++) {
|
|
|
+ values.push(this._items[i].item);
|
|
|
+ }
|
|
|
+ return values;
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "order",
|
|
|
+ value: function order(values_only) {
|
|
|
+ if (!this.isOrdered) {
|
|
|
+ this._items = this._order(this._items);
|
|
|
+ this.isOrdered = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (values_only || typeof values_only === 'undefined') {
|
|
|
+ return this.values();
|
|
|
+ } else {
|
|
|
+ return this._items;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "orderedValues",
|
|
|
+ value: function orderedValues() {
|
|
|
+ return this.order(true);
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ key: "_order",
|
|
|
+ value: function _order(unordered) {
|
|
|
+ // Index of unordered items
|
|
|
+ var index = [];
|
|
|
+ unordered.forEach(function (item) {
|
|
|
+ index.push(item.key);
|
|
|
+ });
|
|
|
+
|
|
|
+ // Ordered items
|
|
|
+ var ordered = [];
|
|
|
+ var ordering = [];
|
|
|
+
|
|
|
+ // First pass: register items that
|
|
|
+ // don't specify their order
|
|
|
+ unordered.forEach(function (item) {
|
|
|
+ if (!item.after && !item.before) {
|
|
|
+ ordered.push(item);
|
|
|
+ ordering.push(item.key);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // Second pass: register items that
|
|
|
+ // specify their before to "_end"
|
|
|
+ unordered.forEach(function (item) {
|
|
|
+ if (item.before === "_end") {
|
|
|
+ ordered.push(item);
|
|
|
+ ordering.push(item.key);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // Third pass: keep iterating items
|
|
|
+ // until we hit iterations limit or finish
|
|
|
+ // ordering list
|
|
|
+ function insertItem(item) {
|
|
|
+ var insertAt = -1;
|
|
|
+ if (ordering.indexOf(item.key) === -1) {
|
|
|
+ if (item.after) {
|
|
|
+ insertAt = ordering.indexOf(item.after);
|
|
|
+ if (insertAt !== -1) {
|
|
|
+ insertAt += 1;
|
|
|
+ }
|
|
|
+ } else if (item.before) {
|
|
|
+ insertAt = ordering.indexOf(item.before);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (insertAt !== -1) {
|
|
|
+ ordered.splice(insertAt, 0, item);
|
|
|
+ ordering.splice(insertAt, 0, item.key);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ var iterations = 200;
|
|
|
+ while (iterations > 0 && index.length !== ordering.length) {
|
|
|
+ iterations -= 1;
|
|
|
+ unordered.forEach(insertItem);
|
|
|
+ }
|
|
|
+
|
|
|
+ return ordered;
|
|
|
+ }
|
|
|
+ }]);
|
|
|
+
|
|
|
+ return OrderedList;
|
|
|
+}();
|
|
|
+
|
|
|
+exports.default = OrderedList;
|
|
|
+
|
|
|
+},{}],145:[function(require,module,exports){
|
|
|
+"use strict";
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.int = int;
|
|
|
+exports.range = range;
|
|
|
+function int(min, max) {
|
|
|
+ return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
|
+}
|
|
|
+
|
|
|
+function range(min, max) {
|
|
|
+ var array = new Array(int(min, max));
|
|
|
+ for (var i = 0; i < array.length; i++) {
|
|
|
+ array[i] = i;
|
|
|
+ }
|
|
|
+
|
|
|
+ return array;
|
|
|
+}
|
|
|
+
|
|
|
+},{}],146:[function(require,module,exports){
|
|
|
+"use strict";
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+exports.default = function () {
|
|
|
+ window.scrollTo(0, 0);
|
|
|
+};
|
|
|
+
|
|
|
+},{}],147:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+
|
|
|
+exports.default = function (options) {
|
|
|
+ var routes = {
|
|
|
+ component: options.component,
|
|
|
+ childRoutes: [{
|
|
|
+ path: options.root,
|
|
|
+ onEnter: function onEnter(nextState, replaceState) {
|
|
|
+ replaceState(null, options.paths[0].path);
|
|
|
+ }
|
|
|
+ }].concat(options.paths.map(function (path) {
|
|
|
+ return path;
|
|
|
+ }))
|
|
|
+ };
|
|
|
+
|
|
|
+ _reactDom2.default.render(_react2.default.createElement(
|
|
|
+ _reactRedux.Provider,
|
|
|
+ { store: _store2.default.getStore() },
|
|
|
+ _react2.default.createElement(_reactRouter.Router, { routes: routes, history: history })
|
|
|
+ ), rootElement);
|
|
|
+};
|
|
|
+
|
|
|
+var _react = require('react');
|
|
|
+
|
|
|
+var _react2 = _interopRequireDefault(_react);
|
|
|
+
|
|
|
+var _reactDom = require('react-dom');
|
|
|
+
|
|
|
+var _reactDom2 = _interopRequireDefault(_reactDom);
|
|
|
+
|
|
|
+var _reactRedux = require('react-redux');
|
|
|
+
|
|
|
+var _reactRouter = require('react-router');
|
|
|
+
|
|
|
+var _createBrowserHistory = require('history/lib/createBrowserHistory');
|
|
|
+
|
|
|
+var _createBrowserHistory2 = _interopRequireDefault(_createBrowserHistory);
|
|
|
+
|
|
|
+var _store = require('../services/store');
|
|
|
+
|
|
|
+var _store2 = _interopRequireDefault(_store);
|
|
|
+
|
|
|
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
+
|
|
|
+// jshint ignore:start
|
|
|
+
|
|
|
+var rootElement = document.getElementById('page-mount');
|
|
|
+var history = new _createBrowserHistory2.default();
|
|
|
+
|
|
|
+},{"../services/store":138,"history/lib/createBrowserHistory":42,"react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router"}],148:[function(require,module,exports){
|
|
|
+'use strict';
|
|
|
+
|
|
|
+Object.defineProperty(exports, "__esModule", {
|
|
|
+ value: true
|
|
|
+});
|
|
|
+exports.required = required;
|
|
|
+exports.email = email;
|
|
|
+exports.minLength = minLength;
|
|
|
+exports.maxLength = maxLength;
|
|
|
+exports.usernameMinLength = usernameMinLength;
|
|
|
+exports.usernameMaxLength = usernameMaxLength;
|
|
|
+exports.usernameContent = usernameContent;
|
|
|
+exports.passwordMinLength = passwordMinLength;
|
|
|
+var EMAIL = /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
|
|
|
+var USERNAME = new RegExp('^[0-9a-z]+$', 'i');
|
|
|
+
|
|
|
+function required() {
|
|
|
+ return function (value) {
|
|
|
+ if ($.trim(value).length === 0) {
|
|
|
+ return gettext("This field is required.");
|
|
|
+ }
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function email(message) {
|
|
|
+ return function (value) {
|
|
|
+ if (!EMAIL.test(value)) {
|
|
|
+ return message || gettext("Enter a valid email address.");
|
|
|
+ }
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function minLength(limitValue, message) {
|
|
|
+ return function (value) {
|
|
|
+ var returnMessage = '';
|
|
|
+ var length = $.trim(value).length;
|
|
|
+
|
|
|
+ if (length < limitValue) {
|
|
|
+ if (message) {
|
|
|
+ returnMessage = message(limitValue, length);
|
|
|
+ } else {
|
|
|
+ returnMessage = ngettext("Ensure this value has at least %(limit_value)s character (it has %(show_value)s).", "Ensure this value has at least %(limit_value)s characters (it has %(show_value)s).", limitValue);
|
|
|
+ }
|
|
|
+ return interpolate(returnMessage, {
|
|
|
+ limit_value: limitValue,
|
|
|
+ show_value: length
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function maxLength(limitValue, message) {
|
|
|
+ return function (value) {
|
|
|
+ var returnMessage = '';
|
|
|
+ var length = $.trim(value).length;
|
|
|
+
|
|
|
+ if (length > limitValue) {
|
|
|
+ if (message) {
|
|
|
+ returnMessage = message(limitValue, length);
|
|
|
+ } else {
|
|
|
+ returnMessage = ngettext("Ensure this value has at most %(limit_value)s character (it has %(show_value)s).", "Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).", limitValue);
|
|
|
+ }
|
|
|
+ return interpolate(returnMessage, {
|
|
|
+ limit_value: limitValue,
|
|
|
+ show_value: length
|
|
|
+ }, true);
|
|
|
+ }
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function usernameMinLength(settings) {
|
|
|
+ var message = function message(limitValue) {
|
|
|
+ return ngettext("Username must be at least %(limit_value)s character long.", "Username must be at least %(limit_value)s characters long.", limitValue);
|
|
|
+ };
|
|
|
+ return this.minLength(settings.username_length_min, message);
|
|
|
+}
|
|
|
+
|
|
|
+function usernameMaxLength(settings) {
|
|
|
+ var message = function message(limitValue) {
|
|
|
+ return ngettext("Username cannot be longer than %(limit_value)s character.", "Username cannot be longer than %(limit_value)s characters.", limitValue);
|
|
|
+ };
|
|
|
+ return this.maxLength(settings.username_length_max, message);
|
|
|
+}
|
|
|
+
|
|
|
+function usernameContent() {
|
|
|
+ return function (value) {
|
|
|
+ if (!USERNAME.test($.trim(value))) {
|
|
|
+ return gettext("Username can only contain latin alphabet letters and digits.");
|
|
|
+ }
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function passwordMinLength(settings) {
|
|
|
+ var message = function message(limitValue) {
|
|
|
+ return ngettext("Valid password must be at least %(limit_value)s character long.", "Valid password must be at least %(limit_value)s characters long.", limitValue);
|
|
|
+ };
|
|
|
+ return this.minLength(settings.password_length_min, message);
|
|
|
+}
|
|
|
+
|
|
|
+},{}]},{},[2,3,4,5,16,17,18,19,20,21,22,30,31,32,33,6,7,8,9,10,11,12,13,14,15,23,24,25,26,27,28,29])
|
|
|
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwic3JjL2luZGV4LmpzIiwic3JjL2luaXRpYWxpemVycy9hamF4LmpzIiwic3JjL2luaXRpYWxpemVycy9hdXRoLmpzIiwic3JjL2luaXRpYWxpemVycy9jYXRjaGEuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2NvbXBvbmVudHMvYXV0aC1tZXNzYWdlLmpzIiwic3JjL2luaXRpYWxpemVycy9jb21wb25lbnRzL2Jhbm5lZC1wYWdlLmpzIiwic3JjL2luaXRpYWxpemVycy9jb21wb25lbnRzL29wdGlvbnMuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2NvbXBvbmVudHMvcHJvZmlsZS5qcyIsInNyYy9pbml0aWFsaXplcnMvY29tcG9uZW50cy9yZXF1ZXN0LWFjdGl2YXRpb24tbGluay5qcyIsInNyYy9pbml0aWFsaXplcnMvY29tcG9uZW50cy9yZXF1ZXN0LXBhc3N3b3JkLXJlc2V0LmpzIiwic3JjL2luaXRpYWxpemVycy9jb21wb25lbnRzL3Jlc2V0LXBhc3N3b3JkLWZvcm0uanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2NvbXBvbmVudHMvc25hY2tiYXIuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2NvbXBvbmVudHMvdXNlci1tZW51LmpzIiwic3JjL2luaXRpYWxpemVycy9jb21wb25lbnRzL3VzZXJzLmpzIiwic3JjL2luaXRpYWxpemVycy9pbmNsdWRlLmpzIiwic3JjL2luaXRpYWxpemVycy9sb2NhbC1zdG9yYWdlLmpzIiwic3JjL2luaXRpYWxpemVycy9tb2JpbGUtbmF2YmFyLWRyb3Bkb3duLmpzIiwic3JjL2luaXRpYWxpemVycy9tb2RhbC5qcyIsInNyYy9pbml0aWFsaXplcnMvbW9tZW50LWxvY2FsZS5qcyIsInNyYy9pbml0aWFsaXplcnMvcGFnZS10aXRsZS5qcyIsInNyYy9pbml0aWFsaXplcnMvcG9sbHMuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL3JlZHVjZXJzL2F1dGguanMiLCJzcmMvaW5pdGlhbGl6ZXJzL3JlZHVjZXJzL3Byb2ZpbGUtZGVoeWRyYXRlLmpzIiwic3JjL2luaXRpYWxpemVycy9yZWR1Y2Vycy9wcm9maWxlLmpzIiwic3JjL2luaXRpYWxpemVycy9yZWR1Y2Vycy9zbmFja2Jhci5qcyIsInNyYy9pbml0aWFsaXplcnMvcmVkdWNlcnMvdGljay5qcyIsInNyYy9pbml0aWFsaXplcnMvcmVkdWNlcnMvdXNlcm5hbWUtaGlzdG9yeS5qcyIsInNyYy9pbml0aWFsaXplcnMvcmVkdWNlcnMvdXNlcnMuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL3NuYWNrYmFyLmpzIiwic3JjL2luaXRpYWxpemVycy9zdG9yZS5qcyIsInNyYy9pbml0aWFsaXplcnMvdGljay1zdGFydC5qcyIsInNyYy9pbml0aWFsaXplcnMvenhjdmJuLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL25vZGVfbW9kdWxlcy9kZWVwLWVxdWFsL2luZGV4LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL25vZGVfbW9kdWxlcy9kZWVwLWVxdWFsL2xpYi9pc19hcmd1bWVudHMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2RlZXAtZXF1YWwvbGliL2tleXMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2hpc3RvcnkvbGliL0FjdGlvbnMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2hpc3RvcnkvbGliL0FzeW5jVXRpbHMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2hpc3RvcnkvbGliL0RPTVN0YXRlU3RvcmFnZS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvRE9NVXRpbHMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2hpc3RvcnkvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL25vZGVfbW9kdWxlcy9oaXN0b3J5L2xpYi9jcmVhdGVCcm93c2VySGlzdG9yeS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvY3JlYXRlRE9NSGlzdG9yeS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvY3JlYXRlSGlzdG9yeS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvY3JlYXRlTG9jYXRpb24uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2hpc3RvcnkvbGliL2RlcHJlY2F0ZS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvZXh0cmFjdFBhdGguanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2hpc3RvcnkvbGliL3BhcnNlUGF0aC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9ub2RlX21vZHVsZXMvaGlzdG9yeS9saWIvcnVuVHJhbnNpdGlvbkhvb2suanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL2ludmFyaWFudC9icm93c2VyLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL25vZGVfbW9kdWxlcy93YXJuaW5nL2Jyb3dzZXIuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvYXV0aC1tZXNzYWdlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2F2YXRhci5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9iYW5uZWQtcGFnZS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9idXR0b24uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvY2hhbmdlLWF2YXRhci9jcm9wLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2NoYW5nZS1hdmF0YXIvZ2FsbGVyeS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9jaGFuZ2UtYXZhdGFyL2luZGV4LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2NoYW5nZS1hdmF0YXIvcm9vdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9jaGFuZ2UtYXZhdGFyL3VwbG9hZC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9mb3JtLWdyb3VwLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2Zvcm0uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvbGkuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvbG9hZGVyLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL21vZGFsLWxvYWRlci5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9tb2RhbC1tZXNzYWdlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL29wdGlvbnMvY2hhbmdlLXVzZXJuYW1lL2Zvcm0tbG9hZGluZy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9vcHRpb25zL2NoYW5nZS11c2VybmFtZS9mb3JtLWxvY2tlZC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9vcHRpb25zL2NoYW5nZS11c2VybmFtZS9mb3JtLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL29wdGlvbnMvY2hhbmdlLXVzZXJuYW1lL3Jvb3QuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvb3B0aW9ucy9mb3J1bS1vcHRpb25zLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL29wdGlvbnMvbmF2cy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9vcHRpb25zL3Jvb3QuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvb3B0aW9ucy9zaWduLWluLWNyZWRlbnRpYWxzL2NoYW5nZS1lbWFpbC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9vcHRpb25zL3NpZ24taW4tY3JlZGVudGlhbHMvY2hhbmdlLXBhc3N3b3JkLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL29wdGlvbnMvc2lnbi1pbi1jcmVkZW50aWFscy9yb290LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3BhbmVsLWxvYWRlci5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9wYW5lbC1tZXNzYWdlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Bhc3N3b3JkLXN0cmVuZ3RoLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvSGVhZGVyLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvYmFuLWRldGFpbHMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcHJvZmlsZS9mb2xsb3ctYnV0dG9uLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvZm9sbG93ZXJzLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvZm9sbG93cy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9wcm9maWxlL21vZGVyYXRpb24vYXZhdGFyLWNvbnRyb2xzLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvbW9kZXJhdGlvbi9jaGFuZ2UtdXNlcm5hbWUuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcHJvZmlsZS9tb2RlcmF0aW9uL2RlbGV0ZS1hY2NvdW50LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvbW9kZXJhdGlvbi9uYXYuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcHJvZmlsZS9uYXZzLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3Byb2ZpbGUvcm9vdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9wcm9maWxlL3VzZXJuYW1lLWhpc3RvcnkuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcmVnaXN0ZXItYnV0dG9uLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3JlZ2lzdGVyLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3JlcXVlc3QtYWN0aXZhdGlvbi1saW5rLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3JlcXVlc3QtcGFzc3dvcmQtcmVzZXQuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcmVzZXQtcGFzc3dvcmQtZm9ybS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9zZWFyY2guanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvc2VsZWN0LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3NpZ24taW4uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvc25hY2tiYXIuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlci1tZW51L2d1ZXN0LW5hdi5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2VyLW1lbnUvcm9vdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2VyLW1lbnUvdXNlci1uYXYuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlci1zdGF0dXMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcm5hbWUtaGlzdG9yeS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2Vycy1saXN0L3Jvb3QuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcnMtbGlzdC91c2VyLWNhcmQuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcnMtbGlzdC91c2VyLXByZXZpZXcuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvbGlzdC1lbXB0eS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2Vycy9hY3RpdmUtcG9zdGVycy9saXN0LWl0ZW0uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvbGlzdC1sb2FkaW5nLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3VzZXJzL2FjdGl2ZS1wb3N0ZXJzL2xpc3QuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvcm9vdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2Vycy9uYXZzLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3VzZXJzL3JhbmsvbGlzdC1sb2FkaW5nLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3VzZXJzL3JhbmsvbGlzdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2Vycy9yYW5rL3BhZ2VyLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3VzZXJzL3Jhbmsvcm9vdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy91c2Vycy9yb290LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3llcy1uby1zd2l0Y2guanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL2luZGV4LmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9yZWR1Y2Vycy9hdXRoLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9yZWR1Y2Vycy9wcm9maWxlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9yZWR1Y2Vycy9zbmFja2Jhci5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvcmVkdWNlcnMvdGljay5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvcmVkdWNlcnMvdXNlcm5hbWUtaGlzdG9yeS5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvcmVkdWNlcnMvdXNlcnMuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2FqYXguanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2F1dGguanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2NhcHRjaGEuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2luY2x1ZGUuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2xvY2FsLXN0b3JhZ2UuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL21vYmlsZS1uYXZiYXItZHJvcGRvd24uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL21vZGFsLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9zZXJ2aWNlcy9wYWdlLXRpdGxlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9zZXJ2aWNlcy9wb2xscy5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvc2VydmljZXMvc25hY2tiYXIuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL3N0b3JlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy9zZXJ2aWNlcy96eGN2Ym4uanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3V0aWxzL2Jhbm5lZC1wYWdlLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy91dGlscy9iYXRjaC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvdXRpbHMvZmlsZS1zaXplLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy91dGlscy9tb3VudC1jb21wb25lbnQuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3V0aWxzL29yZGVyZWQtbGlzdC5qcyIsIi4uLy4uL21pc2Fnby9mcm9udGVuZC9zcmMvdXRpbHMvcmFuZG9tLmpzIiwiLi4vLi4vbWlzYWdvL2Zyb250ZW5kL3NyYy91dGlscy9yZXNldC1zY3JvbGwuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3V0aWxzL3JvdXRlZC1jb21wb25lbnQuanMiLCIuLi8uLi9taXNhZ28vZnJvbnRlbmQvc3JjL3V0aWxzL3ZhbGlkYXRvcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNqTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QztDQUNIOztBQUVNLFNBQVMsaUJBQWlCLENBQUMsUUFBUSxFQUFFO0FBQzFDLE1BQUksT0FBTyxHQUFHLFNBQVYsT0FBTyxDQUFZLFVBQVUsRUFBRTtBQUNqQyxXQUFPLFFBQVEsQ0FDYixpRUFBaUUsRUFDakUsa0VBQWtFLEVBQ2xFLFVBQVUsQ0FBQyxDQUFDO0dBQ2YsQ0FBQztBQUNGLFNBQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7Q0FDOUQiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCJpbXBvcnQgT3JkZXJlZExpc3QgZnJvbSAnbWlzYWdvL3V0aWxzL29yZGVyZWQtbGlzdCc7XG5cbmV4cG9ydCBjbGFzcyBNaXNhZ28ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9pbml0aWFsaXplcnMgPSBbXTtcbiAgICB0aGlzLl9jb250ZXh0ID0ge307XG4gIH1cblxuICBhZGRJbml0aWFsaXplcihpbml0aWFsaXplcikge1xuICAgIHRoaXMuX2luaXRpYWxpemVycy5wdXNoKHtcbiAgICAgIGtleTogaW5pdGlhbGl6ZXIubmFtZSxcblxuICAgICAgaXRlbTogaW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZXIsXG5cbiAgICAgIGFmdGVyOiBpbml0aWFsaXplci5hZnRlcixcbiAgICAgIGJlZm9yZTogaW5pdGlhbGl6ZXIuYmVmb3JlXG4gICAgfSk7XG4gIH1cblxuICBpbml0KGNvbnRleHQpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcblxuICAgIHZhciBpbml0T3JkZXIgPSBuZXcgT3JkZXJlZExpc3QodGhpcy5faW5pdGlhbGl6ZXJzKS5vcmRlcmVkVmFsdWVzKCk7XG4gICAgaW5pdE9yZGVyLmZvckVhY2goaW5pdGlhbGl6ZXIgPT4ge1xuICAgICAgaW5pdGlhbGl6ZXIodGhpcyk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBjb250ZXh0IGFjY2Vzc29yc1xuICBoYXMoa2V5KSB7XG4gICAgcmV0dXJuICEhdGhpcy5fY29udGV4dFtrZXldO1xuICB9XG5cbiAgZ2V0KGtleSwgZmFsbGJhY2spIHtcbiAgICBpZiAodGhpcy5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbnRleHRba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwb3Aoa2V5KSB7XG4gICAgaWYgKHRoaXMuaGFzKGtleSkpIHtcbiAgICAgIGxldCB2YWx1ZSA9IHRoaXMuX2NvbnRleHRba2V5XTtcbiAgICAgIHRoaXMuX2NvbnRleHRba2V5XSA9IG51bGw7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG5cbi8vIGNyZWF0ZSAgc2luZ2xldG9uXG52YXIgbWlzYWdvID0gbmV3IE1pc2FnbygpO1xuXG4vLyBleHBvc2UgaXQgZ2xvYmFsbHlcbmdsb2JhbC5taXNhZ28gPSBtaXNhZ287XG5cbi8vIGFuZCBleHBvcnQgaXQgZm9yIHRlc3RzIGFuZCBzdHVmZlxuZXhwb3J0IGRlZmF1bHQgbWlzYWdvO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgYWpheC5pbml0KG1pc2Fnby5nZXQoJ0NTUkZfQ09PS0lFX05BTUUnKSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdhamF4JyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBhdXRoIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hdXRoJztcbmltcG9ydCBtb2RhbCBmcm9tICdtaXNhZ28vc2VydmljZXMvbW9kYWwnO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5pbXBvcnQgc3RvcmFnZSBmcm9tICdtaXNhZ28vc2VydmljZXMvbG9jYWwtc3RvcmFnZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBhdXRoLmluaXQoc3RvcmUsIHN0b3JhZ2UsIG1vZGFsKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2F1dGgnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTsiLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgY2FwdGNoYSBmcm9tICdtaXNhZ28vc2VydmljZXMvY2FwdGNoYSc7XG5pbXBvcnQgaW5jbHVkZSBmcm9tICdtaXNhZ28vc2VydmljZXMvaW5jbHVkZSc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoY29udGV4dCkge1xuICBjYXB0Y2hhLmluaXQoY29udGV4dCwgYWpheCwgaW5jbHVkZSwgc25hY2tiYXIpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnY2FwdGNoYScsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplclxufSk7XG4iLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IEF1dGhNZXNzYWdlLCB7IHNlbGVjdCB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2F1dGgtbWVzc2FnZSc7XG5pbXBvcnQgbW91bnQgZnJvbSAnbWlzYWdvL3V0aWxzL21vdW50LWNvbXBvbmVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBtb3VudChjb25uZWN0KHNlbGVjdCkoQXV0aE1lc3NhZ2UpLCAnYXV0aC1tZXNzYWdlLW1vdW50Jyk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdjb21wb25lbnQ6YXV0aC1tZXNzYWdlJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBhZnRlcjogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgc2hvd0Jhbm5lZFBhZ2UgZnJvbSAnbWlzYWdvL3V0aWxzL2Jhbm5lZC1wYWdlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoY29udGV4dCkge1xuICBpZiAoY29udGV4dC5oYXMoJ0JBTl9NRVNTQUdFJykpIHtcbiAgICBzaG93QmFubmVkUGFnZShjb250ZXh0LmdldCgnQkFOX01FU1NBR0UnKSwgZmFsc2UpO1xuICB9XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdjb21wb25lbnQ6YmFuZWQtcGFnZScsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYWZ0ZXI6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IE9wdGlvbnMsIHsgcGF0aHMgfSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9vcHRpb25zL3Jvb3QnO1xuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IG1vdW50IGZyb20gJ21pc2Fnby91dGlscy9yb3V0ZWQtY29tcG9uZW50JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoY29udGV4dCkge1xuICBpZiAoY29udGV4dC5oYXMoJ1VTRVJfT1BUSU9OUycpKSB7XG4gICAgbW91bnQoe1xuICAgICAgcm9vdDogbWlzYWdvLmdldCgnVVNFUkNQX1VSTCcpLFxuICAgICAgY29tcG9uZW50OiBPcHRpb25zLFxuICAgICAgcGF0aHM6IHBhdGhzKClcbiAgICB9KTtcbiAgfVxufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnY29tcG9uZW50Om9wdGlvbnMnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgUHJvZmlsZSwgeyBwYXRocywgc2VsZWN0IH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9yb290JztcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBtb3VudCBmcm9tICdtaXNhZ28vdXRpbHMvcm91dGVkLWNvbXBvbmVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKGNvbnRleHQpIHtcbiAgaWYgKGNvbnRleHQuaGFzKCdQUk9GSUxFJykgJiYgY29udGV4dC5oYXMoJ1BST0ZJTEVfUEFHRVMnKSkge1xuICAgIG1vdW50KHtcbiAgICAgIHJvb3Q6IG1pc2Fnby5nZXQoJ1BST0ZJTEUnKS5hYnNvbHV0ZV91cmwsXG4gICAgICBjb21wb25lbnQ6IGNvbm5lY3Qoc2VsZWN0KShQcm9maWxlKSxcbiAgICAgIHBhdGhzOiBwYXRocygpXG4gICAgfSk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2NvbXBvbmVudDpwcm9maWxlJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBhZnRlcjogJ3JlZHVjZXI6cHJvZmlsZS1kZWh5ZHJhdGUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBSZXF1ZXN0QWN0aXZhdGlvbkxpbmsgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcmVxdWVzdC1hY3RpdmF0aW9uLWxpbmsnO1xuaW1wb3J0IG1vdW50IGZyb20gJ21pc2Fnby91dGlscy9tb3VudC1jb21wb25lbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXF1ZXN0LWFjdGl2YXRpb24tbGluay1tb3VudCcpKSB7XG4gICAgbW91bnQoUmVxdWVzdEFjdGl2YXRpb25MaW5rLCAncmVxdWVzdC1hY3RpdmF0aW9uLWxpbmstbW91bnQnLCBmYWxzZSk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2NvbXBvbmVudDpyZXF1ZXN0LWFjdGl2YXRpb24tbGluaycsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYWZ0ZXI6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IFJlcXVlc3RQYXNzd29yZFJlc2V0IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3JlcXVlc3QtcGFzc3dvcmQtcmVzZXQnO1xuaW1wb3J0IG1vdW50IGZyb20gJ21pc2Fnby91dGlscy9tb3VudC1jb21wb25lbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXF1ZXN0LXBhc3N3b3JkLXJlc2V0LW1vdW50JykpIHtcbiAgICBtb3VudChSZXF1ZXN0UGFzc3dvcmRSZXNldCwgJ3JlcXVlc3QtcGFzc3dvcmQtcmVzZXQtbW91bnQnLCBmYWxzZSk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2NvbXBvbmVudDpyZXF1ZXN0LXBhc3N3b3JkLXJlc2V0JyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBhZnRlcjogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgUmVzZXRQYXNzd29yZEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcmVzZXQtcGFzc3dvcmQtZm9ybSc7XG5pbXBvcnQgbW91bnQgZnJvbSAnbWlzYWdvL3V0aWxzL21vdW50LWNvbXBvbmVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc2V0LXBhc3N3b3JkLWZvcm0tbW91bnQnKSkge1xuICAgIG1vdW50KFJlc2V0UGFzc3dvcmRGb3JtLCAncmVzZXQtcGFzc3dvcmQtZm9ybS1tb3VudCcsIGZhbHNlKTtcbiAgfVxufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnY29tcG9uZW50OnJlc2V0LXBhc3N3b3JkLWZvcm0nLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgeyBTbmFja2Jhciwgc2VsZWN0IH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvc25hY2tiYXInO1xuaW1wb3J0IG1vdW50IGZyb20gJ21pc2Fnby91dGlscy9tb3VudC1jb21wb25lbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgbW91bnQoY29ubmVjdChzZWxlY3QpKFNuYWNrYmFyKSwgJ3NuYWNrYmFyLW1vdW50Jyk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdjb21wb25lbnQ6c25hY2tiYXInLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc25hY2tiYXInXG59KTtcbiIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgeyBVc2VyTWVudSwgQ29tcGFjdFVzZXJNZW51LCBzZWxlY3QgfSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2VyLW1lbnUvcm9vdCc7XG5pbXBvcnQgbW91bnQgZnJvbSAnbWlzYWdvL3V0aWxzL21vdW50LWNvbXBvbmVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBtb3VudChjb25uZWN0KHNlbGVjdCkoVXNlck1lbnUpLCAndXNlci1tZW51LW1vdW50Jyk7XG4gIG1vdW50KGNvbm5lY3Qoc2VsZWN0KShDb21wYWN0VXNlck1lbnUpLCAndXNlci1tZW51LWNvbXBhY3QtbW91bnQnKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2NvbXBvbmVudDp1c2VyLW1lbnUnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBVc2VycywgeyBwYXRocyB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJzL3Jvb3QnO1xuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IG1vdW50IGZyb20gJ21pc2Fnby91dGlscy9yb3V0ZWQtY29tcG9uZW50JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoY29udGV4dCkge1xuICBpZiAoY29udGV4dC5oYXMoJ1VTRVJTX0xJU1RTJykpIHtcbiAgICBtb3VudCh7XG4gICAgICByb290OiBtaXNhZ28uZ2V0KCdVU0VSU19MSVNUX1VSTCcpLFxuICAgICAgY29tcG9uZW50OiBVc2VycyxcbiAgICAgIHBhdGhzOiBwYXRocygpXG4gICAgfSk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2NvbXBvbmVudDp1c2VycycsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYWZ0ZXI6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IGluY2x1ZGUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2luY2x1ZGUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcihjb250ZXh0KSB7XG4gIGluY2x1ZGUuaW5pdChjb250ZXh0LmdldCgnU1RBVElDX1VSTCcpKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2luY2x1ZGUnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXJcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHN0b3JhZ2UgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2xvY2FsLXN0b3JhZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgc3RvcmFnZS5pbml0KCdtaXNhZ29fJyk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdsb2NhbC1zdG9yYWdlJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBkcm9wZG93biBmcm9tICdtaXNhZ28vc2VydmljZXMvbW9iaWxlLW5hdmJhci1kcm9wZG93bic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2JpbGUtbmF2YmFyLWRyb3Bkb3duLW1vdW50Jyk7XG4gIGlmIChlbGVtZW50KSB7XG4gICAgZHJvcGRvd24uaW5pdChlbGVtZW50KTtcbiAgfVxufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnZHJvcGRvd24nLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGJlZm9yZTogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgbW9kYWwgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vZGFsJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGFsLW1vdW50Jyk7XG4gIGlmIChlbGVtZW50KSB7XG4gICAgbW9kYWwuaW5pdChlbGVtZW50KTtcbiAgfVxufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnbW9kYWwnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGJlZm9yZTogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBtb21lbnQubG9jYWxlKCQoJ2h0bWwnKS5hdHRyKCdsYW5nJykpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnbW9tZW50JyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCB0aXRsZSBmcm9tICdtaXNhZ28vc2VydmljZXMvcGFnZS10aXRsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKGNvbnRleHQpIHtcbiAgdGl0bGUuaW5pdChjb250ZXh0LmdldCgnU0VUVElOR1MnKS5mb3J1bV9uYW1lKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ3BhZ2UtdGl0bGUnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXJcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgcG9sbHMgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BvbGxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIHBvbGxzLmluaXQoYWpheCwgc25hY2tiYXIpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAncG9sbHMnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXJcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHJlZHVjZXIsIHsgaW5pdGlhbFN0YXRlIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL2F1dGgnO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKGNvbnRleHQpIHtcbiAgc3RvcmUuYWRkUmVkdWNlcignYXV0aCcsIHJlZHVjZXIsIE9iamVjdC5hc3NpZ24oe1xuICAgICdpc0F1dGhlbnRpY2F0ZWQnOiBjb250ZXh0LmdldCgnaXNBdXRoZW50aWNhdGVkJyksXG4gICAgJ2lzQW5vbnltb3VzJzogIWNvbnRleHQuZ2V0KCdpc0F1dGhlbnRpY2F0ZWQnKSxcblxuICAgICd1c2VyJzogY29udGV4dC5nZXQoJ3VzZXInKVxuICB9LCBpbml0aWFsU3RhdGUpKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ3JlZHVjZXI6YXV0aCcsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYmVmb3JlOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCB7IGRlaHlkcmF0ZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy9wcm9maWxlJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgaWYgKG1pc2Fnby5oYXMoJ1BST0ZJTEUnKSkge1xuICAgIHN0b3JlLmRpc3BhdGNoKGRlaHlkcmF0ZShtaXNhZ28uZ2V0KCdQUk9GSUxFJykpKTtcbiAgfVxufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAncmVkdWNlcjpwcm9maWxlLWRlaHlkcmF0ZScsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYWZ0ZXI6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHJlZHVjZXIgZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3Byb2ZpbGUnO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBzdG9yZS5hZGRSZWR1Y2VyKCdwcm9maWxlJywgcmVkdWNlciwge30pO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAncmVkdWNlcjpwcm9maWxlJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBiZWZvcmU6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHJlZHVjZXIsIHsgaW5pdGlhbFN0YXRlIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3NuYWNrYmFyJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgc3RvcmUuYWRkUmVkdWNlcignc25hY2tiYXInLCByZWR1Y2VyLCBpbml0aWFsU3RhdGUpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAncmVkdWNlcjpzbmFja2JhcicsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYmVmb3JlOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCByZWR1Y2VyLCB7IGluaXRpYWxTdGF0ZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy90aWNrJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgc3RvcmUuYWRkUmVkdWNlcigndGljaycsIHJlZHVjZXIsIGluaXRpYWxTdGF0ZSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdyZWR1Y2VyOnRpY2snLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGJlZm9yZTogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgcmVkdWNlciBmcm9tICdtaXNhZ28vcmVkdWNlcnMvdXNlcm5hbWUtaGlzdG9yeSc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIHN0b3JlLmFkZFJlZHVjZXIoJ3VzZXJuYW1lLWhpc3RvcnknLCByZWR1Y2VyLCBbXSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdyZWR1Y2VyOnVzZXJuYW1lLWhpc3RvcnknLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGJlZm9yZTogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgcmVkdWNlciBmcm9tICdtaXNhZ28vcmVkdWNlcnMvdXNlcnMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBzdG9yZS5hZGRSZWR1Y2VyKCd1c2VycycsIHJlZHVjZXIsIFtdKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ3JlZHVjZXI6dXNlcnMnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGJlZm9yZTogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgc25hY2tiYXIuaW5pdChzdG9yZSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdzbmFja2JhcicsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYWZ0ZXI6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBzdG9yZS5pbml0KCk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdzdG9yZScsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYmVmb3JlOiAnX2VuZCdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgZG9UaWNrIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3RpY2snO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5cbmNvbnN0IFRJQ0tfUEVSSU9EID0gNTAgKiAxMDAwOyAvL2RvIHRoZSB0aWNrIGV2ZXJ5IDUwc1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgIHN0b3JlLmRpc3BhdGNoKGRvVGljaygpKTtcbiAgfSwgVElDS19QRVJJT0QpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAndGljay1zdGFydCcsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYWZ0ZXI6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IGluY2x1ZGUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2luY2x1ZGUnO1xuaW1wb3J0IHp4Y3ZibiBmcm9tICdtaXNhZ28vc2VydmljZXMvenhjdmJuJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIHp4Y3Zibi5pbml0KGluY2x1ZGUpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnenhjdmJuJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyXG59KTtcbiIsInZhciBwU2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4vbGliL2tleXMuanMnKTtcbnZhciBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vbGliL2lzX2FyZ3VtZW50cy5qcycpO1xuXG52YXIgZGVlcEVxdWFsID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYWN0dWFsLCBleHBlY3RlZCwgb3B0cykge1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fTtcbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG5cbiAgfSBlbHNlIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBEYXRlICYmIGV4cGVjdGVkIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhY3R1YWwuZ2V0VGltZSgpID09PSBleHBlY3RlZC5nZXRUaW1lKCk7XG5cbiAgLy8gNy4zLiBPdGhlciBwYWlycyB0aGF0IGRvIG5vdCBib3RoIHBhc3MgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnLFxuICAvLyBlcXVpdmFsZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ID09LlxuICB9IGVsc2UgaWYgKCFhY3R1YWwgfHwgIWV4cGVjdGVkIHx8IHR5cGVvZiBhY3R1YWwgIT0gJ29iamVjdCcgJiYgdHlwZW9mIGV4cGVjdGVkICE9ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG9wdHMuc3RyaWN0ID8gYWN0dWFsID09PSBleHBlY3RlZCA6IGFjdHVhbCA9PSBleHBlY3RlZDtcblxuICAvLyA3LjQuIEZvciBhbGwgb3RoZXIgT2JqZWN0IHBhaXJzLCBpbmNsdWRpbmcgQXJyYXkgb2JqZWN0cywgZXF1aXZhbGVuY2UgaXNcbiAgLy8gZGV0ZXJtaW5lZCBieSBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGFzIHZlcmlmaWVkXG4gIC8vIHdpdGggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKSwgdGhlIHNhbWUgc2V0IG9mIGtleXNcbiAgLy8gKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeVxuICAvLyBjb3JyZXNwb25kaW5nIGtleSwgYW5kIGFuIGlkZW50aWNhbCAncHJvdG90eXBlJyBwcm9wZXJ0eS4gTm90ZTogdGhpc1xuICAvLyBhY2NvdW50cyBmb3IgYm90aCBuYW1lZCBhbmQgaW5kZXhlZCBwcm9wZXJ0aWVzIG9uIEFycmF5cy5cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCwgb3B0cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWRPck51bGwodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyICh4KSB7XG4gIGlmICgheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIHgubGVuZ3RoICE9PSAnbnVtYmVyJykgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIHguY29weSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgeC5zbGljZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoeC5sZW5ndGggPiAwICYmIHR5cGVvZiB4WzBdICE9PSAnbnVtYmVyJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYiwgb3B0cykge1xuICB2YXIgaSwga2V5O1xuICBpZiAoaXNVbmRlZmluZWRPck51bGwoYSkgfHwgaXNVbmRlZmluZWRPck51bGwoYikpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvLyBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuXG4gIGlmIChhLnByb3RvdHlwZSAhPT0gYi5wcm90b3R5cGUpIHJldHVybiBmYWxzZTtcbiAgLy9+fn5JJ3ZlIG1hbmFnZWQgdG8gYnJlYWsgT2JqZWN0LmtleXMgdGhyb3VnaCBzY3Jld3kgYXJndW1lbnRzIHBhc3NpbmcuXG4gIC8vICAgQ29udmVydGluZyB0byBhcnJheSBzb2x2ZXMgdGhlIHByb2JsZW0uXG4gIGlmIChpc0FyZ3VtZW50cyhhKSkge1xuICAgIGlmICghaXNBcmd1bWVudHMoYikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYSA9IHBTbGljZS5jYWxsKGEpO1xuICAgIGIgPSBwU2xpY2UuY2FsbChiKTtcbiAgICByZXR1cm4gZGVlcEVxdWFsKGEsIGIsIG9wdHMpO1xuICB9XG4gIGlmIChpc0J1ZmZlcihhKSkge1xuICAgIGlmICghaXNCdWZmZXIoYikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0cnkge1xuICAgIHZhciBrYSA9IG9iamVjdEtleXMoYSksXG4gICAgICAgIGtiID0gb2JqZWN0S2V5cyhiKTtcbiAgfSBjYXRjaCAoZSkgey8vaGFwcGVucyB3aGVuIG9uZSBpcyBhIHN0cmluZyBsaXRlcmFsIGFuZCB0aGUgb3RoZXIgaXNuJ3RcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChrZXlzIGluY29ycG9yYXRlc1xuICAvLyBoYXNPd25Qcm9wZXJ0eSlcbiAgaWYgKGthLmxlbmd0aCAhPSBrYi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvL3RoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy9+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPSBrYltpXSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvL2VxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeSBjb3JyZXNwb25kaW5nIGtleSwgYW5kXG4gIC8vfn5+cG9zc2libHkgZXhwZW5zaXZlIGRlZXAgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGtleSA9IGthW2ldO1xuICAgIGlmICghZGVlcEVxdWFsKGFba2V5XSwgYltrZXldLCBvcHRzKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGI7XG59XG4iLCJ2YXIgc3VwcG9ydHNBcmd1bWVudHNDbGFzcyA9IChmdW5jdGlvbigpe1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50cylcbn0pKCkgPT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHN1cHBvcnRzQXJndW1lbnRzQ2xhc3MgPyBzdXBwb3J0ZWQgOiB1bnN1cHBvcnRlZDtcblxuZXhwb3J0cy5zdXBwb3J0ZWQgPSBzdXBwb3J0ZWQ7XG5mdW5jdGlvbiBzdXBwb3J0ZWQob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PSAnW29iamVjdCBBcmd1bWVudHNdJztcbn07XG5cbmV4cG9ydHMudW5zdXBwb3J0ZWQgPSB1bnN1cHBvcnRlZDtcbmZ1bmN0aW9uIHVuc3VwcG9ydGVkKG9iamVjdCl7XG4gIHJldHVybiBvYmplY3QgJiZcbiAgICB0eXBlb2Ygb2JqZWN0ID09ICdvYmplY3QnICYmXG4gICAgdHlwZW9mIG9iamVjdC5sZW5ndGggPT0gJ251bWJlcicgJiZcbiAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnY2FsbGVlJykgJiZcbiAgICAhT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgJ2NhbGxlZScpIHx8XG4gICAgZmFsc2U7XG59O1xuIiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nXG4gID8gT2JqZWN0LmtleXMgOiBzaGltO1xuXG5leHBvcnRzLnNoaW0gPSBzaGltO1xuZnVuY3Rpb24gc2hpbSAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIGtleXMucHVzaChrZXkpO1xuICByZXR1cm4ga2V5cztcbn1cbiIsIi8qKlxuICogSW5kaWNhdGVzIHRoYXQgbmF2aWdhdGlvbiB3YXMgY2F1c2VkIGJ5IGEgY2FsbCB0byBoaXN0b3J5LnB1c2guXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBQVVNIID0gJ1BVU0gnO1xuXG5leHBvcnRzLlBVU0ggPSBQVVNIO1xuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCBuYXZpZ2F0aW9uIHdhcyBjYXVzZWQgYnkgYSBjYWxsIHRvIGhpc3RvcnkucmVwbGFjZS5cbiAqL1xudmFyIFJFUExBQ0UgPSAnUkVQTEFDRSc7XG5cbmV4cG9ydHMuUkVQTEFDRSA9IFJFUExBQ0U7XG4vKipcbiAqIEluZGljYXRlcyB0aGF0IG5hdmlnYXRpb24gd2FzIGNhdXNlZCBieSBzb21lIG90aGVyIGFjdGlvbiBzdWNoXG4gKiBhcyB1c2luZyBhIGJyb3dzZXIncyBiYWNrL2ZvcndhcmQgYnV0dG9ucyBhbmQvb3IgbWFudWFsbHkgbWFuaXB1bGF0aW5nXG4gKiB0aGUgVVJMIGluIGEgYnJvd3NlcidzIGxvY2F0aW9uIGJhci4gVGhpcyBpcyB0aGUgZGVmYXVsdC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd0V2ZW50SGFuZGxlcnMvb25wb3BzdGF0ZVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbnZhciBQT1AgPSAnUE9QJztcblxuZXhwb3J0cy5QT1AgPSBQT1A7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIFBVU0g6IFBVU0gsXG4gIFJFUExBQ0U6IFJFUExBQ0UsXG4gIFBPUDogUE9QXG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5sb29wQXN5bmMgPSBsb29wQXN5bmM7XG5cbmZ1bmN0aW9uIGxvb3BBc3luYyh0dXJucywgd29yaywgY2FsbGJhY2spIHtcbiAgdmFyIGN1cnJlbnRUdXJuID0gMDtcbiAgdmFyIGlzRG9uZSA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgaXNEb25lID0gdHJ1ZTtcbiAgICBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICBpZiAoaXNEb25lKSByZXR1cm47XG5cbiAgICBpZiAoY3VycmVudFR1cm4gPCB0dXJucykge1xuICAgICAgd29yay5jYWxsKHRoaXMsIGN1cnJlbnRUdXJuKyssIG5leHQsIGRvbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb25lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgbmV4dCgpO1xufSIsIi8qZXNsaW50LWRpc2FibGUgbm8tZW1wdHkgKi9cbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuc2F2ZVN0YXRlID0gc2F2ZVN0YXRlO1xuZXhwb3J0cy5yZWFkU3RhdGUgPSByZWFkU3RhdGU7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbnZhciBLZXlQcmVmaXggPSAnQEBIaXN0b3J5Lyc7XG52YXIgUXVvdGFFeGNlZWRlZEVycm9yID0gJ1F1b3RhRXhjZWVkZWRFcnJvcic7XG52YXIgU2VjdXJpdHlFcnJvciA9ICdTZWN1cml0eUVycm9yJztcblxuZnVuY3Rpb24gY3JlYXRlS2V5KGtleSkge1xuICByZXR1cm4gS2V5UHJlZml4ICsga2V5O1xufVxuXG5mdW5jdGlvbiBzYXZlU3RhdGUoa2V5LCBzdGF0ZSkge1xuICB0cnkge1xuICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGNyZWF0ZUtleShrZXkpLCBKU09OLnN0cmluZ2lmeShzdGF0ZSkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvci5uYW1lID09PSBTZWN1cml0eUVycm9yKSB7XG4gICAgICAvLyBCbG9ja2luZyBjb29raWVzIGluIENocm9tZS9GaXJlZm94L1NhZmFyaSB0aHJvd3MgU2VjdXJpdHlFcnJvciBvbiBhbnlcbiAgICAgIC8vIGF0dGVtcHQgdG8gYWNjZXNzIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBfd2FybmluZzJbJ2RlZmF1bHQnXShmYWxzZSwgJ1toaXN0b3J5XSBVbmFibGUgdG8gc2F2ZSBzdGF0ZTsgc2Vzc2lvblN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZSBkdWUgdG8gc2VjdXJpdHkgc2V0dGluZ3MnKSA6IHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChlcnJvci5uYW1lID09PSBRdW90YUV4Y2VlZGVkRXJyb3IgJiYgd2luZG93LnNlc3Npb25TdG9yYWdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gU2FmYXJpIFwicHJpdmF0ZSBtb2RlXCIgdGhyb3dzIFF1b3RhRXhjZWVkZWRFcnJvci5cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBfd2FybmluZzJbJ2RlZmF1bHQnXShmYWxzZSwgJ1toaXN0b3J5XSBVbmFibGUgdG8gc2F2ZSBzdGF0ZTsgc2Vzc2lvblN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiBTYWZhcmkgcHJpdmF0ZSBtb2RlJykgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkU3RhdGUoa2V5KSB7XG4gIHZhciBqc29uID0gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGpzb24gPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShjcmVhdGVLZXkoa2V5KSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yLm5hbWUgPT09IFNlY3VyaXR5RXJyb3IpIHtcbiAgICAgIC8vIEJsb2NraW5nIGNvb2tpZXMgaW4gQ2hyb21lL0ZpcmVmb3gvU2FmYXJpIHRocm93cyBTZWN1cml0eUVycm9yIG9uIGFueVxuICAgICAgLy8gYXR0ZW1wdCB0byBhY2Nlc3Mgd2luZG93LnNlc3Npb25TdG9yYWdlLlxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IF93YXJuaW5nMlsnZGVmYXVsdCddKGZhbHNlLCAnW2hpc3RvcnldIFVuYWJsZSB0byByZWFkIHN0YXRlOyBzZXNzaW9uU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlIGR1ZSB0byBzZWN1cml0eSBzZXR0aW5ncycpIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBpZiAoanNvbikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWdub3JlIGludmFsaWQgSlNPTi5cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmFkZEV2ZW50TGlzdGVuZXIgPSBhZGRFdmVudExpc3RlbmVyO1xuZXhwb3J0cy5yZW1vdmVFdmVudExpc3RlbmVyID0gcmVtb3ZlRXZlbnRMaXN0ZW5lcjtcbmV4cG9ydHMuZ2V0SGFzaFBhdGggPSBnZXRIYXNoUGF0aDtcbmV4cG9ydHMucmVwbGFjZUhhc2hQYXRoID0gcmVwbGFjZUhhc2hQYXRoO1xuZXhwb3J0cy5nZXRXaW5kb3dQYXRoID0gZ2V0V2luZG93UGF0aDtcbmV4cG9ydHMuZ28gPSBnbztcbmV4cG9ydHMuZ2V0VXNlckNvbmZpcm1hdGlvbiA9IGdldFVzZXJDb25maXJtYXRpb247XG5leHBvcnRzLnN1cHBvcnRzSGlzdG9yeSA9IHN1cHBvcnRzSGlzdG9yeTtcbmV4cG9ydHMuc3VwcG9ydHNHb1dpdGhvdXRSZWxvYWRVc2luZ0hhc2ggPSBzdXBwb3J0c0dvV2l0aG91dFJlbG9hZFVzaW5nSGFzaDtcblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudCwgbGlzdGVuZXIpIHtcbiAgaWYgKG5vZGUuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgfSBlbHNlIHtcbiAgICBub2RlLmF0dGFjaEV2ZW50KCdvbicgKyBldmVudCwgbGlzdGVuZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnQsIGxpc3RlbmVyKSB7XG4gIGlmIChub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIH0gZWxzZSB7XG4gICAgbm9kZS5kZXRhY2hFdmVudCgnb24nICsgZXZlbnQsIGxpc3RlbmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRIYXNoUGF0aCgpIHtcbiAgLy8gV2UgY2FuJ3QgdXNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoIGhlcmUgYmVjYXVzZSBpdCdzIG5vdFxuICAvLyBjb25zaXN0ZW50IGFjcm9zcyBicm93c2VycyAtIEZpcmVmb3ggd2lsbCBwcmUtZGVjb2RlIGl0IVxuICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJyMnKVsxXSB8fCAnJztcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUhhc2hQYXRoKHBhdGgpIHtcbiAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2Uod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaCArICcjJyArIHBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZXRXaW5kb3dQYXRoKCkge1xuICByZXR1cm4gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaCArIHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xufVxuXG5mdW5jdGlvbiBnbyhuKSB7XG4gIGlmIChuKSB3aW5kb3cuaGlzdG9yeS5nbyhuKTtcbn1cblxuZnVuY3Rpb24gZ2V0VXNlckNvbmZpcm1hdGlvbihtZXNzYWdlLCBjYWxsYmFjaykge1xuICBjYWxsYmFjayh3aW5kb3cuY29uZmlybShtZXNzYWdlKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBIVE1MNSBoaXN0b3J5IEFQSSBpcyBzdXBwb3J0ZWQuIFRha2VuIGZyb20gTW9kZXJuaXpyLlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2Jsb2IvbWFzdGVyL2ZlYXR1cmUtZGV0ZWN0cy9oaXN0b3J5LmpzXG4gKiBjaGFuZ2VkIHRvIGF2b2lkIGZhbHNlIG5lZ2F0aXZlcyBmb3IgV2luZG93cyBQaG9uZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9yYWNrdC9yZWFjdC1yb3V0ZXIvaXNzdWVzLzU4NlxuICovXG5cbmZ1bmN0aW9uIHN1cHBvcnRzSGlzdG9yeSgpIHtcbiAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgaWYgKCh1YS5pbmRleE9mKCdBbmRyb2lkIDIuJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ0FuZHJvaWQgNC4wJykgIT09IC0xKSAmJiB1YS5pbmRleE9mKCdNb2JpbGUgU2FmYXJpJykgIT09IC0xICYmIHVhLmluZGV4T2YoJ0Nocm9tZScpID09PSAtMSAmJiB1YS5pbmRleE9mKCdXaW5kb3dzIFBob25lJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIEZJWE1FOiBXb3JrIGFyb3VuZCBvdXIgYnJvd3NlciBoaXN0b3J5IG5vdCB3b3JraW5nIGNvcnJlY3RseSBvbiBDaHJvbWVcbiAgLy8gaU9TOiBodHRwczovL2dpdGh1Yi5jb20vcmFja3QvcmVhY3Qtcm91dGVyL2lzc3Vlcy8yNTY1XG4gIGlmICh1YS5pbmRleE9mKCdDcmlPUycpICE9PSAtMSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gd2luZG93Lmhpc3RvcnkgJiYgJ3B1c2hTdGF0ZScgaW4gd2luZG93Lmhpc3Rvcnk7XG59XG5cbi8qKlxuICogUmV0dXJucyBmYWxzZSBpZiB1c2luZyBnbyhuKSB3aXRoIGhhc2ggaGlzdG9yeSBjYXVzZXMgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuICovXG5cbmZ1bmN0aW9uIHN1cHBvcnRzR29XaXRob3V0UmVsb2FkVXNpbmdIYXNoKCkge1xuICB2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50O1xuICByZXR1cm4gdWEuaW5kZXhPZignRmlyZWZveCcpID09PSAtMTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbmV4cG9ydHMuY2FuVXNlRE9NID0gY2FuVXNlRE9NOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX2ludmFyaWFudCA9IHJlcXVpcmUoJ2ludmFyaWFudCcpO1xuXG52YXIgX2ludmFyaWFudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnZhcmlhbnQpO1xuXG52YXIgX0FjdGlvbnMgPSByZXF1aXJlKCcuL0FjdGlvbnMnKTtcblxudmFyIF9FeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJy4vRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcblxudmFyIF9ET01VdGlscyA9IHJlcXVpcmUoJy4vRE9NVXRpbHMnKTtcblxudmFyIF9ET01TdGF0ZVN0b3JhZ2UgPSByZXF1aXJlKCcuL0RPTVN0YXRlU3RvcmFnZScpO1xuXG52YXIgX2NyZWF0ZURPTUhpc3RvcnkgPSByZXF1aXJlKCcuL2NyZWF0ZURPTUhpc3RvcnknKTtcblxudmFyIF9jcmVhdGVET01IaXN0b3J5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZURPTUhpc3RvcnkpO1xuXG52YXIgX3BhcnNlUGF0aCA9IHJlcXVpcmUoJy4vcGFyc2VQYXRoJyk7XG5cbnZhciBfcGFyc2VQYXRoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BhcnNlUGF0aCk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGhpc3Rvcnkgb2JqZWN0IHRoYXQgdXNlcyBIVE1MNSdzIGhpc3RvcnkgQVBJXG4gKiAocHVzaFN0YXRlLCByZXBsYWNlU3RhdGUsIGFuZCB0aGUgcG9wc3RhdGUgZXZlbnQpIHRvIG1hbmFnZSBoaXN0b3J5LlxuICogVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgbWV0aG9kIG9mIG1hbmFnaW5nIGhpc3RvcnkgaW4gYnJvd3NlcnMgYmVjYXVzZVxuICogaXQgcHJvdmlkZXMgdGhlIGNsZWFuZXN0IFVSTHMuXG4gKlxuICogTm90ZTogSW4gYnJvd3NlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGUgSFRNTDUgaGlzdG9yeSBBUEkgZnVsbFxuICogcGFnZSByZWxvYWRzIHdpbGwgYmUgdXNlZCB0byBwcmVzZXJ2ZSBVUkxzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCcm93c2VySGlzdG9yeSgpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblxuICAhX0V4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBfaW52YXJpYW50MlsnZGVmYXVsdCddKGZhbHNlLCAnQnJvd3NlciBoaXN0b3J5IG5lZWRzIGEgRE9NJykgOiBfaW52YXJpYW50MlsnZGVmYXVsdCddKGZhbHNlKSA6IHVuZGVmaW5lZDtcblxuICB2YXIgZm9yY2VSZWZyZXNoID0gb3B0aW9ucy5mb3JjZVJlZnJlc2g7XG5cbiAgdmFyIGlzU3VwcG9ydGVkID0gX0RPTVV0aWxzLnN1cHBvcnRzSGlzdG9yeSgpO1xuICB2YXIgdXNlUmVmcmVzaCA9ICFpc1N1cHBvcnRlZCB8fCBmb3JjZVJlZnJlc2g7XG5cbiAgZnVuY3Rpb24gZ2V0Q3VycmVudExvY2F0aW9uKGhpc3RvcnlTdGF0ZSkge1xuICAgIGhpc3RvcnlTdGF0ZSA9IGhpc3RvcnlTdGF0ZSB8fCB3aW5kb3cuaGlzdG9yeS5zdGF0ZSB8fCB7fTtcblxuICAgIHZhciBwYXRoID0gX0RPTVV0aWxzLmdldFdpbmRvd1BhdGgoKTtcbiAgICB2YXIgX2hpc3RvcnlTdGF0ZSA9IGhpc3RvcnlTdGF0ZTtcbiAgICB2YXIga2V5ID0gX2hpc3RvcnlTdGF0ZS5rZXk7XG5cbiAgICB2YXIgc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGtleSkge1xuICAgICAgc3RhdGUgPSBfRE9NU3RhdGVTdG9yYWdlLnJlYWRTdGF0ZShrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZSA9IG51bGw7XG4gICAgICBrZXkgPSBoaXN0b3J5LmNyZWF0ZUtleSgpO1xuXG4gICAgICBpZiAoaXNTdXBwb3J0ZWQpIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShfZXh0ZW5kcyh7fSwgaGlzdG9yeVN0YXRlLCB7IGtleToga2V5IH0pLCBudWxsLCBwYXRoKTtcbiAgICB9XG5cbiAgICB2YXIgbG9jYXRpb24gPSBfcGFyc2VQYXRoMlsnZGVmYXVsdCddKHBhdGgpO1xuXG4gICAgcmV0dXJuIGhpc3RvcnkuY3JlYXRlTG9jYXRpb24oX2V4dGVuZHMoe30sIGxvY2F0aW9uLCB7IHN0YXRlOiBzdGF0ZSB9KSwgdW5kZWZpbmVkLCBrZXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnRQb3BTdGF0ZUxpc3RlbmVyKF9yZWYpIHtcbiAgICB2YXIgdHJhbnNpdGlvblRvID0gX3JlZi50cmFuc2l0aW9uVG87XG5cbiAgICBmdW5jdGlvbiBwb3BTdGF0ZUxpc3RlbmVyKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuOyAvLyBJZ25vcmUgZXh0cmFuZW91cyBwb3BzdGF0ZSBldmVudHMgaW4gV2ViS2l0LlxuXG4gICAgICB0cmFuc2l0aW9uVG8oZ2V0Q3VycmVudExvY2F0aW9uKGV2ZW50LnN0YXRlKSk7XG4gICAgfVxuXG4gICAgX0RPTVV0aWxzLmFkZEV2ZW50TGlzdGVuZXIod2luZG93LCAncG9wc3RhdGUnLCBwb3BTdGF0ZUxpc3RlbmVyKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBfRE9NVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcih3aW5kb3csICdwb3BzdGF0ZScsIHBvcFN0YXRlTGlzdGVuZXIpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBmaW5pc2hUcmFuc2l0aW9uKGxvY2F0aW9uKSB7XG4gICAgdmFyIGJhc2VuYW1lID0gbG9jYXRpb24uYmFzZW5hbWU7XG4gICAgdmFyIHBhdGhuYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgdmFyIHNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaDtcbiAgICB2YXIgaGFzaCA9IGxvY2F0aW9uLmhhc2g7XG4gICAgdmFyIHN0YXRlID0gbG9jYXRpb24uc3RhdGU7XG4gICAgdmFyIGFjdGlvbiA9IGxvY2F0aW9uLmFjdGlvbjtcbiAgICB2YXIga2V5ID0gbG9jYXRpb24ua2V5O1xuXG4gICAgaWYgKGFjdGlvbiA9PT0gX0FjdGlvbnMuUE9QKSByZXR1cm47IC8vIE5vdGhpbmcgdG8gZG8uXG5cbiAgICBfRE9NU3RhdGVTdG9yYWdlLnNhdmVTdGF0ZShrZXksIHN0YXRlKTtcblxuICAgIHZhciBwYXRoID0gKGJhc2VuYW1lIHx8ICcnKSArIHBhdGhuYW1lICsgc2VhcmNoICsgaGFzaDtcbiAgICB2YXIgaGlzdG9yeVN0YXRlID0ge1xuICAgICAga2V5OiBrZXlcbiAgICB9O1xuXG4gICAgaWYgKGFjdGlvbiA9PT0gX0FjdGlvbnMuUFVTSCkge1xuICAgICAgaWYgKHVzZVJlZnJlc2gpIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBwYXRoO1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFByZXZlbnQgbG9jYXRpb24gdXBkYXRlLlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoaGlzdG9yeVN0YXRlLCBudWxsLCBwYXRoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSRVBMQUNFXG4gICAgICBpZiAodXNlUmVmcmVzaCkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShwYXRoKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBQcmV2ZW50IGxvY2F0aW9uIHVwZGF0ZS5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKGhpc3RvcnlTdGF0ZSwgbnVsbCwgcGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgaGlzdG9yeSA9IF9jcmVhdGVET01IaXN0b3J5MlsnZGVmYXVsdCddKF9leHRlbmRzKHt9LCBvcHRpb25zLCB7XG4gICAgZ2V0Q3VycmVudExvY2F0aW9uOiBnZXRDdXJyZW50TG9jYXRpb24sXG4gICAgZmluaXNoVHJhbnNpdGlvbjogZmluaXNoVHJhbnNpdGlvbixcbiAgICBzYXZlU3RhdGU6IF9ET01TdGF0ZVN0b3JhZ2Uuc2F2ZVN0YXRlXG4gIH0pKTtcblxuICB2YXIgbGlzdGVuZXJDb3VudCA9IDAsXG4gICAgICBzdG9wUG9wU3RhdGVMaXN0ZW5lciA9IHVuZGVmaW5lZDtcblxuICBmdW5jdGlvbiBsaXN0ZW5CZWZvcmUobGlzdGVuZXIpIHtcbiAgICBpZiAoKytsaXN0ZW5lckNvdW50ID09PSAxKSBzdG9wUG9wU3RhdGVMaXN0ZW5lciA9IHN0YXJ0UG9wU3RhdGVMaXN0ZW5lcihoaXN0b3J5KTtcblxuICAgIHZhciB1bmxpc3RlbiA9IGhpc3RvcnkubGlzdGVuQmVmb3JlKGxpc3RlbmVyKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB1bmxpc3RlbigpO1xuXG4gICAgICBpZiAoLS1saXN0ZW5lckNvdW50ID09PSAwKSBzdG9wUG9wU3RhdGVMaXN0ZW5lcigpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBsaXN0ZW4obGlzdGVuZXIpIHtcbiAgICBpZiAoKytsaXN0ZW5lckNvdW50ID09PSAxKSBzdG9wUG9wU3RhdGVMaXN0ZW5lciA9IHN0YXJ0UG9wU3RhdGVMaXN0ZW5lcihoaXN0b3J5KTtcblxuICAgIHZhciB1bmxpc3RlbiA9IGhpc3RvcnkubGlzdGVuKGxpc3RlbmVyKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB1bmxpc3RlbigpO1xuXG4gICAgICBpZiAoLS1saXN0ZW5lckNvdW50ID09PSAwKSBzdG9wUG9wU3RhdGVMaXN0ZW5lcigpO1xuICAgIH07XG4gIH1cblxuICAvLyBkZXByZWNhdGVkXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyVHJhbnNpdGlvbkhvb2soaG9vaykge1xuICAgIGlmICgrK2xpc3RlbmVyQ291bnQgPT09IDEpIHN0b3BQb3BTdGF0ZUxpc3RlbmVyID0gc3RhcnRQb3BTdGF0ZUxpc3RlbmVyKGhpc3RvcnkpO1xuXG4gICAgaGlzdG9yeS5yZWdpc3RlclRyYW5zaXRpb25Ib29rKGhvb2spO1xuICB9XG5cbiAgLy8gZGVwcmVjYXRlZFxuICBmdW5jdGlvbiB1bnJlZ2lzdGVyVHJhbnNpdGlvbkhvb2soaG9vaykge1xuICAgIGhpc3RvcnkudW5yZWdpc3RlclRyYW5zaXRpb25Ib29rKGhvb2spO1xuXG4gICAgaWYgKC0tbGlzdGVuZXJDb3VudCA9PT0gMCkgc3RvcFBvcFN0YXRlTGlzdGVuZXIoKTtcbiAgfVxuXG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgaGlzdG9yeSwge1xuICAgIGxpc3RlbkJlZm9yZTogbGlzdGVuQmVmb3JlLFxuICAgIGxpc3RlbjogbGlzdGVuLFxuICAgIHJlZ2lzdGVyVHJhbnNpdGlvbkhvb2s6IHJlZ2lzdGVyVHJhbnNpdGlvbkhvb2ssXG4gICAgdW5yZWdpc3RlclRyYW5zaXRpb25Ib29rOiB1bnJlZ2lzdGVyVHJhbnNpdGlvbkhvb2tcbiAgfSk7XG59XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGNyZWF0ZUJyb3dzZXJIaXN0b3J5O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBfaW52YXJpYW50ID0gcmVxdWlyZSgnaW52YXJpYW50Jyk7XG5cbnZhciBfaW52YXJpYW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ludmFyaWFudCk7XG5cbnZhciBfRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCcuL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbnZhciBfRE9NVXRpbHMgPSByZXF1aXJlKCcuL0RPTVV0aWxzJyk7XG5cbnZhciBfY3JlYXRlSGlzdG9yeSA9IHJlcXVpcmUoJy4vY3JlYXRlSGlzdG9yeScpO1xuXG52YXIgX2NyZWF0ZUhpc3RvcnkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlSGlzdG9yeSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZURPTUhpc3Rvcnkob3B0aW9ucykge1xuICB2YXIgaGlzdG9yeSA9IF9jcmVhdGVIaXN0b3J5MlsnZGVmYXVsdCddKF9leHRlbmRzKHtcbiAgICBnZXRVc2VyQ29uZmlybWF0aW9uOiBfRE9NVXRpbHMuZ2V0VXNlckNvbmZpcm1hdGlvblxuICB9LCBvcHRpb25zLCB7XG4gICAgZ286IF9ET01VdGlscy5nb1xuICB9KSk7XG5cbiAgZnVuY3Rpb24gbGlzdGVuKGxpc3RlbmVyKSB7XG4gICAgIV9FeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gX2ludmFyaWFudDJbJ2RlZmF1bHQnXShmYWxzZSwgJ0RPTSBoaXN0b3J5IG5lZWRzIGEgRE9NJykgOiBfaW52YXJpYW50MlsnZGVmYXVsdCddKGZhbHNlKSA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiBoaXN0b3J5Lmxpc3RlbihsaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gX2V4dGVuZHMoe30sIGhpc3RvcnksIHtcbiAgICBsaXN0ZW46IGxpc3RlblxuICB9KTtcbn1cblxuZXhwb3J0c1snZGVmYXVsdCddID0gY3JlYXRlRE9NSGlzdG9yeTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIi8vaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZydcbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX2RlZXBFcXVhbCA9IHJlcXVpcmUoJ2RlZXAtZXF1YWwnKTtcblxudmFyIF9kZWVwRXF1YWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVlcEVxdWFsKTtcblxudmFyIF9Bc3luY1V0aWxzID0gcmVxdWlyZSgnLi9Bc3luY1V0aWxzJyk7XG5cbnZhciBfQWN0aW9ucyA9IHJlcXVpcmUoJy4vQWN0aW9ucycpO1xuXG52YXIgX2NyZWF0ZUxvY2F0aW9uMiA9IHJlcXVpcmUoJy4vY3JlYXRlTG9jYXRpb24nKTtcblxudmFyIF9jcmVhdGVMb2NhdGlvbjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVMb2NhdGlvbjIpO1xuXG52YXIgX3J1blRyYW5zaXRpb25Ib29rID0gcmVxdWlyZSgnLi9ydW5UcmFuc2l0aW9uSG9vaycpO1xuXG52YXIgX3J1blRyYW5zaXRpb25Ib29rMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3J1blRyYW5zaXRpb25Ib29rKTtcblxudmFyIF9wYXJzZVBhdGggPSByZXF1aXJlKCcuL3BhcnNlUGF0aCcpO1xuXG52YXIgX3BhcnNlUGF0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wYXJzZVBhdGgpO1xuXG52YXIgX2RlcHJlY2F0ZSA9IHJlcXVpcmUoJy4vZGVwcmVjYXRlJyk7XG5cbnZhciBfZGVwcmVjYXRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlcHJlY2F0ZSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVJhbmRvbUtleShsZW5ndGgpIHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCBsZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBsb2NhdGlvbnNBcmVFcXVhbChhLCBiKSB7XG4gIHJldHVybiBhLnBhdGhuYW1lID09PSBiLnBhdGhuYW1lICYmIGEuc2VhcmNoID09PSBiLnNlYXJjaCAmJlxuICAvL2EuYWN0aW9uID09PSBiLmFjdGlvbiAmJiAvLyBEaWZmZXJlbnQgYWN0aW9uICE9PSBsb2NhdGlvbiBjaGFuZ2UuXG4gIGEua2V5ID09PSBiLmtleSAmJiBfZGVlcEVxdWFsMlsnZGVmYXVsdCddKGEuc3RhdGUsIGIuc3RhdGUpO1xufVxuXG52YXIgRGVmYXVsdEtleUxlbmd0aCA9IDY7XG5cbmZ1bmN0aW9uIGNyZWF0ZUhpc3RvcnkoKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07XG4gIHZhciBnZXRDdXJyZW50TG9jYXRpb24gPSBvcHRpb25zLmdldEN1cnJlbnRMb2NhdGlvbjtcbiAgdmFyIGZpbmlzaFRyYW5zaXRpb24gPSBvcHRpb25zLmZpbmlzaFRyYW5zaXRpb247XG4gIHZhciBzYXZlU3RhdGUgPSBvcHRpb25zLnNhdmVTdGF0ZTtcbiAgdmFyIGdvID0gb3B0aW9ucy5nbztcbiAgdmFyIGtleUxlbmd0aCA9IG9wdGlvbnMua2V5TGVuZ3RoO1xuICB2YXIgZ2V0VXNlckNvbmZpcm1hdGlvbiA9IG9wdGlvbnMuZ2V0VXNlckNvbmZpcm1hdGlvbjtcblxuICBpZiAodHlwZW9mIGtleUxlbmd0aCAhPT0gJ251bWJlcicpIGtleUxlbmd0aCA9IERlZmF1bHRLZXlMZW5ndGg7XG5cbiAgdmFyIHRyYW5zaXRpb25Ib29rcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGxpc3RlbkJlZm9yZShob29rKSB7XG4gICAgdHJhbnNpdGlvbkhvb2tzLnB1c2goaG9vayk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdHJhbnNpdGlvbkhvb2tzID0gdHJhbnNpdGlvbkhvb2tzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbSAhPT0gaG9vaztcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICB2YXIgYWxsS2V5cyA9IFtdO1xuICB2YXIgY2hhbmdlTGlzdGVuZXJzID0gW107XG4gIHZhciBsb2NhdGlvbiA9IHVuZGVmaW5lZDtcblxuICBmdW5jdGlvbiBnZXRDdXJyZW50KCkge1xuICAgIGlmIChwZW5kaW5nTG9jYXRpb24gJiYgcGVuZGluZ0xvY2F0aW9uLmFjdGlvbiA9PT0gX0FjdGlvbnMuUE9QKSB7XG4gICAgICByZXR1cm4gYWxsS2V5cy5pbmRleE9mKHBlbmRpbmdMb2NhdGlvbi5rZXkpO1xuICAgIH0gZWxzZSBpZiAobG9jYXRpb24pIHtcbiAgICAgIHJldHVybiBhbGxLZXlzLmluZGV4T2YobG9jYXRpb24ua2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUxvY2F0aW9uKG5ld0xvY2F0aW9uKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBnZXRDdXJyZW50KCk7XG5cbiAgICBsb2NhdGlvbiA9IG5ld0xvY2F0aW9uO1xuXG4gICAgaWYgKGxvY2F0aW9uLmFjdGlvbiA9PT0gX0FjdGlvbnMuUFVTSCkge1xuICAgICAgYWxsS2V5cyA9IFtdLmNvbmNhdChhbGxLZXlzLnNsaWNlKDAsIGN1cnJlbnQgKyAxKSwgW2xvY2F0aW9uLmtleV0pO1xuICAgIH0gZWxzZSBpZiAobG9jYXRpb24uYWN0aW9uID09PSBfQWN0aW9ucy5SRVBMQUNFKSB7XG4gICAgICBhbGxLZXlzW2N1cnJlbnRdID0gbG9jYXRpb24ua2V5O1xuICAgIH1cblxuICAgIGNoYW5nZUxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgbGlzdGVuZXIobG9jYXRpb24pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbGlzdGVuKGxpc3RlbmVyKSB7XG4gICAgY2hhbmdlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuXG4gICAgaWYgKGxvY2F0aW9uKSB7XG4gICAgICBsaXN0ZW5lcihsb2NhdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfbG9jYXRpb24gPSBnZXRDdXJyZW50TG9jYXRpb24oKTtcbiAgICAgIGFsbEtleXMgPSBbX2xvY2F0aW9uLmtleV07XG4gICAgICB1cGRhdGVMb2NhdGlvbihfbG9jYXRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjaGFuZ2VMaXN0ZW5lcnMgPSBjaGFuZ2VMaXN0ZW5lcnMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtICE9PSBsaXN0ZW5lcjtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBjb25maXJtVHJhbnNpdGlvblRvKGxvY2F0aW9uLCBjYWxsYmFjaykge1xuICAgIF9Bc3luY1V0aWxzLmxvb3BBc3luYyh0cmFuc2l0aW9uSG9va3MubGVuZ3RoLCBmdW5jdGlvbiAoaW5kZXgsIG5leHQsIGRvbmUpIHtcbiAgICAgIF9ydW5UcmFuc2l0aW9uSG9vazJbJ2RlZmF1bHQnXSh0cmFuc2l0aW9uSG9va3NbaW5kZXhdLCBsb2NhdGlvbiwgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgICAgICBkb25lKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgaWYgKGdldFVzZXJDb25maXJtYXRpb24gJiYgdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGdldFVzZXJDb25maXJtYXRpb24obWVzc2FnZSwgZnVuY3Rpb24gKG9rKSB7XG4gICAgICAgICAgY2FsbGJhY2sob2sgIT09IGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayhtZXNzYWdlICE9PSBmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB2YXIgcGVuZGluZ0xvY2F0aW9uID0gdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIHRyYW5zaXRpb25UbyhuZXh0TG9jYXRpb24pIHtcbiAgICBpZiAobG9jYXRpb24gJiYgbG9jYXRpb25zQXJlRXF1YWwobG9jYXRpb24sIG5leHRMb2NhdGlvbikpIHJldHVybjsgLy8gTm90aGluZyB0byBkby5cblxuICAgIHBlbmRpbmdMb2NhdGlvbiA9IG5leHRMb2NhdGlvbjtcblxuICAgIGNvbmZpcm1UcmFuc2l0aW9uVG8obmV4dExvY2F0aW9uLCBmdW5jdGlvbiAob2spIHtcbiAgICAgIGlmIChwZW5kaW5nTG9jYXRpb24gIT09IG5leHRMb2NhdGlvbikgcmV0dXJuOyAvLyBUcmFuc2l0aW9uIHdhcyBpbnRlcnJ1cHRlZC5cblxuICAgICAgaWYgKG9rKSB7XG4gICAgICAgIC8vIHRyZWF0IFBVU0ggdG8gY3VycmVudCBwYXRoIGxpa2UgUkVQTEFDRSB0byBiZSBjb25zaXN0ZW50IHdpdGggYnJvd3NlcnNcbiAgICAgICAgaWYgKG5leHRMb2NhdGlvbi5hY3Rpb24gPT09IF9BY3Rpb25zLlBVU0gpIHtcbiAgICAgICAgICB2YXIgcHJldlBhdGggPSBjcmVhdGVQYXRoKGxvY2F0aW9uKTtcbiAgICAgICAgICB2YXIgbmV4dFBhdGggPSBjcmVhdGVQYXRoKG5leHRMb2NhdGlvbik7XG5cbiAgICAgICAgICBpZiAobmV4dFBhdGggPT09IHByZXZQYXRoKSBuZXh0TG9jYXRpb24uYWN0aW9uID0gX0FjdGlvbnMuUkVQTEFDRTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaW5pc2hUcmFuc2l0aW9uKG5leHRMb2NhdGlvbikgIT09IGZhbHNlKSB1cGRhdGVMb2NhdGlvbihuZXh0TG9jYXRpb24pO1xuICAgICAgfSBlbHNlIGlmIChsb2NhdGlvbiAmJiBuZXh0TG9jYXRpb24uYWN0aW9uID09PSBfQWN0aW9ucy5QT1ApIHtcbiAgICAgICAgdmFyIHByZXZJbmRleCA9IGFsbEtleXMuaW5kZXhPZihsb2NhdGlvbi5rZXkpO1xuICAgICAgICB2YXIgbmV4dEluZGV4ID0gYWxsS2V5cy5pbmRleE9mKG5leHRMb2NhdGlvbi5rZXkpO1xuXG4gICAgICAgIGlmIChwcmV2SW5kZXggIT09IC0xICYmIG5leHRJbmRleCAhPT0gLTEpIGdvKHByZXZJbmRleCAtIG5leHRJbmRleCk7IC8vIFJlc3RvcmUgdGhlIFVSTC5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHB1c2gobG9jYXRpb24pIHtcbiAgICB0cmFuc2l0aW9uVG8oY3JlYXRlTG9jYXRpb24obG9jYXRpb24sIF9BY3Rpb25zLlBVU0gsIGNyZWF0ZUtleSgpKSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXBsYWNlKGxvY2F0aW9uKSB7XG4gICAgdHJhbnNpdGlvblRvKGNyZWF0ZUxvY2F0aW9uKGxvY2F0aW9uLCBfQWN0aW9ucy5SRVBMQUNFLCBjcmVhdGVLZXkoKSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ29CYWNrKCkge1xuICAgIGdvKC0xKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdvRm9yd2FyZCgpIHtcbiAgICBnbygxKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUtleSgpIHtcbiAgICByZXR1cm4gY3JlYXRlUmFuZG9tS2V5KGtleUxlbmd0aCk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVQYXRoKGxvY2F0aW9uKSB7XG4gICAgaWYgKGxvY2F0aW9uID09IG51bGwgfHwgdHlwZW9mIGxvY2F0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIGxvY2F0aW9uO1xuXG4gICAgdmFyIHBhdGhuYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgdmFyIHNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaDtcbiAgICB2YXIgaGFzaCA9IGxvY2F0aW9uLmhhc2g7XG5cbiAgICB2YXIgcmVzdWx0ID0gcGF0aG5hbWU7XG5cbiAgICBpZiAoc2VhcmNoKSByZXN1bHQgKz0gc2VhcmNoO1xuXG4gICAgaWYgKGhhc2gpIHJlc3VsdCArPSBoYXNoO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUhyZWYobG9jYXRpb24pIHtcbiAgICByZXR1cm4gY3JlYXRlUGF0aChsb2NhdGlvbik7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVMb2NhdGlvbihsb2NhdGlvbiwgYWN0aW9uKSB7XG4gICAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IGNyZWF0ZUtleSgpIDogYXJndW1lbnRzWzJdO1xuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb24gPT09ICdvYmplY3QnKSB7XG4gICAgICAvL3dhcm5pbmcoXG4gICAgICAvLyAgZmFsc2UsXG4gICAgICAvLyAgJ1RoZSBzdGF0ZSAoMm5kKSBhcmd1bWVudCB0byBoaXN0b3J5LmNyZWF0ZUxvY2F0aW9uIGlzIGRlcHJlY2F0ZWQ7IHVzZSBhICcgK1xuICAgICAgLy8gICdsb2NhdGlvbiBkZXNjcmlwdG9yIGluc3RlYWQnXG4gICAgICAvLylcblxuICAgICAgaWYgKHR5cGVvZiBsb2NhdGlvbiA9PT0gJ3N0cmluZycpIGxvY2F0aW9uID0gX3BhcnNlUGF0aDJbJ2RlZmF1bHQnXShsb2NhdGlvbik7XG5cbiAgICAgIGxvY2F0aW9uID0gX2V4dGVuZHMoe30sIGxvY2F0aW9uLCB7IHN0YXRlOiBhY3Rpb24gfSk7XG5cbiAgICAgIGFjdGlvbiA9IGtleTtcbiAgICAgIGtleSA9IGFyZ3VtZW50c1szXSB8fCBjcmVhdGVLZXkoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2NyZWF0ZUxvY2F0aW9uM1snZGVmYXVsdCddKGxvY2F0aW9uLCBhY3Rpb24sIGtleSk7XG4gIH1cblxuICAvLyBkZXByZWNhdGVkXG4gIGZ1bmN0aW9uIHNldFN0YXRlKHN0YXRlKSB7XG4gICAgaWYgKGxvY2F0aW9uKSB7XG4gICAgICB1cGRhdGVMb2NhdGlvblN0YXRlKGxvY2F0aW9uLCBzdGF0ZSk7XG4gICAgICB1cGRhdGVMb2NhdGlvbihsb2NhdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwZGF0ZUxvY2F0aW9uU3RhdGUoZ2V0Q3VycmVudExvY2F0aW9uKCksIHN0YXRlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVMb2NhdGlvblN0YXRlKGxvY2F0aW9uLCBzdGF0ZSkge1xuICAgIGxvY2F0aW9uLnN0YXRlID0gX2V4dGVuZHMoe30sIGxvY2F0aW9uLnN0YXRlLCBzdGF0ZSk7XG4gICAgc2F2ZVN0YXRlKGxvY2F0aW9uLmtleSwgbG9jYXRpb24uc3RhdGUpO1xuICB9XG5cbiAgLy8gZGVwcmVjYXRlZFxuICBmdW5jdGlvbiByZWdpc3RlclRyYW5zaXRpb25Ib29rKGhvb2spIHtcbiAgICBpZiAodHJhbnNpdGlvbkhvb2tzLmluZGV4T2YoaG9vaykgPT09IC0xKSB0cmFuc2l0aW9uSG9va3MucHVzaChob29rKTtcbiAgfVxuXG4gIC8vIGRlcHJlY2F0ZWRcbiAgZnVuY3Rpb24gdW5yZWdpc3RlclRyYW5zaXRpb25Ib29rKGhvb2spIHtcbiAgICB0cmFuc2l0aW9uSG9va3MgPSB0cmFuc2l0aW9uSG9va3MuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbSAhPT0gaG9vaztcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGRlcHJlY2F0ZWRcbiAgZnVuY3Rpb24gcHVzaFN0YXRlKHN0YXRlLCBwYXRoKSB7XG4gICAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykgcGF0aCA9IF9wYXJzZVBhdGgyWydkZWZhdWx0J10ocGF0aCk7XG5cbiAgICBwdXNoKF9leHRlbmRzKHsgc3RhdGU6IHN0YXRlIH0sIHBhdGgpKTtcbiAgfVxuXG4gIC8vIGRlcHJlY2F0ZWRcbiAgZnVuY3Rpb24gcmVwbGFjZVN0YXRlKHN0YXRlLCBwYXRoKSB7XG4gICAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykgcGF0aCA9IF9wYXJzZVBhdGgyWydkZWZhdWx0J10ocGF0aCk7XG5cbiAgICByZXBsYWNlKF9leHRlbmRzKHsgc3RhdGU6IHN0YXRlIH0sIHBhdGgpKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbGlzdGVuQmVmb3JlOiBsaXN0ZW5CZWZvcmUsXG4gICAgbGlzdGVuOiBsaXN0ZW4sXG4gICAgdHJhbnNpdGlvblRvOiB0cmFuc2l0aW9uVG8sXG4gICAgcHVzaDogcHVzaCxcbiAgICByZXBsYWNlOiByZXBsYWNlLFxuICAgIGdvOiBnbyxcbiAgICBnb0JhY2s6IGdvQmFjayxcbiAgICBnb0ZvcndhcmQ6IGdvRm9yd2FyZCxcbiAgICBjcmVhdGVLZXk6IGNyZWF0ZUtleSxcbiAgICBjcmVhdGVQYXRoOiBjcmVhdGVQYXRoLFxuICAgIGNyZWF0ZUhyZWY6IGNyZWF0ZUhyZWYsXG4gICAgY3JlYXRlTG9jYXRpb246IGNyZWF0ZUxvY2F0aW9uLFxuXG4gICAgc2V0U3RhdGU6IF9kZXByZWNhdGUyWydkZWZhdWx0J10oc2V0U3RhdGUsICdzZXRTdGF0ZSBpcyBkZXByZWNhdGVkOyB1c2UgbG9jYXRpb24ua2V5IHRvIHNhdmUgc3RhdGUgaW5zdGVhZCcpLFxuICAgIHJlZ2lzdGVyVHJhbnNpdGlvbkhvb2s6IF9kZXByZWNhdGUyWydkZWZhdWx0J10ocmVnaXN0ZXJUcmFuc2l0aW9uSG9vaywgJ3JlZ2lzdGVyVHJhbnNpdGlvbkhvb2sgaXMgZGVwcmVjYXRlZDsgdXNlIGxpc3RlbkJlZm9yZSBpbnN0ZWFkJyksXG4gICAgdW5yZWdpc3RlclRyYW5zaXRpb25Ib29rOiBfZGVwcmVjYXRlMlsnZGVmYXVsdCddKHVucmVnaXN0ZXJUcmFuc2l0aW9uSG9vaywgJ3VucmVnaXN0ZXJUcmFuc2l0aW9uSG9vayBpcyBkZXByZWNhdGVkOyB1c2UgdGhlIGNhbGxiYWNrIHJldHVybmVkIGZyb20gbGlzdGVuQmVmb3JlIGluc3RlYWQnKSxcbiAgICBwdXNoU3RhdGU6IF9kZXByZWNhdGUyWydkZWZhdWx0J10ocHVzaFN0YXRlLCAncHVzaFN0YXRlIGlzIGRlcHJlY2F0ZWQ7IHVzZSBwdXNoIGluc3RlYWQnKSxcbiAgICByZXBsYWNlU3RhdGU6IF9kZXByZWNhdGUyWydkZWZhdWx0J10ocmVwbGFjZVN0YXRlLCAncmVwbGFjZVN0YXRlIGlzIGRlcHJlY2F0ZWQ7IHVzZSByZXBsYWNlIGluc3RlYWQnKVxuICB9O1xufVxuXG5leHBvcnRzWydkZWZhdWx0J10gPSBjcmVhdGVIaXN0b3J5O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiLy9pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJ1xuJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBfQWN0aW9ucyA9IHJlcXVpcmUoJy4vQWN0aW9ucycpO1xuXG52YXIgX3BhcnNlUGF0aCA9IHJlcXVpcmUoJy4vcGFyc2VQYXRoJyk7XG5cbnZhciBfcGFyc2VQYXRoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BhcnNlUGF0aCk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvY2F0aW9uKCkge1xuICB2YXIgbG9jYXRpb24gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyAnLycgOiBhcmd1bWVudHNbMF07XG4gIHZhciBhY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyBfQWN0aW9ucy5QT1AgOiBhcmd1bWVudHNbMV07XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzJdO1xuXG4gIHZhciBfZm91cnRoQXJnID0gYXJndW1lbnRzLmxlbmd0aCA8PSAzIHx8IGFyZ3VtZW50c1szXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3VtZW50c1szXTtcblxuICBpZiAodHlwZW9mIGxvY2F0aW9uID09PSAnc3RyaW5nJykgbG9jYXRpb24gPSBfcGFyc2VQYXRoMlsnZGVmYXVsdCddKGxvY2F0aW9uKTtcblxuICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAvL3dhcm5pbmcoXG4gICAgLy8gIGZhbHNlLFxuICAgIC8vICAnVGhlIHN0YXRlICgybmQpIGFyZ3VtZW50IHRvIGNyZWF0ZUxvY2F0aW9uIGlzIGRlcHJlY2F0ZWQ7IHVzZSBhICcgK1xuICAgIC8vICAnbG9jYXRpb24gZGVzY3JpcHRvciBpbnN0ZWFkJ1xuICAgIC8vKVxuXG4gICAgbG9jYXRpb24gPSBfZXh0ZW5kcyh7fSwgbG9jYXRpb24sIHsgc3RhdGU6IGFjdGlvbiB9KTtcblxuICAgIGFjdGlvbiA9IGtleSB8fCBfQWN0aW9ucy5QT1A7XG4gICAga2V5ID0gX2ZvdXJ0aEFyZztcbiAgfVxuXG4gIHZhciBwYXRobmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lIHx8ICcvJztcbiAgdmFyIHNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaCB8fCAnJztcbiAgdmFyIGhhc2ggPSBsb2NhdGlvbi5oYXNoIHx8ICcnO1xuICB2YXIgc3RhdGUgPSBsb2NhdGlvbi5zdGF0ZSB8fCBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgcGF0aG5hbWU6IHBhdGhuYW1lLFxuICAgIHNlYXJjaDogc2VhcmNoLFxuICAgIGhhc2g6IGhhc2gsXG4gICAgc3RhdGU6IHN0YXRlLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIGtleToga2V5XG4gIH07XG59XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGNyZWF0ZUxvY2F0aW9uO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiLy9pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJ1xuXG5cInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmZ1bmN0aW9uIGRlcHJlY2F0ZShmbikge1xuICByZXR1cm4gZm47XG4gIC8vcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgLy8gIHdhcm5pbmcoZmFsc2UsICdbaGlzdG9yeV0gJyArIG1lc3NhZ2UpXG4gIC8vICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAvL31cbn1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBkZXByZWNhdGU7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdOyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZnVuY3Rpb24gZXh0cmFjdFBhdGgoc3RyaW5nKSB7XG4gIHZhciBtYXRjaCA9IHN0cmluZy5tYXRjaCgvXmh0dHBzPzpcXC9cXC9bXlxcL10qLyk7XG5cbiAgaWYgKG1hdGNoID09IG51bGwpIHJldHVybiBzdHJpbmc7XG5cbiAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKTtcbn1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBleHRyYWN0UGF0aDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoJ3dhcm5pbmcnKTtcblxudmFyIF93YXJuaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3dhcm5pbmcpO1xuXG52YXIgX2V4dHJhY3RQYXRoID0gcmVxdWlyZSgnLi9leHRyYWN0UGF0aCcpO1xuXG52YXIgX2V4dHJhY3RQYXRoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dHJhY3RQYXRoKTtcblxuZnVuY3Rpb24gcGFyc2VQYXRoKHBhdGgpIHtcbiAgdmFyIHBhdGhuYW1lID0gX2V4dHJhY3RQYXRoMlsnZGVmYXVsdCddKHBhdGgpO1xuICB2YXIgc2VhcmNoID0gJyc7XG4gIHZhciBoYXNoID0gJyc7XG5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IF93YXJuaW5nMlsnZGVmYXVsdCddKHBhdGggPT09IHBhdGhuYW1lLCAnQSBwYXRoIG11c3QgYmUgcGF0aG5hbWUgKyBzZWFyY2ggKyBoYXNoIG9ubHksIG5vdCBhIGZ1bGx5IHF1YWxpZmllZCBVUkwgbGlrZSBcIiVzXCInLCBwYXRoKSA6IHVuZGVmaW5lZDtcblxuICB2YXIgaGFzaEluZGV4ID0gcGF0aG5hbWUuaW5kZXhPZignIycpO1xuICBpZiAoaGFzaEluZGV4ICE9PSAtMSkge1xuICAgIGhhc2ggPSBwYXRobmFtZS5zdWJzdHJpbmcoaGFzaEluZGV4KTtcbiAgICBwYXRobmFtZSA9IHBhdGhuYW1lLnN1YnN0cmluZygwLCBoYXNoSW5kZXgpO1xuICB9XG5cbiAgdmFyIHNlYXJjaEluZGV4ID0gcGF0aG5hbWUuaW5kZXhPZignPycpO1xuICBpZiAoc2VhcmNoSW5kZXggIT09IC0xKSB7XG4gICAgc2VhcmNoID0gcGF0aG5hbWUuc3Vic3RyaW5nKHNlYXJjaEluZGV4KTtcbiAgICBwYXRobmFtZSA9IHBhdGhuYW1lLnN1YnN0cmluZygwLCBzZWFyY2hJbmRleCk7XG4gIH1cblxuICBpZiAocGF0aG5hbWUgPT09ICcnKSBwYXRobmFtZSA9ICcvJztcblxuICByZXR1cm4ge1xuICAgIHBhdGhuYW1lOiBwYXRobmFtZSxcbiAgICBzZWFyY2g6IHNlYXJjaCxcbiAgICBoYXNoOiBoYXNoXG4gIH07XG59XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHBhcnNlUGF0aDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKCd3YXJuaW5nJyk7XG5cbnZhciBfd2FybmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93YXJuaW5nKTtcblxuZnVuY3Rpb24gcnVuVHJhbnNpdGlvbkhvb2soaG9vaywgbG9jYXRpb24sIGNhbGxiYWNrKSB7XG4gIHZhciByZXN1bHQgPSBob29rKGxvY2F0aW9uLCBjYWxsYmFjayk7XG5cbiAgaWYgKGhvb2subGVuZ3RoIDwgMikge1xuICAgIC8vIEFzc3VtZSB0aGUgaG9vayBydW5zIHN5bmNocm9ub3VzbHkgYW5kIGF1dG9tYXRpY2FsbHlcbiAgICAvLyBjYWxsIHRoZSBjYWxsYmFjayB3aXRoIHRoZSByZXR1cm4gdmFsdWUuXG4gICAgY2FsbGJhY2socmVzdWx0KTtcbiAgfSBlbHNlIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gX3dhcm5pbmcyWydkZWZhdWx0J10ocmVzdWx0ID09PSB1bmRlZmluZWQsICdZb3Ugc2hvdWxkIG5vdCBcInJldHVyblwiIGluIGEgdHJhbnNpdGlvbiBob29rIHdpdGggYSBjYWxsYmFjayBhcmd1bWVudDsgY2FsbCB0aGUgY2FsbGJhY2sgaW5zdGVhZCcpIDogdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHJ1blRyYW5zaXRpb25Ib29rO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFVzZSBpbnZhcmlhbnQoKSB0byBhc3NlcnQgc3RhdGUgd2hpY2ggeW91ciBwcm9ncmFtIGFzc3VtZXMgdG8gYmUgdHJ1ZS5cbiAqXG4gKiBQcm92aWRlIHNwcmludGYtc3R5bGUgZm9ybWF0IChvbmx5ICVzIGlzIHN1cHBvcnRlZCkgYW5kIGFyZ3VtZW50c1xuICogdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGJyb2tlIGFuZCB3aGF0IHlvdSB3ZXJlXG4gKiBleHBlY3RpbmcuXG4gKlxuICogVGhlIGludmFyaWFudCBtZXNzYWdlIHdpbGwgYmUgc3RyaXBwZWQgaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBpbnZhcmlhbnRcbiAqIHdpbGwgcmVtYWluIHRvIGVuc3VyZSBsb2dpYyBkb2VzIG5vdCBkaWZmZXIgaW4gcHJvZHVjdGlvbi5cbiAqL1xuXG52YXIgaW52YXJpYW50ID0gZnVuY3Rpb24oY29uZGl0aW9uLCBmb3JtYXQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YXJpYW50IHJlcXVpcmVzIGFuIGVycm9yIG1lc3NhZ2UgYXJndW1lbnQnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHZhciBlcnJvcjtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICAnTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJyArXG4gICAgICAgICdmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLidcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhcmdzID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24oKSB7IHJldHVybiBhcmdzW2FyZ0luZGV4KytdOyB9KVxuICAgICAgKTtcbiAgICAgIGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgfVxuXG4gICAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGludmFyaWFudCdzIG93biBmcmFtZVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGludmFyaWFudDtcbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTaW1pbGFyIHRvIGludmFyaWFudCBidXQgb25seSBsb2dzIGEgd2FybmluZyBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvZyBpc3N1ZXMgaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGluIGNyaXRpY2FsXG4gKiBwYXRocy4gUmVtb3ZpbmcgdGhlIGxvZ2dpbmcgY29kZSBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMgd2lsbCBrZWVwIHRoZVxuICogc2FtZSBsb2dpYyBhbmQgZm9sbG93IHRoZSBzYW1lIGNvZGUgcGF0aHMuXG4gKi9cblxudmFyIHdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB3YXJuaW5nID0gZnVuY3Rpb24oY29uZGl0aW9uLCBmb3JtYXQsIGFyZ3MpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiA+IDIgPyBsZW4gLSAyIDogMCk7XG4gICAgZm9yICh2YXIga2V5ID0gMjsga2V5IDwgbGVuOyBrZXkrKykge1xuICAgICAgYXJnc1trZXkgLSAyXSA9IGFyZ3VtZW50c1trZXldO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2B3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgK1xuICAgICAgICAnbWVzc2FnZSBhcmd1bWVudCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGZvcm1hdC5sZW5ndGggPCAxMCB8fCAoL15bc1xcV10qJC8pLnRlc3QoZm9ybWF0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHdhcm5pbmcgZm9ybWF0IHNob3VsZCBiZSBhYmxlIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgJyArXG4gICAgICAgICd3YXJuaW5nLiBQbGVhc2UsIHVzZSBhIG1vcmUgZGVzY3JpcHRpdmUgZm9ybWF0IHRoYW46ICcgKyBmb3JtYXRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICtcbiAgICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgICB9KTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBjYXRjaCh4KSB7fVxuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3YXJuaW5nO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZWZyZXNoKCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfVxuXG4gIGdldE1lc3NhZ2UoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2lnbmVkSW4pIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShcbiAgICAgICAgZ2V0dGV4dChcIllvdSBoYXZlIHNpZ25lZCBpbiBhcyAlKHVzZXJuYW1lKXMuIFBsZWFzZSByZWZyZXNoIHRoZSBwYWdlIGJlZm9yZSBjb250aW51aW5nLlwiKSxcbiAgICAgICAge3VzZXJuYW1lOiB0aGlzLnByb3BzLnNpZ25lZEluLnVzZXJuYW1lfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnNpZ25lZE91dCkge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKFxuICAgICAgICBnZXR0ZXh0KFwiJSh1c2VybmFtZSlzLCB5b3UgaGF2ZSBiZWVuIHNpZ25lZCBvdXQuIFBsZWFzZSByZWZyZXNoIHRoZSBwYWdlIGJlZm9yZSBjb250aW51aW5nLlwiKSxcbiAgICAgICAge3VzZXJuYW1lOiB0aGlzLnByb3BzLnVzZXIudXNlcm5hbWV9LCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2lnbmVkSW4gfHwgdGhpcy5wcm9wcy5zaWduZWRPdXQpIHtcbiAgICAgIHJldHVybiBcImF1dGgtbWVzc2FnZSBzaG93XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcImF1dGgtbWVzc2FnZVwiO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cImxlYWRcIj57dGhpcy5nZXRNZXNzYWdlKCl9PC9wPlxuICAgICAgICA8cD5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5yZWZyZXNofT5cbiAgICAgICAgICAgIHtnZXR0ZXh0KFwiUmVsb2FkIHBhZ2VcIil9XG4gICAgICAgICAgPC9idXR0b24+IDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbi14cyBoaWRkZW4tc20gdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAge2dldHRleHQoXCJvciBwcmVzcyBGNSBrZXkuXCIpfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChzdGF0ZSkge1xuICByZXR1cm4ge1xuICAgIHVzZXI6IHN0YXRlLmF1dGgudXNlcixcbiAgICBzaWduZWRJbjogc3RhdGUuYXV0aC5zaWduZWRJbixcbiAgICBzaWduZWRPdXQ6IHN0YXRlLmF1dGguc2lnbmVkT3V0XG4gIH07XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuY29uc3QgQkFTRV9VUkwgPSAkKCdiYXNlJykuYXR0cignaHJlZicpICsgJ3VzZXItYXZhdGFyLyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0U3JjKCkge1xuICAgIGxldCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IDEwMDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgbGV0IHVybCA9IEJBU0VfVVJMO1xuXG4gICAgaWYgKHRoaXMucHJvcHMudXNlciAmJiB0aGlzLnByb3BzLnVzZXIuaWQpIHtcbiAgICAgIC8vIGp1c3QgYXZhdGFyIGhhc2gsIHNpemUgYW5kIHVzZXIgaWRcbiAgICAgIHVybCArPSB0aGlzLnByb3BzLnVzZXIuYXZhdGFyX2hhc2ggKyAnLycgKyBzaXplICsgJy8nICsgdGhpcy5wcm9wcy51c2VyLmlkICsgJy5wbmcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBqdXN0IGFwcGVuZCBhdmF0YXIgc2l6ZSB0byBmaWxlIHRvIHByb2R1Y2Ugbm8tYXZhdGFyIHBsYWNlaG9sZGVyXG4gICAgICB1cmwgKz0gc2l6ZSArICcucG5nJztcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGltZyBzcmM9e3RoaXMuZ2V0U3JjKCl9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCAndXNlci1hdmF0YXInfVxuICAgICAgICAgICAgICAgIHRpdGxlPXtnZXR0ZXh0KFwiVXNlciBhdmF0YXJcIil9Lz47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRSZWFzb25NZXNzYWdlKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICBpZiAodGhpcy5wcm9wcy5tZXNzYWdlLmh0bWwpIHtcbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImxlYWRcIiBkYW5nZXJvdXNseVNldElubmVySFRNTD17e1xuICAgICAgICAgIF9faHRtbDogdGhpcy5wcm9wcy5tZXNzYWdlLmh0bWxcbiAgICAgICAgfX0gLz47XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiA8cCBjbGFzc05hbWU9XCJsZWFkXCI+e3RoaXMucHJvcHMubWVzc2FnZS5wbGFpbn08L3A+O1xuICAgIH1cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgZ2V0RXhwaXJhdGlvbk1lc3NhZ2UoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZXhwaXJlcykge1xuICAgICAgaWYgKHRoaXMucHJvcHMuZXhwaXJlcy5pc0FmdGVyKG1vbWVudCgpKSkge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIGxldCB0aXRsZSA9IGludGVycG9sYXRlKFxuICAgICAgICAgIGdldHRleHQoXCJUaGlzIGJhbiBleHBpcmVzIG9uICUoZXhwaXJlc19vbilzLlwiKSwge1xuICAgICAgICAgICAgJ2V4cGlyZXNfb24nOiB0aGlzLnByb3BzLmV4cGlyZXMuZm9ybWF0KCdMTCwgTFQnKVxuICAgICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIGxldCBtZXNzYWdlID0gaW50ZXJwb2xhdGUoXG4gICAgICAgICAgZ2V0dGV4dChcIlRoaXMgYmFuIGV4cGlyZXMgJShleHBpcmVzX29uKXMuXCIpLCB7XG4gICAgICAgICAgICAnZXhwaXJlc19vbic6IHRoaXMucHJvcHMuZXhwaXJlcy5mcm9tTm93KClcbiAgICAgICAgICB9LCB0cnVlKTtcblxuICAgICAgICByZXR1cm4gPGFiYnIgdGl0bGU9e3RpdGxlfT5cbiAgICAgICAgICB7bWVzc2FnZX1cbiAgICAgICAgPC9hYmJyPjtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBnZXR0ZXh0KFwiVGhpcyBiYW4gaGFzIGV4cGlyZWQuXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIlRoaXMgYmFuIGlzIHBlcm1hbmVudC5cIik7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJwYWdlIHBhZ2UtZXJyb3IgcGFnZS1lcnJvci1iYW5uZWRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1wYW5lbFwiPlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWljb25cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5oaWdobGlnaHRfb2ZmPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1ib2R5XCI+XG4gICAgICAgICAgICB7dGhpcy5nZXRSZWFzb25NZXNzYWdlKCl9XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtZXNzYWdlLWZvb3Rub3RlXCI+XG4gICAgICAgICAgICAgIHt0aGlzLmdldEV4cGlyYXRpb25NZXNzYWdlKCl9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTG9hZGVyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2xvYWRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCdXR0b24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgbGV0IGNsYXNzTmFtZSA9ICdidG4gJyArIHRoaXMucHJvcHMuY2xhc3NOYW1lO1xuICAgIGxldCBkaXNhYmxlZCA9IHRoaXMucHJvcHMuZGlzYWJsZWQ7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5sb2FkaW5nKSB7XG4gICAgICBjbGFzc05hbWUgKz0gJyBidG4tbG9hZGluZyc7XG4gICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8YnV0dG9uIHR5cGU9e3RoaXMucHJvcHMub25DbGljayA/ICdidXR0b24nIDogJ3N1Ym1pdCd9XG4gICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XG4gICAgICB7dGhpcy5wcm9wcy5jaGlsZHJlbn1cbiAgICAgIHt0aGlzLnByb3BzLmxvYWRpbmcgPyA8TG9hZGVyIC8+IDogbnVsbH1cbiAgICA8L2J1dHRvbj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5cbkJ1dHRvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIGNsYXNzTmFtZTogXCJidG4tZGVmYXVsdFwiLFxuXG4gIHR5cGU6IFwic3VibWl0XCIsXG5cbiAgbG9hZGluZzogZmFsc2UsXG4gIGRpc2FibGVkOiBmYWxzZSxcblxuICBvbkNsaWNrOiBudWxsXG59O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBdmF0YXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYXZhdGFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuY29uc3QgQkFTRV9VUkwgPSAkKCdiYXNlJykuYXR0cignaHJlZicpICsgJ3VzZXItYXZhdGFyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAnaXNMb2FkaW5nJzogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgZ2V0QXZhdGFyU2l6ZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy51cGxvYWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLm9wdGlvbnMuY3JvcF90bXAuc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMub3B0aW9ucy5jcm9wX29yZy5zaXplO1xuICAgIH1cbiAgfVxuXG4gIGdldEF2YXRhclNlY3JldCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy51cGxvYWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLm9wdGlvbnMuY3JvcF90bXAuc2VjcmV0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5vcHRpb25zLmNyb3Bfb3JnLnNlY3JldDtcbiAgICB9XG4gIH1cblxuICBnZXRBdmF0YXJIYXNoKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnVwbG9hZCB8fCB0aGlzLnByb3BzLnVzZXIuYXZhdGFyX2hhc2g7XG4gIH1cblxuICBnZXRJbWFnZVBhdGgoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEJBU0VfVVJMLFxuICAgICAgdGhpcy5nZXRBdmF0YXJTZWNyZXQoKSArICc6JyArIHRoaXMuZ2V0QXZhdGFySGFzaCgpLFxuICAgICAgdGhpcy5wcm9wcy51c2VyLmlkICsgJy5wbmcnXG4gICAgXS5qb2luKCcvJyk7XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBsZXQgY3JvcGl0ID0gJCgnLmNyb3AtZm9ybScpO1xuICAgIGNyb3BpdC53aWR0aCh0aGlzLmdldEF2YXRhclNpemUoKSk7XG5cbiAgICBjcm9waXQuY3JvcGl0KHtcbiAgICAgICd3aWR0aCc6IHRoaXMuZ2V0QXZhdGFyU2l6ZSgpLFxuICAgICAgJ2hlaWdodCc6IHRoaXMuZ2V0QXZhdGFyU2l6ZSgpLFxuICAgICAgJ2ltYWdlU3RhdGUnOiB7XG4gICAgICAgICdzcmMnOiB0aGlzLmdldEltYWdlUGF0aCgpXG4gICAgICB9LFxuICAgICAgb25JbWFnZUxvYWRlZDogKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy51cGxvYWQpIHtcbiAgICAgICAgICAvLyBjZW50ZXIgdXBsb2FkZWQgaW1hZ2VcbiAgICAgICAgICBsZXQgem9vbUxldmVsID0gY3JvcGl0LmNyb3BpdCgnem9vbScpO1xuICAgICAgICAgIGxldCBpbWFnZVNpemUgPSBjcm9waXQuY3JvcGl0KCdpbWFnZVNpemUnKTtcblxuICAgICAgICAgIC8vIGlzIGl0IHdpZGVyIHRoYW4gdGFsbGVyP1xuICAgICAgICAgIGlmIChpbWFnZVNpemUud2lkdGggPiBpbWFnZVNpemUuaGVpZ2h0KSB7XG4gICAgICAgICAgICBsZXQgZGlzcGxheWVkV2lkdGggPSAoaW1hZ2VTaXplLndpZHRoICogem9vbUxldmVsKTtcbiAgICAgICAgICAgIGxldCBvZmZzZXRYID0gKGRpc3BsYXllZFdpZHRoIC0gdGhpcy5nZXRBdmF0YXJTaXplKCkpIC8gLTI7XG5cbiAgICAgICAgICAgIGNyb3BpdC5jcm9waXQoJ29mZnNldCcsIHtcbiAgICAgICAgICAgICAgJ3gnOiBvZmZzZXRYLFxuICAgICAgICAgICAgICAneSc6IDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaW1hZ2VTaXplLndpZHRoIDwgaW1hZ2VTaXplLmhlaWdodCkge1xuICAgICAgICAgICAgbGV0IGRpc3BsYXllZEhlaWdodCA9IChpbWFnZVNpemUuaGVpZ2h0ICogem9vbUxldmVsKTtcbiAgICAgICAgICAgIGxldCBvZmZzZXRZID0gKGRpc3BsYXllZEhlaWdodCAtIHRoaXMuZ2V0QXZhdGFyU2l6ZSgpKSAvIC0yO1xuXG4gICAgICAgICAgICBjcm9waXQuY3JvcGl0KCdvZmZzZXQnLCB7XG4gICAgICAgICAgICAgICd4JzogMCxcbiAgICAgICAgICAgICAgJ3knOiBvZmZzZXRZXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXNlIHByZXNlcnZlZCBjcm9wXG4gICAgICAgICAgbGV0IGNyb3AgPSB0aGlzLnByb3BzLm9wdGlvbnMuY3JvcF9vcmcuY3JvcDtcbiAgICAgICAgICBpZiAoY3JvcCkge1xuICAgICAgICAgICAgY3JvcGl0LmNyb3BpdCgnem9vbScsIGNyb3Auem9vbSk7XG4gICAgICAgICAgICBjcm9waXQuY3JvcGl0KCdvZmZzZXQnLCB7XG4gICAgICAgICAgICAgICd4JzogY3JvcC54LFxuICAgICAgICAgICAgICAneSc6IGNyb3AueVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAkKCcuY3JvcC1mb3JtJykuY3JvcGl0KCdkaXNhYmxlJyk7XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGNyb3BBdmF0YXIgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaXNMb2FkaW5nKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAnaXNMb2FkaW5nJzogdHJ1ZVxuICAgIH0pO1xuXG4gICAgbGV0IGF2YXRhclR5cGUgPSB0aGlzLnByb3BzLnVwbG9hZCA/ICdjcm9wX3RtcCcgOiAnY3JvcF9vcmcnO1xuICAgIGxldCBjcm9waXQgPSAkKCcuY3JvcC1mb3JtJyk7XG5cbiAgICBhamF4LnBvc3QodGhpcy5wcm9wcy51c2VyLmFwaV91cmwuYXZhdGFyLCB7XG4gICAgICAnYXZhdGFyJzogYXZhdGFyVHlwZSxcbiAgICAgICdjcm9wJzoge1xuICAgICAgICAnb2Zmc2V0JzogY3JvcGl0LmNyb3BpdCgnb2Zmc2V0JyksXG4gICAgICAgICd6b29tJzogY3JvcGl0LmNyb3BpdCgnem9vbScpXG4gICAgICB9XG4gICAgfSkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5vbkNvbXBsZXRlKGRhdGEuYXZhdGFyX2hhc2gsIGRhdGEub3B0aW9ucyk7XG4gICAgICBzbmFja2Jhci5zdWNjZXNzKGRhdGEuZGV0YWlsKTtcbiAgICB9LCAocmVqZWN0aW9uKSA9PiB7XG4gICAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICAgIHNuYWNrYmFyLmVycm9yKHJlamVjdGlvbi5kZXRhaWwpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAnaXNMb2FkaW5nJzogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnByb3BzLnNob3dFcnJvcihyZWplY3Rpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWJvZHkgbW9kYWwtYXZhdGFyLWNyb3BcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjcm9wLWZvcm1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNyb3BpdC1pbWFnZS1wcmV2aWV3XCI+PC9kaXY+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIGNsYXNzTmFtZT1cImNyb3BpdC1pbWFnZS16b29tLWlucHV0XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLW1kLTYgY29sLW1kLW9mZnNldC0zXCI+XG5cbiAgICAgICAgICA8QnV0dG9uIG9uQ2xpY2s9e3RoaXMuY3JvcEF2YXRhcn1cbiAgICAgICAgICAgICAgICAgIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLXByaW1hcnkgYnRuLWJsb2NrXCI+XG4gICAgICAgICAgICB7dGhpcy5wcm9wcy51cGxvYWQgPyBnZXR0ZXh0KFwiU2V0IGF2YXRhclwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0dGV4dChcIkNyb3AgaW1hZ2VcIil9XG4gICAgICAgICAgPC9CdXR0b24+XG5cbiAgICAgICAgICA8QnV0dG9uIG9uQ2xpY2s9e3RoaXMucHJvcHMuc2hvd0luZGV4fVxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLWRlZmF1bHQgYnRuLWJsb2NrXCI+XG4gICAgICAgICAgICB7Z2V0dGV4dChcIkNhbmNlbFwiKX1cbiAgICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBiYXRjaCBmcm9tICdtaXNhZ28vdXRpbHMvYmF0Y2gnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGNsYXNzIEdhbGxlcnlJdGVtIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBzZWxlY3QgPSAoKSA9PiB7XG4gICAgdGhpcy5wcm9wcy5zZWxlY3QodGhpcy5wcm9wcy5pbWFnZSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnNlbGVjdGlvbiA9PT0gdGhpcy5wcm9wcy5pbWFnZSkge1xuICAgICAgaWYgKHRoaXMucHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuICdidG4gYnRuLWF2YXRhciBidG4tZGlzYWJsZWQgYXZhdGFyLXNlbGVjdGVkJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAnYnRuIGJ0bi1hdmF0YXIgYXZhdGFyLXNlbGVjdGVkJztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiAnYnRuIGJ0bi1hdmF0YXIgYnRuLWRpc2FibGVkJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdidG4gYnRuLWF2YXRhcic7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3NOYW1lKCl9XG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMucHJvcHMuZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5zZWxlY3R9PlxuICAgICAgPGltZyBzcmM9e21pc2Fnby5nZXQoJ01FRElBX1VSTCcpICsgdGhpcy5wcm9wcy5pbWFnZX0gLz5cbiAgICA8L2J1dHRvbj5cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHYWxsZXJ5IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJhdmF0YXJzLWdhbGxlcnlcIj5cbiAgICAgIDxoMz57dGhpcy5wcm9wcy5uYW1lfTwvaDM+XG5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYXZhdGFycy1nYWxsZXJ5LWltYWdlc1wiPlxuICAgICAgICB7YmF0Y2godGhpcy5wcm9wcy5pbWFnZXMsIDQsIG51bGwpLm1hcCgocm93LCBpKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicm93XCIga2V5PXtpfT5cbiAgICAgICAgICAgIHtyb3cubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImNvbC14cy0zXCIga2V5PXtpfT5cbiAgICAgICAgICAgICAgICB7aXRlbSA/IDxHYWxsZXJ5SXRlbSBpbWFnZT17aXRlbX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5wcm9wcy5kaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9e3RoaXMucHJvcHMuc2VsZWN0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbj17dGhpcy5wcm9wcy5zZWxlY3Rpb259IC8+XG4gICAgICAgICAgICAgICAgICAgICAgOiA8ZGl2IGNsYXNzTmFtZT1cImJsYW5rLWF2YXRhclwiIC8+fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9KX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgJ3NlbGVjdGlvbic6IG51bGwsXG4gICAgICAnaXNMb2FkaW5nJzogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBzZWxlY3QgPSAoaW1hZ2UpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGlvbjogaW1hZ2VcbiAgICB9KTtcbiAgfTtcblxuICBzYXZlID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmlzTG9hZGluZykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgJ2lzTG9hZGluZyc6IHRydWVcbiAgICB9KTtcblxuICAgIGFqYXgucG9zdCh0aGlzLnByb3BzLnVzZXIuYXBpX3VybC5hdmF0YXIsIHtcbiAgICAgIGF2YXRhcjogJ2dhbGxlcmllcycsXG4gICAgICBpbWFnZTogdGhpcy5zdGF0ZS5zZWxlY3Rpb25cbiAgICB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICdpc0xvYWRpbmcnOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIHNuYWNrYmFyLnN1Y2Nlc3MocmVzcG9uc2UuZGV0YWlsKTtcbiAgICAgIHRoaXMucHJvcHMub25Db21wbGV0ZShyZXNwb25zZS5hdmF0YXJfaGFzaCwgcmVzcG9uc2Uub3B0aW9ucyk7XG4gICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgICBzbmFja2Jhci5lcnJvcihyZWplY3Rpb24uZGV0YWlsKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wcm9wcy5zaG93RXJyb3IocmVqZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5IG1vZGFsLWF2YXRhci1nYWxsZXJ5XCI+XG5cbiAgICAgICAge3RoaXMucHJvcHMub3B0aW9ucy5nYWxsZXJpZXMubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIDxHYWxsZXJ5IG5hbWU9e2l0ZW0ubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzPXtpdGVtLmltYWdlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uPXt0aGlzLnN0YXRlLnNlbGVjdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9e3RoaXMuc2VsZWN0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2l9IC8+O1xuICAgICAgICB9KX1cblxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLW1kLTYgY29sLW1kLW9mZnNldC0zXCI+XG5cbiAgICAgICAgICAgIDxCdXR0b24gb25DbGljaz17dGhpcy5zYXZlfVxuICAgICAgICAgICAgICAgICAgICBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyF0aGlzLnN0YXRlLnNlbGVjdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLXByaW1hcnkgYnRuLWJsb2NrXCI+XG4gICAgICAgICAgICAgIHt0aGlzLnN0YXRlLnNlbGVjdGlvbiA/IGdldHRleHQoXCJTYXZlIGNob2ljZVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXR0ZXh0KFwiU2VsZWN0IGF2YXRhclwiKX1cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICAgICAgICA8QnV0dG9uIG9uQ2xpY2s9e3RoaXMucHJvcHMuc2hvd0luZGV4fVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiPlxuICAgICAgICAgICAgICB7Z2V0dGV4dChcIkNhbmNlbFwiKX1cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEF2YXRhciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9hdmF0YXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTG9hZGVyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2xvYWRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGNhbGxBcGkoYXZhdGFyVHlwZSkge1xuICAgIGlmICh0aGlzLnN0YXRlLmlzTG9hZGluZykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgJ2lzTG9hZGluZyc6IHRydWVcbiAgICB9KTtcblxuICAgIGFqYXgucG9zdCh0aGlzLnByb3BzLnVzZXIuYXBpX3VybC5hdmF0YXIsIHtcbiAgICAgIGF2YXRhcjogYXZhdGFyVHlwZVxuICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgc25hY2tiYXIuc3VjY2VzcyhyZXNwb25zZS5kZXRhaWwpO1xuICAgICAgdGhpcy5wcm9wcy5vbkNvbXBsZXRlKHJlc3BvbnNlLmF2YXRhcl9oYXNoLCByZXNwb25zZS5vcHRpb25zKTtcbiAgICB9LCAocmVqZWN0aW9uKSA9PiB7XG4gICAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICAgIHNuYWNrYmFyLmVycm9yKHJlamVjdGlvbi5kZXRhaWwpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAnaXNMb2FkaW5nJzogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnByb3BzLnNob3dFcnJvcihyZWplY3Rpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBzZXRHcmF2YXRhciA9ICgpID0+IHtcbiAgICB0aGlzLmNhbGxBcGkoJ2dyYXZhdGFyJyk7XG4gIH07XG5cbiAgc2V0R2VuZXJhdGVkID0gKCkgPT4ge1xuICAgIHRoaXMuY2FsbEFwaSgnZ2VuZXJhdGVkJyk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgZ2V0R3JhdmF0YXJCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMub3B0aW9ucy5ncmF2YXRhcikge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxCdXR0b24gb25DbGljaz17dGhpcy5zZXRHcmF2YXRhcn1cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4tZGVmYXVsdCBidG4tYmxvY2sgYnRuLWF2YXRhci1ncmF2YXRhclwiPlxuICAgICAgICB7Z2V0dGV4dChcIkRvd25sb2FkIG15IEdyYXZhdGFyXCIpfVxuICAgICAgPC9CdXR0b24+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q3JvcEJ1dHRvbigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5vcHRpb25zLmNyb3Bfb3JnKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPEJ1dHRvbiBvbkNsaWNrPXt0aGlzLnByb3BzLnNob3dDcm9wfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0bi1kZWZhdWx0IGJ0bi1ibG9jayBidG4tYXZhdGFyLWNyb3BcIj5cbiAgICAgICAge2dldHRleHQoXCJSZS1jcm9wIHVwbG9hZGVkIGltYWdlXCIpfVxuICAgICAgPC9CdXR0b24+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0VXBsb2FkQnV0dG9uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLm9wdGlvbnMudXBsb2FkKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPEJ1dHRvbiBvbkNsaWNrPXt0aGlzLnByb3BzLnNob3dVcGxvYWR9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLWRlZmF1bHQgYnRuLWJsb2NrIGJ0bi1hdmF0YXItdXBsb2FkXCI+XG4gICAgICAgIHtnZXR0ZXh0KFwiVXBsb2FkIG5ldyBpbWFnZVwiKX1cbiAgICAgIDwvQnV0dG9uPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldEdhbGxlcnlCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMub3B0aW9ucy5nYWxsZXJpZXMpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8QnV0dG9uIG9uQ2xpY2s9e3RoaXMucHJvcHMuc2hvd0dhbGxlcnl9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLWRlZmF1bHQgYnRuLWJsb2NrIGJ0bi1hdmF0YXItZ2FsbGVyeVwiPlxuICAgICAgICB7Z2V0dGV4dChcIlBpY2sgYXZhdGFyIGZyb20gZ2FsbGVyeVwiKX1cbiAgICAgIDwvQnV0dG9uPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldEF2YXRhclByZXZpZXcoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGxldCB1c2VyUGV2aWV3ID0ge1xuICAgICAgaWQ6IHRoaXMucHJvcHMudXNlci5pZCxcbiAgICAgIGF2YXRhcl9oYXNoOiB0aGlzLnByb3BzLm9wdGlvbnMuYXZhdGFyX2hhc2hcbiAgICB9XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICAgIGlmICh0aGlzLnN0YXRlLmlzTG9hZGluZykge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYXZhdGFyLXByZXZpZXcgcHJldmlldy1sb2FkaW5nXCI+XG4gICAgICAgIDxBdmF0YXIgdXNlcj17dXNlclBldmlld30gc2l6ZT1cIjIwMFwiIC8+XG4gICAgICAgIDxMb2FkZXIgLz5cbiAgICAgIDwvZGl2PjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImF2YXRhci1wcmV2aWV3XCI+XG4gICAgICAgIDxBdmF0YXIgdXNlcj17dXNlclBldmlld30gc2l6ZT1cIjIwMFwiIC8+XG4gICAgICA8L2Rpdj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keSBtb2RhbC1hdmF0YXItaW5kZXhcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLW1kLTVcIj5cblxuICAgICAgICAgIHt0aGlzLmdldEF2YXRhclByZXZpZXcoKX1cblxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtbWQtN1wiPlxuXG4gICAgICAgICAge3RoaXMuZ2V0R3JhdmF0YXJCdXR0b24oKX1cblxuICAgICAgICAgIDxCdXR0b24gb25DbGljaz17dGhpcy5zZXRHZW5lcmF0ZWR9XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4tZGVmYXVsdCBidG4tYmxvY2sgYnRuLWF2YXRhci1nZW5lcmF0ZVwiPlxuICAgICAgICAgICAge2dldHRleHQoXCJHZW5lcmF0ZSBteSBpbmRpdmlkdWFsIGF2YXRhclwiKX1cbiAgICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgICAgIHt0aGlzLmdldENyb3BCdXR0b24oKX1cbiAgICAgICAgICB7dGhpcy5nZXRVcGxvYWRCdXR0b24oKX1cbiAgICAgICAgICB7dGhpcy5nZXRHYWxsZXJ5QnV0dG9uKCl9XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQXZhdGFySW5kZXggZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvY2hhbmdlLWF2YXRhci9pbmRleCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEF2YXRhckNyb3AgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvY2hhbmdlLWF2YXRhci9jcm9wJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQXZhdGFyVXBsb2FkIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2NoYW5nZS1hdmF0YXIvdXBsb2FkJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQXZhdGFyR2FsbGVyeSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9jaGFuZ2UtYXZhdGFyL2dhbGxlcnknOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBMb2FkZXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbW9kYWwtbG9hZGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgeyB1cGRhdGVBdmF0YXIgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvdXNlcnMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGNsYXNzIENoYW5nZUF2YXRhckVycm9yIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0RXJyb3JSZWFzb24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucmVhc29uKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPHAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IHRoaXMucHJvcHMucmVhc29ufX0gLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWJvZHlcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1pY29uXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICByZW1vdmVfY2lyY2xlX291dGxpbmVcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtYm9keVwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgICAge3RoaXMucHJvcHMubWVzc2FnZX1cbiAgICAgICAgPC9wPlxuICAgICAgICB7dGhpcy5nZXRFcnJvclJlYXNvbigpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBhamF4LmdldCh0aGlzLnByb3BzLnVzZXIuYXBpX3VybC5hdmF0YXIpLnRoZW4oKG9wdGlvbnMpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAnY29tcG9uZW50JzogQXZhdGFySW5kZXgsXG4gICAgICAgICdvcHRpb25zJzogb3B0aW9ucyxcbiAgICAgICAgJ2Vycm9yJzogbnVsbFxuICAgICAgfSk7XG4gICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgdGhpcy5zaG93RXJyb3IocmVqZWN0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgc2hvd0Vycm9yID0gKGVycm9yKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBlcnJvclxuICAgIH0pO1xuICB9O1xuXG4gIHNob3dJbmRleCA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICdjb21wb25lbnQnOiBBdmF0YXJJbmRleFxuICAgIH0pO1xuICB9O1xuXG4gIHNob3dVcGxvYWQgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAnY29tcG9uZW50JzogQXZhdGFyVXBsb2FkXG4gICAgfSk7XG4gIH07XG5cbiAgc2hvd0Nyb3AgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAnY29tcG9uZW50JzogQXZhdGFyQ3JvcFxuICAgIH0pO1xuICB9O1xuXG4gIHNob3dHYWxsZXJ5ID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgJ2NvbXBvbmVudCc6IEF2YXRhckdhbGxlcnlcbiAgICB9KTtcbiAgfTtcblxuICBjb21wbGV0ZUZsb3cgPSAoYXZhdGFySGFzaCwgb3B0aW9ucykgPT4ge1xuICAgIHN0b3JlLmRpc3BhdGNoKHVwZGF0ZUF2YXRhcih0aGlzLnByb3BzLnVzZXIsIGF2YXRhckhhc2gpKTtcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgJ2NvbXBvbmVudCc6IEF2YXRhckluZGV4LFxuICAgICAgb3B0aW9uc1xuICAgIH0pO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGdldEJvZHkoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmVycm9yKSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcmV0dXJuIDxDaGFuZ2VBdmF0YXJFcnJvciBtZXNzYWdlPXt0aGlzLnN0YXRlLmVycm9yLmRldGFpbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb249e3RoaXMuc3RhdGUuZXJyb3IucmVhc29ufSAvPjtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcmV0dXJuIDx0aGlzLnN0YXRlLmNvbXBvbmVudCBvcHRpb25zPXt0aGlzLnN0YXRlLm9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcj17dGhpcy5wcm9wcy51c2VyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGU9e3RoaXMuY29tcGxldGVGbG93fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dFcnJvcj17dGhpcy5zaG93RXJyb3J9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0luZGV4PXt0aGlzLnNob3dJbmRleH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q3JvcD17dGhpcy5zaG93Q3JvcH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93VXBsb2FkPXt0aGlzLnNob3dVcGxvYWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0dhbGxlcnk9e3RoaXMuc2hvd0dhbGxlcnl9IC8+O1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPExvYWRlciAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgaWYgKHRoaXMuc3RhdGUgJiYgdGhpcy5zdGF0ZS5lcnJvcikge1xuICAgICAgcmV0dXJuIFwibW9kYWwtZGlhbG9nIG1vZGFsLW1lc3NhZ2UgbW9kYWwtY2hhbmdlLWF2YXRhclwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJtb2RhbC1kaWFsb2cgbW9kYWwtY2hhbmdlLWF2YXRhclwiO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfVxuICAgICAgICAgICAgICAgIHJvbGU9XCJkb2N1bWVudFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtnZXR0ZXh0KFwiQ2xvc2VcIil9PlxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwibW9kYWwtdGl0bGVcIj57Z2V0dGV4dChcIkNoYW5nZSB5b3VyIGF2YXRhclwiKX08L2g0PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7dGhpcy5nZXRCb2R5KCl9XG5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Qoc3RhdGUpIHtcbiAgcmV0dXJuIHtcbiAgICAndXNlcic6IHN0YXRlLmF1dGgudXNlclxuICB9O1xufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBdmF0YXJDcm9wIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2NoYW5nZS1hdmF0YXIvY3JvcCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgZmlsZVNpemUgZnJvbSAnbWlzYWdvL3V0aWxzL2ZpbGUtc2l6ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgJ2ltYWdlJzogbnVsbCxcbiAgICAgICdwcmV2aWV3JzogbnVsbCxcbiAgICAgICdwcm9ncmVzcyc6IDAsXG4gICAgICAndXBsb2FkZWQnOiBudWxsLFxuICAgIH07XG4gIH1cblxuICB2YWxpZGF0ZUZpbGUoaW1hZ2UpIHtcbiAgICBpZiAoaW1hZ2Uuc2l6ZSA+IHRoaXMucHJvcHMub3B0aW9ucy51cGxvYWQubGltaXQpIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiU2VsZWN0ZWQgZmlsZSBpcyB0b28gYmlnLiAoJShmaWxlc2l6ZSlzKVwiKSwge1xuICAgICAgICAnZmlsZXNpemUnOiBmaWxlU2l6ZShpbWFnZS5zaXplKVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgbGV0IGludmFsaWRUeXBlTXNnID0gZ2V0dGV4dChcIlNlbGVjdGVkIGZpbGUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLlwiKTtcbiAgICBpZiAodGhpcy5wcm9wcy5vcHRpb25zLnVwbG9hZC5hbGxvd2VkX21pbWVfdHlwZXMuaW5kZXhPZihpbWFnZS50eXBlKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkVHlwZU1zZztcbiAgICB9XG5cbiAgICBsZXQgZXh0ZW5zaW9uRm91bmQgPSBmYWxzZTtcbiAgICBsZXQgbG93ZXJlZEZpbGVuYW1lID0gaW1hZ2UubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMucHJvcHMub3B0aW9ucy51cGxvYWQuYWxsb3dlZF9leHRlbnNpb25zLm1hcChmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGlmIChsb3dlcmVkRmlsZW5hbWUuc3Vic3RyKGV4dGVuc2lvbi5sZW5ndGggKiAtMSkgPT09IGV4dGVuc2lvbikge1xuICAgICAgICBleHRlbnNpb25Gb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIWV4dGVuc2lvbkZvdW5kKSB7XG4gICAgICByZXR1cm4gaW52YWxpZFR5cGVNc2c7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBwaWNrRmlsZSA9ICgpID0+IHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXZhdGFyLWhpZGRlbi11cGxvYWQnKS5jbGljaygpO1xuICB9O1xuXG4gIHVwbG9hZEZpbGUgPSAoKSA9PiB7XG4gICAgbGV0IGltYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F2YXRhci1oaWRkZW4tdXBsb2FkJykuZmlsZXNbMF07XG5cbiAgICBsZXQgdmFsaWRhdGlvbkVycm9yID0gdGhpcy52YWxpZGF0ZUZpbGUoaW1hZ2UpO1xuICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgIHNuYWNrYmFyLmVycm9yKHZhbGlkYXRpb25FcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBpbWFnZSxcbiAgICAgICdwcmV2aWV3JzogVVJMLmNyZWF0ZU9iamVjdFVSTChpbWFnZSksXG4gICAgICAncHJvZ3Jlc3MnOiAwXG4gICAgfSk7XG5cbiAgICBsZXQgZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGRhdGEuYXBwZW5kKCdhdmF0YXInLCAndXBsb2FkJyk7XG4gICAgZGF0YS5hcHBlbmQoJ2ltYWdlJywgaW1hZ2UpO1xuXG4gICAgYWpheC51cGxvYWQodGhpcy5wcm9wcy51c2VyLmFwaV91cmwuYXZhdGFyLCBkYXRhLCAocHJvZ3Jlc3MpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBwcm9ncmVzc1xuICAgICAgfSk7XG4gICAgfSkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICdvcHRpb25zJzogZGF0YS5vcHRpb25zLFxuICAgICAgICAndXBsb2FkZWQnOiBkYXRhLmRldGFpbFxuICAgICAgfSk7XG4gICAgICBzbmFja2Jhci5pbmZvKGdldHRleHQoXCJZb3VyIGltYWdlIGhhcyBiZWVuIHVwbG9hZGVkIGFuZCB5b3UgbWF5IG5vdyBjcm9wIGl0LlwiKSk7XG4gICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgICBzbmFja2Jhci5lcnJvcihyZWplY3Rpb24uZGV0YWlsKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlLFxuICAgICAgICAgICdpbWFnZSc6IG51bGwsXG4gICAgICAgICAgJ3Byb2dyZXNzJzogMFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wcm9wcy5zaG93RXJyb3IocmVqZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBnZXRVcGxvYWRSZXF1aXJlbWVudHMob3B0aW9ucykge1xuICAgIGxldCBleHRlbnNpb25zID0gb3B0aW9ucy5hbGxvd2VkX2V4dGVuc2lvbnMubWFwKGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgcmV0dXJuIGV4dGVuc2lvbi5zdWJzdHIoMSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIiUoZmlsZXMpcyBmaWxlcyBzbWFsbGVyIHRoYW4gJShsaW1pdClzXCIpLCB7XG4gICAgICAgICdmaWxlcyc6IGV4dGVuc2lvbnMuam9pbignLCAnKSxcbiAgICAgICAgJ2xpbWl0JzogZmlsZVNpemUob3B0aW9ucy5saW1pdClcbiAgICAgIH0sIHRydWUpO1xuICB9XG5cbiAgZ2V0VXBsb2FkQnV0dG9uKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5IG1vZGFsLWF2YXRhci11cGxvYWRcIj5cbiAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcGljay1maWxlXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnBpY2tGaWxlfT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgIGlucHV0XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAge2dldHRleHQoXCJTZWxlY3QgZmlsZVwiKX1cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtbXV0ZWRcIj5cbiAgICAgICAgICB7dGhpcy5nZXRVcGxvYWRSZXF1aXJlbWVudHModGhpcy5wcm9wcy5vcHRpb25zLnVwbG9hZCl9XG4gICAgICAgIDwvcD5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG4gIGdldFVwbG9hZFByb2dyZXNzTGFiZWwoKSB7XG4gICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKHByb2dyZXNzKXMgJSBjb21wbGV0ZVwiKSwge1xuICAgICAgICAncHJvZ3Jlc3MnOiB0aGlzLnN0YXRlLnByb2dyZXNzXG4gICAgICB9LCB0cnVlKTtcbiAgfVxuXG4gIGdldFVwbG9hZFByb2dyZXNzKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5IG1vZGFsLWF2YXRhci11cGxvYWRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1cGxvYWQtcHJvZ3Jlc3NcIj5cbiAgICAgICAgICA8aW1nIHNyYz17dGhpcy5zdGF0ZS5wcmV2aWV3fSAvPlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwcm9ncmVzcy1iYXJcIiByb2xlPVwicHJvZ3Jlc3NiYXJcIlxuICAgICAgICAgICAgICAgICBhcmlhLXZhbHVlbm93PVwie3RoaXMuc3RhdGUucHJvZ3Jlc3N9XCJcbiAgICAgICAgICAgICAgICAgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgc3R5bGU9e3t3aWR0aDogdGhpcy5zdGF0ZS5wcm9ncmVzcyArICclJ319PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzci1vbmx5XCI+e3RoaXMuZ2V0VXBsb2FkUHJvZ3Jlc3NMYWJlbCgpfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG4gIHJlbmRlclVwbG9hZCgpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXY+XG4gICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgIGlkPVwiYXZhdGFyLWhpZGRlbi11cGxvYWRcIlxuICAgICAgICAgICAgIGNsYXNzTmFtZT1cImhpZGRlbi1maWxlLXVwbG9hZFwiXG4gICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMudXBsb2FkRmlsZX0gLz5cbiAgICAgIHt0aGlzLnN0YXRlLmltYWdlID8gdGhpcy5nZXRVcGxvYWRQcm9ncmVzcygpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZ2V0VXBsb2FkQnV0dG9uKCl9XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC02IGNvbC1tZC1vZmZzZXQtM1wiPlxuXG4gICAgICAgICAgPEJ1dHRvbiBvbkNsaWNrPXt0aGlzLnByb3BzLnNob3dJbmRleH1cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshIXRoaXMuc3RhdGUuaW1hZ2V9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4tZGVmYXVsdCBidG4tYmxvY2tcIj5cbiAgICAgICAgICAgIHtnZXR0ZXh0KFwiQ2FuY2VsXCIpfVxuICAgICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cblxuICByZW5kZXJDcm9wKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPEF2YXRhckNyb3Agb3B0aW9ucz17dGhpcy5zdGF0ZS5vcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgICB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZD17dGhpcy5zdGF0ZS51cGxvYWRlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgb25Db21wbGV0ZT17dGhpcy5wcm9wcy5vbkNvbXBsZXRlfVxuICAgICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3I9e3RoaXMucHJvcHMuc2hvd0Vycm9yfVxuICAgICAgICAgICAgICAgICAgICAgICBzaG93SW5kZXg9e3RoaXMucHJvcHMuc2hvd0luZGV4fSAvPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gKHRoaXMuc3RhdGUudXBsb2FkZWQgPyB0aGlzLnJlbmRlckNyb3AoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMucmVuZGVyVXBsb2FkKCkpO1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGlzVmFsaWRhdGVkKCkge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5wcm9wcy52YWxpZGF0aW9uICE9PSBcInVuZGVmaW5lZFwiO1xuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGxldCBjbGFzc05hbWUgPSAnZm9ybS1ncm91cCc7XG4gICAgaWYgKHRoaXMuaXNWYWxpZGF0ZWQoKSkge1xuICAgICAgY2xhc3NOYW1lICs9ICcgaGFzLWZlZWRiYWNrJztcbiAgICAgIGlmICh0aGlzLnByb3BzLnZhbGlkYXRpb24gPT09IG51bGwpIHtcbiAgICAgICAgY2xhc3NOYW1lICs9ICcgaGFzLXN1Y2Nlc3MnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xhc3NOYW1lICs9ICcgaGFzLWVycm9yJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgfVxuXG4gIGdldEZlZWRiYWNrKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnZhbGlkYXRpb24pIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImhlbHAtYmxvY2sgZXJyb3JzXCI+XG4gICAgICAgIHt0aGlzLnByb3BzLnZhbGlkYXRpb24ubWFwKChlcnJvciwgaSkgPT4ge1xuICAgICAgICAgIHJldHVybiA8cCBrZXk9e3RoaXMucHJvcHMuZm9yICsgJ0ZlZWRiYWNrSXRlbScgKyBpfT57ZXJyb3J9PC9wPjtcbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRGZWVkYmFja0ljb24oKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZGF0ZWQoKSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb24gZm9ybS1jb250cm9sLWZlZWRiYWNrXCJcbiAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIiBrZXk9e3RoaXMucHJvcHMuZm9yICsgJ0ZlZWRiYWNrSWNvbid9PlxuICAgICAgICB7dGhpcy5wcm9wcy52YWxpZGF0aW9uID8gJ2NsZWFyJyA6ICdjaGVjayd9XG4gICAgICA8L3NwYW4+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0RmVlZGJhY2tEZXNjcmlwdGlvbigpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkYXRlZCgpKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPHNwYW4gaWQ9e3RoaXMucHJvcHMuZm9yICsgJ19zdGF0dXMnfSBjbGFzc05hbWU9XCJzci1vbmx5XCI+XG4gICAgICAgIHt0aGlzLnByb3BzLnZhbGlkYXRpb24gPyBnZXR0ZXh0KCcoZXJyb3IpJykgOiBnZXR0ZXh0KCcoc3VjY2VzcyknKX1cbiAgICAgIDwvc3Bhbj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRIZWxwVGV4dCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5oZWxwVGV4dCkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxwIGNsYXNzTmFtZT1cImhlbHAtYmxvY2tcIj57dGhpcy5wcm9wcy5oZWxwVGV4dH08L3A+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3NOYW1lKCl9PlxuICAgICAgPGxhYmVsIGNsYXNzTmFtZT17J2NvbnRyb2wtbGFiZWwgJyArICh0aGlzLnByb3BzLmxhYmVsQ2xhc3MgfHwgJycpfVxuICAgICAgICAgICAgIGh0bWxGb3I9e3RoaXMucHJvcHMuZm9yIHx8ICcnfT5cbiAgICAgICAge3RoaXMucHJvcHMubGFiZWwgKyAnOid9XG4gICAgICA8L2xhYmVsPlxuICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMucHJvcHMuY29udHJvbENsYXNzIHx8ICcnfT5cbiAgICAgICAge3RoaXMucHJvcHMuY2hpbGRyZW59XG4gICAgICAgIHt0aGlzLmdldEZlZWRiYWNrSWNvbigpfVxuICAgICAgICB7dGhpcy5nZXRGZWVkYmFja0Rlc2NyaXB0aW9uKCl9XG4gICAgICAgIHt0aGlzLmdldEZlZWRiYWNrKCl9XG4gICAgICAgIHt0aGlzLmdldEhlbHBUZXh0KCl9XG4gICAgICAgIHt0aGlzLnByb3BzLmV4dHJhIHx8IG51bGx9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVxdWlyZWQgfSBmcm9tICdtaXNhZ28vdXRpbHMvdmFsaWRhdG9ycyc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmxldCB2YWxpZGF0ZVJlcXVpcmVkID0gcmVxdWlyZWQoKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICB2YWxpZGF0ZSgpIHtcbiAgICBsZXQgZXJyb3JzID0ge307XG4gICAgaWYgKCF0aGlzLnN0YXRlLnZhbGlkYXRvcnMpIHtcbiAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgbGV0IHZhbGlkYXRvcnMgPSB7XG4gICAgICByZXF1aXJlZDogdGhpcy5zdGF0ZS52YWxpZGF0b3JzLnJlcXVpcmVkIHx8IHRoaXMuc3RhdGUudmFsaWRhdG9ycyxcbiAgICAgIG9wdGlvbmFsOiB0aGlzLnN0YXRlLnZhbGlkYXRvcnMub3B0aW9uYWwgfHwge31cbiAgICB9O1xuXG4gICAgbGV0IHZhbGlkYXRlZEZpZWxkcyA9IFtdO1xuXG4gICAgLy8gYWRkIHJlcXVpcmVkIGZpZWxkcyB0byB2YWxpZGF0aW9uXG4gICAgZm9yIChsZXQgbmFtZSBpbiB2YWxpZGF0b3JzLnJlcXVpcmVkKSB7XG4gICAgICBpZiAodmFsaWRhdG9ycy5yZXF1aXJlZC5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJlxuICAgICAgICAgIHZhbGlkYXRvcnMucmVxdWlyZWRbbmFtZV0pIHtcbiAgICAgICAgdmFsaWRhdGVkRmllbGRzLnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWRkIG9wdGlvbmFsIGZpZWxkcyB0byB2YWxpZGF0aW9uXG4gICAgZm9yIChsZXQgbmFtZSBpbiB2YWxpZGF0b3JzLm9wdGlvbmFsKSB7XG4gICAgICBpZiAodmFsaWRhdG9ycy5vcHRpb25hbC5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJlxuICAgICAgICAgIHZhbGlkYXRvcnMub3B0aW9uYWxbbmFtZV0pIHtcbiAgICAgICAgdmFsaWRhdGVkRmllbGRzLnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgZmllbGRzIHZhbHVlc1xuICAgIGZvciAobGV0IGkgaW4gdmFsaWRhdGVkRmllbGRzKSB7XG4gICAgICBsZXQgbmFtZSA9IHZhbGlkYXRlZEZpZWxkc1tpXTtcbiAgICAgIGxldCBmaWVsZEVycm9ycyA9IHRoaXMudmFsaWRhdGVGaWVsZChuYW1lLCB0aGlzLnN0YXRlW25hbWVdKTtcblxuICAgICAgaWYgKGZpZWxkRXJyb3JzID09PSBudWxsKSB7XG4gICAgICAgIGVycm9yc1tuYW1lXSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkRXJyb3JzKSB7XG4gICAgICAgIGVycm9yc1tuYW1lXSA9IGZpZWxkRXJyb3JzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICBpc1ZhbGlkKCkge1xuICAgIGxldCBlcnJvcnMgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgZm9yIChsZXQgZmllbGQgaW4gZXJyb3JzKSB7XG4gICAgICBpZiAoZXJyb3JzLmhhc093blByb3BlcnR5KGZpZWxkKSkge1xuICAgICAgICBpZiAoZXJyb3JzW2ZpZWxkXSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFsaWRhdGVGaWVsZChuYW1lLCB2YWx1ZSkge1xuICAgIGxldCBlcnJvcnMgPSBbXTtcbiAgICBpZiAoIXRoaXMuc3RhdGUudmFsaWRhdG9ycykge1xuICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICBsZXQgdmFsaWRhdG9ycyA9IHtcbiAgICAgIHJlcXVpcmVkOiAodGhpcy5zdGF0ZS52YWxpZGF0b3JzLnJlcXVpcmVkIHx8IHRoaXMuc3RhdGUudmFsaWRhdG9ycylbbmFtZV0sXG4gICAgICBvcHRpb25hbDogKHRoaXMuc3RhdGUudmFsaWRhdG9ycy5vcHRpb25hbCB8fCB7fSlbbmFtZV1cbiAgICB9O1xuXG4gICAgbGV0IHJlcXVpcmVkRXJyb3IgPSB2YWxpZGF0ZVJlcXVpcmVkKHZhbHVlKSB8fCBmYWxzZTtcblxuICAgIGlmICh2YWxpZGF0b3JzLnJlcXVpcmVkKSB7XG4gICAgICBpZiAocmVxdWlyZWRFcnJvcikge1xuICAgICAgICBlcnJvcnMgPSBbcmVxdWlyZWRFcnJvcl07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpIGluIHZhbGlkYXRvcnMucmVxdWlyZWQpIHtcbiAgICAgICAgICBsZXQgdmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdG9ycy5yZXF1aXJlZFtpXSh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2godmFsaWRhdGlvbkVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyBlcnJvcnMgOiBudWxsO1xuICAgIH0gZWxzZSBpZiAocmVxdWlyZWRFcnJvciA9PT0gZmFsc2UgJiYgdmFsaWRhdG9ycy5vcHRpb25hbCkge1xuICAgICAgZm9yIChsZXQgaSBpbiB2YWxpZGF0b3JzLm9wdGlvbmFsKSB7XG4gICAgICAgIGxldCB2YWxpZGF0aW9uRXJyb3IgPSB2YWxpZGF0b3JzLm9wdGlvbmFsW2ldKHZhbHVlKTtcbiAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgIGVycm9ycy5wdXNoKHZhbGlkYXRpb25FcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyBlcnJvcnMgOiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTsgLy8gZmFsc2UgPT09IGZpZWxkIHdhc24ndCB2YWxpZGF0ZWRcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgYmluZElucHV0ID0gKG5hbWUpID0+IHtcbiAgICByZXR1cm4gKGV2ZW50KSA9PiB7XG4gICAgICBsZXQgbmV3U3RhdGUgPSB7XG4gICAgICAgIFtuYW1lXTogZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgICB9O1xuXG4gICAgICBsZXQgZm9ybUVycm9ycyA9IHRoaXMuc3RhdGUuZXJyb3JzIHx8IHt9O1xuICAgICAgZm9ybUVycm9yc1tuYW1lXSA9IHRoaXMudmFsaWRhdGVGaWVsZChuYW1lLCBuZXdTdGF0ZVtuYW1lXSk7XG4gICAgICBuZXdTdGF0ZS5lcnJvcnMgPSBmb3JtRXJyb3JzO1xuXG4gICAgICB0aGlzLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICB9XG4gIH07XG5cbiAgY2xlYW4oKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaGFuZGxlU3VjY2VzcyhzdWNjZXNzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaGFuZGxlRXJyb3IocmVqZWN0aW9uKSB7XG4gICAgc25hY2tiYXIuYXBpRXJyb3IocmVqZWN0aW9uKTtcbiAgfVxuXG4gIGhhbmRsZVN1Ym1pdCA9IChldmVudCkgPT4ge1xuICAgIC8vIHdlIGRvbid0IHJlbG9hZCBwYWdlIG9uIHN1Ym1pc3Npb25zXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIGlmICh0aGlzLnN0YXRlLmlzTG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNsZWFuKCkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2lzTG9hZGluZzogdHJ1ZX0pO1xuICAgICAgbGV0IHByb21pc2UgPSB0aGlzLnNlbmQoKTtcblxuICAgICAgaWYgKHByb21pc2UpIHtcbiAgICAgICAgcHJvbWlzZS50aGVuKChzdWNjZXNzKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aXNMb2FkaW5nOiBmYWxzZX0pO1xuICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2VzcyhzdWNjZXNzKTtcbiAgICAgICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2lzTG9hZGluZzogZmFsc2V9KTtcbiAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKHJlamVjdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aXNMb2FkaW5nOiBmYWxzZX0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGlzQWN0aXZlKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnBhdGgpIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZS5pbmRleE9mKHRoaXMucHJvcHMucGF0aCkgPT09IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMuaXNBY3RpdmUoKSkge1xuICAgICAgcmV0dXJuICh0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCAnJykgKyAnICcrICh0aGlzLnByb3BzLmFjdGl2ZUNsYXNzTmFtZSB8fCAnYWN0aXZlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCAnJztcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLy8ganNoaW50IGlnbm9yZTpzdGFydFxuICAgIHJldHVybiA8bGkgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cbiAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuICAgIDwvbGk+O1xuICAgIC8vIGpzaGludCBpZ25vcmU6ZW5kXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcImxvYWRlclwifT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibG9hZGVyLXNwaW5uaW5nLXdoZWVsXCI+PC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTG9hZGVyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2xvYWRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keSBtb2RhbC1sb2FkZXJcIj5cbiAgICAgIDxMb2FkZXIgLz5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBQYW5lbE1lc3NhZ2UgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcGFuZWwtbWVzc2FnZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUGFuZWxNZXNzYWdlIHtcbiAgZ2V0SGVscFRleHQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuaGVscFRleHQpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8cCBjbGFzc05hbWU9XCJoZWxwLWJsb2NrXCI+XG4gICAgICAgIHt0aGlzLnByb3BzLmhlbHBUZXh0fVxuICAgICAgPC9wPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWljb25cIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgIHt0aGlzLnByb3BzLmljb24gfHwgJ2luZm9fb3V0bGluZSd9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWJvZHlcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwibGVhZFwiPlxuICAgICAgICAgIHt0aGlzLnByb3BzLm1lc3NhZ2V9XG4gICAgICAgIDwvcD5cbiAgICAgICAge3RoaXMuZ2V0SGVscFRleHQoKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQYW5lbExvYWRlciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wYW5lbC1sb2FkZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsIHBhbmVsLWRlZmF1bHQgcGFuZWwtZm9ybVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1oZWFkaW5nXCI+XG4gICAgICAgIDxoMyBjbGFzc05hbWU9XCJwYW5lbC10aXRsZVwiPntnZXR0ZXh0KFwiQ2hhbmdlIHVzZXJuYW1lXCIpfTwvaDM+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPFBhbmVsTG9hZGVyIC8+XG5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUGFuZWxNZXNzYWdlIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3BhbmVsLW1lc3NhZ2UnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRIZWxwVGV4dCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5vcHRpb25zLm5leHRfb24pIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShcbiAgICAgICAgICBnZXR0ZXh0KFwiWW91IHdpbGwgYmUgYWJsZSB0byBjaGFuZ2UgeW91ciB1c2VybmFtZSAlKG5leHRfY2hhbmdlKXMuXCIpLFxuICAgICAgICAgIHsnbmV4dF9jaGFuZ2UnOiB0aGlzLnByb3BzLm9wdGlvbnMubmV4dF9vbi5mcm9tTm93KCl9LCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJZb3UgaGF2ZSB1c2VkIHVwIGF2YWlsYWJsZSBuYW1lIGNoYW5nZXMuXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwgcGFuZWwtZGVmYXVsdCBwYW5lbC1mb3JtXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWhlYWRpbmdcIj5cbiAgICAgICAgPGgzIGNsYXNzTmFtZT1cInBhbmVsLXRpdGxlXCI+e2dldHRleHQoXCJDaGFuZ2UgdXNlcm5hbWVcIil9PC9oMz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8UGFuZWxNZXNzYWdlIG1lc3NhZ2U9e2dldHRleHQoXCJZb3UgY2FuJ3QgY2hhbmdlIHlvdXIgdXNlcm5hbWUgYXQgdGhlIG1vbWVudC5cIil9XG4gICAgICAgICAgICAgICAgICAgIGhlbHBUZXh0PXt0aGlzLmdldEhlbHBUZXh0KCl9IC8+XG5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybSc7XG5pbXBvcnQgRm9ybUdyb3VwIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0tZ3JvdXAnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0ICogYXMgdmFsaWRhdG9ycyBmcm9tICdtaXNhZ28vdXRpbHMvdmFsaWRhdG9ycyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgRm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHVzZXJuYW1lOiAnJyxcblxuICAgICAgdmFsaWRhdG9yczoge1xuICAgICAgICB1c2VybmFtZTogW1xuICAgICAgICAgIHZhbGlkYXRvcnMudXNlcm5hbWVDb250ZW50KCksXG4gICAgICAgICAgdmFsaWRhdG9ycy51c2VybmFtZU1pbkxlbmd0aCh7XG4gICAgICAgICAgICB1c2VybmFtZV9sZW5ndGhfbWluOiBwcm9wcy5vcHRpb25zLmxlbmd0aF9taW5cbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWxpZGF0b3JzLnVzZXJuYW1lTWF4TGVuZ3RoKHtcbiAgICAgICAgICAgIHVzZXJuYW1lX2xlbmd0aF9tYXg6IHByb3BzLm9wdGlvbnMubGVuZ3RoX21heFxuICAgICAgICAgIH0pXG4gICAgICAgIF1cbiAgICAgIH0sXG5cbiAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgZ2V0SGVscFRleHQoKSB7XG4gICAgbGV0IHBocmFzZXMgPSBbXTtcblxuICAgIGlmICh0aGlzLnByb3BzLm9wdGlvbnMuY2hhbmdlc19sZWZ0ID4gMCkge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBuZ2V0dGV4dChcbiAgICAgICAgXCJZb3UgY2FuIGNoYW5nZSB5b3VyIHVzZXJuYW1lICUoY2hhbmdlc19sZWZ0KXMgbW9yZSB0aW1lLlwiLFxuICAgICAgICBcIllvdSBjYW4gY2hhbmdlIHlvdXIgdXNlcm5hbWUgJShjaGFuZ2VzX2xlZnQpcyBtb3JlIHRpbWVzLlwiLFxuICAgICAgICB0aGlzLnByb3BzLm9wdGlvbnMuY2hhbmdlc19sZWZ0KTtcblxuICAgICAgcGhyYXNlcy5wdXNoKGludGVycG9sYXRlKG1lc3NhZ2UsIHtcbiAgICAgICAgJ2NoYW5nZXNfbGVmdCc6IHRoaXMucHJvcHMub3B0aW9ucy5jaGFuZ2VzX2xlZnRcbiAgICAgIH0sIHRydWUpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy51c2VyLmFjbC5uYW1lX2NoYW5nZXNfZXhwaXJlID4gMCkge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBuZ2V0dGV4dChcbiAgICAgICAgXCJVc2VkIGNoYW5nZXMgcmVkZWVtIGFmdGVyICUobmFtZV9jaGFuZ2VzX2V4cGlyZSlzIGRheS5cIixcbiAgICAgICAgXCJVc2VkIGNoYW5nZXMgcmVkZWVtIGFmdGVyICUobmFtZV9jaGFuZ2VzX2V4cGlyZSlzIGRheXMuXCIsXG4gICAgICAgIHRoaXMucHJvcHMudXNlci5hY2wubmFtZV9jaGFuZ2VzX2V4cGlyZSk7XG5cbiAgICAgIHBocmFzZXMucHVzaChpbnRlcnBvbGF0ZShtZXNzYWdlLCB7XG4gICAgICAgICduYW1lX2NoYW5nZXNfZXhwaXJlJzogdGhpcy5wcm9wcy51c2VyLmFjbC5uYW1lX2NoYW5nZXNfZXhwaXJlXG4gICAgICB9LCB0cnVlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBocmFzZXMubGVuZ3RoID8gcGhyYXNlcy5qb2luKCcgJykgOiBudWxsO1xuICB9XG5cbiAgY2xlYW4oKSB7XG4gICAgbGV0IGVycm9ycyA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICBpZiAoZXJyb3JzLnVzZXJuYW1lKSB7XG4gICAgICBzbmFja2Jhci5lcnJvcihlcnJvcnMudXNlcm5hbWVbMF0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gaWYgKHRoaXMuc3RhdGUudXNlcm5hbWUudHJpbSgpID09PSB0aGlzLnByb3BzLnVzZXIudXNlcm5hbWUpIHtcbiAgICAgIHNuYWNrYmFyLmluZm8oZ2V0dGV4dChcIllvdXIgbmV3IHVzZXJuYW1lIGlzIHNhbWUgYXMgY3VycmVudCBvbmUuXCIpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgc2VuZCgpIHtcbiAgICByZXR1cm4gYWpheC5wb3N0KHRoaXMucHJvcHMudXNlci5hcGlfdXJsLnVzZXJuYW1lLCB7XG4gICAgICAndXNlcm5hbWUnOiB0aGlzLnN0YXRlLnVzZXJuYW1lXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVTdWNjZXNzKHN1Y2Nlc3MpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICd1c2VybmFtZSc6ICcnXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb3BzLmNvbXBsZXRlKHN1Y2Nlc3MudXNlcm5hbWUsIHN1Y2Nlc3Muc2x1Zywgc3VjY2Vzcy5vcHRpb25zKTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKHJlamVjdGlvbikge1xuICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9IGNsYXNzTmFtZT1cImZvcm0taG9yaXpvbnRhbFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbCBwYW5lbC1kZWZhdWx0IHBhbmVsLWZvcm1cIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1oZWFkaW5nXCI+XG4gICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInBhbmVsLXRpdGxlXCI+e2dldHRleHQoXCJDaGFuZ2UgdXNlcm5hbWVcIil9PC9oMz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtYm9keVwiPlxuXG4gICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIk5ldyB1c2VybmFtZVwiKX0gZm9yPVwiaWRfdXNlcm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcz1cImNvbC1zbS00XCIgY29udHJvbENsYXNzPVwiY29sLXNtLThcIlxuICAgICAgICAgICAgICAgICAgICAgaGVscFRleHQ9e3RoaXMuZ2V0SGVscFRleHQoKX0+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImlkX3VzZXJuYW1lXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCd1c2VybmFtZScpfVxuICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnVzZXJuYW1lfSAvPlxuICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWZvb3RlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1zbS04IGNvbC1zbS1vZmZzZXQtNFwiPlxuXG4gICAgICAgICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwiYnRuLXByaW1hcnlcIiBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzTG9hZGluZ30+XG4gICAgICAgICAgICAgICAge2dldHRleHQoXCJDaGFuZ2UgdXNlcm5hbWVcIil9XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZvcm1Mb2FkaW5nIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL29wdGlvbnMvY2hhbmdlLXVzZXJuYW1lL2Zvcm0tbG9hZGluZyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm1Mb2NrZWQgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvb3B0aW9ucy9jaGFuZ2UtdXNlcm5hbWUvZm9ybS1sb2NrZWQnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb3JtIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL29wdGlvbnMvY2hhbmdlLXVzZXJuYW1lL2Zvcm0nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBVc2VybmFtZUhpc3RvcnkgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcm5hbWUtaGlzdG9yeSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgZGVoeWRyYXRlLCBhZGROYW1lQ2hhbmdlIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJuYW1lLWhpc3RvcnknOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCB7IHVwZGF0ZVVzZXJuYW1lIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJzJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgdGl0bGUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BhZ2UtdGl0bGUnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNMb2FkZWQ6IGZhbHNlLFxuICAgICAgb3B0aW9uczogbnVsbFxuICAgIH07XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aXRsZS5zZXQoe1xuICAgICAgdGl0bGU6IGdldHRleHQoXCJDaGFuZ2UgdXNlcm5hbWVcIiksXG4gICAgICBwYXJlbnQ6IGdldHRleHQoXCJDaGFuZ2UgeW91ciBvcHRpb25zXCIpXG4gICAgfSk7XG5cbiAgICBQcm9taXNlLmFsbChbXG4gICAgICBhamF4LmdldCh0aGlzLnByb3BzLnVzZXIuYXBpX3VybC51c2VybmFtZSksXG4gICAgICBhamF4LmdldChtaXNhZ28uZ2V0KCdVU0VSTkFNRV9DSEFOR0VTX0FQSScpLCB7dXNlcjogdGhpcy5wcm9wcy51c2VyLmlkfSlcbiAgICBdKS50aGVuKChkYXRhKSA9PiB7XG4gICAgICBzdG9yZS5kaXNwYXRjaChkZWh5ZHJhdGUoZGF0YVsxXS5yZXN1bHRzKSk7XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRlZDogdHJ1ZSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGNoYW5nZXNfbGVmdDogZGF0YVswXS5jaGFuZ2VzX2xlZnQsXG4gICAgICAgICAgbGVuZ3RoX21pbjogZGF0YVswXS5sZW5ndGhfbWluLFxuICAgICAgICAgIGxlbmd0aF9tYXg6IGRhdGFbMF0ubGVuZ3RoX21heCxcbiAgICAgICAgICBuZXh0X29uOiBkYXRhWzBdLm5leHRfb24gPyBtb21lbnQoZGF0YVswXS5uZXh0X29uKSA6IG51bGwsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBvbkNvbXBsZXRlID0gKHVzZXJuYW1lLCBzbHVnLCBvcHRpb25zKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBvcHRpb25zXG4gICAgfSk7XG5cbiAgICBzdG9yZS5kaXNwYXRjaChcbiAgICAgIGFkZE5hbWVDaGFuZ2UoeyB1c2VybmFtZSwgc2x1ZyB9LCB0aGlzLnByb3BzLnVzZXIsIHRoaXMucHJvcHMudXNlcikpO1xuICAgIHN0b3JlLmRpc3BhdGNoKFxuICAgICAgdXBkYXRlVXNlcm5hbWUodGhpcy5wcm9wcy51c2VyLCB1c2VybmFtZSwgc2x1ZykpO1xuXG4gICAgc25hY2tiYXIuc3VjY2VzcyhnZXR0ZXh0KFwiWW91ciB1c2VybmFtZSBoYXMgYmVlbiBjaGFuZ2VkIHN1Y2Nlc3NmdWxseS5cIikpO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGdldENoYW5nZUZvcm0oKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaXNMb2FkZWQpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLm9wdGlvbnMuY2hhbmdlc19sZWZ0ID4gMCkge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8Rm9ybSB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9XG4gICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXt0aGlzLnN0YXRlLm9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZT17dGhpcy5vbkNvbXBsZXRlfSAvPjtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcmV0dXJuIDxGb3JtTG9ja2VkIG9wdGlvbnM9e3RoaXMuc3RhdGUub3B0aW9uc30gLz47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8Rm9ybUxvYWRpbmcgLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXY+XG4gICAgICB7dGhpcy5nZXRDaGFuZ2VGb3JtKCl9XG4gICAgICA8VXNlcm5hbWVIaXN0b3J5IGlzTG9hZGVkPXt0aGlzLnN0YXRlLmlzTG9hZGVkfVxuICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzPXt0aGlzLnByb3BzWyd1c2VybmFtZS1oaXN0b3J5J119IC8+XG4gICAgPC9kaXY+XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb3JtIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0nO1xuaW1wb3J0IEZvcm1Hcm91cCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtLWdyb3VwJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgU2VsZWN0IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3NlbGVjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFllc05vU3dpdGNoIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3llcy1uby1zd2l0Y2gnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCB7IHBhdGNoVXNlciB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy9hdXRoJztcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCB0aXRsZSBmcm9tICdtaXNhZ28vc2VydmljZXMvcGFnZS10aXRsZSc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEZvcm0ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAnaXNMb2FkaW5nJzogZmFsc2UsXG5cbiAgICAgICdpc19oaWRpbmdfcHJlc2VuY2UnOiBwcm9wcy51c2VyLmlzX2hpZGluZ19wcmVzZW5jZSxcbiAgICAgICdsaW1pdHNfcHJpdmF0ZV90aHJlYWRfaW52aXRlc190byc6IHByb3BzLnVzZXIubGltaXRzX3ByaXZhdGVfdGhyZWFkX2ludml0ZXNfdG8sXG4gICAgICAnc3Vic2NyaWJlX3RvX3N0YXJ0ZWRfdGhyZWFkcyc6IHByb3BzLnVzZXIuc3Vic2NyaWJlX3RvX3N0YXJ0ZWRfdGhyZWFkcyxcbiAgICAgICdzdWJzY3JpYmVfdG9fcmVwbGllZF90aHJlYWRzJzogcHJvcHMudXNlci5zdWJzY3JpYmVfdG9fcmVwbGllZF90aHJlYWRzLFxuXG4gICAgICAnZXJyb3JzJzoge31cbiAgICB9O1xuXG4gICAgdGhpcy5wcml2YXRlVGhyZWFkSW52aXRlc0Nob2ljZXMgPSBbXG4gICAgICB7XG4gICAgICAgICd2YWx1ZSc6IDAsXG4gICAgICAgICdpY29uJzogJ2hlbHBfb3V0bGluZScsXG4gICAgICAgICdsYWJlbCc6IGdldHRleHQoJ0V2ZXJ5Ym9keScpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndmFsdWUnOiAxLFxuICAgICAgICAnaWNvbic6ICdkb25lX2FsbCcsXG4gICAgICAgICdsYWJlbCc6IGdldHRleHQoJ1VzZXJzIEkgZm9sbG93JylcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd2YWx1ZSc6IDIsXG4gICAgICAgICdpY29uJzogJ2hpZ2hsaWdodF9vZmYnLFxuICAgICAgICAnbGFiZWwnOiBnZXR0ZXh0KCdOb2JvZHknKVxuICAgICAgfVxuICAgIF07XG5cbiAgICB0aGlzLnN1YnNjcmliZVRvQ2hvaWNlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgJ3ZhbHVlJzogMCxcbiAgICAgICAgJ2ljb24nOiAnYm9va21hcmtfYm9yZGVyJyxcbiAgICAgICAgJ2xhYmVsJzogZ2V0dGV4dCgnTm8nKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3ZhbHVlJzogMSxcbiAgICAgICAgJ2ljb24nOiAnYm9va21hcmsnLFxuICAgICAgICAnbGFiZWwnOiBnZXR0ZXh0KCdCb29rbWFyaycpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndmFsdWUnOiAyLFxuICAgICAgICAnaWNvbic6ICdtYWlsJyxcbiAgICAgICAgJ2xhYmVsJzogZ2V0dGV4dCgnQm9va21hcmsgd2l0aCBlLW1haWwgbm90aWZpY2F0aW9uJylcbiAgICAgIH1cbiAgICBdO1xuICB9XG5cbiAgc2VuZCgpIHtcbiAgICByZXR1cm4gYWpheC5wb3N0KHRoaXMucHJvcHMudXNlci5hcGlfdXJsLm9wdGlvbnMsIHtcbiAgICAgIGlzX2hpZGluZ19wcmVzZW5jZTogdGhpcy5zdGF0ZS5pc19oaWRpbmdfcHJlc2VuY2UsXG4gICAgICBsaW1pdHNfcHJpdmF0ZV90aHJlYWRfaW52aXRlc190bzogdGhpcy5zdGF0ZS5saW1pdHNfcHJpdmF0ZV90aHJlYWRfaW52aXRlc190byxcbiAgICAgIHN1YnNjcmliZV90b19zdGFydGVkX3RocmVhZHM6IHRoaXMuc3RhdGUuc3Vic2NyaWJlX3RvX3N0YXJ0ZWRfdGhyZWFkcyxcbiAgICAgIHN1YnNjcmliZV90b19yZXBsaWVkX3RocmVhZHM6IHRoaXMuc3RhdGUuc3Vic2NyaWJlX3RvX3JlcGxpZWRfdGhyZWFkc1xuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU3VjY2VzcygpIHtcbiAgICBzdG9yZS5kaXNwYXRjaChwYXRjaFVzZXIoe1xuICAgICAgaXNfaGlkaW5nX3ByZXNlbmNlOiB0aGlzLnN0YXRlLmlzX2hpZGluZ19wcmVzZW5jZSxcbiAgICAgIGxpbWl0c19wcml2YXRlX3RocmVhZF9pbnZpdGVzX3RvOiB0aGlzLnN0YXRlLmxpbWl0c19wcml2YXRlX3RocmVhZF9pbnZpdGVzX3RvLFxuICAgICAgc3Vic2NyaWJlX3RvX3N0YXJ0ZWRfdGhyZWFkczogdGhpcy5zdGF0ZS5zdWJzY3JpYmVfdG9fc3RhcnRlZF90aHJlYWRzLFxuICAgICAgc3Vic2NyaWJlX3RvX3JlcGxpZWRfdGhyZWFkczogdGhpcy5zdGF0ZS5zdWJzY3JpYmVfdG9fcmVwbGllZF90aHJlYWRzXG4gICAgfSkpO1xuICAgIHNuYWNrYmFyLnN1Y2Nlc3MoZ2V0dGV4dChcIllvdXIgZm9ydW0gb3B0aW9ucyBoYXZlIGJlZW4gY2hhbmdlZC5cIikpO1xuICB9XG5cbiAgaGFuZGxlRXJyb3IocmVqZWN0aW9uKSB7XG4gICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgc25hY2tiYXIuZXJyb3IoZ2V0dGV4dChcIlBsZWFzZSByZWxvYWQgcGFnZSBhbmQgdHJ5IGFnYWluLlwiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGl0bGUuc2V0KHtcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KFwiRm9ydW0gb3B0aW9uc1wiKSxcbiAgICAgIHBhcmVudDogZ2V0dGV4dChcIkNoYW5nZSB5b3VyIG9wdGlvbnNcIilcbiAgICB9KTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxmb3JtIG9uU3VibWl0PXt0aGlzLmhhbmRsZVN1Ym1pdH0gY2xhc3NOYW1lPVwiZm9ybS1ob3Jpem9udGFsXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsIHBhbmVsLWRlZmF1bHQgcGFuZWwtZm9ybVwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWhlYWRpbmdcIj5cbiAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwicGFuZWwtdGl0bGVcIj57Z2V0dGV4dChcIkNoYW5nZSBmb3J1bSBvcHRpb25zXCIpfTwvaDM+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWJvZHlcIj5cblxuICAgICAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgICAgIDxsZWdlbmQ+e2dldHRleHQoXCJQcml2YWN5IHNldHRpbmdzXCIpfTwvbGVnZW5kPlxuXG4gICAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiSGlkZSBteSBwcmVzZW5jZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgaGVscFRleHQ9e2dldHRleHQoXCJJZiB5b3UgaGlkZSB5b3VyIHByZXNlbmNlLCBvbmx5IG1lbWJlcnMgd2l0aCBwZXJtaXNzaW9uIHRvIHNlZSBoaWRkZW4gdXNlcnMgd2lsbCBzZWUgd2hlbiB5b3UgYXJlIG9ubGluZS5cIil9XG4gICAgICAgICAgICAgICAgICAgICAgIGZvcj1cImlkX2lzX2hpZGluZ19wcmVzZW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJjb2wtc20tNFwiIGNvbnRyb2xDbGFzcz1cImNvbC1zbS04XCI+XG4gICAgICAgICAgICAgIDxZZXNOb1N3aXRjaCBpZD1cImlkX2lzX2hpZGluZ19wcmVzZW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uT249XCJ2aXNpYmlsaXR5X29mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uT2ZmPVwidmlzaWJpbGl0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbE9uPXtnZXR0ZXh0KFwiSGlkZSBteSBwcmVzZW5jZSBmcm9tIG90aGVyIHVzZXJzXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxPZmY9e2dldHRleHQoXCJTaG93IG15IHByZXNlbmNlIHRvIG90aGVyIHVzZXJzXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdpc19oaWRpbmdfcHJlc2VuY2UnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLmlzX2hpZGluZ19wcmVzZW5jZX0gLz5cbiAgICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiUHJpdmF0ZSB0aHJlYWQgaW52aXRhdGlvbnNcIil9XG4gICAgICAgICAgICAgICAgICAgICAgIGZvcj1cImlkX2xpbWl0c19wcml2YXRlX3RocmVhZF9pbnZpdGVzX3RvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcz1cImNvbC1zbS00XCIgY29udHJvbENsYXNzPVwiY29sLXNtLThcIj5cbiAgICAgICAgICAgICAgPFNlbGVjdCBpZD1cImlkX2xpbWl0c19wcml2YXRlX3RocmVhZF9pbnZpdGVzX3RvXCJcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdsaW1pdHNfcHJpdmF0ZV90aHJlYWRfaW52aXRlc190bycpfVxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLmxpbWl0c19wcml2YXRlX3RocmVhZF9pbnZpdGVzX3RvfVxuICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9e3RoaXMucHJpdmF0ZVRocmVhZEludml0ZXNDaG9pY2VzfSAvPlxuICAgICAgICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgICAgICAgPC9maWVsZHNldD5cblxuICAgICAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgICAgIDxsZWdlbmQ+e2dldHRleHQoXCJBdXRvbWF0aWMgc3Vic2NyaXB0aW9uc1wiKX08L2xlZ2VuZD5cblxuICAgICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIlRocmVhZHMgSSBzdGFydFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgZm9yPVwiaWRfc3Vic2NyaWJlX3RvX3N0YXJ0ZWRfdGhyZWFkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJjb2wtc20tNFwiIGNvbnRyb2xDbGFzcz1cImNvbC1zbS04XCI+XG4gICAgICAgICAgICAgIDxTZWxlY3QgaWQ9XCJpZF9zdWJzY3JpYmVfdG9fc3RhcnRlZF90aHJlYWRzXCJcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdzdWJzY3JpYmVfdG9fc3RhcnRlZF90aHJlYWRzJyl9XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuc3Vic2NyaWJlX3RvX3N0YXJ0ZWRfdGhyZWFkc31cbiAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPXt0aGlzLnN1YnNjcmliZVRvQ2hvaWNlc30gLz5cbiAgICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiVGhyZWFkcyBJIHJlcGx5IHRvXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICBmb3I9XCJpZF9zdWJzY3JpYmVfdG9fcmVwbGllZF90aHJlYWRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcz1cImNvbC1zbS00XCIgY29udHJvbENsYXNzPVwiY29sLXNtLThcIj5cbiAgICAgICAgICAgICAgPFNlbGVjdCBpZD1cImlkX3N1YnNjcmliZV90b19yZXBsaWVkX3RocmVhZHNcIlxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3N1YnNjcmliZV90b19yZXBsaWVkX3RocmVhZHMnKX1cbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5zdWJzY3JpYmVfdG9fcmVwbGllZF90aHJlYWRzfVxuICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9e3RoaXMuc3Vic2NyaWJlVG9DaG9pY2VzfSAvPlxuICAgICAgICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgICAgICAgPC9maWVsZHNldD5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1mb290ZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc20tOCBjb2wtc20tb2Zmc2V0LTRcIj5cblxuICAgICAgICAgICAgICA8QnV0dG9uIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5XCIgbG9hZGluZz17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9PlxuICAgICAgICAgICAgICAgIHtnZXR0ZXh0KFwiU2F2ZSBjaGFuZ2VzXCIpfVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPlxuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IExpIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2xpJzsgLy9qc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JzsgLy9qc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGNsYXNzIFNpZGVOYXYgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLy8ganNoaW50IGlnbm9yZTpzdGFydFxuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImxpc3QtZ3JvdXAgbmF2LXNpZGVcIj5cbiAgICAgIHt0aGlzLnByb3BzLm9wdGlvbnMubWFwKChvcHRpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIDxMaW5rIHRvPXt0aGlzLnByb3BzLmJhc2VVcmwgKyBvcHRpb24uY29tcG9uZW50ICsgJy8nfVxuICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibGlzdC1ncm91cC1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUNsYXNzTmFtZT1cImFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICBrZXk9e29wdGlvbi5jb21wb25lbnR9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgIHtvcHRpb24uaWNvbn1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge29wdGlvbi5uYW1lfVxuICAgICAgICA8L0xpbms+O1xuICAgICAgfSl9XG4gICAgPC9kaXY+O1xuICAgIC8vIGpzaGludCBpZ25vcmU6ZW5kXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBhY3ROYXYgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLy8ganNoaW50IGlnbm9yZTpzdGFydFxuICAgIHJldHVybiA8dWwgY2xhc3NOYW1lPVwiZHJvcGRvd24tbWVudVwiIHJvbGU9XCJtZW51XCI+XG4gICAgICB7dGhpcy5wcm9wcy5vcHRpb25zLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgICAgIHJldHVybiA8TGkgcGF0aD17dGhpcy5wcm9wcy5iYXNlVXJsICsgb3B0aW9uLmNvbXBvbmVudCArICcvJ31cbiAgICAgICAgICAgICAgICAgICBrZXk9e29wdGlvbi5jb21wb25lbnR9PlxuICAgICAgICAgIDxMaW5rIHRvPXt0aGlzLnByb3BzLmJhc2VVcmwgKyBvcHRpb24uY29tcG9uZW50ICsgJy8nfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuaGlkZU5hdn0+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICAgIHtvcHRpb24uaWNvbn1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIHtvcHRpb24ubmFtZX1cbiAgICAgICAgICA8L0xpbms+XG4gICAgICAgIDwvTGk+O1xuICAgICAgfSl9XG4gICAgPC91bD47XG4gICAgLy8ganNoaW50IGlnbm9yZTplbmRcbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgU2lkZU5hdiwgQ29tcGFjdE5hdiB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL29wdGlvbnMvbmF2cyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IENoYW5nZUZvcnVtT3B0aW9ucyBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9vcHRpb25zL2ZvcnVtLW9wdGlvbnMnO1xuaW1wb3J0IENoYW5nZVVzZXJuYW1lIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL29wdGlvbnMvY2hhbmdlLXVzZXJuYW1lL3Jvb3QnO1xuaW1wb3J0IENoYW5nZVNpZ25JbkNyZWRlbnRpYWxzIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL29wdGlvbnMvc2lnbi1pbi1jcmVkZW50aWFscy9yb290JztcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBkcm9wZG93bjogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICB0b2dnbGVOYXYgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24pIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcm9wZG93bjogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJvcGRvd246IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBoaWRlTmF2ID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZHJvcGRvd246IGZhbHNlXG4gICAgfSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgZ2V0VG9nZ2xlTmF2Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmRyb3Bkb3duKSB7XG4gICAgICByZXR1cm4gJ2J0biBidG4tZGVmYXVsdCBidG4taWNvbiBvcGVuJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdidG4gYnRuLWRlZmF1bHQgYnRuLWljb24nO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbXBhY3ROYXZDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24pIHtcbiAgICAgIHJldHVybiAnY29tcGFjdC1uYXYgb3Blbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnY29tcGFjdC1uYXYnO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicGFnZSBwYWdlLW9wdGlvbnNcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFnZS1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXJcIj5cblxuICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJwdWxsLWxlZnRcIj57Z2V0dGV4dChcIkNoYW5nZSB5b3VyIG9wdGlvbnNcIil9PC9oMT5cblxuICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1hbGlnbmVkIGJ0bi1pY29uIGJ0bi1kcm9wZG93bi10b2dnbGUgaGlkZGVuLW1kIGhpZGRlbi1sZ1wiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMudG9nZ2xlTmF2fVxuICAgICAgICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD17dGhpcy5zdGF0ZS5kcm9wZG93biA/ICd0cnVlJyA6ICdmYWxzZSd9PlxuICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgICBtZW51XG4gICAgICAgICAgICA8L2k+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENvbXBhY3ROYXZDbGFzc05hbWUoKX0+XG5cbiAgICAgICAgPENvbXBhY3ROYXYgb3B0aW9ucz17bWlzYWdvLmdldCgnVVNFUl9PUFRJT05TJyl9XG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmw9e21pc2Fnby5nZXQoJ1VTRVJDUF9VUkwnKX1cbiAgICAgICAgICAgICAgICAgICAgaGlkZU5hdj17dGhpcy5oaWRlTmF2fSAvPlxuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC0zIGhpZGRlbi14cyBoaWRkZW4tc21cIj5cblxuICAgICAgICAgICAgPFNpZGVOYXYgb3B0aW9ucz17bWlzYWdvLmdldCgnVVNFUl9PUFRJT05TJyl9XG4gICAgICAgICAgICAgICAgICAgICBiYXNlVXJsPXttaXNhZ28uZ2V0KCdVU0VSQ1BfVVJMJyl9IC8+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC05XCI+XG5cbiAgICAgICAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0KHN0b3JlKSB7XG4gIHJldHVybiB7XG4gICAgJ3RpY2snOiBzdG9yZS50aWNrLnRpY2ssXG4gICAgJ3VzZXInOiBzdG9yZS5hdXRoLnVzZXIsXG4gICAgJ3VzZXJuYW1lLWhpc3RvcnknOiBzdG9yZVsndXNlcm5hbWUtaGlzdG9yeSddXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocygpIHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBwYXRoOiBtaXNhZ28uZ2V0KCdVU0VSQ1BfVVJMJykgKyAnZm9ydW0tb3B0aW9ucy8nLFxuICAgICAgY29tcG9uZW50OiBjb25uZWN0KHNlbGVjdCkoQ2hhbmdlRm9ydW1PcHRpb25zKVxuICAgIH0sXG4gICAge1xuICAgICAgcGF0aDogbWlzYWdvLmdldCgnVVNFUkNQX1VSTCcpICsgJ2NoYW5nZS11c2VybmFtZS8nLFxuICAgICAgY29tcG9uZW50OiBjb25uZWN0KHNlbGVjdCkoQ2hhbmdlVXNlcm5hbWUpXG4gICAgfSxcbiAgICB7XG4gICAgICBwYXRoOiBtaXNhZ28uZ2V0KCdVU0VSQ1BfVVJMJykgKyAnc2lnbi1pbi1jcmVkZW50aWFscy8nLFxuICAgICAgY29tcG9uZW50OiBjb25uZWN0KHNlbGVjdCkoQ2hhbmdlU2lnbkluQ3JlZGVudGlhbHMpXG4gICAgfVxuICBdO1xufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybSc7XG5pbXBvcnQgRm9ybUdyb3VwIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0tZ3JvdXAnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0ICogYXMgdmFsaWRhdG9ycyBmcm9tICdtaXNhZ28vdXRpbHMvdmFsaWRhdG9ycyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgRm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIG5ld19lbWFpbDogJycsXG4gICAgICBwYXNzd29yZDogJycsXG5cbiAgICAgIHZhbGlkYXRvcnM6IHtcbiAgICAgICAgbmV3X2VtYWlsOiBbXG4gICAgICAgICAgdmFsaWRhdG9ycy5lbWFpbCgpXG4gICAgICAgIF0sXG4gICAgICAgIHBhc3N3b3JkOiBbXVxuICAgICAgfSxcblxuICAgICAgaXNMb2FkaW5nOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICBjbGVhbigpIHtcbiAgICBsZXQgZXJyb3JzID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIGxldCBsZW5ndGhzID0gW1xuICAgICAgdGhpcy5zdGF0ZS5uZXdfZW1haWwudHJpbSgpLmxlbmd0aCxcbiAgICAgIHRoaXMuc3RhdGUucGFzc3dvcmQudHJpbSgpLmxlbmd0aFxuICAgIF07XG5cbiAgICBpZiAobGVuZ3Rocy5pbmRleE9mKDApICE9PSAtMSkge1xuICAgICAgc25hY2tiYXIuZXJyb3IoZ2V0dGV4dChcIkZpbGwgb3V0IGFsbCBmaWVsZHMuXCIpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLm5ld19lbWFpbCkge1xuICAgICAgc25hY2tiYXIuZXJyb3IoZXJyb3JzLm5ld19lbWFpbFswXSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBhamF4LnBvc3QodGhpcy5wcm9wcy51c2VyLmFwaV91cmwuY2hhbmdlX2VtYWlsLCB7XG4gICAgICBuZXdfZW1haWw6IHRoaXMuc3RhdGUubmV3X2VtYWlsLFxuICAgICAgcGFzc3dvcmQ6IHRoaXMuc3RhdGUucGFzc3dvcmQsXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVTdWNjZXNzKHJlc3BvbnNlKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBuZXdfZW1haWw6ICcnLFxuICAgICAgcGFzc3dvcmQ6ICcnXG4gICAgfSk7XG5cbiAgICBzbmFja2Jhci5zdWNjZXNzKHJlc3BvbnNlLmRldGFpbCk7XG4gIH1cblxuICBoYW5kbGVFcnJvcihyZWplY3Rpb24pIHtcbiAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICBpZiAocmVqZWN0aW9uLm5ld19lbWFpbCkge1xuICAgICAgICBzbmFja2Jhci5lcnJvcihyZWplY3Rpb24ubmV3X2VtYWlsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNuYWNrYmFyLmVycm9yKHJlamVjdGlvbi5wYXNzd29yZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fSBjbGFzc05hbWU9XCJmb3JtLWhvcml6b250YWxcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwidHlwZVwiIHN0eWxlPXt7ZGlzcGxheTogJ25vbmUnfX0gLz5cbiAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBzdHlsZT17e2Rpc3BsYXk6ICdub25lJ319IC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsIHBhbmVsLWRlZmF1bHQgcGFuZWwtZm9ybVwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWhlYWRpbmdcIj5cbiAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwicGFuZWwtdGl0bGVcIj57Z2V0dGV4dChcIkNoYW5nZSBlLW1haWwgYWRkcmVzc1wiKX08L2gzPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1ib2R5XCI+XG5cbiAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiTmV3IGUtbWFpbFwiKX0gZm9yPVwiaWRfbmV3X2VtYWlsXCJcbiAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJjb2wtc20tNFwiIGNvbnRyb2xDbGFzcz1cImNvbC1zbS04XCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImlkX25ld19lbWFpbFwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgnbmV3X2VtYWlsJyl9XG4gICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUubmV3X2VtYWlsfSAvPlxuICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgICAgPGhyIC8+XG5cbiAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiWW91ciBjdXJyZW50IHBhc3N3b3JkXCIpfSBmb3I9XCJpZF9wYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPVwiY29sLXNtLTRcIiBjb250cm9sQ2xhc3M9XCJjb2wtc20tOFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwiaWRfcGFzc3dvcmRcIiBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3Bhc3N3b3JkJyl9XG4gICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUucGFzc3dvcmR9IC8+XG4gICAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNtLTggY29sLXNtLW9mZnNldC00XCI+XG5cbiAgICAgICAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcHJpbWFyeVwiIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfT5cbiAgICAgICAgICAgICAgICB7Z2V0dGV4dChcIkNoYW5nZSBlLW1haWxcIil9XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtJztcbmltcG9ydCBGb3JtR3JvdXAgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybS1ncm91cCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgKiBhcyB2YWxpZGF0b3JzIGZyb20gJ21pc2Fnby91dGlscy92YWxpZGF0b3JzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBGb3JtIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgbmV3X3Bhc3N3b3JkOiAnJyxcbiAgICAgIHJlcGVhdF9wYXNzd29yZDogJycsXG4gICAgICBwYXNzd29yZDogJycsXG5cbiAgICAgIHZhbGlkYXRvcnM6IHtcbiAgICAgICAgbmV3X3Bhc3N3b3JkOiBbXG4gICAgICAgICAgdmFsaWRhdG9ycy5wYXNzd29yZE1pbkxlbmd0aChtaXNhZ28uZ2V0KCdTRVRUSU5HUycpKVxuICAgICAgICBdLFxuICAgICAgICByZXBlYXRfcGFzc3dvcmQ6IFtdLFxuICAgICAgICBwYXNzd29yZDogW11cbiAgICAgIH0sXG5cbiAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgY2xlYW4oKSB7XG4gICAgbGV0IGVycm9ycyA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICBsZXQgbGVuZ3RocyA9IFtcbiAgICAgIHRoaXMuc3RhdGUubmV3X3Bhc3N3b3JkLnRyaW0oKS5sZW5ndGgsXG4gICAgICB0aGlzLnN0YXRlLnJlcGVhdF9wYXNzd29yZC50cmltKCkubGVuZ3RoLFxuICAgICAgdGhpcy5zdGF0ZS5wYXNzd29yZC50cmltKCkubGVuZ3RoXG4gICAgXTtcblxuICAgIGlmIChsZW5ndGhzLmluZGV4T2YoMCkgIT09IC0xKSB7XG4gICAgICBzbmFja2Jhci5lcnJvcihnZXR0ZXh0KFwiRmlsbCBvdXQgYWxsIGZpZWxkcy5cIikpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChlcnJvcnMubmV3X3Bhc3N3b3JkKSB7XG4gICAgICBzbmFja2Jhci5lcnJvcihlcnJvcnMubmV3X3Bhc3N3b3JkWzBdKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5uZXdfcGFzc3dvcmQudHJpbSgpICE9PSB0aGlzLnN0YXRlLnJlcGVhdF9wYXNzd29yZC50cmltKCkpIHtcbiAgICAgIHNuYWNrYmFyLmVycm9yKGdldHRleHQoXCJOZXcgcGFzc3dvcmRzIGFyZSBkaWZmZXJlbnQuXCIpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHNlbmQoKSB7XG4gICAgcmV0dXJuIGFqYXgucG9zdCh0aGlzLnByb3BzLnVzZXIuYXBpX3VybC5jaGFuZ2VfcGFzc3dvcmQsIHtcbiAgICAgIG5ld19wYXNzd29yZDogdGhpcy5zdGF0ZS5uZXdfcGFzc3dvcmQsXG4gICAgICBwYXNzd29yZDogdGhpcy5zdGF0ZS5wYXNzd29yZFxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU3VjY2VzcyhyZXNwb25zZSkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbmV3X3Bhc3N3b3JkOiAnJyxcbiAgICAgIHJlcGVhdF9wYXNzd29yZDogJycsXG4gICAgICBwYXNzd29yZDogJydcbiAgICB9KTtcblxuICAgIHNuYWNrYmFyLnN1Y2Nlc3MocmVzcG9uc2UuZGV0YWlsKTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKHJlamVjdGlvbikge1xuICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDApIHtcbiAgICAgIGlmIChyZWplY3Rpb24ubmV3X3Bhc3N3b3JkKSB7XG4gICAgICAgIHNuYWNrYmFyLmVycm9yKHJlamVjdGlvbi5uZXdfcGFzc3dvcmQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc25hY2tiYXIuZXJyb3IocmVqZWN0aW9uLnBhc3N3b3JkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXIuYXBpRXJyb3IocmVqZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9IGNsYXNzTmFtZT1cImZvcm0taG9yaXpvbnRhbFwiPlxuICAgICAgPGlucHV0IHR5cGU9XCJ0eXBlXCIgc3R5bGU9e3tkaXNwbGF5OiAnbm9uZSd9fSAvPlxuICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIHN0eWxlPXt7ZGlzcGxheTogJ25vbmUnfX0gLz5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwgcGFuZWwtZGVmYXVsdCBwYW5lbC1mb3JtXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtaGVhZGluZ1wiPlxuICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJwYW5lbC10aXRsZVwiPntnZXR0ZXh0KFwiQ2hhbmdlIHBhc3N3b3JkXCIpfTwvaDM+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWJvZHlcIj5cblxuICAgICAgICAgIDxGb3JtR3JvdXAgbGFiZWw9e2dldHRleHQoXCJOZXcgcGFzc3dvcmRcIil9IGZvcj1cImlkX25ld19wYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPVwiY29sLXNtLTRcIiBjb250cm9sQ2xhc3M9XCJjb2wtc20tOFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwiaWRfbmV3X3Bhc3N3b3JkXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCduZXdfcGFzc3dvcmQnKX1cbiAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5uZXdfcGFzc3dvcmR9IC8+XG4gICAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiUmVwZWF0IHBhc3N3b3JkXCIpfSBmb3I9XCJpZF9yZXBlYXRfcGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcz1cImNvbC1zbS00XCIgY29udHJvbENsYXNzPVwiY29sLXNtLThcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cImlkX3JlcGVhdF9wYXNzd29yZFwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgncmVwZWF0X3Bhc3N3b3JkJyl9XG4gICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUucmVwZWF0X3Bhc3N3b3JkfSAvPlxuICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgICAgPGhyIC8+XG5cbiAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiWW91ciBjdXJyZW50IHBhc3N3b3JkXCIpfSBmb3I9XCJpZF9wYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPVwiY29sLXNtLTRcIiBjb250cm9sQ2xhc3M9XCJjb2wtc20tOFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwiaWRfcGFzc3dvcmRcIiBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3Bhc3N3b3JkJyl9XG4gICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUucGFzc3dvcmR9IC8+XG4gICAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtZm9vdGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNtLTggY29sLXNtLW9mZnNldC00XCI+XG5cbiAgICAgICAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcHJpbWFyeVwiIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfT5cbiAgICAgICAgICAgICAgICB7Z2V0dGV4dChcIkNoYW5nZSBwYXNzd29yZFwiKX1cbiAgICAgICAgICAgICAgPC9CdXR0b24+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDaGFuZ2VFbWFpbCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9vcHRpb25zL3NpZ24taW4tY3JlZGVudGlhbHMvY2hhbmdlLWVtYWlsJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQ2hhbmdlUGFzc3dvcmQgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvb3B0aW9ucy9zaWduLWluLWNyZWRlbnRpYWxzL2NoYW5nZS1wYXNzd29yZCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCB0aXRsZSBmcm9tICdtaXNhZ28vc2VydmljZXMvcGFnZS10aXRsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGl0bGUuc2V0KHtcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KFwiQ2hhbmdlIGVtYWlsIG9yIHBhc3N3b3JkXCIpLFxuICAgICAgcGFyZW50OiBnZXR0ZXh0KFwiQ2hhbmdlIHlvdXIgb3B0aW9uc1wiKVxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdj5cbiAgICAgIDxDaGFuZ2VFbWFpbCB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IC8+XG4gICAgICA8Q2hhbmdlUGFzc3dvcmQgdXNlcj17dGhpcy5wcm9wcy51c2VyfSAvPlxuXG4gICAgICA8cCBjbGFzc05hbWU9XCJtZXNzYWdlLWxpbmVcIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgIHdhcm5pbmdcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8YSBocmVmPXttaXNhZ28uZ2V0KCdGT1JHT1RURU5fUEFTU1dPUkRfVVJMJyl9PlxuICAgICAgICAgIHtnZXR0ZXh0KFwiQ2hhbmdlIGZvcmdvdHRlbiBwYXNzd29yZFwiKX1cbiAgICAgICAgPC9hPlxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IExvYWRlciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9sb2FkZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWJvZHkgcGFuZWwtYm9keS1sb2FkaW5nXCI+XG4gICAgICA8TG9hZGVyIGNsYXNzTmFtZT1cImxvYWRlciBsb2FkZXItc3BhY2VkXCIgLz5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldEhlbHBUZXh0KCkge1xuICAgIGlmICh0aGlzLnByb3BzLmhlbHBUZXh0KSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPHAgY2xhc3NOYW1lPVwiaGVscC1ibG9ja1wiPlxuICAgICAgICB7dGhpcy5wcm9wcy5oZWxwVGV4dH1cbiAgICAgIDwvcD47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWJvZHkgcGFuZWwtbWVzc2FnZS1ib2R5XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtaWNvblwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAge3RoaXMucHJvcHMuaWNvbiB8fCAnaW5mb19vdXRsaW5lJ31cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtYm9keVwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgICAge3RoaXMucHJvcHMubWVzc2FnZX1cbiAgICAgICAgPC9wPlxuICAgICAgICB7dGhpcy5nZXRIZWxwVGV4dCgpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgenhjdmJuIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy96eGN2Ym4nO1xuXG5leHBvcnQgY29uc3QgU1RZTEVTID0gW1xuICAncHJvZ3Jlc3MtYmFyLWRhbmdlcicsXG4gICdwcm9ncmVzcy1iYXItd2FybmluZycsXG4gICdwcm9ncmVzcy1iYXItd2FybmluZycsXG4gICdwcm9ncmVzcy1iYXItcHJpbWFyeScsXG4gICdwcm9ncmVzcy1iYXItc3VjY2Vzcydcbl07XG5cbmV4cG9ydCBjb25zdCBMQUJFTFMgPSBbXG4gIGdldHRleHQoXCJFbnRlcmVkIHBhc3N3b3JkIGlzIHZlcnkgd2Vhay5cIiksXG4gIGdldHRleHQoXCJFbnRlcmVkIHBhc3N3b3JkIGlzIHdlYWsuXCIpLFxuICBnZXR0ZXh0KFwiRW50ZXJlZCBwYXNzd29yZCBpcyBhdmVyYWdlLlwiKSxcbiAgZ2V0dGV4dChcIkVudGVyZWQgcGFzc3dvcmQgaXMgc3Ryb25nLlwiKSxcbiAgZ2V0dGV4dChcIkVudGVyZWQgcGFzc3dvcmQgaXMgdmVyeSBzdHJvbmcuXCIpXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5fc2NvcmUgPSAwO1xuICAgIHRoaXMuX3Bhc3N3b3JkID0gbnVsbDtcbiAgICB0aGlzLl9pbnB1dHMgPSBbXTtcbiAgfVxuXG4gIGdldFNjb3JlKHBhc3N3b3JkLCBpbnB1dHMpIHtcbiAgICBsZXQgY2FjaGVTdGFsZSA9IGZhbHNlO1xuXG4gICAgaWYgKHBhc3N3b3JkLnRyaW0oKSAhPT0gdGhpcy5fcGFzc3dvcmQpIHtcbiAgICAgIGNhY2hlU3RhbGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpbnB1dHMubGVuZ3RoICE9PSB0aGlzLl9pbnB1dHMubGVuZ3RoKSB7XG4gICAgICBjYWNoZVN0YWxlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXRzLm1hcCgodmFsdWUsIGkpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLnRyaW0oKSAhPT0gdGhpcy5faW5wdXRzW2ldKSB7XG4gICAgICAgICAgY2FjaGVTdGFsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjYWNoZVN0YWxlKSB7XG4gICAgICB0aGlzLl9zY29yZSA9IHp4Y3Zibi5zY29yZVBhc3N3b3JkKHBhc3N3b3JkLCBpbnB1dHMpO1xuICAgICAgdGhpcy5fcGFzc3dvcmQgPSBwYXNzd29yZC50cmltKCk7XG4gICAgICB0aGlzLl9pbnB1dHMgPSBpbnB1dHMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50cmltKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2NvcmU7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGxldCBzY29yZSA9IHRoaXMuZ2V0U2NvcmUodGhpcy5wcm9wcy5wYXNzd29yZCwgdGhpcy5wcm9wcy5pbnB1dHMpO1xuXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiaGVscC1ibG9jayBwYXNzd29yZC1zdHJlbmd0aFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJwcm9ncmVzc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17XCJwcm9ncmVzcy1iYXIgXCIgKyBTVFlMRVNbc2NvcmVdfVxuICAgICAgICAgICAgIHN0eWxlPXt7d2lkdGg6ICgyMCArICgyMCAqIHNjb3JlKSkgKyAnJSd9fVxuICAgICAgICAgICAgIHJvbGU9XCJwcm9ncmVzcy1iYXJcIlxuICAgICAgICAgICAgIGFyaWEtdmFsdWVub3c9e3Njb3JlfVxuICAgICAgICAgICAgIGFyaWEtdmFsdWVtaW49XCIwXCJcbiAgICAgICAgICAgICBhcmlhLXZhbHVlbWF4PVwiNFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInNyLW9ubHlcIj5cbiAgICAgICAgICAgIHtMQUJFTFNbc2NvcmVdfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc21hbGxcIj5cbiAgICAgICAge0xBQkVMU1tzY29yZV19XG4gICAgICA8L3A+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEF2YXRhciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9hdmF0YXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb2xsb3dCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9mb2xsb3ctYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTW9kZXJhdGlvbk5hdiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL21vZGVyYXRpb24vbmF2JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgU3RhdHVzLCB7IFN0YXR1c0ljb24sIFN0YXR1c0xhYmVsIH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlci1zdGF0dXMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRVc2VyU3RhdHVzKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT1cInVzZXItc3RhdHVzLWRpc3BsYXlcIj5cbiAgICAgIDxTdGF0dXMgdXNlcj17dGhpcy5wcm9wcy5wcm9maWxlfSBzdGF0dXM9e3RoaXMucHJvcHMucHJvZmlsZS5zdGF0dXN9PlxuICAgICAgICA8U3RhdHVzSWNvbiB1c2VyPXt0aGlzLnByb3BzLnByb2ZpbGV9XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cz17dGhpcy5wcm9wcy5wcm9maWxlLnN0YXR1c30gLz5cbiAgICAgICAgPFN0YXR1c0xhYmVsIHVzZXI9e3RoaXMucHJvcHMucHJvZmlsZX1cbiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cz17dGhpcy5wcm9wcy5wcm9maWxlLnN0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInN0YXR1cy1sYWJlbFwiIC8+XG4gICAgICA8L1N0YXR1cz5cbiAgICA8L2xpPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgZ2V0VXNlclJhbmsoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5yYW5rLmlzX3RhYikge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJ1c2VyLXJhbmtcIj5cbiAgICAgICAgPGEgaHJlZj17dGhpcy5wcm9wcy5wcm9maWxlLnJhbmsuYWJzb2x1dGVfdXJsfSBjbGFzc05hbWU9XCJpdGVtLXRpdGxlXCI+XG4gICAgICAgICAge3RoaXMucHJvcHMucHJvZmlsZS5yYW5rLm5hbWV9XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbGk+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJ1c2VyLXJhbmtcIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaXRlbS10aXRsZVwiPnt0aGlzLnByb3BzLnByb2ZpbGUucmFuay5uYW1lfTwvc3Bhbj5cbiAgICAgIDwvbGk+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9XG4gIH1cblxuICBnZXRVc2VyVGl0bGUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS50aXRsZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJ1c2VyLXRpdGxlXCI+XG4gICAgICAgIHt0aGlzLnByb3BzLnByb2ZpbGUudGl0bGV9XG4gICAgICA8L2xpPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnByb2ZpbGUucmFuay50aXRsZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJ1c2VyLXRpdGxlXCI+XG4gICAgICAgIHt0aGlzLnByb3BzLnByb2ZpbGUucmFuay50aXRsZX1cbiAgICAgIDwvbGk+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0Sm9pbmVkT24oKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGxldCB0aXRsZSA9IGludGVycG9sYXRlKGdldHRleHQoXCJKb2luZWQgb24gJShqb2luZWRfb24pc1wiKSwge1xuICAgICAgJ2pvaW5lZF9vbic6IHRoaXMucHJvcHMucHJvZmlsZS5qb2luZWRfb24uZm9ybWF0KCdMTCwgTFQnKVxuICAgIH0sIHRydWUpO1xuXG4gICAgbGV0IGFnZSA9IGludGVycG9sYXRlKGdldHRleHQoXCJKb2luZWQgJShqb2luZWRfb24pc1wiKSwge1xuICAgICAgJ2pvaW5lZF9vbic6IHRoaXMucHJvcHMucHJvZmlsZS5qb2luZWRfb24uZnJvbU5vdygpXG4gICAgfSwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT1cInVzZXItam9pbmVkLW9uXCI+XG4gICAgICA8YWJiciB0aXRsZT17dGl0bGV9PlxuICAgICAgICB7YWdlfVxuICAgICAgPC9hYmJyPlxuICAgIDwvbGk+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cblxuICBnZXRFbWFpbCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5wcm9maWxlLmVtYWlsKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT1cInVzZXItZW1haWxcIj5cbiAgICAgICAgPGEgaHJlZj17J21haWx0bzonICsgdGhpcy5wcm9wcy5wcm9maWxlLmVtYWlsfSBjbGFzc05hbWU9XCJpdGVtLXRpdGxlXCI+XG4gICAgICAgICAge3RoaXMucHJvcHMucHJvZmlsZS5lbWFpbH1cbiAgICAgICAgPC9hPlxuICAgICAgPC9saT47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRGb2xsb3dCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5hY2wuY2FuX2ZvbGxvdykge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxGb2xsb3dCdXR0b24gY2xhc3NOYW1lPVwiYnRuIGJ0bi1hbGlnbmVkIGhpZGRlbi14cyBoaWRkZW4tc21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZT17dGhpcy5wcm9wcy5wcm9maWxlfSAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldE1vZGVyYXRpb25CdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5hY2wuY2FuX21vZGVyYXRlKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJidG4tZ3JvdXAgYnRuLWFsaWduZWQgaGlkZGVuLXhzIGhpZGRlbi1zbVwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBidG4tZGVmYXVsdCBidG4tbW9kZXJhdGUgZHJvcGRvd24tdG9nZ2xlXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgdG9uYWxpdHlcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2dldHRleHQoXCJNb2RlcmF0aW9uXCIpfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPE1vZGVyYXRpb25OYXYgcHJvZmlsZT17dGhpcy5wcm9wcy5wcm9maWxlfSAvPlxuICAgICAgPC9kaXY+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm48ZGl2IGNsYXNzTmFtZT1cInBhZ2UtaGVhZGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtbWQtOSBjb2wtbWQtb2Zmc2V0LTNcIj5cblxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICA8QXZhdGFyIHVzZXI9e3RoaXMucHJvcHMucHJvZmlsZX0gc2l6ZT1cIjEwMFwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItbmFtZVwiPnt0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWV9PC9zcGFuPlxuICAgICAgICAgICAgPC9oMT5cblxuICAgICAgICAgICAge3RoaXMuZ2V0Rm9sbG93QnV0dG9uKCl9XG4gICAgICAgICAgICB7dGhpcy5nZXRNb2RlcmF0aW9uQnV0dG9uKCl9XG5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1hbGlnbmVkIGJ0bi1pY29uIGJ0bi1kcm9wZG93bi10b2dnbGUgaGlkZGVuLW1kIGhpZGRlbi1sZ1wiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnByb3BzLnRvZ2dsZU5hdn1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWV4cGFuZGVkPXt0aGlzLnByb3BzLmRyb3Bkb3duID8gJ3RydWUnIDogJ2ZhbHNlJ30+XG4gICAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgICAgICBtZW51XG4gICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGVhZGVyLXN0YXRzXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLW1kLTkgY29sLW1kLW9mZnNldC0zXCI+XG5cbiAgICAgICAgICAgICAgPHVsIGNsYXNzTmFtZT1cImxpc3QtaW5saW5lXCI+XG4gICAgICAgICAgICAgICAge3RoaXMuZ2V0VXNlclN0YXR1cygpfVxuICAgICAgICAgICAgICAgIHt0aGlzLmdldFVzZXJSYW5rKCl9XG4gICAgICAgICAgICAgICAge3RoaXMuZ2V0VXNlclRpdGxlKCl9XG4gICAgICAgICAgICAgICAge3RoaXMuZ2V0Sm9pbmVkT24oKX1cbiAgICAgICAgICAgICAgICB7dGhpcy5nZXRFbWFpbCgpfVxuICAgICAgICAgICAgICA8L3VsPlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUGFuZWxMb2FkZXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcGFuZWwtbG9hZGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgUGFuZWxNZXNzYWdlIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3BhbmVsLW1lc3NhZ2UnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBwb2xscyBmcm9tICdtaXNhZ28vc2VydmljZXMvcG9sbHMnO1xuaW1wb3J0IHRpdGxlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9wYWdlLXRpdGxlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIGlmIChtaXNhZ28uaGFzKCdQUk9GSUxFX0JBTicpKSB7XG4gICAgICB0aGlzLmluaXRXaXRoUHJlbG9hZGVkRGF0YShtaXNhZ28ucG9wKCdQUk9GSUxFX0JBTicpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbml0V2l0aG91dFByZWxvYWRlZERhdGEoKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXJ0UG9sbGluZyhwcm9wcy5wcm9maWxlLmFwaV91cmwuYmFuKTtcbiAgfVxuXG4gIGluaXRXaXRoUHJlbG9hZGVkRGF0YShiYW4pIHtcbiAgICBpZiAoYmFuLmV4cGlyZXNfb24pIHtcbiAgICAgIGJhbi5leHBpcmVzX29uID0gbW9tZW50KGJhbi5leHBpcmVzX29uKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNMb2FkZWQ6IHRydWUsXG4gICAgICBiYW5cbiAgICB9O1xuICB9XG5cbiAgaW5pdFdpdGhvdXRQcmVsb2FkZWREYXRhKCkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0xvYWRlZDogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgc3RhcnRQb2xsaW5nKGFwaSkge1xuICAgIHBvbGxzLnN0YXJ0KHtcbiAgICAgIHBvbGw6ICdiYW4tZGV0YWlscycsXG4gICAgICB1cmw6IGFwaSxcbiAgICAgIGZyZXF1ZW5jeTogOTAgKiAxMDAwLFxuICAgICAgdXBkYXRlOiB0aGlzLnVwZGF0ZSxcbiAgICAgIGVycm9yOiB0aGlzLmVycm9yXG4gICAgfSk7XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIHVwZGF0ZSA9IChiYW4pID0+IHtcbiAgICBpZiAoYmFuLmV4cGlyZXNfb24pIHtcbiAgICAgIGJhbi5leHBpcmVzX29uID0gbW9tZW50KGJhbi5leHBpcmVzX29uKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGlzTG9hZGVkOiB0cnVlLFxuICAgICAgZXJyb3I6IG51bGwsXG5cbiAgICAgIGJhblxuICAgIH0pO1xuICB9O1xuXG4gIGVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBpc0xvYWRlZDogdHJ1ZSxcbiAgICAgIGVycm9yOiBlcnJvci5kZXRhaWwsXG4gICAgICBiYW46IG51bGxcbiAgICB9KTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aXRsZS5zZXQoe1xuICAgICAgdGl0bGU6IGdldHRleHQoXCJCYW4gZGV0YWlsc1wiKSxcbiAgICAgIHBhcmVudDogdGhpcy5wcm9wcy5wcm9maWxlLnVzZXJuYW1lXG4gICAgfSk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBwb2xscy5zdG9wKCdiYW4tZGV0YWlscycpO1xuICB9XG5cbiAgZ2V0VXNlck1lc3NhZ2UoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuYmFuLnVzZXJfbWVzc2FnZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtYm9keSBiYW4tbWVzc2FnZSBiYW4tdXNlci1tZXNzYWdlXCI+XG4gICAgICAgIDxoND57Z2V0dGV4dChcIlVzZXItc2hvd24gYmFuIG1lc3NhZ2VcIil9PC9oND5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsZWFkXCIgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tcbiAgICAgICAgICAgIF9faHRtbDogdGhpcy5zdGF0ZS5iYW4udXNlcl9tZXNzYWdlLmh0bWxcbiAgICAgICAgICB9fSAvPlxuICAgICAgPC9kaXY+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhZmZNZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmJhbi5zdGFmZl9tZXNzYWdlKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1ib2R5IGJhbi1tZXNzYWdlIGJhbi1zdGFmZi1tZXNzYWdlXCI+XG4gICAgICAgIDxoND57Z2V0dGV4dChcIlRlYW0tc2hvd24gYmFuIG1lc3NhZ2VcIil9PC9oND5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsZWFkXCIgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tcbiAgICAgICAgICAgIF9faHRtbDogdGhpcy5zdGF0ZS5iYW4uc3RhZmZfbWVzc2FnZS5odG1sXG4gICAgICAgICAgfX0gLz5cbiAgICAgIDwvZGl2PjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0RXhwaXJhdGlvbk1lc3NhZ2UoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuYmFuLmV4cGlyZXNfb24pIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmJhbi5leHBpcmVzX29uLmlzQWZ0ZXIobW9tZW50KCkpKSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgbGV0IHRpdGxlID0gaW50ZXJwb2xhdGUoXG4gICAgICAgICAgZ2V0dGV4dChcIlRoaXMgYmFuIGV4cGlyZXMgb24gJShleHBpcmVzX29uKXMuXCIpLCB7XG4gICAgICAgICAgICAnZXhwaXJlc19vbic6IHRoaXMuc3RhdGUuYmFuLmV4cGlyZXNfb24uZm9ybWF0KCdMTCwgTFQnKVxuICAgICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIGxldCBtZXNzYWdlID0gaW50ZXJwb2xhdGUoXG4gICAgICAgICAgZ2V0dGV4dChcIlRoaXMgYmFuIGV4cGlyZXMgJShleHBpcmVzX29uKXMuXCIpLCB7XG4gICAgICAgICAgICAnZXhwaXJlc19vbic6IHRoaXMuc3RhdGUuYmFuLmV4cGlyZXNfb24uZnJvbU5vdygpXG4gICAgICAgICAgfSwgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIDxhYmJyIHRpdGxlPXt0aXRsZX0+XG4gICAgICAgICAge21lc3NhZ2V9XG4gICAgICAgIDwvYWJicj47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZ2V0dGV4dChcIlRoaXMgYmFuIGhhcyBleHBpcmVkLlwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMncyBiYW4gaXMgcGVybWFuZW50LlwiKSwge1xuICAgICAgICAndXNlcm5hbWUnOiB0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWVcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldFBhbmVsQm9keSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5iYW4pIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnN0YXRlLmJhbikubGVuZ3RoKSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcmV0dXJuIDxkaXY+XG4gICAgICAgICAge3RoaXMuZ2V0VXNlck1lc3NhZ2UoKX1cbiAgICAgICAgICB7dGhpcy5nZXRTdGFmZk1lc3NhZ2UoKX1cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWwtYm9keSBiYW4tZXhwaXJlc1wiPlxuICAgICAgICAgICAgPGg0PntnZXR0ZXh0KFwiQmFuIGV4cGlyYXRpb25cIil9PC9oND5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImxlYWRcIj5cbiAgICAgICAgICAgICAge3RoaXMuZ2V0RXhwaXJhdGlvbk1lc3NhZ2UoKX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+O1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgICByZXR1cm4gPGRpdj5cbiAgICAgICAgICA8UGFuZWxNZXNzYWdlIG1lc3NhZ2U9e2dldHRleHQoXCJObyBiYW4gaXMgYWN0aXZlIGF0IHRoZSBtb21lbnQuXCIpfSAvPlxuICAgICAgICA8L2Rpdj47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmVycm9yKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGRpdj5cbiAgICAgICAgPFBhbmVsTWVzc2FnZSBpY29uPVwiZXJyb3Jfb3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT17dGhpcy5zdGF0ZS5lcnJvcn0gLz5cbiAgICAgIDwvZGl2PjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2PlxuICAgICAgICA8UGFuZWxMb2FkZXIgLz5cbiAgICAgIDwvZGl2PjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJwcm9maWxlLWJhbi1kZXRhaWxzXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhbmVsIHBhbmVsLWRlZmF1bHRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbC1oZWFkaW5nXCI+XG4gICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInBhbmVsLXRpdGxlXCI+e2dldHRleHQoXCJCYW4gZGV0YWlsc1wiKX08L2gzPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7dGhpcy5nZXRQYW5lbEJvZHkoKX1cblxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCB7IHBhdGNoUHJvZmlsZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy9wcm9maWxlJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByb2ZpbGUuaXNfZm9sbG93ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNsYXNzTmFtZSArICcgYnRuLWRlZmF1bHQgYnRuLWZvbGxvd2luZyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNsYXNzTmFtZSArICcgYnRuLWRlZmF1bHQgYnRuLWZvbGxvdyc7XG4gICAgfVxuICB9XG5cbiAgZ2V0SWNvbigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5wcm9maWxlLmlzX2ZvbGxvd2VkKSB7XG4gICAgICByZXR1cm4gJ2Zhdm9yaXRlJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdmYXZvcml0ZV9ib3JkZXInO1xuICAgIH1cbiAgfVxuXG4gIGdldExhYmVsKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByb2ZpbGUuaXNfZm9sbG93ZWQpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiRm9sbG93aW5nXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIkZvbGxvd1wiKTtcbiAgICB9XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGFjdGlvbiA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGlzTG9hZGluZzogdHJ1ZVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5pc19mb2xsb3dlZCkge1xuICAgICAgc3RvcmUuZGlzcGF0Y2gocGF0Y2hQcm9maWxlKHtcbiAgICAgICAgaXNfZm9sbG93ZWQ6IGZhbHNlLFxuICAgICAgICBmb2xsb3dlcnM6IHRoaXMucHJvcHMucHJvZmlsZS5mb2xsb3dlcnMgLSAxXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3JlLmRpc3BhdGNoKHBhdGNoUHJvZmlsZSh7XG4gICAgICAgIGlzX2ZvbGxvd2VkOiB0cnVlLFxuICAgICAgICBmb2xsb3dlcnM6IHRoaXMucHJvcHMucHJvZmlsZS5mb2xsb3dlcnMgKyAxXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgYWpheC5wb3N0KHRoaXMucHJvcHMucHJvZmlsZS5hcGlfdXJsLmZvbGxvdykudGhlbigoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICBzdG9yZS5kaXNwYXRjaChwYXRjaFByb2ZpbGUoZGF0YSkpO1xuICAgIH0sIChyZWplY3Rpb24pID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gICAgfSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPEJ1dHRvbiBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3NOYW1lKCl9XG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuYWN0aW9ufT5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAge3RoaXMuZ2V0SWNvbigpfVxuICAgICAgPC9zcGFuPlxuICAgICAge3RoaXMuZ2V0TGFiZWwoKX1cbiAgICA8L0J1dHRvbj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFNlYXJjaCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9zZWFyY2gnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBVc2Vyc0xpc3QgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMtbGlzdC9yb290JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgeyBkZWh5ZHJhdGUsIGFwcGVuZCB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy91c2Vycyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcbmltcG9ydCB0aXRsZSBmcm9tICdtaXNhZ28vc2VydmljZXMvcGFnZS10aXRsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnNldFNwZWNpYWxQcm9wcygpO1xuXG4gICAgaWYgKG1pc2Fnby5oYXModGhpcy5QUkVMT0FERURfREFUQV9LRVkpKSB7XG4gICAgICB0aGlzLmluaXRXaXRoUHJlbG9hZGVkRGF0YShtaXNhZ28ucG9wKHRoaXMuUFJFTE9BREVEX0RBVEFfS0VZKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdFdpdGhvdXRQcmVsb2FkZWREYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0U3BlY2lhbFByb3BzKCkge1xuICAgIHRoaXMuUFJFTE9BREVEX0RBVEFfS0VZID0gJ1BST0ZJTEVfRk9MTE9XRVJTJztcbiAgICB0aGlzLlRJVExFID0gZ2V0dGV4dCgnRm9sbG93ZXJzJyk7XG4gICAgdGhpcy5BUElfRklMVEVSID0gJ2ZvbGxvd2Vycyc7XG4gIH1cblxuICBpbml0V2l0aFByZWxvYWRlZERhdGEoZGF0YSkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0xvYWRlZDogdHJ1ZSxcbiAgICAgIGlzQnVzeTogZmFsc2UsXG5cbiAgICAgIHNlYXJjaDogJycsXG5cbiAgICAgIGNvdW50OiBkYXRhLmNvdW50LFxuICAgICAgbW9yZTogZGF0YS5tb3JlLFxuXG4gICAgICBwYWdlOiBkYXRhLnBhZ2UsXG4gICAgICBwYWdlczogZGF0YS5wYWdlc1xuICAgIH07XG5cbiAgICBzdG9yZS5kaXNwYXRjaChkZWh5ZHJhdGUoZGF0YS5yZXN1bHRzKSk7XG4gIH1cblxuICBpbml0V2l0aG91dFByZWxvYWRlZERhdGEoKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTG9hZGVkOiBmYWxzZSxcbiAgICAgIGlzQnVzeTogZmFsc2UsXG5cbiAgICAgIHNlYXJjaDogJycsXG5cbiAgICAgIGNvdW50OiAwLFxuICAgICAgbW9yZTogMCxcblxuICAgICAgcGFnZTogMSxcbiAgICAgIHBhZ2VzOiAxXG4gICAgfTtcblxuICAgIHRoaXMubG9hZFVzZXJzKCk7XG4gIH1cblxuICBsb2FkVXNlcnMocGFnZT0xLCBzZWFyY2g9bnVsbCkge1xuICAgIGFqYXguZ2V0KG1pc2Fnby5nZXQoJ1VTRVJTX0FQSScpLCB7XG4gICAgICBbdGhpcy5BUElfRklMVEVSXTogdGhpcy5wcm9wcy5wcm9maWxlLmlkLFxuICAgICAgbmFtZTogc2VhcmNoLFxuICAgICAgcGFnZTogcGFnZSB8fCAxXG4gICAgfSwgJ3VzZXItJyArIHRoaXMuQVBJX0ZJTFRFUikudGhlbigoZGF0YSkgPT4ge1xuICAgICAgaWYgKHBhZ2UgPT09IDEpIHtcbiAgICAgICAgc3RvcmUuZGlzcGF0Y2goZGVoeWRyYXRlKGRhdGEucmVzdWx0cykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RvcmUuZGlzcGF0Y2goYXBwZW5kKGRhdGEucmVzdWx0cykpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkZWQ6IHRydWUsXG4gICAgICAgIGlzQnVzeTogZmFsc2UsXG5cbiAgICAgICAgY291bnQ6IGRhdGEuY291bnQsXG4gICAgICAgIG1vcmU6IGRhdGEubW9yZSxcblxuICAgICAgICBwYWdlOiBkYXRhLnBhZ2UsXG4gICAgICAgIHBhZ2VzOiBkYXRhLnBhZ2VzXG4gICAgICB9KTtcbiAgICB9LCAocmVqZWN0aW9uKSA9PiB7XG4gICAgICBzbmFja2Jhci5hcGlFcnJvcihyZWplY3Rpb24pO1xuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGl0bGUuc2V0KHtcbiAgICAgIHRpdGxlOiB0aGlzLlRJVExFLFxuICAgICAgcGFyZW50OiB0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWVcbiAgICB9KTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgbG9hZE1vcmUgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBpc0J1c3k6IHRydWVcbiAgICB9KTtcblxuICAgIHRoaXMubG9hZFVzZXJzKHRoaXMuc3RhdGUucGFnZSArIDEsIHRoaXMuc3RhdGUuc2VhcmNoKTtcbiAgfTtcblxuICBzZWFyY2ggPSAoZXYpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGlzTG9hZGVkOiBmYWxzZSxcbiAgICAgIGlzQnVzeTogdHJ1ZSxcblxuICAgICAgc2VhcmNoOiBldi50YXJnZXQudmFsdWUsXG5cbiAgICAgIGNvdW50OiAwLFxuICAgICAgbW9yZTogMCxcblxuICAgICAgcGFnZTogMSxcbiAgICAgIHBhZ2VzOiAxXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvYWRVc2VycygxLCBldi50YXJnZXQudmFsdWUpO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGdldExhYmVsKCkge1xuICAgIGlmICghdGhpcy5zdGF0ZS5pc0xvYWRlZCkge1xuICAgICAgcmV0dXJuIGdldHRleHQoJ0xvYWRpbmcuLi4nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuc2VhcmNoKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IG5nZXR0ZXh0KFxuICAgICAgICBcIkZvdW5kICUodXNlcnMpcyB1c2VyLlwiLFxuICAgICAgICBcIkZvdW5kICUodXNlcnMpcyB1c2Vycy5cIixcbiAgICAgICAgdGhpcy5zdGF0ZS5jb3VudCk7XG5cbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShtZXNzYWdlLCB7XG4gICAgICAgICd1c2Vycyc6IHRoaXMuc3RhdGUuY291bnRcbiAgICAgIH0sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5wcm9maWxlLmlkID09PSB0aGlzLnByb3BzLnVzZXIuaWQpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gbmdldHRleHQoXG4gICAgICAgIFwiWW91IGhhdmUgJSh1c2VycylzIGZvbGxvd2VyLlwiLFxuICAgICAgICBcIllvdSBoYXZlICUodXNlcnMpcyBmb2xsb3dlcnMuXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuY291bnQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAndXNlcnMnOiB0aGlzLnN0YXRlLmNvdW50XG4gICAgICB9LCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBuZ2V0dGV4dChcbiAgICAgICAgXCIlKHVzZXJuYW1lKXMgaGFzICUodXNlcnMpcyBmb2xsb3dlci5cIixcbiAgICAgICAgXCIlKHVzZXJuYW1lKXMgaGFzICUodXNlcnMpcyBmb2xsb3dlcnMuXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuY291bnQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAndXNlcm5hbWUnOiB0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWUsXG4gICAgICAgICd1c2Vycyc6IHRoaXMuc3RhdGUuY291bnRcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldEVtcHR5TWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5zZWFyY2gpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiU2VhcmNoIHJldHVybmVkIG5vIHVzZXJzIG1hdGNoaW5nIHNwZWNpZmllZCBjcml0ZXJpYS5cIik7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnVzZXIuaWQgPT09IHRoaXMucHJvcHMucHJvZmlsZS5pZCkge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJZb3UgaGF2ZSBubyBmb2xsb3dlcnMuXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIiUodXNlcm5hbWUpcyBoYXMgbm8gZm9sbG93ZXJzLlwiKSwge1xuICAgICAgICAndXNlcm5hbWUnOiB0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWVcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldE1vcmVCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUubW9yZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicGFnZXItbW9yZVwiPlxuICAgICAgICA8QnV0dG9uIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNCdXN5fVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMubG9hZE1vcmV9PlxuICAgICAgICAgIHtpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiU2hvdyBtb3JlICglKG1vcmUpcylcIiksIHtcbiAgICAgICAgICAgICdtb3JlJzogdGhpcy5zdGF0ZS5tb3JlXG4gICAgICAgICAgfSwgdHJ1ZSl9XG4gICAgICAgIDwvQnV0dG9uPlxuICAgICAgPC9kaXY+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0TGlzdEJvZHkoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaXNMb2FkZWQgJiYgdGhpcy5zdGF0ZS5jb3VudCA9PT0gMCkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxwIGNsYXNzTmFtZT1cImxlYWRcIj5cbiAgICAgICAge3RoaXMuZ2V0RW1wdHlNZXNzYWdlKCl9XG4gICAgICA8L3A+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxkaXY+XG4gICAgICAgIDxVc2Vyc0xpc3QgaXNMb2FkZWQ9e3RoaXMuc3RhdGUuaXNMb2FkZWR9XG4gICAgICAgICAgICAgICAgICAgdXNlcnM9e3RoaXMucHJvcHMudXNlcnN9XG4gICAgICAgICAgICAgICAgICAgc2hvd1Jhbms9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgY29scz17Mn0gLz5cblxuICAgICAgICB7dGhpcy5nZXRNb3JlQnV0dG9uKCl9XG4gICAgICA8L2Rpdj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIGdldENsYXNzTmFtZSgpIHtcbiAgICByZXR1cm4gJ3Byb2ZpbGUtJyArIHRoaXMuQVBJX0ZJTFRFUjtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cblxuICAgICAgPG5hdiBjbGFzc05hbWU9XCJ0b29sYmFyXCI+XG4gICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0b29sYmFyLWxlZnRcIj5cbiAgICAgICAgICB7dGhpcy5nZXRMYWJlbCgpfVxuICAgICAgICA8L2gzPlxuXG4gICAgICAgIDxTZWFyY2ggY2xhc3NOYW1lPVwidG9vbGJhci1yaWdodFwiXG4gICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuc2VhcmNofVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLnNlYXJjaH1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17Z2V0dGV4dChcIlNlYXJjaCBoaXN0b3J5Li4uXCIpfSAvPlxuICAgICAgPC9uYXY+XG5cbiAgICAgIHt0aGlzLmdldExpc3RCb2R5KCl9XG5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvbGxvd2VycyBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL2ZvbGxvd2Vycyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgRm9sbG93ZXJzIHtcbiAgc2V0U3BlY2lhbFByb3BzKCkge1xuICAgIHRoaXMuUFJFTE9BREVEX0RBVEFfS0VZID0gJ1BST0ZJTEVfRk9MTE9XUyc7XG4gICAgdGhpcy5USVRMRSA9IGdldHRleHQoJ0ZvbGxvd3MnKTtcbiAgICB0aGlzLkFQSV9GSUxURVIgPSAnZm9sbG93cyc7XG4gIH1cblxuICBnZXRMYWJlbCgpIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNMb2FkZWQpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KCdMb2FkaW5nLi4uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLnNlYXJjaCkge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBuZ2V0dGV4dChcbiAgICAgICAgXCJGb3VuZCAlKHVzZXJzKXMgdXNlci5cIixcbiAgICAgICAgXCJGb3VuZCAlKHVzZXJzKXMgdXNlcnMuXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuY291bnQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAndXNlcnMnOiB0aGlzLnN0YXRlLmNvdW50XG4gICAgICB9LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5pZCA9PT0gdGhpcy5wcm9wcy51c2VyLmlkKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IG5nZXR0ZXh0KFxuICAgICAgICBcIllvdSBhcmUgZm9sbG93aW5nICUodXNlcnMpcyB1c2VyLlwiLFxuICAgICAgICBcIllvdSBhcmUgZm9sbG93aW5nICUodXNlcnMpcyB1c2Vycy5cIixcbiAgICAgICAgdGhpcy5zdGF0ZS5jb3VudCk7XG5cbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShtZXNzYWdlLCB7XG4gICAgICAgICd1c2Vycyc6IHRoaXMuc3RhdGUuY291bnRcbiAgICAgIH0sIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IG5nZXR0ZXh0KFxuICAgICAgICBcIiUodXNlcm5hbWUpcyBpcyBmb2xsb3dpbmcgJSh1c2VycylzIHVzZXIuXCIsXG4gICAgICAgIFwiJSh1c2VybmFtZSlzIGlzIGZvbGxvd2luZyAlKHVzZXJzKXMgdXNlcnMuXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuY291bnQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAndXNlcm5hbWUnOiB0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWUsXG4gICAgICAgICd1c2Vycyc6IHRoaXMuc3RhdGUuY291bnRcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldEVtcHR5TWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5zZWFyY2gpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiU2VhcmNoIHJldHVybmVkIG5vIHVzZXJzIG1hdGNoaW5nIHNwZWNpZmllZCBjcml0ZXJpYS5cIik7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnVzZXIuaWQgPT09IHRoaXMucHJvcHMucHJvZmlsZS5pZCkge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJZb3UgYXJlIG5vdCBmb2xsb3dpbmcgYW55IHVzZXJzLlwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMgaXMgbm90IGZvbGxvd2luZyBhbnkgdXNlcnMuXCIpLCB7XG4gICAgICAgICd1c2VybmFtZSc6IHRoaXMucHJvcHMucHJvZmlsZS51c2VybmFtZVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybSc7XG5pbXBvcnQgRm9ybUdyb3VwIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0tZ3JvdXAnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBMb2FkZXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbW9kYWwtbG9hZGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgWWVzTm9Td2l0Y2ggZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMveWVzLW5vLXN3aXRjaCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IE1vZGFsTWVzc2FnZSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9tb2RhbC1tZXNzYWdlJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgeyB1cGRhdGVBdmF0YXIgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvdXNlcnMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgRm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTG9hZGVkOiBmYWxzZSxcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICBlcnJvcjogbnVsbCxcblxuICAgICAgaXNfYXZhdGFyX2xvY2tlZDogJycsXG4gICAgICBhdmF0YXJfbG9ja191c2VyX21lc3NhZ2U6ICcnLFxuICAgICAgYXZhdGFyX2xvY2tfc3RhZmZfbWVzc2FnZTogJydcbiAgICB9O1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgYWpheC5nZXQodGhpcy5wcm9wcy5wcm9maWxlLmFwaV91cmwubW9kZXJhdGVfYXZhdGFyKS50aGVuKChvcHRpb25zKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkZWQ6IHRydWUsXG5cbiAgICAgICAgaXNfYXZhdGFyX2xvY2tlZDogb3B0aW9ucy5pc19hdmF0YXJfbG9ja2VkLFxuICAgICAgICBhdmF0YXJfbG9ja191c2VyX21lc3NhZ2U6IG9wdGlvbnMuYXZhdGFyX2xvY2tfdXNlcl9tZXNzYWdlLFxuICAgICAgICBhdmF0YXJfbG9ja19zdGFmZl9tZXNzYWdlOiBvcHRpb25zLmF2YXRhcl9sb2NrX3N0YWZmX21lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH0sIChyZWplY3Rpb24pID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRlZDogdHJ1ZSxcbiAgICAgICAgZXJyb3I6IHJlamVjdGlvbi5kZXRhaWxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYW4oKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXIuZXJyb3IodGhpcy52YWxpZGF0ZSgpLnVzZXJuYW1lWzBdKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBhamF4LnBvc3QodGhpcy5wcm9wcy5wcm9maWxlLmFwaV91cmwubW9kZXJhdGVfYXZhdGFyLCB7XG4gICAgICBpc19hdmF0YXJfbG9ja2VkOiB0aGlzLnN0YXRlLmlzX2F2YXRhcl9sb2NrZWQsXG4gICAgICBhdmF0YXJfbG9ja191c2VyX21lc3NhZ2U6IHRoaXMuc3RhdGUuYXZhdGFyX2xvY2tfdXNlcl9tZXNzYWdlLFxuICAgICAgYXZhdGFyX2xvY2tfc3RhZmZfbWVzc2FnZTogdGhpcy5zdGF0ZS5hdmF0YXJfbG9ja19zdGFmZl9tZXNzYWdlXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVTdWNjZXNzKGFwaVJlc3BvbnNlKSB7XG4gICAgc3RvcmUuZGlzcGF0Y2godXBkYXRlQXZhdGFyKHRoaXMucHJvcHMucHJvZmlsZSwgYXBpUmVzcG9uc2UuYXZhdGFyX2hhc2gpKTtcbiAgICBzbmFja2Jhci5zdWNjZXNzKGdldHRleHQoXCJBdmF0YXIgY29udHJvbHMgaGF2ZSBiZWVuIGNoYW5nZWQuXCIpKTtcbiAgfVxuXG4gIGdldEZvcm1Cb2R5KCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keVwiPlxuXG4gICAgICAgIDxGb3JtR3JvdXAgbGFiZWw9e2dldHRleHQoXCJMb2NrIGF2YXRhclwiKX1cbiAgICAgICAgICAgICAgICAgICBoZWxwVGV4dD17Z2V0dGV4dChcIkxvY2tpbmcgdXNlciBhdmF0YXIgd2lsbCBwcm9oaWJpdCB1c2VyIGZyb20gY2hhbmdpbmcgaGlzIGF2YXRhciBhbmQgd2lsbCByZXNldCBoaXMvaGVyIGF2YXRhciB0byBkZWZhdWx0IG9uZS5cIil9XG4gICAgICAgICAgICAgICAgICAgZm9yPVwiaWRfaXNfYXZhdGFyX2xvY2tlZFwiPlxuICAgICAgICAgIDxZZXNOb1N3aXRjaCBpZD1cImlkX2lzX2F2YXRhcl9sb2NrZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgIGljb25Pbj1cImxvY2tfb3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIGljb25PZmY9XCJsb2NrX29wZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICBsYWJlbE9uPXtnZXR0ZXh0KFwiRGlzYWxsb3cgdXNlciBmcm9tIGNoYW5naW5nIGF2YXRhclwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxPZmY9e2dldHRleHQoXCJBbGxvdyB1c2VyIHRvIGNoYW5nZSBhdmF0YXJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgnaXNfYXZhdGFyX2xvY2tlZCcpfVxuICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5pc19hdmF0YXJfbG9ja2VkfSAvPlxuICAgICAgICA8L0Zvcm1Hcm91cD5cblxuICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiVXNlciBtZXNzYWdlXCIpfVxuICAgICAgICAgICAgICAgICAgIGhlbHBUZXh0PXtnZXR0ZXh0KFwiT3B0aW9uYWwgbWVzc2FnZSBmb3IgdXNlciBleHBsYWluaW5nIHdoeSBoZS9zaGUgaXMgcHJvaGliaXRlZCBmb3JtIGNoYW5naW5nIGF2YXRhci5cIil9XG4gICAgICAgICAgICAgICAgICAgZm9yPVwiaWRfYXZhdGFyX2xvY2tfdXNlcl9tZXNzYWdlXCI+XG4gICAgICAgICAgPHRleHRhcmVhIGlkPVwiaWRfYXZhdGFyX2xvY2tfdXNlcl9tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgcm93cz1cIjRcIlxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgnYXZhdGFyX2xvY2tfdXNlcl9tZXNzYWdlJyl9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLmF2YXRhcl9sb2NrX3VzZXJfbWVzc2FnZX0gLz5cbiAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIlN0YWZmIG1lc3NhZ2VcIil9XG4gICAgICAgICAgICAgICAgICAgaGVscFRleHQ9e2dldHRleHQoXCJPcHRpb25hbCBtZXNzYWdlIGZvciBmb3J1bSB0ZWFtIG1lbWJlcnMgZXhwbGFpbmluZyB3aHkgdXNlciBpcyBwcm9oaWJpdGVkIGZvcm0gY2hhbmdpbmcgYXZhdGFyLlwiKX1cbiAgICAgICAgICAgICAgICAgICBmb3I9XCJpZF9hdmF0YXJfbG9ja19zdGFmZl9tZXNzYWdlXCI+XG4gICAgICAgICAgPHRleHRhcmVhIGlkPVwiaWRfYXZhdGFyX2xvY2tfc3RhZmZfbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgIHJvd3M9XCI0XCJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ2F2YXRhcl9sb2NrX3N0YWZmX21lc3NhZ2UnKX1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuYXZhdGFyX2xvY2tfc3RhZmZfbWVzc2FnZX0gLz5cbiAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5cbiAgICAgICAgICB7Z2V0dGV4dChcIkNsb3NlXCIpfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcHJpbWFyeVwiIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfT5cbiAgICAgICAgICB7Z2V0dGV4dChcIlNhdmUgY2hhbmdlc1wiKX1cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cblxuICBnZXRNb2RhbEJvZHkoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZXJyb3IpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8TW9kYWxNZXNzYWdlIGljb249XCJyZW1vdmVfY2lyY2xlX291dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT17dGhpcy5zdGF0ZS5lcnJvcn0gLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5pc0xvYWRlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybUJvZHkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxMb2FkZXIgLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIGdldENsYXNzTmFtZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5lcnJvcikge1xuICAgICAgcmV0dXJuIFwibW9kYWwtZGlhbG9nIG1vZGFsLW1lc3NhZ2UgbW9kYWwtYXZhdGFyLWNvbnRyb2xzXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIm1vZGFsLWRpYWxvZyBtb2RhbC1hdmF0YXItY29udHJvbHNcIjtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzc05hbWUoKX1cbiAgICAgICAgICAgICAgICByb2xlPVwiZG9jdW1lbnRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17Z2V0dGV4dChcIkNsb3NlXCIpfT5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGg0IGNsYXNzTmFtZT1cIm1vZGFsLXRpdGxlXCI+e2dldHRleHQoXCJBdmF0YXIgY29udHJvbHNcIil9PC9oND5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHt0aGlzLmdldE1vZGFsQm9keSgpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtJztcbmltcG9ydCBGb3JtR3JvdXAgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybS1ncm91cCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IExvYWRlciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9tb2RhbC1sb2FkZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBNb2RhbE1lc3NhZ2UgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbW9kYWwtbWVzc2FnZSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgYWRkTmFtZUNoYW5nZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy91c2VybmFtZS1oaXN0b3J5JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgeyB1cGRhdGVVc2VybmFtZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy91c2Vycyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcbmltcG9ydCAqIGFzIHZhbGlkYXRvcnMgZnJvbSAnbWlzYWdvL3V0aWxzL3ZhbGlkYXRvcnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEZvcm0ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0xvYWRlZDogZmFsc2UsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgZXJyb3I6IG51bGwsXG5cbiAgICAgIHVzZXJuYW1lOiAnJyxcbiAgICAgIHZhbGlkYXRvcnM6IHtcbiAgICAgICAgdXNlcm5hbWU6IFtcbiAgICAgICAgICB2YWxpZGF0b3JzLnVzZXJuYW1lQ29udGVudCgpLFxuICAgICAgICAgIHZhbGlkYXRvcnMudXNlcm5hbWVNaW5MZW5ndGgobWlzYWdvLmdldCgnU0VUVElOR1MnKSksXG4gICAgICAgICAgdmFsaWRhdG9ycy51c2VybmFtZU1heExlbmd0aChtaXNhZ28uZ2V0KCdTRVRUSU5HUycpKVxuICAgICAgICBdXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGFqYXguZ2V0KHRoaXMucHJvcHMucHJvZmlsZS5hcGlfdXJsLm1vZGVyYXRlX3VzZXJuYW1lKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRlZDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzTG9hZGVkOiB0cnVlLFxuICAgICAgICBlcnJvcjogcmVqZWN0aW9uLmRldGFpbFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBjbGVhbigpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzbmFja2Jhci5lcnJvcih0aGlzLnZhbGlkYXRlKCkudXNlcm5hbWVbMF0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNlbmQoKSB7XG4gICAgcmV0dXJuIGFqYXgucG9zdCh0aGlzLnByb3BzLnByb2ZpbGUuYXBpX3VybC5tb2RlcmF0ZV91c2VybmFtZSwge1xuICAgICAgdXNlcm5hbWU6IHRoaXMuc3RhdGUudXNlcm5hbWVcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3MoYXBpUmVzcG9uc2UpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHVzZXJuYW1lOiAnJ1xuICAgIH0pO1xuXG4gICAgc3RvcmUuZGlzcGF0Y2goYWRkTmFtZUNoYW5nZShcbiAgICAgIGFwaVJlc3BvbnNlLCB0aGlzLnByb3BzLnByb2ZpbGUsIHRoaXMucHJvcHMudXNlcikpO1xuICAgIHN0b3JlLmRpc3BhdGNoKHVwZGF0ZVVzZXJuYW1lKFxuICAgICAgdGhpcy5wcm9wcy5wcm9maWxlLCBhcGlSZXNwb25zZS51c2VybmFtZSwgYXBpUmVzcG9uc2Uuc2x1ZykpO1xuXG4gICAgc25hY2tiYXIuc3VjY2VzcyhnZXR0ZXh0KFwiVXNlcm5hbWUgaGFzIGJlZW4gY2hhbmdlZC5cIikpO1xuICB9XG5cbiAgZ2V0Rm9ybUJvZHkoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5XCI+XG5cbiAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIk5ldyB1c2VybmFtZVwiKX0gZm9yPVwiaWRfdXNlcm5hbWVcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImlkX3VzZXJuYW1lXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3VzZXJuYW1lJyl9XG4gICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnVzZXJuYW1lfSAvPlxuICAgICAgICA8L0Zvcm1Hcm91cD5cblxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4gYnRuLWRlZmF1bHRcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPlxuICAgICAgICAgIHtnZXR0ZXh0KFwiQ2xvc2VcIil9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8QnV0dG9uIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5XCIgbG9hZGluZz17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9PlxuICAgICAgICAgIHtnZXR0ZXh0KFwiQ2hhbmdlIHVzZXJuYW1lXCIpfVxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG4gIGdldE1vZGFsQm9keSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5lcnJvcikge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxNb2RhbE1lc3NhZ2UgaWNvbj1cInJlbW92ZV9jaXJjbGVfb3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPXt0aGlzLnN0YXRlLmVycm9yfSAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmlzTG9hZGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRGb3JtQm9keSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPExvYWRlciAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmVycm9yKSB7XG4gICAgICByZXR1cm4gXCJtb2RhbC1kaWFsb2cgbW9kYWwtbWVzc2FnZSBtb2RhbC1yZW5hbWUtdXNlclwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJtb2RhbC1kaWFsb2cgbW9kYWwtcmVuYW1lLXVzZXJcIjtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzc05hbWUoKX1cbiAgICAgICAgICAgICAgICByb2xlPVwiZG9jdW1lbnRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17Z2V0dGV4dChcIkNsb3NlXCIpfT5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGg0IGNsYXNzTmFtZT1cIm1vZGFsLXRpdGxlXCI+e2dldHRleHQoXCJDaGFuZ2UgdXNlcm5hbWVcIil9PC9oND5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHt0aGlzLmdldE1vZGFsQm9keSgpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtJztcbmltcG9ydCBGb3JtR3JvdXAgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybS1ncm91cCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IExvYWRlciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9tb2RhbC1sb2FkZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBNb2RhbE1lc3NhZ2UgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbW9kYWwtbWVzc2FnZSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFllc05vU3dpdGNoIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3llcy1uby1zd2l0Y2gnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgcG9sbHMgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BvbGxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBGb3JtIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNMb2FkZWQ6IGZhbHNlLFxuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgIGlzRGVsZXRlZDogZmFsc2UsXG4gICAgICBlcnJvcjogbnVsbCxcblxuICAgICAgY291bnRkb3duOiA1LFxuICAgICAgY29uZmlybTogZmFsc2UsXG5cbiAgICAgIHdpdGhfY29udGVudDogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgYWpheC5nZXQodGhpcy5wcm9wcy5wcm9maWxlLmFwaV91cmwuZGVsZXRlKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRlZDogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY291bnRkb3duKCk7XG4gICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzTG9hZGVkOiB0cnVlLFxuICAgICAgICBlcnJvcjogcmVqZWN0aW9uLmRldGFpbFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGNvdW50ZG93biA9ICgpID0+IHtcbiAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5jb3VudGRvd24gPiAxKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGNvdW50ZG93bjogdGhpcy5zdGF0ZS5jb3VudGRvd24gLSAxLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb3VudGRvd24oKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc3RhdGUuY29uZmlybSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBjb25maXJtOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIDEwMDApO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIHNlbmQoKSB7XG4gICAgcmV0dXJuIGFqYXgucG9zdCh0aGlzLnByb3BzLnByb2ZpbGUuYXBpX3VybC5kZWxldGUsIHtcbiAgICAgIHdpdGhfY29udGVudDogdGhpcy5zdGF0ZS53aXRoX2NvbnRlbnRcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3MoKSB7XG4gICAgcG9sbHMuc3RvcCgndXNlci1wcm9maWxlJyk7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS53aXRoX2NvbnRlbnQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0RlbGV0ZWQ6IGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMncyBhY2NvdW50LCB0aHJlYWRzLCBwb3N0cyBhbmQgb3RoZXIgY29udGVudCBoYXMgYmVlbiBkZWxldGVkLlwiKSwge1xuICAgICAgICAgICd1c2VybmFtZSc6IHRoaXMucHJvcHMucHJvZmlsZS51c2VybmFtZVxuICAgICAgICB9LCB0cnVlKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0RlbGV0ZWQ6IGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMncyBhY2NvdW50IGhhcyBiZWVuIGRlbGV0ZWQgYW5kIG90aGVyIGNvbnRlbnQgaGFzIGJlZW4gaGlkZGVuLlwiKSwge1xuICAgICAgICAgICd1c2VybmFtZSc6IHRoaXMucHJvcHMucHJvZmlsZS51c2VybmFtZVxuICAgICAgICB9LCB0cnVlKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QnV0dG9uTGFiZWwoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuY29uZmlybSkge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCJEZWxldGUgJSh1c2VybmFtZSlzXCIpLCB7XG4gICAgICAgICd1c2VybmFtZSc6IHRoaXMucHJvcHMucHJvZmlsZS51c2VybmFtZVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiUGxlYXNlIHdhaXQuLi4gKCUoY291bnRkb3duKXNzKVwiKSwge1xuICAgICAgICAnY291bnRkb3duJzogdGhpcy5zdGF0ZS5jb3VudGRvd25cbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldEZvcm0oKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9IGNsYXNzTmFtZT1cImZvcm0taG9yaXpvbnRhbFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5XCI+XG5cbiAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIlVzZXIgY29udGVudFwiKX1cbiAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPVwiY29sLXNtLTRcIiBjb250cm9sQ2xhc3M9XCJjb2wtc20tOFwiXG4gICAgICAgICAgICAgICAgICAgZm9yPVwiaWRfd2l0aF9jb250ZW50XCI+XG4gICAgICAgICAgPFllc05vU3dpdGNoIGlkPVwiaWRfd2l0aF9jb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICBsYWJlbE9uPXtnZXR0ZXh0KFwiRGVsZXRlIHRvZ2V0aGVyIHdpdGggdXNlcidzIGFjY291bnRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsT2ZmPXtnZXR0ZXh0KFwiSGlkZSBhZnRlciBkZWxldGluZyB1c2VyJ3MgYWNjb3VudFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCd3aXRoX2NvbnRlbnQnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUud2l0aF9jb250ZW50fSAvPlxuICAgICAgICA8L0Zvcm1Hcm91cD5cblxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWZvb3RlclwiPlxuXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgICBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPlxuICAgICAgICAgIHtnZXR0ZXh0KFwiQ2FuY2VsXCIpfVxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8QnV0dG9uIGNsYXNzTmFtZT1cImJ0bi1kYW5nZXJcIlxuICAgICAgICAgICAgICAgIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXshdGhpcy5zdGF0ZS5jb25maXJtfT5cbiAgICAgICAgICB7dGhpcy5nZXRCdXR0b25MYWJlbCgpfVxuICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgZ2V0RGVsZXRlZEJvZHkoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWJvZHlcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1pY29uXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICBpbmZvX291dGxpbmVcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtYm9keVwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgICAge3RoaXMuc3RhdGUuaXNEZWxldGVkfVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPlxuICAgICAgICAgIDxhIGhyZWY9e21pc2Fnby5nZXQoJ1VTRVJTX0xJU1RfVVJMJyl9PlxuICAgICAgICAgICAge2dldHRleHQoXCJSZXR1cm4gdG8gdXNlcnMgbGlzdFwiKX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgZ2V0TW9kYWxCb2R5KCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmVycm9yKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPE1vZGFsTWVzc2FnZSBpY29uPVwicmVtb3ZlX2NpcmNsZV9vdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9e3RoaXMuc3RhdGUuZXJyb3J9IC8+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuaXNMb2FkZWQpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmlzRGVsZXRlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXREZWxldGVkQm9keSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPExvYWRlciAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmVycm9yIHx8IHRoaXMuc3RhdGUuaXNEZWxldGVkKSB7XG4gICAgICByZXR1cm4gXCJtb2RhbC1kaWFsb2cgbW9kYWwtbWVzc2FnZSBtb2RhbC1kZWxldGUtYWNjb3VudFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJtb2RhbC1kaWFsb2cgbW9kYWwtZGVsZXRlLWFjY291bnRcIjtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzc05hbWUoKX1cbiAgICAgICAgICAgICAgICByb2xlPVwiZG9jdW1lbnRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17Z2V0dGV4dChcIkNsb3NlXCIpfT5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGg0IGNsYXNzTmFtZT1cIm1vZGFsLXRpdGxlXCI+e2dldHRleHQoXCJEZWxldGUgdXNlciBhY2NvdW50XCIpfTwvaDQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7dGhpcy5nZXRNb2RhbEJvZHkoKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEF2YXRhckNvbnRyb2xzIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3Byb2ZpbGUvbW9kZXJhdGlvbi9hdmF0YXItY29udHJvbHMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBDaGFuZ2VVc2VybmFtZSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL21vZGVyYXRpb24vY2hhbmdlLXVzZXJuYW1lJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRGVsZXRlQWNjb3VudCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL21vZGVyYXRpb24vZGVsZXRlLWFjY291bnQnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtb2RhbCBmcm9tICdtaXNhZ28vc2VydmljZXMvbW9kYWwnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xubGV0IHNlbGVjdCA9IGZ1bmN0aW9uKHN0b3JlKSB7XG4gIHJldHVybiB7XG4gICAgdGljazogc3RvcmUudGljayxcbiAgICB1c2VyOiBzdG9yZS5hdXRoLFxuICAgIHByb2ZpbGU6IHN0b3JlLnByb2ZpbGUsXG4gIH07XG59O1xuLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIHNob3dBdmF0YXJEaWFsb2cgPSAoKSA9PiB7XG4gICAgbW9kYWwuc2hvdyhjb25uZWN0KHNlbGVjdCkoQXZhdGFyQ29udHJvbHMpKTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBnZXRBdmF0YXJCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5hY2wuY2FuX21vZGVyYXRlX2F2YXRhcikge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaT5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuLWxpbmtcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2hvd0F2YXRhckRpYWxvZ30+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgcG9ydHJhaXRcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2dldHRleHQoXCJBdmF0YXIgY29udHJvbHNcIil9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgc2hvd1JlbmFtZURpYWxvZyA9ICgpID0+IHtcbiAgICBtb2RhbC5zaG93KGNvbm5lY3Qoc2VsZWN0KShDaGFuZ2VVc2VybmFtZSkpO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGdldFJlbmFtZUJ1dHRvbigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5wcm9maWxlLmFjbC5jYW5fcmVuYW1lKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGxpPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4tbGlua1wiXG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5zaG93UmVuYW1lRGlhbG9nfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICBjcmVkaXRfY2FyZFxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB7Z2V0dGV4dChcIkNoYW5nZSB1c2VybmFtZVwiKX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBzaG93RGVsZXRlRGlhbG9nID0gKCkgPT4ge1xuICAgIG1vZGFsLnNob3coY29ubmVjdChzZWxlY3QpKERlbGV0ZUFjY291bnQpKTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBnZXREZWxldGVCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5hY2wuY2FuX2RlbGV0ZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaT5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuLWxpbmtcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2hvd0RlbGV0ZURpYWxvZ30+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgY2xlYXJcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2dldHRleHQoXCJEZWxldGUgYWNjb3VudFwiKX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPHVsIGNsYXNzTmFtZT1cImRyb3Bkb3duLW1lbnUgZHJvcGRvd24tbWVudS1yaWdodFwiIHJvbGU9XCJtZW51XCI+XG4gICAgICB7dGhpcy5nZXRBdmF0YXJCdXR0b24oKX1cbiAgICAgIHt0aGlzLmdldFJlbmFtZUJ1dHRvbigpfVxuICAgICAge3RoaXMuZ2V0RGVsZXRlQnV0dG9uKCl9XG4gICAgICA8bGkgY2xhc3NOYW1lPVwiZGl2aWRlciBoaWRkZW4tbWQgaGlkZGVuLWxnXCIgLz5cbiAgICAgIDxsaSBjbGFzc05hbWU9XCJkcm9wZG93bi1idXR0b25zIGhpZGRlbi1tZCBoaWRkZW4tbGdcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5wcm9wcy50b2dnbGVOYXZ9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgIG1lbnVcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2dldHRleHQoXCJNZW51XCIpfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgPC91bD47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBMaW5rIH0gZnJvbSAncmVhY3Qtcm91dGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTGkgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbGknOyAvL2pzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvbGxvd0J1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL2ZvbGxvdy1idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JzsgLy9qc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGNsYXNzIFNpZGVOYXYgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRNZXRhKG1ldGEpIHtcbiAgICBpZiAobWV0YSkge1xuICAgICAgLy8ganNoaW50IGlnbm9yZTpzdGFydFxuICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cImJhZGdlXCI+e3RoaXMucHJvcHMucHJvZmlsZVttZXRhLmF0dHJdfTwvc3Bhbj47XG4gICAgICAvLyBqc2hpbnQgaWdub3JlOmVuZFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLy8ganNoaW50IGlnbm9yZTpzdGFydFxuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImxpc3QtZ3JvdXAgbmF2LXNpZGVcIj5cbiAgICAgIHt0aGlzLnByb3BzLnBhZ2VzLm1hcCgocGFnZSkgPT4ge1xuICAgICAgICByZXR1cm4gPExpbmsgdG89e3RoaXMucHJvcHMuYmFzZVVybCArIHBhZ2UuY29tcG9uZW50ICsgJy8nfVxuICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibGlzdC1ncm91cC1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUNsYXNzTmFtZT1cImFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICBrZXk9e3BhZ2UuY29tcG9uZW50fT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICB7cGFnZS5pY29ufVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB7cGFnZS5uYW1lfVxuICAgICAgICAgIHt0aGlzLmdldE1ldGEocGFnZS5tZXRhKX1cbiAgICAgICAgPC9MaW5rPjtcbiAgICAgIH0pfVxuICAgIDwvZGl2PjtcbiAgICAvLyBqc2hpbnQgaWdub3JlOmVuZFxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wYWN0TmF2IGV4dGVuZHMgU2lkZU5hdiB7XG4gIHNob3dTcGVjaWFsT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5wcm9maWxlLmFjbC5jYW5fZm9sbG93IHx8IHRoaXMucHJvcHMucHJvZmlsZS5hY2wuY2FuX21vZGVyYXRlO1xuICB9XG5cbiAgZ2V0Rm9sbG93QnV0dG9uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByb2ZpbGUuYWNsLmNhbl9mb2xsb3cpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8Rm9sbG93QnV0dG9uIGNsYXNzTmFtZT1cImJ0biBidG4tYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZT17dGhpcy5wcm9wcy5wcm9maWxlfSAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldE1vZGVyYXRpb25CdXR0b24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJvZmlsZS5hY2wuY2FuX21vZGVyYXRlKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnByb3BzLnRvZ2dsZU1vZGVyYXRpb259PlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgdG9uYWxpdHlcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICB7Z2V0dGV4dChcIk1vZGVyYXRpb25cIil9XG4gICAgICA8L2J1dHRvbj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRTcGVjaWFsT3B0aW9ucygpIHtcbiAgICBpZiAodGhpcy5zaG93U3BlY2lhbE9wdGlvbnMoKSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9XCJkcm9wZG93bi1idXR0b25zXCI+XG4gICAgICAgIHt0aGlzLmdldEZvbGxvd0J1dHRvbigpfVxuICAgICAgICB7dGhpcy5nZXRNb2RlcmF0aW9uQnV0dG9uKCl9XG4gICAgICA8L2xpPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvLyBqc2hpbnQgaWdub3JlOnN0YXJ0XG4gICAgcmV0dXJuIDx1bCBjbGFzc05hbWU9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgIHt0aGlzLmdldFNwZWNpYWxPcHRpb25zKCl9XG4gICAgICB7dGhpcy5zaG93U3BlY2lhbE9wdGlvbnMoKSA/IDxsaSBjbGFzc05hbWU9XCJkaXZpZGVyXCIgLz4gOiBudWxsfVxuICAgICAge3RoaXMucHJvcHMucGFnZXMubWFwKChwYWdlKSA9PiB7XG4gICAgICAgIHJldHVybiA8TGkgcGF0aD17dGhpcy5wcm9wcy5iYXNlVXJsICsgcGFnZS5jb21wb25lbnQgKyAnLyd9XG4gICAgICAgICAgICAgICAgICAga2V5PXtwYWdlLmNvbXBvbmVudH0+XG4gICAgICAgICAgPExpbmsgdG89e3RoaXMucHJvcHMuYmFzZVVybCArIHBhZ2UuY29tcG9uZW50ICsgJy8nfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuaGlkZU5hdn0+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICAgIHtwYWdlLmljb259XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICB7cGFnZS5uYW1lfVxuICAgICAgICAgICAge3RoaXMuZ2V0TWV0YShwYWdlLm1ldGEpfVxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgPC9MaT47XG4gICAgICB9KX1cbiAgICA8L3VsPjtcbiAgICAvLyBqc2hpbnQgaWdub3JlOmVuZFxuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgQXZhdGFyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2F2YXRhcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEJhbkRldGFpbHMgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9iYW4tZGV0YWlscyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvbGxvd2VycyBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL2ZvbGxvd2Vycyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvbGxvd3MgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9mb2xsb3dzJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgVXNlcm5hbWVIaXN0b3J5IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3Byb2ZpbGUvdXNlcm5hbWUtaGlzdG9yeSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEhlYWRlciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wcm9maWxlL0hlYWRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IE1vZGVyYXRpb25OYXYgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcHJvZmlsZS9tb2RlcmF0aW9uL25hdic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHsgU2lkZU5hdiwgQ29tcGFjdE5hdiB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3Byb2ZpbGUvbmF2cyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgZGVoeWRyYXRlIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3Byb2ZpbGUnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBwb2xscyBmcm9tICdtaXNhZ28vc2VydmljZXMvcG9sbHMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGRyb3Bkb3duOiBmYWxzZVxuICAgIH07XG5cbiAgICB0aGlzLnN0YXJ0UG9sbGluZyhwcm9wcy5wcm9maWxlLmFwaV91cmwucm9vdCk7XG4gIH1cblxuICBzdGFydFBvbGxpbmcoYXBpKSB7XG4gICAgcG9sbHMuc3RhcnQoe1xuICAgICAgcG9sbDogJ3VzZXItcHJvZmlsZScsXG4gICAgICB1cmw6IGFwaSxcbiAgICAgIGZyZXF1ZW5jeTogOTAgKiAxMDAwLFxuICAgICAgdXBkYXRlOiB0aGlzLnVwZGF0ZVxuICAgIH0pO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICB1cGRhdGUgPSAoZGF0YSkgPT4ge1xuICAgIHN0b3JlLmRpc3BhdGNoKGRlaHlkcmF0ZShkYXRhKSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICB0b2dnbGVOYXYgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24gPT09ICdwYWdlcycpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcm9wZG93bjogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJvcGRvd246ICdwYWdlcydcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0b2dnbGVNb2RlcmF0aW9uID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmRyb3Bkb3duID09PSAnbW9kZXJhdGlvbicpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcm9wZG93bjogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJvcGRvd246ICdtb2RlcmF0aW9uJ1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGhpZGVOYXYgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkcm9wZG93bjogZmFsc2VcbiAgICB9KTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBnZXRUb2dnbGVOYXZDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24pIHtcbiAgICAgIHJldHVybiAnYnRuIGJ0bi1kZWZhdWx0IGJ0bi1pY29uIG9wZW4nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2J0biBidG4tZGVmYXVsdCBidG4taWNvbic7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29tcGFjdE5hdkNsYXNzTmFtZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5kcm9wZG93bikge1xuICAgICAgcmV0dXJuICdjb21wYWN0LW5hdiBvcGVuJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdjb21wYWN0LW5hdic7XG4gICAgfVxuICB9XG5cbiAgZ2V0TmF2RHJvcGRvd24oKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24gPT09ICdwYWdlcycpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8Q29tcGFjdE5hdiBwYWdlcz17bWlzYWdvLmdldCgnUFJPRklMRV9QQUdFUycpfVxuICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VVcmw9e21pc2Fnby5nZXQoJ1BST0ZJTEUnKS5hYnNvbHV0ZV91cmx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZT17dGhpcy5wcm9wcy5wcm9maWxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZU1vZGVyYXRpb249e3RoaXMudG9nZ2xlTW9kZXJhdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlTmF2PXt0aGlzLmhpZGVOYXZ9IC8+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24gPT09ICdtb2RlcmF0aW9uJykge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxNb2RlcmF0aW9uTmF2IHByb2ZpbGU9e3RoaXMucHJvcHMucHJvZmlsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVOYXY9e3RoaXMudG9nZ2xlTmF2fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVOYXY9e3RoaXMuaGlkZU5hdn0gLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgY29uc3QgYmFzZUNsYXNzID0gJ3BhZ2UgcGFnZS11c2VyLXByb2ZpbGUnO1xuICAgIGlmIChmYWxzZSAmJiB0aGlzLnByb3BzLnByb2ZpbGUucmFuay5jc3NfY2xhc3MpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xhc3MgKyAnIHBhZ2UtdXNlci1wcm9maWxlLScgKyB0aGlzLnByb3BzLnByb2ZpbGUucmFuay5jc3NfY2xhc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBiYXNlQ2xhc3M7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3NOYW1lKCl9PlxuXG4gICAgICA8SGVhZGVyIHVzZXI9e3RoaXMucHJvcHMudXNlcn1cbiAgICAgICAgICAgICAgcHJvZmlsZT17dGhpcy5wcm9wcy5wcm9maWxlfVxuICAgICAgICAgICAgICB0b2dnbGVOYXY9e3RoaXMudG9nZ2xlTmF2fVxuICAgICAgICAgICAgICB0b2dnbGVNb2RlcmF0aW9uPXt0aGlzLnRvZ2dsZU1vZGVyYXRpb259IC8+XG5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENvbXBhY3ROYXZDbGFzc05hbWUoKX0+XG4gICAgICAgIHt0aGlzLmdldE5hdkRyb3Bkb3duKCl9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC0zIGhpZGRlbi14cyBoaWRkZW4tc21cIj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwcm9maWxlLXNpZGUtYXZhdGFyXCI+XG4gICAgICAgICAgICAgIDxBdmF0YXIgdXNlcj17dGhpcy5wcm9wcy5wcm9maWxlfSBzaXplPVwiNDAwXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8U2lkZU5hdiBwYWdlcz17bWlzYWdvLmdldCgnUFJPRklMRV9QQUdFUycpfVxuICAgICAgICAgICAgICAgICAgICAgYmFzZVVybD17bWlzYWdvLmdldCgnUFJPRklMRScpLmFic29sdXRlX3VybH1cbiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGU9e3RoaXMucHJvcHMucHJvZmlsZX0gLz5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLW1kLTlcIj5cblxuICAgICAgICAgICAge3RoaXMucHJvcHMuY2hpbGRyZW59XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Qoc3RvcmUpIHtcbiAgcmV0dXJuIHtcbiAgICAndGljayc6IHN0b3JlLnRpY2sudGljayxcbiAgICAndXNlcic6IHN0b3JlLmF1dGgudXNlcixcbiAgICAndXNlcnMnOiBzdG9yZS51c2VycyxcbiAgICAncHJvZmlsZSc6IHN0b3JlLnByb2ZpbGUsXG4gICAgJ3VzZXJuYW1lLWhpc3RvcnknOiBzdG9yZVsndXNlcm5hbWUtaGlzdG9yeSddXG4gIH07XG59XG5cbmNsYXNzIFBsYWNlaG9sZGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8vIGpzaGludCBpZ25vcmU6c3RhcnRcbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXJcIj5cbiAgICAgIDxwPntcIkhlbGxvLCBJJ20gcGxhY2Vob2xkZXIgZm9yIFwiICsgdGhpcy5wcm9wcy5yb3V0ZS5uYW1lfTwvcD5cbiAgICA8L2Rpdj47XG4gICAgLy8ganNoaW50IGlnbm9yZTplbmRcbiAgfVxufVxuXG5jb25zdCBDT01QT05FTlRTID0ge1xuICAncG9zdHMnOiBQbGFjZWhvbGRlcixcbiAgJ3RocmVhZHMnOiBQbGFjZWhvbGRlcixcbiAgJ2ZvbGxvd2Vycyc6IEZvbGxvd2VycyxcbiAgJ2ZvbGxvd3MnOiBGb2xsb3dzLFxuICAndXNlcm5hbWUtaGlzdG9yeSc6IFVzZXJuYW1lSGlzdG9yeSxcbiAgJ2Jhbi1kZXRhaWxzJzogQmFuRGV0YWlsc1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhzKCkge1xuICBsZXQgcGF0aHMgPSBbXTtcblxuICBtaXNhZ28uZ2V0KCdQUk9GSUxFX1BBR0VTJykuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XG4gICAgcGF0aHMucHVzaChPYmplY3QuYXNzaWduKHt9LCBpdGVtLCB7XG4gICAgICBwYXRoOiBtaXNhZ28uZ2V0KCdQUk9GSUxFJykuYWJzb2x1dGVfdXJsICsgaXRlbS5jb21wb25lbnQgKyAnLycsXG4gICAgICBjb21wb25lbnQ6IGNvbm5lY3Qoc2VsZWN0KShDT01QT05FTlRTW2l0ZW0uY29tcG9uZW50XSksXG4gICAgfSkpO1xuICB9KTtcblxuICByZXR1cm4gcGF0aHM7XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBTZWFyY2ggZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvc2VhcmNoJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgVXNlcm5hbWVIaXN0b3J5IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJuYW1lLWhpc3RvcnknOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCB7IGRlaHlkcmF0ZSwgYXBwZW5kIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJuYW1lLWhpc3RvcnknOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5pbXBvcnQgdGl0bGUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BhZ2UtdGl0bGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgaWYgKG1pc2Fnby5oYXMoJ1BST0ZJTEVfTkFNRV9ISVNUT1JZJykpIHtcbiAgICAgIHRoaXMuaW5pdFdpdGhQcmVsb2FkZWREYXRhKG1pc2Fnby5wb3AoJ1BST0ZJTEVfTkFNRV9ISVNUT1JZJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluaXRXaXRob3V0UHJlbG9hZGVkRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRXaXRoUHJlbG9hZGVkRGF0YShkYXRhKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTG9hZGVkOiB0cnVlLFxuICAgICAgaXNCdXN5OiBmYWxzZSxcblxuICAgICAgc2VhcmNoOiAnJyxcblxuICAgICAgY291bnQ6IGRhdGEuY291bnQsXG4gICAgICBtb3JlOiBkYXRhLm1vcmUsXG5cbiAgICAgIHBhZ2U6IGRhdGEucGFnZSxcbiAgICAgIHBhZ2VzOiBkYXRhLnBhZ2VzXG4gICAgfTtcblxuICAgIHN0b3JlLmRpc3BhdGNoKGRlaHlkcmF0ZShkYXRhLnJlc3VsdHMpKTtcbiAgfVxuXG4gIGluaXRXaXRob3V0UHJlbG9hZGVkRGF0YSgpIHtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNMb2FkZWQ6IGZhbHNlLFxuICAgICAgaXNCdXN5OiBmYWxzZSxcblxuICAgICAgc2VhcmNoOiAnJyxcblxuICAgICAgY291bnQ6IDAsXG4gICAgICBtb3JlOiAwLFxuXG4gICAgICBwYWdlOiAxLFxuICAgICAgcGFnZXM6IDFcbiAgICB9O1xuXG4gICAgdGhpcy5sb2FkQ2hhbmdlcygpO1xuICB9XG5cbiAgbG9hZENoYW5nZXMocGFnZT0xLCBzZWFyY2g9bnVsbCkge1xuICAgIGFqYXguZ2V0KG1pc2Fnby5nZXQoJ1VTRVJOQU1FX0NIQU5HRVNfQVBJJyksIHtcbiAgICAgIHVzZXI6IHRoaXMucHJvcHMucHJvZmlsZS5pZCxcbiAgICAgIHNlYXJjaDogc2VhcmNoLFxuICAgICAgcGFnZTogcGFnZSB8fCAxXG4gICAgfSwgJ3NlYXJjaC11c2VybmFtZS1oaXN0b3J5JykudGhlbigoZGF0YSkgPT4ge1xuICAgICAgaWYgKHBhZ2UgPT09IDEpIHtcbiAgICAgICAgc3RvcmUuZGlzcGF0Y2goZGVoeWRyYXRlKGRhdGEucmVzdWx0cykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RvcmUuZGlzcGF0Y2goYXBwZW5kKGRhdGEucmVzdWx0cykpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkZWQ6IHRydWUsXG4gICAgICAgIGlzQnVzeTogZmFsc2UsXG5cbiAgICAgICAgY291bnQ6IGRhdGEuY291bnQsXG4gICAgICAgIG1vcmU6IGRhdGEubW9yZSxcblxuICAgICAgICBwYWdlOiBkYXRhLnBhZ2UsXG4gICAgICAgIHBhZ2VzOiBkYXRhLnBhZ2VzXG4gICAgICB9KTtcbiAgICB9LCAocmVqZWN0aW9uKSA9PiB7XG4gICAgICBzbmFja2Jhci5hcGlFcnJvcihyZWplY3Rpb24pO1xuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGl0bGUuc2V0KHtcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KFwiVXNlcm5hbWUgaGlzdG9yeVwiKSxcbiAgICAgIHBhcmVudDogdGhpcy5wcm9wcy5wcm9maWxlLnVzZXJuYW1lXG4gICAgfSk7XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGxvYWRNb3JlID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgaXNCdXN5OiB0cnVlXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvYWRDaGFuZ2VzKHRoaXMuc3RhdGUucGFnZSArIDEsIHRoaXMuc3RhdGUuc2VhcmNoKTtcbiAgfTtcblxuICBzZWFyY2ggPSAoZXYpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGlzTG9hZGVkOiBmYWxzZSxcbiAgICAgIGlzQnVzeTogdHJ1ZSxcblxuICAgICAgc2VhcmNoOiBldi50YXJnZXQudmFsdWUsXG5cbiAgICAgIGNvdW50OiAwLFxuICAgICAgbW9yZTogMCxcblxuICAgICAgcGFnZTogMSxcbiAgICAgIHBhZ2VzOiAxXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvYWRDaGFuZ2VzKDEsIGV2LnRhcmdldC52YWx1ZSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgZ2V0TGFiZWwoKSB7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmlzTG9hZGVkKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dCgnTG9hZGluZy4uLicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5zZWFyY2gpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gbmdldHRleHQoXG4gICAgICAgIFwiRm91bmQgJShjaGFuZ2VzKXMgdXNlcm5hbWUgY2hhbmdlLlwiLFxuICAgICAgICBcIkZvdW5kICUoY2hhbmdlcylzIHVzZXJuYW1lIGNoYW5nZXMuXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuY291bnQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAnY2hhbmdlcyc6IHRoaXMuc3RhdGUuY291bnRcbiAgICAgIH0sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5wcm9maWxlLmlkID09PSB0aGlzLnByb3BzLnVzZXIuaWQpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gbmdldHRleHQoXG4gICAgICAgIFwiWW91ciB1c2VybmFtZSB3YXMgY2hhbmdlZCAlKGNoYW5nZXMpcyB0aW1lLlwiLFxuICAgICAgICBcIllvdXIgdXNlcm5hbWUgd2FzIGNoYW5nZWQgJShjaGFuZ2VzKXMgdGltZXMuXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuY291bnQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAnY2hhbmdlcyc6IHRoaXMuc3RhdGUuY291bnRcbiAgICAgIH0sIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IG5nZXR0ZXh0KFxuICAgICAgICBcIiUodXNlcm5hbWUpcydzIHVzZXJuYW1lIHdhcyBjaGFuZ2VkICUoY2hhbmdlcylzIHRpbWUuXCIsXG4gICAgICAgIFwiJSh1c2VybmFtZSlzJ3MgdXNlcm5hbWUgd2FzIGNoYW5nZWQgJShjaGFuZ2VzKXMgdGltZXMuXCIsXG4gICAgICAgIHRoaXMuc3RhdGUuY291bnQpO1xuXG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgICAndXNlcm5hbWUnOiB0aGlzLnByb3BzLnByb2ZpbGUudXNlcm5hbWUsXG4gICAgICAgICdjaGFuZ2VzJzogdGhpcy5zdGF0ZS5jb3VudFxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RW1wdHlNZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLnNlYXJjaCkge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJTZWFyY2ggcmV0dXJuZWQgbm8gdXNlcm5hbWUgY2hhbmdlcyBtYXRjaGluZyBzcGVjaWZpZWQgY3JpdGVyaWEuXCIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy51c2VyLmlkID09PSB0aGlzLnByb3BzLnByb2ZpbGUuaWQpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiTm8gbmFtZSBjaGFuZ2VzIGhhdmUgYmVlbiByZWNvcmRlZCBmb3IgeW91ciBhY2NvdW50LlwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMncyB1c2VybmFtZSB3YXMgbmV2ZXIgY2hhbmdlZC5cIiksIHtcbiAgICAgICAgJ3VzZXJuYW1lJzogdGhpcy5wcm9wcy5wcm9maWxlLnVzZXJuYW1lXG4gICAgICB9LCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRNb3JlQnV0dG9uKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLm1vcmUpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhZ2VyLW1vcmVcIj5cbiAgICAgICAgPEJ1dHRvbiBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzQnVzeX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmxvYWRNb3JlfT5cbiAgICAgICAgICB7aW50ZXJwb2xhdGUoZ2V0dGV4dChcIlNob3cgb2xkZXIgKCUobW9yZSlzKVwiKSwge1xuICAgICAgICAgICAgJ21vcmUnOiB0aGlzLnN0YXRlLm1vcmVcbiAgICAgICAgICB9LCB0cnVlKX1cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L2Rpdj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInByb2ZpbGUtdXNlcm5hbWUtaGlzdG9yeVwiPlxuXG4gICAgICA8bmF2IGNsYXNzTmFtZT1cInRvb2xiYXJcIj5cbiAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRvb2xiYXItbGVmdFwiPlxuICAgICAgICAgIHt0aGlzLmdldExhYmVsKCl9XG4gICAgICAgIDwvaDM+XG5cbiAgICAgICAgPFNlYXJjaCBjbGFzc05hbWU9XCJ0b29sYmFyLXJpZ2h0XCJcbiAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5zZWFyY2h9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuc2VhcmNofVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtnZXR0ZXh0KFwiU2VhcmNoIGhpc3RvcnkuLi5cIil9IC8+XG4gICAgICA8L25hdj5cblxuICAgICAgPFVzZXJuYW1lSGlzdG9yeSBpc0xvYWRlZD17dGhpcy5zdGF0ZS5pc0xvYWRlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlNZXNzYWdlPXt0aGlzLmdldEVtcHR5TWVzc2FnZSgpfVxuICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzPXt0aGlzLnByb3BzWyd1c2VybmFtZS1oaXN0b3J5J119IC8+XG5cbiAgICAgIHt0aGlzLmdldE1vcmVCdXR0b24oKX1cblxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBMb2FkZXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbG9hZGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgUmVnaXN0ZXJNb2RhbCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9yZWdpc3Rlci5qcyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGNhcHRjaGEgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2NhcHRjaGEnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtb2RhbCBmcm9tICdtaXNhZ28vc2VydmljZXMvbW9kYWwnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCB6eGN2Ym4gZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3p4Y3Zibic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICdpc0xvYWRpbmcnOiBmYWxzZSxcbiAgICAgICdpc0xvYWRlZCc6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgc2hvd1JlZ2lzdGVyTW9kYWwgPSAoKSA9PiB7XG4gICAgaWYgKG1pc2Fnby5nZXQoJ1NFVFRJTkdTJykuYWNjb3VudF9hY3RpdmF0aW9uID09PSAnY2xvc2VkJykge1xuICAgICAgc25hY2tiYXIuaW5mbyhnZXR0ZXh0KFwiTmV3IHJlZ2lzdHJhdGlvbnMgYXJlIGN1cnJlbnRseSBkaXNhYmxlZC5cIikpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5pc0xvYWRlZCkge1xuICAgICAgbW9kYWwuc2hvdyhSZWdpc3Rlck1vZGFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICdpc0xvYWRpbmcnOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICBjYXB0Y2hhLmxvYWQoKSxcbiAgICAgICAgenhjdmJuLmxvYWQoKVxuICAgICAgXSkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5pc0xvYWRlZCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlLFxuICAgICAgICAgICAgJ2lzTG9hZGVkJzogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vZGFsLnNob3coUmVnaXN0ZXJNb2RhbCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmNsYXNzTmFtZSArICh0aGlzLnN0YXRlLmlzTG9hZGluZyA/ICcgYnRuLWxvYWRpbmcnIDogJycpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17dGhpcy5zaG93UmVnaXN0ZXJNb2RhbH1cbiAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9eydidG4gJyArIHRoaXMuZ2V0Q2xhc3NOYW1lKCl9XG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkZWR9PlxuICAgICAge2dldHRleHQoXCJSZWdpc3RlclwiKX1cbiAgICAgIHt0aGlzLnN0YXRlLmlzTG9hZGluZyA/IDxMb2FkZXIgLz4gOiBudWxsIH1cbiAgICA8L2J1dHRvbj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtJztcbmltcG9ydCBGb3JtR3JvdXAgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybS1ncm91cCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFBhc3N3b3JkU3RyZW5ndGggZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcGFzc3dvcmQtc3RyZW5ndGgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBhdXRoIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hdXRoJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgY2FwdGNoYSBmcm9tICdtaXNhZ28vc2VydmljZXMvY2FwdGNoYSc7XG5pbXBvcnQgbW9kYWwgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vZGFsJztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0IHNob3dCYW5uZWRQYWdlIGZyb20gJ21pc2Fnby91dGlscy9iYW5uZWQtcGFnZSc7XG5pbXBvcnQgKiBhcyB2YWxpZGF0b3JzIGZyb20gJ21pc2Fnby91dGlscy92YWxpZGF0b3JzJztcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdGVyRm9ybSBleHRlbmRzIEZvcm0ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuXG4gICAgICB1c2VybmFtZTogJycsXG4gICAgICBlbWFpbDogJycsXG4gICAgICBwYXNzd29yZDogJycsXG4gICAgICBjYXB0Y2hhOiAnJyxcblxuICAgICAgdmFsaWRhdG9yczoge1xuICAgICAgICB1c2VybmFtZTogW1xuICAgICAgICAgIHZhbGlkYXRvcnMudXNlcm5hbWVDb250ZW50KCksXG4gICAgICAgICAgdmFsaWRhdG9ycy51c2VybmFtZU1pbkxlbmd0aChtaXNhZ28uZ2V0KCdTRVRUSU5HUycpKSxcbiAgICAgICAgICB2YWxpZGF0b3JzLnVzZXJuYW1lTWF4TGVuZ3RoKG1pc2Fnby5nZXQoJ1NFVFRJTkdTJykpXG4gICAgICAgIF0sXG4gICAgICAgIGVtYWlsOiBbXG4gICAgICAgICAgdmFsaWRhdG9ycy5lbWFpbCgpXG4gICAgICAgIF0sXG4gICAgICAgIHBhc3N3b3JkOiBbXG4gICAgICAgICAgdmFsaWRhdG9ycy5wYXNzd29yZE1pbkxlbmd0aChtaXNhZ28uZ2V0KCdTRVRUSU5HUycpKVxuICAgICAgICBdLFxuICAgICAgICBjYXB0Y2hhOiBjYXB0Y2hhLnZhbGlkYXRvcigpXG4gICAgICB9LFxuXG4gICAgICBlcnJvcnM6IHt9XG4gICAgfTtcbiAgfVxuXG4gIGNsZWFuKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmVycm9yKGdldHRleHQoXCJGb3JtIGNvbnRhaW5zIGVycm9ycy5cIikpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGVycm9yczogdGhpcy52YWxpZGF0ZSgpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBhamF4LnBvc3QobWlzYWdvLmdldCgnVVNFUlNfQVBJJyksIHtcbiAgICAgIHVzZXJuYW1lOiB0aGlzLnN0YXRlLnVzZXJuYW1lLFxuICAgICAgZW1haWw6IHRoaXMuc3RhdGUuZW1haWwsXG4gICAgICBwYXNzd29yZDogdGhpcy5zdGF0ZS5wYXNzd29yZCxcbiAgICAgIGNhcHRjaGE6IHRoaXMuc3RhdGUuY2FwdGNoYVxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU3VjY2VzcyhhcGlSZXNwb25zZSkge1xuICAgIHRoaXMucHJvcHMuY2FsbGJhY2soYXBpUmVzcG9uc2UpO1xuICB9XG5cbiAgaGFuZGxlRXJyb3IocmVqZWN0aW9uKSB7XG4gICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICdlcnJvcnMnOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLmVycm9ycywgcmVqZWN0aW9uKVxuICAgICAgfSk7XG4gICAgICBzbmFja2Jhci5lcnJvcihnZXR0ZXh0KFwiRm9ybSBjb250YWlucyBlcnJvcnMuXCIpKTtcbiAgICB9IGVsc2UgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMyAmJiByZWplY3Rpb24uYmFuKSB7XG4gICAgICBzaG93QmFubmVkUGFnZShyZWplY3Rpb24uYmFuKTtcbiAgICAgIG1vZGFsLmhpZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXIuYXBpRXJyb3IocmVqZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBnZXRMZWdhbEZvb3ROb3RlKCkge1xuICAgIGlmIChtaXNhZ28uZ2V0KCdURVJNU19PRl9TRVJWSUNFX1VSTCcpKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGEgaHJlZj17bWlzYWdvLmdldCgnVEVSTVNfT0ZfU0VSVklDRV9VUkwnKX1cbiAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgICAge2dldHRleHQoXCJCeSByZWdpc3RlcmluZyB5b3UgYWdyZWUgdG8gc2l0ZSdzIHRlcm1zIGFuZCBjb25kaXRpb25zLlwiKX1cbiAgICAgIDwvYT47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWRpYWxvZyBtb2RhbC1yZWdpc3RlclwiIHJvbGU9XCJkb2N1bWVudFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtnZXR0ZXh0KFwiQ2xvc2VcIil9PlxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwibW9kYWwtdGl0bGVcIj57Z2V0dGV4dChcIlJlZ2lzdGVyXCIpfTwvaDQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9IGNsYXNzTmFtZT1cImZvcm0taG9yaXpvbnRhbFwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidHlwZVwiIHN0eWxlPXt7ZGlzcGxheTogJ25vbmUnfX0gLz5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgc3R5bGU9e3tkaXNwbGF5OiAnbm9uZSd9fSAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keVwiPlxuXG4gICAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiVXNlcm5hbWVcIil9IGZvcj1cImlkX3VzZXJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcz1cImNvbC1zbS00XCIgY29udHJvbENsYXNzPVwiY29sLXNtLThcIlxuICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uPXt0aGlzLnN0YXRlLmVycm9ycy51c2VybmFtZX0+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaWRfdXNlcm5hbWVcIiBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cImlkX3VzZXJuYW1lX3N0YXR1c1wiXG4gICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3VzZXJuYW1lJyl9XG4gICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS51c2VybmFtZX0gLz5cbiAgICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgICAgICA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiRS1tYWlsXCIpfSBmb3I9XCJpZF9lbWFpbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJjb2wtc20tNFwiIGNvbnRyb2xDbGFzcz1cImNvbC1zbS04XCJcbiAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbj17dGhpcy5zdGF0ZS5lcnJvcnMuZW1haWx9PlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImlkX2VtYWlsXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJpZF9lbWFpbF9zdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdlbWFpbCcpfVxuICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuZW1haWx9IC8+XG4gICAgICAgICAgICA8L0Zvcm1Hcm91cD5cblxuICAgICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIlBhc3N3b3JkXCIpfSBmb3I9XCJpZF9wYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJjb2wtc20tNFwiIGNvbnRyb2xDbGFzcz1cImNvbC1zbS04XCJcbiAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbj17dGhpcy5zdGF0ZS5lcnJvcnMucGFzc3dvcmR9XG4gICAgICAgICAgICAgICAgICAgICAgIGV4dHJhPXs8UGFzc3dvcmRTdHJlbmd0aCBwYXNzd29yZD17dGhpcy5zdGF0ZS5wYXNzd29yZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cz17W1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnVzZXJuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVtYWlsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdfSAvPn0gPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCJpZF9wYXNzd29yZFwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiaWRfcGFzc3dvcmRfc3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgncGFzc3dvcmQnKX1cbiAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnBhc3N3b3JkfSAvPlxuICAgICAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgICAgICAgIHtjYXB0Y2hhLmNvbXBvbmVudCh7XG4gICAgICAgICAgICAgIGZvcm06IHRoaXMsXG4gICAgICAgICAgICAgIGxhYmVsQ2xhc3M6IFwiY29sLXNtLTRcIixcbiAgICAgICAgICAgICAgY29udHJvbENsYXNzOiBcImNvbC1zbS04XCJcbiAgICAgICAgICAgIH0pfVxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICAgIHt0aGlzLmdldExlZ2FsRm9vdE5vdGUoKX1cbiAgICAgICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwiYnRuLXByaW1hcnlcIiBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzTG9hZGluZ30+XG4gICAgICAgICAgICAgIHtnZXR0ZXh0KFwiUmVnaXN0ZXIgYWNjb3VudFwiKX1cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Zvcm0+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVnaXN0ZXJDb21wbGV0ZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldExlYWQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuYWN0aXZhdGlvbiA9PT0gJ3VzZXInKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIiUodXNlcm5hbWUpcywgeW91ciBhY2NvdW50IGhhcyBiZWVuIGNyZWF0ZWQgYnV0IHlvdSBuZWVkIHRvIGFjdGl2YXRlIGl0IGJlZm9yZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNpZ24gaW4uXCIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5hY3RpdmF0aW9uID09PSAnYWRtaW4nKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIiUodXNlcm5hbWUpcywgeW91ciBhY2NvdW50IGhhcyBiZWVuIGNyZWF0ZWQgYnV0IGJvYXJkIGFkbWluaXN0cmF0b3Igd2lsbCBoYXZlIHRvIGFjdGl2YXRlIGl0IGJlZm9yZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNpZ24gaW4uXCIpO1xuICAgIH1cbiAgfVxuXG4gIGdldFN1YnNjcmlwdCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5hY3RpdmF0aW9uID09PSAndXNlcicpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiV2UgaGF2ZSBzZW50IGFuIGUtbWFpbCB0byAlKGVtYWlsKXMgd2l0aCBsaW5rIHRoYXQgeW91IGhhdmUgdG8gY2xpY2sgdG8gYWN0aXZhdGUgeW91ciBhY2NvdW50LlwiKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuYWN0aXZhdGlvbiA9PT0gJ2FkbWluJykge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJXZSB3aWxsIHNlbmQgYW4gZS1tYWlsIHRvICUoZW1haWwpcyB3aGVuIHRoaXMgdGFrZXMgcGxhY2UuXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtZGlhbG9nIG1vZGFsLW1lc3NhZ2UgbW9kYWwtcmVnaXN0ZXJcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJkb2N1bWVudFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtnZXR0ZXh0KFwiQ2xvc2VcIil9PlxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwibW9kYWwtdGl0bGVcIj57Z2V0dGV4dChcIlJlZ2lzdHJhdGlvbiBjb21wbGV0ZVwiKX08L2g0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWljb25cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgICAgaW5mb19vdXRsaW5lXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWJvZHlcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImxlYWRcIj5cbiAgICAgICAgICAgICAge2ludGVycG9sYXRlKFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0TGVhZCgpLFxuICAgICAgICAgICAgICAgIHsndXNlcm5hbWUnOiB0aGlzLnByb3BzLnVzZXJuYW1lfSwgdHJ1ZSl9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAge2ludGVycG9sYXRlKFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U3Vic2NyaXB0KCksXG4gICAgICAgICAgICAgICAgeydlbWFpbCc6IHRoaXMucHJvcHMuZW1haWx9LCB0cnVlKX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGNvbXBsZXRlOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGNvbXBsZXRlUmVnaXN0cmF0aW9uID0gKGFwaVJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKGFwaVJlc3BvbnNlLmFjdGl2YXRpb24gPT09ICdhY3RpdmUnKSB7XG4gICAgICBtb2RhbC5oaWRlKCk7XG4gICAgICBhdXRoLnNpZ25JbihhcGlSZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBjb21wbGV0ZTogYXBpUmVzcG9uc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGlmICh0aGlzLnN0YXRlLmNvbXBsZXRlKSB7XG4gICAgICByZXR1cm4gPFJlZ2lzdGVyQ29tcGxldGUgYWN0aXZhdGlvbj17dGhpcy5zdGF0ZS5jb21wbGV0ZS5hY3RpdmF0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lPXt0aGlzLnN0YXRlLmNvbXBsZXRlLnVzZXJuYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsPXt0aGlzLnN0YXRlLmNvbXBsZXRlLmVtYWlsfSAvPjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDxSZWdpc3RlckZvcm0gY2FsbGJhY2s9e3RoaXMuY29tcGxldGVSZWdpc3RyYXRpb259Lz47XG4gICAgfVxuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb3JtIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0nO1xuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgKiBhcyB2YWxpZGF0b3JzIGZyb20gJ21pc2Fnby91dGlscy92YWxpZGF0b3JzJztcbmltcG9ydCBzaG93QmFubmVkUGFnZSBmcm9tICdtaXNhZ28vdXRpbHMvYmFubmVkLXBhZ2UnO1xuXG5leHBvcnQgY2xhc3MgUmVxdWVzdExpbmtGb3JtIGV4dGVuZHMgRm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICdpc0xvYWRpbmcnOiBmYWxzZSxcblxuICAgICAgJ2VtYWlsJzogJycsXG5cbiAgICAgICd2YWxpZGF0b3JzJzoge1xuICAgICAgICAnZW1haWwnOiBbXG4gICAgICAgICAgdmFsaWRhdG9ycy5lbWFpbCgpXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgY2xlYW4oKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXIuZXJyb3IoZ2V0dGV4dChcIkVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzcy5cIikpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNlbmQoKSB7XG4gICAgcmV0dXJuIGFqYXgucG9zdChtaXNhZ28uZ2V0KCdTRU5EX0FDVElWQVRJT05fQVBJJyksIHtcbiAgICAgICdlbWFpbCc6IHRoaXMuc3RhdGUuZW1haWxcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3MoYXBpUmVzcG9uc2UpIHtcbiAgICB0aGlzLnByb3BzLmNhbGxiYWNrKGFwaVJlc3BvbnNlKTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKHJlamVjdGlvbikge1xuICAgIGlmIChbJ2FscmVhZHlfYWN0aXZlJywgJ2luYWN0aXZlX2FkbWluJ10uaW5kZXhPZihyZWplY3Rpb24uY29kZSkgPiAtMSkge1xuICAgICAgc25hY2tiYXIuaW5mbyhyZWplY3Rpb24uZGV0YWlsKTtcbiAgICB9IGVsc2UgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMyAmJiByZWplY3Rpb24uYmFuKSB7XG4gICAgICBzaG93QmFubmVkUGFnZShyZWplY3Rpb24uYmFuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXIuYXBpRXJyb3IocmVqZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIndlbGwgd2VsbC1mb3JtIHdlbGwtZm9ybS1yZXF1ZXN0LWFjdGl2YXRpb24tbGlua1wiPlxuICAgICAgPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250cm9sLWlucHV0XCI+XG5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2dldHRleHQoXCJZb3VyIGUtbWFpbCBhZGRyZXNzXCIpfVxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ2VtYWlsJyl9XG4gICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuZW1haWx9IC8+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcHJpbWFyeSBidG4tYmxvY2tcIlxuICAgICAgICAgICAgICAgIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfT5cbiAgICAgICAgICB7Z2V0dGV4dChcIlNlbmQgbGlua1wiKX1cbiAgICAgICAgPC9CdXR0b24+XG5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGlua1NlbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRNZXNzYWdlKCkge1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiQWN0aXZhdGlvbiBsaW5rIHdhcyBzZW50IHRvICUoZW1haWwpc1wiKSwge1xuICAgICAgZW1haWw6IHRoaXMucHJvcHMudXNlci5lbWFpbFxuICAgIH0sIHRydWUpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJ3ZWxsIHdlbGwtZm9ybSB3ZWxsLWZvcm0tcmVxdWVzdC1hY3RpdmF0aW9uLWxpbmsgd2VsbC1kb25lXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRvbmUtbWVzc2FnZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtaWNvblwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgIGNoZWNrXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWJvZHlcIj5cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIHt0aGlzLmdldE1lc3NhZ2UoKX1cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4gYnRuLXByaW1hcnkgYnRuLWJsb2NrXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnByb3BzLmNhbGxiYWNrfT5cbiAgICAgICAgICB7Z2V0dGV4dChcIlJlcXVlc3QgYW5vdGhlciBsaW5rXCIpfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgY29tcGxldGU6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgY29tcGxldGUgPSAoYXBpUmVzcG9uc2UpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGNvbXBsZXRlOiBhcGlSZXNwb25zZVxuICAgIH0pO1xuICB9O1xuXG4gIHJlc2V0ID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgY29tcGxldGU6IGZhbHNlXG4gICAgfSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICBpZiAodGhpcy5zdGF0ZS5jb21wbGV0ZSkge1xuICAgICAgcmV0dXJuIDxMaW5rU2VudCB1c2VyPXt0aGlzLnN0YXRlLmNvbXBsZXRlfSBjYWxsYmFjaz17dGhpcy5yZXNldH0gLz47XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiA8UmVxdWVzdExpbmtGb3JtIGNhbGxiYWNrPXt0aGlzLmNvbXBsZXRlfSAvPjtcbiAgICB9O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtJztcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0ICogYXMgdmFsaWRhdG9ycyBmcm9tICdtaXNhZ28vdXRpbHMvdmFsaWRhdG9ycyc7XG5pbXBvcnQgc2hvd0Jhbm5lZFBhZ2UgZnJvbSAnbWlzYWdvL3V0aWxzL2Jhbm5lZC1wYWdlJztcblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RSZXNldEZvcm0gZXh0ZW5kcyBGb3JtIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlLFxuXG4gICAgICAnZW1haWwnOiAnJyxcblxuICAgICAgJ3ZhbGlkYXRvcnMnOiB7XG4gICAgICAgICdlbWFpbCc6IFtcbiAgICAgICAgICB2YWxpZGF0b3JzLmVtYWlsKClcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBjbGVhbigpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzbmFja2Jhci5lcnJvcihnZXR0ZXh0KFwiRW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLlwiKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc2VuZCgpIHtcbiAgICByZXR1cm4gYWpheC5wb3N0KG1pc2Fnby5nZXQoJ1NFTkRfUEFTU1dPUkRfUkVTRVRfQVBJJyksIHtcbiAgICAgICdlbWFpbCc6IHRoaXMuc3RhdGUuZW1haWxcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3MoYXBpUmVzcG9uc2UpIHtcbiAgICB0aGlzLnByb3BzLmNhbGxiYWNrKGFwaVJlc3BvbnNlKTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKHJlamVjdGlvbikge1xuICAgIGlmIChbJ2luYWN0aXZlX3VzZXInLCAnaW5hY3RpdmVfYWRtaW4nXS5pbmRleE9mKHJlamVjdGlvbi5jb2RlKSA+IC0xKSB7XG4gICAgICB0aGlzLnByb3BzLnNob3dJbmFjdGl2ZVBhZ2UocmVqZWN0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMyAmJiByZWplY3Rpb24uYmFuKSB7XG4gICAgICBzaG93QmFubmVkUGFnZShyZWplY3Rpb24uYmFuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXIuYXBpRXJyb3IocmVqZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIndlbGwgd2VsbC1mb3JtIHdlbGwtZm9ybS1yZXF1ZXN0LXBhc3N3b3JkLXJlc2V0XCI+XG4gICAgICA8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRyb2wtaW5wdXRcIj5cblxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17Z2V0dGV4dChcIllvdXIgZS1tYWlsIGFkZHJlc3NcIil9XG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgnZW1haWwnKX1cbiAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5lbWFpbH0gLz5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8QnV0dG9uIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgbG9hZGluZz17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9PlxuICAgICAgICAgIHtnZXR0ZXh0KFwiU2VuZCBsaW5rXCIpfVxuICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaW5rU2VudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldE1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCJSZXNldCBwYXNzd29yZCBsaW5rIHdhcyBzZW50IHRvICUoZW1haWwpc1wiKSwge1xuICAgICAgZW1haWw6IHRoaXMucHJvcHMudXNlci5lbWFpbFxuICAgIH0sIHRydWUpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJ3ZWxsIHdlbGwtZm9ybSB3ZWxsLWZvcm0tcmVxdWVzdC1wYXNzd29yZC1yZXNldCB3ZWxsLWRvbmVcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZG9uZS1tZXNzYWdlXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1pY29uXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgY2hlY2tcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtYm9keVwiPlxuICAgICAgICAgIDxwPlxuICAgICAgICAgICAge3RoaXMuZ2V0TWVzc2FnZSgpfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImJ0biBidG4tcHJpbWFyeSBidG4tYmxvY2tcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuY2FsbGJhY2t9PlxuICAgICAgICAgIHtnZXR0ZXh0KFwiUmVxdWVzdCBhbm90aGVyIGxpbmtcIil9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjY291bnRJbmFjdGl2ZVBhZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRBY3RpdmF0ZUJ1dHRvbigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5hY3RpdmF0aW9uID09PSAnaW5hY3RpdmVfdXNlcicpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8cD5cbiAgICAgICAgPGEgaHJlZj17bWlzYWdvLmdldCgnUkVRVUVTVF9BQ1RJVkFUSU9OX1VSTCcpfT5cbiAgICAgICAgICB7Z2V0dGV4dChcIkFjdGl2YXRlIHlvdXIgYWNjb3VudC5cIil9XG4gICAgICAgIDwvYT5cbiAgICAgIDwvcD47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhZ2UgcGFnZS1tZXNzYWdlIHBhZ2UtbWVzc2FnZS1pbmZvIHBhZ2UtZm9yZ290dGVuLXBhc3N3b3JkLWluYWN0aXZlXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtcGFuZWxcIj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1pY29uXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICAgIGluZm9fb3V0bGluZVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWJvZHlcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImxlYWRcIj5cbiAgICAgICAgICAgICAge2dldHRleHQoXCJZb3VyIGFjY291bnQgaXMgaW5hY3RpdmUuXCIpfVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgIHt0aGlzLnByb3BzLm1lc3NhZ2V9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICB7dGhpcy5nZXRBY3RpdmF0ZUJ1dHRvbigpfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBjb21wbGV0ZTogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBjb21wbGV0ZSA9IChhcGlSZXNwb25zZSkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgY29tcGxldGU6IGFwaVJlc3BvbnNlXG4gICAgfSk7XG4gIH07XG5cbiAgcmVzZXQgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBjb21wbGV0ZTogZmFsc2VcbiAgICB9KTtcbiAgfTtcblxuICBzaG93SW5hY3RpdmVQYWdlKGFwaVJlc3BvbnNlKSB7XG4gICAgUmVhY3RET00ucmVuZGVyKFxuICAgICAgPEFjY291bnRJbmFjdGl2ZVBhZ2UgYWN0aXZhdGlvbj17YXBpUmVzcG9uc2UuY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9e2FwaVJlc3BvbnNlLmRldGFpbH0gLz4sXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZS1tb3VudCcpXG4gICAgKTtcbiAgfVxuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgaWYgKHRoaXMuc3RhdGUuY29tcGxldGUpIHtcbiAgICAgIHJldHVybiA8TGlua1NlbnQgdXNlcj17dGhpcy5zdGF0ZS5jb21wbGV0ZX0gY2FsbGJhY2s9e3RoaXMucmVzZXR9IC8+O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gPFJlcXVlc3RSZXNldEZvcm0gY2FsbGJhY2s9e3RoaXMuY29tcGxldGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0luYWN0aXZlUGFnZT17dGhpcy5zaG93SW5hY3RpdmVQYWdlfSAvPjtcbiAgICB9O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtJztcbmltcG9ydCBTaWduSW5Nb2RhbCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9zaWduLWluLmpzJztcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBhdXRoIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hdXRoJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbW9kYWwgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vZGFsJztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0ICogYXMgdmFsaWRhdG9ycyBmcm9tICdtaXNhZ28vdXRpbHMvdmFsaWRhdG9ycyc7XG5pbXBvcnQgc2hvd0Jhbm5lZFBhZ2UgZnJvbSAnbWlzYWdvL3V0aWxzL2Jhbm5lZC1wYWdlJztcblxuZXhwb3J0IGNsYXNzIFJlc2V0UGFzc3dvcmRGb3JtIGV4dGVuZHMgRm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICdpc0xvYWRpbmcnOiBmYWxzZSxcblxuICAgICAgJ3Bhc3N3b3JkJzogJycsXG5cbiAgICAgICd2YWxpZGF0b3JzJzoge1xuICAgICAgICAncGFzc3dvcmQnOiBbXG4gICAgICAgICAgdmFsaWRhdG9ycy5wYXNzd29yZE1pbkxlbmd0aChtaXNhZ28uZ2V0KCdTRVRUSU5HUycpKVxuICAgICAgICBdXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGNsZWFuKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLnBhc3N3b3JkLnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgc25hY2tiYXIuZXJyb3IodGhpcy5zdGF0ZS5lcnJvcnMucGFzc3dvcmRbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc25hY2tiYXIuZXJyb3IoZ2V0dGV4dChcIkVudGVyIG5ldyBwYXNzd29yZC5cIikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNlbmQoKSB7XG4gICAgcmV0dXJuIGFqYXgucG9zdChtaXNhZ28uZ2V0KCdDSEFOR0VfUEFTU1dPUkRfQVBJJyksIHtcbiAgICAgICdwYXNzd29yZCc6IHRoaXMuc3RhdGUucGFzc3dvcmRcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3MoYXBpUmVzcG9uc2UpIHtcbiAgICB0aGlzLnByb3BzLmNhbGxiYWNrKGFwaVJlc3BvbnNlKTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKHJlamVjdGlvbikge1xuICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDMgJiYgcmVqZWN0aW9uLmJhbikge1xuICAgICAgc2hvd0Jhbm5lZFBhZ2UocmVqZWN0aW9uLmJhbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJ3ZWxsIHdlbGwtZm9ybSB3ZWxsLWZvcm0tcmVzZXQtcGFzc3dvcmRcIj5cbiAgICAgIDxmb3JtIG9uU3VibWl0PXt0aGlzLmhhbmRsZVN1Ym1pdH0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udHJvbC1pbnB1dFwiPlxuXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17Z2V0dGV4dChcIkVudGVyIG5ldyBwYXNzd29yZFwiKX1cbiAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdwYXNzd29yZCcpfVxuICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnBhc3N3b3JkfSAvPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwiYnRuLXByaW1hcnkgYnRuLWJsb2NrXCJcbiAgICAgICAgICAgICAgICBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzTG9hZGluZ30+XG4gICAgICAgICAge2dldHRleHQoXCJDaGFuZ2UgcGFzc3dvcmRcIil9XG4gICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhc3N3b3JkQ2hhbmdlZFBhZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRNZXNzYWdlKCkge1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiJSh1c2VybmFtZSlzLCB5b3VyIHBhc3N3b3JkIGhhcyBiZWVuIGNoYW5nZWQgc3VjY2Vzc2Z1bGx5LlwiKSwge1xuICAgICAgdXNlcm5hbWU6IHRoaXMucHJvcHMudXNlci51c2VybmFtZVxuICAgIH0sIHRydWUpO1xuICB9XG5cbiAgc2hvd1NpZ25JbigpIHtcbiAgICBtb2RhbC5zaG93KFNpZ25Jbk1vZGFsKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicGFnZSBwYWdlLW1lc3NhZ2UgcGFnZS1tZXNzYWdlLXN1Y2Nlc3MgcGFnZS1mb3Jnb3R0ZW4tcGFzc3dvcmQtY2hhbmdlZFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLXBhbmVsXCI+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtaWNvblwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgICBjaGVja1xuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWJvZHlcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImxlYWRcIj5cbiAgICAgICAgICAgICAge3RoaXMuZ2V0TWVzc2FnZSgpfVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgIHtnZXR0ZXh0KFwiWW91IHdpbGwgaGF2ZSB0byBzaWduIGluIHVzaW5nIG5ldyBwYXNzd29yZCBiZWZvcmUgY29udGludWluZy5cIil9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1wcmltYXJ5XCIgb25DbGljaz17dGhpcy5zaG93U2lnbklufT5cbiAgICAgICAgICAgICAgICB7Z2V0dGV4dChcIlNpZ24gaW5cIil9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGNvbXBsZXRlID0gKGFwaVJlc3BvbnNlKSA9PiB7XG4gICAgYXV0aC5zb2Z0U2lnbk91dCgpO1xuXG4gICAgLy8gbnVrZSBcInJlZGlyZWN0X3RvXCIgZmllbGQgc28gd2UgZG9uJ3QgZW5kXG4gICAgLy8gY29taW5nIGJhY2sgdG8gZXJyb3IgcGFnZSBhZnRlciBzaWduIGluXG4gICAgJCgnI2hpZGRlbi1sb2dpbi1mb3JtIGlucHV0W25hbWU9XCJyZWRpcmVjdF90b1wiXScpLnJlbW92ZSgpO1xuXG4gICAgUmVhY3RET00ucmVuZGVyKFxuICAgICAgPFBhc3N3b3JkQ2hhbmdlZFBhZ2UgdXNlcj17YXBpUmVzcG9uc2V9IC8+LFxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhZ2UtbW91bnQnKVxuICAgICk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPFJlc2V0UGFzc3dvcmRGb3JtIGNhbGxiYWNrPXt0aGlzLmNvbXBsZXRlfSAvPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuY2xhc3NOYW1lKSB7XG4gICAgICByZXR1cm4gXCJmb3JtLXNlYXJjaCBcIiArIHRoaXMucHJvcHMuY2xhc3NOYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJmb3JtLXNlYXJjaFwiO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICB2YWx1ZT17dGhpcy5wcm9wcy52YWx1ZX1cbiAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5wcm9wcy5vbkNoYW5nZX1cbiAgICAgICAgICAgICBwbGFjZWhvbGRlcj17dGhpcy5wcm9wcy5wbGFjZWhvbGRlciB8fCBnZXR0ZXh0KFwiU2VhcmNoLi4uXCIpfSAvPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICBzZWFyY2hcbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0Q2hvaWNlKCkge1xuICAgIGxldCBjaG9pY2UgPSBudWxsO1xuICAgIHRoaXMucHJvcHMuY2hvaWNlcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLnZhbHVlID09PSB0aGlzLnByb3BzLnZhbHVlKSB7XG4gICAgICAgIGNob2ljZSA9IGl0ZW07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNob2ljZTtcbiAgfVxuXG4gIGdldEljb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hvaWNlKCkuaWNvbjtcbiAgfVxuXG4gIGdldExhYmVsKCkge1xuICAgIHJldHVybiB0aGlzLmdldENob2ljZSgpLmxhYmVsO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBjaGFuZ2UgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh7XG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYnRuLWdyb3VwIGJ0bi1zZWxlY3QtZ3JvdXBcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0biBidG4tc2VsZWN0IGRyb3Bkb3duLXRvZ2dsZVwiXG4gICAgICAgICAgICAgIGlkPXt0aGlzLnByb3BzLmlkIHx8IG51bGx9XG4gICAgICAgICAgICAgIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIlxuICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9e3RoaXMucHJvcHNbJ2FyaWEtZGVzY3JpYmVkYnknXSB8fCBudWxsfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5wcm9wcy5kaXNhYmxlZCB8fCBmYWxzZX0+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICB7dGhpcy5nZXRJY29uKCl9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAge3RoaXMuZ2V0TGFiZWwoKX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHVsIGNsYXNzTmFtZT1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAge3RoaXMucHJvcHMuY2hvaWNlcy5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICByZXR1cm4gPGxpIGtleT17aX0+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4tbGlua1wiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuY2hhbmdlKGl0ZW0udmFsdWUpfT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgICAgIHtpdGVtLmljb259XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAge2l0ZW0ubGFiZWx9XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2xpPjtcbiAgICAgICAgfSl9XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybSc7XG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgbW9kYWwgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vZGFsJztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuaW1wb3J0IHNob3dCYW5uZWRQYWdlIGZyb20gJ21pc2Fnby91dGlscy9iYW5uZWQtcGFnZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgRm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICdpc0xvYWRpbmcnOiBmYWxzZSxcbiAgICAgICdzaG93QWN0aXZhdGlvbic6IGZhbHNlLFxuXG4gICAgICAndXNlcm5hbWUnOiAnJyxcbiAgICAgICdwYXNzd29yZCc6ICcnLFxuXG4gICAgICAndmFsaWRhdG9ycyc6IHtcbiAgICAgICAgJ3VzZXJuYW1lJzogW10sXG4gICAgICAgICdwYXNzd29yZCc6IFtdXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGNsZWFuKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgIHNuYWNrYmFyLmVycm9yKGdldHRleHQoXCJGaWxsIG91dCBib3RoIGZpZWxkcy5cIikpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBhamF4LnBvc3QobWlzYWdvLmdldCgnQVVUSF9BUEknKSwge1xuICAgICAgJ3VzZXJuYW1lJzogdGhpcy5zdGF0ZS51c2VybmFtZSxcbiAgICAgICdwYXNzd29yZCc6IHRoaXMuc3RhdGUucGFzc3dvcmRcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3MoKSB7XG4gICAgbGV0IGZvcm0gPSAkKCcjaGlkZGVuLWxvZ2luLWZvcm0nKTtcblxuICAgIGZvcm0uYXBwZW5kKCc8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlcm5hbWVcIiAvPicpO1xuICAgIGZvcm0uYXBwZW5kKCc8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgbmFtZT1cInBhc3N3b3JkXCIgLz4nKTtcblxuICAgIC8vIGZpbGwgb3V0IGZvcm0gd2l0aCB1c2VyIGNyZWRlbnRpYWxzIGFuZCBzdWJtaXQgaXQsIHRoaXMgd2lsbCB0ZWxsXG4gICAgLy8gTWlzYWdvIHRvIHJlZGlyZWN0IHVzZXIgYmFjayB0byByaWdodCBwYWdlLCBhbmQgd2lsbCB0cmlnZ2VyIGJyb3dzZXInc1xuICAgIC8vIGtleSByaW5nIGZlYXR1cmVcbiAgICBmb3JtLmZpbmQoJ2lucHV0W3R5cGU9XCJoaWRkZW5cIl0nKS52YWwoYWpheC5nZXRDc3JmVG9rZW4oKSk7XG4gICAgZm9ybS5maW5kKCdpbnB1dFtuYW1lPVwicmVkaXJlY3RfdG9cIl0nKS52YWwod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICBmb3JtLmZpbmQoJ2lucHV0W25hbWU9XCJ1c2VybmFtZVwiXScpLnZhbCh0aGlzLnN0YXRlLnVzZXJuYW1lKTtcbiAgICBmb3JtLmZpbmQoJ2lucHV0W25hbWU9XCJwYXNzd29yZFwiXScpLnZhbCh0aGlzLnN0YXRlLnBhc3N3b3JkKTtcbiAgICBmb3JtLnN1Ym1pdCgpO1xuXG4gICAgLy8ga2VlcCBmb3JtIGxvYWRpbmdcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICdpc0xvYWRpbmcnOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVFcnJvcihyZWplY3Rpb24pIHtcbiAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICBpZiAocmVqZWN0aW9uLmNvZGUgPT09ICdpbmFjdGl2ZV9hZG1pbicpIHtcbiAgICAgICAgc25hY2tiYXIuaW5mbyhyZWplY3Rpb24uZGV0YWlsKTtcbiAgICAgIH0gZWxzZSBpZiAocmVqZWN0aW9uLmNvZGUgPT09ICdpbmFjdGl2ZV91c2VyJykge1xuICAgICAgICBzbmFja2Jhci5pbmZvKHJlamVjdGlvbi5kZXRhaWwpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAnc2hvd0FjdGl2YXRpb24nOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChyZWplY3Rpb24uY29kZSA9PT0gJ2Jhbm5lZCcpIHtcbiAgICAgICAgc2hvd0Jhbm5lZFBhZ2UocmVqZWN0aW9uLmRldGFpbCk7XG4gICAgICAgIG1vZGFsLmhpZGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNuYWNrYmFyLmVycm9yKHJlamVjdGlvbi5kZXRhaWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDAzICYmIHJlamVjdGlvbi5iYW4pIHtcbiAgICAgIHNob3dCYW5uZWRQYWdlKHJlamVjdGlvbi5iYW4pO1xuICAgICAgbW9kYWwuaGlkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzbmFja2Jhci5hcGlFcnJvcihyZWplY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIGdldEFjdGl2YXRpb25CdXR0b24oKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuc2hvd0FjdGl2YXRpb24pIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8YSBocmVmPXttaXNhZ28uZ2V0KCdSRVFVRVNUX0FDVElWQVRJT05fVVJMJyl9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuIGJ0bi1zdWNjZXNzIGJ0bi1ibG9ja1wiPlxuICAgICAgICAge2dldHRleHQoXCJBY3RpdmF0ZSBhY2NvdW50XCIpfVxuICAgICAgPC9hPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtZGlhbG9nIG1vZGFsLXNtIG1vZGFsLXNpZ24taW5cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJkb2N1bWVudFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtnZXR0ZXh0KFwiQ2xvc2VcIil9PlxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwibW9kYWwtdGl0bGVcIj57Z2V0dGV4dChcIlNpZ24gaW5cIil9PC9oND5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxmb3JtIG9uU3VibWl0PXt0aGlzLmhhbmRsZVN1Ym1pdH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5XCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRyb2wtaW5wdXRcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJpZF91c2VybmFtZVwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17Z2V0dGV4dChcIlVzZXJuYW1lIG9yIGUtbWFpbFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCd1c2VybmFtZScpfVxuICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS51c2VybmFtZX0gLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udHJvbC1pbnB1dFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImlkX3Bhc3N3b3JkXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17Z2V0dGV4dChcIlBhc3N3b3JkXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3Bhc3N3b3JkJyl9XG4gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnBhc3N3b3JkfSAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICAgIHt0aGlzLmdldEFjdGl2YXRpb25CdXR0b24oKX1cbiAgICAgICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwiYnRuLXByaW1hcnkgYnRuLWJsb2NrXCJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGluZz17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9PlxuICAgICAgICAgICAgICB7Z2V0dGV4dChcIlNpZ24gaW5cIil9XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIDxhIGhyZWY9e21pc2Fnby5nZXQoJ0ZPUkdPVFRFTl9QQVNTV09SRF9VUkwnKX1cbiAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0biBidG4tZGVmYXVsdCBidG4tYmxvY2tcIj5cbiAgICAgICAgICAgICAgIHtnZXR0ZXh0KFwiRm9yZ290IHBhc3N3b3JkP1wiKX1cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbi8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbmNvbnN0IFRZUEVTX0NMQVNTRVMgPSB7XG4gICdpbmZvJzogJ2FsZXJ0LWluZm8nLFxuICAnc3VjY2Vzcyc6ICdhbGVydC1zdWNjZXNzJyxcbiAgJ3dhcm5pbmcnOiAnYWxlcnQtd2FybmluZycsXG4gICdlcnJvcic6ICdhbGVydC1kYW5nZXInXG59O1xuLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuZXhwb3J0IGNsYXNzIFNuYWNrYmFyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0U25hY2tiYXJDbGFzcygpIHtcbiAgICBsZXQgc25hY2tiYXJDbGFzcyA9ICdhbGVydHMtc25hY2tiYXInO1xuICAgIGlmICh0aGlzLnByb3BzLmlzVmlzaWJsZSkge1xuICAgICAgc25hY2tiYXJDbGFzcyArPSAnIGluJztcbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXJDbGFzcyArPSAnIG91dCc7XG4gICAgfVxuICAgIHJldHVybiBzbmFja2JhckNsYXNzO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMuZ2V0U25hY2tiYXJDbGFzcygpfT5cbiAgICAgIDxwIGNsYXNzTmFtZT17J2FsZXJ0ICcgKyBUWVBFU19DTEFTU0VTW3RoaXMucHJvcHMudHlwZV19PlxuICAgICAgICB7dGhpcy5wcm9wcy5tZXNzYWdlfVxuICAgICAgPC9wPlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Qoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLnNuYWNrYmFyO1xufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBdmF0YXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYXZhdGFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgUmVnaXN0ZXJCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvcmVnaXN0ZXItYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgU2lnbkluTW9kYWwgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvc2lnbi1pbi5qcyc7XG5pbXBvcnQgZHJvcGRvd24gZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vYmlsZS1uYXZiYXItZHJvcGRvd24nO1xuaW1wb3J0IG1vZGFsIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9tb2RhbCc7XG5cbmV4cG9ydCBjbGFzcyBHdWVzdE1lbnUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzaG93U2lnbkluTW9kYWwoKSB7XG4gICAgbW9kYWwuc2hvdyhTaWduSW5Nb2RhbCk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8dWwgY2xhc3NOYW1lPVwiZHJvcGRvd24tbWVudSB1c2VyLWRyb3Bkb3duIGRyb3Bkb3duLW1lbnUtcmlnaHRcIlxuICAgICAgICAgICAgICAgcm9sZT1cIm1lbnVcIj5cbiAgICAgIDxsaSBjbGFzc05hbWU9XCJndWVzdC1wcmV2aWV3XCI+XG4gICAgICAgIDxoND57Z2V0dGV4dChcIllvdSBhcmUgYnJvd3NpbmcgYXMgZ3Vlc3QuXCIpfTwvaDQ+XG4gICAgICAgIDxwPlxuICAgICAgICAgIHtnZXR0ZXh0KCdTaWduIGluIG9yIHJlZ2lzdGVyIHRvIHN0YXJ0IGFuZCBwYXJ0aWNpcGF0ZSBpbiBkaXNjdXNzaW9ucy4nKX1cbiAgICAgICAgPC9wPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXhzLTZcIj5cblxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2hvd1NpZ25Jbk1vZGFsfT5cbiAgICAgICAgICAgICAge2dldHRleHQoXCJTaWduIGluXCIpfVxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC14cy02XCI+XG5cbiAgICAgICAgICAgIDxSZWdpc3RlckJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcHJpbWFyeSBidG4tYmxvY2tcIj5cbiAgICAgICAgICAgICAge2dldHRleHQoXCJSZWdpc3RlclwiKX1cbiAgICAgICAgICAgIDwvUmVnaXN0ZXJCdXR0b24+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEd1ZXN0TmF2IGV4dGVuZHMgR3Vlc3RNZW51IHtcbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJuYXYgbmF2LWd1ZXN0XCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4gbmF2YmFyLWJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2hvd1NpZ25Jbk1vZGFsfT5cbiAgICAgICAge2dldHRleHQoXCJTaWduIGluXCIpfVxuICAgICAgPC9idXR0b24+XG4gICAgICA8UmVnaXN0ZXJCdXR0b24gY2xhc3NOYW1lPVwibmF2YmFyLWJ0biBidG4tcHJpbWFyeVwiPlxuICAgICAgICB7Z2V0dGV4dChcIlJlZ2lzdGVyXCIpfVxuICAgICAgPC9SZWdpc3RlckJ1dHRvbj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tcGFjdEd1ZXN0TmF2IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc2hvd0d1ZXN0TWVudSgpIHtcbiAgICBkcm9wZG93bi5zaG93KEd1ZXN0TWVudSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXt0aGlzLnNob3dHdWVzdE1lbnV9PlxuICAgICAgPEF2YXRhciBzaXplPVwiNjRcIiAvPlxuICAgIDwvYnV0dG9uPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgR3Vlc3ROYXYsIENvbXBhY3RHdWVzdE5hdiB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXItbWVudS9ndWVzdC1uYXYnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCB7IFVzZXJOYXYsIENvbXBhY3RVc2VyTmF2fSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2VyLW1lbnUvdXNlci1uYXYnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGNsYXNzIFVzZXJNZW51IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICBpZiAodGhpcy5wcm9wcy5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIHJldHVybiA8VXNlck5hdiB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IC8+O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gPEd1ZXN0TmF2IC8+O1xuICAgIH1cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wYWN0VXNlck1lbnUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGlmICh0aGlzLnByb3BzLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgcmV0dXJuIDxDb21wYWN0VXNlck5hdiB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IC8+O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gPENvbXBhY3RHdWVzdE5hdiAvPjtcbiAgICB9XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0KHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5hdXRoO1xufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgQXZhdGFyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2F2YXRhcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IENoYW5nZUF2YXRhck1vZGFsLCB7IHNlbGVjdCB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2NoYW5nZS1hdmF0YXIvcm9vdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBkcm9wZG93biBmcm9tICdtaXNhZ28vc2VydmljZXMvbW9iaWxlLW5hdmJhci1kcm9wZG93bic7XG5pbXBvcnQgbW9kYWwgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vZGFsJztcblxuZXhwb3J0IGNsYXNzIFVzZXJNZW51IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgbG9nb3V0KCkge1xuICAgIGxldCBkZWNpc2lvbiA9IGNvbmZpcm0oZ2V0dGV4dChcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBzaWduIG91dD9cIikpO1xuICAgIGlmIChkZWNpc2lvbikge1xuICAgICAgJCgnI2hpZGRlbi1sb2dvdXQtZm9ybScpLnN1Ym1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZUF2YXRhcigpIHtcbiAgICBtb2RhbC5zaG93KGNvbm5lY3Qoc2VsZWN0KShDaGFuZ2VBdmF0YXJNb2RhbCkpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPHVsIGNsYXNzTmFtZT1cImRyb3Bkb3duLW1lbnUgdXNlci1kcm9wZG93biBkcm9wZG93bi1tZW51LXJpZ2h0XCJcbiAgICAgICAgICAgICAgIHJvbGU9XCJtZW51XCI+XG4gICAgICA8bGkgY2xhc3NOYW1lPVwiZHJvcGRvd24taGVhZGVyXCI+XG4gICAgICAgIDxzdHJvbmc+e3RoaXMucHJvcHMudXNlci51c2VybmFtZX08L3N0cm9uZz5cbiAgICAgIDwvbGk+XG4gICAgICA8bGkgY2xhc3NOYW1lPVwiZGl2aWRlclwiIC8+XG4gICAgICA8bGk+XG4gICAgICAgIDxhIGhyZWY9e3RoaXMucHJvcHMudXNlci5hYnNvbHV0ZV91cmx9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5hY2NvdW50X2NpcmNsZTwvc3Bhbj5cbiAgICAgICAgICB7Z2V0dGV4dChcIlNlZSB5b3VyIHByb2ZpbGVcIil9XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbGk+XG4gICAgICA8bGk+XG4gICAgICAgIDxhIGhyZWY9e21pc2Fnby5nZXQoJ1VTRVJDUF9VUkwnKX0+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPmRvbmVfYWxsPC9zcGFuPlxuICAgICAgICAgIHtnZXR0ZXh0KFwiQ2hhbmdlIG9wdGlvbnNcIil9XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbGk+XG4gICAgICA8bGk+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImJ0bi1saW5rXCIgb25DbGljaz17dGhpcy5jaGFuZ2VBdmF0YXJ9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5wb3J0cmFpdDwvc3Bhbj5cbiAgICAgICAgICB7Z2V0dGV4dChcIkNoYW5nZSBhdmF0YXJcIil9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICAgIDxsaSBjbGFzc05hbWU9XCJkaXZpZGVyXCIgLz5cbiAgICAgIDxsaSBjbGFzc05hbWU9XCJkcm9wZG93bi1idXR0b25zXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmxvZ291dH0+XG4gICAgICAgICAgICB7Z2V0dGV4dChcIkxvZyBvdXRcIil9XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVzZXJOYXYgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8dWwgY2xhc3NOYW1lPVwidWwgbmF2IG5hdmJhci1uYXYgbmF2LXVzZXJcIj5cbiAgICAgIDxsaSBjbGFzc05hbWU9XCJkcm9wZG93blwiPlxuICAgICAgICA8YSBocmVmPXt0aGlzLnByb3BzLnVzZXIuYWJzb2x1dGVfdXJsfSBjbGFzc05hbWU9XCJkcm9wZG93bi10b2dnbGVcIlxuICAgICAgICAgICBkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICAgICByb2xlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgPEF2YXRhciB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IHNpemU9XCI2NFwiIC8+XG4gICAgICAgIDwvYT5cbiAgICAgICAgPFVzZXJNZW51IHVzZXI9e3RoaXMucHJvcHMudXNlcn0gLz5cbiAgICAgIDwvbGk+XG4gICAgPC91bD47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0VXNlck1lbnUoc3RhdGUpIHtcbiAgcmV0dXJuIHt1c2VyOiBzdGF0ZS5hdXRoLnVzZXJ9O1xufVxuXG5leHBvcnQgY2xhc3MgQ29tcGFjdFVzZXJOYXYgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzaG93VXNlck1lbnUoKSB7XG4gICAgZHJvcGRvd24uc2hvd0Nvbm5lY3RlZCgndXNlci1tZW51JywgY29ubmVjdChzZWxlY3RVc2VyTWVudSkoVXNlck1lbnUpKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e3RoaXMuc2hvd1VzZXJNZW51fT5cbiAgICAgIDxBdmF0YXIgdXNlcj17dGhpcy5wcm9wcy51c2VyfSBzaXplPVwiNjRcIiAvPlxuICAgIDwvYnV0dG9uPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldENsYXNzKCkge1xuICAgIGxldCBzdGF0dXMgPSAnJztcbiAgICBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfYmFubmVkKSB7XG4gICAgICBzdGF0dXMgPSAnYmFubmVkJztcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX2hpZGRlbikge1xuICAgICAgc3RhdHVzID0gJ29mZmxpbmUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfb25saW5lX2hpZGRlbikge1xuICAgICAgc3RhdHVzID0gJ29ubGluZSc7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vZmZsaW5lX2hpZGRlbikge1xuICAgICAgc3RhdHVzID0gJ29mZmxpbmUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfb25saW5lKSB7XG4gICAgICBzdGF0dXMgPSAnb25saW5lJztcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX29mZmxpbmUpIHtcbiAgICAgIHN0YXR1cyA9ICdvZmZsaW5lJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ3VzZXItc3RhdHVzIHVzZXItJyArIHN0YXR1cztcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzcygpfT5cbiAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuICAgIDwvc3Bhbj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RhdHVzSWNvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldEljb24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX2Jhbm5lZCkge1xuICAgICAgcmV0dXJuICdyZW1vdmVfY2lyY2xlX291dGxpbmUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfaGlkZGVuKSB7XG4gICAgICByZXR1cm4gJ2hlbHBfb3V0bGluZSc7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vbmxpbmVfaGlkZGVuKSB7XG4gICAgICByZXR1cm4gJ2xhYmVsJztcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX29mZmxpbmVfaGlkZGVuKSB7XG4gICAgICByZXR1cm4gJ2xhYmVsX291dGxpbmUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfb25saW5lKSB7XG4gICAgICByZXR1cm4gJ2xlbnMnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfb2ZmbGluZSkge1xuICAgICAgcmV0dXJuICdwYW5vcmFtYV9maXNoX2V5ZSc7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvbiBzdGF0dXMtaWNvblwiPlxuICAgICAge3RoaXMuZ2V0SWNvbigpfVxuICAgIDwvc3Bhbj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBTdGF0dXNMYWJlbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldEhlbHAoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX2Jhbm5lZCkge1xuICAgICAgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmJhbm5lZF91bnRpbCkge1xuICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIiUodXNlcm5hbWUpcyBpcyBiYW5uZWQgdW50aWwgJShiYW5fZXhwaXJlcylzXCIpLCB7XG4gICAgICAgICAgdXNlcm5hbWU6IHRoaXMucHJvcHMudXNlci51c2VybmFtZSxcbiAgICAgICAgICBiYW5fZXhwaXJlczogdGhpcy5wcm9wcy5zdGF0dXMuYmFubmVkX3VudGlsLmZvcm1hdCgnTEwsIExUJylcbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIiUodXNlcm5hbWUpcyBpcyBiYW5uZWRcIiksIHtcbiAgICAgICAgICB1c2VybmFtZTogdGhpcy5wcm9wcy51c2VyLnVzZXJuYW1lXG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfaGlkZGVuKSB7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIiUodXNlcm5hbWUpcyBpcyBoaWRpbmcgcHJlc2VuY2VcIiksIHtcbiAgICAgICAgdXNlcm5hbWU6IHRoaXMucHJvcHMudXNlci51c2VybmFtZVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vbmxpbmVfaGlkZGVuKSB7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIiUodXNlcm5hbWUpcyBpcyBvbmxpbmUgKGhpZGRlbilcIiksIHtcbiAgICAgICAgdXNlcm5hbWU6IHRoaXMucHJvcHMudXNlci51c2VybmFtZVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vZmZsaW5lX2hpZGRlbikge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMgd2FzIGxhc3Qgc2VlbiAlKGxhc3RfY2xpY2spcyAoaGlkZGVuKVwiKSwge1xuICAgICAgICB1c2VybmFtZTogdGhpcy5wcm9wcy51c2VyLnVzZXJuYW1lLFxuICAgICAgICBsYXN0X2NsaWNrOiB0aGlzLnByb3BzLnN0YXR1cy5sYXN0X2NsaWNrLmZyb21Ob3coKVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vbmxpbmUpIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiJSh1c2VybmFtZSlzIGlzIG9ubGluZVwiKSwge1xuICAgICAgICB1c2VybmFtZTogdGhpcy5wcm9wcy51c2VyLnVzZXJuYW1lXG4gICAgICB9LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX29mZmxpbmUpIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShnZXR0ZXh0KFwiJSh1c2VybmFtZSlzIHdhcyBsYXN0IHNlZW4gJShsYXN0X2NsaWNrKXNcIiksIHtcbiAgICAgICAgdXNlcm5hbWU6IHRoaXMucHJvcHMudXNlci51c2VybmFtZSxcbiAgICAgICAgbGFzdF9jbGljazogdGhpcy5wcm9wcy5zdGF0dXMubGFzdF9jbGljay5mcm9tTm93KClcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldExhYmVsKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19iYW5uZWQpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiQmFubmVkXCIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfaGlkZGVuKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIkhpZGRlblwiKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX29ubGluZV9oaWRkZW4pIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiT25saW5lIChoaWRkZW4pXCIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5zdGF0dXMuaXNfb2ZmbGluZV9oaWRkZW4pIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiT2ZmbGluZSAoaGlkZGVuKVwiKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuc3RhdHVzLmlzX29ubGluZSkge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJPbmxpbmVcIik7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnN0YXR1cy5pc19vZmZsaW5lKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIk9mZmxpbmVcIik7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcInN0YXR1cy1sYWJlbFwifVxuICAgICAgICAgICAgICAgICB0aXRsZT17dGhpcy5nZXRIZWxwKCl9PlxuICAgICAge3RoaXMuZ2V0TGFiZWwoKX1cbiAgICA8L3NwYW4+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEF2YXRhciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9hdmF0YXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCAqIGFzIHJhbmRvbSBmcm9tICdtaXNhZ28vdXRpbHMvcmFuZG9tJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyVXNlckF2YXRhcihpdGVtKSB7XG4gICAgaWYgKGl0ZW0uY2hhbmdlZF9ieSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxhIGhyZWY9e2l0ZW0uY2hhbmdlZF9ieS5hYnNvbHV0ZV91cmx9IGNsYXNzTmFtZT1cInVzZXItYXZhdGFyXCI+XG4gICAgICAgIDxBdmF0YXIgdXNlcj17aXRlbS5jaGFuZ2VkX2J5fSBzaXplPVwiMTAwXCIgLz5cbiAgICAgIDwvYT47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPVwidXNlci1hdmF0YXJcIj5cbiAgICAgICAgPEF2YXRhciBzaXplPVwiMTAwXCIgLz5cbiAgICAgIDwvc3Bhbj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlclVzZXJuYW1lKGl0ZW0pIHtcbiAgICBpZiAoaXRlbS5jaGFuZ2VkX2J5KSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGEgaHJlZj17aXRlbS5jaGFuZ2VkX2J5LmFic29sdXRlX3VybH0gY2xhc3NOYW1lPVwiaXRlbS10aXRsZVwiPlxuICAgICAgICB7aXRlbS5jaGFuZ2VkX2J5LnVzZXJuYW1lfVxuICAgICAgPC9hPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJpdGVtLXRpdGxlXCI+XG4gICAgICAgIHtpdGVtLmNoYW5nZWRfYnlfdXNlcm5hbWV9XG4gICAgICA8L3NwYW4+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9XG4gIH1cblxuICByZW5kZXJIaXN0b3J5KCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJ1c2VybmFtZS1oaXN0b3J5IHVpLXJlYWR5XCI+XG4gICAgICA8dWwgY2xhc3NOYW1lPVwibGlzdC1ncm91cFwiPlxuICAgICAgICB7dGhpcy5wcm9wcy5jaGFuZ2VzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiA8bGkgY2xhc3NOYW1lPVwibGlzdC1ncm91cC1pdGVtXCIga2V5PXtpdGVtLmlkfT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlcm5hbWUtY2hhbmdlLWF2YXRhclwiPlxuICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJVc2VyQXZhdGFyKGl0ZW0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXJuYW1lLWNoYW5nZS1hdXRob3JcIj5cbiAgICAgICAgICAgICAge3RoaXMucmVuZGVyVXNlcm5hbWUoaXRlbSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlcm5hbWUtY2hhbmdlXCI+XG4gICAgICAgICAgICAgIHtpdGVtLm9sZF91c2VybmFtZX1cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgICAgIGFycm93X2ZvcndhcmRcbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICB7aXRlbS5uZXdfdXNlcm5hbWV9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlcm5hbWUtY2hhbmdlLWRhdGVcIj5cbiAgICAgICAgICAgICAgPGFiYnIgdGl0bGU9e2l0ZW0uY2hhbmdlZF9vbi5mb3JtYXQoJ0xMTCcpfT5cbiAgICAgICAgICAgICAgICB7aXRlbS5jaGFuZ2VkX29uLmZyb21Ob3coKX1cbiAgICAgICAgICAgICAgPC9hYmJyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9saT47XG4gICAgICAgIH0pfVxuICAgICAgPC91bD5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxuXG4gIGdldEVtcHR5TWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5lbXB0eU1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmVtcHR5TWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJObyBuYW1lIGNoYW5nZXMgaGF2ZSBiZWVuIHJlY29yZGVkIGZvciB5b3VyIGFjY291bnQuXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlckVtcHR5SGlzdG9yeSgpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwidXNlcm5hbWUtaGlzdG9yeSB1aS1yZWFkeVwiPlxuICAgICAgPHVsIGNsYXNzTmFtZT1cImxpc3QtZ3JvdXBcIj5cbiAgICAgICAgPGxpIGNsYXNzTmFtZT1cImxpc3QtZ3JvdXAtaXRlbSBlbXB0eS1tZXNzYWdlXCI+XG4gICAgICAgICAge3RoaXMuZ2V0RW1wdHlNZXNzYWdlKCl9XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgcmVuZGVySGlzdG9yeVByZXZpZXcoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInVzZXJuYW1lLWhpc3RvcnkgdWktcHJldmlld1wiPlxuICAgICAgPHVsIGNsYXNzTmFtZT1cImxpc3QtZ3JvdXBcIj5cbiAgICAgICAge3JhbmRvbS5yYW5nZSgzLCA1KS5tYXAoKGkpID0+IHtcbiAgICAgICAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT1cImxpc3QtZ3JvdXAtaXRlbVwiIGtleT17aX0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXJuYW1lLWNoYW5nZS1hdmF0YXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidXNlci1hdmF0YXJcIj5cbiAgICAgICAgICAgICAgICA8QXZhdGFyIHNpemU9XCIxMDBcIiAvPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlcm5hbWUtY2hhbmdlLWF1dGhvclwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIiBzdHlsZT17e3dpZHRoOiByYW5kb20uaW50KDMwLCAxMDApICsgXCJweFwifX0+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXJuYW1lLWNoYW5nZVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIiBzdHlsZT17e3dpZHRoOiByYW5kb20uaW50KDMwLCA1MCkgKyBcInB4XCJ9fT4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgICAgICBhcnJvd19mb3J3YXJkXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidWktcHJldmlldy10ZXh0XCIgc3R5bGU9e3t3aWR0aDogcmFuZG9tLmludCgzMCwgNTApICsgXCJweFwifX0+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXJuYW1lLWNoYW5nZS1kYXRlXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVpLXByZXZpZXctdGV4dFwiIHN0eWxlPXt7d2lkdGg6IHJhbmRvbS5pbnQoNTAsIDEwMCkgKyBcInB4XCJ9fT4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2xpPjtcbiAgICAgICAgfSl9XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmlzTG9hZGVkKSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5jaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJIaXN0b3J5KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJFbXB0eUhpc3RvcnkoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVySGlzdG9yeVByZXZpZXcoKTtcbiAgICB9XG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFVzZXJDYXJkIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJzLWxpc3QvdXNlci1jYXJkJyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBVc2VyUHJldmlldyBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2Vycy1saXN0L3VzZXItcHJldmlldycgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgYmF0Y2ggZnJvbSAnbWlzYWdvL3V0aWxzL2JhdGNoJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0UGFnZXIoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucGFnZXMgPiAxKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPFBhZ2VyIHsuLi50aGlzLnByb3BzfSAvPlxuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmNsYXNzTmFtZSkge1xuICAgICAgcmV0dXJuIFwidXNlcnMtY2FyZHMtbGlzdCBcIiArIHRoaXMucHJvcHMuY2xhc3NOYW1lICsgXCIgdWktcmVhZHlcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwidXNlcnMtY2FyZHMtbGlzdCB1aS1yZWFkeVwiO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbENsYXNzTmFtZSgpIHtcbiAgICByZXR1cm4gXCJjb2wtbWQtXCIgKyAoMTIgLyB0aGlzLnByb3BzLmNvbHMpO1xuICB9XG5cbiAgZ2V0Qm9keSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5pc0xvYWRlZCkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIGJhdGNoKHRoaXMucHJvcHMudXNlcnMsIHRoaXMucHJvcHMuY29scykubWFwKChyb3csIHIpID0+IHtcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicm93XCIga2V5PXtyfT5cbiAgICAgICAgICB7cm93Lm1hcCgodXNlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENvbENsYXNzTmFtZSgpfSBrZXk9e3VzZXIuaWR9PlxuICAgICAgICAgICAgICA8VXNlckNhcmQgdXNlcj17dXNlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dTdGF0dXM9e3RoaXMucHJvcHMuc2hvd1N0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dSYW5rPXt0aGlzLnByb3BzLnNob3dSYW5rfSAvPlxuICAgICAgICAgICAgPC9kaXY+O1xuICAgICAgICAgIH0pfVxuICAgICAgICA8L2Rpdj47XG4gICAgICB9KTtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIGxldCByb3cgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wcm9wcy5jb2xzOyBpICsrKSB7XG4gICAgICAgIHJvdy5wdXNoKGkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAge3Jvdy5tYXAoKGkpID0+IHtcbiAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMuZ2V0Q29sQ2xhc3NOYW1lKCl9IGtleT17aX0+XG4gICAgICAgICAgICA8VXNlclByZXZpZXcgc2hvd1N0YXR1cz17dGhpcy5wcm9wcy5zaG93U3RhdHVzfSAvPlxuICAgICAgICAgIDwvZGl2PjtcbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwidXNlcnMtY2FyZHMtbGlzdCB1aS1yZWFkeVwiPlxuICAgICAge3RoaXMuZ2V0Qm9keSgpfVxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBdmF0YXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYXZhdGFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgU3RhdHVzLCB7IFN0YXR1c0ljb24sIFN0YXR1c0xhYmVsIH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlci1zdGF0dXMnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMudXNlci5yYW5rLmNzc19jbGFzcykge1xuICAgICAgcmV0dXJuICd1c2VyLWNhcmQgdXNlci1jYXJkLScgKyB0aGlzLnByb3BzLnVzZXIucmFuay5jc3NfY2xhc3MgKyAnIHVpLXJlYWR5JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICd1c2VyLWNhcmQgdWktcmVhZHknO1xuICAgIH1cbiAgfVxuXG4gIGdldFVzZXJTdGF0dXMoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2hvd1N0YXR1cykge1xuICAgICAgaWYgKHRoaXMucHJvcHMudXNlci5zdGF0dXMpIHtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgICByZXR1cm4gPFN0YXR1cyB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IHN0YXR1cz17dGhpcy5wcm9wcy51c2VyLnN0YXR1c30+XG4gICAgICAgICAgPFN0YXR1c0ljb24gdXNlcj17dGhpcy5wcm9wcy51c2VyfVxuICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cz17dGhpcy5wcm9wcy51c2VyLnN0YXR1c30gLz5cbiAgICAgICAgICA8U3RhdHVzTGFiZWwgdXNlcj17dGhpcy5wcm9wcy51c2VyfVxuICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM9e3RoaXMucHJvcHMudXNlci5zdGF0dXN9XG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInN0YXR1cy1sYWJlbFwiIC8+XG4gICAgICAgIDwvU3RhdHVzPjtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItc3RhdHVzXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwic3RhdHVzLWljb24gdWktcHJldmlld1wiPlxuICAgICAgICAgICAgJm5ic3A7XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInN0YXR1cy1sYWJlbCB1aS1wcmV2aWV3XCI+XG4gICAgICAgICAgICAmbmJzcDtcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldFJhbmtOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnNob3dSYW5rKSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy51c2VyLnJhbmsuaXNfdGFiKSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcmV0dXJuIDxhIGhyZWY9e3RoaXMucHJvcHMudXNlci5yYW5rLmFic29sdXRlX3VybH1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIml0ZW0tdGl0bGUgcmFuay1uYW1lXCI+XG4gICAgICAgICAge3RoaXMucHJvcHMudXNlci5yYW5rLm5hbWV9XG4gICAgICAgIDwvYT47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJpdGVtLXRpdGxlIHJhbmstbmFtZVwiPlxuICAgICAgICAgIHt0aGlzLnByb3BzLnVzZXIucmFuay5uYW1lfVxuICAgICAgICA8L3NwYW4+O1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRVc2VyVGl0bGUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMudXNlci50aXRsZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItdGl0bGVcIj57dGhpcy5wcm9wcy51c2VyLnRpdGxlfTwvc3Bhbj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRVc2VySm9pbmVkT24oKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGxldCB0aXRsZSA9IGludGVycG9sYXRlKGdldHRleHQoXCJKb2luZWQgb24gJShqb2luZWRfb24pc1wiKSwge1xuICAgICAgJ2pvaW5lZF9vbic6IHRoaXMucHJvcHMudXNlci5qb2luZWRfb24uZm9ybWF0KCdMTCwgTFQnKVxuICAgIH0sIHRydWUpO1xuXG4gICAgbGV0IGFnZSA9IGludGVycG9sYXRlKGdldHRleHQoXCJKb2luZWQgJShqb2luZWRfb24pc1wiKSwge1xuICAgICAgJ2pvaW5lZF9vbic6IHRoaXMucHJvcHMudXNlci5qb2luZWRfb24uZnJvbU5vdygpXG4gICAgfSwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPVwidXNlci1qb2luZWQtb25cIiB0aXRsZT17dGl0bGV9PlxuICAgICAge2FnZX1cbiAgICA8L3NwYW4+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRDbGFzc05hbWUoKX0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXItY2FyZC1iZy1pbWFnZVwiPlxuICAgICAgICA8QXZhdGFyIHVzZXI9e3RoaXMucHJvcHMudXNlcn0gc2l6ZT1cIjQwMFwiIGNsYXNzTmFtZT1cImJnLWltYWdlXCIgLz5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXItY2FyZC1iZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlci1kZXRhaWxzXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlci1hdmF0YXJcIj5cbiAgICAgICAgICAgICAgPGEgaHJlZj17dGhpcy5wcm9wcy51c2VyLmFic29sdXRlX3VybH0+XG4gICAgICAgICAgICAgICAgPEF2YXRhciB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IHNpemU9XCI0MDBcIiAvPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cInVzZXItbmFtZVwiPlxuICAgICAgICAgICAgICA8YSBocmVmPXt0aGlzLnByb3BzLnVzZXIuYWJzb2x1dGVfdXJsfSBjbGFzc05hbWU9XCJpdGVtLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMudXNlci51c2VybmFtZX1cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9oND5cblxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidXNlci1zdWJzY3JpcHRcIj5cbiAgICAgICAgICAgICAge3RoaXMuZ2V0VXNlclN0YXR1cygpfVxuICAgICAgICAgICAgICB7dGhpcy5nZXRSYW5rTmFtZSgpfVxuICAgICAgICAgICAgICB7dGhpcy5nZXRVc2VyVGl0bGUoKX1cbiAgICAgICAgICAgICAge3RoaXMuZ2V0VXNlckpvaW5lZE9uKCl9XG4gICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXItY2FyZC1zdGF0c1wiPlxuXG4gICAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibGlzdC11bnN0eWxlZFwiPlxuICAgICAgICAgICAgICA8bGkgY2xhc3NOYW1lPVwidXNlci1wb3N0cy1jb3VudFwiPlxuICAgICAgICAgICAgICAgIDxzdHJvbmc+e3RoaXMucHJvcHMudXNlci5wb3N0c308L3N0cm9uZz5cbiAgICAgICAgICAgICAgICA8c21hbGw+e2dldHRleHQoXCJwb3N0c1wiKX08L3NtYWxsPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3NOYW1lPVwidXNlci10aHJlYWRzLWNvdW50XCI+XG4gICAgICAgICAgICAgICAgPHN0cm9uZz57dGhpcy5wcm9wcy51c2VyLnRocmVhZHN9PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgPHNtYWxsPntnZXR0ZXh0KFwidGhyZWFkc1wiKX08L3NtYWxsPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3NOYW1lPVwidXNlci1mb2xsb3dlcnMtY291bnRcIj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPnt0aGlzLnByb3BzLnVzZXIuZm9sbG93ZXJzfTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDxzbWFsbD57Z2V0dGV4dChcImZvbGxvd2Vyc1wiKX08L3NtYWxsPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPC91bD5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBdmF0YXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYXZhdGFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgKiBhcyByYW5kb20gZnJvbSAnbWlzYWdvL3V0aWxzL3JhbmRvbSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldFVzZXJTdGF0dXMoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2hvd1N0YXR1cykge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItc3RhdHVzXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInN0YXR1cy1pY29uIHVpLXByZXZpZXdcIj5cbiAgICAgICAgICAmbmJzcDtcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzdGF0dXMtbGFiZWwgdWktcHJldmlld1wiPlxuICAgICAgICAgICZuYnNwO1xuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9J3VzZXItY2FyZCB1aS1wcmV2aWV3Jz5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlci1jYXJkLWJnLWltYWdlXCI+XG4gICAgICAgIDxBdmF0YXIgc2l6ZT1cIjQwMFwiIGNsYXNzTmFtZT1cImJnLWltYWdlXCIgLz5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzZXItY2FyZC1iZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlci1kZXRhaWxzXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlci1hdmF0YXJcIj5cbiAgICAgICAgICAgICAgPEF2YXRhciBzaXplPVwiNDAwXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwidXNlci1uYW1lXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIml0ZW0tdGl0bGVcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIiBzdHlsZT17e3dpZHRoOiByYW5kb20uaW50KDYwLCAxNTApICsgXCJweFwifX0+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2g0PlxuXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ1c2VyLXN1YnNjcmlwdFwiPlxuXG4gICAgICAgICAgICAgIHt0aGlzLmdldFVzZXJTdGF0dXMoKX1cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidXNlci1qb2luZWQtb25cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIiBzdHlsZT17e3dpZHRoOiByYW5kb20uaW50KDMwLCA1MCkgKyBcInB4XCJ9fT4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2VyLWNhcmQtc3RhdHNcIj5cblxuICAgICAgICAgICAgPHVsIGNsYXNzTmFtZT1cImxpc3QtdW5zdHlsZWRcIj5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzTmFtZT1cInVzZXItcG9zdHMtY291bnRcIj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidWktcHJldmlldy10ZXh0XCI+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDxzbWFsbD57Z2V0dGV4dChcInBvc3RzXCIpfTwvc21hbGw+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaSBjbGFzc05hbWU9XCJ1c2VyLXRocmVhZHMtY291bnRcIj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidWktcHJldmlldy10ZXh0XCI+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDxzbWFsbD57Z2V0dGV4dChcInRocmVhZHNcIil9PC9zbWFsbD5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzTmFtZT1cInVzZXItZm9sbG93ZXJzLWNvdW50XCI+XG4gICAgICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVpLXByZXZpZXctdGV4dFwiPiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICA8c21hbGw+e2dldHRleHQoXCJmb2xsb3dlcnNcIil9PC9zbWFsbD5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0RW1wdHlNZXNzYWdlKCkge1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZShcbiAgICAgIGdldHRleHQoXCJObyB1c2VycyBoYXZlIHBvc3RlZCBhbnkgbmV3IG1lc3NhZ2VzIGR1cmluZyBsYXN0ICUoZGF5cylzIGRheXMuXCIpLFxuICAgICAgeydkYXlzJzogdGhpcy5wcm9wcy50cmFja2VkUGVyaW9kfSwgdHJ1ZSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImFjdGl2ZS1wb3N0ZXJzLWxpc3RcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cImxlYWRcIj5cbiAgICAgICAgICB7dGhpcy5nZXRFbXB0eU1lc3NhZ2UoKX1cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEF2YXRhciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9hdmF0YXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBTdGF0dXMsIHsgU3RhdHVzSWNvbiwgU3RhdHVzTGFiZWwgfSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2VyLXN0YXR1cyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucmFuay5jc3NfY2xhc3MpIHtcbiAgICAgIHJldHVybiBcImxpc3QtZ3JvdXAtaXRlbSBsaXN0LWdyb3VwLXJhbmstXCIgKyB0aGlzLnByb3BzLnJhbmsuY3NzX2NsYXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJsaXN0LWdyb3VwLWl0ZW1cIjtcbiAgICB9XG4gIH1cblxuICBnZXRVc2VyU3RhdHVzKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnVzZXIuc3RhdHVzKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPFN0YXR1cyB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IHN0YXR1cz17dGhpcy5wcm9wcy51c2VyLnN0YXR1c30+XG4gICAgICAgIDxTdGF0dXNJY29uIHVzZXI9e3RoaXMucHJvcHMudXNlcn1cbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzPXt0aGlzLnByb3BzLnVzZXIuc3RhdHVzfSAvPlxuICAgICAgICA8U3RhdHVzTGFiZWwgdXNlcj17dGhpcy5wcm9wcy51c2VyfVxuICAgICAgICAgICAgICAgICAgICAgc3RhdHVzPXt0aGlzLnByb3BzLnVzZXIuc3RhdHVzfVxuICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwic3RhdHVzLWxhYmVsIGhpZGRlbi14cyBoaWRkZW4tc21cIiAvPlxuICAgICAgPC9TdGF0dXM+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItc3RhdHVzXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInN0YXR1cy1pY29uIHVpLXByZXZpZXdcIj5cbiAgICAgICAgICAmbmJzcDtcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzdGF0dXMtbGFiZWwgdWktcHJldmlldyBoaWRkZW4teHMgaGlkZGVuLXNtXCI+XG4gICAgICAgICAgJm5ic3A7XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvc3Bhbj47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIGdldFJhbmtOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnJhbmsuaXNfdGFiKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICBsZXQgcmFua1VybCA9IG1pc2Fnby5nZXQoJ1VTRVJTX0xJU1RfVVJMJykgKyB0aGlzLnByb3BzLnJhbmsuc2x1ZyArICcvJztcbiAgICAgIHJldHVybiA8TGluayB0bz17cmFua1VybH0gY2xhc3NOYW1lPVwiaXRlbS10aXRsZSByYW5rLW5hbWVcIj5cbiAgICAgICAge3RoaXMucHJvcHMucmFuay5uYW1lfVxuICAgICAgPC9MaW5rPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJpdGVtLXRpdGxlIHJhbmstbmFtZVwiPlxuICAgICAgICB7dGhpcy5wcm9wcy5yYW5rLm5hbWV9XG4gICAgICA8L3NwYW4+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9XG4gIH1cblxuICBnZXRVc2VyVGl0bGUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMudXNlci50aXRsZSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItdGl0bGUgaGlkZGVuLXhzIGhpZGRlbi1zbVwiPlxuICAgICAgICB7dGhpcy5wcm9wcy51c2VyLnRpdGxlfVxuICAgICAgPC9zcGFuPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxsaSBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3NOYW1lKCl9PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJyYW5rLXVzZXItYXZhdGFyXCI+XG4gICAgICAgIDxhIGhyZWY9e3RoaXMucHJvcHMudXNlci5hYnNvbHV0ZV91cmx9PlxuICAgICAgICAgIDxBdmF0YXIgdXNlcj17dGhpcy5wcm9wcy51c2VyfSBzaXplPVwiNTBcIiAvPlxuICAgICAgICA8L2E+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJyYW5rLXVzZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2VyLW5hbWVcIj5cbiAgICAgICAgICA8YSBocmVmPXt0aGlzLnByb3BzLnVzZXIuYWJzb2x1dGVfdXJsfSBjbGFzc05hbWU9XCJpdGVtLXRpdGxlXCI+XG4gICAgICAgICAgICB7dGhpcy5wcm9wcy51c2VyLnVzZXJuYW1lfVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHt0aGlzLmdldFVzZXJTdGF0dXMoKX1cbiAgICAgICAge3RoaXMuZ2V0UmFua05hbWUoKX1cbiAgICAgICAge3RoaXMuZ2V0VXNlclRpdGxlKCl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJyYW5rLXBvc2l0aW9uXCI+XG4gICAgICAgIDxzdHJvbmc+I3t0aGlzLnByb3BzLmNvdW50ZXJ9PC9zdHJvbmc+XG4gICAgICAgIDxzbWFsbD57Z2V0dGV4dChcIlJhbmtcIil9PC9zbWFsbD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInJhbmstcG9zdHMtY291bnRlZFwiPlxuICAgICAgICA8c3Ryb25nPnt0aGlzLnByb3BzLnVzZXIubWV0YS5zY29yZX08L3N0cm9uZz5cbiAgICAgICAgPHNtYWxsPntnZXR0ZXh0KFwiUmFua2VkIHBvc3RzXCIpfTwvc21hbGw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJyYW5rLXBvc3RzLXRvdGFsXCI+XG4gICAgICAgIDxzdHJvbmc+e3RoaXMucHJvcHMudXNlci5wb3N0c308L3N0cm9uZz5cbiAgICAgICAgPHNtYWxsPntnZXR0ZXh0KFwiVG90YWwgcG9zdHNcIil9PC9zbWFsbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbGk+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEF2YXRhciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9hdmF0YXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCAqIGFzIHJhbmRvbSBmcm9tICdtaXNhZ28vdXRpbHMvcmFuZG9tJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJhY3RpdmUtcG9zdGVycy1saXN0XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkIHVpLXByZXZpZXctcGFyYWdyYXBoXCI+XG4gICAgICAgICAge3JhbmRvbS5yYW5nZSgzLCA0KS5tYXAoKGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiA8c3BhbiBrZXk9e2l9IGNsYXNzTmFtZT1cInVpLXByZXZpZXctdGV4dFwiIHN0eWxlPXt7d2lkdGg6IHJhbmRvbS5pbnQoNTAsIDEyMCkgKyBcInB4XCJ9fT4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvcD5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFjdGl2ZS1wb3N0ZXJzIHVpLXByZXZpZXdcIj5cbiAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibGlzdC1ncm91cFwiPlxuICAgICAgICAgICAge3JhbmRvbS5yYW5nZSg1LCAxMCkubWFwKChpLCBjb3VudGVyKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiA8bGkga2V5PXtpfSBjbGFzc05hbWU9XCJsaXN0LWdyb3VwLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJhbmstdXNlci1hdmF0YXJcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICA8QXZhdGFyIHNpemU9XCI1MFwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJhbmstdXNlclwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2VyLW5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaXRlbS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVpLXByZXZpZXctdGV4dFwiIHN0eWxlPXt7d2lkdGg6IHJhbmRvbS5pbnQoMzAsIDgwKSArIFwicHhcIn19PiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVzZXItc3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInN0YXR1cy1pY29uIHVpLXByZXZpZXdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAmbmJzcDtcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzdGF0dXMtbGFiZWwgdWktcHJldmlldyBoaWRkZW4teHMgaGlkZGVuLXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgJm5ic3A7XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInJhbmstbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIiBzdHlsZT17e3dpZHRoOiByYW5kb20uaW50KDMwLCA1MCkgKyBcInB4XCJ9fT4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1c2VyLXRpdGxlIGhpZGRlbi14cyBoaWRkZW4tc21cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidWktcHJldmlldy10ZXh0XCIgc3R5bGU9e3t3aWR0aDogcmFuZG9tLmludCgzMCwgNTApICsgXCJweFwifX0+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyYW5rLXBvc2l0aW9uXCI+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ1aS1wcmV2aWV3LXRleHRcIiBzdHlsZT17e3dpZHRoOiBcIjMwcHhcIn19PiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHNtYWxsPntnZXR0ZXh0KFwiUmFua1wiKX08L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyYW5rLXBvc3RzLWNvdW50ZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVpLXByZXZpZXctdGV4dFwiIHN0eWxlPXt7d2lkdGg6IFwiMzBweFwifX0+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICA8c21hbGw+e2dldHRleHQoXCJSYW5rZWQgcG9zdHNcIil9PC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmFuay1wb3N0cy10b3RhbFwiPlxuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidWktcHJldmlldy10ZXh0XCIgc3R5bGU9e3t3aWR0aDogXCIzMHB4XCJ9fT4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgIDxzbWFsbD57Z2V0dGV4dChcIlRvdGFsIHBvc3RzXCIpfTwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbGk+O1xuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTGlzdEl0ZW0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvbGlzdC1pdGVtJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0TGVhZE1lc3NhZ2UoKSB7XG4gICAgbGV0IG1lc3NhZ2UgPSBuZ2V0dGV4dChcbiAgICAgICAgXCIlKHBvc3RlcnMpcyBtb3N0IGFjdGl2ZSBwb3N0ZXIgZnJvbSBsYXN0ICUoZGF5cylzIGRheXMuXCIsXG4gICAgICAgIFwiJShwb3N0ZXJzKXMgbW9zdCBhY3RpdmUgcG9zdGVycyBmcm9tIGxhc3QgJShkYXlzKXMgZGF5cy5cIixcbiAgICAgICAgdGhpcy5wcm9wcy5jb3VudCk7XG5cbiAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwge1xuICAgICAgcG9zdGVyczogdGhpcy5wcm9wcy5jb3VudCxcbiAgICAgIGRheXM6IHRoaXMucHJvcHMudHJhY2tlZFBlcmlvZFxuICAgIH0sIHRydWUpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJhY3RpdmUtcG9zdGVycy1saXN0XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgICAge3RoaXMuZ2V0TGVhZE1lc3NhZ2UoKX1cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWN0aXZlLXBvc3RlcnMgdWktcmVhZHlcIj5cbiAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibGlzdC1ncm91cFwiPlxuICAgICAgICAgICAge3RoaXMucHJvcHMudXNlcnMubWFwKCh1c2VyLCBpKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiA8TGlzdEl0ZW0gdXNlcj17dXNlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5rPXt1c2VyLnJhbmt9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcj17aSArIDF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXt1c2VyLmlkfSAvPjtcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IExpc3RFbXB0eSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2Vycy9hY3RpdmUtcG9zdGVycy9saXN0LWVtcHR5JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTGlzdExvYWRpbmcgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvbGlzdC1sb2FkaW5nJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTGlzdCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2Vycy9hY3RpdmUtcG9zdGVycy9saXN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgeyBkZWh5ZHJhdGUgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvdXNlcnMnO1xuaW1wb3J0IHBvbGxzIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9wb2xscyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcbmltcG9ydCB0aXRsZSBmcm9tICdtaXNhZ28vc2VydmljZXMvcGFnZS10aXRsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICBpZiAobWlzYWdvLmhhcygnVVNFUlMnKSkge1xuICAgICAgdGhpcy5pbml0V2l0aFByZWxvYWRlZERhdGEobWlzYWdvLnBvcCgnVVNFUlMnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdFdpdGhvdXRQcmVsb2FkZWREYXRhKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydFBvbGxpbmcoKTtcbiAgfVxuXG4gIGluaXRXaXRoUHJlbG9hZGVkRGF0YShkYXRhKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTG9hZGVkOiB0cnVlLFxuXG4gICAgICB0cmFja2VkUGVyaW9kOiBkYXRhLnRyYWNrZWRfcGVyaW9kLFxuICAgICAgY291bnQ6IGRhdGEuY291bnRcbiAgICB9O1xuXG4gICAgc3RvcmUuZGlzcGF0Y2goZGVoeWRyYXRlKGRhdGEucmVzdWx0cykpO1xuICB9XG5cbiAgaW5pdFdpdGhvdXRQcmVsb2FkZWREYXRhKCkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0xvYWRlZDogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgc3RhcnRQb2xsaW5nKCkge1xuICAgIHBvbGxzLnN0YXJ0KHtcbiAgICAgIHBvbGw6ICdhY3RpdmUtcG9zdGVycycsXG4gICAgICB1cmw6IG1pc2Fnby5nZXQoJ1VTRVJTX0FQSScpLFxuICAgICAgZGF0YToge1xuICAgICAgICBsaXN0OiAnYWN0aXZlJ1xuICAgICAgfSxcbiAgICAgIGZyZXF1ZW5jeTogOTAgKiAxMDAwLFxuICAgICAgdXBkYXRlOiB0aGlzLnVwZGF0ZVxuICAgIH0pO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICB1cGRhdGUgPSAoZGF0YSkgPT4ge1xuICAgIHN0b3JlLmRpc3BhdGNoKGRlaHlkcmF0ZShkYXRhLnJlc3VsdHMpKTtcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgaXNMb2FkZWQ6IHRydWUsXG5cbiAgICAgIHRyYWNrZWRQZXJpb2Q6IGRhdGEudHJhY2tlZF9wZXJpb2QsXG4gICAgICBjb3VudDogZGF0YS5jb3VudFxuICAgIH0pO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRpdGxlLnNldCh7XG4gICAgICB0aXRsZTogdGhpcy5wcm9wcy5yb3V0ZS5leHRyYS5uYW1lLFxuICAgICAgcGFyZW50OiBnZXR0ZXh0KFwiVXNlcnNcIilcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHBvbGxzLnN0b3AoJ2FjdGl2ZS1wb3N0ZXJzJyk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaXNMb2FkZWQpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmNvdW50ID4gMCkge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8TGlzdCB1c2Vycz17dGhpcy5wcm9wcy51c2Vyc31cbiAgICAgICAgICAgICAgICAgICAgIHRyYWNrZWRQZXJpb2Q9e3RoaXMuc3RhdGUudHJhY2tlZFBlcmlvZH1cbiAgICAgICAgICAgICAgICAgICAgIGNvdW50PXt0aGlzLnN0YXRlLmNvdW50fSAvPjtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgcmV0dXJuIDxMaXN0RW1wdHkgdHJhY2tlZFBlcmlvZD17dGhpcy5zdGF0ZS50cmFja2VkUGVyaW9kfSAvPjtcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxMaXN0TG9hZGluZyAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IExpbmsgfSBmcm9tICdyZWFjdC1yb3V0ZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBMaSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9saSc7IC8vanNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7IC8vanNoaW50IGlnbm9yZTpsaW5lXG5cbi8vIGpzaGludCBpZ25vcmU6c3RhcnRcbmxldCBsaXN0VXJsID0gZnVuY3Rpb24oYmFzZVVybCwgbGlzdCkge1xuICBsZXQgdXJsID0gYmFzZVVybDtcbiAgaWYgKGxpc3QuY29tcG9uZW50ID09PSAncmFuaycpIHtcbiAgICB1cmwgKz0gbGlzdC5zbHVnO1xuICB9IGVsc2Uge1xuICAgIHVybCArPSBsaXN0LmNvbXBvbmVudDtcbiAgfVxuICByZXR1cm4gdXJsICsgJy8nO1xufTtcblxubGV0IG5hdkxpbmtzID0gZnVuY3Rpb24oYmFzZVVybCwgbGlzdHMsIGhpZGVOYXYpIHtcbiAgICByZXR1cm4gbGlzdHMubWFwKGZ1bmN0aW9uKGxpc3QpIHtcbiAgICAgIGxldCB1cmwgPSBsaXN0VXJsKGJhc2VVcmwsIGxpc3QpO1xuICAgICAgcmV0dXJuIDxMaSBwYXRoPXt1cmx9XG4gICAgICAgICAgICAgICAgIGtleT17dXJsfT5cbiAgICAgICAgPExpbmsgdG89e3VybH0gb25DbGljaz17aGlkZU5hdn0+XG4gICAgICAgICAge2xpc3QubmFtZX1cbiAgICAgICAgPC9MaW5rPlxuICAgICAgPC9MaT47XG4gIH0pO1xufTtcbi8vIGpzaGludCBpZ25vcmU6ZW5kXG5cbmV4cG9ydCBjbGFzcyBUYWJzTmF2IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8vIGpzaGludCBpZ25vcmU6c3RhcnRcbiAgICByZXR1cm4gPHVsIGNsYXNzTmFtZT1cIm5hdiBuYXYtcGlsbHNcIj5cbiAgICAgIHtuYXZMaW5rcyh0aGlzLnByb3BzLmJhc2VVcmwsIHRoaXMucHJvcHMubGlzdHMpfVxuICAgIDwvdWw+O1xuICAgIC8vIGpzaGludCBpZ25vcmU6ZW5kXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBhY3ROYXYgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLy8ganNoaW50IGlnbm9yZTpzdGFydFxuICAgIHJldHVybiA8dWwgY2xhc3NOYW1lPVwiZHJvcGRvd24tbWVudVwiIHJvbGU9XCJtZW51XCI+XG4gICAgICB7bmF2TGlua3ModGhpcy5wcm9wcy5iYXNlVXJsLCB0aGlzLnByb3BzLmxpc3RzLCB0aGlzLnByb3BzLmhpZGVOYXYpfVxuICAgIDwvdWw+O1xuICAgIC8vIGpzaGludCBpZ25vcmU6ZW5kXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFVzZXJzTGlzdCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2Vycy1saXN0L3Jvb3QnIC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXY+XG4gICAgICA8VXNlcnNMaXN0IGlzTG9hZGVkPXtmYWxzZX0gY29scz17M30gc2hvd1N0YXR1cz17dHJ1ZX0gLz5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQYWdlciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy91c2Vycy9yYW5rL3BhZ2VyJyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBVc2Vyc0xpc3QgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMtbGlzdC9yb290JyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRQYWdlcigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5wYWdlcyA+IDEpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8UGFnZXIgey4uLnRoaXMucHJvcHN9IC8+XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2PlxuICAgICAgPFVzZXJzTGlzdCB1c2Vycz17dGhpcy5wcm9wcy51c2Vyc31cbiAgICAgICAgICAgICAgICAgc2hvd1N0YXR1cz17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgY29scz17M31cbiAgICAgICAgICAgICAgICAgaXNMb2FkZWQ9e3RydWV9IC8+XG5cbiAgICAgIHt0aGlzLmdldFBhZ2VyKCl9XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHJlc2V0U2Nyb2xsIGZyb20gJ21pc2Fnby91dGlscy9yZXNldC1zY3JvbGwnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRQcmV2aW91c1BhZ2UoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJldmlvdXMgfHwgdGhpcy5wcm9wcy5maXJzdCkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgbGV0IHVybCA9IHRoaXMucHJvcHMuYmFzZVVybDtcbiAgICAgIGlmICh0aGlzLnByb3BzLnByZXZpb3VzKSB7XG4gICAgICAgIHVybCArPSB0aGlzLnByb3BzLnByZXZpb3VzICsgJy8nO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT1cInByZXZpb3VzXCI+XG4gICAgICAgIDxMaW5rIHRvPXt1cmx9IG9uQ2xpY2s9e3Jlc2V0U2Nyb2xsfT5cbiAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICBhcnJvd19iYWNrXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L0xpbms+XG4gICAgICA8L2xpPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldE5leHRQYWdlKCkge1xuICAgIGlmICh0aGlzLnByb3BzLm5leHQpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIGxldCB1cmwgPSB0aGlzLnByb3BzLmJhc2VVcmwgKyB0aGlzLnByb3BzLm5leHQgKyAnLyc7XG4gICAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT1cIm5leHRcIj5cbiAgICAgICAgPExpbmsgdG89e3VybH0gb25DbGljaz17cmVzZXRTY3JvbGx9PlxuICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgIGFycm93X2ZvcndhcmRcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvTGluaz5cbiAgICAgIDwvbGk+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHJvZ2Vzc0JhcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDx1bCBjbGFzc05hbWU9XCJwYWdlci1wcm9ncmVzcy1iYXJcIj5cbiAgICAgIHt0aGlzLnByb3BzLnBhZ2VfcmFuZ2UubWFwKChwYWdlKSA9PiB7XG4gICAgICAgIGxldCBjbGFzc05hbWUgPSBwYWdlID09PSB0aGlzLnByb3BzLnBhZ2UgPyAnYWN0aXZlJyA6IG51bGw7XG4gICAgICAgIGxldCB1cmwgPSB0aGlzLnByb3BzLmJhc2VVcmw7XG5cbiAgICAgICAgaWYgKHBhZ2UgPiAxKSB7XG4gICAgICAgICAgdXJsICs9IHBhZ2UgKyAnLyc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gPGxpIGtleT17cGFnZX0gY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAgICAgIDxMaW5rIHRvPXt1cmx9IG9uQ2xpY2s9e3Jlc2V0U2Nyb2xsfT5cbiAgICAgICAgICAgIHtwYWdlfVxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgPC9saT47XG4gICAgICB9KX1cbiAgICA8L3VsPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJwYWdlci11bmRlcmNvbnRlbnRcIj5cbiAgICAgIDxuYXY+XG4gICAgICAgIDx1bCBjbGFzc05hbWU9XCJwYWdlclwiPlxuICAgICAgICAgIHt0aGlzLmdldFByZXZpb3VzUGFnZSgpfVxuICAgICAgICAgIHt0aGlzLmdldE5leHRQYWdlKCl9XG4gICAgICAgIDwvdWw+XG4gICAgICAgIHt0aGlzLmdldFByb2dlc3NCYXIoKX1cbiAgICAgIDwvbmF2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBMaXN0IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXJzL3JhbmsvbGlzdCcgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTGlzdExvYWRpbmcgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMvcmFuay9saXN0LWxvYWRpbmcnIC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgZGVoeWRyYXRlIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJzJztcbmltcG9ydCBwb2xscyBmcm9tICdtaXNhZ28vc2VydmljZXMvcG9sbHMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5pbXBvcnQgdGl0bGUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3BhZ2UtdGl0bGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgaWYgKG1pc2Fnby5oYXMoJ1VTRVJTJykpIHtcbiAgICAgIHRoaXMuaW5pdFdpdGhQcmVsb2FkZWREYXRhKG1pc2Fnby5wb3AoJ1VTRVJTJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluaXRXaXRob3V0UHJlbG9hZGVkRGF0YSgpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRQb2xsaW5nKHByb3BzLnBhcmFtcy5wYWdlIHx8IDEpO1xuICB9XG5cbiAgaW5pdFdpdGhQcmVsb2FkZWREYXRhKGRhdGEpIHtcbiAgICB0aGlzLnN0YXRlID0gT2JqZWN0LmFzc2lnbihkYXRhLCB7XG4gICAgICBpc0xvYWRlZDogdHJ1ZVxuICAgIH0pO1xuICAgIHN0b3JlLmRpc3BhdGNoKGRlaHlkcmF0ZShkYXRhLnJlc3VsdHMpKTtcbiAgfVxuXG4gIGluaXRXaXRob3V0UHJlbG9hZGVkRGF0YSgpIHtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNMb2FkZWQ6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIHN0YXJ0UG9sbGluZyhwYWdlKSB7XG4gICAgcG9sbHMuc3RhcnQoe1xuICAgICAgcG9sbDogJ3JhbmstdXNlcnMnLFxuICAgICAgdXJsOiBtaXNhZ28uZ2V0KCdVU0VSU19BUEknKSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcmFuazogdGhpcy5wcm9wcy5yb3V0ZS5yYW5rLmlkLFxuICAgICAgICBwYWdlOiBwYWdlXG4gICAgICB9LFxuICAgICAgZnJlcXVlbmN5OiA5MCAqIDEwMDAsXG4gICAgICB1cGRhdGU6IHRoaXMudXBkYXRlXG4gICAgfSk7XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIHVwZGF0ZSA9IChkYXRhKSA9PiB7XG4gICAgc3RvcmUuZGlzcGF0Y2goZGVoeWRyYXRlKGRhdGEucmVzdWx0cykpO1xuXG4gICAgZGF0YS5pc0xvYWRlZCA9IHRydWU7XG4gICAgdGhpcy5zZXRTdGF0ZShkYXRhKTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aXRsZS5zZXQoe1xuICAgICAgdGl0bGU6IHRoaXMucHJvcHMucm91dGUucmFuay5uYW1lLFxuICAgICAgcGFnZTogdGhpcy5wcm9wcy5wYXJhbXMucGFnZSB8fCBudWxsLFxuICAgICAgcGFyZW50OiBnZXR0ZXh0KFwiVXNlcnNcIilcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHBvbGxzLnN0b3AoJ3JhbmstdXNlcnMnKTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucGFyYW1zLnBhZ2UgIT09IG5leHRQcm9wcy5wYXJhbXMucGFnZSkge1xuICAgICAgdGl0bGUuc2V0KHtcbiAgICAgICAgdGl0bGU6IHRoaXMucHJvcHMucm91dGUucmFuay5uYW1lLFxuICAgICAgICBwYWdlOiBuZXh0UHJvcHMucGFyYW1zLnBhZ2UgfHwgbnVsbCxcbiAgICAgICAgcGFyZW50OiBnZXR0ZXh0KFwiVXNlcnNcIilcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkZWQ6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgcG9sbHMuc3RvcCgncmFuay11c2VycycpO1xuICAgICAgdGhpcy5zdGFydFBvbGxpbmcobmV4dFByb3BzLnBhcmFtcy5wYWdlKTtcbiAgICB9XG4gIH1cblxuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucm91dGUucmFuay5jc3NfY2xhc3MpIHtcbiAgICAgIHJldHVybiAncmFuay11c2Vycy1saXN0IHJhbmstdXNlcnMtJyArIHRoaXMucHJvcHMucm91dGUucmFuay5jc3NfY2xhc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAncmFuay11c2Vycy1saXN0JztcbiAgICB9XG4gIH1cblxuICBnZXRSYW5rRGVzY3JpcHRpb24oKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucm91dGUucmFuay5kZXNjcmlwdGlvbikge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicmFuay1kZXNjcmlwdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxlYWRcIiBkYW5nZXJvdXNseVNldElubmVySFRNTD17e1xuICAgICAgICAgIF9faHRtbDogdGhpcy5wcm9wcy5yb3V0ZS5yYW5rLmRlc2NyaXB0aW9uLmh0bWxcbiAgICAgICAgfX0gLz5cbiAgICAgIDwvZGl2PjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbXBvbmVudCgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5pc0xvYWRlZCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUuY291bnQgPiAwKSB7XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgbGV0IGJhc2VVcmwgPSBtaXNhZ28uZ2V0KCdVU0VSU19MSVNUX1VSTCcpICsgdGhpcy5wcm9wcy5yb3V0ZS5yYW5rLnNsdWcgKyAnLyc7XG4gICAgICAgIHJldHVybiA8TGlzdCBiYXNlVXJsPXtiYXNlVXJsfVxuICAgICAgICAgICAgICAgICAgICAgdXNlcnM9e3RoaXMucHJvcHMudXNlcnN9XG4gICAgICAgICAgICAgICAgICAgICB7Li4udGhpcy5zdGF0ZX0gLz47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgICAge2dldHRleHQoXCJUaGVyZSBhcmUgbm8gdXNlcnMgd2l0aCB0aGlzIHJhbmsgYXQgdGhlIG1vbWVudC5cIil9XG4gICAgICAgIDwvcD47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8TGlzdExvYWRpbmcgLz47XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG4gICAgICAgIHt0aGlzLmdldFJhbmtEZXNjcmlwdGlvbigpfVxuICAgICAgICB7dGhpcy5nZXRDb21wb25lbnQoKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyBUYWJzTmF2LCBDb21wYWN0TmF2IH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMvbmF2cyc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEFjdGl2ZVBvc3RlcnMgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMvYWN0aXZlLXBvc3RlcnMvcm9vdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFJhbmsgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlcnMvcmFuay9yb290JztcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBkcm9wZG93bjogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICB0b2dnbGVOYXYgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24pIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcm9wZG93bjogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJvcGRvd246IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBoaWRlTmF2ID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZHJvcGRvd246IGZhbHNlXG4gICAgfSk7XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgZ2V0VG9nZ2xlTmF2Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmRyb3Bkb3duKSB7XG4gICAgICByZXR1cm4gJ2J0biBidG4tZGVmYXVsdCBidG4taWNvbiBvcGVuJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdidG4gYnRuLWRlZmF1bHQgYnRuLWljb24nO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbXBhY3ROYXZDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZHJvcGRvd24pIHtcbiAgICAgIHJldHVybiAnY29tcGFjdC1uYXYgb3Blbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnY29tcGFjdC1uYXYnO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicGFnZSBwYWdlLXVzZXJzLWxpc3RzXCI+XG5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGFnZS1oZWFkZXIgdGFiYmVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG5cbiAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwicHVsbC1sZWZ0XCI+e2dldHRleHQoXCJVc2Vyc1wiKX08L2gxPlxuXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG4gYnRuLWRlZmF1bHQgYnRuLWFsaWduZWQgYnRuLWljb24gYnRuLWRyb3Bkb3duLXRvZ2dsZSBoaWRkZW4tbWQgaGlkZGVuLWxnXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy50b2dnbGVOYXZ9XG4gICAgICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWV4cGFuZGVkPXt0aGlzLnN0YXRlLmRyb3Bkb3duID8gJ3RydWUnIDogJ2ZhbHNlJ30+XG4gICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICAgIG1lbnVcbiAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwYWdlLXRhYnMgaGlkZGVuLXhzIGhpZGRlbi1zbVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG5cbiAgICAgICAgICAgIDxUYWJzTmF2IGxpc3RzPXttaXNhZ28uZ2V0KCdVU0VSU19MSVNUUycpfVxuICAgICAgICAgICAgICAgICAgICAgYmFzZVVybD17bWlzYWdvLmdldCgnVVNFUlNfTElTVF9VUkwnKX0gLz5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMuZ2V0Q29tcGFjdE5hdkNsYXNzTmFtZSgpfT5cblxuICAgICAgICA8Q29tcGFjdE5hdiBsaXN0cz17bWlzYWdvLmdldCgnVVNFUlNfTElTVFMnKX1cbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybD17bWlzYWdvLmdldCgnVVNFUlNfTElTVF9VUkwnKX1cbiAgICAgICAgICAgICAgICAgICAgaGlkZU5hdj17dGhpcy5oaWRlTmF2fSAvPlxuXG4gICAgICA8L2Rpdj5cblxuICAgICAge3RoaXMucHJvcHMuY2hpbGRyZW59XG5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0KHN0b3JlKSB7XG4gIHJldHVybiB7XG4gICAgJ3RpY2snOiBzdG9yZS50aWNrLnRpY2ssXG4gICAgJ3VzZXInOiBzdG9yZS5hdXRoLnVzZXIsXG4gICAgJ3VzZXJzJzogc3RvcmUudXNlcnNcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhzKCkge1xuICBsZXQgcGF0aHMgPSBbXTtcblxuICBtaXNhZ28uZ2V0KCdVU0VSU19MSVNUUycpLmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgIGlmIChpdGVtLmNvbXBvbmVudCA9PT0gJ3JhbmsnKSB7XG4gICAgICBwYXRocy5wdXNoKHtcbiAgICAgICAgcGF0aDogbWlzYWdvLmdldCgnVVNFUlNfTElTVF9VUkwnKSArIGl0ZW0uc2x1ZyArICcvOnBhZ2UvJyxcbiAgICAgICAgY29tcG9uZW50OiBjb25uZWN0KHNlbGVjdCkoUmFuayksXG4gICAgICAgIHJhbms6IGl0ZW1cbiAgICAgIH0pO1xuICAgICAgcGF0aHMucHVzaCh7XG4gICAgICAgIHBhdGg6IG1pc2Fnby5nZXQoJ1VTRVJTX0xJU1RfVVJMJykgKyBpdGVtLnNsdWcgKyAnLycsXG4gICAgICAgIGNvbXBvbmVudDogY29ubmVjdChzZWxlY3QpKFJhbmspLFxuICAgICAgICByYW5rOiBpdGVtXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0uY29tcG9uZW50ID09PSAnYWN0aXZlLXBvc3RlcnMnKXtcbiAgICAgIHBhdGhzLnB1c2goe1xuICAgICAgICBwYXRoOiBtaXNhZ28uZ2V0KCdVU0VSU19MSVNUX1VSTCcpICsgaXRlbS5jb21wb25lbnQgKyAnLycsXG4gICAgICAgIGNvbXBvbmVudDogY29ubmVjdChzZWxlY3QpKEFjdGl2ZVBvc3RlcnMpLFxuICAgICAgICBleHRyYToge1xuICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXRocztcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnZhbHVlKSB7XG4gICAgICByZXR1cm4gXCJidG4gYnRuLXllcy1ubyBidG4teWVzLW5vLW9uXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcImJ0biBidG4teWVzLW5vIGJ0bi15ZXMtbm8tb2ZmXCI7XG4gICAgfVxuICB9XG5cbiAgZ2V0SWNvbigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy52YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuaWNvbk9uIHx8ICdjaGVja19ib3gnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5pY29uT2ZmIHx8ICdjaGVja19ib3hfb3V0bGluZV9ibGFuayc7XG4gICAgfVxuICB9XG5cbiAgZ2V0TGFiZWwoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMudmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmxhYmVsT24gfHwgZ2V0dGV4dChcInllc1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMubGFiZWxPZmYgfHwgZ2V0dGV4dChcIm5vXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgdG9nZ2xlID0gKCkgPT4ge1xuICAgIHRoaXMucHJvcHMub25DaGFuZ2Uoe1xuICAgICAgdGFyZ2V0OiB7XG4gICAgICAgIHZhbHVlOiAhdGhpcy5wcm9wcy52YWx1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy50b2dnbGV9XG4gICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfVxuICAgICAgICAgICAgICAgICAgIGlkPXt0aGlzLnByb3BzLmlkIHx8IG51bGx9XG4gICAgICAgICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT17dGhpcy5wcm9wc1snYXJpYS1kZXNjcmliZWRieSddIHx8IG51bGx9XG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMucHJvcHMuZGlzYWJsZWQgfHwgZmFsc2V9PlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICB7dGhpcy5nZXRJY29uKCl9XG4gICAgICA8L3NwYW4+XG4gICAgICB7dGhpcy5nZXRMYWJlbCgpfVxuICAgIDwvYnV0dG9uPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IE9yZGVyZWRMaXN0IGZyb20gJ21pc2Fnby91dGlscy9vcmRlcmVkLWxpc3QnO1xuXG5leHBvcnQgY2xhc3MgTWlzYWdvIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5faW5pdGlhbGl6ZXJzID0gW107XG4gICAgdGhpcy5fY29udGV4dCA9IHt9O1xuICB9XG5cbiAgYWRkSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpIHtcbiAgICB0aGlzLl9pbml0aWFsaXplcnMucHVzaCh7XG4gICAgICBrZXk6IGluaXRpYWxpemVyLm5hbWUsXG5cbiAgICAgIGl0ZW06IGluaXRpYWxpemVyLmluaXRpYWxpemVyLFxuXG4gICAgICBhZnRlcjogaW5pdGlhbGl6ZXIuYWZ0ZXIsXG4gICAgICBiZWZvcmU6IGluaXRpYWxpemVyLmJlZm9yZVxuICAgIH0pO1xuICB9XG5cbiAgaW5pdChjb250ZXh0KSB7XG4gICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG5cbiAgICB2YXIgaW5pdE9yZGVyID0gbmV3IE9yZGVyZWRMaXN0KHRoaXMuX2luaXRpYWxpemVycykub3JkZXJlZFZhbHVlcygpO1xuICAgIGluaXRPcmRlci5mb3JFYWNoKGluaXRpYWxpemVyID0+IHtcbiAgICAgIGluaXRpYWxpemVyKHRoaXMpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gY29udGV4dCBhY2Nlc3NvcnNcbiAgaGFzKGtleSkge1xuICAgIHJldHVybiAhIXRoaXMuX2NvbnRleHRba2V5XTtcbiAgfVxuXG4gIGdldChrZXksIGZhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb250ZXh0W2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxsYmFjayB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcG9wKGtleSkge1xuICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICBsZXQgdmFsdWUgPSB0aGlzLl9jb250ZXh0W2tleV07XG4gICAgICB0aGlzLl9jb250ZXh0W2tleV0gPSBudWxsO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuXG4vLyBjcmVhdGUgIHNpbmdsZXRvblxudmFyIG1pc2FnbyA9IG5ldyBNaXNhZ28oKTtcblxuLy8gZXhwb3NlIGl0IGdsb2JhbGx5XG5nbG9iYWwubWlzYWdvID0gbWlzYWdvO1xuXG4vLyBhbmQgZXhwb3J0IGl0IGZvciB0ZXN0cyBhbmQgc3R1ZmZcbmV4cG9ydCBkZWZhdWx0IG1pc2FnbztcbiIsImltcG9ydCB7IFVQREFURV9BVkFUQVIsIFVQREFURV9VU0VSTkFNRSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy91c2Vycyc7XG5cbmV4cG9ydCB2YXIgaW5pdGlhbFN0YXRlID0ge1xuICBzaWduZWRJbjogZmFsc2UsXG4gIHNpZ25lZE91dDogZmFsc2Vcbn07XG5cbmV4cG9ydCBjb25zdCBQQVRDSF9VU0VSID0gJ1BBVENIX1VTRVInO1xuZXhwb3J0IGNvbnN0IFNJR05fSU4gPSAnU0lHTl9JTic7XG5leHBvcnQgY29uc3QgU0lHTl9PVVQgPSAnU0lHTl9PVVQnO1xuXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hVc2VyKHBhdGNoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogUEFUQ0hfVVNFUixcbiAgICBwYXRjaFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2lnbkluKHVzZXIpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBTSUdOX0lOLFxuICAgIHVzZXJcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNpZ25PdXQoc29mdD1mYWxzZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFNJR05fT1VULFxuICAgIHNvZnRcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXV0aChzdGF0ZT1pbml0aWFsU3RhdGUsIGFjdGlvbj1udWxsKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIFBBVENIX1VTRVI6XG4gICAgICAgIGxldCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKTtcbiAgICAgICAgbmV3U3RhdGUudXNlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnVzZXIsIGFjdGlvbi5wYXRjaCk7XG4gICAgICAgIHJldHVybiBuZXdTdGF0ZTtcblxuICAgIGNhc2UgU0lHTl9JTjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBzaWduZWRJbjogYWN0aW9uLnVzZXJcbiAgICAgIH0pO1xuXG4gICAgY2FzZSBTSUdOX09VVDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICBpc0Fub255bW91czogdHJ1ZSxcbiAgICAgICAgc2lnbmVkT3V0OiAhYWN0aW9uLnNvZnRcbiAgICAgIH0pO1xuXG4gICAgY2FzZSBVUERBVEVfQVZBVEFSOlxuICAgICAgaWYgKHN0YXRlLmlzQXV0aGVudGljYXRlZCAmJiBzdGF0ZS51c2VyLmlkID09PSBhY3Rpb24udXNlcklkKSB7XG4gICAgICAgIGxldCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKTtcbiAgICAgICAgbmV3U3RhdGUudXNlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnVzZXIsIHtcbiAgICAgICAgICAnYXZhdGFyX2hhc2gnOiBhY3Rpb24uYXZhdGFySGFzaFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRlO1xuXG4gICAgY2FzZSBVUERBVEVfVVNFUk5BTUU6XG4gICAgICBpZiAoc3RhdGUuaXNBdXRoZW50aWNhdGVkICYmIHN0YXRlLnVzZXIuaWQgPT09IGFjdGlvbi51c2VySWQpIHtcbiAgICAgICAgbGV0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpO1xuICAgICAgICBuZXdTdGF0ZS51c2VyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUudXNlciwge1xuICAgICAgICAgIHVzZXJuYW1lOiBhY3Rpb24udXNlcm5hbWUsXG4gICAgICAgICAgc2x1ZzogYWN0aW9uLnNsdWdcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cbiIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IFVQREFURV9BVkFUQVIsIFVQREFURV9VU0VSTkFNRSwgZGVoeWRyYXRlU3RhdHVzIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJzJztcblxuZXhwb3J0IGNvbnN0IERFSFlEUkFURV9QUk9GSUxFID0gJ0RFSFlEUkFURV9QUk9GSUxFJztcbmV4cG9ydCBjb25zdCBQQVRDSF9QUk9GSUxFID0gJ1BBVENIX1BST0ZJTEUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVoeWRyYXRlKHByb2ZpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBERUhZRFJBVEVfUFJPRklMRSxcbiAgICBwcm9maWxlXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFByb2ZpbGUocGF0Y2gpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBQQVRDSF9QUk9GSUxFLFxuICAgIHBhdGNoXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGF1dGgoc3RhdGU9e30sIGFjdGlvbj1udWxsKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIERFSFlEUkFURV9QUk9GSUxFOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGFjdGlvbi5wcm9maWxlLCB7XG4gICAgICAgIGpvaW5lZF9vbjogbW9tZW50KGFjdGlvbi5wcm9maWxlLmpvaW5lZF9vbiksXG4gICAgICAgIHN0YXR1czogZGVoeWRyYXRlU3RhdHVzKGFjdGlvbi5wcm9maWxlLnN0YXR1cylcbiAgICAgIH0pO1xuXG4gICAgY2FzZSBQQVRDSF9QUk9GSUxFOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCBhY3Rpb24ucGF0Y2gpO1xuXG4gICAgY2FzZSBVUERBVEVfQVZBVEFSOlxuICAgICAgaWYgKHN0YXRlLmlkID09PSBhY3Rpb24udXNlcklkKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICAgIGF2YXRhcl9oYXNoOiBhY3Rpb24uYXZhdGFySGFzaFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0ZTtcblxuICAgIGNhc2UgVVBEQVRFX1VTRVJOQU1FOlxuICAgICAgaWYgKHN0YXRlLmlkID09PSBhY3Rpb24udXNlcklkKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICAgIHVzZXJuYW1lOiBhY3Rpb24udXNlcm5hbWUsXG4gICAgICAgICAgc2x1ZzogYWN0aW9uLnNsdWdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdGU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG4iLCJleHBvcnQgdmFyIGluaXRpYWxTdGF0ZSA9IHtcbiAgdHlwZTogJ2luZm8nLFxuICBtZXNzYWdlOiAnJyxcbiAgaXNWaXNpYmxlOiBmYWxzZVxufTtcblxuZXhwb3J0IGNvbnN0IFNIT1dfU05BQ0tCQVIgPSAnU0hPV19TTkFDS0JBUic7XG5leHBvcnQgY29uc3QgSElERV9TTkFDS0JBUiA9ICdISURFX1NOQUNLQkFSJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNob3dTbmFja2JhcihtZXNzYWdlLCB0eXBlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogU0hPV19TTkFDS0JBUixcbiAgICBtZXNzYWdlLFxuICAgIG1lc3NhZ2VUeXBlOiB0eXBlXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoaWRlU25hY2tiYXIoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogSElERV9TTkFDS0JBUlxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzbmFja2JhcihzdGF0ZT1pbml0aWFsU3RhdGUsIGFjdGlvbj1udWxsKSB7XG4gIGlmIChhY3Rpb24udHlwZSA9PT0gU0hPV19TTkFDS0JBUikge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBhY3Rpb24ubWVzc2FnZVR5cGUsXG4gICAgICBtZXNzYWdlOiBhY3Rpb24ubWVzc2FnZSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZVxuICAgIH07XG4gIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09IEhJREVfU05BQ0tCQVIpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNWaXNpYmxlOiBmYWxzZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuIiwiZXhwb3J0IHZhciBpbml0aWFsU3RhdGUgPSB7XG4gIHRpY2s6IDBcbn07XG5cbmV4cG9ydCBjb25zdCBUSUNLID0gJ1RJQ0snO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9UaWNrKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFRJQ0tcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdGljayhzdGF0ZT1pbml0aWFsU3RhdGUsIGFjdGlvbj1udWxsKSB7XG4gIGlmIChhY3Rpb24udHlwZSA9PT0gVElDSykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICB0aWNrOiBzdGF0ZS50aWNrICsgMVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVVBEQVRFX0FWQVRBUiwgVVBEQVRFX1VTRVJOQU1FIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJzJztcblxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5leHBvcnQgY29uc3QgQUREX05BTUVfQ0hBTkdFID0gJ0FERF9OQU1FX0NIQU5HRSc7XG5leHBvcnQgY29uc3QgQVBQRU5EX0hJU1RPUlkgPSAnQVBQRU5EX0hJU1RPUlknO1xuZXhwb3J0IGNvbnN0IERFSFlEUkFURV9ISVNUT1JZID0gJ0RFSFlEUkFURV9ISVNUT1JZJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZE5hbWVDaGFuZ2UoY2hhbmdlLCB1c2VyLCBjaGFuZ2VkQnkpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBRERfTkFNRV9DSEFOR0UsXG4gICAgY2hhbmdlLFxuICAgIHVzZXIsXG4gICAgY2hhbmdlZEJ5XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmQoaXRlbXMpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBUFBFTkRfSElTVE9SWSxcbiAgICBpdGVtczogaXRlbXNcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlaHlkcmF0ZShpdGVtcykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IERFSFlEUkFURV9ISVNUT1JZLFxuICAgIGl0ZW1zOiBpdGVtc1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VybmFtZShzdGF0ZT1bXSwgYWN0aW9uPW51bGwpIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgQUREX05BTUVfQ0hBTkdFOlxuICAgICAgbGV0IG5ld1N0YXRlID0gc3RhdGUuc2xpY2UoKTtcbiAgICAgIG5ld1N0YXRlLnVuc2hpZnQoe1xuICAgICAgICBpZDogTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCksIC8vIGp1c3Qgc21hbGwgaGF4IGZvciBnZXR0aW5nIGlkXG4gICAgICAgIGNoYW5nZWRfYnk6IGFjdGlvbi5jaGFuZ2VkQnksXG4gICAgICAgIGNoYW5nZWRfYnlfdXNlcm5hbWU6IGFjdGlvbi5jaGFuZ2VkQnkudXNlcm5hbWUsXG4gICAgICAgIGNoYW5nZWRfb246IG1vbWVudCgpLFxuICAgICAgICBuZXdfdXNlcm5hbWU6IGFjdGlvbi5jaGFuZ2UudXNlcm5hbWUsXG4gICAgICAgIG9sZF91c2VybmFtZTogYWN0aW9uLnVzZXIudXNlcm5hbWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuXG4gICAgY2FzZSBBUFBFTkRfSElTVE9SWTpcbiAgICAgIHJldHVybiBzdGF0ZS5jb25jYXQoYWN0aW9uLml0ZW1zLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBpdGVtLCB7XG4gICAgICAgICAgY2hhbmdlZF9vbjogbW9tZW50KGl0ZW0uY2hhbmdlZF9vbilcbiAgICAgICAgfSk7XG4gICAgICB9KSk7XG5cbiAgICBjYXNlIERFSFlEUkFURV9ISVNUT1JZOlxuICAgICAgcmV0dXJuIGFjdGlvbi5pdGVtcy5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSwge1xuICAgICAgICAgIGNoYW5nZWRfb246IG1vbWVudChpdGVtLmNoYW5nZWRfb24pXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICBjYXNlIFVQREFURV9BVkFUQVI6XG4gICAgICByZXR1cm4gc3RhdGUubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgaXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0pO1xuICAgICAgICBpZiAoaXRlbS5jaGFuZ2VkX2J5ICYmIGl0ZW0uY2hhbmdlZF9ieS5pZCA9PT0gYWN0aW9uLnVzZXJJZCkge1xuICAgICAgICAgIGl0ZW0uY2hhbmdlZF9ieSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0uY2hhbmdlZF9ieSwge1xuICAgICAgICAgICAgJ2F2YXRhcl9oYXNoJzogYWN0aW9uLmF2YXRhckhhc2hcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSk7XG5cbiAgICBjYXNlIFVQREFURV9VU0VSTkFNRTpcbiAgICAgIHJldHVybiBzdGF0ZS5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICBpdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSk7XG4gICAgICAgIGlmIChpdGVtLmNoYW5nZWRfYnkgJiYgaXRlbS5jaGFuZ2VkX2J5LmlkID09PSBhY3Rpb24udXNlcklkKSB7XG4gICAgICAgICAgaXRlbS5jaGFuZ2VkX2J5ID0gT2JqZWN0LmFzc2lnbih7fSwgaXRlbS5jaGFuZ2VkX2J5LCB7XG4gICAgICAgICAgICAndXNlcm5hbWUnOiBhY3Rpb24udXNlcm5hbWUsXG4gICAgICAgICAgICAnc2x1Zyc6IGFjdGlvbi5zbHVnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSk7XG4gICAgICB9KTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn0iLCJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjb25zdCBBUFBFTkRfVVNFUlMgPSAnQVBQRU5EX1VTRVJTJztcbmV4cG9ydCBjb25zdCBERUhZRFJBVEVfVVNFUlMgPSAnREVIWURSQVRFX1VTRVJTJztcbmV4cG9ydCBjb25zdCBVUERBVEVfQVZBVEFSID0gJ1VQREFURV9BVkFUQVInO1xuZXhwb3J0IGNvbnN0IFVQREFURV9VU0VSTkFNRSA9ICdVUERBVEVfVVNFUk5BTUUnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kKGl0ZW1zKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQVBQRU5EX1VTRVJTLFxuICAgIGl0ZW1zXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWh5ZHJhdGUoaXRlbXMpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBERUhZRFJBVEVfVVNFUlMsXG4gICAgaXRlbXNcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlaHlkcmF0ZVN0YXR1cyhzdGF0dXMpIHtcbiAgaWYgKHN0YXR1cykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0dXMsIHtcbiAgICAgIGxhc3RfY2xpY2s6IHN0YXR1cy5sYXN0X2NsaWNrID8gbW9tZW50KHN0YXR1cy5sYXN0X2NsaWNrKSA6IG51bGwsXG4gICAgICBiYW5uZWRfdW50aWw6IHN0YXR1cy5iYW5uZWRfdW50aWwgPyBtb21lbnQoc3RhdHVzLmJhbm5lZF91bnRpbCkgOiBudWxsXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUF2YXRhcih1c2VyLCBhdmF0YXJIYXNoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogVVBEQVRFX0FWQVRBUixcbiAgICB1c2VySWQ6IHVzZXIuaWQsXG4gICAgYXZhdGFySGFzaFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlVXNlcm5hbWUodXNlciwgdXNlcm5hbWUsIHNsdWcpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBVUERBVEVfVVNFUk5BTUUsXG4gICAgdXNlcklkOiB1c2VyLmlkLFxuICAgIHVzZXJuYW1lLFxuICAgIHNsdWdcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlcihzdGF0ZT1bXSwgYWN0aW9uPW51bGwpIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgQVBQRU5EX1VTRVJTOlxuICAgICAgcmV0dXJuIHN0YXRlLmNvbmNhdChhY3Rpb24uaXRlbXMubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGl0ZW0sIHtcbiAgICAgICAgICBqb2luZWRfb246IG1vbWVudChpdGVtLmpvaW5lZF9vbiksXG4gICAgICAgICAgc3RhdHVzOiBkZWh5ZHJhdGVTdGF0dXMoaXRlbS5zdGF0dXMpXG4gICAgICAgIH0pO1xuICAgICAgfSkpO1xuXG4gICAgY2FzZSBERUhZRFJBVEVfVVNFUlM6XG4gICAgICByZXR1cm4gYWN0aW9uLml0ZW1zLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBpdGVtLCB7XG4gICAgICAgICAgam9pbmVkX29uOiBtb21lbnQoaXRlbS5qb2luZWRfb24pLFxuICAgICAgICAgIHN0YXR1czogZGVoeWRyYXRlU3RhdHVzKGl0ZW0uc3RhdHVzKVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgY2FzZSBVUERBVEVfQVZBVEFSOlxuICAgICAgcmV0dXJuIHN0YXRlLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIGl0ZW0gPSBPYmplY3QuYXNzaWduKHt9LCBpdGVtKTtcbiAgICAgICAgaWYgKGl0ZW0uaWQgPT09IGFjdGlvbi51c2VySWQpIHtcbiAgICAgICAgICBpdGVtLmF2YXRhcl9oYXNoID0gYWN0aW9uLmF2YXRhckhhc2g7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufSIsImV4cG9ydCBjbGFzcyBBamF4IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fY29va2llTmFtZSA9IG51bGw7XG4gICAgdGhpcy5fY3NyZlRva2VuID0gbnVsbDtcbiAgICB0aGlzLl9sb2NrcyA9IHt9O1xuICB9XG5cbiAgaW5pdChjb29raWVOYW1lKSB7XG4gICAgdGhpcy5fY29va2llTmFtZSA9IGNvb2tpZU5hbWU7XG4gICAgdGhpcy5fY3NyZlRva2VuID0gdGhpcy5nZXRDc3JmVG9rZW4oKTtcbiAgfVxuXG4gIGdldENzcmZUb2tlbigpIHtcbiAgICBpZiAoZG9jdW1lbnQuY29va2llLmluZGV4T2YodGhpcy5fY29va2llTmFtZSkgIT09IC0xKSB7XG4gICAgICBsZXQgY29va2llUmVnZXggPSBuZXcgUmVnRXhwKHRoaXMuX2Nvb2tpZU5hbWUgKyAnXFw9KFteO10qKScpO1xuICAgICAgbGV0IGNvb2tpZSA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChjb29raWVSZWdleClbMF07XG4gICAgICByZXR1cm4gY29va2llID8gY29va2llLnNwbGl0KCc9JylbMV0gOiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXF1ZXN0KG1ldGhvZCwgdXJsLCBkYXRhKSB7XG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGxldCB4aHIgPSB7XG4gICAgICAgIHVybDogdXJsLFxuICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdYLUNTUkZUb2tlbic6IHNlbGYuX2NzcmZUb2tlblxuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IChkYXRhID8gSlNPTi5zdHJpbmdpZnkoZGF0YSkgOiBudWxsKSxcbiAgICAgICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxuICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGVycm9yOiBmdW5jdGlvbihqcVhIUikge1xuICAgICAgICAgIGxldCByZWplY3Rpb24gPSBqcVhIUi5yZXNwb25zZUpTT04gfHwge307XG5cbiAgICAgICAgICByZWplY3Rpb24uc3RhdHVzID0ganFYSFIuc3RhdHVzO1xuXG4gICAgICAgICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDApIHtcbiAgICAgICAgICAgIHJlamVjdGlvbi5kZXRhaWwgPSBnZXR0ZXh0KFwiTG9zdCBjb25uZWN0aW9uIHdpdGggYXBwbGljYXRpb24uXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIGlmICghcmVqZWN0aW9uLmRldGFpbCB8fCByZWplY3Rpb24uZGV0YWlsID09PSAnTk9UIEZPVU5EJykge1xuICAgICAgICAgICAgICByZWplY3Rpb24uZGV0YWlsID0gZ2V0dGV4dChcIkFjdGlvbiBsaW5rIGlzIGludmFsaWQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA1MDAgJiYgIXJlamVjdGlvbi5kZXRhaWwpIHtcbiAgICAgICAgICAgIHJlamVjdGlvbi5kZXRhaWwgPSBnZXR0ZXh0KFwiVW5rbm93biBlcnJvciBoYXMgb2NjdXJlZC5cIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVqZWN0aW9uLnN0YXR1c1RleHQgPSBqcVhIUi5zdGF0dXNUZXh0O1xuXG4gICAgICAgICAgcmVqZWN0KHJlamVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgICQuYWpheCh4aHIpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0KHVybCwgcGFyYW1zLCBsb2NrKSB7XG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgdXJsICs9ICc/JyArICQucGFyYW0ocGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAobG9jaykge1xuICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyB1cGRhdGUgdXJsIGluIGV4aXN0aW5nIGxvY2s/XG4gICAgICBpZiAodGhpcy5fbG9ja3NbbG9ja10pIHtcbiAgICAgICAgdGhpcy5fbG9ja3NbbG9ja10udXJsID0gdXJsO1xuICAgICAgfVxuXG4gICAgICAvLyBpbW1lZGlhdGVseSBkZXJlZmVyZW5jZSBwcm9taXNlIGhhbmRsZXJzIHdpdGhvdXQgZG9pbmcgYW55dGhpbmdcbiAgICAgIC8vIHdlIGFyZSBhbHJlYWR5IHdhaXRpbmcgZm9yIGV4aXN0aW5nIHJlc3BvbnNlIHRvIHJlc29sdmVcbiAgICAgIGlmICh0aGlzLl9sb2Nrc1tsb2NrXSAmJiB0aGlzLl9sb2Nrc1tsb2NrXS53YWl0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgIC8vIHJldHVybiBwcm9taXNlIHRoYXQgd2lsbCBiZWdpbiB3aGVuIG9yaWdpbmFsIG9uZSByZXNvbHZlc1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9sb2Nrc1tsb2NrXSAmJiB0aGlzLl9sb2Nrc1tsb2NrXS53YWl0KSB7XG4gICAgICAgIHRoaXMuX2xvY2tzW2xvY2tdLndhaXRlciA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGxldCB3YWl0ID0gZnVuY3Rpb24odXJsKSB7XG4gICAgICAgICAgICAvLyBrZWVwIHdhaXRpbmcgb24gcHJvbWlzZVxuICAgICAgICAgICAgaWYgKHNlbGYuX2xvY2tzW2xvY2tdLndhaXQpIHtcbiAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgd2FpdCh1cmwpO1xuICAgICAgICAgICAgICB9LCAzMDApO1xuXG4gICAgICAgICAgICAvLyBwb2xsIGZvciBuZXcgdXJsXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGYuX2xvY2tzW2xvY2tdLnVybCAhPT0gdXJsKSB7XG4gICAgICAgICAgICAgIHdhaXQoc2VsZi5fbG9ja3NbbG9ja10udXJsKTtcblxuICAgICAgICAgICAgLy8gYWpheCBiYWNrZW5kIGZvciByZXNwb25zZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZi5fbG9ja3NbbG9ja10ud2FpdGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgIHNlbGYucmVxdWVzdCgnR0VUJywgc2VsZi5fbG9ja3NbbG9ja10udXJsKS50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fbG9ja3NbbG9ja10udXJsID09PSB1cmwpIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHNlbGYuX2xvY2tzW2xvY2tdLndhaXRlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB3YWl0KHNlbGYuX2xvY2tzW2xvY2tdLnVybCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LCBmdW5jdGlvbihyZWplY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fbG9ja3NbbG9ja10udXJsID09PSB1cmwpIHtcbiAgICAgICAgICAgICAgICAgIHJlamVjdChyZWplY3Rpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzZWxmLl9sb2Nrc1tsb2NrXS53YWl0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgd2FpdChzZWxmLl9sb2Nrc1tsb2NrXS51cmwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgd2FpdCh1cmwpO1xuICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBzZXR1cCBuZXcgbG9jayB3aXRob3V0IHdhaXRlclxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbG9ja3NbbG9ja10gPSB7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHdhaXQ6IHRydWUsXG4gICAgICAgICAgd2FpdGVyOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBzZWxmLnJlcXVlc3QoJ0dFVCcsIHVybCkudGhlbihmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICBzZWxmLl9sb2Nrc1tsb2NrXS53YWl0ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoc2VsZi5fbG9ja3NbbG9ja10udXJsID09PSB1cmwpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBmdW5jdGlvbihyZWplY3Rpb24pIHtcbiAgICAgICAgICAgIHNlbGYuX2xvY2tzW2xvY2tdLndhaXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChzZWxmLl9sb2Nrc1tsb2NrXS51cmwgPT09IHVybCkge1xuICAgICAgICAgICAgICByZWplY3QocmVqZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIHVybCk7XG4gICAgfVxuICB9XG5cbiAgcG9zdCh1cmwsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQT1NUJywgdXJsLCBkYXRhKTtcbiAgfVxuXG4gIHBhdGNoKHVybCwgZGF0YSkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BBVENIJywgdXJsLCBkYXRhKTtcbiAgfVxuXG4gIHB1dCh1cmwsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQVVQnLCB1cmwsIGRhdGEpO1xuICB9XG5cbiAgZGVsZXRlKHVybCkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0RFTEVURScsIHVybCk7XG4gIH1cblxuICB1cGxvYWQodXJsLCBkYXRhLCBwcm9ncmVzcykge1xuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBsZXQgeGhyID0ge1xuICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnWC1DU1JGVG9rZW4nOiBzZWxmLl9jc3JmVG9rZW5cbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsXG4gICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcblxuICAgICAgICB4aHI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGxldCB4aHIgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgeGhyLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKFwicHJvZ3Jlc3NcIiwgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgICAgICBpZiAoZXZ0Lmxlbmd0aENvbXB1dGFibGUpIHtcbiAgICAgICAgICAgICAgcHJvZ3Jlc3MoTWF0aC5yb3VuZChldnQubG9hZGVkIC8gZXZ0LnRvdGFsICogMTAwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICAgIHJldHVybiB4aHI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBlcnJvcjogZnVuY3Rpb24oanFYSFIpIHtcbiAgICAgICAgICBsZXQgcmVqZWN0aW9uID0ganFYSFIucmVzcG9uc2VKU09OIHx8IHt9O1xuXG4gICAgICAgICAgcmVqZWN0aW9uLnN0YXR1cyA9IGpxWEhSLnN0YXR1cztcblxuICAgICAgICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICByZWplY3Rpb24uZGV0YWlsID0gZ2V0dGV4dChcIkxvc3QgY29ubmVjdGlvbiB3aXRoIGFwcGxpY2F0aW9uLlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICBpZiAoIXJlamVjdGlvbi5kZXRhaWwgfHwgcmVqZWN0aW9uLmRldGFpbCA9PT0gJ05PVCBGT1VORCcpIHtcbiAgICAgICAgICAgICAgcmVqZWN0aW9uLmRldGFpbCA9IGdldHRleHQoXCJBY3Rpb24gbGluayBpcyBpbnZhbGlkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNTAwICYmICFyZWplY3Rpb24uZGV0YWlsKSB7XG4gICAgICAgICAgICByZWplY3Rpb24uZGV0YWlsID0gZ2V0dGV4dChcIlVua25vd24gZXJyb3IgaGFzIG9jY3VyZWQuXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlamVjdGlvbi5zdGF0dXNUZXh0ID0ganFYSFIuc3RhdHVzVGV4dDtcblxuICAgICAgICAgIHJlamVjdChyZWplY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAkLmFqYXgoeGhyKTtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgQWpheCgpO1xuIiwiaW1wb3J0IHsgc2lnbkluLCBzaWduT3V0IH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL2F1dGgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGNsYXNzIEF1dGgge1xuICBpbml0KHN0b3JlLCBsb2NhbCwgbW9kYWwpIHtcbiAgICB0aGlzLl9zdG9yZSA9IHN0b3JlO1xuICAgIHRoaXMuX2xvY2FsID0gbG9jYWw7XG4gICAgdGhpcy5fbW9kYWwgPSBtb2RhbDtcblxuICAgIC8vIHRlbGwgb3RoZXIgdGFicyB3aGF0IGF1dGggc3RhdGUgaXMgYmVjYXVzZSB3ZSBhcmUgbW9zdCBjdXJyZW50IHdpdGggaXRcbiAgICB0aGlzLnN5bmNTZXNzaW9uKCk7XG5cbiAgICAvLyBsaXN0ZW4gZm9yIG90aGVyIHRhYnMgdG8gdGVsbCB1cyB0aGF0IHN0YXRlIGNoYW5nZWRcbiAgICB0aGlzLndhdGNoU3RhdGUoKTtcbiAgfVxuXG4gIHN5bmNTZXNzaW9uKCkge1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuX3N0b3JlLmdldFN0YXRlKCkuYXV0aDtcbiAgICBpZiAoc3RhdGUuaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICB0aGlzLl9sb2NhbC5zZXQoJ2F1dGgnLCB7XG4gICAgICAgIGlzQXV0aGVudGljYXRlZDogdHJ1ZSxcbiAgICAgICAgdXNlcm5hbWU6IHN0YXRlLnVzZXIudXNlcm5hbWVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sb2NhbC5zZXQoJ2F1dGgnLCB7XG4gICAgICAgIGlzQXV0aGVudGljYXRlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHdhdGNoU3RhdGUoKSB7XG4gICAgdGhpcy5fbG9jYWwud2F0Y2goJ2F1dGgnLCAobmV3U3RhdGUpID0+IHtcbiAgICAgIGlmIChuZXdTdGF0ZS5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goc2lnbkluKHtcbiAgICAgICAgICB1c2VybmFtZTogbmV3U3RhdGUudXNlcm5hbWVcbiAgICAgICAgfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goc2lnbk91dCgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl9tb2RhbC5oaWRlKCk7XG4gIH1cblxuICBzaWduSW4odXNlcikge1xuICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHNpZ25Jbih1c2VyKSk7XG4gICAgdGhpcy5fbG9jYWwuc2V0KCdhdXRoJywge1xuICAgICAgaXNBdXRoZW50aWNhdGVkOiB0cnVlLFxuICAgICAgdXNlcm5hbWU6IHVzZXIudXNlcm5hbWVcbiAgICB9KTtcbiAgICB0aGlzLl9tb2RhbC5oaWRlKCk7XG4gIH1cblxuICBzaWduT3V0KCkge1xuICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHNpZ25PdXQoKSk7XG4gICAgdGhpcy5fbG9jYWwuc2V0KCdhdXRoJywge1xuICAgICAgaXNBdXRoZW50aWNhdGVkOiBmYWxzZVxuICAgIH0pO1xuICAgIHRoaXMuX21vZGFsLmhpZGUoKTtcbiAgfVxuXG4gIHNvZnRTaWduT3V0KCkge1xuICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHNpZ25PdXQodHJ1ZSkpO1xuICAgIHRoaXMuX2xvY2FsLnNldCgnYXV0aCcsIHtcbiAgICAgIGlzQXV0aGVudGljYXRlZDogZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLl9tb2RhbC5oaWRlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IEF1dGgoKTsiLCIvKiBnbG9iYWwgZ3JlY2FwdGNoYSAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybUdyb3VwIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0tZ3JvdXAnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuZXhwb3J0IGNsYXNzIEJhc2VDYXB0Y2hhIHtcbiAgaW5pdChjb250ZXh0LCBhamF4LCBpbmNsdWRlLCBzbmFja2Jhcikge1xuICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMuX2FqYXggPSBhamF4O1xuICAgIHRoaXMuX2luY2x1ZGUgPSBpbmNsdWRlO1xuICAgIHRoaXMuX3NuYWNrYmFyID0gc25hY2tiYXI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vQ2FwdGNoYSBleHRlbmRzIEJhc2VDYXB0Y2hhIHtcbiAgbG9hZCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xuICAgICAgLy8gaW1tZWRpYXRlbHkgcmVzb2x2ZSBhcyB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIHZhbGlkYXRlXG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0b3IoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFFBQ2FwdGNoYSBleHRlbmRzIEJhc2VDYXB0Y2hhIHtcbiAgbG9hZCgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNlbGYuX2FqYXguZ2V0KHNlbGYuX2NvbnRleHQuZ2V0KCdDQVBUQ0hBX0FQSV9VUkwnKSkudGhlbihcbiAgICAgIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgc2VsZi5xdWVzdGlvbiA9IGRhdGEucXVlc3Rpb247XG4gICAgICAgIHNlbGYuaGVscFRleHQgPSBkYXRhLmhlbHBfdGV4dDtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuX3NuYWNrYmFyLmVycm9yKGdldHRleHQoXCJGYWlsZWQgdG8gbG9hZCBDQVBUQ0hBLlwiKSk7XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0b3IoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBjb21wb25lbnQoa3dhcmdzKSB7XG4gICAgcmV0dXJuIDxGb3JtR3JvdXAgbGFiZWw9e3RoaXMucXVlc3Rpb259IGZvcj1cImlkX2NhcHRjaGFcIlxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9e2t3YXJncy5sYWJlbENsYXNzIHx8IFwiY29sLXNtLTRcIn1cbiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sQ2xhc3M9e2t3YXJncy5jb250cm9sQ2xhc3MgfHwgXCJjb2wtc20tOFwifVxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb249e2t3YXJncy5mb3JtLnN0YXRlLmVycm9ycy5jYXB0Y2hhfVxuICAgICAgICAgICAgICAgICAgICAgIGhlbHBUZXh0PXt0aGlzLmhlbHBUZXh0IHx8IG51bGx9PlxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJpZF9jYXB0Y2hhXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiaWRfY2FwdGNoYV9zdGF0dXNcIlxuICAgICAgICAgICAgIGRpc2FibGVkPXtrd2FyZ3MuZm9ybS5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgb25DaGFuZ2U9e2t3YXJncy5mb3JtLmJpbmRJbnB1dCgnY2FwdGNoYScpfVxuICAgICAgICAgICAgIHZhbHVlPXtrd2FyZ3MuZm9ybS5zdGF0ZS5jYXB0Y2hhfSAvPlxuICAgIDwvRm9ybUdyb3VwPjtcbiAgfVxuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xufVxuXG5cbmV4cG9ydCBjbGFzcyBSZUNhcHRjaGFDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBncmVjYXB0Y2hhLnJlbmRlcigncmVjYXB0Y2hhJywge1xuICAgICAgJ3NpdGVrZXknOiB0aGlzLnByb3BzLnNpdGVLZXksXG4gICAgICAnY2FsbGJhY2snOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgLy8gZmlyZSBmYWtleSBldmVudCB0byBiaW5kaW5nXG4gICAgICAgIHRoaXMucHJvcHMuYmluZGluZyh7XG4gICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVzcG9uc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBpZD1cInJlY2FwdGNoYVwiIC8+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlQ2FwdGNoYSBleHRlbmRzIEJhc2VDYXB0Y2hhIHtcbiAgbG9hZCgpIHtcbiAgICB0aGlzLl9pbmNsdWRlLmluY2x1ZGUoJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcmVjYXB0Y2hhL2FwaS5qcycsIHRydWUpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiAgICAgIHZhciB3YWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZ3JlY2FwdGNoYSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgd2FpdCgpO1xuICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgd2FpdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdG9yKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgY29tcG9uZW50KGt3YXJncykge1xuICAgIHJldHVybiA8Rm9ybUdyb3VwIGxhYmVsPXtnZXR0ZXh0KFwiQ2FwdGNoYVwiKX0gZm9yPVwiaWRfY2FwdGNoYVwiXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWxDbGFzcz17a3dhcmdzLmxhYmVsQ2xhc3MgfHwgXCJjb2wtc20tNFwifVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xDbGFzcz17a3dhcmdzLmNvbnRyb2xDbGFzcyB8fCBcImNvbC1zbS04XCJ9XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbj17a3dhcmdzLmZvcm0uc3RhdGUuZXJyb3JzLmNhcHRjaGF9XG4gICAgICAgICAgICAgICAgICAgICAgaGVscFRleHQ9e2dldHRleHQoXCJQbGVhc2Ugc29sdmUgdGhlIHF1aWNrIHRlc3QuXCIpfT5cbiAgICAgIDxSZUNhcHRjaGFDb21wb25lbnQgc2l0ZUtleT17dGhpcy5fY29udGV4dC5nZXQoJ1NFVFRJTkdTJykucmVjYXB0Y2hhX3NpdGVfa2V5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nPXtrd2FyZ3MuZm9ybS5iaW5kSW5wdXQoJ2NhcHRjaGEnKX0gLz5cbiAgICA8L0Zvcm1Hcm91cD47XG4gIH1cbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbn1cblxuZXhwb3J0IGNsYXNzIENhcHRjaGEge1xuICBpbml0KGNvbnRleHQsIGFqYXgsIGluY2x1ZGUsIHNuYWNrYmFyKSB7XG4gICAgc3dpdGNoKGNvbnRleHQuZ2V0KCdTRVRUSU5HUycpLmNhcHRjaGFfdHlwZSkge1xuICAgICAgY2FzZSAnbm8nOlxuICAgICAgICB0aGlzLl9jYXB0Y2hhID0gbmV3IE5vQ2FwdGNoYSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncWEnOlxuICAgICAgICB0aGlzLl9jYXB0Y2hhID0gbmV3IFFBQ2FwdGNoYSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmUnOlxuICAgICAgICB0aGlzLl9jYXB0Y2hhID0gbmV3IFJlQ2FwdGNoYSgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLl9jYXB0Y2hhLmluaXQoY29udGV4dCwgYWpheCwgaW5jbHVkZSwgc25hY2tiYXIpO1xuICB9XG5cbiAgLy8gYWNjZXNzb3JzIGZvciB1bmRlcmx5aW5nIHN0cmF0ZWd5XG5cbiAgbG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FwdGNoYS5sb2FkKCk7XG4gIH1cblxuICB2YWxpZGF0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhcHRjaGEudmFsaWRhdG9yKCk7XG4gIH1cblxuICBjb21wb25lbnQoa3dhcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhcHRjaGEuY29tcG9uZW50KGt3YXJncyk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IENhcHRjaGEoKTsiLCJleHBvcnQgY2xhc3MgSW5jbHVkZSB7XG4gIGluaXQoc3RhdGljVXJsKSB7XG4gICAgdGhpcy5fc3RhdGljVXJsID0gc3RhdGljVXJsO1xuICAgIHRoaXMuX2luY2x1ZGVkID0gW107XG4gIH1cblxuICBpbmNsdWRlKHNjcmlwdCwgcmVtb3RlPWZhbHNlKSB7XG4gICAgaWYgKHRoaXMuX2luY2x1ZGVkLmluZGV4T2Yoc2NyaXB0KSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuX2luY2x1ZGVkLnB1c2goc2NyaXB0KTtcbiAgICAgIHRoaXMuX2luY2x1ZGUoc2NyaXB0LCByZW1vdGUpO1xuICAgIH1cbiAgfVxuXG4gIF9pbmNsdWRlKHNjcmlwdCwgcmVtb3RlKSB7XG4gICAgJC5hamF4KHtcbiAgICAgIHVybDogKCFyZW1vdGUgPyB0aGlzLl9zdGF0aWNVcmwgOiAnJykgKyBzY3JpcHQsXG4gICAgICBjYWNoZTogdHJ1ZSxcbiAgICAgIGRhdGFUeXBlOiAnc2NyaXB0J1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBJbmNsdWRlKCk7IiwibGV0IHN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xuXG5leHBvcnQgY2xhc3MgTG9jYWxTdG9yYWdlIHtcbiAgaW5pdChwcmVmaXgpIHtcbiAgICB0aGlzLl9wcmVmaXggPSBwcmVmaXg7XG4gICAgdGhpcy5fd2F0Y2hlcnMgPSBbXTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzdG9yYWdlJywgKGUpID0+IHtcbiAgICAgIGxldCBuZXdWYWx1ZUpzb24gPSBKU09OLnBhcnNlKGUubmV3VmFsdWUpO1xuICAgICAgdGhpcy5fd2F0Y2hlcnMuZm9yRWFjaChmdW5jdGlvbih3YXRjaGVyKSB7XG4gICAgICAgIGlmICh3YXRjaGVyLmtleSA9PT0gZS5rZXkgJiYgZS5vbGRWYWx1ZSAhPT0gZS5uZXdWYWx1ZSkge1xuICAgICAgICAgIHdhdGNoZXIuY2FsbGJhY2sobmV3VmFsdWVKc29uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHN0b3JhZ2Uuc2V0SXRlbSh0aGlzLl9wcmVmaXggKyBrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gIH1cblxuICBnZXQoa2V5KSB7XG4gICAgbGV0IGl0ZW1TdHJpbmcgPSBzdG9yYWdlLmdldEl0ZW0odGhpcy5fcHJlZml4ICsga2V5KTtcbiAgICBpZiAoaXRlbVN0cmluZykge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoaXRlbVN0cmluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdhdGNoKGtleSwgY2FsbGJhY2spIHtcbiAgICB0aGlzLl93YXRjaGVycy5wdXNoKHtcbiAgICAgIGtleTogdGhpcy5fcHJlZml4ICsga2V5LFxuICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IExvY2FsU3RvcmFnZSgpOyIsImltcG9ydCBtb3VudCBmcm9tICdtaXNhZ28vdXRpbHMvbW91bnQtY29tcG9uZW50JztcblxuZXhwb3J0IGNsYXNzIE1vYmlsZU5hdmJhckRyb3Bkb3duIHtcbiAgaW5pdChlbGVtZW50KSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fY29tcG9uZW50ID0gbnVsbDtcbiAgfVxuXG4gIHNob3coY29tcG9uZW50KSB7XG4gICAgaWYgKHRoaXMuX2NvbXBvbmVudCA9PT0gY29tcG9uZW50KSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgICAgbW91bnQoY29tcG9uZW50LCB0aGlzLl9lbGVtZW50LmlkKTtcbiAgICAgICQodGhpcy5fZWxlbWVudCkuYWRkQ2xhc3MoJ29wZW4nKTtcbiAgICB9XG4gIH1cblxuICBzaG93Q29ubmVjdGVkKG5hbWUsIGNvbXBvbmVudCkge1xuICAgIGlmICh0aGlzLl9jb21wb25lbnQgPT09IG5hbWUpIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb21wb25lbnQgPSBuYW1lO1xuICAgICAgbW91bnQoY29tcG9uZW50LCB0aGlzLl9lbGVtZW50LmlkLCB0cnVlKTtcbiAgICAgICQodGhpcy5fZWxlbWVudCkuYWRkQ2xhc3MoJ29wZW4nKTtcbiAgICB9XG4gIH1cblxuICBoaWRlKCkge1xuICAgICQodGhpcy5fZWxlbWVudCkucmVtb3ZlQ2xhc3MoJ29wZW4nKTtcbiAgICB0aGlzLl9jb21wb25lbnQgPSBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBNb2JpbGVOYXZiYXJEcm9wZG93bigpO1xuIiwiaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgbW91bnQgZnJvbSAnbWlzYWdvL3V0aWxzL21vdW50LWNvbXBvbmVudCc7XG5cbmV4cG9ydCBjbGFzcyBNb2RhbCB7XG4gIGluaXQoZWxlbWVudCkge1xuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuXG4gICAgdGhpcy5fbW9kYWwgPSAkKGVsZW1lbnQpLm1vZGFsKHtzaG93OiBmYWxzZX0pO1xuXG4gICAgdGhpcy5fbW9kYWwub24oJ2hpZGRlbi5icy5tb2RhbCcsICgpID0+IHtcbiAgICAgIFJlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUodGhpcy5fZWxlbWVudCk7XG4gICAgfSk7XG4gIH1cblxuICBzaG93KGNvbXBvbmVudCkge1xuICAgIG1vdW50KGNvbXBvbmVudCwgdGhpcy5fZWxlbWVudC5pZCk7XG4gICAgdGhpcy5fbW9kYWwubW9kYWwoJ3Nob3cnKTtcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgdGhpcy5fbW9kYWwubW9kYWwoJ2hpZGUnKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgTW9kYWwoKTtcbiIsImV4cG9ydCBjbGFzcyBQYWdlVGl0bGUge1xuICBpbml0KGZvcnVtTmFtZSkge1xuICAgIHRoaXMuX2ZvcnVtTmFtZSA9IGZvcnVtTmFtZTtcbiAgfVxuXG4gIHNldCh0aXRsZSkge1xuICAgIGlmICh0eXBlb2YgdGl0bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aXRsZSA9IHt0aXRsZTogdGl0bGV9O1xuICAgIH1cblxuICAgIGxldCBmaW5hbFRpdGxlID0gdGl0bGUudGl0bGU7XG5cbiAgICBpZiAodGl0bGUucGFnZSkge1xuICAgICAgbGV0IHBhZ2VMYWJlbCA9IGludGVycG9sYXRlKGdldHRleHQoJ3BhZ2U6ICUocGFnZSlzJyksIHtcbiAgICAgICAgcGFnZTogdGl0bGUucGFnZVxuICAgICAgfSwgdHJ1ZSk7XG5cbiAgICAgIGZpbmFsVGl0bGUgKz0gJyAoJyArIHBhZ2VMYWJlbCArICcpJztcbiAgICB9XG5cbiAgICBpZiAodGl0bGUucGFyZW50KSB7XG4gICAgICBmaW5hbFRpdGxlICs9ICcgfCAnICsgdGl0bGUucGFyZW50O1xuICAgIH1cblxuICAgIGRvY3VtZW50LnRpdGxlID0gZmluYWxUaXRsZSArICcgfCAnICsgdGhpcy5fZm9ydW1OYW1lO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBQYWdlVGl0bGUoKTtcbiIsImV4cG9ydCBjbGFzcyBQb2xscyB7XG4gIGluaXQoYWpheCwgc25hY2tiYXIpIHtcbiAgICB0aGlzLl9hamF4ID0gYWpheDtcbiAgICB0aGlzLl9zbmFja2JhciA9IHNuYWNrYmFyO1xuXG4gICAgdGhpcy5fcG9sbHMgPSB7fTtcbiAgfVxuXG4gIHN0YXJ0KGt3YXJncykge1xuICAgIGxldCBwb29sU2VydmVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5fcG9sbHNba3dhcmdzLnBvbGxdID0ga3dhcmdzO1xuXG4gICAgICB0aGlzLl9hamF4LmdldChrd2FyZ3MudXJsLCBrd2FyZ3MuZGF0YSB8fCBudWxsKS50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgIGt3YXJncy51cGRhdGUoZGF0YSk7XG5cbiAgICAgICAgdGhpcy5fcG9sbHNba3dhcmdzLnBvbGxdLnRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChcbiAgICAgICAgICBwb29sU2VydmVyLCBrd2FyZ3MuZnJlcXVlbmN5KTtcbiAgICAgIH0sIChyZWplY3Rpb24pID0+IHtcbiAgICAgICAgaWYgKGt3YXJncy5lcnJvcikge1xuICAgICAgICAgIGt3YXJncy5lcnJvcihyZWplY3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3NuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwb29sU2VydmVyKCk7XG4gIH1cblxuICBzdG9wKHBvbGxJZCkge1xuICAgIGlmICh0aGlzLl9wb2xsc1twb2xsSWRdKSB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3BvbGxzW3BvbGxJZF0udGltZW91dCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBQb2xscygpO1xuIiwiaW1wb3J0IHsgc2hvd1NuYWNrYmFyLCBoaWRlU25hY2tiYXIgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvc25hY2tiYXInO1xuXG5jb25zdCBISURFX0FOSU1BVElPTl9MRU5HVEggPSAzMDA7XG5jb25zdCBNRVNTQUdFX1NIT1dfTEVOR1RIID0gNTAwMDtcblxuZXhwb3J0IGNsYXNzIFNuYWNrYmFyIHtcbiAgaW5pdChzdG9yZSkge1xuICAgIHRoaXMuX3N0b3JlID0gc3RvcmU7XG4gICAgdGhpcy5fdGltZW91dCA9IG51bGw7XG4gIH1cblxuICBhbGVydChtZXNzYWdlLCB0eXBlKSB7XG4gICAgaWYgKHRoaXMuX3RpbWVvdXQpIHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChoaWRlU25hY2tiYXIoKSk7XG5cbiAgICAgIHRoaXMuX3RpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgICAgICB0aGlzLmFsZXJ0KG1lc3NhZ2UsIHR5cGUpO1xuICAgICAgfSwgSElERV9BTklNQVRJT05fTEVOR1RIKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goc2hvd1NuYWNrYmFyKG1lc3NhZ2UsIHR5cGUpKTtcbiAgICAgIHRoaXMuX3RpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKGhpZGVTbmFja2JhcigpKTtcbiAgICAgICAgdGhpcy5fdGltZW91dCA9IG51bGw7XG4gICAgICB9LCBNRVNTQUdFX1NIT1dfTEVOR1RIKTtcbiAgICB9XG4gIH1cblxuICAvLyBzaG9ydGhhbmRzIGZvciBtZXNzYWdlIHR5cGVzXG5cbiAgaW5mbyhtZXNzYWdlKSB7XG4gICAgdGhpcy5hbGVydChtZXNzYWdlLCAnaW5mbycpO1xuICB9XG5cbiAgc3VjY2VzcyhtZXNzYWdlKSB7XG4gICAgdGhpcy5hbGVydChtZXNzYWdlLCAnc3VjY2VzcycpO1xuICB9XG5cbiAgd2FybmluZyhtZXNzYWdlKSB7XG4gICAgdGhpcy5hbGVydChtZXNzYWdlLCAnd2FybmluZycpO1xuICB9XG5cbiAgZXJyb3IobWVzc2FnZSkge1xuICAgIHRoaXMuYWxlcnQobWVzc2FnZSwgJ2Vycm9yJyk7XG4gIH1cblxuICAvLyBzaG9ydGhhbmQgZm9yIGFwaSBlcnJvcnNcblxuICBhcGlFcnJvcihyZWplY3Rpb24pIHtcbiAgICBsZXQgbWVzc2FnZSA9IHJlamVjdGlvbi5kZXRhaWw7XG5cbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgbWVzc2FnZSA9IGdldHRleHQoXCJBY3Rpb24gbGluayBpcyBpbnZhbGlkLlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2UgPSBnZXR0ZXh0KFwiVW5rbm93biBlcnJvciBoYXMgb2NjdXJlZC5cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMyAmJiBtZXNzYWdlID09PSBcIlBlcm1pc3Npb24gZGVuaWVkXCIpIHtcbiAgICAgIG1lc3NhZ2UgPSBnZXR0ZXh0KFwiWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLmVycm9yKG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBTbmFja2JhcigpO1xuIiwiaW1wb3J0IHsgY29tYmluZVJlZHVjZXJzLCBjcmVhdGVTdG9yZSB9IGZyb20gJ3JlZHV4JztcblxuZXhwb3J0IGNsYXNzIFN0b3JlV3JhcHBlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3N0b3JlID0gbnVsbDtcbiAgICB0aGlzLl9yZWR1Y2VycyA9IHt9O1xuICAgIHRoaXMuX2luaXRpYWxTdGF0ZSA9IHt9O1xuICB9XG5cbiAgYWRkUmVkdWNlcihuYW1lLCByZWR1Y2VyLCBpbml0aWFsU3RhdGUpIHtcbiAgICB0aGlzLl9yZWR1Y2Vyc1tuYW1lXSA9IHJlZHVjZXI7XG4gICAgdGhpcy5faW5pdGlhbFN0YXRlW25hbWVdID0gaW5pdGlhbFN0YXRlO1xuICB9XG5cbiAgaW5pdCgpIHtcbiAgICB0aGlzLl9zdG9yZSA9IGNyZWF0ZVN0b3JlKFxuICAgICAgY29tYmluZVJlZHVjZXJzKHRoaXMuX3JlZHVjZXJzKSwgdGhpcy5faW5pdGlhbFN0YXRlKTtcbiAgfVxuXG4gIGdldFN0b3JlKCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yZTtcbiAgfVxuXG4gIC8vIFN0b3JlIEFQSVxuXG4gIGdldFN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yZS5nZXRTdGF0ZSgpO1xuICB9XG5cbiAgZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLmRpc3BhdGNoKGFjdGlvbik7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IFN0b3JlV3JhcHBlcigpO1xuIiwiLyogZ2xvYmFsIHp4Y3ZibiAqL1xuZXhwb3J0IGNsYXNzIFp4Y3ZibiB7XG4gIGluaXQoaW5jbHVkZSkge1xuICAgIHRoaXMuX2luY2x1ZGUgPSBpbmNsdWRlO1xuICB9XG5cbiAgc2NvcmVQYXNzd29yZChwYXNzd29yZCwgaW5wdXRzKSB7XG4gICAgLy8gMC00IHNjb3JlLCB0aGUgbW9yZSB0aGUgc3Ryb25nZXIgcGFzc3dvcmRcbiAgICByZXR1cm4genhjdmJuKHBhc3N3b3JkLCBpbnB1dHMpLnNjb3JlO1xuICB9XG5cbiAgbG9hZCgpIHtcbiAgICBpZiAodHlwZW9mIHp4Y3ZibiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5faW5jbHVkZS5pbmNsdWRlKCdtaXNhZ28vanMvenhjdmJuLmpzJyk7XG4gICAgICByZXR1cm4gdGhpcy5fbG9hZGluZ1Byb21pc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlZFByb21pc2UoKTtcbiAgICB9XG4gIH1cblxuICBfbG9hZGluZ1Byb21pc2UoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiAgICAgIHZhciB3YWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0eXBlb2YgenhjdmJuID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB3YWl0KCk7XG4gICAgICAgICAgfSwgMjAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB3YWl0KCk7XG4gICAgfSk7XG4gIH1cblxuICBfbG9hZGVkUHJvbWlzZSgpIHtcbiAgICAvLyB3ZSBoYXZlIGFscmVhZHkgbG9hZGVkIHp4Y3Zibi5qcywgcmVzb2x2ZSBhd2F5IVxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IFp4Y3ZibigpOyIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgUHJvdmlkZXIsIGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEJhbm5lZFBhZ2UgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYmFubmVkLXBhZ2UnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xubGV0IHNlbGVjdCA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS50aWNrO1xufTtcblxubGV0IFJlZHJhd2VkQmFubmVkUGFnZSA9IGNvbm5lY3Qoc2VsZWN0KShCYW5uZWRQYWdlKTtcbi8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGJhbiwgY2hhbmdlU3RhdGUpIHtcbiAgUmVhY3RET00ucmVuZGVyKFxuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICA8UHJvdmlkZXIgc3RvcmU9e3N0b3JlLmdldFN0b3JlKCl9PlxuICAgICAgPFJlZHJhd2VkQmFubmVkUGFnZSBtZXNzYWdlPXtiYW4ubWVzc2FnZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlcz17YmFuLmV4cGlyZXNfb24gPyBtb21lbnQoYmFuLmV4cGlyZXNfb24pIDogbnVsbH0gLz5cbiAgICA8L1Byb3ZpZGVyPixcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWdlLW1vdW50JylcbiAgKTtcblxuICBpZiAodHlwZW9mIGNoYW5nZVN0YXRlID09PSAndW5kZWZpbmVkJyB8fCBjaGFuZ2VTdGF0ZSkge1xuICAgIGxldCBmb3J1bU5hbWUgPSBtaXNhZ28uZ2V0KCdTRVRUSU5HUycpLmZvcnVtX25hbWU7XG4gICAgZG9jdW1lbnQudGl0bGUgPSBnZXR0ZXh0KFwiWW91IGFyZSBiYW5uZWRcIikgKyAnIHwgJyArIGZvcnVtTmFtZTtcbiAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoe30sIFwiXCIsIG1pc2Fnby5nZXQoJ0JBTk5FRF9VUkwnKSk7XG4gIH1cbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihsaXN0LCByb3dXaWR0aCwgcGFkZGluZz1mYWxzZSkge1xuICBsZXQgcm93cyA9IFtdO1xuICBsZXQgcm93ID0gW107XG5cbiAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICByb3cucHVzaChlbGVtZW50KTtcbiAgICBpZiAocm93Lmxlbmd0aCA9PT0gcm93V2lkdGgpIHtcbiAgICAgIHJvd3MucHVzaChyb3cpO1xuICAgICAgcm93ID0gW107XG4gICAgfVxuICB9KTtcblxuICAvLyBwYWQgcm93IHRvIHJlcXVpcmVkIGxlbmd0aD9cbiAgaWYgKHBhZGRpbmcgIT09IGZhbHNlICYmIHJvdy5sZW5ndGggPiAwICYmIHJvdy5sZW5ndGggPCByb3dXaWR0aCkge1xuICAgIGZvciAobGV0IGkgPSByb3cubGVuZ3RoOyBpIDwgcm93V2lkdGg7IGkgKyspIHtcbiAgICAgIHJvdy5wdXNoKHBhZGRpbmcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyb3cubGVuZ3RoKSB7XG4gICAgcm93cy5wdXNoKHJvdyk7XG4gIH1cblxuICByZXR1cm4gcm93cztcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihieXRlcykge1xuICBpZiAoYnl0ZXMgPiAxMDAwICogMTAwMCAqIDEwMDApIHtcbiAgICByZXR1cm4gKE1hdGgucm91bmQoYnl0ZXMgKiAxMDAgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSkgLyAxMDApICsgJyBHQic7XG4gIH0gZWxzZSBpZiAoYnl0ZXMgPiAxMDAwICogMTAwMCkge1xuICAgIHJldHVybiAoTWF0aC5yb3VuZChieXRlcyAqIDEwMCAvICgxMDAwICogMTAwMCkpIC8gMTAwKSArICcgTUInO1xuICB9IGVsc2UgaWYgKGJ5dGVzID4gMTAwMCkge1xuICAgIHJldHVybiAoTWF0aC5yb3VuZChieXRlcyAqIDEwMCAvIDEwMDApIC8gMTAwKSArICcgS0InO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAoTWF0aC5yb3VuZChieXRlcyAqIDEwMCkgLyAxMDApICsgJyBCJztcbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJlZHV4JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKENvbXBvbmVudCwgcm9vdEVsZW1lbnRJZCwgY29ubmVjdGVkPXRydWUpIHtcbiAgbGV0IHJvb3RFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocm9vdEVsZW1lbnRJZCk7XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBsZXQgZmluYWxDb21wb25lbnQgPSBDb21wb25lbnQucHJvcHMgPyBDb21wb25lbnQgOiA8Q29tcG9uZW50IC8+O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIGlmIChyb290RWxlbWVudCkge1xuICAgIGlmIChjb25uZWN0ZWQpIHtcbiAgICAgIFJlYWN0RE9NLnJlbmRlcihcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgICA8UHJvdmlkZXIgc3RvcmU9e3N0b3JlLmdldFN0b3JlKCl9PlxuICAgICAgICAgIHtmaW5hbENvbXBvbmVudH1cbiAgICAgICAgPC9Qcm92aWRlcj4sXG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICAgIHJvb3RFbGVtZW50XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICBSZWFjdERPTS5yZW5kZXIoZmluYWxDb21wb25lbnQsIHJvb3RFbGVtZW50KTtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG59XG4iLCJjbGFzcyBPcmRlcmVkTGlzdCB7XG4gICAgY29uc3RydWN0b3IoaXRlbXMpIHtcbiAgICAgIHRoaXMuaXNPcmRlcmVkID0gZmFsc2U7XG4gICAgICB0aGlzLl9pdGVtcyA9IGl0ZW1zIHx8IFtdO1xuICAgIH1cblxuICAgIGFkZChrZXksIGl0ZW0sIG9yZGVyKSB7XG4gICAgICB0aGlzLl9pdGVtcy5wdXNoKHtcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIGl0ZW06IGl0ZW0sXG5cbiAgICAgICAgYWZ0ZXI6IG9yZGVyID8gb3JkZXIuYWZ0ZXIgfHwgbnVsbCA6IG51bGwsXG4gICAgICAgIGJlZm9yZTogb3JkZXIgPyBvcmRlci5iZWZvcmUgfHwgbnVsbCA6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldChrZXksIHZhbHVlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2l0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLl9pdGVtc1tpXS5rZXkgPT09IGtleSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pdGVtc1tpXS5pdGVtO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBoYXMoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoa2V5KSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHZhbHVlcygpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5faXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWVzLnB1c2godGhpcy5faXRlbXNbaV0uaXRlbSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIG9yZGVyKHZhbHVlc19vbmx5KSB7XG4gICAgICBpZiAoIXRoaXMuaXNPcmRlcmVkKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1zID0gdGhpcy5fb3JkZXIodGhpcy5faXRlbXMpO1xuICAgICAgICB0aGlzLmlzT3JkZXJlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZXNfb25seSB8fCB0eXBlb2YgdmFsdWVzX29ubHkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zO1xuICAgICAgfVxuICAgIH1cblxuICAgIG9yZGVyZWRWYWx1ZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcmRlcih0cnVlKTtcbiAgICB9XG5cbiAgICBfb3JkZXIodW5vcmRlcmVkKSB7XG4gICAgICAvLyBJbmRleCBvZiB1bm9yZGVyZWQgaXRlbXNcbiAgICAgIHZhciBpbmRleCA9IFtdO1xuICAgICAgdW5vcmRlcmVkLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaW5kZXgucHVzaChpdGVtLmtleSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gT3JkZXJlZCBpdGVtc1xuICAgICAgdmFyIG9yZGVyZWQgPSBbXTtcbiAgICAgIHZhciBvcmRlcmluZyA9IFtdO1xuXG4gICAgICAvLyBGaXJzdCBwYXNzOiByZWdpc3RlciBpdGVtcyB0aGF0XG4gICAgICAvLyBkb24ndCBzcGVjaWZ5IHRoZWlyIG9yZGVyXG4gICAgICB1bm9yZGVyZWQuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpZiAoIWl0ZW0uYWZ0ZXIgJiYgIWl0ZW0uYmVmb3JlKSB7XG4gICAgICAgICAgb3JkZXJlZC5wdXNoKGl0ZW0pO1xuICAgICAgICAgIG9yZGVyaW5nLnB1c2goaXRlbS5rZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU2Vjb25kIHBhc3M6IHJlZ2lzdGVyIGl0ZW1zIHRoYXRcbiAgICAgIC8vIHNwZWNpZnkgdGhlaXIgYmVmb3JlIHRvIFwiX2VuZFwiXG4gICAgICB1bm9yZGVyZWQuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpZiAoaXRlbS5iZWZvcmUgPT09IFwiX2VuZFwiKSB7XG4gICAgICAgICAgb3JkZXJlZC5wdXNoKGl0ZW0pO1xuICAgICAgICAgIG9yZGVyaW5nLnB1c2goaXRlbS5rZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhpcmQgcGFzczoga2VlcCBpdGVyYXRpbmcgaXRlbXNcbiAgICAgIC8vIHVudGlsIHdlIGhpdCBpdGVyYXRpb25zIGxpbWl0IG9yIGZpbmlzaFxuICAgICAgLy8gb3JkZXJpbmcgbGlzdFxuICAgICAgZnVuY3Rpb24gaW5zZXJ0SXRlbShpdGVtKSB7XG4gICAgICAgIHZhciBpbnNlcnRBdCA9IC0xO1xuICAgICAgICBpZiAob3JkZXJpbmcuaW5kZXhPZihpdGVtLmtleSkgPT09IC0xKSB7XG4gICAgICAgICAgaWYgKGl0ZW0uYWZ0ZXIpIHtcbiAgICAgICAgICAgIGluc2VydEF0ID0gb3JkZXJpbmcuaW5kZXhPZihpdGVtLmFmdGVyKTtcbiAgICAgICAgICAgIGlmIChpbnNlcnRBdCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgaW5zZXJ0QXQgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uYmVmb3JlKSB7XG4gICAgICAgICAgICBpbnNlcnRBdCA9IG9yZGVyaW5nLmluZGV4T2YoaXRlbS5iZWZvcmUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpbnNlcnRBdCAhPT0gLTEpIHtcbiAgICAgICAgICAgIG9yZGVyZWQuc3BsaWNlKGluc2VydEF0LCAwLCBpdGVtKTtcbiAgICAgICAgICAgIG9yZGVyaW5nLnNwbGljZShpbnNlcnRBdCwgMCwgaXRlbS5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDIwMDtcbiAgICAgIHdoaWxlIChpdGVyYXRpb25zID4gMCAmJiBpbmRleC5sZW5ndGggIT09IG9yZGVyaW5nLmxlbmd0aCkge1xuICAgICAgICBpdGVyYXRpb25zIC09IDE7XG4gICAgICAgIHVub3JkZXJlZC5mb3JFYWNoKGluc2VydEl0ZW0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3JkZXJlZDtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgZGVmYXVsdCBPcmRlcmVkTGlzdDtcbiIsImV4cG9ydCBmdW5jdGlvbiBpbnQobWluLCBtYXgpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpKSArIG1pbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlKG1pbiwgbWF4KSB7XG4gIGxldCBhcnJheSA9IG5ldyBBcnJheShpbnQobWluLCBtYXgpKTtcbiAgZm9yKGxldCBpPTA7IGk8YXJyYXkubGVuZ3RoOyBpKyspe1xuICAgIGFycmF5W2ldID0gaTtcbiAgfVxuXG4gIHJldHVybiBhcnJheTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgd2luZG93LnNjcm9sbFRvKDAsIDApO1xufSIsIi8vIGpzaGludCBpZ25vcmU6c3RhcnRcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAncmVhY3Qtcm91dGVyJztcbmltcG9ydCBjcmVhdGVIaXN0b3J5IGZyb20gJ2hpc3RvcnkvbGliL2NyZWF0ZUJyb3dzZXJIaXN0b3J5JztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5jb25zdCByb290RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWdlLW1vdW50Jyk7XG5jb25zdCBoaXN0b3J5ID0gbmV3IGNyZWF0ZUhpc3RvcnkoKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob3B0aW9ucykge1xuICBsZXQgcm91dGVzID0ge1xuICAgIGNvbXBvbmVudDogb3B0aW9ucy5jb21wb25lbnQsXG4gICAgY2hpbGRSb3V0ZXM6IFtcbiAgICAgIHtcbiAgICAgICAgcGF0aDogb3B0aW9ucy5yb290LFxuICAgICAgICBvbkVudGVyOiBmdW5jdGlvbihuZXh0U3RhdGUsIHJlcGxhY2VTdGF0ZSkge1xuICAgICAgICAgIHJlcGxhY2VTdGF0ZShudWxsLCBvcHRpb25zLnBhdGhzWzBdLnBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgXS5jb25jYXQob3B0aW9ucy5wYXRocy5tYXAoZnVuY3Rpb24ocGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfSkpXG4gIH07XG5cbiAgUmVhY3RET00ucmVuZGVyKFxuICAgIDxQcm92aWRlciBzdG9yZT17c3RvcmUuZ2V0U3RvcmUoKX0+XG4gICAgICA8Um91dGVyIHJvdXRlcz17cm91dGVzfSBoaXN0b3J5PXtoaXN0b3J5fSAvPlxuICAgIDwvUHJvdmlkZXI+LFxuICAgIHJvb3RFbGVtZW50XG4gICk7XG59XG4iLCJjb25zdCBFTUFJTCA9IC9eKChbXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdKyhcXC5bXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdKykqKXwoXFxcIi4rXFxcIikpQCgoW148PigpW1xcXVxcLiw7Olxcc0BcXFwiXStcXC4pK1tePD4oKVtcXF1cXC4sOzpcXHNAXFxcIl17Mix9KSQvaTtcbmNvbnN0IFVTRVJOQU1FID0gbmV3IFJlZ0V4cCgnXlswLTlhLXpdKyQnLCAnaScpO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWQoKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmICgkLnRyaW0odmFsdWUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLlwiKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbWFpbChtZXNzYWdlKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmICghRU1BSUwudGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBtZXNzYWdlIHx8IGdldHRleHQoXCJFbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MuXCIpO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbkxlbmd0aChsaW1pdFZhbHVlLCBtZXNzYWdlKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciByZXR1cm5NZXNzYWdlID0gJyc7XG4gICAgdmFyIGxlbmd0aCA9ICQudHJpbSh2YWx1ZSkubGVuZ3RoO1xuXG4gICAgaWYgKGxlbmd0aCA8IGxpbWl0VmFsdWUpIHtcbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybk1lc3NhZ2UgPSBtZXNzYWdlKGxpbWl0VmFsdWUsIGxlbmd0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm5NZXNzYWdlID0gbmdldHRleHQoXG4gICAgICAgICAgXCJFbnN1cmUgdGhpcyB2YWx1ZSBoYXMgYXQgbGVhc3QgJShsaW1pdF92YWx1ZSlzIGNoYXJhY3RlciAoaXQgaGFzICUoc2hvd192YWx1ZSlzKS5cIixcbiAgICAgICAgICBcIkVuc3VyZSB0aGlzIHZhbHVlIGhhcyBhdCBsZWFzdCAlKGxpbWl0X3ZhbHVlKXMgY2hhcmFjdGVycyAoaXQgaGFzICUoc2hvd192YWx1ZSlzKS5cIixcbiAgICAgICAgICBsaW1pdFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShyZXR1cm5NZXNzYWdlLCB7XG4gICAgICAgIGxpbWl0X3ZhbHVlOiBsaW1pdFZhbHVlLFxuICAgICAgICBzaG93X3ZhbHVlOiBsZW5ndGhcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1heExlbmd0aChsaW1pdFZhbHVlLCBtZXNzYWdlKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciByZXR1cm5NZXNzYWdlID0gJyc7XG4gICAgdmFyIGxlbmd0aCA9ICQudHJpbSh2YWx1ZSkubGVuZ3RoO1xuXG4gICAgaWYgKGxlbmd0aCA+IGxpbWl0VmFsdWUpIHtcbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybk1lc3NhZ2UgPSBtZXNzYWdlKGxpbWl0VmFsdWUsIGxlbmd0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm5NZXNzYWdlID0gbmdldHRleHQoXG4gICAgICAgICAgXCJFbnN1cmUgdGhpcyB2YWx1ZSBoYXMgYXQgbW9zdCAlKGxpbWl0X3ZhbHVlKXMgY2hhcmFjdGVyIChpdCBoYXMgJShzaG93X3ZhbHVlKXMpLlwiLFxuICAgICAgICAgIFwiRW5zdXJlIHRoaXMgdmFsdWUgaGFzIGF0IG1vc3QgJShsaW1pdF92YWx1ZSlzIGNoYXJhY3RlcnMgKGl0IGhhcyAlKHNob3dfdmFsdWUpcykuXCIsXG4gICAgICAgICAgbGltaXRWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUocmV0dXJuTWVzc2FnZSwge1xuICAgICAgICBsaW1pdF92YWx1ZTogbGltaXRWYWx1ZSxcbiAgICAgICAgc2hvd192YWx1ZTogbGVuZ3RoXG4gICAgICB9LCB0cnVlKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VybmFtZU1pbkxlbmd0aChzZXR0aW5ncykge1xuICB2YXIgbWVzc2FnZSA9IGZ1bmN0aW9uKGxpbWl0VmFsdWUpIHtcbiAgICByZXR1cm4gbmdldHRleHQoXG4gICAgICBcIlVzZXJuYW1lIG11c3QgYmUgYXQgbGVhc3QgJShsaW1pdF92YWx1ZSlzIGNoYXJhY3RlciBsb25nLlwiLFxuICAgICAgXCJVc2VybmFtZSBtdXN0IGJlIGF0IGxlYXN0ICUobGltaXRfdmFsdWUpcyBjaGFyYWN0ZXJzIGxvbmcuXCIsXG4gICAgICBsaW1pdFZhbHVlKTtcbiAgfTtcbiAgcmV0dXJuIHRoaXMubWluTGVuZ3RoKHNldHRpbmdzLnVzZXJuYW1lX2xlbmd0aF9taW4sIG1lc3NhZ2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlcm5hbWVNYXhMZW5ndGgoc2V0dGluZ3MpIHtcbiAgdmFyIG1lc3NhZ2UgPSBmdW5jdGlvbihsaW1pdFZhbHVlKSB7XG4gICAgcmV0dXJuIG5nZXR0ZXh0KFxuICAgICAgXCJVc2VybmFtZSBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gJShsaW1pdF92YWx1ZSlzIGNoYXJhY3Rlci5cIixcbiAgICAgIFwiVXNlcm5hbWUgY2Fubm90IGJlIGxvbmdlciB0aGFuICUobGltaXRfdmFsdWUpcyBjaGFyYWN0ZXJzLlwiLFxuICAgICAgbGltaXRWYWx1ZSk7XG4gIH07XG4gIHJldHVybiB0aGlzLm1heExlbmd0aChzZXR0aW5ncy51c2VybmFtZV9sZW5ndGhfbWF4LCBtZXNzYWdlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZXJuYW1lQ29udGVudCgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKCFVU0VSTkFNRS50ZXN0KCQudHJpbSh2YWx1ZSkpKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIlVzZXJuYW1lIGNhbiBvbmx5IGNvbnRhaW4gbGF0aW4gYWxwaGFiZXQgbGV0dGVycyBhbmQgZGlnaXRzLlwiKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXNzd29yZE1pbkxlbmd0aChzZXR0aW5ncykge1xuICB2YXIgbWVzc2FnZSA9IGZ1bmN0aW9uKGxpbWl0VmFsdWUpIHtcbiAgICByZXR1cm4gbmdldHRleHQoXG4gICAgICBcIlZhbGlkIHBhc3N3b3JkIG11c3QgYmUgYXQgbGVhc3QgJShsaW1pdF92YWx1ZSlzIGNoYXJhY3RlciBsb25nLlwiLFxuICAgICAgXCJWYWxpZCBwYXNzd29yZCBtdXN0IGJlIGF0IGxlYXN0ICUobGltaXRfdmFsdWUpcyBjaGFyYWN0ZXJzIGxvbmcuXCIsXG4gICAgICBsaW1pdFZhbHVlKTtcbiAgfTtcbiAgcmV0dXJuIHRoaXMubWluTGVuZ3RoKHNldHRpbmdzLnBhc3N3b3JkX2xlbmd0aF9taW4sIG1lc3NhZ2UpO1xufSJdfQ==
|