Advertisement
Guest User

Untitled

a guest
Feb 5th, 2017
1,583
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. "use strict";
  2. angular.module("payment.popup", ["config", "google.analytics", "notifier", "popup", "purse.service", "system.data"]).factory("paymentPopup", ["$q", "$translate", "$window", "CONFIG", "SystemData", "googleAnalytics", "notifier", "popup", "purse", function(e, t, o, r, a, n, i, s, l) {
  3.     function c(e) {
  4.         return "/proceed/" + [e.requestPath, e.purchaseParams.countryId, e.purchaseParams.pricePointId, e.purchaseParams.paymentMethodId].join("/")
  5.     }
  6.     function u(e) {
  7.         var t = a.getShopCountry();
  8.         t !== e && n.trackEvent("Payment", "Country changed", "Used: " + e + ", Default: " + t)
  9.     }
  10.     var d = {};
  11.     return d.getItemName = function(o) {
  12.         var r = ["CREDITS_AMOUNT"];
  13.         return o.creditAmount ? (o.doubleCredits && r.push("DOUBLE_CREDITS_PREFIX"),
  14.         t(r, {
  15.             value: o.creditAmount
  16.         }).then(function(e) {
  17.             return _([e.DOUBLE_CREDITS_PREFIX, e.CREDITS_AMOUNT]).compact().join(" ")
  18.         })) : e.when(o.name)
  19.     }
  20.     ,
  21.     d.sendShopTrackingEvents = function(e, t, r) {
  22.         var a = "Item: " + t + ", Method: " + r;
  23.         switch (e) {
  24.         case "SUCCESS":
  25.             n.trackEvent("Payment", "Succeeded", a),
  26.             o.piwikTrack && (o._spef.push(["trackGoal", 2, a]),
  27.             o.piwikTrack());
  28.             break;
  29.         case "PENDING":
  30.             n.trackEvent("Payment", "Pending", a);
  31.             break;
  32.         case "ERROR":
  33.             n.trackEvent("Payment", "Failed", a);
  34.             break;
  35.         default:
  36.             n.trackEvent("Payment", "Aborted", a)
  37.         }
  38.     }
  39.     ,
  40.     d.open = function(e, t) {
  41.         function a(o) {
  42.             o.originalEvent.data && o.originalEvent.data.status && (p = o.originalEvent.data.status,
  43.             "SUCCESS" !== p && "PENDING" !== p || (l.update(),
  44.             u(t.countryCode),
  45.             d.getItemName(t).then(function(e) {
  46.                 var r = o.originalEvent.data.txId
  47.                   , a = o.originalEvent.data.currency
  48.                   , i = o.originalEvent.data.priceInCents
  49.                   , s = _(t.categories).sort().join(", ")
  50.                   , l = Number(i / 100).toFixed(2);
  51.                 n.trackTransaction(r, e, t.id, s, l, a)
  52.             })),
  53.             d.sendShopTrackingEvents(p, t.id, e.id))
  54.         }
  55.         function m() {
  56.             "SUCCESS" === p && d.getItemName(t).then(function(e) {
  57.                 i.success("SHOP_PAYMENT_SUCCESS", {
  58.                     name: e
  59.                 })
  60.             })
  61.         }
  62.         var p, h = c(e);
  63.         return angular.element(o).on("message", a),
  64.         s.open(r.shopUrl + h).then(function() {
  65.             m(),
  66.             angular.element(o).off("message", a)
  67.         })
  68.     }
  69.     ,
  70.     d
  71. }
  72. ]),
  73. angular.module("subscription.unsubscribe", ["locale", "notifier", "subscriptions.service", "templates"]).constant("SUBSCRIPTION_EVENTS", {
  74.     cancel: "subscription-cancel"
  75. }).component("habboSubscriptionUnsubscribe", {
  76.     bindings: {
  77.         item: "<"
  78.     },
  79.     controller: ["$scope", "$translate", "$window", "SUBSCRIPTION_EVENTS", "Subscriptions", "notifier", function(e, t, o, r, a, n) {
  80.         function i() {
  81.             var t = {
  82.                 countryCode: s.item.countryCode,
  83.                 subscriptionType: s.item.subscriptionType
  84.             };
  85.             return a.cancel(t).$promise.then(function() {
  86.                 e.$emit(r.cancel)
  87.             })["catch"](function() {
  88.                 n.error("ERROR_SERVER"),
  89.                 s.unsubscribeInProgress = !1
  90.             })
  91.         }
  92.         var s = this;
  93.         s.unsubscribeInProgress = !1,
  94.         s.unsubscribe = function() {
  95.             s.unsubscribeInProgress = !0,
  96.             t("CONFIRMATION_TITLE").then(function(e) {
  97.                 o.confirm(e) ? i() : s.unsubscribeInProgress = !1
  98.             })
  99.         }
  100.     }
  101.     ],
  102.     controllerAs: "SubscriptionUnsubscribeController",
  103.     templateUrl: "shop/subscriptions/subscription/subscription-unsubscribe/subscription-unsubscribe.html"
  104. }),
  105. angular.module("subscription.page", []).constant("PAGE_BY_TYPE", {
  106.     0: "store/subscribe/subscribe_supersaver",
  107.     1: "store/subscribe/subscribe_bc"
  108. }).directive("habboSubscriptionPage", ["PAGE_BY_TYPE", function(e) {
  109.     return {
  110.         restrict: "A",
  111.         link: function(t, o, r) {
  112.             t.$watch(r.habboSubscriptionPage, function(t) {
  113.                 r.$set("key", e[t.subscriptionType])
  114.             })
  115.         }
  116.     }
  117. }
  118. ]),
  119. angular.module("sub.product.icons", ["locale", "templates"]).component("habboSubProductIcons", {
  120.     bindings: {
  121.         subProducts: "<"
  122.     },
  123.     controllerAs: "SubProductIconsController",
  124.     templateUrl: "shop/payment-details/product-payment-details/sub-product-icons/sub-product-icons.html"
  125. }),
  126. angular.module("payment.premium.sms", ["config", "locale", "templates", "voucher.redeem"]).component("habboPremiumSms", {
  127.     bindings: {
  128.         method: "<"
  129.     },
  130.     controller: ["CONFIG", function(e) {
  131.         var t = this
  132.           , o = [e.localizationSite, t.method.localizationKey].join("_");
  133.         t.methodSmallPrintKey = ["SHOP_PAYMENTMETHOD_SMALLPRINT", o].join("_").toUpperCase(),
  134.         t.methodInstructionKey = ["SHOP_PAYMENTMETHOD_INSTRUCTION", o].join("_").toUpperCase()
  135.     }
  136.     ],
  137.     controllerAs: "PremiumSmsController",
  138.     templateUrl: "shop/payment-details/payment-steps/premium-sms/premium-sms.html",
  139.     transclude: !0
  140. }),
  141. angular.module("payment.methods", ["locale", "payment.button", "security", "shop.filters", "templates"]).component("habboPaymentMethods", {
  142.     require: {
  143.         PaymentStepsController: "^habboPaymentSteps"
  144.     },
  145.     bindings: {
  146.         item: "<",
  147.         selectedCategory: "@"
  148.     },
  149.     controllerAs: "PaymentMethodsController",
  150.     templateUrl: "shop/payment-details/payment-steps/payment-methods/payment-methods.html"
  151. }),
  152. angular.module("payment.disclaimer", ["ngSanitize", "config", "locale", "payment.button", "templates"]).component("habboPaymentDisclaimer", {
  153.     bindings: {
  154.         item: "<",
  155.         method: "<"
  156.     },
  157.     controller: ["CONFIG", function(e) {
  158.         var t = this
  159.           , o = [e.localizationSite, t.method.localizationKey].join("_");
  160.         t.methodSmallPrintKey = ["SHOP_PAYMENTMETHOD_SMALLPRINT", o].join("_").toUpperCase(),
  161.         t.methodInstructionKey = ["SHOP_PAYMENTMETHOD_INSTRUCTION", o].join("_").toUpperCase()
  162.     }
  163.     ],
  164.     controllerAs: "PaymentDisclaimerController",
  165.     templateUrl: "shop/payment-details/payment-steps/payment-disclaimer/payment-disclaimer.html"
  166. }),
  167. angular.module("payment.button", ["events", "locale", "payment.popup", "security", "templates"]).component("habboPaymentButton", {
  168.     bindings: {
  169.         item: "<",
  170.         method: "<"
  171.     },
  172.     controller: ["$scope", "EVENTS", "Session", "loginModal", "paymentPopup", function(e, t, o, r, a) {
  173.         function n() {
  174.             return _.includes(i, s.method.category)
  175.         }
  176.         var i = ["builders", "subscription"]
  177.           , s = this;
  178.         s.translationKey = n() ? "SHOP_SUBSCRIPTION_SUBSCRIBE_BUTTON" : "SHOP_PAYMENT_BUTTON",
  179.         s.paymentInProgress = !1,
  180.         o.hasSession() ? s.purchase = function() {
  181.             s.paymentInProgress = !0,
  182.             a.open(s.method, s.item).then(function() {
  183.                 e.$emit(t.shopPaymentClose)
  184.             })["finally"](function() {
  185.                 s.paymentInProgress = !1
  186.             })
  187.         }
  188.         : s.purchase = r.open
  189.     }
  190.     ],
  191.     controllerAs: "PaymentButtonController",
  192.     templateUrl: "shop/payment-details/payment-steps/payment-button/payment-button.html"
  193. }),
  194. angular.module("adyen.service", ["adyen-cse-js", "config"]).factory("adyen", ["$http", "CONFIG", "adyenCse", function(e, t, o) {
  195.     return {
  196.         encryptAndSend: function(r, a, n) {
  197.             var i = {
  198.                 number: r.number,
  199.                 cvc: r.cvc,
  200.                 holderName: r.name,
  201.                 expiryMonth: r.expMonth.toString(),
  202.                 expiryYear: r.expYear.toString(),
  203.                 generationtime: a
  204.             }
  205.               , s = {
  206.                 countryId: n.purchaseParams.countryId,
  207.                 pricePointId: n.purchaseParams.pricePointId,
  208.                 paymentMethodId: n.id,
  209.                 creditCardNonce: o.encrypt(i)
  210.             };
  211.             return e.post(t.shopUrl + "/payment/adyen/", s)
  212.         }
  213.     }
  214. }
  215. ]),
  216. angular.module("adyen-cse-js", ["config"]).factory("adyenCse", ["$window", "CONFIG", function(e, t) {
  217.     var o = t.adyenPublicKey
  218.       , r = {}
  219.       , a = e.adyen.encrypt.createEncryption(o, r);
  220.     return a
  221. }
  222. ]),
  223. angular.module("payment.adyen", ["adyen.service", "config", "credit.card", "events", "locale", "notifier", "purse.service", "templates"]).component("habboAdyen", {
  224.     bindings: {
  225.         method: "<",
  226.         item: "<"
  227.     },
  228.     controller: ["$window", "$http", "$scope", "$rootScope", "$translate", "CONFIG", "EVENTS", "adyen", "notifier", "paymentPopup", "purse", function(e, t, o, r, a, n, i, s, l, c, u) {
  229.         var d = this;
  230.         d.state = "AWAITING_INPUT",
  231.         d.transactionId = "",
  232.         d.close = function() {
  233.             r.$broadcast(i.accordionClose),
  234.             r.$broadcast(i.accordionUpdate)
  235.         }
  236.         ,
  237.         d.showInputForm = function() {
  238.             d.transactionId = "",
  239.             d.state = "AWAITING_INPUT"
  240.         }
  241.         ,
  242.         d.onSend = function(e) {
  243.             var o = n.apiUrl + "/public/info/time";
  244.             return t.get(o).then(function(t) {
  245.                 var o = new Date(t.data.time).toISOString();
  246.                 return s.encryptAndSend(e, o, d.method).then(function(e) {
  247.                     if (e.data.success === !0)
  248.                         u.update(),
  249.                         d.transactionId = e.data.transactionId,
  250.                         d.state = "SUCCESS",
  251.                         d.card = {},
  252.                         c.getItemName(d.item).then(function(e) {
  253.                             l.success("SHOP_PAYMENT_SUCCESS", {
  254.                                 name: e
  255.                             })
  256.                         }),
  257.                         c.sendShopTrackingEvents("SUCCESS", d.item.id, d.method.id);
  258.                     else
  259.                         switch (d.state = "FAILURE",
  260.                         e.data.message) {
  261.                         case "LIMIT_EXCEEDED":
  262.                             d.errorType = "LIMIT_EXCEEDED";
  263.                             break;
  264.                         case "RISK_CHECK_FAILED":
  265.                             d.errorType = "RISK_CHECK_FAILED";
  266.                             break;
  267.                         case "CONNECTION_FAILED:422":
  268.                             d.errorType = "USER_DATA";
  269.                             break;
  270.                         default:
  271.                             Bugsnag.notify("Adyen integration returned unexpected result", {
  272.                                 groupingHash: "Payments",
  273.                                 response: e.data.message
  274.                             }, "info"),
  275.                             d.errorType = "HTTP_ERROR"
  276.                         }
  277.                 })["catch"](function(e) {
  278.                     d.state = "FAILURE",
  279.                     d.errorType = "HTTP_ERROR",
  280.                     d.errorMsg = e.data.errorDetail.content.instructions
  281.                 })
  282.             })["catch"](function() {
  283.                 l.error("ERROR_SERVER")
  284.             })
  285.         }
  286.     }
  287.     ],
  288.     controllerAs: "AdyenController",
  289.     templateUrl: "shop/payment-details/payment-steps/adyen/adyen.html",
  290.     transclude: !0
  291. }),
  292. angular.module("remote.data", []).directive("habboRemoteData", function() {
  293.     function e(e) {
  294.         return "remoteData" + t(e)
  295.     }
  296.     function t(e) {
  297.         return e.charAt(0).toUpperCase() + e.slice(1)
  298.     }
  299.     function o(e) {
  300.         return "$" !== e[0]
  301.     }
  302.     return {
  303.         restrict: "A",
  304.         require: ["^form", "ngModel"],
  305.         link: function(t, r, a, n) {
  306.             var i, s = n[0], l = n[1], c = t.$eval(a.habboRemoteData);
  307.             t.$on("remote-data-invalid", function(t, o) {
  308.                 _(c).includes(o) && (i = e(o),
  309.                 l.$setValidity(i, !1))
  310.             }),
  311.             t.$watch(function() {
  312.                 return l.$viewValue
  313.             }, function() {
  314.                 i && _(s).keys().filter(o).forEach(function(e) {
  315.                     s[e].$setValidity(i, !0)
  316.                 })
  317.             })
  318.         }
  319.     }
  320. }),
  321. angular.module("password.pattern", []).directive("habboPasswordPattern", function() {
  322.     return {
  323.         require: "ngModel",
  324.         restrict: "A",
  325.         link: function(e, t, o, r) {
  326.             function a() {
  327.                 var e = r.$viewValue;
  328.                 return !e || r.$pristine || i(e)
  329.             }
  330.             function n(e) {
  331.                 r.$setValidity("passwordPattern", e)
  332.             }
  333.             function i(e) {
  334.                 return /(?=.*[A-Za-z])(?=.*[0-9-=?!@:.])/.test(e)
  335.             }
  336.             e.$watch(a, n)
  337.         }
  338.     }
  339. }),
  340. angular.module("password.name", []).directive("habboPasswordName", function() {
  341.     return {
  342.         require: "ngModel",
  343.         restrict: "A",
  344.         link: function(e, t, o, r) {
  345.             function a(e) {
  346.                 return n && (_(e).includes(n) || _(e).includes(i))
  347.             }
  348.             var n, i;
  349.             o.$observe("habboPasswordName", function(e) {
  350.                 n = e,
  351.                 i = n.split("").reverse().join(""),
  352.                 r.$validate()
  353.             }),
  354.             r.$validators.passwordName = function(e, t) {
  355.                 return r.$isEmpty(e) || !a(t)
  356.             }
  357.         }
  358.     }
  359. }),
  360. angular.module("password.email", []).directive("habboPasswordEmail", function() {
  361.     return {
  362.         require: "ngModel",
  363.         restrict: "A",
  364.         link: function(e, t, o, r) {
  365.             function a(e) {
  366.                 return n && (_(e).includes(n) || _(e).includes(i))
  367.             }
  368.             var n, i;
  369.             o.$observe("habboPasswordEmail", function(e) {
  370.                 n = e,
  371.                 i = n.split("").reverse().join(""),
  372.                 r.$validate()
  373.             }),
  374.             r.$validators.passwordEmail = function(e, t) {
  375.                 return r.$isEmpty(e) || !a(t)
  376.             }
  377.         }
  378.     }
  379. }),
  380. angular.module("matches", []).directive("habboMatches", function() {
  381.     return {
  382.         require: ["^form", "ngModel"],
  383.         restrict: "A",
  384.         scope: {
  385.             habboMatches: "@"
  386.         },
  387.         link: function(e, t, o, r) {
  388.             function a() {
  389.                 var t = i[e.habboMatches]
  390.                   , o = s.$viewValue;
  391.                 return !o || s.$pristine || t.$invalid || t.$viewValue === o
  392.             }
  393.             function n(e) {
  394.                 s.$setValidity("matches", e)
  395.             }
  396.             var i = r[0]
  397.               , s = r[1];
  398.             e.$watch(a, n)
  399.         }
  400.     }
  401. }),
  402. angular.module("email", []).directive("habboEmail", function() {
  403.     var e = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i;
  404.     return {
  405.         require: "ngModel",
  406.         restrict: "A",
  407.         link: function(t, o, r, a) {
  408.             a && a.$validators.email && (a.$validators.email = function(t) {
  409.                 return a.$isEmpty(t) || e.test(t)
  410.             }
  411.             )
  412.         }
  413.     }
  414. }),
  415. angular.module("password.strength.service", []).factory("passwordStrength", function() {
  416.     var e = "abcdefghijklmnopqrstuvwxyz"
  417.       , t = "01234567890"
  418.       , o = /\d/g
  419.       , r = "\\!@#$%&/()=?¿"
  420.       , a = /[$-\/:-?{-~!^_`\[\]]/g
  421.       , n = /(?=([a-z]{2}))/g
  422.       , i = /(?=([A-Z]{2}))/g
  423.       , s = /(?=(\d{2}))/g
  424.       , l = /^[0-9]*$/g
  425.       , c = /^([a-z]|[A-Z])*$/g;
  426.     return function(u) {
  427.         var d, m, p, h, b = 0, f = {
  428.             pos: {},
  429.             neg: {}
  430.         }, g = {
  431.             pos: {},
  432.             neg: {
  433.                 seqLetter: 0,
  434.                 seqNumber: 0,
  435.                 seqSymbol: 0
  436.             }
  437.         };
  438.         if (u) {
  439.             for (f.pos.lower = u.match(/[a-z]/g),
  440.             f.pos.upper = u.match(/[A-Z]/g),
  441.             f.pos.numbers = u.match(o),
  442.             f.pos.symbols = u.match(a),
  443.             f.pos.middleNumber = u.slice(1, -1).match(o),
  444.             f.pos.middleSymbol = u.slice(1, -1).match(a),
  445.             g.pos.lower = f.pos.lower ? f.pos.lower.length : 0,
  446.             g.pos.upper = f.pos.upper ? f.pos.upper.length : 0,
  447.             g.pos.numbers = f.pos.numbers ? f.pos.numbers.length : 0,
  448.             g.pos.symbols = f.pos.symbols ? f.pos.symbols.length : 0,
  449.             p = _.reduce(g.pos, function(e, t) {
  450.                 return e + Math.min(1, t)
  451.             }, 0),
  452.             g.pos.numChars = u.length,
  453.             p += g.pos.numChars >= 8 ? 1 : 0,
  454.             g.pos.requirements = p >= 3 ? p : 0,
  455.             g.pos.middleNumber = f.pos.middleNumber ? f.pos.middleNumber.length : 0,
  456.             g.pos.middleSymbol = f.pos.middleSymbol ? f.pos.middleSymbol.length : 0,
  457.             f.neg.consecLower = u.match(n),
  458.             f.neg.consecUpper = u.match(i),
  459.             f.neg.consecNumbers = u.match(s),
  460.             f.neg.onlyNumbers = u.match(l),
  461.             f.neg.onlyLetters = u.match(c),
  462.             g.neg.consecLower = f.neg.consecLower ? f.neg.consecLower.length : 0,
  463.             g.neg.consecUpper = f.neg.consecUpper ? f.neg.consecUpper.length : 0,
  464.             g.neg.consecNumbers = f.neg.consecNumbers ? f.neg.consecNumbers.length : 0,
  465.             h = 0; h < e.length - 2; h++) {
  466.                 var v = u.toLowerCase();
  467.                 m = e.substring(h, parseInt(h + 3, 10)),
  468.                 d = m.split("").reverse().join(""),
  469.                 -1 === v.indexOf(m) && -1 === v.indexOf(d) || g.neg.seqLetter++
  470.             }
  471.             for (h = 0; h < t.length - 2; h++)
  472.                 m = t.substring(h, parseInt(h + 3, 10)),
  473.                 d = m.split("").reverse().join(""),
  474.                 -1 === u.indexOf(m) && -1 === u.toLowerCase().indexOf(d) || g.neg.seqNumber++;
  475.             for (h = 0; h < r.length - 2; h++)
  476.                 m = r.substring(h, parseInt(h + 3, 10)),
  477.                 d = m.split("").reverse().join(""),
  478.                 -1 === u.indexOf(m) && -1 === u.toLowerCase().indexOf(d) || g.neg.seqSymbol++;
  479.             return g.neg.repeated = _(u.toLowerCase().split("")).countBy(function(e) {
  480.                 return e
  481.             }).reject(function(e) {
  482.                 return 1 === e
  483.             }).reduce(function(e, t) {
  484.                 return e + t
  485.             }, 0),
  486.             b += 4 * g.pos.numChars,
  487.             g.pos.upper && (b += 2 * (g.pos.numChars - g.pos.upper)),
  488.             g.pos.lower && (b += 2 * (g.pos.numChars - g.pos.lower)),
  489.             (g.pos.upper || g.pos.lower) && (b += 4 * g.pos.numbers),
  490.             b += 6 * g.pos.symbols,
  491.             b += 2 * (g.pos.middleSymbol + g.pos.middleNumber),
  492.             b += 2 * g.pos.requirements,
  493.             b -= 2 * g.neg.consecLower,
  494.             b -= 2 * g.neg.consecUpper,
  495.             b -= 2 * g.neg.consecNumbers,
  496.             b -= 3 * g.neg.seqNumber,
  497.             b -= 3 * g.neg.seqLetter,
  498.             b -= 3 * g.neg.seqSymbol,
  499.             f.neg.onlyNumbers && (b -= g.pos.numChars),
  500.             f.neg.onlyLetters && (b -= g.pos.numChars),
  501.             g.neg.repeated && (b -= g.neg.repeated / g.pos.numChars * 10),
  502.             Math.max(0, Math.min(100, Math.round(b)))
  503.         }
  504.     }
  505. }),
  506. angular.module("password.strength.indicator", ["ngAnimate"]).directive("habboPasswordStrengthIndicator", ["$animate", function(e) {
  507.     return {
  508.         restrict: "A",
  509.         link: function(t, o, r) {
  510.             var a = "10%";
  511.             t.$watch(r.habboPasswordStrengthIndicator, function(t) {
  512.                 var r = t + "%";
  513.                 e.animate(o, {
  514.                     width: a
  515.                 }, {
  516.                     width: r
  517.                 }),
  518.                 a = r
  519.             })
  520.         }
  521.     }
  522. }
  523. ]),
  524. angular.module("password.strength.filters", []).filter("strengthRating", function() {
  525.     return function(e) {
  526.         switch (Math.round(e / 25)) {
  527.         case 1:
  528.             return "poor";
  529.         case 2:
  530.             return "fair";
  531.         case 3:
  532.             return "ok";
  533.         case 4:
  534.             return "good";
  535.         default:
  536.             return "fail"
  537.         }
  538.     }
  539. }).filter("ratingTranslation", function() {
  540.     return function(e) {
  541.         return "PASSWORD_STRENGTH_RATING_" + e.toUpperCase()
  542.     }
  543. }),
  544. angular.module("password.strength", ["locale", "password.strength.filters", "password.strength.indicator", "password.strength.service", "templates"]).component("habboPasswordStrength", {
  545.     require: {
  546.         FormController: "^form"
  547.     },
  548.     bindings: {
  549.         modelValue: "<",
  550.         modelName: "@"
  551.     },
  552.     controller: ["$scope", "passwordStrength", function(e, t) {
  553.         var o = this;
  554.         e.$watch("PasswordStrengthController.modelValue", function(e) {
  555.             o.FormController[o.modelName].$valid && (o.score = t(e))
  556.         }),
  557.         e.$watch("PasswordStrengthController.FormController." + o.modelName + ".$invalid", function(e) {
  558.             e && (o.score = 10)
  559.         })
  560.     }
  561.     ],
  562.     controllerAs: "PasswordStrengthController",
  563.     templateUrl: "common/form/password-new/password-strength/password-strength.html",
  564.     transclude: !0
  565. }),
  566. angular.module("voucher.icon", ["templates"]).component("habboVoucherIcon", {
  567.     bindings: {
  568.         credits: "<?",
  569.         product: "<?"
  570.     },
  571.     controllerAs: "VoucherIconController",
  572.     templateUrl: "shop/voucher-redeem/voucher-icon/voucher-icon.html"
  573. }),
  574. angular.module("shop.transactions.history", ["locale", "templates"]).component("habboTransactionsHistory", {
  575.     bindings: {
  576.         transactions: "<",
  577.         limitTo: "@"
  578.     },
  579.     controllerAs: "TransactionsHistoryController",
  580.     templateUrl: "shop/transactions/transactions-history/transactions-history.html"
  581. }),
  582. angular.module("subscription.thumbnail", ["credit.icon", "locale", "templates"]).component("habboSubscriptionThumbnail", {
  583.     bindings: {
  584.         item: "<"
  585.     },
  586.     controllerAs: "SubscriptionThumbnailController",
  587.     templateUrl: "shop/thumbnails/subscription-thumbnail/subscription-thumbnail.html"
  588. }),
  589. angular.module("product.thumbnail", ["product.icon", "templates"]).component("habboProductThumbnail", {
  590.     bindings: {
  591.         item: "<"
  592.     },
  593.     controllerAs: "ProductThumbnailController",
  594.     templateUrl: "shop/thumbnails/product-thumbnail/product-thumbnail.html"
  595. }),
  596. angular.module("offer.thumbnail", ["locale", "product.icon", "templates"]).component("habboOfferThumbnail", {
  597.     bindings: {
  598.         item: "<"
  599.     },
  600.     controllerAs: "OfferThumbnailController",
  601.     templateUrl: "shop/thumbnails/offer-thumbnail/offer-thumbnail.html"
  602. }),
  603. angular.module("credit.thumbnail", ["credit.icon", "credit.title", "templates"]).component("habboCreditThumbnail", {
  604.     bindings: {
  605.         item: "<"
  606.     },
  607.     controllerAs: "CreditThumbnailController",
  608.     templateUrl: "shop/thumbnails/credit-thumbnail/credit-thumbnail.html"
  609. }),
  610. angular.module("subscription", ["locale", "subscription.page", "subscription.payment.details", "subscription.thumbnail", "subscription.unsubscribe", "templates"]).component("habboSubscription", {
  611.     bindings: {
  612.         item: "<"
  613.     },
  614.     controllerAs: "SubscriptionController",
  615.     templateUrl: "shop/subscriptions/subscription/subscription.html"
  616. }),
  617. angular.module("shop.targeted.offer", ["accordion", "offer.payment.details", "offer.thumbnail", "templates"]).component("habboTargetedOffer", {
  618.     bindings: {
  619.         offer: "<"
  620.     },
  621.     controller: function() {
  622.         var e = this;
  623.         e.offerPaymentDetails = {
  624.             imageUrl: e.offer.imageUrl,
  625.             smallImageUrl: e.offer.smallImageUrl,
  626.             name: e.offer.header,
  627.             description: e.offer.description,
  628.             price: e.offer.pricePoint.price,
  629.             paymentMethods: e.offer.pricePoint.paymentMethods
  630.         }
  631.     },
  632.     controllerAs: "TargetedOfferController",
  633.     templateUrl: "shop/store/targeted-offer/targeted-offer.html"
  634. }),
  635. angular.module("products", ["accordion", "locale", "product.payment.details", "product.thumbnail", "templates"]).component("habboProducts", {
  636.     bindings: {
  637.         items: "<",
  638.         selectedCategory: "@"
  639.     },
  640.     controllerAs: "ProductsController",
  641.     templateUrl: "shop/store/inventory/products.html"
  642. }),
  643. angular.module("shop.inventory", ["credits", "products", "shop.filters", "templates"]).component("habboInventory", {
  644.     bindings: {
  645.         inventory: "<",
  646.         selectedCategory: "@"
  647.     },
  648.     controller: ["creditFilter", "paymentFilter", "productFilter", function(e, t, o) {
  649.         var r = this
  650.           , a = t(r.inventory.pricePoints, r.selectedCategory);
  651.         r.creditItems = e(a),
  652.         r.productItems = o(a),
  653.         r.isDoubleCreditsActive = r.inventory.doubleCredits
  654.     }
  655.     ],
  656.     controllerAs: "InventoryController",
  657.     templateUrl: "shop/store/inventory/inventory.html"
  658. }),
  659. angular.module("credits", ["accordion", "credit.payment.details", "credit.thumbnail", "locale", "templates"]).component("habboCredits", {
  660.     bindings: {
  661.         items: "<",
  662.         selectedCategory: "@"
  663.     },
  664.     controllerAs: "CreditsController",
  665.     templateUrl: "shop/store/inventory/credits.html"
  666. }),
  667. angular.module("category.filter", ["locale", "templates"]).component("habboCategoryFilter", {
  668.     bindings: {
  669.         paymentCategories: "<",
  670.         selectedCategory: "="
  671.     },
  672.     controller: ["$location", function(e) {
  673.         var t = this;
  674.         t.isActive = function(e) {
  675.             return e === t.selectedCategory || "all" === e && !t.selectedCategory
  676.         }
  677.         ,
  678.         t.update = function(o) {
  679.             var r = t.selectedCategory;
  680.             t.selectedCategory = "all" === o ? null : o,
  681.             t.selectedCategory !== r && e.search(_.extend(e.search(), {
  682.                 category: t.selectedCategory
  683.             }))
  684.         }
  685.     }
  686.     ],
  687.     controllerAs: "CategoryFilterController",
  688.     templateUrl: "shop/store/category-filter/category-filter.html"
  689. }),
  690. angular.module("subscription.payment.details", ["locale", "payment.info", "payment.steps", "product.icon", "templates"]).component("habboSubscriptionPaymentDetails", {
  691.     bindings: {
  692.         item: "<"
  693.     },
  694.     controllerAs: "SubscriptionPaymentDetailsController",
  695.     templateUrl: "shop/payment-details/subscription-payment-details/subscription-payment-details.html"
  696. }),
  697. angular.module("product.payment.details", ["payment.info", "payment.steps", "product.icon", "sub.product.icons", "templates"]).component("habboProductPaymentDetails", {
  698.     bindings: {
  699.         item: "<",
  700.         selectedCategory: "@"
  701.     },
  702.     controllerAs: "ProductPaymentDetailsController",
  703.     templateUrl: "shop/payment-details/product-payment-details/product-payment-details.html"
  704. }),
  705. angular.module("payment.steps", ["config", "locale", "payment.adyen", "payment.disclaimer", "payment.methods", "payment.premium.sms", "security", "templates"]).component("habboPaymentSteps", {
  706.     bindings: {
  707.         item: "<",
  708.         selectedCategory: "@"
  709.     },
  710.     controller: ["$scope", "CONFIG", "EVENTS", "Session", function(e, t, o, r) {
  711.         function a() {
  712.             i.disclaimerMethod = null ,
  713.             i.premiumSmsMethod = null ,
  714.             i.adyenMethod = null
  715.         }
  716.         function n() {
  717.             e.$emit(o.accordionUpdate)
  718.         }
  719.         var i = this;
  720.         i.user = r.user,
  721.         i.disclaimerMethod = null ,
  722.         i.premiumSmsMethod = null ,
  723.         i.adyenMethod = null ,
  724.         i.setDisclaimer = function(e) {
  725.             i.disclaimerMethod = e,
  726.             n()
  727.         }
  728.         ,
  729.         i.setPremiumSms = function(e) {
  730.             i.premiumSmsMethod = e,
  731.             n()
  732.         }
  733.         ,
  734.         i.setAdyen = function(e) {
  735.             i.adyenMethod = e,
  736.             n()
  737.         }
  738.         ,
  739.         i.reset = function() {
  740.             a(),
  741.             n()
  742.         }
  743.         ,
  744.         i.getMethodTitleKey = function(e) {
  745.             var o = [t.localizationSite, e.localizationKey].join("_");
  746.             return ["SHOP_PAYMENTMETHOD_TITLE", o].join("_").toUpperCase()
  747.         }
  748.         ,
  749.         e.$on(o.accordionClose, a)
  750.     }
  751.     ],
  752.     controllerAs: "PaymentStepsController",
  753.     templateUrl: "shop/payment-details/payment-steps/payment-steps.html",
  754.     transclude: !0
  755. }),
  756. angular.module("payment.info", ["locale", "templates"]).directive("habboPaymentInfo", function() {
  757.     return {
  758.         restrict: "E",
  759.         scope: {},
  760.         templateUrl: function(e, t) {
  761.             return ["shop/payment-details/payment-info/payment-info-", t.type, ".html"].join("")
  762.         }
  763.     }
  764. }),
  765. angular.module("offer.payment.details", ["locale", "payment.info", "payment.steps", "templates"]).component("habboOfferPaymentDetails", {
  766.     bindings: {
  767.         offerPaymentDetails: "<"
  768.     },
  769.     controllerAs: "OfferPaymentDetailsController",
  770.     templateUrl: "shop/payment-details/offer-payment-details/offer-payment-details.html"
  771. }),
  772. angular.module("credit.payment.details", ["credit.icon", "credit.title", "locale", "payment.info", "payment.steps", "templates"]).component("habboCreditPaymentDetails", {
  773.     bindings: {
  774.         item: "<",
  775.         selectedCategory: "@"
  776.     },
  777.     controllerAs: "CreditPaymentDetailsController",
  778.     templateUrl: "shop/payment-details/credit-payment-details/credit-payment-details.html"
  779. }),
  780. angular.module("earn.credits.frame", ["locale", "security", "templates"]).component("habboEarnCreditsFrame", {
  781.     bindings: {
  782.         offerWallUrl: "@"
  783.     },
  784.     controllerAs: "EarnCreditsFrameController",
  785.     templateUrl: "shop/earn-credits/earn-credits-frame/earn-credits-frame.html"
  786. }),
  787. angular.module("credit.card.icon", ["templates"]).component("habboCreditCardIcon", {
  788.     bindings: {
  789.         credits: "<?",
  790.         product: "<?"
  791.     },
  792.     controllerAs: "CreditCardIconController",
  793.     templateUrl: "shop/credit-card-form/credit-card-icon/credit-card-icon.html"
  794. }),
  795. angular.module("activation.status", ["locale", "message.container", "notifier", "security", "settings.service", "templates"]).component("habboActivationStatus", {
  796.     controller: ["Session", "notifier", "settings", function(e, t, o) {
  797.         var r = this;
  798.         r.user = e.user,
  799.         r.resendInProgress = !1,
  800.         r.isSent = !1,
  801.         r.resend = function() {
  802.             r.resendInProgress = !0,
  803.             o.resendActivationEmail().then(function() {
  804.                 r.isSent = !0,
  805.                 t.success("ACTIVATION_RESEND_SUCESS")
  806.             })["catch"](function() {
  807.                 t.error("ERROR_SERVER")
  808.             })["finally"](function() {
  809.                 r.resendInProgress = !1
  810.             })
  811.         }
  812.     }
  813.     ],
  814.     controllerAs: "ActivationStatusController",
  815.     templateUrl: "settings/email-change/activation-status/activation-status.html"
  816. }),
  817. angular.module("avatar.selector", ["avatar.service", "imager", "locale", "notifier", "security", "templates"]).component("habboAvatarSelector", {
  818.     bindings: {
  819.         avatar: "<"
  820.     },
  821.     controller: ["$window", "Session", "avatar", "notifier", function(e, t, o, r) {
  822.         var a = this;
  823.         a.isSelected = a.avatar.uniqueId === t.user.uniqueId,
  824.         a.selectionInProgress = !1,
  825.         a.select = function() {
  826.             a.selectionInProgress = !0,
  827.             o.select(a.avatar).then(function() {
  828.                 e.location.href = "/settings/avatars"
  829.             })["catch"](function() {
  830.                 r.error("ERROR_SERVER"),
  831.                 a.selectionInProgress = !1
  832.             })
  833.         }
  834.     }
  835.     ],
  836.     controllerAs: "AvatarSelectorController",
  837.     templateUrl: "settings/avatar-selection/avatar-search/avatar-selector.html"
  838. }),
  839. angular.module("avatar.search", ["avatar.selector", "by.name.description.or.motto.filter", "empty.results", "form", "templates"]).component("habboAvatarSearch", {
  840.     bindings: {
  841.         avatars: "<"
  842.     },
  843.     controllerAs: "AvatarSearchController",
  844.     templateUrl: "settings/avatar-selection/avatar-search/avatar-search.html"
  845. }),
  846. angular.module("avatar.name.check", ["avatar.service"]).directive("habboAvatarNameCheck", ["$q", "avatar", function(e, t) {
  847.     return {
  848.         restrict: "A",
  849.         require: "ngModel",
  850.         link: function(o, r, a, n) {
  851.             n.$asyncValidators.name = function(o, r) {
  852.                 return r ? t.isNameAvailable(r) : e.when()
  853.             }
  854.         }
  855.     }
  856. }
  857. ]),
  858. angular.module("avatar.create.modal", ["avatar.create.form", "templates", "ui.bootstrap"]).factory("avatarCreateModal", ["$uibModal", function(e) {
  859.     var t, o = {};
  860.     return o.open = function() {
  861.         return t = e.open({
  862.             size: "sm",
  863.             templateUrl: "settings/avatar-selection/avatar-create/avatar-create-modal.html"
  864.         }),
  865.         t.result
  866.     }
  867.     ,
  868.     o
  869. }
  870. ]),
  871. angular.module("avatar.create.form", ["avatar.name.check", "avatar.service", "locale", "notifier", "templates"]).component("habboAvatarCreateForm", {
  872.     bindings: {
  873.         onCreate: "&",
  874.         onCancel: "&"
  875.     },
  876.     controller: ["$scope", "avatar", "notifier", function(e, t, o) {
  877.         var r = this;
  878.         r.createInProgress = !1,
  879.         r.create = function() {
  880.             e.avatarCreateForm.$valid && !e.avatarCreateForm.$pending && (r.createInProgress = !0,
  881.             t.create(r.name).then(r.onCreate)["catch"](function(e) {
  882.                 403 !== e.status && o.error("ERROR_SERVER")
  883.             })["finally"](function() {
  884.                 r.createInProgress = !1
  885.             }))
  886.         }
  887.     }
  888.     ],
  889.     controllerAs: "AvatarCreateFormController",
  890.     templateUrl: "settings/avatar-selection/avatar-create/avatar-create-form.html"
  891. }),
  892. angular.module("avatar.create", ["avatar.create.modal", "locale", "security", "templates"]).directive("habboAvatarCreate", ["$window", "Session", "avatarCreateModal", "safetyLockModal", function(e, t, o, r) {
  893.     return {
  894.         restrict: "E",
  895.         scope: {
  896.             avatars: "="
  897.         },
  898.         templateUrl: "settings/avatar-selection/avatar-create/avatar-create.html",
  899.         link: function(a) {
  900.             function n() {
  901.                 o.open().then(function() {
  902.                     e.location.href = "/hotel"
  903.                 })
  904.             }
  905.             a.emailVerified = t.user.emailVerified,
  906.             a.identityVerified = t.user.identityVerified,
  907.             a.MAX_AVATARS = 50,
  908.             a.open = function() {
  909.                 t.isTrusted() ? n() : r.open().then(n)
  910.             }
  911.         }
  912.     }
  913. }
  914. ]),
  915. angular.module("safety.questions.modal", ["safety.questions.form", "templates", "ui.bootstrap"]).factory("safetyQuestionsModal", ["$uibModal", function(e) {
  916.     var t, o = {};
  917.     return o.open = function() {
  918.         return t = e.open({
  919.             templateUrl: "settings/account-security/safety-questions/safety-questions-modal.html"
  920.         }),
  921.         t.result
  922.     }
  923.     ,
  924.     o
  925. }
  926. ]),
  927. angular.module("safety.questions.form", ["account.security.service", "form", "locale", "notifier", "safety.question.filters", "templates"]).constant("QUESTIONS", _.range(1, 10).map(function(e) {
  928.     return {
  929.         questionId: e.toString(),
  930.         questionKey: "IDENTITY_SAFETYQUESTION_" + e
  931.     }
  932. })).component("habboSafetyQuestionsForm", {
  933.     bindings: {
  934.         onSave: "&",
  935.         onCancel: "&"
  936.     },
  937.     controller: ["$scope", "QUESTIONS", "accountSecurity", "notifier", function(e, t, o, r) {
  938.         var a = this;
  939.         a.saveInProgress = !1,
  940.         a.questions = t,
  941.         a.selectedQuestion1 = a.questions[0],
  942.         a.selectedQuestion2 = a.questions[1],
  943.         a.save = function() {
  944.             e.safetyQuestionsForm.$valid && (a.saveInProgress = !0,
  945.             o.save(a.selectedQuestion1.questionId, a.answer1, a.selectedQuestion2.questionId, a.answer2, a.password).then(function() {
  946.                 a.onSave(),
  947.                 r.success("ACCOUNT_SECURITY_SAVED_OK")
  948.             })["catch"](function(t) {
  949.                 var o = t.data && t.data.error;
  950.                 "invalid_password" === o ? e.$broadcast("remote-data-invalid", "password") : 403 !== t.status && r.error("ERROR_SERVER")
  951.             })["finally"](function() {
  952.                 a.saveInProgress = !1
  953.             }))
  954.         }
  955.     }
  956.     ],
  957.     controllerAs: "SafetyQuestionsFormController",
  958.     templateUrl: "settings/account-security/safety-questions/safety-questions-form.html"
  959. }),
  960. angular.module("safety.question.filters", []).filter("question", function() {
  961.     return function(e, t) {
  962.         return _.without(e, t)
  963.     }
  964. }),
  965. angular.module("security.login.rpx", ["locale", "security.rpx"]).directive("habboRpxLogin", ["$timeout", "rpxSecurity", function(e, t) {
  966.     return {
  967.         restrict: "E",
  968.         scope: {},
  969.         template: '<a class="janrainEngage" translate="LOGIN_RPX"></a>',
  970.         link: function(o, r) {
  971.             var a = e(t.init);
  972.             r.on("$destroy", function() {
  973.                 e.cancel(a),
  974.                 t.destroy()
  975.             })
  976.         }
  977.     }
  978. }
  979. ]),
  980. angular.module("security.facebook.connect", ["locale", "notifier", "security.service", "templates"]).component("habboFacebookConnect", {
  981.     bindings: {
  982.         onLogin: "&",
  983.         translationKey: "@"
  984.     },
  985.     controller: ["notifier", "security", function(e, t) {
  986.         var o = this;
  987.         o.loginInProgress = !1,
  988.         o.fbLogin = function() {
  989.             o.loginInProgress = !0,
  990.             t.fbLogin().then(o.onLogin)["catch"](function(t) {
  991.                 var o = t.data && t.data.message;
  992.                 "fb.sdk_not_loaded" === o ? e.error("ERROR_FB_SDK") : "unknown" !== t.status && "force.pending" !== t.status && e.error("ERROR_SERVER")
  993.             })["finally"](function() {
  994.                 o.loginInProgress = !1
  995.             })
  996.         }
  997.     }
  998.     ],
  999.     controllerAs: "FacebookConnectController",
  1000.     templateUrl: "security/login/facebook-connect/facebook-connect.html"
  1001. }),
  1002. angular.module("recover.password.modal", ["claim.password.form", "locale", "templates", "ui.bootstrap"]).controller("RecoverPasswordController", ["email", function(e) {
  1003.     var t = this;
  1004.     t.email = e
  1005. }
  1006. ]).factory("recoverPasswordModal", ["$uibModal", function(e) {
  1007.     var t = {};
  1008.     return t.open = function(t) {
  1009.         return e.open({
  1010.             controller: "RecoverPasswordController",
  1011.             controllerAs: "RecoverPasswordController",
  1012.             resolve: {
  1013.                 email: _.constant(t)
  1014.             },
  1015.             size: "sm",
  1016.             templateUrl: "security/login/claim-password/recover-password-modal.html"
  1017.         }).result
  1018.     }
  1019.     ,
  1020.     t
  1021. }
  1022. ]),
  1023. angular.module("claim.password.form", ["form", "locale", "notifier", "password.reset.service", "templates"]).component("habboClaimPasswordForm", {
  1024.     bindings: {
  1025.         cancel: "&",
  1026.         emailAddress: "<?"
  1027.     },
  1028.     controller: ["$scope", "notifier", "passwordReset", function(e, t, o) {
  1029.         var r = this;
  1030.         r.sent = !1,
  1031.         r.sendingInProgress = !1,
  1032.         r.send = function() {
  1033.             e.claimPasswordForm.$valid && (r.sendingInProgress = !0,
  1034.             o.send(r.emailAddress).then(function(e) {
  1035.                 r.emailAddress = e.data.email,
  1036.                 r.sent = !0
  1037.             })["catch"](function() {
  1038.                 t.error("ERROR_SERVER")
  1039.             })["finally"](function() {
  1040.                 r.sendingInProgress = !1
  1041.             }))
  1042.         }
  1043.     }
  1044.     ],
  1045.     controllerAs: "ClaimPasswordFormController",
  1046.     templateUrl: "security/login/claim-password/claim-password-form.html",
  1047.     transclude: !0
  1048. }),
  1049. angular.module("claim.password", ["claim.password.form", "form", "locale", "templates", "ui.bootstrap"]).factory("claimPasswordModal", ["$uibModal", function(e) {
  1050.     var t = {};
  1051.     return t.open = function() {
  1052.         return e.open({
  1053.             size: "sm",
  1054.             templateUrl: "security/login/claim-password/claim-password-modal.html"
  1055.         }).result
  1056.     }
  1057.     ,
  1058.     t
  1059. }
  1060. ]).component("habboClaimPassword", {
  1061.     controller: ["claimPasswordModal", function(e) {
  1062.         var t = this;
  1063.         t.openModal = e.open
  1064.     }
  1065.     ],
  1066.     controllerAs: "ClaimPasswordController",
  1067.     template: '<small><a ng-click="ClaimPasswordController.openModal()" translate="LOGIN_FORGOT_LABEL"></a></small>'
  1068. }),
  1069. angular.module("captcha.modal", ["form", "templates", "ui.bootstrap"]).controller("CaptchaController", ["$scope", "$uibModalInstance", function(e, t) {
  1070.     e.$watch("captchaToken", function(e) {
  1071.         e && t.close(e)
  1072.     })
  1073. }
  1074. ]).factory("captchaModal", ["$uibModal", function(e) {
  1075.     var t = {};
  1076.     return t.open = function() {
  1077.         return e.open({
  1078.             controller: "CaptchaController",
  1079.             size: "sm",
  1080.             templateUrl: "security/login/captcha-modal/captcha-modal.html",
  1081.             windowClass: "captcha-modal"
  1082.         }).result
  1083.     }
  1084.     ,
  1085.     t
  1086. }
  1087. ]),
  1088. angular.module("security.force.tos.modal", ["locale", "security.force.service", "security.force.tos.form", "templates", "ui.bootstrap"]).factory("forceTOSModal", ["$uibModal", "FORCE", function(e, t) {
  1089.     var o = {};
  1090.     return o.open = function(o) {
  1091.         return e.open({
  1092.             size: "sm",
  1093.             templateUrl: "security/force/force-tos/force-tos-modal.html"
  1094.         }).result.then(function() {
  1095.             return o.force = _.without(o.force, t.TOS),
  1096.             o
  1097.         })
  1098.     }
  1099.     ,
  1100.     o
  1101. }
  1102. ]),
  1103. angular.module("security.force.tos.form", ["locale", "notifier", "security.force.service", "templates"]).component("habboForceTosForm", {
  1104.     bindings: {
  1105.         onDismiss: "&",
  1106.         onSuccess: "&"
  1107.     },
  1108.     controller: ["$scope", "force", "notifier", function(e, t, o) {
  1109.         var r = this;
  1110.         r.acceptInProgress = !1,
  1111.         r.accept = function() {
  1112.             r.acceptInProgress = !0,
  1113.             t.acceptTOS().then(function() {
  1114.                 r.onSuccess(),
  1115.                 o.success("FORCED_TOS_CHANGE_SUCCESS")
  1116.             })["catch"](function() {
  1117.                 o.error("ERROR_SERVER")
  1118.             })["finally"](function() {
  1119.                 r.acceptInProgress = !1
  1120.             })
  1121.         }
  1122.     }
  1123.     ],
  1124.     controllerAs: "ForceTosFormController",
  1125.     templateUrl: "security/force/force-tos/force-tos-form.html"
  1126. }),
  1127. angular.module("security.force.password.modal", ["locale", "security.force.password.form", "security.force.service", "templates", "ui.bootstrap"]).factory("forcePasswordModal", ["$uibModal", "FORCE", function(e, t) {
  1128.     var o = {};
  1129.     return o.open = function(o) {
  1130.         return e.open({
  1131.             size: "sm",
  1132.             templateUrl: "security/force/force-password/force-password-modal.html"
  1133.         }).result.then(function() {
  1134.             return o.force = _.without(o.force, t.password),
  1135.             o
  1136.         })
  1137.     }
  1138.     ,
  1139.     o
  1140. }
  1141. ]),
  1142. angular.module("security.force.password.form", ["form", "locale", "notifier", "security.force.service", "templates"]).component("habboForcePasswordForm", {
  1143.     bindings: {
  1144.         onDismiss: "&",
  1145.         onSuccess: "&"
  1146.     },
  1147.     controller: ["$scope", "force", "notifier", function(e, t, o) {
  1148.         var r = this;
  1149.         r.changeInProgress = !1,
  1150.         r.passwords = {},
  1151.         r.change = function() {
  1152.             e.forcePasswordChangeForm.$valid && (r.changeInProgress = !0,
  1153.             t.changePassword(r.passwords.password).then(function() {
  1154.                 r.onSuccess(),
  1155.                 o.success("PASSWORD_CHANGE_SUCCESS")
  1156.             })["catch"](function(t) {
  1157.                 var r = t.data && t.data.error;
  1158.                 "password.too_similar_to_username" === r ? e.$broadcast("remote-data-invalid", "passwordName") : "password.too_similar_to_email" === r ? e.$broadcast("remote-data-invalid", "passwordEmail") : o.error("ERROR_SERVER")
  1159.             })["finally"](function() {
  1160.                 r.changeInProgress = !1
  1161.             }))
  1162.         }
  1163.     }
  1164.     ],
  1165.     controllerAs: "ForcePasswordFormController",
  1166.     templateUrl: "security/force/force-password/force-password-form.html"
  1167. }),
  1168. angular.module("security.force.email.modal", ["locale", "security.force.email.form", "security.force.service", "templates", "ui.bootstrap"]).controller("ForceEmailController", ["emailAddress", function(e) {
  1169.     var t = this;
  1170.     t.oldEmailAddress = e
  1171. }
  1172. ]).factory("forceEmailModal", ["$uibModal", "FORCE", function(e, t) {
  1173.     var o = {};
  1174.     return o.open = function(o) {
  1175.         return e.open({
  1176.             controller: "ForceEmailController",
  1177.             controllerAs: "ForceEmailController",
  1178.             size: "sm",
  1179.             templateUrl: "security/force/force-email/force-email-modal.html",
  1180.             resolve: {
  1181.                 emailAddress: _.constant(o.email)
  1182.             }
  1183.         }).result.then(function(e) {
  1184.             return o.email = e,
  1185.             o.force = _.without(o.force, t.email),
  1186.             o
  1187.         })
  1188.     }
  1189.     ,
  1190.     o
  1191. }
  1192. ]),
  1193. angular.module("security.force.email.form", ["form", "locale", "notifier", "security.force.service", "templates"]).component("habboForceEmailForm", {
  1194.     bindings: {
  1195.         oldEmailAddress: "@",
  1196.         onDismiss: "&",
  1197.         onSuccess: "&"
  1198.     },
  1199.     controller: ["$scope", "force", "notifier", function(e, t, o) {
  1200.         var r = this;
  1201.         r.saveInProgress = !1,
  1202.         r.save = function() {
  1203.             e.forceEmailChangeForm.$valid && (r.saveInProgress = !0,
  1204.             t.changeEmail(r.emailAddress).then(function(e) {
  1205.                 r.onSuccess({
  1206.                     email: e.email
  1207.                 }),
  1208.                 o.success("EMAIL_FORCE_CHANGE_SUCCESS")
  1209.             })["catch"](function(t) {
  1210.                 var r = t.data && t.data.error;
  1211.                 "forcedEmailChange.email_already_in_use" === r ? e.$broadcast("remote-data-invalid", "emailUsedInChange") : o.error("ERROR_SERVER")
  1212.             })["finally"](function() {
  1213.                 r.saveInProgress = !1
  1214.             }))
  1215.         }
  1216.     }
  1217.     ],
  1218.     controllerAs: "ForceEmailFormController",
  1219.     templateUrl: "security/force/force-email/force-email-form.html"
  1220. }),
  1221. angular.module("room.icon", ["remove.on.error", "show.on.load", "templates"]).component("habboRoomIcon", {
  1222.     bindings: {
  1223.         url: "@"
  1224.     },
  1225.     controllerAs: "RoomIconController",
  1226.     templateUrl: "profile/item-lists/room-icon/room-icon.html"
  1227. }),
  1228. angular.module("report.service", ["config"]).factory("reporter", ["$http", "CONFIG", function(e, t) {
  1229.     function o(e) {
  1230.         return t.extraDataUrl + "/private/creation/" + e.id + "/report"
  1231.     }
  1232.     var r = {};
  1233.     return r.sendReport = function(t) {
  1234.         return e.post(o(t), {
  1235.             reason: t.reportReason
  1236.         })
  1237.     }
  1238.     ,
  1239.     r
  1240. }
  1241. ]),
  1242. angular.module("report.modal", ["report.form", "templates", "ui.bootstrap"]).controller("ReportController", ["creation", function(e) {
  1243.     var t = this;
  1244.     t.creation = e
  1245. }
  1246. ]).factory("reportModal", ["$uibModal", function(e) {
  1247.     var t, o = {};
  1248.     return o.open = function(o) {
  1249.         return t = e.open({
  1250.             size: "lg",
  1251.             controller: "ReportController",
  1252.             controllerAs: "ReportController",
  1253.             templateUrl: "profile/creation/report/report-modal.html",
  1254.             resolve: {
  1255.                 creation: _.constant(o)
  1256.             }
  1257.         }),
  1258.         t.result
  1259.     }
  1260.     ,
  1261.     o
  1262. }
  1263. ]),
  1264. angular.module("report.form", ["ngMessages", "locale", "notifier", "report.service", "reported.photos", "templates"]).component("habboReportForm", {
  1265.     bindings: {
  1266.         creation: "<",
  1267.         onSuccess: "&",
  1268.         onCancel: "&"
  1269.     },
  1270.     controller: ["$location", "$scope", "notifier", "reportedPhotos", "reporter", function(e, t, o, r, a) {
  1271.         var n = this;
  1272.         n.sendInProgress = !1,
  1273.         n.reasonCodes = [19, 20, 1, 32, 8],
  1274.         n.send = function() {
  1275.             t.reportForm.$valid && (n.sendInProgress = !0,
  1276.             a.sendReport(n.creation).then(function() {
  1277.                 n.onSuccess(),
  1278.                 r.save(n.creation.id),
  1279.                 e.path("/community/photos").replace(),
  1280.                 o.success("REPORT_SUCCESS")
  1281.             })["catch"](function(e) {
  1282.                 429 === e.status ? o.error("ERROR_TOO_MANY_REPORTS") : 401 !== e.status && o.error("ERROR_SERVER")
  1283.             })["finally"](function() {
  1284.                 n.sendInProgress = !1
  1285.             }))
  1286.         }
  1287.     }
  1288.     ],
  1289.     controllerAs: "ReportFormController",
  1290.     templateUrl: "profile/creation/report/report-form.html"
  1291. }),
  1292. angular.module("report", ["locale", "report.modal", "templates"]).component("habboReport", {
  1293.     bindings: {
  1294.         creation: "<"
  1295.     },
  1296.     controller: ["reportModal", function(e) {
  1297.         var t = this;
  1298.         t.click = function() {
  1299.             e.open(t.creation)
  1300.         }
  1301.     }
  1302.     ],
  1303.     controllerAs: "ReportController",
  1304.     templateUrl: "profile/creation/report/report.html"
  1305. }),
  1306. angular.module("photo.delete.service", ["ngResource", "config", "storage"]).factory("photoDelete", ["$http", "CONFIG", "httpCache", function(e, t, o) {
  1307.     var r = {};
  1308.     return r["delete"] = function(r) {
  1309.         return e["delete"](t.extraDataUrl + "/private/photo/" + r).then(function() {
  1310.             o.shortCache.removeAll()
  1311.         })
  1312.     }
  1313.     ,
  1314.     r
  1315. }
  1316. ]),
  1317. angular.module("photo.delete", ["locale", "photo.delete.service", "security", "templates"]).component("habboPhotoDelete", {
  1318.     bindings: {
  1319.         creation: "<"
  1320.     },
  1321.     controller: ["$location", "$translate", "$window", "Session", "notifier", "photoDelete", function(e, t, o, r, a, n) {
  1322.         function i() {
  1323.             n["delete"](s.creation.id).then(function() {
  1324.                 e.path("/profile/" + r.user.name).replace(),
  1325.                 a.success("PHOTO_DELETION_SUCCESS")
  1326.             })["catch"](function(e) {
  1327.                 401 !== e.status && a.error("ERROR_SERVER")
  1328.             })
  1329.         }
  1330.         var s = this;
  1331.         s["delete"] = function() {
  1332.             t("PHOTO_DELETION_CONFIRMATION").then(function(e) {
  1333.                 o.confirm(e) && i()
  1334.             })
  1335.         }
  1336.     }
  1337.     ],
  1338.     controllerAs: "PhotoDeleteController",
  1339.     templateUrl: "profile/creation/photo-delete/photo-delete.html"
  1340. }),
  1341. angular.module("interstitial.service", ["client.messenger", "google.analytics"]).factory("interstitial", ["$rootScope", "$timeout", "$window", "clientMessenger", "googleAnalytics", function(e, t, o, r, a) {
  1342.     var n = {}
  1343.       , i = 15e3;
  1344.     return n.started = !1,
  1345.     n.loaded = !1,
  1346.     n.start = function(s) {
  1347.         function l(e) {
  1348.             var o = e.originalEvent.data && e.originalEvent.data.category;
  1349.             if ("interstitial" === o) {
  1350.                 var r = e.originalEvent.data && e.originalEvent.data.name;
  1351.                 f[r] && t(function() {
  1352.                     f[r](e.originalEvent.data)
  1353.                 })
  1354.             }
  1355.         }
  1356.         function c() {
  1357.             n.loaded = !0,
  1358.             b = e.$on("$locationChangeStart", function(e) {
  1359.                 e.preventDefault()
  1360.             })
  1361.         }
  1362.         function u() {
  1363.             a.trackEvent("Interstitial", "Start"),
  1364.             t.cancel(g)
  1365.         }
  1366.         function d(e) {
  1367.             var t = _.upperFirst(e.name)
  1368.               , o = e.remaining || 0
  1369.               , r = e.duration ? 1e3 * (e.duration - o) : null ;
  1370.             a.trackEvent("Interstitial", "End", t, r),
  1371.             h("complete")
  1372.         }
  1373.         function m() {
  1374.             a.trackEvent("Interstitial", "Error", "Player"),
  1375.             h("incomplete")
  1376.         }
  1377.         function p() {
  1378.             a.trackEvent("Interstitial", "Error", "Timeout"),
  1379.             h("incomplete")
  1380.         }
  1381.         function h(e) {
  1382.             n.started = !1,
  1383.             n.loaded = !1,
  1384.             t.cancel(g),
  1385.             angular.element(o).off("message", l),
  1386.             b && b(),
  1387.             "midroll" === s && r.handle({
  1388.                 interstitial: e
  1389.             })
  1390.         }
  1391.         var b, f = {
  1392.             load: c,
  1393.             start: u,
  1394.             complete: d,
  1395.             skip: d,
  1396.             error: m
  1397.         }, g = t(p, i);
  1398.         angular.element(o).on("message", l),
  1399.         n.started = !0,
  1400.         a.trackEvent("Interstitial", "Init")
  1401.     }
  1402.     ,
  1403.     n.hasStarted = function() {
  1404.         return n.started
  1405.     }
  1406.     ,
  1407.     n.hasLoaded = function() {
  1408.         return n.loaded
  1409.     }
  1410.     ,
  1411.     n
  1412. }
  1413. ]),
  1414. angular.module("interstitial", ["config", "interstitial.service", "locale", "templates"]).component("habboInterstitial", {
  1415.     controller: ["$scope", "CONFIG", "interstitial", function(e, t, o) {
  1416.         var r = this;
  1417.         r.habboWebAdsUrl = t.habboWebAdsUrl,
  1418.         r.lang = t.lang,
  1419.         e.$watch(o.hasStarted, function(e) {
  1420.             r.started = e
  1421.         }),
  1422.         e.$watch(o.hasLoaded, function(e) {
  1423.             r.loaded = e
  1424.         })
  1425.     }
  1426.     ],
  1427.     controllerAs: "InterstitialController",
  1428.     templateUrl: "hotel/client/interstitial/interstitial.html"
  1429. }),
  1430. angular.module("client.reload", ["locale", "templates"]).component("habboClientReload", {
  1431.     bindings: {
  1432.         reload: "&"
  1433.     },
  1434.     controllerAs: "ClientReloadController",
  1435.     templateUrl: "hotel/client/client-reload/client-reload.html"
  1436. }),
  1437. angular.module("client.error", ["config", "locale", "templates"]).component("habboClientError", {
  1438.     controller: ["CONFIG", function(e) {
  1439.         var t = this;
  1440.         t.appStoreUrl = e.appStoreUrl,
  1441.         t.googlePlayUrl = e.googlePlayUrl
  1442.     }
  1443.     ],
  1444.     controllerAs: "ClientErrorController",
  1445.     templateUrl: "hotel/client/client-error/client-error.html"
  1446. }),
  1447. angular.module("client.closed", ["hotel.closed", "templates"]).component("habboClientClosed", {
  1448.     templateUrl: "hotel/client/client-closed/client-closed.html"
  1449. }),
  1450. angular.module("client.close.expander", ["client.close.expand", "events"]).directive("habboClientCloseExpander", ["$timeout", "EVENTS", function(e, t) {
  1451.     return {
  1452.         restrict: "A",
  1453.         link: function(o, r) {
  1454.             function a() {
  1455.                 c(),
  1456.                 s = e(n, l)
  1457.             }
  1458.             function n() {
  1459.                 e(function() {
  1460.                     o.$broadcast("expander-shrink")
  1461.                 })
  1462.             }
  1463.             function i() {
  1464.                 e.cancel(s),
  1465.                 e(function() {
  1466.                     o.$broadcast("expander-expand")
  1467.                 })
  1468.             }
  1469.             var s, l = 3e4, c = o.$on(t.clientOpen, a);
  1470.             r.mouseenter(i),
  1471.             r.mouseleave(n)
  1472.         }
  1473.     }
  1474. }
  1475. ]),
  1476. angular.module("client.close.expand", ["ngAnimate"]).directive("habboClientCloseExpand", ["$animate", function(e) {
  1477.     return {
  1478.         restrict: "A",
  1479.         link: function(t, o) {
  1480.             function r() {
  1481.                 n(),
  1482.                 i(c, 0)
  1483.             }
  1484.             function a() {
  1485.                 n(),
  1486.                 i(l, c)
  1487.             }
  1488.             function n() {
  1489.                 c || (c = o.width())
  1490.             }
  1491.             function i(t, r) {
  1492.                 s && e.cancel(s),
  1493.                 l = r,
  1494.                 s = e.animate(o, {
  1495.                     width: t
  1496.                 }, {
  1497.                     width: r
  1498.                 })
  1499.             }
  1500.             var s, l, c;
  1501.             t.$on("expander-expand", a),
  1502.             t.$on("expander-shrink", r)
  1503.         }
  1504.     }
  1505. }
  1506. ]),
  1507. angular.module("local.register.banner", ["config", "language", "locale", "templates"]).component("habboLocalRegisterBanner", {
  1508.     controller: ["CONFIG", "language", function(e, t) {
  1509.         var o = this
  1510.           , r = t.toSite();
  1511.         r && r.hotel !== e.hotel && (o.site = r)
  1512.     }
  1513.     ],
  1514.     controllerAs: "LocalRegisterBannerController",
  1515.     templateUrl: "home/register-banner/local-register-banner/local-register-banner.html"
  1516. }),
  1517. angular.module("language", []).factory("language", ["$window", function(e) {
  1518.     var t = {};
  1519.     return t.toSite = function() {
  1520.         var t = e.navigator.language ? e.navigator.language.substr(0, 2) : null ;
  1521.         switch (t) {
  1522.         case "de":
  1523.             return {
  1524.                 hotel: "hhde",
  1525.                 href: "https://www.habbo.de",
  1526.                 localization: "DE",
  1527.                 title: "Habbo.de"
  1528.             };
  1529.         case "en":
  1530.             return {
  1531.                 hotel: "hhus",
  1532.                 href: "https://www.habbo.com",
  1533.                 localization: "EN",
  1534.                 title: "Habbo.com"
  1535.             };
  1536.         case "es":
  1537.             return {
  1538.                 hotel: "hhes",
  1539.                 href: "https://www.habbo.es",
  1540.                 localization: "ES",
  1541.                 title: "Habbo.es"
  1542.             };
  1543.         case "fr":
  1544.             return {
  1545.                 hotel: "hhfr",
  1546.                 href: "https://www.habbo.fr",
  1547.                 localization: "FR",
  1548.                 title: "Habbo.fr"
  1549.             };
  1550.         case "fi":
  1551.             return {
  1552.                 hotel: "hhfi",
  1553.                 href: "https://www.habbo.fi",
  1554.                 localization: "FI",
  1555.                 title: "Habbo.fi"
  1556.             };
  1557.         case "it":
  1558.             return {
  1559.                 hotel: "hhit",
  1560.                 href: "https://www.habbo.it",
  1561.                 localization: "IT",
  1562.                 title: "Habbo.it"
  1563.             };
  1564.         case "nl":
  1565.             return {
  1566.                 hotel: "hhnl",
  1567.                 href: "https://www.habbo.nl",
  1568.                 localization: "NL",
  1569.                 title: "Habbo.nl"
  1570.             };
  1571.         case "pt":
  1572.             return {
  1573.                 hotel: "hhbr",
  1574.                 href: "https://www.habbo.com.br",
  1575.                 localization: "PT",
  1576.                 title: "Habbo.com.br"
  1577.             };
  1578.         case "tr":
  1579.             return {
  1580.                 hotel: "hhtr",
  1581.                 href: "https://www.habbo.com.tr",
  1582.                 localization: "TR",
  1583.                 title: "Habbo.com.tr"
  1584.             };
  1585.         default:
  1586.             return null
  1587.         }
  1588.     }
  1589.     ,
  1590.     t
  1591. }
  1592. ]),
  1593. angular.module("moderation.notification", ["google.analytics", "locale", "message.container", "moderation.service", "templates"]).component("habboModerationNotification", {
  1594.     controller: ["PhotoModerations", "googleAnalytics", function(e, t) {
  1595.         var o = this;
  1596.         o.moderations = e.recentModerations(),
  1597.         o.moderations.$promise.then(function(e) {
  1598.             e.length > 0 && t.trackEvent("Moderation", "Notification viewed")
  1599.         })
  1600.     }
  1601.     ],
  1602.     controllerAs: "ModerationNotificationController",
  1603.     templateUrl: "home/news/moderation-notification/moderation-notification.html"
  1604. }),
  1605. angular.module("moderation.service", ["ngResource", "config", "storage"]).factory("PhotoModerations", ["$resource", "CONFIG", "httpCache", function(e, t, o) {
  1606.     return e(t.extraDataUrl + "/private/moderations/recentModerations", null , {
  1607.         recentModerations: {
  1608.             method: "GET",
  1609.             isArray: !0,
  1610.             cache: o.shortCache
  1611.         }
  1612.     })
  1613. }
  1614. ]),
  1615. angular.module("discussions", ["avatar", "empty.results", "flash", "locale", "templates"]).component("habboDiscussions", {
  1616.     bindings: {
  1617.         items: "<"
  1618.     },
  1619.     controller: function() {
  1620.         var e = this;
  1621.         e.getParticipant = function(e) {
  1622.             return _.values(e)[0]
  1623.         }
  1624.     },
  1625.     controllerAs: "DiscussionsController",
  1626.     templateUrl: "home/messaging/discussions/discussions.html"
  1627. }),
  1628. angular.module("local.storage", []).factory("localStorage", ["$window", function(e) {
  1629.     var t = {};
  1630.     return t.get = function(t) {
  1631.         try {
  1632.             var o = e.localStorage.getItem(t);
  1633.             return o ? angular.fromJson(o) : null
  1634.         } catch (r) {
  1635.             return Bugsnag.notifyException(r, "LocalStorage not supported", {
  1636.                 groupingHash: "LocalStorage"
  1637.             }, "info"),
  1638.             null
  1639.         }
  1640.     }
  1641.     ,
  1642.     t.set = function(t, o) {
  1643.         try {
  1644.             e.localStorage.setItem(t, angular.toJson(o))
  1645.         } catch (r) {
  1646.             Bugsnag.notifyException(r, "LocalStorage not supported", {
  1647.                 groupingHash: "LocalStorage"
  1648.             }, "info")
  1649.         }
  1650.     }
  1651.     ,
  1652.     t
  1653. }
  1654. ]),
  1655. angular.module("cache", ["angular-cache", "config"]).config(["CacheFactoryProvider", function(e) {
  1656.     angular.extend(e.defaults, {
  1657.         maxAge: 3e5,
  1658.         deleteOnExpire: "aggressive"
  1659.     })
  1660. }
  1661. ]).factory("httpCache", ["CacheFactory", function(e) {
  1662.     return {
  1663.         shortCache: e.createCache("shortHttpCache"),
  1664.         longCache: e.createCache("longHttpCache", {
  1665.             maxAge: 36e5
  1666.         })
  1667.     }
  1668. }
  1669. ]),
  1670. angular.module("user.menu", ["encode.uri.component", "false.on.outside.click", "imager", "locale", "router", "security", "templates", "zendesk.url"]).component("habboUserMenu", {
  1671.     controller: ["$state", "Session", "notifier", "security", function(e, t, o, r) {
  1672.         var a = this;
  1673.         a.user = t.user,
  1674.         a.isMyProfileActive = function() {
  1675.             return e.is("profile", {
  1676.                 name: t.user.name
  1677.             })
  1678.         }
  1679.         ,
  1680.         a.isSettingsActive = function() {
  1681.             return e.includes("settings")
  1682.         }
  1683.         ,
  1684.         a.logout = function() {
  1685.             r.logout()["catch"](function() {
  1686.                 o.errorSticky("ERROR_LOGOUT_TITLE", "ERROR_LOGOUT_TEXT")
  1687.             })
  1688.         }
  1689.     }
  1690.     ],
  1691.     controllerAs: "UserMenuController",
  1692.     templateUrl: "common/header/user-menu/user-menu.html"
  1693. }),
  1694. angular.module("navigation", ["encode.uri.component", "flash", "hotel.button", "locale", "security", "templates"]).component("habboNavigation", {
  1695.     bindings: {
  1696.         active: "@"
  1697.     },
  1698.     controllerAs: "NavigationController",
  1699.     templateUrl: "common/header/navigation/navigation.html"
  1700. }),
  1701. angular.module("hotel.button", ["locale", "templates"]).component("habboHotelButton", {
  1702.     templateUrl: "common/header/hotel-button/hotel-button.html"
  1703. }),
  1704. angular.module("header.ad", ["ad.unit", "templates"]).component("habboHeaderAd", {
  1705.     controller: ["$scope", "$location", function(e, t) {
  1706.         function o() {
  1707.             n.hasAd = r()
  1708.         }
  1709.         function r() {
  1710.             return !_(a).some(function(e) {
  1711.                 return _(t.path()).includes(e)
  1712.             })
  1713.         }
  1714.         var a = ["/playing-habbo/help", "/registration", "/reset-password", "/settings", "/shop"]
  1715.           , n = this;
  1716.         o(),
  1717.         e.$on("$stateChangeSuccess", o)
  1718.     }
  1719.     ],
  1720.     controllerAs: "HeaderAdController",
  1721.     templateUrl: "common/header/header-ad/header-ad.html"
  1722. }),
  1723. angular.module("validators", ["email", "matches", "password.email", "password.name", "password.pattern", "password.strength", "remote.data"]),
  1724. angular.module("search", ["locale", "templates"]).component("habboSearch", {
  1725.     bindings: {
  1726.         query: "="
  1727.     },
  1728.     controllerAs: "SearchController",
  1729.     templateUrl: "common/form/search/search.html"
  1730. }),
  1731. angular.module("password.new", ["ngMessages", "locale", "password.strength", "password.toggle.mask", "templates", "validators"]).component("habboPasswordNew", {
  1732.     require: {
  1733.         FormController: "^form"
  1734.     },
  1735.     bindings: {
  1736.         isNew: "@",
  1737.         passwordNew: "=",
  1738.         passwordNewRepeated: "=",
  1739.         userName: "@",
  1740.         userEmail: "@"
  1741.     },
  1742.     controllerAs: "PasswordNewController",
  1743.     templateUrl: "common/form/password-new/password-new.html"
  1744. }),
  1745. angular.module("password.toggle.mask", []).directive("habboPasswordToggleMask", function() {
  1746.     return {
  1747.         restrict: "A",
  1748.         link: function(e, t, o) {
  1749.             function r(e) {
  1750.                 angular.element(e.currentTarget).toggleClass("active"),
  1751.                 o.$set("type", "password" === o.type ? "text" : "password"),
  1752.                 t.focus()
  1753.             }
  1754.             t.after(angular.element("<i/>", {
  1755.                 "class": "password-toggle-mask__icon",
  1756.                 click: r,
  1757.                 mousedown: function(e) {
  1758.                     e.preventDefault()
  1759.                 }
  1760.             }))
  1761.         }
  1762.     }
  1763. }),
  1764. angular.module("password.current", ["ngMessages", "locale", "templates", "validators"]).component("habboPasswordCurrent", {
  1765.     require: {
  1766.         FormController: "^form"
  1767.     },
  1768.     bindings: {
  1769.         passwordCurrent: "="
  1770.     },
  1771.     controllerAs: "PasswordCurrentController",
  1772.     templateUrl: "common/form/password-current/password-current.html"
  1773. }),
  1774. angular.module("email.address", ["ngMessages", "locale", "templates", "validators"]).component("habboEmailAddress", {
  1775.     require: {
  1776.         FormController: "^form"
  1777.     },
  1778.     bindings: {
  1779.         emailAddress: "="
  1780.     },
  1781.     controllerAs: "EmailAddressController",
  1782.     templateUrl: "common/form/email-address/email-address.html",
  1783.     transclude: !0
  1784. }),
  1785. angular.module("captcha", ["config", "locale", "noCAPTCHA", "templates"]).constant("CAPTCHA_EVENTS", {
  1786.     reset: "captcha-reset"
  1787. }).component("habboCaptcha", {
  1788.     require: {
  1789.         FormController: "^form"
  1790.     },
  1791.     bindings: {
  1792.         captchaToken: "="
  1793.     },
  1794.     controller: ["$scope", "CAPTCHA_EVENTS", function(e, t) {
  1795.         var o = this;
  1796.         o.noCaptchaController = {},
  1797.         o.onExpire = function() {
  1798.             o.captchaToken = null
  1799.         }
  1800.         ,
  1801.         e.$on(t.reset, function() {
  1802.             o.noCaptchaController.reset(),
  1803.             o.FormController.captchaToken.$setViewValue(null )
  1804.         })
  1805.     }
  1806.     ],
  1807.     controllerAs: "CaptchaController",
  1808.     templateUrl: "common/form/captcha/captcha.html"
  1809. }),
  1810. angular.module("columns.profile", ["card", "infinite-scroll", "templates"]).component("habboColumnsProfile", {
  1811.     bindings: {
  1812.         items: "<"
  1813.     },
  1814.     controllerAs: "ColumnsProfileController",
  1815.     templateUrl: "common/columns/columns-profile/columns-profile.html"
  1816. }),
  1817. angular.module("columns.channel", ["avatar", "card", "infinite-scroll", "templates"]).component("habboColumnsChannel", {
  1818.     bindings: {
  1819.         items: "<"
  1820.     },
  1821.     controllerAs: "ColumnsChannelController",
  1822.     templateUrl: "common/columns/columns-channel/columns-channel.html"
  1823. }),
  1824. angular.module("card", ["creation.href", "like", "locale", "templates"]).component("habboCard", {
  1825.     bindings: {
  1826.         item: "<"
  1827.     },
  1828.     controllerAs: "CardController",
  1829.     templateUrl: "common/columns/card/card.html",
  1830.     transclude: !0
  1831. }),
  1832. angular.module("ad.double.click", ["config", "locale", "ngDfp", "templates"]).constant("DOUBLE_CLICK_UNITS", {
  1833.     inlineRectangle: {
  1834.         id: "div-gpt-ad-1",
  1835.         size: [300, 250]
  1836.     },
  1837.     leaderboard: {
  1838.         id: "div-gpt-ad-2",
  1839.         size: [728, 90]
  1840.     },
  1841.     mobileLeaderboard: {
  1842.         size: [320, 50]
  1843.     }
  1844. }).config(["DOUBLE_CLICK_UNITS", "DoubleClickProvider", function(e, t) {
  1845.     var o = "/108596585/Habbo_WEB_IAB";
  1846.     t.defineSlot(o, [e.inlineRectangle.size], e.inlineRectangle.id).defineSlot(o, [e.leaderboard.size, e.mobileLeaderboard.size], e.leaderboard.id),
  1847.     t.defineSizeMapping(e.leaderboard.id).addSize([768, 0], e.leaderboard.size).addSize([0, 0], e.mobileLeaderboard.size)
  1848. }
  1849. ]).component("habboAdDoubleClick", {
  1850.     bindings: {
  1851.         unit: "@"
  1852.     },
  1853.     controller: ["$scope", "$timeout", "$window", "DOUBLE_CLICK_UNITS", "DoubleClick", function(e, t, o, r, a) {
  1854.         function n() {
  1855.             var e = o.innerWidth;
  1856.             e !== c && (a.refreshAds(l.id),
  1857.             c = e)
  1858.         }
  1859.         function i() {
  1860.             s = t(function() {
  1861.                 a.refreshAds(l.id)
  1862.             })
  1863.         }
  1864.         var s, l = this, c = o.innerWidth;
  1865.         l.id = r[l.unit].id,
  1866.         angular.element(o).on("orientationchange resize", n),
  1867.         e.$on("$stateChangeSuccess", i),
  1868.         e.$on("$destroy", function() {
  1869.             t.cancel(s),
  1870.             angular.element(o).off("orientationchange resize", n)
  1871.         })
  1872.     }
  1873.     ],
  1874.     controllerAs: "AdDoubleClickController",
  1875.     templateUrl: "common/ad-unit/ad-double-click/ad-double-click.html"
  1876. }),
  1877. angular.module("voucher.redeem.service", ["config", "google.analytics"]).factory("voucherRedeem", ["$http", "CONFIG", "googleAnalytics", function(e, t, o) {
  1878.     return function(r) {
  1879.         return e.post(t.shopUrl + "/voucher/redeem", {
  1880.             voucherCode: r
  1881.         }).then(function(e) {
  1882.             return o.trackEvent("Voucher", "Redeemed"),
  1883.             e
  1884.         })
  1885.     }
  1886. }
  1887. ]),
  1888. angular.module("voucher.redeem", ["events", "form", "locale", "notifier", "purse.service", "templates", "voucher.icon", "voucher.redeem.service"]).component("habboVoucherRedeem", {
  1889.     controller: ["$compile", "$scope", "$timeout", "$translate", "EVENTS", "notifier", "purse", "voucherRedeem", function(e, t, o, r, a, n, i, s) {
  1890.         function l() {
  1891.             t.voucherRedeemForm.$setPristine(),
  1892.             d.voucherCode = ""
  1893.         }
  1894.         function c(e) {
  1895.             return r("VOUCHER_REDEEM_NOTIFICATION_AWARDED").then(function(r) {
  1896.                 var a = t.$new();
  1897.                 a.credits = e.data.credits,
  1898.                 a.product = e.data.product,
  1899.                 a.credits && o(function() {
  1900.                     var e = u(a, '<habbo-voucher-icon credits="credits"></habbo-voucher-icon>');
  1901.                     n.success(r + " " + e)
  1902.                 }),
  1903.                 a.product && o(function() {
  1904.                     var e = u(a, '<habbo-voucher-icon product="product"></habbo-voucher-icon>');
  1905.                     n.success(r + " " + e)
  1906.                 })
  1907.             })
  1908.         }
  1909.         function u(t, o) {
  1910.             var r = e(angular.element("<div>" + o + "</div>"))(t);
  1911.             return t.$digest(),
  1912.             r.html()
  1913.         }
  1914.         var d = this;
  1915.         d.redeemInProgress = !1,
  1916.         d.redeem = function() {
  1917.             t.voucherRedeemForm.$valid && (d.redeemInProgress = !0,
  1918.             s(d.voucherCode).then(function(e) {
  1919.                 return l(),
  1920.                 i.update(),
  1921.                 c(e)
  1922.             })["catch"](function(e) {
  1923.                 var o = e.data && e.data.error;
  1924.                 "purse.redeem.code.dont_exist" === o ? t.$broadcast("remote-data-invalid", "nonexistent") : "purse.redeem.code.already_redeemed" === o ? t.$broadcast("remote-data-invalid", "redeemed") : t.$broadcast("remote-data-invalid", "failed")
  1925.             })["finally"](function() {
  1926.                 d.redeemInProgress = !1
  1927.             }))
  1928.         }
  1929.         ,
  1930.         t.$on(a.accordionClose, l),
  1931.         t.$watchGroup(["voucherRedeemForm.$invalid", "voucherRedeemForm.$pristine", "voucherRedeemForm.$submitted"], function() {
  1932.             t.$emit(a.accordionUpdate)
  1933.         })
  1934.     }
  1935.     ],
  1936.     controllerAs: "VoucherRedeemController",
  1937.     templateUrl: "shop/voucher-redeem/voucher-redeem.html"
  1938. }),
  1939. angular.module("transactions", ["locale", "router", "shop.purse", "shop.service", "shop.transactions.list", "templates", "voucher.redeem", "web.pages"]).config(["$stateProvider", function(e) {
  1940.     e.statePrivate("shop.transactions", {
  1941.         url: "/history",
  1942.         data: {
  1943.             title: "HEAD_TITLE_SHOP_HISTORY"
  1944.         },
  1945.         controller: "TransactionsController",
  1946.         controllerAs: "TransactionsController",
  1947.         resolve: {
  1948.             transactions: ["Shop", function(e) {
  1949.                 return e.history().$promise
  1950.             }
  1951.             ]
  1952.         },
  1953.         parent: "shop",
  1954.         templateUrl: "shop/transactions/transactions.html"
  1955.     })
  1956. }
  1957. ]).controller("TransactionsController", ["transactions", function(e) {
  1958.     var t = this;
  1959.     t.items = e
  1960. }
  1961. ]),
  1962. angular.module("shop.transactions.list", ["empty.results", "locale", "shop.transactions.history", "templates"]).component("habboTransactionsList", {
  1963.     bindings: {
  1964.         transactions: "<"
  1965.     },
  1966.     controller: function() {
  1967.         var e = this;
  1968.         e.transactionLimit = 10,
  1969.         e.showAll = function() {
  1970.             e.transactionLimit = 1 / 0,
  1971.             e.hideShowAll = !0
  1972.         }
  1973.     },
  1974.     controllerAs: "TransactionsListController",
  1975.     templateUrl: "shop/transactions/transactions-list.html"
  1976. }),
  1977. angular.module("subscriptions", ["events", "locale", "router", "shop.countries", "shop.purse", "subscription", "subscriptions.service", "templates", "voucher.redeem", "web.pages"]).config(["$stateProvider", function(e) {
  1978.     e.statePrivate("shop.subscriptions", {
  1979.         url: "/subscriptions",
  1980.         controller: "SubscriptionsController",
  1981.         controllerAs: "SubscriptionsController",
  1982.         parent: "shop",
  1983.         data: {
  1984.             title: "HEAD_TITLE_SHOP_SUBSCRIPTIONS"
  1985.         },
  1986.         resolve: {
  1987.             subscriptions: ["countryCode", "Subscriptions", function(e, t) {
  1988.                 return t.inventory({
  1989.                     countryCode: e
  1990.                 }).$promise
  1991.             }
  1992.             ]
  1993.         },
  1994.         templateUrl: "shop/subscriptions/subscriptions.html"
  1995.     })
  1996. }
  1997. ]).controller("SubscriptionsController", ["$scope", "EVENTS", "SUBSCRIPTION_EVENTS", "Subscriptions", "countryCode", "subscriptions", function(e, t, o, r, a, n) {
  1998.     function i() {
  1999.         r.inventory({
  2000.             countryCode: s.countryCode
  2001.         }).$promise.then(function(e) {
  2002.             s.subscriptions = e
  2003.         })
  2004.     }
  2005.     var s = this;
  2006.     s.countryCode = a,
  2007.     s.subscriptions = n,
  2008.     e.$on(t.shopPaymentClose, i),
  2009.     e.$on(o.cancel, i)
  2010. }
  2011. ]),
  2012. angular.module("subscriptions.service", ["ngResource", "config", "safe.transform.response", "storage"]).factory("Subscriptions", ["$resource", "CONFIG", "safeTransformResponse", function(e, t, o) {
  2013.     function r(e) {
  2014.         return function(t) {
  2015.             return t.countryCode = e,
  2016.             t
  2017.         }
  2018.     }
  2019.     return e(t.shopUrl + "/subscription/:resource/:countryCode/:subscriptionType", {}, {
  2020.         inventory: {
  2021.             params: {
  2022.                 resource: "inventory"
  2023.             },
  2024.             transformResponse: o.fromJson(function(e) {
  2025.                 var t = e.selectedCountry;
  2026.                 return {
  2027.                     countries: e.countries,
  2028.                     items: _.map(e.items, r(t.countryCode)),
  2029.                     selectedCountry: e.selectedCountry
  2030.                 }
  2031.             })
  2032.         },
  2033.         cancel: {
  2034.             params: {
  2035.                 resource: "cancel"
  2036.             },
  2037.             method: "POST"
  2038.         }
  2039.     })
  2040. }
  2041. ]),
  2042. angular.module("store", ["category.filter", "events", "locale", "router", "shop.countries", "shop.inventory", "shop.purse", "shop.service", "shop.targeted.offer", "templates", "voucher.redeem", "web.pages"]).config(["$stateProvider", function(e) {
  2043.     e.statePublic("shop.store", {
  2044.         url: "?category",
  2045.         controller: "StoreController",
  2046.         controllerAs: "StoreController",
  2047.         data: {
  2048.             title: "HEAD_TITLE_SHOP"
  2049.         },
  2050.         resolve: {
  2051.             countries: ["Shop", function(e) {
  2052.                 return e.countries().$promise
  2053.             }
  2054.             ],
  2055.             inventory: ["countryCode", "Shop", function(e, t) {
  2056.                 return t.inventory({
  2057.                     countryCode: e
  2058.                 }).$promise
  2059.             }
  2060.             ]
  2061.         },
  2062.         parent: "shop",
  2063.         templateUrl: "shop/store/store.html"
  2064.     })
  2065. }
  2066. ]).controller("StoreController", ["$interval", "$location", "$scope", "$state", "$stateParams", "EVENTS", "countries", "inventory", "scrolltop", function(e, t, o, r, a, n, i, s, l) {
  2067.     var c, u = this;
  2068.     u.countries = i,
  2069.     u.offer = s.offer,
  2070.     u.inventory = s,
  2071.     u.selectedCategory = a.category,
  2072.     u.offer && (c = e(function() {
  2073.         moment(u.offer.expirationDate).isBefore() && (u.offer = null ,
  2074.         e.cancel(c))
  2075.     }, 1e3)),
  2076.     o.$on("$stateChangeStart", function(e, t) {
  2077.         l.setEnabled("shop.store" !== t.name)
  2078.     }),
  2079.     o.$on(n.securityLogin, function() {
  2080.         "/shop" === t.path() && r.reload()
  2081.     })
  2082. }
  2083. ]),
  2084. angular.module("shop.footer", ["locale", "templates", "zendesk.url"]).component("habboShopFooter", {
  2085.     templateUrl: "shop/shop-footer/shop-footer.html"
  2086. }),
  2087. angular.module("shop.countries", ["locale", "templates"]).component("habboShopCountries", {
  2088.     bindings: {
  2089.         country: "<",
  2090.         countries: "<"
  2091.     },
  2092.     controller: ["$scope", "$location", function(e, t) {
  2093.         e.$watch("ShopCountriesController.country", function(e, o) {
  2094.             var r = e && e.countryCode || null
  2095.               , a = o && o.countryCode || null ;
  2096.             r && r !== a && t.search({
  2097.                 country: r
  2098.             })
  2099.         })
  2100.     }
  2101.     ],
  2102.     controllerAs: "ShopCountriesController",
  2103.     templateUrl: "shop/shop-countries/shop-countries.html"
  2104. }),
  2105. angular.module("purse.service", ["ngResource", "config"]).factory("purse", ["$resource", "CONFIG", function(e, t) {
  2106.     var o = {}
  2107.       , r = {
  2108.         creditBalance: "...",
  2109.         diamondBalance: "...",
  2110.         habboClubDays: "...",
  2111.         buildersClubDays: "..."
  2112.     }
  2113.       , a = e(t.shopUrl + "/purse");
  2114.     return o.get = function() {
  2115.         return r
  2116.     }
  2117.     ,
  2118.     o.update = function() {
  2119.         a.get().$promise.then(function(e) {
  2120.             r = e
  2121.         })
  2122.     }
  2123.     ,
  2124.     o
  2125. }
  2126. ]),
  2127. angular.module("shop.purse", ["config", "locale", "purse.service", "templates"]).component("habboPurse", {
  2128.     controller: ["$scope", "purse", function(e, t) {
  2129.         var o = this;
  2130.         t.update(),
  2131.         e.$watch(t.get, function(e) {
  2132.             o.purse = e
  2133.         })
  2134.     }
  2135.     ],
  2136.     controllerAs: "PurseController",
  2137.     templateUrl: "shop/purse/purse.html"
  2138. }),
  2139. angular.module("product.icon", []).component("habboProductIcon", {
  2140.     bindings: {
  2141.         iconId: "@"
  2142.     },
  2143.     controllerAs: "ProductIconController",
  2144.     template: '<div ng-class="\'product-icon--\' + ProductIconController.iconId" class="product-icon"></div>'
  2145. }),
  2146. angular.module("prepaid", ["compile", "locale", "router", "shop.purse", "shop.service", "templates", "voucher.redeem", "web.pages"]).config(["$stateProvider", function(e) {
  2147.     e.statePublic("shop.prepaid", {
  2148.         url: "/prepaid",
  2149.         controller: "PrepaidController",
  2150.         controllerAs: "PrepaidController",
  2151.         data: {
  2152.             title: "HEAD_TITLE_SHOP_PREPAID"
  2153.         },
  2154.         resolve: {
  2155.             countries: ["Shop", function(e) {
  2156.                 return e.countries().$promise
  2157.             }
  2158.             ],
  2159.             country: ["countries", "countryCode", function(e, t) {
  2160.                 return _(e).find({
  2161.                     countryCode: t
  2162.                 }) || _(e).find({
  2163.                     countryCode: "all"
  2164.                 }) || e[0]
  2165.             }
  2166.             ],
  2167.             page: ["country", "webPages", function(e, t) {
  2168.                 return t.get("store/prepaid/prepaid_" + e.countryCode)
  2169.             }
  2170.             ]
  2171.         },
  2172.         parent: "shop",
  2173.         templateUrl: "shop/prepaid/prepaid.html"
  2174.     })
  2175. }
  2176. ]).controller("PrepaidController", ["countries", "country", "page", function(e, t, o) {
  2177.     var r = this;
  2178.     r.countries = e,
  2179.     r.country = t,
  2180.     r.page = o
  2181. }
  2182. ]),
  2183. angular.module("earn.credits", ["earn.credits.frame", "earn.credits.service", "locale", "router", "shop.purse", "templates", "web.pages"]).config(["$stateProvider", function(e) {
  2184.     e.statePrivate("shop.earnCredits", {
  2185.         url: "/earn-credits",
  2186.         controller: "EarnCreditsController",
  2187.         controllerAs: "EarnCreditsController",
  2188.         data: {
  2189.             title: "HEAD_TITLE_SHOP_EARN_CREDITS"
  2190.         },
  2191.         parent: "shop",
  2192.         resolve: {
  2193.             offerWallUrl: ["OfferWallUrl", function(e) {
  2194.                 return e.get().$promise
  2195.             }
  2196.             ]
  2197.         },
  2198.         templateUrl: "shop/earn-credits/earn-credits.html"
  2199.     })
  2200. }
  2201. ]).controller("EarnCreditsController", ["offerWallUrl", function(e) {
  2202.     var t = this;
  2203.     t.offerWallUrl = e
  2204. }
  2205. ]),
  2206. angular.module("earn.credits.service", ["ngResource", "config"]).factory("OfferWallUrl", ["$resource", "CONFIG", function(e, t) {
  2207.     return e(t.shopUrl + "/offerwall/url")
  2208. }
  2209. ]),
  2210. angular.module("credit.title", ["locale", "templates"]).component("habboCreditTitle", {
  2211.     bindings: {
  2212.         amount: "@",
  2213.         doubleCredits: "@"
  2214.     },
  2215.     controller: function() {
  2216.         var e = this;
  2217.         e.isDouble = "true" === e.doubleCredits
  2218.     },
  2219.     controllerAs: "CreditTitleController",
  2220.     templateUrl: "shop/credit-title/credit-title.html"
  2221. }),
  2222. angular.module("credit.icon", ["templates"]).component("habboCreditIcon", {
  2223.     bindings: {
  2224.         amount: "@",
  2225.         doubleCredits: "@"
  2226.     },
  2227.     controller: function() {
  2228.         var e = [0, 30, 50, 80, 100, 250, 1e3]
  2229.           , t = this;
  2230.         t.isDouble = "true" === t.doubleCredits,
  2231.         t.getIndex = function(t) {
  2232.             var o = _.curry(function(e, t) {
  2233.                 return t > e
  2234.             });
  2235.             return _.findIndex(e, o(parseInt(t, 10)))
  2236.         }
  2237.     },
  2238.     controllerAs: "CreditIconController",
  2239.     templateUrl: "shop/credit-icon/credit-icon.html"
  2240. }),
  2241. angular.module("credit.card", ["credit-cards", "credit.card.icon", "events", "form", "locale", "notifier", "purse.service", "templates"]).component("habboCreditCardForm", {
  2242.     bindings: {
  2243.         onSubmit: "&",
  2244.         card: "="
  2245.     },
  2246.     controller: ["$compile", "$rootScope", "$scope", "$timeout", "$translate", "EVENTS", function(e, t, o, r, a, n) {
  2247.         var i = this;
  2248.         i.paymentInProgress = !1,
  2249.         i.markActiveAndSubmit = function(e) {
  2250.             i.paymentInProgress = !0,
  2251.             i.onSubmit(e).then(function() {
  2252.                 i.paymentInProgress = !1
  2253.             })
  2254.         }
  2255.         ,
  2256.         o.$watch(function() {
  2257.             return _.size(o.creditCardForm.$error)
  2258.         }, function() {
  2259.             t.$broadcast(n.accordionResize)
  2260.         })
  2261.     }
  2262.     ],
  2263.     controllerAs: "CreditCardController",
  2264.     templateUrl: "shop/credit-card-form/credit-card-form.html"
  2265. }),
  2266. angular.module("privacy.settings", ["locale", "privacy.settings.form", "privacy.settings.service", "router", "templates"]).config(["$stateProvider", function(e) {
  2267.     e.statePrivate("settings.privacy", {
  2268.         url: "/privacy",
  2269.         controller: "PrivacySettingsController",
  2270.         controllerAs: "PrivacySettingsController",
  2271.         parent: "settings",
  2272.         data: {
  2273.             title: "HEAD_TITLE_PRIVACY_SETTINGS"
  2274.         },
  2275.         resolve: {
  2276.             privacySettings: ["PrivacySettings", function(e) {
  2277.                 return e.query().$promise
  2278.             }
  2279.             ]
  2280.         },
  2281.         templateUrl: "settings/privacy-settings/privacy-settings.html"
  2282.     })
  2283. }
  2284. ]).controller("PrivacySettingsController", ["privacySettings", function(e) {
  2285.     var t = this;
  2286.     t.privacySettings = e
  2287. }
  2288. ]),
  2289. angular.module("privacy.settings.form", ["google.analytics", "locale", "notifier", "privacy.settings.service", "templates"]).component("habboPrivacySettingsForm", {
  2290.     bindings: {
  2291.         privacySettings: "<"
  2292.     },
  2293.     controller: ["$scope", "googleAnalytics", "notifier", function(e, t, o) {
  2294.         var r = this;
  2295.         r.save = function() {
  2296.             e.privacySettingsForm.$pristine ? o.success("SETTINGS_SAVED_OK") : (r.sendInProgress = !0,
  2297.             r.privacySettings.$save().then(function() {
  2298.                 t.trackEvent("Privacy settings", "Saved"),
  2299.                 o.success("SETTINGS_SAVED_OK"),
  2300.                 e.privacySettingsForm.$setPristine()
  2301.             })["catch"](function() {
  2302.                 o.error("ERROR_SERVER")
  2303.             })["finally"](function() {
  2304.                 r.sendInProgress = !1
  2305.             }))
  2306.         }
  2307.     }
  2308.     ],
  2309.     controllerAs: "PrivacySettingsFormController",
  2310.     templateUrl: "settings/privacy-settings/privacy-settings-form.html"
  2311. }),
  2312. angular.module("privacy.settings.service", ["ngResource", "config"]).factory("PrivacySettings", ["$resource", "CONFIG", function(e, t) {
  2313.     return e(t.apiUrl + "/user/preferences", {}, {
  2314.         query: {
  2315.             method: "GET",
  2316.             isArray: !1
  2317.         },
  2318.         save: {
  2319.             method: "POST",
  2320.             url: t.apiUrl + "/user/preferences/save"
  2321.         }
  2322.     })
  2323. }
  2324. ]),
  2325. angular.module("password.change", ["locale", "password.change.form", "router", "templates"]).config(["$stateProvider", function(e) {
  2326.     e.stateHabboAccountTrusted("settings.password", {
  2327.         url: "/password",
  2328.         parent: "settings",
  2329.         data: {
  2330.             title: "HEAD_TITLE_PASSWORD_CHANGE"
  2331.         },
  2332.         templateUrl: "settings/password-change/password-change.html"
  2333.     })
  2334. }
  2335. ]),
  2336. angular.module("password.change.form", ["form", "locale", "notifier", "security", "settings.service", "templates"]).component("habboPasswordChangeForm", {
  2337.     controller: ["$scope", "Session", "notifier", "settings", function(e, t, o, r) {
  2338.         function a() {
  2339.             e.changePasswordForm.$setPristine(),
  2340.             n.passwords = {}
  2341.         }
  2342.         var n = this;
  2343.         n.user = t.user,
  2344.         n.updateInProgress = !1,
  2345.         n.update = function() {
  2346.             e.changePasswordForm.$valid && (n.updateInProgress = !0,
  2347.             r.changePassword(n.passwords).then(function() {
  2348.                 a(),
  2349.                 o.success("PASSWORD_CHANGE_SUCCESS")
  2350.             })["catch"](function(t) {
  2351.                 409 === t.status ? e.$broadcast("remote-data-invalid", "password") : 403 !== t.status && o.error("ERROR_SERVER")
  2352.             })["finally"](function() {
  2353.                 n.updateInProgress = !1
  2354.             }))
  2355.         }
  2356.     }
  2357.     ],
  2358.     controllerAs: "PasswordChangeFormController",
  2359.     templateUrl: "settings/password-change/password-change-form.html"
  2360. }),
  2361. angular.module("email.change", ["activation.status", "email.change.form", "locale", "router", "templates"]).config(["$stateProvider", function(e) {
  2362.     e.stateHabboAccountTrusted("settings.email", {
  2363.         url: "/email",
  2364.         parent: "settings",
  2365.         data: {
  2366.             title: "HEAD_TITLE_EMAIL_CHANGE"
  2367.         },
  2368.         templateUrl: "settings/email-change/email-change.html"
  2369.     })
  2370. }
  2371. ]),
  2372. angular.module("email.change.form", ["form", "locale", "notifier", "security", "settings.service", "templates"]).component("habboEmailChangeForm", {
  2373.     controller: ["$scope", "Session", "notifier", "settings", function(e, t, o, r) {
  2374.         function a() {
  2375.             e.emailChangeForm.$setPristine(),
  2376.             n.emailChangeData = {}
  2377.         }
  2378.         var n = this;
  2379.         n.user = t.user,
  2380.         n.updateInProgress = !1,
  2381.         n.update = function() {
  2382.             e.emailChangeForm.$valid && (n.updateInProgress = !0,
  2383.             r.changeEmail(n.emailChangeData).then(function() {
  2384.                 a(),
  2385.                 o.success("EMAIL_CHANGE_SUCCESS")
  2386.             })["catch"](function(t) {
  2387.                 var r = t.data && t.data.error;
  2388.                 "registration_email" === r ? e.$broadcast("remote-data-invalid", "emailInvalid") : "changeEmail.email_already_in_use" === r ? e.$broadcast("remote-data-invalid", "emailUsedInChange") : "changeEmail.invalid_password" === r ? e.$broadcast("remote-data-invalid", "password") : 403 !== t.status && o.error("ERROR_SERVER")
  2389.             })["finally"](function() {
  2390.                 n.updateInProgress = !1
  2391.             }))
  2392.         }
  2393.     }
  2394.     ],
  2395.     controllerAs: "EmailChangeFormController",
  2396.     templateUrl: "settings/email-change/email-change-form.html"
  2397. }),
  2398. angular.module("avatar.service", ["config", "google.analytics", "security"]).factory("avatar", ["$http", "$q", "CONFIG", "Session", "googleAnalytics", function(e, t, o, r, a) {
  2399.     var n = {};
  2400.     return n.query = function() {
  2401.         return e.get(o.apiUrl + "/user/avatars").then(function(e) {
  2402.             return e.data
  2403.         })
  2404.     }
  2405.     ,
  2406.     n.create = function(t) {
  2407.         return e.post(o.apiUrl + "/user/avatars", {
  2408.             name: t
  2409.         }).then(function(e) {
  2410.             return a.trackEvent("Avatar", "Created"),
  2411.             r.update(e.data),
  2412.             e.data
  2413.         })
  2414.     }
  2415.     ,
  2416.     n.isNameAvailable = function(r) {
  2417.         return e.get(o.apiUrl + "/user/avatars/check-name?name=" + r).then(function(e) {
  2418.             return e.data.isAvailable ? t.when() : t.reject()
  2419.         })
  2420.     }
  2421.     ,
  2422.     n.select = function(t) {
  2423.         return e.post(o.apiUrl + "/user/avatars/select", t).then(function(e) {
  2424.             return a.trackEvent("Avatar", "Changed"),
  2425.             r.update(e.data),
  2426.             e.data
  2427.         })
  2428.     }
  2429.     ,
  2430.     n
  2431. }
  2432. ]),
  2433. angular.module("avatar.selection", ["avatar.create", "avatar.search", "avatar.service", "locale", "router", "security", "templates"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  2434.     e.statePrivate("settings.avatar", {
  2435.         url: "/avatars",
  2436.         parent: "settings",
  2437.         controller: "AvatarSelectionController",
  2438.         controllerAs: "AvatarSelectionController",
  2439.         data: {
  2440.             title: "HEAD_TITLE_AVATAR_SELECTION"
  2441.         },
  2442.         resolve: {
  2443.             avatars: ["avatar", function(e) {
  2444.                 return e.query()
  2445.             }
  2446.             ]
  2447.         },
  2448.         templateUrl: "settings/avatar-selection/avatar-selection.html"
  2449.     }),
  2450.     t.when("/avatars", "/settings/avatars")
  2451. }
  2452. ]).controller("AvatarSelectionController", ["avatars", function(e) {
  2453.     var t = this;
  2454.     t.avatars = e
  2455. }
  2456. ]),
  2457. angular.module("trusted.locations.reset", ["account.security.service", "locale", "notifier", "templates"]).component("habboTrustedLocationsReset", {
  2458.     controller: ["$translate", "$window", "accountSecurity", "notifier", function(e, t, o, r) {
  2459.         function a() {
  2460.             o.reset().then(function() {
  2461.                 r.success("ACCOUNT_SECURITY_TRUSTED_LOGINS_RESET_OK")
  2462.             })["catch"](function(e) {
  2463.                 403 !== e.status && r.error("ERROR_SERVER")
  2464.             })["finally"](function() {
  2465.                 n.inProgress = !1
  2466.             })
  2467.         }
  2468.         var n = this;
  2469.         n.reset = function() {
  2470.             n.inProgress = !0,
  2471.             e("ACCOUNT_SECURITY_RESET_LOCATIONS_CONFIRMATION").then(function(e) {
  2472.                 t.confirm(e) ? a() : n.inProgress = !1
  2473.             })
  2474.         }
  2475.     }
  2476.     ],
  2477.     controllerAs: "TrustedLocationsResetController",
  2478.     templateUrl: "settings/account-security/trusted-locations-reset.html"
  2479. }),
  2480. angular.module("account.security.service", ["config", "google.analytics"]).factory("accountSecurity", ["$http", "CONFIG", "googleAnalytics", function(e, t, o) {
  2481.     var r = {};
  2482.     return r.status = function() {
  2483.         return e.get(t.apiUrl + "/safetylock/featureStatus").then(function(e) {
  2484.             return e.data
  2485.         })
  2486.     }
  2487.     ,
  2488.     r.save = function(r, a, n, i, s) {
  2489.         return e.post(t.apiUrl + "/safetylock/save", {
  2490.             questionId1: r,
  2491.             answer1: a,
  2492.             questionId2: n,
  2493.             answer2: i,
  2494.             password: s
  2495.         }).then(function() {
  2496.             o.trackEvent("Safety lock", "Questions saved")
  2497.         })
  2498.     }
  2499.     ,
  2500.     r.disable = function() {
  2501.         return e.get(t.apiUrl + "/safetylock/disable").then(function() {
  2502.             o.trackEvent("Safety lock", "Disabled")
  2503.         })
  2504.     }
  2505.     ,
  2506.     r.reset = function() {
  2507.         return e.get(t.apiUrl + "/safetylock/resetTrustedLogins").then(function() {
  2508.             o.trackEvent("Safety lock", "Trusted locations reset")
  2509.         })
  2510.     }
  2511.     ,
  2512.     r
  2513. }
  2514. ]),
  2515. angular.module("account.security", ["account.security.edit", "account.security.service", "locale", "router", "templates", "trusted.locations.reset"]).config(["$stateProvider", function(e) {
  2516.     e.stateHabboAccountTrusted("settings.security", {
  2517.         url: "/security",
  2518.         controller: "AccountSecurityController",
  2519.         controllerAs: "AccountSecurityController",
  2520.         parent: "settings",
  2521.         data: {
  2522.             title: "HEAD_TITLE_ACCOUNT_SECURITY"
  2523.         },
  2524.         resolve: {
  2525.             accountSecurityStatus: ["accountSecurity", function(e) {
  2526.                 return e.status()
  2527.             }
  2528.             ]
  2529.         },
  2530.         templateUrl: "settings/account-security/account-security.html"
  2531.     })
  2532. }
  2533. ]).controller("AccountSecurityController", ["accountSecurityStatus", function(e) {
  2534.     var t = this;
  2535.     t.accountSecurityStatus = e
  2536. }
  2537. ]),
  2538. angular.module("account.security.edit", ["account.security.service", "locale", "message.container", "notifier", "safety.questions.modal", "templates"]).component("habboAccountSecurityEdit", {
  2539.     bindings: {
  2540.         accountSecurityStatus: "="
  2541.     },
  2542.     controller: ["$translate", "$window", "accountSecurity", "notifier", "safetyQuestionsModal", function(e, t, o, r, a) {
  2543.         function n() {
  2544.             o.disable().then(function() {
  2545.                 i.accountSecurityStatus = "disabled",
  2546.                 r.success("ACCOUNT_SECURITY_DISABLED_OK")
  2547.             })["catch"](function(e) {
  2548.                 403 !== e.status && r.error("ERROR_SERVER")
  2549.             })["finally"](function() {
  2550.                 i.disableInProgress = !1
  2551.             })
  2552.         }
  2553.         var i = this;
  2554.         i.modal = a,
  2555.         i.openModal = function() {
  2556.             a.open().then(function() {
  2557.                 i.accountSecurityStatus = "enabled"
  2558.             })
  2559.         }
  2560.         ,
  2561.         i.disable = function() {
  2562.             i.disableInProgress = !0,
  2563.             e("ACCOUNT_SECURITY_DISABLE_CONFIRMATION").then(function(e) {
  2564.                 t.confirm(e) ? n() : i.disableInProgress = !1
  2565.             })
  2566.         }
  2567.     }
  2568.     ],
  2569.     controllerAs: "AccountSecurityEditController",
  2570.     templateUrl: "settings/account-security/account-security-edit.html"
  2571. }),
  2572. angular.module("security.require.session", ["security.session"]).directive("habboRequireSession", ["Session", "ngIfDirective", function(e, t) {
  2573.     var o = t[0];
  2574.     return {
  2575.         restrict: "A",
  2576.         priority: o.priority,
  2577.         terminal: o.terminal,
  2578.         transclude: o.transclude,
  2579.         link: function(t, r, a) {
  2580.             a.ngIf = function() {
  2581.                 return e.hasSession()
  2582.             }
  2583.             ,
  2584.             o.link.apply(o, arguments)
  2585.         }
  2586.     }
  2587. }
  2588. ]).directive("habboRequireNoSession", ["Session", "ngIfDirective", function(e, t) {
  2589.     var o = t[0];
  2590.     return {
  2591.         restrict: "A",
  2592.         priority: o.priority,
  2593.         terminal: o.terminal,
  2594.         transclude: o.transclude,
  2595.         link: function(t, r, a) {
  2596.             a.ngIf = function() {
  2597.                 return !e.hasSession()
  2598.             }
  2599.             ,
  2600.             o.link.apply(o, arguments)
  2601.         }
  2602.     }
  2603. }
  2604. ]),
  2605. angular.module("security.require.non.staff.account.session", ["security.session"]).directive("habboRequireNonStaffAccountSession", ["Session", "ngIfDirective", function(e, t) {
  2606.     var o = t[0];
  2607.     return {
  2608.         restrict: "A",
  2609.         priority: o.priority,
  2610.         terminal: o.terminal,
  2611.         transclude: o.transclude,
  2612.         link: function(t, r, a) {
  2613.             a.ngIf = function() {
  2614.                 return !e.isStaff()
  2615.             }
  2616.             ,
  2617.             o.link.apply(o, arguments)
  2618.         }
  2619.     }
  2620. }
  2621. ]),
  2622. angular.module("security.require.habbo.account.session", ["security.session"]).directive("habboRequireHabboAccountSession", ["Session", "ngIfDirective", function(e, t) {
  2623.     var o = t[0];
  2624.     return {
  2625.         restrict: "A",
  2626.         priority: o.priority,
  2627.         terminal: o.terminal,
  2628.         transclude: o.transclude,
  2629.         link: function(t, r, a) {
  2630.             a.ngIf = function() {
  2631.                 return e.isHabboAccountSession()
  2632.             }
  2633.             ,
  2634.             o.link.apply(o, arguments)
  2635.         }
  2636.     }
  2637. }
  2638. ]),
  2639. angular.module("security.session", ["security.require.habbo.account.session", "security.require.non.staff.account.session", "security.require.session", "security.session.service"]),
  2640. angular.module("security.session.store", []).factory("SessionStore", ["$window", function(e) {
  2641.     var t = {};
  2642.     return t.create = function(t) {
  2643.         try {
  2644.             e.sessionStorage.setItem("session", angular.toJson(t))
  2645.         } catch (o) {
  2646.             Bugsnag.notifyException(o, "SessionStorage not supported", {
  2647.                 groupingHash: "SessionStorage"
  2648.             }, "info")
  2649.         }
  2650.     }
  2651.     ,
  2652.     t.get = function() {
  2653.         try {
  2654.             var t = e.sessionStorage.getItem("session");
  2655.             return t ? angular.fromJson(t) : null
  2656.         } catch (o) {
  2657.             return Bugsnag.notifyException(o, "SessionStorage not supported", {
  2658.                 groupingHash: "SessionStorage"
  2659.             }, "info"),
  2660.             null
  2661.         }
  2662.     }
  2663.     ,
  2664.     t.destroy = function() {
  2665.         try {
  2666.             e.sessionStorage.removeItem("session")
  2667.         } catch (t) {
  2668.             Bugsnag.notifyException(t, "SessionStorage not supported", {
  2669.                 groupingHash: "SessionStorage"
  2670.             }, "info")
  2671.         }
  2672.     }
  2673.     ,
  2674.     t
  2675. }
  2676. ]),
  2677. angular.module("security.session.service", ["config", "events", "security.bugsnag.session", "security.ga.session", "security.session.store"]).factory("Session", ["$rootScope", "BugsnagSession", "CONFIG", "EVENTS", "GaSession", "SessionStore", function(e, t, o, r, a, n) {
  2678.     var i = {};
  2679.     return i.user = null ,
  2680.     i.init = function(e) {
  2681.         return e = e || n.get(),
  2682.         e ? i.create(e) : void 0
  2683.     }
  2684.     ,
  2685.     i.create = function(o) {
  2686.         return i.user = o,
  2687.         t.create(i.user),
  2688.         a.create(i.user),
  2689.         n.create(i.user),
  2690.         e.$broadcast(r.securityLogin),
  2691.         i.user
  2692.     }
  2693.     ,
  2694.     i.update = function(e) {
  2695.         return angular.extend(i.user, e),
  2696.         t.create(i.user),
  2697.         a.create(i.user),
  2698.         n.create(i.user),
  2699.         i.user
  2700.     }
  2701.     ,
  2702.     i.hasSession = function() {
  2703.         return Boolean(i.user)
  2704.     }
  2705.     ,
  2706.     i.isTrusted = function() {
  2707.         return i.hasSession() && Boolean(i.user.trusted)
  2708.     }
  2709.     ,
  2710.     i.isHabboAccountSession = function() {
  2711.         return i.hasSession() && "fblogin" !== i.user.email && "rpxlogin" !== i.user.email
  2712.     }
  2713.     ,
  2714.     i.hasAds = function() {
  2715.         return !i.hasSession() || !(i.user.buildersClubMember || i.user.habboClubMember)
  2716.     }
  2717.     ,
  2718.     i.hasPreRollAd = function() {
  2719.         return i.hasSession() && !(i.user.buildersClubMember || i.user.habboClubMember) && !_.includes(i.user.traits, "NEW_USER") && !_.includes(i.user.traits, "STAFF") && !i.isTestUser()
  2720.     }
  2721.     ,
  2722.     i.isTestUser = function() {
  2723.         return "hhs1" === o.hotel && i.hasSession() && i.user.email && (_(i.user.email).includes("@dev.habbo.fi") || _(i.user.email).includes("@test.habbo.fi"))
  2724.     }
  2725.     ,
  2726.     i.isCurrentUser = function(e) {
  2727.         return i.hasSession() && i.user.uniqueId === e
  2728.     }
  2729.     ,
  2730.     i.destroy = function() {
  2731.         n.destroy()
  2732.     }
  2733.     ,
  2734.     i.isStaff = function() {
  2735.         return i.hasSession() && _.includes(i.user.traits, "STAFF")
  2736.     }
  2737.     ,
  2738.     i
  2739. }
  2740. ]),
  2741. angular.module("security.ga.session", ["angular-md5"]).factory("GaSession", ["$window", "md5", function(e, t) {
  2742.     var o = {};
  2743.     return o.create = function(o) {
  2744.         try {
  2745.             e.ga("set", "userId", t.createHash(o.identityId.toString()))
  2746.         } catch (r) {
  2747.             Bugsnag.notifyException(r, "GA session not created", {}, "info")
  2748.         }
  2749.     }
  2750.     ,
  2751.     o
  2752. }
  2753. ]),
  2754. angular.module("security.bugsnag.session", ["angular-md5"]).factory("BugsnagSession", ["$window", "md5", function(e, t) {
  2755.     var o = {};
  2756.     return o.create = function(o) {
  2757.         e.Bugsnag && (e.Bugsnag.user = {
  2758.             id: t.createHash(o.identityId.toString())
  2759.         })
  2760.     }
  2761.     ,
  2762.     o
  2763. }
  2764. ]),
  2765. angular.module("security.safety.lock.service", ["config", "google.analytics", "security"]).factory("safetyLock", ["$http", "$location", "CONFIG", "Session", "googleAnalytics", function(e, t, o, r, a) {
  2766.     var n = {};
  2767.     return n.getQuestions = function() {
  2768.         return e.get(o.apiUrl + "/safetylock/questions")
  2769.     }
  2770.     ,
  2771.     n.unlock = function(n) {
  2772.         return e.post(o.apiUrl + "/safetylock/unlock", n).then(function() {
  2773.             var e = {
  2774.                 trusted: !0
  2775.             };
  2776.             return r.hasSession() && r.update(e),
  2777.             a.trackEvent("Safety lock", "Unlocked", t.path()),
  2778.             e
  2779.         })
  2780.     }
  2781.     ,
  2782.     n
  2783. }
  2784. ]),
  2785. angular.module("security.safety.lock", ["security.safety.lock.form", "security.safety.lock.service", "templates", "ui.bootstrap"]).controller("SafetyLockController", ["questions", function(e) {
  2786.     var t = this;
  2787.     t.questions = e.data
  2788. }
  2789. ]).factory("safetyLockModal", ["$uibModal", "safetyLock", function(e, t) {
  2790.     var o, r = {};
  2791.     return r.open = function() {
  2792.         return o = e.open({
  2793.             controller: "SafetyLockController",
  2794.             controllerAs: "SafetyLockController",
  2795.             resolve: {
  2796.                 questions: t.getQuestions
  2797.             },
  2798.             templateUrl: "security/safety-lock/safety-lock-modal.html"
  2799.         }),
  2800.         o.result
  2801.     }
  2802.     ,
  2803.     r.isOpen = function() {
  2804.         return Boolean(o) && o.open
  2805.     }
  2806.     ,
  2807.     r
  2808. }
  2809. ]),
  2810. angular.module("security.safety.lock.form", ["form", "locale", "notifier", "security.safety.lock.service", "templates"]).directive("habboSafetyLockForm", ["notifier", "safetyLock", function(e, t) {
  2811.     return {
  2812.         restrict: "E",
  2813.         scope: {
  2814.             questions: "=",
  2815.             onUnlock: "&",
  2816.             onCancel: "&"
  2817.         },
  2818.         templateUrl: "security/safety-lock/safety-lock-form.html",
  2819.         link: function(o) {
  2820.             o.answers = {
  2821.                 trust: !1
  2822.             },
  2823.             o.unlockingInProgress = !1,
  2824.             o.isTrustedLocationEnabled = !0,
  2825.             o.unlock = function() {
  2826.                 o.safetyLockForm.$valid && (o.unlockingInProgress = !0,
  2827.                 t.unlock(o.answers).then(o.onUnlock)["catch"](function(t) {
  2828.                     var r = t.status;
  2829.                     409 === r ? o.$broadcast("remote-data-invalid", "answer") : 429 === r ? e.error("ERROR_TOO_MANY_ATTEMPTS", {
  2830.                         time: moment(t.data.nextValidRequestDate).fromNow(!0)
  2831.                     }) : e.error("ERROR_SERVER")
  2832.                 })["finally"](function() {
  2833.                     o.unlockingInProgress = !1
  2834.                 }))
  2835.             }
  2836.         }
  2837.     }
  2838. }
  2839. ]),
  2840. angular.module("security.safety.answering.modal", ["locale", "security.safety.answering.form", "templates", "ui.bootstrap"]).controller("SafetyAnsweringController", ["data", "questions", "targetAction", function(e, t, o) {
  2841.     var r = this;
  2842.     r.questions = t,
  2843.     r.data = e,
  2844.     r.targetAction = o
  2845. }
  2846. ]).factory("safetyAnsweringModal", ["$uibModal", function(e) {
  2847.     var t = {};
  2848.     return t.open = function(t, o, r) {
  2849.         return e.open({
  2850.             controller: "SafetyAnsweringController",
  2851.             controllerAs: "SafetyAnsweringController",
  2852.             resolve: {
  2853.                 questions: _.constant(t),
  2854.                 data: _.constant(o),
  2855.                 targetAction: _.constant(r)
  2856.             },
  2857.             templateUrl: "security/safety-lock/safety-answering-modal.html"
  2858.         }).result
  2859.     }
  2860.     ,
  2861.     t
  2862. }
  2863. ]),
  2864. angular.module("security.safety.answering.form", ["form", "locale", "notifier", "templates"]).directive("habboSafetyAnsweringForm", ["notifier", function(e) {
  2865.     return {
  2866.         restrict: "E",
  2867.         scope: {
  2868.             data: "=",
  2869.             questions: "=",
  2870.             targetAction: "&",
  2871.             onSuccess: "&",
  2872.             onCancel: "&"
  2873.         },
  2874.         templateUrl: "security/safety-lock/safety-lock-form.html",
  2875.         link: function(t) {
  2876.             t.answers = {},
  2877.             t.unlockingInProgress = !1,
  2878.             t.isTrustedLocationEnabled = !1,
  2879.             t.unlock = function() {
  2880.                 t.safetyLockForm.$valid && (t.unlockingInProgress = !0,
  2881.                 _.assign(t.data, t.answers),
  2882.                 t.targetAction({
  2883.                     data: t.data
  2884.                 }).then(t.onSuccess)["catch"](function(o) {
  2885.                     var r = o.status;
  2886.                     409 === r ? t.$broadcast("remote-data-invalid", "answer") : 429 === r ? e.error("ERROR_TOO_MANY_ATTEMPTS", {
  2887.                         time: moment(o.data.nextValidRequestDate).fromNow(!0)
  2888.                     }) : e.error("ERROR_SERVER")
  2889.                 })["finally"](function() {
  2890.                     t.unlockingInProgress = !1
  2891.                 }))
  2892.             }
  2893.         }
  2894.     }
  2895. }
  2896. ]),
  2897. angular.module("security.rpx.service", ["config"]).factory("rpxSecurity", ["$document", "$window", "CONFIG", function(e, t, o) {
  2898.     var r, a = {};
  2899.     return a.init = function() {
  2900.         t.janrain = {},
  2901.         t.janrain.settings = {},
  2902.         t.janrain.settings.language = o.rpxLocale,
  2903.         t.janrain.settings.tokenUrl = o.rpxTokenUrl,
  2904.         t.janrain.ready = !0,
  2905.         r = e[0].createElement("script"),
  2906.         r.id = "janrainAuthWidget",
  2907.         r.src = "https://rpxnow.com/js/lib/login.habbo.com/engage.js",
  2908.         e[0].body.appendChild(r)
  2909.     }
  2910.     ,
  2911.     a.destroy = function() {
  2912.         r && (delete t.janrain,
  2913.         angular.element(r).remove(),
  2914.         angular.element('script[src^="https://d29usylhdk1xyu.cloudfront.net"]').remove(),
  2915.         angular.element("#janrainModal, #janrainModalOverlay").remove())
  2916.     }
  2917.     ,
  2918.     a
  2919. }
  2920. ]),
  2921. angular.module("security.rpx.message", ["notifier"]).factory("rpxMessage", ["notifier", function(e) {
  2922.     var t = {}
  2923.       , o = "💩"
  2924.       , r = "🐳"
  2925.       , a = "🙊";
  2926.     return t.show = function(t) {
  2927.         switch (t) {
  2928.         case o:
  2929.             e.error("LOGIN_RPX_REGISTRATION_DISABLED");
  2930.             break;
  2931.         case r:
  2932.             e.error("ERROR_SERVER_MAINTENANCE");
  2933.             break;
  2934.         case a:
  2935.             e.error("ERROR_SERVER")
  2936.         }
  2937.     }
  2938.     ,
  2939.     t
  2940. }
  2941. ]).run(["$location", "rpxMessage", function(e, t) {
  2942.     t.show(e.search().error)
  2943. }
  2944. ]),
  2945. angular.module("security.rpx", ["security.rpx.message", "security.rpx.service"]),
  2946. angular.module("security.login.shake", []).constant("LOGIN_EVENTS", {
  2947.     invalidCredentials: "login-invalid-credentials"
  2948. }).directive("habboShake", ["LOGIN_EVENTS", function(e) {
  2949.     return {
  2950.         restrict: "A",
  2951.         link: function(t, o) {
  2952.             t.$on(e.invalidCredentials, function() {
  2953.                 var e = angular.element(".modal-dialog")
  2954.                   , t = e.is(":visible") ? e : o;
  2955.                 t.addClass("animated shake").one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend", function() {
  2956.                     t.removeClass("animated shake")
  2957.                 })
  2958.             })
  2959.         }
  2960.     }
  2961. }
  2962. ]),
  2963. angular.module("security.login", ["security.login.form", "templates", "ui.bootstrap"]).factory("loginModal", ["$uibModal", function(e) {
  2964.     var t, o = {};
  2965.     return o.open = function() {
  2966.         return t = e.open({
  2967.             templateUrl: "security/login/login-modal.html"
  2968.         }),
  2969.         t.result
  2970.     }
  2971.     ,
  2972.     o.isOpen = function() {
  2973.         return Boolean(t) && t.open
  2974.     }
  2975.     ,
  2976.     o
  2977. }
  2978. ]),
  2979. angular.module("security.login.form", ["air.download.link", "captcha.modal", "claim.password", "form", "locale", "notifier", "recover.password.modal", "security.facebook.connect", "security.login.rpx", "security.login.shake", "security.service", "templates"]).component("habboLoginForm", {
  2980.     bindings: {
  2981.         onLogin: "&"
  2982.     },
  2983.     controller: ["$element", "$location", "$scope", "$window", "LOGIN_EVENTS", "captchaModal", "notifier", "recoverPasswordModal", "security", function(e, t, o, r, a, n, i, s, l) {
  2984.         function c() {
  2985.             n.open().then(function(e) {
  2986.                 u({
  2987.                     email: p.email,
  2988.                     password: p.password,
  2989.                     captchaToken: e
  2990.                 })
  2991.             })
  2992.         }
  2993.         function u(e) {
  2994.             p.loginInProgress = !0,
  2995.             l.login(e).then(p.onLogin)["catch"](d)["finally"](function() {
  2996.                 p.loginInProgress = !1
  2997.             })
  2998.         }
  2999.         function d(e) {
  3000.             var t = e.status
  3001.               , o = e.data && e.data.message;
  3002.             h = Boolean(e.data && e.data.captcha),
  3003.             401 === t ? "login.staff_login_not_allowed" === o ? i.error("ERROR_LOGIN_STAFF_NOT_ALLOWED") : "invalid-captcha" === o ? c() : m() : 429 === t ? i.error("ERROR_TOO_MANY_ATTEMPTS", {
  3004.                 time: moment(e.data.nextValidRequestDate).fromNow(!0)
  3005.             }) : "force.pending" !== t && i.error("ERROR_SERVER")
  3006.         }
  3007.         function m() {
  3008.             b++,
  3009.             b === f ? (f *= 2,
  3010.             s.open(p.email)) : (o.$broadcast(a.invalidCredentials),
  3011.             o.$broadcast("remote-data-invalid", "credentials"))
  3012.         }
  3013.         var p = this
  3014.           , h = !1
  3015.           , b = 0
  3016.           , f = 3;
  3017.         p.loginInProgress = !1,
  3018.         p.login = function() {
  3019.             var o = t.search().captchaToken || r.captchaToken;
  3020.             p.email = e.find("[type=email]").val(),
  3021.             p.password = e.find("[type=password]").val(),
  3022.             o ? u({
  3023.                 email: p.email,
  3024.                 password: p.password,
  3025.                 captchaToken: o
  3026.             }) : h ? c() : u({
  3027.                 email: p.email,
  3028.                 password: p.password
  3029.             })
  3030.         }
  3031.     }
  3032.     ],
  3033.     controllerAs: "LoginController",
  3034.     templateUrl: "security/login/login-form.html"
  3035. }),
  3036. angular.module("security.use.force.service", ["security.force.email.modal", "security.force.password.modal", "security.force.service", "security.force.tos.modal", "security.safety.lock"]).factory("useForce", ["$q", "FORCE", "forceEmailModal", "forcePasswordModal", "forceTOSModal", "safetyLockModal", function(e, t, o, r, a, n) {
  3037.     function i(e, t) {
  3038.         return function(o) {
  3039.             var r = o && o.force;
  3040.             return _.includes(r, e) ? t(o) : o
  3041.         }
  3042.     }
  3043.     function s(e) {
  3044.         return l(e).then(r.open)
  3045.     }
  3046.     function l(t) {
  3047.         return t.trusted ? e.when(t) : n.open().then(function(e) {
  3048.             return _.assign(t, e)
  3049.         })
  3050.     }
  3051.     var c = {};
  3052.     return c.handleForces = function(r) {
  3053.         return e.when(r).then(i(t.email, o.open)).then(i(t.password, s)).then(i(t.TOS, a.open))
  3054.     }
  3055.     ,
  3056.     c
  3057. }
  3058. ]),
  3059. angular.module("security.force.service", ["config", "google.analytics"]).constant("FORCE", {
  3060.     email: "EMAIL",
  3061.     password: "PASSWORD",
  3062.     TOS: "TOS"
  3063. }).factory("force", ["$http", "CONFIG", "googleAnalytics", function(e, t, o) {
  3064.     var r = {};
  3065.     return r.changeEmail = function(r) {
  3066.         return e.post(t.apiUrl + "/force/email-change", {
  3067.             newEmail: r
  3068.         }).then(function(e) {
  3069.             return o.trackEvent("Email", "Forced change"),
  3070.             e.data
  3071.         })
  3072.     }
  3073.     ,
  3074.     r.changePassword = function(r) {
  3075.         return e.post(t.apiUrl + "/force/password-change", {
  3076.             newPassword: r
  3077.         }).then(function(e) {
  3078.             return o.trackEvent("Password", "Forced change"),
  3079.             e.data
  3080.         })
  3081.     }
  3082.     ,
  3083.     r.acceptTOS = function() {
  3084.         return e.post(t.apiUrl + "/force/tos-accept").then(function(e) {
  3085.             return o.trackEvent("TOS", "Forced accept"),
  3086.             e.data
  3087.         })
  3088.     }
  3089.     ,
  3090.     r
  3091. }
  3092. ]),
  3093. angular.module("security.fingerprint", ["security.fingerprint.interceptor", "security.fingerprint.service.init"]),
  3094. angular.module("security.fingerprint.service", []).factory("fingerprint", function() {
  3095.     var e = {};
  3096.     return e.getFingerprint = function() {
  3097.         return e.fingerprint
  3098.     }
  3099.     ,
  3100.     e.calculateFingerprint = function() {
  3101.         (new Fingerprint2).get(function(t) {
  3102.             e.fingerprint = t
  3103.         })
  3104.     }
  3105.     ,
  3106.     e
  3107. }),
  3108. angular.module("security.fingerprint.service.init", ["security.fingerprint.service"]).run(["fingerprint", function(e) {
  3109.     e.calculateFingerprint()
  3110. }
  3111. ]),
  3112. angular.module("security.fingerprint.service.mock", []).factory("fingerprint", function() {
  3113.     var e = {};
  3114.     return e.getFingerprint = function() {
  3115.         return e.fingerprint
  3116.     }
  3117.     ,
  3118.     e.calculateFingerprint = _.noop,
  3119.     e
  3120. }),
  3121. angular.module("security.fingerprint.interceptor", ["config", "security.fingerprint.service"]).factory("fingerprintInterceptor", ["CONFIG", "fingerprint", function(e, t) {
  3122.     var o = {};
  3123.     return o.request = function(o) {
  3124.         return t.getFingerprint() && _(o.url).includes(e.apiUrl) && (o.headers["x-habbo-fingerprint"] = t.getFingerprint()),
  3125.         o
  3126.     }
  3127.     ,
  3128.     o
  3129. }
  3130. ]).config(["$httpProvider", function(e) {
  3131.     e.interceptors.push("fingerprintInterceptor")
  3132. }
  3133. ]),
  3134. angular.module("spinner", ["security", "templates", "ui.bootstrap", "ui.router"]).factory("spinner", ["$rootScope", "$timeout", "$uibModal", "loginModal", "safetyLockModal", function(e, t, o, r, a) {
  3135.     function n() {
  3136.         t.cancel(c),
  3137.         l || (c = t(s, 200))
  3138.     }
  3139.     function i() {
  3140.         t.cancel(c),
  3141.         l && (l.close(),
  3142.         l = null ,
  3143.         u = !0)
  3144.     }
  3145.     function s() {
  3146.         r.isOpen() || a.isOpen() || (l = o.open({
  3147.             animation: !1,
  3148.             backdrop: "static",
  3149.             backdropClass: u ? "spinner-backdrop--transparent" : "spinner-backdrop--solid",
  3150.             keyboard: !1,
  3151.             templateUrl: "router/spinner/spinner.html",
  3152.             windowClass: u ? "spinner spinner--transparent" : "spinner spinner--solid"
  3153.         }))
  3154.     }
  3155.     var l, c, u = !1, d = {};
  3156.     return d.init = function() {
  3157.         s(),
  3158.         e.$on("$stateChangeStart", n),
  3159.         e.$on("$stateChangeSuccess", i),
  3160.         e.$on("$stateChangeError", i)
  3161.     }
  3162.     ,
  3163.     d
  3164. }
  3165. ]),
  3166. angular.module("scrolltop", ["ui.router"]).factory("scrolltop", function() {
  3167.     var e = {};
  3168.     return e.enabled = !0,
  3169.     e.setEnabled = function(e) {
  3170.         this.enabled = e
  3171.     }
  3172.     ,
  3173.     e.isEnabled = function() {
  3174.         return this.enabled
  3175.     }
  3176.     ,
  3177.     e
  3178. }).run(["$rootScope", "$window", "scrolltop", function(e, t, o) {
  3179.     e.$on("$viewContentLoaded", function() {
  3180.         o.isEnabled() && t.scrollTo(0, 0)
  3181.     })
  3182. }
  3183. ]),
  3184. angular.module("prerender.status.code", []).directive("prerenderStatusCode", ["$location", function(e) {
  3185.     return {
  3186.         restrict: "A",
  3187.         link: function(t, o, r) {
  3188.             var a = e.absUrl();
  3189.             t.$on("$stateChangeStart", function(e, t) {
  3190.                 t.resolve && t.resolve.auth && r.$set("content", 401)
  3191.             }),
  3192.             t.$on("$stateChangeSuccess", function(t, o) {
  3193.                 "notFound" === o.name ? r.$set("content", 404) : r.$set("content", a === e.absUrl() ? 200 : 301)
  3194.             }),
  3195.             t.$on("$stateChangeError", function() {
  3196.                 r.$set("content", 404)
  3197.             })
  3198.         }
  3199.     }
  3200. }
  3201. ]),
  3202. angular.module("prerender.ready", []).run(["$browser", "$timeout", "$window", function(e, t, o) {
  3203.     e.notifyWhenNoOutstandingRequests(function() {
  3204.         t(function() {
  3205.             o.prerenderReady = !0
  3206.         })
  3207.     })
  3208. }
  3209. ]),
  3210. angular.module("prerender.header", []).directive("prerenderHeader", ["$location", function(e) {
  3211.     return {
  3212.         restrict: "A",
  3213.         link: function(t, o, r) {
  3214.             var a = e.absUrl();
  3215.             t.$on("$stateChangeSuccess", function(t, o) {
  3216.                 var n = e.absUrl();
  3217.                 "notFound" !== o.name && a !== n && r.$set("content", "Location: " + n)
  3218.             })
  3219.         }
  3220.     }
  3221. }
  3222. ]),
  3223. angular.module("prerender", ["prerender.header", "prerender.ready", "prerender.status.code"]),
  3224. angular.module("head.title", ["head.service"]).directive("title", ["Head", function(e) {
  3225.     return {
  3226.         restrict: "E",
  3227.         link: function(t, o) {
  3228.             function r(e) {
  3229.                 o.html(e)
  3230.             }
  3231.             t.$watch(e.getFullTitle, r)
  3232.         }
  3233.     }
  3234. }
  3235. ]),
  3236. angular.module("head", ["head.content", "head.service", "head.title", "head.url"]),
  3237. angular.module("head.url", []).directive("habboHeadUrl", ["$location", function(e) {
  3238.     return {
  3239.         restrict: "A",
  3240.         link: function(t, o, r) {
  3241.             function a() {
  3242.                 return e.absUrl()
  3243.             }
  3244.             function n(e) {
  3245.                 r.$set(r.habboHeadUrl, e)
  3246.             }
  3247.             t.$watch(a, n)
  3248.         }
  3249.     }
  3250. }
  3251. ]),
  3252. angular.module("head.content", ["head.service"]).constant("META_ATTRS", {
  3253.     "og:title": "title",
  3254.     "og:description": "description",
  3255.     "og:image": "image",
  3256.     "og:image:height": "imageHeight",
  3257.     "og:image:width": "imageWidth",
  3258.     "twitter:title": "title",
  3259.     "twitter:description": "description",
  3260.     "twitter:card": "twitter:card",
  3261.     "twitter:image": "image",
  3262.     name: "title",
  3263.     description: "description",
  3264.     image: "image"
  3265. }).directive("content", ["Head", "META_ATTRS", function(e, t) {
  3266.     return {
  3267.         restrict: "A",
  3268.         link: function(o, r, a) {
  3269.             function n() {
  3270.                 return e[s]
  3271.             }
  3272.             function i(e) {
  3273.                 a.$set("content", e)
  3274.             }
  3275.             var s = t[a.name || a.property || a.itemprop];
  3276.             s && o.$watch(n, i)
  3277.         }
  3278.     }
  3279. }
  3280. ]),
  3281. angular.module("head.service", ["locale", "ui.router"]).constant("HEAD_DEFAULTS", {
  3282.     title: "Habbo",
  3283.     description: "Registreer je GRATIS in 's werelds grootste virtuele hotel! Ontmoet en maak vrienden, chat met anderen, maak je eigen avatar, ontwerp je eigen kamer en nog veel meer ...",
  3284.     image: "https://habboo-a.akamaihd.net/habbo-web/america/nl/assets/images/app_summary_image-1200x628.85a9f5dc.png",
  3285.     imageHeight: 628,
  3286.     imageWidth: 1200,
  3287.     "twitter:card": "summary_large_image"
  3288. }).factory("Head", ["$translate", "HEAD_DEFAULTS", function(e, t) {
  3289.     var o = {}
  3290.       , r = " - Habbo";
  3291.     return o.setDefaults = function() {
  3292.         o.title = t.title,
  3293.         o.title = t.title,
  3294.         o.description = t.description,
  3295.         o.image = t.image,
  3296.         o.imageHeight = t.imageHeight,
  3297.         o.imageWidth = t.imageWidth,
  3298.         o["twitter:card"] = t["twitter:card"]
  3299.     }
  3300.     ,
  3301.     o.set = function(e, t) {
  3302.         var r = e || {};
  3303.         r.title && o.setTitle(r.title, t),
  3304.         r.description && (o.description = r.description),
  3305.         r.image && (o.image = r.image),
  3306.         r.imageHeight && (o.imageHeight = r.imageHeight),
  3307.         r.imageWidth && (o.imageWidth = r.imageWidth),
  3308.         r["twitter:card"] && (o["twitter:card"] = r["twitter:card"])
  3309.     }
  3310.     ,
  3311.     o.setTitle = function(t, r) {
  3312.         e(t, r).then(function(e) {
  3313.             o.title = e
  3314.         })
  3315.     }
  3316.     ,
  3317.     o.getFullTitle = function() {
  3318.         return "Habbo" === o.title ? o.title : o.title + r
  3319.     }
  3320.     ,
  3321.     o
  3322. }
  3323. ]).run(["$rootScope", "Head", function(e, t) {
  3324.     e.$on("$stateChangeStart", function() {
  3325.         t.setDefaults()
  3326.     }),
  3327.     e.$on("$stateChangeSuccess", function(e, o, r) {
  3328.         t.set(o.data, r)
  3329.     })
  3330. }
  3331. ]),
  3332. angular.module("ban.error", ["ban.message", "ban.redirect"]),
  3333. angular.module("ban.redirect", ["locale", "security"]).factory("banRedirect", ["$injector", "$q", function(e, t) {
  3334.     function o(e) {
  3335.         var t = e.status
  3336.           , o = e.data && e.data.message;
  3337.         return (403 === t || 401 === t) && r(o)
  3338.     }
  3339.     function r(e) {
  3340.         return _.includes(i, e)
  3341.     }
  3342.     function a(t) {
  3343.         var o = t.data;
  3344.         return n = n || e.get("security"),
  3345.         n.forceLogout("/?error=banned&" + $.param(o))
  3346.     }
  3347.     var n, i = ["login.user_banned", "login.identity_banned", "login.avatar_banned", "user.identity_banned", "user.avatar_banned"], s = {};
  3348.     return s.responseError = function(e) {
  3349.         return o(e) ? a(e) : t.reject(e)
  3350.     }
  3351.     ,
  3352.     s
  3353. }
  3354. ]).config(["$httpProvider", function(e) {
  3355.     e.interceptors.push("banRedirect")
  3356. }
  3357. ]),
  3358. angular.module("ban.message", ["locale", "notifier"]).factory("banMessage", ["$q", "$translate", "dateFilter", "notifier", function(e, t, o, r) {
  3359.     function a(e, t, o) {
  3360.         var r = _(e).includes("avatar_banned") ? "USER_AVATAR" : "USER_IDENTITY";
  3361.         return r += t ? "_PERMANENT_BAN_TEXT" : "_BAN_TEXT",
  3362.         o && (r += "_WITH_GUIDE"),
  3363.         r
  3364.     }
  3365.     var n = {};
  3366.     return n.show = function(n) {
  3367.         if ("banned" === n.error) {
  3368.             var i = n.sanctionReasonId ? "CFH_REASON_" + n.sanctionReasonId.toUpperCase() : "CFH_REASON_AUTO_TRIGGER"
  3369.               , s = "true" === n.permanentBan ? "CFH_REASON_RESOLVED_TARGET_BAN_PERMANENT" : "CFH_REASON_RESOLVED_TARGET_BAN"
  3370.               , l = "MODERATOR_MSG_POSTFIX";
  3371.             return e.all([t(s), t(i), t(l)]).then(function(e) {
  3372.                 var t = e[0]
  3373.                   , i = e[1]
  3374.                   , s = e[2]
  3375.                   , l = -1 === t.indexOf("%") ? t : t.substring(0, t.indexOf("%"))
  3376.                   , c = n.reason;
  3377.                 _.endsWith(n.reason, s) && -1 !== n.reason.indexOf(i) && _.startsWith(n.reason, l) || (c = i);
  3378.                 var u = n.expiryTime
  3379.                   , d = {
  3380.                     message: n.message,
  3381.                     avatarName: n.avatarName,
  3382.                     reason: c,
  3383.                     expiryTime: u ? o(u, "short") : u,
  3384.                     permanentBan: "true" === n.permanentBan,
  3385.                     provideExtraSupport: "true" === n.provideExtraSupport
  3386.                 }
  3387.                   , m = a(d.message, d.permanentBan, d.provideExtraSupport);
  3388.                 r.errorSticky("USER_BAN_TITLE", m, d)
  3389.             })
  3390.         }
  3391.     }
  3392.     ,
  3393.     n
  3394. }
  3395. ]).run(["$location", "banMessage", function(e, t) {
  3396.     t.show(e.search())
  3397. }
  3398. ]),
  3399. angular.module("room.restricted", ["locale", "templates"]).component("habboRoomRestricted", {
  3400.     bindings: {
  3401.         room: "<"
  3402.     },
  3403.     controllerAs: "RoomRestrictedController",
  3404.     templateUrl: "room/room-restricted/room-restricted.html"
  3405. }),
  3406. angular.module("room.picture", ["templates"]).component("habboRoomPicture", {
  3407.     bindings: {
  3408.         url: "@"
  3409.     },
  3410.     templateUrl: "room/room-picture/room-picture.html",
  3411.     controllerAs: "RoomPictureController"
  3412. }),
  3413. angular.module("room.open", ["avatar", "locale", "official.room.avatar", "room.info", "room.picture", "templates"]).component("habboRoomOpen", {
  3414.     bindings: {
  3415.         room: "<"
  3416.     },
  3417.     controllerAs: "RoomOpenController",
  3418.     templateUrl: "room/room-open/room-open.html",
  3419.     controller: ["$window", function(e) {
  3420.         var t = this
  3421.           , o = e.btoa(t.room.name.replace(/[^\x00-\x7F]/g, "").trim());
  3422.         t.room.hotelReportLink = "/hotel?link=navigator/report/" + t.room.uniqueId + "/" + o
  3423.     }
  3424.     ]
  3425. }),
  3426. angular.module("room.info", ["templates"]).component("habboRoomInfo", {
  3427.     bindings: {
  3428.         description: "@",
  3429.         tags: "<"
  3430.     },
  3431.     templateUrl: "room/room-info/room-info.html",
  3432.     controllerAs: "RoomInfoController"
  3433. }),
  3434. angular.module("registration.policies", ["locale", "templates"]).component("habboPolicies", {
  3435.     require: {
  3436.         FormController: "^form"
  3437.     },
  3438.     bindings: {
  3439.         policies: "="
  3440.     },
  3441.     controllerAs: "PoliciesController",
  3442.     templateUrl: "registration/policies/policies.html"
  3443. }),
  3444. angular.module("registration.partner", ["locale", "templates"]).component("habboPartnerRegistration", {
  3445.     bindings: {
  3446.         value: "="
  3447.     },
  3448.     controller: function() {
  3449.         var e = this;
  3450.         e.value = !0
  3451.     },
  3452.     controllerAs: "PartnerRegistrationController",
  3453.     templateUrl: "registration/partner-registration/partner-registration.html"
  3454. }),
  3455. angular.module("birthdate.filters", []).filter("daysInMonth", function() {
  3456.     var e = [4, 6, 9, 11];
  3457.     return function(t, o, r) {
  3458.         return o = parseInt(o, 10),
  3459.         r = parseInt(r, 10),
  3460.         2 === o ? moment([r]).isLeapYear() ? _(t).take(29).value() : _(t).take(28).value() : _(e).includes(o) ? _(t).take(30).value() : t
  3461.     }
  3462. }),
  3463. angular.module("birthdate", ["ngMessages", "birthdate.filters", "locale", "templates"]).component("habboBirthdate", {
  3464.     require: {
  3465.         FormController: "^form"
  3466.     },
  3467.     bindings: {
  3468.         birthdate: "="
  3469.     },
  3470.     controller: ["$scope", "daysInMonthFilter", function(e, t) {
  3471.         var o = 7
  3472.           , r = 1900
  3473.           , a = (new Date).getFullYear() - o
  3474.           , n = this;
  3475.         n.days = _.range(1, 32),
  3476.         n.months = [{
  3477.             value: 1,
  3478.             translationKey: "MONTH_JANUARY"
  3479.         }, {
  3480.             value: 2,
  3481.             translationKey: "MONTH_FEBRUARY"
  3482.         }, {
  3483.             value: 3,
  3484.             translationKey: "MONTH_MARCH"
  3485.         }, {
  3486.             value: 4,
  3487.             translationKey: "MONTH_APRIL"
  3488.         }, {
  3489.             value: 5,
  3490.             translationKey: "MONTH_MAY"
  3491.         }, {
  3492.             value: 6,
  3493.             translationKey: "MONTH_JUNE"
  3494.         }, {
  3495.             value: 7,
  3496.             translationKey: "MONTH_JULY"
  3497.         }, {
  3498.             value: 8,
  3499.             translationKey: "MONTH_AUGUST"
  3500.         }, {
  3501.             value: 9,
  3502.             translationKey: "MONTH_SEPTEMBER"
  3503.         }, {
  3504.             value: 10,
  3505.             translationKey: "MONTH_OCTOBER"
  3506.         }, {
  3507.             value: 11,
  3508.             translationKey: "MONTH_NOVEMBER"
  3509.         }, {
  3510.             value: 12,
  3511.             translationKey: "MONTH_DECEMBER"
  3512.         }],
  3513.         n.years = _.range(r, a).reverse(),
  3514.         e.$watchGroup(["BirthdateController.month", "BirthdateController.year"], function(e) {
  3515.             var o = parseInt(n.day, 10)
  3516.               , r = e[0]
  3517.               , a = e[1];
  3518.             _(t(n.days, r, a)).includes(o) || (n.day = "")
  3519.         }),
  3520.         e.$watchGroup(["BirthdateController.day", "BirthdateController.month", "BirthdateController.year"], function(e) {
  3521.             var t = parseInt(e[0], 10)
  3522.               , o = parseInt(e[1], 10)
  3523.               , r = parseInt(e[2], 10);
  3524.             _.isNaN(t) || _.isNaN(o) || _.isNaN(r) ? n.FormController.birthdate.$pristine || n.FormController.birthdate.$setViewValue(null ) : n.FormController.birthdate.$setViewValue({
  3525.                 day: t,
  3526.                 month: o,
  3527.                 year: r
  3528.             })
  3529.         })
  3530.     }
  3531.     ],
  3532.     controllerAs: "BirthdateController",
  3533.     templateUrl: "registration/birthdate/birthdate.html"
  3534. }),
  3535. angular.module("profile.modal", ["by.name.description.or.motto.filter", "empty.results", "form", "locale", "profile.item.lists", "templates", "ui.bootstrap"]).controller("ProfileModalController", ["items", "type", function(e, t) {
  3536.     var o = this;
  3537.     o.items = e,
  3538.     o.type = t
  3539. }
  3540. ]).component("habboProfileModal", {
  3541.     bindings: {
  3542.         items: "<",
  3543.         type: "@"
  3544.     },
  3545.     controller: ["$uibModal", function(e) {
  3546.         var t = this;
  3547.         t.openModal = function() {
  3548.             e.open({
  3549.                 transclude: !0,
  3550.                 templateUrl: "profile/profile-modal/profile-modal.html",
  3551.                 controller: "ProfileModalController",
  3552.                 controllerAs: "ProfileModalController",
  3553.                 resolve: {
  3554.                     items: _.constant(t.items),
  3555.                     type: _.constant(t.type)
  3556.                 }
  3557.             })
  3558.         }
  3559.     }
  3560.     ],
  3561.     controllerAs: "ProfileModalComponentController",
  3562.     template: '<a ng-click="ProfileModalComponentController.openModal()" class="profile-modal__link" translate="SEE_ALL"></a>'
  3563. }),
  3564. angular.module("profile.header", ["encode.uri.component", "imager", "templates"]).component("habboProfileHeader", {
  3565.     bindings: {
  3566.         figure: "@",
  3567.         user: "@",
  3568.         motto: "@",
  3569.         profile: "@"
  3570.     },
  3571.     controller: function() {
  3572.         var e = this;
  3573.         e.isCroco = function(e) {
  3574.             return Boolean(e) && "crikey" === e.toLowerCase()
  3575.         }
  3576.     },
  3577.     controllerAs: "ProfileHeaderController",
  3578.     templateUrl: "profile/profile-header/profile-header.html",
  3579.     transclude: !0
  3580. }),
  3581. angular.module("profile.item.lists", ["badge", "by.name.description.or.motto.filter", "encode.uri.component", "flash", "group.badge", "imager", "infinite-scroll", "room.icon", "templates"]).component("habboBadgeList", {
  3582.     bindings: {
  3583.         badges: "<",
  3584.         query: "<"
  3585.     },
  3586.     controllerAs: "BadgeListController",
  3587.     templateUrl: "profile/item-lists/badges.html"
  3588. }).component("habboFriendList", {
  3589.     bindings: {
  3590.         friends: "<",
  3591.         query: "<"
  3592.     },
  3593.     controllerAs: "FriendListController",
  3594.     templateUrl: "profile/item-lists/friends.html"
  3595. }).component("habboRoomList", {
  3596.     bindings: {
  3597.         rooms: "<",
  3598.         query: "<"
  3599.     },
  3600.     controllerAs: "RoomListController",
  3601.     templateUrl: "profile/item-lists/rooms.html"
  3602. }).component("habboGroupList", {
  3603.     bindings: {
  3604.         groups: "<",
  3605.         query: "<"
  3606.     },
  3607.     controllerAs: "GroupListController",
  3608.     templateUrl: "profile/item-lists/groups.html"
  3609. }),
  3610. angular.module("creation", ["creation.content", "creation.service", "header", "locale", "profile.header", "router", "social.share", "templates"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  3611.     var o = ["$q", "$stateParams", "creations", function(e, t, o) {
  3612.         var r = _.findIndex(o, {
  3613.             id: t.creationId
  3614.         });
  3615.         return r >= 0 ? r : e.reject()
  3616.     }
  3617.     ];
  3618.     e.statePublic("photo", {
  3619.         url: "/profile/:name/photo/:creationId?pool",
  3620.         controller: "CreationController",
  3621.         controllerAs: "CreationController",
  3622.         onEnter: ["creations", "index", "Head", function(e, t, o) {
  3623.             o.setTitle("HEAD_TITLE_PHOTO", {
  3624.                 name: e[t].creator_name
  3625.             }),
  3626.             o.image = e[t].url,
  3627.             o.imageHeight = e[t].contentHeight,
  3628.             o.imageWidth = e[t].contentWidth
  3629.         }
  3630.         ],
  3631.         resolve: {
  3632.             creations: ["$stateParams", "Creations", function(e, t) {
  3633.                 return t.photos({
  3634.                     pool: e.pool,
  3635.                     name: e.name
  3636.                 })
  3637.             }
  3638.             ],
  3639.             index: o
  3640.         },
  3641.         templateUrl: "profile/creation/creation.html"
  3642.     }),
  3643.     e.statePublic("story", {
  3644.         url: "/profile/:name/story/:creationId?pool",
  3645.         controller: "CreationController",
  3646.         controllerAs: "CreationController",
  3647.         onEnter: ["creations", "index", "Head", function(e, t, o) {
  3648.             var r = e[t];
  3649.             "SELFIE" === r.type ? o.setTitle("HEAD_TITLE_SELFIE", {
  3650.                 name: r.creator_name
  3651.             }) : o.setTitle("HEAD_TITLE_CREATION", {
  3652.                 creation: r.title,
  3653.                 name: r.creator_name
  3654.             }),
  3655.             o.image = r.url,
  3656.             o.imageHeight = r.contentHeight,
  3657.             o.imageWidth = r.contentWidth
  3658.         }
  3659.         ],
  3660.         resolve: {
  3661.             creations: ["$stateParams", "Creations", function(e, t) {
  3662.                 return t.stories({
  3663.                     pool: e.pool,
  3664.                     name: e.name
  3665.                 })
  3666.             }
  3667.             ],
  3668.             index: o
  3669.         },
  3670.         templateUrl: "profile/creation/creation.html"
  3671.     }),
  3672.     t.when("/profile/:name/creation/:id", "/profile/:name/story/:id")
  3673. }
  3674. ]).controller("CreationController", ["$scope", "creations", "index", "scrolltop", function(e, t, o, r) {
  3675.     var a = this;
  3676.     a.creation = t[o],
  3677.     a.next = t[o + 1],
  3678.     a.previous = t[o - 1],
  3679.     e.$on("$stateChangeStart", function(e, t) {
  3680.         "photo" === t.name || "story" === t.name ? r.setEnabled(!1) : r.setEnabled(!0)
  3681.     })
  3682. }
  3683. ]),
  3684. angular.module("creation.content", ["creation.href", "like", "locale", "navigate.to.on.key", "photo.delete", "report", "security", "templates"]).component("habboCreationContent", {
  3685.     bindings: {
  3686.         creation: "<",
  3687.         previous: "<",
  3688.         next: "<"
  3689.     },
  3690.     controller: ["Session", function(e) {
  3691.         var t = this;
  3692.         t.isDeletable = function() {
  3693.             return e.isCurrentUser(t.creation.creator_uniqueId)
  3694.         }
  3695.     }
  3696.     ],
  3697.     controllerAs: "CreationContentController",
  3698.     templateUrl: "profile/creation/creation-content.html"
  3699. }),
  3700. angular.module("creation.service", ["photos.service", "profile.creations"]).factory("Creations", ["CreationsProfile", "Photos", function(e, t) {
  3701.     var o = {};
  3702.     return o.photos = function(o) {
  3703.         return "photos" === o.pool ? t.query().$promise : e.photosForUser(o.name)
  3704.     }
  3705.     ,
  3706.     o.stories = function(t) {
  3707.         return e.storiesForUser(t.name)
  3708.     }
  3709.     ,
  3710.     o
  3711. }
  3712. ]),
  3713. angular.module("client.messenger", []).factory("clientMessenger", function() {
  3714.     function e(e) {
  3715.         a.postMessage({
  3716.             call: "open-link",
  3717.             target: e.link
  3718.         }, "*")
  3719.     }
  3720.     function t(e) {
  3721.         a.postMessage({
  3722.             call: "open-room",
  3723.             target: e.room
  3724.         }, "*")
  3725.     }
  3726.     function o(e) {
  3727.         a.postMessage({
  3728.             call: "interstitial-status",
  3729.             target: e.interstitial
  3730.         }, "*")
  3731.     }
  3732.     var r = {}
  3733.       , a = null
  3734.       , n = {
  3735.         link: e,
  3736.         room: t,
  3737.         interstitial: o
  3738.     };
  3739.     return r.init = function(e) {
  3740.         a = e
  3741.     }
  3742.     ,
  3743.     r.handle = function(e) {
  3744.         var t = _(e).pickBy(_.isString).keys().head()
  3745.           , o = n[t];
  3746.         o && o(e)
  3747.     }
  3748.     ,
  3749.     r
  3750. }),
  3751. angular.module("client.listener", ["client.heartbeat.ping.service", "interstitial", "notifier", "security"]).factory("clientListener", ["$location", "$rootScope", "EVENTS", "Session", "clientHeartbeatPing", "interstitial", "notifier", "security", function(e, t, o, r, a, n, i, s) {
  3752.     function l() {
  3753.         C = !0
  3754.     }
  3755.     function c() {
  3756.         y = moment(),
  3757.         (null === E || moment().diff(E, "seconds") > _) && (E = moment(),
  3758.         a.ping())
  3759.     }
  3760.     function u() {
  3761.         s.logout()["catch"](function() {
  3762.             t.$emit(o.clientClose),
  3763.             i.errorSticky("ERROR_LOGOUT_TITLE", "ERROR_LOGOUT_TEXT")
  3764.         })
  3765.     }
  3766.     function d(t) {
  3767.         e.url(t)
  3768.     }
  3769.     function m(e) {
  3770.         r.update({
  3771.             figureString: e
  3772.         })
  3773.     }
  3774.     function p(e) {
  3775.         r.update({
  3776.             name: e
  3777.         })
  3778.     }
  3779.     function h() {
  3780.         return moment().diff(y, "seconds") < 60
  3781.     }
  3782.     function b() {
  3783.         n.start("midroll")
  3784.     }
  3785.     function f(e) {
  3786.         r.update({
  3787.             buildersClubMember: e
  3788.         })
  3789.     }
  3790.     function g(e) {
  3791.         r.update({
  3792.             habboClubMember: e
  3793.         })
  3794.     }
  3795.     var _ = 300
  3796.       , v = {}
  3797.       , C = !1
  3798.       , y = null
  3799.       , E = null
  3800.       , S = {
  3801.         disconnect: l,
  3802.         heartbeat: c,
  3803.         logout: u,
  3804.         "open-page": d,
  3805.         "update-figure": m,
  3806.         "update-name": p,
  3807.         "show-interstitial": b,
  3808.         "update-builders-club": f,
  3809.         "update-habbo-club": g
  3810.     };
  3811.     return v.init = function() {
  3812.         C = !1,
  3813.         y = null
  3814.     }
  3815.     ,
  3816.     v.handle = function(e) {
  3817.         var t = S[e.call];
  3818.         t && t(e.target)
  3819.     }
  3820.     ,
  3821.     v.isAlive = function() {
  3822.         return Boolean(y) && h()
  3823.     }
  3824.     ,
  3825.     v.hasDied = function() {
  3826.         return Boolean(y) && !h()
  3827.     }
  3828.     ,
  3829.     v.hasDisconnected = function() {
  3830.         return C
  3831.     }
  3832.     ,
  3833.     v
  3834. }
  3835. ]),
  3836. angular.module("client.heartbeat.ping.service", ["config"]).factory("clientHeartbeatPing", ["$http", "CONFIG", function(e, t) {
  3837.     var o = {};
  3838.     return o.ping = function() {
  3839.         return e.get(t.apiUrl + "/user/ping")
  3840.     }
  3841.     ,
  3842.     o
  3843. }
  3844. ]),
  3845. angular.module("client.communication", ["client.listener", "client.messenger", "events"]).directive("habboClientCommunication", ["$timeout", "$window", "EVENTS", "clientListener", "clientMessenger", function(e, t, o, r, a) {
  3846.     return {
  3847.         restrict: "A",
  3848.         link: function(n, i) {
  3849.             function s(t) {
  3850.                 e(function() {
  3851.                     r.handle(t.originalEvent.data)
  3852.                 })
  3853.             }
  3854.             var l = i.get(0).contentWindow;
  3855.             a.init(l),
  3856.             n.$on(o.clientOpen, function(e, t) {
  3857.                 var o = n.$watch(r.isAlive, function(e) {
  3858.                     e && (a.handle(t),
  3859.                     o())
  3860.                 });
  3861.                 r.init()
  3862.             }),
  3863.             angular.element(t).on("message", s),
  3864.             i.on("$destroy", function() {
  3865.                 angular.element(t).off("message", s)
  3866.             })
  3867.         }
  3868.     }
  3869. }
  3870. ]),
  3871. angular.module("client", ["client.component", "client.disable.scrollbars"]),
  3872. angular.module("client.disable.scrollbars", ["events"]).directive("habboClientDisableScrollbars", ["EVENTS", function(e) {
  3873.     return {
  3874.         restrict: "A",
  3875.         link: function(t, o) {
  3876.             t.$on(e.clientOpen, function() {
  3877.                 o.css("overflow", "hidden")
  3878.             }),
  3879.             t.$on(e.clientClose, function() {
  3880.                 o.css("overflow", "")
  3881.             })
  3882.         }
  3883.     }
  3884. }
  3885. ]),
  3886. angular.module("client.component", ["angularScreenfull", "client.close.expander", "client.close.fullscreen.on.hide", "client.closed", "client.communication", "client.error", "client.reload", "client.service", "events", "flash", "interstitial", "locale", "notifier", "router", "security", "storage", "system.data", "templates"]).component("habboClient", {
  3887.     controller: ["$location", "$rootScope", "$scope", "$state", "Client", "EVENTS", "Session", "SystemData", "clientListener", "flash", "interstitial", "localStorage", "notifier", function(e, t, o, r, a, n, i, s, l, c, u, d, m) {
  3888.         function p() {
  3889.             var e = d.get("hotelLastAccess");
  3890.             return moment().subtract(60, "minutes").isBefore(e)
  3891.         }
  3892.         function h() {
  3893.             return g.client = a.get(),
  3894.             g.running = !0,
  3895.             g.client.$promise["catch"](function() {
  3896.                 g.running = !1,
  3897.                 m.error("ERROR_SERVER")
  3898.             })
  3899.         }
  3900.         function b(e) {
  3901.             e && (g.running = !1)
  3902.         }
  3903.         function f() {
  3904.             !_ && i.hasPreRollAd() && (u.start("preroll"),
  3905.             _ = !0)
  3906.         }
  3907.         var g = this
  3908.           , _ = !1;
  3909.         g.visible = !1,
  3910.         g.flashEnabled = c.isEnabled(),
  3911.         g.isOpen = s.isHotelOpen(),
  3912.         p() || "/logout" === e.path() || h(),
  3913.         g.close = function() {
  3914.             t.$broadcast(n.clientClose)
  3915.         }
  3916.         ,
  3917.         g.reload = function() {
  3918.             t.$broadcast(n.clientOpen)
  3919.         }
  3920.         ,
  3921.         o.$on(n.clientOpen, function() {
  3922.             f(),
  3923.             g.running || h(),
  3924.             d.set("hotelLastAccess", Date.now()),
  3925.             g.visible = !0
  3926.         }),
  3927.         o.$on(n.clientClose, function(e, t) {
  3928.             g.visible = !1,
  3929.             t || r.back()
  3930.         }),
  3931.         o.$on("$stateChangeSuccess", function(e, o, r, a) {
  3932.             "hotel" === a.name && t.$broadcast(n.clientClose, !0)
  3933.         }),
  3934.         o.$watch(l.hasDied, b),
  3935.         o.$watch(l.hasDisconnected, b)
  3936.     }
  3937.     ],
  3938.     controllerAs: "ClientController",
  3939.     templateUrl: "hotel/client/client.html"
  3940. }),
  3941. angular.module("client.close.fullscreen.on.hide", ["angularScreenfull", "events"]).directive("habboClientCloseFullscreenOnHide", ["EVENTS", function(e) {
  3942.     return {
  3943.         restrict: "A",
  3944.         require: "ngsfFullscreen",
  3945.         link: function(t, o, r, a) {
  3946.             t.$on(e.clientClose, function() {
  3947.                 a.isFullscreen() && a.toggleFullscreen()
  3948.             })
  3949.         }
  3950.     }
  3951. }
  3952. ]),
  3953. angular.module("client.service", ["ngResource", "config"]).factory("Client", ["$resource", "CONFIG", function(e, t) {
  3954.     return e(t.apiUrl + "/client/clienturl")
  3955. }
  3956. ]),
  3957. angular.module("register.banner", ["air.download.link", "local.register.banner", "locale", "templates"]).component("habboRegisterBanner", {
  3958.     templateUrl: "home/register-banner/register-banner.html"
  3959. }),
  3960. angular.module("promos.service", ["config"]).factory("promos", ["$http", "$q", "CONFIG", function(e, t, o) {
  3961.     return {
  3962.         get: function() {
  3963.             var r = o.habboWebNewsUrl + "front.html";
  3964.             return e.get(r).then(function(e) {
  3965.                 return {
  3966.                     html: e.data
  3967.                 }
  3968.             })["catch"](function() {
  3969.                 return t.when({
  3970.                     html: ""
  3971.                 })
  3972.             })
  3973.         }
  3974.     }
  3975. }
  3976. ]),
  3977. angular.module("news", ["ad.unit", "compile", "locale", "moderation.notification", "promos.service", "router", "templates", "web.pages"]).config(["$stateProvider", function(e) {
  3978.     e.statePublic("home.news", {
  3979.         url: "/",
  3980.         controller: "NewsController",
  3981.         controllerAs: "NewsController",
  3982.         data: {
  3983.             title: "HEAD_TITLE_NEWS"
  3984.         },
  3985.         resolve: {
  3986.             promos: ["promos", function(e) {
  3987.                 return e.get()
  3988.             }
  3989.             ]
  3990.         },
  3991.         parent: "home",
  3992.         templateUrl: "home/news/news.html"
  3993.     })
  3994. }
  3995. ]).controller("NewsController", ["promos", function(e) {
  3996.     var t = this;
  3997.     t.promos = e.html
  3998. }
  3999. ]),
  4000. angular.module("messaging", ["discussions", "locale", "router", "templates", "user.service"]).config(["$stateProvider", function(e) {
  4001.     e.statePrivate("home.messaging", {
  4002.         url: "/messaging",
  4003.         controller: "MessagingController",
  4004.         controllerAs: "MessagingController",
  4005.         data: {
  4006.             title: "HEAD_TITLE_MESSAGING"
  4007.         },
  4008.         resolve: {
  4009.             discussions: ["User", function(e) {
  4010.                 return e.discussions().$promise
  4011.             }
  4012.             ]
  4013.         },
  4014.         parent: "home",
  4015.         templateUrl: "home/messaging/messaging.html"
  4016.     })
  4017. }
  4018. ]).controller("MessagingController", ["discussions", function(e) {
  4019.     var t = this;
  4020.     t.discussions = e
  4021. }
  4022. ]),
  4023. angular.module("user.service", ["ngResource", "config", "storage"]).factory("User", ["$resource", "CONFIG", "httpCache", function(e, t, o) {
  4024.     return e(t.apiUrl + "/user/:resource", null , {
  4025.         discussions: {
  4026.             method: "GET",
  4027.             isArray: !0,
  4028.             params: {
  4029.                 resource: "discussions"
  4030.             },
  4031.             cache: o.shortCache
  4032.         }
  4033.     })
  4034. }
  4035. ]),
  4036. angular.module("email.report.unauthorized.service", ["config", "google.analytics"]).factory("reportUnauthorized", ["$http", "CONFIG", "googleAnalytics", function(e, t, o) {
  4037.     return function(r, a) {
  4038.         return e.get(t.apiUrl + "/public/email/unauthorized/" + r + "/" + a).then(function() {
  4039.             o.trackEvent("Email", "Unauthorized email reported")
  4040.         })
  4041.     }
  4042. }
  4043. ]),
  4044. angular.module("email.report.unauthorized", ["email.report.unauthorized.form", "header", "locale", "message.container", "router"]).config(["$stateProvider", function(e) {
  4045.     e.statePublic("reportUnauthorized", {
  4046.         url: "/identity/report_unauthorized_usage?email&hash",
  4047.         controller: "EmailReportUnauthorizedController",
  4048.         controllerAs: "EmailReportUnauthorizedController",
  4049.         data: {
  4050.             title: "HEAD_TITLE_EMAIL_REPORT_UNAUTHORIZED"
  4051.         },
  4052.         templateUrl: "email/email-report-unauthorized/email-report-unauthorized.html"
  4053.     })
  4054. }
  4055. ]).controller("EmailReportUnauthorizedController", ["$stateParams", function(e) {
  4056.     var t = this;
  4057.     t.email = e.email,
  4058.     t.hash = e.hash
  4059. }
  4060. ]),
  4061. angular.module("email.report.unauthorized.form", ["email.report.unauthorized.service", "locale", "notifier", "router", "templates"]).component("habboEmailReportUnauthorizedForm", {
  4062.     bindings: {
  4063.         emailaddress: "<",
  4064.         hash: "<"
  4065.     },
  4066.     controller: ["$state", "notifier", "reportUnauthorized", function(e, t, o) {
  4067.         var r = this;
  4068.         r.reportInProgress = !1,
  4069.         r.report = function() {
  4070.             r.reportInProgress = !0,
  4071.             o(r.emailaddress, r.hash).then(function() {
  4072.                 t.success("EMAIL_REPORT_UNAUTHORIZED_SUCCESS"),
  4073.                 e.go("home.news")
  4074.             })["catch"](function() {
  4075.                 t.error("ERROR_SERVER")
  4076.             })["finally"](function() {
  4077.                 r.reportInProgress = !1
  4078.             })
  4079.         }
  4080.     }
  4081.     ],
  4082.     controllerAs: "EmailReportUnauthorizedFormController",
  4083.     templateUrl: "email/email-report-unauthorized/email-report-unauthorized-form.html"
  4084. }),
  4085. angular.module("optout.service", ["config", "google.analytics"]).factory("optout", ["$http", "CONFIG", "googleAnalytics", function(e, t, o) {
  4086.     return function(r, a) {
  4087.         return e.get(t.apiUrl + "/public/email/optout/" + r + "/" + a).then(function() {
  4088.             o.trackEvent("Email", "Optout")
  4089.         })
  4090.     }
  4091. }
  4092. ]),
  4093. angular.module("email.optout", ["locale", "notifier", "optout.service", "router"]).config(["$stateProvider", function(e) {
  4094.     e.statePublic("optout", {
  4095.         url: "/email/marketing_off?email&hash",
  4096.         controller: "OptOutController",
  4097.         resolve: {
  4098.             optingout: ["$stateParams", "optout", function(e, t) {
  4099.                 return t(e.email, e.hash)
  4100.             }
  4101.             ]
  4102.         }
  4103.     })
  4104. }
  4105. ]).controller("OptOutController", ["$state", "notifier", function(e, t) {
  4106.     t.success("OPTOUT_SUCCESS"),
  4107.     e.go("home.news")
  4108. }
  4109. ]),
  4110. angular.module("rooms", ["avatar", "config", "leaderboard.service", "locale", "official.room.avatar", "router"]).config(["$stateProvider", function(e) {
  4111.     e.statePublic("community.rooms", {
  4112.         url: "/rooms",
  4113.         parent: "community",
  4114.         controller: "RoomsController",
  4115.         controllerAs: "RoomsController",
  4116.         templateUrl: "community/rooms/rooms.html",
  4117.         data: {
  4118.             title: "HEAD_TITLE_ROOMS"
  4119.         },
  4120.         resolve: {
  4121.             rooms: ["Leaderboard", "CONFIG", function(e, t) {
  4122.                 return e.get({
  4123.                     site: t.hotel,
  4124.                     leaderboard: "visited-rooms",
  4125.                     timeframe: "daily",
  4126.                     date: "latest"
  4127.                 }).$promise
  4128.             }
  4129.             ]
  4130.         }
  4131.     })
  4132. }
  4133. ]).controller("RoomsController", ["rooms", function(e) {
  4134.     var t = this;
  4135.     t.rooms = e
  4136. }
  4137. ]),
  4138. angular.module("photos", ["columns", "locale", "photos.service", "router"]).config(["$stateProvider", function(e) {
  4139.     e.statePublic("community.photos", {
  4140.         url: "/photos",
  4141.         parent: "community",
  4142.         controller: "PhotosController",
  4143.         controllerAs: "PhotosController",
  4144.         templateUrl: "community/photos/photos.html",
  4145.         data: {
  4146.             title: "HEAD_TITLE_PHOTOS"
  4147.         },
  4148.         resolve: {
  4149.             photos: ["Photos", function(e) {
  4150.                 return e.query().$promise
  4151.             }
  4152.             ]
  4153.         }
  4154.     })
  4155. }
  4156. ]).controller("PhotosController", ["photos", function(e) {
  4157.     var t = this;
  4158.     t.photos = e
  4159. }
  4160. ]),
  4161. angular.module("photos.service", ["ngResource", "config", "reported.photos", "safe.transform.response", "storage"]).factory("Photos", ["$resource", "CONFIG", "httpCache", "reportedPhotosFilter", "safeTransformResponse", function(e, t, o, r, a) {
  4162.     return e(t.extraDataUrl + "/public/photos", null , {
  4163.         query: {
  4164.             isArray: !0,
  4165.             cache: o.shortCache,
  4166.             transformResponse: a.fromJson(function(e) {
  4167.                 var t = r(e);
  4168.                 return _.map(t, function(e) {
  4169.                     return _.assign(e, {
  4170.                         url: "https:" + e.url,
  4171.                         contentWidth: 320,
  4172.                         contentHeight: 320,
  4173.                         parentTitle: "PHOTOS_TITLE",
  4174.                         pool: "photos"
  4175.                     })
  4176.                 })
  4177.             })
  4178.         }
  4179.     })
  4180. }
  4181. ]),
  4182. angular.module("fansites", ["ad.unit", "locale", "router", "templates", "web.pages"]).config(["$stateProvider", function(e) {
  4183.     e.statePublic("community.fansites", {
  4184.         url: "/fansites",
  4185.         controller: "FansitesController",
  4186.         controllerAs: "FansitesController",
  4187.         data: {
  4188.             title: "HEAD_TITLE_FANSITES"
  4189.         },
  4190.         resolve: {
  4191.             fansites: ["webPages", function(e) {
  4192.                 return e.get("community/fansites")
  4193.             }
  4194.             ]
  4195.         },
  4196.         parent: "community",
  4197.         templateUrl: "community/fansites/fansites.html"
  4198.     })
  4199. }
  4200. ]).controller("FansitesController", ["fansites", function(e) {
  4201.     var t = this;
  4202.     t.fansites = e
  4203. }
  4204. ]),
  4205. angular.module("category.service", ["config"]).factory("category", ["$http", "CONFIG", function(e, t) {
  4206.     return {
  4207.         get: function(o, r) {
  4208.             var a = o.replace(/-/g, "_")
  4209.               , n = t.habboWebNewsUrl + a + "_" + r + ".html";
  4210.             return e.get(n).then(function(e) {
  4211.                 return {
  4212.                     titleKey: angular.element(e.data).find(".news-category__link--active").attr("translate"),
  4213.                     html: e.data
  4214.                 }
  4215.             })
  4216.         }
  4217.     }
  4218. }
  4219. ]),
  4220. angular.module("category", ["ad.unit", "category.service", "compile", "locale", "router", "templates", "web.pages"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  4221.     e.statePublic("community.category", {
  4222.         url: "/category/{category:(?:[^/]+)}{archive:(?:/[^0-9lst/]+)?}/{page}",
  4223.         controller: "CategoryController",
  4224.         controllerAs: "CategoryController",
  4225.         onEnter: ["category", "Head", function(e, t) {
  4226.             t.setTitle(e.titleKey)
  4227.         }
  4228.         ],
  4229.         resolve: {
  4230.             category: ["$location", "$q", "$stateParams", "category", function(e, t, o, r) {
  4231.                 var a = o.archive.replace("/", "_");
  4232.                 return r.get(o.category + a, o.page)["catch"](function(r) {
  4233.                     return 0 !== a.length || "1" !== o.page && "last" !== o.page ? a.length > 0 && "1" === o.page ? (e.path("/community/category").replace(),
  4234.                     t.when({})) : t.reject(r) : (e.path("/community/category/" + o.category + "/archive/1").replace(),
  4235.                     t.when({}))
  4236.                 })
  4237.             }
  4238.             ]
  4239.         },
  4240.         parent: "community",
  4241.         templateUrl: "community/category/category.html"
  4242.     }),
  4243.     t.when("/community/category", "/community/category/all"),
  4244.     t.when("/community/category/:category", "/community/category/:category/1")
  4245. }
  4246. ]).controller("CategoryController", ["category", function(e) {
  4247.     var t = this;
  4248.     t.category = e.html
  4249. }
  4250. ]),
  4251. angular.module("article.service", ["config"]).factory("article", ["$http", "CONFIG", function(e, t) {
  4252.     return {
  4253.         get: function(o, r) {
  4254.             var a = r.replace(/-/g, "_")
  4255.               , n = t.habboWebNewsUrl + "articles/" + o + "_" + a + ".html";
  4256.             return e.get(n).then(function(e) {
  4257.                 var t = angular.element(e.data);
  4258.                 return {
  4259.                     title: t.find("h1, h2, h3, h4, h5, h6").eq(0).text(),
  4260.                     summary: t.find(".news-header__summary").text(),
  4261.                     image: t.find("img").eq(0).attr("src"),
  4262.                     html: e.data
  4263.                 }
  4264.             })
  4265.         }
  4266.     }
  4267. }
  4268. ]),
  4269. angular.module("article", ["ad.unit", "article.service", "compile", "lightbox", "locale", "router", "social.share", "templates", "web.pages"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  4270.     e.statePublic("community.article", {
  4271.         url: "/article/:id/:title",
  4272.         controller: "ArticleController",
  4273.         controllerAs: "ArticleController",
  4274.         onEnter: ["article", "Head", function(e, t) {
  4275.             t.title = e.title,
  4276.             t.description = e.summary,
  4277.             t.image = e.image,
  4278.             t.imageHeight = 300,
  4279.             t.imageWidth = 759
  4280.         }
  4281.         ],
  4282.         resolve: {
  4283.             article: ["$stateParams", "article", function(e, t) {
  4284.                 return t.get(e.id, e.title)
  4285.             }
  4286.             ]
  4287.         },
  4288.         parent: "community",
  4289.         templateUrl: "community/article/article.html"
  4290.     }),
  4291.     t.when("/article/:id/:slug", "/community/article/:id/:slug"),
  4292.     t.when("/articles/{id:[0-9]*}-{slug:[a-z-]*}", "/article/:id/:slug")
  4293. }
  4294. ]).controller("ArticleController", ["article", function(e) {
  4295.     var t = this;
  4296.     t.article = e.html
  4297. }
  4298. ]),
  4299. angular.module("zendesk.url", ["config", "security"]).filter("zendeskRedirectUrl", ["CONFIG", "Session", function(e, t) {
  4300.     var o = function(o, r) {
  4301.         return r === !0 || t.hasSession() && _(o).includes("help.habbo") ? e.apiUrl + "/public/help?returnTo=" + o : o
  4302.     }
  4303.     ;
  4304.     return o.$stateful = !0,
  4305.     o
  4306. }
  4307. ]),
  4308. angular.module("web.pages.service", ["config"]).factory("webPages", ["$http", "CONFIG", function(e, t) {
  4309.     return {
  4310.         get: function(o) {
  4311.             var r = t.habboWebPagesUrl + o + "." + t.lang + ".html";
  4312.             return e.get(r).then(function(e) {
  4313.                 return e.data
  4314.             })
  4315.         }
  4316.     }
  4317. }
  4318. ]),
  4319. angular.module("web.pages", ["web.pages.service"]).component("habboWebPages", {
  4320.     bindings: {
  4321.         key: "@"
  4322.     },
  4323.     controller: ["$animate", "$compile", "$element", "$scope", "webPages", function(e, t, o, r, a) {
  4324.         e.addClass(o, "ng-hide"),
  4325.         r.$watch("WebPagesController.key", function(n) {
  4326.             a.get(n).then(function(a) {
  4327.                 var n = o.children().first();
  4328.                 n.html(a),
  4329.                 t(n.contents())(r),
  4330.                 e.removeClass(o, "ng-hide")
  4331.             })
  4332.         })
  4333.     }
  4334.     ],
  4335.     controllerAs: "WebPagesController",
  4336.     template: '<aside class="static-content"></aside>'
  4337. }),
  4338. angular.module("tabs", ["locale", "tab", "templates"]).component("habboTabs", {
  4339.     bindings: {
  4340.         titleKey: "@"
  4341.     },
  4342.     controller: function() {
  4343.         var e = this;
  4344.         e.open = !1,
  4345.         e.tabs = [],
  4346.         e.activeTab = null ,
  4347.         e.setTab = function(t) {
  4348.             e.tabs.push(t)
  4349.         }
  4350.         ,
  4351.         e.setActive = function(t) {
  4352.             e.open = !1,
  4353.             e.activeTab = _.find(e.tabs, {
  4354.                 path: t
  4355.             })
  4356.         }
  4357.     },
  4358.     controllerAs: "TabsController",
  4359.     templateUrl: "common/tabs/tabs.html",
  4360.     transclude: !0
  4361. }),
  4362. angular.module("tab", ["locale", "templates"]).component("habboTab", {
  4363.     require: {
  4364.         HabboTabsController: "^habboTabs"
  4365.     },
  4366.     bindings: {
  4367.         path: "@",
  4368.         alternativePath: "@",
  4369.         strictPath: "@",
  4370.         translationKey: "@"
  4371.     },
  4372.     controller: ["$scope", "$location", function(e, t) {
  4373.         function o() {
  4374.             a.active = "true" === a.strictPath ? t.path() === a.path : r(),
  4375.             a.active && a.HabboTabsController.setActive(a.path)
  4376.         }
  4377.         function r() {
  4378.             return 0 === t.path().indexOf(a.path) || 0 === t.path().indexOf(a.alternativePath)
  4379.         }
  4380.         var a = this;
  4381.         a.open = !1,
  4382.         a.$onInit = function() {
  4383.             a.HabboTabsController.setTab({
  4384.                 path: a.path,
  4385.                 translationKey: a.translationKey
  4386.             }),
  4387.             o()
  4388.         }
  4389.         ,
  4390.         e.$on("$stateChangeSuccess", o)
  4391.     }
  4392.     ],
  4393.     controllerAs: "TabController",
  4394.     templateUrl: "common/tabs/tab.html"
  4395. }),
  4396. angular.module("system.data", []).factory("SystemData", ["$window", function(e) {
  4397.     var t = {};
  4398.     return t.geoLocation = {
  4399.         continent: e.geoLocation ? e.geoLocation.continent : null ,
  4400.         country: e.geoLocation ? e.geoLocation.country : null
  4401.     },
  4402.     t.getShopCountry = function() {
  4403.         return "gb" === t.geoLocation.country ? "uk" : t.geoLocation.country
  4404.     }
  4405.     ,
  4406.     t.isHotelOpen = function() {
  4407.         var t = e.systemData && e.systemData.open;
  4408.         return t !== !1
  4409.     }
  4410.     ,
  4411.     t.isIDCGamesCountry = function() {
  4412.         var t = e.partnerCodeInfo && e.partnerCodeInfo.partner;
  4413.         return "idcse" === t
  4414.     }
  4415.     ,
  4416.     t
  4417. }
  4418. ]),
  4419. angular.module("storage", ["cache", "local.storage"]),
  4420. angular.module("sticky.header", []).directive("habboStickyHeader", ["$window", function(e) {
  4421.     return {
  4422.         restrict: "A",
  4423.         link: function(t, o) {
  4424.             function r() {
  4425.                 var t = e.pageYOffset > 0 ? e.pageYOffset : 0
  4426.                   , r = i - t;
  4427.                 t <= o.height() ? o.addClass("sticky-header--top") : o.removeClass("sticky-header--top"),
  4428.                 0 === t && o.removeClass("sticky-header--fixed"),
  4429.                 r > 0 && a(r) && t > o.height() ? o.addClass("sticky-header--fixed") : 0 > r && a(r) && (o.hasClass("sticky-header--fixed") && o.addClass("sticky-header--hidden"),
  4430.                 o.removeClass("sticky-header--fixed")),
  4431.                 (o.hasClass("sticky-header--fixed") || o.hasClass("sticky-header--top")) && o.removeClass("sticky-header--hidden"),
  4432.                 i = t
  4433.             }
  4434.             function a(e) {
  4435.                 return Math.abs(e) > n
  4436.             }
  4437.             var n = 5
  4438.               , i = e.pageYOffset;
  4439.             i <= o.height() ? o.addClass("sticky-header sticky-header--top") : o.addClass("sticky-header sticky-header--fixed"),
  4440.             angular.element(e).on("orientationchange resize scroll", r),
  4441.             o.on("$destroy", function() {
  4442.                 angular.element(e).off("orientationchange resize scroll", r)
  4443.             })
  4444.         }
  4445.     }
  4446. }
  4447. ]),
  4448. angular.module("social.share", ["config", "google.analytics", "locale", "popup", "router", "templates"]).component("habboSocialShare", {
  4449.     controller: ["$location", "CONFIG", "Head", "googleAnalytics", "popup", function(e, t, o, r, a) {
  4450.         var n = this;
  4451.         n.shareOnFacebook = function() {
  4452.             var t = $.param({
  4453.                 u: e.absUrl()
  4454.             })
  4455.               , o = "http://www.facebook.com/sharer.php?" + t;
  4456.             r.trackSocial("Facebook", "Share", e.url()),
  4457.             a.open(o, 626, 436)
  4458.         }
  4459.         ,
  4460.         n.shareOnTwitter = function() {
  4461.             var n = $.param({
  4462.                 url: e.absUrl(),
  4463.                 text: o.title,
  4464.                 hashtags: "Habbo",
  4465.                 related: t.twitterAccount.substring(1)
  4466.             })
  4467.               , i = "https://twitter.com/intent/tweet?" + n;
  4468.             r.trackSocial("Twitter", "Tweet", e.url()),
  4469.             a.open(i, 550, 420)
  4470.         }
  4471.     }
  4472.     ],
  4473.     controllerAs: "SocialShareController",
  4474.     templateUrl: "common/social-share/social-share.html"
  4475. }),
  4476. angular.module("show.on.load", []).directive("habboShowOnLoad", function() {
  4477.     return {
  4478.         restrict: "A",
  4479.         link: function(e, t) {
  4480.             t.hide(),
  4481.             t.on("load", function() {
  4482.                 t.show()
  4483.             })
  4484.         }
  4485.     }
  4486. }),
  4487. angular.module("safe.transform.response", []).factory("safeTransformResponse", function() {
  4488.     var e = {};
  4489.     return e.fromJson = function(e) {
  4490.         return function(t) {
  4491.             var o;
  4492.             try {
  4493.                 return o = angular.fromJson(t),
  4494.                 e(o)
  4495.             } catch (r) {
  4496.                 return t
  4497.             }
  4498.         }
  4499.     }
  4500.     ,
  4501.     e
  4502. }),
  4503. angular.module("reported.photos.service", ["storage"]).factory("reportedPhotos", ["localStorage", function(e) {
  4504.     var t = "reportedPhotos"
  4505.       , o = {}
  4506.       , r = e.get(t) || [];
  4507.     return o.save = function(o) {
  4508.         r.push(o),
  4509.         e.set(t, r)
  4510.     }
  4511.     ,
  4512.     o.get = function() {
  4513.         return r
  4514.     }
  4515.     ,
  4516.     o
  4517. }
  4518. ]),
  4519. angular.module("reported.photos", ["reported.photos.service"]).filter("reportedPhotos", ["reportedPhotos", function(e) {
  4520.     return function(t) {
  4521.         var o = e.get();
  4522.         return _.filter(t, function(e) {
  4523.             return !_.includes(o, e.id)
  4524.         })
  4525.     }
  4526. }
  4527. ]),
  4528. angular.module("remove.on.error", []).directive("habboRemoveOnError", function() {
  4529.     return {
  4530.         restrict: "A",
  4531.         link: function(e, t) {
  4532.             t[0].onerror = function() {
  4533.                 t.remove()
  4534.             }
  4535.         }
  4536.     }
  4537. }),
  4538. angular.module("popup", []).factory("popup", ["$interval", "$q", "$window", function(e, t, o) {
  4539.     function r(e, t) {
  4540.         var r = o.innerWidth
  4541.           , i = o.innerHeight;
  4542.         return e = e || n,
  4543.         t = t || a,
  4544.         ["width=" + (r >= e ? e : r), "height=" + (i >= t ? t : i)].join(",")
  4545.     }
  4546.     var a = 768
  4547.       , n = 1024
  4548.       , i = {};
  4549.     return i.open = function(a, n, i) {
  4550.         var s = t.defer()
  4551.           , l = o.open(a, "_blank", r(n, i))
  4552.           , c = e(function() {
  4553.             l && !l.closed || (s.resolve(),
  4554.             e.cancel(c))
  4555.         }, 100);
  4556.         return s.promise
  4557.     }
  4558.     ,
  4559.     i
  4560. }
  4561. ]),
  4562. angular.module("official.room.avatar", ["locale", "templates"]).component("officialRoomAvatar", {
  4563.     templateUrl: "common/official-room-avatar/official-room-avatar.html"
  4564. }),
  4565. angular.module("notifier", ["locale"]).factory("notifier", ["$q", "$translate", function(e, t) {
  4566.     var o = {
  4567.         extendedTimeOut: 1e3,
  4568.         hideDuration: 300,
  4569.         positionClass: "toast-top-center",
  4570.         preventDuplicates: !0,
  4571.         progressBar: !0,
  4572.         showDuration: 300,
  4573.         timeOut: 2e4
  4574.     }
  4575.       , r = _.extend({}, o, {
  4576.         extendedTimeOut: 0,
  4577.         hideDuration: 0,
  4578.         positionClass: "toast-top-center toast-sticky",
  4579.         timeOut: 0,
  4580.         tapToDismiss: !1
  4581.     })
  4582.       , a = _.partialRight(toastr.success, "", o)
  4583.       , n = _.partialRight(toastr.error, "", o)
  4584.       , i = _.partialRight(toastr.error, r)
  4585.       , s = function(e) {
  4586.         return function(o, r) {
  4587.             t(o, r).then(e)["catch"](e)
  4588.         }
  4589.     }
  4590.       , l = function(o) {
  4591.         return function(r, a, n) {
  4592.             e.all([t(a, n), t(r), t("OK_BUTTON")]).then(function(e) {
  4593.                 var t = o(e[0] + '<button class="toast-button">' + e[2] + "</button>", e[1]);
  4594.                 t.delegate("button", "click", function() {
  4595.                     toastr.options.hideDuration = 0,
  4596.                     toastr.clear(t, {
  4597.                         force: !0
  4598.                     })
  4599.                 })
  4600.             })
  4601.         }
  4602.     }
  4603.     ;
  4604.     return {
  4605.         success: s(a),
  4606.         error: s(n),
  4607.         errorSticky: l(i)
  4608.     }
  4609. }
  4610. ]),
  4611. angular.module("navigate.to.on.key", []).directive("habboNavigateToOnKey", ["$document", function(e) {
  4612.     function t(e) {
  4613.         var t = {
  4614.             left: 37,
  4615.             right: 39
  4616.         };
  4617.         return t[e]
  4618.     }
  4619.     return {
  4620.         restrict: "A",
  4621.         link: function(o, r, a) {
  4622.             function n(e) {
  4623.                 e.which === i && (e.preventDefault(),
  4624.                 r.trigger("click"))
  4625.             }
  4626.             var i = t(a.habboNavigateToOnKey);
  4627.             angular.element(e).keydown(n),
  4628.             r.on("$destroy", function() {
  4629.                 angular.element(e).unbind("keydown", n)
  4630.             })
  4631.         }
  4632.     }
  4633. }
  4634. ]),
  4635. angular.module("message.container", ["angular-multiple-transclusion", "templates"]).component("habboMessageContainer", {
  4636.     templateUrl: "common/message-container/message-container.html",
  4637.     transclude: !0
  4638. }),
  4639. angular.module("my.like.cache", []).factory("myLikeCache", function() {
  4640.     var e = {}
  4641.       , t = {};
  4642.     return e.like = function(e) {
  4643.         t[e] = "like"
  4644.     }
  4645.     ,
  4646.     e.unlike = function(e) {
  4647.         t[e] = "unlike"
  4648.     }
  4649.     ,
  4650.     e.hasLike = function(e) {
  4651.         return "like" === t[e]
  4652.     }
  4653.     ,
  4654.     e.hasUnlike = function(e) {
  4655.         return "unlike" === t[e]
  4656.     }
  4657.     ,
  4658.     e
  4659. }),
  4660. angular.module("like.service", ["config", "like.filters", "my.like.cache", "security"]).factory("like", ["$http", "CONFIG", "Session", "myLikeCache", function(e, t, o, r) {
  4661.     function a(e, t) {
  4662.         401 !== t && (r.like(e.id),
  4663.         e.likes = _.uniq(e.likes.concat(o.user.name)))
  4664.     }
  4665.     function n(e, t) {
  4666.         401 !== t && (r.unlike(e.id),
  4667.         _.remove(e.likes, _.matches(o.user.name)))
  4668.     }
  4669.     var i = {};
  4670.     return i.like = function(o) {
  4671.         e.post(t.extraDataUrl + "/private/like/" + o.id).then(function(e) {
  4672.             a(o, e.status)
  4673.         })["catch"](function(e) {
  4674.             a(o, e.status)
  4675.         })
  4676.     }
  4677.     ,
  4678.     i.unlike = function(o) {
  4679.         e.post(t.extraDataUrl + "/private/unlike/" + o.id).then(function(e) {
  4680.             n(o, e.status)
  4681.         })["catch"](function(e) {
  4682.             n(o, e.status)
  4683.         })
  4684.     }
  4685.     ,
  4686.     i
  4687. }
  4688. ]),
  4689. angular.module("like.filters", ["security"]).filter("myLike", ["Session", function(e) {
  4690.     return function(t) {
  4691.         return _.find(t.likes, function(t) {
  4692.             return e.hasSession() ? t === e.user.name : !1
  4693.         })
  4694.     }
  4695. }
  4696. ]).filter("othersLikes", ["Session", function(e) {
  4697.     return function(t) {
  4698.         return _.filter(t.likes, function(t) {
  4699.             return e.hasSession() ? t !== e.user.name : !0
  4700.         })
  4701.     }
  4702. }
  4703. ]),
  4704. angular.module("like", ["avatar", "false.on.outside.click", "like.filters", "like.service", "locale", "my.like.cache", "security", "templates"]).component("habboLike", {
  4705.     bindings: {
  4706.         data: "="
  4707.     },
  4708.     controller: ["$timeout", "Session", "like", "myLikeCache", "myLikeFilter", function(e, t, o, r, a) {
  4709.         var n = this
  4710.           , i = a(n.data);
  4711.         r.hasLike(n.data.id) && !i && n.data.likes.push(t.user.name),
  4712.         r.hasUnlike(n.data.id) && i && _.remove(n.data.likes, _.matches(i)),
  4713.         n.show = !1,
  4714.         n.mouseenter = function() {
  4715.             e(function() {
  4716.                 n.show = !0
  4717.             })
  4718.         }
  4719.         ,
  4720.         n.like = function() {
  4721.             o.like(n.data)
  4722.         }
  4723.         ,
  4724.         n.unlike = function() {
  4725.             o.unlike(n.data)
  4726.         }
  4727.     }
  4728.     ],
  4729.     controllerAs: "LikeController",
  4730.     templateUrl: "common/like/like.html"
  4731. }),
  4732. angular.module("lightbox.modal", ["templates", "ui.bootstrap"]).controller("LightboxController", ["src", function(e) {
  4733.     var t = this;
  4734.     t.src = e
  4735. }
  4736. ]).factory("lightbox", ["$uibModal", function(e) {
  4737.     var t = {};
  4738.     return t.open = function(t) {
  4739.         return e.open({
  4740.             animation: !1,
  4741.             backdropClass: "lightbox-backdrop",
  4742.             controller: "LightboxController",
  4743.             controllerAs: "LightboxController",
  4744.             resolve: {
  4745.                 src: _.constant(t)
  4746.             },
  4747.             templateUrl: "common/lightbox/lightbox-modal.html",
  4748.             windowClass: "lightbox-modal"
  4749.         }).result
  4750.     }
  4751.     ,
  4752.     t
  4753. }
  4754. ]),
  4755. angular.module("lightbox", ["lightbox.modal"]).directive("habboLightbox", ["lightbox", function(e) {
  4756.     return {
  4757.         restrict: "A",
  4758.         link: function(t, o, r) {
  4759.             o.click(function(t) {
  4760.                 t.preventDefault(),
  4761.                 e.open(r.href)
  4762.             })
  4763.         }
  4764.     }
  4765. }
  4766. ]),
  4767. angular.module("leaderboard.service", ["ngResource", "config", "storage"]).factory("Leaderboard", ["$resource", "CONFIG", "httpCache", function(e, t, o) {
  4768.     return e(t.habboWebLeaderboardsUrl + "/:site/:leaderboard/:timeframe/:date.json", null , {
  4769.         get: {
  4770.             method: "GET",
  4771.             isArray: !0,
  4772.             cache: o.shortCache
  4773.         }
  4774.     })
  4775. }
  4776. ]),
  4777. angular.module("imager.service", ["angular-md5", "config"]).factory("imager", ["CONFIG", "md5", function(e, t) {
  4778.     function o(e) {
  4779.         return _(e).transform(function(e, t, o) {
  4780.             return e.push(o + "-" + t),
  4781.             e
  4782.         }, []).join(".")
  4783.     }
  4784.     var r = {}
  4785.       , a = "ef2356a4926bf225eb86c75c52309c32";
  4786.     return r.generatePose = function(e) {
  4787.         var t = e.size || "big"
  4788.           , o = e.direction || "sw"
  4789.           , r = e.headDirection || o
  4790.           , a = e.action || "stand"
  4791.           , n = e.gesture || "smile"
  4792.           , i = {};
  4793.         return i.s = {
  4794.             big: 0,
  4795.             bighead: 2,
  4796.             smallhead: 3,
  4797.             large: 4,
  4798.             largehead: 5
  4799.         }[t.toLowerCase()],
  4800.         i.g = {
  4801.             none: 0,
  4802.             smile: 1,
  4803.             angry: 2,
  4804.             surprise: 3,
  4805.             sad: 4,
  4806.             speak: 5,
  4807.             eyebrows: 6
  4808.         }[n.toLowerCase()],
  4809.         i.d = {
  4810.             nw: 0,
  4811.             w: 1,
  4812.             sw: 2,
  4813.             s: 3,
  4814.             se: 4,
  4815.             e: 5,
  4816.             ne: 6,
  4817.             n: 7
  4818.         }[o.toLowerCase()],
  4819.         i.h = {
  4820.             nw: 0,
  4821.             w: 1,
  4822.             sw: 2,
  4823.             s: 3,
  4824.             se: 4,
  4825.             e: 5,
  4826.             ne: 6,
  4827.             n: 7
  4828.         }[r.toLowerCase()],
  4829.         i.a = {
  4830.             stand: 0,
  4831.             sit: 1,
  4832.             walk: 2,
  4833.             wave: 3,
  4834.             lay: 4,
  4835.             carry: 5,
  4836.             drink: 6
  4837.         }[a.toLowerCase()],
  4838.         i
  4839.     }
  4840.     ,
  4841.     r.get2xSize = function(e) {
  4842.         return {
  4843.             big: "large",
  4844.             bighead: "largehead",
  4845.             smallhead: "bighead"
  4846.         }[e || "big"]
  4847.     }
  4848.     ,
  4849.     r.getDimensions = function(e) {
  4850.         return {
  4851.             big: {
  4852.                 width: 64,
  4853.                 height: 110
  4854.             },
  4855.             bighead: {
  4856.                 width: 54,
  4857.                 height: 62
  4858.             },
  4859.             smallhead: {
  4860.                 width: 27,
  4861.                 height: 30
  4862.             },
  4863.             large: {
  4864.                 width: 128,
  4865.                 height: 220
  4866.             },
  4867.             largehead: {
  4868.                 width: 108,
  4869.                 height: 124
  4870.             }
  4871.         }[e || "big"]
  4872.     }
  4873.     ,
  4874.     r.getImagerUrl = function(r, n) {
  4875.         var i = o(n)
  4876.           , s = t.createHash(r + i + a);
  4877.         return e.imagingUrl + "/avatar/" + encodeURIComponent(r + "," + i + "," + s) + ".png"
  4878.     }
  4879.     ,
  4880.     r.getLegacyImagerUrl = function(t, o) {
  4881.         return e.imagingUrl + "/avatarimage?" + $.param({
  4882.             user: t,
  4883.             headonly: 2 === o.s || 3 === o.s || 5 === o.s ? 1 : 0,
  4884.             size: {
  4885.                 0: "b",
  4886.                 1: "s",
  4887.                 2: "b",
  4888.                 3: "s",
  4889.                 4: "l",
  4890.                 5: "l"
  4891.             }[o.s],
  4892.             gesture: {
  4893.                 0: "",
  4894.                 1: "sml",
  4895.                 2: "agr",
  4896.                 3: "srp",
  4897.                 4: "sad",
  4898.                 5: "spk",
  4899.                 6: "eyb"
  4900.             }[o.g],
  4901.             direction: o.d,
  4902.             head_direction: o.h,
  4903.             action: {
  4904.                 0: "std",
  4905.                 1: "sit",
  4906.                 2: "wlk",
  4907.                 3: "wav",
  4908.                 4: "lay",
  4909.                 5: "crr",
  4910.                 6: "drk"
  4911.             }[o.a]
  4912.         })
  4913.     }
  4914.     ,
  4915.     r
  4916. }
  4917. ]),
  4918. angular.module("imager", ["imager.service", "templates"]).component("habboImager", {
  4919.     bindings: {
  4920.         figure: "@",
  4921.         user: "@",
  4922.         name: "@",
  4923.         size: "@",
  4924.         direction: "@",
  4925.         headDirection: "@",
  4926.         action: "@",
  4927.         gesture: "@"
  4928.     },
  4929.     controller: ["$scope", "imager", function(e, t) {
  4930.         function o(e) {
  4931.             var o = {
  4932.                 size: e || r.size,
  4933.                 direction: r.direction,
  4934.                 headDirection: r.headDirection,
  4935.                 action: r.action,
  4936.                 gesture: r.gesture
  4937.             }
  4938.               , a = t.generatePose(o);
  4939.             return r.figure ? t.getImagerUrl(r.figure, a) : r.user ? t.getLegacyImagerUrl(r.user, a) : void 0
  4940.         }
  4941.         var r = this;
  4942.         r.dimensions = t.getDimensions(r.size),
  4943.         r.src = o();
  4944.         var a = "bighead" === r.size && r.figure ? null : t.get2xSize(r.size);
  4945.         a && (r.src2x = o(a))
  4946.     }
  4947.     ],
  4948.     controllerAs: "ImagerController",
  4949.     templateUrl: "common/imager/imager.html"
  4950. }),
  4951. angular.module("hotel.closed", ["locale", "templates"]).component("habboHotelClosed", {
  4952.     templateUrl: "common/hotel-closed/hotel-closed.html"
  4953. }),
  4954. angular.module("header", ["header.ad", "locale", "navigation", "security", "sticky.header", "templates", "user.menu"]).component("habboHeaderLarge", {
  4955.     bindings: {
  4956.         active: "@"
  4957.     },
  4958.     controllerAs: "HeaderLargeController",
  4959.     templateUrl: "common/header/header-large.html",
  4960.     transclude: !0
  4961. }).component("habboHeaderSmall", {
  4962.     bindings: {
  4963.         active: "@"
  4964.     },
  4965.     controller: ["loginModal", function(e) {
  4966.         var t = this;
  4967.         t.openLoginModal = e.open
  4968.     }
  4969.     ],
  4970.     controllerAs: "HeaderSmallController",
  4971.     templateUrl: "common/header/header-small.html",
  4972.     transclude: !0
  4973. }),
  4974. angular.module("group.badge", ["config", "templates"]).component("habboGroupBadge", {
  4975.     bindings: {
  4976.         code: "@",
  4977.         name: "@"
  4978.     },
  4979.     controller: ["CONFIG", function(e) {
  4980.         var t = this;
  4981.         t.imagingUrl = e.imagingUrl
  4982.     }
  4983.     ],
  4984.     controllerAs: "GroupBadgeController",
  4985.     templateUrl: "common/group-badge/group-badge.html"
  4986. }),
  4987. angular.module("google.analytics", []).factory("googleAnalytics", ["$window", function(e) {
  4988.     function t(t) {
  4989.         e.Bugsnag && e.Bugsnag.notifyException(t, "GA not supported", {
  4990.             groupingHash: "GA"
  4991.         }, "info")
  4992.     }
  4993.     var o = {};
  4994.     return o.trackEvent = function(o, r, a, n) {
  4995.         try {
  4996.             e.ga("send", "event", o, r, a, n)
  4997.         } catch (i) {
  4998.             t(i)
  4999.         }
  5000.     }
  5001.     ,
  5002.     o.trackPageView = function(o) {
  5003.         try {
  5004.             e.ga("send", "pageview", o)
  5005.         } catch (r) {
  5006.             t(r)
  5007.         }
  5008.     }
  5009.     ,
  5010.     o.trackSocial = function(o, r, a) {
  5011.         try {
  5012.             e.ga("send", "social", o, r, a)
  5013.         } catch (n) {
  5014.             t(n)
  5015.         }
  5016.     }
  5017.     ,
  5018.     o.trackTransaction = function(o, r, a, n, i, s) {
  5019.         try {
  5020.             e.ga("ecommerce:addTransaction", {
  5021.                 id: o,
  5022.                 currency: s,
  5023.                 revenue: i
  5024.             }),
  5025.             e.ga("ecommerce:addItem", {
  5026.                 id: o,
  5027.                 name: r,
  5028.                 sku: a,
  5029.                 category: n,
  5030.                 price: i,
  5031.                 quantity: "1"
  5032.             }),
  5033.             e.ga("ecommerce:send")
  5034.         } catch (l) {
  5035.             t(l)
  5036.         }
  5037.     }
  5038.     ,
  5039.     o
  5040. }
  5041. ]).run(["$location", "$rootScope", "$timeout", "googleAnalytics", function(e, t, o, r) {
  5042.     t.$on("$stateChangeSuccess", function() {
  5043.         o(function() {
  5044.             r.trackPageView(e.url())
  5045.         })
  5046.     })
  5047. }
  5048. ]),
  5049. angular.module("form", ["captcha", "email.address", "password.current", "password.new", "password.toggle.mask", "search", "validators"]),
  5050. angular.module("footer", ["locale", "templates", "zendesk.url"]).constant("FOOTER_LINKS", ["FOOTER_SUPPORT", "FOOTER_SAFETY", "FOOTER_PARENTS", "FOOTER_TOS_AND_PRIVACY", "FOOTER_ADVERTISERS"]).component("habboFooter", {
  5051.     controller: ["FOOTER_LINKS", function(e) {
  5052.         var t = this;
  5053.         t.links = e,
  5054.         t.currentYear = (new Date).getFullYear()
  5055.     }
  5056.     ],
  5057.     controllerAs: "FooterController",
  5058.     templateUrl: "common/footer/footer.html"
  5059. }),
  5060. angular.module("flash.require", ["flash.service"]).directive("habboRequireFlash", ["flash", "ngIfDirective", function(e, t) {
  5061.     var o = t[0];
  5062.     return {
  5063.         restrict: "A",
  5064.         priority: o.priority,
  5065.         terminal: o.terminal,
  5066.         transclude: o.transclude,
  5067.         link: function(t, r, a) {
  5068.             a.ngIf = e.isSupported,
  5069.             o.link.apply(o, arguments)
  5070.         }
  5071.     }
  5072. }
  5073. ]),
  5074. angular.module("flash", ["flash.href", "flash.require", "flash.service"]),
  5075. angular.module("flash.service", []).factory("flash", function() {
  5076.     var e = {};
  5077.     return e.isEnabled = function() {
  5078.         return swfobject.hasFlashPlayerVersion("11")
  5079.     }
  5080.     ,
  5081.     e.isSupported = function() {
  5082.         return e.isEnabled() || !bowser.mobile
  5083.     }
  5084.     ,
  5085.     e
  5086. }),
  5087. angular.module("flash.href", ["flash.service"]).directive("habboFlashHref", ["flash", function(e) {
  5088.     return {
  5089.         restrict: "A",
  5090.         link: function(t, o, r) {
  5091.             e.isSupported() && r.$observe("habboFlashHref", function(e) {
  5092.                 e && r.$set("href", e)
  5093.             })
  5094.         }
  5095.     }
  5096. }
  5097. ]),
  5098. angular.module("false.on.outside.click", []).directive("habboFalseOnOutsideClick", function() {
  5099.     return {
  5100.         restrict: "A",
  5101.         link: function(e, t, o) {
  5102.             function r(r) {
  5103.                 0 === angular.element(r.target).closest(t).length && e.$apply(function() {
  5104.                     e.$eval(o.habboFalseOnOutsideClick + " = false;")
  5105.                 })
  5106.             }
  5107.             e.$watch(o.habboFalseOnOutsideClick, function(e) {
  5108.                 e ? angular.element("body").on("click touchstart", r) : angular.element("body").off("click touchstart", r)
  5109.             }),
  5110.             t.on("$destroy", function() {
  5111.                 angular.element("body").off("click touchstart", r)
  5112.             })
  5113.         }
  5114.     }
  5115. }),
  5116. angular.module("eu.cookie.banner", ["locale", "storage", "system.data", "templates"]).component("habboEuCookieBanner", {
  5117.     controller: ["SystemData", "localStorage", function(e, t) {
  5118.         var o = this;
  5119.         o.show = !1,
  5120.         t.get("acceptCookies") || ("eu" === e.geoLocation.continent ? o.show = !0 : t.set("acceptCookies", !0)),
  5121.         o.close = function() {
  5122.             o.show = !1,
  5123.             t.set("acceptCookies", !0)
  5124.         }
  5125.     }
  5126.     ],
  5127.     controllerAs: "EuCookieBannerController",
  5128.     templateUrl: "common/eu-cookie-banner/eu-cookie-banner.html"
  5129. }),
  5130. angular.module("encode.uri.component", []).filter("encodeURIComponent", ["$window", function(e) {
  5131.     return e.encodeURIComponent
  5132. }
  5133. ]),
  5134. angular.module("empty.results", ["locale", "templates"]).component("habboEmptyResults", {
  5135.     bindings: {
  5136.         translationKey: "@"
  5137.     },
  5138.     controllerAs: "EmptyResultsController",
  5139.     templateUrl: "common/empty-results/empty-results.html"
  5140. }),
  5141. angular.module("creation.href", ["encode.uri.component"]).directive("habboCreationHref", ["encodeURIComponentFilter", function(e) {
  5142.     return {
  5143.         restrict: "A",
  5144.         link: function(t, o, r) {
  5145.             t.$watch(r.habboCreationHref, function(t) {
  5146.                 if (t) {
  5147.                     var o = "PHOTO" === t.type ? "photo" : "story"
  5148.                       , a = ["profile", e(t.creator_name), o, t.id].join("/");
  5149.                     t.pool && (a += "?pool=" + t.pool),
  5150.                     r.$set("href", "/" + a)
  5151.                 }
  5152.             })
  5153.         }
  5154.     }
  5155. }
  5156. ]),
  5157. angular.module("console.warning", ["locale"]).factory("warning", function() {
  5158.     var e = {};
  5159.     return e.HEADER = ["                                                                        ,,,   ", "  ,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,    ,,,,,,,,,,   ,::,,  ", ",,@@@@@@@@@@@@@@:,:@@@@@@@@::@@@@@@@@@@@::@@@@@@@@@@@@:,,,:@@@@@@@@:,,,::: :, ", ",,@@@@@@@@@@@@@@@:@@@@@@@@@@:@@@@@@@@@@@@@@@@@@@@@@@@@@:,:@@@@@@@@@@:,:   : ,,", ",,@@,,,,,@,,,,,,@@,,,,,,,,,,@@,,,,,,,,,,,@@@,,,,,,,,,,@@@@,,,,,,,,,,@@:  :: ,,", ",,@@,,,,,@,,,,,,@@,,,,,,,,,,@@,,,,,,,,,,,,@@,,,,,,,,,,,@@@,,,,,,,,,,@@:::: :,,", ",,@@,,,,,@,,,,,,@,,,,,,,,,,,,@,,,,,,,,,,,,@@,,,,,,,,,,,,@,,,,,,,,,,,,@@@::,,, ", ",,@@,,,,,@,,,,,,@,,,,,,,,,,,,@,,,,,,,,,,,,@@,,,,,,,,,,,,@,,,,,,,,,,,,@@@:,,,  ", ",,@@,,,,,@,,,,,,@,,,,,@@,,,,,@,,,,,,@,,,,,@@,,,,,@,,,,,,@,,,,,@@,,,,,@;;@@,,  ", ",,@@,,,,,@,,,,,,@,,,,,@@,,,,,@,,,,,,@,,,,,@@,,,,,@,,,,,,@,,,,,@@,,,,,@;;@@:,  ", ",,@@,,,,,,,,,,,,@,,,,,@@,,,,,@,,,,,,@,,,,,@@,,,,,@,,,,,,@,,,,,@@,,,,,@;;;;@:, ", ",,@@,,,,,,,,,,,,@,,,,,@@,,,,,@,,,,,,,,,,,,@@,,,,,,,,,,,,@,,,,,@@,,,,,@;;;;@@,,", ",,@@,,,,,,,,,,,,@,,,,,@@,,,,,@,,,,,,,,,,@@@@,,,,,,,,,,@@@,,,,,@@,,,,,@;;;;@@,,", ",,@@::::::::::::@:::::@@:::::@::::::::::@@@@::::::::::@@@:::::@@:::::@;;;;@@,,", ",,@@::::::::::::@::::::::::::@::::::::::::@@::::::::::::@:::::@@:::::@;;;;@@,,", ",,@@::::::::::::@::::::::::::@::::::@:::::@@:::::@::::::@:::::@@:::::@;;;;@@,,", ",,@@:::::@::::::@::::::::::::@::::::@:::::@@:::::@::::::@:::::@@:::::@;;;;@@,,", ",,@@:::::@::::::@:::::@@:::::@::::::@:::::@@:::::@::::::@:::::@@:::::@;;;;@@,,", ",,@@:::::@::::::@:::::@@:::::@::::::::::::@@::::::::::::@::::::::::::@;;;;@@,,", ",,@@:::::@::::::@:::::@@:::::@::::::::::::@@::::::::::::@::::::::::::@;;;;@@,,", ",,@@:::::@::::::@:::::@@:::::@::::::::::::@@:::::::::::@@@::::::::::@@;;;;@@,,", ",,@@:::::@::::::@:::::@@:::::@:::::::::::@@@::::::::::@@@@::::::::::@@;;;;@@,,", ",,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;;;@@@@@@@@@@;;;;;;@@,,", ",,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;;@@@@@@@@@@@;;;;;@@@@@@@@@;;;;;;;@@,,", ",,,:@@;;;;@@;;;;;@@;;;;;@@;;;;@@;;;;;;;;;;;;@@;;;;;;;;;;;;;;@@;;;;;;;;;;;;@@,,", " ,,,@@;;;;;@@;;;;;@@;;;;@@;;;;;@@;;;;;;;;;;;@@;;;;;;;;;;;;;;@@;;;;;;;;;;;;@:,,", "  ,,,:@@;;;;@@;;;;;@@;;;;;@@;;;;@@;;;;;;;;;;@@@@;;;;;;;;;;@@@:@@;;;;;;;;@@:,, ", "   ,,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:,@@@@@@@@@@@@,,, ", "    ,,,:::::::::::::::::::::::::::::::::::::::,::::::::::::,,,,,::::::::,,,,  ", "     ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,   ", "      ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,   ,,,,,,,,,,     ", "                                                                              ", "                                                                              "],
  5160.     e.FOOTER = ["                                                                              ", "                                                                   - Habbo Dev"],
  5161.     e.format = function(t) {
  5162.         var o = []
  5163.           , r = "";
  5164.         return t.split(" ").forEach(function(t) {
  5165.             r.length + t.length + 5 > e.HEADER[0].length && (o.push(r),
  5166.             r = ""),
  5167.             r += t + " "
  5168.         }),
  5169.         r && o.push(r),
  5170.         _.map(o, function(e) {
  5171.             return "  " + e.trim()
  5172.         })
  5173.     }
  5174.     ,
  5175.     e
  5176. }).run(["$log", "$translate", "warning", function(e, t, o) {
  5177.     t("CONSOLE_WARNING").then(function(t) {
  5178.         var r = o.format(t);
  5179.         e.info(o.HEADER.join("\n") + "\n" + r.join("\n") + "\n" + o.FOOTER.join("\n"))
  5180.     })
  5181. }
  5182. ]),
  5183. angular.module("compile", []).component("habboCompile", {
  5184.     bindings: {
  5185.         data: "<"
  5186.     },
  5187.     controller: ["$compile", "$element", "$scope", function(e, t, o) {
  5188.         var r = this;
  5189.         t.html(r.data),
  5190.         e(t.contents())(o)
  5191.     }
  5192.     ]
  5193. }),
  5194. angular.module("columns", ["columns.channel", "columns.profile"]),
  5195. angular.module("by.name.description.or.motto.filter", []).filter("byNameDescriptionOrMotto", function() {
  5196.     return function(e, t) {
  5197.         return _.filter(e, function(e) {
  5198.             return !t || e.name && _(e.name.toLowerCase()).includes(t.toLowerCase()) || e.description && _(e.description.toLowerCase()).includes(t.toLowerCase()) || e.motto && _(e.motto.toLowerCase()).includes(t.toLowerCase())
  5199.         })
  5200.     }
  5201. }),
  5202. angular.module("badge", ["config", "templates"]).component("habboBadge", {
  5203.     bindings: {
  5204.         code: "@",
  5205.         name: "@"
  5206.     },
  5207.     controller: ["CONFIG", function(e) {
  5208.         var t = this;
  5209.         t.badgeUrl = e.badgeUrl
  5210.     }
  5211.     ],
  5212.     controllerAs: "BadgeController",
  5213.     templateUrl: "common/badge/badge.html"
  5214. }),
  5215. angular.module("avatar", ["encode.uri.component", "imager", "templates"]).component("habboAvatar", {
  5216.     bindings: {
  5217.         big: "@",
  5218.         user: "@"
  5219.     },
  5220.     controllerAs: "AvatarController",
  5221.     templateUrl: "common/avatar/avatar.html"
  5222. }),
  5223. angular.module("ios.download.link", ["config", "google.analytics"]).directive("habboIosDownloadLink", ["CONFIG", "googleAnalytics", function(e, t) {
  5224.     return {
  5225.         restrict: "A",
  5226.         link: function(o, r, a) {
  5227.             bowser.ios && (a.$set("href", e.appStoreUrl),
  5228.             a.$set("target", "_blank"),
  5229.             r.click(function() {
  5230.                 t.trackEvent("Download", "App Store")
  5231.             }))
  5232.         }
  5233.     }
  5234. }
  5235. ]),
  5236. angular.module("air.download.link", ["android.download.link", "ios.download.link"]),
  5237. angular.module("android.download.link", ["config", "google.analytics"]).directive("habboAndroidDownloadLink", ["CONFIG", "googleAnalytics", function(e, t) {
  5238.     return {
  5239.         restrict: "A",
  5240.         link: function(o, r, a) {
  5241.             bowser.android && (a.$set("href", e.googlePlayUrl),
  5242.             a.$set("target", "_blank"),
  5243.             r.click(function() {
  5244.                 t.trackEvent("Download", "Google Play")
  5245.             }))
  5246.         }
  5247.     }
  5248. }
  5249. ]),
  5250. angular.module("ad.unit", ["ad.double.click", "security", "templates"]).component("habboAdUnit", {
  5251.     bindings: {
  5252.         unit: "@"
  5253.     },
  5254.     controller: ["$location", "Session", function(e, t) {
  5255.         var o = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i
  5256.           , r = this;
  5257.         r.hasAds = t.hasAds,
  5258.         r.isAdsPrevented = function() {
  5259.             var t = e.search()
  5260.               , r = _(t).values().find(function(e) {
  5261.                 return o.test(e)
  5262.             });
  5263.             return Boolean(r)
  5264.         }
  5265.     }
  5266.     ],
  5267.     controllerAs: "AdUnitController",
  5268.     templateUrl: "common/ad-unit/ad-unit.html"
  5269. }),
  5270. angular.module("accordion", ["accordion.grid", "accordion.item", "accordion.item.content", "accordion.item.preview"]),
  5271. angular.module("accordion.item.preview", []).component("habboAccordionItemPreview", {
  5272.     require: {
  5273.         AccordionItemController: "^habboAccordionItem"
  5274.     },
  5275.     controllerAs: "AccordionItemPreviewController",
  5276.     template: '<div ng-click="AccordionItemPreviewController.AccordionItemController.toggle()" ng-transclude></div>',
  5277.     transclude: !0
  5278. }),
  5279. angular.module("accordion.item.content", ["ngAnimate", "events", "templates"]).component("habboAccordionItemContent", {
  5280.     require: {
  5281.         AccordionItemController: "^habboAccordionItem"
  5282.     },
  5283.     controller: ["$animate", "$element", "$scope", "$timeout", "EVENTS", function(e, t, o, r, a) {
  5284.         function n() {
  5285.             m = u()
  5286.         }
  5287.         function i() {
  5288.             angular.isUndefined(m) && n(),
  5289.             c({
  5290.                 height: 0,
  5291.                 opacity: 0
  5292.             }, {
  5293.                 height: m,
  5294.                 opacity: 1
  5295.             }),
  5296.             p.height = m
  5297.         }
  5298.         function s() {
  5299.             c({
  5300.                 height: m,
  5301.                 opacity: 1
  5302.             }, {
  5303.                 height: 0,
  5304.                 opacity: 0
  5305.             }),
  5306.             m = void 0,
  5307.             p.height = 0
  5308.         }
  5309.         function l() {
  5310.             0 !== p.height && r(function() {
  5311.                 var e = u();
  5312.                 c({
  5313.                     height: p.height
  5314.                 }, {
  5315.                     height: e
  5316.                 }),
  5317.                 p.height = e
  5318.             })
  5319.         }
  5320.         function c(t, o) {
  5321.             d && e.cancel(d),
  5322.             d = e.animate(h, t, o)
  5323.         }
  5324.         function u() {
  5325.             var e = h.css("height", "").actual("outerHeight");
  5326.             return h.css("height", p.height),
  5327.             e
  5328.         }
  5329.         var d, m, p = this, h = t.children().first();
  5330.         p.height = 0,
  5331.         o.$on(a.accordionOpen, i),
  5332.         o.$on(a.accordionClose, s),
  5333.         o.$on(a.accordionResize, function() {
  5334.             n(),
  5335.             l()
  5336.         }),
  5337.         o.$on(a.accordionUpdate, l),
  5338.         o.$watch("AccordionItemContentController.height", function(e) {
  5339.             p.AccordionItemController.setContentHeight(e)
  5340.         })
  5341.     }
  5342.     ],
  5343.     controllerAs: "AccordionItemContentController",
  5344.     templateUrl: "common/accordion/accordion-item-content.html",
  5345.     transclude: !0
  5346. }),
  5347. angular.module("accordion.item", ["events", "templates"]).component("habboAccordionItem", {
  5348.     require: {
  5349.         AccordionGridController: "^habboAccordionGrid"
  5350.     },
  5351.     controller: ["$element", "$scope", "EVENTS", function(e, t, o) {
  5352.         var r = this;
  5353.         r.expanded = !1,
  5354.         r.contentHeight = 0,
  5355.         r.offset = 0,
  5356.         r.$onInit = function() {
  5357.             r.AccordionGridController.registerItem(r)
  5358.         }
  5359.         ,
  5360.         r.toggle = function() {
  5361.             r.expanded ? r.AccordionGridController.collapseItem(r) : (r.offset = e.offset().top,
  5362.             r.AccordionGridController.expandItem(r))
  5363.         }
  5364.         ,
  5365.         r.setContentHeight = function(e) {
  5366.             r.contentHeight = e
  5367.         }
  5368.         ,
  5369.         t.$watch("AccordionItemController.expanded", function(e, r) {
  5370.             e ? t.$broadcast(o.accordionOpen) : r && t.$broadcast(o.accordionClose)
  5371.         })
  5372.     }
  5373.     ],
  5374.     controllerAs: "AccordionItemController",
  5375.     templateUrl: "common/accordion/accordion-item.html",
  5376.     transclude: !0
  5377. }),
  5378. angular.module("accordion.grid", ["events"]).component("habboAccordionGrid", {
  5379.     controller: ["$scope", "$window", "EVENTS", function(e, t, o) {
  5380.         function r() {
  5381.             angular.forEach(l, s.collapseItem)
  5382.         }
  5383.         function a(e, t) {
  5384.             return t && parseInt(t.offset, 10) < parseInt(e.offset, 10) ? e.offset - t.contentHeight : e.offset
  5385.         }
  5386.         function n() {
  5387.             e.$broadcast(o.accordionResize)
  5388.         }
  5389.         var i = 150
  5390.           , s = this
  5391.           , l = [];
  5392.         s.expandedItem = null ,
  5393.         s.registerItem = function(e) {
  5394.             l.push(e)
  5395.         }
  5396.         ,
  5397.         s.expandItem = function(e) {
  5398.             r(),
  5399.             e.expanded = !0,
  5400.             s.expandedItem = e
  5401.         }
  5402.         ,
  5403.         s.collapseItem = function(e) {
  5404.             e.expanded && (e.expanded = !1,
  5405.             s.expandedItem = null )
  5406.         }
  5407.         ,
  5408.         angular.element(t).on("orientationchange resize", n),
  5409.         e.$on("$destroy", function() {
  5410.             angular.element(t).off("orientationchange resize", n)
  5411.         }),
  5412.         e.$watch("HabboAccordionGridController.expandedItem", function(e, t) {
  5413.             if (e) {
  5414.                 var o = a(e, t);
  5415.                 angular.element("html, body").animate({
  5416.                     scrollTop: o
  5417.                 }, i)
  5418.             }
  5419.         })
  5420.     }
  5421.     ],
  5422.     controllerAs: "HabboAccordionGridController",
  5423.     template: "<ul ng-transclude></ul>",
  5424.     transclude: !0
  5425. }),
  5426. angular.module("shop", ["config", "earn.credits", "header", "locale", "prepaid", "router", "shop.footer", "store", "subscriptions", "system.data", "tabs", "templates", "transactions"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  5427.     e.statePublic("shop", {
  5428.         url: "/shop?country",
  5429.         "abstract": !0,
  5430.         controller: "ShopController",
  5431.         controllerAs: "ShopController",
  5432.         resolve: {
  5433.             countryCode: ["$stateParams", "SystemData", function(e, t) {
  5434.                 return e.country || t.getShopCountry() || "all"
  5435.             }
  5436.             ]
  5437.         },
  5438.         templateUrl: "shop/shop.html"
  5439.     }),
  5440.     t.when("/credits", "/shop")
  5441. }
  5442. ]).controller("ShopController", ["CONFIG", function(e) {
  5443.     var t = this;
  5444.     t.earnCreditsEnabled = "true" === e.offerToroEnabled
  5445. }
  5446. ]),
  5447. angular.module("shop.filters", []).filter("credit", function() {
  5448.     return function(e) {
  5449.         return _.filter(e, function(e) {
  5450.             return e.creditAmount > 0
  5451.         })
  5452.     }
  5453. }).filter("product", function() {
  5454.     return function(e) {
  5455.         return _.filter(e, function(e) {
  5456.             return 0 === e.creditAmount
  5457.         })
  5458.     }
  5459. }).filter("paymentCategory", function() {
  5460.     return function(e, t) {
  5461.         return t ? _.filter(e, function(e) {
  5462.             return e.category === t
  5463.         }) : e
  5464.     }
  5465. }).filter("payment", ["paymentCategoryFilter", function(e) {
  5466.     return function(t, o) {
  5467.         return _.filter(t, function(t) {
  5468.             return e(t.paymentMethods, o).length > 0
  5469.         })
  5470.     }
  5471. }
  5472. ]),
  5473. angular.module("shop.service", ["ngResource", "config", "safe.transform.response", "security", "storage"]).factory("Shop", ["$resource", "CONFIG", "Session", "httpCache", "safeTransformResponse", function(e, t, o, r, a) {
  5474.     function n(e) {
  5475.         return e = e || [],
  5476.         1 === e.length ? [] : (e.unshift("all"),
  5477.         _.map(e, function(e) {
  5478.             return {
  5479.                 key: e,
  5480.                 translateKey: "SHOP_PAYMENT_METHOD_" + e.toUpperCase()
  5481.             }
  5482.         }))
  5483.     }
  5484.     var i = e(t.shopUrl + "/:resource/:subresource", {}, {
  5485.         countries: {
  5486.             url: t.shopUrl + "/:public/:subresource",
  5487.             method: "GET",
  5488.             isArray: !0,
  5489.             params: {
  5490.                 subresource: "countries"
  5491.             },
  5492.             cache: r.longCache
  5493.         },
  5494.         inventory: {
  5495.             url: t.shopUrl + "/:public/inventory/:countryCode",
  5496.             method: "GET",
  5497.             cache: r.longCache,
  5498.             transformResponse: a.fromJson(function(e) {
  5499.                 return e.paymentCategories = n(e.paymentCategories),
  5500.                 e
  5501.             })
  5502.         },
  5503.         history: {
  5504.             url: t.shopUrl + "/history",
  5505.             method: "GET",
  5506.             isArray: !0
  5507.         }
  5508.     })
  5509.       , s = i.inventory
  5510.       , l = i.countries;
  5511.     return i.inventory = function() {
  5512.         return arguments[0] = arguments[0] || {},
  5513.         _.extend(arguments[0], {
  5514.             "public": o.hasSession() ? null : "public"
  5515.         }),
  5516.         s.apply(this, arguments)
  5517.     }
  5518.     ,
  5519.     i.countries = function() {
  5520.         return l.apply(this, [{
  5521.             "public": o.hasSession() ? null : "public"
  5522.         }])
  5523.     }
  5524.     ,
  5525.     i
  5526. }
  5527. ]),
  5528. angular.module("settings.service", ["config", "google.analytics"]).factory("settings", ["$http", "CONFIG", "googleAnalytics", function(e, t, o) {
  5529.     var r = {};
  5530.     return r.changePassword = function(r) {
  5531.         return e.post(t.apiUrl + "/settings/password/change", r).then(function(e) {
  5532.             return o.trackEvent("Password", "Changed"),
  5533.             e
  5534.         })
  5535.     }
  5536.     ,
  5537.     r.changeEmail = function(r) {
  5538.         return e.post(t.apiUrl + "/settings/email/change", r).then(function(e) {
  5539.             return o.trackEvent("Email", "Changed"),
  5540.             e
  5541.         })
  5542.     }
  5543.     ,
  5544.     r.resendActivationEmail = function() {
  5545.         return e.post(t.apiUrl + "/settings/email/verification-resend").then(function(e) {
  5546.             return o.trackEvent("Email", "Activation resent"),
  5547.             e
  5548.         })
  5549.     }
  5550.     ,
  5551.     r
  5552. }
  5553. ]),
  5554. angular.module("settings", ["account.security", "avatar.selection", "email.change", "header", "locale", "password.change", "privacy.settings", "router", "security", "tabs", "templates", "web.pages"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  5555.     e.statePrivate("settings", {
  5556.         url: "/settings",
  5557.         "abstract": !0,
  5558.         templateUrl: "settings/settings.html"
  5559.     }),
  5560.     t.when("/settings", "/settings/privacy")
  5561. }
  5562. ]),
  5563. angular.module("security.service", ["config", "google.analytics", "security.fb", "security.session", "security.use.force.service"]).factory("security", ["$http", "$location", "$q", "$window", "CONFIG", "Session", "fbSecurity", "googleAnalytics", "useForce", function(e, t, o, r, a, n, i, s, l) {
  5564.     function c(e) {
  5565.         return l.handleForces(e)["catch"](function() {
  5566.             return u()["finally"](function() {
  5567.                 return o.reject({
  5568.                     status: "force.pending"
  5569.                 })
  5570.             })
  5571.         })
  5572.     }
  5573.     function u() {
  5574.         return e.post(a.apiUrl + "/public/authentication/logout")
  5575.     }
  5576.     function d(e) {
  5577.         return n.destroy(),
  5578.         r.location.href = e || "/",
  5579.         o.defer().promise
  5580.     }
  5581.     var m = {};
  5582.     return m.init = function(e) {
  5583.         var t = e || r.session;
  5584.         return c(t).then(n.init)
  5585.     }
  5586.     ,
  5587.     m.login = function(o) {
  5588.         return e.post(a.apiUrl + "/public/authentication/login", o).then(function(e) {
  5589.             return s.trackEvent("Login", "Credentials", t.path()),
  5590.             e.data
  5591.         }).then(c).then(n.create)
  5592.     }
  5593.     ,
  5594.     m.fbLogin = function() {
  5595.         return i.login().then(function(o) {
  5596.             return e.post(a.apiUrl + "/public/authentication/facebook", o).then(function(e) {
  5597.                 return s.trackEvent("Login", "Facebook", t.path()),
  5598.                 e.data
  5599.             }).then(c).then(n.create)
  5600.         })
  5601.     }
  5602.     ,
  5603.     m.logout = function(e) {
  5604.         return u().then(function() {
  5605.             return s.trackEvent("Logout", "Succeeded", t.path()),
  5606.             d(e)
  5607.         })["catch"](function() {
  5608.             return s.trackEvent("Logout", "Failed", t.path()),
  5609.             o.reject()
  5610.         })
  5611.     }
  5612.     ,
  5613.     m.forceLogout = function(e) {
  5614.         return u()["finally"](function() {
  5615.             return s.trackEvent("Logout", "Forced", t.path()),
  5616.             d(e)
  5617.         })
  5618.     }
  5619.     ,
  5620.     m
  5621. }
  5622. ]),
  5623. angular.module("security", ["security.authorization", "security.credentials", "security.fingerprint", "security.login", "security.safety.answering.modal", "security.safety.lock", "security.service", "security.session"]),
  5624. angular.module("security.fb", ["ezfb"]).factory("fbSecurity", ["$q", "ezfb", function(e, t) {
  5625.     function o() {
  5626.         var o = e.defer();
  5627.         return t.getLoginStatus(function(e) {
  5628.             "connected" === e.status ? o.resolve(e.authResponse) : o.reject(e)
  5629.         }),
  5630.         o.promise
  5631.     }
  5632.     function r() {
  5633.         var o = e.defer();
  5634.         return t.login(function(e) {
  5635.             "connected" === e.status ? o.resolve(e.authResponse) : o.reject(e)
  5636.         }, {
  5637.             scope: "public_profile,email"
  5638.         }),
  5639.         o.promise
  5640.     }
  5641.     var a = {};
  5642.     return a.login = function() {
  5643.         return t.isSdkLoaded() ? o()["catch"](r) : e.reject({
  5644.             data: {
  5645.                 message: "fb.sdk_not_loaded"
  5646.             }
  5647.         })
  5648.     }
  5649.     ,
  5650.     a
  5651. }
  5652. ]),
  5653. angular.module("security.credentials", ["config"]).factory("credentials", ["CONFIG", function(e) {
  5654.     var t = {};
  5655.     return t.request = function(t) {
  5656.         return (_(t.url).includes(e.apiUrl) || _(t.url).includes(e.extraDataUrl) || _(t.url).includes(e.shopUrl)) && (t.withCredentials = !0),
  5657.         t
  5658.     }
  5659.     ,
  5660.     t
  5661. }
  5662. ]).config(["$httpProvider", function(e) {
  5663.     e.interceptors.push("credentials")
  5664. }
  5665. ]),
  5666. angular.module("security.authorization", ["security.login", "security.safety.lock", "security.session"]).factory("authorization", ["$q", "Session", "loginModal", "safetyLockModal", function(e, t, o, r) {
  5667.     var a = {};
  5668.     return a.hasAccessToPrivate = function() {
  5669.         return t.hasSession() ? e.when() : o.open()["catch"](function() {
  5670.             return e.reject({
  5671.                 access: !1
  5672.             })
  5673.         })
  5674.     }
  5675.     ,
  5676.     a.hasAccessToTrusted = function() {
  5677.         return a.hasAccessToPrivate().then(function() {
  5678.             return t.isTrusted() ? e.when() : r.open()["catch"](function() {
  5679.                 return e.reject({
  5680.                     access: !1
  5681.                 })
  5682.             })
  5683.         })
  5684.     }
  5685.     ,
  5686.     a.hasAccessToHabboAccountTrusted = function() {
  5687.         return a.hasAccessToTrusted().then(function() {
  5688.             return t.isHabboAccountSession() ? e.when() : e.reject({
  5689.                 access: !1
  5690.             })
  5691.         })
  5692.     }
  5693.     ,
  5694.     a
  5695. }
  5696. ]),
  5697. angular.module("router.service", ["security", "ui.router"]).config(["$locationProvider", "$urlMatcherFactoryProvider", function(e, t) {
  5698.     e.hashPrefix("!"),
  5699.     e.html5Mode({
  5700.         enabled: !0,
  5701.         requireBase: !1
  5702.     }),
  5703.     t.strictMode(!1)
  5704. }
  5705. ]).config(["$stateProvider", function(e) {
  5706.     function t(e, t, l) {
  5707.         return t["abstract"] !== !0 && (o("auth", t),
  5708.         t.resolve.auth = ["$injector", function(e) {
  5709.             return a = a || e.get("$q"),
  5710.             n = n || e.get("$state"),
  5711.             i = i || e.get("authorization"),
  5712.             i[l]()["catch"](r)
  5713.         }
  5714.         ]),
  5715.         s(e, t)
  5716.     }
  5717.     function o(e, t) {
  5718.         t.resolve = t.resolve || {},
  5719.         _(t.resolve).keys().forEach(function(o) {
  5720.             _(t.resolve[o]).includes(e) || t.resolve[o].splice(t.resolve[o].length - 1, 0, e)
  5721.         })
  5722.     }
  5723.     function r(e) {
  5724.         return n.hasPrevious() || n.go("home.news"),
  5725.         a.reject(e)
  5726.     }
  5727.     var a, n, i, s = e.state;
  5728.     e.statePublic = function(e, t) {
  5729.         return s(e, t)
  5730.     }
  5731.     ,
  5732.     e.statePrivate = function(e, o) {
  5733.         return t(e, o, "hasAccessToPrivate")
  5734.     }
  5735.     ,
  5736.     e.state = function(e, o) {
  5737.         return t(e, o, "hasAccessToTrusted")
  5738.     }
  5739.     ,
  5740.     e.stateHabboAccountTrusted = function(e, o) {
  5741.         return t(e, o, "hasAccessToHabboAccountTrusted")
  5742.     }
  5743. }
  5744. ]).run(["$rootScope", "$state", "security", function(e, t, o) {
  5745.     var r = e.$on("$stateChangeStart", function(e, a, n) {
  5746.         e.preventDefault(),
  5747.         o.init()["finally"](function() {
  5748.             r(),
  5749.             t.go(a, n)
  5750.         })
  5751.     })
  5752. }
  5753. ]),
  5754. angular.module("refresh.dosarrest.cookie", []).factory("refreshDosarrestCookie", ["$q", "$window", function(e, t) {
  5755.     function o(e) {
  5756.         return e.match(/\.html$/)
  5757.     }
  5758.     function r(e) {
  5759.         return _.isString(e) && a.test(e)
  5760.     }
  5761.     var a = /<title>Client Validation<\/title>/gi
  5762.       , n = {};
  5763.     return n.response = function(a) {
  5764.         var n = e.defer();
  5765.         return !o(a.config.url) && r(a.data) ? t.location.reload() : n.resolve(a),
  5766.         n.promise
  5767.     }
  5768.     ,
  5769.     n
  5770. }
  5771. ]).config(["$httpProvider", function(e) {
  5772.     e.interceptors.push("refreshDosarrestCookie")
  5773. }
  5774. ]),
  5775. angular.module("prompt.safety.lock", ["http.buffer", "security"]).factory("promptSafetyLock", ["$injector", "$q", "httpBuffer", function(e, t, o) {
  5776.     function r(e) {
  5777.         return e.data && "account.safety_locked" === e.data.error
  5778.     }
  5779.     function a(e) {
  5780.         return _(e).includes("/public/forgotPassword")
  5781.     }
  5782.     function n(e) {
  5783.         var r = t.defer();
  5784.         return o.pushError(e.config, r),
  5785.         i().open().then(o.flush)["catch"](function() {
  5786.             o.reject(403)
  5787.         }),
  5788.         r.promise
  5789.     }
  5790.     function i() {
  5791.         return s || e.get("safetyLockModal")
  5792.     }
  5793.     var s, l = {};
  5794.     return l.responseError = function(e) {
  5795.         return e && r(e) && !a(e.config.url) ? n(e) : t.reject(e)
  5796.     }
  5797.     ,
  5798.     l
  5799. }
  5800. ]).config(["$httpProvider", function(e) {
  5801.     e.interceptors.push("promptSafetyLock")
  5802. }
  5803. ]),
  5804. angular.module("prompt.login", ["http.buffer", "security"]).factory("promptLogin", ["$injector", "$location", "$q", "Session", "httpBuffer", function(e, t, o, r, a) {
  5805.     function n(e) {
  5806.         return _(e).includes("/login") || _(e).includes("/facebook") || _(e).includes("/logout")
  5807.     }
  5808.     function i() {
  5809.         return u || e.get("security")
  5810.     }
  5811.     function s(e) {
  5812.         var t = o.defer()
  5813.           , r = l();
  5814.         return a.pushError(e.config, t),
  5815.         r.isOpen() || r.open().then(a.flush)["catch"](function() {
  5816.             a.reject(401)
  5817.         }),
  5818.         t.promise
  5819.     }
  5820.     function l() {
  5821.         return c || e.get("loginModal")
  5822.     }
  5823.     var c, u, d = {};
  5824.     return d.responseError = function(e) {
  5825.         return e && 401 === e.status && !n(e.config.url) ? r.hasSession() ? i().forceLogout(t.url()) : s(e) : o.reject(e)
  5826.     }
  5827.     ,
  5828.     d
  5829. }
  5830. ]).config(["$httpProvider", function(e) {
  5831.     e.interceptors.push("promptLogin")
  5832. }
  5833. ]),
  5834. angular.module("error.maintenance", ["notifier"]).factory("maintenanceError", ["$q", "notifier", function(e, t) {
  5835.     var o = {};
  5836.     return o.responseError = function(o) {
  5837.         return 503 === o.status && t.error("ERROR_SERVER_MAINTENANCE"),
  5838.         e.reject(o)
  5839.     }
  5840.     ,
  5841.     o
  5842. }
  5843. ]).config(["$httpProvider", function(e) {
  5844.     e.interceptors.push("maintenanceError")
  5845. }
  5846. ]),
  5847. angular.module("router", ["ban.error", "error.maintenance", "head", "prerender", "prompt.login", "prompt.safety.lock", "refresh.dosarrest.cookie", "router.service", "scrolltop", "spinner"]),
  5848. angular.module("http.buffer", []).factory("httpBuffer", ["$injector", function(e) {
  5849.     function t(t, r) {
  5850.         o = o || e.get("$http"),
  5851.         o(t).then(function(e) {
  5852.             r.resolve(e)
  5853.         })["catch"](function(e) {
  5854.             r.reject(e)
  5855.         })
  5856.     }
  5857.     var o, r = {}, a = [];
  5858.     return r.pushError = function(e, t) {
  5859.         a.push({
  5860.             config: e,
  5861.             deferred: t
  5862.         })
  5863.     }
  5864.     ,
  5865.     r.flush = function() {
  5866.         angular.forEach(a, function(e) {
  5867.             t(e.config, e.deferred)
  5868.         }),
  5869.         a = []
  5870.     }
  5871.     ,
  5872.     r.reject = function(e) {
  5873.         angular.forEach(a, function(t) {
  5874.             t.deferred.reject({
  5875.                 status: e,
  5876.                 data: {}
  5877.             })
  5878.         }),
  5879.         a = []
  5880.     }
  5881.     ,
  5882.     r
  5883. }
  5884. ]),
  5885. angular.module("room", ["flash", "locale", "remove.on.error", "room.open", "room.restricted", "room.service", "router", "templates"]).config(["$stateProvider", function(e) {
  5886.     e.statePublic("room", {
  5887.         url: "/room/:id",
  5888.         controller: "RoomController",
  5889.         controllerAs: "RoomController",
  5890.         onEnter: ["room", "Head", function(e, t) {
  5891.             function o(e) {
  5892.                 return e.replace(/[|ƒ†‡‘•—¥ª¬±µ¶º»]/g, " ").replace(/[ ]+/g, " ").trim()
  5893.             }
  5894.             t.title = o(e.name)
  5895.         }
  5896.         ],
  5897.         resolve: {
  5898.             room: ["$stateParams", "Room", function(e, t) {
  5899.                 return t.get({
  5900.                     id: e.id
  5901.                 }).$promise
  5902.             }
  5903.             ]
  5904.         },
  5905.         templateUrl: "room/room.html"
  5906.     })
  5907. }
  5908. ]).controller("RoomController", ["room", function(e) {
  5909.     var t = this;
  5910.     t.room = e
  5911. }
  5912. ]),
  5913. angular.module("room.service", ["ngResource", "config", "storage"]).factory("Room", ["$resource", "CONFIG", "httpCache", function(e, t, o) {
  5914.     return e(t.apiUrl + "/public/rooms/:id", null , {
  5915.         get: {
  5916.             method: "GET",
  5917.             cache: o.shortCache
  5918.         }
  5919.     })
  5920. }
  5921. ]),
  5922. angular.module("registration.service", ["config", "google.analytics", "registration.age.gate", "security"]).factory("registration", ["$http", "$q", "$window", "CONFIG", "ageGate", "googleAnalytics", "security", function(e, t, o, r, a, n, i) {
  5923.     var s = {};
  5924.     return s.register = function(s) {
  5925.         return a.register(s.birthdate),
  5926.         a.isLocked() ? t.reject({
  5927.             data: {
  5928.                 error: "age"
  5929.             }
  5930.         }) : e.post(r.apiUrl + "/public/registration/new", s).then(function(e) {
  5931.             var r = t.defer();
  5932.             return 204 === e.status ? (n.trackEvent("Registration", "Registered", "Staff"),
  5933.             r.resolve(e)) : (n.trackEvent("Registration", "Registered", "User"),
  5934.             o.piwikTrack && (o._spef.push(["trackGoal", 1]),
  5935.             o.piwikTrack()),
  5936.             i.init(e.data).then(function() {
  5937.                 r.resolve(e)
  5938.             })),
  5939.             r.promise
  5940.         })
  5941.     }
  5942.     ,
  5943.     s
  5944. }
  5945. ]),
  5946. angular.module("registration", ["events", "header", "hotel.closed", "locale", "registration.form", "router", "security", "system.data", "templates"]).config(["$stateProvider", function(e) {
  5947.     e.statePublic("registration", {
  5948.         url: "/registration?captchaToken",
  5949.         controller: "RegistrationController",
  5950.         controllerAs: "RegistrationController",
  5951.         data: {
  5952.             title: "HEAD_TITLE_REGISTRATION"
  5953.         },
  5954.         templateUrl: "registration/registration.html"
  5955.     })
  5956. }
  5957. ]).controller("RegistrationController", ["$scope", "$state", "EVENTS", "SystemData", function(e, t, o, r) {
  5958.     var a = this;
  5959.     a.isOpen = r.isHotelOpen(),
  5960.     e.$on(o.securityLogin, function() {
  5961.         t.go("home.news", null , {
  5962.             location: "replace"
  5963.         })
  5964.     })
  5965. }
  5966. ]).run(["$rootScope", "$state", "Session", function(e, t, o) {
  5967.     e.$on("$stateChangeStart", function(e, r) {
  5968.         "registration" === r.name && (o.hasSession() || bowser.android || bowser.ios) && (e.preventDefault(),
  5969.         t.go("home.news"))
  5970.     })
  5971. }
  5972. ]),
  5973. angular.module("registration.form", ["ngMessages", "birthdate", "config", "form", "google.analytics", "locale", "notifier", "registration.partner", "registration.policies", "registration.service", "router", "security", "system.data", "templates"]).component("habboRegistrationForm", {
  5974.     controller: ["$scope", "$state", "$stateParams", "CAPTCHA_EVENTS", "CONFIG", "SystemData", "googleAnalytics", "notifier", "registration", function(e, t, o, r, a, n, i, s, l) {
  5975.         function c() {
  5976.             return "hhtr" === a.hotel
  5977.         }
  5978.         var u = this;
  5979.         u.hasCaptchaToken = Boolean(o.captchaToken),
  5980.         u.registration = {
  5981.             captchaToken: o.captchaToken
  5982.         },
  5983.         u.registerInProgress = !1,
  5984.         u.showPartnerRegistration = n.isIDCGamesCountry() || c(),
  5985.         u.register = function() {
  5986.             var o = _(e.registrationForm.$error).values().flatten().map("$name").uniq().sort().join(", ");
  5987.             i.trackEvent("Registration", "Clicked", o),
  5988.             e.registrationForm.$valid && (u.registerInProgress = !0,
  5989.             l.register(u.registration).then(function(e) {
  5990.                 204 === e.status ? t.go("home.news") : t.go("hotel")
  5991.             })["catch"](function(t) {
  5992.                 var o = t.data && t.data.error;
  5993.                 "age" === o ? s.error("ERROR_BIRTHDATE_AGE") : ("registration_email" === o ? e.$broadcast("remote-data-invalid", "emailInvalid") : "registration_email_in_use" === o ? e.$broadcast("remote-data-invalid", "emailUsedInRegistration") : 429 === t.status ? s.error("ERROR_TOO_MANY_ATTEMPTS", {
  5994.                     time: moment(t.data.nextValidRequestDate).fromNow(!0)
  5995.                 }) : s.error("ERROR_SERVER"),
  5996.                 e.$broadcast(r.reset))
  5997.             })["finally"](function() {
  5998.                 u.registerInProgress = !1
  5999.             }))
  6000.         }
  6001.         ,
  6002.         u.fbRegister = function() {
  6003.             t.go("hotel")
  6004.         }
  6005.     }
  6006.     ],
  6007.     controllerAs: "RegistrationFormController",
  6008.     templateUrl: "registration/registration-form.html"
  6009. }),
  6010. angular.module("registration.age.gate", ["config", "google.analytics", "local.storage"]).factory("ageGate", ["CONFIG", "googleAnalytics", "localStorage", function(e, t, o) {
  6011.     function r(t) {
  6012.         return moment({
  6013.             day: t.day,
  6014.             month: t.month - 1,
  6015.             year: t.year
  6016.         }).add(e.minAge, "years").isAfter(moment())
  6017.     }
  6018.     var a = {}
  6019.       , n = !1;
  6020.     return a.register = function(e) {
  6021.         r(e) && (n = !0,
  6022.         o.set("ageGate", !0),
  6023.         t.trackEvent("Registration", "Age gate", moment(e).format("YYYY-MM-DD")))
  6024.     }
  6025.     ,
  6026.     a.isLocked = function() {
  6027.         return n || o.get("ageGate")
  6028.     }
  6029.     ,
  6030.     a
  6031. }
  6032. ]),
  6033. angular.module("profile", ["header", "locale", "profile.creations", "profile.header", "profile.item.lists", "profile.modal", "profile.service", "router", "security", "social.share", "templates"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  6034.     e.statePublic("profile", {
  6035.         url: "/profile/:name",
  6036.         controller: "ProfileController",
  6037.         controllerAs: "ProfileController",
  6038.         data: {
  6039.             title: "HEAD_TITLE_PROFILE"
  6040.         },
  6041.         resolve: {
  6042.             profile: ["$stateParams", "Profile", function(e, t) {
  6043.                 return t.get({
  6044.                     name: e.name
  6045.                 }).$promise
  6046.             }
  6047.             ]
  6048.         },
  6049.         templateUrl: "profile/profile.html"
  6050.     }),
  6051.     t.when("/home/:name", "/profile/:name"),
  6052.     t.when("/profile", "/")
  6053. }
  6054. ]).controller("ProfileController", ["CreationsProfile", "Profile", "Session", "profile", function(e, t, o, r) {
  6055.     var a = this;
  6056.     a.profile = r,
  6057.     o.hasSession() && r.uniqueId === o.user.uniqueId ? a.items = t["private"]() : r.profileVisible && (a.items = t.items({
  6058.         uniqueId: r.uniqueId
  6059.     })),
  6060.     a.stories = e.stories({
  6061.         uniqueId: r.uniqueId
  6062.     }),
  6063.     a.photos = e.photos({
  6064.         uniqueId: r.uniqueId
  6065.     }),
  6066.     a.random = function() {
  6067.         return .5 - Math.random()
  6068.     }
  6069. }
  6070. ]),
  6071. angular.module("profile.service", ["ngResource", "config", "storage"]).factory("Profile", ["$resource", "CONFIG", "httpCache", function(e, t, o) {
  6072.     return e(t.apiUrl + "/public/users/:uniqueId/:resource", null , {
  6073.         get: {
  6074.             method: "GET",
  6075.             cache: o.shortCache
  6076.         },
  6077.         items: {
  6078.             method: "GET",
  6079.             params: {
  6080.                 resource: "profile"
  6081.             },
  6082.             cache: o.shortCache
  6083.         },
  6084.         "private": {
  6085.             method: "GET",
  6086.             url: t.apiUrl + "/user/profile",
  6087.             cache: o.shortCache
  6088.         }
  6089.     })
  6090. }
  6091. ]),
  6092. angular.module("profile.creations", ["ngResource", "config", "profile.service", "reported.photos", "safe.transform.response", "storage"]).factory("CreationsProfile", ["$resource", "CONFIG", "Profile", "httpCache", "reportedPhotosFilter", "safeTransformResponse", function(e, t, o, r, a, n) {
  6093.     function i(e) {
  6094.         return function(t) {
  6095.             return o.get({
  6096.                 name: t
  6097.             }).$promise.then(function(t) {
  6098.                 return s[e]({
  6099.                     uniqueId: t.uniqueId
  6100.                 }).$promise
  6101.             })
  6102.         }
  6103.     }
  6104.     var s = e(t.extraDataUrl + "/public/users/:uniqueId/:resource", null , {
  6105.         photos: {
  6106.             method: "GET",
  6107.             isArray: !0,
  6108.             params: {
  6109.                 resource: "photos"
  6110.             },
  6111.             cache: r.shortCache,
  6112.             transformResponse: n.fromJson(function(e) {
  6113.                 var t = a(e);
  6114.                 return _.map(t, function(e) {
  6115.                     return _.assign(e, {
  6116.                         url: "https:" + e.url,
  6117.                         contentHeight: 320,
  6118.                         contentWidth: 320,
  6119.                         parentTitle: "PHOTOS_TITLE"
  6120.                     })
  6121.                 })
  6122.             })
  6123.         },
  6124.         stories: {
  6125.             method: "GET",
  6126.             isArray: !0,
  6127.             params: {
  6128.                 resource: "stories"
  6129.             },
  6130.             cache: r.shortCache,
  6131.             transformResponse: n.fromJson(function(e) {
  6132.                 return _.map(e, function(e) {
  6133.                     return e.url && -1 === e.url.indexOf("https:") && (e.url = "https:" + e.url),
  6134.                     e
  6135.                 })
  6136.             })
  6137.         }
  6138.     });
  6139.     return s.photosForUser = i("photos"),
  6140.     s.storiesForUser = i("stories"),
  6141.     s
  6142. }
  6143. ]),
  6144. angular.module("playing.habbo", ["ad.unit", "header", "locale", "router", "tabs", "templates", "web.pages"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  6145.     var o = ["what-is-habbo", "how-to-play", "habbo-way", "safety", "help"];
  6146.     e.statePublic("playingHabbo", {
  6147.         url: "/playing-habbo",
  6148.         templateUrl: "playing-habbo/playing-habbo.html",
  6149.         "abstract": !0
  6150.     }),
  6151.     _.forEach(o, function(t) {
  6152.         var o = "HEAD_TITLE_PLAYING_HABBO_" + t.toUpperCase().replace(/-/g, "_");
  6153.         e.statePublic("playingHabbo." + t, {
  6154.             url: "/" + t,
  6155.             controller: "PlayingHabboController",
  6156.             controllerAs: "PlayingHabboController",
  6157.             data: {
  6158.                 title: o
  6159.             },
  6160.             resolve: {
  6161.                 page: ["webPages", function(e) {
  6162.                     return e.get("playing_habbo/" + _.snakeCase(t))
  6163.                 }
  6164.                 ]
  6165.             },
  6166.             templateUrl: "playing-habbo/" + t + ".html"
  6167.         })
  6168.     }),
  6169.     t.when("/playing-habbo", "/playing-habbo/what-is-habbo")
  6170. }
  6171. ]).controller("PlayingHabboController", ["page", function(e) {
  6172.     var t = this;
  6173.     t.page = e
  6174. }
  6175. ]),
  6176. angular.module("password.reset.service", ["config", "google.analytics"]).factory("passwordReset", ["$http", "CONFIG", "googleAnalytics", function(e, t, o) {
  6177.     var r = {};
  6178.     return r.send = function(r) {
  6179.         return e.post(t.apiUrl + "/public/forgotPassword/send", {
  6180.             email: r
  6181.         }).then(function(e) {
  6182.             return o.trackEvent("Password", "Reset requested"),
  6183.             e
  6184.         })
  6185.     }
  6186.     ,
  6187.     r.changePassword = function(r) {
  6188.         return e.post(t.apiUrl + "/public/forgotPassword/changePassword", r).then(function(e) {
  6189.             return o.trackEvent("Password", "Password reset"),
  6190.             e
  6191.         })
  6192.     }
  6193.     ,
  6194.     r
  6195. }
  6196. ]),
  6197. angular.module("password.reset", ["header", "locale", "password.reset.form", "router", "security", "templates"]).config(["$stateProvider", function(e) {
  6198.     e.statePublic("resetPassword", {
  6199.         url: "/reset-password/:token",
  6200.         controller: "PasswordResetController",
  6201.         controllerAs: "PasswordResetController",
  6202.         data: {
  6203.             title: "HEAD_TITLE_PASSWORD_RESET"
  6204.         },
  6205.         onEnter: ["$location", "security", "Session", function(e, t, o) {
  6206.             return o.hasSession() ? t.forceLogout(e.url()) : void 0
  6207.         }
  6208.         ],
  6209.         templateUrl: "password-reset/password-reset.html"
  6210.     })
  6211. }
  6212. ]).controller("PasswordResetController", ["$stateParams", function(e) {
  6213.     var t = this;
  6214.     t.token = e.token
  6215. }
  6216. ]),
  6217. angular.module("password.reset.form", ["form", "locale", "notifier", "password.reset.service", "router", "security", "templates"]).component("habboPasswordResetForm", {
  6218.     bindings: {
  6219.         token: "<"
  6220.     },
  6221.     controller: ["$scope", "$state", "notifier", "passwordReset", "safetyAnsweringModal", function(e, t, o, r, a) {
  6222.         function n() {
  6223.             o.success("PASSWORD_RESET_SUCCESS"),
  6224.             t.go("home.news")
  6225.         }
  6226.         var i = this;
  6227.         i.passwords = {},
  6228.         i.updateInProgress = !1,
  6229.         i.update = function() {
  6230.             if (e.resetPasswordForm.$valid) {
  6231.                 i.updateInProgress = !0;
  6232.                 var t = {
  6233.                     token: i.token,
  6234.                     password: i.passwords.password
  6235.                 };
  6236.                 r.changePassword(t).then(n)["catch"](function(i) {
  6237.                     var s = i.data && i.data.error;
  6238.                     return 403 === i.status && "account.safety_locked" === s ? a.open(i.data.questions, t, r.changePassword).then(n) : void (404 === i.status ? o.error("ERROR_PASSWORD_RESET_EXPIRED") : "password.too_similar_to_username" === s ? e.$broadcast("remote-data-invalid", "passwordName") : "password.too_similar_to_email" === s ? e.$broadcast("remote-data-invalid", "passwordEmail") : o.error("ERROR_SERVER"))
  6239.                 })["finally"](function() {
  6240.                     i.updateInProgress = !1
  6241.                 })
  6242.             }
  6243.         }
  6244.     }
  6245.     ],
  6246.     controllerAs: "PasswordResetFormController",
  6247.     templateUrl: "password-reset/password-reset-form.html"
  6248. }),
  6249. angular.module("not.found", ["google.analytics", "header", "locale", "router", "templates"]).config(["$stateProvider", function(e) {
  6250.     e.statePublic("notFound", {
  6251.         templateUrl: "not-found/not-found.html",
  6252.         data: {
  6253.             title: "HEAD_TITLE_NOT_FOUND"
  6254.         }
  6255.     })
  6256. }
  6257. ]).config(["$urlRouterProvider", function(e) {
  6258.     e.otherwise(function(e, t) {
  6259.         var o = e.get("googleAnalytics")
  6260.           , r = e.get("$state");
  6261.         o.trackEvent("Error", "Not found", t.url()),
  6262.         r.go("notFound")
  6263.     })
  6264. }
  6265. ]).run(["$location", "$log", "$rootScope", "$state", "googleAnalytics", function(e, t, o, r, a) {
  6266.     o.$on("$stateChangeError", function(o, n, i, s, l, c) {
  6267.         c && c.access === !1 || (o.preventDefault(),
  6268.         t.error(c),
  6269.         a.trackEvent("Error", "Not found", e.url()),
  6270.         r.go("notFound"))
  6271.     })
  6272. }
  6273. ]),
  6274. angular.module("logout", ["locale", "notifier", "router", "security"]).config(["$stateProvider", function(e) {
  6275.     e.statePublic("logout", {
  6276.         url: "/logout",
  6277.         resolve: {
  6278.             logout: ["$state", "notifier", "security", function(e, t, o) {
  6279.                 return o.logout()["catch"](function() {
  6280.                     e.go("home.news"),
  6281.                     t.errorSticky("ERROR_LOGOUT_TITLE", "ERROR_LOGOUT_TEXT")
  6282.                 })
  6283.             }
  6284.             ]
  6285.         }
  6286.     })
  6287. }
  6288. ]),
  6289. angular.module("hotel", ["client", "events", "locale", "router", "security", "templates"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  6290.     e.statePrivate("hotel", {
  6291.         url: "/hotel?link&room",
  6292.         controller: "HotelController",
  6293.         data: {
  6294.             title: "HEAD_TITLE_HOTEL"
  6295.         },
  6296.         template: '<div class="hotel"></div>'
  6297.     }),
  6298.     t.when("/client", "/hotel")
  6299. }
  6300. ]).controller("HotelController", ["$rootScope", "$stateParams", "$timeout", "EVENTS", "Session", "safetyLockModal", function(e, t, o, r, a, n) {
  6301.     a.isTrusted() || n.open(),
  6302.     o(function() {
  6303.         e.$broadcast(r.clientOpen, t)
  6304.     })
  6305. }
  6306. ]),
  6307. angular.module("home", ["header", "locale", "messaging", "news", "register.banner", "router", "tabs", "templates"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  6308.     e.statePublic("home", {
  6309.         url: "?captchaToken",
  6310.         "abstract": !0,
  6311.         controller: "HomeController",
  6312.         controllerAs: "HomeController",
  6313.         templateUrl: "home/home.html"
  6314.     }),
  6315.     t.when("/login_popup", "/")
  6316. }
  6317. ]).controller("HomeController", ["$state", "Session", function(e, t) {
  6318.     var o = this;
  6319.     o.hasHeaderLarge = function() {
  6320.         return !t.hasSession() && e.is("home.news")
  6321.     }
  6322. }
  6323. ]),
  6324. angular.module("help.login", ["router", "security", "zendesk.url"]).config(["$stateProvider", function(e) {
  6325.     e.statePrivate("helpLogin", {
  6326.         url: "/help-login?return_to",
  6327.         controller: "HelpLoginController",
  6328.         data: {
  6329.             title: "HEAD_TITLE_HELP_LOGIN"
  6330.         },
  6331.         template: '<div class="help-login-backdrop"></div>'
  6332.     })
  6333. }
  6334. ]).controller("HelpLoginController", ["$stateParams", "$window", "zendeskRedirectUrlFilter", function(e, t, o) {
  6335.     t.location.href = o(e.return_to, !0)
  6336. }
  6337. ]),
  6338. angular.module("dev", ["header", "router", "templates", "web.pages"]).config(["$stateProvider", function(e) {
  6339.     e.statePublic("dev", {
  6340.         url: "/dev/:page",
  6341.         templateUrl: "dev/dev.html",
  6342.         controller: "DevController",
  6343.         controllerAs: "DevController"
  6344.     })
  6345. }
  6346. ]).controller("DevController", ["$stateParams", function(e) {
  6347.     var t = this;
  6348.     t.page = e.page.replace(/-/g, "_")
  6349. }
  6350. ]),
  6351. angular.module("ui.router").config(["$provide", function(e) {
  6352.     e.decorator("$state", ["$delegate", "$rootScope", function(e, t) {
  6353.         var o, r;
  6354.         return e.hasPrevious = function() {
  6355.             return Boolean(o) && Boolean(o.name)
  6356.         }
  6357.         ,
  6358.         e.back = function() {
  6359.             e.hasPrevious() ? e.go(o.name, r) : e.go("home.news")
  6360.         }
  6361.         ,
  6362.         t.$on("$stateChangeSuccess", function(e, t, a, n, i) {
  6363.             o = n,
  6364.             r = i
  6365.         }),
  6366.         e
  6367.     }
  6368.     ])
  6369. }
  6370. ]),
  6371. angular.module("ui.bootstrap").config(["$provide", function(e) {
  6372.     e.decorator("$uibModal", ["$delegate", "$rootScope", function(e, t) {
  6373.         var o = e.open;
  6374.         return e.open = function(e) {
  6375.             var r, a, n = o(e);
  6376.             return n.open = !0,
  6377.             r = t.$on("$stateChangeSuccess", function() {
  6378.                 n.dismiss("cancel")
  6379.             }),
  6380.             a = t.$on("$locationChangeSuccess", function(e, t, o) {
  6381.                 t !== o && n.dismiss("cancel")
  6382.             }),
  6383.             n.result["finally"](function() {
  6384.                 n.open = !1,
  6385.                 r(),
  6386.                 a()
  6387.             }),
  6388.             n
  6389.         }
  6390.         ,
  6391.         e
  6392.     }
  6393.     ])
  6394. }
  6395. ]),
  6396. angular.module("ezfb").config(["$provide", "ezfbProvider", function(e, t) {
  6397.     var o = !1;
  6398.     t.setLoadSDKFunction(["$window", "$document", "ezfbAsyncInit", "ezfbLocale", function(e, t, r, a) {
  6399.         var n = t[0].createElement("script");
  6400.         n.id = "facebook-jssdk",
  6401.         n.async = !0,
  6402.         n.src = "//connect.facebook.net/" + a + "/sdk.js",
  6403.         t[0].body.appendChild(n),
  6404.         e.fbAsyncInit = function() {
  6405.             r(),
  6406.             o = !0
  6407.         }
  6408.     }
  6409.     ]),
  6410.     e.decorator("ezfb", ["$delegate", function(e) {
  6411.         return e.isSdkLoaded = function() {
  6412.             return o
  6413.         }
  6414.         ,
  6415.         e
  6416.     }
  6417.     ])
  6418. }
  6419. ]),
  6420. angular.module("community", ["article", "category", "fansites", "header", "photos", "rooms", "router", "tabs", "templates"]).config(["$stateProvider", "$urlRouterProvider", function(e, t) {
  6421.     e.statePublic("community", {
  6422.         url: "/community",
  6423.         "abstract": !0,
  6424.         templateUrl: "community/community.html"
  6425.     }),
  6426.     t.when("/community", "/community/photos")
  6427. }
  6428. ]),
  6429. angular.module("activate.service", ["config", "google.analytics", "security"]).factory("activate", ["$http", "CONFIG", "Session", "googleAnalytics", function(e, t, o, r) {
  6430.     return function(a) {
  6431.         return e.post(t.apiUrl + "/public/registration/activate", {
  6432.             token: a
  6433.         }).then(function(e) {
  6434.             r.trackEvent("Email", "Activated"),
  6435.             200 === e.status && o.hasSession() && o.update(e.data)
  6436.         })
  6437.     }
  6438. }
  6439. ]),
  6440. angular.module("activate", ["activate.service", "locale", "notifier", "router"]).config(["$stateProvider", function(e) {
  6441.     e.statePublic("activate", {
  6442.         url: "/activate/:token",
  6443.         controller: "ActivateController",
  6444.         resolve: {
  6445.             activation: ["$stateParams", "activate", function(e, t) {
  6446.                 return t(e.token)
  6447.             }
  6448.             ]
  6449.         }
  6450.     })
  6451. }
  6452. ]).controller("ActivateController", ["$state", "notifier", function(e, t) {
  6453.     t.success("ACTIVATE_SUCCESS"),
  6454.     e.go("home.news")
  6455. }
  6456. ]),
  6457. angular.module("templates", []).run(["$templateCache", function(e) {
  6458.     e.put("dev/dev.html", '<habbo-header-small></habbo-header-small><section class="wrapper wrapper--content"><habbo-web-pages key="{{:: \'dev/\' + DevController.page}}" class="main"></habbo-web-pages><habbo-web-pages key="{{:: \'dev/\' + DevController.page + \'_box\'}}" class="aside aside--box aside--push-down"></habbo-web-pages></section>'),
  6459.     e.put("community/community.html", '<habbo-header-small active="community"></habbo-header-small><habbo-tabs><habbo-tab path="/community/photos" translation-key="COMMUNITY_PHOTOS_TAB"></habbo-tab><habbo-tab path="/community/rooms" translation-key="COMMUNITY_ROOMS_TAB"></habbo-tab><habbo-tab path="/community/fansites" translation-key="COMMUNITY_FANSITES_TAB"></habbo-tab><habbo-tab path="/community/category" alternative-path="/community/article" translation-key="COMMUNITY_NEWS_TAB"></habbo-tab></habbo-tabs><main ui-view></main>'),
  6460.     e.put("password-reset/password-reset-form.html", '<form ng-submit="PasswordResetFormController.update()" name="resetPasswordForm" novalidate class="form form--left"><habbo-password-new is-new="true" password-new="PasswordResetFormController.passwords.password" password-new-repeated="PasswordResetFormController.passwords.passwordRepeated"></habbo-password-new><div class="form__footer"><button ng-disabled="PasswordResetFormController.updateInProgress" type="submit" class="form__submit" translate="FORM_BUTTON_CHANGE"></button></div></form>'),
  6461.     e.put("password-reset/password-reset.html", '<habbo-header-small></habbo-header-small><main class="wrapper wrapper--content"><h1 translate="PASSWORD_RESET_TITLE"></h1><habbo-password-reset-form token="PasswordResetController.token" class="password-reset-form"></habbo-password-reset-form></main>'),
  6462.     e.put("not-found/not-found.html", '<habbo-header-small></habbo-header-small><main class="wrapper wrapper--content not-found"><section class="not-found__content"><h3 translate="NOT_FOUND_PAGE_TITLE"></h3><div translate="NOT_FOUND_PAGE_TEXT"></div></section></main>'),
  6463.     e.put("home/home.html", '<habbo-header-small ng-if="!HomeController.hasHeaderLarge()" active="home"></habbo-header-small><habbo-header-large ng-if="HomeController.hasHeaderLarge()" active="home"><habbo-register-banner></habbo-register-banner></habbo-header-large><habbo-tabs><habbo-tab path="/" strict-path="true" translation-key="HOME_NEWS_TAB"></habbo-tab><habbo-tab habbo-require-session path="/messaging" translation-key="HOME_MESSAGING_TAB"></habbo-tab></habbo-tabs><main class="wrapper wrapper--content" ui-view></main>'),
  6464.     e.put("room/room.html", '<habbo-header-small></habbo-header-small><habbo-room-restricted ng-if="RoomController.room.doorMode != \'open\'" room="RoomController.room"></habbo-room-restricted><habbo-room-open ng-if="RoomController.room.doorMode == \'open\'" room="RoomController.room"></habbo-room-open>'),
  6465.     e.put("registration/registration-form.html", '<h1 translate="REGISTRATION_TITLE"></h1><form ng-submit="RegistrationFormController.register()" name="registrationForm" novalidate class="form form--left registration-form"><div class="registration-form__social__wrapper"><div class="registration-form__social"><h3 class="registration-form__connect" translate="REGISTRATION_SOCIAL"></h3><habbo-facebook-connect on-login="RegistrationFormController.fbRegister()" type="large" translation-key="FACEBOOK_CONNECT"></habbo-facebook-connect></div></div><habbo-email-address email-address="RegistrationFormController.registration.email"><label for="email-address" class="form__label" translate="FORM_EMAIL_LABEL"></label><p translate="EMAIL_NEW_HELP"></p></habbo-email-address><habbo-password-new password-new="RegistrationFormController.registration.password" password-new-repeated="RegistrationFormController.registration.passwordRepeated" user-email="{{RegistrationFormController.registration.email}}"></habbo-password-new><habbo-partner-registration ng-if="RegistrationFormController.showPartnerRegistration" value="RegistrationFormController.registration.partnerRegister"></habbo-partner-registration><habbo-birthdate birthdate="RegistrationFormController.registration.birthdate"></habbo-birthdate><habbo-policies policies="RegistrationFormController.registration"></habbo-policies><habbo-captcha ng-if="!RegistrationFormController.hasCaptchaToken" captcha-token="RegistrationFormController.registration.captchaToken"></habbo-captcha><p class="registration-form__safety" translate="REGISTRATION_SAFETY"></p><div class="form__footer"><button ng-disabled="RegistrationFormController.registerInProgress" type="submit" class="form__submit registration-form__button" translate="REGISTRATION_BUTTON"></button></div><p class="registration-form__purchases" translate="REGISTRATION_PURCHASES"></p></form>'),
  6466.     e.put("registration/registration.html", '<habbo-header-small active="register"></habbo-header-small><main class="wrapper wrapper--content"><habbo-registration-form ng-if="RegistrationController.isOpen"></habbo-registration-form><habbo-hotel-closed ng-if="!RegistrationController.isOpen" class="main"></habbo-hotel-closed></main>'),
  6467.     e.put("playing-habbo/habbo-way.html", '<article class="main main--fixed static-content"><habbo-compile data="PlayingHabboController.page"></habbo-compile></article><habbo-ad-unit unit="inlineRectangle" class="aside aside--fixed aside--push-down"></habbo-ad-unit><habbo-web-pages key="common/box_learn_how_to_stay_safe" class="aside aside--box aside--fixed"></habbo-web-pages><habbo-web-pages key="common/box_parents_guide" class="aside aside--box aside--fixed"></habbo-web-pages>'),
  6468.     e.put("playing-habbo/help.html", '<article class="main main--fixed static-content"><habbo-compile data="PlayingHabboController.page"></habbo-compile></article><habbo-web-pages key="playing_habbo/box_helplines" class="aside aside--box aside--fixed aside--push-down"></habbo-web-pages>'),
  6469.     e.put("playing-habbo/how-to-play.html", '<article class="main main--fixed static-content"><habbo-compile data="PlayingHabboController.page"></habbo-compile></article><habbo-ad-unit unit="inlineRectangle" class="aside aside--fixed aside--push-down"></habbo-ad-unit><habbo-web-pages key="common/box_habbo_way" class="aside aside--box aside--fixed"></habbo-web-pages><habbo-web-pages key="common/box_learn_how_to_stay_safe" class="aside aside--box aside--fixed"></habbo-web-pages><habbo-web-pages key="common/box_need_help" class="aside aside--box aside--fixed"></habbo-web-pages>'),
  6470.     e.put("playing-habbo/playing-habbo.html", '<habbo-header-small active="playingHabbo"></habbo-header-small><habbo-tabs><habbo-tab path="/playing-habbo/what-is-habbo" translation-key="PLAYING_HABBO_WHAT_IS_HABBO_TAB"></habbo-tab><habbo-tab path="/playing-habbo/how-to-play" translation-key="PLAYING_HABBO_HOW_TO_PLAY_TAB"></habbo-tab><habbo-tab path="/playing-habbo/habbo-way" translation-key="PLAYING_HABBO_HABBO_WAY_TAB"></habbo-tab><habbo-tab path="/playing-habbo/safety" translation-key="PLAYING_HABBO_SAFETY_TAB"></habbo-tab><habbo-tab path="/playing-habbo/help" translation-key="PLAYING_HABBO_HELP_TAB"></habbo-tab></habbo-tabs><main class="wrapper wrapper--content" ui-view></main>'),
  6471.     e.put("playing-habbo/safety.html", '<article class="main main--fixed static-content"><habbo-compile data="PlayingHabboController.page"></habbo-compile></article><habbo-ad-unit unit="inlineRectangle" class="aside aside--fixed aside--push-down"></habbo-ad-unit><habbo-web-pages key="common/box_parents_guide" class="aside aside--box aside--fixed"></habbo-web-pages><habbo-web-pages key="common/box_need_help" class="aside aside--box aside--fixed"></habbo-web-pages>'),
  6472.     e.put("playing-habbo/what-is-habbo.html", '<article class="main main--fixed static-content"><habbo-compile data="PlayingHabboController.page"></habbo-compile></article><habbo-ad-unit unit="inlineRectangle" class="aside aside--fixed aside--push-down"></habbo-ad-unit><habbo-web-pages key="common/box_how_to_play" class="aside aside--box aside--fixed"></habbo-web-pages><habbo-web-pages key="common/box_habbo_way" class="aside aside--box aside--fixed"></habbo-web-pages><habbo-web-pages key="common/box_parents_guide" class="aside aside--box aside--fixed"></habbo-web-pages>'),
  6473.     e.put("profile/profile.html", '<habbo-header-small class="profile__header"><habbo-profile-header figure="{{:: ProfileController.profile.figureString}}" user="{{:: ProfileController.profile.name}}" motto="{{:: ProfileController.profile.motto}}" profile="true"><h1>{{:: ProfileController.profile.name}}</h1><div ng-if="ProfileController.profile.motto" class="profile__motto">{{:: ProfileController.profile.motto}}</div></habbo-profile-header></habbo-header-small><habbo-social-share type="profile"></habbo-social-share><main class="wrapper wrapper--content"><div ng-if="ProfileController.items.badges.length > 0\n                || ProfileController.items.friends.length > 0\n                || ProfileController.items.rooms.length > 0\n                || ProfileController.items.groups.length > 0" class="profile__section"><div ng-if="ProfileController.profile.selectedBadges.length > 0" class="profile__card__wrapper--badges"><section class="profile__card__aligner"><div class="profile__card"><h2 translate="PROFILE_BADGES_TITLE" class="profile__card__title"></h2><habbo-badge-list badges="ProfileController.profile.selectedBadges" class="item-list--grid"></habbo-badge-list><div class="profile__card__footer"><habbo-profile-modal items="ProfileController.items.badges" type="badges"></habbo-profile-modal></div></div></section></div><div ng-if="ProfileController.items.friends.length > 0" class="profile__card__wrapper--friends"><section class="profile__card__aligner"><div class="profile__card"><h2 class="profile__card__title"><span translate="PROFILE_FRIENDS_TITLE"></span> <span class="profile__friends__count" translate="PROFILE_FRIENDS_COUNT" translate-values="{ current: ProfileController.items.friends.length > 5 ? 5 : ProfileController.items.friends.length, all: ProfileController.items.friends.length }"></span></h2><habbo-friend-list ng-init="fiveFriends = (ProfileController.items.friends | orderBy: random | limitTo: 5)" friends="fiveFriends" class="item-list--grid"></habbo-friend-list><div class="profile__card__footer"><habbo-profile-modal items="ProfileController.items.friends" type="friends"></habbo-profile-modal></div></div></section></div><div ng-if="ProfileController.items.rooms.length > 0" class="profile__card__wrapper--rooms"><section class="profile__card__aligner"><div class="profile__card"><h2 translate="PROFILE_ROOMS_TITLE" class="profile__card__title"></h2><habbo-room-list ng-init="fiveRooms = (ProfileController.items.rooms | orderBy: random | limitTo: 5)" rooms="fiveRooms" class="item-list--grid"></habbo-room-list><div class="profile__card__footer"><habbo-profile-modal items="ProfileController.items.rooms" type="rooms"></habbo-profile-modal></div></div></section></div><div ng-if="ProfileController.items.groups.length > 0" class="profile__card__wrapper--groups"><section class="profile__card__aligner"><div class="profile__card"><h2 translate="PROFILE_GROUPS_TITLE" class="profile__card__title"></h2><habbo-group-list ng-init="fiveGroups = (ProfileController.items.groups | orderBy: random | limitTo: 5)" groups="fiveGroups" class="item-list--grid"></habbo-group-list><div class="profile__card__footer"><habbo-profile-modal items="ProfileController.items.groups" type="groups"></habbo-profile-modal></div></div></section></div></div></main><section ng-if="ProfileController.photos.length > 0" class="wrapper wrapper--content"><div class="profile__creations"><h2 class="profile__creations__title" translate="PROFILE_PHOTOS_TITLE"></h2><habbo-columns-profile items="ProfileController.photos"></habbo-columns-profile><a href="/community/photos" class="profile__photos__link" translate="PHOTOS_TITLE"></a></div></section><section ng-if="ProfileController.stories.length > 0" class="wrapper wrapper--content"><div class="profile__creations"><h2 class="profile__creations__title" translate="PROFILE_CREATIONS_TITLE"></h2><habbo-columns-profile items="ProfileController.stories"></habbo-columns-profile></div></section><footer class="wrapper wrapper--content"><h2 class="profile__joined" translate="PROFILE_JOINED" translate-values="{ date: (ProfileController.profile.memberSince | date: \'longDate\') }"></h2><div class="profile__hearts"><i class="icon icon--heart"></i><i class="icon icon--heart"></i><i class="icon icon--heart"></i></div></footer>'),
  6474.     e.put("settings/settings.html", '<habbo-header-small active="settings"></habbo-header-small><habbo-tabs title-key="SETTINGS_TITLE"><habbo-tab path="/settings/privacy" translation-key="SETTINGS_PRIVACY_TAB"></habbo-tab><habbo-tab habbo-require-habbo-account-session path="/settings/security" translation-key="SETTINGS_ACCOUNT_SECURITY_TAB"></habbo-tab><habbo-tab habbo-require-habbo-account-session path="/settings/password" translation-key="SETTINGS_PASSWORD_TAB"></habbo-tab><habbo-tab habbo-require-habbo-account-session path="/settings/email" translation-key="SETTINGS_EMAIL_TAB"></habbo-tab><habbo-tab path="/settings/avatars" translation-key="SETTINGS_AVATAR_TAB"></habbo-tab></habbo-tabs><main class="wrapper wrapper--content"><section class="main" ui-view></section><habbo-web-pages key="common/box_learn_how_to_stay_safe" class="aside aside--box aside--push-down"></habbo-web-pages><habbo-web-pages key="common/box_need_help" class="aside aside--box"></habbo-web-pages></main>'),
  6475.     e.put("shop/shop.html", '<habbo-header-small active="shop"></habbo-header-small><habbo-tabs><habbo-tab path="/shop" strict-path="true" translation-key="SHOP_BUY_TAB"></habbo-tab><habbo-tab path="/shop/subscriptions" translation-key="SHOP_SUBSCRIPTIONS_TAB"></habbo-tab><habbo-tab path="/shop/prepaid" translation-key="SHOP_PREPAID_TAB"></habbo-tab><habbo-tab ng-if="ShopController.earnCreditsEnabled" path="/shop/earn-credits" translation-key="SHOP_EARN_CREDITS_TAB"></habbo-tab><habbo-tab path="/shop/history" translation-key="SHOP_HISTORY_TAB"></habbo-tab></habbo-tabs><main class="wrapper wrapper--content" ui-view></main><habbo-shop-footer class="wrapper wrapper--content"></habbo-shop-footer>'),
  6476.     e.put("common/avatar/avatar.html", '<a ng-href="/profile/{{:: AvatarController.user | encodeURIComponent}}" class="avatar"><habbo-imager user="{{:: AvatarController.user}}" size="{{:: AvatarController.big ? \'largehead\' : \'bighead\'}}" class="avatar__image"></habbo-imager><h6 class="avatar__title" ng-class="{ \'avatar__title--big\': AvatarController.big }">{{:: AvatarController.user}}</h6></a>'),
  6477.     e.put("common/badge/badge.html", "<img ng-src=\"{{:: BadgeController.badgeUrl + '/' + BadgeController.code + '.gif'}}\" alt=\"{{:: BadgeController.name}}\">"),
  6478.     e.put("common/empty-results/empty-results.html", "<span translate=\"{{:: EmptyResultsController.translationKey || 'EMPTY_RESULTS_TEXT' }}\"></span>"),
  6479.     e.put("common/ad-unit/ad-unit.html", '<habbo-ad-double-click ng-if="AdUnitController.hasAds() && !AdUnitController.isAdsPrevented()" unit="{{:: AdUnitController.unit}}"></habbo-ad-double-click>'),
  6480.     e.put("common/footer/footer.html", '<footer class="wrapper"><div class="footer__media"><p class="footer__media__label" translate="FOLLOW_HABBO"></p><ul itemscope itemtype="http://schema.org/Organization"><link itemprop="url" href="https://www.habbo.nl"><li class="footer__media__item"><a href="https://www.facebook.com/HabboNL" class="footer__media__link" target="_blank" itemprop="sameAs"><i class="icon icon--facebook"></i></a></li><li class="footer__media__item"><a href="https://twitter.com/Habbo_Staff" class="footer__media__link" target="_blank" itemprop="sameAs"><i class="icon icon--twitter"></i></a></li><li class="footer__media__item"><a href="https://www.youtube.com/user/Habbo" class="footer__media__link" target="_blank" itemprop="sameAs"><i class="icon icon--youtube"></i></a></li><li class="footer__media__item"><a href="https://www.habbo.nl/rss.xml" class="footer__media__link" target="_blank" itemprop="sameAs"><i class="icon icon--rss"></i></a></li></ul></div><div class="footer__content"><ul class="footer__nav"><li ng-repeat="link in FooterController.links" class="footer__nav__item"><a ng-href="{{link + \'_LINK\' | translate | zendeskRedirectUrl}}" class="footer__nav__link" target="_blank" translate="{{:: link}}"></a></li></ul><p class="footer__copyright" translate="FOOTER_COPYRIGHT" translate-values="{ year: FooterController.currentYear }"></p><a href="http://www.sulake.com" target="_blank" class="footer__sulake">Sulake</a></div></footer>'),
  6481.     e.put("common/accordion/accordion-item-content.html", '<div ng-hide="AccordionItemContentController.height === 0" class="accordion-item-content ng-hide" ng-transclude></div>'),
  6482.     e.put("common/accordion/accordion-item.html", '<li ng-class="{ \'accordion-item--expanded\': AccordionItemController.expanded }" class="accordion-item" ng-transclude></li>'),
  6483.     e.put("common/group-badge/group-badge.html", "<img ng-src=\"{{:: GroupBadgeController.imagingUrl + '/badge/' + GroupBadgeController.code + '.gif'}}\" alt=\"{{:: GroupBadgeController.name}}\">"),
  6484.     e.put("common/eu-cookie-banner/eu-cookie-banner.html", '<div ng-show="EuCookieBannerController.show" class="eu-cookie-banner ng-hide"><div class="wrapper"><span translate="EU_COOKIE_BANNER"></span> <a ng-href="{{\'EU_COOKIE_BANNER_READ_MORE_LINK\' | translate}}" translate="EU_COOKIE_BANNER_READ_MORE" target="_blank"></a></div><i ng-click="EuCookieBannerController.close()" class="eu-cookie-banner__close icon icon--close"></i></div>'),
  6485.     e.put("common/header/header-large.html", '<div habbo-sticky-header class="header__top sticky-header sticky-header--top"><div class="wrapper"><div class="header__top__content"><div ng-init="toggle = false;"><button ng-click="toggle = true;" ng-disabled="toggle" ng-hide="toggle" class="header__top__toggle">{{\'LOGIN\' | translate}}</button><div ng-show="toggle" class="header__login-form ng-hide"><habbo-login-form></habbo-login-form></div></div></div></div></div><div class="header__content" ng-transclude></div><header class="header__wrapper wrapper"><a href="/" class="header__habbo__logo"><h1 class="header__habbo__name" id="ga-linkid-habbo-large">Habbo</h1></a></header><habbo-navigation active="{{:: HeaderLargeController.active}}"></habbo-navigation>'),
  6486.     e.put("common/header/header-small.html", '<habbo-header-ad></habbo-header-ad><div class="header__hotel"></div><header class="header__wrapper wrapper"><a href="/" class="header__habbo__logo"><h1 class="header__habbo__name" id="ga-linkid-habbo">Habbo</h1></a><habbo-user-menu habbo-require-session class="header__aside header__aside--user-menu"></habbo-user-menu><div habbo-require-no-session class="header__aside"><button ng-click="HeaderSmallController.openLoginModal()" class="header__login__button"><span class="header__login__icon" translate="LOGIN"></span></button></div></header><habbo-navigation active="{{:: HeaderSmallController.active}}"></habbo-navigation><div class="wrapper" ng-transclude></div>'),
  6487.     e.put("common/hotel-closed/hotel-closed.html", '<div class="hotel-closed"><h1 translate="HOTEL_CLOSED_TITLE"></h1><h3 translate="HOTEL_CLOSED_HOURS"></h3><p translate="HOTEL_CLOSED_DESCRIPTION"></p><ul class="hotel-closed__list"><li><a href="/community/photos" translate="COMMUNITY_PHOTOS_TAB"></a></li><li><a href="/community/category/all" translate="COMMUNITY_NEWS_TAB"></a></li><li><a href="/shop" translate="NAVIGATION_SHOP"></a></li></ul></div>'),
  6488.     e.put("common/message-container/message-container.html", '<section class="message-container" ng-transclude></section>'),
  6489.     e.put("common/like/like.html", '<div class="like__action"><a ng-click="(LikeController.data | myLike) ? LikeController.unlike() : LikeController.like()"><span translate="{{ (LikeController.data | myLike) ? \'UNLIKE\' : \'LIKE\' }}"></span> <span class="like__count">{{LikeController.data.likes.length}}</span></a></div><div ng-click="LikeController.show = !LikeController.show;" ng-mouseenter="LikeController.mouseenter()" ng-mouseleave="LikeController.show = false;" habbo-false-on-outside-click="LikeController.show" class="like__thumb"><div ng-if="LikeController.data.likes.length > 0" ng-show="LikeController.show" class="like__users ng-hide"><ul><li ng-if="LikeController.data | myLike" class="like__user"><habbo-avatar user="{{:: LikeController.data | myLike}}"></habbo-avatar></li><li ng-repeat="liker in LikeController.data | othersLikes | limitTo: ((LikeController.data | myLike) ? 4 : 5) track by liker" class="like__user"><habbo-avatar user="{{:: liker}}"></habbo-avatar></li></ul><small ng-if="LikeController.data.likes.length > 5" class="like__more">...{{ \'MORE_LIKES\' | translate: { count: LikeController.data.likes.length - 5 } }}</small></div><i class="like__icon icon icon--like"></i></div>'),
  6490.     e.put("common/lightbox/lightbox-modal.html", '<button ng-click="$dismiss()" class="lightbox__close modal__close"></button> <img ng-src="{{:: LightboxController.src}}" class="lightbox__image">'),
  6491.     e.put("common/imager/imager.html", '<img ng-src="{{:: ImagerController.src}}" ng-srcset="{{:: ImagerController.src + \' 1x\' + (ImagerController.src2x ? (\', \' + ImagerController.src2x + \' 2x\') : \'\')}}" ng-style="{ \'min-width\': ImagerController.dimensions.width }" alt="{{:: ImagerController.name || ImagerController.user }}" width="{{:: ImagerController.dimensions.width }}" height="{{:: ImagerController.dimensions.height }}" class="imager">'),
  6492.     e.put("common/tabs/tab.html", '<li class="tab"><a ng-href="{{:: TabController.path}}" ng-class="{ \'tab__link--active\': TabController.active }" class="tab__link" translate="{{:: TabController.translationKey}}"></a></li>'),
  6493.     e.put("common/tabs/tabs.html", '<nav ng-hide="TabsController.tabs.length < 2" class="tabs"><h1 ng-if="TabsController.titleKey" class="tabs__title" translate="{{:: TabsController.titleKey}}"></h1><div ng-click="TabsController.open = !TabsController.open" class="tabs__toggle"><div ng-class="{\'tabs__toggle__title--active\': TabsController.open}" class="tabs__toggle__title" translate="{{TabsController.activeTab.translationKey}}"></div></div><ul class="tabs__menu ng-hide" ng-hide="!TabsController.open" ng-transclude></ul></nav>'),
  6494.     e.put("common/official-room-avatar/official-room-avatar.html", '<div class="room-official-avatar__wrapper"><div class="room-official-avatar__inner"><div class="room-official-avatar__image"></div><h6 class="room-official-avatar__text" translate="ROOM_OFFICIAL_OWNER"></h6></div></div>'),
  6495.     e.put("common/social-share/social-share.html", '<div class="social-share"><a ng-click="SocialShareController.shareOnTwitter()" class="social-share__link"><i class="icon icon--twitter"></i></a> <a ng-click="SocialShareController.shareOnFacebook()" class="social-share__link"><i class="icon icon--facebook"></i></a> <span class="social-share__text" translate="SOCIAL_SHARE"></span></div>'),
  6496.     e.put("community/fansites/fansites.html", '<section class="wrapper wrapper--content"><article class="main main--fixed static-content"><habbo-compile data="FansitesController.fansites"></habbo-compile></article><habbo-ad-unit unit="inlineRectangle" class="aside aside--fixed aside--push-down"></habbo-ad-unit><habbo-web-pages key="common/box_habbo_way" class="aside aside--box aside--fixed"></habbo-web-pages></section>'),
  6497.     e.put("community/photos/photos.html", '<header class="photos__header"><div class="photos__header__container wrapper"><div class="photos__header__image__wrapper"><div class="photos__header__image"></div></div><div class="photos__header__content"><h1 class="photos__header__title" translate="PHOTOS_TITLE"></h1><p translate="PHOTOS_DESCRIPTION"></p></div></div></header><section class="wrapper wrapper--content"><habbo-columns-channel items="PhotosController.photos"></habbo-columns-channel></section>'),
  6498.     e.put("community/rooms/rooms.html", '<header class="rooms__header"><div class="rooms__header__container wrapper"><div class="rooms__header__image__wrapper"><div class="rooms__header__image"></div></div><div class="rooms__header__content"><h1 class="rooms__header__title" translate="ROOMS_TITLE"></h1><p translate="ROOMS_DESCRIPTION"></p></div></div></header><section class="wrapper wrapper--content rooms-wrapper"><div ng-repeat="room in RoomsController.rooms" class="room-item"><a ng-href="/room/{{:: room.id}}" class="room-item__link"><div class="room-item__thumbnail"><img habbo-remove-on-error class="room-item__thumbnail__image" ng-src="{{room.thumbnailUrl}}"></div></a> <a ng-href="/room/{{:: room.id}}" class="room-item__link"><h2 class="room-item__title">{{:: room.name}}</h2></a><p class="room-item__description">{{:: room.description}}</p><div ng-switch="room.publicRoom"><official-room-avatar ng-switch-when="true" class="room-item__owner--official"></official-room-avatar><habbo-avatar ng-switch-when="false" class="room-item__owner--user" user="{{:: room.ownerName}}"></habbo-avatar></div></div></section>'),
  6499.     e.put("community/article/article.html", '<section class="wrapper wrapper--content"><habbo-compile data="ArticleController.article" class="main main--fixed"></habbo-compile><habbo-ad-unit unit="inlineRectangle" class="aside aside--fixed"></habbo-ad-unit><habbo-web-pages key="common/box_learn_how_to_stay_safe" class="aside aside--box aside--fixed"></habbo-web-pages></section>'),
  6500.     e.put("email/email-report-unauthorized/email-report-unauthorized-form.html", '<form ng-submit="EmailReportUnauthorizedFormController.report()" name="emailReportUnauthorizedForm" novalidate><div class="form__footer"><a href="/" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button ng-disabled="EmailReportUnauthorizedFormController.reportInProgress" type="submit" class="form__submit" translate="EMAIL_REPORT_UNAUTHORIZED_BUTTON"></button></div></form>'),
  6501.     e.put("email/email-report-unauthorized/email-report-unauthorized.html", '<habbo-header-small></habbo-header-small><main class="wrapper wrapper--content"><section class="main"><habbo-message-container type="exclamation"><h2 translate="EMAIL_REPORT_UNAUTHORIZED_TITLE"></h2><h4 class="email-report-unauthorized-form__email">{{:: EmailReportUnauthorizedController.email}}</h4><p translate="EMAIL_REPORT_UNAUTHORIZED_TEXT"></p><habbo-email-report-unauthorized-form emailaddress="EmailReportUnauthorizedController.email" hash="EmailReportUnauthorizedController.hash"></habbo-email-report-unauthorized-form></habbo-message-container></section></main>'),
  6502.     e.put("community/category/category.html", '<section class="wrapper wrapper--content"><habbo-compile data="CategoryController.category" class="main main--fixed"></habbo-compile><habbo-ad-unit unit="inlineRectangle" class="aside aside--fixed"></habbo-ad-unit><habbo-web-pages key="common/box_learn_how_to_stay_safe" class="aside aside--box aside--fixed"></habbo-web-pages></section>'),
  6503.     e.put("home/messaging/messaging.html", '<section><h1 translate="MESSAGING_TITLE"></h1><habbo-discussions items="MessagingController.discussions"></habbo-discussions></section>'),
  6504.     e.put("home/news/news.html", '<habbo-moderation-notification habbo-require-session></habbo-moderation-notification><section><h1 translate="NEWS_TITLE"></h1><div class="main main--fixed"><habbo-compile data="NewsController.promos"></habbo-compile><div class="news__navigation"><a href="/community/category/all" class="news__more" translate="NEWS_MORE"></a></div></div><habbo-ad-unit unit="inlineRectangle" class="aside aside--fixed"></habbo-ad-unit><habbo-web-pages key="common/box_learn_how_to_stay_safe" class="aside aside--box aside--fixed"></habbo-web-pages><habbo-web-pages key="common/box_parents_guide" class="aside aside--box aside--fixed"></habbo-web-pages></section>'),
  6505.     e.put("room/room-info/room-info.html", '<ul class="room-info"><li class="room-info__row"><h3 class="room-info__header" translate="ROOM_DESCRIPTION"></h3><span class="room-info__value room-info--description">{{:: RoomInfoController.description}}</span></li><li class="room-info__row"><h3 class="room-info__header" translate="ROOM_TAGS"></h3><span class="room-info__value">{{:: RoomInfoController.tags.join(\', \')}}</span></li></ul>'),
  6506.     e.put("hotel/client/client.html", '<div ngsf-fullscreen habbo-client-close-fullscreen-on-hide ng-class="{ \'client--visible\': ClientController.visible }" class="client"><div class="client__buttons"><button ng-click="ClientController.close()" habbo-client-close-expander class="client__close"><i class="client__close__icon icon icon--habbo"></i><div habbo-client-close-expand class="client__close__expand"><div class="client__close__text" translate="CLIENT_TO_WEB_BUTTON"></div></div></button> <button ngsf-toggle-fullscreen class="client__fullscreen"><i show-if-fullscreen="false" class="client__fullscreen__icon icon icon--fullscreen"></i> <i show-if-fullscreen class="client__fullscreen__icon icon icon--fullscreen-back"></i></button></div><iframe id="hotel-client" ng-if="ClientController.isOpen && ClientController.flashEnabled" ng-src="{{ ClientController.client.clienturl }}" habbo-client-communication class="client__frame"></iframe><habbo-client-reload ng-if="ClientController.isOpen && ClientController.flashEnabled && !ClientController.running" reload="ClientController.reload()"></habbo-client-reload><habbo-client-error ng-if="ClientController.isOpen && !ClientController.flashEnabled"></habbo-client-error><habbo-client-closed ng-if="!ClientController.isOpen"></habbo-client-closed><habbo-interstitial></habbo-interstitial></div>'),
  6507.     e.put("room/room-picture/room-picture.html", '<section class="room-picture__wrapper"><img habbo-remove-on-error class="room-picture__image" ng-src="{{:: RoomPictureController.url}}"></section>'),
  6508.     e.put("room/room-restricted/room-restricted.html", '<main class="wrapper wrapper--content room-restricted"><section class="room-restricted__content"><h3 translate="ROOM_RESTRICTED_TITLE"></h3><h4 class="room-restricted__name">{{:: RoomRestrictedController.room.name}}</h4><div class="room-restricted__explanation" translate="ROOM_RESTRICTED_TEXT"></div><a habbo-require-flash ng-href="/hotel?room={{:: RoomRestrictedController.room.id}}" class="room__enter-button"><span class="room__enter-button__text" translate="ROOM_ENTER_BUTTON"></span></a></section></main>'),
  6509.     e.put("registration/birthdate/birthdate.html", '<fieldset class="form__fieldset"><label for="birthdate-day" class="form__label" translate="FORM_BIRTHDATE_LABEL"></label><p translate="BIRTHDATE_HELP"></p><div class="form__field"><select id="birthdate-day" ng-model="BirthdateController.day" ng-class="{ \'ng-invalid\': (BirthdateController.FormController.birthdate.$invalid && !day|| BirthdateController.FormController.birthdate.$error.remoteDataAge)\n                && (!BirthdateController.FormController.birthdate.$pristine || BirthdateController.FormController.$submitted) }" class="form__select birthdate__day"><option translate="BIRTHDATE_DAY"></option><option ng-repeat="day in BirthdateController.days | daysInMonth: BirthdateController.month : BirthdateController.year" ng-value="{{day}}">{{day}}</option></select><select ng-model="BirthdateController.month" ng-class="{ \'ng-invalid\': (BirthdateController.FormController.birthdate.$invalid && !month || BirthdateController.FormController.birthdate.$error.remoteDataAge)\n                && (!BirthdateController.FormController.birthdate.$pristine || BirthdateController.FormController.$submitted) }" class="form__select birthdate__month"><option translate="BIRTHDATE_MONTH"></option><option ng-repeat="month in BirthdateController.months" ng-value="{{month.value}}" translate="{{month.translationKey}}"></option></select><select ng-model="BirthdateController.year" ng-class="{ \'ng-invalid\': (BirthdateController.FormController.birthdate.$invalid && !year || BirthdateController.FormController.birthdate.$error.remoteDataAge)\n                && (!BirthdateController.FormController.birthdate.$pristine || BirthdateController.FormController.$submitted) }" class="form__select birthdate__year"><option translate="BIRTHDATE_YEAR"></option><option ng-repeat="year in BirthdateController.years" ng-value="{{year}}">{{year}}</option></select><input name="birthdate" ng-model="BirthdateController.birthdate" required type="hidden"><div ng-if="BirthdateController.FormController.birthdate.$invalid && (!BirthdateController.FormController.birthdate.$pristine || BirthdateController.FormController.$submitted)" ng-messages="BirthdateController.FormController.birthdate.$error" class="form__popover form__popover--error"><div ng-message="required">{{ \'ERROR_FIELD_REQUIRED\' | translate }}</div></div></div></fieldset>'),
  6510.     e.put("registration/policies/policies.html", '<fieldset class="form__fieldset form__fieldset--box"><div class="form__field"><label for="terms-of-service" class="form__label form__label--checkbox"><input id="terms-of-service" name="termsOfServiceAccepted" ng-model="PoliciesController.policies.termsOfServiceAccepted" required type="checkbox" class="form__checkbox"> <span translate="POLICIES_TERMS_OF_SERVICE"></span></label><div ng-if="PoliciesController.FormController.termsOfServiceAccepted.$invalid\n             && (!PoliciesController.FormController.termsOfServiceAccepted.$pristine\n             || PoliciesController.FormController.$submitted)" ng-messages="PoliciesController.FormController.termsOfServiceAccepted.$error" class="form__popover form__popover--error"><div ng-message="required">{{ \'ERROR_FIELD_REQUIRED\' | translate }}</div></div></div><div class="form__field"><label for="marketing" class="form__label form__label--checkbox"><input id="marketing" ng-model="PoliciesController.policies.marketingAllowed" type="checkbox" class="form__checkbox"> <span translate="POLICIES_MARKETING"></span></label></div></fieldset>'),
  6511.     e.put("home/register-banner/register-banner.html", '<div class="register-banner__hotel"></div><div class="register-banner__wrapper"><div class="register-banner__register"><h1 class="register-banner__logo">Habbo</h1><h2 class="register-banner__title" translate="HEADER_TITLE"></h2><a href="/registration" habbo-android-download-link habbo-ios-download-link class="register-banner__button" translate="REGISTER_PROMPT"></a><habbo-local-register-banner></habbo-local-register-banner></div></div>'),
  6512.     e.put("registration/partner-registration/partner-registration.html", '<fieldset class="form__fieldset form__fieldset--box partner-registration"><label for="partner-register" class="form__label" translate="PARTNER_REGISTRATION_LABEL"></label><p translate="PARTNER_REGISTRATION_HELP"></p><div class="form__field"><label for="partner-register" class="form__label--checkbox partner-registration__checkbox"><input id="partner-register" ng-model="PartnerRegistrationController.value" type="checkbox" class="form__checkbox"> <span translate="PARTNER_REGISTRATION_ACCEPT"></span></label></div></fieldset>'),
  6513.     e.put("room/room-open/room-open.html", '<main><section class="wrapper wrapper--content"><div class="room__thumbnail"><img habbo-remove-on-error class="room__thumbnail__image" ng-src="{{:: RoomOpenController.room.thumbnailUrl}}"></div><div class="room__content"><h1 class="room__content__title">{{:: RoomOpenController.room.name}}</h1><div class="room__content__left"><div ng-switch="RoomOpenController.room.publicRoom"><official-room-avatar ng-switch-when="true" class="room__owner--official"></official-room-avatar><habbo-avatar ng-switch-when="false" class="room__owner--user" user="{{:: RoomOpenController.room.ownerName}}"></habbo-avatar></div><habbo-room-info description="{{:: RoomOpenController.room.description}}" tags="RoomOpenController.room.tags"></habbo-room-info><a habbo-require-flash ng-href="/hotel?room={{:: RoomOpenController.room.id}}" class="room__enter-button"><span class="room__enter-button__text" translate="ROOM_ENTER_BUTTON"></span></a></div><div class="room__content__right"><div class="room__details"><h3 translate="ROOM_DETAILS"></h3><dl><dt translate="ROOM_RATING"></dt><dd>{{:: RoomOpenController.room.rating}}</dd><dt translate="ROOM_MAX_USERS"></dt><dd>{{:: RoomOpenController.room.maximumVisitors}}</dd></dl></div><div class="room__actions"><a class="room__report" habbo-require-flash ng-href="{{:: RoomOpenController.room.hotelReportLink}}"><span class="room__report__text" translate="ROOM_REPORT_ACTION"></span></a></div></div></div></section><habbo-room-picture url="{{:: RoomOpenController.room.imageUrl}}"></habbo-room-picture></main>'),
  6514.     e.put("profile/creation/creation-content.html", '<section class="creation-content" ng-style="{ \'max-width\': CreationContentController.creation.contentWidth }"><div class="creation-content__expander"><h2 ng-if="CreationContentController.creation.title" class="creation-content__title">{{:: CreationContentController.creation.title}}</h2><div class="creation-content__view"><a habbo-creation-href="CreationContentController.previous" habbo-navigate-to-on-key="left" ng-class="{ \'creation-content__link--disabled\' : !CreationContentController.previous }" class="creation-content__link"><i class="icon icon--arrow-prev"></i></a> <img ng-src="{{:: CreationContentController.creation.url}}" width="{{:: CreationContentController.creation.contentWidth}}" height="{{:: CreationContentController.creation.contentHeight}}" class="creation-content__creation"> <a habbo-creation-href="CreationContentController.next" habbo-navigate-to-on-key="right" ng-class="{ \'creation-content__link--disabled\' : !CreationContentController.next }" class="creation-content__link"><i class="icon icon--arrow-next"></i></a></div><div class="creation-content__meta"><time ng-if="CreationContentController.creation.time">{{:: CreationContentController.creation.time | date: \'longDate\'}}</time><habbo-report ng-if="CreationContentController.creation.type === \'PHOTO\'" creation="CreationContentController.creation"></habbo-report><habbo-like data="CreationContentController.creation" class="creation-content__like"></habbo-like></div><div ng-if="CreationContentController.creation.type === \'PHOTO\'" class="creation-content__actions"><a href="/community/photos" class="creation-content__channel-link" translate="PHOTOS_TITLE"></a><habbo-photo-delete ng-if="CreationContentController.isDeletable()" creation="CreationContentController.creation" class="creation-content__delete"></habbo-photo-delete></div></div></section>'),
  6515.     e.put("profile/creation/creation.html", '<habbo-header-small class="profile__header"><habbo-profile-header user="{{:: CreationController.creation.creator_name}}"><h1><small class="creation__header-by" translate="BY"></small> <span>{{:: CreationController.creation.creator_name}}</span></h1></habbo-profile-header></habbo-header-small><habbo-social-share type="creation"></habbo-social-share><main class="wrapper wrapper--content"><habbo-creation-content creation="CreationController.creation" previous="CreationController.previous" next="CreationController.next"></habbo-creation-content></main>'),
  6516.     e.put("profile/item-lists/badges.html", '<ul ng-init="limit = 20" infinite-scroll="limit = limit + 10" infinite-scroll-container="\'.modal\'" infinite-scroll-distance="1"><li ng-repeat="badge in BadgeListController.badges | byNameDescriptionOrMotto: BadgeListController.query | limitTo: limit" class="item item--small item--badge"><div class="item__content"><div class="item__icon"><div class="item__icon__aligner"><habbo-badge code="{{:: badge.code}}" name="{{:: badge.name}}"></habbo-badge></div></div><div class="item__text"><h6 class="item__title item__title--multi-line">{{:: badge.name}}</h6><p class="item__description">{{:: badge.description}}</p></div></div></li></ul>'),
  6517.     e.put("profile/item-lists/friends.html", '<ul ng-init="limit = 14" infinite-scroll="limit = limit + 7" infinite-scroll-container="\'.modal\'" infinite-scroll-distance="1"><li ng-repeat="friend in FriendListController.friends | byNameDescriptionOrMotto: FriendListController.query | limitTo: limit" class="item item--friend"><a ng-href="/profile/{{:: friend.name | encodeURIComponent}}" ng-init="wave = false" ng-mouseenter="wave = true" ng-mouseleave="wave = false" class="item__content"><div class="item__icon" ng-switch="wave"><habbo-imager ng-switch-when="false" figure="{{:: friend.figureString}}" name="{{:: friend.name}}" direction="s" action="stand" class="item__icon__friend"></habbo-imager><habbo-imager ng-switch-when="true" figure="{{:: friend.figureString}}" name="{{:: friend.name}}" direction="s" action="wave" class="item__icon__friend"></habbo-imager></div><div class="item__text"><h6 class="item__title item__title--single-line">{{:: friend.name}}</h6><p ng-if="friend.motto" class="item__description">{{:: friend.motto}}</p></div></a></li></ul>'),
  6518.     e.put("profile/item-lists/groups.html", '<ul ng-init="limit = 20" infinite-scroll="limit = limit + 10" infinite-scroll-container="\'.modal\'" infinite-scroll-distance="1"><li ng-repeat="group in GroupListController.groups | byNameDescriptionOrMotto: GroupListController.query | limitTo: limit" class="item item--small item--group"><a habbo-flash-href="{{:: group.roomId ? \'/hotel?room=\' + group.roomId : \'\'}}" class="item__content"><div class="item__icon"><div class="item__icon__aligner"><habbo-group-badge code="{{:: group.badgeCode}}" name="{{:: group.name}}"></habbo-group-badge></div></div><div class="item__text"><h6 class="item__title item__title--multi-line">{{:: group.name}}</h6><p ng-if="group.description" class="item__description">{{:: group.description}}</p></div></a></li></ul>'),
  6519.     e.put("profile/item-lists/rooms.html", '<ul ng-init="limit = 16" infinite-scroll="limit = limit + 8" infinite-scroll-container="\'.modal\'" infinite-scroll-distance="1"><li ng-repeat="room in RoomListController.rooms | byNameDescriptionOrMotto: RoomListController.query | limitTo: limit" class="item item--room"><a ng-href="/room/{{:: room.id}}" class="item__content"><habbo-room-icon class="item__icon" url="{{:: room.thumbnailUrl}}"></habbo-room-icon><div class="item__text"><h6 class="item__title item__title--single-line">{{:: room.name}}</h6><p ng-if="room.description" class="item__description">{{:: room.description}}</p></div></a></li></ul>'),
  6520.     e.put("profile/profile-header/profile-header.html", '<div class="profile-header__avatar"><div ng-if="ProfileHeaderController.profile === \'true\'" class="profile-header__link"><habbo-imager ng-if="!ProfileHeaderController.isCroco(ProfileHeaderController.motto)" figure="{{:: ProfileHeaderController.figure}}" user="{{:: ProfileHeaderController.figure ? \'\' : ProfileHeaderController.user}}" name="{{:: ProfileHeaderController.user}}" class="profile-header__image"></habbo-imager><div ng-if="ProfileHeaderController.isCroco(ProfileHeaderController.motto)" class="profile-header__image profile-header__image--croco"><img src="https://habboo-a.akamaihd.net/habbo-web/america/nl/assets/images/croco.dcdb9e74.png"></div></div><a ng-if="ProfileHeaderController.profile !== \'true\'" ng-href="/profile/{{:: ProfileHeaderController.user | encodeURIComponent}}" class="profile-header__link"><habbo-imager figure="{{:: ProfileHeaderController.figure}}" user="{{:: ProfileHeaderController.figure ? \'\' : ProfileHeaderController.user}}" name="{{:: ProfileHeaderController.user}}" size="largehead" class="profile-header__image profile-header__image--largehead"></habbo-imager></a></div><div class="profile-header__details"><div ng-if="ProfileHeaderController.profile === \'true\'" ng-transclude></div><a ng-if="ProfileHeaderController.profile !== \'true\'" ng-href="/profile/{{:: ProfileHeaderController.user | encodeURIComponent}}" class="profile-header__details__link" ng-transclude></a></div>'),
  6521.     e.put("profile/profile-modal/profile-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="{{:: \'PROFILE_\' + ProfileModalController.type.toUpperCase() + \'_TITLE\'}}" class="modal__title"></h3><habbo-search query="query"></habbo-search><div class="item-list--stacked" ng-switch="ProfileModalController.type"><habbo-badge-list ng-switch-when="badges" badges="ProfileModalController.items" query="query"></habbo-badge-list><habbo-friend-list ng-switch-when="friends" friends="ProfileModalController.items" query="query"></habbo-friend-list><habbo-room-list ng-switch-when="rooms" rooms="ProfileModalController.items" query="query"></habbo-room-list><habbo-group-list ng-switch-when="groups" groups="ProfileModalController.items" query="query"></habbo-group-list></div><habbo-empty-results ng-if="(ProfileModalController.items | byNameDescriptionOrMotto: query).length === 0" class="profile-modal__empty"></habbo-empty-results>'),
  6522.     e.put("router/spinner/spinner.html", '<div class="spinner"><h1 class="spinner__logo">Habbo</h1><div class="spinner__indicator"></div></div>'),
  6523.     e.put("settings/account-security/account-security-edit.html", '<habbo-message-container ng-if="AccountSecurityEditController.accountSecurityStatus === \'enabled\'" type="check"><h3 translate="ACCOUNT_SECURITY_STATUS_ENABLED_TITLE"></h3><div class="account-security__status"><button ng-click="AccountSecurityEditController.openModal()" class="account-security__edit" translate="ACCOUNT_SECURITY_EDIT_BUTTON"></button> <button ng-click="AccountSecurityEditController.disable()" ng-disabled="AccountSecurityEditController.disableInProgress" class="account-security__disable" translate="ACCOUNT_SECURITY_DISABLE"></button></div></habbo-message-container><habbo-message-container ng-if="AccountSecurityEditController.accountSecurityStatus === \'disabled\'" type="exclamation"><h3 translate="ACCOUNT_SECURITY_STATUS_DISABLED_TITLE"></h3><button ng-click="AccountSecurityEditController.openModal()" class="account-security__enable" translate="ACCOUNT_SECURITY_ENABLE_BUTTON"></button></habbo-message-container><habbo-message-container ng-if="AccountSecurityEditController.accountSecurityStatus === \'identity_verification_required\'" type="exclamation"><h3 translate="ACCOUNT_SECURITY_STATUS_VERIFICATION_REQUIRED_TITLE"></h3><a ng-href="/settings/email" translate="ACCOUNT_SECURITY_STATUS_VERIFICATION_REQUIRED_LINK_TEXT"></a></habbo-message-container>'),
  6524.     e.put("settings/account-security/account-security.html", '<h2 translate="ACCOUNT_SECURITY_TITLE"></h2><p translate="ACCOUNT_SECURITY_DESCRIPTION"></p><habbo-account-security-edit account-security-status="AccountSecurityController.accountSecurityStatus"></habbo-account-security-edit><div ng-if="AccountSecurityController.accountSecurityStatus === \'enabled\'" class="account-security__trusted-locations"><h2 translate="ACCOUNT_SECURITY_TRUSTED_LOCATIONS_TITLE"></h2><p translate="ACCOUNT_SECURITY_TRUSTED_LOCATIONS_DESCRIPTION"></p><habbo-trusted-locations-reset></habbo-trusted-locations-reset></div>'),
  6525.     e.put("settings/account-security/trusted-locations-reset.html", '<button ng-click="TrustedLocationsResetController.reset()" ng-disabled="TrustedLocationsResetController.inProgress" class="account-security__reset" translate="ACCOUNT_SECURITY_RESET_TRUSTED_LOGINS_BUTTON"></button>'),
  6526.     e.put("settings/email-change/email-change-form.html", '<form ng-submit="EmailChangeFormController.update()" name="emailChangeForm" autocomplete="off" novalidate class="form form--left"><habbo-password-current password-current="EmailChangeFormController.emailChangeData.currentPassword"></habbo-password-current><habbo-email-address email-address="EmailChangeFormController.emailChangeData.newEmail" type="box"><label for="email-address" class="form__label" translate="FORM_NEW_EMAIL_LABEL"></label><p translate="EMAIL_NEW_HELP"></p></habbo-email-address><div class="form__footer"><button ng-disabled="EmailChangeFormController.updateInProgress" type="submit" class="form__submit" translate="FORM_BUTTON_CHANGE"></button></div></form>'),
  6527.     e.put("settings/email-change/email-change.html", '<habbo-activation-status></habbo-activation-status><h2 translate="EMAIL_CHANGE_TITLE"></h2><habbo-email-change-form></habbo-email-change-form>'),
  6528.     e.put("settings/avatar-selection/avatar-selection.html", '<h2 translate="AVATAR_SELECTION_TITLE"></h2><habbo-avatar-create require-non-staff-account-session avatars="AvatarSelectionController.avatars"></habbo-avatar-create><habbo-avatar-search avatars="AvatarSelectionController.avatars"></habbo-avatar-search>'),
  6529.     e.put("settings/privacy-settings/privacy-settings-form.html", '<form ng-submit="PrivacySettingsFormController.save()" name="privacySettingsForm" novalidate class="form form--left"><fieldset class="form__fieldset"><h4 translate="SETTINGS_PROFILE_VISIBILITY_TITLE"></h4><p translate="SETTINGS_PROFILE_VISIBILITY_DESCRIPTION"></p><div class="form__field"><label class="form__label form__label--radiobutton"><input name="profileVisible" ng-model="PrivacySettingsFormController.privacySettings.profileVisible" ng-value="true" type="radio" class="form__radiobutton"> <span translate="SETTINGS_EVERYONE_LABEL"></span></label></div><div class="form__field"><label class="form__label form__label--radiobutton"><input name="profileVisible" ng-model="PrivacySettingsFormController.privacySettings.profileVisible" ng-value="false" type="radio" class="form__radiobutton"> <span translate="SETTINGS_ME_LABEL"></span></label></div></fieldset><fieldset class="form__fieldset form__fieldset--box"><h4 translate="SETTINGS_ONLINE_STATUS_TITLE"></h4><p translate="SETTINGS_ONLINE_STATUS_DESCRIPTION"></p><div class="form__field"><label class="form__label form__label--radiobutton"><input name="onlineStatusVisible" ng-model="PrivacySettingsFormController.privacySettings.onlineStatusVisible" ng-value="true" type="radio" class="form__radiobutton"> <span translate="SETTINGS_EVERYONE_LABEL"></span></label></div><div class="form__field"><label class="form__label form__label--radiobutton"><input name="onlineStatusVisible" ng-model="PrivacySettingsFormController.privacySettings.onlineStatusVisible" ng-value="false" type="radio" class="form__radiobutton"> <span translate="SETTINGS_ME_LABEL"></span></label></div></fieldset><fieldset class="form__fieldset"><h4 translate="SETTINGS_FRIENDS_CAN_FOLLOW_TITLE"></h4><div class="form__field"><label for="friend-can-follow" class="form__label form__label--checkbox"><input id="friend-can-follow" name="friendCanFollow" ng-model="PrivacySettingsFormController.privacySettings.friendCanFollow" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_FRIEND_CAN_FOLLOW_LABEL"></span></label></div></fieldset><fieldset class="form__fieldset form__fieldset--box"><h4 translate="SETTINGS_FRIEND_REQUESTS_ENABLED_TITLE"></h4><div class="form__field"><label for="friend-request-enable" class="form__label form__label--checkbox"><input id="friend-request-enable" name="friendRequestEnabled" ng-model="PrivacySettingsFormController.privacySettings.friendRequestEnabled" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_FRIEND_REQUESTS_LABEL"></span></label></div></fieldset><fieldset class="form__fieldset"><h4 translate="SETTINGS_OFFLINE_MESSAGING_ENABLED_TITLE"></h4><div class="form__field"><label for="offline-messaging-enable" class="form__label form__label--checkbox"><input id="offline-messaging-enable" name="offlineMessagingEnabled" ng-model="PrivacySettingsFormController.privacySettings.offlineMessagingEnabled" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_OFFLINE_MESSAGING_LABEL"></span></label></div></fieldset><fieldset class="form__fieldset form__fieldset--box"><h4 translate="SETTINGS_EMAIL_NOTIFICATIONS_TITLE"></h4><div class="form__field"><label for="email-newsletter-enable" class="form__label form__label--checkbox"><input id="email-newsletter-enable" name="emailNewsletterEnabled" ng-model="PrivacySettingsFormController.privacySettings.emailNewsletterEnabled" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_NEWSLETTER_LABEL"></span></label></div><div class="form__field"><span translate="SETTINGS_EMAIL_NOTIFICATIONS_SUBTITLE"></span><label class="form__label form__label--checkbox"><input name="emailMiniMailNotificationEnabled" ng-model="PrivacySettingsFormController.privacySettings.emailMiniMailNotificationEnabled" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_NOTIFICATION_MINIMAIL_LABEL"></span></label><label class="form__label form__label--checkbox"><input name="emailFriendRequestNotificationEnabled" ng-model="PrivacySettingsFormController.privacySettings.emailFriendRequestNotificationEnabled" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_NOTIFICATION_FRIEND_REQUEST_LABEL"></span></label><label class="form__label form__label--checkbox"><input name="emailGiftNotificationEnabled" ng-model="PrivacySettingsFormController.privacySettings.emailGiftNotificationEnabled" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_NOTIFICATION_GIFT_LABEL"></span></label><label class="form__label form__label--checkbox"><input name="emailRoomMessageNotificationEnabled" ng-model="PrivacySettingsFormController.privacySettings.emailRoomMessageNotificationEnabled" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_NOTIFICATION_ROOM_LABEL"></span></label><label class="form__label form__label--checkbox"><input name="emailGroupNotificationEnabled" ng-model="PrivacySettingsFormController.privacySettings.emailGroupNotificationEnabled" type="checkbox" class="form__checkbox"> <span translate="SETTINGS_ENABLE_NOTIFICATION_GROUP_LABEL"></span></label></div></fieldset><div class="form__footer"><button ng-disabled="PrivacySettingsFormController.sendInProgress" type="submit" class="form__submit" translate="FORM_BUTTON_SAVE"></button></div></form>'),
  6530.     e.put("settings/privacy-settings/privacy-settings.html", '<h2 translate="PRIVACY_SETTINGS_TITLE"></h2><habbo-privacy-settings-form privacy-settings="PrivacySettingsController.privacySettings"></habbo-privacy-settings-form>'),
  6531.     e.put("settings/password-change/password-change-form.html", '<form ng-submit="PasswordChangeFormController.update()" name="changePasswordForm" autocomplete="off" novalidate class="form form--left"><habbo-password-current password-current="PasswordChangeFormController.passwords.currentPassword"></habbo-password-current><habbo-password-new is-new="true" password-new="PasswordChangeFormController.passwords.password" password-new-repeated="PasswordChangeFormController.passwords.passwordRepeated" user-name="{{:: PasswordChangeFormController.user.name}}" user-email="{{:: PasswordChangeFormController.user.email}}"></habbo-password-new><div class="form__footer"><button ng-disabled="PasswordChangeFormController.updateInProgress" type="submit" class="form__submit" translate="FORM_BUTTON_CHANGE"></button></div></form>'),
  6532.     e.put("settings/password-change/password-change.html", '<h2 translate="PASSWORD_CHANGE_TITLE"></h2><habbo-password-change-form></habbo-password-change-form>'),
  6533.     e.put("security/login/login-form.html", '<form ng-submit="LoginController.login()" name="loginForm" novalidate habbo-shake class="login-form__form"><fieldset class="form__fieldset login-form__fieldset"><div class="form__field"><input name="email" type="email" ng-model="LoginController.email" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required habbo-email habbo-remote-data="\'credentials\'" autofocus placeholder="{{\'FORM_EMAIL_LABEL\' | translate}}" class="form__input login-form__input"></div></fieldset><fieldset class="form__fieldset login-form__fieldset"><div class="form__field"><input name="password" type="password" ng-model="LoginController.password" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required habbo-remote-data="\'credentials\'" placeholder="{{\'FORM_PASSWORD_LABEL\' | translate}}" class="form__input login-form__input"></div><habbo-claim-password class="form__helper login-form__helper"></habbo-claim-password></fieldset><button ng-disabled="LoginController.loginInProgress" type="submit" class="login-form__button" translate="LOGIN_BUTTON"></button></form><div class="login-form__social"><habbo-facebook-connect on-login="LoginController.onLogin()" type="large" translation-key="FACEBOOK_LOGIN"></habbo-facebook-connect><habbo-facebook-connect on-login="LoginController.onLogin()" type="small"></habbo-facebook-connect><div class="login-form__rpx"><habbo-rpx-login></habbo-rpx-login></div></div><div class="login-form__register"><a href="/registration" habbo-android-download-link habbo-ios-download-link translate="LOGIN_REGISTER"></a></div>'),
  6534.     e.put("security/login/login-modal.html", '<div class="login"><button ng-click="$dismiss()" class="modal__close"></button><h3 translate="LOGIN" class="modal__title"></h3><div class="modal__content"><habbo-login-form on-login="$close()"></habbo-login-form></div></div>'),
  6535.     e.put("security/safety-lock/safety-answering-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="SAFETY_LOCK_TITLE" class="modal__title"></h3><div class="modal__content"><habbo-safety-answering-form data="SafetyAnsweringController.data" questions="SafetyAnsweringController.questions" target-action="SafetyAnsweringController.targetAction(SafetyAnsweringController.data)" on-success="$close()" on-cancel="$dismiss()"></habbo-safety-answering-form></div>'),
  6536.     e.put("security/safety-lock/safety-lock-form.html", '<form ng-submit="unlock()" name="safetyLockForm" novalidate class="form"><p translate="SAFETY_LOCK_ANSWER"></p><div ng-if="safetyLockForm.$error.remoteDataAnswer" class="form__message form__message--error" translate="ERROR_SAFETY_LOCK_ANSWER"></div><fieldset class="form__fieldset"><label for="safety-lock-answer1" class="form__label" translate="{{questions[0].questionKey}}"></label><div class="form__field"><input id="safety-lock-answer1" name="answer1" type="password" ng-model="answers.answer1" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required habbo-remote-data="\'answer\'" habbo-password-toggle-mask autocomplete="off" class="form__input"><div ng-if="safetyLockForm.answer1.$error.required && (!safetyLockForm.answer1.$pristine || safetyLockForm.$submitted)" class="form__popover form__popover--error">{{ \'ERROR_FIELD_REQUIRED\' | translate }}</div></div></fieldset><fieldset class="form__fieldset"><label for="safety-lock-answer2" class="form__label" translate="{{questions[1].questionKey}}"></label><div class="form__field"><input id="safety-lock-answer2" name="answer2" type="password" ng-model="answers.answer2" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required habbo-remote-data="\'answer\'" habbo-password-toggle-mask autocomplete="off" class="form__input"><div ng-if="safetyLockForm.answer1.$error.required && (!safetyLockForm.answer2.$pristine || safetyLockForm.$submitted)" class="form__popover form__popover--error">{{ \'ERROR_FIELD_REQUIRED\' | translate }}</div></div></fieldset><div ng-if="isTrustedLocationEnabled"><fieldset class="form__fieldset form__fieldset--box"><div class="form__field"><label for="trust-once" class="form__label form__label--radiobutton"><input id="trust-once" ng-model="answers.trust" ng-value="false" type="radio" class="form__radiobutton"> <span translate="SAFETY_LOCK_SET_TRUSTED_ONCE"></span></label></div><div class="form__field"><label for="trust-save" class="form__lable form__label--radiobutton"><input id="trust-save" ng-model="answers.trust" ng-value="true" type="radio" class="form__radiobutton"> <span translate="SAFETY_LOCK_SET_TRUSTED_SAVE"></span></label></div></fieldset></div><div class="form__footer"><a ng-click="onCancel()" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button ng-disabled="unlockingInProgress" type="submit" class="form__submit" translate="FORM_BUTTON_UNLOCK"></button></div></form>'),
  6537.     e.put("security/safety-lock/safety-lock-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="SAFETY_LOCK_TITLE" class="modal__title"></h3><div class="modal__content"><habbo-safety-lock-form questions="SafetyLockController.questions" on-unlock="$close()" on-cancel="$dismiss()"></habbo-safety-lock-form></div>'),
  6538.     e.put("shop/credit-icon/credit-icon.html", "<div ng-class=\"[{ 'credit-icon--double': CreditIconController.isDouble },\n               'credit-icon--' + CreditIconController.getIndex(CreditIconController.amount) ]\" class=\"credit-icon\"></div>"),
  6539.     e.put("shop/credit-card-form/credit-card-form.html", '<form ng-submit="CreditCardController.markActiveAndSubmit({ data: CreditCardController.card })" name="creditCardForm" novalidate class="form credit-card-form"><p translate="SHOP_CREDIT_CARD_INSTRUCTION"></p><fieldset class="form__fieldset form__fieldset--inline credit-card-form__input-section"><div class="form__field"><label for="card-number" class="form__label" translate="SHOP_CREDIT_CARD_NUMBER"></label><input id="card-number" name="number" ng-model="CreditCardController.card.number" class="form__input" ng-required="true" cc-number cc-type="cardType" cc-format="true"><div ng-if="creditCardForm.number.$invalid && !creditCardForm.number.$pristine && creditCardForm.number.$touched" class="form__popover form__popover--error form__popover--inline" ng-required="true"><p translate="SHOP_CREDIT_CARD_INVALID_NUMBER"></p></div></div><div class="credit-card-form__expiry-cvc-row form__fieldset"><div class="form__field credit-card-form__expiry-field"><label class="form__label" translate="SHOP_CREDIT_CARD_EXPIRY_DATE"></label><div cc-exp class="credit-card-form__expiry"><input name="month" ng-model="CreditCardController.card.expMonth" cc-exp-month ng-required="true" class="form__input credit-card-form__expiry-input" placeholder="{{\'SHOP_CREDIT_CARD_EXPIRY_HINT_MM\' | translate}}"> <span class="credit-card-form__expiry-slash">/</span> <input name="year" ng-model="CreditCardController.card.expYear" cc-exp-year ng-required="true" class="form__input credit-card-form__expiry-input" placeholder="{{\'SHOP_CREDIT_CARD_EXPIRY_HINT_YY\' | translate}}"></div><div ng-if="(creditCardForm.month.$invalid && !creditCardForm.month.$pristine && creditCardForm.month.$touched)\n                              || (creditCardForm.year.$invalid && !creditCardForm.year.$pristine && creditCardForm.year.$touched)\n                              || (creditCardForm.$error.ccExp && !(creditCardForm.month.$pristine || creditCardForm.year.$pristine) && creditCardForm.month.$touched && creditCardForm.year.$touched)" class="form__popover form__popover--error form__popover--inline"><p translate="SHOP_CREDIT_CARD_INVALID_DATE"></p></div></div><div class="form__field credit-card-form__cvc-field"><label class="form__label" translate="SHOP_CREDIT_CARD_CVC"></label><input name="cvc" ng-required="true" ng-model="CreditCardController.card.cvc" class="form__input credit-card-form__cvc-input" cc-cvc> <img src="https://habboo-a.akamaihd.net/habbo-web/america/nl/assets/images/cc_cvc_instruction.345e33e4.png" class="credit-card-form__cvc-icon"><div ng-if="creditCardForm.cvc.$invalid && !creditCardForm.cvc.$pristine && creditCardForm.cvc.$touched" class="form__popover form__popover--error form__popover--inline"><p translate="SHOP_CREDIT_CARD_INVALID_CVC"></p></div></div></div><div class="form__field"><label class="form__label" translate="SHOP_CREDIT_CARD_NAME"></label><input name="name" ng-model="CreditCardController.card.name" class="form__input" ng-required="true"></div><h3 translate="SHOP_SMALLPRINT_TITLE"></h3><p class="payment-steps__legal" translate="SHOP_CREDIT_CARD_SMALLPRINT"></p></fieldset><button ng-disabled="CreditCardController.paymentInProgress || creditCardForm.$invalid" type="submit" translate="SHOP_PAYMENT_BUTTON" class="payment-methods__button payment-button"></button></form>'),
  6540.     e.put("shop/credit-title/credit-title.html", '<span ng-if="CreditTitleController.isDouble" translate="DOUBLE_CREDITS_PREFIX" class="credit-title__prefix"></span> <span translate="CREDITS_AMOUNT" translate-values="{ value: CreditTitleController.amount }"></span>'),
  6541.     e.put("shop/prepaid/prepaid.html", '<header class="shop__header"><h1 translate="SHOP_PREPAID_TITLE" class="shop__header__title"></h1><habbo-shop-countries ng-if="PrepaidController.countries.length > 1" country="PrepaidController.country" countries="PrepaidController.countries" class="shop__header__country"></habbo-shop-countries></header><section><article class="main static-content"><habbo-compile data="PrepaidController.page"></habbo-compile></article><habbo-purse habbo-require-session class="aside aside--box"></habbo-purse><aside habbo-require-session class="aside aside--box"><h3 translate="SHOP_REDEEM_TITLE"></h3><habbo-voucher-redeem></habbo-voucher-redeem></aside><habbo-web-pages key="common/box_account_issues" class="aside aside--box"></habbo-web-pages></section>'),
  6542.     e.put("shop/earn-credits/earn-credits.html", '<section class="main"><habbo-web-pages key="store/earn-credits/earn-credits"></habbo-web-pages><habbo-earn-credits-frame offer-wall-url="{{:: EarnCreditsController.offerWallUrl.url }}"></habbo-earn-credits-frame></section><habbo-purse habbo-require-session class="aside aside--box aside--push-down"></habbo-purse><habbo-web-pages key="store/earn-credits/box_help" class="aside aside--box"></habbo-web-pages>'),
  6543.     e.put("shop/shop-footer/shop-footer.html", '<footer class="shop-footer"><section class="main shop-footer__main"><h3 translate="SHOP_NOTICE_TITLE" class="shop-footer__title"></h3><p translate="SHOP_NOTICE_CONTENTS" class="shop-footer__text"></p></section><aside class="aside shop-footer__aside"><h4 translate="SHOP_NOTICE_PROVIDER_TITLE" class="shop-footer__title--aside"></h4><p translate="SHOP_NOTICE_PROVIDER" class="shop-footer__text"></p><a ng-href="{{\'FOOTER_SUPPORT_LINK\' | translate | zendeskRedirectUrl}}" target="_blank" translate="FOOTER_SUPPORT" class="shop-footer__link"></a></aside></footer>'),
  6544.     e.put("shop/shop-countries/shop-countries.html", '<label for="shop-country" class="form__label form__label--inline"><small translate="SHOP_COUNTRY_LABEL" translate-values="{ countryName: ShopCountriesController.country.name }"></small></label><select id="shop-country" ng-model="ShopCountriesController.country" ng-options="country.name for country in ShopCountriesController.countries track by country.countryCode" class="form__select form__select--inline"></select>'),
  6545.     e.put("shop/purse/purse.html", '<aside><h3 translate="SHOP_PURSE_TITLE"></h3><div class="purse"><div class="purse__columns"><div class="purse__column"><div translate="SHOP_PURSE_CREDITS" translate-values="{ creditBalance: PurseController.purse.creditBalance }" class="purse__item purse__item--credits"></div><div translate="SHOP_PURSE_DIAMONDS" translate-values="{ diamondBalance: PurseController.purse.diamondBalance }" class="purse__item purse__item--diamonds"></div></div><div class="purse__column"><div class="purse__item purse__item--habbo-club"><span ng-if="PurseController.purse.habboClubDays !== 0" translate="SHOP_PURSE_HC_DAYS" translate-values="{ habboClubDays: PurseController.purse.habboClubDays }"></span> <span ng-if="PurseController.purse.habboClubDays === 0" translate="SHOP_PURSE_NO_HC"></span></div><div class="purse__item purse__item--builders-club"><span ng-if="PurseController.purse.buildersClubDays !== 0" translate="SHOP_PURSE_BC_DAYS" translate-values="{ buildersClubDays: PurseController.purse.buildersClubDays }"></span> <span ng-if="PurseController.purse.buildersClubDays === 0" translate="SHOP_PURSE_NO_BC"></span></div></div></div></div><div class="purse__footer"><a href="/hotel?link=habboUI/open/hccenter" class="purse__hc-center" translate="SHOP_PURSE_HC_LINK"></a></div></aside>'),
  6546.     e.put("shop/transactions/transactions-list.html", '<div ng-if="TransactionsListController.transactions.length > 0"><habbo-transactions-history transactions="TransactionsListController.transactions" limit-to="{{TransactionsListController.transactionLimit}}"></habbo-transactions-history><div class="transactions__footer"><p class="transactions__notice" translate="TRANSACTIONS_NOTICE"></p><button ng-if="!TransactionsListController.hideShowAll\n                       && TransactionsListController.transactions.length > TransactionsListController.transactionLimit" ng-click="TransactionsListController.showAll()" class="transactions__button" translate="TRANSACTIONS_SHOW_ALL"></button></div></div><habbo-empty-results ng-if="TransactionsListController.transactions.length === 0" translation-key="TRANSACTIONS_EMPTY"></habbo-empty-results>'),
  6547.     e.put("shop/transactions/transactions.html", '<header class="shop__header"><h1 class="shop__header__title shop__header__title--single" translate="SHOP_TRANSACTIONS_TITLE"></h1></header><section><habbo-transactions-list transactions="TransactionsController.items" class="main"></habbo-transactions-list><habbo-purse class="aside aside--box"></habbo-purse><habbo-web-pages key="common/box_account_issues" class="aside aside--box"></habbo-web-pages></section>'),
  6548.     e.put("shop/subscriptions/subscriptions.html", '<header class="shop__header"><h1 translate="SHOP_SUBSCRIPTIONS_TITLE" class="shop__header__title"></h1><habbo-shop-countries ng-if="SubscriptionsController.subscriptions.countries.length > 1" country="SubscriptionsController.subscriptions.selectedCountry" countries="SubscriptionsController.subscriptions.countries" class="shop__header__country"></habbo-shop-countries></header><section><div class="main"><habbo-subscription ng-repeat="item in SubscriptionsController.subscriptions.items" item="item"></habbo-subscription></div><habbo-purse class="aside aside--box"></habbo-purse><aside class="aside aside--box"><h3 translate="SHOP_REDEEM_TITLE"></h3><habbo-voucher-redeem></habbo-voucher-redeem></aside><habbo-web-pages key="common/box_mall_info" class="aside aside--box"></habbo-web-pages></section>'),
  6549.     e.put("shop/store/store.html", '<header class="shop__header"><h1 translate="SHOP_TITLE" class="shop__header__title"></h1><habbo-shop-countries ng-if="StoreController.countries.length > 1" country="StoreController.inventory.country" countries="StoreController.countries" class="shop__header__country"></habbo-shop-countries></header><section><div class="main"><habbo-targeted-offer offer="StoreController.offer" ng-if="StoreController.offer"></habbo-targeted-offer><habbo-category-filter ng-show="StoreController.inventory.paymentCategories.length > 0" payment-categories="StoreController.inventory.paymentCategories" selected-category="StoreController.selectedCategory"></habbo-category-filter><habbo-inventory inventory="StoreController.inventory" selected-category="{{StoreController.selectedCategory}}"></habbo-inventory></div><habbo-purse habbo-require-session class="aside aside--box"></habbo-purse><aside habbo-require-session class="aside aside--box"><h3 translate="SHOP_REDEEM_TITLE"></h3><habbo-voucher-redeem></habbo-voucher-redeem></aside><habbo-web-pages key="common/box_mall_info" class="aside aside--box"></habbo-web-pages></section>'),
  6550.     e.put("shop/voucher-redeem/voucher-redeem.html", '<form ng-submit="VoucherRedeemController.redeem()" name="voucherRedeemForm" novalidate class="form"><button ng-disabled="VoucherRedeemController.redeemInProgress" type="submit" translate="SHOP_REDEEM_BUTTON" class="form__submit form__submit--inline"></button><fieldset class="form__fieldset form__fieldset--inline"><div class="form__field"><input placeholder="{{\'SHOP_REDEEM_PLACEHOLDER\' | translate}}" name="voucherCode" ng-model="VoucherRedeemController.voucherCode" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" ng-pattern="/^[a-z0-9]{8}$/i" required autocomplete="off" habbo-remote-data="[\'nonexistent\', \'redeemed\', \'failed\']" class="form__input voucher-redeem__input"><div ng-if="voucherRedeemForm.voucherCode.$invalid && (!voucherRedeemForm.voucherCode.$pristine || voucherRedeemForm.$submitted)" ng-messages="voucherRedeemForm.voucherCode.$error" class="form__popover form__popover--error form__popover--inline"><div ng-message="required">{{\'ERROR_FIELD_REQUIRED\' | translate}}</div><div ng-message="pattern">{{\'ERROR_VOUCHER_CODE_PATTERN\' | translate}}</div><div ng-message="remoteDataNonexistent">{{\'ERROR_VOUCHER_CODE_NONEXISTENT\' | translate}}</div><div ng-message="remoteDataRedeemed">{{\'ERROR_VOUCHER_CODE_REDEEMED\' | translate}}</div><div ng-message="remoteDataFailed">{{\'ERROR_VOUCHER_CODE_FAILED\' | translate}}</div></div></div></fieldset><small class="form__helper" translate="PREPAID_ORDER_INSTRUCTION"></small></form>'),
  6551.     e.put("common/columns/card/card.html", '<div class="card"><div class="card__content"><a habbo-creation-href="CardController.item" class="card__link"><div class="card__image__aligner"><img ng-src="{{:: CardController.item.url}}" ng-class="{\n                       \'card__image--selfie\': CardController.item.type === \'SELFIE\',\n                       \'card__image--photo\': CardController.item.type === \'PHOTO\',\n                       \'card__image--wide\': CardController.item.type === \'USER_CREATION\' && CardController.item.contentHeight < CardController.item.contentWidth,\n                       \'card__image--tall\': CardController.item.type === \'USER_CREATION\' && CardController.item.contentHeight >= CardController.item.contentWidth\n                     }" class="card__image" alt="{{:: CardController.item.title}}"></div></a><div class="card__meta"><h5 ng-if="CardController.item.title" class="card__title">{{:: CardController.item.title}}</h5><time class="card__date">{{:: CardController.item.time | date: \'shortDate\'}}</time><habbo-like data="CardController.item" class="card__like"></habbo-like></div></div><div ng-transclude></div></div>'),
  6552.     e.put("common/columns/columns-channel/columns-channel.html", '<div><div class="columns" ng-init="limit = 16" infinite-scroll="limit = limit + 8" infinite-scroll-distance="1"><habbo-card ng-repeat="card in ColumnsChannelController.items | limitTo: limit" item="card" class="columns__column"><habbo-avatar class="card__creator" user="{{:: card.creator_name}}"></habbo-avatar></habbo-card></div></div>'),
  6553.     e.put("common/columns/columns-profile/columns-profile.html", '<div><div ng-init="limit = 16" infinite-scroll="limit = limit + 8" infinite-scroll-distance="1" class="columns"><habbo-card ng-repeat="card in ColumnsProfileController.items | limitTo: limit" item="card" class="columns__column"></habbo-card></div></div>'),
  6554.     e.put("common/header/hotel-button/hotel-button.html", '<a href="/hotel" class="hotel-button" id="ga-linkid-hotel"><span class="hotel-button__text" translate="NAVIGATION_HOTEL"></span></a>'),
  6555.     e.put("common/ad-unit/ad-double-click/ad-double-click.html", '<div ng-dfp-ad="{{:: AdDoubleClickController.id}}" translation="{{ \'THIRD_PARTY_AD\' | translate }}" class="ad-double-click"></div>'),
  6556.     e.put("common/form/captcha/captcha.html", '<fieldset class="form__fieldset captcha__wrapper"><div class="form__field"><no-captcha g-recaptcha-response="CaptchaController.captchaToken" control="CaptchaController.noCaptchaController" expired-callback="CaptchaController.onExpire" class="captcha"></no-captcha><input name="captchaToken" ng-model="CaptchaController.captchaToken" required type="hidden"><div ng-if="CaptchaController.FormController.captchaToken.$invalid\n                    && (!CaptchaController.FormController.captchaToken.$pristine\n                    || CaptchaController.FormController.$submitted)" class="form__popover form__popover--error form__popover--captcha" translate="ERROR_CAPTCHA_REQUIRED"></div></div></fieldset>'),
  6557.     e.put("common/header/header-ad/header-ad.html", '<div ng-if="HeaderAdController.hasAd" class="header-ad"><habbo-ad-unit unit="leaderboard" class="header-ad__ad"></habbo-ad-unit></div>'),
  6558.     e.put("common/header/navigation/navigation.html", '<nav class="navigation"><ul class="navigation__menu"><li class="navigation__item"><a href="/" ng-class="{ \'navigation__link--active\': NavigationController.active === \'home\' }" class="navigation__link navigation__link--home" translate="NAVIGATION_HOME" id="ga-linkid-home"></a></li><li class="navigation__item"><a href="/community" ng-class="{ \'navigation__link--active\': NavigationController.active === \'community\' }" class="navigation__link navigation__link--community" translate="NAVIGATION_COMMUNITY" id="ga-linkid-community"></a></li><li class="navigation__item"><a href="/shop" ng-class="{ \'navigation__link--active\': NavigationController.active === \'shop\' }" class="navigation__link navigation__link--shop" translate="NAVIGATION_SHOP" id="ga-linkid-shop"></a></li><li class="navigation__item"><a href="/playing-habbo" ng-class="{ \'navigation__link--active\': NavigationController.active === \'playingHabbo\' }" class="navigation__link navigation__link--playing-habbo" translate="NAVIGATION_PLAYING_HABBO" id="ga-linkid-playing-habbo"></a></li><li habbo-require-session class="navigation__item navigation__item--aside navigation__item--hotel"><habbo-hotel-button habbo-require-flash></habbo-hotel-button></li></ul></nav>'),
  6559.     e.put("common/header/user-menu/user-menu.html", '<div ng-init="toggle = false;" habbo-false-on-outside-click="toggle" class="user-menu"><div class="user-menu__header"><a ng-click="toggle = !toggle;" class="user-menu__toggle"><div class="user-menu__name__wrapper"><div class="user-menu__name" ng-class="{ \'user-menu__name--open\': toggle }">{{:: UserMenuController.user.name}}</div></div><habbo-imager figure="{{:: UserMenuController.user.figureString}}" name="{{:: UserMenuController.user.name}}" size="bighead" class="user-menu__avatar"></habbo-imager></a></div><ul ng-hide="!toggle" class="user-menu__list ng-hide"><li class="user-menu__item"><a ng-href="/profile/{{:: UserMenuController.user.name | encodeURIComponent}}" ng-class="{ \'user-menu__link--active\': UserMenuController.isMyProfileActive() }" class="user-menu__link user-menu__link--profile" translate="NAVIGATION_PROFILE"></a></li><li class="user-menu__item"><a href="/settings" ng-class="{ \'user-menu__link--active\': UserMenuController.isSettingsActive() }" class="user-menu__link user-menu__link--settings" translate="NAVIGATION_SETTINGS"></a></li><li class="user-menu__item"><a ng-href="{{\'HELP_URL\' | translate | zendeskRedirectUrl}}" class="user-menu__link user-menu__link--help" target="_blank" translate="NAVIGATION_HELP"></a></li><li class="user-menu__item"><a ng-click="UserMenuController.logout()" class="user-menu__link user-menu__link--logout" translate="NAVIGATION_LOGOUT"></a></li></ul></div>'),
  6560.     e.put("common/form/email-address/email-address.html", '<fieldset class="form__fieldset"><div ng-transclude></div><div class="form__field"><input id="email-address" name="emailAddress" type="email" ng-model="EmailAddressController.emailAddress" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required habbo-email habbo-remote-data="[\'emailInvalid\', \'emailUsedInRegistration\', \'emailUsedInChange\']" autocomplete="off" class="form__input"><div ng-if="EmailAddressController.FormController.emailAddress.$invalid\n                    && (!EmailAddressController.FormController.emailAddress.$pristine\n                    || EmailAddressController.FormController.$submitted)" ng-messages="EmailAddressController.FormController.emailAddress.$error" class="form__popover form__popover--error"><div ng-message="email, remoteDataEmailInvalid">{{ \'ERROR_EMAIL_INVALID\' | translate }}</div><div ng-message="required">{{ \'ERROR_FIELD_REQUIRED\' | translate }}</div><div ng-message="remoteDataEmailUsedInRegistration">{{ \'ERROR_EMAIL_REGISTRATION_USED\' | translate }}</div><div ng-message="remoteDataEmailUsedInChange">{{ \'ERROR_EMAIL_CHANGE_USED\' | translate }}</div></div></div></fieldset>'),
  6561.     e.put("common/form/search/search.html", '<input ng-model="SearchController.query" class="form__input search__input" placeholder="{{ \'SEARCH_PLACEHOLDER\' | translate }}"> <button class="search__clear" ng-click="SearchController.query = \'\';"></button>'),
  6562.     e.put("common/form/password-current/password-current.html", '<fieldset class="form__fieldset"><label for="password-current" translate="CURRENT_PASSWORD_LABEL" class="form__label"></label><div class="form__field"><input id="password-current" name="passwordCurrent" type="password" ng-model="PasswordCurrentController.passwordCurrent" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required habbo-password-toggle-mask habbo-remote-data="\'password\'" autocomplete="off" class="form__input"><div ng-if="PasswordCurrentController.FormController.passwordCurrent.$invalid\n                    && (!PasswordCurrentController.FormController.passwordCurrent.$pristine\n                    || PasswordCurrentController.FormController.$submitted)" ng-messages="PasswordCurrentController.FormController.passwordCurrent.$error" class="form__popover form__popover--error"><div ng-message="required">{{\'ERROR_FIELD_REQUIRED\' | translate}}</div><div ng-message="remoteDataPassword">{{\'ERROR_INCORRECT_PASSWORD\' | translate}}</div></div></div></fieldset>'),
  6563.     e.put("common/form/password-new/password-new.html", '<fieldset class="form__fieldset form__fieldset--box form__fieldset--box-top"><label for="password-new" class="form__label" translate="{{:: PasswordNewController.isNew === \'true\' ? \'NEW_PASSWORD_LABEL\' : \'PASSWORD_LABEL\'}}"></label><p translate="PASSWORD_CHANGE_HELP"></p><div class="form__field"><input id="password-new" name="passwordNew" type="password" ng-model="PasswordNewController.passwordNew" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required ng-maxlength="32" ng-minlength="6" habbo-password-email="{{:: PasswordNewController.userEmail}}" habbo-password-name="{{:: PasswordNewController.userName}}" habbo-password-pattern habbo-password-toggle-mask habbo-remote-data="[\'passwordName\', \'passwordEmail\']" autocomplete="off" class="form__input"><div ng-if="(PasswordNewController.FormController.passwordNew.$invalid\n                    && (!PasswordNewController.FormController.passwordNew.$pristine\n                    || PasswordNewController.FormController.$submitted))\n                    || (!PasswordNewController.FormController.passwordNew.$pristine\n                    && PasswordNewController.FormController.passwordNew.$valid)" ng-messages="PasswordNewController.FormController.passwordNew.$error" ng-class="{ \'form__popover--error\': PasswordNewController.FormController.passwordNew.$invalid }" class="form__popover"><div ng-message="required">{{\'ERROR_FIELD_REQUIRED\' | translate}}</div><habbo-password-strength ng-if="!PasswordNewController.FormController.passwordNew.$error.required" model-value="PasswordNewController.passwordNew" model-name="passwordNew"><div ng-message="maxlength">{{\'ERROR_PASSWORD_MAX_LENGTH\' | translate}}</div><div ng-message="minlength">{{\'ERROR_PASSWORD_MIN_LENGTH\' | translate}}</div><div ng-message="passwordPattern">{{\'ERROR_PASSWORD_PATTERN\' | translate}}</div><div ng-message="passwordName, remoteDataPasswordName">{{\'ERROR_PASSWORD_CONTAINS_NAME\' | translate}}</div><div ng-message="passwordEmail, remoteDataPasswordEmail">{{\'ERROR_PASSWORD_CONTAINS_EMAIL\' | translate}}</div><div ng-message="passwordEmail, remoteDataPasswordEmail">{{\'ERROR_PASSWORD_CONTAINS_EMAIL\' | translate}}</div></habbo-password-strength></div></div></fieldset><fieldset class="form__fieldset form__fieldset--box form__fieldset--box-bottom"><label for="password-new-repeated" class="form__label" translate="PASSWORD_REPEAT_LABEL"></label><div class="form__field"><input id="password-new-repeated" name="passwordNewRepeated" type="password" ng-model="PasswordNewController.passwordNewRepeated" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required habbo-matches="passwordNew" habbo-password-toggle-mask autocomplete="off" class="form__input"><div ng-if="PasswordNewController.FormController.passwordNew.$valid\n                    && PasswordNewController.FormController.passwordNewRepeated.$invalid" ng-messages="PasswordNewController.FormController.passwordNewRepeated.$error" class="form__popover form__popover--error"><div ng-message="required">{{\'ERROR_FIELD_REQUIRED\' | translate}}</div><div ng-message="matches">{{\'ERROR_PASSWORDS_NOT_MATCHING\' | translate}}</div></div></div></fieldset>'),
  6564.     e.put("home/messaging/discussions/discussions.html", '<ul ng-if="DiscussionsController.items.length > 0"><li ng-repeat="discussion in DiscussionsController.items" class="discussions__item"><div class="discussions__participant"><habbo-avatar user="{{:: DiscussionsController.getParticipant(discussion.participants).name}}" big="true"></habbo-avatar></div><div class="discussions__wrapper"><h6 ng-if="discussion.messages.length > 0" am-time-ago="discussion.latestTime" class="discussions__timeago"></h6><ul><li ng-repeat="message in discussion.messages | limitTo: 3" class="discussions__message"><p class="discussions__text">{{:: message.message}}</p><time class="discussions__date"><small>{{:: message.sendTime | date: \'medium\'}}</small></time></li></ul><a ng-href="/hotel?link=friendlist/openchat/{{discussion.discussionId}}" habbo-require-flash translate="DISCUSSIONS_REPLY" class="discussions__reply"></a></div></li></ul><habbo-empty-results ng-if="DiscussionsController.items.length === 0" translation-key="DISCUSSIONS_EMPTY"></habbo-empty-results>'),
  6565.     e.put("hotel/client/client-error/client-error.html", '<div class="client-error"><h1 class="client-error__title" translate="CLIENT_ERROR_TITLE"></h1><p translate="CLIENT_ERROR_FLASH"></p><div class="client-error__downloads"><a ng-href="{{\'CLIENT_ERROR_FLASH_LINK\' | translate}}" target="_blank" class="client-error__flash"></a></div><p translate="CLIENT_ERROR_MOBILE"></p><div class="client-error__downloads"><a ng-href="{{:: ClientErrorController.appStoreUrl}}" target="_blank" class="client-error__appstore"></a> <a ng-href="{{:: ClientErrorController.googlePlayUrl}}" target="_blank" class="client-error__googleplay"></a></div></div>'),
  6566.     e.put("hotel/client/client-closed/client-closed.html", "<habbo-hotel-closed></habbo-hotel-closed>"),
  6567.     e.put("hotel/client/client-reload/client-reload.html", '<h1 translate="RELOAD_TITLE"></h1><button ng-click="ClientReloadController.reload()" class="client-reload__button" translate="RELOAD_BUTTON"></button>'),
  6568.     e.put("hotel/client/interstitial/interstitial.html", '<div ng-if="InterstitialController.started" ng-class="{ \'interstitial--visible\': InterstitialController.loaded }" class="interstitial"><div class="interstitial__stage"><iframe ng-src="{{InterstitialController.habboWebAdsUrl + \'interstitial.\' + InterstitialController.lang + \'.html\'}}" class="interstitial__ad"></iframe></div><p class="interstitial__text" translate="INTERS_DESCRIPTION"></p><p class="interstitial__text" translate="INTERS_INSTRUCTION"></p></div>'),
  6569.     e.put("home/register-banner/local-register-banner/local-register-banner.html", '<small ng-if="LocalRegisterBannerController.site" class="local-register-banner">{{ \'LOCAL_REGISTER_BANNER_\' + LocalRegisterBannerController.site.localization | translate }} <a ng-href="{{LocalRegisterBannerController.site.href}}">{{LocalRegisterBannerController.site.title}}</a></small>'),
  6570.     e.put("profile/creation/photo-delete/photo-delete.html", '<button type="button" ng-click="PhotoDeleteController.delete()" class="photo-delete">{{\'CREATION_DELETE\' | translate}}</button>'),
  6571.     e.put("home/news/moderation-notification/moderation-notification.html", '<habbo-message-container ng-if="ModerationNotificationController.moderations.length > 0" type="exclamation" class="moderation-notification static-content"><h3 translate="MODERATION_MESSAGE_TITLE"></h3><p translate="MODERATION_MESSAGE_TEXT" translate-values="{moderationCount: ModerationNotificationController.moderations.length}"></p><ul><li ng-repeat="moderation in ModerationNotificationController.moderations">{{:: moderation.createdAt | date: "fullDate" }}</li></ul><p translate="MODERATION_MESSAGE_INSTRUCTIONS"></p></habbo-message-container>'),
  6572.     e.put("profile/item-lists/room-icon/room-icon.html", '<div class="room-icon"><img habbo-show-on-load habbo-remove-on-error ng-src="{{:: RoomIconController.url}}" class="room-icon__thumbnail"></div>'),
  6573.     e.put("profile/creation/report/report-form.html", '<form ng-submit="ReportFormController.send()" name="reportForm" novalidate class="form"><p translate="REPORT_EXPLANATION"></p><img ng-src="{{:: ReportFormController.creation.url}}" class="report-form__creation"><fieldset class="form__fieldset form__fieldset--box"><p class="report-form__description" translate="REPORT_REMOVE_BECAUSE"></p><div ng-repeat="reason in ReportFormController.reasonCodes" class="form__field"><label class="form__label form__label--radiobutton"><input name="reportReason" ng-model="ReportFormController.creation.reportReason" ng-value="reason" required type="radio" class="form__radiobutton"> <span translate="REPORT_REASON_{{reason}}"></span></label></div></fieldset><div ng-if="reportForm.$invalid && reportForm.$submitted" ng-messages="reportForm.$error" class="form__popover form__popover--error"><div ng-message="required">{{\'ERROR_FIELD_REQUIRED\' | translate}}</div></div><p translate="REPORT_REPORT_FAIRLY"></p><div class="form__footer"><a ng-click="ReportFormController.onCancel()" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button type="submit" class="form__submit report-form__submit" ng-disabled="ReportFormController.sendInProgress" translate="REPORT_SUBMIT"></button></div></form>'),
  6574.     e.put("profile/creation/report/report-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h4 class="modal__title" translate="REPORT_TITLE"></h4><div class="modal__content"><habbo-report-form creation="ReportController.creation" on-success="$close()" on-cancel="$dismiss()"></habbo-report-form></div>'),
  6575.     e.put("profile/creation/report/report.html", '<a ng-click="ReportController.click()" class="report"><i class="report__icon icon icon--report"></i></a>'),
  6576.     e.put("settings/email-change/activation-status/activation-status.html", '<habbo-message-container ng-if="ActivationStatusController.user.emailVerified" type="check"><h3 translate="EMAIL_VERIFIED_TITLE" class="activation-status__title"></h3><p translate="EMAIL_VERIFIED_TEXT" translate-values="{{:: ActivationStatusController.user}}" class="activation-status__text"></p></habbo-message-container><habbo-message-container ng-if="!ActivationStatusController.user.emailVerified" type="exclamation"><h3 translate="ACTIVATION_RESEND_TITLE" class="activation-status__title"></h3><p translate="ACTIVATION_RESEND_TEXT" translate-values="{{:: ActivationStatusController.user}}" class="activation-status__text"></p><div class="activation-status__controls"><button ng-click="ActivationStatusController.resend()" ng-disabled="ActivationStatusController.resendInProgress || ActivationStatusController.isSent" class="activation-status__submit" translate="ACTIVATION_RESEND_BUTTON"></button></div></habbo-message-container>'),
  6577.     e.put("settings/avatar-selection/avatar-search/avatar-search.html", '<habbo-search query="query"></habbo-search><ul class="avatar-search__avatars"><habbo-avatar-selector ng-repeat="avatar in AvatarSearchController.avatars | byNameDescriptionOrMotto: query | orderBy: [\'-lastWebAccess\', \'name\']" avatar="avatar"></habbo-avatar-selector></ul><habbo-empty-results ng-if="(AvatarSearchController.avatars | byNameDescriptionOrMotto: query).length === 0"></habbo-empty-results>'),
  6578.     e.put("settings/avatar-selection/avatar-search/avatar-selector.html", '<li ng-class="{ \'avatar-selector--selected\': AvatarSelectorController.isSelected }" class="avatar-selector"><habbo-imager figure="{{:: AvatarSelectorController.avatar.figureString}}" name="{{:: AvatarSelectorController.avatar.name}}" direction="s" action="stand" class="avatar-selector__avatar"></habbo-imager><div class="avatar-selector__content"><h4 class="avatar-selector__name">{{:: AvatarSelectorController.avatar.name}}</h4><p ng-if="AvatarSelectorController.avatar.motto" class="avatar-selector__details">{{:: AvatarSelectorController.avatar.motto}}</p><p class="avatar-selector__details avatar-selector__details--last-access">{{\'AVATAR_SELECTION_LAST_LOGIN\' | translate}} <time am-time-ago="AvatarSelectorController.avatar.lastWebAccess"></time></p><p ng-if="AvatarSelectorController.avatar.banned" class="avatar-selector__details--banned" translate="AVATAR_SELECTION_BANNED"></p></div><div ng-if="!AvatarSelectorController.isSelected && !AvatarSelectorController.avatar.banned" class="avatar-selector__select"><button habbo-require-non-staff-account-session ng-click="AvatarSelectorController.select()" ng-disabled="AvatarSelectorController.selectionInProgress" class="avatar-selector__button" translate="AVATAR_SELECTION_SELECT_BUTTON"></button></div></li>'),
  6579.     e.put("settings/avatar-selection/avatar-create/avatar-create-form.html", '<form ng-submit="AvatarCreateFormController.create()" name="avatarCreateForm" novalidate class="form avatar-create-form"><fieldset class="form__fieldset"><label for="avatar-name" class="form__label" translate="AVATAR_CREATE_LABEL"></label><div class="form__field"><input id="avatar-name" name="name" ng-model="AvatarCreateFormController.name" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required ng-minlength="3" ng-maxlength="15" ng-pattern="/^[a-zA-Z0-9_\\-\\=\\?\\!@\\:\\.,\\$]+$/" ng-trim="true" habbo-avatar-name-check autofocus class="form__input"><div ng-if="avatarCreateForm.name.$invalid && (!avatarCreateForm.name.$pristine || avatarCreateForm.$submitted)" ng-messages="avatarCreateForm.name.$error" class="form__popover form__popover--error"><div ng-message="required">{{\'ERROR_FIELD_REQUIRED\' | translate}}</div><div ng-message="minlength">{{\'ERROR_FIELD_MINLENGTH\' | translate: \'{ min: 3 }\'}}</div><div ng-message="maxlength">{{\'ERROR_FIELD_MAXLENGTH\' | translate: \'{ max: 15 }\'}}</div><div ng-message="pattern">{{\'ERROR_FIELD_NAME_FORMAT\' | translate}}</div><div ng-message="name">{{\'ERROR_FIELD_NAME_TAKEN\' | translate}}</div></div></div><small class="form__helper" translate="AVATAR_CREATE_HELP"></small></fieldset><div class="form__footer"><a ng-click="AvatarCreateFormController.onCancel()" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button ng-disabled="AvatarCreateFormController.createInProgress" type="submit" translate="FORM_BUTTON_CREATE" class="form__submit"></button></div></form>'),
  6580.     e.put("settings/avatar-selection/avatar-create/avatar-create-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="AVATAR_CREATE_TITLE" class="modal__title"></h3><div class="modal__content"><habbo-avatar-create-form on-create="$close()" on-cancel="$dismiss()"></habbo-avatar-create-form></div>'),
  6581.     e.put("settings/avatar-selection/avatar-create/avatar-create.html", '<div class="avatar-create" ng-class="{ \'avatar-create--disabled\': avatars.length === MAX_AVATARS || (!emailVerified && !identityVerified) }"><div ng-if="avatars.length < MAX_AVATARS && identityVerified" class="avatar-create__text" translate="AVATAR_CREATE_MORE" translate-values="{ count: MAX_AVATARS - avatars.length }"></div><div ng-if="!emailVerified && !identityVerified" class="avatar-create__text" translate="AVATAR_CREATE_EMAIL_UNVERIFIED"></div><div ng-if="avatars.length === MAX_AVATARS" class="avatar-create__text" translate="AVATAR_CREATE_MAX"></div><div class="avatar-create__button__wrapper"><button ng-click="open()" ng-disabled="avatars.length === MAX_AVATARS || (!emailVerified && !identityVerified)" class="avatar-create__button" translate="AVATAR_CREATE_BUTTON"></button></div></div>'),
  6582.     e.put("settings/account-security/safety-questions/safety-questions-form.html", '<form ng-submit="SafetyQuestionsFormController.save()" name="safetyQuestionsForm" novalidate class="form"><p translate="ACCOUNT_SECURITY_FORM_DESCRIPTION"></p><fieldset class="form__fieldset form__fieldset--box form__fieldset--box-top"><label for="safety-questions-question1" class="form__label" translate="ACCOUNT_SECURITY_QUESTION1_LABEL"></label><div class="form__field"><select id="safety-questions-question1" name="question1" ng-options="question.questionKey | translate for question in SafetyQuestionsFormController.questions | question: SafetyQuestionsFormController.selectedQuestion2" ng-model="SafetyQuestionsFormController.selectedQuestion1" class="form__select"></select></div><label for="safety-questions-answer1" class="form__label" translate="ACCOUNT_SECURITY_ANSWER1_LABEL"></label><div class="form__field"><input id="safety-questions-answer1" type="password" name="answer1" ng-model="SafetyQuestionsFormController.answer1" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required maxlength="255" habbo-password-toggle-mask autocomplete="off" class="form__input"><div ng-if="safetyQuestionsForm.answer1.$invalid && (!safetyQuestionsForm.answer1.$pristine || safetyQuestionsForm.$submitted)" ng-messages="safetyQuestionsForm.answer1.$error" class="form__popover form__popover--error"><div ng-message="required">{{\'ERROR_FIELD_REQUIRED\' | translate}}</div></div></div></fieldset><fieldset class="form__fieldset form__fieldset--box form__fieldset--box-bottom"><label for="safety-questions-question2" class="form__label" translate="ACCOUNT_SECURITY_QUESTION2_LABEL"></label><div class="form__field"><select id="safety-questions-question2" name="question2" ng-options="question.questionKey | translate for question in SafetyQuestionsFormController.questions | question: SafetyQuestionsFormController.selectedQuestion1" ng-model="SafetyQuestionsFormController.selectedQuestion2" class="form__select"></select></div><label for="safety-questions-answer2" class="form__label" translate="ACCOUNT_SECURITY_ANSWER2_LABEL"></label><div class="form__field"><input id="safety-questions-answer2" type="password" name="answer2" ng-model="SafetyQuestionsFormController.answer2" ng-model-options="{ updateOn: \'default blur\', debounce: { default: 500, blur: 0 } }" required maxlength="255" habbo-password-toggle-mask autocomplete="off" class="form__input"><div ng-if="safetyQuestionsForm.answer2.$invalid && (!safetyQuestionsForm.answer2.$pristine || safetyQuestionsForm.$submitted)" ng-messages="safetyQuestionsForm.answer2.$error" class="form__popover form__popover--error"><div ng-message="required">{{\'ERROR_FIELD_REQUIRED\' | translate}}</div></div></div></fieldset><habbo-password-current password-current="SafetyQuestionsFormController.password"></habbo-password-current><div class="form__footer"><a ng-click="SafetyQuestionsFormController.onCancel()" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button ng-disabled="SafetyQuestionsFormController.saveInProgress" type="submit" translate="FORM_BUTTON_SAVE" class="form__submit"></button></div></form>'),
  6583.     e.put("settings/account-security/safety-questions/safety-questions-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="ACCOUNT_SECURITY_TITLE" class="modal__title"></h3><div class="modal__content"><habbo-safety-questions-form on-save="$close()" on-cancel="$dismiss()"></habbo-safety-questions-form></div>'),
  6584.     e.put("security/force/force-email/force-email-form.html", '<form ng-submit="ForceEmailFormController.save()" name="forceEmailChangeForm" autocomplete="off" novalidate class="form"><p translate="FORCED_EMAIL_CHANGE_TEXT"></p><h4 class="force-email__email">{{:: ForceEmailFormController.oldEmailAddress}}</h4><habbo-email-address email-address="ForceEmailFormController.emailAddress" type="box"><label for="email-address" class="form__label" translate="FORM_NEW_EMAIL_LABEL"></label></habbo-email-address><div class="form__footer"><a ng-click="ForceEmailFormController.onDismiss()" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button ng-disabled="ForceEmailFormController.saveInProgress" type="submit" class="form__submit" translate="FORM_BUTTON_CHANGE"></button></div></form>'),
  6585.     e.put("security/force/force-email/force-email-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="FORCED_EMAIL_CHANGE_TITLE" class="modal__title"></h3><div class="modal__content"><habbo-force-email-form old-email-address="{{:: ForceEmailController.oldEmailAddress}}" on-dismiss="$dismiss()" on-success="$close(email)"></habbo-force-email-form></div>'),
  6586.     e.put("security/login/captcha-modal/captcha-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="CAPTCHA_TITLE" class="modal__title"></h3><div class="modal__content"><form novalidate><p translate="CAPTCHA_DESCRIPTION"></p><habbo-captcha captcha-token="captchaToken"></habbo-captcha></form></div>'),
  6587.     e.put("security/login/claim-password/claim-password-form.html", '<form ng-submit="ClaimPasswordFormController.send()" name="claimPasswordForm" novalidate class="form"><div ng-hide="ClaimPasswordFormController.sent"><div ng-transclude></div><habbo-email-address email-address="ClaimPasswordFormController.emailAddress"><label for="email-address" class="form__label" translate="FORM_ACCOUNT_EMAIL_LABEL"></label></habbo-email-address><div class="form__footer"><a ng-click="ClaimPasswordFormController.cancel()" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button ng-disabled="ClaimPasswordFormController.sendingInProgress" type="submit" class="form__submit" translate="FORM_BUTTON_SEND"></button></div></div><div ng-show="ClaimPasswordFormController.sent" class="ng-hide"><p translate="CLAIM_PASSWORD_SUCCESS"></p><h4 class="claim-password__email">{{ClaimPasswordFormController.emailAddress}}</h4><p><b translate="CLAIM_PASSWORD_SUCCESS_NOTE"></b></p></div></form>'),
  6588.     e.put("security/login/claim-password/claim-password-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 class="modal__title" translate="CLAIM_PASSWORD_TITLE"></h3><div class="modal__content"><habbo-claim-password-form cancel="$dismiss()"></habbo-claim-password-form></div>'),
  6589.     e.put("security/login/claim-password/recover-password-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 class="modal__title" translate="RECOVER_PASSWORD_TITLE"></h3><div class="modal__content"><habbo-claim-password-form email-address="RecoverPasswordController.email" cancel="$dismiss()"><div class="form__message form__message--error" translate="RECOVER_PASSWORD_ERROR"></div></habbo-claim-password-form></div>'),
  6590.     e.put("security/login/facebook-connect/facebook-connect.html", '<button ng-click="FacebookConnectController.fbLogin()" ng-disabled="FacebookConnectController.loginInProgress" class="facebook-connect">{{ FacebookConnectController.translationKey | translate }}</button>'),
  6591.     e.put("shop/credit-card-form/credit-card-icon/credit-card-icon.html", '<span ng-if="VoucherIconController.product.icons[0]">&nbsp;<img ng-src="{{:: VoucherIconController.product.icons[0]}}" class="credit-card-icon__product"> {{:: CreditCardIconController.product.name}}</span> <span ng-if="VoucherIconController.credits">&nbsp;<i class="credit-card-icon__credits"></i> {{:: CreditCardIconController.credits}}</span>'),
  6592.     e.put("shop/earn-credits/earn-credits-frame/earn-credits-frame.html", '<iframe ng-src="{{:: EarnCreditsFrameController.offerWallUrl }}" class="earn-credits-frame"></iframe>'),
  6593.     e.put("security/force/force-password/force-password-form.html", '<form ng-submit="ForcePasswordFormController.change()" name="forcePasswordChangeForm" autocomplete="off" novalidate class="form"><p translate="FORCED_PASSWORD_CHANGE_TEXT"></p><habbo-password-new is-new="true" password-new="ForcePasswordFormController.passwords.password" password-new-repeated="ForcePasswordFormController.passwords.passwordRepeated"></habbo-password-new><div class="form__footer"><a ng-click="ForcePasswordFormController.onDismiss()" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button ng-disabled="ForcePasswordFormController.changeInProgress" type="submit" class="form__submit" translate="FORM_BUTTON_CHANGE"></button></div></form>'),
  6594.     e.put("security/force/force-password/force-password-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="FORCED_PASSWORD_CHANGE_TITLE" class="modal__title"></h3><div class="modal__content"><habbo-force-password-form on-dismiss="$dismiss()" on-success="$close()"></habbo-force-password-form></div>'),
  6595.     e.put("shop/payment-details/credit-payment-details/credit-payment-details.html", '<habbo-credit-icon amount="{{:: CreditPaymentDetailsController.item.creditAmount}}" double-credits="{{:: CreditPaymentDetailsController.item.doubleCredits}}" class="payment-details__icon"></habbo-credit-icon><div class="payment-details"><header class="payment-details__header"><h3 class="payment-details__title"><habbo-credit-title amount="{{:: CreditPaymentDetailsController.item.creditAmount}}" double-credits="{{:: CreditPaymentDetailsController.item.doubleCredits}}"></habbo-credit-title></h3><div class="payment-details__price">{{:: CreditPaymentDetailsController.item.price }}</div></header><p ng-if="CreditPaymentDetailsController.item.doubleCredits" translate="SHOP_DOUBLE_CREDITS_DESCRIPTION" translate-values="{ value: CreditPaymentDetailsController.item.creditAmount }"></p><p ng-if="!CreditPaymentDetailsController.item.doubleCredits" translate="SHOP_CREDITS_DESCRIPTION" translate-values="{ value: CreditPaymentDetailsController.item.creditAmount }"></p><habbo-payment-steps item="CreditPaymentDetailsController.item" selected-category="{{CreditPaymentDetailsController.selectedCategory}}"><habbo-payment-info type="store"></habbo-payment-info></habbo-payment-steps></div>'),
  6596.     e.put("shop/payment-details/payment-steps/payment-steps.html", '<div ng-if="!PaymentStepsController.disclaimerMethod && !PaymentStepsController.premiumSmsMethod && !PaymentStepsController.adyenMethod" class="payment-steps"><div ng-if="PaymentStepsController.user" class="payment-steps__step"><h3 class="payment-steps__title" translate="SHOP_PAYMENT_DETAILS"></h3><table class="payment-steps__user"><tr><td translate="FORM_NAME_LABEL"></td><td>{{:: PaymentStepsController.user.name}}</td></tr><tr habbo-require-habbo-account-session><td translate="FORM_EMAIL_LABEL"></td><td>{{:: PaymentStepsController.user.email}}</td></tr></table></div><div ng-transclude class="payment-steps__step"></div><habbo-payment-methods item="PaymentStepsController.item" selected-category="{{PaymentStepsController.selectedCategory}}" class="payment-steps__step"></habbo-payment-methods></div><habbo-payment-disclaimer ng-if="PaymentStepsController.disclaimerMethod" item="PaymentStepsController.item" method="PaymentStepsController.disclaimerMethod"></habbo-payment-disclaimer><habbo-premium-sms ng-if="PaymentStepsController.premiumSmsMethod" method="PaymentStepsController.premiumSmsMethod"></habbo-premium-sms><habbo-adyen ng-if="PaymentStepsController.adyenMethod" item="PaymentStepsController.item" method="PaymentStepsController.adyenMethod"></habbo-adyen><div ng-if="PaymentStepsController.disclaimerMethod || PaymentStepsController.premiumSmsMethod || PaymentStepsController.adyenMethod" class="payment-steps__cancel"><a ng-click="PaymentStepsController.reset()" translate="SHOP_DISCLAIMER_CANCEL"></a></div>'),
  6597.     e.put("shop/payment-details/product-payment-details/product-payment-details.html", '<habbo-product-icon icon-id="{{:: ProductPaymentDetailsController.item.iconId}}" class="payment-details__icon"></habbo-product-icon><div class="payment-details"><header class="payment-details__header"><h3 class="payment-details__title">{{:: ProductPaymentDetailsController.item.name}}</h3><div class="payment-details__price">{{:: ProductPaymentDetailsController.item.price}}</div></header><p>{{:: ProductPaymentDetailsController.item.description}}</p><habbo-sub-product-icons ng-if="ProductPaymentDetailsController.item.subProducts" sub-products="ProductPaymentDetailsController.item.subProducts"></habbo-sub-product-icons><habbo-payment-steps item="ProductPaymentDetailsController.item" selected-category="{{ProductPaymentDetailsController.selectedCategory}}"><habbo-payment-info type="store"></habbo-payment-info></habbo-payment-steps></div>'),
  6598.     e.put("security/force/force-tos/force-tos-form.html", '<form ng-submit="ForceTosFormController.accept()" name="forceTOSAcceptForm" novalidate class="form"><p translate="NEW_USER_AGREEMENT_INFO_TEXT"></p><p translate="NEW_USER_AGREEMENT_GUIDE_TEXT"></p><div class="form__footer"><a ng-click="ForceTosFormController.onDismiss()" class="form__cancel" translate="FORM_CANCEL_LABEL"></a> <button ng-disabled="ForceTosFormController.acceptInProgress" type="submit" class="form__submit" translate="NEW_USER_AGREEMENT_BUTTON"></button></div></form>'),
  6599.     e.put("security/force/force-tos/force-tos-modal.html", '<button ng-click="$dismiss()" class="modal__close"></button><h3 translate="NEW_USER_AGREEMENT_TITLE" class="modal__title"></h3><div class="modal__content"><habbo-force-tos-form on-dismiss="$dismiss()" on-success="$close()"></habbo-force-tos-form></div>'),
  6600.     e.put("shop/payment-details/offer-payment-details/offer-payment-details.html", '<img ng-src="{{:: OfferPaymentDetailsController.offerPaymentDetails.smallImageUrl}}" class="payment-details__icon"><div class="payment-details"><header class="payment-details__header"><h3 class="payment-details__title">{{:: OfferPaymentDetailsController.offerPaymentDetails.name }}</h3><span class="payment-details__price">{{:: OfferPaymentDetailsController.offerPaymentDetails.price }}</span></header><p>{{:: OfferPaymentDetailsController.offerPaymentDetails.description }}</p><img ng-src="{{:: OfferPaymentDetailsController.offerPaymentDetails.imageUrl}}" class="payment-details__image"><habbo-payment-steps item="OfferPaymentDetailsController.offerPaymentDetails"><habbo-payment-info type="store"></habbo-payment-info></habbo-payment-steps></div>'),
  6601.     e.put("shop/payment-details/payment-info/payment-info-store.html", '<h3 class="payment-steps__title" translate="SHOP_PAYMENT_METHOD"></h3><p class="payment-steps__legal" translate="SHOP_PAYMENT_METHOD_INFO"></p>'),
  6602.     e.put("shop/payment-details/payment-info/payment-info-subscription.html", '<h3 class="payment-steps__title" translate="SHOP_SUBSCRIPTION_METHOD"></h3><p class="payment-steps__legal" translate="SHOP_SUBSCRIPTION_METHOD_INFO"></p>'),
  6603.     e.put("shop/thumbnails/credit-thumbnail/credit-thumbnail.html", '<div class="inventory-thumbnail"><div class="inventory-thumbnail__body"><habbo-credit-icon amount="{{:: CreditThumbnailController.item.creditAmount}}" double-credits="{{:: CreditThumbnailController.item.doubleCredits}}" class="inventory-thumbnail__icon"></habbo-credit-icon><div class="inventory-thumbnail__text"><h3 class="inventory-thumbnail__title"><habbo-credit-title amount="{{:: CreditThumbnailController.item.creditAmount}}" double-credits="{{:: CreditThumbnailController.item.doubleCredits}}"></habbo-credit-title></h3></div><div class="inventory-thumbnail__banner"><span class="inventory-thumbnail__price">{{:: CreditThumbnailController.item.price}}</span></div></div></div>'),
  6604.     e.put("shop/payment-details/subscription-payment-details/subscription-payment-details.html", '<habbo-product-icon icon-id="{{:: SubscriptionPaymentDetailsController.item.iconId}}" class="payment-details__icon"></habbo-product-icon><div class="payment-details"><header class="payment-details__header"><h3 class="payment-details__title">{{:: SubscriptionPaymentDetailsController.item.name}}</h3><div class="payment-details__price">{{:: SubscriptionPaymentDetailsController.item.price}}<small class="subscription__price-unit" translate="SHOP_SUBSCRIPTION_PER_MONTH"></small></div></header><p>{{:: SubscriptionPaymentDetailsController.item.description}}</p><habbo-payment-steps item="SubscriptionPaymentDetailsController.item" selected-category="{{SubscriptionPaymentDetailsController.selectedCategory}}"><habbo-payment-info type="subscription"></habbo-payment-info></habbo-payment-steps></div>'),
  6605.     e.put("shop/transactions/transactions-history/transactions-history.html", '<table class="transactions-history"><thead><tr><th translate="TRANSACTIONS_TABLE_DATE"></th><th translate="TRANSACTIONS_TABLE_PURCHASE"></th><th translate="TRANSACTIONS_TABLE_VALUE"></th></tr></thead><tbody><tr ng-repeat="item in TransactionsHistoryController.transactions | orderBy: \'-creationTime\' | limitTo: TransactionsHistoryController.limitTo track by $index"><td data-th="{{\'TRANSACTIONS_TABLE_DATE\' | translate}}">{{:: item.creationTime | amDateFormat: \'D MMM YYYY\'}}</td><td data-th="{{\'TRANSACTIONS_TABLE_PURCHASE\' | translate}}"><span ng-if="item.product" class="product-name">{{:: item.product.name}}</span> <span ng-if="item.credits > 0" class="credits" translate="CREDITS_AMOUNT" translate-values="{ value: item.credits }"></span></td><td data-th="{{\'TRANSACTIONS_TABLE_VALUE\' | translate}}">{{:: item.price}}</td></tr></tbody></table>'),
  6606.     e.put("shop/subscriptions/subscription/subscription.html", '<section><habbo-web-pages habbo-subscription-page="SubscriptionController.item" class="subscription__description"></habbo-web-pages><habbo-accordion-grid ng-if="!SubscriptionController.item.active"><habbo-accordion-item><habbo-accordion-item-preview><habbo-subscription-thumbnail item="SubscriptionController.item"></habbo-subscription-thumbnail></habbo-accordion-item-preview><habbo-accordion-item-content><habbo-subscription-payment-details item="SubscriptionController.item"></habbo-subscription-payment-details></habbo-accordion-item-content></habbo-accordion-item></habbo-accordion-grid><habbo-subscription-unsubscribe ng-if="SubscriptionController.item.active" item="SubscriptionController.item"></habbo-subscription-unsubscribe></section>'),
  6607.     e.put("shop/store/category-filter/category-filter.html", '<ul class="category-filter"><li class="category-filter__item" ng-repeat="category in CategoryFilterController.paymentCategories"><a ng-click="CategoryFilterController.update(category.key)" translate="{{:: category.translateKey}}" ng-class="{ \'category-filter__link--active\': CategoryFilterController.isActive(category.key) }" class="category-filter__link"></a></li></ul>'),
  6608.     e.put("shop/store/inventory/credits.html", '<section><h3 class="inventory__section__title" translate="SHOP_CREDITS_TITLE"></h3><habbo-accordion-grid class="inventory__grid"><habbo-accordion-item ng-repeat="item in CreditsController.items track by item.id"><habbo-accordion-item-preview><habbo-credit-thumbnail item="item"></habbo-credit-thumbnail></habbo-accordion-item-preview><habbo-accordion-item-content><habbo-credit-payment-details item="item" selected-category="{{CreditsController.selectedCategory}}"></habbo-credit-payment-details></habbo-accordion-item-content></habbo-accordion-item></habbo-accordion-grid></section>'),
  6609.     e.put("shop/store/inventory/inventory.html", '<div ng-if="InventoryController.isDoubleCreditsActive"><habbo-credits ng-if="InventoryController.creditItems.length > 0" items="InventoryController.creditItems" selected-category="{{InventoryController.selectedCategory}}"></habbo-credits><habbo-products ng-if="InventoryController.productItems.length > 0" items="InventoryController.productItems" selected-category="{{InventoryController.selectedCategory}}"></habbo-products></div><div ng-if="!InventoryController.isDoubleCreditsActive"><habbo-products ng-if="InventoryController.productItems.length > 0" items="InventoryController.productItems" selected-category="{{InventoryController.selectedCategory}}"></habbo-products><habbo-credits ng-if="InventoryController.creditItems.length > 0" items="InventoryController.creditItems" selected-category="{{InventoryController.selectedCategory}}"></habbo-credits></div>'),
  6610.     e.put("shop/store/inventory/products.html", '<section><h3 class="inventory__section__title" translate="SHOP_OFFERINGS_TITLE"></h3><habbo-accordion-grid class="inventory__grid"><habbo-accordion-item ng-repeat="item in ProductsController.items track by item.id"><habbo-accordion-item-preview><habbo-product-thumbnail item="item"></habbo-product-thumbnail></habbo-accordion-item-preview><habbo-accordion-item-content><habbo-product-payment-details item="item" selected-category="{{ProductsController.selectedCategory}}"></habbo-product-payment-details></habbo-accordion-item-content></habbo-accordion-item></habbo-accordion-grid></section>'),
  6611.     e.put("shop/store/targeted-offer/targeted-offer.html", '<habbo-accordion-grid class="offer__grid"><habbo-accordion-item class="accordion__item--single"><habbo-accordion-item-preview><habbo-offer-thumbnail item="TargetedOfferController.offer" class="offer__item__thumbnail"></habbo-offer-thumbnail></habbo-accordion-item-preview><habbo-accordion-item-content><habbo-offer-payment-details offer-payment-details="TargetedOfferController.offerPaymentDetails"></habbo-offer-payment-details></habbo-accordion-item-content></habbo-accordion-item></habbo-accordion-grid>'),
  6612.     e.put("shop/voucher-redeem/voucher-icon/voucher-icon.html", '<span ng-if="VoucherIconController.product.icons[0]">&nbsp;<img ng-src="{{:: VoucherIconController.product.icons[0]}}" class="voucher-icon__product"> {{:: VoucherIconController.product.name}}</span> <span ng-if="VoucherIconController.credits">&nbsp;<i class="voucher-icon__credits"></i> {{:: VoucherIconController.credits}}</span>'),
  6613.     e.put("shop/thumbnails/offer-thumbnail/offer-thumbnail.html", '<div class="inventory-thumbnail inventory-thumbnail--offer"><div class="inventory-thumbnail__body"><div class="inventory-thumbnail__highlight__banner"><span class="inventory-thumbnail__highlight-wrapper"><span ng-if="OfferThumbnailController.item.highlight" class="inventory-thumbnail__highlight">{{:: OfferThumbnailController.item.highlight}} |</span> <span translate="SHOP_TARGETED_OFFER_EXPIRY_TITLE"></span> <time am-time-ago="OfferThumbnailController.item.expirationDate"></time></span></div><img ng-src="{{:: OfferThumbnailController.item.imageUrl}}" class="inventory-thumbnail__icon inventory-thumbnail__icon--large"> <img ng-src="{{:: OfferThumbnailController.item.smallImageUrl}}" class="inventory-thumbnail__icon"><div class="inventory-thumbnail__text"><h3 class="inventory-thumbnail__title">{{:: OfferThumbnailController.item.header}}</h3><p class="inventory-thumbnail__description">{{:: OfferThumbnailController.item.description}}</p></div><div class="inventory-thumbnail__banner"><span class="inventory-thumbnail__price">{{:: OfferThumbnailController.item.pricePoint.price}}</span></div></div></div>'),
  6614.     e.put("shop/thumbnails/product-thumbnail/product-thumbnail.html", '<div class="inventory-thumbnail"><div class="inventory-thumbnail__body"><habbo-product-icon icon-id="{{:: ProductThumbnailController.item.iconId}}" class="inventory-thumbnail__icon"></habbo-product-icon><div class="inventory-thumbnail__text"><h3 class="inventory-thumbnail__title">{{:: ProductThumbnailController.item.name}}</h3></div><div class="inventory-thumbnail__banner"><span class="inventory-thumbnail__price">{{:: ProductThumbnailController.item.price}}</span></div></div></div>'),
  6615.     e.put("shop/thumbnails/subscription-thumbnail/subscription-thumbnail.html", '<div class="inventory-thumbnail"><div class="inventory-thumbnail__body"><habbo-product-icon icon-id="{{:: SubscriptionThumbnailController.item.iconId}}" class="inventory-thumbnail__icon"></habbo-product-icon><div class="inventory-thumbnail__text"><h3 class="inventory-thumbnail__title">{{:: SubscriptionThumbnailController.item.name}}</h3></div><div class="inventory-thumbnail__banner"><div class="inventory-thumbnail__price">{{:: SubscriptionThumbnailController.item.price}}<small class="subscription__price-unit" translate="SHOP_SUBSCRIPTION_PER_MONTH"></small></div></div></div></div>'),
  6616.     e.put("common/form/password-new/password-strength/password-strength.html", '<div class="password-strength__label"><span>{{ \'PASSWORD_STRENGTH_LABEL\' | translate }}</span> <span>{{ PasswordStrengthController.score | strengthRating | ratingTranslation | translate }}</span></div><div class="password-strength__field"><div habbo-password-strength-indicator="PasswordStrengthController.score" ng-class="\'password-strength__indicator--\' + (PasswordStrengthController.score | strengthRating)" class="password-strength__indicator"></div></div><p ng-transclude class="password-strength__error"></p>'),
  6617.     e.put("shop/payment-details/payment-steps/adyen/adyen.html", '<div ng-if="AdyenController.state === \'AWAITING_INPUT\'"><h3 translate="SHOP_PAYMENT_ADYEN_CARD_DETAILS" class="adyen__form-header"></h3><img ng-src="{{:: AdyenController.method.buttonLogoUrl}}" class="adyen__form-header-icon"><div class="adyen__form-wrapper"><habbo-credit-card-form class="adyen__form" card="AdyenController.card" on-submit="AdyenController.onSend(data)"></habbo-credit-card-form></div></div><habbo-message-container ng-if="AdyenController.state === \'SUCCESS\'" type="check" class="adyen__result-box"><h3 translate="SHOP_PAYMENT_COMPLETED" class="adyen__form-header"></h3><p translate="SHOP_PAYMENT_TRANSACTION_DETAILS" translate-values="{ transactionId: AdyenController.transactionId }"></p><button type="submit" translate="OK" class="payment-methods__button payment-button" ng-click="AdyenController.close()"></button></habbo-message-container><habbo-message-container ng-if="AdyenController.state === \'FAILURE\'" type="x" class="adyen__result-box"><h3 translate="SHOP_PAYMENT_FAILED" class="adyen__form-header"></h3><p ng-if="AdyenController.errorType === \'HTTP_ERROR\'">{{:: AdyenController.errorMsg}}</p><p ng-if="AdyenController.errorType === \'USER_DATA\'" translate="SHOP_PLEASE_CHECK_CREDIT_CARD"></p><p ng-if="AdyenController.errorType === \'LIMIT_EXCEEDED\'" translate="SHOP_LIMIT_EXCEEDED"></p><p ng-if="AdyenController.errorType === \'RISK_CHECK_FAILED\'" translate="SHOP_RISK_CHECK_FAILED"></p><button type="submit" translate="OK" class="payment-methods__button payment-button" ng-click="AdyenController.showInputForm()"></button></habbo-message-container>'),
  6618.     e.put("shop/payment-details/payment-steps/payment-button/payment-button.html", '<button ng-click="PaymentButtonController.purchase()" ng-disabled="PaymentButtonController.paymentInProgress" class="payment-button" translate="{{:: PaymentButtonController.translationKey}}"></button>'),
  6619.     e.put("shop/payment-details/payment-steps/payment-disclaimer/payment-disclaimer.html", '<h3 class="payment-steps__title payment-steps__title--single" translate="SHOP_SMALLPRINT_TITLE"></h3><small class="payment-steps__step payment-steps__legal" translate="{{:: PaymentDisclaimerController.methodSmallPrintKey}}"></small><ul class="payment-steps__step"><li class="payment-methods__method"><habbo-payment-button item="PaymentDisclaimerController.item" method="PaymentDisclaimerController.method" class="payment-methods__button"></habbo-payment-button></li></ul>'),
  6620.     e.put("shop/payment-details/payment-steps/payment-methods/payment-methods.html", '<ul><li ng-repeat="paymentMethod in PaymentMethodsController.item.paymentMethods | paymentCategory: PaymentMethodsController.selectedCategory" class="payment-methods__method"><img ng-if="paymentMethod.buttonLogoUrl" ng-src="{{:: paymentMethod.buttonLogoUrl}}" class="payment-methods__icon"> <span ng-if="!paymentMethod.buttonLogoUrl && (paymentMethod.category === \'online\' || paymentMethod.category === \'prepaid\')" class="payment-methods__label">{{:: paymentMethod.name}}</span> <span ng-if="!paymentMethod.buttonLogoUrl && (paymentMethod.category === \'mobile\' || paymentMethod.category === \'landline\')" class="payment-methods__label" translate="{{:: PaymentMethodsController.PaymentStepsController.getMethodTitleKey(paymentMethod)}}"></span><habbo-payment-button ng-if="!paymentMethod.disclaimerRequired && !paymentMethod.premiumSms && paymentMethod.requestPath !== \'direct\'" item="PaymentMethodsController.item" method="paymentMethod" class="payment-methods__button"></habbo-payment-button><button ng-if="paymentMethod.disclaimerRequired && !paymentMethod.premiumSms && paymentMethod.requestPath !== \'direct\'" ng-click="PaymentMethodsController.PaymentStepsController.setDisclaimer(paymentMethod)" class="payment-methods__button payment-button" translate="SHOP_CONTINUE_BUTTON"></button> <button ng-if="paymentMethod.premiumSms" ng-click="PaymentMethodsController.PaymentStepsController.setPremiumSms(paymentMethod)" class="payment-methods__button payment-button" translate="SHOP_CONTINUE_BUTTON"></button> <button ng-if="paymentMethod.requestPath === \'direct\'" ng-click="PaymentMethodsController.PaymentStepsController.setAdyen(paymentMethod)" class="payment-methods__button payment-button" translate="SHOP_CONTINUE_BUTTON"></button></li></ul>'),
  6621.     e.put("shop/payment-details/payment-steps/premium-sms/premium-sms.html", '<h3 translate="SHOP_PAYMENT_PSMS_INSTRUCTIONS"></h3><p translate="{{:: PremiumSmsController.methodInstructionKey}}"></p><div class="premium-sms__voucher-redeem__wrapper"><habbo-voucher-redeem class="premium-sms__voucher-redeem"></habbo-voucher-redeem></div><p translate="SHOP_PAYMENT_PSMS_HELP"></p><h3 translate="SHOP_SMALLPRINT_TITLE"></h3><small class="premium-sms__legal" translate="{{:: PremiumSmsController.methodSmallPrintKey}}"></small>'),
  6622.     e.put("shop/payment-details/product-payment-details/sub-product-icons/sub-product-icons.html", '<p class="sub-product-icons__description" translate="SHOP_PRODUCT_SUBPRODUCTS_DESCRIPTION"></p><ul><li ng-repeat="subProduct in SubProductIconsController.subProducts" class="sub-product-icons__icon" data-count="{{:: subProduct.count }}"><img ng-src="{{:: subProduct.imgUrl}}"></li></ul>'),
  6623.     e.put("shop/subscriptions/subscription/subscription-unsubscribe/subscription-unsubscribe.html", '<habbo-product-icon icon-id="{{:: SubscriptionUnsubscribeController.item.iconId}}" class="subscription-unsubscribe__icon"></habbo-product-icon><div class="subscription-unsubscribe__content"><h4>{{:: SubscriptionUnsubscribeController.item.name}}</h4><p translate="SHOP_SUBSCRIPTION_ACTIVE_TEXT"></p><p translate="SHOP_SUBSCRIPTION_BILLING_TIME" translate-values="{ time: (SubscriptionUnsubscribeController.item.nextBillingTime | date: \'medium\') }"></p></div><button ng-click="SubscriptionUnsubscribeController.unsubscribe()" ng-disabled="SubscriptionUnsubscribeController.unsubscribeInProgress" class="subscription-unsubscribe__button" translate="SHOP_SUBSCRIPTION_UNSUBSCRIBE_BUTTON"></button>')
  6624. }
  6625. ]),
  6626. angular.module("events", []).constant("EVENTS", {
  6627.     accordionOpen: "accordion-item-open",
  6628.     accordionClose: "accordion-item-close",
  6629.     accordionResize: "accordion-item-resize",
  6630.     accordionUpdate: "accordion-item-update",
  6631.     clientOpen: "client-open",
  6632.     clientClose: "client-close",
  6633.     securityLogin: "security-login",
  6634.     shopPaymentClose: "payment-close"
  6635. }),
  6636. angular.module("app", ["ngAnimate", "activate", "community", "console.warning", "creation", "email.optout", "email.report.unauthorized", "eu.cookie.banner", "footer", "help.login", "home", "hotel", "logout", "not.found", "password.reset", "playing.habbo", "profile", "registration", "room", "security", "settings", "shop"]).config(["$provide", function(e) {
  6637.     e.decorator("$exceptionHandler", ["$delegate", function(e) {
  6638.         return function(t, o) {
  6639.             Bugsnag.notifyException(t, {
  6640.                 diagnostics: {
  6641.                     cause: o
  6642.                 }
  6643.             }),
  6644.             e(t, o)
  6645.         }
  6646.     }
  6647.     ])
  6648. }
  6649. ]).run(["spinner", function(e) {
  6650.     e.init()
  6651. }
  6652. ]),
  6653. function() {
  6654.     var e = !0;
  6655.     window.Bugsnag || (window.Bugsnag = {
  6656.         notify: _.noop,
  6657.         notifyException: _.noop
  6658.     }),
  6659.     angular.module("app").config(["$sceDelegateProvider", function(e) {
  6660.         var t = e.resourceUrlWhitelist()
  6661.           , o = "https://*.habbo.nl/**,https://habboo-a.akamaihd.net/**,https://www.offertoro.com/**".split(",");
  6662.         t = t.concat(o),
  6663.         e.resourceUrlWhitelist(t)
  6664.     }
  6665.     ]).config(["$compileProvider", function(t) {
  6666.         t.debugInfoEnabled(!e)
  6667.     }
  6668.     ]),
  6669.     angular.module("config", []).constant("CONFIG", {
  6670.         apiUrl: "/api",
  6671.         extraDataUrl: "/extradata",
  6672.         shopUrl: "/shopapi",
  6673.         appStoreUrl: "https://itunes.apple.com/app/id794866182",
  6674.         badgeUrl: "https://habboo-a.akamaihd.net/c_images/album1584",
  6675.         googlePlayUrl: "https://play.google.com/store/apps/details?id=air.com.sulake.habboair",
  6676.         habboWebAdsUrl: "https://habboo-a.akamaihd.net/habbo-web-ads/",
  6677.         habboWebLeaderboardsUrl: "https://habboo-a.akamaihd.net/habbo-web-leaderboards/",
  6678.         habboWebNewsUrl: "https://habboo-a.akamaihd.net/habbo-web-news/nl/production/",
  6679.         habboWebPagesUrl: "https://habboo-a.akamaihd.net/habbo-web-pages/production/",
  6680.         imagingUrl: "/habbo-imaging",
  6681.         lang: "nl",
  6682.         hotel: "hhnl",
  6683.         localizationSite: "nl",
  6684.         minAge: parseInt("12", 10),
  6685.         rpxLocale: "nl",
  6686.         rpxTokenUrl: "https://www.habbo.nl/api/public/authentication/rpx",
  6687.         offerToroEnabled: "true",
  6688.         twitterAccount: "@Habbo_Staff",
  6689.         adyenPublicKey: "10001|DB119F7832E23CBEDA2A330D3C13310D78ABA07136CDFFFA3D798BDFE4A903D5A079EE09710BBEC72573F0CA80D48DD0380D8AC1B0FDBCB978E69E9BE92ABDC27020858A52DC8D7A9C2D77B071FE1E6A3177E4E73E8E7CFC4A13C881BBBEF3C2EFBB24475818AB9E56BC597BABFD306593C3DF2B16F49D38F560212C183492EE7D0750CE84AB3509563CB3C99EC0B815CF5211E793500110B2A53DCAD793E267677BBE89035E5E9662FD2DB94A5EECBD6FB81F5DAF7205F9EBF15963639FC72DF0875CC2249FB31B300CC8183B2C948B3B3843C414677C9EC82C6A2D4CBF937B57FD03A53B0A8A56369AD490CEAB9EED18FE77E7B9032445A57A06CE23DE6115"
  6690.     }),
  6691.     angular.module("locale", ["angularMoment", "pascalprecht.translate"]),
  6692.     angular.module("angularMoment").run(["amMoment", function(e) {
  6693.         e.changeLocale("nl")
  6694.     }
  6695.     ]),
  6696.     angular.module("ezfb").config(["ezfbProvider", function(e) {
  6697.         e.setInitParams({
  6698.             appId: "162105803517"
  6699.         }),
  6700.         e.setLocale("nl_NL")
  6701.     }
  6702.     ]),
  6703.     angular.module("noCAPTCHA").config(["noCAPTCHAProvider", function(e) {
  6704.         e.setLanguage("nl"),
  6705.         e.setSiteKey("6LdhyucSAAAAAKNhbY53azV2gZul4DcD8Xo111yp")
  6706.     }
  6707.     ]),
  6708.     angular.module("pascalprecht.translate").config(["$translateProvider", function(e) {
  6709.         e.preferredLanguage("nl"),
  6710.         e.useStaticFilesLoader({
  6711.             prefix: "https://habboo-a.akamaihd.net/habbo-web-l10n/",
  6712.             suffix: ".json"
  6713.         }),
  6714.         e.useSanitizeValueStrategy("escapeParameters")
  6715.     }
  6716.     ])
  6717. }();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement